diff --git a/.eslintrc.js b/.eslintrc.js
index 2a10875dd34ebd..b676485c5909ab 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -117,8 +117,8 @@ module.exports = {
     // https://eslint.org/docs/rules/
     'accessor-pairs': 'error',
     'array-callback-return': 'error',
-    'arrow-parens': ['error', 'always'],
-    'arrow-spacing': ['error', { before: true, after: true }],
+    'arrow-parens': 'error',
+    'arrow-spacing': 'error',
     'block-scoped-var': 'error',
     'block-spacing': 'error',
     'brace-style': ['error', '1tbs', { allowSingleLine: true }],
@@ -126,8 +126,7 @@ module.exports = {
       line: {
         // Ignore all lines that have less characters than 20 and all lines that
         // start with something that looks like a variable name or code.
-        // eslint-disable-next-line max-len
-        ignorePattern: '.{0,20}$|[a-z]+ ?[0-9A-Z_.(/=:[#-]|std|http|ssh|ftp|(let|var|const) [a-z_A-Z0-9]+ =|[b-z] |[a-z]*[0-9].* ',
+        ignorePattern: '.{0,20}$|[a-z]+ ?[0-9A-Z_.(/=:[#-]|std|http|ssh|ftp',
         ignoreInlineComments: true,
         ignoreConsecutiveComments: true,
       },
@@ -162,9 +161,9 @@ module.exports = {
       ObjectExpression: 'first',
       SwitchCase: 1,
     }],
-    'key-spacing': ['error', { mode: 'strict' }],
+    'key-spacing': 'error',
     'keyword-spacing': 'error',
-    'linebreak-style': ['error', 'unix'],
+    'linebreak-style': 'error',
     'max-len': ['error', {
       code: 120,
       ignorePattern: '^// Flags:',
@@ -178,7 +177,7 @@ module.exports = {
     'no-constant-condition': ['error', { checkLoops: false }],
     'no-constructor-return': 'error',
     'no-duplicate-imports': 'error',
-    'no-else-return': ['error', { allowElseIf: true }],
+    'no-else-return': 'error',
     'no-extra-parens': ['error', 'functions'],
     'no-lonely-if': 'error',
     'no-mixed-requires': 'error',
@@ -285,7 +284,7 @@ module.exports = {
       named: 'never',
       asyncArrow: 'always',
     }],
-    'space-in-parens': ['error', 'never'],
+    'space-in-parens': 'error',
     'space-infix-ops': 'error',
     'space-unary-ops': 'error',
     'spaced-comment': ['error', 'always', {
@@ -311,7 +310,6 @@ module.exports = {
     'jsdoc/require-param': 'off',
     'jsdoc/check-tag-names': 'off',
     'jsdoc/require-returns': 'off',
-    'jsdoc/require-property-description': 'off',
 
     // Custom rules from eslint-plugin-node-core
     'node-core/no-unescaped-regexp-dot': 'error',
diff --git a/.github/workflows/commit-queue.yml b/.github/workflows/commit-queue.yml
index 18a26666dee871..59ab3d2ce64263 100644
--- a/.github/workflows/commit-queue.yml
+++ b/.github/workflows/commit-queue.yml
@@ -32,14 +32,24 @@ jobs:
     steps:
       - name: Get Pull Requests
         id: get_mergeable_prs
-        run: >
-          numbers=$(gh pr list \
+        run: |
+          prs=$(gh pr list \
+                  --repo ${{ github.repository }} \
+                  --base ${{ github.ref_name }} \
+                  --label 'commit-queue' \
+                  --json 'number' \
+                  --search "created:<=$(date --date="2 days ago"  +"%Y-%m-%dT%H:%M:%S%z")" \
+                  -t '{{ range . }}{{ .number }} {{ end }}' \
+                  --limit 100)
+          fast_track_prs=$(gh pr list \
                   --repo ${{ github.repository }} \
                   --base ${{ github.ref_name }} \
                   --label 'commit-queue' \
+                  --label 'fast-track' \
                   --json 'number' \
                   -t '{{ range . }}{{ .number }} {{ end }}' \
                   --limit 100)
+          numbers=$(echo $prs' '$fast_track_prs | jq -r -s 'unique | join(" ")')
           echo "numbers=$numbers" >> $GITHUB_OUTPUT
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml
index 43724f9413d83a..c9b8f08f99e4a4 100644
--- a/.github/workflows/linters.yml
+++ b/.github/workflows/linters.yml
@@ -107,7 +107,7 @@ jobs:
       - name: Get release version numbers
         if: ${{ github.event.pull_request && github.event.pull_request.base.ref == github.event.pull_request.base.repo.default_branch }}
         id: get-released-versions
-        run: ./tools/lint-md/list-released-versions-from-changelogs.mjs
+        run: ./tools/lint-md/list-released-versions-from-changelogs.mjs >> $GITHUB_OUTPUT
       - name: Lint markdown files
         run: |
           echo "::add-matcher::.github/workflows/remark-lint-problem-matcher.json"
diff --git a/.github/workflows/test-asan.yml b/.github/workflows/test-asan.yml
index 6cd38f3ab82f12..059018b74e5e58 100644
--- a/.github/workflows/test-asan.yml
+++ b/.github/workflows/test-asan.yml
@@ -39,7 +39,7 @@ permissions:
 jobs:
   test-asan:
     if: github.event.pull_request.draft == false
-    runs-on: ubuntu-latest
+    runs-on: ubuntu-20.04
     env:
       CC: clang
       CXX: clang++
diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml
index 092de3885ab336..c09004cbe422c7 100644
--- a/.github/workflows/test-macos.yml
+++ b/.github/workflows/test-macos.yml
@@ -58,6 +58,6 @@ jobs:
       - name: tools/doc/node_modules workaround
         run: make tools/doc/node_modules
       - name: Build
-        run: make build-ci -j3 V=1 CONFIG_FLAGS="--error-on-warn"
+        run: make build-ci -j$(getconf _NPROCESSORS_ONLN) V=1 CONFIG_FLAGS="--error-on-warn"
       - name: Test
-        run: make run-ci -j3 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9"
+        run: make run-ci -j$(getconf _NPROCESSORS_ONLN) V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9"
diff --git a/.github/workflows/timezone-update.yml b/.github/workflows/timezone-update.yml
index cebf43223e1046..27cbfd2946a1d2 100644
--- a/.github/workflows/timezone-update.yml
+++ b/.github/workflows/timezone-update.yml
@@ -36,6 +36,9 @@ jobs:
 
       - run: ./tools/update-timezone.mjs
 
+      - name: Update the expected timezone version in test
+        run: echo "${{ env.new_version }}" > test/fixtures/tz-version.txt
+
       - name: Open Pull Request
         uses: gr2m/create-or-update-pull-request-action@dc1726cbf4dd3ce766af4ec29cfb660e0125e8ee  # Create a PR or update the Action's existing PR
         env:
diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml
index 2b371c93cd7f5a..83457850302540 100644
--- a/.github/workflows/tools.yml
+++ b/.github/workflows/tools.yml
@@ -109,6 +109,22 @@ jobs:
                 echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV
                 ./tools/update-acorn-walk.sh
               fi
+          - id: libuv
+            subsystem: deps
+            label: dependencies
+            run: |
+              NEW_VERSION=$(gh api repos/libuv/libuv/releases/latest -q '.tag_name|ltrimstr("v")')
+              VERSION_H="./deps/uv/include/uv/version.h"
+              CURRENT_MAJOR_VERSION=$(grep "#define UV_VERSION_MAJOR" $VERSION_H | sed -n "s/^.*MAJOR \(.*\)/\1/p")
+              CURRENT_MINOR_VERSION=$(grep "#define UV_VERSION_MINOR" $VERSION_H | sed -n "s/^.*MINOR \(.*\)/\1/p")
+              CURRENT_PATCH_VERSION=$(grep "#define UV_VERSION_PATCH" $VERSION_H | sed -n "s/^.*PATCH \(.*\)/\1/p")
+              CURRENT_SUFFIX_VERSION=$(grep "#define UV_VERSION_SUFFIX" $VERSION_H | sed -n "s/^.*SUFFIX \"\(.*\)\"/\1/p")
+              SUFFIX_STRING=$([[ -z "$CURRENT_SUFFIX_VERSION" ]] && echo "" || echo "-$CURRENT_SUFFIX_VERSION")
+              CURRENT_VERSION="$CURRENT_MAJOR_VERSION.$CURRENT_MINOR_VERSION.$CURRENT_PATCH_VERSION$SUFFIX_STRING"
+              if [ "$NEW_VERSION" != "$CURRENT_VERSION" ]; then
+                echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV
+                ./tools/dep_updaters/update-libuv.sh "$NEW_VERSION"
+              fi
     steps:
       - uses: actions/checkout@v3
         with:
diff --git a/.mailmap b/.mailmap
index abc56b9b2208b0..ba4fa95048b7b6 100644
--- a/.mailmap
+++ b/.mailmap
@@ -103,6 +103,7 @@ Christian Clauss <cclauss@me.com> <cclauss@bluewin.ch>
 Christophe Naud-Dulude <christophe.naud.dulude@gmail.com>
 Christopher Lenz <cmlenz@gmail.com> <chris@lamech.local>
 Claudio Rodriguez <cjrodr@yahoo.com> <cr@fansworld.tv>
+Claudio Wunder <cwunder@gnome.org> <cwunder@hubspot.com>
 Clemens Backes <post@clemens-backes.de> <clemensb@chromium.org>
 Colin Ihrig <cjihrig@gmail.com>
 Corey Martin <coreymartin496@gmail.com>
diff --git a/AUTHORS b/AUTHORS
index 531280545ece61..38ea282c199fc2 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -3567,5 +3567,13 @@ Tim Shilov <tim@shilov.dev>
 Obiwac <obiwac@gmail.com>
 Yu Gu <guyu2876@gmail.com>
 andreysoktoev <andrey.soktoev@gmail.com>
+Pavel Horal <pavel.horal@orchitech.cz>
+Konv <82451257+kovsu@users.noreply.github.com>
+Aidan Temple <15520814+aidant@users.noreply.github.com>
+Emanuel Hoogeveen <emanuel@medweb.nl>
+Takuro Sato <79583855+takuro-sato@users.noreply.github.com>
+Carter Snook <cartersnook04@gmail.com>
+Nathanael Ruf <104262550+nathanael-ruf@users.noreply.github.com>
+Vasili Skurydzin <vasili.skurydzin@protonmail.com>
 
 # Generated by tools/update-authors.mjs
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7b52617e2e91e4..b47d22e99ed1d6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,7 +35,9 @@ release.
 </tr>
 <tr>
   <td valign="top">
-<b><a href="doc/changelogs/CHANGELOG_V19.md#19.0.1">19.0.1</a></b><br/>
+<b><a href="doc/changelogs/CHANGELOG_V19.md#19.2.0">19.2.0</a></b><br/>
+<a href="doc/changelogs/CHANGELOG_V19.md#19.1.0">19.1.0</a><br/>
+<a href="doc/changelogs/CHANGELOG_V19.md#19.0.1">19.0.1</a><br/>
 <a href="doc/changelogs/CHANGELOG_V19.md#19.0.0">19.0.0</a><br/>
   </td>
   <td valign="top">
diff --git a/LICENSE b/LICENSE
index 0a40651152f631..cbcc28ce972135 100644
--- a/LICENSE
+++ b/LICENSE
@@ -107,6 +107,18 @@ The externally maintained libraries used by Node.js are:
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   """
 
+- ittapi, located at deps/v8/third_party/ittapi, is licensed as follows:
+  """
+    Copyright (c) 2019 Intel Corporation. All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  """
+
 - ICU, located at deps/icu-small, is licensed as follows:
   """
     UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
@@ -1040,9 +1052,9 @@ The externally maintained libraries used by Node.js are:
 - zlib, located at deps/zlib, is licensed as follows:
   """
     zlib.h -- interface of the 'zlib' general purpose compression library
-    version 1.2.11, January 15th, 2017
+    version 1.2.13, October 13th, 2022
 
-    Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+    Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
 
     This software is provided 'as-is', without any express or implied
     warranty.  In no event will the authors be held liable for any damages
diff --git a/README.md b/README.md
index 5d2e448239082c..5ef0fd74a6a371 100644
--- a/README.md
+++ b/README.md
@@ -444,7 +444,7 @@ For information about the governance of the Node.js project, see
   **Rich Trott** <<rtrott@gmail.com>> (he/him)
 * [vdeturckheim](https://github.com/vdeturckheim) -
   **Vladimir de Turckheim** <<vlad2t@hotmail.com>> (he/him)
-* [VoltrexMaster](https://github.com/VoltrexMaster) -
+* [VoltrexKeyva](https://github.com/VoltrexKeyva) -
   **Mohammed Keyvanzadeh** <<mohammadkeyvanzade94@gmail.com>> (he/him)
 * [watilde](https://github.com/watilde) -
   **Daijiro Wachi** <<daijiro.wachi@gmail.com>> (he/him)
@@ -690,7 +690,7 @@ maintaining the Node.js project.
   **Pooja Durgad** <<Pooja.D.P@ibm.com>>
 * [RaisinTen](https://github.com/RaisinTen) -
   **Darshan Sen** <<raisinten@gmail.com>>
-* [VoltrexMaster](https://github.com/VoltrexMaster) -
+* [VoltrexKeyva](https://github.com/VoltrexKeyva) -
   **Mohammed Keyvanzadeh** <<mohammadkeyvanzade94@gmail.com>> (he/him)
 
 Triagers follow the [Triage Guide](./doc/contributing/issues.md#triaging-a-bug-report) when
diff --git a/SECURITY.md b/SECURITY.md
index 34740622bf543f..0ab2b4a3cac119 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -55,6 +55,132 @@ Here is the security disclosure policy for Node.js
   the release process above to ensure that the disclosure is handled in a
   consistent manner.
 
+## The Node.js threat model
+
+In the Node.js threat model, there are trusted elements such as the
+underlying operating system. Vulnerabilities that require the compromise
+of these trusted elements are outside the scope of the Node.js threat
+model.
+
+For a vulnerability to be eligible for a bug bounty, it must be a
+vulnerability in the context of the Node.js threat model. In other
+words, it cannot assume that a trusted element (such as the operating
+system) has been compromised.
+
+Being able to cause the following through control of the elements that Node.js
+does not trust is considered a vulnerability:
+
+* Disclosure or loss of integrity or confidentiality of data protected through
+  the correct use of Node.js APIs.
+* The unavailability of the runtime, including the unbounded degradation of its
+  performance.
+
+If Node.js loads configuration files or runs code by default (without a
+specific request from the user), and this is not documented, it is considered a
+vulnerability.
+Vulnerabilities related to this case may be fixed by a documentation update.
+
+**Node.js does NOT trust**:
+
+1. The data from network connections that are created through the use of Node.js
+   APIs and which is transformed/validated by Node.js before being passed to the
+   application. This includes:
+   * HTTP APIs (all flavors) client and server APIs.
+   * DNS APIs.
+2. Consumers of data protected through the use of Node.js APIs (for example
+   people who have access to data encrypted through the Node.js crypto APIs).
+3. The file content or other I/O that is opened for reading or writing by the
+   use of Node.js APIs (ex: stdin, stdout, stderr).
+
+In other words, if the data passing through Node.js to/from the application
+can trigger actions other than those documented for the APIs, there is likely
+a security vulnerability. Examples of unwanted actions are polluting globals,
+causing an unrecoverable crash, or any other unexpected side effects that can
+lead to a loss of confidentiality, integrity, or availability.
+
+**Node.js trusts everything else**. As some examples this includes:
+
+1. The developers and infrastructure that runs it.
+2. The operating system that Node.js is running under and its configuration,
+   along with anything under control of the operating system.
+3. The code it is asked to run including JavaScript and native code, even if
+   said code is dynamically loaded, e.g. all dependencies installed from the
+   npm registry.
+   The code run inherits all the privileges of the execution user.
+4. Inputs provided to it by the code it is asked to run, as it is the
+   responsibility of the application to perform the required input validations.
+5. Any connection used for inspector (debugger protocol) regardless of being
+   opened by command line options or Node.js APIs, and regardless of the remote
+   end being on the local machine or remote.
+6. The file system when requiring a module.
+   See <https://nodejs.org/api/modules.html#all-together>.
+
+Any unexpected behavior from the data manipulation from Node.js Internal
+functions are considered a vulnerability.
+
+In addition to addressing vulnerabilities based on the above, the project works
+to avoid APIs and internal implementations that make it "easy" for application
+code to use the APIs incorrectly in a way that results in vulnerabilities within
+the application code itself. While we don’t consider those vulnerabilities in
+Node.js itself and will not necessarily issue a CVE we do want them to be
+reported privately to Node.js first.
+We often choose to work to improve our APIs based on those reports and issue
+fixes either in regular or security releases depending on how much of a risk to
+the community they pose.
+
+### Examples of vulneratibities
+
+#### Improper Certificate Validation (CWE-295)
+
+* Node.js provides APIs to validate handling of Subject Alternative Names (SANs)
+  in certficates used to connect to a TLS/SSL endpoint. If certificates can be
+  crafted which result in incorrect validation by the Node.js APIs that is
+  considered a vulnerability.
+
+#### Inconsistent Interpretation of HTTP Requests (CWE-444)
+
+* Node.js provides APIs to accept http connections. Those APIs parse the
+  headers received for a connection and pass them on to the application.
+  Bugs in parsing those headers which can result in request smuggling are
+  considered vulnerabilities.
+
+#### Missing Cryptographic Step (CWE-325)
+
+* Node.js provides APIs to encrypt data. Bugs that would allow an attacker
+  to get the original data without requiring the decryption key are
+  considered vulnerabilities.
+
+#### External Control of System or Configuration Setting (CWE-15)
+
+* If Node.js automatically loads a configuration file which is not documented
+  and modification of that configuration can affect the confidentiality of
+  data protected using the Node.js APIs this is considered a vulnerability.
+
+### Examples of non-vulneratibities
+
+#### Malicious Third-Party Modules (CWE-1357)
+
+* Code is trusted by Node.js, therefore any scenario that requires a malicious
+  third-party module cannot result in a vulnerability in Node.js.
+
+#### Prototype Pollution Attacks (CWE-1321)
+
+* Node.js trusts the inputs provided to it by application code.
+  It is up to the application to sanitize appropriately, therefore any scenario
+  that requires control over user input is not considered a vulnerability.
+
+#### Uncontrolled Search Path Element (CWE-427)
+
+* Node.js trusts the file system in the environment accessible to it.
+  Therefore, it is not a vulnerability if it accesses/loads files from any path
+  that is accessible to it.
+
+#### External Control of System or Configuration Setting (CWE-15)
+
+* If Node.js automatically loads a configuration file which is documented
+  no scenario that requires modification of that configuration file is
+  considered a vulnerability.
+
 ## Receiving security updates
 
 Security notifications will be distributed via the following methods.
diff --git a/benchmark/blob/file.js b/benchmark/blob/file.js
new file mode 100644
index 00000000000000..42f866b1ad8ce8
--- /dev/null
+++ b/benchmark/blob/file.js
@@ -0,0 +1,34 @@
+'use strict';
+const common = require('../common.js');
+const { File } = require('buffer');
+
+const bench = common.createBenchmark(main, {
+  bytes: [128, 1024, 1024 ** 2],
+  n: [1e6],
+  operation: ['text', 'arrayBuffer']
+});
+
+const options = {
+  lastModified: Date.now() - 1e6,
+};
+
+async function run(n, bytes, operation) {
+  const buff = Buffer.allocUnsafe(bytes);
+  const source = new File(buff, 'dummy.txt', options);
+  bench.start();
+  for (let i = 0; i < n; i++) {
+    switch (operation) {
+      case 'text':
+        await source.text();
+        break;
+      case 'arrayBuffer':
+        await source.arrayBuffer();
+        break;
+    }
+  }
+  bench.end(n);
+}
+
+function main(conf) {
+  run(conf.n, conf.bytes, conf.operation).catch(console.log);
+}
diff --git a/benchmark/util/text-encoder.js b/benchmark/util/text-encoder.js
new file mode 100644
index 00000000000000..ca3cb827779be3
--- /dev/null
+++ b/benchmark/util/text-encoder.js
@@ -0,0 +1,32 @@
+'use strict';
+
+const common = require('../common.js');
+
+const BASE = 'string\ud801';
+
+const bench = common.createBenchmark(main, {
+  len: [256, 1024, 1024 * 32],
+  n: [1e4],
+  op: ['encode', 'encodeInto']
+});
+
+function main({ n, op, len }) {
+  const encoder = new TextEncoder();
+  const input = BASE.repeat(len);
+  const subarray = new Uint8Array(len);
+
+  bench.start();
+  switch (op) {
+    case 'encode': {
+      for (let i = 0; i < n; i++)
+        encoder.encode(input);
+      break;
+    }
+    case 'encodeInto': {
+      for (let i = 0; i < n; i++)
+        encoder.encodeInto(input, subarray);
+      break;
+    }
+  }
+  bench.end(n);
+}
diff --git a/benchmark/v8/serialize.js b/benchmark/v8/serialize.js
new file mode 100644
index 00000000000000..331c576a1b490b
--- /dev/null
+++ b/benchmark/v8/serialize.js
@@ -0,0 +1,17 @@
+'use strict';
+
+const common = require('../common.js');
+const v8 = require('v8');
+
+const bench = common.createBenchmark(main, {
+  len: [256, 1024 * 16, 1024 * 512],
+  n: [1e6]
+});
+
+function main({ n, len }) {
+  const typedArray = new BigUint64Array(len);
+  bench.start();
+  for (let i = 0; i < n; i++)
+    v8.serialize({ a: 1, b: typedArray });
+  bench.end(n);
+}
diff --git a/common.gypi b/common.gypi
index da2e7b0462dfa9..5cdbee775864c8 100644
--- a/common.gypi
+++ b/common.gypi
@@ -36,7 +36,7 @@
 
     # Reset this number to 0 on major V8 upgrades.
     # Increment by one for each non-official patch applied to deps/v8.
-    'v8_embedder_string': '-node.19',
+    'v8_embedder_string': '-node.8',
 
     ##### V8 defaults for Node.js #####
 
@@ -283,11 +283,7 @@
           '-std:c++17'
         ],
         'BufferSecurityCheck': 'true',
-        'target_conditions': [
-          ['_toolset=="target"', {
-            'DebugInformationFormat': 1      # /Z7 embed info in .obj files
-          }],
-        ],
+        'DebugInformationFormat': 1,          # /Z7 embed info in .obj files
         'ExceptionHandling': 0,               # /EHsc
         'MultiProcessorCompilation': 'true',
         'StringPooling': 'true',              # pool string literals
diff --git a/configure.py b/configure.py
index b6415c38c808ab..a6dae354d4233f 100755
--- a/configure.py
+++ b/configure.py
@@ -160,6 +160,13 @@
     help="Generate an executable with libgcc and libstdc++ libraries. This "
          "will not work on OSX when using the default compilation environment")
 
+parser.add_argument("--enable-vtune-profiling",
+    action="store_true",
+    dest="enable_vtune_profiling",
+    help="Enable profiling support for Intel VTune profiler to profile "
+         "JavaScript code executed in Node.js. This feature is only available "
+         "for x32, x86, and x64 architectures.")
+
 parser.add_argument("--enable-pgo-generate",
     action="store_true",
     dest="enable_pgo_generate",
@@ -776,7 +783,13 @@
     action='store_true',
     dest='v8_enable_object_print',
     default=True,
-    help='compile V8 with auxiliar functions for native debuggers')
+    help='compile V8 with auxiliary functions for native debuggers')
+
+parser.add_argument('--v8-disable-object-print',
+    action='store_true',
+    dest='v8_disable_object_print',
+    default=False,
+    help='disable the V8 auxiliary functions for native debuggers')
 
 parser.add_argument('--v8-enable-hugepage',
     action='store_true',
@@ -1237,6 +1250,7 @@ def configure_node(o):
   # Enable branch protection for arm64
   if target_arch == 'arm64':
     o['cflags']+=['-msign-return-address=all']
+    o['variables']['arm_fpu'] = options.arm_fpu or 'neon'
 
   if options.node_snapshot_main is not None:
     if options.shared:
@@ -1273,6 +1287,15 @@ def configure_node(o):
   if flavor == 'aix':
     o['variables']['node_target_type'] = 'static_library'
 
+  if target_arch in ('x86', 'x64', 'ia32', 'x32'):
+    o['variables']['node_enable_v8_vtunejit'] = b(options.enable_vtune_profiling)
+  elif options.enable_vtune_profiling:
+    raise Exception(
+       'The VTune profiler for JavaScript is only supported on x32, x86, and x64 '
+       'architectures.')
+  else:
+    o['variables']['node_enable_v8_vtunejit'] = 'false'
+
   if flavor != 'linux' and (options.enable_pgo_generate or options.enable_pgo_use):
     raise Exception(
       'The pgo option is supported only on linux.')
@@ -1436,7 +1459,7 @@ def configure_v8(o):
   o['variables']['v8_no_strict_aliasing'] = 1  # Work around compiler bugs.
   o['variables']['v8_optimized_debug'] = 0 if options.v8_non_optimized_debug else 1
   o['variables']['dcheck_always_on'] = 1 if options.v8_with_dchecks else 0
-  o['variables']['v8_enable_object_print'] = 1 if options.v8_enable_object_print else 0
+  o['variables']['v8_enable_object_print'] = 0 if options.v8_disable_object_print else 1
   o['variables']['v8_random_seed'] = 0  # Use a random seed for hash tables.
   o['variables']['v8_promise_internal_field_count'] = 1 # Add internal field to promises for async hooks.
   o['variables']['v8_use_siphash'] = 0 if options.without_siphash else 1
@@ -1459,6 +1482,10 @@ def configure_v8(o):
   o['variables']['v8_enable_hugepage'] = 1 if options.v8_enable_hugepage else 0
   if options.v8_enable_short_builtin_calls or o['variables']['target_arch'] == 'x64':
     o['variables']['v8_enable_short_builtin_calls'] = 1
+  if options.v8_enable_object_print and options.v8_disable_object_print:
+    raise Exception(
+        'Only one of the --v8-enable-object-print or --v8-disable-object-print options '
+        'can be specified at a time.')
 
 def configure_openssl(o):
   variables = o['variables']
diff --git a/deps/acorn/acorn/CHANGELOG.md b/deps/acorn/acorn/CHANGELOG.md
index ea8d6c04dbad5b..cf40d7cfd13ce2 100644
--- a/deps/acorn/acorn/CHANGELOG.md
+++ b/deps/acorn/acorn/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 8.8.1 (2022-10-24)
+
+### Bug fixes
+
+Make type for `Comment` compatible with estree types.
+
 ## 8.8.0 (2022-07-21)
 
 ### Bug fixes
diff --git a/deps/acorn/acorn/dist/acorn.d.ts b/deps/acorn/acorn/dist/acorn.d.ts
index 140f6ed12855be..d6d5b824c3e5c8 100644
--- a/deps/acorn/acorn/dist/acorn.d.ts
+++ b/deps/acorn/acorn/dist/acorn.d.ts
@@ -224,7 +224,7 @@ declare namespace acorn {
   }
 
   interface Comment extends AbstractToken {
-    type: string
+    type: 'Line' | 'Block'
     value: string
     start: number
     end: number
diff --git a/deps/acorn/acorn/dist/acorn.js b/deps/acorn/acorn/dist/acorn.js
index 8e8b225b0b3c8e..5a291db1552038 100644
--- a/deps/acorn/acorn/dist/acorn.js
+++ b/deps/acorn/acorn/dist/acorn.js
@@ -5527,7 +5527,7 @@
 
   // Acorn is a tiny, fast JavaScript parser written in JavaScript.
 
-  var version = "8.8.0";
+  var version = "8.8.1";
 
   Parser.acorn = {
     Parser: Parser,
diff --git a/deps/acorn/acorn/dist/acorn.mjs b/deps/acorn/acorn/dist/acorn.mjs
index 5ae045a7f2a7de..7ddf96b2a8ebed 100644
--- a/deps/acorn/acorn/dist/acorn.mjs
+++ b/deps/acorn/acorn/dist/acorn.mjs
@@ -5521,7 +5521,7 @@ pp.readWord = function() {
 
 // Acorn is a tiny, fast JavaScript parser written in JavaScript.
 
-var version = "8.8.0";
+var version = "8.8.1";
 
 Parser.acorn = {
   Parser: Parser,
diff --git a/deps/acorn/acorn/package.json b/deps/acorn/acorn/package.json
index 896061c412f549..579d89f5fff463 100644
--- a/deps/acorn/acorn/package.json
+++ b/deps/acorn/acorn/package.json
@@ -16,7 +16,7 @@
     ],
     "./package.json": "./package.json"
   },
-  "version": "8.8.0",
+  "version": "8.8.1",
   "engines": {
     "node": ">=0.4.0"
   },
diff --git a/deps/base64/base64/CMakeLists.txt b/deps/base64/base64/CMakeLists.txt
index dcca17f6e27b48..56076e47a6aa3a 100644
--- a/deps/base64/base64/CMakeLists.txt
+++ b/deps/base64/base64/CMakeLists.txt
@@ -17,7 +17,7 @@ if (POLICY CMP0127)
     cmake_policy(SET CMP0127 NEW)
 endif()
 
-project(base64 LANGUAGES C VERSION 0.4.0)
+project(base64 LANGUAGES C VERSION 0.5.0)
 
 include(GNUInstallDirs)
 include(CMakeDependentOption)
diff --git a/deps/icu-small/source/data/in/icudt72l.dat.bz2 b/deps/icu-small/source/data/in/icudt72l.dat.bz2
index 9f6ed16011595b..473242007ac5e6 100644
Binary files a/deps/icu-small/source/data/in/icudt72l.dat.bz2 and b/deps/icu-small/source/data/in/icudt72l.dat.bz2 differ
diff --git a/deps/v8/.gitignore b/deps/v8/.gitignore
index 489f0b64f9b1ef..f1bd2f33fe771a 100644
--- a/deps/v8/.gitignore
+++ b/deps/v8/.gitignore
@@ -122,3 +122,4 @@ bazel-v8
 /third_party/zlib/contrib/bench
 /third_party/zlib/contrib/tests
 /third_party/zlib/google/test
+!/third_party/ittapi
diff --git a/deps/v8/.vpython b/deps/v8/.vpython
deleted file mode 100644
index d4a07677ca9a22..00000000000000
--- a/deps/v8/.vpython
+++ /dev/null
@@ -1,91 +0,0 @@
-# This is a vpython "spec" file.
-#
-# It describes patterns for python wheel dependencies of the python scripts in
-# the V8 repo, particularly for dependencies that have compiled components
-# (since pure-python dependencies can be easily vendored into third_party).
-#
-# When vpython is invoked, it finds this file and builds a python VirtualEnv,
-# containing all of the dependencies described in this file, fetching them from
-# CIPD (the "Chrome Infrastructure Package Deployer" service). Unlike `pip`,
-# this never requires the end-user machine to have a working python extension
-# compilation environment. All of these packages are built using:
-#   https://chromium.googlesource.com/infra/infra/+/master/infra/tools/dockerbuild/
-#
-# All python scripts in the repo share this same spec, to avoid dependency
-# fragmentation.
-#
-# If you have depot_tools installed in your $PATH, you can invoke python scripts
-# in this repo by running them as you normally would run them, except
-# substituting `vpython` instead of `python` on the command line, e.g.:
-#   vpython path/to/script.py some --arguments
-#
-# Read more about `vpython` and how to modify this file here:
-#   https://chromium.googlesource.com/infra/infra/+/master/doc/users/vpython.md
-
-python_version: "2.7"
-
-# The default set of platforms vpython checks does not yet include mac-arm64.
-# Setting `verify_pep425_tag` to the list of platforms we explicitly must support
-# allows us to ensure that vpython specs stay mac-arm64-friendly
-verify_pep425_tag: [
-    {python: "cp27", abi: "cp27mu", platform: "manylinux1_x86_64"},
-    {python: "cp27", abi: "cp27mu", platform: "linux_arm64"},
-    {python: "cp27", abi: "cp27mu", platform: "linux_armv6l"},
-
-    {python: "cp27", abi: "cp27m", platform: "macosx_10_10_intel"},
-    {python: "cp27", abi: "cp27m", platform: "macosx_11_0_arm64"},
-
-    {python: "cp27", abi: "cp27m", platform: "win32"},
-    {python: "cp27", abi: "cp27m", platform: "win_amd64"}
-]
-
-# Needed by third_party/catapult/devil/devil, which is imported by
-# build/android/test_runner.py when running performance tests.
-wheel: <
-  name: "infra/python/wheels/psutil/${vpython_platform}"
-  version: "version:5.2.2"
->
-
-# Used by:
-#   build/toolchain/win
-wheel: <
-  name: "infra/python/wheels/pypiwin32/${vpython_platform}"
-  version: "version:219"
-  match_tag: <
-    platform: "win32"
-  >
-  match_tag: <
-    platform: "win_amd64"
-  >
->
-
-# Used by:
-#   tools/unittests/run_perf_test.py
-wheel: <
-  name: "infra/python/wheels/coverage/${vpython_platform}"
-  version: "version:4.3.4"
->
-wheel: <
-  name: "infra/python/wheels/six-py2_py3"
-  version: "version:1.10.0"
->
-wheel: <
-  name: "infra/python/wheels/pbr-py2_py3"
-  version: "version:3.0.0"
->
-wheel: <
-  name: "infra/python/wheels/funcsigs-py2_py3"
-  version: "version:1.0.2"
->
-wheel: <
-  name: "infra/python/wheels/mock-py2_py3"
-  version: "version:2.0.0"
->
-
-# Used by:
-#   tools/run_perf.py
-#   tools/unittests/run_perf_test.py
-wheel: <
-  name: "infra/python/wheels/numpy/${vpython_platform}"
-  version: "version:1.11.3"
->
diff --git a/deps/v8/.vpython3 b/deps/v8/.vpython3
index 50fab3bb519735..1187542f5e19a1 100644
--- a/deps/v8/.vpython3
+++ b/deps/v8/.vpython3
@@ -47,7 +47,7 @@ wheel: <
 
 wheel: <
   name: "infra/python/wheels/coverage/${vpython_platform}"
-  version: "version:5.5.chromium.2"
+  version: "version:5.5.chromium.3"
 >
 
 wheel: <
@@ -74,3 +74,8 @@ wheel: <
   name: "infra/python/wheels/protobuf-py3"
   version: "version:3.19.3"
 >
+
+wheel: <
+  name: "infra/python/wheels/requests-py2_py3"
+  version: "version:2.13.0"
+>
diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS
index 3ef613e0f37062..af37f8db25121e 100644
--- a/deps/v8/AUTHORS
+++ b/deps/v8/AUTHORS
@@ -60,6 +60,7 @@ Allan Sandfeld Jensen <allan.jensen@qt.io>
 Amos Lim <eui-sang.lim@samsung.com>
 Andreas Anyuru <andreas.anyuru@gmail.com>
 Andrei Kashcha <anvaka@gmail.com>
+Andreu Botella <andreu@andreubotella.com>
 Andrew Paprocki <andrew@ishiboo.com>
 Anna Henningsen <anna@addaleax.net>
 Antoine du Hamel <duhamelantoine1995@gmail.com>
@@ -136,6 +137,7 @@ Ingvar Stepanyan <me@rreverser.com>
 Ioseb Dzmanashvili <ioseb.dzmanashvili@gmail.com>
 Isiah Meadows <impinball@gmail.com>
 Jaime Bernardo <jaime@janeasystems.com>
+Jake Hughes <jh@jakehughes.uk>
 James M Snell <jasnell@gmail.com>
 James Pike <g00gle@chilon.net>
 Jan Krems <jan.krems@gmail.com>
diff --git a/deps/v8/BUILD.bazel b/deps/v8/BUILD.bazel
index 4e89f90e7e31e1..f216a1811da852 100644
--- a/deps/v8/BUILD.bazel
+++ b/deps/v8/BUILD.bazel
@@ -891,6 +891,7 @@ filegroup(
         "src/builtins/typed-array-sort.tq",
         "src/builtins/typed-array-subarray.tq",
         "src/builtins/typed-array-to-reversed.tq",
+        "src/builtins/typed-array-to-sorted.tq",
         "src/builtins/typed-array-values.tq",
         "src/builtins/typed-array-with.tq",
         "src/builtins/typed-array.tq",
@@ -925,6 +926,7 @@ filegroup(
         "src/objects/js-objects.tq",
         "src/objects/js-promise.tq",
         "src/objects/js-proxy.tq",
+        "src/objects/js-raw-json.tq",
         "src/objects/js-regexp-string-iterator.tq",
         "src/objects/js-regexp.tq",
         "src/objects/js-shadow-realm.tq",
@@ -980,6 +982,7 @@ filegroup(
         "src/objects/js-collator.tq",
         "src/objects/js-date-time-format.tq",
         "src/objects/js-display-names.tq",
+        "src/objects/js-duration-format.tq",
         "src/objects/js-list-format.tq",
         "src/objects/js-locale.tq",
         "src/objects/js-number-format.tq",
@@ -1267,8 +1270,6 @@ filegroup(
         "src/debug/debug-scopes.h",
         "src/debug/debug-stack-trace-iterator.cc",
         "src/debug/debug-stack-trace-iterator.h",
-        "src/debug/debug-type-profile.cc",
-        "src/debug/debug-type-profile.h",
         "src/debug/debug.cc",
         "src/debug/debug.h",
         "src/debug/interface-types.h",
@@ -1435,6 +1436,9 @@ filegroup(
         "src/heap/embedder-tracing.cc",
         "src/heap/embedder-tracing.h",
         "src/heap/embedder-tracing-inl.h",
+        "src/heap/evacuation-verifier.cc",
+        "src/heap/evacuation-verifier.h",
+        "src/heap/evacuation-verifier-inl.h",
         "src/heap/factory-base.cc",
         "src/heap/factory-base.h",
         "src/heap/factory-base-inl.h",
@@ -1497,6 +1501,8 @@ filegroup(
         "src/heap/marking-barrier.cc",
         "src/heap/marking-barrier.h",
         "src/heap/marking-barrier-inl.h",
+        "src/heap/marking-state.h",
+        "src/heap/marking-state-inl.h",
         "src/heap/marking-visitor-inl.h",
         "src/heap/marking-visitor.h",
         "src/heap/marking-worklist-inl.h",
@@ -1529,6 +1535,9 @@ filegroup(
         "src/heap/paged-spaces.h",
         "src/heap/parallel-work-item.h",
         "src/heap/parked-scope.h",
+        "src/heap/pretenuring-handler-inl.h",
+        "src/heap/pretenuring-handler.cc",
+        "src/heap/pretenuring-handler.h",
         "src/heap/progress-bar.h",
         "src/heap/read-only-heap-inl.h",
         "src/heap/read-only-heap.cc",
@@ -1753,6 +1762,9 @@ filegroup(
         "src/objects/js-promise.h",
         "src/objects/js-proxy-inl.h",
         "src/objects/js-proxy.h",
+        "src/objects/js-raw-json-inl.h",
+        "src/objects/js-raw-json.h",
+        "src/objects/js-raw-json.cc",
         "src/objects/js-regexp-inl.h",
         "src/objects/js-regexp-string-iterator-inl.h",
         "src/objects/js-regexp-string-iterator.h",
@@ -1978,8 +1990,6 @@ filegroup(
         "src/regexp/experimental/experimental-interpreter.h",
         "src/regexp/experimental/experimental.cc",
         "src/regexp/experimental/experimental.h",
-        "src/regexp/property-sequences.cc",
-        "src/regexp/property-sequences.h",
         "src/regexp/regexp-ast.cc",
         "src/regexp/regexp-ast.h",
         "src/regexp/regexp-bytecode-generator-inl.h",
@@ -2061,6 +2071,8 @@ filegroup(
         "src/sandbox/sandbox.h",
         "src/sandbox/sandboxed-pointer-inl.h",
         "src/sandbox/sandboxed-pointer.h",
+        "src/sandbox/bounded-size-inl.h",
+        "src/sandbox/bounded-size.h",
         "src/base/sanitizer/asan.h",
         "src/base/sanitizer/lsan-page-allocator.cc",
         "src/base/sanitizer/lsan-page-allocator.h",
@@ -2527,8 +2539,8 @@ filegroup(
             "src/wasm/names-provider.cc",
             "src/wasm/names-provider.h",
             "src/wasm/object-access.h",
-            "src/wasm/signature-map.cc",
-            "src/wasm/signature-map.h",
+            "src/wasm/pgo.cc",
+            "src/wasm/pgo.h",
             "src/wasm/simd-shuffle.cc",
             "src/wasm/simd-shuffle.h",
             "src/wasm/stacks.cc",
@@ -2606,6 +2618,9 @@ filegroup(
         "src/objects/js-display-names.cc",
         "src/objects/js-display-names.h",
         "src/objects/js-display-names-inl.h",
+        "src/objects/js-duration-format.cc",
+        "src/objects/js-duration-format.h",
+        "src/objects/js-duration-format-inl.h",
         "src/objects/js-list-format.cc",
         "src/objects/js-list-format.h",
         "src/objects/js-list-format-inl.h",
@@ -2872,13 +2887,20 @@ filegroup(
         "src/compiler/turboshaft/graph.h",
         "src/compiler/turboshaft/graph-visualizer.cc",
         "src/compiler/turboshaft/graph-visualizer.h",
+        "src/compiler/turboshaft/machine-optimization-assembler.h",
         "src/compiler/turboshaft/operations.cc",
         "src/compiler/turboshaft/operations.h",
+        "src/compiler/turboshaft/operation-matching.h",
         "src/compiler/turboshaft/optimization-phase.cc",
         "src/compiler/turboshaft/optimization-phase.h",
         "src/compiler/turboshaft/recreate-schedule.cc",
         "src/compiler/turboshaft/recreate-schedule.h",
+        "src/compiler/turboshaft/representations.cc",
+        "src/compiler/turboshaft/representations.h",
         "src/compiler/turboshaft/sidetable.h",
+        "src/compiler/turboshaft/simplify-tf-loops.cc",
+        "src/compiler/turboshaft/simplify-tf-loops.h",
+        "src/compiler/turboshaft/utils.cc",
         "src/compiler/turboshaft/utils.h",
         "src/compiler/turboshaft/value-numbering-assembler.h",
         "src/compiler/type-cache.cc",
@@ -2891,6 +2913,7 @@ filegroup(
         "src/compiler/typer.h",
         "src/compiler/types.cc",
         "src/compiler/types.h",
+        "src/compiler/use-info.h",
         "src/compiler/value-numbering-reducer.cc",
         "src/compiler/value-numbering-reducer.h",
         "src/compiler/verifier.cc",
@@ -3101,6 +3124,7 @@ filegroup(
         "src/heap/cppgc/stats-collector.h",
         "src/heap/cppgc/sweeper.cc",
         "src/heap/cppgc/sweeper.h",
+        "src/heap/cppgc/heap-config.h",
         "src/heap/cppgc/task-handle.h",
         "src/heap/cppgc/trace-event.h",
         "src/heap/cppgc/trace-trait.cc",
@@ -3119,6 +3143,7 @@ filegroup(
     srcs = [
         "src/heap/base/active-system-pages.cc",
         "src/heap/base/active-system-pages.h",
+        "src/heap/base/basic-slot-set.h",
         "src/heap/base/stack.cc",
         "src/heap/base/stack.h",
         "src/heap/base/worklist.cc",
diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn
index 3f78b1773f3907..61187af3053a02 100644
--- a/deps/v8/BUILD.gn
+++ b/deps/v8/BUILD.gn
@@ -285,8 +285,11 @@ declare_args() {
       target_os == "fuchsia"
 
   # Enable control-flow integrity features, such as pointer authentication for
-  # ARM64.
-  v8_control_flow_integrity = false
+  # ARM64. Enable it by default for simulator builds and when native code
+  # supports it as well.
+  v8_control_flow_integrity =
+      v8_current_cpu == "arm64" &&
+      (target_is_simulator || arm_control_flow_integrity != "none")
 
   # Enable heap reservation of size 4GB. Only possible for 64bit archs.
   cppgc_enable_caged_heap =
@@ -465,6 +468,8 @@ if (v8_builtins_profiling_log_file == "default") {
       v8_builtins_profiling_log_file = "tools/builtins-pgo/x64.profile"
     } else if (v8_current_cpu == "arm64") {
       v8_builtins_profiling_log_file = "tools/builtins-pgo/arm64.profile"
+    } else if (v8_current_cpu == "arm") {
+      v8_builtins_profiling_log_file = "tools/builtins-pgo/arm.profile"
     }
   }
 }
@@ -496,14 +501,6 @@ assert(!v8_enable_trace_ignition || v8_enable_trace_unoptimized,
 assert(!v8_enable_trace_baseline_exec || v8_enable_trace_unoptimized,
        "Baseline tracing requires unoptimized tracing to be enabled.")
 
-# Check if it is a Chromium build and activate PAC/BTI if needed.
-# TODO(cavalcantii): have a single point of integration with PAC/BTI flags.
-if (build_with_chromium && v8_current_cpu == "arm64" &&
-    (arm_control_flow_integrity == "standard" ||
-     arm_control_flow_integrity == "pac")) {
-  v8_control_flow_integrity = true
-}
-
 if (v8_enable_short_builtin_calls &&
     (!v8_enable_pointer_compression && v8_current_cpu != "x64")) {
   # Disable short calls when pointer compression is not enabled, except x64,
@@ -521,9 +518,8 @@ if (v8_enable_sandbox == "") {
   # once that is enabled everywhere by default.
   # TODO(chromium:1325784) the sandbox is not currently supported in Chromium
   # on Fuchsia.
-  v8_enable_sandbox =
-      build_with_chromium && v8_enable_pointer_compression_shared_cage &&
-      v8_enable_external_code_space && target_os != "fuchsia"
+  v8_enable_sandbox = v8_enable_pointer_compression_shared_cage &&
+                      v8_enable_external_code_space && target_os != "fuchsia"
 }
 
 # Enable all available sandbox features if sandbox future is enabled.
@@ -1102,18 +1098,9 @@ config("toolchain") {
   }
   if (v8_current_cpu == "arm64") {
     defines += [ "V8_TARGET_ARCH_ARM64" ]
-    if (current_cpu == "arm64") {
-      # This will enable PAC+BTI in code generation and static code.
-      if (v8_control_flow_integrity &&
-          (!build_with_chromium || arm_control_flow_integrity == "standard")) {
-        cflags += [ "-mbranch-protection=standard" ]
-        asmflags = [ "-mmark-bti-property" ]
-      } else if (build_with_chromium && arm_control_flow_integrity == "pac") {
-        # This should enable PAC only in C++ code (and no CFI in runtime
-        # generated code). For details, see crbug.com/919548.
-        cflags += [ "-mbranch-protection=pac-ret" ]
-        asmflags = [ "-mbranch-protection=pac-ret" ]
-      }
+    if (current_cpu == "arm64" && v8_control_flow_integrity && is_clang) {
+      # Mark assembly code as BTI-compatible.
+      asmflags = [ "-mmark-bti-property" ]
     }
   }
 
@@ -1619,6 +1606,9 @@ action("postmortem-metadata") {
     "src/objects/js-objects-inl.h",
     "src/objects/js-promise.h",
     "src/objects/js-promise-inl.h",
+    "src/objects/js-raw-json.cc",
+    "src/objects/js-raw-json.h",
+    "src/objects/js-raw-json-inl.h",
     "src/objects/js-regexp.cc",
     "src/objects/js-regexp.h",
     "src/objects/js-regexp-inl.h",
@@ -1790,6 +1780,7 @@ torque_files = [
   "src/builtins/typed-array-sort.tq",
   "src/builtins/typed-array-subarray.tq",
   "src/builtins/typed-array-to-reversed.tq",
+  "src/builtins/typed-array-to-sorted.tq",
   "src/builtins/typed-array-values.tq",
   "src/builtins/typed-array-with.tq",
   "src/builtins/typed-array.tq",
@@ -1824,6 +1815,7 @@ torque_files = [
   "src/objects/js-objects.tq",
   "src/objects/js-promise.tq",
   "src/objects/js-proxy.tq",
+  "src/objects/js-raw-json.tq",
   "src/objects/js-regexp-string-iterator.tq",
   "src/objects/js-regexp.tq",
   "src/objects/js-shadow-realm.tq",
@@ -1870,6 +1862,7 @@ if (v8_enable_i18n_support) {
     "src/objects/js-collator.tq",
     "src/objects/js-date-time-format.tq",
     "src/objects/js-display-names.tq",
+    "src/objects/js-duration-format.tq",
     "src/objects/js-list-format.tq",
     "src/objects/js-locale.tq",
     "src/objects/js-number-format.tq",
@@ -2930,10 +2923,14 @@ v8_header_set("v8_internal_headers") {
     "src/compiler/turboshaft/graph-builder.h",
     "src/compiler/turboshaft/graph-visualizer.h",
     "src/compiler/turboshaft/graph.h",
+    "src/compiler/turboshaft/machine-optimization-assembler.h",
+    "src/compiler/turboshaft/operation-matching.h",
     "src/compiler/turboshaft/operations.h",
     "src/compiler/turboshaft/optimization-phase.h",
     "src/compiler/turboshaft/recreate-schedule.h",
+    "src/compiler/turboshaft/representations.h",
     "src/compiler/turboshaft/sidetable.h",
+    "src/compiler/turboshaft/simplify-tf-loops.h",
     "src/compiler/turboshaft/utils.h",
     "src/compiler/turboshaft/value-numbering-assembler.h",
     "src/compiler/type-cache.h",
@@ -2941,6 +2938,7 @@ v8_header_set("v8_internal_headers") {
     "src/compiler/typed-optimization.h",
     "src/compiler/typer.h",
     "src/compiler/types.h",
+    "src/compiler/use-info.h",
     "src/compiler/value-numbering-reducer.h",
     "src/compiler/verifier.h",
     "src/compiler/write-barrier-kind.h",
@@ -2956,7 +2954,6 @@ v8_header_set("v8_internal_headers") {
     "src/debug/debug-scope-iterator.h",
     "src/debug/debug-scopes.h",
     "src/debug/debug-stack-trace-iterator.h",
-    "src/debug/debug-type-profile.h",
     "src/debug/debug.h",
     "src/debug/interface-types.h",
     "src/debug/liveedit-diff.h",
@@ -3053,6 +3050,8 @@ v8_header_set("v8_internal_headers") {
     "src/heap/embedder-tracing.h",
     "src/heap/evacuation-allocator-inl.h",
     "src/heap/evacuation-allocator.h",
+    "src/heap/evacuation-verifier-inl.h",
+    "src/heap/evacuation-verifier.h",
     "src/heap/factory-base-inl.h",
     "src/heap/factory-base.h",
     "src/heap/factory-inl.h",
@@ -3090,6 +3089,8 @@ v8_header_set("v8_internal_headers") {
     "src/heap/mark-compact.h",
     "src/heap/marking-barrier-inl.h",
     "src/heap/marking-barrier.h",
+    "src/heap/marking-state-inl.h",
+    "src/heap/marking-state.h",
     "src/heap/marking-visitor-inl.h",
     "src/heap/marking-visitor.h",
     "src/heap/marking-worklist-inl.h",
@@ -3111,6 +3112,8 @@ v8_header_set("v8_internal_headers") {
     "src/heap/paged-spaces.h",
     "src/heap/parallel-work-item.h",
     "src/heap/parked-scope.h",
+    "src/heap/pretenuring-handler-inl.h",
+    "src/heap/pretenuring-handler.h",
     "src/heap/progress-bar.h",
     "src/heap/read-only-heap-inl.h",
     "src/heap/read-only-heap.h",
@@ -3269,6 +3272,8 @@ v8_header_set("v8_internal_headers") {
     "src/objects/js-promise.h",
     "src/objects/js-proxy-inl.h",
     "src/objects/js-proxy.h",
+    "src/objects/js-raw-json-inl.h",
+    "src/objects/js-raw-json.h",
     "src/objects/js-regexp-inl.h",
     "src/objects/js-regexp-string-iterator-inl.h",
     "src/objects/js-regexp-string-iterator.h",
@@ -3431,7 +3436,6 @@ v8_header_set("v8_internal_headers") {
     "src/regexp/experimental/experimental-compiler.h",
     "src/regexp/experimental/experimental-interpreter.h",
     "src/regexp/experimental/experimental.h",
-    "src/regexp/property-sequences.h",
     "src/regexp/regexp-ast.h",
     "src/regexp/regexp-bytecode-generator-inl.h",
     "src/regexp/regexp-bytecode-generator.h",
@@ -3455,6 +3459,8 @@ v8_header_set("v8_internal_headers") {
     "src/roots/roots.h",
     "src/runtime/runtime-utils.h",
     "src/runtime/runtime.h",
+    "src/sandbox/bounded-size-inl.h",
+    "src/sandbox/bounded-size.h",
     "src/sandbox/external-pointer-inl.h",
     "src/sandbox/external-pointer-table-inl.h",
     "src/sandbox/external-pointer-table.h",
@@ -3625,7 +3631,7 @@ v8_header_set("v8_internal_headers") {
       "src/wasm/module-instantiate.h",
       "src/wasm/names-provider.h",
       "src/wasm/object-access.h",
-      "src/wasm/signature-map.h",
+      "src/wasm/pgo.h",
       "src/wasm/simd-shuffle.h",
       "src/wasm/stacks.h",
       "src/wasm/streaming-decoder.h",
@@ -3682,6 +3688,8 @@ v8_header_set("v8_internal_headers") {
       "src/objects/js-date-time-format.h",
       "src/objects/js-display-names-inl.h",
       "src/objects/js-display-names.h",
+      "src/objects/js-duration-format-inl.h",
+      "src/objects/js-duration-format.h",
       "src/objects/js-list-format-inl.h",
       "src/objects/js-list-format.h",
       "src/objects/js-locale-inl.h",
@@ -4229,6 +4237,9 @@ v8_source_set("v8_turboshaft") {
     "src/compiler/turboshaft/operations.cc",
     "src/compiler/turboshaft/optimization-phase.cc",
     "src/compiler/turboshaft/recreate-schedule.cc",
+    "src/compiler/turboshaft/representations.cc",
+    "src/compiler/turboshaft/simplify-tf-loops.cc",
+    "src/compiler/turboshaft/utils.cc",
   ]
 
   public_deps = [
@@ -4369,7 +4380,6 @@ v8_source_set("v8_base_without_compiler") {
     "src/debug/debug-scope-iterator.cc",
     "src/debug/debug-scopes.cc",
     "src/debug/debug-stack-trace-iterator.cc",
-    "src/debug/debug-type-profile.cc",
     "src/debug/debug.cc",
     "src/debug/liveedit-diff.cc",
     "src/debug/liveedit.cc",
@@ -4436,6 +4446,7 @@ v8_source_set("v8_base_without_compiler") {
     "src/heap/cppgc-js/unified-heap-marking-verifier.cc",
     "src/heap/cppgc-js/unified-heap-marking-visitor.cc",
     "src/heap/embedder-tracing.cc",
+    "src/heap/evacuation-verifier.cc",
     "src/heap/factory-base.cc",
     "src/heap/factory.cc",
     "src/heap/finalization-registry-cleanup-task.cc",
@@ -4469,6 +4480,7 @@ v8_source_set("v8_base_without_compiler") {
     "src/heap/object-stats.cc",
     "src/heap/objects-visiting.cc",
     "src/heap/paged-spaces.cc",
+    "src/heap/pretenuring-handler.cc",
     "src/heap/read-only-heap.cc",
     "src/heap/read-only-spaces.cc",
     "src/heap/safepoint.cc",
@@ -4541,12 +4553,14 @@ v8_source_set("v8_base_without_compiler") {
     "src/objects/js-collator.cc",
     "src/objects/js-date-time-format.cc",
     "src/objects/js-display-names.cc",
+    "src/objects/js-duration-format.cc",
     "src/objects/js-function.cc",
     "src/objects/js-list-format.cc",
     "src/objects/js-locale.cc",
     "src/objects/js-number-format.cc",
     "src/objects/js-objects.cc",
     "src/objects/js-plural-rules.cc",
+    "src/objects/js-raw-json.cc",
     "src/objects/js-regexp.cc",
     "src/objects/js-relative-time-format.cc",
     "src/objects/js-segment-iterator.cc",
@@ -4615,7 +4629,6 @@ v8_source_set("v8_base_without_compiler") {
     "src/regexp/experimental/experimental-compiler.cc",
     "src/regexp/experimental/experimental-interpreter.cc",
     "src/regexp/experimental/experimental.cc",
-    "src/regexp/property-sequences.cc",
     "src/regexp/regexp-ast.cc",
     "src/regexp/regexp-bytecode-generator.cc",
     "src/regexp/regexp-bytecode-peephole.cc",
@@ -4767,7 +4780,7 @@ v8_source_set("v8_base_without_compiler") {
       "src/wasm/module-decoder.cc",
       "src/wasm/module-instantiate.cc",
       "src/wasm/names-provider.cc",
-      "src/wasm/signature-map.cc",
+      "src/wasm/pgo.cc",
       "src/wasm/simd-shuffle.cc",
       "src/wasm/stacks.cc",
       "src/wasm/streaming-decoder.cc",
@@ -5130,6 +5143,7 @@ v8_source_set("v8_base_without_compiler") {
       "src/objects/js-collator.cc",
       "src/objects/js-date-time-format.cc",
       "src/objects/js-display-names.cc",
+      "src/objects/js-duration-format.cc",
       "src/objects/js-list-format.cc",
       "src/objects/js-locale.cc",
       "src/objects/js-number-format.cc",
@@ -5712,6 +5726,7 @@ v8_source_set("v8_bigint") {
 v8_header_set("v8_heap_base_headers") {
   sources = [
     "src/heap/base/active-system-pages.h",
+    "src/heap/base/basic-slot-set.h",
     "src/heap/base/stack.h",
     "src/heap/base/worklist.h",
   ]
@@ -5856,6 +5871,7 @@ v8_source_set("cppgc_base") {
     "src/heap/cppgc/globals.h",
     "src/heap/cppgc/heap-base.cc",
     "src/heap/cppgc/heap-base.h",
+    "src/heap/cppgc/heap-config.h",
     "src/heap/cppgc/heap-consistency.cc",
     "src/heap/cppgc/heap-growing.cc",
     "src/heap/cppgc/heap-growing.h",
@@ -6253,7 +6269,7 @@ group("gn_all") {
 }
 
 group("v8_python_base") {
-  data = [ ".vpython" ]
+  data = [ ".vpython3" ]
 }
 
 group("v8_clusterfuzz") {
diff --git a/deps/v8/COMMON_OWNERS b/deps/v8/COMMON_OWNERS
index 39f241b3e9a2f1..b7dc8f2147de77 100644
--- a/deps/v8/COMMON_OWNERS
+++ b/deps/v8/COMMON_OWNERS
@@ -18,6 +18,7 @@ machenbach@chromium.org
 manoskouk@chromium.org
 mathias@chromium.org
 marja@chromium.org
+mliedtke@chromium.org
 mlippautz@chromium.org
 mslekova@chromium.org
 nicohartmann@chromium.org
diff --git a/deps/v8/DEPS b/deps/v8/DEPS
index 457fcc13f7477e..6304c386414450 100644
--- a/deps/v8/DEPS
+++ b/deps/v8/DEPS
@@ -45,15 +45,19 @@ vars = {
   'reclient_version': 're_client_version:0.69.0.458df98-gomaip',
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:b4851eb2062f76a880c07f7fa0d12913beb6d79e',
+  'gn_version': 'git_revision:cc28efe62ef0c2fb32455f414a29c4a55bb7fbc4',
+
+  # ninja CIPD package version
+  # https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/ninja
+  'ninja_version': 'version:2@1.8.2.chromium.3',
 
   # luci-go CIPD package version.
-  'luci_go': 'git_revision:c93fd3c5ebdc3999eea86a7623dbd1ed4b40bc78',
+  'luci_go': 'git_revision:20c50aa39686d91330c2daceccaa4ef1a0a72ee4',
 
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:9.20220913.3.1',
+  'fuchsia_version': 'version:9.20220919.2.1',
 
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling android_sdk_build-tools_version
@@ -93,9 +97,9 @@ deps = {
   'base/trace_event/common':
     Var('chromium_url') + '/chromium/src/base/trace_event/common.git' + '@' + '521ac34ebd795939c7e16b37d9d3ddb40e8ed556',
   'build':
-    Var('chromium_url') + '/chromium/src/build.git' + '@' + '4157fb6cb44135013300168c9f4c5b95d04acf70',
+    Var('chromium_url') + '/chromium/src/build.git' + '@' + '7e7c21a9ac34c4fc2b255aa44d639efec9c33b90',
   'buildtools':
-    Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + 'e713c13e2fa3b7aa9131276f27990011e1aa6a73',
+    Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + '9174abb6ac087b46f22248dc713b6c0328b8f774',
   'buildtools/clang_format/script':
     Var('chromium_url') + '/external/github.com/llvm/llvm-project/clang/tools/clang-format.git' + '@' + '8b525d2747f2584fc35d8c7e612e66f377858df7',
   'buildtools/linux64': {
@@ -119,11 +123,11 @@ deps = {
     'condition': 'host_os == "mac"',
   },
   'buildtools/third_party/libc++/trunk':
-    Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + 'c1e647c7c30238f7c512457eec55798e3458fd8a',
+    Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + '2e919977e0030ce61bd19c40cefe31b995f1e2d4',
   'buildtools/third_party/libc++abi/trunk':
-    Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + '5c3e02e92ae8bbc1bf1001bd9ef0d76e044ddb86',
+    Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + 'db2a783a7d1ef0f0ef31da4b6e3de0c31fcfd93f',
   'buildtools/third_party/libunwind/trunk':
-    Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + '60a480ee1819266cf8054548454f99838583cd76',
+    Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + '08ebcbe7b672a04e341cb3a88d8bf4276f96ac6e',
   'buildtools/win': {
     'packages': [
       {
@@ -149,7 +153,7 @@ deps = {
   'test/mozilla/data':
     Var('chromium_url') + '/v8/deps/third_party/mozilla-tests.git' + '@' + 'f6c578a10ea707b1a8ab0b88943fe5115ce2b9be',
   'test/test262/data':
-    Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + '746197355c1705b7d4463fc75c29433c0ce2fd0d',
+    Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + '58b7a2358286b918efd38eac4b2facbc8ada1206',
   'third_party/android_ndk': {
     'url': Var('chromium_url') + '/android_ndk.git' + '@' + '8388a2be5421311dc75c5f937aae13d821a27f3d',
     'condition': 'checkout_android',
@@ -197,7 +201,7 @@ deps = {
       'dep_type': 'cipd',
   },
   'third_party/catapult': {
-    'url': Var('chromium_url') + '/catapult.git' + '@' + '37391a1619e953e23d3441dbc61e658e881fede4',
+    'url': Var('chromium_url') + '/catapult.git' + '@' + 'ff03621a71c01a6f2b0f3bf2677cf815291a9e85',
     'condition': 'checkout_android',
   },
   'third_party/colorama/src': {
@@ -205,7 +209,7 @@ deps = {
     'condition': 'checkout_android',
   },
   'third_party/depot_tools':
-    Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '9ebcfa6be17c2d1e7bd72135ceab5e767ed89b7d',
+    Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + 'a724859f7a9b3531c0373d86886a42314e772532',
   'third_party/fuchsia-sdk/sdk': {
     'packages': [
         {
@@ -239,6 +243,16 @@ deps = {
     Var('chromium_url') + '/infra/luci/luci-py/client/libs/logdog' + '@' + '0b2078a90f7a638d576b3a7c407d136f2fb62399',
   'third_party/markupsafe':
     Var('chromium_url') + '/chromium/src/third_party/markupsafe.git' + '@' + '1b882ef6372b58bfd55a3285f37ed801be9137cd',
+  'third_party/ninja': {
+    'packages': [
+      {
+        'package': 'infra/3pp/tools/ninja/${{platform}}',
+        'version': Var('ninja_version'),
+      }
+    ],
+    'dep_type': 'cipd',
+    'condition': 'host_cpu != "s390" and host_cpu != "ppc"'
+  },
   'third_party/perfetto':
     Var('android_url') + '/platform/external/perfetto.git' + '@' + '0eba417b2c72264fa825dc21067b9adc9b8adf70',
   'third_party/protobuf':
@@ -248,9 +262,9 @@ deps = {
       'condition': 'checkout_android',
   },
   'third_party/zlib':
-    Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + 'f48cb14d487038d20c85680e29351e095a0fea8b',
+    Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + 'd689fca54d7b43154f7cf77f785d19f2628fa133',
   'tools/clang':
-    Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + '02a202a7b1fa863352c0c9fb088fd3c0cf48c978',
+    Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + 'a5e0d72349d028a4023927d6d166a8478355fac3',
   'tools/luci-go': {
       'packages': [
         {
@@ -574,16 +588,6 @@ hooks = [
     'action': ['python3', 'tools/clang/scripts/update.py',
                '--package=objdump'],
   },
-  # Download and initialize "vpython" VirtualEnv environment packages.
-  {
-    'name': 'vpython_common',
-    'pattern': '.',
-    'condition': 'checkout_android',
-    'action': [ 'vpython',
-                '-vpython-spec', '.vpython',
-                '-vpython-tool', 'install',
-    ],
-  },
   {
     'name': 'vpython3_common',
     'pattern': '.',
diff --git a/deps/v8/ENG_REVIEW_OWNERS b/deps/v8/ENG_REVIEW_OWNERS
index 78d53b821d67e5..4f80f9d15a74c0 100644
--- a/deps/v8/ENG_REVIEW_OWNERS
+++ b/deps/v8/ENG_REVIEW_OWNERS
@@ -5,5 +5,6 @@
 adamk@chromium.org
 danno@chromium.org
 hpayer@chromium.org
+mlippautz@chromium.org
 verwaest@chromium.org
 vahl@chromium.org
diff --git a/deps/v8/bazel/defs.bzl b/deps/v8/bazel/defs.bzl
index e957c0fad3bc4b..d8db3fe8ba9a62 100644
--- a/deps/v8/bazel/defs.bzl
+++ b/deps/v8/bazel/defs.bzl
@@ -151,6 +151,14 @@ def _default_args():
                 "-fno-integrated-as",
             ],
             "//conditions:default": [],
+        }) + select({
+            "@v8//bazel/config:is_debug":[
+                "-fvisibility=default",
+            ],
+            "//conditions:default": [
+                "-fvisibility=hidden",
+                "-fvisibility-inlines-hidden",
+            ],
         }),
         includes = ["include"],
         linkopts = select({
@@ -407,15 +415,19 @@ v8_target_cpu_transition = transition(
 )
 
 def _mksnapshot(ctx):
+    prefix = ctx.attr.prefix
+    suffix = ctx.attr.suffix
     outs = [
-        ctx.actions.declare_file(ctx.attr.prefix + "/snapshot.cc"),
-        ctx.actions.declare_file(ctx.attr.prefix + "/embedded.S"),
+        ctx.actions.declare_file(prefix + "/snapshot" + suffix + ".cc"),
+        ctx.actions.declare_file(prefix + "/embedded" + suffix + ".S"),
     ]
     ctx.actions.run(
         outputs = outs,
         inputs = [],
         arguments = [
             "--embedded_variant=Default",
+            "--target_os",
+            ctx.attr.target_os,
             "--startup_src",
             outs[0].path,
             "--embedded_src",
@@ -436,26 +448,38 @@ _v8_mksnapshot = rule(
             executable = True,
             cfg = "exec",
         ),
+        "target_os": attr.string(mandatory = True),
         "_allowlist_function_transition": attr.label(
             default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
         ),
         "prefix": attr.string(mandatory = True),
+        "suffix": attr.string(mandatory = True),
     },
     cfg = v8_target_cpu_transition,
 )
 
-def v8_mksnapshot(name, args):
+def v8_mksnapshot(name, args, suffix = ""):
     _v8_mksnapshot(
         name = "noicu/" + name,
         args = args,
         prefix = "noicu",
-        tool = ":noicu/mksnapshot",
+        tool = ":noicu/mksnapshot" + suffix,
+        suffix = suffix,
+        target_os = select({
+            "@v8//bazel/config:is_macos": "mac",
+            "//conditions:default": "",
+        }),
     )
     _v8_mksnapshot(
         name = "icu/" + name,
         args = args,
         prefix = "icu",
-        tool = ":icu/mksnapshot",
+        tool = ":icu/mksnapshot" + suffix,
+        suffix = suffix,
+        target_os = select({
+            "@v8//bazel/config:is_macos": "mac",
+            "//conditions:default": "",
+        }),
     )
 
 def _quote(val):
diff --git a/deps/v8/include/cppgc/heap-handle.h b/deps/v8/include/cppgc/heap-handle.h
index 5a0f9cd2edcb9f..8d825133b065d6 100644
--- a/deps/v8/include/cppgc/heap-handle.h
+++ b/deps/v8/include/cppgc/heap-handle.h
@@ -12,6 +12,7 @@ namespace cppgc {
 namespace internal {
 class HeapBase;
 class WriteBarrierTypeForCagedHeapPolicy;
+class WriteBarrierTypeForNonCagedHeapPolicy;
 }  // namespace internal
 
 /**
@@ -34,6 +35,7 @@ class HeapHandle {
 
   friend class internal::HeapBase;
   friend class internal::WriteBarrierTypeForCagedHeapPolicy;
+  friend class internal::WriteBarrierTypeForNonCagedHeapPolicy;
 };
 
 }  // namespace cppgc
diff --git a/deps/v8/include/cppgc/internal/member-storage.h b/deps/v8/include/cppgc/internal/member-storage.h
index 98389b8cd3d531..0eb6382070c4da 100644
--- a/deps/v8/include/cppgc/internal/member-storage.h
+++ b/deps/v8/include/cppgc/internal/member-storage.h
@@ -61,7 +61,7 @@ class CageBaseGlobal final {
 #undef CPPGC_REQUIRE_CONSTANT_INIT
 #undef CPPGC_CONST
 
-class CompressedPointer final {
+class V8_TRIVIAL_ABI CompressedPointer final {
  public:
   using IntegralType = uint32_t;
 
@@ -170,7 +170,7 @@ class CompressedPointer final {
 
 #endif  // defined(CPPGC_POINTER_COMPRESSION)
 
-class RawPointer final {
+class V8_TRIVIAL_ABI RawPointer final {
  public:
   using IntegralType = uintptr_t;
 
diff --git a/deps/v8/include/cppgc/internal/write-barrier.h b/deps/v8/include/cppgc/internal/write-barrier.h
index 2d8e14be086d64..37bc5c973ef995 100644
--- a/deps/v8/include/cppgc/internal/write-barrier.h
+++ b/deps/v8/include/cppgc/internal/write-barrier.h
@@ -12,6 +12,7 @@
 #include "cppgc/heap-state.h"
 #include "cppgc/internal/api-constants.h"
 #include "cppgc/internal/atomic-entry-flag.h"
+#include "cppgc/internal/base-page-handle.h"
 #include "cppgc/internal/member-storage.h"
 #include "cppgc/platform.h"
 #include "cppgc/sentinel-pointer.h"
@@ -283,7 +284,7 @@ struct WriteBarrierTypeForCagedHeapPolicy::ValueModeDispatch<
       return SetAndReturnType<WriteBarrier::Type::kGenerational>(params);
     }
 #else   // !defined(CPPGC_YOUNG_GENERATION)
-    if (V8_UNLIKELY(!subtle::HeapState::IsMarking(handle))) {
+    if (V8_UNLIKELY(!handle.is_incremental_marking_in_progress())) {
       return SetAndReturnType<WriteBarrier::Type::kNone>(params);
     }
 #endif  // !defined(CPPGC_YOUNG_GENERATION)
@@ -326,11 +327,6 @@ class V8_EXPORT WriteBarrierTypeForNonCagedHeapPolicy final {
   template <WriteBarrier::ValueMode value_mode>
   struct ValueModeDispatch;
 
-  // TODO(chromium:1056170): Create fast path on API.
-  static bool IsMarking(const void*, HeapHandle**);
-  // TODO(chromium:1056170): Create fast path on API.
-  static bool IsMarking(HeapHandle&);
-
   WriteBarrierTypeForNonCagedHeapPolicy() = delete;
 };
 
@@ -348,7 +344,13 @@ struct WriteBarrierTypeForNonCagedHeapPolicy::ValueModeDispatch<
     if (V8_LIKELY(!WriteBarrier::IsEnabled())) {
       return SetAndReturnType<WriteBarrier::Type::kNone>(params);
     }
-    if (IsMarking(object, &params.heap)) {
+    // We know that |object| is within the normal page or in the beginning of a
+    // large page, so extract the page header by bitmasking.
+    BasePageHandle* page =
+        BasePageHandle::FromPayload(const_cast<void*>(object));
+
+    HeapHandle& heap_handle = page->heap_handle();
+    if (V8_LIKELY(heap_handle.is_incremental_marking_in_progress())) {
       return SetAndReturnType<WriteBarrier::Type::kMarking>(params);
     }
     return SetAndReturnType<WriteBarrier::Type::kNone>(params);
@@ -364,7 +366,7 @@ struct WriteBarrierTypeForNonCagedHeapPolicy::ValueModeDispatch<
                                           HeapHandleCallback callback) {
     if (V8_UNLIKELY(WriteBarrier::IsEnabled())) {
       HeapHandle& handle = callback();
-      if (IsMarking(handle)) {
+      if (V8_LIKELY(handle.is_incremental_marking_in_progress())) {
         params.heap = &handle;
         return SetAndReturnType<WriteBarrier::Type::kMarking>(params);
       }
diff --git a/deps/v8/include/cppgc/member.h b/deps/v8/include/cppgc/member.h
index 71f9cab65280da..9bc383634f18ea 100644
--- a/deps/v8/include/cppgc/member.h
+++ b/deps/v8/include/cppgc/member.h
@@ -28,7 +28,7 @@ namespace internal {
 
 // MemberBase always refers to the object as const object and defers to
 // BasicMember on casting to the right type as needed.
-class MemberBase {
+class V8_TRIVIAL_ABI MemberBase {
  public:
 #if defined(CPPGC_POINTER_COMPRESSION)
   using RawStorage = CompressedPointer;
@@ -68,13 +68,16 @@ class MemberBase {
   V8_INLINE void ClearFromGC() const { raw_.Clear(); }
 
  private:
+  friend class MemberDebugHelper;
+
   mutable RawStorage raw_;
 };
 
 // The basic class from which all Member classes are 'generated'.
 template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
           typename CheckingPolicy>
-class BasicMember final : private MemberBase, private CheckingPolicy {
+class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
+                                         private CheckingPolicy {
  public:
   using PointeeType = T;
 
diff --git a/deps/v8/include/js_protocol-1.3.json b/deps/v8/include/js_protocol-1.3.json
index ea573d11a61b03..a998d4611d16d3 100644
--- a/deps/v8/include/js_protocol-1.3.json
+++ b/deps/v8/include/js_protocol-1.3.json
@@ -946,34 +946,6 @@
                     { "name": "url", "type": "string", "description": "JavaScript script name or url." },
                     { "name": "functions", "type": "array", "items": { "$ref": "FunctionCoverage" }, "description": "Functions contained in the script that has coverage data." }
                 ]
-            },
-            {   "id": "TypeObject",
-                "type": "object",
-                "description": "Describes a type collected during runtime.",
-                "properties": [
-                    { "name": "name", "type": "string", "description": "Name of a type collected with type profiling." }
-                ],
-                "experimental": true
-            },
-            {   "id": "TypeProfileEntry",
-                "type": "object",
-                "description": "Source offset and types for a parameter or return value.",
-                "properties": [
-                    { "name": "offset", "type": "integer", "description": "Source offset of the parameter or end of function for return values." },
-                    { "name": "types", "type": "array", "items": {"$ref": "TypeObject"}, "description": "The types for this parameter or return value."}
-                ],
-                "experimental": true
-            },
-            {
-                "id": "ScriptTypeProfile",
-                "type": "object",
-                "description": "Type profile data collected during runtime for a JavaScript script.",
-                "properties": [
-                    { "name": "scriptId", "$ref": "Runtime.ScriptId", "description": "JavaScript script id." },
-                    { "name": "url", "type": "string", "description": "JavaScript script name or url." },
-                    { "name": "entries", "type": "array", "items": { "$ref": "TypeProfileEntry" }, "description": "Type profile entries for parameters and return values of the functions in the script." }
-                ],
-                "experimental": true
             }
         ],
         "commands": [
@@ -1024,24 +996,6 @@
                     { "name": "result", "type": "array", "items": { "$ref": "ScriptCoverage" }, "description": "Coverage data for the current isolate." }
                 ],
                 "description": "Collect coverage data for the current isolate. The coverage data may be incomplete due to garbage collection."
-            },
-            {
-                "name": "startTypeProfile",
-                "description": "Enable type profile.",
-                "experimental": true
-            },
-            {
-                "name": "stopTypeProfile",
-                "description": "Disable type profile. Disabling releases type profile data collected so far.",
-                "experimental": true
-            },
-            {
-                "name": "takeTypeProfile",
-                "returns": [
-                    { "name": "result", "type":  "array", "items": { "$ref": "ScriptTypeProfile" }, "description": "Type profile for all scripts since startTypeProfile() was turned on." }
-                ],
-                "description": "Collect type profile.",
-                "experimental": true
             }
         ],
         "events": [
diff --git a/deps/v8/include/js_protocol.pdl b/deps/v8/include/js_protocol.pdl
index 2d560435522769..b3b97fa11768e6 100644
--- a/deps/v8/include/js_protocol.pdl
+++ b/deps/v8/include/js_protocol.pdl
@@ -918,30 +918,6 @@ domain Profiler
       # Functions contained in the script that has coverage data.
       array of FunctionCoverage functions
 
-  # Describes a type collected during runtime.
-  experimental type TypeObject extends object
-    properties
-      # Name of a type collected with type profiling.
-      string name
-
-  # Source offset and types for a parameter or return value.
-  experimental type TypeProfileEntry extends object
-    properties
-      # Source offset of the parameter or end of function for return values.
-      integer offset
-      # The types for this parameter or return value.
-      array of TypeObject types
-
-  # Type profile data collected during runtime for a JavaScript script.
-  experimental type ScriptTypeProfile extends object
-    properties
-      # JavaScript script id.
-      Runtime.ScriptId scriptId
-      # JavaScript script name or url.
-      string url
-      # Type profile entries for parameters and return values of the functions in the script.
-      array of TypeProfileEntry entries
-
   command disable
 
   command enable
@@ -976,9 +952,6 @@ domain Profiler
       # Monotonically increasing time (in seconds) when the coverage update was taken in the backend.
       number timestamp
 
-  # Enable type profile.
-  experimental command startTypeProfile
-
   command stop
     returns
       # Recorded profile.
@@ -988,9 +961,6 @@ domain Profiler
   # executing optimized code.
   command stopPreciseCoverage
 
-  # Disable type profile. Disabling releases type profile data collected so far.
-  experimental command stopTypeProfile
-
   # Collect coverage data for the current isolate, and resets execution counters. Precise code
   # coverage needs to have started.
   command takePreciseCoverage
@@ -1000,12 +970,6 @@ domain Profiler
       # Monotonically increasing time (in seconds) when the coverage update was taken in the backend.
       number timestamp
 
-  # Collect type profile.
-  experimental command takeTypeProfile
-    returns
-      # Type profile for all scripts since startTypeProfile() was turned on.
-      array of ScriptTypeProfile result
-
   event consoleProfileFinished
     parameters
       string id
diff --git a/deps/v8/include/v8-array-buffer.h b/deps/v8/include/v8-array-buffer.h
index bab840f82c1a3d..cc5d2d4323000a 100644
--- a/deps/v8/include/v8-array-buffer.h
+++ b/deps/v8/include/v8-array-buffer.h
@@ -240,6 +240,11 @@ class V8_EXPORT ArrayBuffer : public Object {
    */
   bool IsDetachable() const;
 
+  /**
+   * Returns true if this ArrayBuffer has been detached.
+   */
+  bool WasDetached() const;
+
   /**
    * Detaches this ArrayBuffer and all its views (typed arrays).
    * Detaching sets the byte length of the buffer and all typed arrays to zero,
@@ -253,6 +258,9 @@ class V8_EXPORT ArrayBuffer : public Object {
    * pointer coordinates the lifetime management of the internal storage
    * with any live ArrayBuffers on the heap, even across isolates. The embedder
    * should not attempt to manage lifetime of the storage through other means.
+   *
+   * The returned shared pointer will not be empty, even if the ArrayBuffer has
+   * been detached. Use |WasDetached| to tell if it has been detached instead.
    */
   std::shared_ptr<BackingStore> GetBackingStore();
 
diff --git a/deps/v8/include/v8-context.h b/deps/v8/include/v8-context.h
index be52c414b4e028..427f3a738607bb 100644
--- a/deps/v8/include/v8-context.h
+++ b/deps/v8/include/v8-context.h
@@ -290,6 +290,7 @@ class V8_EXPORT Context : public Data {
                        Local<Function> after_hook,
                        Local<Function> resolve_hook);
 
+  bool HasTemplateLiteralObject(Local<Value> object);
   /**
    * Stack-allocated class which sets the execution context for all
    * operations executed within a local scope.
diff --git a/deps/v8/include/v8-internal.h b/deps/v8/include/v8-internal.h
index c97942ed1b476a..a52d066c835e2d 100644
--- a/deps/v8/include/v8-internal.h
+++ b/deps/v8/include/v8-internal.h
@@ -182,7 +182,7 @@ constexpr size_t kSandboxSizeLog2 = 37;  // 128 GB
 #else
 // Everywhere else use a 1TB sandbox.
 constexpr size_t kSandboxSizeLog2 = 40;  // 1 TB
-#endif  // V8_OS_ANDROID
+#endif  // V8_TARGET_OS_ANDROID
 constexpr size_t kSandboxSize = 1ULL << kSandboxSizeLog2;
 
 // Required alignment of the sandbox. For simplicity, we require the
@@ -223,6 +223,21 @@ static_assert(kSandboxMinimumReservationSize > kPtrComprCageReservationSize,
               "The minimum reservation size for a sandbox must be larger than "
               "the pointer compression cage contained within it.");
 
+// The maximum buffer size allowed inside the sandbox. This is mostly dependent
+// on the size of the guard regions around the sandbox: an attacker must not be
+// able to construct a buffer that appears larger than the guard regions and
+// thereby "reach out of" the sandbox.
+constexpr size_t kMaxSafeBufferSizeForSandbox = 32ULL * GB - 1;
+static_assert(kMaxSafeBufferSizeForSandbox <= kSandboxGuardRegionSize,
+              "The maximum allowed buffer size must not be larger than the "
+              "sandbox's guard regions");
+
+constexpr size_t kBoundedSizeShift = 29;
+static_assert(1ULL << (64 - kBoundedSizeShift) ==
+                  kMaxSafeBufferSizeForSandbox + 1,
+              "The maximum size of a BoundedSize must be synchronized with the "
+              "kMaxSafeBufferSizeForSandbox");
+
 #endif  // V8_ENABLE_SANDBOX
 
 #ifdef V8_COMPRESS_POINTERS
diff --git a/deps/v8/include/v8-isolate.h b/deps/v8/include/v8-isolate.h
index 4f31d8c7a80835..2f8acc88682e38 100644
--- a/deps/v8/include/v8-isolate.h
+++ b/deps/v8/include/v8-isolate.h
@@ -536,6 +536,7 @@ class V8_EXPORT Isolate {
     kFunctionPrototypeCaller = 114,
     kTurboFanOsrCompileStarted = 115,
     kAsyncStackTaggingCreateTaskCall = 116,
+    kDurationFormat = 117,
 
     // If you add new values here, you'll also need to update Chromium's:
     // web_feature.mojom, use_counter_callback.cc, and enums.xml. V8 changes to
diff --git a/deps/v8/include/v8-version.h b/deps/v8/include/v8-version.h
index d521b624637dab..027a13a3b239bc 100644
--- a/deps/v8/include/v8-version.h
+++ b/deps/v8/include/v8-version.h
@@ -9,8 +9,8 @@
 // NOTE these macros are used by some of the tool scripts and the build
 // system so their names cannot be changed without changing the scripts.
 #define V8_MAJOR_VERSION 10
-#define V8_MINOR_VERSION 7
-#define V8_BUILD_NUMBER 193
+#define V8_MINOR_VERSION 8
+#define V8_BUILD_NUMBER 168
 #define V8_PATCH_LEVEL 20
 
 // Use 1 for candidates and 0 otherwise.
diff --git a/deps/v8/include/v8config.h b/deps/v8/include/v8config.h
index 207afac8b0adeb..a959be130d5319 100644
--- a/deps/v8/include/v8config.h
+++ b/deps/v8/include/v8config.h
@@ -579,6 +579,37 @@ path. Add it with -I<path> to the command line
 #define V8_NO_UNIQUE_ADDRESS /* NOT SUPPORTED */
 #endif
 
+// Marks a type as being eligible for the "trivial" ABI despite having a
+// non-trivial destructor or copy/move constructor. Such types can be relocated
+// after construction by simply copying their memory, which makes them eligible
+// to be passed in registers. The canonical example is std::unique_ptr.
+//
+// Use with caution; this has some subtle effects on constructor/destructor
+// ordering and will be very incorrect if the type relies on its address
+// remaining constant. When used as a function argument (by value), the value
+// may be constructed in the caller's stack frame, passed in a register, and
+// then used and destructed in the callee's stack frame. A similar thing can
+// occur when values are returned.
+//
+// TRIVIAL_ABI is not needed for types which have a trivial destructor and
+// copy/move constructors, since those are automatically trivial by the ABI
+// spec.
+//
+// It is also not likely to be effective on types too large to be passed in one
+// or two registers on typical target ABIs.
+//
+// See also:
+//   https://clang.llvm.org/docs/AttributeReference.html#trivial-abi
+//   https://libcxx.llvm.org/docs/DesignDocs/UniquePtrTrivialAbi.html
+#if defined(__clang__) && defined(__has_attribute)
+#if __has_attribute(trivial_abi)
+#define V8_TRIVIAL_ABI [[clang::trivial_abi]]
+#endif // __has_attribute(trivial_abi)
+#endif // defined(__clang__) && defined(__has_attribute)
+#if !defined(V8_TRIVIAL_ABI)
+#define V8_TRIVIAL_ABI
+#endif //!defined(V8_TRIVIAL_ABI)
+
 // Helper macro to define no_sanitize attributes only with clang.
 #if defined(__clang__) && defined(__has_attribute)
 #if __has_attribute(no_sanitize)
diff --git a/deps/v8/infra/mb/mb_config.pyl b/deps/v8/infra/mb/mb_config.pyl
index 5488996a641ae4..b5d6231600488a 100644
--- a/deps/v8/infra/mb/mb_config.pyl
+++ b/deps/v8/infra/mb/mb_config.pyl
@@ -116,6 +116,7 @@
       'V8 Linux64 - disable runtime call stats - builder': 'release_x64_disable_runtime_call_stats',
       'V8 Linux64 - debug - single generation - builder': 'debug_x64_single_generation',
       'V8 Linux64 - no pointer compression - builder': 'release_x64_no_pointer_compression',
+      'V8 Linux64 css - debug builder': 'debug_x64_conservative_stack_scanning',
       'V8 Linux64 gcc - builder': 'release_x64_gcc',
       'V8 Linux64 gcc - debug builder': 'debug_x64_gcc',
       'V8 Linux64 gcc light - debug builder': 'debug_x64_gcc',
@@ -207,105 +208,98 @@
     'tryserver.v8': {
       'v8_android_arm_compile_rel': 'release_android_arm',
       'v8_android_arm64_compile_dbg': 'debug_android_arm64',
-      'v8_android_arm64_n5x_rel_ng': 'release_android_arm64',
+      'v8_android_arm64_n5x_compile_rel': 'release_android_arm64',
       'v8_fuchsia_compile_rel': 'release_x64_fuchsia_trybot',
-      'v8_fuchsia_rel_ng': 'release_x64_fuchsia_trybot',
       'v8_ios_simulator': 'release_x64_ios_simulator',
-      'v8_linux_rel_ng': 'release_x86_gcmole_trybot',
-      'v8_linux_optional_rel_ng': 'release_x86_trybot',
-      'v8_linux_verify_csa_rel_ng': 'release_x86_verify_csa',
-      'v8_linux_nodcheck_rel_ng': 'release_x86_minimal_symbols',
-      'v8_linux_dbg_ng': 'debug_x86_trybot',
+      'v8_linux_compile_rel': 'release_x86_gcmole_trybot',
+      'v8_linux_optional_compile_rel': 'release_x86_trybot',
+      'v8_linux_verify_csa_compile_rel': 'release_x86_verify_csa',
+      'v8_linux_nodcheck_compile_rel': 'release_x86_minimal_symbols',
+      'v8_linux_compile_dbg': 'debug_x86_trybot',
       'v8_linux_noi18n_compile_dbg': 'debug_x86_no_i18n',
-      'v8_linux_noi18n_rel_ng': 'release_x86_no_i18n_trybot',
-      'v8_linux_gc_stress_dbg_ng': 'debug_x86_trybot',
+      'v8_linux_noi18n_compile_rel': 'release_x86_no_i18n_trybot',
+      'v8_linux_gc_stress_compile_dbg': 'debug_x86_trybot',
       'v8_linux_shared_compile_rel': 'release_x86_shared_verify_heap',
       'v8_linux_vtunejit': 'debug_x86_vtunejit',
-      'v8_linux64_arm64_no_pointer_compression_rel_ng':
+      'v8_linux64_arm64_no_pointer_compression_compile_rel':
           'release_simulate_arm64_no_pointer_compression',
-      'v8_linux64_cppgc_non_default_dbg_ng': 'debug_x64_non_default_cppgc',
-      'v8_linux64_dbg_ng': 'debug_x64_trybot',
-      'v8_linux64_no_sandbox_dbg_ng': 'debug_x64_no_sandbox',
-      'v8_linux64_dict_tracking_dbg_ng': 'debug_x64_dict_tracking_trybot',
-      'v8_linux64_disable_runtime_call_stats_rel_ng': 'release_x64_disable_runtime_call_stats',
-      'v8_linux64_external_code_space_dbg_ng': 'debug_x64_external_code_space',
-      'v8_linux64_gc_stress_custom_snapshot_dbg_ng': 'debug_x64_trybot_custom',
-      'v8_linux64_gc_stress_dbg_ng': 'debug_x64_trybot',
+      'v8_linux64_cppgc_non_default_compile_dbg': 'debug_x64_non_default_cppgc',
+      'v8_linux64_compile_dbg': 'debug_x64_trybot',
+      'v8_linux64_no_sandbox_compile_dbg': 'debug_x64_no_sandbox',
+      'v8_linux64_dict_tracking_compile_dbg': 'debug_x64_dict_tracking_trybot',
+      'v8_linux64_disable_runtime_call_stats_compile_rel': 'release_x64_disable_runtime_call_stats',
+      'v8_linux64_external_code_space_compile_dbg': 'debug_x64_external_code_space',
+      'v8_linux64_css_compile_dbg': 'debug_x64_conservative_stack_scanning',
+      'v8_linux64_gc_stress_custom_snapshot_compile_dbg': 'debug_x64_trybot_custom',
+      'v8_linux64_gc_stress_compile_dbg': 'debug_x64_trybot',
       'v8_linux64_gcc_compile_dbg': 'debug_x64_gcc',
-      'v8_linux64_gcc_compile_rel': 'release_x64_gcc',
       'v8_linux64_gcc_light_compile_dbg': 'debug_x64_gcc',
-      'v8_linux64_gcc_rel_ng': 'release_x64_gcc',
+      'v8_linux64_gcc_compile_rel': 'release_x64_gcc',
       'v8_linux64_gcov_coverage': 'release_x64_gcc_coverage',
       'v8_linux64_header_includes_dbg': 'debug_x64_header_includes',
-      'v8_linux64_heap_sandbox_dbg_ng': 'debug_x64_heap_sandbox',
-      'v8_linux64_minor_mc_dbg_ng': 'debug_x64_trybot',
-      'v8_linux_arm64_sim_heap_sandbox_dbg_ng': 'debug_x64_heap_sandbox_arm64_sim',
-      'v8_linux64_fyi_rel_ng': 'release_x64_test_features_trybot',
-      'v8_linux64_nodcheck_rel_ng': 'release_x64',
-      'v8_linux64_perfetto_dbg_ng': 'debug_x64_perfetto',
-      'v8_linux64_no_pointer_compression_rel_ng': 'release_x64_no_pointer_compression',
-      'v8_linux64_rel_ng': 'release_x64_test_features_trybot',
-      'v8_linux64_no_sandbox_rel_ng': 'release_x64_no_sandbox',
-      'v8_linux64_predictable_rel_ng': 'release_x64_predictable',
+      'v8_linux64_heap_sandbox_compile_dbg': 'debug_x64_heap_sandbox',
+      'v8_linux64_minor_mc_compile_dbg': 'debug_x64_trybot',
+      'v8_linux_arm64_sim_heap_sandbox_compile_dbg': 'debug_x64_heap_sandbox_arm64_sim',
+      'v8_linux64_fyi_compile_rel': 'release_x64_test_features_trybot',
+      'v8_linux64_nodcheck_compile_rel': 'release_x64',
+      'v8_linux64_perfetto_compile_dbg': 'debug_x64_perfetto',
+      'v8_linux64_no_pointer_compression_compile_rel': 'release_x64_no_pointer_compression',
+      'v8_linux64_compile_rel': 'release_x64_test_features_trybot',
+      'v8_linux64_no_sandbox_compile_rel': 'release_x64_no_sandbox',
+      'v8_linux64_predictable_compile_rel': 'release_x64_predictable',
       'v8_linux64_shared_compile_rel': 'release_x64_shared_verify_heap',
-      'v8_linux64_single_generation_dbg_ng': 'debug_x64_single_generation',
+      'v8_linux64_single_generation_compile_dbg': 'debug_x64_single_generation',
       'v8_linux64_no_wasm_compile_rel': 'release_x64_webassembly_disabled',
-      'v8_linux64_verify_csa_rel_ng': 'release_x64_verify_csa',
-      'v8_linux64_asan_rel_ng': 'release_x64_asan_minimal_symbols',
-      'v8_linux64_cfi_rel_ng': 'release_x64_cfi',
-      'v8_linux64_fuzzilli_ng': 'release_x64_fuzzilli',
-      'v8_linux64_loong64_rel_ng': 'release_simulate_loong64',
-      'v8_linux64_msan_rel_ng': 'release_simulate_arm64_msan_minimal_symbols',
-      'v8_linux_riscv32_rel_ng': 'release_simulate_riscv32',
-      'v8_linux64_riscv64_rel_ng': 'release_simulate_riscv64',
-      'v8_linux64_tsan_rel_ng': 'release_x64_tsan_minimal_symbols',
-      'v8_linux64_tsan_no_cm_rel_ng': 'release_x64_tsan_no_cm',
-      'v8_linux64_tsan_isolates_rel_ng':
+      'v8_linux64_verify_csa_compile_rel': 'release_x64_verify_csa',
+      'v8_linux64_asan_compile_rel': 'release_x64_asan_minimal_symbols',
+      'v8_linux64_cfi_compile_rel': 'release_x64_cfi',
+      'v8_linux64_fuzzilli_compile_rel': 'release_x64_fuzzilli',
+      'v8_linux64_loong64_compile_rel': 'release_simulate_loong64',
+      'v8_linux64_msan_compile_rel': 'release_simulate_arm64_msan_minimal_symbols',
+      'v8_linux_riscv32_compile_rel': 'release_simulate_riscv32',
+      'v8_linux64_riscv64_compile_rel': 'release_simulate_riscv64',
+      'v8_linux64_tsan_compile_rel': 'release_x64_tsan_minimal_symbols',
+      'v8_linux64_tsan_no_cm_compile_rel': 'release_x64_tsan_no_cm',
+      'v8_linux64_tsan_isolates_compile_rel':
           'release_x64_tsan_minimal_symbols',
-      'v8_linux64_ubsan_rel_ng': 'release_x64_ubsan_minimal_symbols',
-      'v8_odroid_arm_rel_ng': 'release_arm',
+      'v8_linux64_ubsan_compile_rel': 'release_x64_ubsan_minimal_symbols',
+      'v8_odroid_arm_compile_rel': 'release_arm',
       'v8_linux_torque_compare': 'torque_compare',
       # TODO(machenbach): Remove after switching to x64 on infra side.
-      'v8_win_dbg_ng': 'debug_x86_trybot',
       'v8_win_compile_dbg': 'debug_x86_trybot',
-      'v8_win_rel_ng': 'release_x86_trybot',
-      'v8_win64_asan_rel_ng': 'release_x64_asan_no_lsan',
+      'v8_win_compile_rel': 'release_x86_trybot',
+      'v8_win64_asan_compile_rel': 'release_x64_asan_no_lsan',
+      'v8_win64_msvc_light_compile_rel': 'release_x64_msvc',
+      'v8_win64_compile_dbg': 'debug_x64_minimal_symbols',
       'v8_win64_msvc_compile_rel': 'release_x64_msvc',
-      'v8_win64_dbg_ng': 'debug_x64_minimal_symbols',
-      'v8_win64_msvc_rel_ng': 'release_x64_msvc',
-      'v8_win64_rel_ng': 'release_x64_trybot',
-      'v8_mac_arm64_rel_ng': 'release_arm64',
-      'v8_mac_arm64_dbg_ng': 'debug_arm64',
-      'v8_mac_arm64_full_dbg_ng': 'full_debug_arm64',
-      'v8_mac_arm64_no_pointer_compression_dbg_ng': 'debug_arm64_no_pointer_compression',
-      'v8_mac_arm64_compile_dbg': 'debug_arm64',
+      'v8_win64_compile_rel': 'release_x64_trybot',
       'v8_mac_arm64_compile_rel': 'release_arm64',
+      'v8_mac_arm64_compile_dbg': 'debug_arm64',
+      'v8_mac_arm64_full_compile_dbg': 'full_debug_arm64',
+      'v8_mac_arm64_no_pointer_compression_compile_dbg': 'debug_arm64_no_pointer_compression',
+      'v8_mac_arm64_sim_compile_rel': 'release_simulate_arm64_trybot',
       'v8_mac_arm64_sim_compile_dbg': 'debug_simulate_arm64',
-      'v8_mac_arm64_sim_compile_rel': 'release_simulate_arm64',
-      'v8_mac_arm64_sim_rel_ng': 'release_simulate_arm64_trybot',
-      'v8_mac_arm64_sim_dbg_ng': 'debug_simulate_arm64',
-      'v8_mac_arm64_sim_nodcheck_rel_ng': 'release_simulate_arm64',
-      'v8_mac64_gc_stress_dbg_ng': 'debug_x64_trybot',
-      'v8_mac64_rel_ng': 'release_x64_trybot',
+      'v8_mac_arm64_sim_nodcheck_compile_rel': 'release_simulate_arm64',
+      'v8_mac64_gc_stress_compile_dbg': 'debug_x64_trybot',
+      'v8_mac64_compile_rel': 'release_x64_trybot',
       'v8_mac64_dbg': 'debug_x64',
-      'v8_mac64_dbg_ng': 'debug_x64',
-      'v8_mac64_compile_full_dbg_ng': 'full_debug_x64',
+      'v8_mac64_compile_dbg': 'debug_x64',
+      'v8_mac64_compile_full_compile_dbg': 'full_debug_x64',
       'v8_mac64_asan_compile_rel': 'release_x64_asan_no_lsan',
-      'v8_mac64_asan_rel_ng': 'release_x64_asan_no_lsan',
-      'v8_linux_arm_rel_ng': 'release_simulate_arm_trybot',
+      'v8_linux_arm_compile_rel': 'release_simulate_arm_trybot',
       'v8_linux_arm_lite_compile_dbg': 'debug_simulate_arm_lite',
-      'v8_linux_arm_lite_rel_ng': 'release_simulate_arm_lite_trybot',
-      'v8_linux_arm_dbg_ng': 'debug_simulate_arm',
+      'v8_linux_arm_lite_compile_rel': 'release_simulate_arm_lite_trybot',
+      'v8_linux_arm_compile_dbg': 'debug_simulate_arm',
       'v8_linux_arm_armv8a_rel': 'release_simulate_arm_trybot',
       'v8_linux_arm_armv8a_dbg': 'debug_simulate_arm',
-      'v8_linux_arm64_rel_ng': 'release_simulate_arm64_trybot',
-      'v8_linux_arm64_cfi_rel_ng' : 'release_simulate_arm64_cfi',
-      'v8_linux_arm64_dbg_ng': 'debug_simulate_arm64',
-      'v8_linux_arm64_gc_stress_dbg_ng': 'debug_simulate_arm64',
+      'v8_linux_arm64_compile_rel': 'release_simulate_arm64_trybot',
+      'v8_linux_arm64_cfi_compile_rel' : 'release_simulate_arm64_cfi',
+      'v8_linux_arm64_compile_dbg': 'debug_simulate_arm64',
+      'v8_linux_arm64_gc_stress_compile_dbg': 'debug_simulate_arm64',
       'v8_linux_mips64el_compile_rel': 'release_simulate_mips64el',
-      'v8_numfuzz_ng': 'release_x64',
-      'v8_numfuzz_dbg_ng': 'debug_x64',
-      'v8_numfuzz_tsan_ng': 'release_x64_tsan',
+      'v8_numfuzz_compile_rel': 'release_x64',
+      'v8_numfuzz_compile_dbg': 'debug_x64',
+      'v8_numfuzz_tsan_compile_rel': 'release_x64_tsan',
     },
   },
 
@@ -577,6 +571,8 @@
     'debug_x64_asan_no_lsan_static': [
       'debug', 'static', 'goma', 'v8_enable_slow_dchecks', 'v8_optimized_debug',
       'x64', 'asan'],
+    'debug_x64_conservative_stack_scanning': [
+      'debug_bot', 'x64', 'conservative_stack_scanning'],
     'debug_x64_custom': [
       'debug_bot', 'x64', 'v8_snapshot_custom'],
     'debug_x64_external_code_space': [
@@ -703,6 +699,11 @@
       'gn_args': 'is_clang=true',
     },
 
+    'conservative_stack_scanning': {
+      'gn_args': 'v8_enable_conservative_stack_scanning=true '
+                 'v8_enable_inner_pointer_resolution_mb=true',
+    },
+
     'coverage': {
       'gn_args': 'v8_code_coverage=true',
     },
diff --git a/deps/v8/infra/testing/builders.pyl b/deps/v8/infra/testing/builders.pyl
index ca2fab5eac8e90..516905539cf72c 100644
--- a/deps/v8/infra/testing/builders.pyl
+++ b/deps/v8/infra/testing/builders.pyl
@@ -32,7 +32,7 @@
   ### luci.v8.try
   ##############################################################################
   # Android
-  'v8_android_arm64_n5x_rel_ng_triggered': {
+  'v8_android_arm64_n5x_rel': {
     'swarming_dimensions' : {
       'device_os': 'MMB29Q',
       'device_type': 'bullhead',
@@ -46,7 +46,7 @@
   },
   ##############################################################################
   # Fuchsia
-  'v8_fuchsia_rel_ng_triggered': {
+  'v8_fuchsia_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -64,7 +64,7 @@
   },
   ##############################################################################
   # Linux32
-  'v8_linux_dbg_ng_triggered': {
+  'v8_linux_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -109,7 +109,7 @@
       },
     ],
   },
-  'v8_linux_gc_stress_dbg_ng_triggered': {
+  'v8_linux_gc_stress_dbg': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -118,7 +118,7 @@
       {'name': 'd8testing', 'test_args': ['--gc-stress'], 'shards': 5},
     ],
   },
-  'v8_linux_nodcheck_rel_ng_triggered': {
+  'v8_linux_nodcheck_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -143,7 +143,7 @@
       },
     ],
   },
-  'v8_linux_noi18n_rel_ng_triggered': {
+  'v8_linux_noi18n_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -153,7 +153,7 @@
       {'name': 'v8testing', 'variant': 'default', 'shards': 2},
     ],
   },
-  'v8_linux_rel_ng_triggered': {
+  'v8_linux_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -182,7 +182,7 @@
       },
     ],
   },
-  'v8_linux_optional_rel_ng_triggered': {
+  'v8_linux_optional_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -285,7 +285,7 @@
       },
     ],
   },
-  'v8_linux_verify_csa_rel_ng_triggered': {
+  'v8_linux_verify_csa_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -295,7 +295,7 @@
   },
   ##############################################################################
   # Linux32 with arm simulators
-  'v8_linux_arm_dbg_ng_triggered': {
+  'v8_linux_arm_dbg': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -307,7 +307,7 @@
       {'name': 'v8testing', 'variant': 'extra', 'shards': 10},
     ],
   },
-  'v8_linux_arm_lite_rel_ng_triggered': {
+  'v8_linux_arm_lite_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -315,7 +315,7 @@
       {'name': 'v8testing', 'variant': 'default', 'shards': 4},
     ],
   },
-  'v8_linux_arm_rel_ng_triggered': {
+  'v8_linux_arm_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -329,7 +329,7 @@
   },
   ##############################################################################
   # Linux64
-  'v8_linux64_asan_rel_ng_triggered': {
+  'v8_linux64_asan_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -340,7 +340,7 @@
       {'name': 'v8testing', 'variant': 'slow_path'},
     ],
   },
-  'v8_linux64_cfi_rel_ng_triggered': {
+  'v8_linux64_cfi_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -352,7 +352,7 @@
       {'name': 'v8testing', 'shards': 3},
     ],
   },
-  'v8_linux64_cppgc_non_default_dbg_ng_triggered': {
+  'v8_linux64_cppgc_non_default_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -361,7 +361,7 @@
       {'name': 'v8testing', 'shards': 3},
     ],
   },
-  'v8_linux64_dbg_ng_triggered': {
+  'v8_linux64_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -385,7 +385,7 @@
       {'name': 'mjsunit', 'variant': 'maglev'},
     ],
   },
-  'v8_linux64_dict_tracking_dbg_ng_triggered': {
+  'v8_linux64_dict_tracking_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -394,7 +394,7 @@
       {'name': 'v8testing', 'shards': 3},
     ],
   },
-  'v8_linux64_disable_runtime_call_stats_rel_ng_triggered': {
+  'v8_linux64_disable_runtime_call_stats_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -402,7 +402,7 @@
       {'name': 'v8testing'},
     ],
   },
-  'v8_linux64_external_code_space_dbg_ng_triggered': {
+  'v8_linux64_external_code_space_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -411,14 +411,14 @@
       {'name': 'v8testing', 'shards': 3},
     ],
   },
-  'v8_linux64_fuzzilli_ng_triggered': {
+  'v8_linux64_fuzzilli_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
     # TODO(almuthanna): Add a new test config for the fuzzilli suite.
     'tests': [],
   },
-  'v8_linux64_fyi_rel_ng_triggered': {
+  'v8_linux64_fyi_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -440,7 +440,7 @@
       {'name': 'mjsunit', 'variant': 'wasm_write_protect_code'},
     ],
   },
-  'v8_linux64_gc_stress_custom_snapshot_dbg_ng_triggered': {
+  'v8_linux64_gc_stress_custom_snapshot_dbg': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -452,7 +452,7 @@
       },
     ],
   },
-  'v8_linux64_gc_stress_dbg_ng_triggered': {
+  'v8_linux64_gc_stress_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -473,7 +473,7 @@
       },
     ],
   },
-  'v8_linux64_gcc_rel_ng_triggered': {
+  'v8_linux64_gcc_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-20.04',
     },
@@ -489,7 +489,7 @@
       {'name': 'v8testing'},
     ],
   },
-  'v8_linux64_heap_sandbox_dbg_ng_triggered': {
+  'v8_linux64_heap_sandbox_dbg': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -497,7 +497,7 @@
       {'name': 'v8testing', 'shards': 4},
     ],
   },
-  'v8_linux64_minor_mc_dbg_ng_triggered': {
+  'v8_linux64_minor_mc_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -510,7 +510,7 @@
       {'name': 'mjsunit', 'variant': 'minor_mc'},
     ],
   },
-  'v8_linux64_msan_rel_ng_triggered': {
+  'v8_linux64_msan_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -519,7 +519,7 @@
       {'name': 'v8testing', 'shards': 5},
     ],
   },
-  'v8_linux64_nodcheck_rel_ng_triggered': {
+  'v8_linux64_nodcheck_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -545,7 +545,7 @@
       {'name': 'mjsunit', 'variant': 'maglev'},
     ],
   },
-  'v8_linux64_perfetto_dbg_ng_triggered': {
+  'v8_linux64_perfetto_dbg': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -553,7 +553,7 @@
       {'name': 'v8testing', 'shards': 3},
     ],
   },
-  'v8_linux64_no_pointer_compression_rel_ng_triggered': {
+  'v8_linux64_no_pointer_compression_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -561,7 +561,7 @@
       {'name': 'v8testing', 'shards': 3},
     ],
   },
-  'v8_linux64_no_sandbox_dbg_ng_triggered': {
+  'v8_linux64_no_sandbox_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -570,7 +570,7 @@
       {'name': 'v8testing', 'shards': 5},
     ],
   },
-  'v8_linux64_single_generation_dbg_ng_triggered': {
+  'v8_linux64_single_generation_dbg': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -578,7 +578,7 @@
       {'name': 'v8testing', 'shards': 3},
     ],
   },
-  'v8_linux64_rel_ng_triggered': {
+  'v8_linux64_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -601,7 +601,7 @@
       {'name': 'mjsunit', 'variant': 'maglev'},
     ],
   },
-  'v8_linux64_predictable_rel_ng_triggered': {
+  'v8_linux64_predictable_rel': {
     'swarming_dimensions': {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -612,7 +612,7 @@
       {'name': 'mozilla'},
     ],
   },
-  'v8_linux64_no_sandbox_rel_ng_triggered': {
+  'v8_linux64_no_sandbox_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64-avx2',
       'os': 'Ubuntu-18.04',
@@ -621,7 +621,7 @@
       {'name': 'v8testing', 'shards': 2},
     ],
   },
-  'v8_linux64_tsan_rel_ng_triggered': {
+  'v8_linux64_tsan_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -635,7 +635,7 @@
       {'name': 'v8testing', 'variant': 'stress_concurrent_allocation', 'shards': 2},
     ],
   },
-  'v8_linux64_tsan_no_cm_rel_ng_triggered': {
+  'v8_linux64_tsan_no_cm_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -653,7 +653,7 @@
       {'name': 'v8testing', 'variant': 'stress_concurrent_inlining', 'shards': 2},
     ],
   },
-  'v8_linux64_tsan_isolates_rel_ng_triggered': {
+  'v8_linux64_tsan_isolates_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -661,7 +661,7 @@
       {'name': 'v8testing', 'test_args': ['--isolates'], 'shards': 7},
     ],
   },
-  'v8_linux64_ubsan_rel_ng_triggered': {
+  'v8_linux64_ubsan_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -669,7 +669,7 @@
       {'name': 'v8testing', 'shards': 2},
     ],
   },
-  'v8_linux64_verify_csa_rel_ng_triggered': {
+  'v8_linux64_verify_csa_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -679,7 +679,7 @@
   },
   ##############################################################################
   # Linux64 with arm64 simulators
-  'v8_linux_arm64_dbg_ng_triggered': {
+  'v8_linux_arm64_dbg': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -691,7 +691,7 @@
       {'name': 'v8testing', 'variant': 'extra', 'shards': 14},
     ],
   },
-  'v8_linux_arm64_gc_stress_dbg_ng_triggered': {
+  'v8_linux_arm64_gc_stress_dbg': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -699,7 +699,7 @@
       {'name': 'd8testing', 'test_args': ['--gc-stress'], 'shards': 12},
     ],
   },
-  'v8_linux_arm64_sim_heap_sandbox_dbg_ng_triggered': {
+  'v8_linux_arm64_sim_heap_sandbox_dbg': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -707,7 +707,7 @@
       {'name': 'v8testing', 'shards': 14},
     ],
   },
-  'v8_linux_arm64_rel_ng_triggered': {
+  'v8_linux_arm64_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -719,7 +719,7 @@
       {'name': 'v8testing', 'variant': 'extra', 'shards': 14},
     ],
   },
-  'v8_linux_arm64_cfi_rel_ng_triggered': {
+  'v8_linux_arm64_cfi_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -728,7 +728,7 @@
       {'name': 'v8testing', 'shards': 4},
     ],
   },
-  'v8_linux64_arm64_no_pointer_compression_rel_ng_triggered': {
+  'v8_linux64_arm64_no_pointer_compression_rel': {
     'swarming_dimensions' : {
       'os': 'Ubuntu-18.04',
     },
@@ -738,7 +738,7 @@
   },
   ##############################################################################
   # Linux64 with Loongson simulators
-  'v8_linux64_loong64_rel_ng_triggered': {
+  'v8_linux64_loong64_rel': {
     'swarming_dimensions': {
       'os': 'Ubuntu-18.04',
     },
@@ -748,7 +748,7 @@
   },
   ##############################################################################
   # Linux with RISC-V simulators
-  'v8_linux_riscv32_rel_ng_triggered': {
+  'v8_linux_riscv32_rel': {
     'swarming_dimensions': {
       'os': 'Ubuntu-18.04',
     },
@@ -756,7 +756,7 @@
       {'name': 'v8testing', 'shards': 3},
     ],
   },
-  'v8_linux64_riscv64_rel_ng_triggered': {
+  'v8_linux64_riscv64_rel': {
     'swarming_dimensions': {
       'os': 'Ubuntu-18.04',
     },
@@ -766,7 +766,7 @@
   },
   ##############################################################################
   # Odroids with native arm
-  'v8_odroid_arm_rel_ng_triggered': {
+  'v8_odroid_arm_rel': {
     'swarming_dimensions' : {
       'cores': '8',
       'cpu': 'armv7l-32-ODROID-XU4',
@@ -784,7 +784,7 @@
   },
   ##############################################################################
   # Win32
-  'v8_win_dbg_ng_triggered': {
+  'v8_win_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Windows-7-SP1',
@@ -794,7 +794,7 @@
       {'name': 'v8testing', 'shards': 3},
     ],
   },
-  'v8_win_rel_ng_triggered': {
+  'v8_win_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Windows-7-SP1',
@@ -807,7 +807,7 @@
   },
   ##############################################################################
   # Win64
-  'v8_win64_asan_rel_ng_triggered': {
+  'v8_win64_asan_rel': {
     'swarming_dimensions' : {
       'os': 'Windows-10-19042',
     },
@@ -815,7 +815,7 @@
       {'name': 'v8testing', 'shards': 5},
     ],
   },
-  'v8_win64_dbg_ng_triggered': {
+  'v8_win64_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Windows-10-19042',
@@ -827,7 +827,7 @@
       {'name': 'v8testing', 'variant': 'extra', 'shards': 2},
     ],
   },
-  'v8_win64_msvc_rel_ng_triggered': {
+  'v8_win64_msvc_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Windows-10-19042',
@@ -838,7 +838,7 @@
       {'name': 'v8testing', 'shards': 2},
     ],
   },
-  'v8_win64_rel_ng_triggered': {
+  'v8_win64_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Windows-10-19042',
@@ -852,7 +852,7 @@
   },
   ##############################################################################
   # Mac64
-  'v8_mac64_asan_rel_ng_triggered': {
+  'v8_mac64_asan_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Mac-10.15',
@@ -861,7 +861,7 @@
       {'name': 'v8testing', 'shards': 8},
     ],
   },
-  'v8_mac64_dbg_ng_triggered': {
+  'v8_mac64_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Mac-10.15',
@@ -873,7 +873,7 @@
       {'name': 'v8testing', 'variant': 'extra', 'shards': 6},
     ],
   },
-  'v8_mac64_gc_stress_dbg_ng_triggered': {
+  'v8_mac64_gc_stress_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Mac-10.15',
@@ -882,7 +882,7 @@
       {'name': 'd8testing', 'test_args': ['--gc-stress'], 'shards': 6},
     ],
   },
-  'v8_mac64_rel_ng_triggered': {
+  'v8_mac64_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Mac-10.15',
@@ -894,7 +894,7 @@
       {'name': 'v8testing', 'variant': 'extra', 'shards': 3},
     ],
   },
-  'v8_mac_arm64_rel_ng_triggered': {
+  'v8_mac_arm64_rel': {
     'swarming_dimensions' : {
       'cpu': 'arm64',
       'os': 'Mac-11',
@@ -904,7 +904,7 @@
       {'name': 'v8testing'},
     ],
   },
-  'v8_mac_arm64_dbg_ng_triggered': {
+  'v8_mac_arm64_dbg': {
     'swarming_dimensions' : {
       'cpu': 'arm64',
       'os': 'Mac-11',
@@ -914,7 +914,7 @@
       {'name': 'v8testing'},
     ],
   },
-  'v8_mac_arm64_full_dbg_ng_triggered': {
+  'v8_mac_arm64_full_dbg': {
     'swarming_dimensions' : {
       'cpu': 'arm64',
       'os': 'Mac-11',
@@ -924,7 +924,7 @@
       {'name': 'v8testing'},
     ],
   },
-  'v8_mac_arm64_no_pointer_compression_dbg_ng_triggered': {
+  'v8_mac_arm64_no_pointer_compression_dbg': {
     'swarming_dimensions' : {
       'cpu': 'arm64',
       'os': 'Mac-11',
@@ -934,7 +934,7 @@
       {'name': 'v8testing'},
     ],
   },
-  'v8_mac_arm64_sim_rel_ng_triggered': {
+  'v8_mac_arm64_sim_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Mac-10.15',
@@ -944,7 +944,7 @@
       {'name': 'v8testing', 'variant': 'future', 'shards': 2},
     ],
   },
-  'v8_mac_arm64_sim_dbg_ng_triggered': {
+  'v8_mac_arm64_sim_dbg': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Mac-10.15',
@@ -954,7 +954,7 @@
       {'name': 'v8testing', 'variant': 'future', 'shards': 2},
     ],
   },
-  'v8_mac_arm64_sim_nodcheck_rel_ng_triggered': {
+  'v8_mac_arm64_sim_nodcheck_rel': {
     'swarming_dimensions' : {
       'cpu': 'x86-64',
       'os': 'Mac-10.15',
@@ -2349,7 +2349,7 @@
       },
     ],
   },
-  'v8_numfuzz_ng_triggered': {
+  'v8_numfuzz_rel': {
     'swarming_dimensions': {
       'os': 'Ubuntu-18.04',
     },
@@ -2366,7 +2366,7 @@
       },
     ],
   },
-  'v8_numfuzz_tsan_ng_triggered': {
+  'v8_numfuzz_tsan_rel': {
     'swarming_dimensions': {
       'os': 'Ubuntu-18.04',
     },
@@ -2419,7 +2419,7 @@
       },
     ],
   },
-  'v8_numfuzz_dbg_ng_triggered': {
+  'v8_numfuzz_dbg': {
     'swarming_dimensions': {
       'os': 'Ubuntu-18.04',
     },
diff --git a/deps/v8/src/DEPS b/deps/v8/src/DEPS
index 1edad011be189c..8912d7fb25186c 100644
--- a/deps/v8/src/DEPS
+++ b/deps/v8/src/DEPS
@@ -32,6 +32,7 @@ include_rules = [
   "+src/heap/local-factory.h",
   "+src/heap/local-heap.h",
   "+src/heap/local-heap-inl.h",
+  "+src/heap/pretenuring-handler-inl.h",
   # TODO(v8:10496): Don't expose memory chunk outside of heap/.
   "+src/heap/memory-chunk.h",
   "+src/heap/memory-chunk-inl.h",
diff --git a/deps/v8/src/api/api-natives.cc b/deps/v8/src/api/api-natives.cc
index 562b7849b4061d..8624c279d66e4f 100644
--- a/deps/v8/src/api/api-natives.cc
+++ b/deps/v8/src/api/api-natives.cc
@@ -529,7 +529,7 @@ MaybeHandle<JSFunction> InstantiateFunction(
   if (!data->needs_access_check() &&
       data->GetNamedPropertyHandler().IsUndefined(isolate) &&
       data->GetIndexedPropertyHandler().IsUndefined(isolate)) {
-    function_type = FLAG_embedder_instance_types && data->HasInstanceType()
+    function_type = v8_flags.embedder_instance_types && data->HasInstanceType()
                         ? static_cast<InstanceType>(data->InstanceType())
                         : JS_API_OBJECT_TYPE;
   }
diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc
index cf755cafc2cb41..a4a4381614e1fd 100644
--- a/deps/v8/src/api/api.cc
+++ b/deps/v8/src/api/api.cc
@@ -284,7 +284,7 @@ void i::V8::FatalProcessOutOfMemory(i::Isolate* i_isolate, const char* location,
     // BUG(1718): Don't use the take_snapshot since we don't support
     // HeapObjectIterator here without doing a special GC.
     i_isolate->heap()->RecordStats(&heap_stats, false);
-    if (!FLAG_correctness_fuzzer_suppressions) {
+    if (!v8_flags.correctness_fuzzer_suppressions) {
       char* first_newline = strchr(last_few_messages, '\n');
       if (first_newline == nullptr || first_newline[1] == '\0')
         first_newline = last_few_messages;
@@ -795,7 +795,7 @@ i::Address* GlobalizeTracedReference(i::Isolate* i_isolate, i::Address* obj,
   i::Handle<i::Object> result =
       i_isolate->global_handles()->CreateTraced(*obj, slot, store_mode);
 #ifdef VERIFY_HEAP
-  if (i::FLAG_verify_heap) {
+  if (i::v8_flags.verify_heap) {
     i::Object(*obj).ObjectVerify(i_isolate);
   }
 #endif  // VERIFY_HEAP
@@ -823,7 +823,7 @@ i::Address* GlobalizeReference(i::Isolate* i_isolate, i::Address* obj) {
   API_RCS_SCOPE(i_isolate, Persistent, New);
   i::Handle<i::Object> result = i_isolate->global_handles()->Create(*obj);
 #ifdef VERIFY_HEAP
-  if (i::FLAG_verify_heap) {
+  if (i::v8_flags.verify_heap) {
     i::Object(*obj).ObjectVerify(i_isolate);
   }
 #endif  // VERIFY_HEAP
@@ -1676,7 +1676,7 @@ void ObjectTemplate::SetAccessor(v8::Local<String> name,
                                  SideEffectType getter_side_effect_type,
                                  SideEffectType setter_side_effect_type) {
   TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
-                      i::FLAG_disable_old_api_accessors, false,
+                      i::v8_flags.disable_old_api_accessors, false,
                       getter_side_effect_type, setter_side_effect_type);
 }
 
@@ -1688,7 +1688,7 @@ void ObjectTemplate::SetAccessor(v8::Local<Name> name,
                                  SideEffectType getter_side_effect_type,
                                  SideEffectType setter_side_effect_type) {
   TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
-                      i::FLAG_disable_old_api_accessors, false,
+                      i::v8_flags.disable_old_api_accessors, false,
                       getter_side_effect_type, setter_side_effect_type);
 }
 
@@ -2100,7 +2100,7 @@ MaybeLocal<Value> Script::Run(Local<Context> context,
   //
   // To avoid this, on running scripts check first if JIT code log is
   // pending and generate immediately.
-  if (i::FLAG_enable_etw_stack_walking) {
+  if (i::v8_flags.enable_etw_stack_walking) {
     i::ETWJITInterface::MaybeSetHandlerNow(i_isolate);
   }
 #endif
@@ -2109,14 +2109,15 @@ MaybeLocal<Value> Script::Run(Local<Context> context,
   // TODO(crbug.com/1193459): remove once ablation study is completed
   base::ElapsedTimer timer;
   base::TimeDelta delta;
-  if (i::FLAG_script_delay > 0) {
-    delta = v8::base::TimeDelta::FromMillisecondsD(i::FLAG_script_delay);
+  if (i::v8_flags.script_delay > 0) {
+    delta = v8::base::TimeDelta::FromMillisecondsD(i::v8_flags.script_delay);
   }
-  if (i::FLAG_script_delay_once > 0 && !i_isolate->did_run_script_delay()) {
-    delta = v8::base::TimeDelta::FromMillisecondsD(i::FLAG_script_delay_once);
+  if (i::v8_flags.script_delay_once > 0 && !i_isolate->did_run_script_delay()) {
+    delta =
+        v8::base::TimeDelta::FromMillisecondsD(i::v8_flags.script_delay_once);
     i_isolate->set_did_run_script_delay(true);
   }
-  if (i::FLAG_script_delay_fraction > 0.0) {
+  if (i::v8_flags.script_delay_fraction > 0.0) {
     timer.Start();
   } else if (delta.InMicroseconds() > 0) {
     timer.Start();
@@ -2125,7 +2126,7 @@ MaybeLocal<Value> Script::Run(Local<Context> context,
     }
   }
 
-  if (V8_UNLIKELY(i::FLAG_experimental_web_snapshots)) {
+  if (V8_UNLIKELY(i::v8_flags.experimental_web_snapshots)) {
     i::Handle<i::HeapObject> maybe_script =
         handle(fun->shared().script(), i_isolate);
     if (maybe_script->IsScript() &&
@@ -2149,9 +2150,9 @@ MaybeLocal<Value> Script::Run(Local<Context> context,
   has_pending_exception = !ToLocal<Value>(
       i::Execution::CallScript(i_isolate, fun, receiver, options), &result);
 
-  if (i::FLAG_script_delay_fraction > 0.0) {
+  if (i::v8_flags.script_delay_fraction > 0.0) {
     delta = v8::base::TimeDelta::FromMillisecondsD(
-        timer.Elapsed().InMillisecondsF() * i::FLAG_script_delay_fraction);
+        timer.Elapsed().InMillisecondsF() * i::v8_flags.script_delay_fraction);
     timer.Restart();
     while (timer.Elapsed() < delta) {
       // Busy wait.
@@ -2742,7 +2743,7 @@ ScriptCompiler::ScriptStreamingTask* ScriptCompiler::StartStreaming(
   Utils::ApiCheck(options == kNoCompileOptions || options == kEagerCompile,
                   "v8::ScriptCompiler::StartStreaming",
                   "Invalid CompileOptions");
-  if (!i::FLAG_script_streaming) return nullptr;
+  if (!i::v8_flags.script_streaming) return nullptr;
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
   i::ScriptStreamingData* data = source->impl();
   std::unique_ptr<i::BackgroundCompileTask> task =
@@ -2775,20 +2776,22 @@ void ScriptCompiler::ConsumeCodeCacheTask::SourceTextAvailable(
 
 bool ScriptCompiler::ConsumeCodeCacheTask::ShouldMergeWithExistingScript()
     const {
-  if (!i::FLAG_merge_background_deserialized_script_with_compilation_cache) {
+  if (!i::v8_flags
+           .merge_background_deserialized_script_with_compilation_cache) {
     return false;
   }
   return impl_->ShouldMergeWithExistingScript();
 }
 
 void ScriptCompiler::ConsumeCodeCacheTask::MergeWithExistingScript() {
-  DCHECK(i::FLAG_merge_background_deserialized_script_with_compilation_cache);
+  DCHECK(
+      i::v8_flags.merge_background_deserialized_script_with_compilation_cache);
   impl_->MergeWithExistingScript();
 }
 
 ScriptCompiler::ConsumeCodeCacheTask* ScriptCompiler::StartConsumingCodeCache(
     Isolate* v8_isolate, std::unique_ptr<CachedData> cached_data) {
-  if (!i::FLAG_concurrent_cache_deserialization) return nullptr;
+  if (!i::v8_flags.concurrent_cache_deserialization) return nullptr;
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
   DCHECK_NO_SCRIPT_NO_EXCEPTION(i_isolate);
   return new ScriptCompiler::ConsumeCodeCacheTask(
@@ -4923,7 +4926,7 @@ Maybe<bool> Object::SetAccessor(Local<Context> context, Local<Name> name,
                                 SideEffectType setter_side_effect_type) {
   return ObjectSetAccessor(context, this, name, getter, setter,
                            data.FromMaybe(Local<Value>()), settings, attribute,
-                           i::FLAG_disable_old_api_accessors, false,
+                           i::v8_flags.disable_old_api_accessors, false,
                            getter_side_effect_type, setter_side_effect_type);
 }
 
@@ -6740,6 +6743,14 @@ void v8::Context::SetPromiseHooks(Local<Function> init_hook,
 #endif  // V8_ENABLE_JAVASCRIPT_PROMISE_HOOKS
 }
 
+bool Context::HasTemplateLiteralObject(Local<Value> object) {
+  i::DisallowGarbageCollection no_gc;
+  i::Object i_object = *Utils::OpenHandle(*object);
+  if (!i_object.IsJSArray()) return false;
+  return Utils::OpenHandle(this)->native_context().HasTemplateLiteralObject(
+      i::JSArray::cast(i_object));
+}
+
 MaybeLocal<Context> metrics::Recorder::GetContext(
     Isolate* v8_isolate, metrics::Recorder::ContextId id) {
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
@@ -8064,6 +8075,10 @@ bool v8::ArrayBuffer::IsDetachable() const {
   return Utils::OpenHandle(this)->is_detachable();
 }
 
+bool v8::ArrayBuffer::WasDetached() const {
+  return Utils::OpenHandle(this)->was_detached();
+}
+
 namespace {
 std::shared_ptr<i::BackingStore> ToInternal(
     std::shared_ptr<i::BackingStoreBase> backing_store) {
@@ -8145,12 +8160,12 @@ std::unique_ptr<v8::BackingStore> v8::ArrayBuffer::NewBackingStore(
     void* deleter_data) {
   CHECK_LE(byte_length, i::JSArrayBuffer::kMaxByteLength);
 #ifdef V8_ENABLE_SANDBOX
-  Utils::ApiCheck(
-      !data || i::GetProcessWideSandbox()->Contains(data),
-      "v8_ArrayBuffer_NewBackingStore",
-      "When the V8 Sandbox is enabled, ArrayBuffer backing stores must be "
-      "allocated inside the sandbox address space. Please use an appropriate "
-      "ArrayBuffer::Allocator to allocate these buffers.");
+  Utils::ApiCheck(!data || i::GetProcessWideSandbox()->Contains(data),
+                  "v8_ArrayBuffer_NewBackingStore",
+                  "When the V8 Sandbox is enabled, ArrayBuffer backing stores "
+                  "must be allocated inside the sandbox address space. Please "
+                  "use an appropriate ArrayBuffer::Allocator to allocate these "
+                  "buffers, or disable the sandbox.");
 #endif  // V8_ENABLE_SANDBOX
 
   std::unique_ptr<i::BackingStoreBase> backing_store =
@@ -8242,7 +8257,7 @@ static_assert(
   Local<Type##Array> Type##Array::New(                                      \
       Local<SharedArrayBuffer> shared_array_buffer, size_t byte_offset,     \
       size_t length) {                                                      \
-    CHECK(i::FLAG_harmony_sharedarraybuffer);                               \
+    CHECK(i::v8_flags.harmony_sharedarraybuffer);                           \
     i::Isolate* i_isolate =                                                 \
         Utils::OpenHandle(*shared_array_buffer)->GetIsolate();              \
     API_RCS_SCOPE(i_isolate, Type##Array, New);                             \
@@ -8277,7 +8292,7 @@ Local<DataView> DataView::New(Local<ArrayBuffer> array_buffer,
 
 Local<DataView> DataView::New(Local<SharedArrayBuffer> shared_array_buffer,
                               size_t byte_offset, size_t byte_length) {
-  CHECK(i::FLAG_harmony_sharedarraybuffer);
+  CHECK(i::v8_flags.harmony_sharedarraybuffer);
   i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*shared_array_buffer);
   i::Isolate* i_isolate = buffer->GetIsolate();
   API_RCS_SCOPE(i_isolate, DataView, New);
@@ -8294,7 +8309,7 @@ size_t v8::SharedArrayBuffer::ByteLength() const {
 
 Local<SharedArrayBuffer> v8::SharedArrayBuffer::New(Isolate* v8_isolate,
                                                     size_t byte_length) {
-  CHECK(i::FLAG_harmony_sharedarraybuffer);
+  CHECK(i::v8_flags.harmony_sharedarraybuffer);
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
   API_RCS_SCOPE(i_isolate, SharedArrayBuffer, New);
   ENTER_V8_NO_SCRIPT_NO_EXCEPTION(i_isolate);
@@ -8316,7 +8331,7 @@ Local<SharedArrayBuffer> v8::SharedArrayBuffer::New(Isolate* v8_isolate,
 
 Local<SharedArrayBuffer> v8::SharedArrayBuffer::New(
     Isolate* v8_isolate, std::shared_ptr<BackingStore> backing_store) {
-  CHECK(i::FLAG_harmony_sharedarraybuffer);
+  CHECK(i::v8_flags.harmony_sharedarraybuffer);
   CHECK_IMPLIES(backing_store->ByteLength() != 0,
                 backing_store->Data() != nullptr);
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
@@ -8707,7 +8722,7 @@ bool Isolate::HasPendingBackgroundTasks() {
 }
 
 void Isolate::RequestGarbageCollectionForTesting(GarbageCollectionType type) {
-  Utils::ApiCheck(i::FLAG_expose_gc,
+  Utils::ApiCheck(i::v8_flags.expose_gc,
                   "v8::Isolate::RequestGarbageCollectionForTesting",
                   "Must use --expose-gc");
   if (type == kMinorGarbageCollection) {
@@ -9223,7 +9238,7 @@ int64_t Isolate::AdjustAmountOfExternalAllocatedMemory(
 
 void Isolate::SetEventLogger(LogEventCallback that) {
   // Do not overwrite the event logger if we want to log explicitly.
-  if (i::FLAG_log_internal_timer_events) return;
+  if (i::v8_flags.log_internal_timer_events) return;
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
   i_isolate->set_event_logger(that);
 }
@@ -9356,7 +9371,7 @@ bool Isolate::IdleNotificationDeadline(double deadline_in_seconds) {
   // Returning true tells the caller that it need not
   // continue to call IdleNotification.
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
-  if (!i::FLAG_use_idle_notification) return true;
+  if (!i::v8_flags.use_idle_notification) return true;
   return i_isolate->heap()->IdleNotification(deadline_in_seconds);
 }
 
@@ -9559,7 +9574,7 @@ void Isolate::InstallConditionalFeatures(Local<Context> context) {
   if (i_isolate->is_execution_terminating()) return;
   i_isolate->InstallConditionalFeatures(Utils::OpenHandle(*context));
 #if V8_ENABLE_WEBASSEMBLY
-  if (i::FLAG_expose_wasm && !i_isolate->has_pending_exception()) {
+  if (i::v8_flags.expose_wasm && !i_isolate->has_pending_exception()) {
     i::WasmJs::InstallConditionalFeatures(i_isolate,
                                           Utils::OpenHandle(*context));
   }
diff --git a/deps/v8/src/base/bits.cc b/deps/v8/src/base/bits.cc
index e604cff6d5c96c..2a3dce97761c59 100644
--- a/deps/v8/src/base/bits.cc
+++ b/deps/v8/src/base/bits.cc
@@ -52,6 +52,46 @@ int32_t SignedMulHigh32(int32_t lhs, int32_t rhs) {
                                            32u);
 }
 
+// The algorithm used is described in section 8.2 of
+//   Hacker's Delight, by Henry S. Warren, Jr.
+// It assumes that a right shift on a signed integer is an arithmetic shift.
+int64_t SignedMulHigh64(int64_t u, int64_t v) {
+  uint64_t u0 = u & 0xFFFFFFFF;
+  int64_t u1 = u >> 32;
+  uint64_t v0 = v & 0xFFFFFFFF;
+  int64_t v1 = v >> 32;
+
+  uint64_t w0 = u0 * v0;
+  int64_t t = u1 * v0 + (w0 >> 32);
+  int64_t w1 = t & 0xFFFFFFFF;
+  int64_t w2 = t >> 32;
+  w1 = u0 * v1 + w1;
+
+  return u1 * v1 + w2 + (w1 >> 32);
+}
+
+// The algorithm used is described in section 8.2 of
+//   Hacker's Delight, by Henry S. Warren, Jr.
+uint64_t UnsignedMulHigh64(uint64_t u, uint64_t v) {
+  uint64_t u0 = u & 0xFFFFFFFF;
+  uint64_t u1 = u >> 32;
+  uint64_t v0 = v & 0xFFFFFFFF;
+  uint64_t v1 = v >> 32;
+
+  uint64_t w0 = u0 * v0;
+  uint64_t t = u1 * v0 + (w0 >> 32);
+  uint64_t w1 = t & 0xFFFFFFFFLL;
+  uint64_t w2 = t >> 32;
+  w1 = u0 * v1 + w1;
+
+  return u1 * v1 + w2 + (w1 >> 32);
+}
+
+uint32_t UnsignedMulHigh32(uint32_t lhs, uint32_t rhs) {
+  uint64_t const value =
+      static_cast<uint64_t>(lhs) * static_cast<uint64_t>(rhs);
+  return static_cast<uint32_t>(value >> 32u);
+}
 
 int32_t SignedMulHighAndAdd32(int32_t lhs, int32_t rhs, int32_t acc) {
   return base::bit_cast<int32_t>(
@@ -66,12 +106,22 @@ int32_t SignedDiv32(int32_t lhs, int32_t rhs) {
   return lhs / rhs;
 }
 
+int64_t SignedDiv64(int64_t lhs, int64_t rhs) {
+  if (rhs == 0) return 0;
+  if (rhs == -1) return lhs == std::numeric_limits<int64_t>::min() ? lhs : -lhs;
+  return lhs / rhs;
+}
 
 int32_t SignedMod32(int32_t lhs, int32_t rhs) {
   if (rhs == 0 || rhs == -1) return 0;
   return lhs % rhs;
 }
 
+int64_t SignedMod64(int64_t lhs, int64_t rhs) {
+  if (rhs == 0 || rhs == -1) return 0;
+  return lhs % rhs;
+}
+
 int64_t SignedSaturatedAdd64(int64_t lhs, int64_t rhs) {
   using limits = std::numeric_limits<int64_t>;
   // Underflow if {lhs + rhs < min}. In that case, return {min}.
diff --git a/deps/v8/src/base/bits.h b/deps/v8/src/base/bits.h
index 3209a4b081df7f..0cb22a9a904aea 100644
--- a/deps/v8/src/base/bits.h
+++ b/deps/v8/src/base/bits.h
@@ -70,6 +70,30 @@ T ReverseBits(T value) {
   return result;
 }
 
+// ReverseBytes(value) returns |value| in reverse byte order.
+template <typename T>
+T ReverseBytes(T value) {
+  static_assert((sizeof(value) == 1) || (sizeof(value) == 2) ||
+                (sizeof(value) == 4) || (sizeof(value) == 8));
+  T result = 0;
+  for (unsigned i = 0; i < sizeof(value); i++) {
+    result = (result << 8) | (value & 0xff);
+    value >>= 8;
+  }
+  return result;
+}
+
+template <class T>
+inline constexpr std::make_unsigned_t<T> Unsigned(T value) {
+  static_assert(std::is_signed_v<T>);
+  return static_cast<std::make_unsigned_t<T>>(value);
+}
+template <class T>
+inline constexpr std::make_signed_t<T> Signed(T value) {
+  static_assert(std::is_unsigned_v<T>);
+  return static_cast<std::make_signed_t<T>>(value);
+}
+
 // CountLeadingZeros(value) returns the number of zero bits following the most
 // significant 1 bit in |value| if |value| is non-zero, otherwise it returns
 // {sizeof(T) * 8}.
@@ -104,6 +128,15 @@ inline constexpr unsigned CountLeadingZeros64(uint64_t value) {
   return CountLeadingZeros(value);
 }
 
+// The number of leading zeros for a positive number,
+// the number of leading ones for a negative number.
+template <class T>
+constexpr unsigned CountLeadingSignBits(T value) {
+  static_assert(std::is_signed_v<T>);
+  return value < 0 ? CountLeadingZeros(~Unsigned(value))
+                   : CountLeadingZeros(Unsigned(value));
+}
+
 // CountTrailingZeros(value) returns the number of zero bits preceding the
 // least significant 1 bit in |value| if |value| is non-zero, otherwise it
 // returns {sizeof(T) * 8}.
@@ -297,6 +330,21 @@ inline bool SignedSubOverflow64(int64_t lhs, int64_t rhs, int64_t* val) {
 // those.
 V8_BASE_EXPORT int32_t SignedMulHigh32(int32_t lhs, int32_t rhs);
 
+// UnsignedMulHigh32(lhs, rhs) multiplies two unsigned 32-bit values |lhs| and
+// |rhs|, extracts the most significant 32 bits of the result, and returns
+// those.
+V8_BASE_EXPORT uint32_t UnsignedMulHigh32(uint32_t lhs, uint32_t rhs);
+
+// SignedMulHigh64(lhs, rhs) multiplies two signed 64-bit values |lhs| and
+// |rhs|, extracts the most significant 64 bits of the result, and returns
+// those.
+V8_BASE_EXPORT int64_t SignedMulHigh64(int64_t lhs, int64_t rhs);
+
+// UnsignedMulHigh64(lhs, rhs) multiplies two unsigned 64-bit values |lhs| and
+// |rhs|, extracts the most significant 64 bits of the result, and returns
+// those.
+V8_BASE_EXPORT uint64_t UnsignedMulHigh64(uint64_t lhs, uint64_t rhs);
+
 // SignedMulHighAndAdd32(lhs, rhs, acc) multiplies two signed 32-bit values
 // |lhs| and |rhs|, extracts the most significant 32 bits of the result, and
 // adds the accumulate value |acc|.
@@ -308,11 +356,21 @@ V8_BASE_EXPORT int32_t SignedMulHighAndAdd32(int32_t lhs, int32_t rhs,
 // is minint and |rhs| is -1, it returns minint.
 V8_BASE_EXPORT int32_t SignedDiv32(int32_t lhs, int32_t rhs);
 
+// SignedDiv64(lhs, rhs) divides |lhs| by |rhs| and returns the quotient
+// truncated to int64. If |rhs| is zero, then zero is returned. If |lhs|
+// is minint and |rhs| is -1, it returns minint.
+V8_BASE_EXPORT int64_t SignedDiv64(int64_t lhs, int64_t rhs);
+
 // SignedMod32(lhs, rhs) divides |lhs| by |rhs| and returns the remainder
 // truncated to int32. If either |rhs| is zero or |lhs| is minint and |rhs|
 // is -1, it returns zero.
 V8_BASE_EXPORT int32_t SignedMod32(int32_t lhs, int32_t rhs);
 
+// SignedMod64(lhs, rhs) divides |lhs| by |rhs| and returns the remainder
+// truncated to int64. If either |rhs| is zero or |lhs| is minint and |rhs|
+// is -1, it returns zero.
+V8_BASE_EXPORT int64_t SignedMod64(int64_t lhs, int64_t rhs);
+
 // UnsignedAddOverflow32(lhs,rhs,val) performs an unsigned summation of |lhs|
 // and |rhs| and stores the result into the variable pointed to by |val| and
 // returns true if the unsigned summation resulted in an overflow.
@@ -332,6 +390,11 @@ inline uint32_t UnsignedDiv32(uint32_t lhs, uint32_t rhs) {
   return rhs ? lhs / rhs : 0u;
 }
 
+// UnsignedDiv64(lhs, rhs) divides |lhs| by |rhs| and returns the quotient
+// truncated to uint64. If |rhs| is zero, then zero is returned.
+inline uint64_t UnsignedDiv64(uint64_t lhs, uint64_t rhs) {
+  return rhs ? lhs / rhs : 0u;
+}
 
 // UnsignedMod32(lhs, rhs) divides |lhs| by |rhs| and returns the remainder
 // truncated to uint32. If |rhs| is zero, then zero is returned.
@@ -339,6 +402,12 @@ inline uint32_t UnsignedMod32(uint32_t lhs, uint32_t rhs) {
   return rhs ? lhs % rhs : 0u;
 }
 
+// UnsignedMod64(lhs, rhs) divides |lhs| by |rhs| and returns the remainder
+// truncated to uint64. If |rhs| is zero, then zero is returned.
+inline uint64_t UnsignedMod64(uint64_t lhs, uint64_t rhs) {
+  return rhs ? lhs % rhs : 0u;
+}
+
 // Wraparound integer arithmetic without undefined behavior.
 
 inline int32_t WraparoundAdd32(int32_t lhs, int32_t rhs) {
diff --git a/deps/v8/src/base/compiler-specific.h b/deps/v8/src/base/compiler-specific.h
index 3221de08349843..d7ddefd7137811 100644
--- a/deps/v8/src/base/compiler-specific.h
+++ b/deps/v8/src/base/compiler-specific.h
@@ -135,4 +135,15 @@
 #define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
 #endif
 
+// Forces the linker to not GC the section corresponding to the symbol.
+#if defined(__has_attribute)
+#if __has_attribute(used) && __has_attribute(retain)
+#define V8_DONT_STRIP_SYMBOL __attribute__((used, retain))
+#endif  // __has_attribute(used) && __has_attribute(retain)
+#endif  // defined(__has_attribute)
+
+#if !defined(V8_DONT_STRIP_SYMBOL)
+#define V8_DONT_STRIP_SYMBOL
+#endif  // !defined(V8_DONT_STRIP_SYMBOL)
+
 #endif  // V8_BASE_COMPILER_SPECIFIC_H_
diff --git a/deps/v8/src/base/division-by-constant.cc b/deps/v8/src/base/division-by-constant.cc
index 97dfd5680b04df..fbc36463dc51d0 100644
--- a/deps/v8/src/base/division-by-constant.cc
+++ b/deps/v8/src/base/division-by-constant.cc
@@ -6,15 +6,16 @@
 
 #include <stdint.h>
 
+#include <type_traits>
+
 #include "src/base/logging.h"
 #include "src/base/macros.h"
 
 namespace v8 {
 namespace base {
 
-template <class T>
+template <class T, std::enable_if_t<std::is_unsigned_v<T>, bool>>
 MagicNumbersForDivision<T> SignedDivisionByConstant(T d) {
-  static_assert(static_cast<T>(0) < static_cast<T>(-1));
   DCHECK(d != static_cast<T>(-1) && d != 0 && d != 1);
   const unsigned bits = static_cast<unsigned>(sizeof(T)) * 8;
   const T min = (static_cast<T>(1) << (bits - 1));
@@ -48,11 +49,10 @@ MagicNumbersForDivision<T> SignedDivisionByConstant(T d) {
   return MagicNumbersForDivision<T>(neg ? (0 - mul) : mul, p - bits, false);
 }
 
-
 template <class T>
 MagicNumbersForDivision<T> UnsignedDivisionByConstant(T d,
                                                       unsigned leading_zeros) {
-  static_assert(static_cast<T>(0) < static_cast<T>(-1));
+  static_assert(std::is_unsigned_v<T>);
   DCHECK_NE(d, 0);
   const unsigned bits = static_cast<unsigned>(sizeof(T)) * 8;
   const T ones = ~static_cast<T>(0) >> leading_zeros;
diff --git a/deps/v8/src/base/division-by-constant.h b/deps/v8/src/base/division-by-constant.h
index 744283981bc3de..4b9f4a873c289c 100644
--- a/deps/v8/src/base/division-by-constant.h
+++ b/deps/v8/src/base/division-by-constant.h
@@ -7,6 +7,9 @@
 
 #include <stdint.h>
 
+#include <tuple>
+#include <type_traits>
+
 #include "src/base/base-export.h"
 #include "src/base/export-template.h"
 
@@ -16,10 +19,10 @@ namespace base {
 // ----------------------------------------------------------------------------
 
 // The magic numbers for division via multiplication, see Warren's "Hacker's
-// Delight", chapter 10. The template parameter must be one of the unsigned
-// integral types.
+// Delight", chapter 10.
 template <class T>
 struct EXPORT_TEMPLATE_DECLARE(V8_BASE_EXPORT) MagicNumbersForDivision {
+  static_assert(std::is_integral_v<T>);
   MagicNumbersForDivision(T m, unsigned s, bool a)
       : multiplier(m), shift(s), add(a) {}
   bool operator==(const MagicNumbersForDivision& rhs) const {
@@ -31,13 +34,20 @@ struct EXPORT_TEMPLATE_DECLARE(V8_BASE_EXPORT) MagicNumbersForDivision {
   bool add;
 };
 
-
 // Calculate the multiplier and shift for signed division via multiplication.
 // The divisor must not be -1, 0 or 1 when interpreted as a signed value.
-template <class T>
+template <class T, std::enable_if_t<std::is_unsigned_v<T>, bool> = true>
 EXPORT_TEMPLATE_DECLARE(V8_BASE_EXPORT)
 MagicNumbersForDivision<T> SignedDivisionByConstant(T d);
 
+template <class T, std::enable_if_t<std::is_signed_v<T>, bool> = true>
+MagicNumbersForDivision<T> SignedDivisionByConstant(T d) {
+  using Unsigned = std::make_unsigned_t<T>;
+  MagicNumbersForDivision<Unsigned> magic =
+      SignedDivisionByConstant(static_cast<Unsigned>(d));
+  return {static_cast<T>(magic.multiplier), magic.shift, magic.add};
+}
+
 // Calculate the multiplier and shift for unsigned division via multiplication,
 // see Warren's "Hacker's Delight", chapter 10. The divisor must not be 0 and
 // leading_zeros can be used to speed up the calculation if the given number of
diff --git a/deps/v8/src/baseline/baseline-compiler.cc b/deps/v8/src/baseline/baseline-compiler.cc
index 4db43686acc11a..25123cb7cd80eb 100644
--- a/deps/v8/src/baseline/baseline-compiler.cc
+++ b/deps/v8/src/baseline/baseline-compiler.cc
@@ -967,14 +967,6 @@ void BaselineCompiler::VisitDefineKeyedOwnPropertyInLiteral() {
               IndexAsTagged(3));                // slot
 }
 
-void BaselineCompiler::VisitCollectTypeProfile() {
-  SaveAccumulatorScope accumulator_scope(&basm_);
-  CallRuntime(Runtime::kCollectTypeProfile,
-              IntAsSmi(0),                      // position
-              kInterpreterAccumulatorRegister,  // value
-              FeedbackVector());                // feedback vector
-}
-
 void BaselineCompiler::VisitAdd() {
   CallBuiltin<Builtin::kAdd_Baseline>(
       RegisterOperand(0), kInterpreterAccumulatorRegister, Index(1));
@@ -1158,10 +1150,10 @@ void BaselineCompiler::VisitGetSuperConstructor() {
   StoreRegister(0, prototype);
 }
 
-void BaselineCompiler::VisitFindNonDefaultConstructor() {
+void BaselineCompiler::VisitFindNonDefaultConstructorOrConstruct() {
   SaveAccumulatorScope accumulator_scope(&basm_);
-  CallBuiltin<Builtin::kFindNonDefaultConstructor>(RegisterOperand(0),
-                                                   RegisterOperand(1));
+  CallBuiltin<Builtin::kFindNonDefaultConstructorOrConstruct>(
+      RegisterOperand(0), RegisterOperand(1));
   StoreRegisterPair(2, kReturnRegister0, kReturnRegister1);
 }
 
@@ -1421,9 +1413,9 @@ void BaselineCompiler::VisitIntrinsicAsyncGeneratorResolve(
   CallBuiltin<Builtin::kAsyncGeneratorResolve>(args);
 }
 
-void BaselineCompiler::VisitIntrinsicAsyncGeneratorYield(
+void BaselineCompiler::VisitIntrinsicAsyncGeneratorYieldWithAwait(
     interpreter::RegisterList args) {
-  CallBuiltin<Builtin::kAsyncGeneratorYield>(args);
+  CallBuiltin<Builtin::kAsyncGeneratorYieldWithAwait>(args);
 }
 
 void BaselineCompiler::VisitConstruct() {
diff --git a/deps/v8/src/builtins/arm/builtins-arm.cc b/deps/v8/src/builtins/arm/builtins-arm.cc
index 81f5c961bc442a..d6a6591dfe769c 100644
--- a/deps/v8/src/builtins/arm/builtins-arm.cc
+++ b/deps/v8/src/builtins/arm/builtins-arm.cc
@@ -1051,7 +1051,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
 
     // Drop the frame created by the baseline call.
     __ ldm(ia_w, sp, {fp, lr});
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
     __ Trap();
   }
 
@@ -1300,7 +1300,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
   __ jmp(&after_stack_check_interrupt);
 
   __ bind(&flags_need_processing);
-  __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+  __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
 
   __ bind(&is_baseline);
   {
diff --git a/deps/v8/src/builtins/arm64/builtins-arm64.cc b/deps/v8/src/builtins/arm64/builtins-arm64.cc
index 00368d0da6a974..168270bf6fb66c 100644
--- a/deps/v8/src/builtins/arm64/builtins-arm64.cc
+++ b/deps/v8/src/builtins/arm64/builtins-arm64.cc
@@ -1205,7 +1205,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
     ASM_CODE_COMMENT_STRING(masm, "Optimized marker check");
     // Drop the frame created by the baseline call.
     __ Pop<TurboAssembler::kAuthLR>(fp, lr);
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
     __ Trap();
   }
 
@@ -1474,7 +1474,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
   __ jmp(&after_stack_check_interrupt);
 
   __ bind(&flags_need_processing);
-  __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+  __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
 
   __ bind(&is_baseline);
   {
diff --git a/deps/v8/src/builtins/array-to-reversed.tq b/deps/v8/src/builtins/array-to-reversed.tq
index 542bc867f04e6e..5d97d6546ea1fe 100644
--- a/deps/v8/src/builtins/array-to-reversed.tq
+++ b/deps/v8/src/builtins/array-to-reversed.tq
@@ -8,8 +8,8 @@ macro FastPackedArrayToReversed<Accessor: type, T: type>(
     kind: constexpr ElementsKind, elements: FixedArrayBase,
     length: Smi): JSArray {
   // 3. Let A be ? ArrayCreate(𝔽(len)).
-  const copy: FixedArrayBase =
-      AllocateFixedArray(kind, SmiUntag(length), AllocationFlag::kNone);
+  const copy: FixedArrayBase = AllocateFixedArray(
+      kind, SmiUntag(length), AllocationFlag::kAllowLargeObjectAllocation);
 
   // 4. Let k be 0.
   let k: Smi = 0;
@@ -39,6 +39,8 @@ macro TryFastPackedArrayToReversed(implicit context: Context)(receiver: JSAny):
     JSArray labels Slow {
   const array: FastJSArray = Cast<FastJSArray>(receiver) otherwise Slow;
 
+  if (array.length < 1) return ArrayCreate(0);
+
   const kind: ElementsKind = array.map.elements_kind;
   if (kind == ElementsKind::PACKED_SMI_ELEMENTS) {
     return FastPackedArrayToReversed<array::FastPackedSmiElements, Smi>(
diff --git a/deps/v8/src/builtins/array-to-sorted.tq b/deps/v8/src/builtins/array-to-sorted.tq
index 0a953ab4e533d0..0a36502825c3cc 100644
--- a/deps/v8/src/builtins/array-to-sorted.tq
+++ b/deps/v8/src/builtins/array-to-sorted.tq
@@ -15,7 +15,8 @@ CopyWorkArrayToNewFastJSArray(implicit context: Context, sortState: SortState)(
   dcheck(len <= kMaxFastArrayLength);
 
   const copy: FixedArray = UnsafeCast<FixedArray>(AllocateFixedArray(
-      elementsKind, Convert<intptr>(len), AllocationFlag::kNone));
+      elementsKind, Convert<intptr>(len),
+      AllocationFlag::kAllowLargeObjectAllocation));
 
   const workArray = sortState.workArray;
   CopyElements(
diff --git a/deps/v8/src/builtins/array-to-spliced.tq b/deps/v8/src/builtins/array-to-spliced.tq
index 999c1388624970..505a58b733cf05 100644
--- a/deps/v8/src/builtins/array-to-spliced.tq
+++ b/deps/v8/src/builtins/array-to-spliced.tq
@@ -14,11 +14,13 @@ macro CopyFastPackedArrayForToSpliced(implicit context: Context)(
   const insertCount: intptr = Convert<intptr>(insertCountSmi);
   const actualDeleteCount: intptr = Convert<intptr>(actualDeleteCountSmi);
 
-  const copy: FixedArrayBase =
-      AllocateFixedArray(kind, newLen, AllocationFlag::kNone);
+  const copy: FixedArrayBase = AllocateFixedArray(
+      kind, newLen, AllocationFlag::kAllowLargeObjectAllocation);
 
-  // Copy the part before the inserted items.
-  CopyElements(kind, copy, 0, array.elements, 0, actualStart);
+  if (actualStart > 0) {
+    // Copy the part before the inserted items.
+    CopyElements(kind, copy, 0, array.elements, 0, actualStart);
+  }
 
   // Initialize elements that will hold the inserted items because the
   // NewJSArray below may allocate. Leave the actual insertion for later since
@@ -36,9 +38,11 @@ macro CopyFastPackedArrayForToSpliced(implicit context: Context)(
   // Copy the part after the inserted items.
   const secondPartStart: intptr = actualStart + insertCount;
   const secondPartLen: intptr = newLen - secondPartStart;
-  const r: intptr = actualStart + actualDeleteCount;
-  dcheck(Convert<Smi>(r + secondPartLen) <= array.length);
-  CopyElements(kind, copy, secondPartStart, array.elements, r, secondPartLen);
+  if (secondPartLen > 0) {
+    const r: intptr = actualStart + actualDeleteCount;
+    dcheck(Convert<Smi>(r + secondPartLen) <= array.length);
+    CopyElements(kind, copy, secondPartStart, array.elements, r, secondPartLen);
+  }
 
   const map: Map = LoadJSArrayElementsMap(kind, LoadNativeContext(context));
   return NewJSArray(map, copy);
diff --git a/deps/v8/src/builtins/array-with.tq b/deps/v8/src/builtins/array-with.tq
index 161bce9f0b4b8a..e6a6c7cfbcf580 100644
--- a/deps/v8/src/builtins/array-with.tq
+++ b/deps/v8/src/builtins/array-with.tq
@@ -55,10 +55,8 @@ transitioning builtin GenericArrayWith(
 
 // https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.with
 transitioning javascript builtin ArrayPrototypeWith(
-    js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny {
-  const index = arguments[0];
-  const value = arguments[1];
-
+    js-implicit context: NativeContext, receiver: JSAny)(
+    index: JSAny, value: JSAny): JSAny {
   // 1. Let O be ? ToObject(this value).
   const object: JSReceiver = ToObject_Inline(context, receiver);
 
diff --git a/deps/v8/src/builtins/base.tq b/deps/v8/src/builtins/base.tq
index 4d5f054a178f90..40f702549d93a6 100644
--- a/deps/v8/src/builtins/base.tq
+++ b/deps/v8/src/builtins/base.tq
@@ -437,10 +437,11 @@ extern enum MessageTemplate {
   kWasmTrapArrayOutOfBounds,
   kWasmTrapArrayTooLarge,
   kWasmTrapStringOffsetOutOfBounds,
+  kWasmObjectsAreOpaque,
   kWeakRefsRegisterTargetAndHoldingsMustNotBeSame,
-  kWeakRefsRegisterTargetMustBeObject,
-  kWeakRefsUnregisterTokenMustBeObject,
-  kWeakRefsWeakRefConstructorTargetMustBeObject,
+  kInvalidWeakRefsRegisterTarget,
+  kInvalidWeakRefsUnregisterToken,
+  kInvalidWeakRefsWeakRefConstructorTarget,
   ...
 }
 
@@ -917,10 +918,10 @@ macro Float64IsNaN(n: float64): bool {
 // The type of all tagged values that can safely be compared with TaggedEqual.
 @if(V8_ENABLE_WEBASSEMBLY)
 type TaggedWithIdentity = JSReceiver | FixedArrayBase | Oddball | Map |
-    WeakCell | Context | EmptyString | WasmInternalFunction;
+    WeakCell | Context | EmptyString | Symbol | WasmInternalFunction;
 @ifnot(V8_ENABLE_WEBASSEMBLY)
 type TaggedWithIdentity = JSReceiver | FixedArrayBase | Oddball | Map |
-    WeakCell | Context | EmptyString;
+    WeakCell | Context | EmptyString | Symbol;
 
 extern operator '==' macro TaggedEqual(TaggedWithIdentity, Object): bool;
 extern operator '==' macro TaggedEqual(Object, TaggedWithIdentity): bool;
diff --git a/deps/v8/src/builtins/builtins-array.cc b/deps/v8/src/builtins/builtins-array.cc
index 79e8396bf49897..49fe48d6987a46 100644
--- a/deps/v8/src/builtins/builtins-array.cc
+++ b/deps/v8/src/builtins/builtins-array.cc
@@ -503,6 +503,8 @@ namespace {
 // Returns true, iff we can use ElementsAccessor for shifting.
 V8_WARN_UNUSED_RESULT bool CanUseFastArrayShift(Isolate* isolate,
                                                 Handle<JSReceiver> receiver) {
+  if (V8_COMPRESS_POINTERS_8GB_BOOL) return false;
+
   if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, nullptr, 0,
                                              0) ||
       !IsJSArrayFastElementMovingAllowed(isolate, JSArray::cast(*receiver))) {
@@ -1599,7 +1601,8 @@ enum class ArrayGroupMode { kToObject, kToMap };
 template <ArrayGroupMode mode>
 inline MaybeHandle<OrderedHashMap> GenericArrayGroup(
     Isolate* isolate, Handle<JSReceiver> O, Handle<Object> callbackfn,
-    Handle<OrderedHashMap> groups, double initialK, double len) {
+    Handle<Object> thisArg, Handle<OrderedHashMap> groups, double initialK,
+    double len) {
   // 6. Repeat, while k < len
   for (double k = initialK; k < len; ++k) {
     // 6a. Let Pk be ! ToString(𝔽(k)).
@@ -1617,9 +1620,9 @@ inline MaybeHandle<OrderedHashMap> GenericArrayGroup(
     // 6c. Let key be ? Call(callbackfn, thisArg, « kValue, 𝔽(k), O »).
     Handle<Object> propertyKey;
     Handle<Object> argv[] = {kValue, isolate->factory()->NewNumber(k), O};
-    ASSIGN_RETURN_ON_EXCEPTION(isolate, propertyKey,
-                               Execution::Call(isolate, callbackfn, O, 3, argv),
-                               OrderedHashMap);
+    ASSIGN_RETURN_ON_EXCEPTION(
+        isolate, propertyKey,
+        Execution::Call(isolate, callbackfn, thisArg, 3, argv), OrderedHashMap);
 
     if (mode == ArrayGroupMode::kToMap) {
       // 6d. If key is -0𝔽, set key to +0𝔽.
@@ -1649,7 +1652,7 @@ inline MaybeHandle<OrderedHashMap> GenericArrayGroup(
 template <ArrayGroupMode mode>
 inline MaybeHandle<OrderedHashMap> FastArrayGroup(
     Isolate* isolate, Handle<JSArray> array, Handle<Object> callbackfn,
-    Handle<OrderedHashMap> groups, double len,
+    Handle<Object> thisArg, Handle<OrderedHashMap> groups, double len,
     ElementsKind* result_elements_kind) {
   DCHECK_NOT_NULL(result_elements_kind);
 
@@ -1662,8 +1665,8 @@ inline MaybeHandle<OrderedHashMap> FastArrayGroup(
   for (InternalIndex k : InternalIndex::Range(uint_len)) {
     if (!CheckArrayMapNotModified(array, original_map) ||
         k.as_uint32() >= static_cast<uint32_t>(array->length().Number())) {
-      return GenericArrayGroup<mode>(isolate, array, callbackfn, groups,
-                                     k.as_uint32(), len);
+      return GenericArrayGroup<mode>(isolate, array, callbackfn, thisArg,
+                                     groups, k.as_uint32(), len);
     }
     // 6a. Let Pk be ! ToString(𝔽(k)).
     // 6b. Let kValue be ? Get(O, Pk).
@@ -1679,7 +1682,7 @@ inline MaybeHandle<OrderedHashMap> FastArrayGroup(
         kValue, isolate->factory()->NewNumber(k.as_uint32()), array};
     ASSIGN_RETURN_ON_EXCEPTION(
         isolate, propertyKey,
-        Execution::Call(isolate, callbackfn, array, 3, argv), OrderedHashMap);
+        Execution::Call(isolate, callbackfn, thisArg, 3, argv), OrderedHashMap);
 
     if (mode == ArrayGroupMode::kToMap) {
       // 6d. If key is -0𝔽, set key to +0𝔽.
@@ -1719,7 +1722,7 @@ inline MaybeHandle<OrderedHashMap> FastArrayGroup(
 
 }  // namespace
 
-// https://tc39.es/proposal-array-grouping/#sec-array.prototype.groupby
+// https://tc39.es/proposal-array-grouping/#sec-array.prototype.group
 BUILTIN(ArrayPrototypeGroup) {
   const char* const kMethodName = "Array.prototype.group";
   HandleScope scope(isolate);
@@ -1741,6 +1744,8 @@ BUILTIN(ArrayPrototypeGroup) {
         isolate, NewTypeError(MessageTemplate::kCalledNonCallable, callbackfn));
   }
 
+  Handle<Object> thisArg = args.atOrUndefined(isolate, 2);
+
   // 5. Let groups be a new empty List.
   Handle<OrderedHashMap> groups = isolate->factory()->NewOrderedHashMap();
   ElementsKind result_elements_kind = ElementsKind::PACKED_ELEMENTS;
@@ -1748,14 +1753,15 @@ BUILTIN(ArrayPrototypeGroup) {
     Handle<JSArray> array = Handle<JSArray>::cast(O);
     ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
         isolate, groups,
-        FastArrayGroup<ArrayGroupMode::kToObject>(
-            isolate, array, callbackfn, groups, len, &result_elements_kind));
+        FastArrayGroup<ArrayGroupMode::kToObject>(isolate, array, callbackfn,
+                                                  thisArg, groups, len,
+                                                  &result_elements_kind));
   } else {
     // 4. Let k be 0.
     ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
         isolate, groups,
         GenericArrayGroup<ArrayGroupMode::kToObject>(isolate, O, callbackfn,
-                                                     groups, 0, len));
+                                                     thisArg, groups, 0, len));
   }
 
   // 7. Let obj be ! OrdinaryObjectCreate(null).
@@ -1781,7 +1787,7 @@ BUILTIN(ArrayPrototypeGroup) {
   return *obj;
 }
 
-// https://tc39.es/proposal-array-grouping/#sec-array.prototype.groupbymap
+// https://tc39.es/proposal-array-grouping/#sec-array.prototype.grouptomap
 BUILTIN(ArrayPrototypeGroupToMap) {
   const char* const kMethodName = "Array.prototype.groupToMap";
   HandleScope scope(isolate);
@@ -1803,21 +1809,23 @@ BUILTIN(ArrayPrototypeGroupToMap) {
         isolate, NewTypeError(MessageTemplate::kCalledNonCallable, callbackfn));
   }
 
+  Handle<Object> thisArg = args.atOrUndefined(isolate, 2);
+
   // 5. Let groups be a new empty List.
   Handle<OrderedHashMap> groups = isolate->factory()->NewOrderedHashMap();
   ElementsKind result_elements_kind = ElementsKind::PACKED_ELEMENTS;
   if (IsFastArray(O)) {
     Handle<JSArray> array = Handle<JSArray>::cast(O);
-    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
-        isolate, groups,
-        FastArrayGroup<ArrayGroupMode::kToMap>(
-            isolate, array, callbackfn, groups, len, &result_elements_kind));
+    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, groups,
+                                       FastArrayGroup<ArrayGroupMode::kToMap>(
+                                           isolate, array, callbackfn, thisArg,
+                                           groups, len, &result_elements_kind));
   } else {
     // 4. Let k be 0.
     ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
         isolate, groups,
         GenericArrayGroup<ArrayGroupMode::kToMap>(isolate, O, callbackfn,
-                                                  groups, 0, len));
+                                                  thisArg, groups, 0, len));
   }
 
   // 7. Let map be ! Construct(%Map%).
diff --git a/deps/v8/src/builtins/builtins-arraybuffer.cc b/deps/v8/src/builtins/builtins-arraybuffer.cc
index 4d19f6ed42dda8..fbe29b434fae36 100644
--- a/deps/v8/src/builtins/builtins-arraybuffer.cc
+++ b/deps/v8/src/builtins/builtins-arraybuffer.cc
@@ -24,7 +24,7 @@ namespace internal {
   }
 
 #define CHECK_RESIZABLE(expected, name, method)                             \
-  if (name->is_resizable() != expected) {                                   \
+  if (name->is_resizable_by_js() != expected) {                             \
     THROW_NEW_ERROR_RETURN_FAILURE(                                         \
         isolate,                                                            \
         NewTypeError(MessageTemplate::kIncompatibleMethodReceiver,          \
@@ -316,7 +316,7 @@ static Object SliceHelper(BuiltinArguments args, Isolate* isolate,
 
   if (new_len_size != 0) {
     size_t from_byte_length = array_buffer->GetByteLength();
-    if (V8_UNLIKELY(!is_shared && array_buffer->is_resizable())) {
+    if (V8_UNLIKELY(!is_shared && array_buffer->is_resizable_by_js())) {
       // The above steps might have resized the underlying buffer. In that case,
       // only copy the still-accessible portion of the underlying data.
       if (first_size > from_byte_length) {
@@ -569,7 +569,7 @@ BUILTIN(ArrayBufferPrototypeTransfer) {
 
   // Case 2: We can reuse the same BackingStore.
   auto from_backing_store = array_buffer->GetBackingStore();
-  if (!from_backing_store->is_resizable() &&
+  if (from_backing_store && !from_backing_store->is_resizable_by_js() &&
       (new_byte_length == array_buffer->GetByteLength() ||
        from_backing_store->CanReallocate())) {
     // Reallocate covers steps 6-12.
diff --git a/deps/v8/src/builtins/builtins-async-generator-gen.cc b/deps/v8/src/builtins/builtins-async-generator-gen.cc
index beccd0dfa25d81..26dcabe6c3b320 100644
--- a/deps/v8/src/builtins/builtins-async-generator-gen.cc
+++ b/deps/v8/src/builtins/builtins-async-generator-gen.cc
@@ -602,7 +602,7 @@ TF_BUILTIN(AsyncGeneratorReject, AsyncGeneratorBuiltinsAssembler) {
                      TrueConstant()));
 }
 
-TF_BUILTIN(AsyncGeneratorYield, AsyncGeneratorBuiltinsAssembler) {
+TF_BUILTIN(AsyncGeneratorYieldWithAwait, AsyncGeneratorBuiltinsAssembler) {
   const auto generator = Parameter<JSGeneratorObject>(Descriptor::kGenerator);
   const auto value = Parameter<Object>(Descriptor::kValue);
   const auto is_caught = Parameter<Oddball>(Descriptor::kIsCaught);
@@ -614,13 +614,14 @@ TF_BUILTIN(AsyncGeneratorYield, AsyncGeneratorBuiltinsAssembler) {
       LoadPromiseFromAsyncGeneratorRequest(request);
 
   Await(context, generator, value, outer_promise,
-        AsyncGeneratorYieldResolveSharedFunConstant(),
+        AsyncGeneratorYieldWithAwaitResolveSharedFunConstant(),
         AsyncGeneratorAwaitRejectSharedFunConstant(), is_caught);
   SetGeneratorAwaiting(generator);
   Return(UndefinedConstant());
 }
 
-TF_BUILTIN(AsyncGeneratorYieldResolveClosure, AsyncGeneratorBuiltinsAssembler) {
+TF_BUILTIN(AsyncGeneratorYieldWithAwaitResolveClosure,
+           AsyncGeneratorBuiltinsAssembler) {
   const auto context = Parameter<Context>(Descriptor::kContext);
   const auto value = Parameter<Object>(Descriptor::kValue);
   const TNode<JSAsyncGeneratorObject> generator =
diff --git a/deps/v8/src/builtins/builtins-bigint-gen.h b/deps/v8/src/builtins/builtins-bigint-gen.h
index c1c9265e4c729e..8543f5fe999148 100644
--- a/deps/v8/src/builtins/builtins-bigint-gen.h
+++ b/deps/v8/src/builtins/builtins-bigint-gen.h
@@ -63,32 +63,34 @@ class BigIntBuiltinsAssembler : public CodeStubAssembler {
                   std::make_pair(MachineType::AnyTagged(), y));
   }
 
-  TNode<BoolT> CppAbsoluteMulAndCanonicalize(TNode<BigInt> result,
-                                             TNode<BigInt> x, TNode<BigInt> y) {
+  TNode<Int32T> CppAbsoluteMulAndCanonicalize(TNode<BigInt> result,
+                                              TNode<BigInt> x,
+                                              TNode<BigInt> y) {
     TNode<ExternalReference> mutable_big_int_absolute_mul_and_canonicalize =
         ExternalConstant(
             ExternalReference::
                 mutable_big_int_absolute_mul_and_canonicalize_function());
-    TNode<BoolT> success = UncheckedCast<BoolT>(CallCFunction(
-        mutable_big_int_absolute_mul_and_canonicalize, MachineType::Bool(),
+    TNode<Int32T> return_code = UncheckedCast<Int32T>(CallCFunction(
+        mutable_big_int_absolute_mul_and_canonicalize, MachineType::Int32(),
         std::make_pair(MachineType::AnyTagged(), result),
         std::make_pair(MachineType::AnyTagged(), x),
         std::make_pair(MachineType::AnyTagged(), y)));
-    return success;
+    return return_code;
   }
 
-  TNode<BoolT> CppAbsoluteDivAndCanonicalize(TNode<BigInt> result,
-                                             TNode<BigInt> x, TNode<BigInt> y) {
+  TNode<Int32T> CppAbsoluteDivAndCanonicalize(TNode<BigInt> result,
+                                              TNode<BigInt> x,
+                                              TNode<BigInt> y) {
     TNode<ExternalReference> mutable_big_int_absolute_div_and_canonicalize =
         ExternalConstant(
             ExternalReference::
                 mutable_big_int_absolute_div_and_canonicalize_function());
-    TNode<BoolT> success = UncheckedCast<BoolT>(CallCFunction(
-        mutable_big_int_absolute_div_and_canonicalize, MachineType::Bool(),
+    TNode<Int32T> return_code = UncheckedCast<Int32T>(CallCFunction(
+        mutable_big_int_absolute_div_and_canonicalize, MachineType::Int32(),
         std::make_pair(MachineType::AnyTagged(), result),
         std::make_pair(MachineType::AnyTagged(), x),
         std::make_pair(MachineType::AnyTagged(), y)));
-    return success;
+    return return_code;
   }
 
   void CppBitwiseAndPosPosAndCanonicalize(TNode<BigInt> result, TNode<BigInt> x,
diff --git a/deps/v8/src/builtins/builtins-bigint.tq b/deps/v8/src/builtins/builtins-bigint.tq
index be5d42aff0de4a..5ef53a54ce399c 100644
--- a/deps/v8/src/builtins/builtins-bigint.tq
+++ b/deps/v8/src/builtins/builtins-bigint.tq
@@ -14,9 +14,9 @@ extern macro BigIntBuiltinsAssembler::CppAbsoluteAddAndCanonicalize(
 extern macro BigIntBuiltinsAssembler::CppAbsoluteSubAndCanonicalize(
     MutableBigInt, BigIntBase, BigIntBase): void;
 extern macro BigIntBuiltinsAssembler::CppAbsoluteMulAndCanonicalize(
-    MutableBigInt, BigIntBase, BigIntBase): bool;
+    MutableBigInt, BigIntBase, BigIntBase): int32;
 extern macro BigIntBuiltinsAssembler::CppAbsoluteDivAndCanonicalize(
-    MutableBigInt, BigIntBase, BigIntBase): bool;
+    MutableBigInt, BigIntBase, BigIntBase): int32;
 extern macro BigIntBuiltinsAssembler::CppBitwiseAndPosPosAndCanonicalize(
     MutableBigInt, BigIntBase, BigIntBase): void;
 extern macro BigIntBuiltinsAssembler::CppBitwiseAndNegNegAndCanonicalize(
@@ -236,7 +236,7 @@ macro BigIntMultiplyImpl(implicit context: Context)(x: BigInt, y: BigInt):
   const result = AllocateEmptyBigIntNoThrow(resultSign, xlength + ylength)
       otherwise BigIntTooBig;
 
-  if (!CppAbsoluteMulAndCanonicalize(result, x, y)) {
+  if (CppAbsoluteMulAndCanonicalize(result, x, y) == 1) {
     goto TerminationRequested;
   }
 
@@ -305,7 +305,7 @@ macro BigIntDivideImpl(implicit context: Context)(x: BigInt, y: BigInt):
   const result = AllocateEmptyBigIntNoThrow(resultSign, resultLength)
       otherwise unreachable;
 
-  if (!CppAbsoluteDivAndCanonicalize(result, x, y)) {
+  if (CppAbsoluteDivAndCanonicalize(result, x, y) == 1) {
     goto TerminationRequested;
   }
 
diff --git a/deps/v8/src/builtins/builtins-collections-gen.cc b/deps/v8/src/builtins/builtins-collections-gen.cc
index f6238e30728766..f6edbb6bc028f4 100644
--- a/deps/v8/src/builtins/builtins-collections-gen.cc
+++ b/deps/v8/src/builtins/builtins-collections-gen.cc
@@ -22,130 +22,6 @@ namespace internal {
 template <class T>
 using TVariable = compiler::TypedCodeAssemblerVariable<T>;
 
-class BaseCollectionsAssembler : public CodeStubAssembler {
- public:
-  explicit BaseCollectionsAssembler(compiler::CodeAssemblerState* state)
-      : CodeStubAssembler(state) {}
-
-  virtual ~BaseCollectionsAssembler() = default;
-
- protected:
-  enum Variant { kMap, kSet, kWeakMap, kWeakSet };
-
-  // Adds an entry to a collection.  For Maps, properly handles extracting the
-  // key and value from the entry (see LoadKeyValue()).
-  void AddConstructorEntry(Variant variant, TNode<Context> context,
-                           TNode<Object> collection, TNode<Object> add_function,
-                           TNode<Object> key_value,
-                           Label* if_may_have_side_effects = nullptr,
-                           Label* if_exception = nullptr,
-                           TVariable<Object>* var_exception = nullptr);
-
-  // Adds constructor entries to a collection.  Choosing a fast path when
-  // possible.
-  void AddConstructorEntries(Variant variant, TNode<Context> context,
-                             TNode<Context> native_context,
-                             TNode<HeapObject> collection,
-                             TNode<Object> initial_entries);
-
-  // Fast path for adding constructor entries.  Assumes the entries are a fast
-  // JS array (see CodeStubAssembler::BranchIfFastJSArray()).
-  void AddConstructorEntriesFromFastJSArray(Variant variant,
-                                            TNode<Context> context,
-                                            TNode<Context> native_context,
-                                            TNode<Object> collection,
-                                            TNode<JSArray> fast_jsarray,
-                                            Label* if_may_have_side_effects);
-
-  // Adds constructor entries to a collection using the iterator protocol.
-  void AddConstructorEntriesFromIterable(Variant variant,
-                                         TNode<Context> context,
-                                         TNode<Context> native_context,
-                                         TNode<Object> collection,
-                                         TNode<Object> iterable);
-
-  // Constructs a collection instance. Choosing a fast path when possible.
-  TNode<JSObject> AllocateJSCollection(TNode<Context> context,
-                                       TNode<JSFunction> constructor,
-                                       TNode<JSReceiver> new_target);
-
-  // Fast path for constructing a collection instance if the constructor
-  // function has not been modified.
-  TNode<JSObject> AllocateJSCollectionFast(TNode<JSFunction> constructor);
-
-  // Fallback for constructing a collection instance if the constructor function
-  // has been modified.
-  TNode<JSObject> AllocateJSCollectionSlow(TNode<Context> context,
-                                           TNode<JSFunction> constructor,
-                                           TNode<JSReceiver> new_target);
-
-  // Allocates the backing store for a collection.
-  virtual TNode<HeapObject> AllocateTable(
-      Variant variant, TNode<IntPtrT> at_least_space_for) = 0;
-
-  // Main entry point for a collection constructor builtin.
-  void GenerateConstructor(Variant variant,
-                           Handle<String> constructor_function_name,
-                           TNode<Object> new_target, TNode<IntPtrT> argc,
-                           TNode<Context> context);
-
-  // Retrieves the collection function that adds an entry. `set` for Maps and
-  // `add` for Sets.
-  TNode<Object> GetAddFunction(Variant variant, TNode<Context> context,
-                               TNode<Object> collection);
-
-  // Retrieves the collection constructor function.
-  TNode<JSFunction> GetConstructor(Variant variant,
-                                   TNode<Context> native_context);
-
-  // Retrieves the initial collection function that adds an entry. Should only
-  // be called when it is certain that a collection prototype's map hasn't been
-  // changed.
-  TNode<JSFunction> GetInitialAddFunction(Variant variant,
-                                          TNode<Context> native_context);
-
-  // Checks whether {collection}'s initial add/set function has been modified
-  // (depending on {variant}, loaded from {native_context}).
-  void GotoIfInitialAddFunctionModified(Variant variant,
-                                        TNode<NativeContext> native_context,
-                                        TNode<HeapObject> collection,
-                                        Label* if_modified);
-
-  // Gets root index for the name of the add/set function.
-  RootIndex GetAddFunctionNameIndex(Variant variant);
-
-  // Retrieves the offset to access the backing table from the collection.
-  int GetTableOffset(Variant variant);
-
-  // Estimates the number of entries the collection will have after adding the
-  // entries passed in the constructor. AllocateTable() can use this to avoid
-  // the time of growing/rehashing when adding the constructor entries.
-  TNode<IntPtrT> EstimatedInitialSize(TNode<Object> initial_entries,
-                                      TNode<BoolT> is_fast_jsarray);
-
-  void GotoIfCannotBeWeakKey(const TNode<Object> obj,
-                             Label* if_cannot_be_weak_key);
-
-  // Determines whether the collection's prototype has been modified.
-  TNode<BoolT> HasInitialCollectionPrototype(Variant variant,
-                                             TNode<Context> native_context,
-                                             TNode<Object> collection);
-
-  // Gets the initial prototype map for given collection {variant}.
-  TNode<Map> GetInitialCollectionPrototype(Variant variant,
-                                           TNode<Context> native_context);
-
-  // Loads an element from a fixed array.  If the element is the hole, returns
-  // `undefined`.
-  TNode<Object> LoadAndNormalizeFixedArrayElement(TNode<FixedArray> elements,
-                                                  TNode<IntPtrT> index);
-
-  // Loads an element from a fixed double array.  If the element is the hole,
-  // returns `undefined`.
-  TNode<Object> LoadAndNormalizeFixedDoubleArrayElement(
-      TNode<HeapObject> elements, TNode<IntPtrT> index);
-};
-
 void BaseCollectionsAssembler::AddConstructorEntry(
     Variant variant, TNode<Context> context, TNode<Object> collection,
     TNode<Object> add_function, TNode<Object> key_value,
@@ -177,6 +53,9 @@ void BaseCollectionsAssembler::AddConstructorEntries(
       EstimatedInitialSize(initial_entries, use_fast_loop.value());
   Label allocate_table(this, &use_fast_loop), exit(this), fast_loop(this),
       slow_loop(this, Label::kDeferred);
+  TVARIABLE(JSReceiver, var_iterator_object);
+  TVARIABLE(Object, var_exception);
+  Label if_exception(this, Label::kDeferred);
   Goto(&allocate_table);
   BIND(&allocate_table);
   {
@@ -189,6 +68,7 @@ void BaseCollectionsAssembler::AddConstructorEntries(
   }
   BIND(&fast_loop);
   {
+    Label if_exception_during_fast_iteration(this);
     TNode<JSArray> initial_entries_jsarray =
         UncheckedCast<JSArray>(initial_entries);
 #if DEBUG
@@ -198,9 +78,13 @@ void BaseCollectionsAssembler::AddConstructorEntries(
 #endif
 
     Label if_may_have_side_effects(this, Label::kDeferred);
-    AddConstructorEntriesFromFastJSArray(variant, context, native_context,
-                                         collection, initial_entries_jsarray,
-                                         &if_may_have_side_effects);
+    {
+      compiler::ScopedExceptionHandler handler(
+          this, &if_exception_during_fast_iteration, &var_exception);
+      AddConstructorEntriesFromFastJSArray(variant, context, native_context,
+                                           collection, initial_entries_jsarray,
+                                           &if_may_have_side_effects);
+    }
     Goto(&exit);
 
     if (variant == kMap || variant == kWeakMap) {
@@ -222,13 +106,37 @@ void BaseCollectionsAssembler::AddConstructorEntries(
       use_fast_loop = Int32FalseConstant();
       Goto(&allocate_table);
     }
+    BIND(&if_exception_during_fast_iteration);
+    {
+      // In case exception is thrown during collection population, materialize
+      // the iteator and execute iterator closing protocol. It might be
+      // non-trivial in case "return" callback is added somewhere in the
+      // iterator's prototype chain.
+      TNode<NativeContext> native_context = LoadNativeContext(context);
+      var_iterator_object = CreateArrayIterator(
+          native_context, UncheckedCast<JSArray>(initial_entries),
+          IterationKind::kEntries);
+      Goto(&if_exception);
+    }
   }
   BIND(&slow_loop);
   {
-    AddConstructorEntriesFromIterable(variant, context, native_context,
-                                      collection, initial_entries);
+    AddConstructorEntriesFromIterable(
+        variant, context, native_context, collection, initial_entries,
+        &if_exception, &var_iterator_object, &var_exception);
     Goto(&exit);
   }
+  BIND(&if_exception);
+  {
+    TNode<HeapObject> message = GetPendingMessage();
+    SetPendingMessage(TheHoleConstant());
+    // iterator.next field is not used by IteratorCloseOnException.
+    TorqueStructIteratorRecord iterator = {var_iterator_object.value(), {}};
+    IteratorCloseOnException(context, iterator);
+    CallRuntime(Runtime::kReThrowWithMessage, context, var_exception.value(),
+                message);
+    Unreachable();
+  }
   BIND(&exit);
 }
 
@@ -306,20 +214,22 @@ void BaseCollectionsAssembler::AddConstructorEntriesFromFastJSArray(
 
 void BaseCollectionsAssembler::AddConstructorEntriesFromIterable(
     Variant variant, TNode<Context> context, TNode<Context> native_context,
-    TNode<Object> collection, TNode<Object> iterable) {
-  Label exit(this), loop(this), if_exception(this, Label::kDeferred);
+    TNode<Object> collection, TNode<Object> iterable, Label* if_exception,
+    TVariable<JSReceiver>* var_iterator_object,
+    TVariable<Object>* var_exception) {
+  Label exit(this), loop(this);
   CSA_DCHECK(this, Word32BinaryNot(IsNullOrUndefined(iterable)));
 
   TNode<Object> add_func = GetAddFunction(variant, context, collection);
   IteratorBuiltinsAssembler iterator_assembler(this->state());
   TorqueStructIteratorRecord iterator =
       iterator_assembler.GetIterator(context, iterable);
+  *var_iterator_object = iterator.object;
 
   CSA_DCHECK(this, Word32BinaryNot(IsUndefined(iterator.object)));
 
   TNode<Map> fast_iterator_result_map = CAST(
       LoadContextElement(native_context, Context::ITERATOR_RESULT_MAP_INDEX));
-  TVARIABLE(Object, var_exception);
 
   Goto(&loop);
   BIND(&loop);
@@ -329,18 +239,9 @@ void BaseCollectionsAssembler::AddConstructorEntriesFromIterable(
     TNode<Object> next_value = iterator_assembler.IteratorValue(
         context, next, fast_iterator_result_map);
     AddConstructorEntry(variant, context, collection, add_func, next_value,
-                        nullptr, &if_exception, &var_exception);
+                        nullptr, if_exception, var_exception);
     Goto(&loop);
   }
-  BIND(&if_exception);
-  {
-    TNode<HeapObject> message = GetPendingMessage();
-    SetPendingMessage(TheHoleConstant());
-    IteratorCloseOnException(context, iterator);
-    CallRuntime(Runtime::kReThrowWithMessage, context, var_exception.value(),
-                message);
-    Unreachable();
-  }
   BIND(&exit);
 }
 
@@ -523,16 +424,28 @@ TNode<IntPtrT> BaseCollectionsAssembler::EstimatedInitialSize(
       [=] { return IntPtrConstant(0); });
 }
 
-void BaseCollectionsAssembler::GotoIfCannotBeWeakKey(
-    const TNode<Object> obj, Label* if_cannot_be_weak_key) {
-  GotoIf(TaggedIsSmi(obj), if_cannot_be_weak_key);
+// https://tc39.es/proposal-symbols-as-weakmap-keys/#sec-canbeheldweakly-abstract-operation
+void BaseCollectionsAssembler::GotoIfCannotBeHeldWeakly(
+    const TNode<Object> obj, Label* if_cannot_be_held_weakly) {
+  Label check_symbol_key(this);
+  Label end(this);
+  GotoIf(TaggedIsSmi(obj), if_cannot_be_held_weakly);
   TNode<Uint16T> instance_type = LoadMapInstanceType(LoadMap(CAST(obj)));
-  GotoIfNot(IsJSReceiverInstanceType(instance_type), if_cannot_be_weak_key);
+  GotoIfNot(IsJSReceiverInstanceType(instance_type), &check_symbol_key);
   // TODO(v8:12547) Shared structs and arrays should only be able to point
   // to shared values in weak collections. For now, disallow them as weak
   // collection keys.
-  GotoIf(IsJSSharedStructInstanceType(instance_type), if_cannot_be_weak_key);
-  GotoIf(IsJSSharedArrayInstanceType(instance_type), if_cannot_be_weak_key);
+  GotoIf(IsJSSharedStructInstanceType(instance_type), if_cannot_be_held_weakly);
+  GotoIf(IsJSSharedArrayInstanceType(instance_type), if_cannot_be_held_weakly);
+  Goto(&end);
+  Bind(&check_symbol_key);
+  GotoIfNot(HasHarmonySymbolAsWeakmapKeyFlag(), if_cannot_be_held_weakly);
+  GotoIfNot(IsSymbolInstanceType(instance_type), if_cannot_be_held_weakly);
+  TNode<Uint32T> flags = LoadSymbolFlags(CAST(obj));
+  GotoIf(Word32And(flags, Symbol::IsInPublicSymbolTableBit::kMask),
+         if_cannot_be_held_weakly);
+  Goto(&end);
+  Bind(&end);
 }
 
 TNode<Map> BaseCollectionsAssembler::GetInitialCollectionPrototype(
@@ -2414,67 +2327,6 @@ TF_BUILTIN(FindOrderedHashSetEntry, CollectionsBuiltinsAssembler) {
   Return(SmiConstant(-1));
 }
 
-class WeakCollectionsBuiltinsAssembler : public BaseCollectionsAssembler {
- public:
-  explicit WeakCollectionsBuiltinsAssembler(compiler::CodeAssemblerState* state)
-      : BaseCollectionsAssembler(state) {}
-
- protected:
-  void AddEntry(TNode<EphemeronHashTable> table, TNode<IntPtrT> key_index,
-                TNode<Object> key, TNode<Object> value,
-                TNode<IntPtrT> number_of_elements);
-
-  TNode<HeapObject> AllocateTable(Variant variant,
-                                  TNode<IntPtrT> at_least_space_for) override;
-
-  // Generates and sets the identity for a JSRececiver.
-  TNode<Smi> CreateIdentityHash(TNode<Object> receiver);
-  TNode<IntPtrT> EntryMask(TNode<IntPtrT> capacity);
-
-  // Builds code that finds the EphemeronHashTable entry for a {key} using the
-  // comparison code generated by {key_compare}. The key index is returned if
-  // the {key} is found.
-  using KeyComparator =
-      std::function<void(TNode<Object> entry_key, Label* if_same)>;
-  TNode<IntPtrT> FindKeyIndex(TNode<HeapObject> table, TNode<IntPtrT> key_hash,
-                              TNode<IntPtrT> entry_mask,
-                              const KeyComparator& key_compare);
-
-  // Builds code that finds an EphemeronHashTable entry available for a new
-  // entry.
-  TNode<IntPtrT> FindKeyIndexForInsertion(TNode<HeapObject> table,
-                                          TNode<IntPtrT> key_hash,
-                                          TNode<IntPtrT> entry_mask);
-
-  // Builds code that finds the EphemeronHashTable entry with key that matches
-  // {key} and returns the entry's key index. If {key} cannot be found, jumps to
-  // {if_not_found}.
-  TNode<IntPtrT> FindKeyIndexForKey(TNode<HeapObject> table, TNode<Object> key,
-                                    TNode<IntPtrT> hash,
-                                    TNode<IntPtrT> entry_mask,
-                                    Label* if_not_found);
-
-  TNode<Word32T> InsufficientCapacityToAdd(TNode<IntPtrT> capacity,
-                                           TNode<IntPtrT> number_of_elements,
-                                           TNode<IntPtrT> number_of_deleted);
-  TNode<IntPtrT> KeyIndexFromEntry(TNode<IntPtrT> entry);
-
-  TNode<IntPtrT> LoadNumberOfElements(TNode<EphemeronHashTable> table,
-                                      int offset);
-  TNode<IntPtrT> LoadNumberOfDeleted(TNode<EphemeronHashTable> table,
-                                     int offset = 0);
-  TNode<EphemeronHashTable> LoadTable(TNode<JSWeakCollection> collection);
-  TNode<IntPtrT> LoadTableCapacity(TNode<EphemeronHashTable> table);
-
-  void RemoveEntry(TNode<EphemeronHashTable> table, TNode<IntPtrT> key_index,
-                   TNode<IntPtrT> number_of_elements);
-  TNode<BoolT> ShouldRehash(TNode<IntPtrT> number_of_elements,
-                            TNode<IntPtrT> number_of_deleted);
-  TNode<Word32T> ShouldShrink(TNode<IntPtrT> capacity,
-                              TNode<IntPtrT> number_of_elements);
-  TNode<IntPtrT> ValueIndexFromKeyIndex(TNode<IntPtrT> key_index);
-};
-
 void WeakCollectionsBuiltinsAssembler::AddEntry(
     TNode<EphemeronHashTable> table, TNode<IntPtrT> key_index,
     TNode<Object> key, TNode<Object> value, TNode<IntPtrT> number_of_elements) {
@@ -2490,6 +2342,25 @@ void WeakCollectionsBuiltinsAssembler::AddEntry(
                                SmiFromIntPtr(number_of_elements));
 }
 
+TNode<IntPtrT> WeakCollectionsBuiltinsAssembler::GetHash(
+    const TNode<HeapObject> key, Label* if_no_hash) {
+  TVARIABLE(IntPtrT, var_hash);
+  Label if_symbol(this);
+  Label return_result(this);
+  GotoIfNot(IsJSReceiver(key), &if_symbol);
+  var_hash = LoadJSReceiverIdentityHash(CAST(key), if_no_hash);
+  Goto(&return_result);
+  Bind(&if_symbol);
+  CSA_DCHECK(this, IsSymbol(key));
+  CSA_DCHECK(this, Word32BinaryNot(
+                       Word32And(LoadSymbolFlags(CAST(key)),
+                                 Symbol::IsInPublicSymbolTableBit::kMask)));
+  var_hash = ChangeInt32ToIntPtr(LoadNameHash(CAST(key), nullptr));
+  Goto(&return_result);
+  Bind(&return_result);
+  return var_hash.value();
+}
+
 TNode<HeapObject> WeakCollectionsBuiltinsAssembler::AllocateTable(
     Variant variant, TNode<IntPtrT> at_least_space_for) {
   // See HashTable::New().
@@ -2715,18 +2586,17 @@ TF_BUILTIN(WeakMapLookupHashIndex, WeakCollectionsBuiltinsAssembler) {
   auto table = Parameter<EphemeronHashTable>(Descriptor::kTable);
   auto key = Parameter<Object>(Descriptor::kKey);
 
-  Label if_cannot_be_weak_key(this);
+  Label if_cannot_be_held_weakly(this);
 
-  GotoIfCannotBeWeakKey(key, &if_cannot_be_weak_key);
+  GotoIfCannotBeHeldWeakly(key, &if_cannot_be_held_weakly);
 
-  TNode<IntPtrT> hash =
-      LoadJSReceiverIdentityHash(CAST(key), &if_cannot_be_weak_key);
+  TNode<IntPtrT> hash = GetHash(CAST(key), &if_cannot_be_held_weakly);
   TNode<IntPtrT> capacity = LoadTableCapacity(table);
   TNode<IntPtrT> key_index = FindKeyIndexForKey(
-      table, key, hash, EntryMask(capacity), &if_cannot_be_weak_key);
+      table, key, hash, EntryMask(capacity), &if_cannot_be_held_weakly);
   Return(SmiTag(ValueIndexFromKeyIndex(key_index)));
 
-  BIND(&if_cannot_be_weak_key);
+  BIND(&if_cannot_be_held_weakly);
   Return(SmiConstant(-1));
 }
 
@@ -2781,23 +2651,22 @@ TF_BUILTIN(WeakCollectionDelete, WeakCollectionsBuiltinsAssembler) {
   auto collection = Parameter<JSWeakCollection>(Descriptor::kCollection);
   auto key = Parameter<Object>(Descriptor::kKey);
 
-  Label call_runtime(this), if_cannot_be_weak_key(this);
+  Label call_runtime(this), if_cannot_be_held_weakly(this);
 
-  GotoIfCannotBeWeakKey(key, &if_cannot_be_weak_key);
+  GotoIfCannotBeHeldWeakly(key, &if_cannot_be_held_weakly);
 
-  TNode<IntPtrT> hash =
-      LoadJSReceiverIdentityHash(CAST(key), &if_cannot_be_weak_key);
+  TNode<IntPtrT> hash = GetHash(CAST(key), &if_cannot_be_held_weakly);
   TNode<EphemeronHashTable> table = LoadTable(collection);
   TNode<IntPtrT> capacity = LoadTableCapacity(table);
   TNode<IntPtrT> key_index = FindKeyIndexForKey(
-      table, key, hash, EntryMask(capacity), &if_cannot_be_weak_key);
+      table, key, hash, EntryMask(capacity), &if_cannot_be_held_weakly);
   TNode<IntPtrT> number_of_elements = LoadNumberOfElements(table, -1);
   GotoIf(ShouldShrink(capacity, number_of_elements), &call_runtime);
 
   RemoveEntry(table, key_index, number_of_elements);
   Return(TrueConstant());
 
-  BIND(&if_cannot_be_weak_key);
+  BIND(&if_cannot_be_held_weakly);
   Return(FalseConstant());
 
   BIND(&call_runtime);
@@ -2810,10 +2679,10 @@ TF_BUILTIN(WeakCollectionDelete, WeakCollectionsBuiltinsAssembler) {
 TF_BUILTIN(WeakCollectionSet, WeakCollectionsBuiltinsAssembler) {
   auto context = Parameter<Context>(Descriptor::kContext);
   auto collection = Parameter<JSWeakCollection>(Descriptor::kCollection);
-  auto key = Parameter<JSReceiver>(Descriptor::kKey);
+  auto key = Parameter<HeapObject>(Descriptor::kKey);
   auto value = Parameter<Object>(Descriptor::kValue);
 
-  CSA_DCHECK(this, IsJSReceiver(key));
+  CSA_DCHECK(this, Word32Or(IsJSReceiver(key), IsSymbol(key)));
 
   Label call_runtime(this), if_no_hash(this), if_not_found(this);
 
@@ -2821,7 +2690,7 @@ TF_BUILTIN(WeakCollectionSet, WeakCollectionsBuiltinsAssembler) {
   TNode<IntPtrT> capacity = LoadTableCapacity(table);
   TNode<IntPtrT> entry_mask = EntryMask(capacity);
 
-  TVARIABLE(IntPtrT, var_hash, LoadJSReceiverIdentityHash(key, &if_no_hash));
+  TVARIABLE(IntPtrT, var_hash, GetHash(key, &if_no_hash));
   TNode<IntPtrT> key_index = FindKeyIndexForKey(table, key, var_hash.value(),
                                                 entry_mask, &if_not_found);
 
@@ -2830,6 +2699,7 @@ TF_BUILTIN(WeakCollectionSet, WeakCollectionsBuiltinsAssembler) {
 
   BIND(&if_no_hash);
   {
+    CSA_DCHECK(this, IsJSReceiver(key));
     var_hash = SmiUntag(CreateIdentityHash(key));
     Goto(&if_not_found);
   }
@@ -2881,7 +2751,7 @@ TF_BUILTIN(WeakMapPrototypeSet, WeakCollectionsBuiltinsAssembler) {
                          "WeakMap.prototype.set");
 
   Label throw_invalid_key(this);
-  GotoIfCannotBeWeakKey(key, &throw_invalid_key);
+  GotoIfCannotBeHeldWeakly(key, &throw_invalid_key);
 
   Return(
       CallBuiltin(Builtin::kWeakCollectionSet, context, receiver, key, value));
@@ -2899,7 +2769,7 @@ TF_BUILTIN(WeakSetPrototypeAdd, WeakCollectionsBuiltinsAssembler) {
                          "WeakSet.prototype.add");
 
   Label throw_invalid_value(this);
-  GotoIfCannotBeWeakKey(value, &throw_invalid_value);
+  GotoIfCannotBeHeldWeakly(value, &throw_invalid_value);
 
   Return(CallBuiltin(Builtin::kWeakCollectionSet, context, receiver, value,
                      TrueConstant()));
diff --git a/deps/v8/src/builtins/builtins-collections-gen.h b/deps/v8/src/builtins/builtins-collections-gen.h
index a132557e3cd0a4..6dd2381ddd3743 100644
--- a/deps/v8/src/builtins/builtins-collections-gen.h
+++ b/deps/v8/src/builtins/builtins-collections-gen.h
@@ -20,6 +20,191 @@ void BranchIfIterableWithOriginalValueSetIterator(
     TNode<Context> context, compiler::CodeAssemblerLabel* if_true,
     compiler::CodeAssemblerLabel* if_false);
 
+class BaseCollectionsAssembler : public CodeStubAssembler {
+ public:
+  explicit BaseCollectionsAssembler(compiler::CodeAssemblerState* state)
+      : CodeStubAssembler(state) {}
+
+  virtual ~BaseCollectionsAssembler() = default;
+
+  void GotoIfCannotBeHeldWeakly(const TNode<Object> obj,
+                                Label* if_cannot_be_held_weakly);
+
+ protected:
+  enum Variant { kMap, kSet, kWeakMap, kWeakSet };
+
+  // Adds an entry to a collection.  For Maps, properly handles extracting the
+  // key and value from the entry (see LoadKeyValue()).
+  void AddConstructorEntry(Variant variant, TNode<Context> context,
+                           TNode<Object> collection, TNode<Object> add_function,
+                           TNode<Object> key_value,
+                           Label* if_may_have_side_effects = nullptr,
+                           Label* if_exception = nullptr,
+                           TVariable<Object>* var_exception = nullptr);
+
+  // Adds constructor entries to a collection.  Choosing a fast path when
+  // possible.
+  void AddConstructorEntries(Variant variant, TNode<Context> context,
+                             TNode<Context> native_context,
+                             TNode<HeapObject> collection,
+                             TNode<Object> initial_entries);
+
+  // Fast path for adding constructor entries.  Assumes the entries are a fast
+  // JS array (see CodeStubAssembler::BranchIfFastJSArray()).
+  void AddConstructorEntriesFromFastJSArray(Variant variant,
+                                            TNode<Context> context,
+                                            TNode<Context> native_context,
+                                            TNode<Object> collection,
+                                            TNode<JSArray> fast_jsarray,
+                                            Label* if_may_have_side_effects);
+
+  // Adds constructor entries to a collection using the iterator protocol.
+  void AddConstructorEntriesFromIterable(
+      Variant variant, TNode<Context> context, TNode<Context> native_context,
+      TNode<Object> collection, TNode<Object> iterable, Label* if_exception,
+      TVariable<JSReceiver>* var_iterator, TVariable<Object>* var_exception);
+
+  // Constructs a collection instance. Choosing a fast path when possible.
+  TNode<JSObject> AllocateJSCollection(TNode<Context> context,
+                                       TNode<JSFunction> constructor,
+                                       TNode<JSReceiver> new_target);
+
+  // Fast path for constructing a collection instance if the constructor
+  // function has not been modified.
+  TNode<JSObject> AllocateJSCollectionFast(TNode<JSFunction> constructor);
+
+  // Fallback for constructing a collection instance if the constructor function
+  // has been modified.
+  TNode<JSObject> AllocateJSCollectionSlow(TNode<Context> context,
+                                           TNode<JSFunction> constructor,
+                                           TNode<JSReceiver> new_target);
+
+  // Allocates the backing store for a collection.
+  virtual TNode<HeapObject> AllocateTable(
+      Variant variant, TNode<IntPtrT> at_least_space_for) = 0;
+
+  // Main entry point for a collection constructor builtin.
+  void GenerateConstructor(Variant variant,
+                           Handle<String> constructor_function_name,
+                           TNode<Object> new_target, TNode<IntPtrT> argc,
+                           TNode<Context> context);
+
+  // Retrieves the collection function that adds an entry. `set` for Maps and
+  // `add` for Sets.
+  TNode<Object> GetAddFunction(Variant variant, TNode<Context> context,
+                               TNode<Object> collection);
+
+  // Retrieves the collection constructor function.
+  TNode<JSFunction> GetConstructor(Variant variant,
+                                   TNode<Context> native_context);
+
+  // Retrieves the initial collection function that adds an entry. Should only
+  // be called when it is certain that a collection prototype's map hasn't been
+  // changed.
+  TNode<JSFunction> GetInitialAddFunction(Variant variant,
+                                          TNode<Context> native_context);
+
+  // Checks whether {collection}'s initial add/set function has been modified
+  // (depending on {variant}, loaded from {native_context}).
+  void GotoIfInitialAddFunctionModified(Variant variant,
+                                        TNode<NativeContext> native_context,
+                                        TNode<HeapObject> collection,
+                                        Label* if_modified);
+
+  // Gets root index for the name of the add/set function.
+  RootIndex GetAddFunctionNameIndex(Variant variant);
+
+  // Retrieves the offset to access the backing table from the collection.
+  int GetTableOffset(Variant variant);
+
+  // Estimates the number of entries the collection will have after adding the
+  // entries passed in the constructor. AllocateTable() can use this to avoid
+  // the time of growing/rehashing when adding the constructor entries.
+  TNode<IntPtrT> EstimatedInitialSize(TNode<Object> initial_entries,
+                                      TNode<BoolT> is_fast_jsarray);
+
+  // Determines whether the collection's prototype has been modified.
+  TNode<BoolT> HasInitialCollectionPrototype(Variant variant,
+                                             TNode<Context> native_context,
+                                             TNode<Object> collection);
+
+  // Gets the initial prototype map for given collection {variant}.
+  TNode<Map> GetInitialCollectionPrototype(Variant variant,
+                                           TNode<Context> native_context);
+
+  // Loads an element from a fixed array.  If the element is the hole, returns
+  // `undefined`.
+  TNode<Object> LoadAndNormalizeFixedArrayElement(TNode<FixedArray> elements,
+                                                  TNode<IntPtrT> index);
+
+  // Loads an element from a fixed double array.  If the element is the hole,
+  // returns `undefined`.
+  TNode<Object> LoadAndNormalizeFixedDoubleArrayElement(
+      TNode<HeapObject> elements, TNode<IntPtrT> index);
+};
+
+class WeakCollectionsBuiltinsAssembler : public BaseCollectionsAssembler {
+ public:
+  explicit WeakCollectionsBuiltinsAssembler(compiler::CodeAssemblerState* state)
+      : BaseCollectionsAssembler(state) {}
+
+ protected:
+  void AddEntry(TNode<EphemeronHashTable> table, TNode<IntPtrT> key_index,
+                TNode<Object> key, TNode<Object> value,
+                TNode<IntPtrT> number_of_elements);
+
+  TNode<HeapObject> AllocateTable(Variant variant,
+                                  TNode<IntPtrT> at_least_space_for) override;
+
+  TNode<IntPtrT> GetHash(const TNode<HeapObject> key, Label* if_no_hash);
+  // Generates and sets the identity for a JSRececiver.
+  TNode<Smi> CreateIdentityHash(TNode<Object> receiver);
+  TNode<IntPtrT> EntryMask(TNode<IntPtrT> capacity);
+
+  // Builds code that finds the EphemeronHashTable entry for a {key} using the
+  // comparison code generated by {key_compare}. The key index is returned if
+  // the {key} is found.
+  using KeyComparator =
+      std::function<void(TNode<Object> entry_key, Label* if_same)>;
+  TNode<IntPtrT> FindKeyIndex(TNode<HeapObject> table, TNode<IntPtrT> key_hash,
+                              TNode<IntPtrT> entry_mask,
+                              const KeyComparator& key_compare);
+
+  // Builds code that finds an EphemeronHashTable entry available for a new
+  // entry.
+  TNode<IntPtrT> FindKeyIndexForInsertion(TNode<HeapObject> table,
+                                          TNode<IntPtrT> key_hash,
+                                          TNode<IntPtrT> entry_mask);
+
+  // Builds code that finds the EphemeronHashTable entry with key that matches
+  // {key} and returns the entry's key index. If {key} cannot be found, jumps to
+  // {if_not_found}.
+  TNode<IntPtrT> FindKeyIndexForKey(TNode<HeapObject> table, TNode<Object> key,
+                                    TNode<IntPtrT> hash,
+                                    TNode<IntPtrT> entry_mask,
+                                    Label* if_not_found);
+
+  TNode<Word32T> InsufficientCapacityToAdd(TNode<IntPtrT> capacity,
+                                           TNode<IntPtrT> number_of_elements,
+                                           TNode<IntPtrT> number_of_deleted);
+  TNode<IntPtrT> KeyIndexFromEntry(TNode<IntPtrT> entry);
+
+  TNode<IntPtrT> LoadNumberOfElements(TNode<EphemeronHashTable> table,
+                                      int offset);
+  TNode<IntPtrT> LoadNumberOfDeleted(TNode<EphemeronHashTable> table,
+                                     int offset = 0);
+  TNode<EphemeronHashTable> LoadTable(TNode<JSWeakCollection> collection);
+  TNode<IntPtrT> LoadTableCapacity(TNode<EphemeronHashTable> table);
+
+  void RemoveEntry(TNode<EphemeronHashTable> table, TNode<IntPtrT> key_index,
+                   TNode<IntPtrT> number_of_elements);
+  TNode<BoolT> ShouldRehash(TNode<IntPtrT> number_of_elements,
+                            TNode<IntPtrT> number_of_deleted);
+  TNode<Word32T> ShouldShrink(TNode<IntPtrT> capacity,
+                              TNode<IntPtrT> number_of_elements);
+  TNode<IntPtrT> ValueIndexFromKeyIndex(TNode<IntPtrT> key_index);
+};
+
 }  // namespace internal
 }  // namespace v8
 
diff --git a/deps/v8/src/builtins/builtins-constructor-gen.cc b/deps/v8/src/builtins/builtins-constructor-gen.cc
index bbc12a5b650a79..cb2b79bef7ce72 100644
--- a/deps/v8/src/builtins/builtins-constructor-gen.cc
+++ b/deps/v8/src/builtins/builtins-constructor-gen.cc
@@ -596,13 +596,16 @@ TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral(
   static_assert(JSObject::kMaxInstanceSize < kMaxRegularHeapObjectSize);
   TNode<IntPtrT> instance_size =
       TimesTaggedSize(LoadMapInstanceSizeInWords(boilerplate_map));
+  TNode<IntPtrT> aligned_instance_size =
+      AlignToAllocationAlignment(instance_size);
   TNode<IntPtrT> allocation_size = instance_size;
   bool needs_allocation_memento = v8_flags.allocation_site_pretenuring;
   if (needs_allocation_memento) {
     DCHECK(V8_ALLOCATION_SITE_TRACKING_BOOL);
     // Prepare for inner-allocating the AllocationMemento.
-    allocation_size =
-        IntPtrAdd(instance_size, IntPtrConstant(AllocationMemento::kSize));
+    allocation_size = IntPtrAdd(aligned_instance_size,
+                                IntPtrConstant(ALIGN_TO_ALLOCATION_ALIGNMENT(
+                                    AllocationMemento::kSize)));
   }
 
   TNode<HeapObject> copy =
@@ -620,7 +623,7 @@ TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral(
   // Initialize the AllocationMemento before potential GCs due to heap number
   // allocation when copying the in-object properties.
   if (needs_allocation_memento) {
-    InitializeAllocationMemento(copy, instance_size, allocation_site);
+    InitializeAllocationMemento(copy, aligned_instance_size, allocation_site);
   }
 
   {
diff --git a/deps/v8/src/builtins/builtins-dataview.cc b/deps/v8/src/builtins/builtins-dataview.cc
index 6bdc561361a06a..8f3f789e0c32d4 100644
--- a/deps/v8/src/builtins/builtins-dataview.cc
+++ b/deps/v8/src/builtins/builtins-dataview.cc
@@ -75,7 +75,7 @@ BUILTIN(DataViewConstructor) {
   bool length_tracking = false;
   if (byte_length->IsUndefined(isolate)) {
     view_byte_length = buffer_byte_length - view_byte_offset;
-    length_tracking = array_buffer->is_resizable();
+    length_tracking = array_buffer->is_resizable_by_js();
   } else {
     // 11. Else,
     //       a. Set byteLengthChecked be ? ToIndex(byteLength).
@@ -113,7 +113,7 @@ BUILTIN(DataViewConstructor) {
       raw.SetEmbedderField(i, Smi::zero());
     }
     raw.set_bit_field(0);
-    raw.set_is_backed_by_rab(array_buffer->is_resizable() &&
+    raw.set_is_backed_by_rab(array_buffer->is_resizable_by_js() &&
                              !array_buffer->is_shared());
     raw.set_is_length_tracking(length_tracking);
     raw.set_byte_length(0);
diff --git a/deps/v8/src/builtins/builtins-definitions.h b/deps/v8/src/builtins/builtins-definitions.h
index 175acbd49588ed..c656b02e75566c 100644
--- a/deps/v8/src/builtins/builtins-definitions.h
+++ b/deps/v8/src/builtins/builtins-definitions.h
@@ -198,6 +198,7 @@ namespace internal {
                                                                                \
   /* Maglev Compiler */                                                        \
   ASM(MaglevOnStackReplacement, OnStackReplacement)                            \
+  ASM(MaglevOutOfLinePrologue, NoContext)                                      \
                                                                                \
   /* Code life-cycle */                                                        \
   TFC(CompileLazy, JSTrampoline)                                               \
@@ -619,6 +620,8 @@ namespace internal {
   /* JSON */                                                                   \
   CPP(JsonParse)                                                               \
   CPP(JsonStringify)                                                           \
+  CPP(JsonRawJson)                                                             \
+  CPP(JsonIsRawJson)                                                           \
                                                                                \
   /* Web snapshots */                                                          \
   CPP(WebSnapshotSerialize)                                                    \
@@ -1021,7 +1024,7 @@ namespace internal {
                                                                                \
   TFS(AsyncGeneratorResolve, kGenerator, kValue, kDone)                        \
   TFS(AsyncGeneratorReject, kGenerator, kValue)                                \
-  TFS(AsyncGeneratorYield, kGenerator, kValue, kIsCaught)                      \
+  TFS(AsyncGeneratorYieldWithAwait, kGenerator, kValue, kIsCaught)             \
   TFS(AsyncGeneratorReturn, kGenerator, kValue, kIsCaught)                     \
   TFS(AsyncGeneratorResumeNext, kGenerator)                                    \
                                                                                \
@@ -1046,8 +1049,8 @@ namespace internal {
       kValue)                                                                  \
   TFJ(AsyncGeneratorAwaitRejectClosure, kJSArgcReceiverSlots + 1, kReceiver,   \
       kValue)                                                                  \
-  TFJ(AsyncGeneratorYieldResolveClosure, kJSArgcReceiverSlots + 1, kReceiver,  \
-      kValue)                                                                  \
+  TFJ(AsyncGeneratorYieldWithAwaitResolveClosure, kJSArgcReceiverSlots + 1,    \
+      kReceiver, kValue)                                                       \
   TFJ(AsyncGeneratorReturnClosedResolveClosure, kJSArgcReceiverSlots + 1,      \
       kReceiver, kValue)                                                       \
   TFJ(AsyncGeneratorReturnClosedRejectClosure, kJSArgcReceiverSlots + 1,       \
@@ -1094,7 +1097,8 @@ namespace internal {
   TFS(CreateDataProperty, kReceiver, kKey, kValue)                             \
   ASM(MemCopyUint8Uint8, CCall)                                                \
   ASM(MemMove, CCall)                                                          \
-  TFC(FindNonDefaultConstructor, FindNonDefaultConstructor)                    \
+  TFC(FindNonDefaultConstructorOrConstruct,                                    \
+      FindNonDefaultConstructorOrConstruct)                                    \
                                                                                \
   /* Trace */                                                                  \
   CPP(IsTraceCategoryEnabled)                                                  \
@@ -1750,6 +1754,16 @@ namespace internal {
   CPP(DisplayNamesPrototypeResolvedOptions)                            \
   /* ecma402 #sec-Intl.DisplayNames.supportedLocalesOf */              \
   CPP(DisplayNamesSupportedLocalesOf)                                  \
+  /* ecma402 #sec-intl-durationformat-constructor */                   \
+  CPP(DurationFormatConstructor)                                       \
+  /* ecma402 #sec-Intl.DurationFormat.prototype.format */              \
+  CPP(DurationFormatPrototypeFormat)                                   \
+  /* ecma402 #sec-Intl.DurationFormat.prototype.formatToParts */       \
+  CPP(DurationFormatPrototypeFormatToParts)                            \
+  /* ecma402 #sec-Intl.DurationFormat.prototype.resolvedOptions */     \
+  CPP(DurationFormatPrototypeResolvedOptions)                          \
+  /* ecma402 #sec-Intl.DurationFormat.supportedLocalesOf */            \
+  CPP(DurationFormatSupportedLocalesOf)                                \
   /* ecma402 #sec-intl.getcanonicallocales */                          \
   CPP(IntlGetCanonicalLocales)                                         \
   /* ecma402 #sec-intl.supportedvaluesof */                            \
diff --git a/deps/v8/src/builtins/builtins-internal-gen.cc b/deps/v8/src/builtins/builtins-internal-gen.cc
index eb7790d3fc4d1e..907b41e8da641d 100644
--- a/deps/v8/src/builtins/builtins-internal-gen.cc
+++ b/deps/v8/src/builtins/builtins-internal-gen.cc
@@ -1305,10 +1305,17 @@ void Builtins::Generate_BaselineOnStackReplacement(MacroAssembler* masm) {
 // architectures.
 #ifndef V8_TARGET_ARCH_X64
 void Builtins::Generate_MaglevOnStackReplacement(MacroAssembler* masm) {
-  using D = OnStackReplacementDescriptor;
+  using D =
+      i::CallInterfaceDescriptorFor<Builtin::kMaglevOnStackReplacement>::type;
   static_assert(D::kParameterCount == 1);
   masm->Trap();
 }
+void Builtins::Generate_MaglevOutOfLinePrologue(MacroAssembler* masm) {
+  using D =
+      i::CallInterfaceDescriptorFor<Builtin::kMaglevOutOfLinePrologue>::type;
+  static_assert(D::kParameterCount == 0);
+  masm->Trap();
+}
 #endif  // V8_TARGET_ARCH_X64
 
 // ES6 [[Get]] operation.
@@ -1502,7 +1509,7 @@ TF_BUILTIN(InstantiateAsmJs, CodeStubAssembler) {
   TailCallJSCode(code, context, function, new_target, arg_count);
 }
 
-TF_BUILTIN(FindNonDefaultConstructor, CodeStubAssembler) {
+TF_BUILTIN(FindNonDefaultConstructorOrConstruct, CodeStubAssembler) {
   auto this_function = Parameter<JSFunction>(Descriptor::kThisFunction);
   auto new_target = Parameter<Object>(Descriptor::kNewTarget);
   auto context = Parameter<Context>(Descriptor::kContext);
@@ -1511,8 +1518,9 @@ TF_BUILTIN(FindNonDefaultConstructor, CodeStubAssembler) {
   Label found_default_base_ctor(this, &constructor),
       found_something_else(this, &constructor);
 
-  FindNonDefaultConstructor(context, this_function, constructor,
-                            &found_default_base_ctor, &found_something_else);
+  FindNonDefaultConstructorOrConstruct(context, this_function, constructor,
+                                       &found_default_base_ctor,
+                                       &found_something_else);
 
   BIND(&found_default_base_ctor);
   {
diff --git a/deps/v8/src/builtins/builtins-intl.cc b/deps/v8/src/builtins/builtins-intl.cc
index 452e55120742c9..0410c3ef91fe38 100644
--- a/deps/v8/src/builtins/builtins-intl.cc
+++ b/deps/v8/src/builtins/builtins-intl.cc
@@ -21,6 +21,7 @@
 #include "src/objects/js-collator-inl.h"
 #include "src/objects/js-date-time-format-inl.h"
 #include "src/objects/js-display-names-inl.h"
+#include "src/objects/js-duration-format-inl.h"
 #include "src/objects/js-list-format-inl.h"
 #include "src/objects/js-locale-inl.h"
 #include "src/objects/js-number-format-inl.h"
@@ -383,6 +384,51 @@ BUILTIN(DisplayNamesPrototypeOf) {
                            JSDisplayNames::Of(isolate, holder, code_obj));
 }
 
+// Intl.DurationFormat
+BUILTIN(DurationFormatConstructor) {
+  HandleScope scope(isolate);
+
+  return DisallowCallConstructor<JSDurationFormat>(
+      args, isolate, v8::Isolate::UseCounterFeature::kDurationFormat,
+      "Intl.DurationFormat");
+}
+
+BUILTIN(DurationFormatPrototypeResolvedOptions) {
+  HandleScope scope(isolate);
+  CHECK_RECEIVER(JSDurationFormat, holder,
+                 "Intl.DurationFormat.prototype.resolvedOptions");
+  return *JSDurationFormat::ResolvedOptions(isolate, holder);
+}
+
+BUILTIN(DurationFormatSupportedLocalesOf) {
+  HandleScope scope(isolate);
+  Handle<Object> locales = args.atOrUndefined(isolate, 1);
+  Handle<Object> options = args.atOrUndefined(isolate, 2);
+
+  RETURN_RESULT_OR_FAILURE(
+      isolate, Intl::SupportedLocalesOf(
+                   isolate, "Intl.DurationFormat.supportedLocalesOf",
+                   JSDurationFormat::GetAvailableLocales(), locales, options));
+}
+
+BUILTIN(DurationFormatPrototypeFormat) {
+  HandleScope scope(isolate);
+  CHECK_RECEIVER(JSDurationFormat, holder,
+                 "Intl.DurationFormat.prototype.format");
+  Handle<Object> value = args.atOrUndefined(isolate, 1);
+  RETURN_RESULT_OR_FAILURE(isolate,
+                           JSDurationFormat::Format(isolate, holder, value));
+}
+
+BUILTIN(DurationFormatPrototypeFormatToParts) {
+  HandleScope scope(isolate);
+  CHECK_RECEIVER(JSDurationFormat, holder,
+                 "Intl.DurationFormat.prototype.formatToParts");
+  Handle<Object> value = args.atOrUndefined(isolate, 1);
+  RETURN_RESULT_OR_FAILURE(
+      isolate, JSDurationFormat::FormatToParts(isolate, holder, value));
+}
+
 // Intl.NumberFormat
 
 BUILTIN(NumberFormatConstructor) {
diff --git a/deps/v8/src/builtins/builtins-json.cc b/deps/v8/src/builtins/builtins-json.cc
index 896a45389c4abd..5ac1cd2bfc57e8 100644
--- a/deps/v8/src/builtins/builtins-json.cc
+++ b/deps/v8/src/builtins/builtins-json.cc
@@ -7,6 +7,7 @@
 #include "src/json/json-parser.h"
 #include "src/json/json-stringifier.h"
 #include "src/logging/counters.h"
+#include "src/objects/js-raw-json.h"
 #include "src/objects/objects-inl.h"
 
 namespace v8 {
@@ -37,5 +38,19 @@ BUILTIN(JsonStringify) {
                            JsonStringify(isolate, object, replacer, indent));
 }
 
+// https://tc39.es/proposal-json-parse-with-source/#sec-json.rawjson
+BUILTIN(JsonRawJson) {
+  HandleScope scope(isolate);
+  Handle<Object> text = args.atOrUndefined(isolate, 1);
+  RETURN_RESULT_OR_FAILURE(isolate, JSRawJson::Create(isolate, text));
+}
+
+// https://tc39.es/proposal-json-parse-with-source/#sec-json.israwjson
+BUILTIN(JsonIsRawJson) {
+  HandleScope scope(isolate);
+  Handle<Object> text = args.atOrUndefined(isolate, 1);
+  return isolate->heap()->ToBoolean(text->IsJSRawJson());
+}
+
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/builtins/builtins-object.cc b/deps/v8/src/builtins/builtins-object.cc
index d636801ad6b576..e6d26ef7c75f33 100644
--- a/deps/v8/src/builtins/builtins-object.cc
+++ b/deps/v8/src/builtins/builtins-object.cc
@@ -4,10 +4,9 @@
 
 #include "src/builtins/builtins-utils-inl.h"
 #include "src/builtins/builtins.h"
-#include "src/codegen/code-factory.h"
 #include "src/common/message-template.h"
+#include "src/execution/isolate.h"
 #include "src/heap/heap-inl.h"  // For ToBoolean. TODO(jkummerow): Drop.
-#include "src/logging/counters.h"
 #include "src/objects/keys.h"
 #include "src/objects/lookup.h"
 #include "src/objects/objects-inl.h"
@@ -150,6 +149,10 @@ Object ObjectLookupAccessor(Isolate* isolate, Handle<Object> object,
         return ObjectLookupAccessor(isolate, prototype, key, component);
       }
 
+      case LookupIterator::WASM_OBJECT:
+        THROW_NEW_ERROR_RETURN_FAILURE(
+            isolate, NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
+
       case LookupIterator::INTEGER_INDEXED_EXOTIC:
       case LookupIterator::DATA:
         return ReadOnlyRoots(isolate).undefined_value();
diff --git a/deps/v8/src/builtins/builtins-regexp-gen.h b/deps/v8/src/builtins/builtins-regexp-gen.h
index ef606463143a6d..f89449356116f4 100644
--- a/deps/v8/src/builtins/builtins-regexp-gen.h
+++ b/deps/v8/src/builtins/builtins-regexp-gen.h
@@ -138,6 +138,9 @@ class RegExpBuiltinsAssembler : public CodeStubAssembler {
   TNode<BoolT> FastFlagGetterUnicode(TNode<JSRegExp> regexp) {
     return FastFlagGetter(regexp, JSRegExp::kUnicode);
   }
+  TNode<BoolT> FastFlagGetterUnicodeSets(TNode<JSRegExp> regexp) {
+    return FastFlagGetter(regexp, JSRegExp::kUnicodeSets);
+  }
   TNode<BoolT> SlowFlagGetter(TNode<Context> context, TNode<Object> regexp,
                               JSRegExp::Flag flag);
   TNode<BoolT> FlagGetter(TNode<Context> context, TNode<Object> regexp,
diff --git a/deps/v8/src/builtins/builtins-typed-array-gen.cc b/deps/v8/src/builtins/builtins-typed-array-gen.cc
index 805837f722b46d..4d2f0b541b7b50 100644
--- a/deps/v8/src/builtins/builtins-typed-array-gen.cc
+++ b/deps/v8/src/builtins/builtins-typed-array-gen.cc
@@ -64,8 +64,8 @@ TNode<JSArrayBuffer> TypedArrayBuiltinsAssembler::AllocateEmptyOnHeapBuffer(
   StoreObjectFieldNoWriteBarrier(buffer, JSArrayBuffer::kBitFieldOffset,
                                  Int32Constant(bitfield_value));
 
-  StoreObjectFieldNoWriteBarrier(buffer, JSArrayBuffer::kByteLengthOffset,
-                                 UintPtrConstant(0));
+  StoreBoundedSizeToObject(buffer, JSArrayBuffer::kRawByteLengthOffset,
+                           UintPtrConstant(0));
   StoreSandboxedPointerToObject(buffer, JSArrayBuffer::kBackingStoreOffset,
                                 EmptyBackingStoreBufferConstant());
   StoreObjectFieldNoWriteBarrier(buffer, JSArrayBuffer::kExtensionOffset,
@@ -141,7 +141,7 @@ TF_BUILTIN(TypedArrayPrototypeByteLength, TypedArrayBuiltinsAssembler) {
     // Default to zero if the {receiver}s buffer was detached.
     TNode<UintPtrT> byte_length = Select<UintPtrT>(
         IsDetachedBuffer(receiver_buffer), [=] { return UintPtrConstant(0); },
-        [=] { return LoadJSArrayBufferViewRawByteLength(receiver_array); });
+        [=] { return LoadJSArrayBufferViewByteLength(receiver_array); });
     Return(ChangeUintPtrToTagged(byte_length));
   }
 }
diff --git a/deps/v8/src/builtins/builtins-weak-refs.cc b/deps/v8/src/builtins/builtins-weak-refs.cc
index aee330b4bd4f3c..a944159f247bec 100644
--- a/deps/v8/src/builtins/builtins-weak-refs.cc
+++ b/deps/v8/src/builtins/builtins-weak-refs.cc
@@ -9,6 +9,7 @@
 namespace v8 {
 namespace internal {
 
+// https://tc39.es/proposal-symbols-as-weakmap-keys/#sec-finalization-registry.prototype.unregister
 BUILTIN(FinalizationRegistryUnregister) {
   HandleScope scope(isolate);
   const char* method_name = "FinalizationRegistry.prototype.unregister";
@@ -24,16 +25,16 @@ BUILTIN(FinalizationRegistryUnregister) {
 
   Handle<Object> unregister_token = args.atOrUndefined(isolate, 1);
 
-  // 4. If Type(unregisterToken) is not Object, throw a TypeError exception.
-  if (!unregister_token->IsJSReceiver()) {
+  // 4. If CanBeHeldWeakly(unregisterToken) is false, throw a TypeError
+  // exception.
+  if (!unregister_token->CanBeHeldWeakly()) {
     THROW_NEW_ERROR_RETURN_FAILURE(
-        isolate,
-        NewTypeError(MessageTemplate::kWeakRefsUnregisterTokenMustBeObject,
-                     unregister_token));
+        isolate, NewTypeError(MessageTemplate::kInvalidWeakRefsUnregisterToken,
+                              unregister_token));
   }
 
   bool success = JSFinalizationRegistry::Unregister(
-      finalization_registry, Handle<JSReceiver>::cast(unregister_token),
+      finalization_registry, Handle<HeapObject>::cast(unregister_token),
       isolate);
 
   return *isolate->factory()->ToBoolean(success);
diff --git a/deps/v8/src/builtins/cast.tq b/deps/v8/src/builtins/cast.tq
index 5cb6e0bc92e0ed..0d347e3dd35cdc 100644
--- a/deps/v8/src/builtins/cast.tq
+++ b/deps/v8/src/builtins/cast.tq
@@ -697,6 +697,21 @@ Cast<JSReceiver|Null>(o: HeapObject): JSReceiver|Null
   }
 }
 
+Cast<JSReceiver|Symbol>(implicit context: Context)(o: Object): JSReceiver|Symbol
+    labels CastError {
+  typeswitch (o) {
+    case (o: JSReceiver): {
+      return o;
+    }
+    case (o: Symbol): {
+      return o;
+    }
+    case (Object): {
+      goto CastError;
+    }
+  }
+}
+
 Cast<Smi|PromiseReaction>(o: Object): Smi|PromiseReaction labels CastError {
   typeswitch (o) {
     case (o: Smi): {
diff --git a/deps/v8/src/builtins/finalization-registry.tq b/deps/v8/src/builtins/finalization-registry.tq
index 38cae7ed20b9ff..4e4b4be068669f 100644
--- a/deps/v8/src/builtins/finalization-registry.tq
+++ b/deps/v8/src/builtins/finalization-registry.tq
@@ -1,6 +1,7 @@
 // Copyright 2020 the V8 project authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+#include "src/builtins/builtins-collections-gen.h"
 
 namespace runtime {
 extern runtime
@@ -15,6 +16,9 @@ extern transitioning macro
 RemoveFinalizationRegistryCellFromUnregisterTokenMap(
     JSFinalizationRegistry, WeakCell): void;
 
+extern macro WeakCollectionsBuiltinsAssembler::GotoIfCannotBeHeldWeakly(JSAny):
+    void labels NotWeakKey;
+
 macro SplitOffTail(weakCell: WeakCell): WeakCell|Undefined {
   const weakCellTail = weakCell.next;
   weakCell.next = Undefined;
@@ -125,6 +129,7 @@ FinalizationRegistryConstructor(
   return finalizationRegistry;
 }
 
+// https://tc39.es/proposal-symbols-as-weakmap-keys/#sec-finalization-registry.prototype.register
 transitioning javascript builtin
 FinalizationRegistryRegister(
     js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny {
@@ -134,33 +139,32 @@ FinalizationRegistryRegister(
   ThrowTypeError(
       MessageTemplate::kIncompatibleMethodReceiver,
       'FinalizationRegistry.prototype.register', receiver);
-  // 3. If Type(target) is not Object, throw a TypeError exception.
-  const target = Cast<JSReceiver>(arguments[0]) otherwise ThrowTypeError(
-      MessageTemplate::kWeakRefsRegisterTargetMustBeObject);
+  // 3. If CanBeHeldWeakly(target) is false, throw a TypeError exception.
+  GotoIfCannotBeHeldWeakly(arguments[0])
+      otherwise ThrowTypeError(MessageTemplate::kInvalidWeakRefsRegisterTarget);
+
+  const target = UnsafeCast<(JSReceiver | Symbol)>(arguments[0]);
   const heldValue = arguments[1];
   // 4. If SameValue(target, heldValue), throw a TypeError exception.
   if (target == heldValue) {
     ThrowTypeError(
         MessageTemplate::kWeakRefsRegisterTargetAndHoldingsMustNotBeSame);
   }
-  // 5. If Type(unregisterToken) is not Object,
+  // 5. If CanBeHeldWeakly(unregisterToken) is false,
   //   a. If unregisterToken is not undefined, throw a TypeError exception.
   //   b. Set unregisterToken to empty.
   const unregisterTokenRaw = arguments[2];
-  let unregisterToken: JSReceiver|Undefined;
-  typeswitch (unregisterTokenRaw) {
-    case (Undefined): {
-      unregisterToken = Undefined;
-    }
-    case (unregisterTokenObj: JSReceiver): {
-      unregisterToken = unregisterTokenObj;
-    }
-    case (JSAny): deferred {
-      ThrowTypeError(
-          MessageTemplate::kWeakRefsUnregisterTokenMustBeObject,
-          unregisterTokenRaw);
-    }
+  let unregisterToken: JSReceiver|Undefined|Symbol;
+
+  if (IsUndefined(unregisterTokenRaw)) {
+    unregisterToken = Undefined;
+  } else {
+    GotoIfCannotBeHeldWeakly(unregisterTokenRaw)
+        otherwise ThrowTypeError(
+        MessageTemplate::kInvalidWeakRefsUnregisterToken, unregisterTokenRaw);
+    unregisterToken = UnsafeCast<(JSReceiver | Symbol)>(unregisterTokenRaw);
   }
+
   // 6. Let cell be the Record { [[WeakRefTarget]] : target, [[HeldValue]]:
   //    heldValue, [[UnregisterToken]]: unregisterToken }.
   // Allocate the WeakCell object in the old space, because 1) WeakCell weakness
diff --git a/deps/v8/src/builtins/ia32/builtins-ia32.cc b/deps/v8/src/builtins/ia32/builtins-ia32.cc
index ecb1bd9136279e..5535c68c7edb4e 100644
--- a/deps/v8/src/builtins/ia32/builtins-ia32.cc
+++ b/deps/v8/src/builtins/ia32/builtins-ia32.cc
@@ -1111,7 +1111,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
   {
     // Restore actual argument count.
     __ movd(eax, xmm0);
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, xmm1);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, xmm1);
   }
 
   __ bind(&compile_lazy);
@@ -1640,8 +1640,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
     // requires the stack to only contain valid frames.
     __ Drop(2);
     __ movd(arg_count, saved_arg_count);  // Restore actual argument count.
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags,
-                                                    saved_feedback_vector);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, saved_feedback_vector);
     __ Trap();
   }
 
diff --git a/deps/v8/src/builtins/loong64/builtins-loong64.cc b/deps/v8/src/builtins/loong64/builtins-loong64.cc
index c147a80d1a3b06..157c45c4325269 100644
--- a/deps/v8/src/builtins/loong64/builtins-loong64.cc
+++ b/deps/v8/src/builtins/loong64/builtins-loong64.cc
@@ -1022,7 +1022,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
     // Ensure the flags is not allocated again.
     // Drop the frame created by the baseline call.
     __ Pop(ra, fp);
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
     __ Trap();
   }
 
@@ -1275,7 +1275,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
   __ jmp(&after_stack_check_interrupt);
 
   __ bind(&flags_need_processing);
-  __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+  __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
 
   __ bind(&is_baseline);
   {
@@ -2997,8 +2997,8 @@ void CallApiFunctionAndReturn(MacroAssembler* masm, Register function_address,
   __ St_w(s2, MemOperand(s5, kLevelOffset));
 
   Label profiler_enabled, done_api_call;
-  __ li(t7, ExternalReference::is_profiling_address(isolate));
-  __ Ld_b(t7, MemOperand(t7, 0));
+  __ Ld_b(t7, __ ExternalReferenceAsOperand(
+                  ExternalReference::is_profiling_address(isolate), t7));
   __ Branch(&profiler_enabled, ne, t7, Operand(zero_reg));
 #ifdef V8_RUNTIME_CALL_STATS
   __ li(t7, ExternalReference::address_of_runtime_stats_flag());
diff --git a/deps/v8/src/builtins/mips64/builtins-mips64.cc b/deps/v8/src/builtins/mips64/builtins-mips64.cc
index f164f1d9b05ee1..598ef531a9e607 100644
--- a/deps/v8/src/builtins/mips64/builtins-mips64.cc
+++ b/deps/v8/src/builtins/mips64/builtins-mips64.cc
@@ -1021,7 +1021,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
     // Ensure the flags is not allocated again.
     // Drop the frame created by the baseline call.
     __ Pop(ra, fp);
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
     __ Trap();
   }
 
@@ -1270,7 +1270,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
   __ jmp(&after_stack_check_interrupt);
 
   __ bind(&flags_need_processing);
-  __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+  __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
   __ bind(&is_baseline);
   {
     // Load the feedback vector from the closure.
@@ -3014,8 +3014,8 @@ void CallApiFunctionAndReturn(MacroAssembler* masm, Register function_address,
   __ Sw(s2, MemOperand(s5, kLevelOffset));
 
   Label profiler_enabled, done_api_call;
-  __ li(t9, ExternalReference::is_profiling_address(isolate));
-  __ Lb(t9, MemOperand(t9, 0));
+  __ Lb(t9, __ ExternalReferenceAsOperand(
+                ExternalReference::is_profiling_address(isolate), t9));
   __ Branch(&profiler_enabled, ne, t9, Operand(zero_reg));
 #ifdef V8_RUNTIME_CALL_STATS
   __ li(t9, ExternalReference::address_of_runtime_stats_flag());
diff --git a/deps/v8/src/builtins/ppc/builtins-ppc.cc b/deps/v8/src/builtins/ppc/builtins-ppc.cc
index 4993dfccde45b6..8decc418fce299 100644
--- a/deps/v8/src/builtins/ppc/builtins-ppc.cc
+++ b/deps/v8/src/builtins/ppc/builtins-ppc.cc
@@ -433,7 +433,7 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
     ConstantPoolUnavailableScope constant_pool_unavailable(masm);
     __ addi(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag));  // Code start
 
-    if (v8_flags.enable_embedded_constant_pool) {
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
       __ LoadConstantPoolPointerRegisterFromCodeTargetAddress(r3);
     }
 
@@ -845,7 +845,7 @@ void Generate_JSEntryVariant(MacroAssembler* masm, StackFrame::Type type,
   // r8: argv
   __ li(r0, Operand(-1));  // Push a bad frame pointer to fail if it is used.
   __ push(r0);
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     __ li(kConstantPoolRegister, Operand::Zero());
     __ push(kConstantPoolRegister);
   }
@@ -1292,13 +1292,13 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
     ASM_CODE_COMMENT_STRING(masm, "Optimized marker check");
 
     // Drop the frame created by the baseline call.
-    if (v8_flags.enable_embedded_constant_pool) {
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
       __ Pop(r0, fp, kConstantPoolRegister);
     } else {
       __ Pop(r0, fp);
     }
     __ mtlr(r0);
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
     __ Trap();
   }
 
@@ -1568,7 +1568,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
   __ jmp(&after_stack_check_interrupt);
 
   __ bind(&flags_need_processing);
-  __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+  __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
 
   __ bind(&is_baseline);
   {
@@ -3055,7 +3055,7 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
   ConstantPoolUnavailableScope constant_pool_unavailable(masm);
   __ Move(ip, pending_handler_entrypoint_address);
   __ LoadU64(ip, MemOperand(ip));
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     __ Move(kConstantPoolRegister, pending_handler_constant_pool_address);
     __ LoadU64(kConstantPoolRegister, MemOperand(kConstantPoolRegister));
   }
diff --git a/deps/v8/src/builtins/promise-any.tq b/deps/v8/src/builtins/promise-any.tq
index ffb285a06a8355..7e707e649f11bc 100644
--- a/deps/v8/src/builtins/promise-any.tq
+++ b/deps/v8/src/builtins/promise-any.tq
@@ -119,7 +119,19 @@ PromiseAnyRejectElementClosure(
           kPromiseAnyRejectElementRemainingSlot);
 
   // 9. Set errors[index] to x.
-  const newCapacity = IntPtrMax(SmiUntag(remainingElementsCount), index + 1);
+
+  // The max computation below is an optimization to avoid excessive allocations
+  // in the case of input promises being asynchronously rejected in ascending
+  // index order.
+  //
+  // Note that subtracting 1 from remainingElementsCount is intentional. The
+  // value of remainingElementsCount is 1 larger than the actual value during
+  // iteration. So in the case of synchronous rejection, newCapacity is the
+  // correct size by subtracting 1. In the case of asynchronous rejection this
+  // is 1 smaller than the correct size, but is not incorrect as it is maxed
+  // with index + 1.
+  const newCapacity =
+      IntPtrMax(SmiUntag(remainingElementsCount) - 1, index + 1);
   if (newCapacity > errors.length_intptr) deferred {
       errors = ExtractFixedArray(errors, 0, errors.length_intptr, newCapacity);
       *ContextSlot(
@@ -306,6 +318,7 @@ Reject(JSAny) {
           PromiseAnyRejectElementContextSlots::
               kPromiseAnyRejectElementErrorsSlot);
 
+      check(errors.length == index - 1);
       const error = ConstructAggregateError(errors);
       // 3. Return ThrowCompletion(error).
       goto Reject(error);
diff --git a/deps/v8/src/builtins/promise-resolve.tq b/deps/v8/src/builtins/promise-resolve.tq
index 114b1e922b1f48..c5ad5eefd5c42b 100644
--- a/deps/v8/src/builtins/promise-resolve.tq
+++ b/deps/v8/src/builtins/promise-resolve.tq
@@ -161,6 +161,12 @@ ResolvePromise(implicit context: Context)(
     }
     goto Slow;
   } label Slow deferred {
+    // Skip "then" lookup for Wasm objects as they are opaque.
+    @if(V8_ENABLE_WEBASSEMBLY)
+    if (Is<WasmObject>(resolution)) {
+      return FulfillPromise(promise, resolution);
+    }
+
     // 9. Let then be Get(resolution, "then").
     // 10. If then is an abrupt completion, then
     try {
diff --git a/deps/v8/src/builtins/reflect.tq b/deps/v8/src/builtins/reflect.tq
index 477c586403c022..c0591e7f6c92c2 100644
--- a/deps/v8/src/builtins/reflect.tq
+++ b/deps/v8/src/builtins/reflect.tq
@@ -38,6 +38,13 @@ transitioning javascript builtin ReflectSetPrototypeOf(
   const objectJSReceiver = Cast<JSReceiver>(object)
       otherwise ThrowTypeError(
       MessageTemplate::kCalledOnNonObject, 'Reflect.setPrototypeOf');
+
+  // Wasm objects do not support having prototypes.
+  @if(V8_ENABLE_WEBASSEMBLY)
+  if (Is<WasmObject>(objectJSReceiver)) {
+    ThrowTypeError(MessageTemplate::kWasmObjectsAreOpaque);
+  }
+
   typeswitch (proto) {
     case (proto: JSReceiver|Null): {
       return object::ObjectSetPrototypeOfDontThrow(objectJSReceiver, proto);
diff --git a/deps/v8/src/builtins/regexp-match-all.tq b/deps/v8/src/builtins/regexp-match-all.tq
index 1f9aa1819f497a..48f12218b94889 100644
--- a/deps/v8/src/builtins/regexp-match-all.tq
+++ b/deps/v8/src/builtins/regexp-match-all.tq
@@ -52,9 +52,10 @@ transitioning macro RegExpPrototypeMatchAllImpl(implicit context: Context)(
       // 10. Else, let global be false.
       global = FastFlagGetter(matcherRegExp, Flag::kGlobal);
 
-      // 11. If flags contains "u", let fullUnicode be true.
+      // 11. If flags contains "u" or "v", let fullUnicode be true.
       // 12. Else, let fullUnicode be false.
-      unicode = FastFlagGetter(matcherRegExp, Flag::kUnicode);
+      unicode = FastFlagGetter(matcherRegExp, Flag::kUnicode) ||
+          FastFlagGetter(matcherRegExp, Flag::kUnicodeSets);
     }
     case (Object): {
       // 4. Let C be ? SpeciesConstructor(R, %RegExp%).
@@ -81,12 +82,15 @@ transitioning macro RegExpPrototypeMatchAllImpl(implicit context: Context)(
       const globalIndex: Smi = StringIndexOf(flagsString, globalCharString, 0);
       global = globalIndex != -1;
 
-      // 11. If flags contains "u", let fullUnicode be true.
+      // 11. If flags contains "u" or "v", let fullUnicode be true.
       // 12. Else, let fullUnicode be false.
       const unicodeCharString = StringConstant('u');
+      const unicodeSetsCharString = StringConstant('v');
       const unicodeIndex: Smi =
           StringIndexOf(flagsString, unicodeCharString, 0);
-      unicode = unicodeIndex != -1;
+      const unicodeSetsIndex: Smi =
+          StringIndexOf(flagsString, unicodeSetsCharString, 0);
+      unicode = unicodeIndex != -1 || unicodeSetsIndex != -1;
     }
   }
 
diff --git a/deps/v8/src/builtins/regexp-match.tq b/deps/v8/src/builtins/regexp-match.tq
index 3da132636a9e86..ff2dcf2c33c0fc 100644
--- a/deps/v8/src/builtins/regexp-match.tq
+++ b/deps/v8/src/builtins/regexp-match.tq
@@ -33,7 +33,8 @@ transitioning macro RegExpPrototypeMatchBody(implicit context: Context)(
   }
 
   dcheck(isGlobal);
-  const isUnicode: bool = FlagGetter(regexp, Flag::kUnicode, isFastPath);
+  const isUnicode: bool = FlagGetter(regexp, Flag::kUnicode, isFastPath) ||
+      FlagGetter(regexp, Flag::kUnicodeSets, isFastPath);
 
   StoreLastIndex(regexp, 0, isFastPath);
 
diff --git a/deps/v8/src/builtins/regexp-replace.tq b/deps/v8/src/builtins/regexp-replace.tq
index d26f8d6949cd16..ecd99af0320598 100644
--- a/deps/v8/src/builtins/regexp-replace.tq
+++ b/deps/v8/src/builtins/regexp-replace.tq
@@ -132,7 +132,7 @@ transitioning macro RegExpReplaceFastString(implicit context: Context)(
   const global: bool = fastRegexp.global;
 
   if (global) {
-    unicode = fastRegexp.unicode;
+    unicode = fastRegexp.unicode || fastRegexp.unicodeSets;
     fastRegexp.lastIndex = 0;
   }
 
diff --git a/deps/v8/src/builtins/riscv/builtins-riscv.cc b/deps/v8/src/builtins/riscv/builtins-riscv.cc
index 0571568ebb3b6c..7cba83d4f0c704 100644
--- a/deps/v8/src/builtins/riscv/builtins-riscv.cc
+++ b/deps/v8/src/builtins/riscv/builtins-riscv.cc
@@ -1078,7 +1078,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
     ASM_CODE_COMMENT_STRING(masm, "Optimized marker check");
     // Drop the frame created by the baseline call.
     __ Pop(ra, fp);
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
     __ Trap();
   }
 
@@ -1319,7 +1319,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
   __ Branch(&after_stack_check_interrupt);
 
   __ bind(&flags_need_processing);
-  __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+  __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
   __ bind(&is_baseline);
   {
     // Load the feedback vector from the closure.
diff --git a/deps/v8/src/builtins/s390/builtins-s390.cc b/deps/v8/src/builtins/s390/builtins-s390.cc
index e5c5e9d0437ed1..b9bc2bab3384b1 100644
--- a/deps/v8/src/builtins/s390/builtins-s390.cc
+++ b/deps/v8/src/builtins/s390/builtins-s390.cc
@@ -1335,7 +1335,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
 
     // Drop the frame created by the baseline call.
     __ Pop(r14, fp);
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
     __ Trap();
   }
 
@@ -1599,7 +1599,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
   __ jmp(&after_stack_check_interrupt);
 
   __ bind(&flags_need_processing);
-  __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
+  __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
 
   __ bind(&is_baseline);
   {
diff --git a/deps/v8/src/builtins/typed-array-slice.tq b/deps/v8/src/builtins/typed-array-slice.tq
index a1dba47bacf36f..0ac50a3ec7563d 100644
--- a/deps/v8/src/builtins/typed-array-slice.tq
+++ b/deps/v8/src/builtins/typed-array-slice.tq
@@ -36,8 +36,20 @@ macro FastCopy(
       otherwise unreachable;
   const srcPtr: RawPtr = src.data_ptr + Convert<intptr>(startOffset);
 
-  dcheck(countBytes <= dest.byte_length);
-  dcheck(countBytes <= src.byte_length - startOffset);
+  @if(DEBUG) {
+    const srcLength =
+        LoadJSTypedArrayLengthAndCheckDetached(src) otherwise unreachable;
+    const srcByteLength = GetTypedArrayElementsInfo(src).CalculateByteLength(
+        srcLength) otherwise unreachable;
+
+    const destLength =
+        LoadJSTypedArrayLengthAndCheckDetached(dest) otherwise unreachable;
+    const destByteLength = GetTypedArrayElementsInfo(dest).CalculateByteLength(
+        destLength) otherwise unreachable;
+
+    dcheck(countBytes <= destByteLength);
+    dcheck(countBytes <= srcByteLength - startOffset);
+  }
 
   if (IsSharedArrayBuffer(src.buffer)) {
     // SABs need a relaxed memmove to preserve atomicity.
diff --git a/deps/v8/src/builtins/typed-array-sort.tq b/deps/v8/src/builtins/typed-array-sort.tq
index 37760ccb5c15f8..5793bf92ba8768 100644
--- a/deps/v8/src/builtins/typed-array-sort.tq
+++ b/deps/v8/src/builtins/typed-array-sort.tq
@@ -79,32 +79,16 @@ TypedArrayMergeSort(implicit context: Context)(
   return Undefined;
 }
 
-// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.sort
-transitioning javascript builtin TypedArrayPrototypeSort(
-    js-implicit context: NativeContext,
-    receiver: JSAny)(...arguments): JSTypedArray {
-  // 1. If comparefn is not undefined and IsCallable(comparefn) is false,
-  //    throw a TypeError exception.
-  const comparefnObj: JSAny = arguments[0];
-  if (comparefnObj != Undefined && !Is<Callable>(comparefnObj)) {
-    ThrowTypeError(MessageTemplate::kBadSortComparisonFunction, comparefnObj);
-  }
-
-  // 2. Let obj be the this value.
-  const obj: JSAny = receiver;
-
-  // 3. Let buffer be ? ValidateTypedArray(obj).
-  // 4. Let len be IntegerIndexedObjectLength(obj).
-  let len: uintptr =
-      ValidateTypedArrayAndGetLength(context, obj, kBuiltinNameSort);
-  const array: JSTypedArray = UnsafeCast<JSTypedArray>(obj);
-
+// Shared between TypedArray.prototype.sort and TypedArray.prototype.toSorted.
+transitioning macro TypedArraySortCommon(implicit context: Context)(
+    array: JSTypedArray, len: uintptr, comparefnArg: Undefined|Callable,
+    isSort: constexpr bool): JSTypedArray {
   // Arrays of length 1 or less are considered sorted.
   if (len < 2) return array;
 
   // Default sorting is done in C++ using std::sort
-  if (comparefnObj == Undefined) {
-    return TypedArraySortFast(context, obj);
+  if (comparefnArg == Undefined) {
+    return TypedArraySortFast(context, array);
   }
 
   // Throw rather than crash if the TypedArray's size exceeds max FixedArray
@@ -116,7 +100,7 @@ transitioning javascript builtin TypedArrayPrototypeSort(
   }
 
   const comparefn: Callable =
-      Cast<Callable>(comparefnObj) otherwise unreachable;
+      Cast<Callable>(comparefnArg) otherwise unreachable;
   const accessor: TypedArrayAccessor =
       GetTypedArrayAccessor(array.elements_kind);
 
@@ -134,25 +118,58 @@ transitioning javascript builtin TypedArrayPrototypeSort(
 
   TypedArrayMergeSort(work2, 0, len, work1, array, comparefn);
 
-  // Reload the length; it's possible the backing ArrayBuffer has been resized
-  // to be OOB or detached, in which case treat it as length 0.
-
-  try {
-    const newLen = LoadJSTypedArrayLengthAndCheckDetached(array)
-        otherwise DetachedOrOutOfBounds;
-    if (newLen < len) {
-      len = newLen;
+  // If this is TypedArray.prototype.sort, reload the length; it's possible the
+  // backing ArrayBuffer has been resized to be OOB or detached, in which case
+  // treat it as length 0.
+  //
+  // This is not possible in TypedArray.prototype.toSorted as the array being
+  // sorted is a copy that has not yet escaped to user script.
+
+  let writebackLen = len;
+  if constexpr (isSort) {
+    try {
+      const newLen = LoadJSTypedArrayLengthAndCheckDetached(array)
+          otherwise DetachedOrOutOfBounds;
+      if (newLen < writebackLen) {
+        writebackLen = newLen;
+      }
+    } label DetachedOrOutOfBounds {
+      writebackLen = 0;
     }
-  } label DetachedOrOutOfBounds {
-    len = 0;
+  } else {
+    dcheck(
+        writebackLen ==
+        LoadJSTypedArrayLengthAndCheckDetached(array) otherwise unreachable);
   }
 
   // work1 contains the sorted numbers. Write them back.
-  for (let i: uintptr = 0; i < len; ++i) {
+  for (let i: uintptr = 0; i < writebackLen; ++i) {
     accessor.StoreNumeric(
         context, array, i, UnsafeCast<Numeric>(work1.objects[i]));
   }
 
   return array;
 }
+
+// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.sort
+transitioning javascript builtin TypedArrayPrototypeSort(
+    js-implicit context: NativeContext,
+    receiver: JSAny)(...arguments): JSTypedArray {
+  // 1. If comparefn is not undefined and IsCallable(comparefn) is false,
+  //    throw a TypeError exception.
+  const comparefnObj: JSAny = arguments[0];
+  const comparefn = Cast<(Undefined | Callable)>(comparefnObj) otherwise
+  ThrowTypeError(MessageTemplate::kBadSortComparisonFunction, comparefnObj);
+
+  // 2. Let obj be the this value.
+  const obj: JSAny = receiver;
+
+  // 3. Let buffer be ? ValidateTypedArray(obj).
+  // 4. Let len be IntegerIndexedObjectLength(obj).
+  const len: uintptr =
+      ValidateTypedArrayAndGetLength(context, obj, kBuiltinNameSort);
+  const array: JSTypedArray = UnsafeCast<JSTypedArray>(obj);
+  const kIsSort: constexpr bool = true;
+  return TypedArraySortCommon(array, len, comparefn, kIsSort);
+}
 }
diff --git a/deps/v8/src/builtins/typed-array-to-sorted.tq b/deps/v8/src/builtins/typed-array-to-sorted.tq
new file mode 100644
index 00000000000000..c73821a9fc5b04
--- /dev/null
+++ b/deps/v8/src/builtins/typed-array-to-sorted.tq
@@ -0,0 +1,59 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+namespace typed_array {
+// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.toSorted
+
+const kBuiltinNameToSorted: constexpr string =
+    '%TypedArray%.prototype.toSorted';
+
+transitioning javascript builtin TypedArrayPrototypeToSorted(
+    js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny {
+  // 1. If comparefn is not undefined and IsCallable(comparefn) is false,
+  //    throw a TypeError exception.
+  const comparefnObj: JSAny = arguments[0];
+  const comparefn = Cast<(Undefined | Callable)>(comparefnObj) otherwise
+  ThrowTypeError(MessageTemplate::kBadSortComparisonFunction, comparefnObj);
+
+  // 2. Let O be the this value.
+  const obj: JSAny = receiver;
+
+  // 3. Perform ? ValidateTypedArray(O).
+  // 4. Let buffer be obj.[[ViewedArrayBuffer]].
+  // 5. Let len be O.[[ArrayLength]].
+  const len: uintptr =
+      ValidateTypedArrayAndGetLength(context, obj, kBuiltinNameToSorted);
+  const array: JSTypedArray = UnsafeCast<JSTypedArray>(obj);
+
+  // 6. Let A be ? TypedArrayCreateSameType(O, « 𝔽(len) »).
+  const copy = TypedArrayCreateSameType(array, len);
+
+  // 7. NOTE: The following closure performs a numeric comparison rather than
+  //    the string comparison used in 1.1.1.5.
+  // 8. Let SortCompare be a new Abstract Closure with parameters (x, y) that
+  //    captures comparefn and buffer and performs the following steps when
+  //    called:
+  //   a. Return ? CompareTypedArrayElements(x, y, comparefn, buffer).
+  // 9. Let sortedList be ? SortIndexedProperties(obj, len, SortCompare, false).
+  // 10. Let j be 0.
+  // 11. Repeat, while j < len,
+  //   a. Perform ! Set(A, ! ToString(𝔽(j)), sortedList[j], true).
+  // b. Set j to j + 1.
+  // 12. Return A.
+
+  // Perform the sorting by copying the source TypedArray and sorting the copy
+  // in-place using the same code that as TypedArray.prototype.sort
+  const info = GetTypedArrayElementsInfo(copy);
+  const countBytes: uintptr =
+      info.CalculateByteLength(len) otherwise unreachable;
+  if (IsSharedArrayBuffer(array.buffer)) {
+    CallCRelaxedMemmove(copy.data_ptr, array.data_ptr, countBytes);
+  } else {
+    CallCMemmove(copy.data_ptr, array.data_ptr, countBytes);
+  }
+
+  const kIsSort: constexpr bool = false;
+  return TypedArraySortCommon(copy, len, comparefn, kIsSort);
+}
+}
diff --git a/deps/v8/src/builtins/typed-array-with.tq b/deps/v8/src/builtins/typed-array-with.tq
index 25b58a37188c7c..c14de29364defc 100644
--- a/deps/v8/src/builtins/typed-array-with.tq
+++ b/deps/v8/src/builtins/typed-array-with.tq
@@ -7,10 +7,8 @@ const kBuiltinNameWith: constexpr string = '%TypedArray%.prototype.with';
 
 // https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.with
 transitioning javascript builtin TypedArrayPrototypeWith(
-    js-implicit context: NativeContext, receiver: JSAny)(...arguments): JSAny {
-  const index = arguments[0];
-  let value: JSAny = arguments[1];
-
+    js-implicit context: NativeContext, receiver: JSAny)(
+    index: JSAny, valueArg: JSAny): JSAny {
   try {
     // 1. Let O be the this value.
     // 2. Perform ? ValidateTypedArray(O).
@@ -21,12 +19,13 @@ transitioning javascript builtin TypedArrayPrototypeWith(
         otherwise IsDetachedOrOutOfBounds;
     const originalLength = attachedArrayAndLength.length;
 
+    let value: JSAny;
     if (IsBigInt64ElementsKind(array.elements_kind)) {
       // 4. If O.[[ContentType]] is BigInt, set value to ? ToBigInt(value).
-      value = ToBigInt(context, value);
+      value = ToBigInt(context, valueArg);
     } else {
       // 5. Else, set value to ? ToNumber(value).
-      value = ToNumber_Inline(value);
+      value = ToNumber_Inline(valueArg);
     }
 
     // 6. Let relativeIndex be ? ToIntegerOrInfinity(index).
diff --git a/deps/v8/src/builtins/wasm.tq b/deps/v8/src/builtins/wasm.tq
index dbf80befe2d7dd..03e117025ce3a5 100644
--- a/deps/v8/src/builtins/wasm.tq
+++ b/deps/v8/src/builtins/wasm.tq
@@ -746,14 +746,17 @@ macro IsWord16WasmArrayMap(map: Map): bool {
 }
 
 // Non-standard experimental feature.
+// Arguments: array, start, count.
 transitioning javascript builtin ExperimentalWasmConvertArrayToString(
-    js-implicit context: NativeContext)(
-    array: JSAny, start: JSAny, count: JSAny): String {
+    js-implicit context: NativeContext)(...arguments): String {
   try {
-    const start = TryNumberToIntptr(start) otherwise goto InvalidArgument;
-    const count = TryNumberToIntptr(count) otherwise goto InvalidArgument;
+    if (arguments.length != 3) goto InvalidArgument;
+    const array = Cast<WasmArray>(arguments[0]) otherwise goto InvalidArgument;
+    const start = TryNumberToIntptr(arguments[1])
+        otherwise goto InvalidArgument;
+    const count = TryNumberToIntptr(arguments[2])
+        otherwise goto InvalidArgument;
 
-    const array = Cast<WasmArray>(array) otherwise goto InvalidArgument;
     if (!IsWord16WasmArrayMap(array.map)) goto InvalidArgument;
     const arrayContent = torque_internal::unsafe::NewConstSlice<char16>(
         array, kWasmArrayHeaderSize, Convert<intptr>(array.length));
@@ -768,16 +771,17 @@ transitioning javascript builtin ExperimentalWasmConvertArrayToString(
 }
 
 // Non-standard experimental feature.
+// Arguments: string, sampleArray.
 transitioning javascript builtin ExperimentalWasmConvertStringToArray(
-    js-implicit context: NativeContext)(
-    string: JSAny, sampleArray: JSAny): WasmArray {
+    js-implicit context: NativeContext)(...arguments): WasmArray {
   try {
+    if (arguments.length != 2) goto InvalidArgument;
+    const string = Cast<String>(arguments[0]) otherwise goto InvalidArgument;
     const sampleArray =
-        Cast<WasmArray>(sampleArray) otherwise goto InvalidArgument;
+        Cast<WasmArray>(arguments[1]) otherwise goto InvalidArgument;
     const arrayMap = sampleArray.map;
     if (!IsWord16WasmArrayMap(arrayMap)) goto InvalidArgument;
 
-    const string = Cast<String>(string) otherwise goto InvalidArgument;
     const length = string.length;
 
     const result =
diff --git a/deps/v8/src/builtins/weak-ref.tq b/deps/v8/src/builtins/weak-ref.tq
index 56d3fc1c4314bf..051831698534ce 100644
--- a/deps/v8/src/builtins/weak-ref.tq
+++ b/deps/v8/src/builtins/weak-ref.tq
@@ -2,15 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include 'src/builtins/builtins-collections-gen.h'
+
 namespace runtime {
 
-extern runtime JSWeakRefAddToKeptObjects(implicit context: Context)(JSReceiver):
-    void;
+extern runtime JSWeakRefAddToKeptObjects(implicit context: Context)(
+    JSReceiver | Symbol): void;
 
 }  // namespace runtime
 
 namespace weakref {
 
+// https://tc39.es/proposal-symbols-as-weakmap-keys/#sec-weak-ref-target
 transitioning javascript builtin
 WeakRefConstructor(
     js-implicit context: NativeContext, receiver: JSAny, newTarget: JSAny,
@@ -19,15 +22,17 @@ WeakRefConstructor(
   if (newTarget == Undefined) {
     ThrowTypeError(MessageTemplate::kConstructorNotFunction, 'WeakRef');
   }
-  // 2. If Type(target) is not Object, throw a TypeError exception.
-  const weakTarget = Cast<JSReceiver>(weakTarget) otherwise
-  ThrowTypeError(
-      MessageTemplate::kWeakRefsWeakRefConstructorTargetMustBeObject);
+
+  // 2. If CanBeHeldWeakly(weakTarget) is false, throw a TypeError exception.
+  GotoIfCannotBeHeldWeakly(weakTarget) otherwise ThrowTypeError(
+      MessageTemplate::kInvalidWeakRefsWeakRefConstructorTarget);
+
   // 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget,
   // "%WeakRefPrototype%", « [[WeakRefTarget]] »).
   const map = GetDerivedMap(target, UnsafeCast<JSReceiver>(newTarget));
   const weakRef = UnsafeCast<JSWeakRef>(AllocateFastOrSlowJSObjectFromMap(map));
   // 4. Perfom ! AddToKeptObjects(target).
+  const weakTarget = UnsafeCast<(JSReceiver | Symbol)>(weakTarget);
   runtime::JSWeakRefAddToKeptObjects(weakTarget);
   // 5. Set weakRef.[[WeakRefTarget]] to target.
   weakRef.target = weakTarget;
@@ -52,7 +57,8 @@ WeakRefDeref(js-implicit context: NativeContext, receiver: JSAny)(): JSAny {
   if (target != Undefined) {
     // JSWeakRefAddToKeptObjects might allocate and cause a GC, but it
     // won't clear `target` since we hold it here on the stack.
-    runtime::JSWeakRefAddToKeptObjects(UnsafeCast<JSReceiver>(target));
+    runtime::JSWeakRefAddToKeptObjects(
+        UnsafeCast<(JSReceiver | Symbol)>(target));
   }
   return target;
 }
diff --git a/deps/v8/src/builtins/x64/builtins-x64.cc b/deps/v8/src/builtins/x64/builtins-x64.cc
index 03539e1caa29c8..6dfdffcdb84472 100644
--- a/deps/v8/src/builtins/x64/builtins-x64.cc
+++ b/deps/v8/src/builtins/x64/builtins-x64.cc
@@ -1197,8 +1197,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
   __ int3();  // Should not return.
 
   __ bind(&flags_need_processing);
-  __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector,
-                                                  closure);
+  __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector, closure);
 
   __ bind(&is_baseline);
   {
@@ -1627,8 +1626,8 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
     // return since we may do a runtime call along the way that requires the
     // stack to only contain valid frames.
     __ Drop(1);
-    __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
-        flags, feedback_vector, closure, JumpMode::kPushAndReturn);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector, closure,
+                                               JumpMode::kPushAndReturn);
     __ Trap();
   }
 
@@ -2697,12 +2696,218 @@ void Builtins::Generate_BaselineOnStackReplacement(MacroAssembler* masm) {
 }
 
 void Builtins::Generate_MaglevOnStackReplacement(MacroAssembler* masm) {
-  using D = OnStackReplacementDescriptor;
+  using D =
+      i::CallInterfaceDescriptorFor<Builtin::kMaglevOnStackReplacement>::type;
   static_assert(D::kParameterCount == 1);
   OnStackReplacement(masm, OsrSourceTier::kMaglev,
                      D::MaybeTargetCodeRegister());
 }
 
+// Called immediately at the start of Maglev-generated functions, with all
+// state (register and stack) unchanged, except:
+//
+// - the stack slot byte size and
+// - the tagged stack slot byte size
+//
+// are pushed as untagged arguments to the stack. This prologue builtin takes
+// care of a few things that each Maglev function needs on entry:
+//
+// - the deoptimization check
+// - tiering support (checking FeedbackVector flags)
+// - the stack overflow / interrupt check
+// - and finally, setting up the Maglev frame.
+//
+// If this builtin returns, the Maglev frame is fully set up and we are
+// prepared for continued execution. Otherwise, we take one of multiple
+// possible non-standard exit paths (deoptimization, tailcalling other code, or
+// throwing a stack overflow exception).
+void Builtins::Generate_MaglevOutOfLinePrologue(MacroAssembler* masm) {
+  using D =
+      i::CallInterfaceDescriptorFor<Builtin::kMaglevOutOfLinePrologue>::type;
+  static_assert(D::kParameterCount == 0);
+
+  // This builtin is called by Maglev code prior to any register mutations, and
+  // the only stack mutation is pushing the arguments for this builtin. In
+  // other words:
+  //
+  // - The register state is the same as when we entered the Maglev code object,
+  // i.e. set up for a standard JS call.
+  // - The caller has not yet set up a stack frame.
+  // - The caller has pushed the (untagged) stack parameters for this builtin.
+
+  static constexpr int kStackParameterCount = 2;
+  static constexpr int kReturnAddressCount = 1;
+  static constexpr int kReturnAddressOffset = 0 * kSystemPointerSize;
+  static constexpr int kTaggedStackSlotBytesOffset = 1 * kSystemPointerSize;
+  static constexpr int kTotalStackSlotBytesOffset = 2 * kSystemPointerSize;
+  USE(kReturnAddressOffset);
+  USE(kTaggedStackSlotBytesOffset);
+  USE(kTotalStackSlotBytesOffset);
+
+  // Scratch registers. Don't clobber regs related to the calling
+  // convention (e.g. kJavaScriptCallArgCountRegister).
+  const Register scratch0 = rcx;
+  const Register scratch1 = r9;
+  const Register scratch2 = rbx;
+
+  Label deoptimize, optimize, call_stack_guard, call_stack_guard_return;
+
+  // A modified version of BailoutIfDeoptimized that drops the builtin frame
+  // before deoptimizing.
+  {
+    static constexpr int kCodeStartToCodeDataContainerOffset =
+        Code::kCodeDataContainerOffset - Code::kHeaderSize;
+    __ LoadTaggedPointerField(scratch0,
+                              Operand(kJavaScriptCallCodeStartRegister,
+                                      kCodeStartToCodeDataContainerOffset));
+    __ testl(
+        FieldOperand(scratch0, CodeDataContainer::kKindSpecificFlagsOffset),
+        Immediate(1 << Code::kMarkedForDeoptimizationBit));
+    __ j(not_zero, &deoptimize);
+  }
+
+  // Tiering support.
+  const Register flags = scratch0;
+  const Register feedback_vector = scratch1;
+  {
+    __ LoadTaggedPointerField(
+        feedback_vector,
+        FieldOperand(kJSFunctionRegister, JSFunction::kFeedbackCellOffset));
+    __ LoadTaggedPointerField(
+        feedback_vector, FieldOperand(feedback_vector, Cell::kValueOffset));
+    __ AssertFeedbackVector(feedback_vector);
+
+    __ LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
+        flags, feedback_vector, CodeKind::MAGLEV, &optimize);
+  }
+
+  // Good to go - set up the MAGLEV stack frame and return.
+
+  // First, tear down to the caller frame.
+  const Register tagged_stack_slot_bytes = scratch1;
+  const Register total_stack_slot_bytes = scratch0;
+  const Register return_address = scratch2;
+  __ PopReturnAddressTo(return_address);
+  __ Pop(tagged_stack_slot_bytes);
+  __ Pop(total_stack_slot_bytes);
+
+  __ EnterFrame(StackFrame::MAGLEV);
+
+  // Save arguments in frame.
+  // TODO(leszeks): Consider eliding this frame if we don't make any calls
+  // that could clobber these registers.
+  __ Push(kContextRegister);
+  __ Push(kJSFunctionRegister);              // Callee's JS function.
+  __ Push(kJavaScriptCallArgCountRegister);  // Actual argument count.
+
+  {
+    ASM_CODE_COMMENT_STRING(masm, " Stack/interrupt check");
+    // Stack check. This folds the checks for both the interrupt stack limit
+    // check and the real stack limit into one by just checking for the
+    // interrupt limit. The interrupt limit is either equal to the real stack
+    // limit or tighter. By ensuring we have space until that limit after
+    // building the frame we can quickly precheck both at once.
+    // TODO(leszeks): Include a max call argument size here.
+    __ Move(kScratchRegister, rsp);
+    __ subq(kScratchRegister, total_stack_slot_bytes);
+    __ cmpq(kScratchRegister,
+            __ StackLimitAsOperand(StackLimitKind::kInterruptStackLimit));
+    __ j(below, &call_stack_guard);
+    __ bind(&call_stack_guard_return);
+  }
+
+  // Initialize stack slots:
+  //
+  // - tagged slots are initialized with smi zero.
+  // - untagged slots are simply reserved without initialization.
+  //
+  // Tagged slots first.
+  const Register untagged_stack_slot_bytes = total_stack_slot_bytes;
+  {
+    Label next, loop_condition, loop_header;
+
+    DCHECK_EQ(total_stack_slot_bytes, untagged_stack_slot_bytes);
+    __ subq(total_stack_slot_bytes, tagged_stack_slot_bytes);
+
+    const Register smi_zero = rax;
+    DCHECK(!AreAliased(smi_zero, scratch0, scratch1, scratch2));
+    __ Move(smi_zero, Smi::zero());
+
+    __ jmp(&loop_condition, Label::kNear);
+
+    // TODO(leszeks): Consider filling with xmm + movdqa instead.
+    // TODO(v8:7700): Consider doing more than one push per loop iteration.
+    __ bind(&loop_header);
+    __ pushq(rax);
+    __ bind(&loop_condition);
+    __ subq(tagged_stack_slot_bytes, Immediate(kSystemPointerSize));
+    __ j(greater_equal, &loop_header, Label::kNear);
+
+    __ bind(&next);
+  }
+
+  // Untagged slots second.
+  __ subq(rsp, untagged_stack_slot_bytes);
+
+  // The "all-good" return location. This is the only spot where we actually
+  // return to the caller.
+  __ PushReturnAddressFrom(return_address);
+  __ ret(0);
+
+  __ bind(&deoptimize);
+  {
+    // Drop the frame and jump to CompileLazyDeoptimizedCode. This is slightly
+    // fiddly due to the CET shadow stack (otherwise we could do a conditional
+    // Jump to the builtin).
+    __ Drop(kStackParameterCount + kReturnAddressCount);
+    __ Move(scratch0,
+            BUILTIN_CODE(masm->isolate(), CompileLazyDeoptimizedCode));
+    __ LoadCodeObjectEntry(scratch0, scratch0);
+    __ PushReturnAddressFrom(scratch0);
+    __ ret(0);
+  }
+
+  __ bind(&optimize);
+  {
+    __ Drop(kStackParameterCount + kReturnAddressCount);
+    __ AssertFunction(kJSFunctionRegister);
+    __ OptimizeCodeOrTailCallOptimizedCodeSlot(
+        flags, feedback_vector, kJSFunctionRegister, JumpMode::kPushAndReturn);
+    __ Trap();
+  }
+
+  __ bind(&call_stack_guard);
+  {
+    ASM_CODE_COMMENT_STRING(masm, "Stack/interrupt call");
+
+    // Push the MAGLEV code return address now, as if it had been pushed by the
+    // call to this builtin.
+    __ PushReturnAddressFrom(return_address);
+
+    {
+      FrameScope inner_frame_scope(masm, StackFrame::INTERNAL);
+      __ SmiTag(total_stack_slot_bytes);
+      __ Push(total_stack_slot_bytes);
+      __ SmiTag(tagged_stack_slot_bytes);
+      __ Push(tagged_stack_slot_bytes);
+      // Save any registers that can be referenced by maglev::RegisterInput.
+      // TODO(leszeks): Only push those that are used by the graph.
+      __ Push(kJavaScriptCallNewTargetRegister);
+      // Push the frame size.
+      __ Push(total_stack_slot_bytes);
+      __ CallRuntime(Runtime::kStackGuardWithGap, 1);
+      __ Pop(kJavaScriptCallNewTargetRegister);
+      __ Pop(tagged_stack_slot_bytes);
+      __ SmiUntag(tagged_stack_slot_bytes);
+      __ Pop(total_stack_slot_bytes);
+      __ SmiUntag(total_stack_slot_bytes);
+    }
+
+    __ PopReturnAddressTo(return_address);
+    __ jmp(&call_stack_guard_return);
+  }
+}
+
 #if V8_ENABLE_WEBASSEMBLY
 void Builtins::Generate_WasmCompileLazy(MacroAssembler* masm) {
   // The function index was pushed to the stack by the caller as int32.
diff --git a/deps/v8/src/codegen/arm/assembler-arm-inl.h b/deps/v8/src/codegen/arm/assembler-arm-inl.h
index cb0e5f6b7537b5..b1cd1d5205a1cd 100644
--- a/deps/v8/src/codegen/arm/assembler-arm-inl.h
+++ b/deps/v8/src/codegen/arm/assembler-arm-inl.h
@@ -66,8 +66,7 @@ void RelocInfo::apply(intptr_t delta) {
 }
 
 Address RelocInfo::target_address() {
-  DCHECK(IsCodeTargetMode(rmode_) || IsRuntimeEntry(rmode_) ||
-         IsWasmCall(rmode_));
+  DCHECK(IsCodeTargetMode(rmode_) || IsWasmCall(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
@@ -92,11 +91,7 @@ Address RelocInfo::constant_pool_entry_address() {
 int RelocInfo::target_address_size() { return kPointerSize; }
 
 HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
-  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsDataEmbeddedObject(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_)));
-  }
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
   return HeapObject::cast(
       Object(Assembler::target_address_at(pc_, constant_pool_)));
 }
@@ -105,8 +100,6 @@ Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
   if (IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_)) {
     return Handle<HeapObject>(reinterpret_cast<Address*>(
         Assembler::target_address_at(pc_, constant_pool_)));
-  } else if (IsDataEmbeddedObject(rmode_)) {
-    return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_));
   }
   DCHECK(IsRelativeCodeTarget(rmode_));
   return origin->relative_code_target_object_handle_at(pc_);
@@ -115,15 +108,9 @@ Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
 void RelocInfo::set_target_object(Heap* heap, HeapObject target,
                                   WriteBarrierMode write_barrier_mode,
                                   ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsDataEmbeddedObject(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    WriteUnalignedValue(pc_, target.ptr());
-    // No need to flush icache since no instructions were changed.
-  } else {
-    Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
-                                     icache_flush_mode);
-  }
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
+  Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
+                                   icache_flush_mode);
   if (!host().is_null() && !v8_flags.disable_write_barriers) {
     WriteBarrierForCode(host(), this, target, write_barrier_mode);
   }
@@ -153,19 +140,6 @@ Address RelocInfo::target_internal_reference_address() {
 
 Builtin RelocInfo::target_builtin_at(Assembler* origin) { UNREACHABLE(); }
 
-Address RelocInfo::target_runtime_entry(Assembler* origin) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  return target_address();
-}
-
-void RelocInfo::set_target_runtime_entry(Address target,
-                                         WriteBarrierMode write_barrier_mode,
-                                         ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  if (target_address() != target)
-    set_target_address(target, write_barrier_mode, icache_flush_mode);
-}
-
 Address RelocInfo::target_off_heap_target() {
   DCHECK(IsOffHeapTarget(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
@@ -173,8 +147,8 @@ Address RelocInfo::target_off_heap_target() {
 
 void RelocInfo::WipeOut() {
   DCHECK(IsFullEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
-         IsInternalReference(rmode_) || IsOffHeapTarget(rmode_));
+         IsExternalReference(rmode_) || IsInternalReference(rmode_) ||
+         IsOffHeapTarget(rmode_));
   if (IsInternalReference(rmode_)) {
     Memory<Address>(pc_) = kNullAddress;
   } else {
diff --git a/deps/v8/src/codegen/arm/assembler-arm.cc b/deps/v8/src/codegen/arm/assembler-arm.cc
index 31d76c61984f60..b2d7cad0963cd7 100644
--- a/deps/v8/src/codegen/arm/assembler-arm.cc
+++ b/deps/v8/src/codegen/arm/assembler-arm.cc
@@ -5218,8 +5218,7 @@ void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
   DCHECK(is_const_pool_blocked() || pending_32_bit_constants_.empty());
   CheckBuffer();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   base::WriteUnalignedValue(reinterpret_cast<Address>(pc_), data);
@@ -5232,8 +5231,7 @@ void Assembler::dq(uint64_t value, RelocInfo::Mode rmode) {
   DCHECK(is_const_pool_blocked() || pending_32_bit_constants_.empty());
   CheckBuffer();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   base::WriteUnalignedValue(reinterpret_cast<Address>(pc_), value);
diff --git a/deps/v8/src/codegen/arm/macro-assembler-arm.cc b/deps/v8/src/codegen/arm/macro-assembler-arm.cc
index f88c04333f479f..565d0820bdd0b5 100644
--- a/deps/v8/src/codegen/arm/macro-assembler-arm.cc
+++ b/deps/v8/src/codegen/arm/macro-assembler-arm.cc
@@ -2078,7 +2078,7 @@ void MacroAssembler::LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
   b(ne, flags_need_processing);
 }
 
-void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+void MacroAssembler::OptimizeCodeOrTailCallOptimizedCodeSlot(
     Register flags, Register feedback_vector) {
   ASM_CODE_COMMENT(this);
   DCHECK(!AreAliased(flags, feedback_vector));
diff --git a/deps/v8/src/codegen/arm/macro-assembler-arm.h b/deps/v8/src/codegen/arm/macro-assembler-arm.h
index 099b1551bf8b1d..51f79075812a84 100644
--- a/deps/v8/src/codegen/arm/macro-assembler-arm.h
+++ b/deps/v8/src/codegen/arm/macro-assembler-arm.h
@@ -779,8 +779,8 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
   void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
       Register flags, Register feedback_vector, CodeKind current_code_kind,
       Label* flags_need_processing);
-  void MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
-                                                    Register feedback_vector);
+  void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
+                                               Register feedback_vector);
 
   // ---------------------------------------------------------------------------
   // Runtime calls
diff --git a/deps/v8/src/codegen/arm64/assembler-arm64-inl.h b/deps/v8/src/codegen/arm64/assembler-arm64-inl.h
index 5df2d876457ddc..37158040ead8c0 100644
--- a/deps/v8/src/codegen/arm64/assembler-arm64-inl.h
+++ b/deps/v8/src/codegen/arm64/assembler-arm64-inl.h
@@ -537,16 +537,6 @@ Builtin Assembler::target_builtin_at(Address pc) {
   return static_cast<Builtin>(builtin_id);
 }
 
-Address Assembler::runtime_entry_at(Address pc) {
-  Instruction* instr = reinterpret_cast<Instruction*>(pc);
-  if (instr->IsLdrLiteralX()) {
-    return Assembler::target_address_at(pc, 0 /* unused */);
-  } else {
-    DCHECK(instr->IsBranchAndLink() || instr->IsUnconditionalBranch());
-    return instr->ImmPCOffset() + options().code_range_base;
-  }
-}
-
 int Assembler::deserialization_special_target_size(Address location) {
   Instruction* instr = reinterpret_cast<Instruction*>(location);
   if (instr->IsBranchAndLink() || instr->IsUnconditionalBranch()) {
@@ -630,7 +620,7 @@ int RelocInfo::target_address_size() {
 
 Address RelocInfo::target_address() {
   DCHECK(IsCodeTarget(rmode_) || IsNearBuiltinEntry(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsWasmCall(rmode_));
+         IsWasmCall(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
@@ -665,13 +655,12 @@ Address RelocInfo::constant_pool_entry_address() {
 
 HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_)));
-  } else if (IsCompressedEmbeddedObject(rmode_)) {
+  if (IsCompressedEmbeddedObject(rmode_)) {
     Tagged_t compressed =
         Assembler::target_compressed_address_at(pc_, constant_pool_);
     DCHECK(!HAS_SMI_TAG(compressed));
-    Object obj(DecompressTaggedPointer(cage_base, compressed));
+    Object obj(V8HeapCompressionScheme::DecompressTaggedPointer(cage_base,
+                                                                compressed));
     // Embedding of compressed Code objects must not happen when external code
     // space is enabled, because CodeDataContainers must be used instead.
     DCHECK_IMPLIES(V8_EXTERNAL_CODE_SPACE_BOOL,
@@ -684,9 +673,7 @@ HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
 }
 
 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
-  if (IsDataEmbeddedObject(rmode_)) {
-    return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_));
-  } else if (IsEmbeddedObjectMode(rmode_)) {
+  if (IsEmbeddedObjectMode(rmode_)) {
     return origin->target_object_handle_at(pc_);
   } else {
     DCHECK(IsCodeTarget(rmode_));
@@ -698,12 +685,11 @@ void RelocInfo::set_target_object(Heap* heap, HeapObject target,
                                   WriteBarrierMode write_barrier_mode,
                                   ICacheFlushMode icache_flush_mode) {
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    WriteUnalignedValue(pc_, target.ptr());
-    // No need to flush icache since no instructions were changed.
-  } else if (IsCompressedEmbeddedObject(rmode_)) {
+  if (IsCompressedEmbeddedObject(rmode_)) {
     Assembler::set_target_compressed_address_at(
-        pc_, constant_pool_, CompressTagged(target.ptr()), icache_flush_mode);
+        pc_, constant_pool_,
+        V8HeapCompressionScheme::CompressTagged(target.ptr()),
+        icache_flush_mode);
   } else {
     DCHECK(IsFullEmbeddedObject(rmode_));
     Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
@@ -741,20 +727,6 @@ Builtin RelocInfo::target_builtin_at(Assembler* origin) {
   return Assembler::target_builtin_at(pc_);
 }
 
-Address RelocInfo::target_runtime_entry(Assembler* origin) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  return target_address();
-}
-
-void RelocInfo::set_target_runtime_entry(Address target,
-                                         WriteBarrierMode write_barrier_mode,
-                                         ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  if (target_address() != target) {
-    set_target_address(target, write_barrier_mode, icache_flush_mode);
-  }
-}
-
 Address RelocInfo::target_off_heap_target() {
   DCHECK(IsOffHeapTarget(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
@@ -762,8 +734,8 @@ Address RelocInfo::target_off_heap_target() {
 
 void RelocInfo::WipeOut() {
   DCHECK(IsEmbeddedObjectMode(rmode_) || IsCodeTarget(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
-         IsInternalReference(rmode_) || IsOffHeapTarget(rmode_));
+         IsExternalReference(rmode_) || IsInternalReference(rmode_) ||
+         IsOffHeapTarget(rmode_));
   if (IsInternalReference(rmode_)) {
     WriteUnalignedValue<Address>(pc_, kNullAddress);
   } else if (IsCompressedEmbeddedObject(rmode_)) {
diff --git a/deps/v8/src/codegen/arm64/assembler-arm64.cc b/deps/v8/src/codegen/arm64/assembler-arm64.cc
index 754c79815ab06f..dc06c743a02d30 100644
--- a/deps/v8/src/codegen/arm64/assembler-arm64.cc
+++ b/deps/v8/src/codegen/arm64/assembler-arm64.cc
@@ -188,7 +188,6 @@ CPURegList CPURegList::GetCallerSavedV(int size) {
 const int RelocInfo::kApplyMask =
     RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
     RelocInfo::ModeMask(RelocInfo::NEAR_BUILTIN_ENTRY) |
-    RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
     RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE);
 
 bool RelocInfo::IsCodedSpecially() {
@@ -1134,10 +1133,20 @@ void Assembler::smull(const Register& rd, const Register& rn,
 
 void Assembler::smulh(const Register& rd, const Register& rn,
                       const Register& rm) {
-  DCHECK(AreSameSizeAndType(rd, rn, rm));
+  DCHECK(rd.Is64Bits());
+  DCHECK(rn.Is64Bits());
+  DCHECK(rm.Is64Bits());
   DataProcessing3Source(rd, rn, rm, xzr, SMULH_x);
 }
 
+void Assembler::umulh(const Register& rd, const Register& rn,
+                      const Register& rm) {
+  DCHECK(rd.Is64Bits());
+  DCHECK(rn.Is64Bits());
+  DCHECK(rm.Is64Bits());
+  DataProcessing3Source(rd, rn, rm, xzr, UMULH_x);
+}
+
 void Assembler::sdiv(const Register& rd, const Register& rn,
                      const Register& rm) {
   DCHECK(rd.SizeInBits() == rn.SizeInBits());
@@ -4306,7 +4315,6 @@ void Assembler::GrowBuffer() {
 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data,
                                 ConstantPoolMode constant_pool_mode) {
   if ((rmode == RelocInfo::INTERNAL_REFERENCE) ||
-      (rmode == RelocInfo::DATA_EMBEDDED_OBJECT) ||
       (rmode == RelocInfo::CONST_POOL) || (rmode == RelocInfo::VENEER_POOL) ||
       (rmode == RelocInfo::DEOPT_SCRIPT_OFFSET) ||
       (rmode == RelocInfo::DEOPT_INLINING_ID) ||
@@ -4318,7 +4326,6 @@ void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data,
            RelocInfo::IsDeoptNodeId(rmode) ||
            RelocInfo::IsDeoptPosition(rmode) ||
            RelocInfo::IsInternalReference(rmode) ||
-           RelocInfo::IsDataEmbeddedObject(rmode) ||
            RelocInfo::IsLiteralConstant(rmode) ||
            RelocInfo::IsConstPool(rmode) || RelocInfo::IsVeneerPool(rmode));
     // These modes do not need an entry in the constant pool.
diff --git a/deps/v8/src/codegen/arm64/assembler-arm64.h b/deps/v8/src/codegen/arm64/assembler-arm64.h
index 368a2e5f42bf78..68f773a92436c3 100644
--- a/deps/v8/src/codegen/arm64/assembler-arm64.h
+++ b/deps/v8/src/codegen/arm64/assembler-arm64.h
@@ -273,14 +273,6 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   // code is moved into the code space.
   static inline Builtin target_builtin_at(Address pc);
 
-  // Returns the target address for a runtime function for the call encoded
-  // at 'pc'.
-  // Runtime entries can be temporarily encoded as the offset between the
-  // runtime function entrypoint and the code range base (stored in the
-  // code_range_base field), in order to be encodable as we generate the code,
-  // before it is moved into the code space.
-  inline Address runtime_entry_at(Address pc);
-
   // This sets the branch destination. 'location' here can be either the pc of
   // an immediate branch or the address of an entry in the constant pool.
   // This is for calls and branches within generated code.
@@ -751,9 +743,12 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   // 32 x 32 -> 64-bit multiply.
   void smull(const Register& rd, const Register& rn, const Register& rm);
 
-  // Xd = bits<127:64> of Xn * Xm.
+  // Xd = bits<127:64> of Xn * Xm, signed.
   void smulh(const Register& rd, const Register& rn, const Register& rm);
 
+  // Xd = bits<127:64> of Xn * Xm, unsigned.
+  void umulh(const Register& rd, const Register& rn, const Register& rm);
+
   // Signed 32 x 32 -> 64-bit multiply and accumulate.
   void smaddl(const Register& rd, const Register& rn, const Register& rm,
               const Register& ra);
@@ -2070,8 +2065,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   void dd(uint32_t data, RelocInfo::Mode rmode = RelocInfo::NO_INFO) {
     BlockPoolsScope no_pool_scope(this);
     if (!RelocInfo::IsNoInfo(rmode)) {
-      DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-             RelocInfo::IsLiteralConstant(rmode));
+      DCHECK(RelocInfo::IsLiteralConstant(rmode));
       RecordRelocInfo(rmode);
     }
     dc32(data);
@@ -2079,8 +2073,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   void dq(uint64_t data, RelocInfo::Mode rmode = RelocInfo::NO_INFO) {
     BlockPoolsScope no_pool_scope(this);
     if (!RelocInfo::IsNoInfo(rmode)) {
-      DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-             RelocInfo::IsLiteralConstant(rmode));
+      DCHECK(RelocInfo::IsLiteralConstant(rmode));
       RecordRelocInfo(rmode);
     }
     dc64(data);
@@ -2088,8 +2081,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   void dp(uintptr_t data, RelocInfo::Mode rmode = RelocInfo::NO_INFO) {
     BlockPoolsScope no_pool_scope(this);
     if (!RelocInfo::IsNoInfo(rmode)) {
-      DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-             RelocInfo::IsLiteralConstant(rmode));
+      DCHECK(RelocInfo::IsLiteralConstant(rmode));
       RecordRelocInfo(rmode);
     }
     dc64(data);
diff --git a/deps/v8/src/codegen/arm64/macro-assembler-arm64-inl.h b/deps/v8/src/codegen/arm64/macro-assembler-arm64-inl.h
index bf34708491058b..0c7e7357534fc9 100644
--- a/deps/v8/src/codegen/arm64/macro-assembler-arm64-inl.h
+++ b/deps/v8/src/codegen/arm64/macro-assembler-arm64-inl.h
@@ -944,7 +944,7 @@ void TurboAssembler::Smull(const Register& rd, const Register& rn,
   smull(rd, rn, rm);
 }
 
-void MacroAssembler::Smulh(const Register& rd, const Register& rn,
+void TurboAssembler::Smulh(const Register& rd, const Register& rn,
                            const Register& rm) {
   DCHECK(allow_macro_instructions());
   DCHECK(!rd.IsZero());
@@ -958,6 +958,13 @@ void TurboAssembler::Umull(const Register& rd, const Register& rn,
   umaddl(rd, rn, rm, xzr);
 }
 
+void TurboAssembler::Umulh(const Register& rd, const Register& rn,
+                           const Register& rm) {
+  DCHECK(allow_macro_instructions());
+  DCHECK(!rd.IsZero());
+  umulh(rd, rn, rm);
+}
+
 void TurboAssembler::Sxtb(const Register& rd, const Register& rn) {
   DCHECK(allow_macro_instructions());
   DCHECK(!rd.IsZero());
diff --git a/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc b/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc
index 0112f35129c89d..25834f25823cd1 100644
--- a/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc
+++ b/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc
@@ -1440,7 +1440,7 @@ void MacroAssembler::LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
   TestAndBranchIfAnySet(flags, kFlagsMask, flags_need_processing);
 }
 
-void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+void MacroAssembler::OptimizeCodeOrTailCallOptimizedCodeSlot(
     Register flags, Register feedback_vector) {
   ASM_CODE_COMMENT(this);
   DCHECK(!AreAliased(flags, feedback_vector));
@@ -3291,16 +3291,6 @@ void MacroAssembler::RecordWriteField(Register object, int offset,
   Bind(&done);
 }
 
-void TurboAssembler::EncodeSandboxedPointer(const Register& value) {
-  ASM_CODE_COMMENT(this);
-#ifdef V8_ENABLE_SANDBOX
-  Sub(value, value, kPtrComprCageBaseRegister);
-  Mov(value, Operand(value, LSL, kSandboxedPointerShift));
-#else
-  UNREACHABLE();
-#endif
-}
-
 void TurboAssembler::DecodeSandboxedPointer(const Register& value) {
   ASM_CODE_COMMENT(this);
 #ifdef V8_ENABLE_SANDBOX
@@ -3313,19 +3303,27 @@ void TurboAssembler::DecodeSandboxedPointer(const Register& value) {
 
 void TurboAssembler::LoadSandboxedPointerField(
     const Register& destination, const MemOperand& field_operand) {
+#ifdef V8_ENABLE_SANDBOX
   ASM_CODE_COMMENT(this);
   Ldr(destination, field_operand);
   DecodeSandboxedPointer(destination);
+#else
+  UNREACHABLE();
+#endif
 }
 
 void TurboAssembler::StoreSandboxedPointerField(
     const Register& value, const MemOperand& dst_field_operand) {
+#ifdef V8_ENABLE_SANDBOX
   ASM_CODE_COMMENT(this);
   UseScratchRegisterScope temps(this);
   Register scratch = temps.AcquireX();
-  Mov(scratch, value);
-  EncodeSandboxedPointer(scratch);
+  Sub(scratch, value, kPtrComprCageBaseRegister);
+  Mov(scratch, Operand(scratch, LSL, kSandboxedPointerShift));
   Str(scratch, dst_field_operand);
+#else
+  UNREACHABLE();
+#endif
 }
 
 void TurboAssembler::LoadExternalPointerField(Register destination,
diff --git a/deps/v8/src/codegen/arm64/macro-assembler-arm64.h b/deps/v8/src/codegen/arm64/macro-assembler-arm64.h
index 4c3715b69cf060..99121e3f4b9de3 100644
--- a/deps/v8/src/codegen/arm64/macro-assembler-arm64.h
+++ b/deps/v8/src/codegen/arm64/macro-assembler-arm64.h
@@ -1056,7 +1056,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   inline void Lsl(const Register& rd, const Register& rn, unsigned shift);
   inline void Lsl(const Register& rd, const Register& rn, const Register& rm);
   inline void Umull(const Register& rd, const Register& rn, const Register& rm);
+  inline void Umulh(const Register& rd, const Register& rn, const Register& rm);
   inline void Smull(const Register& rd, const Register& rn, const Register& rm);
+  inline void Smulh(const Register& rd, const Register& rn, const Register& rm);
 
   inline void Sxtb(const Register& rd, const Register& rn);
   inline void Sxth(const Register& rd, const Register& rn);
@@ -1452,13 +1454,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   // Transform a SandboxedPointer from/to its encoded form, which is used when
   // the pointer is stored on the heap and ensures that the pointer will always
   // point into the sandbox.
-  void EncodeSandboxedPointer(const Register& value);
   void DecodeSandboxedPointer(const Register& value);
-
-  // Load and decode a SandboxedPointer from the heap.
   void LoadSandboxedPointerField(const Register& destination,
                                  const MemOperand& field_operand);
-  // Encode and store a SandboxedPointer to the heap.
   void StoreSandboxedPointerField(const Register& value,
                                   const MemOperand& dst_field_operand);
 
@@ -1630,7 +1628,6 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
                      const Register& ra);
   inline void Smsubl(const Register& rd, const Register& rn, const Register& rm,
                      const Register& ra);
-  inline void Smulh(const Register& rd, const Register& rn, const Register& rm);
   inline void Stnp(const CPURegister& rt, const CPURegister& rt2,
                    const MemOperand& dst);
   inline void Umaddl(const Register& rd, const Register& rn, const Register& rm,
@@ -1842,8 +1839,8 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
   void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
       Register flags, Register feedback_vector, CodeKind current_code_kind,
       Label* flags_need_processing);
-  void MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
-                                                    Register feedback_vector);
+  void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
+                                               Register feedback_vector);
 
   // Helpers ------------------------------------------------------------------
 
diff --git a/deps/v8/src/codegen/assembler.h b/deps/v8/src/codegen/assembler.h
index 8a8164d0739ace..1073a9d4f63432 100644
--- a/deps/v8/src/codegen/assembler.h
+++ b/deps/v8/src/codegen/assembler.h
@@ -245,7 +245,7 @@ class V8_EXPORT_PRIVATE AssemblerBase : public Malloced {
   }
 
   bool is_constant_pool_available() const {
-    if (v8_flags.enable_embedded_constant_pool) {
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
       // We need to disable constant pool here for embeded builtins
       // because the metadata section is not adjacent to instructions
       return constant_pool_available_ && !options().isolate_independent_code;
@@ -374,7 +374,7 @@ class V8_EXPORT_PRIVATE AssemblerBase : public Malloced {
   byte* pc_;
 
   void set_constant_pool_available(bool available) {
-    if (v8_flags.enable_embedded_constant_pool) {
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
       constant_pool_available_ = available;
     } else {
       // Embedded constant pool not supported on this architecture.
diff --git a/deps/v8/src/codegen/background-merge-task.h b/deps/v8/src/codegen/background-merge-task.h
index 0e7cffbaf6e90e..643a6a84efadbb 100644
--- a/deps/v8/src/codegen/background-merge-task.h
+++ b/deps/v8/src/codegen/background-merge-task.h
@@ -35,7 +35,7 @@ class V8_EXPORT_PRIVATE BackgroundMergeTask {
 
   // Step 2: on the background thread, update pointers in the new Script's
   // object graph to point to corresponding objects from the cached Script where
-  // appropriate. May only be called if HasCachedScript returned true.
+  // appropriate. May only be called if HasPendingBackgroundWork returned true.
   void BeginMergeInBackground(LocalIsolate* isolate, Handle<Script> new_script);
 
   // Step 3: on the main thread again, complete the merge so that all relevant
@@ -45,10 +45,11 @@ class V8_EXPORT_PRIVATE BackgroundMergeTask {
   Handle<SharedFunctionInfo> CompleteMergeInForeground(
       Isolate* isolate, Handle<Script> new_script);
 
-  bool HasCachedScript() const { return !cached_script_.is_null(); }
+  bool HasPendingBackgroundWork() const {
+    return state_ == kPendingBackgroundWork;
+  }
   bool HasPendingForegroundWork() const {
-    return !used_new_sfis_.empty() ||
-           !new_compiled_data_for_cached_sfis_.empty();
+    return state_ == kPendingForegroundWork;
   }
 
  private:
@@ -81,6 +82,14 @@ class V8_EXPORT_PRIVATE BackgroundMergeTask {
     Handle<FeedbackMetadata> feedback_metadata;
   };
   std::vector<NewCompiledDataForCachedSfi> new_compiled_data_for_cached_sfis_;
+
+  enum State {
+    kNotStarted,
+    kPendingBackgroundWork,
+    kPendingForegroundWork,
+    kDone,
+  };
+  State state_ = kNotStarted;
 };
 
 }  // namespace internal
diff --git a/deps/v8/src/codegen/bailout-reason.h b/deps/v8/src/codegen/bailout-reason.h
index 35056c4137de1d..cdd9e123185d14 100644
--- a/deps/v8/src/codegen/bailout-reason.h
+++ b/deps/v8/src/codegen/bailout-reason.h
@@ -28,6 +28,7 @@ namespace internal {
   V(kFunctionDataShouldBeBytecodeArrayOnInterpreterEntry,                      \
     "The function_data field should be a BytecodeArray on interpreter entry")  \
   V(kInputStringTooLong, "Input string too long")                              \
+  V(kInputDoesNotFitSmi, "Input number is too large to fit in a Smi")          \
   V(kInvalidBytecode, "Invalid bytecode")                                      \
   V(kInvalidBytecodeAdvance, "Cannot advance current bytecode, ")              \
   V(kInvalidHandleScopeLevel, "Invalid HandleScope level")                     \
diff --git a/deps/v8/src/codegen/code-stub-assembler.cc b/deps/v8/src/codegen/code-stub-assembler.cc
index 65010070276a4d..a069126f94daff 100644
--- a/deps/v8/src/codegen/code-stub-assembler.cc
+++ b/deps/v8/src/codegen/code-stub-assembler.cc
@@ -836,6 +836,15 @@ TNode<IntPtrT> CodeStubAssembler::TryIntPtrSub(TNode<IntPtrT> a,
   return Projection<0>(pair);
 }
 
+TNode<IntPtrT> CodeStubAssembler::TryIntPtrMul(TNode<IntPtrT> a,
+                                               TNode<IntPtrT> b,
+                                               Label* if_overflow) {
+  TNode<PairT<IntPtrT, BoolT>> pair = IntPtrMulWithOverflow(a, b);
+  TNode<BoolT> overflow = Projection<1>(pair);
+  GotoIf(overflow, if_overflow);
+  return Projection<0>(pair);
+}
+
 TNode<Int32T> CodeStubAssembler::TryInt32Mul(TNode<Int32T> a, TNode<Int32T> b,
                                              Label* if_overflow) {
   TNode<PairT<Int32T, BoolT>> pair = Int32MulWithOverflow(a, b);
@@ -1263,6 +1272,7 @@ TNode<HeapObject> CodeStubAssembler::AllocateRaw(TNode<IntPtrT> size_in_bytes,
     BIND(&next);
   }
 
+  adjusted_size = AlignToAllocationAlignment(adjusted_size.value());
   TNode<IntPtrT> new_top =
       IntPtrAdd(UncheckedCast<IntPtrT>(top), adjusted_size.value());
 
@@ -1542,6 +1552,33 @@ TNode<RawPtrT> CodeStubAssembler::EmptyBackingStoreBufferConstant() {
 #endif  // V8_ENABLE_SANDBOX
 }
 
+TNode<UintPtrT> CodeStubAssembler::LoadBoundedSizeFromObject(
+    TNode<HeapObject> object, TNode<IntPtrT> field_offset) {
+#ifdef V8_ENABLE_SANDBOX
+  TNode<Uint64T> raw_value = LoadObjectField<Uint64T>(object, field_offset);
+  TNode<Uint64T> shift_amount = Uint64Constant(kBoundedSizeShift);
+  TNode<Uint64T> decoded_value = Word64Shr(raw_value, shift_amount);
+  return ReinterpretCast<UintPtrT>(decoded_value);
+#else
+  return LoadObjectField<UintPtrT>(object, field_offset);
+#endif  // V8_ENABLE_SANDBOX
+}
+
+void CodeStubAssembler::StoreBoundedSizeToObject(TNode<HeapObject> object,
+                                                 TNode<IntPtrT> offset,
+                                                 TNode<UintPtrT> value) {
+#ifdef V8_ENABLE_SANDBOX
+  CSA_DCHECK(this, UintPtrLessThan(
+                       value, IntPtrConstant(kMaxSafeBufferSizeForSandbox)));
+  TNode<Uint64T> raw_value = ReinterpretCast<Uint64T>(value);
+  TNode<Uint64T> shift_amount = Uint64Constant(kBoundedSizeShift);
+  TNode<Uint64T> encoded_value = Word64Shl(raw_value, shift_amount);
+  StoreObjectFieldNoWriteBarrier<Uint64T>(object, offset, encoded_value);
+#else
+  StoreObjectFieldNoWriteBarrier<UintPtrT>(object, offset, value);
+#endif  // V8_ENABLE_SANDBOX
+}
+
 #ifdef V8_ENABLE_SANDBOX
 TNode<RawPtrT> CodeStubAssembler::ExternalPointerTableAddress(
     ExternalPointerTag tag) {
@@ -1996,7 +2033,7 @@ TNode<IntPtrT> CodeStubAssembler::LoadJSReceiverIdentityHash(
 }
 
 TNode<Uint32T> CodeStubAssembler::LoadNameHashAssumeComputed(TNode<Name> name) {
-  TNode<Uint32T> hash_field = LoadNameRawHashField(name);
+  TNode<Uint32T> hash_field = LoadNameRawHash(name);
   CSA_DCHECK(this, IsClearWord32(hash_field, Name::kHashNotComputedMask));
   return DecodeWord32<Name::HashBits>(hash_field);
 }
@@ -2011,6 +2048,42 @@ TNode<Uint32T> CodeStubAssembler::LoadNameHash(TNode<Name> name,
   return DecodeWord32<Name::HashBits>(raw_hash_field);
 }
 
+TNode<Uint32T> CodeStubAssembler::LoadNameRawHash(TNode<Name> name) {
+  TVARIABLE(Uint32T, var_raw_hash);
+
+  Label if_forwarding_index(this, Label::kDeferred), done(this);
+
+  TNode<Uint32T> raw_hash_field = LoadNameRawHashField(name);
+  GotoIf(IsSetWord32(raw_hash_field, Name::kHashNotComputedMask),
+         &if_forwarding_index);
+
+  var_raw_hash = raw_hash_field;
+  Goto(&done);
+
+  BIND(&if_forwarding_index);
+  {
+    CSA_DCHECK(this,
+               IsEqualInWord32<Name::HashFieldTypeBits>(
+                   raw_hash_field, Name::HashFieldType::kForwardingIndex));
+    TNode<ExternalReference> function =
+        ExternalConstant(ExternalReference::raw_hash_from_forward_table());
+    const TNode<ExternalReference> isolate_ptr =
+        ExternalConstant(ExternalReference::isolate_address(isolate()));
+    TNode<Uint32T> result = UncheckedCast<Uint32T>(CallCFunction(
+        function, MachineType::Uint32(),
+        std::make_pair(MachineType::Pointer(), isolate_ptr),
+        std::make_pair(
+            MachineType::Int32(),
+            DecodeWord32<Name::ForwardingIndexValueBits>(raw_hash_field))));
+
+    var_raw_hash = result;
+    Goto(&done);
+  }
+
+  BIND(&done);
+  return var_raw_hash.value();
+}
+
 TNode<Smi> CodeStubAssembler::LoadStringLengthAsSmi(TNode<String> string) {
   return SmiFromIntPtr(LoadStringLengthAsWord(string));
 }
@@ -3975,7 +4048,7 @@ TNode<JSArray> CodeStubAssembler::AllocateJSArray(
   int base_size = array_header_size;
   if (allocation_site) {
     DCHECK(V8_ALLOCATION_SITE_TRACKING_BOOL);
-    base_size += AllocationMemento::kSize;
+    base_size += ALIGN_TO_ALLOCATION_ALIGNMENT(AllocationMemento::kSize);
   }
 
   TNode<IntPtrT> size = IntPtrConstant(base_size);
@@ -3999,6 +4072,32 @@ TNode<FixedArrayBase> InnerAllocateElements(CodeStubAssembler* csa,
 
 }  // namespace
 
+TNode<IntPtrT> CodeStubAssembler::AlignToAllocationAlignment(
+    TNode<IntPtrT> value) {
+  if (!V8_COMPRESS_POINTERS_8GB_BOOL) return value;
+
+  Label not_aligned(this), is_aligned(this);
+  TVARIABLE(IntPtrT, result, value);
+
+  Branch(WordIsAligned(value, kObjectAlignment8GbHeap), &is_aligned,
+         &not_aligned);
+
+  BIND(&not_aligned);
+  {
+    if (kObjectAlignment8GbHeap == 2 * kTaggedSize) {
+      result = IntPtrAdd(value, IntPtrConstant(kTaggedSize));
+    } else {
+      result =
+          WordAnd(IntPtrAdd(value, IntPtrConstant(kObjectAlignment8GbHeapMask)),
+                  IntPtrConstant(~kObjectAlignment8GbHeapMask));
+    }
+    Goto(&is_aligned);
+  }
+
+  BIND(&is_aligned);
+  return result.value();
+}
+
 std::pair<TNode<JSArray>, TNode<FixedArrayBase>>
 CodeStubAssembler::AllocateUninitializedJSArrayWithElements(
     ElementsKind kind, TNode<Map> array_map, TNode<Smi> length,
@@ -4039,17 +4138,18 @@ CodeStubAssembler::AllocateUninitializedJSArrayWithElements(
 
   BIND(&nonempty);
   {
-    int base_size = array_header_size;
+    int base_size = ALIGN_TO_ALLOCATION_ALIGNMENT(array_header_size);
     if (allocation_site) {
       DCHECK(V8_ALLOCATION_SITE_TRACKING_BOOL);
-      base_size += AllocationMemento::kSize;
+      base_size += ALIGN_TO_ALLOCATION_ALIGNMENT(AllocationMemento::kSize);
     }
 
     const int elements_offset = base_size;
 
     // Compute space for elements
     base_size += FixedArray::kHeaderSize;
-    TNode<IntPtrT> size = ElementOffsetFromIndex(capacity, kind, base_size);
+    TNode<IntPtrT> size = AlignToAllocationAlignment(
+        ElementOffsetFromIndex(capacity, kind, base_size));
 
     // For very large arrays in which the requested allocation exceeds the
     // maximal size of a regular heap object, we cannot use the allocation
@@ -4125,8 +4225,10 @@ TNode<JSArray> CodeStubAssembler::AllocateUninitializedJSArray(
 
   if (allocation_site) {
     DCHECK(V8_ALLOCATION_SITE_TRACKING_BOOL);
-    InitializeAllocationMemento(array, IntPtrConstant(JSArray::kHeaderSize),
-                                *allocation_site);
+    InitializeAllocationMemento(
+        array,
+        IntPtrConstant(ALIGN_TO_ALLOCATION_ALIGNMENT(JSArray::kHeaderSize)),
+        *allocation_site);
   }
 
   return CAST(array);
@@ -6760,6 +6862,9 @@ TNode<BoolT> CodeStubAssembler::IsUniqueName(TNode<HeapObject> object) {
 // characters, or is outside MAX_SAFE_INTEGER/size_t range). Note that for
 // non-TypedArray receivers, there are additional strings that must be treated
 // as named property keys, namely the range [0xFFFFFFFF, MAX_SAFE_INTEGER].
+// TODO(pthier): Handle forwarding indices correctly. The forwarded hash could
+// be an integer index. Consider using 1 bit of the forward index to indicate
+// the type of the forwarded hash.
 TNode<BoolT> CodeStubAssembler::IsUniqueNameNoIndex(TNode<HeapObject> object) {
   TNode<Uint16T> instance_type = LoadInstanceType(object);
   return Select<BoolT>(
@@ -6784,7 +6889,7 @@ TNode<BoolT> CodeStubAssembler::IsUniqueNameNoCachedIndex(
   return Select<BoolT>(
       IsInternalizedStringInstanceType(instance_type),
       [=] {
-        return IsSetWord32(LoadNameRawHashField(CAST(object)),
+        return IsSetWord32(LoadNameRawHash(CAST(object)),
                            Name::kDoesNotContainCachedArrayIndexMask);
       },
       [=] { return IsSymbolInstanceType(instance_type); });
@@ -6799,6 +6904,26 @@ TNode<BoolT> CodeStubAssembler::IsBigInt(TNode<HeapObject> object) {
   return IsBigIntInstanceType(LoadInstanceType(object));
 }
 
+void CodeStubAssembler::GotoIfLargeBigInt(TNode<BigInt> bigint,
+                                          Label* true_label) {
+  // Small BigInts are BigInts in the range [-2^63 + 1, 2^63 - 1] so that they
+  // can fit in 64-bit registers. Excluding -2^63 from the range makes the check
+  // simpler and faster. The other BigInts are seen as "large".
+  // TODO(panq): We might need to reevaluate of the range of small BigInts.
+  DCHECK(Is64());
+  Label false_label(this);
+  TNode<Uint32T> length =
+      DecodeWord32<BigIntBase::LengthBits>(LoadBigIntBitfield(bigint));
+  GotoIf(Word32Equal(length, Uint32Constant(0)), &false_label);
+  GotoIfNot(Word32Equal(length, Uint32Constant(1)), true_label);
+  Branch(WordEqual(UintPtrConstant(0),
+                   WordAnd(LoadBigIntDigit(bigint, 0),
+                           UintPtrConstant(static_cast<uintptr_t>(
+                               1ULL << (sizeof(uintptr_t) * 8 - 1))))),
+         &false_label, true_label);
+  Bind(&false_label);
+}
+
 TNode<BoolT> CodeStubAssembler::IsPrimitiveInstanceType(
     TNode<Int32T> instance_type) {
   return Int32LessThanOrEqual(instance_type,
@@ -8555,14 +8680,18 @@ void CodeStubAssembler::NameDictionaryLookup(
                     std::is_same<Dictionary, GlobalDictionary>::value ||
                     std::is_same<Dictionary, NameToIndexHashTable>::value,
                 "Unexpected NameDictionary");
-  DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep());
+  DCHECK_IMPLIES(var_name_index != nullptr,
+                 MachineType::PointerRepresentation() == var_name_index->rep());
   DCHECK_IMPLIES(mode == kFindInsertionIndex, if_found == nullptr);
   Comment("NameDictionaryLookup");
   CSA_DCHECK(this, IsUniqueName(unique_name));
 
+  Label if_not_computed(this, Label::kDeferred);
+
   TNode<IntPtrT> capacity = SmiUntag(GetCapacity<Dictionary>(dictionary));
   TNode<IntPtrT> mask = IntPtrSub(capacity, IntPtrConstant(1));
-  TNode<UintPtrT> hash = ChangeUint32ToWord(LoadNameHash(unique_name));
+  TNode<UintPtrT> hash =
+      ChangeUint32ToWord(LoadNameHash(unique_name, &if_not_computed));
 
   // See Dictionary::FirstProbe().
   TNode<IntPtrT> count = IntPtrConstant(0);
@@ -8570,11 +8699,13 @@ void CodeStubAssembler::NameDictionaryLookup(
   TNode<Oddball> undefined = UndefinedConstant();
 
   // Appease the variable merging algorithm for "Goto(&loop)" below.
-  *var_name_index = IntPtrConstant(0);
+  if (var_name_index) *var_name_index = IntPtrConstant(0);
 
   TVARIABLE(IntPtrT, var_count, count);
   TVARIABLE(IntPtrT, var_entry, initial_entry);
-  Label loop(this, {&var_count, &var_entry, var_name_index});
+  VariableList loop_vars({&var_count, &var_entry}, zone());
+  if (var_name_index) loop_vars.push_back(var_name_index);
+  Label loop(this, loop_vars);
   Goto(&loop);
   BIND(&loop);
   {
@@ -8582,7 +8713,7 @@ void CodeStubAssembler::NameDictionaryLookup(
     TNode<IntPtrT> entry = var_entry.value();
 
     TNode<IntPtrT> index = EntryToIndex<Dictionary>(entry);
-    *var_name_index = index;
+    if (var_name_index) *var_name_index = index;
 
     TNode<HeapObject> current =
         CAST(UnsafeLoadFixedArrayElement(dictionary, index));
@@ -8607,6 +8738,52 @@ void CodeStubAssembler::NameDictionaryLookup(
     var_entry = entry;
     Goto(&loop);
   }
+
+  BIND(&if_not_computed);
+  {
+    // Strings will only have the forwarding index with experimental shared
+    // memory features turned on. To minimize affecting the fast path, the
+    // forwarding index branch defers both fetching the actual hash value and
+    // the dictionary lookup to the runtime.
+    ExternalReference func_ref;
+    if constexpr (std::is_same<Dictionary, NameDictionary>::value) {
+      func_ref =
+          mode == kFindExisting
+              ? ExternalReference::name_dictionary_lookup_forwarded_string()
+              : ExternalReference::
+                    name_dictionary_find_insertion_entry_forwarded_string();
+    } else if constexpr (std::is_same<Dictionary, GlobalDictionary>::value) {
+      func_ref =
+          mode == kFindExisting
+              ? ExternalReference::global_dictionary_lookup_forwarded_string()
+              : ExternalReference::
+                    global_dictionary_find_insertion_entry_forwarded_string();
+    } else {
+      func_ref =
+          mode == kFindExisting
+              ? ExternalReference::
+                    name_to_index_hashtable_lookup_forwarded_string()
+              : ExternalReference::
+                    name_to_index_hashtable_find_insertion_entry_forwarded_string();
+    }
+    const TNode<ExternalReference> function = ExternalConstant(func_ref);
+    const TNode<ExternalReference> isolate_ptr =
+        ExternalConstant(ExternalReference::isolate_address(isolate()));
+    TNode<IntPtrT> entry = UncheckedCast<IntPtrT>(CallCFunction(
+        function, MachineType::IntPtr(),
+        std::make_pair(MachineType::Pointer(), isolate_ptr),
+        std::make_pair(MachineType::TaggedPointer(), dictionary),
+        std::make_pair(MachineType::TaggedPointer(), unique_name)));
+    if (var_name_index) *var_name_index = EntryToIndex<Dictionary>(entry);
+    if (mode == kFindExisting) {
+      GotoIf(IntPtrEqual(entry,
+                         IntPtrConstant(InternalIndex::NotFound().raw_value())),
+             if_not_found);
+      Goto(if_found);
+    } else {
+      Goto(if_not_found);
+    }
+  }
 }
 
 // Instantiate template methods to workaround GCC compilation issue.
@@ -11570,7 +11747,8 @@ void CodeStubAssembler::TrapAllocationMemento(TNode<JSObject> object,
 
   TNode<ExternalReference> new_space_top_address = ExternalConstant(
       ExternalReference::new_space_allocation_top_address(isolate()));
-  const int kMementoMapOffset = JSArray::kHeaderSize;
+  const int kMementoMapOffset =
+      ALIGN_TO_ALLOCATION_ALIGNMENT(JSArray::kHeaderSize);
   const int kMementoLastWordOffset =
       kMementoMapOffset + AllocationMemento::kSize - kTaggedSize;
 
@@ -13730,7 +13908,7 @@ TNode<HeapObject> CodeStubAssembler::GetSuperConstructor(
   return LoadMapPrototype(map);
 }
 
-void CodeStubAssembler::FindNonDefaultConstructor(
+void CodeStubAssembler::FindNonDefaultConstructorOrConstruct(
     TNode<Context> context, TNode<JSFunction> this_function,
     TVariable<Object>& constructor, Label* found_default_base_ctor,
     Label* found_something_else) {
@@ -13758,10 +13936,16 @@ void CodeStubAssembler::FindNonDefaultConstructor(
     GotoIfNot(IsJSFunction(CAST(constructor.value())), found_something_else);
 
     // If there are class fields, bail out. TODO(v8:13091): Handle them here.
-    TNode<Oddball> has_class_fields =
-        HasProperty(context, constructor.value(), ClassFieldsSymbolConstant(),
-                    kHasProperty);
-    GotoIf(IsTrue(has_class_fields), found_something_else);
+    const TNode<SharedFunctionInfo> shared_function_info =
+        LoadObjectField<SharedFunctionInfo>(
+            CAST(constructor.value()), JSFunction::kSharedFunctionInfoOffset);
+    const TNode<Uint32T> has_class_fields =
+        DecodeWord32<SharedFunctionInfo::RequiresInstanceMembersInitializerBit>(
+            LoadObjectField<Uint32T>(shared_function_info,
+                                     SharedFunctionInfo::kFlagsOffset));
+
+    GotoIf(Word32NotEqual(has_class_fields, Int32Constant(0)),
+           found_something_else);
 
     // If there are private methods, bail out. TODO(v8:13091): Handle them here.
     TNode<Context> function_context =
@@ -14145,7 +14329,8 @@ TNode<JSObject> CodeStubAssembler::AllocateJSIteratorResultForEntry(
   StoreFixedArrayElement(elements, 1, value);
   TNode<Map> array_map = CAST(LoadContextElement(
       native_context, Context::JS_ARRAY_PACKED_ELEMENTS_MAP_INDEX));
-  TNode<HeapObject> array = Allocate(JSArray::kHeaderSize);
+  TNode<HeapObject> array =
+      Allocate(ALIGN_TO_ALLOCATION_ALIGNMENT(JSArray::kHeaderSize));
   StoreMapNoWriteBarrier(array, array_map);
   StoreObjectFieldRoot(array, JSArray::kPropertiesOrHashOffset,
                        RootIndex::kEmptyFixedArray);
@@ -14190,6 +14375,18 @@ void CodeStubAssembler::ThrowIfArrayBufferViewBufferIsDetached(
   ThrowIfArrayBufferIsDetached(context, buffer, method_name);
 }
 
+TNode<UintPtrT> CodeStubAssembler::LoadJSArrayBufferByteLength(
+    TNode<JSArrayBuffer> array_buffer) {
+  return LoadBoundedSizeFromObject(array_buffer,
+                                   JSArrayBuffer::kRawByteLengthOffset);
+}
+
+TNode<UintPtrT> CodeStubAssembler::LoadJSArrayBufferMaxByteLength(
+    TNode<JSArrayBuffer> array_buffer) {
+  return LoadBoundedSizeFromObject(array_buffer,
+                                   JSArrayBuffer::kRawMaxByteLengthOffset);
+}
+
 TNode<RawPtrT> CodeStubAssembler::LoadJSArrayBufferBackingStorePtr(
     TNode<JSArrayBuffer> array_buffer) {
   return LoadSandboxedPointerFromObject(array_buffer,
@@ -14202,16 +14399,38 @@ TNode<JSArrayBuffer> CodeStubAssembler::LoadJSArrayBufferViewBuffer(
                                         JSArrayBufferView::kBufferOffset);
 }
 
-TNode<UintPtrT> CodeStubAssembler::LoadJSArrayBufferViewRawByteLength(
+TNode<UintPtrT> CodeStubAssembler::LoadJSArrayBufferViewByteLength(
     TNode<JSArrayBufferView> array_buffer_view) {
-  return LoadObjectField<UintPtrT>(array_buffer_view,
-                                   JSArrayBufferView::kByteLengthOffset);
+  return LoadBoundedSizeFromObject(array_buffer_view,
+                                   JSArrayBufferView::kRawByteLengthOffset);
+}
+
+void CodeStubAssembler::StoreJSArrayBufferViewByteLength(
+    TNode<JSArrayBufferView> array_buffer_view, TNode<UintPtrT> value) {
+  StoreBoundedSizeToObject(array_buffer_view,
+                           JSArrayBufferView::kRawByteLengthOffset, value);
 }
 
 TNode<UintPtrT> CodeStubAssembler::LoadJSArrayBufferViewByteOffset(
     TNode<JSArrayBufferView> array_buffer_view) {
-  return LoadObjectField<UintPtrT>(array_buffer_view,
-                                   JSArrayBufferView::kByteOffsetOffset);
+  return LoadBoundedSizeFromObject(array_buffer_view,
+                                   JSArrayBufferView::kRawByteOffsetOffset);
+}
+
+void CodeStubAssembler::StoreJSArrayBufferViewByteOffset(
+    TNode<JSArrayBufferView> array_buffer_view, TNode<UintPtrT> value) {
+  StoreBoundedSizeToObject(array_buffer_view,
+                           JSArrayBufferView::kRawByteOffsetOffset, value);
+}
+
+TNode<UintPtrT> CodeStubAssembler::LoadJSTypedArrayLength(
+    TNode<JSTypedArray> typed_array) {
+  return LoadBoundedSizeFromObject(typed_array, JSTypedArray::kRawLengthOffset);
+}
+
+void CodeStubAssembler::StoreJSTypedArrayLength(TNode<JSTypedArray> typed_array,
+                                                TNode<UintPtrT> value) {
+  StoreBoundedSizeToObject(typed_array, JSTypedArray::kRawLengthOffset, value);
 }
 
 TNode<UintPtrT> CodeStubAssembler::LoadJSTypedArrayLengthAndCheckDetached(
@@ -14309,7 +14528,7 @@ CodeStubAssembler::LoadVariableLengthJSArrayBufferViewByteLength(
       // Check if the backing RAB has shrunk so that the buffer is out of
       // bounds.
       TNode<UintPtrT> array_byte_length =
-          LoadJSArrayBufferViewRawByteLength(array);
+          LoadJSArrayBufferViewByteLength(array);
       GotoIfNot(UintPtrGreaterThanOrEqual(
                     buffer_byte_length,
                     UintPtrAdd(array_byte_offset, array_byte_length)),
@@ -14354,7 +14573,7 @@ void CodeStubAssembler::IsJSArrayBufferViewDetachedOrOutOfBounds(
       // Check if the backing RAB has shrunk so that the buffer is out of
       // bounds.
       TNode<UintPtrT> array_byte_length =
-          LoadJSArrayBufferViewRawByteLength(array_buffer_view);
+          LoadJSArrayBufferViewByteLength(array_buffer_view);
       Branch(UintPtrGreaterThanOrEqual(
                  buffer_byte_length,
                  UintPtrAdd(array_byte_offset, array_byte_length)),
diff --git a/deps/v8/src/codegen/code-stub-assembler.h b/deps/v8/src/codegen/code-stub-assembler.h
index b53b8465baa79f..6d654b5d5fa3f9 100644
--- a/deps/v8/src/codegen/code-stub-assembler.h
+++ b/deps/v8/src/codegen/code-stub-assembler.h
@@ -71,9 +71,9 @@ enum class PrimitiveType { kBoolean, kNumber, kString, kSymbol };
   V(AsyncGeneratorReturnResolveSharedFun,                                      \
     async_generator_return_resolve_shared_fun,                                 \
     AsyncGeneratorReturnResolveSharedFun)                                      \
-  V(AsyncGeneratorYieldResolveSharedFun,                                       \
-    async_generator_yield_resolve_shared_fun,                                  \
-    AsyncGeneratorYieldResolveSharedFun)                                       \
+  V(AsyncGeneratorYieldWithAwaitResolveSharedFun,                              \
+    async_generator_yield_with_await_resolve_shared_fun,                       \
+    AsyncGeneratorYieldWithAwaitResolveSharedFun)                              \
   V(AsyncIteratorValueUnwrapSharedFun, async_iterator_value_unwrap_shared_fun, \
     AsyncIteratorValueUnwrapSharedFun)                                         \
   V(IsConcatSpreadableProtector, is_concat_spreadable_protector,               \
@@ -628,6 +628,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
                               Label* if_overflow);
   TNode<IntPtrT> TryIntPtrSub(TNode<IntPtrT> a, TNode<IntPtrT> b,
                               Label* if_overflow);
+  TNode<IntPtrT> TryIntPtrMul(TNode<IntPtrT> a, TNode<IntPtrT> b,
+                              Label* if_overflow);
   TNode<Int32T> TryInt32Mul(TNode<Int32T> a, TNode<Int32T> b,
                             Label* if_overflow);
   TNode<Smi> TrySmiAdd(TNode<Smi> a, TNode<Smi> b, Label* if_overflow);
@@ -772,11 +774,18 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
   void GotoIfNumber(TNode<Object> value, Label* is_number);
   TNode<Number> SmiToNumber(TNode<Smi> v) { return v; }
 
+  // BigInt operations.
+  void GotoIfLargeBigInt(TNode<BigInt> bigint, Label* true_label);
+
   TNode<Number> BitwiseOp(TNode<Word32T> left32, TNode<Word32T> right32,
                           Operation bitwise_op);
   TNode<Number> BitwiseSmiOp(TNode<Smi> left32, TNode<Smi> right32,
                              Operation bitwise_op);
 
+  // Align the value to kObjectAlignment8GbHeap if V8_COMPRESS_POINTERS_8GB is
+  // defined.
+  TNode<IntPtrT> AlignToAllocationAlignment(TNode<IntPtrT> value);
+
   // Allocate an object of the given size.
   TNode<HeapObject> AllocateInNewSpace(
       TNode<IntPtrT> size, AllocationFlags flags = AllocationFlag::kNone);
@@ -1078,10 +1087,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
   void GotoIfForceSlowPath(Label* if_true);
 
   //
-  // Caged pointer related functionality.
+  // Sandboxed pointer related functionality.
   //
 
-  // Load a caged pointer value from an object.
+  // Load a sandboxed pointer value from an object.
   TNode<RawPtrT> LoadSandboxedPointerFromObject(TNode<HeapObject> object,
                                                 int offset) {
     return LoadSandboxedPointerFromObject(object, IntPtrConstant(offset));
@@ -1090,7 +1099,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
   TNode<RawPtrT> LoadSandboxedPointerFromObject(TNode<HeapObject> object,
                                                 TNode<IntPtrT> offset);
 
-  // Stored a caged pointer value to an object.
+  // Stored a sandboxed pointer value to an object.
   void StoreSandboxedPointerToObject(TNode<HeapObject> object, int offset,
                                      TNode<RawPtrT> pointer) {
     StoreSandboxedPointerToObject(object, IntPtrConstant(offset), pointer);
@@ -1102,6 +1111,27 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
 
   TNode<RawPtrT> EmptyBackingStoreBufferConstant();
 
+  //
+  // Bounded size related functionality.
+  //
+
+  // Load a bounded size value from an object.
+  TNode<UintPtrT> LoadBoundedSizeFromObject(TNode<HeapObject> object,
+                                            int offset) {
+    return LoadBoundedSizeFromObject(object, IntPtrConstant(offset));
+  }
+
+  TNode<UintPtrT> LoadBoundedSizeFromObject(TNode<HeapObject> object,
+                                            TNode<IntPtrT> offset);
+
+  // Stored a bounded size value to an object.
+  void StoreBoundedSizeToObject(TNode<HeapObject> object, int offset,
+                                TNode<UintPtrT> value) {
+    StoreBoundedSizeToObject(object, IntPtrConstant(offset), value);
+  }
+
+  void StoreBoundedSizeToObject(TNode<HeapObject> object, TNode<IntPtrT> offset,
+                                TNode<UintPtrT> value);
   //
   // ExternalPointerT-related functionality.
   //
@@ -1451,6 +1481,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
                               Label* if_hash_not_computed = nullptr);
   TNode<Uint32T> LoadNameHashAssumeComputed(TNode<Name> name);
 
+  // Load the Name::RawHash() value of a name as an uint32 value. Follows
+  // through the forwarding table.
+  TNode<Uint32T> LoadNameRawHash(TNode<Name> name);
+
   // Load length field of a String object as Smi value.
   TNode<Smi> LoadStringLengthAsSmi(TNode<String> string);
   // Load length field of a String object as intptr_t value.
@@ -2047,11 +2081,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
                                         Label* if_bailout);
   TNode<Object> GetConstructor(TNode<Map> map);
 
-  void FindNonDefaultConstructor(TNode<Context> context,
-                                 TNode<JSFunction> this_function,
-                                 TVariable<Object>& constructor,
-                                 Label* found_default_base_ctor,
-                                 Label* found_something_else);
+  void FindNonDefaultConstructorOrConstruct(TNode<Context> context,
+                                            TNode<JSFunction> this_function,
+                                            TVariable<Object>& constructor,
+                                            Label* found_default_base_ctor,
+                                            Label* found_something_else);
 
   TNode<Map> GetInstanceTypeMap(InstanceType instance_type);
 
@@ -2720,6 +2754,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
         ExternalReference::address_of_shared_string_table_flag());
   }
 
+  TNode<BoolT> HasHarmonySymbolAsWeakmapKeyFlag() {
+    return LoadRuntimeFlag(
+        ExternalReference::
+            address_of_FLAG_harmony_symbol_as_weakmap_key());
+  }
+
   // True iff |object| is a Smi or a HeapNumber or a BigInt.
   TNode<BoolT> IsNumeric(TNode<Object> object);
 
@@ -3738,6 +3778,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
   TNode<BoolT> IsSideEffectFreeDebuggingActive();
 
   // JSArrayBuffer helpers
+  TNode<UintPtrT> LoadJSArrayBufferByteLength(
+      TNode<JSArrayBuffer> array_buffer);
+  TNode<UintPtrT> LoadJSArrayBufferMaxByteLength(
+      TNode<JSArrayBuffer> array_buffer);
   TNode<RawPtrT> LoadJSArrayBufferBackingStorePtr(
       TNode<JSArrayBuffer> array_buffer);
   void ThrowIfArrayBufferIsDetached(TNode<Context> context,
@@ -3747,16 +3791,22 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
   // JSArrayBufferView helpers
   TNode<JSArrayBuffer> LoadJSArrayBufferViewBuffer(
       TNode<JSArrayBufferView> array_buffer_view);
-  TNode<UintPtrT> LoadJSArrayBufferViewRawByteLength(
+  TNode<UintPtrT> LoadJSArrayBufferViewByteLength(
       TNode<JSArrayBufferView> array_buffer_view);
-
+  void StoreJSArrayBufferViewByteLength(
+      TNode<JSArrayBufferView> array_buffer_view, TNode<UintPtrT> value);
   TNode<UintPtrT> LoadJSArrayBufferViewByteOffset(
       TNode<JSArrayBufferView> array_buffer_view);
+  void StoreJSArrayBufferViewByteOffset(
+      TNode<JSArrayBufferView> array_buffer_view, TNode<UintPtrT> value);
   void ThrowIfArrayBufferViewBufferIsDetached(
       TNode<Context> context, TNode<JSArrayBufferView> array_buffer_view,
       const char* method_name);
 
   // JSTypedArray helpers
+  TNode<UintPtrT> LoadJSTypedArrayLength(TNode<JSTypedArray> typed_array);
+  void StoreJSTypedArrayLength(TNode<JSTypedArray> typed_array,
+                               TNode<UintPtrT> value);
   TNode<UintPtrT> LoadJSTypedArrayLengthAndCheckDetached(
       TNode<JSTypedArray> typed_array, Label* detached);
   // Helper for length tracking JSTypedArrays and JSTypedArrays backed by
diff --git a/deps/v8/src/codegen/compiler.cc b/deps/v8/src/codegen/compiler.cc
index a0636afc787c30..5431deb83e743d 100644
--- a/deps/v8/src/codegen/compiler.cc
+++ b/deps/v8/src/codegen/compiler.cc
@@ -176,13 +176,14 @@ class CompilerTracer : public AllStatic {
            function->DebugNameCStr().get(), osr_offset.ToInt(), ToString(mode));
   }
 
-  static void TraceCompilationStats(Isolate* isolate,
-                                    OptimizedCompilationInfo* info,
-                                    double ms_creategraph, double ms_optimize,
-                                    double ms_codegen) {
+  static void TraceFinishTurbofanCompile(Isolate* isolate,
+                                         OptimizedCompilationInfo* info,
+                                         double ms_creategraph,
+                                         double ms_optimize,
+                                         double ms_codegen) {
     if (!v8_flags.trace_opt || !info->IsOptimizing()) return;
     CodeTracer::Scope scope(isolate->GetCodeTracer());
-    PrintTracePrefix(scope, "optimizing", info);
+    PrintTracePrefix(scope, "completed compiling", info);
     if (info->is_osr()) PrintF(scope.file(), " OSR");
     PrintF(scope.file(), " - took %0.3f, %0.3f, %0.3f ms", ms_creategraph,
            ms_optimize, ms_codegen);
@@ -194,7 +195,7 @@ class CompilerTracer : public AllStatic {
                                          double ms_timetaken) {
     if (!v8_flags.trace_baseline) return;
     CodeTracer::Scope scope(isolate->GetCodeTracer());
-    PrintTracePrefix(scope, "compiling", shared, CodeKind::BASELINE);
+    PrintTracePrefix(scope, "completed compiling", shared, CodeKind::BASELINE);
     PrintF(scope.file(), " - took %0.3f ms", ms_timetaken);
     PrintTraceSuffix(scope);
   }
@@ -525,7 +526,7 @@ void TurbofanCompilationJob::RecordCompilationStats(ConcurrencyMode mode,
   double ms_creategraph = time_taken_to_prepare_.InMillisecondsF();
   double ms_optimize = time_taken_to_execute_.InMillisecondsF();
   double ms_codegen = time_taken_to_finalize_.InMillisecondsF();
-  CompilerTracer::TraceCompilationStats(
+  CompilerTracer::TraceFinishTurbofanCompile(
       isolate, compilation_info(), ms_creategraph, ms_optimize, ms_codegen);
   if (v8_flags.trace_opt_stats) {
     static double compilation_time = 0.0;
@@ -1074,8 +1075,9 @@ bool CompileTurbofan_Concurrent(Isolate* isolate,
 
   TimerEventScope<TimerEventRecompileSynchronous> timer(isolate);
   RCS_SCOPE(isolate, RuntimeCallCounterId::kOptimizeConcurrentPrepare);
-  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
-               "V8.OptimizeConcurrentPrepare");
+  TRACE_EVENT_WITH_FLOW0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+                         "V8.OptimizeConcurrentPrepare", job.get(),
+                         TRACE_EVENT_FLAG_FLOW_OUT);
 
   if (!PrepareJobWithHandleScope(job.get(), isolate, compilation_info,
                                  ConcurrencyMode::kConcurrent)) {
@@ -1209,6 +1211,10 @@ MaybeHandle<CodeT> CompileMaglev(Isolate* isolate, Handle<JSFunction> function,
   auto job = maglev::MaglevCompilationJob::New(isolate, function);
 
   {
+    TRACE_EVENT_WITH_FLOW0(
+        TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+        IsSynchronous(mode) ? "V8.MaglevPrepare" : "V8.MaglevConcurrentPrepare",
+        job.get(), TRACE_EVENT_FLAG_FLOW_OUT);
     CompilerTracer::TraceStartMaglevCompile(isolate, function, mode);
     CompilationJob::Status status = job->PrepareJob(isolate);
     CHECK_EQ(status, CompilationJob::SUCCEEDED);  // TODO(v8:7700): Use status.
@@ -1959,13 +1965,18 @@ void BackgroundMergeTask::SetUpOnMainThread(Isolate* isolate,
                                             Handle<String> source_text,
                                             const ScriptDetails& script_details,
                                             LanguageMode language_mode) {
+  DCHECK_EQ(state_, kNotStarted);
+
   HandleScope handle_scope(isolate);
 
   CompilationCacheScript::LookupResult lookup_result =
       isolate->compilation_cache()->LookupScript(source_text, script_details,
                                                  language_mode);
   Handle<Script> script;
-  if (!lookup_result.script().ToHandle(&script)) return;
+  if (!lookup_result.script().ToHandle(&script)) {
+    state_ = kDone;
+    return;
+  }
 
   // Any data sent to the background thread will need to be a persistent handle.
   persistent_handles_ = std::make_unique<PersistentHandles>(isolate);
@@ -1976,15 +1987,19 @@ void BackgroundMergeTask::SetUpOnMainThread(Isolate* isolate,
     // from the cache, assuming the top-level SFI is still compiled by then.
     // Thus, there is no need to keep the Script pointer for background merging.
     // Do nothing in this case.
+    state_ = kDone;
   } else {
     DCHECK(lookup_result.toplevel_sfi().is_null());
     // A background merge is required.
+    state_ = kPendingBackgroundWork;
     cached_script_ = persistent_handles_->NewHandle(*script);
   }
 }
 
 void BackgroundMergeTask::BeginMergeInBackground(LocalIsolate* isolate,
                                                  Handle<Script> new_script) {
+  DCHECK_EQ(state_, kPendingBackgroundWork);
+
   LocalHeap* local_heap = isolate->heap();
   local_heap->AttachPersistentHandles(std::move(persistent_handles_));
   LocalHandleScope handle_scope(local_heap);
@@ -2057,10 +2072,14 @@ void BackgroundMergeTask::BeginMergeInBackground(LocalIsolate* isolate,
   if (forwarder.HasAnythingToForward()) {
     forwarder.IterateAndForwardPointers();
   }
+
+  state_ = kPendingForegroundWork;
 }
 
 Handle<SharedFunctionInfo> BackgroundMergeTask::CompleteMergeInForeground(
     Isolate* isolate, Handle<Script> new_script) {
+  DCHECK_EQ(state_, kPendingForegroundWork);
+
   HandleScope handle_scope(isolate);
   ConstantPoolPointerForwarder forwarder(isolate,
                                          isolate->main_thread_local_heap());
@@ -2119,10 +2138,7 @@ Handle<SharedFunctionInfo> BackgroundMergeTask::CompleteMergeInForeground(
       SharedFunctionInfo::cast(maybe_toplevel_sfi.GetHeapObjectAssumeWeak()),
       isolate);
 
-  // Abandon the persistent handles from the background thread, so that
-  // future calls to HasPendingForegroundWork return false.
-  used_new_sfis_.clear();
-  new_compiled_data_for_cached_sfis_.clear();
+  state_ = kDone;
 
   return handle_scope.CloseAndEscape(result);
 }
@@ -2303,14 +2319,14 @@ void BackgroundCompileTask::SourceTextAvailable(
 
 bool BackgroundDeserializeTask::ShouldMergeWithExistingScript() const {
   DCHECK(v8_flags.merge_background_deserialized_script_with_compilation_cache);
-  return background_merge_task_.HasCachedScript() &&
+  return background_merge_task_.HasPendingBackgroundWork() &&
          off_thread_data_.HasResult();
 }
 
 bool BackgroundCompileTask::ShouldMergeWithExistingScript() const {
   DCHECK(v8_flags.stress_background_compile);
   DCHECK(!script_.is_null());
-  return background_merge_task_.HasCachedScript() &&
+  return background_merge_task_.HasPendingBackgroundWork() &&
          jobs_to_retry_finalization_on_main_thread_.empty();
 }
 
@@ -2676,31 +2692,6 @@ bool Compiler::CompileBaseline(Isolate* isolate, Handle<JSFunction> function,
   return true;
 }
 
-// static
-bool Compiler::CompileMaglev(Isolate* isolate, Handle<JSFunction> function,
-                             ConcurrencyMode mode,
-                             IsCompiledScope* is_compiled_scope) {
-#ifdef V8_ENABLE_MAGLEV
-  // Bytecode must be available for maglev compilation.
-  DCHECK(is_compiled_scope->is_compiled());
-  // TODO(v8:7700): Support concurrent compilation.
-  DCHECK(IsSynchronous(mode));
-
-  // Maglev code needs a feedback vector.
-  JSFunction::EnsureFeedbackVector(isolate, function, is_compiled_scope);
-
-  MaybeHandle<CodeT> maybe_code = Maglev::Compile(isolate, function);
-  Handle<CodeT> code;
-  if (!maybe_code.ToHandle(&code)) return false;
-
-  DCHECK_EQ(code->kind(), CodeKind::MAGLEV);
-  function->set_code(*code);
-  return true;
-#else
-  return false;
-#endif  // V8_ENABLE_MAGLEV
-}
-
 // static
 MaybeHandle<SharedFunctionInfo> Compiler::CompileToplevel(
     ParseInfo* parse_info, Handle<Script> script, Isolate* isolate,
@@ -2758,10 +2749,11 @@ void Compiler::CompileOptimized(Isolate* isolate, Handle<JSFunction> function,
 
 // static
 MaybeHandle<SharedFunctionInfo> Compiler::CompileForLiveEdit(
-    ParseInfo* parse_info, Handle<Script> script, Isolate* isolate) {
+    ParseInfo* parse_info, Handle<Script> script,
+    MaybeHandle<ScopeInfo> outer_scope_info, Isolate* isolate) {
   IsCompiledScope is_compiled_scope;
-  return Compiler::CompileToplevel(parse_info, script, isolate,
-                                   &is_compiled_scope);
+  return v8::internal::CompileToplevel(parse_info, script, outer_scope_info,
+                                       isolate, &is_compiled_scope);
 }
 
 // static
@@ -3290,8 +3282,6 @@ MaybeHandle<SharedFunctionInfo> CompileScriptOnMainThread(
   if (!maybe_script.ToHandle(&script)) {
     script = NewScript(isolate, &parse_info, source, script_details, natives);
   }
-  DCHECK_IMPLIES(parse_info.flags().collect_type_profile(),
-                 script->IsUserJavaScript());
   DCHECK_EQ(parse_info.flags().is_repl_mode(), script->is_repl_mode());
 
   return Compiler::CompileToplevel(&parse_info, script, isolate,
@@ -3939,8 +3929,9 @@ void Compiler::FinalizeTurbofanCompilationJob(TurbofanCompilationJob* job,
 
   TimerEventScope<TimerEventRecompileSynchronous> timer(isolate);
   RCS_SCOPE(isolate, RuntimeCallCounterId::kOptimizeConcurrentFinalize);
-  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
-               "V8.OptimizeConcurrentFinalize");
+  TRACE_EVENT_WITH_FLOW0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+                         "V8.OptimizeConcurrentFinalize", job,
+                         TRACE_EVENT_FLAG_FLOW_IN);
 
   Handle<JSFunction> function = compilation_info->closure();
   Handle<SharedFunctionInfo> shared = compilation_info->shared_info();
@@ -4020,9 +4011,9 @@ void Compiler::FinalizeMaglevCompilationJob(maglev::MaglevCompilationJob* job,
     // Note the finalized Code object has already been installed on the
     // function by MaglevCompilationJob::FinalizeJobImpl.
 
-    const bool kIsContextSpecializing = false;
     OptimizedCodeCache::Insert(isolate, *function, BytecodeOffset::None(),
-                               function->code(), kIsContextSpecializing);
+                               function->code(),
+                               job->specialize_to_function_context());
 
     // Reset ticks just after installation since ticks accumulated in lower
     // tiers use a different (lower) budget than ticks collected in Maglev
diff --git a/deps/v8/src/codegen/compiler.h b/deps/v8/src/codegen/compiler.h
index f5f3c5beb842b8..7a0d18a4524a3e 100644
--- a/deps/v8/src/codegen/compiler.h
+++ b/deps/v8/src/codegen/compiler.h
@@ -89,10 +89,6 @@ class V8_EXPORT_PRIVATE Compiler : public AllStatic {
                               ClearExceptionFlag flag,
                               IsCompiledScope* is_compiled_scope);
 
-  static bool CompileMaglev(Isolate* isolate, Handle<JSFunction> function,
-                            ConcurrencyMode mode,
-                            IsCompiledScope* is_compiled_scope);
-
   static void CompileOptimized(Isolate* isolate, Handle<JSFunction> function,
                                ConcurrencyMode mode, CodeKind code_kind);
 
@@ -105,7 +101,7 @@ class V8_EXPORT_PRIVATE Compiler : public AllStatic {
 
   V8_WARN_UNUSED_RESULT static MaybeHandle<SharedFunctionInfo>
   CompileForLiveEdit(ParseInfo* parse_info, Handle<Script> script,
-                     Isolate* isolate);
+                     MaybeHandle<ScopeInfo> outer_scope_info, Isolate* isolate);
 
   // Collect source positions for a function that has already been compiled to
   // bytecode, but for which source positions were not collected (e.g. because
diff --git a/deps/v8/src/codegen/external-reference.cc b/deps/v8/src/codegen/external-reference.cc
index 542be964001ddc..f0c0cd32bbf1dc 100644
--- a/deps/v8/src/codegen/external-reference.cc
+++ b/deps/v8/src/codegen/external-reference.cc
@@ -585,6 +585,11 @@ ExternalReference ExternalReference::address_of_log_or_trace_osr() {
   return ExternalReference(&v8_flags.log_or_trace_osr);
 }
 
+ExternalReference
+ExternalReference::address_of_FLAG_harmony_symbol_as_weakmap_key() {
+  return ExternalReference(&FLAG_harmony_symbol_as_weakmap_key);
+}
+
 ExternalReference ExternalReference::address_of_builtin_subclassing_flag() {
   return ExternalReference(&v8_flags.builtin_subclassing);
 }
@@ -1013,6 +1018,50 @@ static uint32_t ComputeSeededIntegerHash(Isolate* isolate, int32_t key) {
 }
 
 FUNCTION_REFERENCE(compute_integer_hash, ComputeSeededIntegerHash)
+
+enum LookupMode { kFindExisting, kFindInsertionEntry };
+template <typename Dictionary, LookupMode mode>
+static size_t NameDictionaryLookupForwardedString(Isolate* isolate,
+                                                  Address raw_dict,
+                                                  Address raw_key) {
+  // This function cannot allocate, but there is a HandleScope because it needs
+  // to pass Handle<Name> to the dictionary methods.
+  DisallowGarbageCollection no_gc;
+  HandleScope handle_scope(isolate);
+
+  Handle<String> key(String::cast(Object(raw_key)), isolate);
+  // This function should only be used as the slow path for forwarded strings.
+  DCHECK(Name::IsForwardingIndex(key->raw_hash_field()));
+
+  Dictionary dict = Dictionary::cast(Object(raw_dict));
+  ReadOnlyRoots roots(isolate);
+  uint32_t hash = key->hash();
+  InternalIndex entry = mode == kFindExisting
+                            ? dict.FindEntry(isolate, roots, key, hash)
+                            : dict.FindInsertionEntry(isolate, roots, hash);
+  return entry.raw_value();
+}
+
+FUNCTION_REFERENCE(
+    name_dictionary_lookup_forwarded_string,
+    (NameDictionaryLookupForwardedString<NameDictionary, kFindExisting>))
+FUNCTION_REFERENCE(
+    name_dictionary_find_insertion_entry_forwarded_string,
+    (NameDictionaryLookupForwardedString<NameDictionary, kFindInsertionEntry>))
+FUNCTION_REFERENCE(
+    global_dictionary_lookup_forwarded_string,
+    (NameDictionaryLookupForwardedString<GlobalDictionary, kFindExisting>))
+FUNCTION_REFERENCE(global_dictionary_find_insertion_entry_forwarded_string,
+                   (NameDictionaryLookupForwardedString<GlobalDictionary,
+                                                        kFindInsertionEntry>))
+FUNCTION_REFERENCE(
+    name_to_index_hashtable_lookup_forwarded_string,
+    (NameDictionaryLookupForwardedString<NameToIndexHashTable, kFindExisting>))
+FUNCTION_REFERENCE(
+    name_to_index_hashtable_find_insertion_entry_forwarded_string,
+    (NameDictionaryLookupForwardedString<NameToIndexHashTable,
+                                         kFindInsertionEntry>))
+
 FUNCTION_REFERENCE(copy_fast_number_jsarray_elements_to_typed_array,
                    CopyFastNumberJSArrayElementsToTypedArray)
 FUNCTION_REFERENCE(copy_typed_array_elements_to_typed_array,
@@ -1022,6 +1071,8 @@ FUNCTION_REFERENCE(try_string_to_index_or_lookup_existing,
                    StringTable::TryStringToIndexOrLookupExisting)
 FUNCTION_REFERENCE(string_from_forward_table,
                    StringForwardingTable::GetForwardStringAddress)
+FUNCTION_REFERENCE(raw_hash_from_forward_table,
+                   StringForwardingTable::GetRawHashStatic)
 FUNCTION_REFERENCE(string_to_array_index_function, String::ToArrayIndex)
 FUNCTION_REFERENCE(array_indexof_includes_smi_or_object,
                    ArrayIndexOfIncludesSmiOrObject)
diff --git a/deps/v8/src/codegen/external-reference.h b/deps/v8/src/codegen/external-reference.h
index b6df8547f51d90..8e14a8b208e968 100644
--- a/deps/v8/src/codegen/external-reference.h
+++ b/deps/v8/src/codegen/external-reference.h
@@ -98,7 +98,9 @@ class StatsCounter;
   V(abort_with_reason, "abort_with_reason")                                    \
   V(address_of_log_or_trace_osr, "v8_flags.log_or_trace_osr")                  \
   V(address_of_FLAG_harmony_regexp_unicode_sets,                               \
-    "v8_flags.harmony_regexp_unicdoe_sets")                                    \
+    "v8_flags.harmony_regexp_unicode_sets")                                    \
+  V(address_of_FLAG_harmony_symbol_as_weakmap_key,                             \
+    "v8_flags.harmony_symbol_as_weakmap_key")                                  \
   V(address_of_builtin_subclassing_flag, "v8_flags.builtin_subclassing")       \
   V(address_of_double_abs_constant, "double_absolute_constant")                \
   V(address_of_double_neg_constant, "double_negate_constant")                  \
@@ -208,6 +210,19 @@ class StatsCounter;
   V(try_string_to_index_or_lookup_existing,                                    \
     "try_string_to_index_or_lookup_existing")                                  \
   V(string_from_forward_table, "string_from_forward_table")                    \
+  V(raw_hash_from_forward_table, "raw_hash_from_forward_table")                \
+  V(name_dictionary_lookup_forwarded_string,                                   \
+    "name_dictionary_lookup_forwarded_string")                                 \
+  V(name_dictionary_find_insertion_entry_forwarded_string,                     \
+    "name_dictionary_find_insertion_entry_forwarded_string")                   \
+  V(global_dictionary_lookup_forwarded_string,                                 \
+    "global_dictionary_lookup_forwarded_string")                               \
+  V(global_dictionary_find_insertion_entry_forwarded_string,                   \
+    "global_dictionary_find_insertion_entry_forwarded_string")                 \
+  V(name_to_index_hashtable_lookup_forwarded_string,                           \
+    "name_to_index_hashtable_lookup_forwarded_string")                         \
+  V(name_to_index_hashtable_find_insertion_entry_forwarded_string,             \
+    "name_to_index_hashtable_find_insertion_entry_forwarded_string")           \
   IF_WASM(V, wasm_call_trap_callback_for_testing,                              \
           "wasm::call_trap_callback_for_testing")                              \
   IF_WASM(V, wasm_f32_ceil, "wasm::f32_ceil_wrapper")                          \
diff --git a/deps/v8/src/codegen/ia32/assembler-ia32-inl.h b/deps/v8/src/codegen/ia32/assembler-ia32-inl.h
index e1d001ed89fe41..f03b032ec2fad3 100644
--- a/deps/v8/src/codegen/ia32/assembler-ia32-inl.h
+++ b/deps/v8/src/codegen/ia32/assembler-ia32-inl.h
@@ -53,10 +53,8 @@ bool CpuFeatures::SupportsOptimizer() { return true; }
 void RelocInfo::apply(intptr_t delta) {
   DCHECK_EQ(kApplyMask, (RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
                          RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
-                         RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET) |
-                         RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY)));
-  if (IsRuntimeEntry(rmode_) || IsCodeTarget(rmode_) ||
-      IsOffHeapTarget(rmode_)) {
+                         RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET)));
+  if (IsCodeTarget(rmode_) || IsOffHeapTarget(rmode_)) {
     base::WriteUnalignedValue(pc_,
                               base::ReadUnalignedValue<int32_t>(pc_) - delta);
   } else if (IsInternalReference(rmode_)) {
@@ -67,7 +65,7 @@ void RelocInfo::apply(intptr_t delta) {
 }
 
 Address RelocInfo::target_address() {
-  DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsWasmCall(rmode_));
+  DCHECK(IsCodeTarget(rmode_) || IsWasmCall(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
@@ -81,22 +79,19 @@ Address RelocInfo::constant_pool_entry_address() { UNREACHABLE(); }
 int RelocInfo::target_address_size() { return Assembler::kSpecialTargetSize; }
 
 HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
-  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsDataEmbeddedObject(rmode_));
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
   return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_)));
 }
 
 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
-  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsDataEmbeddedObject(rmode_));
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
   return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_));
 }
 
 void RelocInfo::set_target_object(Heap* heap, HeapObject target,
                                   WriteBarrierMode write_barrier_mode,
                                   ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsDataEmbeddedObject(rmode_));
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
   WriteUnalignedValue(pc_, target.ptr());
   if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
     FlushInstructionCache(pc_, sizeof(Address));
@@ -132,20 +127,6 @@ Address RelocInfo::target_internal_reference_address() {
 
 Builtin RelocInfo::target_builtin_at(Assembler* origin) { UNREACHABLE(); }
 
-Address RelocInfo::target_runtime_entry(Assembler* origin) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  return ReadUnalignedValue<Address>(pc_);
-}
-
-void RelocInfo::set_target_runtime_entry(Address target,
-                                         WriteBarrierMode write_barrier_mode,
-                                         ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  if (target_address() != target) {
-    set_target_address(target, write_barrier_mode, icache_flush_mode);
-  }
-}
-
 Address RelocInfo::target_off_heap_target() {
   DCHECK(IsOffHeapTarget(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
@@ -155,8 +136,7 @@ void RelocInfo::WipeOut() {
   if (IsFullEmbeddedObject(rmode_) || IsExternalReference(rmode_) ||
       IsInternalReference(rmode_)) {
     WriteUnalignedValue(pc_, kNullAddress);
-  } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) ||
-             IsOffHeapTarget(rmode_)) {
+  } else if (IsCodeTarget(rmode_) || IsOffHeapTarget(rmode_)) {
     // Effectively write zero into the relocation.
     Assembler::set_target_address_at(pc_, constant_pool_,
                                      pc_ + sizeof(int32_t));
diff --git a/deps/v8/src/codegen/ia32/assembler-ia32.cc b/deps/v8/src/codegen/ia32/assembler-ia32.cc
index b55a57d45cf4cf..ab9a895e9d6f16 100644
--- a/deps/v8/src/codegen/ia32/assembler-ia32.cc
+++ b/deps/v8/src/codegen/ia32/assembler-ia32.cc
@@ -204,8 +204,7 @@ void Displacement::init(Label* L, Type type) {
 const int RelocInfo::kApplyMask =
     RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
     RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
-    RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET) |
-    RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY);
+    RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET);
 
 bool RelocInfo::IsCodedSpecially() {
   // The deserializer needs to know whether a pointer is specially coded.  Being
@@ -1625,11 +1624,7 @@ void Assembler::call(Address entry, RelocInfo::Mode rmode) {
   EnsureSpace ensure_space(this);
   DCHECK(!RelocInfo::IsCodeTarget(rmode));
   EMIT(0xE8);
-  if (RelocInfo::IsRuntimeEntry(rmode)) {
-    emit(entry, rmode);
-  } else {
-    emit(entry - (reinterpret_cast<Address>(pc_) + sizeof(int32_t)), rmode);
-  }
+  emit(entry - (reinterpret_cast<Address>(pc_) + sizeof(int32_t)), rmode);
 }
 
 void Assembler::wasm_call(Address entry, RelocInfo::Mode rmode) {
@@ -1702,7 +1697,7 @@ void Assembler::jmp(Address entry, RelocInfo::Mode rmode) {
   EnsureSpace ensure_space(this);
   DCHECK(!RelocInfo::IsCodeTarget(rmode));
   EMIT(0xE9);
-  if (RelocInfo::IsRuntimeEntry(rmode) || RelocInfo::IsWasmCall(rmode)) {
+  if (RelocInfo::IsWasmCall(rmode)) {
     emit(entry, rmode);
   } else {
     emit(entry - (reinterpret_cast<Address>(pc_) + sizeof(int32_t)), rmode);
@@ -1772,11 +1767,7 @@ void Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) {
   // 0000 1111 1000 tttn #32-bit disp.
   EMIT(0x0F);
   EMIT(0x80 | cc);
-  if (RelocInfo::IsRuntimeEntry(rmode)) {
-    emit(reinterpret_cast<uint32_t>(entry), rmode);
-  } else {
-    emit(entry - (pc_ + sizeof(int32_t)), rmode);
-  }
+  emit(entry - (pc_ + sizeof(int32_t)), rmode);
 }
 
 void Assembler::j(Condition cc, Handle<Code> code, RelocInfo::Mode rmode) {
@@ -3395,8 +3386,7 @@ void Assembler::db(uint8_t data) {
 void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
   EnsureSpace ensure_space(this);
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   emit(data);
@@ -3404,10 +3394,7 @@ void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
 
 void Assembler::dq(uint64_t data, RelocInfo::Mode rmode) {
   EnsureSpace ensure_space(this);
-  if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode));
-    RecordRelocInfo(rmode);
-  }
+  DCHECK(RelocInfo::IsNoInfo(rmode));
   emit_q(data);
 }
 
diff --git a/deps/v8/src/codegen/ia32/assembler-ia32.h b/deps/v8/src/codegen/ia32/assembler-ia32.h
index bd7ea311c8705e..2cbc775ef5c8f6 100644
--- a/deps/v8/src/codegen/ia32/assembler-ia32.h
+++ b/deps/v8/src/codegen/ia32/assembler-ia32.h
@@ -1670,6 +1670,8 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   void emit_sse_operand(XMMRegister dst, Register src);
 
   Address addr_at(int pos) {
+    DCHECK_GE(pos, 0);
+    DCHECK_LT(pos, pc_offset());
     return reinterpret_cast<Address>(buffer_start_ + pos);
   }
 
diff --git a/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc b/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
index eeb33d2aedc077..e5bd88e80ad1ca 100644
--- a/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
+++ b/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
@@ -848,7 +848,7 @@ void MacroAssembler::LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
   j(not_zero, flags_need_processing);
 }
 
-void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+void MacroAssembler::OptimizeCodeOrTailCallOptimizedCodeSlot(
     Register flags, XMMRegister saved_feedback_vector) {
   ASM_CODE_COMMENT(this);
   Label maybe_has_optimized_code, maybe_needs_logging;
diff --git a/deps/v8/src/codegen/ia32/macro-assembler-ia32.h b/deps/v8/src/codegen/ia32/macro-assembler-ia32.h
index bc71da2dd0b6d3..a55beb1a4e1f23 100644
--- a/deps/v8/src/codegen/ia32/macro-assembler-ia32.h
+++ b/deps/v8/src/codegen/ia32/macro-assembler-ia32.h
@@ -564,7 +564,7 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
   void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
       Register flags, XMMRegister saved_feedback_vector,
       CodeKind current_code_kind, Label* flags_need_processing);
-  void MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+  void OptimizeCodeOrTailCallOptimizedCodeSlot(
       Register flags, XMMRegister saved_feedback_vector);
 
   // Abort execution if argument is not a smi, enabled via --debug-code.
diff --git a/deps/v8/src/codegen/interface-descriptors.h b/deps/v8/src/codegen/interface-descriptors.h
index e8b8a53a9905f2..da5bc9072c6e6f 100644
--- a/deps/v8/src/codegen/interface-descriptors.h
+++ b/deps/v8/src/codegen/interface-descriptors.h
@@ -72,7 +72,7 @@ namespace internal {
   V(CopyDataPropertiesWithExcludedPropertiesOnStack) \
   V(CppBuiltinAdaptor)                               \
   V(FastNewObject)                                   \
-  V(FindNonDefaultConstructor)                       \
+  V(FindNonDefaultConstructorOrConstruct)            \
   V(ForInPrepare)                                    \
   V(GetIteratorStackParameter)                       \
   V(GetProperty)                                     \
@@ -1817,9 +1817,9 @@ class InterpreterCEntry2Descriptor
   static constexpr auto registers();
 };
 
-class FindNonDefaultConstructorDescriptor
+class FindNonDefaultConstructorOrConstructDescriptor
     : public StaticCallInterfaceDescriptor<
-          FindNonDefaultConstructorDescriptor> {
+          FindNonDefaultConstructorOrConstructDescriptor> {
  public:
   DEFINE_RESULT_AND_PARAMETERS(2, kThisFunction, kNewTarget)
   DEFINE_RESULT_AND_PARAMETER_TYPES(
@@ -1827,7 +1827,7 @@ class FindNonDefaultConstructorDescriptor
       MachineType::AnyTagged(),  // result 2 (constructor_or_instance)
       MachineType::AnyTagged(),  // kThisFunction
       MachineType::AnyTagged())  // kNewTarget
-  DECLARE_DESCRIPTOR(FindNonDefaultConstructorDescriptor)
+  DECLARE_DESCRIPTOR(FindNonDefaultConstructorOrConstructDescriptor)
 };
 
 class ForInPrepareDescriptor
diff --git a/deps/v8/src/codegen/loong64/assembler-loong64-inl.h b/deps/v8/src/codegen/loong64/assembler-loong64-inl.h
index 6a77068d0b3d8d..0fe72de2ff2b84 100644
--- a/deps/v8/src/codegen/loong64/assembler-loong64-inl.h
+++ b/deps/v8/src/codegen/loong64/assembler-loong64-inl.h
@@ -41,8 +41,7 @@ void RelocInfo::apply(intptr_t delta) {
 }
 
 Address RelocInfo::target_address() {
-  DCHECK(IsCodeTargetMode(rmode_) || IsRuntimeEntry(rmode_) ||
-         IsWasmCall(rmode_));
+  DCHECK(IsCodeTargetMode(rmode_) || IsWasmCall(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
@@ -87,19 +86,13 @@ void Assembler::deserialization_set_target_internal_reference_at(
 }
 
 HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
-  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsDataEmbeddedObject(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_)));
-  }
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
   return HeapObject::cast(
       Object(Assembler::target_address_at(pc_, constant_pool_)));
 }
 
 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
-  if (IsDataEmbeddedObject(rmode_)) {
-    return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_));
-  } else if (IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_)) {
+  if (IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_)) {
     return Handle<HeapObject>(reinterpret_cast<Address*>(
         Assembler::target_address_at(pc_, constant_pool_)));
   } else {
@@ -111,15 +104,9 @@ Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
 void RelocInfo::set_target_object(Heap* heap, HeapObject target,
                                   WriteBarrierMode write_barrier_mode,
                                   ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsDataEmbeddedObject(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    WriteUnalignedValue(pc_, target.ptr());
-    // No need to flush icache since no instructions were changed.
-  } else {
-    Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
-                                     icache_flush_mode);
-  }
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
+  Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
+                                   icache_flush_mode);
   if (!host().is_null() && !v8_flags.disable_write_barriers) {
     WriteBarrierForCode(host(), this, target, write_barrier_mode);
   }
@@ -161,19 +148,6 @@ Handle<Code> Assembler::relative_code_target_object_handle_at(
 
 Builtin RelocInfo::target_builtin_at(Assembler* origin) { UNREACHABLE(); }
 
-Address RelocInfo::target_runtime_entry(Assembler* origin) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  return target_address();
-}
-
-void RelocInfo::set_target_runtime_entry(Address target,
-                                         WriteBarrierMode write_barrier_mode,
-                                         ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  if (target_address() != target)
-    set_target_address(target, write_barrier_mode, icache_flush_mode);
-}
-
 Address RelocInfo::target_off_heap_target() {
   DCHECK(IsOffHeapTarget(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
@@ -181,8 +155,8 @@ Address RelocInfo::target_off_heap_target() {
 
 void RelocInfo::WipeOut() {
   DCHECK(IsFullEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
-         IsInternalReference(rmode_) || IsOffHeapTarget(rmode_));
+         IsExternalReference(rmode_) || IsInternalReference(rmode_) ||
+         IsOffHeapTarget(rmode_));
   if (IsInternalReference(rmode_)) {
     Memory<Address>(pc_) = kNullAddress;
   } else {
diff --git a/deps/v8/src/codegen/loong64/assembler-loong64.cc b/deps/v8/src/codegen/loong64/assembler-loong64.cc
index da8e626f3da4c2..b636538f779aae 100644
--- a/deps/v8/src/codegen/loong64/assembler-loong64.cc
+++ b/deps/v8/src/codegen/loong64/assembler-loong64.cc
@@ -2154,8 +2154,7 @@ void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
     CheckBuffer();
   }
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uint32_t*>(pc_) = data;
@@ -2167,8 +2166,7 @@ void Assembler::dq(uint64_t data, RelocInfo::Mode rmode) {
     CheckBuffer();
   }
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uint64_t*>(pc_) = data;
diff --git a/deps/v8/src/codegen/loong64/macro-assembler-loong64.cc b/deps/v8/src/codegen/loong64/macro-assembler-loong64.cc
index 2822a0e205ef0d..30fd4934a920f8 100644
--- a/deps/v8/src/codegen/loong64/macro-assembler-loong64.cc
+++ b/deps/v8/src/codegen/loong64/macro-assembler-loong64.cc
@@ -476,6 +476,19 @@ void TurboAssembler::Mulh_d(Register rd, Register rj, const Operand& rk) {
   }
 }
 
+void TurboAssembler::Mulh_du(Register rd, Register rj, const Operand& rk) {
+  if (rk.is_reg()) {
+    mulh_du(rd, rj, rk.rm());
+  } else {
+    // li handles the relocation.
+    UseScratchRegisterScope temps(this);
+    Register scratch = temps.Acquire();
+    DCHECK(rj != scratch);
+    li(scratch, rk);
+    mulh_du(rd, rj, scratch);
+  }
+}
+
 void TurboAssembler::Div_w(Register rd, Register rj, const Operand& rk) {
   if (rk.is_reg()) {
     div_w(rd, rj, rk.rm());
@@ -2508,6 +2521,35 @@ void TurboAssembler::LoadRootRegisterOffset(Register destination,
   }
 }
 
+MemOperand TurboAssembler::ExternalReferenceAsOperand(
+    ExternalReference reference, Register scratch) {
+  if (root_array_available_ && options().enable_root_relative_access) {
+    int64_t offset =
+        RootRegisterOffsetForExternalReference(isolate(), reference);
+    if (is_int32(offset)) {
+      return MemOperand(kRootRegister, static_cast<int32_t>(offset));
+    }
+  }
+  if (root_array_available_ && options().isolate_independent_code) {
+    if (IsAddressableThroughRootRegister(isolate(), reference)) {
+      // Some external references can be efficiently loaded as an offset from
+      // kRootRegister.
+      intptr_t offset =
+          RootRegisterOffsetForExternalReference(isolate(), reference);
+      CHECK(is_int32(offset));
+      return MemOperand(kRootRegister, static_cast<int32_t>(offset));
+    } else {
+      // Otherwise, do a memory load from the external reference table.
+      Ld_d(scratch, MemOperand(kRootRegister,
+                               RootRegisterOffsetForExternalReferenceTableEntry(
+                                   isolate(), reference)));
+      return MemOperand(scratch, 0);
+    }
+  }
+  li(scratch, reference);
+  return MemOperand(scratch, 0);
+}
+
 void TurboAssembler::Jump(Register target, Condition cond, Register rj,
                           const Operand& rk) {
   BlockTrampolinePoolScope block_trampoline_pool(this);
@@ -3292,6 +3334,38 @@ void TurboAssembler::MulOverflow_w(Register dst, Register left,
   xor_(overflow, overflow, scratch2);
 }
 
+void TurboAssembler::MulOverflow_d(Register dst, Register left,
+                                   const Operand& right, Register overflow) {
+  ASM_CODE_COMMENT(this);
+  BlockTrampolinePoolScope block_trampoline_pool(this);
+  UseScratchRegisterScope temps(this);
+  Register scratch = temps.Acquire();
+  Register scratch2 = temps.Acquire();
+  Register right_reg = no_reg;
+  if (!right.is_reg()) {
+    li(scratch, Operand(right));
+    right_reg = scratch;
+  } else {
+    right_reg = right.rm();
+  }
+
+  DCHECK(left != scratch2 && right_reg != scratch2 && dst != scratch2 &&
+         overflow != scratch2);
+  DCHECK(overflow != left && overflow != right_reg);
+
+  if (dst == left || dst == right_reg) {
+    Mul_d(scratch2, left, right_reg);
+    Mulh_d(overflow, left, right_reg);
+    mov(dst, scratch2);
+  } else {
+    Mul_d(dst, left, right_reg);
+    Mulh_d(overflow, left, right_reg);
+  }
+
+  srai_d(scratch2, dst, 63);
+  xor_(overflow, overflow, scratch2);
+}
+
 void MacroAssembler::CallRuntime(const Runtime::Function* f, int num_arguments,
                                  SaveFPRegsMode save_doubles) {
   ASM_CODE_COMMENT(this);
@@ -4270,7 +4344,7 @@ void MacroAssembler::LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
   Branch(flags_need_processing, ne, scratch, Operand(zero_reg));
 }
 
-void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+void MacroAssembler::OptimizeCodeOrTailCallOptimizedCodeSlot(
     Register flags, Register feedback_vector) {
   ASM_CODE_COMMENT(this);
   DCHECK(!AreAliased(flags, feedback_vector));
diff --git a/deps/v8/src/codegen/loong64/macro-assembler-loong64.h b/deps/v8/src/codegen/loong64/macro-assembler-loong64.h
index ac0d4b36764c9e..57395c903ab65b 100644
--- a/deps/v8/src/codegen/loong64/macro-assembler-loong64.h
+++ b/deps/v8/src/codegen/loong64/macro-assembler-loong64.h
@@ -160,6 +160,15 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   void LoadRootRegisterOffset(Register destination, intptr_t offset) final;
   void LoadRootRelative(Register destination, int32_t offset) final;
 
+  // Operand pointing to an external reference.
+  // May emit code to set up the scratch register. The operand is
+  // only guaranteed to be correct as long as the scratch register
+  // isn't changed.
+  // If the operand is used more than once, use a scratch register
+  // that is guaranteed not to be clobbered.
+  MemOperand ExternalReferenceAsOperand(ExternalReference reference,
+                                        Register scratch);
+
   inline void Move(Register output, MemOperand operand) {
     Ld_d(output, operand);
   }
@@ -384,6 +393,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   DEFINE_INSTRUCTION(Mulh_wu)
   DEFINE_INSTRUCTION(Mul_d)
   DEFINE_INSTRUCTION(Mulh_d)
+  DEFINE_INSTRUCTION(Mulh_du)
   DEFINE_INSTRUCTION2(Div_w)
   DEFINE_INSTRUCTION2(Div_d)
   DEFINE_INSTRUCTION2(Div_wu)
@@ -636,9 +646,11 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   // overflow occured, otherwise it is zero or positive
   void SubOverflow_d(Register dst, Register left, const Operand& right,
                      Register overflow);
-  // MulOverflow_w sets overflow register to zero if no overflow occured
+  // MulOverflow_{w/d} set overflow register to zero if no overflow occured
   void MulOverflow_w(Register dst, Register left, const Operand& right,
                      Register overflow);
+  void MulOverflow_d(Register dst, Register left, const Operand& right,
+                     Register overflow);
 
   // TODO(LOONG_dev): LOONG64 Remove this constant
   // Number of instructions needed for calculation of switch table entry address
@@ -1054,8 +1066,8 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
   void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
       Register flags, Register feedback_vector, CodeKind current_code_kind,
       Label* flags_need_processing);
-  void MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
-                                                    Register feedback_vector);
+  void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
+                                               Register feedback_vector);
 
   template <typename Field>
   void DecodeField(Register dst, Register src) {
diff --git a/deps/v8/src/codegen/machine-type.cc b/deps/v8/src/codegen/machine-type.cc
index bde4742b8d8f00..a633a1020b1211 100644
--- a/deps/v8/src/codegen/machine-type.cc
+++ b/deps/v8/src/codegen/machine-type.cc
@@ -79,6 +79,10 @@ std::ostream& operator<<(std::ostream& os, MachineSemantic type) {
       return os << "kTypeInt64";
     case MachineSemantic::kUint64:
       return os << "kTypeUint64";
+    case MachineSemantic::kSignedBigInt64:
+      return os << "kTypeSignedBigInt64";
+    case MachineSemantic::kUnsignedBigInt64:
+      return os << "kTypeUnsignedBigInt64";
     case MachineSemantic::kNumber:
       return os << "kTypeNumber";
     case MachineSemantic::kAny:
diff --git a/deps/v8/src/codegen/machine-type.h b/deps/v8/src/codegen/machine-type.h
index 7dcca6db11fc36..29d7de75838e5e 100644
--- a/deps/v8/src/codegen/machine-type.h
+++ b/deps/v8/src/codegen/machine-type.h
@@ -86,6 +86,8 @@ enum class MachineSemantic : uint8_t {
   kUint32,
   kInt64,
   kUint64,
+  kSignedBigInt64,
+  kUnsignedBigInt64,
   kNumber,
   kAny
 };
@@ -152,10 +154,6 @@ class MachineType {
   constexpr bool IsCompressedPointer() const {
     return representation() == MachineRepresentation::kCompressedPointer;
   }
-  constexpr static MachineRepresentation TaggedRepresentation() {
-    return (kTaggedSize == 4) ? MachineRepresentation::kWord32
-                              : MachineRepresentation::kWord64;
-  }
   constexpr static MachineRepresentation PointerRepresentation() {
     return (kSystemPointerSize == 4) ? MachineRepresentation::kWord32
                                      : MachineRepresentation::kWord64;
@@ -193,6 +191,14 @@ class MachineType {
     return MachineType(MachineRepresentation::kWord64,
                        MachineSemantic::kUint64);
   }
+  constexpr static MachineType SignedBigInt64() {
+    return MachineType(MachineRepresentation::kWord64,
+                       MachineSemantic::kSignedBigInt64);
+  }
+  constexpr static MachineType UnsignedBigInt64() {
+    return MachineType(MachineRepresentation::kWord64,
+                       MachineSemantic::kUnsignedBigInt64);
+  }
   constexpr static MachineType Float32() {
     return MachineType(MachineRepresentation::kFloat32,
                        MachineSemantic::kNumber);
@@ -234,7 +240,7 @@ class MachineType {
   }
   constexpr static MachineType SandboxedPointer() {
     return MachineType(MachineRepresentation::kSandboxedPointer,
-                       MachineSemantic::kNone);
+                       MachineSemantic::kInt64);
   }
   constexpr static MachineType Bool() {
     return MachineType(MachineRepresentation::kBit, MachineSemantic::kBool);
diff --git a/deps/v8/src/codegen/macro-assembler.h b/deps/v8/src/codegen/macro-assembler.h
index aaf30dea62a81e..61b26a320f276c 100644
--- a/deps/v8/src/codegen/macro-assembler.h
+++ b/deps/v8/src/codegen/macro-assembler.h
@@ -136,10 +136,10 @@ class V8_NODISCARD FrameAndConstantPoolScope {
       : masm_(masm),
         type_(type),
         old_has_frame_(masm->has_frame()),
-        old_constant_pool_available_(v8_flags.enable_embedded_constant_pool &&
+        old_constant_pool_available_(V8_EMBEDDED_CONSTANT_POOL_BOOL &&
                                      masm->is_constant_pool_available()) {
     masm->set_has_frame(true);
-    if (v8_flags.enable_embedded_constant_pool) {
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
       masm->set_constant_pool_available(true);
     }
     if (type_ != StackFrame::MANUAL && type_ != StackFrame::NO_FRAME_TYPE) {
@@ -150,7 +150,7 @@ class V8_NODISCARD FrameAndConstantPoolScope {
   ~FrameAndConstantPoolScope() {
     masm_->LeaveFrame(type_);
     masm_->set_has_frame(old_has_frame_);
-    if (v8_flags.enable_embedded_constant_pool) {
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
       masm_->set_constant_pool_available(old_constant_pool_available_);
     }
   }
@@ -169,14 +169,14 @@ class V8_NODISCARD ConstantPoolUnavailableScope {
  public:
   explicit ConstantPoolUnavailableScope(Assembler* assembler)
       : assembler_(assembler),
-        old_constant_pool_available_(v8_flags.enable_embedded_constant_pool &&
+        old_constant_pool_available_(V8_EMBEDDED_CONSTANT_POOL_BOOL &&
                                      assembler->is_constant_pool_available()) {
-    if (v8_flags.enable_embedded_constant_pool) {
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
       assembler->set_constant_pool_available(false);
     }
   }
   ~ConstantPoolUnavailableScope() {
-    if (v8_flags.enable_embedded_constant_pool) {
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
       assembler_->set_constant_pool_available(old_constant_pool_available_);
     }
   }
diff --git a/deps/v8/src/codegen/mips64/assembler-mips64-inl.h b/deps/v8/src/codegen/mips64/assembler-mips64-inl.h
index 7ae17d08476cd0..33c1bfcf2d8694 100644
--- a/deps/v8/src/codegen/mips64/assembler-mips64-inl.h
+++ b/deps/v8/src/codegen/mips64/assembler-mips64-inl.h
@@ -69,7 +69,7 @@ void RelocInfo::apply(intptr_t delta) {
 }
 
 Address RelocInfo::target_address() {
-  DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsWasmCall(rmode_));
+  DCHECK(IsCodeTarget(rmode_) || IsWasmCall(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
@@ -136,37 +136,23 @@ void Assembler::deserialization_set_target_internal_reference_at(
 }
 
 HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
-  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsDataEmbeddedObject(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_)));
-  }
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
   return HeapObject::cast(
       Object(Assembler::target_address_at(pc_, constant_pool_)));
 }
 
 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
-  if (IsDataEmbeddedObject(rmode_)) {
-    return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_));
-  } else {
-    DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
-    return Handle<HeapObject>(reinterpret_cast<Address*>(
-        Assembler::target_address_at(pc_, constant_pool_)));
-  }
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
+  return Handle<HeapObject>(reinterpret_cast<Address*>(
+      Assembler::target_address_at(pc_, constant_pool_)));
 }
 
 void RelocInfo::set_target_object(Heap* heap, HeapObject target,
                                   WriteBarrierMode write_barrier_mode,
                                   ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsDataEmbeddedObject(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    WriteUnalignedValue(pc_, target.ptr());
-    // No need to flush icache since no instructions were changed.
-  } else {
-    Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
-                                     icache_flush_mode);
-  }
+  DCHECK(IsCodeTarget(rmode_) || IsFullEmbeddedObject(rmode_));
+  Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
+                                   icache_flush_mode);
   if (!host().is_null() && !v8_flags.disable_write_barriers) {
     WriteBarrierForCode(host(), this, target, write_barrier_mode);
   }
@@ -205,19 +191,6 @@ Address RelocInfo::target_internal_reference_address() {
 
 Builtin RelocInfo::target_builtin_at(Assembler* origin) { UNREACHABLE(); }
 
-Address RelocInfo::target_runtime_entry(Assembler* origin) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  return target_address();
-}
-
-void RelocInfo::set_target_runtime_entry(Address target,
-                                         WriteBarrierMode write_barrier_mode,
-                                         ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  if (target_address() != target)
-    set_target_address(target, write_barrier_mode, icache_flush_mode);
-}
-
 Address RelocInfo::target_off_heap_target() {
   DCHECK(IsOffHeapTarget(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
@@ -225,9 +198,8 @@ Address RelocInfo::target_off_heap_target() {
 
 void RelocInfo::WipeOut() {
   DCHECK(IsFullEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
-         IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
-         IsOffHeapTarget(rmode_));
+         IsExternalReference(rmode_) || IsInternalReference(rmode_) ||
+         IsInternalReferenceEncoded(rmode_) || IsOffHeapTarget(rmode_));
   if (IsInternalReference(rmode_)) {
     Memory<Address>(pc_) = kNullAddress;
   } else if (IsInternalReferenceEncoded(rmode_)) {
diff --git a/deps/v8/src/codegen/mips64/assembler-mips64.cc b/deps/v8/src/codegen/mips64/assembler-mips64.cc
index 3ddb972a4c70e4..758a3d1664efcc 100644
--- a/deps/v8/src/codegen/mips64/assembler-mips64.cc
+++ b/deps/v8/src/codegen/mips64/assembler-mips64.cc
@@ -3775,8 +3775,7 @@ void Assembler::db(uint8_t data) {
 void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
   CheckForEmitInForbiddenSlot();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uint32_t*>(pc_) = data;
@@ -3786,8 +3785,7 @@ void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
 void Assembler::dq(uint64_t data, RelocInfo::Mode rmode) {
   CheckForEmitInForbiddenSlot();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uint64_t*>(pc_) = data;
diff --git a/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc b/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc
index 24e6fee51aee2b..896b685c1ec8ad 100644
--- a/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc
+++ b/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc
@@ -513,6 +513,29 @@ void TurboAssembler::Dmulh(Register rd, Register rs, const Operand& rt) {
   }
 }
 
+void TurboAssembler::Dmulhu(Register rd, Register rs, const Operand& rt) {
+  if (rt.is_reg()) {
+    if (kArchVariant == kMips64r6) {
+      dmuhu(rd, rs, rt.rm());
+    } else {
+      dmultu(rs, rt.rm());
+      mfhi(rd);
+    }
+  } else {
+    // li handles the relocation.
+    UseScratchRegisterScope temps(this);
+    Register scratch = temps.Acquire();
+    DCHECK(rs != scratch);
+    li(scratch, rt);
+    if (kArchVariant == kMips64r6) {
+      dmuhu(rd, rs, scratch);
+    } else {
+      dmultu(rs, scratch);
+      mfhi(rd);
+    }
+  }
+}
+
 void TurboAssembler::Mult(Register rs, const Operand& rt) {
   if (rt.is_reg()) {
     mult(rs, rt.rm());
@@ -4227,6 +4250,35 @@ void TurboAssembler::LoadRootRegisterOffset(Register destination,
   }
 }
 
+MemOperand TurboAssembler::ExternalReferenceAsOperand(
+    ExternalReference reference, Register scratch) {
+  if (root_array_available_ && options().enable_root_relative_access) {
+    int64_t offset =
+        RootRegisterOffsetForExternalReference(isolate(), reference);
+    if (is_int32(offset)) {
+      return MemOperand(kRootRegister, static_cast<int32_t>(offset));
+    }
+  }
+  if (root_array_available_ && options().isolate_independent_code) {
+    if (IsAddressableThroughRootRegister(isolate(), reference)) {
+      // Some external references can be efficiently loaded as an offset from
+      // kRootRegister.
+      intptr_t offset =
+          RootRegisterOffsetForExternalReference(isolate(), reference);
+      CHECK(is_int32(offset));
+      return MemOperand(kRootRegister, static_cast<int32_t>(offset));
+    } else {
+      // Otherwise, do a memory load from the external reference table.
+      Ld(scratch, MemOperand(kRootRegister,
+                             RootRegisterOffsetForExternalReferenceTableEntry(
+                                 isolate(), reference)));
+      return MemOperand(scratch, 0);
+    }
+  }
+  li(scratch, reference);
+  return MemOperand(scratch, 0);
+}
+
 void TurboAssembler::Jump(Register target, Condition cond, Register rs,
                           const Operand& rt, BranchDelaySlot bd) {
   BlockTrampolinePoolScope block_trampoline_pool(this);
@@ -5192,6 +5244,36 @@ void TurboAssembler::MulOverflow(Register dst, Register left,
   xor_(overflow, overflow, scratch);
 }
 
+void TurboAssembler::DMulOverflow(Register dst, Register left,
+                                  const Operand& right, Register overflow) {
+  ASM_CODE_COMMENT(this);
+  BlockTrampolinePoolScope block_trampoline_pool(this);
+  Register right_reg = no_reg;
+  Register scratch = t8;
+  if (!right.is_reg()) {
+    li(at, Operand(right));
+    right_reg = at;
+  } else {
+    right_reg = right.rm();
+  }
+
+  DCHECK(left != scratch && right_reg != scratch && dst != scratch &&
+         overflow != scratch);
+  DCHECK(overflow != left && overflow != right_reg);
+
+  if (dst == left || dst == right_reg) {
+    Dmul(scratch, left, right_reg);
+    Dmulh(overflow, left, right_reg);
+    mov(dst, scratch);
+  } else {
+    Dmul(dst, left, right_reg);
+    Dmulh(overflow, left, right_reg);
+  }
+
+  dsra32(scratch, dst, 31);
+  xor_(overflow, overflow, scratch);
+}
+
 void MacroAssembler::CallRuntime(const Runtime::Function* f, int num_arguments,
                                  SaveFPRegsMode save_doubles) {
   ASM_CODE_COMMENT(this);
@@ -6315,7 +6397,7 @@ void MacroAssembler::LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
   Branch(flags_need_processing, ne, scratch, Operand(zero_reg));
 }
 
-void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+void MacroAssembler::OptimizeCodeOrTailCallOptimizedCodeSlot(
     Register flags, Register feedback_vector) {
   ASM_CODE_COMMENT(this);
   Label maybe_has_optimized_code, maybe_needs_logging;
diff --git a/deps/v8/src/codegen/mips64/macro-assembler-mips64.h b/deps/v8/src/codegen/mips64/macro-assembler-mips64.h
index b927ac112fdf6c..77897e1efd3709 100644
--- a/deps/v8/src/codegen/mips64/macro-assembler-mips64.h
+++ b/deps/v8/src/codegen/mips64/macro-assembler-mips64.h
@@ -220,6 +220,15 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   void LoadRootRegisterOffset(Register destination, intptr_t offset) final;
   void LoadRootRelative(Register destination, int32_t offset) final;
 
+  // Operand pointing to an external reference.
+  // May emit code to set up the scratch register. The operand is
+  // only guaranteed to be correct as long as the scratch register
+  // isn't changed.
+  // If the operand is used more than once, use a scratch register
+  // that is guaranteed not to be clobbered.
+  MemOperand ExternalReferenceAsOperand(ExternalReference reference,
+                                        Register scratch);
+
   inline void Move(Register output, MemOperand operand) { Ld(output, operand); }
 
 // Jump, Call, and Ret pseudo instructions implementing inter-working.
@@ -448,6 +457,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   DEFINE_INSTRUCTION(Mulhu)
   DEFINE_INSTRUCTION(Dmul)
   DEFINE_INSTRUCTION(Dmulh)
+  DEFINE_INSTRUCTION(Dmulhu)
   DEFINE_INSTRUCTION2(Mult)
   DEFINE_INSTRUCTION2(Dmult)
   DEFINE_INSTRUCTION2(Multu)
@@ -767,9 +777,11 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   // overflow occured, otherwise it is zero or positive
   void DsubOverflow(Register dst, Register left, const Operand& right,
                     Register overflow);
-  // MulOverflow sets overflow register to zero if no overflow occured
+  // [D]MulOverflow set overflow register to zero if no overflow occured
   void MulOverflow(Register dst, Register left, const Operand& right,
                    Register overflow);
+  void DMulOverflow(Register dst, Register left, const Operand& right,
+                    Register overflow);
 
 // Number of instructions needed for calculation of switch table entry address
 #ifdef _MIPS_ARCH_MIPS64R6
@@ -1243,8 +1255,8 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
   void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
       Register flags, Register feedback_vector, CodeKind current_code_kind,
       Label* flags_need_processing);
-  void MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
-                                                    Register feedback_vector);
+  void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
+                                               Register feedback_vector);
 
   template <typename Field>
   void DecodeField(Register dst, Register src) {
diff --git a/deps/v8/src/codegen/ppc/assembler-ppc-inl.h b/deps/v8/src/codegen/ppc/assembler-ppc-inl.h
index 8997bab36ed8ab..898f1325209a5e 100644
--- a/deps/v8/src/codegen/ppc/assembler-ppc-inl.h
+++ b/deps/v8/src/codegen/ppc/assembler-ppc-inl.h
@@ -80,14 +80,14 @@ Address RelocInfo::target_internal_reference_address() {
 }
 
 Address RelocInfo::target_address() {
-  DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsWasmCall(rmode_));
+  DCHECK(IsCodeTarget(rmode_) || IsWasmCall(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
 Address RelocInfo::target_address_address() {
   DCHECK(HasTargetAddressAddress());
 
-  if (v8_flags.enable_embedded_constant_pool &&
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL &&
       Assembler::IsConstantPoolLoadStart(pc_)) {
     // We return the PC for embedded constant pool since this function is used
     // by the serializer and expects the address to reside within the code
@@ -108,7 +108,7 @@ Address RelocInfo::target_address_address() {
 }
 
 Address RelocInfo::constant_pool_entry_address() {
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     DCHECK(constant_pool_);
     ConstantPoolEntry::Access access;
     if (Assembler::IsConstantPoolLoadStart(pc_, &access))
@@ -147,10 +147,8 @@ Handle<Object> Assembler::code_target_object_handle_at(Address pc,
 
 HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_)));
-  } else if (IsCompressedEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(DecompressTaggedAny(
+  if (IsCompressedEmbeddedObject(rmode_)) {
+    return HeapObject::cast(Object(V8HeapCompressionScheme::DecompressTaggedAny(
         cage_base,
         Assembler::target_compressed_address_at(pc_, constant_pool_))));
   } else {
@@ -166,9 +164,7 @@ Handle<HeapObject> Assembler::compressed_embedded_object_handle_at(
 
 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_));
-  } else if (IsCodeTarget(rmode_)) {
+  if (IsCodeTarget(rmode_)) {
     return Handle<HeapObject>::cast(
         origin->code_target_object_handle_at(pc_, constant_pool_));
   } else {
@@ -184,12 +180,11 @@ void RelocInfo::set_target_object(Heap* heap, HeapObject target,
                                   WriteBarrierMode write_barrier_mode,
                                   ICacheFlushMode icache_flush_mode) {
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    WriteUnalignedValue(pc_, target.ptr());
-    // No need to flush icache since no instructions were changed.
-  } else if (IsCompressedEmbeddedObject(rmode_)) {
+  if (IsCompressedEmbeddedObject(rmode_)) {
     Assembler::set_target_compressed_address_at(
-        pc_, constant_pool_, CompressTagged(target.ptr()), icache_flush_mode);
+        pc_, constant_pool_,
+        V8HeapCompressionScheme::CompressTagged(target.ptr()),
+        icache_flush_mode);
   } else {
     DCHECK(IsFullEmbeddedObject(rmode_));
     Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
@@ -214,19 +209,6 @@ void RelocInfo::set_target_external_reference(
 
 Builtin RelocInfo::target_builtin_at(Assembler* origin) { UNREACHABLE(); }
 
-Address RelocInfo::target_runtime_entry(Assembler* origin) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  return target_address();
-}
-
-void RelocInfo::set_target_runtime_entry(Address target,
-                                         WriteBarrierMode write_barrier_mode,
-                                         ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  if (target_address() != target)
-    set_target_address(target, write_barrier_mode, icache_flush_mode);
-}
-
 Address RelocInfo::target_off_heap_target() {
   DCHECK(IsOffHeapTarget(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
@@ -234,9 +216,8 @@ Address RelocInfo::target_off_heap_target() {
 
 void RelocInfo::WipeOut() {
   DCHECK(IsEmbeddedObjectMode(rmode_) || IsCodeTarget(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
-         IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
-         IsOffHeapTarget(rmode_));
+         IsExternalReference(rmode_) || IsInternalReference(rmode_) ||
+         IsInternalReferenceEncoded(rmode_) || IsOffHeapTarget(rmode_));
   if (IsInternalReference(rmode_)) {
     // Jump table entry
     Memory<Address>(pc_) = kNullAddress;
@@ -269,7 +250,7 @@ void Assembler::UntrackBranch() {
 
 // Fetch the 32bit value from the FIXED_SEQUENCE lis/ori
 Address Assembler::target_address_at(Address pc, Address constant_pool) {
-  if (v8_flags.enable_embedded_constant_pool && constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL && constant_pool) {
     ConstantPoolEntry::Access access;
     if (IsConstantPoolLoadStart(pc, &access))
       return Memory<Address>(target_constant_pool_address_at(
@@ -444,7 +425,7 @@ void Assembler::deserialization_set_target_internal_reference_at(
 void Assembler::set_target_address_at(Address pc, Address constant_pool,
                                       Address target,
                                       ICacheFlushMode icache_flush_mode) {
-  if (v8_flags.enable_embedded_constant_pool && constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL && constant_pool) {
     ConstantPoolEntry::Access access;
     if (IsConstantPoolLoadStart(pc, &access)) {
       Memory<Address>(target_constant_pool_address_at(
diff --git a/deps/v8/src/codegen/ppc/assembler-ppc.cc b/deps/v8/src/codegen/ppc/assembler-ppc.cc
index 796bd09d554c62..43fda58a0c176f 100644
--- a/deps/v8/src/codegen/ppc/assembler-ppc.cc
+++ b/deps/v8/src/codegen/ppc/assembler-ppc.cc
@@ -167,8 +167,7 @@ bool RelocInfo::IsCodedSpecially() {
 }
 
 bool RelocInfo::IsInConstantPool() {
-  if (v8_flags.enable_embedded_constant_pool &&
-      constant_pool_ != kNullAddress) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL && constant_pool_ != kNullAddress) {
     return Assembler::IsConstantPoolLoadStart(pc_);
   }
   return false;
@@ -839,6 +838,16 @@ void Assembler::mulli(Register dst, Register src, const Operand& imm) {
   d_form(MULLI, dst, src, imm.immediate(), true);
 }
 
+// Multiply hi doubleword
+void Assembler::mulhd(Register dst, Register src1, Register src2, RCBit r) {
+  xo_form(EXT2 | MULHD, dst, src1, src2, LeaveOE, r);
+}
+
+// Multiply hi doubleword unsigned
+void Assembler::mulhdu(Register dst, Register src1, Register src2, RCBit r) {
+  xo_form(EXT2 | MULHDU, dst, src1, src2, LeaveOE, r);
+}
+
 // Multiply hi word
 void Assembler::mulhw(Register dst, Register src1, Register src2, RCBit r) {
   xo_form(EXT2 | MULHWX, dst, src1, src2, LeaveOE, r);
@@ -1310,8 +1319,7 @@ int Assembler::instructions_required_for_mov(Register dst,
 
 bool Assembler::use_constant_pool_for_mov(Register dst, const Operand& src,
                                           bool canOptimize) const {
-  if (!v8_flags.enable_embedded_constant_pool ||
-      !is_constant_pool_available()) {
+  if (!V8_EMBEDDED_CONSTANT_POOL_BOOL || !is_constant_pool_available()) {
     // If there is no constant pool available, we must use a mov
     // immediate sequence.
     return false;
@@ -2155,8 +2163,7 @@ void Assembler::db(uint8_t data) {
 void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
   CheckBuffer();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uint32_t*>(pc_) = data;
@@ -2166,8 +2173,7 @@ void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
 void Assembler::dq(uint64_t value, RelocInfo::Mode rmode) {
   CheckBuffer();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uint64_t*>(pc_) = value;
@@ -2177,8 +2183,7 @@ void Assembler::dq(uint64_t value, RelocInfo::Mode rmode) {
 void Assembler::dp(uintptr_t data, RelocInfo::Mode rmode) {
   CheckBuffer();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uintptr_t*>(pc_) = data;
diff --git a/deps/v8/src/codegen/ppc/assembler-ppc.h b/deps/v8/src/codegen/ppc/assembler-ppc.h
index 6563287d0a82e7..21a439a85e0483 100644
--- a/deps/v8/src/codegen/ppc/assembler-ppc.h
+++ b/deps/v8/src/codegen/ppc/assembler-ppc.h
@@ -309,10 +309,9 @@ class Assembler : public AssemblerBase {
   static constexpr int kMovInstructionsNoConstantPool = 2;
   static constexpr int kTaggedLoadInstructions = 1;
 #endif
-  static constexpr int kMovInstructions =
-      v8_flags.enable_embedded_constant_pool.value()
-          ? kMovInstructionsConstantPool
-          : kMovInstructionsNoConstantPool;
+  static constexpr int kMovInstructions = V8_EMBEDDED_CONSTANT_POOL_BOOL
+                                              ? kMovInstructionsConstantPool
+                                              : kMovInstructionsNoConstantPool;
 
   static inline int encode_crbit(const CRegister& cr, enum CRBit crbit) {
     return ((cr.code() * CRWIDTH) + crbit);
@@ -895,6 +894,8 @@ class Assembler : public AssemblerBase {
 
   void mulhw(Register dst, Register src1, Register src2, RCBit r = LeaveRC);
   void mulhwu(Register dst, Register src1, Register src2, RCBit r = LeaveRC);
+  void mulhd(Register dst, Register src1, Register src2, RCBit r = LeaveRC);
+  void mulhdu(Register dst, Register src1, Register src2, RCBit r = LeaveRC);
   void mulli(Register dst, Register src, const Operand& imm);
 
   void divw(Register dst, Register src1, Register src2, OEBit o = LeaveOE,
diff --git a/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc b/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc
index 7fe0819e10ffbc..3f5040c9ffb8ad 100644
--- a/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc
+++ b/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc
@@ -898,7 +898,7 @@ void MacroAssembler::RecordWrite(Register object, Register slot_address,
 void TurboAssembler::PushCommonFrame(Register marker_reg) {
   int fp_delta = 0;
   mflr(r0);
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     if (marker_reg.is_valid()) {
       Push(r0, fp, kConstantPoolRegister, marker_reg);
       fp_delta = 2;
@@ -921,7 +921,7 @@ void TurboAssembler::PushCommonFrame(Register marker_reg) {
 void TurboAssembler::PushStandardFrame(Register function_reg) {
   int fp_delta = 0;
   mflr(r0);
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     if (function_reg.is_valid()) {
       Push(r0, fp, kConstantPoolRegister, cp, function_reg);
       fp_delta = 3;
@@ -943,7 +943,7 @@ void TurboAssembler::PushStandardFrame(Register function_reg) {
 }
 
 void TurboAssembler::RestoreFrameStateForTailCall() {
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     LoadU64(kConstantPoolRegister,
             MemOperand(fp, StandardFrameConstants::kConstantPoolOffset));
     set_constant_pool_available(false);
@@ -1230,7 +1230,7 @@ void TurboAssembler::StubPrologue(StackFrame::Type type) {
     mov(r11, Operand(StackFrame::TypeToMarker(type)));
     PushCommonFrame(r11);
   }
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     LoadConstantPoolPointerRegister();
     set_constant_pool_available(true);
   }
@@ -1238,7 +1238,7 @@ void TurboAssembler::StubPrologue(StackFrame::Type type) {
 
 void TurboAssembler::Prologue() {
   PushStandardFrame(r4);
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     // base contains prologue address
     LoadConstantPoolPointerRegister();
     set_constant_pool_available(true);
@@ -1288,8 +1288,7 @@ void TurboAssembler::DropArgumentsAndPushNewReceiver(Register argc,
 
 void TurboAssembler::EnterFrame(StackFrame::Type type,
                                 bool load_constant_pool_pointer_reg) {
-  if (v8_flags.enable_embedded_constant_pool &&
-      load_constant_pool_pointer_reg) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL && load_constant_pool_pointer_reg) {
     // Push type explicitly so we can leverage the constant pool.
     // This path cannot rely on ip containing code entry.
     PushCommonFrame();
@@ -1322,7 +1321,7 @@ int TurboAssembler::LeaveFrame(StackFrame::Type type, int stack_adjustment) {
   int frame_ends;
   LoadU64(r0, MemOperand(fp, StandardFrameConstants::kCallerPCOffset));
   LoadU64(ip, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     LoadU64(kConstantPoolRegister,
             MemOperand(fp, StandardFrameConstants::kConstantPoolOffset));
   }
@@ -1373,7 +1372,7 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space,
     li(r8, Operand::Zero());
     StoreU64(r8, MemOperand(fp, ExitFrameConstants::kSPOffset));
   }
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     StoreU64(kConstantPoolRegister,
              MemOperand(fp, ExitFrameConstants::kConstantPoolOffset));
   }
@@ -2153,7 +2152,7 @@ void MacroAssembler::LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
   bne(flags_need_processing, cr0);
 }
 
-void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+void MacroAssembler::OptimizeCodeOrTailCallOptimizedCodeSlot(
     Register flags, Register feedback_vector) {
   DCHECK(!AreAliased(flags, feedback_vector));
   Label maybe_has_optimized_code, maybe_needs_logging;
@@ -2654,7 +2653,7 @@ void TurboAssembler::LoadSmiLiteral(Register dst, Smi smi) {
 
 void TurboAssembler::LoadDoubleLiteral(DoubleRegister result,
                                        base::Double value, Register scratch) {
-  if (v8_flags.enable_embedded_constant_pool && is_constant_pool_available() &&
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL && is_constant_pool_available() &&
       !(scratch == r0 && ConstantPoolAccessIsInOverflow())) {
     ConstantPoolEntry::Access access = ConstantPoolAddEntry(value);
     if (access == ConstantPoolEntry::OVERFLOWED) {
@@ -3715,6 +3714,10 @@ void TurboAssembler::StoreF32LE(DoubleRegister dst, const MemOperand& mem,
   V(I16x8Eq, vcmpequh)     \
   V(I16x8GtS, vcmpgtsh)    \
   V(I16x8GtU, vcmpgtuh)    \
+  V(I16x8AddSatS, vaddshs) \
+  V(I16x8SubSatS, vsubshs) \
+  V(I16x8AddSatU, vadduhs) \
+  V(I16x8SubSatU, vsubuhs) \
   V(I8x16Add, vaddubm)     \
   V(I8x16Sub, vsububm)     \
   V(I8x16MinS, vminsb)     \
@@ -3723,7 +3726,11 @@ void TurboAssembler::StoreF32LE(DoubleRegister dst, const MemOperand& mem,
   V(I8x16MaxU, vmaxub)     \
   V(I8x16Eq, vcmpequb)     \
   V(I8x16GtS, vcmpgtsb)    \
-  V(I8x16GtU, vcmpgtub)
+  V(I8x16GtU, vcmpgtub)    \
+  V(I8x16AddSatS, vaddsbs) \
+  V(I8x16SubSatS, vsubsbs) \
+  V(I8x16AddSatU, vaddubs) \
+  V(I8x16SubSatU, vsububs)
 
 #define EMIT_SIMD_BINOP(name, op)                                      \
   void TurboAssembler::name(Simd128Register dst, Simd128Register src1, \
@@ -3734,6 +3741,62 @@ SIMD_BINOP_LIST(EMIT_SIMD_BINOP)
 #undef EMIT_SIMD_BINOP
 #undef SIMD_BINOP_LIST
 
+#define SIMD_SHIFT_LIST(V) \
+  V(I64x2Shl, vsld)        \
+  V(I64x2ShrS, vsrad)      \
+  V(I64x2ShrU, vsrd)       \
+  V(I32x4Shl, vslw)        \
+  V(I32x4ShrS, vsraw)      \
+  V(I32x4ShrU, vsrw)       \
+  V(I16x8Shl, vslh)        \
+  V(I16x8ShrS, vsrah)      \
+  V(I16x8ShrU, vsrh)       \
+  V(I8x16Shl, vslb)        \
+  V(I8x16ShrS, vsrab)      \
+  V(I8x16ShrU, vsrb)
+
+#define EMIT_SIMD_SHIFT(name, op)                                      \
+  void TurboAssembler::name(Simd128Register dst, Simd128Register src1, \
+                            Register src2, Simd128Register scratch) {  \
+    mtvsrd(scratch, src2);                                             \
+    vspltb(scratch, scratch, Operand(7));                              \
+    op(dst, src1, scratch);                                            \
+  }                                                                    \
+  void TurboAssembler::name(Simd128Register dst, Simd128Register src1, \
+                            const Operand& src2, Register scratch1,    \
+                            Simd128Register scratch2) {                \
+    mov(scratch1, src2);                                               \
+    name(dst, src1, scratch1, scratch2);                               \
+  }
+SIMD_SHIFT_LIST(EMIT_SIMD_SHIFT)
+#undef EMIT_SIMD_SHIFT
+#undef SIMD_SHIFT_LIST
+
+#define SIMD_UNOP_LIST(V) \
+  V(F64x2Abs, xvabsdp)    \
+  V(F64x2Neg, xvnegdp)    \
+  V(F64x2Sqrt, xvsqrtdp)  \
+  V(F64x2Ceil, xvrdpip)   \
+  V(F64x2Floor, xvrdpim)  \
+  V(F64x2Trunc, xvrdpiz)  \
+  V(F32x4Abs, xvabssp)    \
+  V(F32x4Neg, xvnegsp)    \
+  V(F32x4Sqrt, xvsqrtsp)  \
+  V(F32x4Ceil, xvrspip)   \
+  V(F32x4Floor, xvrspim)  \
+  V(F32x4Trunc, xvrspiz)  \
+  V(I64x2Neg, vnegd)      \
+  V(I32x4Neg, vnegw)      \
+  V(I8x16Popcnt, vpopcntb)
+
+#define EMIT_SIMD_UNOP(name, op)                                        \
+  void TurboAssembler::name(Simd128Register dst, Simd128Register src) { \
+    op(dst, src);                                                       \
+  }
+SIMD_UNOP_LIST(EMIT_SIMD_UNOP)
+#undef EMIT_SIMD_UNOP
+#undef SIMD_UNOP_LIST
+
 void TurboAssembler::LoadSimd128(Simd128Register dst, const MemOperand& mem,
                                  Register scratch) {
   GenerateMemoryOperationRR(dst, mem, lxvx);
@@ -4110,6 +4173,51 @@ void TurboAssembler::I8x16GeU(Simd128Register dst, Simd128Register src1,
   vor(dst, dst, scratch);
 }
 
+void TurboAssembler::I64x2Abs(Simd128Register dst, Simd128Register src,
+                              Simd128Register scratch) {
+  constexpr int shift_bits = 63;
+  xxspltib(scratch, Operand(shift_bits));
+  vsrad(scratch, src, scratch);
+  vxor(dst, src, scratch);
+  vsubudm(dst, dst, scratch);
+}
+void TurboAssembler::I32x4Abs(Simd128Register dst, Simd128Register src,
+                              Simd128Register scratch) {
+  constexpr int shift_bits = 31;
+  xxspltib(scratch, Operand(shift_bits));
+  vsraw(scratch, src, scratch);
+  vxor(dst, src, scratch);
+  vsubuwm(dst, dst, scratch);
+}
+void TurboAssembler::I16x8Abs(Simd128Register dst, Simd128Register src,
+                              Simd128Register scratch) {
+  constexpr int shift_bits = 15;
+  xxspltib(scratch, Operand(shift_bits));
+  vsrah(scratch, src, scratch);
+  vxor(dst, src, scratch);
+  vsubuhm(dst, dst, scratch);
+}
+void TurboAssembler::I16x8Neg(Simd128Register dst, Simd128Register src,
+                              Simd128Register scratch) {
+  vspltish(scratch, Operand(1));
+  vnor(dst, src, src);
+  vadduhm(dst, scratch, dst);
+}
+void TurboAssembler::I8x16Abs(Simd128Register dst, Simd128Register src,
+                              Simd128Register scratch) {
+  constexpr int shift_bits = 7;
+  xxspltib(scratch, Operand(shift_bits));
+  vsrab(scratch, src, scratch);
+  vxor(dst, src, scratch);
+  vsububm(dst, dst, scratch);
+}
+void TurboAssembler::I8x16Neg(Simd128Register dst, Simd128Register src,
+                              Simd128Register scratch) {
+  xxspltib(scratch, Operand(1));
+  vnor(dst, src, src);
+  vaddubm(dst, scratch, dst);
+}
+
 Register GetRegisterThatIsNotOneOf(Register reg1, Register reg2, Register reg3,
                                    Register reg4, Register reg5,
                                    Register reg6) {
diff --git a/deps/v8/src/codegen/ppc/macro-assembler-ppc.h b/deps/v8/src/codegen/ppc/macro-assembler-ppc.h
index 0d0ef1f9bc1007..78f4346c7e13d3 100644
--- a/deps/v8/src/codegen/ppc/macro-assembler-ppc.h
+++ b/deps/v8/src/codegen/ppc/macro-assembler-ppc.h
@@ -1121,6 +1121,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   V(I16x8Eq)               \
   V(I16x8GtS)              \
   V(I16x8GtU)              \
+  V(I16x8AddSatS)          \
+  V(I16x8SubSatS)          \
+  V(I16x8AddSatU)          \
+  V(I16x8SubSatU)          \
   V(I8x16Add)              \
   V(I8x16Sub)              \
   V(I8x16MinS)             \
@@ -1129,7 +1133,11 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   V(I8x16MaxU)             \
   V(I8x16Eq)               \
   V(I8x16GtS)              \
-  V(I8x16GtU)
+  V(I8x16GtU)              \
+  V(I8x16AddSatS)          \
+  V(I8x16SubSatS)          \
+  V(I8x16AddSatU)          \
+  V(I8x16SubSatU)
 
 #define PROTOTYPE_SIMD_BINOP(name) \
   void name(Simd128Register dst, Simd128Register src1, Simd128Register src2);
@@ -1137,6 +1145,74 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
 #undef PROTOTYPE_SIMD_BINOP
 #undef SIMD_BINOP_LIST
 
+#define SIMD_BINOP_WITH_SCRATCH_LIST(V) \
+  V(F64x2Ne)                            \
+  V(F32x4Ne)                            \
+  V(I64x2Ne)                            \
+  V(I64x2GeS)                           \
+  V(I32x4Ne)                            \
+  V(I32x4GeS)                           \
+  V(I32x4GeU)                           \
+  V(I16x8Ne)                            \
+  V(I16x8GeS)                           \
+  V(I16x8GeU)                           \
+  V(I8x16Ne)                            \
+  V(I8x16GeS)                           \
+  V(I8x16GeU)
+
+#define PROTOTYPE_SIMD_BINOP_WITH_SCRATCH(name)                              \
+  void name(Simd128Register dst, Simd128Register src1, Simd128Register src2, \
+            Simd128Register scratch);
+  SIMD_BINOP_WITH_SCRATCH_LIST(PROTOTYPE_SIMD_BINOP_WITH_SCRATCH)
+#undef PROTOTYPE_SIMD_BINOP_WITH_SCRATCH
+#undef SIMD_BINOP_WITH_SCRATCH_LIST
+
+#define SIMD_SHIFT_LIST(V) \
+  V(I64x2Shl)              \
+  V(I64x2ShrS)             \
+  V(I64x2ShrU)             \
+  V(I32x4Shl)              \
+  V(I32x4ShrS)             \
+  V(I32x4ShrU)             \
+  V(I16x8Shl)              \
+  V(I16x8ShrS)             \
+  V(I16x8ShrU)             \
+  V(I8x16Shl)              \
+  V(I8x16ShrS)             \
+  V(I8x16ShrU)
+
+#define PROTOTYPE_SIMD_SHIFT(name)                                          \
+  void name(Simd128Register dst, Simd128Register src1, Register src2,       \
+            Simd128Register scratch);                                       \
+  void name(Simd128Register dst, Simd128Register src1, const Operand& src2, \
+            Register scratch1, Simd128Register scratch2);
+  SIMD_SHIFT_LIST(PROTOTYPE_SIMD_SHIFT)
+#undef PROTOTYPE_SIMD_SHIFT
+#undef SIMD_SHIFT_LIST
+
+#define SIMD_UNOP_LIST(V) \
+  V(F64x2Abs)             \
+  V(F64x2Neg)             \
+  V(F64x2Sqrt)            \
+  V(F64x2Ceil)            \
+  V(F64x2Floor)           \
+  V(F64x2Trunc)           \
+  V(F32x4Abs)             \
+  V(F32x4Neg)             \
+  V(F32x4Sqrt)            \
+  V(F32x4Ceil)            \
+  V(F32x4Floor)           \
+  V(F32x4Trunc)           \
+  V(I64x2Neg)             \
+  V(I32x4Neg)             \
+  V(I8x16Popcnt)
+
+#define PROTOTYPE_SIMD_UNOP(name) \
+  void name(Simd128Register dst, Simd128Register src);
+  SIMD_UNOP_LIST(PROTOTYPE_SIMD_UNOP)
+#undef PROTOTYPE_SIMD_UNOP
+#undef SIMD_UNOP_LIST
+
   void LoadSimd128(Simd128Register dst, const MemOperand& mem,
                    Register scratch);
   void StoreSimd128(Simd128Register src, const MemOperand& mem,
@@ -1196,31 +1272,17 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
                 Simd128Register scratch1, Simd128Register scratch2);
   void F64x2Max(Simd128Register dst, Simd128Register src1, Simd128Register src2,
                 Simd128Register scratch1, Simd128Register scratch2);
-  void F64x2Ne(Simd128Register dst, Simd128Register src1, Simd128Register src2,
-               Simd128Register scratch);
-  void F32x4Ne(Simd128Register dst, Simd128Register src1, Simd128Register src2,
-               Simd128Register scratch);
-  void I64x2Ne(Simd128Register dst, Simd128Register src1, Simd128Register src2,
-               Simd128Register scratch);
-  void I64x2GeS(Simd128Register dst, Simd128Register src1, Simd128Register src2,
-                Simd128Register scratch);
-  void I32x4Ne(Simd128Register dst, Simd128Register src1, Simd128Register src2,
-               Simd128Register scratch);
-  void I32x4GeS(Simd128Register dst, Simd128Register src1, Simd128Register src2,
+  void I64x2Abs(Simd128Register dst, Simd128Register src,
                 Simd128Register scratch);
-  void I32x4GeU(Simd128Register dst, Simd128Register src1, Simd128Register src2,
+  void I32x4Abs(Simd128Register dst, Simd128Register src,
                 Simd128Register scratch);
-  void I16x8Ne(Simd128Register dst, Simd128Register src1, Simd128Register src2,
-               Simd128Register scratch);
-  void I16x8GeS(Simd128Register dst, Simd128Register src1, Simd128Register src2,
+  void I16x8Abs(Simd128Register dst, Simd128Register src,
                 Simd128Register scratch);
-  void I16x8GeU(Simd128Register dst, Simd128Register src1, Simd128Register src2,
+  void I16x8Neg(Simd128Register dst, Simd128Register src,
                 Simd128Register scratch);
-  void I8x16Ne(Simd128Register dst, Simd128Register src1, Simd128Register src2,
-               Simd128Register scratch);
-  void I8x16GeS(Simd128Register dst, Simd128Register src1, Simd128Register src2,
+  void I8x16Abs(Simd128Register dst, Simd128Register src,
                 Simd128Register scratch);
-  void I8x16GeU(Simd128Register dst, Simd128Register src1, Simd128Register src2,
+  void I8x16Neg(Simd128Register dst, Simd128Register src,
                 Simd128Register scratch);
 
  private:
@@ -1404,8 +1466,8 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
   void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
       Register flags, Register feedback_vector, CodeKind current_code_kind,
       Label* flags_need_processing);
-  void MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
-                                                    Register feedback_vector);
+  void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
+                                               Register feedback_vector);
 
   // ---------------------------------------------------------------------------
   // Runtime calls
diff --git a/deps/v8/src/codegen/ppc/register-ppc.h b/deps/v8/src/codegen/ppc/register-ppc.h
index bbcaa525e49120..b85e7868e13dc7 100644
--- a/deps/v8/src/codegen/ppc/register-ppc.h
+++ b/deps/v8/src/codegen/ppc/register-ppc.h
@@ -17,7 +17,7 @@ namespace internal {
   V(r16) V(r17) V(r18) V(r19) V(r20) V(r21) V(r22) V(r23) \
   V(r24) V(r25) V(r26) V(r27) V(r28) V(r29) V(r30) V(fp)
 
-#if V8_EMBEDDED_CONSTANT_POOL
+#if V8_EMBEDDED_CONSTANT_POOL_BOOL
 #define ALLOCATABLE_GENERAL_REGISTERS(V)                  \
   V(r3)  V(r4)  V(r5)  V(r6)  V(r7)                       \
   V(r8)  V(r9)  V(r10) V(r14) V(r15)                      \
diff --git a/deps/v8/src/codegen/reloc-info.cc b/deps/v8/src/codegen/reloc-info.cc
index 12c2f9641a23d6..a2b1204ff72e56 100644
--- a/deps/v8/src/codegen/reloc-info.cc
+++ b/deps/v8/src/codegen/reloc-info.cc
@@ -345,7 +345,7 @@ void RelocInfo::set_target_address(Address target,
                                    WriteBarrierMode write_barrier_mode,
                                    ICacheFlushMode icache_flush_mode) {
   DCHECK(IsCodeTargetMode(rmode_) || IsNearBuiltinEntry(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsWasmCall(rmode_));
+         IsWasmCall(rmode_));
   Assembler::set_target_address_at(pc_, constant_pool_, target,
                                    icache_flush_mode);
   if (!host().is_null() && IsCodeTargetMode(rmode_) &&
@@ -369,13 +369,13 @@ bool RelocInfo::HasTargetAddressAddress() const {
   static constexpr int kTargetAddressAddressModeMask =
       ModeMask(CODE_TARGET) | ModeMask(FULL_EMBEDDED_OBJECT) |
       ModeMask(COMPRESSED_EMBEDDED_OBJECT) | ModeMask(EXTERNAL_REFERENCE) |
-      ModeMask(OFF_HEAP_TARGET) | ModeMask(RUNTIME_ENTRY) |
-      ModeMask(WASM_CALL) | ModeMask(WASM_STUB_CALL);
+      ModeMask(OFF_HEAP_TARGET) | ModeMask(WASM_CALL) |
+      ModeMask(WASM_STUB_CALL);
 #else
   static constexpr int kTargetAddressAddressModeMask =
       ModeMask(CODE_TARGET) | ModeMask(RELATIVE_CODE_TARGET) |
       ModeMask(FULL_EMBEDDED_OBJECT) | ModeMask(EXTERNAL_REFERENCE) |
-      ModeMask(OFF_HEAP_TARGET) | ModeMask(RUNTIME_ENTRY) | ModeMask(WASM_CALL);
+      ModeMask(OFF_HEAP_TARGET) | ModeMask(WASM_CALL);
 #endif
   return (ModeMask(rmode_) & kTargetAddressAddressModeMask) != 0;
 }
@@ -399,14 +399,10 @@ const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) {
       return "compressed embedded object";
     case FULL_EMBEDDED_OBJECT:
       return "full embedded object";
-    case DATA_EMBEDDED_OBJECT:
-      return "data embedded object";
     case CODE_TARGET:
       return "code target";
     case RELATIVE_CODE_TARGET:
       return "relative code target";
-    case RUNTIME_ENTRY:
-      return "runtime entry";
     case EXTERNAL_REFERENCE:
       return "external reference";
     case INTERNAL_REFERENCE:
@@ -473,13 +469,6 @@ void RelocInfo::Print(Isolate* isolate, std::ostream& os) {
       os << " " << Builtins::name(code.builtin_id());
     }
     os << ")  (" << reinterpret_cast<const void*>(target_address()) << ")";
-  } else if (IsRuntimeEntry(rmode_)) {
-    // Deoptimization bailouts are stored as runtime entries.
-    DeoptimizeKind type;
-    if (Deoptimizer::IsDeoptimizationEntry(isolate, target_address(), &type)) {
-      os << "  (" << Deoptimizer::MessageFor(type)
-         << " deoptimization bailout)";
-    }
   } else if (IsConstPool(rmode_)) {
     os << " (size " << static_cast<int>(data_) << ")";
   }
@@ -495,7 +484,6 @@ void RelocInfo::Verify(Isolate* isolate) {
       Object::VerifyPointer(isolate, target_object(isolate));
       break;
     case FULL_EMBEDDED_OBJECT:
-    case DATA_EMBEDDED_OBJECT:
       Object::VerifyAnyTagged(isolate, target_object(isolate));
       break;
     case CODE_TARGET:
@@ -535,7 +523,6 @@ void RelocInfo::Verify(Isolate* isolate) {
           OffHeapInstructionStream::TryLookupCode(isolate, addr)));
       break;
     }
-    case RUNTIME_ENTRY:
     case EXTERNAL_REFERENCE:
     case DEOPT_SCRIPT_OFFSET:
     case DEOPT_INLINING_ID:
diff --git a/deps/v8/src/codegen/reloc-info.h b/deps/v8/src/codegen/reloc-info.h
index 12358d7b28d7a9..fd74413fc97113 100644
--- a/deps/v8/src/codegen/reloc-info.h
+++ b/deps/v8/src/codegen/reloc-info.h
@@ -59,15 +59,11 @@ class RelocInfo {
     // TODO(ishell): rename to NEAR_CODE_TARGET.
     RELATIVE_CODE_TARGET,  // LAST_CODE_TARGET_MODE
     COMPRESSED_EMBEDDED_OBJECT,
-    FULL_EMBEDDED_OBJECT,
-    DATA_EMBEDDED_OBJECT,  // LAST_GCED_ENUM
+    FULL_EMBEDDED_OBJECT,  // LAST_GCED_ENUM
 
     WASM_CALL,  // FIRST_SHAREABLE_RELOC_MODE
     WASM_STUB_CALL,
 
-    // TODO(ishell): This reloc info shouldn't be used anymore. Remove it.
-    RUNTIME_ENTRY,
-
     EXTERNAL_REFERENCE,  // The address of an external C++ function.
     INTERNAL_REFERENCE,  // An address inside the same function.
 
@@ -107,7 +103,7 @@ class RelocInfo {
     FIRST_REAL_RELOC_MODE = CODE_TARGET,
     LAST_REAL_RELOC_MODE = VENEER_POOL,
     FIRST_EMBEDDED_OBJECT_RELOC_MODE = COMPRESSED_EMBEDDED_OBJECT,
-    LAST_EMBEDDED_OBJECT_RELOC_MODE = DATA_EMBEDDED_OBJECT,
+    LAST_EMBEDDED_OBJECT_RELOC_MODE = FULL_EMBEDDED_OBJECT,
     LAST_GCED_ENUM = LAST_EMBEDDED_OBJECT_RELOC_MODE,
     FIRST_BUILTIN_ENTRY_MODE = OFF_HEAP_TARGET,
     LAST_BUILTIN_ENTRY_MODE = NEAR_BUILTIN_ENTRY,
@@ -153,16 +149,10 @@ class RelocInfo {
   static constexpr bool IsCompressedEmbeddedObject(Mode mode) {
     return COMPRESS_POINTERS_BOOL && mode == COMPRESSED_EMBEDDED_OBJECT;
   }
-  static constexpr bool IsDataEmbeddedObject(Mode mode) {
-    return mode == DATA_EMBEDDED_OBJECT;
-  }
   static constexpr bool IsEmbeddedObjectMode(Mode mode) {
     return base::IsInRange(mode, FIRST_EMBEDDED_OBJECT_RELOC_MODE,
                            LAST_EMBEDDED_OBJECT_RELOC_MODE);
   }
-  static constexpr bool IsRuntimeEntry(Mode mode) {
-    return mode == RUNTIME_ENTRY;
-  }
   static constexpr bool IsWasmCall(Mode mode) { return mode == WASM_CALL; }
   static constexpr bool IsWasmReference(Mode mode) { return mode == WASM_CALL; }
   static constexpr bool IsWasmStubCall(Mode mode) {
@@ -265,7 +255,7 @@ class RelocInfo {
       ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED);
 
   // this relocation applies to;
-  // can only be called if IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)
+  // can only be called if IsCodeTarget(rmode_)
   V8_INLINE Address target_address();
   // Cage base value is used for decompressing compressed embedded references.
   V8_INLINE HeapObject target_object(PtrComprCageBase cage_base);
@@ -279,11 +269,6 @@ class RelocInfo {
   // Decodes builtin ID encoded as a PC-relative offset. This encoding is used
   // during code generation of call/jump with NEAR_BUILTIN_ENTRY.
   V8_INLINE Builtin target_builtin_at(Assembler* origin);
-  V8_INLINE Address target_runtime_entry(Assembler* origin);
-  V8_INLINE void set_target_runtime_entry(
-      Address target,
-      WriteBarrierMode write_barrier_mode = UPDATE_WRITE_BARRIER,
-      ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED);
   V8_INLINE Address target_off_heap_target();
   V8_INLINE void set_target_external_reference(
       Address, ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED);
@@ -339,8 +324,6 @@ class RelocInfo {
       visitor->VisitExternalReference(host(), this);
     } else if (IsInternalReference(mode) || IsInternalReferenceEncoded(mode)) {
       visitor->VisitInternalReference(host(), this);
-    } else if (IsRuntimeEntry(mode)) {
-      visitor->VisitRuntimeEntry(host(), this);
     } else if (IsBuiltinEntryMode(mode)) {
       visitor->VisitOffHeapTarget(host(), this);
     }
@@ -371,8 +354,7 @@ class RelocInfo {
 
   static int EmbeddedObjectModeMask() {
     return ModeMask(RelocInfo::FULL_EMBEDDED_OBJECT) |
-           ModeMask(RelocInfo::COMPRESSED_EMBEDDED_OBJECT) |
-           ModeMask(RelocInfo::DATA_EMBEDDED_OBJECT);
+           ModeMask(RelocInfo::COMPRESSED_EMBEDDED_OBJECT);
   }
 
   // In addition to modes covered by the apply mask (which is applied at GC
@@ -382,9 +364,7 @@ class RelocInfo {
     return ModeMask(RelocInfo::CODE_TARGET) |
            ModeMask(RelocInfo::COMPRESSED_EMBEDDED_OBJECT) |
            ModeMask(RelocInfo::FULL_EMBEDDED_OBJECT) |
-           ModeMask(RelocInfo::DATA_EMBEDDED_OBJECT) |
            ModeMask(RelocInfo::NEAR_BUILTIN_ENTRY) |
-           ModeMask(RelocInfo::RUNTIME_ENTRY) |
            ModeMask(RelocInfo::RELATIVE_CODE_TARGET) | kApplyMask;
   }
 
diff --git a/deps/v8/src/codegen/riscv/assembler-riscv-inl.h b/deps/v8/src/codegen/riscv/assembler-riscv-inl.h
index ba5e345906968a..b8d3ededcd1d86 100644
--- a/deps/v8/src/codegen/riscv/assembler-riscv-inl.h
+++ b/deps/v8/src/codegen/riscv/assembler-riscv-inl.h
@@ -65,8 +65,7 @@ void RelocInfo::apply(intptr_t delta) {
 }
 
 Address RelocInfo::target_address() {
-  DCHECK(IsCodeTargetMode(rmode_) || IsRuntimeEntry(rmode_) ||
-         IsWasmCall(rmode_));
+  DCHECK(IsCodeTargetMode(rmode_) || IsWasmCall(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
@@ -161,10 +160,8 @@ void Assembler::deserialization_set_target_internal_reference_at(
 
 HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_)));
-  } else if (IsCompressedEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(DecompressTaggedAny(
+  if (IsCompressedEmbeddedObject(rmode_)) {
+    return HeapObject::cast(Object(V8HeapCompressionScheme::DecompressTaggedAny(
         cage_base,
         Assembler::target_compressed_address_at(pc_, constant_pool_))));
   } else {
@@ -174,9 +171,7 @@ HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
 }
 
 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
-  if (IsDataEmbeddedObject(rmode_)) {
-    return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_));
-  } else if (IsCodeTarget(rmode_)) {
+  if (IsCodeTarget(rmode_)) {
     return Handle<HeapObject>::cast(
         origin->code_target_object_handle_at(pc_, constant_pool_));
   } else if (IsCompressedEmbeddedObject(rmode_)) {
@@ -194,12 +189,11 @@ void RelocInfo::set_target_object(Heap* heap, HeapObject target,
                                   WriteBarrierMode write_barrier_mode,
                                   ICacheFlushMode icache_flush_mode) {
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    WriteUnalignedValue(pc_, target.ptr());
-    // No need to flush icache since no instructions were changed.
-  } else if (IsCompressedEmbeddedObject(rmode_)) {
+  if (IsCompressedEmbeddedObject(rmode_)) {
     Assembler::set_target_compressed_address_at(
-        pc_, constant_pool_, CompressTagged(target.ptr()), icache_flush_mode);
+        pc_, constant_pool_,
+        V8HeapCompressionScheme::CompressTagged(target.ptr()),
+        icache_flush_mode);
   } else {
     DCHECK(IsFullEmbeddedObject(rmode_));
     Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
@@ -252,19 +246,6 @@ Handle<Code> Assembler::relative_code_target_object_handle_at(
 
 Builtin RelocInfo::target_builtin_at(Assembler* origin) { UNREACHABLE(); }
 
-Address RelocInfo::target_runtime_entry(Assembler* origin) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  return target_address();
-}
-
-void RelocInfo::set_target_runtime_entry(Address target,
-                                         WriteBarrierMode write_barrier_mode,
-                                         ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  if (target_address() != target)
-    set_target_address(target, write_barrier_mode, icache_flush_mode);
-}
-
 Address RelocInfo::target_off_heap_target() {
   DCHECK(IsOffHeapTarget(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
@@ -272,9 +253,8 @@ Address RelocInfo::target_off_heap_target() {
 
 void RelocInfo::WipeOut() {
   DCHECK(IsFullEmbeddedObject(rmode_) || IsCodeTarget(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
-         IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
-         IsOffHeapTarget(rmode_));
+         IsExternalReference(rmode_) || IsInternalReference(rmode_) ||
+         IsInternalReferenceEncoded(rmode_) || IsOffHeapTarget(rmode_));
   if (IsInternalReference(rmode_)) {
     Memory<Address>(pc_) = kNullAddress;
   } else if (IsInternalReferenceEncoded(rmode_)) {
diff --git a/deps/v8/src/codegen/riscv/assembler-riscv.cc b/deps/v8/src/codegen/riscv/assembler-riscv.cc
index 1b56afe7b97fe7..4e2ffdaa6cfa15 100644
--- a/deps/v8/src/codegen/riscv/assembler-riscv.cc
+++ b/deps/v8/src/codegen/riscv/assembler-riscv.cc
@@ -132,8 +132,10 @@ Register ToRegister(int num) {
 
 const int RelocInfo::kApplyMask =
     RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
+    RelocInfo::ModeMask(RelocInfo::NEAR_BUILTIN_ENTRY) |
     RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
-    RelocInfo::ModeMask(RelocInfo::RELATIVE_CODE_TARGET);
+    RelocInfo::ModeMask(RelocInfo::RELATIVE_CODE_TARGET) |
+    RelocInfo::ModeMask(RelocInfo::CODE_TARGET);
 
 bool RelocInfo::IsCodedSpecially() {
   // The deserializer needs to know whether a pointer is specially coded.  Being
@@ -794,6 +796,7 @@ int32_t Assembler::branch_long_offset(Label* L) {
   else
     DCHECK_EQ(offset & 3, 0);
   DCHECK(is_int32(offset));
+  VU.clear();
   return static_cast<int32_t>(offset);
 }
 
@@ -826,6 +829,7 @@ int32_t Assembler::branch_offset_helper(Label* L, OffsetSize bits) {
   DCHECK(is_intn(offset, bits));
   DCHECK_EQ(offset & 1, 0);
   DEBUG_PRINTF("\toffset = %d\n", offset);
+  VU.clear();
   return offset;
 }
 
@@ -1414,8 +1418,7 @@ void Assembler::db(uint8_t data) {
 
 void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   if (!is_buffer_growth_blocked()) CheckBuffer();
@@ -1425,8 +1428,7 @@ void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
 
 void Assembler::dq(uint64_t data, RelocInfo::Mode rmode) {
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   if (!is_buffer_growth_blocked()) CheckBuffer();
diff --git a/deps/v8/src/codegen/riscv/assembler-riscv.h b/deps/v8/src/codegen/riscv/assembler-riscv.h
index f383cbf92128bd..c08f82bc7797a6 100644
--- a/deps/v8/src/codegen/riscv/assembler-riscv.h
+++ b/deps/v8/src/codegen/riscv/assembler-riscv.h
@@ -580,9 +580,14 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase,
       }
     }
 
+    void clear() {
+      sew_ = kVsInvalid;
+      lmul_ = kVlInvalid;
+    }
+
    private:
-    VSew sew_ = E8;
-    Vlmul lmul_ = m1;
+    VSew sew_ = kVsInvalid;
+    Vlmul lmul_ = kVlInvalid;
     int32_t vl = 0;
     Assembler* assm_;
     FPURoundingMode mode_ = RNE;
diff --git a/deps/v8/src/codegen/riscv/base-constants-riscv.h b/deps/v8/src/codegen/riscv/base-constants-riscv.h
index 077ae9110c3a5e..bc38bfabc9f323 100644
--- a/deps/v8/src/codegen/riscv/base-constants-riscv.h
+++ b/deps/v8/src/codegen/riscv/base-constants-riscv.h
@@ -73,6 +73,7 @@ enum Vlmul {
 #define DEFINE_FLAG(name) name,
   RVV_LMUL(DEFINE_FLAG)
 #undef DEFINE_FLAG
+      kVlInvalid
 };
 
 #define RVV_SEW(V) \
@@ -85,6 +86,7 @@ enum Vlmul {
 enum VSew {
   RVV_SEW(DEFINE_FLAG)
 #undef DEFINE_FLAG
+      kVsInvalid
 };
 
 constexpr size_t kMaxPCRelativeCodeRangeInMB = 4094;
diff --git a/deps/v8/src/codegen/riscv/macro-assembler-riscv.cc b/deps/v8/src/codegen/riscv/macro-assembler-riscv.cc
index 4f4b443c5149ce..11de91c06a7815 100644
--- a/deps/v8/src/codegen/riscv/macro-assembler-riscv.cc
+++ b/deps/v8/src/codegen/riscv/macro-assembler-riscv.cc
@@ -207,7 +207,7 @@ void MacroAssembler::LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
   Branch(flags_need_processing, ne, scratch, Operand(zero_reg));
 }
 
-void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+void MacroAssembler::OptimizeCodeOrTailCallOptimizedCodeSlot(
     Register flags, Register feedback_vector) {
   ASM_CODE_COMMENT(this);
   DCHECK(!AreAliased(flags, feedback_vector));
@@ -699,6 +699,18 @@ void TurboAssembler::Mulh64(Register rd, Register rs, const Operand& rt) {
   }
 }
 
+void TurboAssembler::Mulhu64(Register rd, Register rs, const Operand& rt) {
+  if (rt.is_reg()) {
+    mulhu(rd, rs, rt.rm());
+  } else {
+    // li handles the relocation.
+    UseScratchRegisterScope temps(this);
+    Register scratch = temps.Acquire();
+    Li(scratch, rt.immediate());
+    mulhu(rd, rs, scratch);
+  }
+}
+
 void TurboAssembler::Div32(Register res, Register rs, const Operand& rt) {
   if (rt.is_reg()) {
     divw(res, rs, rt.rm());
@@ -2420,6 +2432,7 @@ void TurboAssembler::ShlPair(Register dst_low, Register dst_high,
   DCHECK_GE(63, shift);
   DCHECK_NE(dst_low, src_low);
   DCHECK_NE(dst_high, src_low);
+  shift &= 0x3F;
   if (shift == 0) {
     Move(dst_high, src_high);
     Move(dst_low, src_low);
@@ -2489,7 +2502,7 @@ void TurboAssembler::ShrPair(Register dst_low, Register dst_high,
   DCHECK_GE(63, shift);
   DCHECK_NE(dst_low, src_high);
   DCHECK_NE(dst_high, src_high);
-
+  shift &= 0x3F;
   if (shift == 32) {
     mv(dst_low, src_high);
     li(dst_high, Operand(0));
@@ -4392,7 +4405,7 @@ void TurboAssembler::CallBuiltin(Builtin builtin) {
       break;
     }
     case BuiltinCallJumpMode::kPCRelative:
-      Call(BuiltinEntry(builtin), RelocInfo::RUNTIME_ENTRY);
+      Call(BuiltinEntry(builtin), RelocInfo::NEAR_BUILTIN_ENTRY);
       break;
     case BuiltinCallJumpMode::kIndirect: {
       LoadEntryFromBuiltin(builtin, t6);
@@ -4426,7 +4439,7 @@ void TurboAssembler::TailCallBuiltin(Builtin builtin) {
       break;
     }
     case BuiltinCallJumpMode::kPCRelative:
-      Jump(BuiltinEntry(builtin), RelocInfo::RUNTIME_ENTRY);
+      Jump(BuiltinEntry(builtin), RelocInfo::NEAR_BUILTIN_ENTRY);
       break;
     case BuiltinCallJumpMode::kIndirect: {
       LoadEntryFromBuiltin(builtin, t6);
@@ -5199,6 +5212,37 @@ void TurboAssembler::MulOverflow32(Register dst, Register left,
   sext_w(dst, overflow);
   xor_(overflow, overflow, dst);
 }
+
+void TurboAssembler::MulOverflow64(Register dst, Register left,
+                                   const Operand& right, Register overflow) {
+  ASM_CODE_COMMENT(this);
+  UseScratchRegisterScope temps(this);
+  BlockTrampolinePoolScope block_trampoline_pool(this);
+  Register right_reg = no_reg;
+  Register scratch = temps.Acquire();
+  Register scratch2 = temps.Acquire();
+  if (!right.is_reg()) {
+    li(scratch, Operand(right));
+    right_reg = scratch;
+  } else {
+    right_reg = right.rm();
+  }
+
+  DCHECK(left != scratch2 && right_reg != scratch2 && dst != scratch2 &&
+         overflow != scratch2);
+  DCHECK(overflow != left && overflow != right_reg);
+  // use this sequence of "mulh/mul" according to recommendation of ISA Spec 7.1
+  // upper part
+  mulh(scratch2, left, right_reg);
+  // lower part
+  mul(dst, left, right_reg);
+  // expand the sign of the lower part to 64bit
+  srai(overflow, dst, 63);
+  // if the upper part is not eqaul to the expanded sign bit of the lower part,
+  // overflow happens
+  xor_(overflow, overflow, scratch2);
+}
+
 #elif V8_TARGET_ARCH_RISCV32
 void TurboAssembler::AddOverflow(Register dst, Register left,
                                  const Operand& right, Register overflow) {
diff --git a/deps/v8/src/codegen/riscv/macro-assembler-riscv.h b/deps/v8/src/codegen/riscv/macro-assembler-riscv.h
index c245e67606a9f4..eb4b71cb435291 100644
--- a/deps/v8/src/codegen/riscv/macro-assembler-riscv.h
+++ b/deps/v8/src/codegen/riscv/macro-assembler-riscv.h
@@ -447,6 +447,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   DEFINE_INSTRUCTION(Mulh32)
   DEFINE_INSTRUCTION(Mul64)
   DEFINE_INSTRUCTION(Mulh64)
+  DEFINE_INSTRUCTION(Mulhu64)
   DEFINE_INSTRUCTION2(Div32)
   DEFINE_INSTRUCTION2(Div64)
   DEFINE_INSTRUCTION2(Divu32)
@@ -871,7 +872,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
   // MulOverflow32 sets overflow register to zero if no overflow occured
   void MulOverflow32(Register dst, Register left, const Operand& right,
                      Register overflow);
-
+  // MulOverflow64 sets overflow register to zero if no overflow occured
+  void MulOverflow64(Register dst, Register left, const Operand& right,
+                     Register overflow);
   // Number of instructions needed for calculation of switch table entry address
   static const int kSwitchTablePrologueSize = 6;
 
@@ -1344,8 +1347,8 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
   void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
       Register flags, Register feedback_vector, CodeKind current_code_kind,
       Label* flags_need_processing);
-  void MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
-                                                    Register feedback_vector);
+  void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
+                                               Register feedback_vector);
 
   // -------------------------------------------------------------------------
   // Support functions.
diff --git a/deps/v8/src/codegen/s390/assembler-s390-inl.h b/deps/v8/src/codegen/s390/assembler-s390-inl.h
index 3a63c5abbc7e95..91f18727cd0edb 100644
--- a/deps/v8/src/codegen/s390/assembler-s390-inl.h
+++ b/deps/v8/src/codegen/s390/assembler-s390-inl.h
@@ -91,7 +91,7 @@ Address RelocInfo::target_internal_reference_address() {
 
 Address RelocInfo::target_address() {
   DCHECK(IsRelativeCodeTarget(rmode_) || IsCodeTarget(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsWasmCall(rmode_));
+         IsWasmCall(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
@@ -141,10 +141,8 @@ Handle<Object> Assembler::code_target_object_handle_at(Address pc) {
 
 HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_)));
-  } else if (IsCompressedEmbeddedObject(rmode_)) {
-    return HeapObject::cast(Object(DecompressTaggedAny(
+  if (IsCompressedEmbeddedObject(rmode_)) {
+    return HeapObject::cast(Object(V8HeapCompressionScheme::DecompressTaggedAny(
         cage_base,
         Assembler::target_compressed_address_at(pc_, constant_pool_))));
   } else {
@@ -161,9 +159,7 @@ Handle<HeapObject> Assembler::compressed_embedded_object_handle_at(
 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
   DCHECK(IsRelativeCodeTarget(rmode_) || IsCodeTarget(rmode_) ||
          IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_));
-  } else if (IsCodeTarget(rmode_) || IsRelativeCodeTarget(rmode_)) {
+  if (IsCodeTarget(rmode_) || IsRelativeCodeTarget(rmode_)) {
     return Handle<HeapObject>::cast(origin->code_target_object_handle_at(pc_));
   } else {
     if (IsCompressedEmbeddedObject(rmode_)) {
@@ -178,12 +174,11 @@ void RelocInfo::set_target_object(Heap* heap, HeapObject target,
                                   WriteBarrierMode write_barrier_mode,
                                   ICacheFlushMode icache_flush_mode) {
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
-  if (IsDataEmbeddedObject(rmode_)) {
-    WriteUnalignedValue(pc_, target.ptr());
-    // No need to flush icache since no instructions were changed.
-  } else if (IsCompressedEmbeddedObject(rmode_)) {
+  if (IsCompressedEmbeddedObject(rmode_)) {
     Assembler::set_target_compressed_address_at(
-        pc_, constant_pool_, CompressTagged(target.ptr()), icache_flush_mode);
+        pc_, constant_pool_,
+        V8HeapCompressionScheme::CompressTagged(target.ptr()),
+        icache_flush_mode);
   } else {
     DCHECK(IsFullEmbeddedObject(rmode_));
     Assembler::set_target_address_at(pc_, constant_pool_, target.ptr(),
@@ -208,29 +203,15 @@ void RelocInfo::set_target_external_reference(
 
 Builtin RelocInfo::target_builtin_at(Assembler* origin) { UNREACHABLE(); }
 
-Address RelocInfo::target_runtime_entry(Assembler* origin) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  return target_address();
-}
-
 Address RelocInfo::target_off_heap_target() {
   DCHECK(IsOffHeapTarget(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
-void RelocInfo::set_target_runtime_entry(Address target,
-                                         WriteBarrierMode write_barrier_mode,
-                                         ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  if (target_address() != target)
-    set_target_address(target, write_barrier_mode, icache_flush_mode);
-}
-
 void RelocInfo::WipeOut() {
   DCHECK(IsEmbeddedObjectMode(rmode_) || IsCodeTarget(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsExternalReference(rmode_) ||
-         IsInternalReference(rmode_) || IsInternalReferenceEncoded(rmode_) ||
-         IsOffHeapTarget(rmode_));
+         IsExternalReference(rmode_) || IsInternalReference(rmode_) ||
+         IsInternalReferenceEncoded(rmode_) || IsOffHeapTarget(rmode_));
   if (IsInternalReference(rmode_)) {
     // Jump table entry
     Memory<Address>(pc_) = kNullAddress;
diff --git a/deps/v8/src/codegen/s390/assembler-s390.cc b/deps/v8/src/codegen/s390/assembler-s390.cc
index 3f5811c0d46454..0b0bf2bc4363bf 100644
--- a/deps/v8/src/codegen/s390/assembler-s390.cc
+++ b/deps/v8/src/codegen/s390/assembler-s390.cc
@@ -782,8 +782,7 @@ void Assembler::db(uint8_t data) {
 void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
   CheckBuffer();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uint32_t*>(pc_) = data;
@@ -793,8 +792,7 @@ void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
 void Assembler::dq(uint64_t value, RelocInfo::Mode rmode) {
   CheckBuffer();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uint64_t*>(pc_) = value;
@@ -804,8 +802,7 @@ void Assembler::dq(uint64_t value, RelocInfo::Mode rmode) {
 void Assembler::dp(uintptr_t data, RelocInfo::Mode rmode) {
   CheckBuffer();
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   *reinterpret_cast<uintptr_t*>(pc_) = data;
diff --git a/deps/v8/src/codegen/s390/constants-s390.h b/deps/v8/src/codegen/s390/constants-s390.h
index 0e7310d2a724d1..edf4eba214f813 100644
--- a/deps/v8/src/codegen/s390/constants-s390.h
+++ b/deps/v8/src/codegen/s390/constants-s390.h
@@ -270,6 +270,7 @@ using SixByteInstr = uint64_t;
   V(xgrk, XGRK, 0xB9E7)     /* type = RRF_A EXCLUSIVE OR (64)  */           \
   V(agrk, AGRK, 0xB9E8)     /* type = RRF_A ADD (64)  */                    \
   V(sgrk, SGRK, 0xB9E9)     /* type = RRF_A SUBTRACT (64)  */               \
+  V(mgrk, MGRK, 0xB9EC)     /* type = RRF_A MULTIPLY (64->128)  */          \
   V(algrk, ALGRK, 0xB9EA)   /* type = RRF_A ADD LOGICAL (64)  */            \
   V(slgrk, SLGRK, 0xB9EB)   /* type = RRF_A SUBTRACT LOGICAL (64)  */       \
   V(nrk, NRK, 0xB9F4)       /* type = RRF_A AND (32)  */                    \
@@ -874,6 +875,7 @@ using SixByteInstr = uint64_t;
   V(ay, AY, 0xE35A)       /* type = RXY_A ADD (32)  */                         \
   V(sy, SY, 0xE35B)       /* type = RXY_A SUBTRACT (32)  */                    \
   V(mfy, MFY, 0xE35C)     /* type = RXY_A MULTIPLY (64<-32)  */                \
+  V(mg, MG, 0xE384)       /* type = RXY_A MULTIPLY (128<-64)  */               \
   V(aly, ALY, 0xE35E)     /* type = RXY_A ADD LOGICAL (32)  */                 \
   V(sly, SLY, 0xE35F)     /* type = RXY_A SUBTRACT LOGICAL (32)  */            \
   V(sthy, STHY, 0xE370)   /* type = RXY_A STORE HALFWORD (16)  */              \
diff --git a/deps/v8/src/codegen/s390/macro-assembler-s390.cc b/deps/v8/src/codegen/s390/macro-assembler-s390.cc
index 95d124645554d7..48758093e2d4ec 100644
--- a/deps/v8/src/codegen/s390/macro-assembler-s390.cc
+++ b/deps/v8/src/codegen/s390/macro-assembler-s390.cc
@@ -1165,12 +1165,12 @@ void TurboAssembler::PushStandardFrame(Register function_reg) {
 }
 
 void TurboAssembler::RestoreFrameStateForTailCall() {
-  // if (v8_flags.enable_embedded_constant_pool) {
+  // if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
   //   LoadU64(kConstantPoolRegister,
   //         MemOperand(fp, StandardFrameConstants::kConstantPoolOffset));
   //   set_constant_pool_available(false);
   // }
-  DCHECK(!v8_flags.enable_embedded_constant_pool);
+  DCHECK(!V8_EMBEDDED_CONSTANT_POOL_BOOL);
   LoadU64(r14, MemOperand(fp, StandardFrameConstants::kCallerPCOffset));
   LoadU64(fp, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
 }
@@ -2146,7 +2146,7 @@ void MacroAssembler::LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
   b(Condition(7), flags_need_processing);
 }
 
-void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+void MacroAssembler::OptimizeCodeOrTailCallOptimizedCodeSlot(
     Register flags, Register feedback_vector) {
   DCHECK(!AreAliased(flags, feedback_vector));
   Label maybe_has_optimized_code, maybe_needs_logging;
@@ -2939,6 +2939,29 @@ void TurboAssembler::MulS64(Register dst, const MemOperand& opnd) {
   msg(dst, opnd);
 }
 
+void TurboAssembler::MulHighS64(Register dst, Register src1, Register src2) {
+  mgrk(r0, src1, src2);
+  lgr(dst, r0);
+}
+
+void TurboAssembler::MulHighS64(Register dst, Register src1,
+                                const MemOperand& src2) {
+  // TODO(v8): implement this.
+  UNIMPLEMENTED();
+}
+
+void TurboAssembler::MulHighU64(Register dst, Register src1, Register src2) {
+  lgr(r1, src1);
+  mlgr(r0, src2);
+  lgr(dst, r0);
+}
+
+void TurboAssembler::MulHighU64(Register dst, Register src1,
+                                const MemOperand& src2) {
+  // TODO(v8): implement this.
+  UNIMPLEMENTED();
+}
+
 void TurboAssembler::Sqrt(DoubleRegister result, DoubleRegister input) {
   sqdbr(result, input);
 }
diff --git a/deps/v8/src/codegen/s390/macro-assembler-s390.h b/deps/v8/src/codegen/s390/macro-assembler-s390.h
index 7d9a6ca09028a4..6a91f1c096b1d4 100644
--- a/deps/v8/src/codegen/s390/macro-assembler-s390.h
+++ b/deps/v8/src/codegen/s390/macro-assembler-s390.h
@@ -322,6 +322,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
       }
     }
   }
+  void MulHighS64(Register dst, Register src1, Register src2);
+  void MulHighS64(Register dst, Register src1, const MemOperand& src2);
+  void MulHighU64(Register dst, Register src1, Register src2);
+  void MulHighU64(Register dst, Register src1, const MemOperand& src2);
 
   void MulHighS32(Register dst, Register src1, const MemOperand& src2);
   void MulHighS32(Register dst, Register src1, Register src2);
@@ -1764,8 +1768,8 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
   void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
       Register flags, Register feedback_vector, CodeKind current_code_kind,
       Label* flags_need_processing);
-  void MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
-                                                    Register feedback_vector);
+  void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags,
+                                               Register feedback_vector);
 
   // ---------------------------------------------------------------------------
   // GC Support
diff --git a/deps/v8/src/codegen/x64/assembler-x64-inl.h b/deps/v8/src/codegen/x64/assembler-x64-inl.h
index a00c63ee00c6b0..8bddf1df9aa260 100644
--- a/deps/v8/src/codegen/x64/assembler-x64-inl.h
+++ b/deps/v8/src/codegen/x64/assembler-x64-inl.h
@@ -35,14 +35,6 @@ void Assembler::emitw(uint16_t x) {
   pc_ += sizeof(uint16_t);
 }
 
-void Assembler::emit_runtime_entry(Address entry, RelocInfo::Mode rmode) {
-  DCHECK(RelocInfo::IsRuntimeEntry(rmode));
-  DCHECK_NE(options().code_range_base, 0);
-  RecordRelocInfo(rmode);
-  uint32_t offset = static_cast<uint32_t>(entry - options().code_range_base);
-  emitl(offset);
-}
-
 void Assembler::emit(Immediate x) {
   if (!RelocInfo::IsNoInfo(x.rmode_)) {
     RecordRelocInfo(x.rmode_);
@@ -277,17 +269,12 @@ Builtin Assembler::target_builtin_at(Address pc) {
   return static_cast<Builtin>(builtin_id);
 }
 
-Address Assembler::runtime_entry_at(Address pc) {
-  return ReadUnalignedValue<int32_t>(pc) + options().code_range_base;
-}
-
 // -----------------------------------------------------------------------------
 // Implementation of RelocInfo
 
 // The modes possibly affected by apply must be in kApplyMask.
 void RelocInfo::apply(intptr_t delta) {
-  if (IsCodeTarget(rmode_) || IsNearBuiltinEntry(rmode_) ||
-      IsRuntimeEntry(rmode_)) {
+  if (IsCodeTarget(rmode_) || IsNearBuiltinEntry(rmode_)) {
     WriteUnalignedValue(
         pc_, ReadUnalignedValue<int32_t>(pc_) - static_cast<int32_t>(delta));
   } else if (IsInternalReference(rmode_)) {
@@ -298,15 +285,14 @@ void RelocInfo::apply(intptr_t delta) {
 
 Address RelocInfo::target_address() {
   DCHECK(IsCodeTarget(rmode_) || IsNearBuiltinEntry(rmode_) ||
-         IsRuntimeEntry(rmode_) || IsWasmCall(rmode_));
+         IsWasmCall(rmode_));
   return Assembler::target_address_at(pc_, constant_pool_);
 }
 
 Address RelocInfo::target_address_address() {
-  DCHECK(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || IsWasmCall(rmode_) ||
-         IsWasmStubCall(rmode_) || IsFullEmbeddedObject(rmode_) ||
-         IsCompressedEmbeddedObject(rmode_) || IsExternalReference(rmode_) ||
-         IsOffHeapTarget(rmode_));
+  DCHECK(IsCodeTarget(rmode_) || IsWasmCall(rmode_) || IsWasmStubCall(rmode_) ||
+         IsFullEmbeddedObject(rmode_) || IsCompressedEmbeddedObject(rmode_) ||
+         IsExternalReference(rmode_) || IsOffHeapTarget(rmode_));
   return pc_;
 }
 
@@ -326,14 +312,15 @@ HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
   if (IsCompressedEmbeddedObject(rmode_)) {
     Tagged_t compressed = ReadUnalignedValue<Tagged_t>(pc_);
     DCHECK(!HAS_SMI_TAG(compressed));
-    Object obj(DecompressTaggedPointer(cage_base, compressed));
+    Object obj(V8HeapCompressionScheme::DecompressTaggedPointer(cage_base,
+                                                                compressed));
     // Embedding of compressed Code objects must not happen when external code
     // space is enabled, because CodeDataContainers must be used instead.
     DCHECK_IMPLIES(V8_EXTERNAL_CODE_SPACE_BOOL,
                    !IsCodeSpaceObject(HeapObject::cast(obj)));
     return HeapObject::cast(obj);
   }
-  DCHECK(IsFullEmbeddedObject(rmode_) || IsDataEmbeddedObject(rmode_));
+  DCHECK(IsFullEmbeddedObject(rmode_));
   return HeapObject::cast(Object(ReadUnalignedValue<Address>(pc_)));
 }
 
@@ -345,7 +332,7 @@ Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
     if (IsCompressedEmbeddedObject(rmode_)) {
       return origin->compressed_embedded_object_handle_at(pc_);
     }
-    DCHECK(IsFullEmbeddedObject(rmode_) || IsDataEmbeddedObject(rmode_));
+    DCHECK(IsFullEmbeddedObject(rmode_));
     return Handle<HeapObject>::cast(ReadUnalignedValue<Handle<Object>>(pc_));
   }
 }
@@ -380,10 +367,10 @@ void RelocInfo::set_target_object(Heap* heap, HeapObject target,
   DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
   if (IsCompressedEmbeddedObject(rmode_)) {
     DCHECK(COMPRESS_POINTERS_BOOL);
-    Tagged_t tagged = CompressTagged(target.ptr());
+    Tagged_t tagged = V8HeapCompressionScheme::CompressTagged(target.ptr());
     WriteUnalignedValue(pc_, tagged);
   } else {
-    DCHECK(IsFullEmbeddedObject(rmode_) || IsDataEmbeddedObject(rmode_));
+    DCHECK(IsFullEmbeddedObject(rmode_));
     WriteUnalignedValue(pc_, target.ptr());
   }
   if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
@@ -399,20 +386,6 @@ Builtin RelocInfo::target_builtin_at(Assembler* origin) {
   return Assembler::target_builtin_at(pc_);
 }
 
-Address RelocInfo::target_runtime_entry(Assembler* origin) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  return target_address();
-}
-
-void RelocInfo::set_target_runtime_entry(Address target,
-                                         WriteBarrierMode write_barrier_mode,
-                                         ICacheFlushMode icache_flush_mode) {
-  DCHECK(IsRuntimeEntry(rmode_));
-  if (target_address() != target) {
-    set_target_address(target, write_barrier_mode, icache_flush_mode);
-  }
-}
-
 Address RelocInfo::target_off_heap_target() {
   DCHECK(IsOffHeapTarget(rmode_));
   return ReadUnalignedValue<Address>(pc_);
@@ -424,9 +397,9 @@ void RelocInfo::WipeOut() {
     WriteUnalignedValue(pc_, kNullAddress);
   } else if (IsCompressedEmbeddedObject(rmode_)) {
     Address smi_address = Smi::FromInt(0).ptr();
-    WriteUnalignedValue(pc_, CompressTagged(smi_address));
-  } else if (IsCodeTarget(rmode_) || IsNearBuiltinEntry(rmode_) ||
-             IsRuntimeEntry(rmode_)) {
+    WriteUnalignedValue(pc_,
+                        V8HeapCompressionScheme::CompressTagged(smi_address));
+  } else if (IsCodeTarget(rmode_) || IsNearBuiltinEntry(rmode_)) {
     // Effectively write zero into the relocation.
     Assembler::set_target_address_at(pc_, constant_pool_,
                                      pc_ + sizeof(int32_t));
diff --git a/deps/v8/src/codegen/x64/assembler-x64.cc b/deps/v8/src/codegen/x64/assembler-x64.cc
index 2bbf6fda821187..c9ece3338fca5d 100644
--- a/deps/v8/src/codegen/x64/assembler-x64.cc
+++ b/deps/v8/src/codegen/x64/assembler-x64.cc
@@ -989,14 +989,6 @@ void Assembler::call(Label* L) {
   }
 }
 
-void Assembler::call(Address entry, RelocInfo::Mode rmode) {
-  DCHECK(RelocInfo::IsRuntimeEntry(rmode));
-  EnsureSpace ensure_space(this);
-  // 1110 1000 #32-bit disp.
-  emit(0xE8);
-  emit_runtime_entry(entry, rmode);
-}
-
 void Assembler::call(Handle<CodeT> target, RelocInfo::Mode rmode) {
   DCHECK(RelocInfo::IsCodeTarget(rmode));
   DCHECK(FromCodeT(*target).IsExecutable());
@@ -1412,14 +1404,6 @@ void Assembler::j(Condition cc, Handle<CodeT> target, RelocInfo::Mode rmode) {
   emitl(code_target_index);
 }
 
-void Assembler::jmp(Address entry, RelocInfo::Mode rmode) {
-  DCHECK(RelocInfo::IsRuntimeEntry(rmode));
-  EnsureSpace ensure_space(this);
-  // 1110 1001 #32-bit disp.
-  emit(0xE9);
-  emit_runtime_entry(entry, rmode);
-}
-
 void Assembler::jmp_rel(int32_t offset) {
   EnsureSpace ensure_space(this);
   // The offset is encoded relative to the next instruction.
@@ -1892,6 +1876,13 @@ void Assembler::mulq(Register src) {
   emit_modrm(0x4, src);
 }
 
+void Assembler::mulq(Operand src) {
+  EnsureSpace ensure_space(this);
+  emit_rex_64(src);
+  emit(0xF7);
+  emit_operand(0x4, src);
+}
+
 void Assembler::negb(Register reg) {
   EnsureSpace ensure_space(this);
   emit_optional_rex_8(reg);
@@ -4415,8 +4406,7 @@ void Assembler::db(uint8_t data) {
 void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
   EnsureSpace ensure_space(this);
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   emitl(data);
@@ -4425,8 +4415,7 @@ void Assembler::dd(uint32_t data, RelocInfo::Mode rmode) {
 void Assembler::dq(uint64_t data, RelocInfo::Mode rmode) {
   EnsureSpace ensure_space(this);
   if (!RelocInfo::IsNoInfo(rmode)) {
-    DCHECK(RelocInfo::IsDataEmbeddedObject(rmode) ||
-           RelocInfo::IsLiteralConstant(rmode));
+    DCHECK(RelocInfo::IsLiteralConstant(rmode));
     RecordRelocInfo(rmode);
   }
   emitq(data);
@@ -4464,7 +4453,6 @@ void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
 const int RelocInfo::kApplyMask =
     RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
     RelocInfo::ModeMask(RelocInfo::NEAR_BUILTIN_ENTRY) |
-    RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
     RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
     RelocInfo::ModeMask(RelocInfo::WASM_CALL);
 
diff --git a/deps/v8/src/codegen/x64/assembler-x64.h b/deps/v8/src/codegen/x64/assembler-x64.h
index 708012bfce8d6d..ab79cf8ee6a613 100644
--- a/deps/v8/src/codegen/x64/assembler-x64.h
+++ b/deps/v8/src/codegen/x64/assembler-x64.h
@@ -476,7 +476,6 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
 
   inline Handle<CodeT> code_target_object_handle_at(Address pc);
   inline Handle<HeapObject> compressed_embedded_object_handle_at(Address pc);
-  inline Address runtime_entry_at(Address pc);
 
   // Number of bytes taken up by the branch target in the code.
   static constexpr int kSpecialTargetSize = 4;  // 32-bit displacement.
@@ -710,6 +709,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   void mull(Operand src);
   // Multiply rax by src, put the result in rdx:rax.
   void mulq(Register src);
+  void mulq(Operand src);
 
 #define DECLARE_SHIFT_INSTRUCTION(instruction, subcode)                     \
   void instruction##l(Register dst, Immediate imm8) {                       \
@@ -815,7 +815,6 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   // Calls
   // Call near relative 32-bit displacement, relative to next instruction.
   void call(Label* L);
-  void call(Address entry, RelocInfo::Mode rmode);
 
   // Explicitly emit a near call / near jump. The displacement is relative to
   // the next instructions (which starts at {pc_offset() + kNearJmpInstrSize}).
@@ -835,7 +834,6 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   // Unconditional jump to L
   void jmp(Label* L, Label::Distance distance = Label::kFar);
   void jmp(Handle<CodeT> target, RelocInfo::Mode rmode);
-  void jmp(Address entry, RelocInfo::Mode rmode);
 
   // Jump near absolute indirect (r64)
   void jmp(Register adr);
@@ -2116,6 +2114,8 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
 
  private:
   Address addr_at(int pos) {
+    DCHECK_GE(pos, 0);
+    DCHECK_LT(pos, pc_offset());
     return reinterpret_cast<Address>(buffer_start_ + pos);
   }
   uint32_t long_at(int pos) {
@@ -2132,7 +2132,6 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
   inline void emitl(uint32_t x);
   inline void emitq(uint64_t x);
   inline void emitw(uint16_t x);
-  inline void emit_runtime_entry(Address entry, RelocInfo::Mode rmode);
   inline void emit(Immediate x);
   inline void emit(Immediate64 x);
 
diff --git a/deps/v8/src/codegen/x64/macro-assembler-x64.cc b/deps/v8/src/codegen/x64/macro-assembler-x64.cc
index 8ef7f7be06b062..43c4961b40b717 100644
--- a/deps/v8/src/codegen/x64/macro-assembler-x64.cc
+++ b/deps/v8/src/codegen/x64/macro-assembler-x64.cc
@@ -908,7 +908,7 @@ void MacroAssembler::LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
   j(not_zero, flags_need_processing);
 }
 
-void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+void MacroAssembler::OptimizeCodeOrTailCallOptimizedCodeSlot(
     Register flags, Register feedback_vector, Register closure,
     JumpMode jump_mode) {
   ASM_CODE_COMMENT(this);
@@ -918,12 +918,12 @@ void MacroAssembler::MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
   testl(flags, Immediate(FeedbackVector::kFlagsTieringStateIsAnyRequested));
   j(zero, &maybe_needs_logging);
 
-  GenerateTailCallToReturnedCode(Runtime::kCompileOptimized);
+  GenerateTailCallToReturnedCode(Runtime::kCompileOptimized, jump_mode);
 
   bind(&maybe_needs_logging);
   testl(flags, Immediate(FeedbackVector::LogNextExecutionBit::kMask));
   j(zero, &maybe_has_optimized_code);
-  GenerateTailCallToReturnedCode(Runtime::kFunctionLogNextExecution);
+  GenerateTailCallToReturnedCode(Runtime::kFunctionLogNextExecution, jump_mode);
 
   bind(&maybe_has_optimized_code);
   Register optimized_code_entry = flags;
diff --git a/deps/v8/src/codegen/x64/macro-assembler-x64.h b/deps/v8/src/codegen/x64/macro-assembler-x64.h
index a213f9e4a8e5d3..7f138fd9d9bc58 100644
--- a/deps/v8/src/codegen/x64/macro-assembler-x64.h
+++ b/deps/v8/src/codegen/x64/macro-assembler-x64.h
@@ -840,7 +840,7 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
   void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
       Register flags, Register feedback_vector, CodeKind current_code_kind,
       Label* flags_need_processing);
-  void MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
+  void OptimizeCodeOrTailCallOptimizedCodeSlot(
       Register flags, Register feedback_vector, Register closure,
       JumpMode jump_mode = JumpMode::kJump);
 
diff --git a/deps/v8/src/common/globals.h b/deps/v8/src/common/globals.h
index 68634d7d1c9e9c..4e6994294ac31a 100644
--- a/deps/v8/src/common/globals.h
+++ b/deps/v8/src/common/globals.h
@@ -72,9 +72,9 @@ namespace internal {
 // Determine whether the architecture uses an embedded constant pool
 // (contiguous constant pool embedded in code object).
 #if V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64
-#define V8_EMBEDDED_CONSTANT_POOL true
+#define V8_EMBEDDED_CONSTANT_POOL_BOOL true
 #else
-#define V8_EMBEDDED_CONSTANT_POOL false
+#define V8_EMBEDDED_CONSTANT_POOL_BOOL false
 #endif
 
 #ifdef DEBUG
@@ -113,9 +113,10 @@ namespace internal {
 #define COMPRESS_POINTERS_IN_SHARED_CAGE_BOOL false
 #endif
 
-#if defined(V8_SHARED_RO_HEAP) &&      \
-    (!defined(V8_COMPRESS_POINTERS) || \
-     defined(V8_COMPRESS_POINTERS_IN_SHARED_CAGE))
+#if defined(V8_SHARED_RO_HEAP) &&                     \
+    (!defined(V8_COMPRESS_POINTERS) ||                \
+     defined(V8_COMPRESS_POINTERS_IN_SHARED_CAGE)) && \
+    !defined(V8_DISABLE_WRITE_BARRIERS)
 #define V8_CAN_CREATE_SHARED_HEAP_BOOL true
 #else
 #define V8_CAN_CREATE_SHARED_HEAP_BOOL false
@@ -141,12 +142,7 @@ namespace internal {
 #define ENABLE_CONTROL_FLOW_INTEGRITY_BOOL false
 #endif
 
-#if (V8_TARGET_ARCH_S390X && COMPRESS_POINTERS_BOOL)
-// TODO(v8:11421): Enable Sparkplug for these architectures.
-#define ENABLE_SPARKPLUG false
-#else
 #define ENABLE_SPARKPLUG true
-#endif
 
 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64
 // Set stack limit lower for ARM and ARM64 than for other architectures because:
@@ -156,9 +152,16 @@ namespace internal {
 //    initializing V8 we already have a large stack and so have to set the
 //    limit lower. See issue crbug.com/v8/10575
 #define V8_DEFAULT_STACK_SIZE_KB 864
+#elif V8_TARGET_ARCH_IA32
+// In mid-2022, we're observing an increase in stack overflow crashes on
+// 32-bit Windows; the suspicion is that some third-party software suddenly
+// started to consume a lot more stack memory (before V8 is even initialized).
+// So we speculatively lower the ia32 limit to the ARM limit for the time
+// being. See crbug.com/1346791.
+#define V8_DEFAULT_STACK_SIZE_KB 864
 #else
 // Slightly less than 1MB, since Windows' default stack size for
-// the main execution thread is 1MB for both 32 and 64-bit.
+// the main execution thread is 1MB.
 #define V8_DEFAULT_STACK_SIZE_KB 984
 #endif
 
@@ -744,6 +747,13 @@ constexpr intptr_t kObjectAlignmentMask = kObjectAlignment - 1;
 constexpr intptr_t kObjectAlignment8GbHeap = 8;
 constexpr intptr_t kObjectAlignment8GbHeapMask = kObjectAlignment8GbHeap - 1;
 
+#ifdef V8_COMPRESS_POINTERS_8GB
+static_assert(
+    kObjectAlignment8GbHeap == 2 * kTaggedSize,
+    "When the 8GB heap is enabled, all allocations should be aligned to twice "
+    "the size of a tagged value.");
+#endif
+
 // Desired alignment for system pointers.
 constexpr intptr_t kPointerAlignment = (1 << kSystemPointerSizeLog2);
 constexpr intptr_t kPointerAlignmentMask = kPointerAlignment - 1;
@@ -896,6 +906,8 @@ class CompressedObjectSlot;
 class CompressedMaybeObjectSlot;
 class CompressedMapWordSlot;
 class CompressedHeapObjectSlot;
+class V8HeapCompressionScheme;
+template <typename CompressionScheme>
 class OffHeapCompressedObjectSlot;
 class FullObjectSlot;
 class FullMaybeObjectSlot;
@@ -924,15 +936,16 @@ struct SlotTraits {
   using TObjectSlot = CompressedObjectSlot;
   using TMaybeObjectSlot = CompressedMaybeObjectSlot;
   using THeapObjectSlot = CompressedHeapObjectSlot;
-  using TOffHeapObjectSlot = OffHeapCompressedObjectSlot;
-  using TCodeObjectSlot = OffHeapCompressedObjectSlot;
+  using TOffHeapObjectSlot =
+      OffHeapCompressedObjectSlot<V8HeapCompressionScheme>;
+  using TCodeObjectSlot = OffHeapCompressedObjectSlot<V8HeapCompressionScheme>;
 #else
   using TObjectSlot = FullObjectSlot;
   using TMaybeObjectSlot = FullMaybeObjectSlot;
   using THeapObjectSlot = FullHeapObjectSlot;
   using TOffHeapObjectSlot = OffHeapFullObjectSlot;
   using TCodeObjectSlot = OffHeapFullObjectSlot;
-#endif
+#endif  // V8_COMPRESS_POINTERS
 };
 
 // An ObjectSlot instance describes a kTaggedSize-sized on-heap field ("slot")
@@ -969,22 +982,24 @@ using WeakSlotCallbackWithHeap = bool (*)(Heap* heap, FullObjectSlot pointer);
 // NOTE: SpaceIterator depends on AllocationSpace enumeration values being
 // consecutive.
 enum AllocationSpace {
-  RO_SPACE,       // Immortal, immovable and immutable objects,
-  OLD_SPACE,      // Old generation regular object space.
-  CODE_SPACE,     // Old generation code object space, marked executable.
-  MAP_SPACE,      // Old generation map object space, non-movable.
-  NEW_SPACE,      // Young generation space for regular objects collected
-                  // with Scavenger/MinorMC.
-  LO_SPACE,       // Old generation large object space.
-  CODE_LO_SPACE,  // Old generation large code object space.
-  NEW_LO_SPACE,   // Young generation large object space.
+  RO_SPACE,         // Immortal, immovable and immutable objects,
+  OLD_SPACE,        // Old generation regular object space.
+  CODE_SPACE,       // Old generation code object space, marked executable.
+  MAP_SPACE,        // Old generation map object space, non-movable.
+  SHARED_SPACE,     // Space shared between multiple isolates. Optional.
+  NEW_SPACE,        // Young generation space for regular objects collected
+                    // with Scavenger/MinorMC.
+  LO_SPACE,         // Old generation large object space.
+  CODE_LO_SPACE,    // Old generation large code object space.
+  NEW_LO_SPACE,     // Young generation large object space.
+  SHARED_LO_SPACE,  // Space shared between multiple isolates. Optional.
 
   FIRST_SPACE = RO_SPACE,
-  LAST_SPACE = NEW_LO_SPACE,
+  LAST_SPACE = SHARED_LO_SPACE,
   FIRST_MUTABLE_SPACE = OLD_SPACE,
-  LAST_MUTABLE_SPACE = NEW_LO_SPACE,
+  LAST_MUTABLE_SPACE = SHARED_LO_SPACE,
   FIRST_GROWABLE_PAGED_SPACE = OLD_SPACE,
-  LAST_GROWABLE_PAGED_SPACE = MAP_SPACE,
+  LAST_GROWABLE_PAGED_SPACE = SHARED_SPACE,
   FIRST_SWEEPABLE_SPACE = OLD_SPACE,
   LAST_SWEEPABLE_SPACE = NEW_SPACE
 };
@@ -1001,6 +1016,46 @@ enum class AllocationType : uint8_t {
   kSharedMap,  // Map object in MAP_SPACE in the shared heap
 };
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused. If you add new items here, update
+// src/tools/metrics/histograms/enums.xml in chromium.
+enum class GarbageCollectionReason : int {
+  kUnknown = 0,
+  kAllocationFailure = 1,
+  kAllocationLimit = 2,
+  kContextDisposal = 3,
+  kCountersExtension = 4,
+  kDebugger = 5,
+  kDeserializer = 6,
+  kExternalMemoryPressure = 7,
+  kFinalizeMarkingViaStackGuard = 8,
+  kFinalizeMarkingViaTask = 9,
+  kFullHashtable = 10,
+  kHeapProfiler = 11,
+  kTask = 12,
+  kLastResort = 13,
+  kLowMemoryNotification = 14,
+  kMakeHeapIterable = 15,
+  kMemoryPressure = 16,
+  kMemoryReducer = 17,
+  kRuntime = 18,
+  kSamplingProfiler = 19,
+  kSnapshotCreator = 20,
+  kTesting = 21,
+  kExternalFinalize = 22,
+  kGlobalAllocationLimit = 23,
+  kMeasureMemory = 24,
+  kBackgroundAllocationFailure = 25,
+  kFinalizeMinorMC = 26,
+  kCppHeapAllocationFailure = 27,
+
+  kLastReason = kCppHeapAllocationFailure,
+};
+
+static_assert(kGarbageCollectionReasonMaxValue ==
+                  static_cast<int>(GarbageCollectionReason::kLastReason),
+              "The value of kGarbageCollectionReasonMaxValue is inconsistent.");
+
 inline size_t hash_value(AllocationType kind) {
   return static_cast<uint8_t>(kind);
 }
@@ -1227,6 +1282,19 @@ constexpr int kIeeeDoubleExponentWordOffset = 0;
 #define OBJECT_POINTER_ALIGN(value) \
   (((value) + ::i::kObjectAlignmentMask) & ~::i::kObjectAlignmentMask)
 
+// OBJECT_POINTER_ALIGN is used to statically align object sizes to
+// kObjectAlignment (which is kTaggedSize). ALIGN_TO_ALLOCATION_ALIGNMENT is
+// used for dynamic allocations to align sizes and addresses to at least 8 bytes
+// when an 8GB+ compressed heap is enabled.
+// TODO(v8:13070): Consider merging this with OBJECT_POINTER_ALIGN.
+#ifdef V8_COMPRESS_POINTERS_8GB
+#define ALIGN_TO_ALLOCATION_ALIGNMENT(value)      \
+  (((value) + ::i::kObjectAlignment8GbHeapMask) & \
+   ~::i::kObjectAlignment8GbHeapMask)
+#else
+#define ALIGN_TO_ALLOCATION_ALIGNMENT(value) (value)
+#endif
+
 // OBJECT_POINTER_PADDING returns the padding size required to align value
 // as a HeapObject pointer
 #define OBJECT_POINTER_PADDING(value) (OBJECT_POINTER_ALIGN(value) - (value))
@@ -1600,7 +1668,7 @@ inline uint32_t ObjectHash(Address address) {
 //
 //   kSignedSmall -> kSignedSmallInputs -> kNumber  -> kNumberOrOddball -> kAny
 //                                                     kString          -> kAny
-//                                                     kBigInt          -> kAny
+//                                        kBigInt64 -> kBigInt          -> kAny
 //
 // Technically we wouldn't need the separation between the kNumber and the
 // kNumberOrOddball values here, since for binary operations, we always
@@ -1617,7 +1685,8 @@ class BinaryOperationFeedback {
     kNumber = 0x7,
     kNumberOrOddball = 0xF,
     kString = 0x10,
-    kBigInt = 0x20,
+    kBigInt64 = 0x20,
+    kBigInt = 0x60,
     kAny = 0x7F
   };
 };
@@ -1804,6 +1873,15 @@ static constexpr uint32_t kNoneOrInProgressMask = 0b110;
 TIERING_STATE_LIST(V)
 #undef V
 
+constexpr bool IsRequestMaglev(TieringState state) {
+  return IsRequestMaglev_Concurrent(state) ||
+         IsRequestMaglev_Synchronous(state);
+}
+constexpr bool IsRequestTurbofan(TieringState state) {
+  return IsRequestTurbofan_Concurrent(state) ||
+         IsRequestTurbofan_Synchronous(state);
+}
+
 constexpr const char* ToString(TieringState marker) {
   switch (marker) {
 #define V(Name, Value)        \
diff --git a/deps/v8/src/common/message-template.h b/deps/v8/src/common/message-template.h
index bb1b284d91b008..4412c83ea3209b 100644
--- a/deps/v8/src/common/message-template.h
+++ b/deps/v8/src/common/message-template.h
@@ -115,6 +115,7 @@ namespace internal {
   T(InvalidArgument, "invalid_argument")                                       \
   T(InvalidArgumentForTemporal, "Invalid argument for Temporal %")             \
   T(InvalidInOperatorUse, "Cannot use 'in' operator to search for '%' in %")   \
+  T(InvalidRawJsonValue, "Invalid value for JSON.rawJSON")                     \
   T(InvalidRegExpExecResult,                                                   \
     "RegExp exec method returned something other than an Object or null")      \
   T(InvalidUnit, "Invalid unit argument for %() '%'")                          \
@@ -658,6 +659,7 @@ namespace internal {
   T(WasmTrapStringIsolatedSurrogate,                                           \
     "Failed to encode string as UTF-8: contains unpaired surrogate")           \
   T(WasmExceptionError, "wasm exception")                                      \
+  T(WasmObjectsAreOpaque, "WebAssembly objects are opaque")                    \
   /* Asm.js validation related */                                              \
   T(AsmJsInvalid, "Invalid asm.js: %")                                         \
   T(AsmJsCompiled, "Converted asm.js to WebAssembly: %")                       \
@@ -685,17 +687,15 @@ namespace internal {
   T(TraceEventPhaseError, "Trace event phase must be a number.")               \
   T(TraceEventIDError, "Trace event id must be a number.")                     \
   /* Weak refs */                                                              \
-  T(WeakRefsUnregisterTokenMustBeObject,                                       \
-    "unregisterToken ('%') must be an object")                                 \
+  T(InvalidWeakRefsUnregisterToken, "Invalid unregisterToken ('%')")           \
   T(WeakRefsCleanupMustBeCallable,                                             \
     "FinalizationRegistry: cleanup must be callable")                          \
-  T(WeakRefsRegisterTargetMustBeObject,                                        \
-    "FinalizationRegistry.prototype.register: target must be an object")       \
+  T(InvalidWeakRefsRegisterTarget,                                             \
+    "FinalizationRegistry.prototype.register: invalid target")                 \
   T(WeakRefsRegisterTargetAndHoldingsMustNotBeSame,                            \
     "FinalizationRegistry.prototype.register: target and holdings must not "   \
     "be same")                                                                 \
-  T(WeakRefsWeakRefConstructorTargetMustBeObject,                              \
-    "WeakRef: target must be an object")                                       \
+  T(InvalidWeakRefsWeakRefConstructorTarget, "WeakRef: invalid target")        \
   T(OptionalChainingNoNew, "Invalid optional chain from new expression")       \
   T(OptionalChainingNoSuper, "Invalid optional chain from super property")     \
   T(OptionalChainingNoTemplate, "Invalid tagged template on optional chain")   \
diff --git a/deps/v8/src/common/ptr-compr-inl.h b/deps/v8/src/common/ptr-compr-inl.h
index f5991ddcda2eb4..1322270e8f0439 100644
--- a/deps/v8/src/common/ptr-compr-inl.h
+++ b/deps/v8/src/common/ptr-compr-inl.h
@@ -26,74 +26,127 @@ Address PtrComprCageBase::address() const {
   return ret;
 }
 
-// Compresses full-pointer representation of a tagged value to on-heap
-// representation.
-V8_INLINE Tagged_t CompressTagged(Address tagged) {
-  return static_cast<Tagged_t>(static_cast<uint32_t>(tagged));
-}
+//
+// V8HeapCompressionScheme
+//
 
-V8_INLINE constexpr Address GetPtrComprCageBaseAddress(Address on_heap_addr) {
+// static
+Address V8HeapCompressionScheme::GetPtrComprCageBaseAddress(
+    Address on_heap_addr) {
   return RoundDown<kPtrComprCageBaseAlignment>(on_heap_addr);
 }
 
-V8_INLINE Address GetPtrComprCageBaseAddress(PtrComprCageBase cage_base) {
+// static
+Address V8HeapCompressionScheme::GetPtrComprCageBaseAddress(
+    PtrComprCageBase cage_base) {
   return cage_base.address();
 }
 
-V8_INLINE constexpr PtrComprCageBase GetPtrComprCageBaseFromOnHeapAddress(
-    Address address) {
-  return PtrComprCageBase(GetPtrComprCageBaseAddress(address));
+// static
+Tagged_t V8HeapCompressionScheme::CompressTagged(Address tagged) {
+  return static_cast<Tagged_t>(static_cast<uint32_t>(tagged));
 }
 
-// Decompresses smi value.
-V8_INLINE Address DecompressTaggedSigned(Tagged_t raw_value) {
+// static
+Address V8HeapCompressionScheme::DecompressTaggedSigned(Tagged_t raw_value) {
   // For runtime code the upper 32-bits of the Smi value do not matter.
   return static_cast<Address>(raw_value);
 }
 
-// Decompresses weak or strong heap object pointer or forwarding pointer,
-// preserving both weak- and smi- tags.
+// static
 template <typename TOnHeapAddress>
-V8_INLINE Address DecompressTaggedPointer(TOnHeapAddress on_heap_addr,
-                                          Tagged_t raw_value) {
+Address V8HeapCompressionScheme::DecompressTaggedPointer(
+    TOnHeapAddress on_heap_addr, Tagged_t raw_value) {
   return GetPtrComprCageBaseAddress(on_heap_addr) +
          static_cast<Address>(raw_value);
 }
 
-// Decompresses any tagged value, preserving both weak- and smi- tags.
+// static
 template <typename TOnHeapAddress>
-V8_INLINE Address DecompressTaggedAny(TOnHeapAddress on_heap_addr,
-                                      Tagged_t raw_value) {
+Address V8HeapCompressionScheme::DecompressTaggedAny(
+    TOnHeapAddress on_heap_addr, Tagged_t raw_value) {
   return DecompressTaggedPointer(on_heap_addr, raw_value);
 }
 
+// static
+template <typename ProcessPointerCallback>
+void V8HeapCompressionScheme::ProcessIntermediatePointers(
+    PtrComprCageBase cage_base, Address raw_value,
+    ProcessPointerCallback callback) {
+  // If pointer compression is enabled, we may have random compressed pointers
+  // on the stack that may be used for subsequent operations.
+  // Extract, decompress and trace both halfwords.
+  Address decompressed_low = V8HeapCompressionScheme::DecompressTaggedPointer(
+      cage_base, static_cast<Tagged_t>(raw_value));
+  callback(decompressed_low);
+  Address decompressed_high = V8HeapCompressionScheme::DecompressTaggedPointer(
+      cage_base,
+      static_cast<Tagged_t>(raw_value >> (sizeof(Tagged_t) * CHAR_BIT)));
+  callback(decompressed_high);
+}
+
+//
+// Misc functions.
+//
+
+V8_INLINE PtrComprCageBase
+GetPtrComprCageBaseFromOnHeapAddress(Address address) {
+  return PtrComprCageBase(
+      V8HeapCompressionScheme::GetPtrComprCageBaseAddress(address));
+}
+
 #else
 
-V8_INLINE Tagged_t CompressTagged(Address tagged) { UNREACHABLE(); }
+//
+// V8HeapCompressionScheme
+//
 
-V8_INLINE constexpr PtrComprCageBase GetPtrComprCageBaseFromOnHeapAddress(
-    Address address) {
-  return PtrComprCageBase();
+// static
+Address V8HeapCompressionScheme::GetPtrComprCageBaseAddress(
+    Address on_heap_addr) {
+  UNREACHABLE();
+}
+
+// static
+Tagged_t V8HeapCompressionScheme::CompressTagged(Address tagged) {
+  UNREACHABLE();
 }
 
-V8_INLINE Address DecompressTaggedSigned(Tagged_t raw_value) { UNREACHABLE(); }
+// static
+Address V8HeapCompressionScheme::DecompressTaggedSigned(Tagged_t raw_value) {
+  UNREACHABLE();
+}
 
 template <typename TOnHeapAddress>
-V8_INLINE Address DecompressTaggedPointer(TOnHeapAddress on_heap_addr,
-                                          Tagged_t raw_value) {
+Address V8HeapCompressionScheme::DecompressTaggedPointer(
+    TOnHeapAddress on_heap_addr, Tagged_t raw_value) {
   UNREACHABLE();
 }
 
+// static
 template <typename TOnHeapAddress>
-V8_INLINE Address DecompressTaggedAny(TOnHeapAddress on_heap_addr,
-                                      Tagged_t raw_value) {
+Address V8HeapCompressionScheme::DecompressTaggedAny(
+    TOnHeapAddress on_heap_addr, Tagged_t raw_value) {
   UNREACHABLE();
 }
 
-V8_INLINE Address GetPtrComprCageBaseAddress(Address on_heap_addr) {
+// static
+template <typename ProcessPointerCallback>
+void V8HeapCompressionScheme::ProcessIntermediatePointers(
+    PtrComprCageBase cage_base, Address raw_value,
+    ProcessPointerCallback callback) {
   UNREACHABLE();
 }
 
+//
+// Misc functions.
+//
+
+V8_INLINE constexpr PtrComprCageBase GetPtrComprCageBaseFromOnHeapAddress(
+    Address address) {
+  return PtrComprCageBase();
+}
+
 #endif  // V8_COMPRESS_POINTERS
 
 V8_INLINE PtrComprCageBase GetPtrComprCageBase(HeapObject object) {
diff --git a/deps/v8/src/common/ptr-compr.h b/deps/v8/src/common/ptr-compr.h
index 58d14602908e93..5a47331a5414a4 100644
--- a/deps/v8/src/common/ptr-compr.h
+++ b/deps/v8/src/common/ptr-compr.h
@@ -8,8 +8,52 @@
 #include "src/base/memory.h"
 #include "src/common/globals.h"
 
-namespace v8 {
-namespace internal {
+namespace v8::internal {
+
+// This is just a collection of compression scheme related functions. Having
+// such a class allows plugging different decompression scheme in certain
+// places by introducing another CompressionScheme class with a customized
+// implementation. This is useful, for example, for CodeDataContainer::code
+// field (see CodeObjectSlot).
+class V8HeapCompressionScheme {
+ public:
+  V8_INLINE static Address GetPtrComprCageBaseAddress(Address on_heap_addr);
+
+  V8_INLINE static Address GetPtrComprCageBaseAddress(
+      PtrComprCageBase cage_base);
+
+  // Compresses full-pointer representation of a tagged value to on-heap
+  // representation.
+  V8_INLINE static Tagged_t CompressTagged(Address tagged);
+
+  // Decompresses smi value.
+  V8_INLINE static Address DecompressTaggedSigned(Tagged_t raw_value);
+
+  // Decompresses weak or strong heap object pointer or forwarding pointer,
+  // preserving both weak- and smi- tags.
+  template <typename TOnHeapAddress>
+  V8_INLINE static Address DecompressTaggedPointer(TOnHeapAddress on_heap_addr,
+                                                   Tagged_t raw_value);
+  // Decompresses any tagged value, preserving both weak- and smi- tags.
+  template <typename TOnHeapAddress>
+  V8_INLINE static Address DecompressTaggedAny(TOnHeapAddress on_heap_addr,
+                                               Tagged_t raw_value);
+
+  // Given a 64bit raw value, found on the stack, calls the callback function
+  // with all possible pointers that may be "contained" in compressed form in
+  // this value, either as complete compressed pointers or as intermediate
+  // (half-computed) results.
+  template <typename ProcessPointerCallback>
+  V8_INLINE static void ProcessIntermediatePointers(
+      PtrComprCageBase cage_base, Address raw_value,
+      ProcessPointerCallback callback);
+};
+
+#ifdef V8_EXTERNAL_CODE_SPACE
+// Compression scheme used for fields containing Code objects (namely for the
+// CodeDataContainer::code field).
+using ExternalCodeCompressionScheme = V8HeapCompressionScheme;
+#endif  // V8_EXTERNAL_CODE_SPACE
 
 // Accessors for fields that may be unaligned due to pointer compression.
 
@@ -49,7 +93,6 @@ static inline void WriteMaybeUnalignedValue(Address p, V value) {
   }
 }
 
-}  // namespace internal
-}  // namespace v8
+}  // namespace v8::internal
 
 #endif  // V8_COMMON_PTR_COMPR_H_
diff --git a/deps/v8/src/compiler-dispatcher/lazy-compile-dispatcher.cc b/deps/v8/src/compiler-dispatcher/lazy-compile-dispatcher.cc
index c598180067a141..a8148b7700ddf7 100644
--- a/deps/v8/src/compiler-dispatcher/lazy-compile-dispatcher.cc
+++ b/deps/v8/src/compiler-dispatcher/lazy-compile-dispatcher.cc
@@ -43,9 +43,9 @@ class LazyCompileDispatcher::JobTask : public v8::JobTask {
   size_t GetMaxConcurrency(size_t worker_count) const final {
     size_t n = lazy_compile_dispatcher_->num_jobs_for_background_.load(
         std::memory_order_relaxed);
-    if (FLAG_lazy_compile_dispatcher_max_threads == 0) return n;
+    if (v8_flags.lazy_compile_dispatcher_max_threads == 0) return n;
     return std::min(
-        n, static_cast<size_t>(FLAG_lazy_compile_dispatcher_max_threads));
+        n, static_cast<size_t>(v8_flags.lazy_compile_dispatcher_max_threads));
   }
 
  private:
@@ -69,7 +69,7 @@ LazyCompileDispatcher::LazyCompileDispatcher(Isolate* isolate,
           reinterpret_cast<v8::Isolate*>(isolate))),
       platform_(platform),
       max_stack_size_(max_stack_size),
-      trace_compiler_dispatcher_(FLAG_trace_compiler_dispatcher),
+      trace_compiler_dispatcher_(v8_flags.trace_compiler_dispatcher),
       idle_task_manager_(new CancelableTaskManager()),
       idle_task_scheduled_(false),
       num_jobs_for_background_(0),
diff --git a/deps/v8/src/compiler-dispatcher/lazy-compile-dispatcher.h b/deps/v8/src/compiler-dispatcher/lazy-compile-dispatcher.h
index 5eebde9e5b2510..7e6702851a10aa 100644
--- a/deps/v8/src/compiler-dispatcher/lazy-compile-dispatcher.h
+++ b/deps/v8/src/compiler-dispatcher/lazy-compile-dispatcher.h
@@ -189,7 +189,8 @@ class V8_EXPORT_PRIVATE LazyCompileDispatcher {
 
   std::unique_ptr<JobHandle> job_handle_;
 
-  // Copy of FLAG_trace_compiler_dispatcher to allow for access from any thread.
+  // Copy of v8_flags.trace_compiler_dispatcher to allow for access from any
+  // thread.
   bool trace_compiler_dispatcher_;
 
   std::unique_ptr<CancelableTaskManager> idle_task_manager_;
diff --git a/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc b/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc
index 892815a890a3aa..d85832bdcda650 100644
--- a/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc
+++ b/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc
@@ -50,8 +50,10 @@ class OptimizingCompileDispatcher::CompileTask : public CancelableTask {
                 RuntimeCallCounterId::kOptimizeBackgroundDispatcherJob);
 
       TimerEventScope<TimerEventRecompileConcurrent> timer(isolate_);
-      TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
-                   "V8.OptimizeBackground");
+      TurbofanCompilationJob* job = dispatcher_->NextInput(&local_isolate);
+      TRACE_EVENT_WITH_FLOW0(
+          TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.OptimizeBackground", job,
+          TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
 
       if (dispatcher_->recompilation_delay_ != 0) {
         base::OS::Sleep(base::TimeDelta::FromMilliseconds(
@@ -62,8 +64,7 @@ class OptimizingCompileDispatcher::CompileTask : public CancelableTask {
       // code space in order to be able to get a bytecode array from a baseline
       // code. See SharedFunctionInfo::GetActiveBytecodeArray() for details.
       RwxMemoryWriteScope::SetDefaultPermissionsForNewThread();
-      dispatcher_->CompileNext(dispatcher_->NextInput(&local_isolate),
-                               &local_isolate);
+      dispatcher_->CompileNext(job, &local_isolate);
     }
     {
       base::MutexGuard lock_guard(&dispatcher_->ref_count_mutex_);
@@ -167,7 +168,7 @@ void OptimizingCompileDispatcher::FlushQueues(
 void OptimizingCompileDispatcher::Flush(BlockingBehavior blocking_behavior) {
   HandleScope handle_scope(isolate_);
   FlushQueues(blocking_behavior, true);
-  if (FLAG_trace_concurrent_recompilation) {
+  if (v8_flags.trace_concurrent_recompilation) {
     PrintF("  ** Flushed concurrent recompilation queues. (mode: %s)\n",
            (blocking_behavior == BlockingBehavior::kBlock) ? "blocking"
                                                            : "non blocking");
@@ -199,7 +200,7 @@ void OptimizingCompileDispatcher::InstallOptimizedFunctions() {
     // If another racing task has already finished compiling and installing the
     // requested code kind on the function, throw out the current job.
     if (!info->is_osr() && function->HasAvailableCodeKind(info->code_kind())) {
-      if (FLAG_trace_concurrent_recompilation) {
+      if (v8_flags.trace_concurrent_recompilation) {
         PrintF("  ** Aborting compilation for ");
         function->ShortPrint();
         PrintF(" as it has already been optimized.\n");
diff --git a/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.h b/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.h
index 44c878d50ff472..9794ed1935e9f3 100644
--- a/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.h
+++ b/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.h
@@ -27,11 +27,11 @@ class V8_EXPORT_PRIVATE OptimizingCompileDispatcher {
  public:
   explicit OptimizingCompileDispatcher(Isolate* isolate)
       : isolate_(isolate),
-        input_queue_capacity_(FLAG_concurrent_recompilation_queue_length),
+        input_queue_capacity_(v8_flags.concurrent_recompilation_queue_length),
         input_queue_length_(0),
         input_queue_shift_(0),
         ref_count_(0),
-        recompilation_delay_(FLAG_concurrent_recompilation_delay) {
+        recompilation_delay_(v8_flags.concurrent_recompilation_delay) {
     input_queue_ = NewArray<TurbofanCompilationJob*>(input_queue_capacity_);
   }
 
@@ -49,7 +49,7 @@ class V8_EXPORT_PRIVATE OptimizingCompileDispatcher {
     return input_queue_length_ < input_queue_capacity_;
   }
 
-  static bool Enabled() { return FLAG_concurrent_recompilation; }
+  static bool Enabled() { return v8_flags.concurrent_recompilation; }
 
   // This method must be called on the main thread.
   bool HasJobs();
@@ -101,7 +101,7 @@ class V8_EXPORT_PRIVATE OptimizingCompileDispatcher {
   base::Mutex ref_count_mutex_;
   ParkingConditionVariable ref_count_zero_;
 
-  // Copy of FLAG_concurrent_recompilation_delay that will be used from the
+  // Copy of v8_flags.concurrent_recompilation_delay that will be used from the
   // background thread.
   //
   // Since flags might get modified while the background thread is running, it
diff --git a/deps/v8/src/compiler/access-builder.cc b/deps/v8/src/compiler/access-builder.cc
index 7a8d7426be23dd..4b1f609025d919 100644
--- a/deps/v8/src/compiler/access-builder.cc
+++ b/deps/v8/src/compiler/access-builder.cc
@@ -376,39 +376,48 @@ FieldAccess AccessBuilder::ForJSArrayBufferViewBuffer() {
 // static
 FieldAccess AccessBuilder::ForJSArrayBufferViewByteLength() {
   FieldAccess access = {kTaggedBase,
-                        JSArrayBufferView::kByteLengthOffset,
+                        JSArrayBufferView::kRawByteLengthOffset,
                         MaybeHandle<Name>(),
                         MaybeHandle<Map>(),
                         TypeCache::Get()->kJSArrayBufferViewByteLengthType,
                         MachineType::UintPtr(),
                         kNoWriteBarrier,
                         "JSArrayBufferViewByteLength"};
+#ifdef V8_ENABLE_SANDBOX
+  access.is_bounded_size_access = true;
+#endif
   return access;
 }
 
 // static
 FieldAccess AccessBuilder::ForJSArrayBufferViewByteOffset() {
   FieldAccess access = {kTaggedBase,
-                        JSArrayBufferView::kByteOffsetOffset,
+                        JSArrayBufferView::kRawByteOffsetOffset,
                         MaybeHandle<Name>(),
                         MaybeHandle<Map>(),
                         TypeCache::Get()->kJSArrayBufferViewByteOffsetType,
                         MachineType::UintPtr(),
                         kNoWriteBarrier,
                         "JSArrayBufferViewByteOffset"};
+#ifdef V8_ENABLE_SANDBOX
+  access.is_bounded_size_access = true;
+#endif
   return access;
 }
 
 // static
 FieldAccess AccessBuilder::ForJSTypedArrayLength() {
   FieldAccess access = {kTaggedBase,
-                        JSTypedArray::kLengthOffset,
+                        JSTypedArray::kRawLengthOffset,
                         MaybeHandle<Name>(),
                         MaybeHandle<Map>(),
                         TypeCache::Get()->kJSTypedArrayLengthType,
                         MachineType::UintPtr(),
                         kNoWriteBarrier,
                         "JSTypedArrayLength"};
+#ifdef V8_ENABLE_SANDBOX
+  access.is_bounded_size_access = true;
+#endif
   return access;
 }
 
diff --git a/deps/v8/src/compiler/access-info.cc b/deps/v8/src/compiler/access-info.cc
index 4c8923325b4d06..7c35df243af97d 100644
--- a/deps/v8/src/compiler/access-info.cc
+++ b/deps/v8/src/compiler/access-info.cc
@@ -139,18 +139,20 @@ PropertyAccessInfo PropertyAccessInfo::FastDataConstant(
 
 // static
 PropertyAccessInfo PropertyAccessInfo::FastAccessorConstant(
-    Zone* zone, MapRef receiver_map, base::Optional<ObjectRef> constant,
-    base::Optional<JSObjectRef> holder) {
-  return PropertyAccessInfo(zone, kFastAccessorConstant, holder, constant, {},
-                            {{receiver_map}, zone});
+    Zone* zone, MapRef receiver_map, base::Optional<JSObjectRef> holder,
+    base::Optional<ObjectRef> constant,
+    base::Optional<JSObjectRef> api_holder) {
+  return PropertyAccessInfo(zone, kFastAccessorConstant, holder, constant,
+                            api_holder, {} /* name */, {{receiver_map}, zone});
 }
 
 // static
 PropertyAccessInfo PropertyAccessInfo::ModuleExport(Zone* zone,
                                                     MapRef receiver_map,
                                                     CellRef cell) {
-  return PropertyAccessInfo(zone, kModuleExport, {}, cell, {},
-                            {{receiver_map}, zone});
+  return PropertyAccessInfo(zone, kModuleExport, {} /* holder */,
+                            cell /* constant */, {} /* api_holder */,
+                            {} /* name */, {{receiver_map}, zone});
 }
 
 // static
@@ -170,9 +172,11 @@ PropertyAccessInfo PropertyAccessInfo::DictionaryProtoDataConstant(
 // static
 PropertyAccessInfo PropertyAccessInfo::DictionaryProtoAccessorConstant(
     Zone* zone, MapRef receiver_map, base::Optional<JSObjectRef> holder,
-    ObjectRef constant, NameRef property_name) {
+    ObjectRef constant, base::Optional<JSObjectRef> api_holder,
+    NameRef property_name) {
   return PropertyAccessInfo(zone, kDictionaryProtoAccessorConstant, holder,
-                            constant, property_name, {{receiver_map}, zone});
+                            constant, api_holder, property_name,
+                            {{receiver_map}, zone});
 }
 
 PropertyAccessInfo::PropertyAccessInfo(Zone* zone)
@@ -196,12 +200,13 @@ PropertyAccessInfo::PropertyAccessInfo(
 
 PropertyAccessInfo::PropertyAccessInfo(
     Zone* zone, Kind kind, base::Optional<JSObjectRef> holder,
-    base::Optional<ObjectRef> constant, base::Optional<NameRef> name,
-    ZoneVector<MapRef>&& lookup_start_object_maps)
+    base::Optional<ObjectRef> constant, base::Optional<JSObjectRef> api_holder,
+    base::Optional<NameRef> name, ZoneVector<MapRef>&& lookup_start_object_maps)
     : kind_(kind),
       lookup_start_object_maps_(lookup_start_object_maps),
       constant_(constant),
       holder_(holder),
+      api_holder_(api_holder),
       unrecorded_dependencies_(zone),
       field_representation_(Representation::None()),
       field_type_(Type::Any()),
@@ -544,8 +549,8 @@ PropertyAccessInfo AccessorAccessInfoHelper(
     DCHECK(!map.is_dictionary_map());
 
     // HasProperty checks don't call getter/setters, existence is sufficient.
-    return PropertyAccessInfo::FastAccessorConstant(zone, receiver_map, {},
-                                                    holder);
+    return PropertyAccessInfo::FastAccessorConstant(zone, receiver_map, holder,
+                                                    {}, {});
   }
   Handle<Object> maybe_accessors = get_accessors();
   if (!maybe_accessors->IsAccessorPair()) {
@@ -559,6 +564,7 @@ PropertyAccessInfo AccessorAccessInfoHelper(
   base::Optional<ObjectRef> accessor_ref = TryMakeRef(broker, accessor);
   if (!accessor_ref.has_value()) return PropertyAccessInfo::Invalid(zone);
 
+  base::Optional<JSObjectRef> api_holder_ref;
   if (!accessor->IsJSFunction()) {
     CallOptimization optimization(broker->local_isolate_or_isolate(), accessor);
     if (!optimization.is_simple_api_call() ||
@@ -567,24 +573,22 @@ PropertyAccessInfo AccessorAccessInfoHelper(
       return PropertyAccessInfo::Invalid(zone);
     }
 
-    CallOptimization::HolderLookup lookup;
-    Handle<JSObject> holder_handle = broker->CanonicalPersistentHandle(
+    CallOptimization::HolderLookup holder_lookup;
+    Handle<JSObject> api_holder = broker->CanonicalPersistentHandle(
         optimization.LookupHolderOfExpectedType(
             broker->local_isolate_or_isolate(), receiver_map.object(),
-            &lookup));
-    if (lookup == CallOptimization::kHolderNotFound) {
+            &holder_lookup));
+    if (holder_lookup == CallOptimization::kHolderNotFound) {
       return PropertyAccessInfo::Invalid(zone);
     }
-    DCHECK_IMPLIES(lookup == CallOptimization::kHolderIsReceiver,
-                   holder_handle.is_null());
-    DCHECK_IMPLIES(lookup == CallOptimization::kHolderFound,
-                   !holder_handle.is_null());
-
-    if (holder_handle.is_null()) {
-      holder = {};
-    } else {
-      holder = TryMakeRef(broker, holder_handle);
-      if (!holder.has_value()) return PropertyAccessInfo::Invalid(zone);
+    DCHECK_IMPLIES(holder_lookup == CallOptimization::kHolderIsReceiver,
+                   api_holder.is_null());
+    DCHECK_IMPLIES(holder_lookup == CallOptimization::kHolderFound,
+                   !api_holder.is_null());
+
+    if (!api_holder.is_null()) {
+      api_holder_ref = TryMakeRef(broker, api_holder);
+      if (!api_holder_ref.has_value()) return PropertyAccessInfo::Invalid(zone);
     }
   }
   if (access_mode == AccessMode::kLoad) {
@@ -602,11 +606,12 @@ PropertyAccessInfo AccessorAccessInfoHelper(
   }
 
   if (map.is_dictionary_map()) {
+    CHECK(!api_holder_ref.has_value());
     return PropertyAccessInfo::DictionaryProtoAccessorConstant(
-        zone, receiver_map, holder, accessor_ref.value(), name);
+        zone, receiver_map, holder, accessor_ref.value(), api_holder_ref, name);
   } else {
     return PropertyAccessInfo::FastAccessorConstant(
-        zone, receiver_map, accessor_ref.value(), holder);
+        zone, receiver_map, holder, accessor_ref.value(), api_holder_ref);
   }
 }
 
@@ -876,7 +881,8 @@ PropertyAccessInfo AccessInfoFactory::ComputePropertyAccessInfo(
     if (!map_prototype_map.object()->IsJSObjectMap()) {
       // Don't allow proxies on the prototype chain.
       if (!prototype.IsNull()) {
-        DCHECK(prototype.object()->IsJSProxy());
+        DCHECK(prototype.object()->IsJSProxy() ||
+               prototype.object()->IsWasmObject());
         return Invalid();
       }
 
diff --git a/deps/v8/src/compiler/access-info.h b/deps/v8/src/compiler/access-info.h
index 5b0b9bee2ca8ba..d75e8d7b2b0d20 100644
--- a/deps/v8/src/compiler/access-info.h
+++ b/deps/v8/src/compiler/access-info.h
@@ -85,8 +85,9 @@ class PropertyAccessInfo final {
       base::Optional<JSObjectRef> holder,
       base::Optional<MapRef> transition_map);
   static PropertyAccessInfo FastAccessorConstant(
-      Zone* zone, MapRef receiver_map, base::Optional<ObjectRef> constant,
-      base::Optional<JSObjectRef> holder);
+      Zone* zone, MapRef receiver_map, base::Optional<JSObjectRef> holder,
+      base::Optional<ObjectRef> constant,
+      base::Optional<JSObjectRef> api_holder);
   static PropertyAccessInfo ModuleExport(Zone* zone, MapRef receiver_map,
                                          CellRef cell);
   static PropertyAccessInfo StringLength(Zone* zone, MapRef receiver_map);
@@ -96,7 +97,7 @@ class PropertyAccessInfo final {
       InternalIndex dict_index, NameRef name);
   static PropertyAccessInfo DictionaryProtoAccessorConstant(
       Zone* zone, MapRef receiver_map, base::Optional<JSObjectRef> holder,
-      ObjectRef constant, NameRef name);
+      ObjectRef constant, base::Optional<JSObjectRef> api_holder, NameRef name);
 
   bool Merge(PropertyAccessInfo const* that, AccessMode access_mode,
              Zone* zone) V8_WARN_UNUSED_RESULT;
@@ -127,12 +128,20 @@ class PropertyAccessInfo final {
   ConstFieldInfo GetConstFieldInfo() const;
 
   Kind kind() const { return kind_; }
+
+  // The object where the property definition was found.
   base::Optional<JSObjectRef> holder() const {
     // TODO(neis): There was a CHECK here that tries to protect against
     // using the access info without recording its dependencies first.
     // Find a more suitable place for it.
     return holder_;
   }
+  // For accessor properties when the callback is an API function with a
+  // signature, this is the value that will be passed to the callback as
+  // FunctionCallbackInfo::Holder().
+  // Don't mix it up with holder in a "object where the property was found"
+  // sense.
+  base::Optional<JSObjectRef> api_holder() const { return api_holder_; }
   base::Optional<MapRef> transition_map() const {
     DCHECK(!HasDictionaryHolder());
     return transition_map_;
@@ -180,6 +189,7 @@ class PropertyAccessInfo final {
                      ZoneVector<MapRef>&& lookup_start_object_maps);
   PropertyAccessInfo(Zone* zone, Kind kind, base::Optional<JSObjectRef> holder,
                      base::Optional<ObjectRef> constant,
+                     base::Optional<JSObjectRef> api_holder,
                      base::Optional<NameRef> name,
                      ZoneVector<MapRef>&& lookup_start_object_maps);
   PropertyAccessInfo(Kind kind, base::Optional<JSObjectRef> holder,
@@ -198,6 +208,7 @@ class PropertyAccessInfo final {
   ZoneVector<MapRef> lookup_start_object_maps_;
   base::Optional<ObjectRef> constant_;
   base::Optional<JSObjectRef> holder_;
+  base::Optional<JSObjectRef> api_holder_;
 
   // Members only used for fast mode holders:
   ZoneVector<CompilationDependency const*> unrecorded_dependencies_;
diff --git a/deps/v8/src/compiler/backend/arm/code-generator-arm.cc b/deps/v8/src/compiler/backend/arm/code-generator-arm.cc
index 8d8e5204b2969e..4c5accd7a8f352 100644
--- a/deps/v8/src/compiler/backend/arm/code-generator-arm.cc
+++ b/deps/v8/src/compiler/backend/arm/code-generator-arm.cc
@@ -747,7 +747,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     }
     case kArchCallJSFunction: {
       Register func = i.InputRegister(0);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         UseScratchRegisterScope temps(tasm());
         Register scratch = temps.Acquire();
         // Check the function's context matches the context argument.
@@ -938,7 +938,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       Register object = i.InputRegister(0);
       Register value = i.InputRegister(2);
 
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Checking that |value| is not a cleared weakref: our write barrier
         // does not support that for now.
         __ cmp(value, Operand(kClearedWeakHeapObjectLower32));
@@ -3588,7 +3588,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
         ReferenceMap* reference_map =
             gen_->zone()->New<ReferenceMap>(gen_->zone());
         gen_->RecordSafepoint(reference_map);
-        if (FLAG_debug_code) {
+        if (v8_flags.debug_code) {
           __ stop();
         }
       }
@@ -3743,7 +3743,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // If the frame is bigger than the stack, we throw the stack overflow
       // exception unconditionally. Thereby we can avoid the integer overflow
       // check in the condition code.
-      if (required_slots * kSystemPointerSize < FLAG_stack_size * KB) {
+      if (required_slots * kSystemPointerSize < v8_flags.stack_size * KB) {
         UseScratchRegisterScope temps(tasm());
         Register scratch = temps.Acquire();
         __ ldr(scratch, FieldMemOperand(
@@ -3760,7 +3760,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // define an empty safepoint.
       ReferenceMap* reference_map = zone()->New<ReferenceMap>(zone());
       RecordSafepoint(reference_map);
-      if (FLAG_debug_code) __ stop();
+      if (v8_flags.debug_code) __ stop();
 
       __ bind(&done);
     }
@@ -3824,7 +3824,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
   if (parameter_slots != 0) {
     if (additional_pop_count->IsImmediate()) {
       DCHECK_EQ(g.ToConstant(additional_pop_count).ToInt32(), 0);
-    } else if (FLAG_debug_code) {
+    } else if (v8_flags.debug_code) {
       __ cmp(g.ToRegister(additional_pop_count), Operand(0));
       __ Assert(eq, AbortReason::kUnexpectedAdditionalPopValue);
     }
diff --git a/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc b/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc
index 578581877e3ffc..8733aff7879641 100644
--- a/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc
+++ b/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc
@@ -700,11 +700,12 @@ void VisitStoreCommon(InstructionSelector* selector, Node* node,
   WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
   MachineRepresentation rep = store_rep.representation();
 
-  if (FLAG_enable_unconditional_write_barriers && CanBeTaggedPointer(rep)) {
+  if (v8_flags.enable_unconditional_write_barriers && CanBeTaggedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
 
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedPointer(rep));
     AddressingMode addressing_mode;
     InstructionOperand inputs[3];
diff --git a/deps/v8/src/compiler/backend/arm/unwinding-info-writer-arm.h b/deps/v8/src/compiler/backend/arm/unwinding-info-writer-arm.h
index 6b9ade0c4834cc..de81134bd14363 100644
--- a/deps/v8/src/compiler/backend/arm/unwinding-info-writer-arm.h
+++ b/deps/v8/src/compiler/backend/arm/unwinding-info-writer-arm.h
@@ -49,7 +49,7 @@ class UnwindingInfoWriter {
   }
 
  private:
-  bool enabled() const { return FLAG_perf_prof_unwinding_info; }
+  bool enabled() const { return v8_flags.perf_prof_unwinding_info; }
 
   class BlockInitialState : public ZoneObject {
    public:
diff --git a/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc b/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc
index 4a9654e8b9d96e..60d19c79307529 100644
--- a/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc
+++ b/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc
@@ -433,7 +433,7 @@ class WasmProtectedInstructionTrap final : public WasmOutOfLineTrap {
       : WasmOutOfLineTrap(gen, instr), pc_(pc) {}
 
   void Generate() override {
-    DCHECK(FLAG_wasm_bounds_checks && !FLAG_wasm_enforce_bounds_checks);
+    DCHECK(v8_flags.wasm_bounds_checks && !v8_flags.wasm_enforce_bounds_checks);
     gen_->AddProtectedInstructionLanding(pc_, __ pc_offset());
     GenerateWithTrapId(TrapId::kTrapMemOutOfBounds);
   }
@@ -767,7 +767,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     }
     case kArchCallJSFunction: {
       Register func = i.InputRegister(0);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Check the function's context matches the context argument.
         UseScratchRegisterScope scope(tasm());
         Register temp = scope.AcquireX();
@@ -961,7 +961,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       }
       Register value = i.InputRegister(2);
 
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Checking that |value| is not a cleared weakref: our write barrier
         // does not support that for now.
         __ cmp(value, Operand(kClearedWeakHeapObjectLower32));
@@ -1164,6 +1164,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     case kArm64Mul:
       __ Mul(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1));
       break;
+    case kArm64Smulh:
+      __ Smulh(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1));
+      break;
+    case kArm64Umulh:
+      __ Umulh(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1));
+      break;
     case kArm64Mul32:
       __ Mul(i.OutputRegister32(), i.InputRegister32(0), i.InputRegister32(1));
       break;
@@ -3144,7 +3150,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // If the frame is bigger than the stack, we throw the stack overflow
       // exception unconditionally. Thereby we can avoid the integer overflow
       // check in the condition code.
-      if (required_slots * kSystemPointerSize < FLAG_stack_size * KB) {
+      if (required_slots * kSystemPointerSize < v8_flags.stack_size * KB) {
         UseScratchRegisterScope scope(tasm());
         Register scratch = scope.AcquireX();
         __ Ldr(scratch, FieldMemOperand(
@@ -3170,7 +3176,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // define an empty safepoint.
       ReferenceMap* reference_map = zone()->New<ReferenceMap>(zone());
       RecordSafepoint(reference_map);
-      if (FLAG_debug_code) __ Brk(0);
+      if (v8_flags.debug_code) __ Brk(0);
       __ Bind(&done);
     }
 #endif  // V8_ENABLE_WEBASSEMBLY
@@ -3287,7 +3293,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
   if (parameter_slots != 0) {
     if (additional_pop_count->IsImmediate()) {
       DCHECK_EQ(g.ToConstant(additional_pop_count).ToInt32(), 0);
-    } else if (FLAG_debug_code) {
+    } else if (v8_flags.debug_code) {
       __ cmp(g.ToRegister(additional_pop_count), Operand(0));
       __ Assert(eq, AbortReason::kUnexpectedAdditionalPopValue);
     }
diff --git a/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h b/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h
index 2d5671927f0b66..6c4eafa1d9eff3 100644
--- a/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h
+++ b/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h
@@ -80,6 +80,7 @@ namespace compiler {
   V(Arm64Mul32)                                      \
   V(Arm64Smlal)                                      \
   V(Arm64Smlal2)                                     \
+  V(Arm64Smulh)                                      \
   V(Arm64Smull)                                      \
   V(Arm64Smull2)                                     \
   V(Arm64Uadalp)                                     \
@@ -87,6 +88,7 @@ namespace compiler {
   V(Arm64Umlal)                                      \
   V(Arm64Umlal2)                                     \
   V(Arm64Umull)                                      \
+  V(Arm64Umulh)                                      \
   V(Arm64Umull2)                                     \
   V(Arm64Madd)                                       \
   V(Arm64Madd32)                                     \
diff --git a/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc b/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc
index 909bc24c902deb..eba6cdf75eecd0 100644
--- a/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc
+++ b/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc
@@ -46,12 +46,14 @@ int InstructionScheduler::GetTargetInstructionFlags(
     case kArm64Mul32:
     case kArm64Smlal:
     case kArm64Smlal2:
+    case kArm64Smulh:
     case kArm64Smull:
     case kArm64Smull2:
     case kArm64Uadalp:
     case kArm64Uaddlp:
     case kArm64Umlal:
     case kArm64Umlal2:
+    case kArm64Umulh:
     case kArm64Umull:
     case kArm64Umull2:
     case kArm64Madd:
diff --git a/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc b/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc
index 66c39e6c9dede0..455cb180f845cd 100644
--- a/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc
+++ b/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc
@@ -872,13 +872,14 @@ void InstructionSelector::VisitStore(Node* node) {
   WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
   MachineRepresentation rep = store_rep.representation();
 
-  if (FLAG_enable_unconditional_write_barriers &&
+  if (v8_flags.enable_unconditional_write_barriers &&
       CanBeTaggedOrCompressedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
 
   // TODO(arm64): I guess this could be done in a better way.
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedOrCompressedPointer(rep));
     AddressingMode addressing_mode;
     InstructionOperand inputs[3];
@@ -1685,6 +1686,25 @@ void EmitInt32MulWithOverflow(InstructionSelector* selector, Node* node,
   selector->EmitWithContinuation(opcode, result, result, cont);
 }
 
+void EmitInt64MulWithOverflow(InstructionSelector* selector, Node* node,
+                              FlagsContinuation* cont) {
+  Arm64OperandGenerator g(selector);
+  Int64BinopMatcher m(node);
+  InstructionOperand result = g.DefineAsRegister(node);
+  InstructionOperand left = g.UseRegister(m.left().node());
+  InstructionOperand high = g.TempRegister();
+
+  InstructionOperand right = g.UseRegister(m.right().node());
+  selector->Emit(kArm64Mul, result, left, right);
+  selector->Emit(kArm64Smulh, high, left, right);
+
+  // Test whether {high} is a sign-extension of {result}.
+  InstructionCode opcode =
+      kArm64Cmp | AddressingModeField::encode(kMode_Operand2_R_ASR_I);
+  selector->EmitWithContinuation(opcode, high, result, g.TempImmediate(63),
+                                 cont);
+}
+
 }  // namespace
 
 void InstructionSelector::VisitInt32Mul(Node* node) {
@@ -1858,6 +1878,10 @@ void InstructionSelector::VisitInt32MulHigh(Node* node) {
   Emit(kArm64Asr, g.DefineAsRegister(node), smull_operand, g.TempImmediate(32));
 }
 
+void InstructionSelector::VisitInt64MulHigh(Node* node) {
+  return VisitRRR(this, kArm64Smulh, node);
+}
+
 void InstructionSelector::VisitUint32MulHigh(Node* node) {
   Arm64OperandGenerator g(this);
   InstructionOperand const smull_operand = g.TempRegister();
@@ -1866,6 +1890,10 @@ void InstructionSelector::VisitUint32MulHigh(Node* node) {
   Emit(kArm64Lsr, g.DefineAsRegister(node), smull_operand, g.TempImmediate(32));
 }
 
+void InstructionSelector::VisitUint64MulHigh(Node* node) {
+  return VisitRRR(this, kArm64Umulh, node);
+}
+
 void InstructionSelector::VisitTruncateFloat32ToInt32(Node* node) {
   Arm64OperandGenerator g(this);
 
@@ -2775,7 +2803,7 @@ void VisitAtomicStore(InstructionSelector* selector, Node* node,
   WriteBarrierKind write_barrier_kind = store_params.write_barrier_kind();
   MachineRepresentation rep = store_params.representation();
 
-  if (FLAG_enable_unconditional_write_barriers &&
+  if (v8_flags.enable_unconditional_write_barriers &&
       CanBeTaggedOrCompressedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
@@ -2785,7 +2813,8 @@ void VisitAtomicStore(InstructionSelector* selector, Node* node,
   InstructionOperand temps[] = {g.TempRegister()};
   InstructionCode code;
 
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedOrCompressedPointer(rep));
     DCHECK_EQ(AtomicWidthSize(width), kTaggedSize);
 
@@ -3018,6 +3047,14 @@ void InstructionSelector::VisitWordCompareZero(Node* user, Node* value,
                 cont->OverwriteAndNegateIfEqual(kOverflow);
                 return VisitBinop<Int64BinopMatcher>(this, node, kArm64Sub,
                                                      kArithmeticImm, cont);
+              case IrOpcode::kInt64MulWithOverflow:
+                // ARM64 doesn't set the overflow flag for multiplication, so we
+                // need to test on kNotEqual. Here is the code sequence used:
+                //   mul result, left, right
+                //   smulh high, left, right
+                //   cmp high, result, asr 63
+                cont->OverwriteAndNegateIfEqual(kNotEqual);
+                return EmitInt64MulWithOverflow(this, node, cont);
               default:
                 break;
             }
@@ -3214,6 +3251,20 @@ void InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
   VisitBinop<Int64BinopMatcher>(this, node, kArm64Sub, kArithmeticImm, &cont);
 }
 
+void InstructionSelector::VisitInt64MulWithOverflow(Node* node) {
+  if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
+    // ARM64 doesn't set the overflow flag for multiplication, so we need to
+    // test on kNotEqual. Here is the code sequence used:
+    //   mul result, left, right
+    //   smulh high, left, right
+    //   cmp high, result, asr 63
+    FlagsContinuation cont = FlagsContinuation::ForSet(kNotEqual, ovf);
+    return EmitInt64MulWithOverflow(this, node, &cont);
+  }
+  FlagsContinuation cont;
+  EmitInt64MulWithOverflow(this, node, &cont);
+}
+
 void InstructionSelector::VisitInt64LessThan(Node* node) {
   FlagsContinuation cont = FlagsContinuation::ForSet(kSignedLessThan, node);
   VisitWordCompare(this, node, kArm64Cmp, &cont, kArithmeticImm);
diff --git a/deps/v8/src/compiler/backend/arm64/unwinding-info-writer-arm64.h b/deps/v8/src/compiler/backend/arm64/unwinding-info-writer-arm64.h
index 36788735de1463..e142e13d69d920 100644
--- a/deps/v8/src/compiler/backend/arm64/unwinding-info-writer-arm64.h
+++ b/deps/v8/src/compiler/backend/arm64/unwinding-info-writer-arm64.h
@@ -49,7 +49,7 @@ class UnwindingInfoWriter {
   }
 
  private:
-  bool enabled() const { return FLAG_perf_prof_unwinding_info; }
+  bool enabled() const { return v8_flags.perf_prof_unwinding_info; }
 
   class BlockInitialState : public ZoneObject {
    public:
diff --git a/deps/v8/src/compiler/backend/code-generator.cc b/deps/v8/src/compiler/backend/code-generator.cc
index 6747d710c1474d..929fc7eb77886e 100644
--- a/deps/v8/src/compiler/backend/code-generator.cc
+++ b/deps/v8/src/compiler/backend/code-generator.cc
@@ -214,7 +214,7 @@ void CodeGenerator::AssembleCode() {
   tasm()->CodeEntry();
 
   // Check that {kJavaScriptCallCodeStartRegister} has been set correctly.
-  if (FLAG_debug_code && info->called_with_code_start_register()) {
+  if (v8_flags.debug_code && info->called_with_code_start_register()) {
     tasm()->RecordComment("-- Prologue: check code start register --");
     AssembleCodeStartRegisterCheck();
   }
@@ -274,7 +274,7 @@ void CodeGenerator::AssembleCode() {
     // Bind a label for a block.
     current_block_ = block->rpo_number();
     unwinding_info_writer_.BeginInstructionBlock(tasm()->pc_offset(), block);
-    if (FLAG_code_comments) {
+    if (v8_flags.code_comments) {
       std::ostringstream buffer;
       buffer << "-- B" << block->rpo_number().ToInt() << " start";
       if (block->IsDeferred()) buffer << " (deferred)";
@@ -306,8 +306,15 @@ void CodeGenerator::AssembleCode() {
         tasm()->InitializeRootRegister();
       }
     }
-
-    if (FLAG_enable_embedded_constant_pool && !block->needs_frame()) {
+#ifdef V8_TARGET_ARCH_RISCV64
+    // RVV uses VectorUnit to emit vset{i}vl{i}, reducing the static and dynamic
+    // overhead of the vset{i}vl{i} instruction. However there are some jumps
+    // back between blocks. the Rvv instruction may get an incorrect vtype. so
+    // here VectorUnit needs to be cleared to ensure that the vtype is correct
+    // within the block.
+    tasm()->VU.clear();
+#endif
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL && !block->needs_frame()) {
       ConstantPoolUnavailableScope constant_pool_unavailable(tasm());
       result_ = AssembleBlock(block);
     } else {
@@ -813,7 +820,7 @@ void CodeGenerator::AssembleSourcePosition(SourcePosition source_position) {
   if (!source_position.IsKnown()) return;
   source_position_table_builder_.AddPosition(tasm()->pc_offset(),
                                              source_position, false);
-  if (FLAG_code_comments) {
+  if (v8_flags.code_comments) {
     OptimizedCompilationInfo* info = this->info();
     if (!info->IsOptimizing()) {
 #if V8_ENABLE_WEBASSEMBLY
@@ -1171,6 +1178,12 @@ void CodeGenerator::AddTranslationForOperand(Instruction* instr,
       translations_.StoreUint32StackSlot(LocationOperand::cast(op)->index());
     } else if (type == MachineType::Int64()) {
       translations_.StoreInt64StackSlot(LocationOperand::cast(op)->index());
+    } else if (type == MachineType::SignedBigInt64()) {
+      translations_.StoreSignedBigInt64StackSlot(
+          LocationOperand::cast(op)->index());
+    } else if (type == MachineType::UnsignedBigInt64()) {
+      translations_.StoreUnsignedBigInt64StackSlot(
+          LocationOperand::cast(op)->index());
     } else {
 #if defined(V8_COMPRESS_POINTERS)
       CHECK(MachineRepresentation::kTagged == type.representation() ||
@@ -1199,6 +1212,10 @@ void CodeGenerator::AddTranslationForOperand(Instruction* instr,
       translations_.StoreUint32Register(converter.ToRegister(op));
     } else if (type == MachineType::Int64()) {
       translations_.StoreInt64Register(converter.ToRegister(op));
+    } else if (type == MachineType::SignedBigInt64()) {
+      translations_.StoreSignedBigInt64Register(converter.ToRegister(op));
+    } else if (type == MachineType::UnsignedBigInt64()) {
+      translations_.StoreUnsignedBigInt64Register(converter.ToRegister(op));
     } else {
 #if defined(V8_COMPRESS_POINTERS)
       CHECK(MachineRepresentation::kTagged == type.representation() ||
@@ -1229,7 +1246,7 @@ void CodeGenerator::AddTranslationForOperand(Instruction* instr,
           DCHECK_EQ(4, kSystemPointerSize);
           Smi smi(static_cast<Address>(constant.ToInt32()));
           DCHECK(smi.IsSmi());
-          literal = DeoptimizationLiteral(smi.value());
+          literal = DeoptimizationLiteral(static_cast<double>(smi.value()));
         } else if (type.representation() == MachineRepresentation::kBit) {
           if (constant.ToInt32() == 0) {
             literal =
@@ -1247,15 +1264,24 @@ void CodeGenerator::AddTranslationForOperand(Instruction* instr,
                  constant.ToInt32() == FrameStateDescriptor::kImpossibleValue);
           if (type == MachineType::Uint32()) {
             literal = DeoptimizationLiteral(
-                static_cast<uint32_t>(constant.ToInt32()));
+                static_cast<double>(static_cast<uint32_t>(constant.ToInt32())));
           } else {
-            literal = DeoptimizationLiteral(constant.ToInt32());
+            literal =
+                DeoptimizationLiteral(static_cast<double>(constant.ToInt32()));
           }
         }
         break;
       case Constant::kInt64:
         DCHECK_EQ(8, kSystemPointerSize);
-        if (type.representation() == MachineRepresentation::kWord64) {
+        if (type == MachineType::SignedBigInt64()) {
+          literal = DeoptimizationLiteral(constant.ToInt64());
+        } else if (type == MachineType::UnsignedBigInt64()) {
+          literal =
+              DeoptimizationLiteral(static_cast<uint64_t>(constant.ToInt64()));
+        } else if (type.representation() == MachineRepresentation::kWord64) {
+          CHECK_EQ(
+              constant.ToInt64(),
+              static_cast<int64_t>(static_cast<double>(constant.ToInt64())));
           literal =
               DeoptimizationLiteral(static_cast<double>(constant.ToInt64()));
         } else {
@@ -1264,7 +1290,7 @@ void CodeGenerator::AddTranslationForOperand(Instruction* instr,
           DCHECK_EQ(MachineRepresentation::kTagged, type.representation());
           Smi smi(static_cast<Address>(constant.ToInt64()));
           DCHECK(smi.IsSmi());
-          literal = DeoptimizationLiteral(smi.value());
+          literal = DeoptimizationLiteral(static_cast<double>(smi.value()));
         }
         break;
       case Constant::kFloat32:
@@ -1325,6 +1351,12 @@ Handle<Object> DeoptimizationLiteral::Reify(Isolate* isolate) const {
     case DeoptimizationLiteralKind::kNumber: {
       return isolate->factory()->NewNumber(number_);
     }
+    case DeoptimizationLiteralKind::kSignedBigInt64: {
+      return BigInt::FromInt64(isolate, signed_bigint64_);
+    }
+    case DeoptimizationLiteralKind::kUnsignedBigInt64: {
+      return BigInt::FromUint64(isolate, unsigned_bigint64_);
+    }
     case DeoptimizationLiteralKind::kInvalid: {
       UNREACHABLE();
     }
diff --git a/deps/v8/src/compiler/backend/code-generator.h b/deps/v8/src/compiler/backend/code-generator.h
index 4c7ae40fe2b301..ee36b75dae5622 100644
--- a/deps/v8/src/compiler/backend/code-generator.h
+++ b/deps/v8/src/compiler/backend/code-generator.h
@@ -55,26 +55,52 @@ class InstructionOperandIterator {
   size_t pos_;
 };
 
-enum class DeoptimizationLiteralKind { kObject, kNumber, kInvalid };
+enum class DeoptimizationLiteralKind {
+  kObject,
+  kNumber,
+  kSignedBigInt64,
+  kUnsignedBigInt64,
+  kInvalid
+};
 
-// Either a non-null Handle<Object> or a double.
+// A non-null Handle<Object>, a double, an int64_t, or a uint64_t.
 class DeoptimizationLiteral {
  public:
   DeoptimizationLiteral()
-      : kind_(DeoptimizationLiteralKind::kInvalid), object_(), number_(0) {}
+      : kind_(DeoptimizationLiteralKind::kInvalid), object_() {}
   explicit DeoptimizationLiteral(Handle<Object> object)
       : kind_(DeoptimizationLiteralKind::kObject), object_(object) {
     CHECK(!object_.is_null());
   }
   explicit DeoptimizationLiteral(double number)
       : kind_(DeoptimizationLiteralKind::kNumber), number_(number) {}
+  explicit DeoptimizationLiteral(int64_t signed_bigint64)
+      : kind_(DeoptimizationLiteralKind::kSignedBigInt64),
+        signed_bigint64_(signed_bigint64) {}
+  explicit DeoptimizationLiteral(uint64_t unsigned_bigint64)
+      : kind_(DeoptimizationLiteralKind::kUnsignedBigInt64),
+        unsigned_bigint64_(unsigned_bigint64) {}
 
   Handle<Object> object() const { return object_; }
 
   bool operator==(const DeoptimizationLiteral& other) const {
-    return kind_ == other.kind_ && object_.equals(other.object_) &&
-           base::bit_cast<uint64_t>(number_) ==
+    if (kind_ != other.kind_) {
+      return false;
+    }
+    switch (kind_) {
+      case DeoptimizationLiteralKind::kObject:
+        return object_.equals(other.object_);
+      case DeoptimizationLiteralKind::kNumber:
+        return base::bit_cast<uint64_t>(number_) ==
                base::bit_cast<uint64_t>(other.number_);
+      case DeoptimizationLiteralKind::kSignedBigInt64:
+        return signed_bigint64_ == other.signed_bigint64_;
+      case DeoptimizationLiteralKind::kUnsignedBigInt64:
+        return unsigned_bigint64_ == other.unsigned_bigint64_;
+      case DeoptimizationLiteralKind::kInvalid:
+        return true;
+    }
+    UNREACHABLE();
   }
 
   Handle<Object> Reify(Isolate* isolate) const;
@@ -91,8 +117,12 @@ class DeoptimizationLiteral {
  private:
   DeoptimizationLiteralKind kind_;
 
-  Handle<Object> object_;
-  double number_ = 0;
+  union {
+    Handle<Object> object_;
+    double number_;
+    int64_t signed_bigint64_;
+    uint64_t unsigned_bigint64_;
+  };
 };
 
 // These structs hold pc offsets for generated instructions and is only used
diff --git a/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc b/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
index 8a53c5cd21a8b1..5afd119ff506dd 100644
--- a/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
+++ b/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
@@ -767,7 +767,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     }
     case kArchCallJSFunction: {
       Register func = i.InputRegister(0);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Check the function's context matches the context argument.
         __ cmp(esi, FieldOperand(func, JSFunction::kContextOffset));
         __ Assert(equal, AbortReason::kWrongFunctionContext);
@@ -962,7 +962,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       Register scratch0 = i.TempRegister(0);
       Register scratch1 = i.TempRegister(1);
 
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Checking that |value| is not a cleared weakref: our write barrier
         // does not support that for now.
         __ cmp(value, Immediate(kClearedWeakHeapObjectLower32));
@@ -4066,7 +4066,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // If the frame is bigger than the stack, we throw the stack overflow
       // exception unconditionally. Thereby we can avoid the integer overflow
       // check in the condition code.
-      if (required_slots * kSystemPointerSize < FLAG_stack_size * KB) {
+      if (required_slots * kSystemPointerSize < v8_flags.stack_size * KB) {
         Register scratch = esi;
         __ push(scratch);
         __ mov(scratch,
@@ -4134,7 +4134,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
   if (parameter_slots != 0) {
     if (additional_pop_count->IsImmediate()) {
       DCHECK_EQ(g.ToConstant(additional_pop_count).ToInt32(), 0);
-    } else if (FLAG_debug_code) {
+    } else if (v8_flags.debug_code) {
       __ cmp(g.ToRegister(additional_pop_count), Immediate(0));
       __ Assert(equal, AbortReason::kUnexpectedAdditionalPopValue);
     }
diff --git a/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc b/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
index 84904062cfb5e5..bea1475584d226 100644
--- a/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
+++ b/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
@@ -695,11 +695,12 @@ void VisitStoreCommon(InstructionSelector* selector, Node* node,
   const bool is_seqcst =
       atomic_order && *atomic_order == AtomicMemoryOrder::kSeqCst;
 
-  if (FLAG_enable_unconditional_write_barriers && CanBeTaggedPointer(rep)) {
+  if (v8_flags.enable_unconditional_write_barriers && CanBeTaggedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
 
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedPointer(rep));
     AddressingMode addressing_mode;
     InstructionOperand inputs[] = {
diff --git a/deps/v8/src/compiler/backend/instruction-scheduler.cc b/deps/v8/src/compiler/backend/instruction-scheduler.cc
index 3d0be78262e68a..af339c15585796 100644
--- a/deps/v8/src/compiler/backend/instruction-scheduler.cc
+++ b/deps/v8/src/compiler/backend/instruction-scheduler.cc
@@ -82,9 +82,9 @@ InstructionScheduler::InstructionScheduler(Zone* zone,
       last_live_in_reg_marker_(nullptr),
       last_deopt_or_trap_(nullptr),
       operands_map_(zone) {
-  if (FLAG_turbo_stress_instruction_scheduling) {
+  if (v8_flags.turbo_stress_instruction_scheduling) {
     random_number_generator_ =
-        base::Optional<base::RandomNumberGenerator>(FLAG_random_seed);
+        base::Optional<base::RandomNumberGenerator>(v8_flags.random_seed);
   }
 }
 
@@ -99,7 +99,7 @@ void InstructionScheduler::StartBlock(RpoNumber rpo) {
 }
 
 void InstructionScheduler::EndBlock(RpoNumber rpo) {
-  if (FLAG_turbo_stress_instruction_scheduling) {
+  if (v8_flags.turbo_stress_instruction_scheduling) {
     Schedule<StressSchedulerQueue>();
   } else {
     Schedule<CriticalPathFirstQueue>();
@@ -119,7 +119,7 @@ void InstructionScheduler::AddTerminator(Instruction* instr) {
 
 void InstructionScheduler::AddInstruction(Instruction* instr) {
   if (IsBarrier(instr)) {
-    if (FLAG_turbo_stress_instruction_scheduling) {
+    if (v8_flags.turbo_stress_instruction_scheduling) {
       Schedule<StressSchedulerQueue>();
     } else {
       Schedule<CriticalPathFirstQueue>();
diff --git a/deps/v8/src/compiler/backend/instruction-selector.cc b/deps/v8/src/compiler/backend/instruction-selector.cc
index 2ef46c02ebb4b4..a098254c7e5a32 100644
--- a/deps/v8/src/compiler/backend/instruction-selector.cc
+++ b/deps/v8/src/compiler/backend/instruction-selector.cc
@@ -14,12 +14,9 @@
 #include "src/compiler/backend/instruction-selector-impl.h"
 #include "src/compiler/compiler-source-position-table.h"
 #include "src/compiler/js-heap-broker.h"
-#include "src/compiler/node-matchers.h"
 #include "src/compiler/node-properties.h"
-#include "src/compiler/pipeline.h"
 #include "src/compiler/schedule.h"
 #include "src/compiler/state-values-utils.h"
-#include "src/deoptimizer/deoptimizer.h"
 
 #if V8_ENABLE_WEBASSEMBLY
 #include "src/wasm/simd-shuffle.h"
@@ -1566,6 +1563,8 @@ void InstructionSelector::VisitNode(Node* node) {
       return MarkAsWord32(node), VisitInt32MulWithOverflow(node);
     case IrOpcode::kInt32MulHigh:
       return VisitInt32MulHigh(node);
+    case IrOpcode::kInt64MulHigh:
+      return VisitInt64MulHigh(node);
     case IrOpcode::kInt32Div:
       return MarkAsWord32(node), VisitInt32Div(node);
     case IrOpcode::kInt32Mod:
@@ -1584,6 +1583,8 @@ void InstructionSelector::VisitNode(Node* node) {
       return MarkAsWord32(node), VisitUint32Mod(node);
     case IrOpcode::kUint32MulHigh:
       return VisitUint32MulHigh(node);
+    case IrOpcode::kUint64MulHigh:
+      return VisitUint64MulHigh(node);
     case IrOpcode::kInt64Add:
       return MarkAsWord64(node), VisitInt64Add(node);
     case IrOpcode::kInt64AddWithOverflow:
@@ -1594,6 +1595,8 @@ void InstructionSelector::VisitNode(Node* node) {
       return MarkAsWord64(node), VisitInt64SubWithOverflow(node);
     case IrOpcode::kInt64Mul:
       return MarkAsWord64(node), VisitInt64Mul(node);
+    case IrOpcode::kInt64MulWithOverflow:
+      return MarkAsWord64(node), VisitInt64MulWithOverflow(node);
     case IrOpcode::kInt64Div:
       return MarkAsWord64(node), VisitInt64Div(node);
     case IrOpcode::kInt64Mod:
@@ -2570,6 +2573,14 @@ void InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
 
 void InstructionSelector::VisitInt64Mul(Node* node) { UNIMPLEMENTED(); }
 
+void InstructionSelector::VisitInt64MulHigh(Node* node) { UNIMPLEMENTED(); }
+
+void InstructionSelector::VisitUint64MulHigh(Node* node) { UNIMPLEMENTED(); }
+
+void InstructionSelector::VisitInt64MulWithOverflow(Node* node) {
+  UNIMPLEMENTED();
+}
+
 void InstructionSelector::VisitInt64Div(Node* node) { UNIMPLEMENTED(); }
 
 void InstructionSelector::VisitInt64LessThan(Node* node) { UNIMPLEMENTED(); }
@@ -2887,6 +2898,7 @@ void InstructionSelector::VisitProjection(Node* node) {
     case IrOpcode::kInt32MulWithOverflow:
     case IrOpcode::kInt64AddWithOverflow:
     case IrOpcode::kInt64SubWithOverflow:
+    case IrOpcode::kInt64MulWithOverflow:
     case IrOpcode::kTryTruncateFloat32ToInt64:
     case IrOpcode::kTryTruncateFloat64ToInt64:
     case IrOpcode::kTryTruncateFloat32ToUint64:
@@ -3137,14 +3149,12 @@ void InstructionSelector::VisitSelect(Node* node) {
 }
 
 void InstructionSelector::VisitTrapIf(Node* node, TrapId trap_id) {
-  FlagsContinuation cont =
-      FlagsContinuation::ForTrap(kNotEqual, trap_id, node->InputAt(1));
+  FlagsContinuation cont = FlagsContinuation::ForTrap(kNotEqual, trap_id);
   VisitWordCompareZero(node, node->InputAt(0), &cont);
 }
 
 void InstructionSelector::VisitTrapUnless(Node* node, TrapId trap_id) {
-  FlagsContinuation cont =
-      FlagsContinuation::ForTrap(kEqual, trap_id, node->InputAt(1));
+  FlagsContinuation cont = FlagsContinuation::ForTrap(kEqual, trap_id);
   VisitWordCompareZero(node, node->InputAt(0), &cont);
 }
 
diff --git a/deps/v8/src/compiler/backend/instruction-selector.h b/deps/v8/src/compiler/backend/instruction-selector.h
index 686ba68519739e..7cd22ee492ed97 100644
--- a/deps/v8/src/compiler/backend/instruction-selector.h
+++ b/deps/v8/src/compiler/backend/instruction-selector.h
@@ -8,7 +8,6 @@
 #include <map>
 
 #include "src/codegen/cpu-features.h"
-#include "src/common/globals.h"
 #include "src/compiler/backend/instruction-scheduler.h"
 #include "src/compiler/backend/instruction.h"
 #include "src/compiler/common-operator.h"
@@ -78,9 +77,8 @@ class FlagsContinuation final {
   }
 
   // Creates a new flags continuation for a wasm trap.
-  static FlagsContinuation ForTrap(FlagsCondition condition, TrapId trap_id,
-                                   Node* result) {
-    return FlagsContinuation(condition, trap_id, result);
+  static FlagsContinuation ForTrap(FlagsCondition condition, TrapId trap_id) {
+    return FlagsContinuation(condition, trap_id);
   }
 
   static FlagsContinuation ForSelect(FlagsCondition condition, Node* result,
@@ -218,13 +216,8 @@ class FlagsContinuation final {
     DCHECK_NOT_NULL(result);
   }
 
-  FlagsContinuation(FlagsCondition condition, TrapId trap_id, Node* result)
-      : mode_(kFlags_trap),
-        condition_(condition),
-        frame_state_or_result_(result),
-        trap_id_(trap_id) {
-    DCHECK_NOT_NULL(result);
-  }
+  FlagsContinuation(FlagsCondition condition, TrapId trap_id)
+      : mode_(kFlags_trap), condition_(condition), trap_id_(trap_id) {}
 
   FlagsContinuation(FlagsCondition condition, Node* result, Node* true_value,
                     Node* false_value)
@@ -292,7 +285,7 @@ class V8_EXPORT_PRIVATE InstructionSelector final {
       size_t* max_pushed_argument_count,
       SourcePositionMode source_position_mode = kCallSourcePositions,
       Features features = SupportedFeatures(),
-      EnableScheduling enable_scheduling = FLAG_turbo_instruction_scheduling
+      EnableScheduling enable_scheduling = v8_flags.turbo_instruction_scheduling
                                                ? kEnableScheduling
                                                : kDisableScheduling,
       EnableRootsRelativeAddressing enable_roots_relative_addressing =
diff --git a/deps/v8/src/compiler/backend/instruction.cc b/deps/v8/src/compiler/backend/instruction.cc
index 5477c9fb868963..0ec677294747ce 100644
--- a/deps/v8/src/compiler/backend/instruction.cc
+++ b/deps/v8/src/compiler/backend/instruction.cc
@@ -325,6 +325,20 @@ void ParallelMove::PrepareInsertAfter(
   if (replacement != nullptr) move->set_source(replacement->source());
 }
 
+bool ParallelMove::Equals(const ParallelMove& that) const {
+  if (this->size() != that.size()) return false;
+  for (size_t i = 0; i < this->size(); ++i) {
+    if (!(*this)[i]->Equals(*that[i])) return false;
+  }
+  return true;
+}
+
+void ParallelMove::Eliminate() {
+  for (MoveOperands* move : *this) {
+    move->Eliminate();
+  }
+}
+
 Instruction::Instruction(InstructionCode opcode)
     : opcode_(opcode),
       bit_field_(OutputCountField::encode(0) | InputCountField::encode(0) |
@@ -803,7 +817,7 @@ void InstructionSequence::ComputeAssemblyOrder() {
     if (block->ao_number() != invalid) continue;  // loop rotated.
     if (block->IsLoopHeader()) {
       bool header_align = true;
-      if (FLAG_turbo_loop_rotation) {
+      if (v8_flags.turbo_loop_rotation) {
         // Perform loop rotation for non-deferred loops.
         InstructionBlock* loop_end =
             instruction_blocks_->at(block->loop_end().ToSize() - 1);
diff --git a/deps/v8/src/compiler/backend/instruction.h b/deps/v8/src/compiler/backend/instruction.h
index aac7ac12c855d3..e9f0f9514bd1f5 100644
--- a/deps/v8/src/compiler/backend/instruction.h
+++ b/deps/v8/src/compiler/backend/instruction.h
@@ -775,6 +775,12 @@ class V8_EXPORT_PRIVATE MoveOperands final
   // APIs to aid debugging. For general-stream APIs, use operator<<.
   void Print() const;
 
+  bool Equals(const MoveOperands& that) const {
+    if (IsRedundant() && that.IsRedundant()) return true;
+    return source_.Equals(that.source_) &&
+           destination_.Equals(that.destination_);
+  }
+
  private:
   InstructionOperand source_;
   InstructionOperand destination_;
@@ -813,6 +819,11 @@ class V8_EXPORT_PRIVATE ParallelMove final
   // to_eliminate must be Eliminated.
   void PrepareInsertAfter(MoveOperands* move,
                           ZoneVector<MoveOperands*>* to_eliminate) const;
+
+  bool Equals(const ParallelMove& that) const;
+
+  // Eliminate all the MoveOperands in this ParallelMove.
+  void Eliminate();
 };
 
 std::ostream& operator<<(std::ostream&, const ParallelMove&);
diff --git a/deps/v8/src/compiler/backend/jump-threading.cc b/deps/v8/src/compiler/backend/jump-threading.cc
index f056cdc9451d66..9984c3e2b30740 100644
--- a/deps/v8/src/compiler/backend/jump-threading.cc
+++ b/deps/v8/src/compiler/backend/jump-threading.cc
@@ -9,9 +9,9 @@ namespace v8 {
 namespace internal {
 namespace compiler {
 
-#define TRACE(...)                                \
-  do {                                            \
-    if (FLAG_trace_turbo_jt) PrintF(__VA_ARGS__); \
+#define TRACE(...)                                    \
+  do {                                                \
+    if (v8_flags.trace_turbo_jt) PrintF(__VA_ARGS__); \
   } while (false)
 
 namespace {
@@ -55,6 +55,72 @@ struct JumpThreadingState {
   RpoNumber onstack() { return RpoNumber::FromInt(-2); }
 };
 
+struct GapJumpRecord {
+  GapJumpRecord(Zone* zone) : zone_(zone), gap_jump_records_(zone) {}
+
+  struct Record {
+    RpoNumber block;
+    Instruction* instr;
+  };
+
+  struct RpoNumberHash {
+    std::size_t operator()(const RpoNumber& key) const {
+      return std::hash<int>()(key.ToInt());
+    }
+  };
+
+  bool CanForwardGapJump(Instruction* instr, RpoNumber instr_block,
+                         RpoNumber target_block, RpoNumber* forward_to) {
+    DCHECK_EQ(instr->arch_opcode(), kArchJmp);
+    bool can_forward = false;
+    auto search = gap_jump_records_.find(target_block);
+    if (search != gap_jump_records_.end()) {
+      for (Record& record : search->second) {
+        Instruction* record_instr = record.instr;
+        DCHECK_EQ(record_instr->arch_opcode(), kArchJmp);
+        bool is_same_instr = true;
+        for (int i = Instruction::FIRST_GAP_POSITION;
+             i <= Instruction::LAST_GAP_POSITION; i++) {
+          Instruction::GapPosition pos =
+              static_cast<Instruction::GapPosition>(i);
+          ParallelMove* record_move = record_instr->GetParallelMove(pos);
+          ParallelMove* instr_move = instr->GetParallelMove(pos);
+          if (record_move == nullptr && instr_move == nullptr) continue;
+          if (((record_move == nullptr) != (instr_move == nullptr)) ||
+              !record_move->Equals(*instr_move)) {
+            is_same_instr = false;
+            break;
+          }
+        }
+        if (is_same_instr) {
+          // Found an instruction same as the recorded one.
+          *forward_to = record.block;
+          can_forward = true;
+          break;
+        }
+      }
+      if (!can_forward) {
+        // No recorded instruction has been found for this target block,
+        // so create a new record with the given instruction.
+        search->second.push_back({instr_block, instr});
+      }
+    } else {
+      // This is the first explored gap jump to target block.
+      auto ins =
+          gap_jump_records_.insert({target_block, ZoneVector<Record>(zone_)});
+      if (ins.second) {
+        ins.first->second.reserve(4);
+        ins.first->second.push_back({instr_block, instr});
+      }
+    }
+    return can_forward;
+  }
+
+  Zone* zone_;
+  ZoneUnorderedMap<RpoNumber, ZoneVector<Record>, RpoNumberHash>
+      gap_jump_records_;
+};
+
 }  // namespace
 
 bool JumpThreading::ComputeForwarding(Zone* local_zone,
@@ -68,6 +134,7 @@ bool JumpThreading::ComputeForwarding(Zone* local_zone,
   int32_t empty_deconstruct_frame_return_size;
   RpoNumber empty_no_deconstruct_frame_return_block = RpoNumber::Invalid();
   int32_t empty_no_deconstruct_frame_return_size;
+  GapJumpRecord record(local_zone);
 
   // Iterate over the blocks forward, pushing the blocks onto the stack.
   for (auto const instruction_block : code->instruction_blocks()) {
@@ -85,8 +152,24 @@ bool JumpThreading::ComputeForwarding(Zone* local_zone,
       for (int i = block->code_start(); i < block->code_end(); ++i) {
         Instruction* instr = code->InstructionAt(i);
         if (!instr->AreMovesRedundant()) {
-          // can't skip instructions with non redundant moves.
-          TRACE("  parallel move\n");
+          TRACE("  parallel move");
+          // can't skip instructions with non redundant moves, except when we
+          // can forward to a block with identical gap-moves.
+          if (instr->arch_opcode() == kArchJmp) {
+            TRACE(" jmp");
+            RpoNumber forward_to;
+            if ((frame_at_start || !(block->must_deconstruct_frame() ||
+                                     block->must_construct_frame())) &&
+                record.CanForwardGapJump(instr, block->rpo_number(),
+                                         code->InputRpo(instr, 0),
+                                         &forward_to)) {
+              DCHECK(forward_to.IsValid());
+              fw = forward_to;
+              TRACE("\n  merge B%d into B%d", block->rpo_number().ToInt(),
+                    forward_to.ToInt());
+            }
+          }
+          TRACE("\n");
           fallthru = false;
         } else if (FlagsModeField::decode(instr->opcode()) != kFlags_none) {
           // can't skip instructions with flags continuations.
@@ -166,7 +249,7 @@ bool JumpThreading::ComputeForwarding(Zone* local_zone,
   }
 #endif
 
-  if (FLAG_trace_turbo_jt) {
+  if (v8_flags.trace_turbo_jt) {
     for (int i = 0; i < static_cast<int>(result->size()); i++) {
       TRACE("B%d ", i);
       int to = (*result)[i].ToInt();
@@ -184,7 +267,7 @@ bool JumpThreading::ComputeForwarding(Zone* local_zone,
 void JumpThreading::ApplyForwarding(Zone* local_zone,
                                     ZoneVector<RpoNumber> const& result,
                                     InstructionSequence* code) {
-  if (!FLAG_turbo_jt) return;
+  if (!v8_flags.turbo_jt) return;
 
   ZoneVector<bool> skip(static_cast<int>(result.size()), false, local_zone);
 
@@ -217,6 +300,16 @@ void JumpThreading::ApplyForwarding(Zone* local_zone,
           // Overwrite a redundant jump with a nop.
           TRACE("jt-fw nop @%d\n", i);
           instr->OverwriteWithNop();
+          // Eliminate all the ParallelMoves.
+          for (int i = Instruction::FIRST_GAP_POSITION;
+               i <= Instruction::LAST_GAP_POSITION; i++) {
+            Instruction::GapPosition pos =
+                static_cast<Instruction::GapPosition>(i);
+            ParallelMove* instr_move = instr->GetParallelMove(pos);
+            if (instr_move != nullptr) {
+              instr_move->Eliminate();
+            }
+          }
           // If this block was marked as a handler, it can be unmarked now.
           code->InstructionBlockAt(block_rpo)->UnmarkHandler();
         }
diff --git a/deps/v8/src/compiler/backend/loong64/code-generator-loong64.cc b/deps/v8/src/compiler/backend/loong64/code-generator-loong64.cc
index 5e54abd3963f7f..74b25770d4850c 100644
--- a/deps/v8/src/compiler/backend/loong64/code-generator-loong64.cc
+++ b/deps/v8/src/compiler/backend/loong64/code-generator-loong64.cc
@@ -627,7 +627,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     }
     case kArchCallJSFunction: {
       Register func = i.InputRegister(0);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         UseScratchRegisterScope temps(tasm());
         Register scratch = temps.Acquire();
         // Check the function's context matches the context argument.
@@ -692,7 +692,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       int offset = __ root_array_available() ? 36 : 80;  // 9 or 20 instrs
 #endif  // V8_ENABLE_WEBASSEMBLY
 #if V8_HOST_ARCH_LOONG64
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         offset += 12;  // see CallCFunction
       }
 #endif
@@ -849,7 +849,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
           frame_access_state()->GetFrameOffset(i.InputInt32(0));
       Register base_reg = offset.from_stack_pointer() ? sp : fp;
       __ Add_d(i.OutputRegister(), base_reg, Operand(offset.offset()));
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Verify that the output_register is properly aligned
         __ And(scratch, i.OutputRegister(), Operand(kSystemPointerSize - 1));
         __ Assert(eq, AbortReason::kAllocationIsNotDoubleAligned, scratch,
@@ -947,6 +947,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       __ MulOverflow_w(i.OutputRegister(), i.InputRegister(0),
                        i.InputOperand(1), t8);
       break;
+    case kLoong64MulOvf_d:
+      __ MulOverflow_d(i.OutputRegister(), i.InputRegister(0),
+                       i.InputOperand(1), t8);
+      break;
     case kLoong64Mulh_w:
       __ Mulh_w(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1));
       break;
@@ -956,6 +960,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     case kLoong64Mulh_d:
       __ Mulh_d(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1));
       break;
+    case kLoong64Mulh_du:
+      __ Mulh_du(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1));
+      break;
     case kLoong64Div_w:
       __ Div_w(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1));
       __ maskeqz(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1));
@@ -1895,7 +1902,8 @@ void AssembleBranchToLabels(CodeGenerator* gen, TurboAssembler* tasm,
       default:
         UNSUPPORTED_COND(instr->arch_opcode(), condition);
     }
-  } else if (instr->arch_opcode() == kLoong64MulOvf_w) {
+  } else if (instr->arch_opcode() == kLoong64MulOvf_w ||
+             instr->arch_opcode() == kLoong64MulOvf_d) {
     // Overflow occurs if overflow register is not zero
     switch (condition) {
       case kOverflow:
@@ -1905,7 +1913,7 @@ void AssembleBranchToLabels(CodeGenerator* gen, TurboAssembler* tasm,
         __ Branch(tlabel, eq, t8, Operand(zero_reg));
         break;
       default:
-        UNSUPPORTED_COND(kLoong64MulOvf_w, condition);
+        UNSUPPORTED_COND(instr->arch_opcode(), condition);
     }
   } else if (instr->arch_opcode() == kLoong64Cmp) {
     Condition cc = FlagsConditionToConditionCmp(condition);
@@ -1996,7 +2004,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
         ReferenceMap* reference_map =
             gen_->zone()->New<ReferenceMap>(gen_->zone());
         gen_->RecordSafepoint(reference_map);
-        if (FLAG_debug_code) {
+        if (v8_flags.debug_code) {
           __ stop();
         }
       }
@@ -2047,7 +2055,8 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
              instr->arch_opcode() == kLoong64SubOvf_d) {
     // Overflow occurs if overflow register is negative
     __ slt(result, t8, zero_reg);
-  } else if (instr->arch_opcode() == kLoong64MulOvf_w) {
+  } else if (instr->arch_opcode() == kLoong64MulOvf_w ||
+             instr->arch_opcode() == kLoong64MulOvf_d) {
     // Overflow occurs if overflow register is not zero
     __ Sgtu(result, t8, zero_reg);
   } else if (instr->arch_opcode() == kLoong64Cmp) {
@@ -2275,7 +2284,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // If the frame is bigger than the stack, we throw the stack overflow
       // exception unconditionally. Thereby we can avoid the integer overflow
       // check in the condition code.
-      if (required_slots * kSystemPointerSize < FLAG_stack_size * KB) {
+      if (required_slots * kSystemPointerSize < v8_flags.stack_size * KB) {
         UseScratchRegisterScope temps(tasm());
         Register scratch = temps.Acquire();
         __ Ld_d(scratch, FieldMemOperand(
@@ -2292,7 +2301,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // define an empty safepoint.
       ReferenceMap* reference_map = zone()->New<ReferenceMap>(zone());
       RecordSafepoint(reference_map);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         __ stop();
       }
 
@@ -2358,7 +2367,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
   if (parameter_slots != 0) {
     if (additional_pop_count->IsImmediate()) {
       DCHECK_EQ(g.ToConstant(additional_pop_count).ToInt32(), 0);
-    } else if (FLAG_debug_code) {
+    } else if (v8_flags.debug_code) {
       __ Assert(eq, AbortReason::kUnexpectedAdditionalPopValue,
                 g.ToRegister(additional_pop_count),
                 Operand(static_cast<int64_t>(0)));
diff --git a/deps/v8/src/compiler/backend/loong64/instruction-codes-loong64.h b/deps/v8/src/compiler/backend/loong64/instruction-codes-loong64.h
index dd7b9cebfeaeaf..5ad8096509a097 100644
--- a/deps/v8/src/compiler/backend/loong64/instruction-codes-loong64.h
+++ b/deps/v8/src/compiler/backend/loong64/instruction-codes-loong64.h
@@ -21,8 +21,10 @@ namespace compiler {
   V(Loong64SubOvf_d)                    \
   V(Loong64Mul_d)                       \
   V(Loong64MulOvf_w)                    \
+  V(Loong64MulOvf_d)                    \
   V(Loong64Mulh_d)                      \
   V(Loong64Mulh_w)                      \
+  V(Loong64Mulh_du)                     \
   V(Loong64Mulh_wu)                     \
   V(Loong64Mul_w)                       \
   V(Loong64Div_d)                       \
diff --git a/deps/v8/src/compiler/backend/loong64/instruction-selector-loong64.cc b/deps/v8/src/compiler/backend/loong64/instruction-selector-loong64.cc
index 2498cdcb072cd0..091c7ad9bc9b82 100644
--- a/deps/v8/src/compiler/backend/loong64/instruction-selector-loong64.cc
+++ b/deps/v8/src/compiler/backend/loong64/instruction-selector-loong64.cc
@@ -492,12 +492,13 @@ void InstructionSelector::VisitStore(Node* node) {
   WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
   MachineRepresentation rep = store_rep.representation();
 
-  if (FLAG_enable_unconditional_write_barriers && CanBeTaggedPointer(rep)) {
+  if (v8_flags.enable_unconditional_write_barriers && CanBeTaggedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
 
   // TODO(loong64): I guess this could be done in a better way.
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedPointer(rep));
     AddressingMode addressing_mode;
     InstructionOperand inputs[3];
@@ -1079,10 +1080,18 @@ void InstructionSelector::VisitInt32MulHigh(Node* node) {
   VisitRRR(this, kLoong64Mulh_w, node);
 }
 
+void InstructionSelector::VisitInt64MulHigh(Node* node) {
+  VisitRRR(this, kLoong64Mulh_d, node);
+}
+
 void InstructionSelector::VisitUint32MulHigh(Node* node) {
   VisitRRR(this, kLoong64Mulh_wu, node);
 }
 
+void InstructionSelector::VisitUint64MulHigh(Node* node) {
+  VisitRRR(this, kLoong64Mulh_du, node);
+}
+
 void InstructionSelector::VisitInt64Mul(Node* node) {
   Loong64OperandGenerator g(this);
   Int64BinopMatcher m(node);
@@ -2021,14 +2030,15 @@ void VisitAtomicStore(InstructionSelector* selector, Node* node,
   WriteBarrierKind write_barrier_kind = store_params.write_barrier_kind();
   MachineRepresentation rep = store_params.representation();
 
-  if (FLAG_enable_unconditional_write_barriers &&
+  if (v8_flags.enable_unconditional_write_barriers &&
       CanBeTaggedOrCompressedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
 
   InstructionCode code;
 
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedPointer(rep));
     DCHECK_EQ(kTaggedSize, 8);
 
@@ -2280,6 +2290,9 @@ void InstructionSelector::VisitWordCompareZero(Node* user, Node* value,
               case IrOpcode::kInt32MulWithOverflow:
                 cont->OverwriteAndNegateIfEqual(kOverflow);
                 return VisitBinop(this, node, kLoong64MulOvf_w, cont);
+              case IrOpcode::kInt64MulWithOverflow:
+                cont->OverwriteAndNegateIfEqual(kOverflow);
+                return VisitBinop(this, node, kLoong64MulOvf_d, cont);
               case IrOpcode::kInt64AddWithOverflow:
                 cont->OverwriteAndNegateIfEqual(kOverflow);
                 return VisitBinop(this, node, kLoong64AddOvf_d, cont);
@@ -2397,6 +2410,15 @@ void InstructionSelector::VisitInt32MulWithOverflow(Node* node) {
   VisitBinop(this, node, kLoong64MulOvf_w, &cont);
 }
 
+void InstructionSelector::VisitInt64MulWithOverflow(Node* node) {
+  if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
+    FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
+    return VisitBinop(this, node, kLoong64MulOvf_d, &cont);
+  }
+  FlagsContinuation cont;
+  VisitBinop(this, node, kLoong64MulOvf_d, &cont);
+}
+
 void InstructionSelector::VisitInt64AddWithOverflow(Node* node) {
   if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
     FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
diff --git a/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc b/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc
index 00f2cb709b6f4d..a31e8230cfdb92 100644
--- a/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc
+++ b/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc
@@ -646,7 +646,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     }
     case kArchCallJSFunction: {
       Register func = i.InputRegister(0);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Check the function's context matches the context argument.
         __ Ld(kScratchReg, FieldMemOperand(func, JSFunction::kContextOffset));
         __ Assert(eq, AbortReason::kWrongFunctionContext, cp,
@@ -708,7 +708,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       int offset = __ root_array_available() ? 64 : 112;
 #endif  // V8_ENABLE_WEBASSEMBLY
 #if V8_HOST_ARCH_MIPS64
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         offset += 16;
       }
 #endif
@@ -857,7 +857,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
           frame_access_state()->GetFrameOffset(i.InputInt32(0));
       Register base_reg = offset.from_stack_pointer() ? sp : fp;
       __ Daddu(i.OutputRegister(), base_reg, Operand(offset.offset()));
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Verify that the output_register is properly aligned
         __ And(kScratchReg, i.OutputRegister(),
                Operand(kSystemPointerSize - 1));
@@ -956,6 +956,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       __ MulOverflow(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1),
                      kScratchReg);
       break;
+    case kMips64DMulOvf:
+      __ DMulOverflow(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1),
+                      kScratchReg);
+      break;
     case kMips64MulHigh:
       __ Mulh(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1));
       break;
@@ -965,6 +969,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     case kMips64DMulHigh:
       __ Dmulh(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1));
       break;
+    case kMips64DMulHighU:
+      __ Dmulhu(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1));
+      break;
     case kMips64Div:
       __ Div(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1));
       if (kArchVariant == kMips64r6) {
@@ -3426,7 +3433,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       if (src0 == src1) {
         // Unary S32x4 shuffles are handled with shf.w instruction
         unsigned lane = shuffle & 0xFF;
-        if (FLAG_debug_code) {
+        if (v8_flags.debug_code) {
           // range of all four lanes, for unary instruction,
           // should belong to the same range, which can be one of these:
           // [0, 3] or [4, 7]
@@ -3825,7 +3832,8 @@ void AssembleBranchToLabels(CodeGenerator* gen, TurboAssembler* tasm,
       default:
         UNSUPPORTED_COND(instr->arch_opcode(), condition);
     }
-  } else if (instr->arch_opcode() == kMips64MulOvf) {
+  } else if (instr->arch_opcode() == kMips64MulOvf ||
+             instr->arch_opcode() == kMips64DMulOvf) {
     // Overflow occurs if overflow register is not zero
     switch (condition) {
       case kOverflow:
@@ -3835,7 +3843,7 @@ void AssembleBranchToLabels(CodeGenerator* gen, TurboAssembler* tasm,
         __ Branch(tlabel, eq, kScratchReg, Operand(zero_reg));
         break;
       default:
-        UNSUPPORTED_COND(kMipsMulOvf, condition);
+        UNSUPPORTED_COND(instr->arch_opcode(), condition);
     }
   } else if (instr->arch_opcode() == kMips64Cmp) {
     Condition cc = FlagsConditionToConditionCmp(condition);
@@ -3926,7 +3934,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
         ReferenceMap* reference_map =
             gen_->zone()->New<ReferenceMap>(gen_->zone());
         gen_->RecordSafepoint(reference_map);
-        if (FLAG_debug_code) {
+        if (v8_flags.debug_code) {
           __ stop();
         }
       }
@@ -3975,7 +3983,8 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
              instr->arch_opcode() == kMips64DsubOvf) {
     // Overflow occurs if overflow register is negative
     __ slt(result, kScratchReg, zero_reg);
-  } else if (instr->arch_opcode() == kMips64MulOvf) {
+  } else if (instr->arch_opcode() == kMips64MulOvf ||
+             instr->arch_opcode() == kMips64MulOvf) {
     // Overflow occurs if overflow register is not zero
     __ Sgtu(result, kScratchReg, zero_reg);
   } else if (instr->arch_opcode() == kMips64Cmp) {
@@ -4222,7 +4231,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // If the frame is bigger than the stack, we throw the stack overflow
       // exception unconditionally. Thereby we can avoid the integer overflow
       // check in the condition code.
-      if (required_slots * kSystemPointerSize < FLAG_stack_size * KB) {
+      if (required_slots * kSystemPointerSize < v8_flags.stack_size * KB) {
         __ Ld(
              kScratchReg,
              FieldMemOperand(kWasmInstanceRegister,
@@ -4238,7 +4247,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // define an empty safepoint.
       ReferenceMap* reference_map = zone()->New<ReferenceMap>(zone());
       RecordSafepoint(reference_map);
-      if (FLAG_debug_code) __ stop();
+      if (v8_flags.debug_code) __ stop();
 
       __ bind(&done);
     }
@@ -4302,7 +4311,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
   if (parameter_slots != 0) {
     if (additional_pop_count->IsImmediate()) {
       DCHECK_EQ(g.ToConstant(additional_pop_count).ToInt32(), 0);
-    } else if (FLAG_debug_code) {
+    } else if (v8_flags.debug_code) {
       __ Assert(eq, AbortReason::kUnexpectedAdditionalPopValue,
                 g.ToRegister(additional_pop_count),
                 Operand(static_cast<int64_t>(0)));
diff --git a/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h b/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h
index 5e05046feba7b8..6b6181de595746 100644
--- a/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h
+++ b/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h
@@ -21,9 +21,11 @@ namespace compiler {
   V(Mips64DsubOvf)                    \
   V(Mips64Mul)                        \
   V(Mips64MulOvf)                     \
+  V(Mips64DMulOvf)                    \
   V(Mips64MulHigh)                    \
   V(Mips64DMulHigh)                   \
   V(Mips64MulHighU)                   \
+  V(Mips64DMulHighU)                  \
   V(Mips64Dmul)                       \
   V(Mips64Div)                        \
   V(Mips64Ddiv)                       \
diff --git a/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc b/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc
index 597bb175701358..1d17d4bd58dd5d 100644
--- a/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc
+++ b/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc
@@ -44,6 +44,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
     case kMips64CvtSUw:
     case kMips64CvtSW:
     case kMips64DMulHigh:
+    case kMips64DMulHighU:
+    case kMips64DMulOvf:
     case kMips64MulHighU:
     case kMips64Dadd:
     case kMips64DaddOvf:
@@ -1274,7 +1276,7 @@ int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
       return JumpLatency();
     case kArchCallJSFunction: {
       int latency = 0;
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         latency = 1 + AssertLatency();
       }
       return latency + 1 + DadduLatency(false) + CallLatency();
@@ -1360,6 +1362,7 @@ int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
     case kMips64Mul:
       return MulLatency();
     case kMips64MulOvf:
+    case kMips64DMulOvf:
       return MulOverflowLatency();
     case kMips64MulHigh:
       return MulhLatency();
diff --git a/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc b/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
index fc6972fa99a4f3..8b4398eecbba0a 100644
--- a/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
+++ b/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
@@ -528,12 +528,13 @@ void InstructionSelector::VisitStore(Node* node) {
   WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
   MachineRepresentation rep = store_rep.representation();
 
-  if (FLAG_enable_unconditional_write_barriers && CanBeTaggedPointer(rep)) {
+  if (v8_flags.enable_unconditional_write_barriers && CanBeTaggedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
 
   // TODO(mips): I guess this could be done in a better way.
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedPointer(rep));
     InstructionOperand inputs[3];
     size_t input_count = 0;
@@ -1119,10 +1120,18 @@ void InstructionSelector::VisitInt32MulHigh(Node* node) {
   VisitRRR(this, kMips64MulHigh, node);
 }
 
+void InstructionSelector::VisitInt64MulHigh(Node* node) {
+  VisitRRR(this, kMips64DMulHigh, node);
+}
+
 void InstructionSelector::VisitUint32MulHigh(Node* node) {
   VisitRRR(this, kMips64MulHighU, node);
 }
 
+void InstructionSelector::VisitUint64MulHigh(Node* node) {
+  VisitRRR(this, kMips64DMulHighU, node);
+}
+
 void InstructionSelector::VisitInt64Mul(Node* node) {
   Mips64OperandGenerator g(this);
   Int64BinopMatcher m(node);
@@ -2121,7 +2130,7 @@ void VisitFullWord32Compare(InstructionSelector* selector, Node* node,
 void VisitOptimizedWord32Compare(InstructionSelector* selector, Node* node,
                                  InstructionCode opcode,
                                  FlagsContinuation* cont) {
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     Mips64OperandGenerator g(selector);
     InstructionOperand leftOp = g.TempRegister();
     InstructionOperand rightOp = g.TempRegister();
@@ -2256,14 +2265,15 @@ void VisitAtomicStore(InstructionSelector* selector, Node* node,
   WriteBarrierKind write_barrier_kind = store_params.write_barrier_kind();
   MachineRepresentation rep = store_params.representation();
 
-  if (FLAG_enable_unconditional_write_barriers &&
+  if (v8_flags.enable_unconditional_write_barriers &&
       CanBeTaggedOrCompressedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
 
   InstructionCode code;
 
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedPointer(rep));
     DCHECK_EQ(AtomicWidthSize(width), kTaggedSize);
 
@@ -2524,6 +2534,9 @@ void InstructionSelector::VisitWordCompareZero(Node* user, Node* value,
               case IrOpcode::kInt32MulWithOverflow:
                 cont->OverwriteAndNegateIfEqual(kOverflow);
                 return VisitBinop(this, node, kMips64MulOvf, cont);
+              case IrOpcode::kInt64MulWithOverflow:
+                cont->OverwriteAndNegateIfEqual(kOverflow);
+                return VisitBinop(this, node, kMips64DMulOvf, cont);
               case IrOpcode::kInt64AddWithOverflow:
                 cont->OverwriteAndNegateIfEqual(kOverflow);
                 return VisitBinop(this, node, kMips64DaddOvf, cont);
@@ -2641,6 +2654,15 @@ void InstructionSelector::VisitInt32MulWithOverflow(Node* node) {
   VisitBinop(this, node, kMips64MulOvf, &cont);
 }
 
+void InstructionSelector::VisitInt64MulWithOverflow(Node* node) {
+  if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
+    FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
+    return VisitBinop(this, node, kMips64DMulOvf, &cont);
+  }
+  FlagsContinuation cont;
+  VisitBinop(this, node, kMips64DMulOvf, &cont);
+}
+
 void InstructionSelector::VisitInt64AddWithOverflow(Node* node) {
   if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
     FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
diff --git a/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc b/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc
index cd37671dd3c0f9..0ab9564168776e 100644
--- a/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc
+++ b/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc
@@ -785,7 +785,7 @@ void CodeGenerator::AssembleCodeStartRegisterCheck() {
 //    2. test kMarkedForDeoptimizationBit in those flags; and
 //    3. if it is not zero then it jumps to the builtin.
 void CodeGenerator::BailoutIfDeoptimized() {
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     // Check that {kJavaScriptCallCodeStartRegister} is correct.
     __ ComputeCodeStartAddress(ip);
     __ CmpS64(ip, kJavaScriptCallCodeStartRegister);
@@ -908,7 +908,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       v8::internal::Assembler::BlockTrampolinePoolScope block_trampoline_pool(
           tasm());
       Register func = i.InputRegister(0);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Check the function's context matches the context argument.
         __ LoadTaggedPointerField(
             kScratchReg, FieldMemOperand(func, JSFunction::kContextOffset), r0);
@@ -1131,7 +1131,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       Register scratch1 = i.TempRegister(1);
       OutOfLineRecordWrite* ool;
 
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Checking that |value| is not a cleared weakref: our write barrier
         // does not support that for now.
         __ CmpS64(value, Operand(kClearedWeakHeapObjectLower32), kScratchReg);
@@ -1450,6 +1450,14 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
                  i.InputRegister(1));  // high
       }
       break;
+    case kPPC_MulHighS64:
+      __ mulhd(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1),
+               i.OutputRCBit());
+      break;
+    case kPPC_MulHighU64:
+      __ mulhdu(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1),
+                i.OutputRCBit());
+      break;
     case kPPC_MulHigh32:
       __ mulhw(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1),
                i.OutputRCBit());
@@ -2235,6 +2243,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
   V(I16x8Eq)               \
   V(I16x8GtS)              \
   V(I16x8GtU)              \
+  V(I16x8AddSatS)          \
+  V(I16x8SubSatS)          \
+  V(I16x8AddSatU)          \
+  V(I16x8SubSatU)          \
   V(I8x16Add)              \
   V(I8x16Sub)              \
   V(I8x16MinS)             \
@@ -2243,7 +2255,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
   V(I8x16MaxU)             \
   V(I8x16Eq)               \
   V(I8x16GtS)              \
-  V(I8x16GtU)
+  V(I8x16GtU)              \
+  V(I8x16AddSatS)          \
+  V(I8x16SubSatS)          \
+  V(I8x16AddSatU)          \
+  V(I8x16SubSatU)
 
 #define EMIT_SIMD_BINOP(name)                                     \
   case kPPC_##name: {                                             \
@@ -2255,6 +2271,81 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
 #undef EMIT_SIMD_BINOP
 #undef SIMD_BINOP_LIST
 
+#define SIMD_BINOP_WITH_SCRATCH_LIST(V) \
+  V(F64x2Ne)                            \
+  V(F32x4Ne)                            \
+  V(I64x2Ne)                            \
+  V(I64x2GeS)                           \
+  V(I32x4Ne)                            \
+  V(I32x4GeS)                           \
+  V(I32x4GeU)                           \
+  V(I16x8Ne)                            \
+  V(I16x8GeS)                           \
+  V(I16x8GeU)                           \
+  V(I8x16Ne)                            \
+  V(I8x16GeS)                           \
+  V(I8x16GeU)
+
+#define EMIT_SIMD_BINOP_WITH_SCRATCH(name)                        \
+  case kPPC_##name: {                                             \
+    __ name(i.OutputSimd128Register(), i.InputSimd128Register(0), \
+            i.InputSimd128Register(1), kScratchSimd128Reg);       \
+    break;                                                        \
+  }
+      SIMD_BINOP_WITH_SCRATCH_LIST(EMIT_SIMD_BINOP_WITH_SCRATCH)
+#undef EMIT_SIMD_BINOP_WITH_SCRATCH
+#undef SIMD_BINOP_WITH_SCRATCH_LIST
+
+#define SIMD_SHIFT_LIST(V) \
+  V(I64x2Shl)              \
+  V(I64x2ShrS)             \
+  V(I64x2ShrU)             \
+  V(I32x4Shl)              \
+  V(I32x4ShrS)             \
+  V(I32x4ShrU)             \
+  V(I16x8Shl)              \
+  V(I16x8ShrS)             \
+  V(I16x8ShrU)             \
+  V(I8x16Shl)              \
+  V(I8x16ShrS)             \
+  V(I8x16ShrU)
+
+#define EMIT_SIMD_SHIFT(name)                                     \
+  case kPPC_##name: {                                             \
+    __ name(i.OutputSimd128Register(), i.InputSimd128Register(0), \
+            i.InputRegister(1), kScratchSimd128Reg);              \
+    break;                                                        \
+  }
+      SIMD_SHIFT_LIST(EMIT_SIMD_SHIFT)
+#undef EMIT_SIMD_SHIFT
+#undef SIMD_SHIFT_LIST
+
+#define SIMD_UNOP_LIST(V) \
+  V(F64x2Abs)             \
+  V(F64x2Neg)             \
+  V(F64x2Sqrt)            \
+  V(F64x2Ceil)            \
+  V(F64x2Floor)           \
+  V(F64x2Trunc)           \
+  V(F32x4Abs)             \
+  V(F32x4Neg)             \
+  V(I64x2Neg)             \
+  V(I32x4Neg)             \
+  V(F32x4Sqrt)            \
+  V(F32x4Ceil)            \
+  V(F32x4Floor)           \
+  V(F32x4Trunc)           \
+  V(I8x16Popcnt)
+
+#define EMIT_SIMD_UNOP(name)                                       \
+  case kPPC_##name: {                                              \
+    __ name(i.OutputSimd128Register(), i.InputSimd128Register(0)); \
+    break;                                                         \
+  }
+      SIMD_UNOP_LIST(EMIT_SIMD_UNOP)
+#undef EMIT_SIMD_UNOP
+#undef SIMD_UNOP_LIST
+
     case kPPC_F64x2Splat: {
       __ F64x2Splat(i.OutputSimd128Register(), i.InputDoubleRegister(0),
                     kScratchReg);
@@ -2381,127 +2472,36 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
                   kScratchSimd128Reg2);
       break;
     }
-    case kPPC_F64x2Ne: {
-      __ F64x2Ne(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_F32x4Ne: {
-      __ F32x4Ne(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I64x2Ne: {
-      __ I64x2Ne(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I64x2GeS: {
-      __ I64x2GeS(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                  i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I32x4Ne: {
-      __ I32x4Ne(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I32x4GeS: {
-      __ I32x4GeS(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                  i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I32x4GeU: {
-      __ I32x4GeU(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                  i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I16x8Ne: {
-      __ I16x8Ne(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I16x8GeS: {
-      __ I16x8GeS(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                  i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I16x8GeU: {
-      __ I16x8GeU(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                  i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I8x16Ne: {
-      __ I8x16Ne(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I8x16GeS: {
-      __ I8x16GeS(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                  i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I8x16GeU: {
-      __ I8x16GeU(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                  i.InputSimd128Register(1), kScratchSimd128Reg);
-      break;
-    }
-#define VECTOR_SHIFT(op)                                           \
-  {                                                                \
-    __ mtvsrd(kScratchSimd128Reg, i.InputRegister(1));             \
-    __ vspltb(kScratchSimd128Reg, kScratchSimd128Reg, Operand(7)); \
-    __ op(i.OutputSimd128Register(), i.InputSimd128Register(0),    \
-          kScratchSimd128Reg);                                     \
-  }
-    case kPPC_I64x2Shl: {
-      VECTOR_SHIFT(vsld)
-      break;
-    }
-    case kPPC_I64x2ShrS: {
-      VECTOR_SHIFT(vsrad)
-      break;
-    }
-    case kPPC_I64x2ShrU: {
-      VECTOR_SHIFT(vsrd)
-      break;
-    }
-    case kPPC_I32x4Shl: {
-      VECTOR_SHIFT(vslw)
-      break;
-    }
-    case kPPC_I32x4ShrS: {
-      VECTOR_SHIFT(vsraw)
-      break;
-    }
-    case kPPC_I32x4ShrU: {
-      VECTOR_SHIFT(vsrw)
-      break;
-    }
-    case kPPC_I16x8Shl: {
-      VECTOR_SHIFT(vslh)
+    case kPPC_I64x2Abs: {
+      __ I64x2Abs(i.OutputSimd128Register(), i.InputSimd128Register(0),
+                  kScratchSimd128Reg);
       break;
     }
-    case kPPC_I16x8ShrS: {
-      VECTOR_SHIFT(vsrah)
+    case kPPC_I32x4Abs: {
+      __ I32x4Abs(i.OutputSimd128Register(), i.InputSimd128Register(0),
+                  kScratchSimd128Reg);
       break;
     }
-    case kPPC_I16x8ShrU: {
-      VECTOR_SHIFT(vsrh)
+    case kPPC_I16x8Abs: {
+      __ I16x8Abs(i.OutputSimd128Register(), i.InputSimd128Register(0),
+                  kScratchSimd128Reg);
       break;
     }
-    case kPPC_I8x16Shl: {
-      VECTOR_SHIFT(vslb)
+    case kPPC_I16x8Neg: {
+      __ I16x8Neg(i.OutputSimd128Register(), i.InputSimd128Register(0),
+                  kScratchSimd128Reg);
       break;
     }
-    case kPPC_I8x16ShrS: {
-      VECTOR_SHIFT(vsrab)
+    case kPPC_I8x16Abs: {
+      __ I8x16Abs(i.OutputSimd128Register(), i.InputSimd128Register(0),
+                  kScratchSimd128Reg);
       break;
     }
-    case kPPC_I8x16ShrU: {
-      VECTOR_SHIFT(vsrb)
+    case kPPC_I8x16Neg: {
+      __ I8x16Neg(i.OutputSimd128Register(), i.InputSimd128Register(0),
+                  kScratchSimd128Reg);
       break;
     }
-#undef VECTOR_SHIFT
     case kPPC_S128And: {
       Simd128Register dst = i.OutputSimd128Register();
       Simd128Register src = i.InputSimd128Register(1);
@@ -2552,92 +2552,6 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       __ vsel(dst, src2, src1, mask);
       break;
     }
-    case kPPC_F64x2Abs: {
-      __ xvabsdp(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F64x2Neg: {
-      __ xvnegdp(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F64x2Sqrt: {
-      __ xvsqrtdp(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F32x4Abs: {
-      __ xvabssp(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F32x4Neg: {
-      __ xvnegsp(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F32x4Sqrt: {
-      __ xvsqrtsp(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_I64x2Neg: {
-      __ vnegd(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_I32x4Neg: {
-      __ vnegw(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_I64x2Abs: {
-      Simd128Register src = i.InputSimd128Register(0);
-      Simd128Register dst = i.OutputSimd128Register();
-      constexpr int shift_bits = 63;
-      __ xxspltib(kScratchSimd128Reg, Operand(shift_bits));
-      __ vsrad(kScratchSimd128Reg, src, kScratchSimd128Reg);
-      __ vxor(dst, src, kScratchSimd128Reg);
-      __ vsubudm(dst, dst, kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I32x4Abs: {
-      Simd128Register src = i.InputSimd128Register(0);
-      Simd128Register dst = i.OutputSimd128Register();
-      constexpr int shift_bits = 31;
-      __ xxspltib(kScratchSimd128Reg, Operand(shift_bits));
-      __ vsraw(kScratchSimd128Reg, src, kScratchSimd128Reg);
-      __ vxor(dst, src, kScratchSimd128Reg);
-      __ vsubuwm(dst, dst, kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I16x8Neg: {
-      Simd128Register dst = i.OutputSimd128Register();
-      __ vspltish(kScratchSimd128Reg, Operand(1));
-      __ vnor(dst, i.InputSimd128Register(0), i.InputSimd128Register(0));
-      __ vadduhm(dst, kScratchSimd128Reg, dst);
-      break;
-    }
-    case kPPC_I16x8Abs: {
-      Simd128Register src = i.InputSimd128Register(0);
-      Simd128Register dst = i.OutputSimd128Register();
-      constexpr int shift_bits = 15;
-      __ xxspltib(kScratchSimd128Reg, Operand(shift_bits));
-      __ vsrah(kScratchSimd128Reg, src, kScratchSimd128Reg);
-      __ vxor(dst, src, kScratchSimd128Reg);
-      __ vsubuhm(dst, dst, kScratchSimd128Reg);
-      break;
-    }
-    case kPPC_I8x16Neg: {
-      Simd128Register dst = i.OutputSimd128Register();
-      __ xxspltib(kScratchSimd128Reg, Operand(1));
-      __ vnor(dst, i.InputSimd128Register(0), i.InputSimd128Register(0));
-      __ vaddubm(dst, kScratchSimd128Reg, dst);
-      break;
-    }
-    case kPPC_I8x16Abs: {
-      Simd128Register src = i.InputSimd128Register(0);
-      Simd128Register dst = i.OutputSimd128Register();
-      constexpr int shift_bits = 7;
-      __ xxspltib(kScratchSimd128Reg, Operand(shift_bits));
-      __ vsrab(kScratchSimd128Reg, src, kScratchSimd128Reg);
-      __ vxor(dst, src, kScratchSimd128Reg);
-      __ vsububm(dst, dst, kScratchSimd128Reg);
-      break;
-    }
     case kPPC_V128AnyTrue: {
       Simd128Register src = i.InputSimd128Register(0);
       Register dst = i.OutputRegister();
@@ -2825,46 +2739,6 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       __ vperm(dst, src0, src1, kScratchSimd128Reg);
       break;
     }
-    case kPPC_I16x8AddSatS: {
-      __ vaddshs(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1));
-      break;
-    }
-    case kPPC_I16x8SubSatS: {
-      __ vsubshs(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1));
-      break;
-    }
-    case kPPC_I16x8AddSatU: {
-      __ vadduhs(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1));
-      break;
-    }
-    case kPPC_I16x8SubSatU: {
-      __ vsubuhs(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1));
-      break;
-    }
-    case kPPC_I8x16AddSatS: {
-      __ vaddsbs(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1));
-      break;
-    }
-    case kPPC_I8x16SubSatS: {
-      __ vsubsbs(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1));
-      break;
-    }
-    case kPPC_I8x16AddSatU: {
-      __ vaddubs(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1));
-      break;
-    }
-    case kPPC_I8x16SubSatU: {
-      __ vsububs(i.OutputSimd128Register(), i.InputSimd128Register(0),
-                 i.InputSimd128Register(1));
-      break;
-    }
     case kPPC_I8x16Swizzle: {
       Simd128Register dst = i.OutputSimd128Register(),
                       src0 = i.InputSimd128Register(0),
@@ -2935,30 +2809,6 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       __ vandc(dst, src, i.InputSimd128Register(1));
       break;
     }
-    case kPPC_F64x2Ceil: {
-      __ xvrdpip(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F64x2Floor: {
-      __ xvrdpim(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F64x2Trunc: {
-      __ xvrdpiz(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F32x4Ceil: {
-      __ xvrspip(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F32x4Floor: {
-      __ xvrspim(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
-    case kPPC_F32x4Trunc: {
-      __ xvrspiz(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
     case kPPC_I64x2BitMask: {
       if (CpuFeatures::IsSupported(PPC_10_PLUS)) {
         __ vextractdm(i.OutputRegister(), i.InputSimd128Register(0));
@@ -3449,10 +3299,6 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       __ vinsertd(dst, kScratchSimd128Reg, Operand(lane_number));
       break;
     }
-    case kPPC_I8x16Popcnt: {
-      __ vpopcntb(i.OutputSimd128Register(), i.InputSimd128Register(0));
-      break;
-    }
     case kPPC_StoreCompressTagged: {
       size_t index = 0;
       AddressingMode mode = kMode_None;
@@ -3561,7 +3407,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
         ReferenceMap* reference_map =
             gen_->zone()->New<ReferenceMap>(gen_->zone());
         gen_->RecordSafepoint(reference_map);
-        if (FLAG_debug_code) {
+        if (v8_flags.debug_code) {
           __ stop();
         }
       }
@@ -3694,13 +3540,13 @@ void CodeGenerator::FinishFrame(Frame* frame) {
   }
   // Save callee-saved registers.
   const RegList saves =
-      FLAG_enable_embedded_constant_pool
+      V8_EMBEDDED_CONSTANT_POOL_BOOL
           ? call_descriptor->CalleeSavedRegisters() - kConstantPoolRegister
           : call_descriptor->CalleeSavedRegisters();
   if (!saves.is_empty()) {
     // register save area does not include the fp or constant pool pointer.
     const int num_saves =
-        kNumCalleeSaved - 1 - (FLAG_enable_embedded_constant_pool ? 1 : 0);
+        kNumCalleeSaved - 1 - (V8_EMBEDDED_CONSTANT_POOL_BOOL ? 1 : 0);
     frame->AllocateSavedCalleeRegisterSlots(num_saves);
   }
 }
@@ -3720,7 +3566,7 @@ void CodeGenerator::AssembleConstructFrame() {
 #endif  // V8_ENABLE_WEBASSEMBLY
       } else {
         __ mflr(r0);
-        if (FLAG_enable_embedded_constant_pool) {
+        if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
           __ Push(r0, fp, kConstantPoolRegister);
           // Adjust FP to point to saved FP.
           __ SubS64(fp, sp,
@@ -3769,7 +3615,7 @@ void CodeGenerator::AssembleConstructFrame() {
 
   const DoubleRegList saves_fp = call_descriptor->CalleeSavedFPRegisters();
   const RegList saves =
-      FLAG_enable_embedded_constant_pool
+      V8_EMBEDDED_CONSTANT_POOL_BOOL
           ? call_descriptor->CalleeSavedRegisters() - kConstantPoolRegister
           : call_descriptor->CalleeSavedRegisters();
 
@@ -3785,7 +3631,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // If the frame is bigger than the stack, we throw the stack overflow
       // exception unconditionally. Thereby we can avoid the integer overflow
       // check in the condition code.
-      if (required_slots * kSystemPointerSize < FLAG_stack_size * KB) {
+      if (required_slots * kSystemPointerSize < v8_flags.stack_size * KB) {
         Register scratch = ip;
         __ LoadU64(
             scratch,
@@ -3804,7 +3650,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // define an empty safepoint.
       ReferenceMap* reference_map = zone()->New<ReferenceMap>(zone());
       RecordSafepoint(reference_map);
-      if (FLAG_debug_code) __ stop();
+      if (v8_flags.debug_code) __ stop();
 
       __ bind(&done);
     }
@@ -3845,7 +3691,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
 
   // Restore registers.
   const RegList saves =
-      FLAG_enable_embedded_constant_pool
+      V8_EMBEDDED_CONSTANT_POOL_BOOL
           ? call_descriptor->CalleeSavedRegisters() - kConstantPoolRegister
           : call_descriptor->CalleeSavedRegisters();
   if (!saves.is_empty()) {
@@ -3869,7 +3715,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
   if (parameter_slots != 0) {
     if (additional_pop_count->IsImmediate()) {
       DCHECK_EQ(g.ToConstant(additional_pop_count).ToInt32(), 0);
-    } else if (FLAG_debug_code) {
+    } else if (v8_flags.debug_code) {
       __ cmpi(g.ToRegister(additional_pop_count), Operand(0));
       __ Assert(eq, AbortReason::kUnexpectedAdditionalPopValue);
     }
diff --git a/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h b/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h
index 8ca4b0c8520e5d..5710aa313dfd8b 100644
--- a/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h
+++ b/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h
@@ -48,6 +48,8 @@ namespace compiler {
   V(PPC_Mul32)                       \
   V(PPC_Mul32WithHigh32)             \
   V(PPC_Mul64)                       \
+  V(PPC_MulHighS64)                  \
+  V(PPC_MulHighU64)                  \
   V(PPC_MulHigh32)                   \
   V(PPC_MulHighU32)                  \
   V(PPC_MulPair)                     \
diff --git a/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc b/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc
index 52d82b680294a5..e1d195f25352ca 100644
--- a/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc
+++ b/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc
@@ -46,6 +46,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
     case kPPC_Mul32:
     case kPPC_Mul32WithHigh32:
     case kPPC_Mul64:
+    case kPPC_MulHighS64:
+    case kPPC_MulHighU64:
     case kPPC_MulHigh32:
     case kPPC_MulHighU32:
     case kPPC_MulPair:
diff --git a/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc b/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc
index d1e492c2288391..a5069d22fdcb33 100644
--- a/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc
+++ b/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc
@@ -286,12 +286,13 @@ void VisitStoreCommon(InstructionSelector* selector, Node* node,
     write_barrier_kind = store_rep.write_barrier_kind();
   }
 
-  if (FLAG_enable_unconditional_write_barriers &&
+  if (v8_flags.enable_unconditional_write_barriers &&
       CanBeTaggedOrCompressedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
 
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedOrCompressedPointer(rep));
     AddressingMode addressing_mode;
     InstructionOperand inputs[3];
@@ -1108,6 +1109,23 @@ void EmitInt32MulWithOverflow(InstructionSelector* selector, Node* node,
   VisitCompare(selector, kPPC_Cmp32, high32_operand, temp_operand, cont);
 }
 
+void EmitInt64MulWithOverflow(InstructionSelector* selector, Node* node,
+                              FlagsContinuation* cont) {
+  PPCOperandGenerator g(selector);
+  Int64BinopMatcher m(node);
+  InstructionOperand result = g.DefineAsRegister(node);
+  InstructionOperand left = g.UseRegister(m.left().node());
+  InstructionOperand high = g.TempRegister();
+  InstructionOperand result_sign = g.TempRegister();
+  InstructionOperand right = g.UseRegister(m.right().node());
+  selector->Emit(kPPC_Mul64, result, left, right);
+  selector->Emit(kPPC_MulHighS64, high, left, right);
+  selector->Emit(kPPC_ShiftRightAlg64, result_sign, result,
+                 g.TempImmediate(63));
+  // Test whether {high} is a sign-extension of {result}.
+  selector->EmitWithContinuation(kPPC_Cmp64, high, result_sign, cont);
+}
+
 }  // namespace
 
 void InstructionSelector::VisitInt32Mul(Node* node) {
@@ -1132,6 +1150,18 @@ void InstructionSelector::VisitUint32MulHigh(Node* node) {
        g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
 }
 
+void InstructionSelector::VisitInt64MulHigh(Node* node) {
+  PPCOperandGenerator g(this);
+  Emit(kPPC_MulHighS64, g.DefineAsRegister(node),
+       g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
+}
+
+void InstructionSelector::VisitUint64MulHigh(Node* node) {
+  PPCOperandGenerator g(this);
+  Emit(kPPC_MulHighU64, g.DefineAsRegister(node),
+       g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)));
+}
+
 void InstructionSelector::VisitInt32Div(Node* node) {
   VisitRRR(this, kPPC_Div32, node);
 }
@@ -1541,6 +1571,15 @@ void InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
   FlagsContinuation cont;
   VisitBinop<Int64BinopMatcher>(this, node, kPPC_Sub, kInt16Imm_Negate, &cont);
 }
+
+void InstructionSelector::VisitInt64MulWithOverflow(Node* node) {
+  if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
+    FlagsContinuation cont = FlagsContinuation::ForSet(kNotEqual, ovf);
+    return EmitInt64MulWithOverflow(this, node, &cont);
+  }
+  FlagsContinuation cont;
+  EmitInt64MulWithOverflow(this, node, &cont);
+}
 #endif
 
 static bool CompareLogical(FlagsContinuation* cont) {
@@ -1721,6 +1760,9 @@ void InstructionSelector::VisitWordCompareZero(Node* user, Node* value,
                 cont->OverwriteAndNegateIfEqual(kOverflow);
                 return VisitBinop<Int64BinopMatcher>(this, node, kPPC_Sub,
                                                      kInt16Imm_Negate, cont);
+              case IrOpcode::kInt64MulWithOverflow:
+                cont->OverwriteAndNegateIfEqual(kNotEqual);
+                return EmitInt64MulWithOverflow(this, node, cont);
 #endif
               default:
                 break;
diff --git a/deps/v8/src/compiler/backend/ppc/unwinding-info-writer-ppc.h b/deps/v8/src/compiler/backend/ppc/unwinding-info-writer-ppc.h
index e96a48308fb609..b11e00be2d12d3 100644
--- a/deps/v8/src/compiler/backend/ppc/unwinding-info-writer-ppc.h
+++ b/deps/v8/src/compiler/backend/ppc/unwinding-info-writer-ppc.h
@@ -49,7 +49,7 @@ class UnwindingInfoWriter {
   }
 
  private:
-  bool enabled() const { return FLAG_perf_prof_unwinding_info; }
+  bool enabled() const { return v8_flags.perf_prof_unwinding_info; }
 
   class BlockInitialState : public ZoneObject {
    public:
diff --git a/deps/v8/src/compiler/backend/register-allocator.h b/deps/v8/src/compiler/backend/register-allocator.h
index 165a4db273739c..e7a228e6f91362 100644
--- a/deps/v8/src/compiler/backend/register-allocator.h
+++ b/deps/v8/src/compiler/backend/register-allocator.h
@@ -730,6 +730,9 @@ struct LiveRangeOrdering {
     return left->Start() < right->Start();
   }
 };
+// Bundle live ranges that are connected by phis and do not overlap. This tries
+// to restore some pre-SSA information and is used as a hint to allocate the
+// same spill slot or reuse the same register for connected live ranges.
 class LiveRangeBundle : public ZoneObject {
  public:
   void MergeSpillRangesAndClear();
@@ -799,6 +802,10 @@ class LiveRangeBundle : public ZoneObject {
   int reg_ = kUnassignedRegister;
 };
 
+// Register allocation splits LiveRanges so it can make more fine-grained
+// allocation and spilling decisions. The LiveRanges that belong to the same
+// virtual register form a linked-list, and the head of this list is a
+// TopLevelLiveRange.
 class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange {
  public:
   explicit TopLevelLiveRange(int vreg, MachineRepresentation rep);
@@ -1069,6 +1076,9 @@ struct PrintableLiveRange {
 std::ostream& operator<<(std::ostream& os,
                          const PrintableLiveRange& printable_range);
 
+// Represent the spill operand of a LiveRange and its use intervals. After
+// register allocation, disjoint spill ranges are merged and they get assigned
+// the same spill slot by OperandAssigner::AssignSpillSlots().
 class SpillRange final : public ZoneObject {
  public:
   static const int kUnassignedSlot = -1;
@@ -1111,6 +1121,8 @@ class SpillRange final : public ZoneObject {
   int byte_width_;
 };
 
+// A live range with the start and end position, and helper methods for the
+// ResolveControlFlow phase.
 class LiveRangeBound {
  public:
   explicit LiveRangeBound(LiveRange* range, bool skip)
@@ -1135,6 +1147,8 @@ struct FindResult {
   LiveRange* pred_cover_;
 };
 
+// An array of LiveRangeBounds belonging to the same TopLevelLiveRange. Sorted
+// by their start position for quick binary search.
 class LiveRangeBoundArray {
  public:
   LiveRangeBoundArray() : length_(0), start_(nullptr) {}
@@ -1478,6 +1492,11 @@ class LinearScanAllocator final : public RegisterAllocator {
                                         RangeWithRegisterSet* to_be_live);
 
   // Helper methods for allocating registers.
+
+  // Spilling a phi at range start can be beneficial when the phi input is
+  // already spilled and shares the same spill slot. This function tries to
+  // guess if spilling the phi is beneficial based on live range bundles and
+  // spilled phi inputs.
   bool TryReuseSpillForPhi(TopLevelLiveRange* range);
   int PickRegisterThatIsAvailableLongest(
       LiveRange* current, int hint_reg,
diff --git a/deps/v8/src/compiler/backend/riscv/code-generator-riscv.cc b/deps/v8/src/compiler/backend/riscv/code-generator-riscv.cc
index 7ff828b0ec8cd5..0f227a3fc60940 100644
--- a/deps/v8/src/compiler/backend/riscv/code-generator-riscv.cc
+++ b/deps/v8/src/compiler/backend/riscv/code-generator-riscv.cc
@@ -721,7 +721,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     }
     case kArchCallJSFunction: {
       Register func = i.InputOrZeroRegister(0);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Check the function's context matches the context argument.
         __ LoadTaggedPointerField(
             kScratchReg, FieldMemOperand(func, JSFunction::kContextOffset));
@@ -905,7 +905,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       int alignment = i.InputInt32(1);
       DCHECK(alignment == 0 || alignment == 4 || alignment == 8 ||
              alignment == 16);
-      if (FLAG_debug_code && alignment > 0) {
+      if (v8_flags.debug_code && alignment > 0) {
         // Verify that the output_register is properly aligned
         __ And(kScratchReg, i.OutputRegister(),
                Operand(kSystemPointerSize - 1));
@@ -1036,6 +1036,14 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       __ Mulh64(i.OutputRegister(), i.InputOrZeroRegister(0),
                 i.InputOperand(1));
       break;
+    case kRiscvMulHighU64:
+      __ Mulhu64(i.OutputRegister(), i.InputOrZeroRegister(0),
+                 i.InputOperand(1));
+      break;
+    case kRiscvMulOvf64:
+      __ MulOverflow64(i.OutputRegister(), i.InputOrZeroRegister(0),
+                       i.InputOperand(1), kScratchReg);
+      break;
     case kRiscvDiv32: {
       __ Div32(i.OutputRegister(), i.InputOrZeroRegister(0), i.InputOperand(1));
       // Set ouput to zero if divisor == 0
@@ -3745,7 +3753,13 @@ void AssembleBranchToLabels(CodeGenerator* gen, TurboAssembler* tasm,
       default:
         UNSUPPORTED_COND(instr->arch_opcode(), condition);
     }
+#if V8_TARGET_ARCH_RISCV64
+    // kRiscvMulOvf64 is only for RISCV64
+  } else if (instr->arch_opcode() == kRiscvMulOvf32 ||
+             instr->arch_opcode() == kRiscvMulOvf64) {
+#elif V8_TARGET_ARCH_RISCV32
   } else if (instr->arch_opcode() == kRiscvMulOvf32) {
+#endif
     // Overflow occurs if overflow register is not zero
     switch (condition) {
       case kOverflow:
@@ -3755,7 +3769,7 @@ void AssembleBranchToLabels(CodeGenerator* gen, TurboAssembler* tasm,
         __ Branch(tlabel, eq, kScratchReg, Operand(zero_reg));
         break;
       default:
-        UNSUPPORTED_COND(kRiscvMulOvf32, condition);
+        UNSUPPORTED_COND(instr->arch_opcode(), condition);
     }
   } else if (instr->arch_opcode() == kRiscvCmp) {
     Condition cc = FlagsConditionToConditionCmp(condition);
@@ -3855,7 +3869,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
         ReferenceMap* reference_map =
             gen_->zone()->New<ReferenceMap>(gen_->zone());
         gen_->RecordSafepoint(reference_map);
-        if (FLAG_debug_code) {
+        if (v8_flags.debug_code) {
           __ stop();
         }
       }
@@ -3908,7 +3922,13 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
 #endif
     // Overflow occurs if overflow register is negative
     __ Slt(result, kScratchReg, zero_reg);
+#if V8_TARGET_ARCH_RISCV64
+    // kRiscvMulOvf64 is only for RISCV64
+  } else if (instr->arch_opcode() == kRiscvMulOvf32 ||
+             instr->arch_opcode() == kRiscvMulOvf64) {
+#elif V8_TARGET_ARCH_RISCV32
   } else if (instr->arch_opcode() == kRiscvMulOvf32) {
+#endif
     // Overflow occurs if overflow register is not zero
     __ Sgtu(result, kScratchReg, zero_reg);
   } else if (instr->arch_opcode() == kRiscvCmp) {
@@ -4193,7 +4213,8 @@ void CodeGenerator::AssembleConstructFrame() {
       // If the frame is bigger than the stack, we throw the stack overflow
       // exception unconditionally. Thereby we can avoid the integer overflow
       // check in the condition code.
-      if ((required_slots * kSystemPointerSize) < (FLAG_stack_size * 1024)) {
+      if ((required_slots * kSystemPointerSize) <
+          (v8_flags.stack_size * 1024)) {
         __ LoadWord(
             kScratchReg,
             FieldMemOperand(kWasmInstanceRegister,
@@ -4208,7 +4229,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // We come from WebAssembly, there are no references for the GC.
       ReferenceMap* reference_map = zone()->New<ReferenceMap>(zone());
       RecordSafepoint(reference_map);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         __ stop();
       }
 
@@ -4273,7 +4294,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
   if (parameter_slots != 0) {
     if (additional_pop_count->IsImmediate()) {
       DCHECK_EQ(g.ToConstant(additional_pop_count).ToInt32(), 0);
-    } else if (FLAG_debug_code) {
+    } else if (v8_flags.debug_code) {
       __ Assert(eq, AbortReason::kUnexpectedAdditionalPopValue,
                 g.ToRegister(additional_pop_count),
                 Operand(static_cast<intptr_t>(0)));
diff --git a/deps/v8/src/compiler/backend/riscv/instruction-codes-riscv.h b/deps/v8/src/compiler/backend/riscv/instruction-codes-riscv.h
index 6e2e69d8ce46f0..efe7a23267d0d4 100644
--- a/deps/v8/src/compiler/backend/riscv/instruction-codes-riscv.h
+++ b/deps/v8/src/compiler/backend/riscv/instruction-codes-riscv.h
@@ -18,7 +18,9 @@ namespace compiler {
   V(RiscvSub64)                            \
   V(RiscvSubOvf64)                         \
   V(RiscvMulHigh64)                        \
+  V(RiscvMulHighU64)                       \
   V(RiscvMul64)                            \
+  V(RiscvMulOvf64)                         \
   V(RiscvDiv64)                            \
   V(RiscvDivU64)                           \
   V(RiscvMod64)                            \
diff --git a/deps/v8/src/compiler/backend/riscv/instruction-scheduler-riscv.cc b/deps/v8/src/compiler/backend/riscv/instruction-scheduler-riscv.cc
index 879ac4393fd56c..ea9e603920184f 100644
--- a/deps/v8/src/compiler/backend/riscv/instruction-scheduler-riscv.cc
+++ b/deps/v8/src/compiler/backend/riscv/instruction-scheduler-riscv.cc
@@ -24,6 +24,7 @@ int InstructionScheduler::GetTargetInstructionFlags(
     case kRiscvCvtSL:
     case kRiscvCvtSUl:
     case kRiscvMulHigh64:
+    case kRiscvMulHighU64:
     case kRiscvAdd64:
     case kRiscvAddOvf64:
     case kRiscvClz64:
@@ -35,6 +36,7 @@ int InstructionScheduler::GetTargetInstructionFlags(
     case kRiscvMod64:
     case kRiscvModU64:
     case kRiscvMul64:
+    case kRiscvMulOvf64:
     case kRiscvPopcnt64:
     case kRiscvRor64:
     case kRiscvSar64:
@@ -946,6 +948,11 @@ int MulOverflow32Latency() {
   return Mul32Latency() + Mulh32Latency() + 2;
 }
 
+int MulOverflow64Latency() {
+  // Estimated max.
+  return Mul64Latency() + Mulh64Latency() + 2;
+}
+
 // TODO(RISCV): This is incorrect for RISC-V.
 int Clz64Latency() { return 1; }
 
@@ -1128,7 +1135,7 @@ int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
       return JumpLatency();
     case kArchCallJSFunction: {
       int latency = 0;
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         latency = 1 + AssertLatency();
       }
       return latency + 1 + Add64Latency(false) + CallLatency();
@@ -1216,6 +1223,8 @@ int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
       return Mulh64Latency();
     case kRiscvMul64:
       return Mul64Latency();
+    case kRiscvMulOvf64:
+      return MulOverflow64Latency();
     case kRiscvDiv64: {
       int latency = Div64Latency();
       return latency + MovzLatency();
diff --git a/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv32.cc b/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv32.cc
index 4d01a47b7042f1..a8db8248b3e3d6 100644
--- a/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv32.cc
+++ b/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv32.cc
@@ -204,7 +204,7 @@ void InstructionSelector::VisitStore(Node* node) {
 
   // TODO(riscv): I guess this could be done in a better way.
   if (write_barrier_kind != kNoWriteBarrier &&
-      V8_LIKELY(!FLAG_disable_write_barriers)) {
+      V8_LIKELY(!v8_flags.disable_write_barriers)) {
     DCHECK(CanBeTaggedPointer(rep));
     InstructionOperand inputs[3];
     size_t input_count = 0;
diff --git a/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc b/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc
index e1b6ff7eeef49d..83f5b5ecb456d1 100644
--- a/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc
+++ b/deps/v8/src/compiler/backend/riscv/instruction-selector-riscv64.cc
@@ -326,7 +326,7 @@ void InstructionSelector::VisitStore(Node* node) {
 
   // TODO(riscv): I guess this could be done in a better way.
   if (write_barrier_kind != kNoWriteBarrier &&
-      V8_LIKELY(!FLAG_disable_write_barriers)) {
+      V8_LIKELY(!v8_flags.disable_write_barriers)) {
     DCHECK(CanBeTaggedPointer(rep));
     InstructionOperand inputs[3];
     size_t input_count = 0;
@@ -667,10 +667,18 @@ void InstructionSelector::VisitInt32MulHigh(Node* node) {
   VisitRRR(this, kRiscvMulHigh32, node);
 }
 
+void InstructionSelector::VisitInt64MulHigh(Node* node) {
+  VisitRRR(this, kRiscvMulHigh64, node);
+}
+
 void InstructionSelector::VisitUint32MulHigh(Node* node) {
   VisitRRR(this, kRiscvMulHighU32, node);
 }
 
+void InstructionSelector::VisitUint64MulHigh(Node* node) {
+  VisitRRR(this, kRiscvMulHighU64, node);
+}
+
 void InstructionSelector::VisitInt64Mul(Node* node) {
   RiscvOperandGenerator g(this);
   Int64BinopMatcher m(node);
@@ -1441,7 +1449,7 @@ void VisitFullWord32Compare(InstructionSelector* selector, Node* node,
 void VisitOptimizedWord32Compare(InstructionSelector* selector, Node* node,
                                  InstructionCode opcode,
                                  FlagsContinuation* cont) {
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     RiscvOperandGenerator g(selector);
     InstructionOperand leftOp = g.TempRegister();
     InstructionOperand rightOp = g.TempRegister();
@@ -1610,6 +1618,18 @@ void InstructionSelector::VisitStackPointerGreaterThan(
                        temp_count, temps, cont);
 }
 
+bool CanCoverTrap(Node* user, Node* value) {
+  if (user->opcode() != IrOpcode::kTrapUnless &&
+      user->opcode() != IrOpcode::kTrapIf)
+    return true;
+  if (value->opcode() == IrOpcode::kWord32Equal ||
+      value->opcode() == IrOpcode::kInt32LessThanOrEqual ||
+      value->opcode() == IrOpcode::kInt32LessThanOrEqual ||
+      value->opcode() == IrOpcode::kUint32LessThan ||
+      value->opcode() == IrOpcode::kUint32LessThanOrEqual)
+    return false;
+  return true;
+}
 // Shared routine for word comparisons against zero.
 void InstructionSelector::VisitWordCompareZero(Node* user, Node* value,
                                                FlagsContinuation* cont) {
@@ -1632,7 +1652,7 @@ void InstructionSelector::VisitWordCompareZero(Node* user, Node* value,
     cont->Negate();
   }
 
-  if (CanCover(user, value)) {
+  if (CanCoverTrap(user, value) && CanCover(user, value)) {
     switch (value->opcode()) {
       case IrOpcode::kWord32Equal:
         cont->OverwriteAndNegateIfEqual(kEqual);
@@ -1808,6 +1828,21 @@ void InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
   VisitBinop(this, node, kRiscvSubOvf64, &cont);
 }
 
+void InstructionSelector::VisitInt64MulWithOverflow(Node* node) {
+  if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
+    // RISCV64 doesn't set the overflow flag for multiplication, so we need to
+    // test on kNotEqual. Here is the code sequence used:
+    //   mulh rdh, left, right
+    //   mul rdl, left, right
+    //   srai temp, rdl, 63
+    //   xor overflow, rdl, temp
+    FlagsContinuation cont = FlagsContinuation::ForSet(kNotEqual, ovf);
+    return VisitBinop(this, node, kRiscvMulOvf64, &cont);
+  }
+  FlagsContinuation cont;
+  VisitBinop(this, node, kRiscvMulOvf64, &cont);
+}
+
 void InstructionSelector::VisitWord64Equal(Node* const node) {
   FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node);
   Int64BinopMatcher m(node);
diff --git a/deps/v8/src/compiler/backend/s390/code-generator-s390.cc b/deps/v8/src/compiler/backend/s390/code-generator-s390.cc
index 6f5ed9b9812aeb..27b2a5a853799e 100644
--- a/deps/v8/src/compiler/backend/s390/code-generator-s390.cc
+++ b/deps/v8/src/compiler/backend/s390/code-generator-s390.cc
@@ -306,6 +306,7 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
         case kS390_Abs64:
         case kS390_Abs32:
         case kS390_Mul32:
+        case kS390_Mul64WithOverflow:
           return overflow;
         default:
           break;
@@ -1124,7 +1125,7 @@ void CodeGenerator::AssembleCodeStartRegisterCheck() {
 //    2. test kMarkedForDeoptimizationBit in those flags; and
 //    3. if it is not zero then it jumps to the builtin.
 void CodeGenerator::BailoutIfDeoptimized() {
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     // Check that {kJavaScriptCallCodeStartRegister} is correct.
     __ ComputeCodeStartAddress(ip);
     __ CmpS64(ip, kJavaScriptCallCodeStartRegister);
@@ -1237,7 +1238,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     }
     case kArchCallJSFunction: {
       Register func = i.InputRegister(0);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Check the function's context matches the context argument.
         __ LoadTaggedPointerField(
             kScratchReg, FieldMemOperand(func, JSFunction::kContextOffset));
@@ -1417,7 +1418,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       Register scratch1 = i.TempRegister(1);
       OutOfLineRecordWrite* ool;
 
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Checking that |value| is not a cleared weakref: our write barrier
         // does not support that for now.
         __ CmpS64(value, Operand(kClearedWeakHeapObjectLower32));
@@ -1695,6 +1696,21 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     case kS390_Mul64:
       ASSEMBLE_BIN_OP(RRInstr(MulS64), RM64Instr(MulS64), RIInstr(MulS64));
       break;
+    case kS390_Mul64WithOverflow: {
+      Register dst = i.OutputRegister(), src1 = i.InputRegister(0),
+               src2 = i.InputRegister(1);
+      DCHECK(!AreAliased(dst, src1, src2));
+      if (CpuFeatures::IsSupported(MISC_INSTR_EXT2)) {
+        __ msgrkc(dst, src1, src2);
+      } else {
+        __ mgrk(r0, src1, src2);  // r0 = high 64-bits, r1 = low 64-bits.
+        __ lgr(dst, r1);
+        __ ShiftRightS64(r1, r1, Operand(63));
+        // Test whether {high} is a sign-extension of {result}.
+        __ CmpU64(r0, r1);
+      }
+      break;
+    }
     case kS390_MulHigh32:
       // zero-ext
       ASSEMBLE_BIN_OP(RRRInstr(MulHighS32), RRM32Instr(MulHighS32),
@@ -1705,6 +1721,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       ASSEMBLE_BIN_OP(RRRInstr(MulHighU32), RRM32Instr(MulHighU32),
                       RRIInstr(MulHighU32));
       break;
+    case kS390_MulHighU64:
+      ASSEMBLE_BIN_OP(RRRInstr(MulHighU64), nullInstr, nullInstr);
+      break;
+    case kS390_MulHighS64:
+      ASSEMBLE_BIN_OP(RRRInstr(MulHighS64), nullInstr, nullInstr);
+      break;
     case kS390_MulFloat:
       ASSEMBLE_BIN_OP(DDInstr(meebr), DMTInstr(MulFloat32), nullInstr);
       break;
@@ -3240,7 +3262,7 @@ void CodeGenerator::AssembleArchTrap(Instruction* instr,
         ReferenceMap* reference_map =
             gen_->zone()->New<ReferenceMap>(gen_->zone());
         gen_->RecordSafepoint(reference_map);
-        if (FLAG_debug_code) {
+        if (v8_flags.debug_code) {
           __ stop();
         }
       }
@@ -3423,7 +3445,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // If the frame is bigger than the stack, we throw the stack overflow
       // exception unconditionally. Thereby we can avoid the integer overflow
       // check in the condition code.
-      if (required_slots * kSystemPointerSize < FLAG_stack_size * KB) {
+      if (required_slots * kSystemPointerSize < v8_flags.stack_size * KB) {
         Register scratch = r1;
         __ LoadU64(
             scratch,
@@ -3441,7 +3463,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // define an empty safepoint.
       ReferenceMap* reference_map = zone()->New<ReferenceMap>(zone());
       RecordSafepoint(reference_map);
-      if (FLAG_debug_code) __ stop();
+      if (v8_flags.debug_code) __ stop();
 
       __ bind(&done);
     }
@@ -3503,7 +3525,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
   if (parameter_slots != 0) {
     if (additional_pop_count->IsImmediate()) {
       DCHECK_EQ(g.ToConstant(additional_pop_count).ToInt32(), 0);
-    } else if (FLAG_debug_code) {
+    } else if (v8_flags.debug_code) {
       __ CmpS64(g.ToRegister(additional_pop_count), Operand(0));
       __ Assert(eq, AbortReason::kUnexpectedAdditionalPopValue);
     }
diff --git a/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h b/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h
index 45502c89422359..f362cddcf7a224 100644
--- a/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h
+++ b/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h
@@ -47,6 +47,9 @@ namespace compiler {
   V(S390_Mul32)                             \
   V(S390_Mul32WithOverflow)                 \
   V(S390_Mul64)                             \
+  V(S390_Mul64WithOverflow)                 \
+  V(S390_MulHighS64)                        \
+  V(S390_MulHighU64)                        \
   V(S390_MulHigh32)                         \
   V(S390_MulHighU32)                        \
   V(S390_MulFloat)                          \
diff --git a/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc b/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc
index 320c12574df19a..fa0a60a0193c45 100644
--- a/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc
+++ b/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc
@@ -46,6 +46,9 @@ int InstructionScheduler::GetTargetInstructionFlags(
     case kS390_Mul32:
     case kS390_Mul32WithOverflow:
     case kS390_Mul64:
+    case kS390_Mul64WithOverflow:
+    case kS390_MulHighS64:
+    case kS390_MulHighU64:
     case kS390_MulHigh32:
     case kS390_MulHighU32:
     case kS390_MulFloat:
diff --git a/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc b/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc
index fc49a1376e55a8..a0192b0022bace 100644
--- a/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc
+++ b/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc
@@ -725,7 +725,8 @@ static void VisitGeneralStore(
   Node* base = node->InputAt(0);
   Node* offset = node->InputAt(1);
   Node* value = node->InputAt(2);
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedOrCompressedPointer(rep));
     AddressingMode addressing_mode;
     InstructionOperand inputs[3];
@@ -824,7 +825,7 @@ void InstructionSelector::VisitStore(Node* node) {
   WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
   MachineRepresentation rep = store_rep.representation();
 
-  if (FLAG_enable_unconditional_write_barriers &&
+  if (v8_flags.enable_unconditional_write_barriers &&
       CanBeTaggedOrCompressedPointer(rep)) {
     write_barrier_kind = kFullWriteBarrier;
   }
@@ -1258,6 +1259,23 @@ static inline bool TryMatchInt64SubWithOverflow(InstructionSelector* selector,
   return TryMatchInt64OpWithOverflow<kS390_Sub64>(selector, node,
                                                   SubOperandMode);
 }
+
+void EmitInt64MulWithOverflow(InstructionSelector* selector, Node* node,
+                              FlagsContinuation* cont) {
+  S390OperandGenerator g(selector);
+  Int64BinopMatcher m(node);
+  InstructionOperand inputs[2];
+  size_t input_count = 0;
+  InstructionOperand outputs[1];
+  size_t output_count = 0;
+
+  inputs[input_count++] = g.UseUniqueRegister(m.left().node());
+  inputs[input_count++] = g.UseUniqueRegister(m.right().node());
+  outputs[output_count++] = g.DefineAsRegister(node);
+  selector->EmitWithContinuation(kS390_Mul64WithOverflow, output_count, outputs,
+                                 input_count, inputs, cont);
+}
+
 #endif
 
 static inline bool TryMatchDoubleConstructFromInsert(
@@ -1471,6 +1489,8 @@ static inline bool TryMatchDoubleConstructFromInsert(
 
 #define WORD64_BIN_OP_LIST(V)                                                  \
   V(Word64, Int64Add, kS390_Add64, AddOperandMode, null)                       \
+  V(Word64, Int64MulHigh, kS390_MulHighS64, OperandMode::kAllowRRR, null)      \
+  V(Word64, Uint64MulHigh, kS390_MulHighU64, OperandMode::kAllowRRR, null)     \
   V(Word64, Int64Sub, kS390_Sub64, SubOperandMode, ([&]() {                    \
       return TryMatchNegFromSub<Int64BinopMatcher, kS390_Neg64>(this, node);   \
     }))                                                                        \
@@ -1584,6 +1604,16 @@ void InstructionSelector::VisitFloat64Ieee754Binop(Node* node,
       ->MarkAsCall();
 }
 
+void InstructionSelector::VisitInt64MulWithOverflow(Node* node) {
+  if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
+    FlagsContinuation cont = FlagsContinuation::ForSet(
+        CpuFeatures::IsSupported(MISC_INSTR_EXT2) ? kOverflow : kNotEqual, ovf);
+    return EmitInt64MulWithOverflow(this, node, &cont);
+  }
+  FlagsContinuation cont;
+  EmitInt64MulWithOverflow(this, node, &cont);
+}
+
 static bool CompareLogical(FlagsContinuation* cont) {
   switch (cont->condition()) {
     case kUnsignedLessThan:
@@ -1901,6 +1931,11 @@ void InstructionSelector::VisitWordCompareZero(Node* user, Node* value,
                 cont->OverwriteAndNegateIfEqual(kOverflow);
                 return VisitWord64BinOp(this, node, kS390_Sub64, SubOperandMode,
                                         cont);
+              case IrOpcode::kInt64MulWithOverflow:
+                cont->OverwriteAndNegateIfEqual(
+                    CpuFeatures::IsSupported(MISC_INSTR_EXT2) ? kOverflow
+                                                              : kNotEqual);
+                return EmitInt64MulWithOverflow(this, node, cont);
 #endif
               default:
                 break;
diff --git a/deps/v8/src/compiler/backend/s390/unwinding-info-writer-s390.h b/deps/v8/src/compiler/backend/s390/unwinding-info-writer-s390.h
index 2202c285957cf8..7c472723c488ea 100644
--- a/deps/v8/src/compiler/backend/s390/unwinding-info-writer-s390.h
+++ b/deps/v8/src/compiler/backend/s390/unwinding-info-writer-s390.h
@@ -49,7 +49,7 @@ class UnwindingInfoWriter {
   }
 
  private:
-  bool enabled() const { return FLAG_perf_prof_unwinding_info; }
+  bool enabled() const { return v8_flags.perf_prof_unwinding_info; }
 
   class BlockInitialState : public ZoneObject {
    public:
diff --git a/deps/v8/src/compiler/backend/spill-placer.cc b/deps/v8/src/compiler/backend/spill-placer.cc
index 01d130ff596c76..5cf4861577d0d7 100644
--- a/deps/v8/src/compiler/backend/spill-placer.cc
+++ b/deps/v8/src/compiler/backend/spill-placer.cc
@@ -45,7 +45,7 @@ void SpillPlacer::Add(TopLevelLiveRange* range) {
   //   increasing the code size for no benefit.
   if (range->GetSpillMoveInsertionLocations(data()) == nullptr ||
       range->spilled() || top_start_block->IsDeferred() ||
-      (!FLAG_stress_turbo_late_spilling && !range->is_loop_phi())) {
+      (!v8_flags.stress_turbo_late_spilling && !range->is_loop_phi())) {
     range->CommitSpillMoves(data(), spill_operand);
     return;
   }
diff --git a/deps/v8/src/compiler/backend/unwinding-info-writer.h b/deps/v8/src/compiler/backend/unwinding-info-writer.h
index ecc9658d33ea2f..446bd82f57350c 100644
--- a/deps/v8/src/compiler/backend/unwinding-info-writer.h
+++ b/deps/v8/src/compiler/backend/unwinding-info-writer.h
@@ -33,7 +33,7 @@ namespace compiler {
 
 class InstructionBlock;
 
-static_assert(!FLAG_perf_prof_unwinding_info.value(),
+static_assert(!v8_flags.perf_prof_unwinding_info.value(),
               "--perf-prof-unwinding-info should be statically disabled if not "
               "supported");
 
diff --git a/deps/v8/src/compiler/backend/x64/code-generator-x64.cc b/deps/v8/src/compiler/backend/x64/code-generator-x64.cc
index 7d66748d13b512..6a29cb308e593a 100644
--- a/deps/v8/src/compiler/backend/x64/code-generator-x64.cc
+++ b/deps/v8/src/compiler/backend/x64/code-generator-x64.cc
@@ -481,7 +481,7 @@ class WasmProtectedInstructionTrap final : public WasmOutOfLineTrap {
       : WasmOutOfLineTrap(gen, instr), pc_(pc) {}
 
   void Generate() final {
-    DCHECK(FLAG_wasm_bounds_checks && !FLAG_wasm_enforce_bounds_checks);
+    DCHECK(v8_flags.wasm_bounds_checks && !v8_flags.wasm_enforce_bounds_checks);
     gen_->AddProtectedInstructionLanding(pc_, __ pc_offset());
     GenerateWithTrapId(TrapId::kTrapMemOutOfBounds);
   }
@@ -789,7 +789,41 @@ void EmitTSANRelaxedLoadOOLIfNeeded(Zone* zone, CodeGenerator* codegen,
     }                                                            \
   } while (false)
 
-#define ASSEMBLE_COMPARE(asm_instr)                              \
+#define ASSEMBLE_COMPARE(cmp_instr, test_instr)                     \
+  do {                                                              \
+    if (HasAddressingMode(instr)) {                                 \
+      size_t index = 0;                                             \
+      Operand left = i.MemoryOperand(&index);                       \
+      if (HasImmediateInput(instr, index)) {                        \
+        __ cmp_instr(left, i.InputImmediate(index));                \
+      } else {                                                      \
+        __ cmp_instr(left, i.InputRegister(index));                 \
+      }                                                             \
+    } else {                                                        \
+      if (HasImmediateInput(instr, 1)) {                            \
+        Immediate right = i.InputImmediate(1);                      \
+        if (HasRegisterInput(instr, 0)) {                           \
+          if (right.value() == 0 &&                                 \
+              (FlagsConditionField::decode(opcode) == kEqual ||     \
+               FlagsConditionField::decode(opcode) == kNotEqual)) { \
+            __ test_instr(i.InputRegister(0), i.InputRegister(0));  \
+          } else {                                                  \
+            __ cmp_instr(i.InputRegister(0), right);                \
+          }                                                         \
+        } else {                                                    \
+          __ cmp_instr(i.InputOperand(0), right);                   \
+        }                                                           \
+      } else {                                                      \
+        if (HasRegisterInput(instr, 1)) {                           \
+          __ cmp_instr(i.InputRegister(0), i.InputRegister(1));     \
+        } else {                                                    \
+          __ cmp_instr(i.InputRegister(0), i.InputOperand(1));      \
+        }                                                           \
+      }                                                             \
+    }                                                               \
+  } while (false)
+
+#define ASSEMBLE_TEST(asm_instr)                                 \
   do {                                                           \
     if (HasAddressingMode(instr)) {                              \
       size_t index = 0;                                          \
@@ -1318,7 +1352,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
     }
     case kArchCallJSFunction: {
       Register func = i.InputRegister(0);
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Check the function's context matches the context argument.
         __ cmp_tagged(rsi, FieldOperand(func, JSFunction::kContextOffset));
         __ Assert(equal, AbortReason::kWrongFunctionContext);
@@ -1515,7 +1549,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       Register scratch0 = i.TempRegister(0);
       Register scratch1 = i.TempRegister(1);
 
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         // Checking that |value| is not a cleared weakref: our write barrier
         // does not support that for now.
         __ Cmp(value, kClearedWeakHeapObjectLower32);
@@ -1639,28 +1673,28 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
       ASSEMBLE_BINOP(andq);
       break;
     case kX64Cmp8:
-      ASSEMBLE_COMPARE(cmpb);
+      ASSEMBLE_COMPARE(cmpb, testb);
       break;
     case kX64Cmp16:
-      ASSEMBLE_COMPARE(cmpw);
+      ASSEMBLE_COMPARE(cmpw, testw);
       break;
     case kX64Cmp32:
-      ASSEMBLE_COMPARE(cmpl);
+      ASSEMBLE_COMPARE(cmpl, testl);
       break;
     case kX64Cmp:
-      ASSEMBLE_COMPARE(cmpq);
+      ASSEMBLE_COMPARE(cmpq, testq);
       break;
     case kX64Test8:
-      ASSEMBLE_COMPARE(testb);
+      ASSEMBLE_TEST(testb);
       break;
     case kX64Test16:
-      ASSEMBLE_COMPARE(testw);
+      ASSEMBLE_TEST(testw);
       break;
     case kX64Test32:
-      ASSEMBLE_COMPARE(testl);
+      ASSEMBLE_TEST(testl);
       break;
     case kX64Test:
-      ASSEMBLE_COMPARE(testq);
+      ASSEMBLE_TEST(testq);
       break;
     case kX64Imul32:
       ASSEMBLE_MULT(imull);
@@ -1682,6 +1716,20 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
         __ mull(i.InputOperand(1));
       }
       break;
+    case kX64ImulHigh64:
+      if (HasRegisterInput(instr, 1)) {
+        __ imulq(i.InputRegister(1));
+      } else {
+        __ imulq(i.InputOperand(1));
+      }
+      break;
+    case kX64UmulHigh64:
+      if (HasRegisterInput(instr, 1)) {
+        __ mulq(i.InputRegister(1));
+      } else {
+        __ mulq(i.InputOperand(1));
+      }
+      break;
     case kX64Idiv32:
       __ cdq();
       __ idivl(i.InputRegister(1));
@@ -4605,7 +4653,7 @@ void CodeGenerator::AssembleArchDeoptBranch(Instruction* instr,
   }
   __ j(FlagsConditionToCondition(branch->condition), tlabel);
 
-  if (FLAG_deopt_every_n_times > 0) {
+  if (v8_flags.deopt_every_n_times > 0) {
     ExternalReference counter =
         ExternalReference::stress_deopt_count(isolate());
 
@@ -4615,7 +4663,7 @@ void CodeGenerator::AssembleArchDeoptBranch(Instruction* instr,
     __ decl(rax);
     __ j(not_zero, &nodeopt, Label::kNear);
 
-    __ Move(rax, FLAG_deopt_every_n_times);
+    __ Move(rax, v8_flags.deopt_every_n_times);
     __ store_rax(counter);
     __ popq(rax);
     __ popfq();
@@ -4840,7 +4888,7 @@ void CodeGenerator::AssembleConstructFrame() {
       // If the frame is bigger than the stack, we throw the stack overflow
       // exception unconditionally. Thereby we can avoid the integer overflow
       // check in the condition code.
-      if (required_slots * kSystemPointerSize < FLAG_stack_size * KB) {
+      if (required_slots * kSystemPointerSize < v8_flags.stack_size * KB) {
         __ movq(kScratchRegister,
                 FieldOperand(kWasmInstanceRegister,
                              WasmInstanceObject::kRealStackLimitAddressOffset));
@@ -4934,7 +4982,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
   if (parameter_slots != 0) {
     if (additional_pop_count->IsImmediate()) {
       DCHECK_EQ(g.ToConstant(additional_pop_count).ToInt32(), 0);
-    } else if (FLAG_debug_code) {
+    } else if (v8_flags.debug_code) {
       __ cmpq(g.ToRegister(additional_pop_count), Immediate(0));
       __ Assert(equal, AbortReason::kUnexpectedAdditionalPopValue);
     }
@@ -5015,7 +5063,7 @@ void CodeGenerator::PrepareForDeoptimizationExits(
 
 void CodeGenerator::IncrementStackAccessCounter(
     InstructionOperand* source, InstructionOperand* destination) {
-  DCHECK(FLAG_trace_turbo_stack_accesses);
+  DCHECK(v8_flags.trace_turbo_stack_accesses);
   if (!info()->IsOptimizing()) {
 #if V8_ENABLE_WEBASSEMBLY
     if (!info()->IsWasm()) return;
@@ -5203,7 +5251,7 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
     __ movq(dst, kScratchRegister);
   };
 
-  if (FLAG_trace_turbo_stack_accesses) {
+  if (v8_flags.trace_turbo_stack_accesses) {
     IncrementStackAccessCounter(source, destination);
   }
 
@@ -5322,7 +5370,7 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
 
 void CodeGenerator::AssembleSwap(InstructionOperand* source,
                                  InstructionOperand* destination) {
-  if (FLAG_trace_turbo_stack_accesses) {
+  if (v8_flags.trace_turbo_stack_accesses) {
     IncrementStackAccessCounter(source, destination);
     IncrementStackAccessCounter(destination, source);
   }
diff --git a/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h b/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h
index ed69ab876199e3..173a16316cb171 100644
--- a/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h
+++ b/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h
@@ -81,7 +81,9 @@ namespace compiler {
   V(X64Imul)                                         \
   V(X64Imul32)                                       \
   V(X64ImulHigh32)                                   \
+  V(X64ImulHigh64)                                   \
   V(X64UmulHigh32)                                   \
+  V(X64UmulHigh64)                                   \
   V(X64Idiv)                                         \
   V(X64Idiv32)                                       \
   V(X64Udiv)                                         \
diff --git a/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc b/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc
index f50fc8f9dcf358..8bbb7e2519e232 100644
--- a/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc
+++ b/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc
@@ -37,6 +37,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
     case kX64Imul32:
     case kX64ImulHigh32:
     case kX64UmulHigh32:
+    case kX64ImulHigh64:
+    case kX64UmulHigh64:
     case kX64Not:
     case kX64Not32:
     case kX64Neg:
@@ -458,6 +460,8 @@ int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
     case kX64Imul32:
     case kX64ImulHigh32:
     case kX64UmulHigh32:
+    case kX64ImulHigh64:
+    case kX64UmulHigh64:
     case kX64Float32Abs:
     case kX64Float32Neg:
     case kX64Float64Abs:
diff --git a/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc b/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc
index 74f38608ef3d39..0da7336254b34d 100644
--- a/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc
+++ b/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc
@@ -339,7 +339,7 @@ ArchOpcode GetLoadOpcode(LoadRepresentation load_rep) {
       break;
     case MachineRepresentation::kSimd256:  // Fall through.
     case MachineRepresentation::kNone:     // Fall through.
-    case MachineRepresentation::kMapWord:
+    case MachineRepresentation::kMapWord:  // Fall through.
       UNREACHABLE();
   }
   return opcode;
@@ -377,7 +377,7 @@ ArchOpcode GetStoreOpcode(StoreRepresentation store_rep) {
       return kX64Movdqu;
     case MachineRepresentation::kSimd256:  // Fall through.
     case MachineRepresentation::kNone:     // Fall through.
-    case MachineRepresentation::kMapWord:
+    case MachineRepresentation::kMapWord:  // Fall through.
       UNREACHABLE();
   }
   UNREACHABLE();
@@ -597,7 +597,7 @@ void VisitStoreCommon(InstructionSelector* selector, Node* node,
   const bool is_seqcst =
       atomic_order && *atomic_order == AtomicMemoryOrder::kSeqCst;
 
-  if (FLAG_enable_unconditional_write_barriers &&
+  if (v8_flags.enable_unconditional_write_barriers &&
       CanBeTaggedOrCompressedPointer(store_rep.representation())) {
     write_barrier_kind = kFullWriteBarrier;
   }
@@ -606,7 +606,8 @@ void VisitStoreCommon(InstructionSelector* selector, Node* node,
     ? MemoryAccessMode::kMemoryAccessProtected
     : MemoryAccessMode::kMemoryAccessDirect;
 
-  if (write_barrier_kind != kNoWriteBarrier && !FLAG_disable_write_barriers) {
+  if (write_barrier_kind != kNoWriteBarrier &&
+      !v8_flags.disable_write_barriers) {
     DCHECK(CanBeTaggedOrCompressedPointer(store_rep.representation()));
     AddressingMode addressing_mode;
     InstructionOperand inputs[] = {
@@ -1469,10 +1470,23 @@ void InstructionSelector::VisitInt64Mul(Node* node) {
   VisitMul(this, node, kX64Imul);
 }
 
+void InstructionSelector::VisitInt64MulWithOverflow(Node* node) {
+  if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
+    FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
+    return VisitBinop(this, node, kX64Imul, &cont);
+  }
+  FlagsContinuation cont;
+  VisitBinop(this, node, kX64Imul, &cont);
+}
+
 void InstructionSelector::VisitInt32MulHigh(Node* node) {
   VisitMulHigh(this, node, kX64ImulHigh32);
 }
 
+void InstructionSelector::VisitInt64MulHigh(Node* node) {
+  VisitMulHigh(this, node, kX64ImulHigh64);
+}
+
 void InstructionSelector::VisitInt32Div(Node* node) {
   VisitDiv(this, node, kX64Idiv32);
 }
@@ -1509,6 +1523,10 @@ void InstructionSelector::VisitUint32MulHigh(Node* node) {
   VisitMulHigh(this, node, kX64UmulHigh32);
 }
 
+void InstructionSelector::VisitUint64MulHigh(Node* node) {
+  VisitMulHigh(this, node, kX64UmulHigh64);
+}
+
 // TryTruncateFloat32ToInt64 and TryTruncateFloat64ToInt64 operations attempt
 // truncation from 32|64-bit float to 64-bit integer by performing roughly the
 // following steps:
@@ -2828,6 +2846,9 @@ void InstructionSelector::VisitWordCompareZero(Node* user, Node* value,
               case IrOpcode::kInt64SubWithOverflow:
                 cont->OverwriteAndNegateIfEqual(kOverflow);
                 return VisitBinop(this, node, kX64Sub, cont);
+              case IrOpcode::kInt64MulWithOverflow:
+                cont->OverwriteAndNegateIfEqual(kOverflow);
+                return VisitBinop(this, node, kX64Imul, cont);
               default:
                 break;
             }
diff --git a/deps/v8/src/compiler/backend/x64/unwinding-info-writer-x64.h b/deps/v8/src/compiler/backend/x64/unwinding-info-writer-x64.h
index c85ad46a6338d1..188a66f56f79dd 100644
--- a/deps/v8/src/compiler/backend/x64/unwinding-info-writer-x64.h
+++ b/deps/v8/src/compiler/backend/x64/unwinding-info-writer-x64.h
@@ -53,7 +53,7 @@ class UnwindingInfoWriter {
   }
 
  private:
-  bool enabled() const { return FLAG_perf_prof_unwinding_info; }
+  bool enabled() const { return v8_flags.perf_prof_unwinding_info; }
 
   class BlockInitialState : public ZoneObject {
    public:
diff --git a/deps/v8/src/compiler/basic-block-instrumentor.cc b/deps/v8/src/compiler/basic-block-instrumentor.cc
index 2d5a02985ab78c..1e9d0246b6d35b 100644
--- a/deps/v8/src/compiler/basic-block-instrumentor.cc
+++ b/deps/v8/src/compiler/basic-block-instrumentor.cc
@@ -64,7 +64,7 @@ BasicBlockProfilerData* BasicBlockInstrumentor::Instrument(
   // Set the function name.
   data->SetFunctionName(info->GetDebugName());
   // Capture the schedule string before instrumentation.
-  if (FLAG_turbo_profiling_verbose) {
+  if (v8_flags.turbo_profiling_verbose) {
     std::ostringstream os;
     os << *schedule;
     data->SetSchedule(os);
diff --git a/deps/v8/src/compiler/branch-condition-duplicator.cc b/deps/v8/src/compiler/branch-condition-duplicator.cc
index 6b1da58a29b0a6..129270b8e4985e 100644
--- a/deps/v8/src/compiler/branch-condition-duplicator.cc
+++ b/deps/v8/src/compiler/branch-condition-duplicator.cc
@@ -70,7 +70,7 @@ void BranchConditionDuplicator::DuplicateConditionIfNeeded(Node* node) {
   if (!IsBranch(node)) return;
 
   Node* condNode = node->InputAt(0);
-  if (condNode->UseCount() > 1 && CanDuplicate(condNode)) {
+  if (condNode->BranchUseCount() > 1 && CanDuplicate(condNode)) {
     node->ReplaceInput(0, DuplicateNode(condNode));
   }
 }
diff --git a/deps/v8/src/compiler/bytecode-analysis.cc b/deps/v8/src/compiler/bytecode-analysis.cc
index 0b5ee5776775fc..419d4aa1e231d7 100644
--- a/deps/v8/src/compiler/bytecode-analysis.cc
+++ b/deps/v8/src/compiler/bytecode-analysis.cc
@@ -529,6 +529,10 @@ void BytecodeAnalysis::Analyze() {
             ResumeJumpTarget::Leaf(suspend_id, resume_offset));
       }
 
+      if (bytecode == Bytecode::kResumeGenerator) {
+        current_loop_info->mark_resumable();
+      }
+
       // If we've reached the header of the loop, pop it off the stack.
       if (current_offset == current_loop.header_offset) {
         loop_stack_.pop();
@@ -536,6 +540,10 @@ void BytecodeAnalysis::Analyze() {
           // If there is still an outer loop, propagate inner loop assignments.
           LoopInfo* parent_loop_info = loop_stack_.top().loop_info;
 
+          if (current_loop_info->resumable()) {
+            parent_loop_info->mark_resumable();
+          }
+
           parent_loop_info->assignments().Union(
               current_loop_info->assignments());
 
@@ -704,7 +712,7 @@ void BytecodeAnalysis::Analyze() {
   }
 
   DCHECK(analyze_liveness_);
-  if (FLAG_trace_environment_liveness) {
+  if (v8_flags.trace_environment_liveness) {
     StdoutStream of;
     PrintLivenessTo(of);
   }
diff --git a/deps/v8/src/compiler/bytecode-analysis.h b/deps/v8/src/compiler/bytecode-analysis.h
index aa270c6dee9a0f..ab7b66e03fc402 100644
--- a/deps/v8/src/compiler/bytecode-analysis.h
+++ b/deps/v8/src/compiler/bytecode-analysis.h
@@ -73,6 +73,8 @@ struct V8_EXPORT_PRIVATE LoopInfo {
         resume_jump_targets_(zone) {}
 
   int parent_offset() const { return parent_offset_; }
+  bool resumable() const { return resumable_; }
+  void mark_resumable() { resumable_ = true; }
 
   const ZoneVector<ResumeJumpTarget>& resume_jump_targets() const {
     return resume_jump_targets_;
@@ -87,6 +89,7 @@ struct V8_EXPORT_PRIVATE LoopInfo {
  private:
   // The offset to the parent loop, or -1 if there is no parent.
   int parent_offset_;
+  bool resumable_ = false;
   BytecodeLoopAssignments assignments_;
   ZoneVector<ResumeJumpTarget> resume_jump_targets_;
 };
diff --git a/deps/v8/src/compiler/bytecode-graph-builder.cc b/deps/v8/src/compiler/bytecode-graph-builder.cc
index be5a9bca7db3e6..f43199cd37a53f 100644
--- a/deps/v8/src/compiler/bytecode-graph-builder.cc
+++ b/deps/v8/src/compiler/bytecode-graph-builder.cc
@@ -1672,20 +1672,6 @@ void BytecodeGraphBuilder::VisitDefineKeyedOwnPropertyInLiteral() {
   environment()->RecordAfterState(node, Environment::kAttachFrameState);
 }
 
-void BytecodeGraphBuilder::VisitCollectTypeProfile() {
-  PrepareEagerCheckpoint();
-
-  Node* position =
-      jsgraph()->Constant(bytecode_iterator().GetImmediateOperand(0));
-  Node* value = environment()->LookupAccumulator();
-  Node* vector = jsgraph()->Constant(feedback_vector());
-
-  const Operator* op = javascript()->CallRuntime(Runtime::kCollectTypeProfile);
-
-  Node* node = NewNode(op, position, value, vector);
-  environment()->RecordAfterState(node, Environment::kAttachFrameState);
-}
-
 void BytecodeGraphBuilder::VisitLdaContextSlot() {
   const Operator* op = javascript()->LoadContext(
       bytecode_iterator().GetUnsignedImmediateOperand(2),
@@ -3229,9 +3215,18 @@ void BytecodeGraphBuilder::VisitGetSuperConstructor() {
                               Environment::kAttachFrameState);
 }
 
-void BytecodeGraphBuilder::VisitFindNonDefaultConstructor() {
-  // TODO(v8:13091): Implement.
-  CHECK(false);
+void BytecodeGraphBuilder::VisitFindNonDefaultConstructorOrConstruct() {
+  Node* this_function =
+      environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
+  Node* new_target =
+      environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1));
+
+  Node* node = NewNode(javascript()->FindNonDefaultConstructorOrConstruct(),
+                       this_function, new_target);
+
+  environment()->BindRegistersToProjections(
+      bytecode_iterator().GetRegisterOperand(2), node,
+      Environment::kAttachFrameState);
 }
 
 void BytecodeGraphBuilder::BuildCompareOp(const Operator* op) {
diff --git a/deps/v8/src/compiler/code-assembler.cc b/deps/v8/src/compiler/code-assembler.cc
index d07482f24ca48a..7b69cea0272b3f 100644
--- a/deps/v8/src/compiler/code-assembler.cc
+++ b/deps/v8/src/compiler/code-assembler.cc
@@ -501,7 +501,7 @@ void CodeAssembler::Unreachable() {
 }
 
 void CodeAssembler::Comment(std::string str) {
-  if (!FLAG_code_comments) return;
+  if (!v8_flags.code_comments) return;
   raw_assembler()->Comment(str);
 }
 
@@ -1549,7 +1549,7 @@ void CodeAssemblerLabel::Bind(AssemblerDebugInfo debug_info) {
         << "\n#    previous: " << *label_->block();
     FATAL("%s", str.str().c_str());
   }
-  if (FLAG_enable_source_at_csa_bind) {
+  if (v8_flags.enable_source_at_csa_bind) {
     state_->raw_assembler_->SetCurrentExternalSourcePosition(
         {debug_info.file, debug_info.line});
   }
diff --git a/deps/v8/src/compiler/code-assembler.h b/deps/v8/src/compiler/code-assembler.h
index a071b31c602b69..66dbe828536a5e 100644
--- a/deps/v8/src/compiler/code-assembler.h
+++ b/deps/v8/src/compiler/code-assembler.h
@@ -47,6 +47,7 @@ class JSCollator;
 class JSCollection;
 class JSDateTimeFormat;
 class JSDisplayNames;
+class JSDurationFormat;
 class JSListFormat;
 class JSLocale;
 class JSNumberFormat;
@@ -244,9 +245,12 @@ class CodeAssemblerParameterizedLabel;
   V(IntPtrAdd, WordT, WordT, WordT)                                     \
   V(IntPtrSub, WordT, WordT, WordT)                                     \
   V(IntPtrMul, WordT, WordT, WordT)                                     \
+  V(IntPtrMulHigh, IntPtrT, IntPtrT, IntPtrT)                           \
+  V(UintPtrMulHigh, UintPtrT, UintPtrT, UintPtrT)                       \
   V(IntPtrDiv, IntPtrT, IntPtrT, IntPtrT)                               \
   V(IntPtrAddWithOverflow, PAIR_TYPE(IntPtrT, BoolT), IntPtrT, IntPtrT) \
   V(IntPtrSubWithOverflow, PAIR_TYPE(IntPtrT, BoolT), IntPtrT, IntPtrT) \
+  V(IntPtrMulWithOverflow, PAIR_TYPE(IntPtrT, BoolT), IntPtrT, IntPtrT) \
   V(Int32Add, Word32T, Word32T, Word32T)                                \
   V(Int32AddWithOverflow, PAIR_TYPE(Int32T, BoolT), Int32T, Int32T)     \
   V(Int32Sub, Word32T, Word32T, Word32T)                                \
@@ -259,6 +263,8 @@ class CodeAssemblerParameterizedLabel;
   V(Int64Sub, Word64T, Word64T, Word64T)                                \
   V(Int64SubWithOverflow, PAIR_TYPE(Int64T, BoolT), Int64T, Int64T)     \
   V(Int64Mul, Word64T, Word64T, Word64T)                                \
+  V(Int64MulHigh, Int64T, Int64T, Int64T)                               \
+  V(Uint64MulHigh, Uint64T, Uint64T, Uint64T)                           \
   V(Int64Div, Int64T, Int64T, Int64T)                                   \
   V(Int64Mod, Int64T, Int64T, Int64T)                                   \
   V(WordOr, WordT, WordT, WordT)                                        \
@@ -435,7 +441,7 @@ class V8_EXPORT_PRIVATE CodeAssembler {
               !std::is_convertible<TNode<PreviousType>, TNode<A>>::value,
           "Unnecessary CAST: types are convertible.");
 #ifdef DEBUG
-      if (FLAG_debug_code) {
+      if (v8_flags.debug_code) {
         TNode<ExternalReference> function = code_assembler_->ExternalConstant(
             ExternalReference::check_object_type());
         code_assembler_->CallCFunction(
@@ -618,13 +624,13 @@ class V8_EXPORT_PRIVATE CodeAssembler {
   void DebugBreak();
   void Unreachable();
   void Comment(const char* msg) {
-    if (!FLAG_code_comments) return;
+    if (!v8_flags.code_comments) return;
     Comment(std::string(msg));
   }
   void Comment(std::string msg);
   template <class... Args>
   void Comment(Args&&... args) {
-    if (!FLAG_code_comments) return;
+    if (!v8_flags.code_comments) return;
     std::ostringstream s;
     USE((s << std::forward<Args>(args))...);
     Comment(s.str());
diff --git a/deps/v8/src/compiler/compilation-dependencies.cc b/deps/v8/src/compiler/compilation-dependencies.cc
index c356f3b9ac452e..2c219f5d6757aa 100644
--- a/deps/v8/src/compiler/compilation-dependencies.cc
+++ b/deps/v8/src/compiler/compilation-dependencies.cc
@@ -125,7 +125,7 @@ class PendingDependencies final {
   }
 
   void InstallAll(Isolate* isolate, Handle<Code> code) {
-    if (V8_UNLIKELY(FLAG_predictable)) {
+    if (V8_UNLIKELY(v8_flags.predictable)) {
       InstallAllPredictable(isolate, code);
       return;
     }
@@ -140,7 +140,7 @@ class PendingDependencies final {
   }
 
   void InstallAllPredictable(Isolate* isolate, Handle<Code> code) {
-    CHECK(FLAG_predictable);
+    CHECK(v8_flags.predictable);
     // First, guarantee predictable iteration order.
     using HandleAndGroup =
         std::pair<Handle<HeapObject>, DependentCode::DependencyGroups>;
@@ -1065,7 +1065,7 @@ void CompilationDependencies::DependOnConstantInDictionaryPrototypeChain(
 
 AllocationType CompilationDependencies::DependOnPretenureMode(
     const AllocationSiteRef& site) {
-  if (!FLAG_allocation_site_pretenuring) return AllocationType::kYoung;
+  if (!v8_flags.allocation_site_pretenuring) return AllocationType::kYoung;
   AllocationType allocation = site.GetAllocationType();
   RecordDependency(zone_->New<PretenureModeDependency>(site, allocation));
   return allocation;
@@ -1184,7 +1184,7 @@ void CompilationDependencies::DependOnOwnConstantDictionaryProperty(
 
 V8_INLINE void TraceInvalidCompilationDependency(
     const CompilationDependency* d) {
-  DCHECK(FLAG_trace_compilation_dependencies);
+  DCHECK(v8_flags.trace_compilation_dependencies);
   DCHECK(!d->IsValid());
   PrintF("Compilation aborted due to invalid dependency: %s\n", d->ToString());
 }
@@ -1202,7 +1202,7 @@ bool CompilationDependencies::Commit(Handle<Code> code) {
       // can call EnsureHasInitialMap, which can invalidate a
       // StableMapDependency on the prototype object's map.
       if (!dep->IsValid()) {
-        if (FLAG_trace_compilation_dependencies) {
+        if (v8_flags.trace_compilation_dependencies) {
           TraceInvalidCompilationDependency(dep);
         }
         dependencies_.clear();
@@ -1226,7 +1226,7 @@ bool CompilationDependencies::Commit(Handle<Code> code) {
   //    deoptimization.
   // 2. since the function state was deemed consistent above, that means the
   //    compilation saw a self-consistent state of the jsfunction.
-  if (FLAG_stress_gc_during_compilation) {
+  if (v8_flags.stress_gc_during_compilation) {
     broker_->isolate()->heap()->PreciseCollectAllGarbage(
         Heap::kForcedGC, GarbageCollectionReason::kTesting, kNoGCCallbackFlags);
   }
@@ -1242,13 +1242,13 @@ bool CompilationDependencies::Commit(Handle<Code> code) {
 }
 
 bool CompilationDependencies::PrepareInstall() {
-  if (V8_UNLIKELY(FLAG_predictable)) {
+  if (V8_UNLIKELY(v8_flags.predictable)) {
     return PrepareInstallPredictable();
   }
 
   for (auto dep : dependencies_) {
     if (!dep->IsValid()) {
-      if (FLAG_trace_compilation_dependencies) {
+      if (v8_flags.trace_compilation_dependencies) {
         TraceInvalidCompilationDependency(dep);
       }
       dependencies_.clear();
@@ -1260,7 +1260,7 @@ bool CompilationDependencies::PrepareInstall() {
 }
 
 bool CompilationDependencies::PrepareInstallPredictable() {
-  CHECK(FLAG_predictable);
+  CHECK(v8_flags.predictable);
 
   std::vector<const CompilationDependency*> deps(dependencies_.begin(),
                                                  dependencies_.end());
@@ -1268,7 +1268,7 @@ bool CompilationDependencies::PrepareInstallPredictable() {
 
   for (auto dep : deps) {
     if (!dep->IsValid()) {
-      if (FLAG_trace_compilation_dependencies) {
+      if (v8_flags.trace_compilation_dependencies) {
         TraceInvalidCompilationDependency(dep);
       }
       dependencies_.clear();
diff --git a/deps/v8/src/compiler/constant-folding-reducer.cc b/deps/v8/src/compiler/constant-folding-reducer.cc
index c768441d29adc3..5e74ba75352cc3 100644
--- a/deps/v8/src/compiler/constant-folding-reducer.cc
+++ b/deps/v8/src/compiler/constant-folding-reducer.cc
@@ -42,7 +42,7 @@ Node* TryGetConstant(JSGraph* jsgraph, Node* node) {
 }
 
 bool IsAlreadyBeingFolded(Node* node) {
-  DCHECK(FLAG_assert_types);
+  DCHECK(v8_flags.assert_types);
   if (node->opcode() == IrOpcode::kFoldConstant) return true;
   for (Edge edge : node->use_edges()) {
     if (NodeProperties::IsValueEdge(edge) &&
@@ -70,7 +70,7 @@ Reduction ConstantFoldingReducer::Reduce(Node* node) {
     Node* constant = TryGetConstant(jsgraph(), node);
     if (constant != nullptr) {
       DCHECK(NodeProperties::IsTyped(constant));
-      if (!FLAG_assert_types) {
+      if (!v8_flags.assert_types) {
         DCHECK_EQ(node->op()->ControlOutputCount(), 0);
         ReplaceWithValue(node, constant);
         return Replace(constant);
diff --git a/deps/v8/src/compiler/control-equivalence.cc b/deps/v8/src/compiler/control-equivalence.cc
index 4649cf0d6be98f..f1708139626769 100644
--- a/deps/v8/src/compiler/control-equivalence.cc
+++ b/deps/v8/src/compiler/control-equivalence.cc
@@ -5,9 +5,9 @@
 #include "src/compiler/control-equivalence.h"
 #include "src/compiler/node-properties.h"
 
-#define TRACE(...)                                 \
-  do {                                             \
-    if (FLAG_trace_turbo_ceq) PrintF(__VA_ARGS__); \
+#define TRACE(...)                                     \
+  do {                                                 \
+    if (v8_flags.trace_turbo_ceq) PrintF(__VA_ARGS__); \
   } while (false)
 
 namespace v8 {
@@ -219,7 +219,7 @@ void ControlEquivalence::BracketListDelete(BracketList& blist, Node* to,
 
 
 void ControlEquivalence::BracketListTRACE(BracketList& blist) {
-  if (FLAG_trace_turbo_ceq) {
+  if (v8_flags.trace_turbo_ceq) {
     TRACE("  BList: ");
     for (Bracket bracket : blist) {
       TRACE("{%d->%d} ", bracket.from->id(), bracket.to->id());
diff --git a/deps/v8/src/compiler/csa-load-elimination.cc b/deps/v8/src/compiler/csa-load-elimination.cc
index 4cfce6fa5111f8..43f5572e78cbae 100644
--- a/deps/v8/src/compiler/csa-load-elimination.cc
+++ b/deps/v8/src/compiler/csa-load-elimination.cc
@@ -14,7 +14,7 @@ namespace internal {
 namespace compiler {
 
 Reduction CsaLoadElimination::Reduce(Node* node) {
-  if (FLAG_trace_turbo_load_elimination) {
+  if (v8_flags.trace_turbo_load_elimination) {
     if (node->op()->EffectInputCount() > 0) {
       PrintF(" visit #%d:%s", node->id(), node->op()->mnemonic());
       if (node->op()->ValueInputCount() > 0) {
diff --git a/deps/v8/src/compiler/effect-control-linearizer.cc b/deps/v8/src/compiler/effect-control-linearizer.cc
index d2495727506707..db0504f1f3ac2a 100644
--- a/deps/v8/src/compiler/effect-control-linearizer.cc
+++ b/deps/v8/src/compiler/effect-control-linearizer.cc
@@ -84,6 +84,7 @@ class EffectControlLinearizer {
   Node* LowerCheckReceiverOrNullOrUndefined(Node* node, Node* frame_state);
   Node* LowerCheckString(Node* node, Node* frame_state);
   Node* LowerCheckBigInt(Node* node, Node* frame_state);
+  Node* LowerCheckBigInt64(Node* node, Node* frame_state);
   Node* LowerCheckSymbol(Node* node, Node* frame_state);
   void LowerCheckIf(Node* node, Node* frame_state);
   Node* LowerCheckedInt32Add(Node* node, Node* frame_state);
@@ -93,6 +94,7 @@ class EffectControlLinearizer {
   Node* LowerCheckedUint32Div(Node* node, Node* frame_state);
   Node* LowerCheckedUint32Mod(Node* node, Node* frame_state);
   Node* LowerCheckedInt32Mul(Node* node, Node* frame_state);
+  Node* LowerCheckedBigInt64Add(Node* node, Node* frame_state);
   Node* LowerCheckedInt32ToTaggedSigned(Node* node, Node* frame_state);
   Node* LowerCheckedInt64ToInt32(Node* node, Node* frame_state);
   Node* LowerCheckedInt64ToTaggedSigned(Node* node, Node* frame_state);
@@ -101,6 +103,7 @@ class EffectControlLinearizer {
   Node* LowerCheckedUint32ToTaggedSigned(Node* node, Node* frame_state);
   Node* LowerCheckedUint64Bounds(Node* node, Node* frame_state);
   Node* LowerCheckedUint64ToInt32(Node* node, Node* frame_state);
+  Node* LowerCheckedUint64ToInt64(Node* node, Node* frame_state);
   Node* LowerCheckedUint64ToTaggedSigned(Node* node, Node* frame_state);
   Node* LowerCheckedFloat64ToInt32(Node* node, Node* frame_state);
   Node* LowerCheckedFloat64ToInt64(Node* node, Node* frame_state);
@@ -198,6 +201,7 @@ class EffectControlLinearizer {
                                         GraphAssemblerLabel<0>* bailout);
   Node* AdaptFastCallArgument(Node* node, CTypeInfo arg_type,
                               GraphAssemblerLabel<0>* if_error);
+  Node* ClampFastCallArgument(Node* input, CTypeInfo::Type scalar_type);
 
   struct AdaptOverloadedFastCallResult {
     Node* target_address;
@@ -999,9 +1003,15 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node,
     case IrOpcode::kCheckString:
       result = LowerCheckString(node, frame_state);
       break;
+    case IrOpcode::kCheckedUint64ToInt64:
+      result = LowerCheckedUint64ToInt64(node, frame_state);
+      break;
     case IrOpcode::kCheckBigInt:
       result = LowerCheckBigInt(node, frame_state);
       break;
+    case IrOpcode::kCheckBigInt64:
+      result = LowerCheckBigInt64(node, frame_state);
+      break;
     case IrOpcode::kCheckInternalizedString:
       result = LowerCheckInternalizedString(node, frame_state);
       break;
@@ -1029,6 +1039,9 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node,
     case IrOpcode::kCheckedInt32Mul:
       result = LowerCheckedInt32Mul(node, frame_state);
       break;
+    case IrOpcode::kCheckedBigInt64Add:
+      result = LowerCheckedBigInt64Add(node, frame_state);
+      break;
     case IrOpcode::kCheckedInt32ToTaggedSigned:
       result = LowerCheckedInt32ToTaggedSigned(node, frame_state);
       break;
@@ -2554,6 +2567,18 @@ Node* EffectControlLinearizer::LowerCheckedUint64ToInt32(Node* node,
   return __ TruncateInt64ToInt32(value);
 }
 
+Node* EffectControlLinearizer::LowerCheckedUint64ToInt64(Node* node,
+                                                         Node* frame_state) {
+  Node* value = node->InputAt(0);
+  const CheckParameters& params = CheckParametersOf(node->op());
+
+  Node* check = __ Uint64LessThanOrEqual(
+      value, __ Uint64Constant(std::numeric_limits<int64_t>::max()));
+  __ DeoptimizeIfNot(DeoptimizeReason::kLostPrecision, params.feedback(), check,
+                     frame_state);
+  return value;
+}
+
 Node* EffectControlLinearizer::LowerCheckedUint64ToTaggedSigned(
     Node* node, Node* frame_state) {
   Node* value = node->InputAt(0);
@@ -2912,6 +2937,73 @@ Node* EffectControlLinearizer::LowerCheckBigInt(Node* node, Node* frame_state) {
   return value;
 }
 
+Node* EffectControlLinearizer::LowerCheckBigInt64(Node* node,
+                                                  Node* frame_state) {
+  DCHECK(machine()->Is64());
+
+  auto done = __ MakeLabel();
+  auto if_not_zero = __ MakeLabel();
+
+  Node* value = node->InputAt(0);
+  const CheckParameters& params = CheckParametersOf(node->op());
+
+  // Check for Smi.
+  Node* smi_check = ObjectIsSmi(value);
+  __ DeoptimizeIf(DeoptimizeReason::kSmi, params.feedback(), smi_check,
+                  frame_state);
+
+  // Check for BigInt.
+  Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
+  Node* bi_check = __ TaggedEqual(value_map, __ BigIntMapConstant());
+  __ DeoptimizeIfNot(DeoptimizeReason::kWrongInstanceType, params.feedback(),
+                     bi_check, frame_state);
+
+  // Check for BigInt64.
+  Node* bitfield = __ LoadField(AccessBuilder::ForBigIntBitfield(), value);
+  __ GotoIfNot(__ Word32Equal(bitfield, __ Int32Constant(0)), &if_not_zero);
+  __ Goto(&done);
+
+  __ Bind(&if_not_zero);
+  {
+    // Length must be 1. Compare it with 2 to avoid a right shift.
+    Node* length =
+        __ Word32And(bitfield, __ Int32Constant(BigInt::LengthBits::kMask));
+    __ DeoptimizeIfNot(
+        DeoptimizeReason::kWrongInstanceType, params.feedback(),
+        __ Word32Equal(length, __ Int32Constant(uint32_t{1}
+                                                << BigInt::LengthBits::kShift)),
+        frame_state);
+
+    Node* lsd =
+        __ LoadField(AccessBuilder::ForBigIntLeastSignificantDigit64(), value);
+    // Accepted small BigInts are in the range [-2^63 + 1, 2^63 - 1].
+    // Excluding -2^63 from the range makes the check simpler and faster.
+    Node* bi64_check = __ Uint64LessThanOrEqual(
+        lsd, __ Int64Constant(std::numeric_limits<int64_t>::max()));
+    __ DeoptimizeIfNot(DeoptimizeReason::kWrongInstanceType, params.feedback(),
+                       bi64_check, frame_state);
+    __ Goto(&done);
+  }
+
+  __ Bind(&done);
+  return value;
+}
+
+Node* EffectControlLinearizer::LowerCheckedBigInt64Add(Node* node,
+                                                       Node* frame_state) {
+  DCHECK(machine()->Is64());
+
+  Node* lhs = node->InputAt(0);
+  Node* rhs = node->InputAt(1);
+
+  Node* value = __ Int64AddWithOverflow(lhs, rhs);
+
+  Node* check = __ Projection(1, value);
+  __ DeoptimizeIf(DeoptimizeReason::kOverflow, FeedbackSource(), check,
+                  frame_state);
+  return __ Projection(0, value);
+}
+
 Node* EffectControlLinearizer::LowerChangeInt64ToBigInt(Node* node) {
   DCHECK(machine()->Is64());
 
@@ -5010,14 +5102,112 @@ Node* EffectControlLinearizer::AdaptFastCallTypedArrayArgument(
   return stack_slot;
 }
 
+Node* EffectControlLinearizer::ClampFastCallArgument(
+    Node* input, CTypeInfo::Type scalar_type) {
+  Node* min = nullptr;
+  Node* max = nullptr;
+  switch (scalar_type) {
+    case CTypeInfo::Type::kInt32:
+      min = __ Float64Constant(std::numeric_limits<int32_t>::min());
+      max = __ Float64Constant(std::numeric_limits<int32_t>::max());
+      break;
+    case CTypeInfo::Type::kUint32:
+      min = __ Float64Constant(0);
+      max = __ Float64Constant(std::numeric_limits<uint32_t>::max());
+      break;
+    case CTypeInfo::Type::kInt64:
+      min = __ Float64Constant(kMinSafeInteger);
+      max = __ Float64Constant(kMaxSafeInteger);
+      break;
+    case CTypeInfo::Type::kUint64:
+      min = __ Float64Constant(0);
+      max = __ Float64Constant(kMaxSafeInteger);
+      break;
+    default:
+      UNREACHABLE();
+  }
+  CHECK_NOT_NULL(min);
+  CHECK_NOT_NULL(max);
+
+  Node* clamped = graph()->NewNode(
+      common()->Select(MachineRepresentation::kFloat64),
+      graph()->NewNode(machine()->Float64LessThan(), min, input),
+      graph()->NewNode(
+          common()->Select(MachineRepresentation::kFloat64),
+          graph()->NewNode(machine()->Float64LessThan(), input, max), input,
+          max),
+      min);
+
+  Node* rounded = graph()->NewNode(
+      machine()->Float64RoundTiesEven().placeholder(), clamped);
+
+  auto if_zero = __ MakeDeferredLabel();
+  auto if_zero_or_nan = __ MakeDeferredLabel();
+  auto check_done = __ MakeLabel();
+  auto check_for_nan = __ MakeLabel();
+  auto done = __ MakeLabel(MachineRepresentation::kWord64);
+
+  Node* check_is_zero = __ Float64Equal(rounded, __ Float64Constant(0));
+  __ Branch(check_is_zero, &check_for_nan, &check_done);
+
+  // Check if {rounded} is NaN.
+  __ Bind(&check_for_nan);
+  Node* diff = __ Float64Equal(rounded, rounded);
+  Node* check_is_nan = __ Word32Equal(diff, __ Int32Constant(0));
+  __ Branch(check_is_nan, &if_zero_or_nan, &check_done);
+
+  __ Bind(&if_zero_or_nan);
+  {
+    switch (scalar_type) {
+      case CTypeInfo::Type::kInt32:
+        __ Goto(&done, __ Int32Constant(0));
+        break;
+      case CTypeInfo::Type::kUint32:
+        __ Goto(&done, __ Uint32Constant(0));
+        break;
+      case CTypeInfo::Type::kInt64:
+        __ Goto(&done, __ Int64Constant(0));
+        break;
+      case CTypeInfo::Type::kUint64:
+        __ Goto(&done, __ Uint64Constant(0));
+        break;
+      default:
+        UNREACHABLE();
+    }
+  }
+
+  __ Bind(&check_done);
+  {
+    switch (scalar_type) {
+      case CTypeInfo::Type::kInt32:
+        __ Goto(&done, __ ChangeFloat64ToInt32(rounded));
+        break;
+      case CTypeInfo::Type::kUint32:
+        __ Goto(&done, __ ChangeFloat64ToUint32(rounded));
+        break;
+      case CTypeInfo::Type::kInt64:
+        __ Goto(&done, __ ChangeFloat64ToInt64(rounded));
+        break;
+      case CTypeInfo::Type::kUint64:
+        __ Goto(&done, __ ChangeFloat64ToUint64(rounded));
+        break;
+      default:
+        UNREACHABLE();
+    }
+  }
+
+  __ Bind(&done);
+  return done.PhiAt(0);
+}
+
 Node* EffectControlLinearizer::AdaptFastCallArgument(
     Node* node, CTypeInfo arg_type, GraphAssemblerLabel<0>* if_error) {
   int kAlign = alignof(uintptr_t);
   int kSize = sizeof(uintptr_t);
   switch (arg_type.GetSequenceType()) {
     case CTypeInfo::SequenceType::kScalar: {
-      if (uint8_t(arg_type.GetFlags()) &
-          uint8_t(CTypeInfo::Flags::kEnforceRangeBit)) {
+      uint8_t flags = uint8_t(arg_type.GetFlags());
+      if (flags & uint8_t(CTypeInfo::Flags::kEnforceRangeBit)) {
         Node* truncation;
         switch (arg_type.GetType()) {
           case CTypeInfo::Type::kInt32:
@@ -5037,9 +5227,12 @@ Node* EffectControlLinearizer::AdaptFastCallArgument(
             __ GotoIfNot(__ Projection(1, truncation), if_error);
             return __ Projection(0, truncation);
           default: {
+            __ Goto(if_error);
             return node;
           }
         }
+      } else if (flags & uint8_t(CTypeInfo::Flags::kClampBit)) {
+        return ClampFastCallArgument(node, arg_type.GetType());
       } else {
         switch (arg_type.GetType()) {
           case CTypeInfo::Type::kV8Value: {
@@ -5294,6 +5487,8 @@ Node* EffectControlLinearizer::LowerLoadFieldByIndex(Node* node) {
 
   auto if_double = __ MakeDeferredLabel();
   auto done = __ MakeLabel(MachineRepresentation::kTagged);
+  auto loaded_field = __ MakeLabel(MachineRepresentation::kTagged);
+  auto done_double = __ MakeLabel(MachineRepresentation::kFloat64);
 
   // Check if field is a mutable double field.
   __ GotoIfNot(__ IntPtrEqual(__ WordAnd(index, one), zero), &if_double);
@@ -5310,8 +5505,8 @@ Node* EffectControlLinearizer::LowerLoadFieldByIndex(Node* node) {
       Node* offset =
           __ IntAdd(__ WordShl(index, __ IntPtrConstant(kTaggedSizeLog2 - 1)),
                     __ IntPtrConstant(JSObject::kHeaderSize - kHeapObjectTag));
-      Node* result = __ Load(MachineType::AnyTagged(), object, offset);
-      __ Goto(&done, result);
+      Node* field = __ Load(MachineType::AnyTagged(), object, offset);
+      __ Goto(&loaded_field, field);
     }
 
     // The field is located in the properties backing store of {object}.
@@ -5325,8 +5520,8 @@ Node* EffectControlLinearizer::LowerLoadFieldByIndex(Node* node) {
                                __ IntPtrConstant(kTaggedSizeLog2 - 1)),
                     __ IntPtrConstant((FixedArray::kHeaderSize - kTaggedSize) -
                                       kHeapObjectTag));
-      Node* result = __ Load(MachineType::AnyTagged(), properties, offset);
-      __ Goto(&done, result);
+      Node* field = __ Load(MachineType::AnyTagged(), properties, offset);
+      __ Goto(&loaded_field, field);
     }
   }
 
@@ -5334,9 +5529,6 @@ Node* EffectControlLinearizer::LowerLoadFieldByIndex(Node* node) {
   // architectures, or a mutable HeapNumber.
   __ Bind(&if_double);
   {
-    auto loaded_field = __ MakeLabel(MachineRepresentation::kTagged);
-    auto done_double = __ MakeLabel(MachineRepresentation::kFloat64);
-
     index = __ WordSar(index, one);
 
     // Check if field is in-object or out-of-object.
@@ -5364,27 +5556,27 @@ Node* EffectControlLinearizer::LowerLoadFieldByIndex(Node* node) {
       Node* field = __ Load(MachineType::AnyTagged(), properties, offset);
       __ Goto(&loaded_field, field);
     }
+  }
 
-    __ Bind(&loaded_field);
-    {
-      Node* field = loaded_field.PhiAt(0);
-      // We may have transitioned in-place away from double, so check that
-      // this is a HeapNumber -- otherwise the load is fine and we don't need
-      // to copy anything anyway.
-      __ GotoIf(ObjectIsSmi(field), &done, field);
-      Node* field_map = __ LoadField(AccessBuilder::ForMap(), field);
-      __ GotoIfNot(__ TaggedEqual(field_map, __ HeapNumberMapConstant()), &done,
-                   field);
-
-      Node* value = __ LoadField(AccessBuilder::ForHeapNumberValue(), field);
-      __ Goto(&done_double, value);
-    }
+  __ Bind(&loaded_field);
+  {
+    Node* field = loaded_field.PhiAt(0);
+    // We may have transitioned in-place away from double, so check that
+    // this is a HeapNumber -- otherwise the load is fine and we don't need
+    // to copy anything anyway.
+    __ GotoIf(ObjectIsSmi(field), &done, field);
+    Node* field_map = __ LoadField(AccessBuilder::ForMap(), field);
+    __ GotoIfNot(__ TaggedEqual(field_map, __ HeapNumberMapConstant()), &done,
+                 field);
 
-    __ Bind(&done_double);
-    {
-      Node* result = AllocateHeapNumberWithValue(done_double.PhiAt(0));
-      __ Goto(&done, result);
-    }
+    Node* value = __ LoadField(AccessBuilder::ForHeapNumberValue(), field);
+    __ Goto(&done_double, value);
+  }
+
+  __ Bind(&done_double);
+  {
+    Node* result = AllocateHeapNumberWithValue(done_double.PhiAt(0));
+    __ Goto(&done, result);
   }
 
   __ Bind(&done);
diff --git a/deps/v8/src/compiler/escape-analysis-reducer.cc b/deps/v8/src/compiler/escape-analysis-reducer.cc
index d0e705610b3bad..9f760f2c0b268d 100644
--- a/deps/v8/src/compiler/escape-analysis-reducer.cc
+++ b/deps/v8/src/compiler/escape-analysis-reducer.cc
@@ -15,9 +15,9 @@ namespace internal {
 namespace compiler {
 
 #ifdef DEBUG
-#define TRACE(...)                                    \
-  do {                                                \
-    if (FLAG_trace_turbo_escape) PrintF(__VA_ARGS__); \
+#define TRACE(...)                                        \
+  do {                                                    \
+    if (v8_flags.trace_turbo_escape) PrintF(__VA_ARGS__); \
   } while (false)
 #else
 #define TRACE(...)
diff --git a/deps/v8/src/compiler/escape-analysis.cc b/deps/v8/src/compiler/escape-analysis.cc
index 94e5c86f97fefe..ab22f6d7484be3 100644
--- a/deps/v8/src/compiler/escape-analysis.cc
+++ b/deps/v8/src/compiler/escape-analysis.cc
@@ -14,9 +14,9 @@
 #include "src/objects/map-inl.h"
 
 #ifdef DEBUG
-#define TRACE(...)                                    \
-  do {                                                \
-    if (FLAG_trace_turbo_escape) PrintF(__VA_ARGS__); \
+#define TRACE(...)                                        \
+  do {                                                    \
+    if (v8_flags.trace_turbo_escape) PrintF(__VA_ARGS__); \
   } while (false)
 #else
 #define TRACE(...)
@@ -616,8 +616,11 @@ void ReduceNode(const Operator* op, EscapeAnalysisTracker::Scope* current,
       Node* value = current->ValueInput(1);
       const VirtualObject* vobject = current->GetVirtualObject(object);
       Variable var;
+      // BoundedSize fields cannot currently be materialized by the deoptimizer,
+      // so we must not dematerialze them.
       if (vobject && !vobject->HasEscaped() &&
-          vobject->FieldAt(OffsetOfFieldAccess(op)).To(&var)) {
+          vobject->FieldAt(OffsetOfFieldAccess(op)).To(&var) &&
+          !FieldAccessOf(op).is_bounded_size_access) {
         current->Set(var, value);
         current->MarkForDeletion();
       } else {
diff --git a/deps/v8/src/compiler/fast-api-calls.cc b/deps/v8/src/compiler/fast-api-calls.cc
index 08f9554a6f20d1..02faf86673d4a1 100644
--- a/deps/v8/src/compiler/fast-api-calls.cc
+++ b/deps/v8/src/compiler/fast-api-calls.cc
@@ -175,7 +175,7 @@ Node* FastApiCallBuilder::WrapFastCall(const CallDescriptor* call_descriptor,
       ExternalReference::javascript_execution_assert(isolate()));
   static_assert(sizeof(bool) == 1, "Wrong assumption about boolean size.");
 
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     auto do_store = __ MakeLabel();
     Node* old_scope_value =
         __ Load(MachineType::Int8(), javascript_execution_assert, 0);
diff --git a/deps/v8/src/compiler/feedback-source.h b/deps/v8/src/compiler/feedback-source.h
index 29c22cde9c7776..afa3e6bcb84743 100644
--- a/deps/v8/src/compiler/feedback-source.h
+++ b/deps/v8/src/compiler/feedback-source.h
@@ -43,6 +43,9 @@ bool operator!=(FeedbackSource const&, FeedbackSource const&);
 
 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
                                            FeedbackSource const&);
+inline size_t hash_value(const FeedbackSource& value) {
+  return FeedbackSource::Hash()(value);
+}
 
 }  // namespace compiler
 }  // namespace internal
diff --git a/deps/v8/src/compiler/frame.cc b/deps/v8/src/compiler/frame.cc
index 0f2a2b478b2406..dd4abbd8403234 100644
--- a/deps/v8/src/compiler/frame.cc
+++ b/deps/v8/src/compiler/frame.cc
@@ -46,7 +46,7 @@ void FrameAccessState::MarkHasFrame(bool state) {
 }
 
 void FrameAccessState::SetFrameAccessToDefault() {
-  if (has_frame() && !FLAG_turbo_sp_frame_access) {
+  if (has_frame() && !v8_flags.turbo_sp_frame_access) {
     SetFrameAccessToFP();
   } else {
     SetFrameAccessToSP();
diff --git a/deps/v8/src/compiler/globals.h b/deps/v8/src/compiler/globals.h
index c379ecf20aecf9..a20a0044d96874 100644
--- a/deps/v8/src/compiler/globals.h
+++ b/deps/v8/src/compiler/globals.h
@@ -22,7 +22,7 @@ namespace compiler {
 // TODO(jgruber): Remove once we've made a decision whether to collect feedback
 // unconditionally.
 inline bool CollectFeedbackInGenericLowering() {
-  return FLAG_turbo_collect_feedback_in_generic_lowering;
+  return v8_flags.turbo_collect_feedback_in_generic_lowering;
 }
 
 enum class StackCheckKind : uint8_t {
@@ -50,6 +50,25 @@ inline size_t hash_value(StackCheckKind kind) {
   return static_cast<size_t>(kind);
 }
 
+enum class CheckForMinusZeroMode : uint8_t {
+  kCheckForMinusZero,
+  kDontCheckForMinusZero,
+};
+
+inline size_t hash_value(CheckForMinusZeroMode mode) {
+  return static_cast<size_t>(mode);
+}
+
+inline std::ostream& operator<<(std::ostream& os, CheckForMinusZeroMode mode) {
+  switch (mode) {
+    case CheckForMinusZeroMode::kCheckForMinusZero:
+      return os << "check-for-minus-zero";
+    case CheckForMinusZeroMode::kDontCheckForMinusZero:
+      return os << "dont-check-for-minus-zero";
+  }
+  UNREACHABLE();
+}
+
 // The CallFeedbackRelation provides the meaning of the call feedback for a
 // TurboFan JSCall operator
 // - kReceiver: The call target was Function.prototype.apply and its receiver
@@ -97,4 +116,12 @@ const int kMaxFastLiteralProperties = JSObject::kMaxInObjectProperties;
 #define V8_ENABLE_FP_PARAMS_IN_C_LINKAGE
 #endif
 
+// The biggest double value that fits within the int64_t/uint64_t value range.
+// This is different from safe integer range in that there are gaps of integers
+// in-between that cannot be represented as a double.
+constexpr double kMaxDoubleRepresentableInt64 = 9223372036854774784.0;
+constexpr double kMinDoubleRepresentableInt64 =
+    std::numeric_limits<int64_t>::min();
+constexpr double kMaxDoubleRepresentableUint64 = 18446744073709549568.0;
+
 #endif  // V8_COMPILER_GLOBALS_H_
diff --git a/deps/v8/src/compiler/graph-assembler.cc b/deps/v8/src/compiler/graph-assembler.cc
index 813615d8b855b3..8d032235b7e023 100644
--- a/deps/v8/src/compiler/graph-assembler.cc
+++ b/deps/v8/src/compiler/graph-assembler.cc
@@ -5,6 +5,7 @@
 #include "src/compiler/graph-assembler.h"
 
 #include "src/codegen/callable.h"
+#include "src/compiler/access-builder.h"
 #include "src/compiler/graph-reducer.h"
 #include "src/compiler/linkage.h"
 // For TNode types.
@@ -215,6 +216,10 @@ Node* JSGraphAssembler::Allocate(AllocationType allocation, Node* size) {
                        effect(), control()));
 }
 
+TNode<Map> JSGraphAssembler::LoadMap(TNode<HeapObject> object) {
+  return TNode<Map>::UncheckedCast(LoadField(AccessBuilder::ForMap(), object));
+}
+
 Node* JSGraphAssembler::LoadField(FieldAccess const& access, Node* object) {
   Node* value = AddNode(graph()->NewNode(simplified()->LoadField(access),
                                          object, effect(), control()));
@@ -364,14 +369,14 @@ TNode<Object> JSGraphAssembler::ConvertTaggedHoleToUndefined(
 
 TNode<FixedArrayBase> JSGraphAssembler::MaybeGrowFastElements(
     ElementsKind kind, const FeedbackSource& feedback, TNode<JSArray> array,
-    TNode<FixedArrayBase> elements, TNode<Number> new_length,
+    TNode<FixedArrayBase> elements, TNode<Number> index_needed,
     TNode<Number> old_length) {
   GrowFastElementsMode mode = IsDoubleElementsKind(kind)
                                   ? GrowFastElementsMode::kDoubleElements
                                   : GrowFastElementsMode::kSmiOrObjectElements;
   return AddNode<FixedArrayBase>(graph()->NewNode(
       simplified()->MaybeGrowFastElements(mode, feedback), array, elements,
-      new_length, old_length, effect(), control()));
+      index_needed, old_length, effect(), control()));
 }
 
 Node* JSGraphAssembler::StringCharCodeAt(TNode<String> string,
diff --git a/deps/v8/src/compiler/graph-assembler.h b/deps/v8/src/compiler/graph-assembler.h
index 6dd3e3d7cfad4f..0ace1cf8780df3 100644
--- a/deps/v8/src/compiler/graph-assembler.h
+++ b/deps/v8/src/compiler/graph-assembler.h
@@ -5,6 +5,9 @@
 #ifndef V8_COMPILER_GRAPH_ASSEMBLER_H_
 #define V8_COMPILER_GRAPH_ASSEMBLER_H_
 
+#include <type_traits>
+
+#include "src/base/small-vector.h"
 #include "src/codegen/tnode.h"
 #include "src/compiler/feedback-source.h"
 #include "src/compiler/js-graph.h"
@@ -37,6 +40,7 @@ class Reducer;
   V(ChangeFloat64ToInt32)                \
   V(ChangeFloat64ToInt64)                \
   V(ChangeFloat64ToUint32)               \
+  V(ChangeFloat64ToUint64)               \
   V(ChangeInt32ToFloat64)                \
   V(ChangeInt32ToInt64)                  \
   V(ChangeInt64ToFloat64)                \
@@ -110,6 +114,7 @@ class Reducer;
 
 #define CHECKED_ASSEMBLER_MACH_BINOP_LIST(V) \
   V(Int32AddWithOverflow)                    \
+  V(Int64AddWithOverflow)                    \
   V(Int32Div)                                \
   V(Int32Mod)                                \
   V(Int32MulWithOverflow)                    \
@@ -150,10 +155,44 @@ class GraphAssembler;
 
 enum class GraphAssemblerLabelType { kDeferred, kNonDeferred, kLoop };
 
+namespace detail {
+constexpr size_t kGraphAssemblerLabelDynamicCount = ~0u;
+
+template <size_t VarCount>
+struct GraphAssemblerHelper {
+  template <typename T>
+  using Array = std::array<T, VarCount>;
+  static constexpr bool kIsDynamic = false;
+
+  static Array<Node*> InitNodeArray(const Array<MachineRepresentation>& reps) {
+    return {};
+  }
+};
+template <>
+struct GraphAssemblerHelper<kGraphAssemblerLabelDynamicCount> {
+  // TODO(leszeks): We could allow other sizes of small vector here, by encoding
+  // the size in the negative VarCount.
+  template <typename T>
+  using Array = base::SmallVector<T, 4>;
+  static constexpr bool kIsDynamic = true;
+
+  static Array<Node*> InitNodeArray(const Array<MachineRepresentation>& reps) {
+    return Array<Node*>(reps.size());
+  }
+};
+}  // namespace detail
+
 // Label with statically known count of incoming branches and phis.
 template <size_t VarCount>
 class GraphAssemblerLabel {
+  using Helper = detail::GraphAssemblerHelper<VarCount>;
+  template <typename T>
+  using Array = typename Helper::template Array<T>;
+  static constexpr bool kIsDynamic = Helper::kIsDynamic;
+
  public:
+  size_t Count() { return representations_.size(); }
+
   Node* PhiAt(size_t index);
 
   template <typename T>
@@ -166,10 +205,11 @@ class GraphAssemblerLabel {
   bool IsUsed() const { return merged_count_ > 0; }
 
   GraphAssemblerLabel(GraphAssemblerLabelType type, int loop_nesting_level,
-                      const std::array<MachineRepresentation, VarCount>& reps)
+                      Array<MachineRepresentation> reps)
       : type_(type),
         loop_nesting_level_(loop_nesting_level),
-        representations_(reps) {}
+        bindings_(Helper::InitNodeArray(reps)),
+        representations_(std::move(reps)) {}
 
   ~GraphAssemblerLabel() { DCHECK(IsBound() || merged_count_ == 0); }
 
@@ -192,10 +232,43 @@ class GraphAssemblerLabel {
   size_t merged_count_ = 0;
   Node* effect_;
   Node* control_;
-  std::array<Node*, VarCount> bindings_;
-  const std::array<MachineRepresentation, VarCount> representations_;
+  Array<Node*> bindings_;
+  const Array<MachineRepresentation> representations_;
 };
 
+using GraphAssemblerDynamicLabel =
+    GraphAssemblerLabel<detail::kGraphAssemblerLabelDynamicCount>;
+
+namespace detail {
+template <typename T, typename Enable, typename... Us>
+struct GraphAssemblerLabelForXHelper;
+
+// If the Us are a template pack each assignable to T, use a static label.
+template <typename T, typename... Us>
+struct GraphAssemblerLabelForXHelper<
+    T, std::enable_if_t<std::conjunction_v<std::is_assignable<T&, Us>...>>,
+    Us...> {
+  using Type = GraphAssemblerLabel<sizeof...(Us)>;
+};
+
+// If the single arg is a vector of U assignable to T, use a dynamic label.
+template <typename T, typename U>
+struct GraphAssemblerLabelForXHelper<
+    T, std::enable_if_t<std::is_assignable_v<T&, U>>, base::SmallVector<U, 4>> {
+  using Type = GraphAssemblerDynamicLabel;
+};
+
+template <typename... Vars>
+using GraphAssemblerLabelForVars =
+    typename GraphAssemblerLabelForXHelper<Node*, void, Vars...>::Type;
+
+template <typename... Reps>
+using GraphAssemblerLabelForReps =
+    typename GraphAssemblerLabelForXHelper<MachineRepresentation, void,
+                                           Reps...>::Type;
+
+}  // namespace detail
+
 using NodeChangedCallback = std::function<void(Node*)>;
 class V8_EXPORT_PRIVATE GraphAssembler {
  public:
@@ -212,35 +285,34 @@ class V8_EXPORT_PRIVATE GraphAssembler {
 
   // Create label.
   template <typename... Reps>
-  GraphAssemblerLabel<sizeof...(Reps)> MakeLabelFor(
+  detail::GraphAssemblerLabelForReps<Reps...> MakeLabelFor(
       GraphAssemblerLabelType type, Reps... reps) {
     std::array<MachineRepresentation, sizeof...(Reps)> reps_array = {reps...};
-    return MakeLabel<sizeof...(Reps)>(reps_array, type);
+    return detail::GraphAssemblerLabelForReps<Reps...>(
+        type, loop_nesting_level_, std::move(reps_array));
   }
-
-  // As above, but with an std::array of machine representations.
-  template <int VarCount>
-  GraphAssemblerLabel<VarCount> MakeLabel(
-      std::array<MachineRepresentation, VarCount> reps_array,
-      GraphAssemblerLabelType type) {
-    return GraphAssemblerLabel<VarCount>(type, loop_nesting_level_, reps_array);
+  GraphAssemblerDynamicLabel MakeLabelFor(
+      GraphAssemblerLabelType type,
+      base::SmallVector<MachineRepresentation, 4> reps) {
+    return GraphAssemblerDynamicLabel(type, loop_nesting_level_,
+                                      std::move(reps));
   }
 
   // Convenience wrapper for creating non-deferred labels.
   template <typename... Reps>
-  GraphAssemblerLabel<sizeof...(Reps)> MakeLabel(Reps... reps) {
+  detail::GraphAssemblerLabelForReps<Reps...> MakeLabel(Reps... reps) {
     return MakeLabelFor(GraphAssemblerLabelType::kNonDeferred, reps...);
   }
 
   // Convenience wrapper for creating loop labels.
   template <typename... Reps>
-  GraphAssemblerLabel<sizeof...(Reps)> MakeLoopLabel(Reps... reps) {
+  detail::GraphAssemblerLabelForReps<Reps...> MakeLoopLabel(Reps... reps) {
     return MakeLabelFor(GraphAssemblerLabelType::kLoop, reps...);
   }
 
   // Convenience wrapper for creating deferred labels.
   template <typename... Reps>
-  GraphAssemblerLabel<sizeof...(Reps)> MakeDeferredLabel(Reps... reps) {
+  detail::GraphAssemblerLabelForReps<Reps...> MakeDeferredLabel(Reps... reps) {
     return MakeLabelFor(GraphAssemblerLabelType::kDeferred, reps...);
   }
 
@@ -349,7 +421,7 @@ class V8_EXPORT_PRIVATE GraphAssembler {
   void Bind(GraphAssemblerLabel<VarCount>* label);
 
   template <typename... Vars>
-  void Goto(GraphAssemblerLabel<sizeof...(Vars)>* label, Vars...);
+  void Goto(detail::GraphAssemblerLabelForVars<Vars...>* label, Vars...);
 
   // Branch hints are inferred from if_true/if_false deferred states.
   void BranchWithCriticalSafetyCheck(Node* condition,
@@ -358,13 +430,14 @@ class V8_EXPORT_PRIVATE GraphAssembler {
 
   // Branch hints are inferred from if_true/if_false deferred states.
   template <typename... Vars>
-  void Branch(Node* condition, GraphAssemblerLabel<sizeof...(Vars)>* if_true,
-              GraphAssemblerLabel<sizeof...(Vars)>* if_false, Vars...);
+  void Branch(Node* condition,
+              detail::GraphAssemblerLabelForVars<Vars...>* if_true,
+              detail::GraphAssemblerLabelForVars<Vars...>* if_false, Vars...);
 
   template <typename... Vars>
   void BranchWithHint(Node* condition,
-                      GraphAssemblerLabel<sizeof...(Vars)>* if_true,
-                      GraphAssemblerLabel<sizeof...(Vars)>* if_false,
+                      detail::GraphAssemblerLabelForVars<Vars...>* if_true,
+                      detail::GraphAssemblerLabelForVars<Vars...>* if_false,
                       BranchHint hint, Vars...);
 
   // Control helpers.
@@ -372,7 +445,8 @@ class V8_EXPORT_PRIVATE GraphAssembler {
   // {GotoIf(c, l, h)} is equivalent to {BranchWithHint(c, l, templ, h);
   // Bind(templ)}.
   template <typename... Vars>
-  void GotoIf(Node* condition, GraphAssemblerLabel<sizeof...(Vars)>* label,
+  void GotoIf(Node* condition,
+              detail::GraphAssemblerLabelForVars<Vars...>* label,
               BranchHint hint, Vars...);
 
   // {GotoIfNot(c, l, h)} is equivalent to {BranchWithHint(c, templ, l, h);
@@ -381,18 +455,19 @@ class V8_EXPORT_PRIVATE GraphAssembler {
   // so {GotoIfNot(..., BranchHint::kTrue)} means "optimize for the case where
   // the branch is *not* taken".
   template <typename... Vars>
-  void GotoIfNot(Node* condition, GraphAssemblerLabel<sizeof...(Vars)>* label,
+  void GotoIfNot(Node* condition,
+                 detail::GraphAssemblerLabelForVars<Vars...>* label,
                  BranchHint hint, Vars...);
 
   // {GotoIf(c, l)} is equivalent to {Branch(c, l, templ);Bind(templ)}.
   template <typename... Vars>
-  void GotoIf(Node* condition, GraphAssemblerLabel<sizeof...(Vars)>* label,
-              Vars...);
+  void GotoIf(Node* condition,
+              detail::GraphAssemblerLabelForVars<Vars...>* label, Vars...);
 
   // {GotoIfNot(c, l)} is equivalent to {Branch(c, templ, l);Bind(templ)}.
   template <typename... Vars>
-  void GotoIfNot(Node* condition, GraphAssemblerLabel<sizeof...(Vars)>* label,
-                 Vars...);
+  void GotoIfNot(Node* condition,
+                 detail::GraphAssemblerLabelForVars<Vars...>* label, Vars...);
 
   bool HasActiveBlock() const {
     // This is false if the current block has been terminated (e.g. by a Goto or
@@ -437,7 +512,8 @@ class V8_EXPORT_PRIVATE GraphAssembler {
 
  protected:
   template <typename... Vars>
-  void MergeState(GraphAssemblerLabel<sizeof...(Vars)>* label, Vars... vars);
+  void MergeState(detail::GraphAssemblerLabelForVars<Vars...>* label,
+                  Vars... vars);
 
   V8_INLINE Node* AddClonedNode(Node* node);
 
@@ -525,8 +601,8 @@ class V8_EXPORT_PRIVATE GraphAssembler {
 
   template <typename... Vars>
   void BranchImpl(Node* condition,
-                  GraphAssemblerLabel<sizeof...(Vars)>* if_true,
-                  GraphAssemblerLabel<sizeof...(Vars)>* if_false,
+                  detail::GraphAssemblerLabelForVars<Vars...>* if_true,
+                  detail::GraphAssemblerLabelForVars<Vars...>* if_false,
                   BranchHint hint, Vars...);
 
   Zone* temp_zone_;
@@ -556,18 +632,21 @@ class V8_EXPORT_PRIVATE GraphAssembler {
 template <size_t VarCount>
 Node* GraphAssemblerLabel<VarCount>::PhiAt(size_t index) {
   DCHECK(IsBound());
-  DCHECK_LT(index, VarCount);
+  DCHECK_LT(index, Count());
   return bindings_[index];
 }
 
 template <typename... Vars>
-void GraphAssembler::MergeState(GraphAssemblerLabel<sizeof...(Vars)>* label,
-                                Vars... vars) {
+void GraphAssembler::MergeState(
+    detail::GraphAssemblerLabelForVars<Vars...>* label, Vars... vars) {
+  using NodeArray = typename detail::GraphAssemblerLabelForVars<
+      Vars...>::template Array<Node*>;
   RestoreEffectControlScope restore_effect_control_scope(this);
 
   const int merged_count = static_cast<int>(label->merged_count_);
-  static constexpr int kVarCount = sizeof...(vars);
-  std::array<Node*, kVarCount> var_array = {vars...};
+
+  const size_t var_count = label->Count();
+  NodeArray var_array{vars...};
 
   const bool is_loop_exit = label->loop_nesting_level_ != loop_nesting_level_;
   if (is_loop_exit) {
@@ -585,7 +664,7 @@ void GraphAssembler::MergeState(GraphAssemblerLabel<sizeof...(Vars)>* label,
     AddNode(graph()->NewNode(common()->LoopExit(), control(),
                              *loop_headers_.back()));
     AddNode(graph()->NewNode(common()->LoopExitEffect(), effect(), control()));
-    for (size_t i = 0; i < kVarCount; i++) {
+    for (size_t i = 0; i < var_count; i++) {
       var_array[i] = AddNode(graph()->NewNode(
           common()->LoopExitValue(MachineRepresentation::kTagged), var_array[i],
           control()));
@@ -602,7 +681,7 @@ void GraphAssembler::MergeState(GraphAssemblerLabel<sizeof...(Vars)>* label,
       Node* terminate = graph()->NewNode(common()->Terminate(), label->effect_,
                                          label->control_);
       NodeProperties::MergeControlToEnd(graph(), common(), terminate);
-      for (size_t i = 0; i < kVarCount; i++) {
+      for (size_t i = 0; i < var_count; i++) {
         label->bindings_[i] =
             graph()->NewNode(common()->Phi(label->representations_[i], 2),
                              var_array[i], var_array[i], label->control_);
@@ -612,7 +691,7 @@ void GraphAssembler::MergeState(GraphAssemblerLabel<sizeof...(Vars)>* label,
       DCHECK_EQ(1, merged_count);
       label->control_->ReplaceInput(1, control());
       label->effect_->ReplaceInput(1, effect());
-      for (size_t i = 0; i < kVarCount; i++) {
+      for (size_t i = 0; i < var_count; i++) {
         label->bindings_[i]->ReplaceInput(1, var_array[i]);
         CHECK(!NodeProperties::IsTyped(var_array[i]));  // Unsupported.
       }
@@ -624,7 +703,7 @@ void GraphAssembler::MergeState(GraphAssemblerLabel<sizeof...(Vars)>* label,
       // Just set the control, effect and variables directly.
       label->control_ = control();
       label->effect_ = effect();
-      for (size_t i = 0; i < kVarCount; i++) {
+      for (size_t i = 0; i < var_count; i++) {
         label->bindings_[i] = var_array[i];
       }
     } else if (merged_count == 1) {
@@ -633,7 +712,7 @@ void GraphAssembler::MergeState(GraphAssemblerLabel<sizeof...(Vars)>* label,
           graph()->NewNode(common()->Merge(2), label->control_, control());
       label->effect_ = graph()->NewNode(common()->EffectPhi(2), label->effect_,
                                         effect(), label->control_);
-      for (size_t i = 0; i < kVarCount; i++) {
+      for (size_t i = 0; i < var_count; i++) {
         label->bindings_[i] = graph()->NewNode(
             common()->Phi(label->representations_[i], 2), label->bindings_[i],
             var_array[i], label->control_);
@@ -651,7 +730,7 @@ void GraphAssembler::MergeState(GraphAssemblerLabel<sizeof...(Vars)>* label,
       NodeProperties::ChangeOp(label->effect_,
                                common()->EffectPhi(merged_count + 1));
 
-      for (size_t i = 0; i < kVarCount; i++) {
+      for (size_t i = 0; i < var_count; i++) {
         DCHECK_EQ(IrOpcode::kPhi, label->bindings_[i]->opcode());
         label->bindings_[i]->ReplaceInput(merged_count, var_array[i]);
         label->bindings_[i]->AppendInput(graph()->zone(), label->control_);
@@ -686,7 +765,7 @@ void GraphAssembler::Bind(GraphAssemblerLabel<VarCount>* label) {
   if (label->merged_count_ > 1 || label->IsLoop()) {
     AddNode(label->control_);
     AddNode(label->effect_);
-    for (size_t i = 0; i < VarCount; i++) {
+    for (size_t i = 0; i < label->Count(); i++) {
       AddNode(label->bindings_[i]);
     }
   } else {
@@ -697,10 +776,9 @@ void GraphAssembler::Bind(GraphAssemblerLabel<VarCount>* label) {
 }
 
 template <typename... Vars>
-void GraphAssembler::Branch(Node* condition,
-                            GraphAssemblerLabel<sizeof...(Vars)>* if_true,
-                            GraphAssemblerLabel<sizeof...(Vars)>* if_false,
-                            Vars... vars) {
+void GraphAssembler::Branch(
+    Node* condition, detail::GraphAssemblerLabelForVars<Vars...>* if_true,
+    detail::GraphAssemblerLabelForVars<Vars...>* if_false, Vars... vars) {
   BranchHint hint = BranchHint::kNone;
   if (if_true->IsDeferred() != if_false->IsDeferred()) {
     hint = if_false->IsDeferred() ? BranchHint::kTrue : BranchHint::kFalse;
@@ -711,17 +789,17 @@ void GraphAssembler::Branch(Node* condition,
 
 template <typename... Vars>
 void GraphAssembler::BranchWithHint(
-    Node* condition, GraphAssemblerLabel<sizeof...(Vars)>* if_true,
-    GraphAssemblerLabel<sizeof...(Vars)>* if_false, BranchHint hint,
+    Node* condition, detail::GraphAssemblerLabelForVars<Vars...>* if_true,
+    detail::GraphAssemblerLabelForVars<Vars...>* if_false, BranchHint hint,
     Vars... vars) {
   BranchImpl(condition, if_true, if_false, hint, vars...);
 }
 
 template <typename... Vars>
-void GraphAssembler::BranchImpl(Node* condition,
-                                GraphAssemblerLabel<sizeof...(Vars)>* if_true,
-                                GraphAssemblerLabel<sizeof...(Vars)>* if_false,
-                                BranchHint hint, Vars... vars) {
+void GraphAssembler::BranchImpl(
+    Node* condition, detail::GraphAssemblerLabelForVars<Vars...>* if_true,
+    detail::GraphAssemblerLabelForVars<Vars...>* if_false, BranchHint hint,
+    Vars... vars) {
   DCHECK_NOT_NULL(control());
 
   Node* branch = graph()->NewNode(common()->Branch(hint), condition, control());
@@ -737,7 +815,7 @@ void GraphAssembler::BranchImpl(Node* condition,
 }
 
 template <typename... Vars>
-void GraphAssembler::Goto(GraphAssemblerLabel<sizeof...(Vars)>* label,
+void GraphAssembler::Goto(detail::GraphAssemblerLabelForVars<Vars...>* label,
                           Vars... vars) {
   DCHECK_NOT_NULL(control());
   DCHECK_NOT_NULL(effect());
@@ -749,7 +827,7 @@ void GraphAssembler::Goto(GraphAssemblerLabel<sizeof...(Vars)>* label,
 
 template <typename... Vars>
 void GraphAssembler::GotoIf(Node* condition,
-                            GraphAssemblerLabel<sizeof...(Vars)>* label,
+                            detail::GraphAssemblerLabelForVars<Vars...>* label,
                             BranchHint hint, Vars... vars) {
   Node* branch = graph()->NewNode(common()->Branch(hint), condition, control());
 
@@ -760,9 +838,9 @@ void GraphAssembler::GotoIf(Node* condition,
 }
 
 template <typename... Vars>
-void GraphAssembler::GotoIfNot(Node* condition,
-                               GraphAssemblerLabel<sizeof...(Vars)>* label,
-                               BranchHint hint, Vars... vars) {
+void GraphAssembler::GotoIfNot(
+    Node* condition, detail::GraphAssemblerLabelForVars<Vars...>* label,
+    BranchHint hint, Vars... vars) {
   Node* branch = graph()->NewNode(common()->Branch(hint), condition, control());
 
   control_ = graph()->NewNode(common()->IfFalse(), branch);
@@ -773,7 +851,7 @@ void GraphAssembler::GotoIfNot(Node* condition,
 
 template <typename... Vars>
 void GraphAssembler::GotoIf(Node* condition,
-                            GraphAssemblerLabel<sizeof...(Vars)>* label,
+                            detail::GraphAssemblerLabelForVars<Vars...>* label,
                             Vars... vars) {
   BranchHint hint =
       label->IsDeferred() ? BranchHint::kFalse : BranchHint::kNone;
@@ -781,9 +859,9 @@ void GraphAssembler::GotoIf(Node* condition,
 }
 
 template <typename... Vars>
-void GraphAssembler::GotoIfNot(Node* condition,
-                               GraphAssemblerLabel<sizeof...(Vars)>* label,
-                               Vars... vars) {
+void GraphAssembler::GotoIfNot(
+    Node* condition, detail::GraphAssemblerLabelForVars<Vars...>* label,
+    Vars... vars) {
   BranchHint hint = label->IsDeferred() ? BranchHint::kTrue : BranchHint::kNone;
   return GotoIfNot(condition, label, hint, vars...);
 }
@@ -831,6 +909,7 @@ class V8_EXPORT_PRIVATE JSGraphAssembler : public GraphAssembler {
 #undef SINGLETON_CONST_TEST_DECL
 
   Node* Allocate(AllocationType allocation, Node* size);
+  TNode<Map> LoadMap(TNode<HeapObject> object);
   Node* LoadField(FieldAccess const&, Node* object);
   template <typename T>
   TNode<T> LoadField(FieldAccess const& access, TNode<HeapObject> object) {
diff --git a/deps/v8/src/compiler/graph-reducer.cc b/deps/v8/src/compiler/graph-reducer.cc
index 48d84c21792fac..043b92a53d9da1 100644
--- a/deps/v8/src/compiler/graph-reducer.cc
+++ b/deps/v8/src/compiler/graph-reducer.cc
@@ -109,7 +109,7 @@ Reduction GraphReducer::Reduce(Node* const node) {
         // {replacement} == {node} represents an in-place reduction. Rerun
         // all the other reducers for this node, as now there may be more
         // opportunities for reduction.
-        if (FLAG_trace_turbo_reduction) {
+        if (v8_flags.trace_turbo_reduction) {
           UnparkedScopeIfNeeded unparked(broker_);
           // TODO(neis): Disallow racy handle dereference once we stop
           // supporting --no-local-heaps --no-concurrent-inlining.
@@ -122,7 +122,7 @@ Reduction GraphReducer::Reduce(Node* const node) {
         continue;
       } else {
         // {node} was replaced by another node.
-        if (FLAG_trace_turbo_reduction) {
+        if (v8_flags.trace_turbo_reduction) {
           UnparkedScopeIfNeeded unparked(broker_);
           // TODO(neis): Disallow racy handle dereference once we stop
           // supporting --no-local-heaps --no-concurrent-inlining.
diff --git a/deps/v8/src/compiler/graph-trimmer.cc b/deps/v8/src/compiler/graph-trimmer.cc
index e1dbfffff59151..3a85a456da68a8 100644
--- a/deps/v8/src/compiler/graph-trimmer.cc
+++ b/deps/v8/src/compiler/graph-trimmer.cc
@@ -33,7 +33,7 @@ void GraphTrimmer::TrimGraph() {
     for (Edge edge : live->use_edges()) {
       Node* const user = edge.from();
       if (!IsLive(user)) {
-        if (FLAG_trace_turbo_trimming) {
+        if (v8_flags.trace_turbo_trimming) {
           StdoutStream{} << "DeadLink: " << *user << "(" << edge.index()
                          << ") -> " << *live << std::endl;
         }
diff --git a/deps/v8/src/compiler/graph-visualizer.cc b/deps/v8/src/compiler/graph-visualizer.cc
index 9b8cc6a514ecfe..2cd220eb86a402 100644
--- a/deps/v8/src/compiler/graph-visualizer.cc
+++ b/deps/v8/src/compiler/graph-visualizer.cc
@@ -33,8 +33,8 @@ namespace compiler {
 
 const char* get_cached_trace_turbo_filename(OptimizedCompilationInfo* info) {
   if (!info->trace_turbo_filename()) {
-    info->set_trace_turbo_filename(
-        GetVisualizerLogFileName(info, FLAG_trace_turbo_path, nullptr, "json"));
+    info->set_trace_turbo_filename(GetVisualizerLogFileName(
+        info, v8_flags.trace_turbo_path, nullptr, "json"));
   }
   return info->trace_turbo_filename();
 }
@@ -232,7 +232,7 @@ std::unique_ptr<char[]> GetVisualizerLogFileName(OptimizedCompilationInfo* info,
                                                  const char* suffix) {
   base::EmbeddedVector<char, 256> filename(0);
   std::unique_ptr<char[]> debug_name = info->GetDebugName();
-  const char* file_prefix = FLAG_trace_turbo_file_prefix.value();
+  const char* file_prefix = v8_flags.trace_turbo_file_prefix.value();
   int optimization_id = info->IsOptimizing() ? info->optimization_id() : 0;
   if (strlen(debug_name.get()) > 0) {
     SNPrintF(filename, "%s-%s-%i", file_prefix, debug_name.get(),
@@ -246,7 +246,7 @@ std::unique_ptr<char[]> GetVisualizerLogFileName(OptimizedCompilationInfo* info,
   }
   base::EmbeddedVector<char, 256> source_file(0);
   bool source_available = false;
-  if (FLAG_trace_file_names && info->has_shared_info() &&
+  if (v8_flags.trace_file_names && info->has_shared_info() &&
       info->shared_info()->script().IsScript()) {
     Object source_name = Script::cast(info->shared_info()->script()).name();
     if (source_name.IsString()) {
@@ -680,7 +680,7 @@ void GraphC1Visualizer::PrintSchedule(const char* phase,
         PrintIndent();
         os_ << "0 " << uses << " ";
         PrintNode(node);
-        if (FLAG_trace_turbo_types) {
+        if (v8_flags.trace_turbo_types) {
           os_ << " ";
           PrintType(node);
         }
@@ -710,7 +710,7 @@ void GraphC1Visualizer::PrintSchedule(const char* phase,
         for (BasicBlock* successor : current->successors()) {
           os_ << " B" << successor->rpo_number();
         }
-        if (FLAG_trace_turbo_types && current->control_input() != nullptr) {
+        if (v8_flags.trace_turbo_types && current->control_input() != nullptr) {
           os_ << " ";
           PrintType(current->control_input());
         }
@@ -811,7 +811,7 @@ void GraphC1Visualizer::PrintLiveRange(const LiveRange* range, const char* type,
 
     UsePosition* current_pos = range->first_pos();
     while (current_pos != nullptr) {
-      if (current_pos->RegisterIsBeneficial() || FLAG_trace_all_uses) {
+      if (current_pos->RegisterIsBeneficial() || v8_flags.trace_all_uses) {
         os_ << " " << current_pos->pos().value() << " M";
       }
       current_pos = current_pos->next();
diff --git a/deps/v8/src/compiler/heap-refs.cc b/deps/v8/src/compiler/heap-refs.cc
index 391796d00e06fa..309618a513da95 100644
--- a/deps/v8/src/compiler/heap-refs.cc
+++ b/deps/v8/src/compiler/heap-refs.cc
@@ -1561,6 +1561,7 @@ ObjectRef CallHandlerInfoRef::data() const {
 HEAP_ACCESSOR_C(ScopeInfo, int, ContextLength)
 HEAP_ACCESSOR_C(ScopeInfo, bool, HasContextExtensionSlot)
 HEAP_ACCESSOR_C(ScopeInfo, bool, HasOuterScopeInfo)
+HEAP_ACCESSOR_C(ScopeInfo, bool, ClassScopeHasPrivateBrand)
 
 ScopeInfoRef ScopeInfoRef::OuterScopeInfo() const {
   return MakeRefAssumeMemoryFence(broker(), object()->OuterScopeInfo());
@@ -1701,7 +1702,7 @@ ZoneVector<const CFunctionInfo*> FunctionTemplateInfoRef::c_signatures() const {
 
 bool StringRef::IsSeqString() const { return object()->IsSeqString(); }
 
-ScopeInfoRef NativeContextRef::scope_info() const {
+ScopeInfoRef ContextRef::scope_info() const {
   // The scope_info is immutable after initialization.
   return MakeRefAssumeMemoryFence(broker(), object()->scope_info());
 }
@@ -1832,17 +1833,23 @@ base::Optional<Object> JSObjectRef::GetOwnConstantElementFromHeap(
   // This block is carefully constructed to avoid Ref creation and access since
   // this method may be called after the broker has retired.
   // The relaxed `length` read is safe to use in this case since:
-  // - GetOwnConstantElement only detects a constant for JSArray holders if
-  //   the array is frozen/sealed.
-  // - Frozen/sealed arrays can't change length.
-  // - We've already seen a map with frozen/sealed elements_kinds (above);
+  // - TryGetOwnConstantElement (below) only detects a constant for JSArray
+  //   holders if the array is frozen.
+  // - Frozen arrays can't change length.
+  // - We've already seen the corresponding map (when this JSObjectRef was
+  //   created);
   // - The release-load of that map ensures we read the newest value
   //   of `length` below.
   if (holder->IsJSArray()) {
+    Object array_length_obj =
+        JSArray::cast(*holder).length(broker()->isolate(), kRelaxedLoad);
+    if (!array_length_obj.IsSmi()) {
+      // Can't safely read into HeapNumber objects without atomic semantics
+      // (relaxed would be sufficient due to the guarantees above).
+      return {};
+    }
     uint32_t array_length;
-    if (!JSArray::cast(*holder)
-             .length(broker()->isolate(), kRelaxedLoad)
-             .ToArrayLength(&array_length)) {
+    if (!array_length_obj.ToArrayLength(&array_length)) {
       return {};
     }
     // See also ElementsAccessorBase::GetMaxIndex.
@@ -2250,7 +2257,7 @@ base::Optional<PropertyCellRef> JSGlobalObjectRef::GetPropertyCell(
 }
 
 std::ostream& operator<<(std::ostream& os, const ObjectRef& ref) {
-  if (!FLAG_concurrent_recompilation) {
+  if (!v8_flags.concurrent_recompilation) {
     // We cannot be in a background thread so it's safe to read the heap.
     AllowHandleDereference allow_handle_dereference;
     return os << ref.data() << " {" << ref.object() << "}";
diff --git a/deps/v8/src/compiler/heap-refs.h b/deps/v8/src/compiler/heap-refs.h
index 1076a1bafd4ea2..0564b609cf6f95 100644
--- a/deps/v8/src/compiler/heap-refs.h
+++ b/deps/v8/src/compiler/heap-refs.h
@@ -56,7 +56,8 @@ class PropertyAccessInfo;
 enum class AccessMode { kLoad, kStore, kStoreInLiteral, kHas, kDefine };
 
 inline bool IsAnyStore(AccessMode mode) {
-  return mode == AccessMode::kStore || mode == AccessMode::kStoreInLiteral;
+  return mode == AccessMode::kStore || mode == AccessMode::kStoreInLiteral ||
+         mode == AccessMode::kDefine;
 }
 
 enum class OddballType : uint8_t {
@@ -527,6 +528,8 @@ class ContextRef : public HeapObjectRef {
 
   // Only returns a value if the index is valid for this ContextRef.
   base::Optional<ObjectRef> get(int index) const;
+
+  ScopeInfoRef scope_info() const;
 };
 
 #define BROKER_NATIVE_CONTEXT_FIELDS(V)          \
@@ -584,7 +587,6 @@ class NativeContextRef : public ContextRef {
   BROKER_NATIVE_CONTEXT_FIELDS(DECL_ACCESSOR)
 #undef DECL_ACCESSOR
 
-  ScopeInfoRef scope_info() const;
   MapRef GetFunctionMapFromIndex(int index) const;
   MapRef GetInitialJSArrayMap(ElementsKind kind) const;
   base::Optional<JSFunctionRef> GetConstructorFunction(const MapRef& map) const;
@@ -879,6 +881,7 @@ class ScopeInfoRef : public HeapObjectRef {
   int ContextLength() const;
   bool HasOuterScopeInfo() const;
   bool HasContextExtensionSlot() const;
+  bool ClassScopeHasPrivateBrand() const;
 
   ScopeInfoRef OuterScopeInfo() const;
 };
@@ -899,6 +902,7 @@ class ScopeInfoRef : public HeapObjectRef {
   V(int, StartPosition)                                    \
   V(bool, is_compiled)                                     \
   V(bool, IsUserJavaScript)                                \
+  V(bool, requires_instance_members_initializer)           \
   IF_WASM(V, const wasm::WasmModule*, wasm_module)         \
   IF_WASM(V, const wasm::FunctionSig*, wasm_function_signature)
 
diff --git a/deps/v8/src/compiler/js-call-reducer.cc b/deps/v8/src/compiler/js-call-reducer.cc
index 4825cbb72f2347..256d41748e6420 100644
--- a/deps/v8/src/compiler/js-call-reducer.cc
+++ b/deps/v8/src/compiler/js-call-reducer.cc
@@ -29,6 +29,7 @@
 #include "src/compiler/state-values-utils.h"
 #include "src/compiler/type-cache.h"
 #include "src/ic/call-optimization.h"
+#include "src/objects/elements-kind.h"
 #include "src/objects/js-function.h"
 #include "src/objects/objects-inl.h"
 #include "src/objects/ordered-hash-table.h"
@@ -255,6 +256,7 @@ class JSCallReducerAssembler : public JSGraphAssembler {
       TNode<Object> value,
       NumberOperationHint hint = NumberOperationHint::kNumberOrOddball);
   TNode<Smi> CheckSmi(TNode<Object> value);
+  TNode<Number> CheckNumber(TNode<Object> value);
   TNode<String> CheckString(TNode<Object> value);
   TNode<Number> CheckBounds(TNode<Number> value, TNode<Number> limit);
 
@@ -681,7 +683,7 @@ class IteratingArrayBuiltinReducerAssembler : public JSCallReducerAssembler {
  public:
   IteratingArrayBuiltinReducerAssembler(JSCallReducer* reducer, Node* node)
       : JSCallReducerAssembler(reducer, node) {
-    DCHECK(FLAG_turbo_inline_array_builtins);
+    DCHECK(v8_flags.turbo_inline_array_builtins);
   }
 
   TNode<Object> ReduceArrayPrototypeForEach(
@@ -710,11 +712,11 @@ class IteratingArrayBuiltinReducerAssembler : public JSCallReducerAssembler {
       MapInference* inference, const bool has_stability_dependency,
       ElementsKind kind, const SharedFunctionInfoRef& shared,
       const NativeContextRef& native_context, ArrayEverySomeVariant variant);
-  TNode<Object> ReduceArrayPrototypeAt(ZoneVector<ElementsKind> kinds,
-                                       bool needs_fallback_builtin_call,
-                                       Node* receiver_kind);
+  TNode<Object> ReduceArrayPrototypeAt(ZoneVector<const MapRef*> kinds,
+                                       bool needs_fallback_builtin_call);
   TNode<Object> ReduceArrayPrototypeIndexOfIncludes(
       ElementsKind kind, ArrayIndexOfIncludesVariant variant);
+  TNode<Number> ReduceArrayPrototypePush(MapInference* inference);
 
  private:
   // Returns {index,value}. Assumes that the map has not changed, but possibly
@@ -744,10 +746,7 @@ class IteratingArrayBuiltinReducerAssembler : public JSCallReducerAssembler {
       TNode<Vars>... vars) {
     if (!IsHoleyElementsKind(kind)) return o;
 
-    std::array<MachineRepresentation, sizeof...(Vars)> reps = {
-        MachineRepresentationOf<Vars>::value...};
-    auto if_not_hole =
-        MakeLabel<sizeof...(Vars)>(reps, GraphAssemblerLabelType::kNonDeferred);
+    auto if_not_hole = MakeLabel(MachineRepresentationOf<Vars>::value...);
     BranchWithHint(HoleCheck(kind, o), continue_label, &if_not_hole,
                    BranchHint::kFalse, vars...);
 
@@ -1030,6 +1029,11 @@ TNode<Smi> JSCallReducerAssembler::CheckSmi(TNode<Object> value) {
                                        value, effect(), control()));
 }
 
+TNode<Number> JSCallReducerAssembler::CheckNumber(TNode<Object> value) {
+  return AddNode<Number>(graph()->NewNode(simplified()->CheckNumber(feedback()),
+                                          value, effect(), control()));
+}
+
 TNode<String> JSCallReducerAssembler::CheckString(TNode<Object> value) {
   return AddNode<String>(graph()->NewNode(simplified()->CheckString(feedback()),
                                           value, effect(), control()));
@@ -1323,24 +1327,25 @@ TNode<String> JSCallReducerAssembler::ReduceStringPrototypeSlice() {
 }
 
 TNode<Object> IteratingArrayBuiltinReducerAssembler::ReduceArrayPrototypeAt(
-    ZoneVector<ElementsKind> kinds, bool needs_fallback_builtin_call,
-    Node* receiver_kind) {
+    ZoneVector<const MapRef*> maps, bool needs_fallback_builtin_call) {
   TNode<JSArray> receiver = ReceiverInputAs<JSArray>();
   TNode<Object> index = ArgumentOrZero(0);
 
   TNode<Number> index_num = CheckSmi(index);
   TNode<FixedArrayBase> elements = LoadElements(receiver);
 
+  TNode<Map> receiver_map = LoadMap(receiver);
+
   auto out = MakeLabel(MachineRepresentation::kTagged);
 
-  for (ElementsKind kind : kinds) {
+  for (const MapRef* map : maps) {
+    DCHECK(map->supports_fast_array_iteration());
     auto correct_map_label = MakeLabel(), wrong_map_label = MakeLabel();
-    Branch(NumberEqual(TNode<Number>::UncheckedCast(receiver_kind),
-                       NumberConstant(kind)),
-           &correct_map_label, &wrong_map_label);
+    TNode<Boolean> is_map_equal = ReferenceEqual(receiver_map, Constant(*map));
+    Branch(is_map_equal, &correct_map_label, &wrong_map_label);
     Bind(&correct_map_label);
 
-    TNode<Number> length = LoadJSArrayLength(receiver, kind);
+    TNode<Number> length = LoadJSArrayLength(receiver, map->elements_kind());
 
     // If index is less than 0, then subtract from length.
     TNode<Boolean> cond = NumberLessThan(index_num, ZeroConstant());
@@ -1359,15 +1364,16 @@ TNode<Object> IteratingArrayBuiltinReducerAssembler::ReduceArrayPrototypeAt(
 
     // Retrieving element at index.
     TNode<Object> element = LoadElement<Object>(
-        AccessBuilder::ForFixedArrayElement(kind), elements, real_index_num);
-    if (IsHoleyElementsKind(kind)) {
+        AccessBuilder::ForFixedArrayElement(map->elements_kind()), elements,
+        real_index_num);
+    if (IsHoleyElementsKind(map->elements_kind())) {
       // This case is needed in particular for HOLEY_DOUBLE_ELEMENTS: raw
       // doubles are stored in the FixedDoubleArray, and need to be converted to
       // HeapNumber or to Smi so that this function can return an Object. The
       // automatic converstion performed by
       // RepresentationChanger::GetTaggedRepresentationFor does not handle
       // holes, so we convert manually a potential hole here.
-      element = TryConvertHoleToUndefined(element, kind);
+      element = TryConvertHoleToUndefined(element, map->elements_kind());
     }
     Goto(&out, element);
 
@@ -1399,6 +1405,129 @@ TNode<Object> IteratingArrayBuiltinReducerAssembler::ReduceArrayPrototypeAt(
   return out.PhiAt<Object>(0);
 }
 
+TNode<Number> IteratingArrayBuiltinReducerAssembler::ReduceArrayPrototypePush(
+    MapInference* inference) {
+  int const num_push_arguments = ArgumentCount();
+  ZoneVector<MapRef> const& receiver_maps = inference->GetMaps();
+
+  base::SmallVector<MachineRepresentation, 4> argument_reps;
+  base::SmallVector<Node*, 4> argument_nodes;
+
+  for (int i = 0; i < num_push_arguments; ++i) {
+    argument_reps.push_back(MachineRepresentation::kTagged);
+    argument_nodes.push_back(Argument(i));
+  }
+
+  TNode<JSArray> receiver = ReceiverInputAs<JSArray>();
+  TNode<Map> receiver_map = LoadMap(receiver);
+
+  auto double_label = MakeLabel(argument_reps);
+  auto smi_label = MakeLabel(argument_reps);
+  auto object_label = MakeLabel(argument_reps);
+
+  for (size_t i = 0; i < receiver_maps.size(); i++) {
+    const MapRef& map = receiver_maps[i];
+    ElementsKind kind = map.elements_kind();
+
+    if (i < receiver_maps.size() - 1) {
+      TNode<Boolean> is_map_equal = ReferenceEqual(receiver_map, Constant(map));
+      if (IsDoubleElementsKind(kind)) {
+        GotoIf(is_map_equal, &double_label, argument_nodes);
+      } else if (IsSmiElementsKind(kind)) {
+        GotoIf(is_map_equal, &smi_label, argument_nodes);
+      } else {
+        GotoIf(is_map_equal, &object_label, argument_nodes);
+      }
+    } else {
+      if (IsDoubleElementsKind(kind)) {
+        Goto(&double_label, argument_nodes);
+      } else if (IsSmiElementsKind(kind)) {
+        Goto(&smi_label, argument_nodes);
+      } else {
+        Goto(&object_label, argument_nodes);
+      }
+    }
+  }
+
+  auto return_label = MakeLabel(MachineRepresentation::kTagged);
+
+  auto build_array_push = [&](ElementsKind kind,
+                              base::SmallVector<Node*, 1>& push_arguments) {
+    // Only support PACKED_ELEMENTS and PACKED_DOUBLE_ELEMENTS, as "markers" of
+    // what the elements array is (a FixedArray or FixedDoubleArray).
+    DCHECK(kind == PACKED_ELEMENTS || kind == PACKED_DOUBLE_ELEMENTS);
+
+    // Load the "length" property of the {receiver}.
+    TNode<Smi> length = LoadJSArrayLength(receiver, kind);
+    TNode<Number> return_value = length;
+
+    // Check if we have any {values} to push.
+    if (num_push_arguments > 0) {
+      // Compute the resulting "length" of the {receiver}.
+      TNode<Number> new_length = return_value =
+          NumberAdd(length, NumberConstant(num_push_arguments));
+
+      // Load the elements backing store of the {receiver}.
+      TNode<FixedArrayBase> elements = LoadElements(receiver);
+      TNode<Smi> elements_length = LoadFixedArrayBaseLength(elements);
+
+      elements = MaybeGrowFastElements(
+          kind, feedback(), receiver, elements,
+          NumberAdd(length, NumberConstant(num_push_arguments - 1)),
+          elements_length);
+
+      // Update the JSArray::length field. Since this is observable,
+      // there must be no other check after this.
+      StoreJSArrayLength(receiver, new_length, kind);
+
+      // Append the {values} to the {elements}.
+      for (int i = 0; i < num_push_arguments; ++i) {
+        StoreFixedArrayBaseElement(
+            elements, NumberAdd(length, NumberConstant(i)),
+            TNode<Object>::UncheckedCast(push_arguments[i]), kind);
+      }
+    }
+
+    Goto(&return_label, return_value);
+  };
+
+  if (double_label.IsUsed()) {
+    Bind(&double_label);
+    base::SmallVector<Node*, 1> push_arguments(num_push_arguments);
+    for (int i = 0; i < num_push_arguments; ++i) {
+      Node* value =
+          CheckNumber(TNode<Object>::UncheckedCast(double_label.PhiAt(i)));
+      // Make sure we do not store signaling NaNs into double arrays.
+      value = AddNode<Number>(
+          graph()->NewNode(simplified()->NumberSilenceNaN(), value));
+      push_arguments[i] = value;
+    }
+    build_array_push(PACKED_DOUBLE_ELEMENTS, push_arguments);
+  }
+
+  if (smi_label.IsUsed()) {
+    Bind(&smi_label);
+    base::SmallVector<Node*, 4> push_arguments(num_push_arguments);
+    for (int i = 0; i < num_push_arguments; ++i) {
+      Node* value = CheckSmi(TNode<Object>::UncheckedCast(smi_label.PhiAt(i)));
+      push_arguments[i] = value;
+    }
+    Goto(&object_label, push_arguments);
+  }
+
+  if (object_label.IsUsed()) {
+    Bind(&object_label);
+    base::SmallVector<Node*, 1> push_arguments(num_push_arguments);
+    for (int i = 0; i < num_push_arguments; ++i) {
+      push_arguments[i] = object_label.PhiAt(i);
+    }
+    build_array_push(PACKED_ELEMENTS, push_arguments);
+  }
+
+  Bind(&return_label);
+  return TNode<Number>::UncheckedCast(return_label.PhiAt(0));
+}
+
 namespace {
 
 struct ForEachFrameStateParams {
@@ -3400,7 +3529,7 @@ class IteratingArrayBuiltinHelper {
         effect_(NodeProperties::GetEffectInput(node)),
         control_(NodeProperties::GetControlInput(node)),
         inference_(broker, receiver_, effect_) {
-    if (!FLAG_turbo_inline_array_builtins) return;
+    if (!v8_flags.turbo_inline_array_builtins) return;
 
     DCHECK_EQ(IrOpcode::kJSCall, node->opcode());
     const CallParameters& p = CallParametersOf(node->op());
@@ -3698,7 +3827,7 @@ FastApiCallFunctionVector CanOptimizeFastCall(
     Zone* zone, const FunctionTemplateInfoRef& function_template_info,
     size_t argc) {
   FastApiCallFunctionVector result(zone);
-  if (!FLAG_turbo_fast_api_calls) return result;
+  if (!v8_flags.turbo_fast_api_calls) return result;
 
   static constexpr int kReceiver = 1;
 
@@ -4273,7 +4402,7 @@ Reduction JSCallReducer::ReduceCallOrConstructWithArrayLikeOrSpread(
         feedback_source, speculation_mode, feedback_relation);
   }
 
-  if (!FLAG_turbo_optimize_apply) return NoChange();
+  if (!v8_flags.turbo_optimize_apply) return NoChange();
 
   // Optimization of construct nodes not supported yet.
   if (!IsCallWithArrayLikeOrSpread(node)) return NoChange();
@@ -5618,7 +5747,7 @@ void JSCallReducer::CheckIfElementsKind(Node* receiver_elements_kind,
 
 // ES6 section 23.1.3.1 Array.prototype.at ( )
 Reduction JSCallReducer::ReduceArrayPrototypeAt(Node* node) {
-  if (!FLAG_turbo_inline_array_builtins) return NoChange();
+  if (!v8_flags.turbo_inline_array_builtins) return NoChange();
 
   JSCallNode n(node);
   CallParameters const& p = n.Parameters();
@@ -5633,25 +5762,22 @@ Reduction JSCallReducer::ReduceArrayPrototypeAt(Node* node) {
   MapInference inference(broker(), receiver, effect);
   if (!inference.HaveMaps()) return NoChange();
 
-  // Collecting kinds
-  ZoneVector<ElementsKind> kinds(broker()->zone());
+  // Collecting maps, and checking if a fallback builtin call will be required
+  // (it is required if at least one map doesn't support fast array iteration).
+  ZoneVector<const MapRef*> maps(broker()->zone());
   bool needs_fallback_builtin_call = false;
   for (const MapRef& map : inference.GetMaps()) {
     if (map.supports_fast_array_iteration()) {
-      ElementsKind kind = map.elements_kind();
-      // Checking that |kind| isn't already in |kinds|. Using std::find should
-      // be fast enough since |kinds| can contain at most 4 items.
-      if (std::find(kinds.begin(), kinds.end(), kind) == kinds.end()) {
-        kinds.push_back(kind);
-      }
+      maps.push_back(&map);
     } else {
       needs_fallback_builtin_call = true;
     }
   }
+
   inference.RelyOnMapsPreferStability(dependencies(), jsgraph(), &effect,
                                       control, p.feedback());
 
-  if (kinds.empty()) {
+  if (maps.empty()) {
     // No map in the feedback supports fast iteration. Keeping the builtin call.
     return NoChange();
   }
@@ -5660,13 +5786,11 @@ Reduction JSCallReducer::ReduceArrayPrototypeAt(Node* node) {
     return NoChange();
   }
 
-  Node* receiver_kind = LoadReceiverElementsKind(receiver, &effect, control);
-
   IteratingArrayBuiltinReducerAssembler a(this, node);
   a.InitializeEffectControl(effect, control);
 
-  TNode<Object> subgraph = a.ReduceArrayPrototypeAt(
-      kinds, needs_fallback_builtin_call, receiver_kind);
+  TNode<Object> subgraph =
+      a.ReduceArrayPrototypeAt(maps, needs_fallback_builtin_call);
   return ReplaceWithSubgraph(&a, subgraph);
 }
 
@@ -5678,7 +5802,6 @@ Reduction JSCallReducer::ReduceArrayPrototypePush(Node* node) {
     return NoChange();
   }
 
-  int const num_values = n.ArgumentCount();
   Node* receiver = n.receiver();
   Effect effect = n.effect();
   Control control = n.control();
@@ -5694,118 +5817,15 @@ Reduction JSCallReducer::ReduceArrayPrototypePush(Node* node) {
   if (!dependencies()->DependOnNoElementsProtector()) {
     return inference.NoChange();
   }
+
   inference.RelyOnMapsPreferStability(dependencies(), jsgraph(), &effect,
                                       control, p.feedback());
 
-  std::vector<Node*> controls_to_merge;
-  std::vector<Node*> effects_to_merge;
-  std::vector<Node*> values_to_merge;
-  Node* return_value = jsgraph()->UndefinedConstant();
-
-  Node* receiver_elements_kind =
-      LoadReceiverElementsKind(receiver, &effect, control);
-  Node* next_control = control;
-  Node* next_effect = effect;
-  for (size_t i = 0; i < kinds.size(); i++) {
-    ElementsKind kind = kinds[i];
-    control = next_control;
-    effect = next_effect;
-    // We do not need branch for the last elements kind.
-    if (i != kinds.size() - 1) {
-      Node* control_node = control;
-      CheckIfElementsKind(receiver_elements_kind, kind, control_node,
-                          &control_node, &next_control);
-      control = control_node;
-    }
-
-    // Collect the value inputs to push.
-    std::vector<Node*> values(num_values);
-    for (int j = 0; j < num_values; ++j) {
-      values[j] = n.Argument(j);
-    }
-
-    for (auto& value : values) {
-      if (IsSmiElementsKind(kind)) {
-        value = effect = graph()->NewNode(simplified()->CheckSmi(p.feedback()),
-                                          value, effect, control);
-      } else if (IsDoubleElementsKind(kind)) {
-        value = effect = graph()->NewNode(
-            simplified()->CheckNumber(p.feedback()), value, effect, control);
-        // Make sure we do not store signaling NaNs into double arrays.
-        value = graph()->NewNode(simplified()->NumberSilenceNaN(), value);
-      }
-    }
-
-    // Load the "length" property of the {receiver}.
-    Node* length = effect = graph()->NewNode(
-        simplified()->LoadField(AccessBuilder::ForJSArrayLength(kind)),
-        receiver, effect, control);
-    return_value = length;
-
-    // Check if we have any {values} to push.
-    if (num_values > 0) {
-      // Compute the resulting "length" of the {receiver}.
-      Node* new_length = return_value = graph()->NewNode(
-          simplified()->NumberAdd(), length, jsgraph()->Constant(num_values));
-
-      // Load the elements backing store of the {receiver}.
-      Node* elements = effect = graph()->NewNode(
-          simplified()->LoadField(AccessBuilder::ForJSObjectElements()),
-          receiver, effect, control);
-      Node* elements_length = effect = graph()->NewNode(
-          simplified()->LoadField(AccessBuilder::ForFixedArrayLength()),
-          elements, effect, control);
-
-      GrowFastElementsMode mode =
-          IsDoubleElementsKind(kind)
-              ? GrowFastElementsMode::kDoubleElements
-              : GrowFastElementsMode::kSmiOrObjectElements;
-      elements = effect = graph()->NewNode(
-          simplified()->MaybeGrowFastElements(mode, p.feedback()), receiver,
-          elements,
-          graph()->NewNode(simplified()->NumberAdd(), length,
-                           jsgraph()->Constant(num_values - 1)),
-          elements_length, effect, control);
-
-      // Update the JSArray::length field. Since this is observable,
-      // there must be no other check after this.
-      effect = graph()->NewNode(
-          simplified()->StoreField(AccessBuilder::ForJSArrayLength(kind)),
-          receiver, new_length, effect, control);
-
-      // Append the {values} to the {elements}.
-      for (int j = 0; j < num_values; ++j) {
-        Node* value = values[j];
-        Node* index = graph()->NewNode(simplified()->NumberAdd(), length,
-                                       jsgraph()->Constant(j));
-        effect =
-            graph()->NewNode(simplified()->StoreElement(
-                                 AccessBuilder::ForFixedArrayElement(kind)),
-                             elements, index, value, effect, control);
-      }
-    }
-
-    controls_to_merge.push_back(control);
-    effects_to_merge.push_back(effect);
-    values_to_merge.push_back(return_value);
-  }
-
-  if (controls_to_merge.size() > 1) {
-    int const count = static_cast<int>(controls_to_merge.size());
-
-    control = graph()->NewNode(common()->Merge(count), count,
-                               &controls_to_merge.front());
-    effects_to_merge.push_back(control);
-    effect = graph()->NewNode(common()->EffectPhi(count), count + 1,
-                              &effects_to_merge.front());
-    values_to_merge.push_back(control);
-    return_value =
-        graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, count),
-                         count + 1, &values_to_merge.front());
-  }
+  IteratingArrayBuiltinReducerAssembler a(this, node);
+  a.InitializeEffectControl(effect, control);
 
-  ReplaceWithValue(node, return_value, effect, control);
-  return Replace(return_value);
+  TNode<Object> subgraph = a.ReduceArrayPrototypePush(&inference);
+  return ReplaceWithSubgraph(&a, subgraph);
 }
 
 // ES6 section 22.1.3.17 Array.prototype.pop ( )
@@ -6075,7 +6095,7 @@ Reduction JSCallReducer::ReduceArrayPrototypeShift(Node* node) {
           ElementAccess const access =
               AccessBuilder::ForFixedArrayElement(kind);
 
-          // When disable FLAG_turbo_loop_variable, typer cannot infer index
+          // When disable v8_flags.turbo_loop_variable, typer cannot infer index
           // is in [1, kMaxCopyElements-1], and will break in representing
           // kRepFloat64 (Range(1, inf)) to kRepWord64 when converting
           // input for kLoadElement. So we need to add type guard here.
@@ -6196,7 +6216,7 @@ Reduction JSCallReducer::ReduceArrayPrototypeShift(Node* node) {
 
 // ES6 section 22.1.3.23 Array.prototype.slice ( )
 Reduction JSCallReducer::ReduceArrayPrototypeSlice(Node* node) {
-  if (!FLAG_turbo_inline_array_builtins) return NoChange();
+  if (!v8_flags.turbo_inline_array_builtins) return NoChange();
   JSCallNode n(node);
   CallParameters const& p = n.Parameters();
   if (p.speculation_mode() == SpeculationMode::kDisallowSpeculation) {
@@ -8236,7 +8256,7 @@ Reduction JSCallReducer::ReduceNumberParseInt(Node* node) {
 Reduction JSCallReducer::ReduceRegExpPrototypeTest(Node* node) {
   JSCallNode n(node);
   CallParameters const& p = n.Parameters();
-  if (FLAG_force_slow_path) return NoChange();
+  if (v8_flags.force_slow_path) return NoChange();
   if (n.ArgumentCount() < 1) return NoChange();
 
   if (p.speculation_mode() == SpeculationMode::kDisallowSpeculation) {
diff --git a/deps/v8/src/compiler/js-create-lowering.cc b/deps/v8/src/compiler/js-create-lowering.cc
index 4885a6c842248d..85e975433748f8 100644
--- a/deps/v8/src/compiler/js-create-lowering.cc
+++ b/deps/v8/src/compiler/js-create-lowering.cc
@@ -359,7 +359,7 @@ Reduction JSCreateLowering::ReduceJSCreateArguments(Node* node) {
       int argument_count = args_state_info.parameter_count() - 1;
       int length = std::max(0, argument_count - start_index);
       static_assert(JSArray::kHeaderSize == 4 * kTaggedSize);
-      a.Allocate(JSArray::kHeaderSize);
+      a.Allocate(ALIGN_TO_ALLOCATION_ALIGNMENT(JSArray::kHeaderSize));
       a.Store(AccessBuilder::ForMap(), jsarray_map);
       a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
               jsgraph()->EmptyFixedArrayConstant());
@@ -1049,7 +1049,7 @@ Reduction JSCreateLowering::ReduceJSCreateKeyValueArray(Node* node) {
   Node* elements = aa.Finish();
 
   AllocationBuilder a(jsgraph(), elements, graph()->start());
-  a.Allocate(JSArray::kHeaderSize);
+  a.Allocate(ALIGN_TO_ALLOCATION_ALIGNMENT(JSArray::kHeaderSize));
   a.Store(AccessBuilder::ForMap(), array_map);
   a.Store(AccessBuilder::ForJSObjectPropertiesOrHashKnownPointer(),
           jsgraph()->EmptyFixedArrayConstant());
diff --git a/deps/v8/src/compiler/js-generic-lowering.cc b/deps/v8/src/compiler/js-generic-lowering.cc
index fe831d1bc8515b..1cca549fbbaafa 100644
--- a/deps/v8/src/compiler/js-generic-lowering.cc
+++ b/deps/v8/src/compiler/js-generic-lowering.cc
@@ -552,6 +552,11 @@ void JSGenericLowering::LowerJSGetSuperConstructor(Node* node) {
                                      AccessBuilder::ForMapPrototype()));
 }
 
+void JSGenericLowering::LowerJSFindNonDefaultConstructorOrConstruct(
+    Node* node) {
+  ReplaceWithBuiltinCall(node, Builtin::kFindNonDefaultConstructorOrConstruct);
+}
+
 void JSGenericLowering::LowerJSHasInPrototypeChain(Node* node) {
   ReplaceWithRuntimeCall(node, Runtime::kHasInPrototypeChain);
 }
@@ -1060,78 +1065,11 @@ void JSGenericLowering::LowerJSWasmCall(Node* node) {}
 #endif  // V8_ENABLE_WEBASSEMBLY
 
 void JSGenericLowering::LowerJSForInPrepare(Node* node) {
-  JSForInPrepareNode n(node);
-  Effect effect(node);            // {node} is kept in the effect chain.
-  Control control = n.control();  // .. but not in the control chain.
-  Node* enumerator = n.enumerator();
-  Node* slot =
-      jsgraph()->UintPtrConstant(n.Parameters().feedback().slot.ToInt());
-
-  std::vector<Edge> use_edges;
-  for (Edge edge : node->use_edges()) use_edges.push_back(edge);
-
-  // {node} will be changed to a builtin call (see below). The returned value
-  // is a fixed array containing {cache_array} and {cache_length}.
-  // TODO(jgruber): This is awkward; what we really want is two return values,
-  // the {cache_array} and {cache_length}, or better yet three return values
-  // s.t. we can avoid the graph rewrites below. Builtin support for multiple
-  // return types is unclear though.
-
-  Node* result_fixed_array = node;
-  Node* cache_type = enumerator;  // Just to clarify the rename.
-  Node* cache_array;
-  Node* cache_length;
-
-  cache_array = effect = graph()->NewNode(
-      machine()->Load(MachineType::AnyTagged()), result_fixed_array,
-      jsgraph()->IntPtrConstant(FixedArray::OffsetOfElementAt(0) -
-                                kHeapObjectTag),
-      effect, control);
-  cache_length = effect = graph()->NewNode(
-      machine()->Load(MachineType::AnyTagged()), result_fixed_array,
-      jsgraph()->IntPtrConstant(FixedArray::OffsetOfElementAt(1) -
-                                kHeapObjectTag),
-      effect, control);
-
-  // Update the uses of {node}.
-  for (Edge edge : use_edges) {
-    Node* const user = edge.from();
-    if (NodeProperties::IsEffectEdge(edge)) {
-      edge.UpdateTo(effect);
-    } else if (NodeProperties::IsControlEdge(edge)) {
-      edge.UpdateTo(control);
-    } else {
-      DCHECK(NodeProperties::IsValueEdge(edge));
-      switch (ProjectionIndexOf(user->op())) {
-        case 0:
-          Replace(user, cache_type);
-          break;
-        case 1:
-          Replace(user, cache_array);
-          break;
-        case 2:
-          Replace(user, cache_length);
-          break;
-        default:
-          UNREACHABLE();
-      }
-    }
-  }
-
-  // Finally, change the original node into a builtin call. This happens here,
-  // after graph rewrites, since the Call does not have a control output and
-  // thus must not have any control uses. Any previously existing control
-  // outputs have been replaced by the graph rewrite above.
-  node->InsertInput(zone(), n.FeedbackVectorIndex(), slot);
-  ReplaceWithBuiltinCall(node, Builtin::kForInPrepare);
+  UNREACHABLE();  // Eliminated in typed lowering.
 }
 
 void JSGenericLowering::LowerJSForInNext(Node* node) {
-  JSForInNextNode n(node);
-  node->InsertInput(
-      zone(), 0,
-      jsgraph()->UintPtrConstant(n.Parameters().feedback().slot.ToInt()));
-  ReplaceWithBuiltinCall(node, Builtin::kForInNext);
+  UNREACHABLE();  // Eliminated in typed lowering.
 }
 
 void JSGenericLowering::LowerJSLoadMessage(Node* node) {
diff --git a/deps/v8/src/compiler/js-heap-broker.cc b/deps/v8/src/compiler/js-heap-broker.cc
index 83246ca90d66d6..48b21bea31e464 100644
--- a/deps/v8/src/compiler/js-heap-broker.cc
+++ b/deps/v8/src/compiler/js-heap-broker.cc
@@ -486,7 +486,7 @@ ProcessedFeedback const& JSHeapBroker::ReadFeedbackForPropertyAccess(
       // if non-deprecation is important.
       if (map.is_deprecated()) {
         // TODO(ishell): support fast map updating if we enable it.
-        CHECK(!FLAG_fast_map_update);
+        CHECK(!v8_flags.fast_map_update);
         base::Optional<Map> maybe_map = MapUpdater::TryUpdateNoLock(
             isolate(), *map.object(), ConcurrencyMode::kConcurrent);
         if (maybe_map.has_value()) {
diff --git a/deps/v8/src/compiler/js-heap-broker.h b/deps/v8/src/compiler/js-heap-broker.h
index a841be74c3b611..1faa1004e943a6 100644
--- a/deps/v8/src/compiler/js-heap-broker.h
+++ b/deps/v8/src/compiler/js-heap-broker.h
@@ -40,16 +40,16 @@ class ObjectRef;
 
 std::ostream& operator<<(std::ostream& os, const ObjectRef& ref);
 
-#define TRACE_BROKER(broker, x)                                      \
-  do {                                                               \
-    if (broker->tracing_enabled() && FLAG_trace_heap_broker_verbose) \
-      StdoutStream{} << broker->Trace() << x << '\n';                \
+#define TRACE_BROKER(broker, x)                                          \
+  do {                                                                   \
+    if (broker->tracing_enabled() && v8_flags.trace_heap_broker_verbose) \
+      StdoutStream{} << broker->Trace() << x << '\n';                    \
   } while (false)
 
-#define TRACE_BROKER_MEMORY(broker, x)                              \
-  do {                                                              \
-    if (broker->tracing_enabled() && FLAG_trace_heap_broker_memory) \
-      StdoutStream{} << broker->Trace() << x << std::endl;          \
+#define TRACE_BROKER_MEMORY(broker, x)                                  \
+  do {                                                                  \
+    if (broker->tracing_enabled() && v8_flags.trace_heap_broker_memory) \
+      StdoutStream{} << broker->Trace() << x << std::endl;              \
   } while (false)
 
 #define TRACE_BROKER_MISSING(broker, x)                                        \
@@ -101,7 +101,7 @@ class V8_EXPORT_PRIVATE JSHeapBroker {
   // For use only in tests, sets default values for some arguments. Avoids
   // churn when new flags are added.
   JSHeapBroker(Isolate* isolate, Zone* broker_zone)
-      : JSHeapBroker(isolate, broker_zone, FLAG_trace_heap_broker,
+      : JSHeapBroker(isolate, broker_zone, v8_flags.trace_heap_broker,
                      CodeKind::TURBOFAN) {}
 
   ~JSHeapBroker();
diff --git a/deps/v8/src/compiler/js-inlining-heuristic.cc b/deps/v8/src/compiler/js-inlining-heuristic.cc
index 4ab224b6cd0d09..e73a9c9f90b1bf 100644
--- a/deps/v8/src/compiler/js-inlining-heuristic.cc
+++ b/deps/v8/src/compiler/js-inlining-heuristic.cc
@@ -14,14 +14,15 @@ namespace v8 {
 namespace internal {
 namespace compiler {
 
-#define TRACE(...)                                                             \
-  do {                                                                         \
-    if (FLAG_trace_turbo_inlining) StdoutStream{} << __VA_ARGS__ << std::endl; \
+#define TRACE(...)                                \
+  do {                                            \
+    if (v8_flags.trace_turbo_inlining)            \
+      StdoutStream{} << __VA_ARGS__ << std::endl; \
   } while (false)
 
 namespace {
 bool IsSmall(int const size) {
-  return size <= FLAG_max_inlined_bytecode_size_small;
+  return size <= v8_flags.max_inlined_bytecode_size_small;
 }
 
 bool CanConsiderForInlining(JSHeapBroker* broker,
@@ -173,7 +174,7 @@ Reduction JSInliningHeuristic::Reduce(Node* node) {
   Candidate candidate = CollectFunctions(node, kMaxCallPolymorphism);
   if (candidate.num_functions == 0) {
     return NoChange();
-  } else if (candidate.num_functions > 1 && !FLAG_polymorphic_inlining) {
+  } else if (candidate.num_functions > 1 && !v8_flags.polymorphic_inlining) {
     TRACE("Not considering call site #"
           << node->id() << ":" << node->op()->mnemonic()
           << ", because polymorphic inlining is disabled");
@@ -248,7 +249,7 @@ Reduction JSInliningHeuristic::Reduce(Node* node) {
   // threshold, i.e. a call site that is only hit once every N
   // invocations of the caller.
   if (candidate.frequency.IsKnown() &&
-      candidate.frequency.value() < FLAG_min_inlining_frequency) {
+      candidate.frequency.value() < v8_flags.min_inlining_frequency) {
     return NoChange();
   }
 
@@ -275,7 +276,7 @@ Reduction JSInliningHeuristic::Reduce(Node* node) {
 
 void JSInliningHeuristic::Finalize() {
   if (candidates_.empty()) return;  // Nothing to do without candidates.
-  if (FLAG_trace_turbo_inlining) PrintCandidates();
+  if (v8_flags.trace_turbo_inlining) PrintCandidates();
 
   // We inline at most one candidate in every iteration of the fixpoint.
   // This is to ensure that we don't consume the full inlining budget
@@ -293,7 +294,7 @@ void JSInliningHeuristic::Finalize() {
     // Make sure we have some extra budget left, so that any small functions
     // exposed by this function would be given a chance to inline.
     double size_of_candidate =
-        candidate.total_size * FLAG_reserve_inline_budget_scale_factor;
+        candidate.total_size * v8_flags.reserve_inline_budget_scale_factor;
     int total_size =
         total_inlined_bytecode_size_ + static_cast<int>(size_of_candidate);
     if (total_size > max_inlined_bytecode_size_cumulative_) {
diff --git a/deps/v8/src/compiler/js-inlining-heuristic.h b/deps/v8/src/compiler/js-inlining-heuristic.h
index 93571653526655..3a830943bdf415 100644
--- a/deps/v8/src/compiler/js-inlining-heuristic.h
+++ b/deps/v8/src/compiler/js-inlining-heuristic.h
@@ -30,9 +30,9 @@ class JSInliningHeuristic final : public AdvancedReducer {
         broker_(broker),
         mode_(mode),
         max_inlined_bytecode_size_cumulative_(
-            FLAG_max_inlined_bytecode_size_cumulative),
+            v8_flags.max_inlined_bytecode_size_cumulative),
         max_inlined_bytecode_size_absolute_(
-            FLAG_max_inlined_bytecode_size_absolute) {}
+            v8_flags.max_inlined_bytecode_size_absolute) {}
 
   const char* reducer_name() const override { return "JSInliningHeuristic"; }
 
diff --git a/deps/v8/src/compiler/js-inlining.cc b/deps/v8/src/compiler/js-inlining.cc
index a3aac2a032f5f8..4baabf3077565f 100644
--- a/deps/v8/src/compiler/js-inlining.cc
+++ b/deps/v8/src/compiler/js-inlining.cc
@@ -34,11 +34,11 @@ namespace {
 static const int kMaxDepthForInlining = 50;
 }  // namespace
 
-#define TRACE(x)                     \
-  do {                               \
-    if (FLAG_trace_turbo_inlining) { \
-      StdoutStream() << x << "\n";   \
-    }                                \
+#define TRACE(x)                         \
+  do {                                   \
+    if (v8_flags.trace_turbo_inlining) { \
+      StdoutStream() << x << "\n";       \
+    }                                    \
   } while (false)
 
 // Provides convenience accessors for the common layout of nodes having either
diff --git a/deps/v8/src/compiler/js-intrinsic-lowering.cc b/deps/v8/src/compiler/js-intrinsic-lowering.cc
index 831697d64574dc..7ad3f5c78d4a16 100644
--- a/deps/v8/src/compiler/js-intrinsic-lowering.cc
+++ b/deps/v8/src/compiler/js-intrinsic-lowering.cc
@@ -70,8 +70,8 @@ Reduction JSIntrinsicLowering::Reduce(Node* node) {
       return ReduceAsyncGeneratorReject(node);
     case Runtime::kInlineAsyncGeneratorResolve:
       return ReduceAsyncGeneratorResolve(node);
-    case Runtime::kInlineAsyncGeneratorYield:
-      return ReduceAsyncGeneratorYield(node);
+    case Runtime::kInlineAsyncGeneratorYieldWithAwait:
+      return ReduceAsyncGeneratorYieldWithAwait(node);
     case Runtime::kInlineGeneratorGetResumeMode:
       return ReduceGeneratorGetResumeMode(node);
     case Runtime::kInlineIncBlockCounter:
@@ -216,9 +216,11 @@ Reduction JSIntrinsicLowering::ReduceAsyncGeneratorResolve(Node* node) {
       0);
 }
 
-Reduction JSIntrinsicLowering::ReduceAsyncGeneratorYield(Node* node) {
+Reduction JSIntrinsicLowering::ReduceAsyncGeneratorYieldWithAwait(Node* node) {
   return Change(
-      node, Builtins::CallableFor(isolate(), Builtin::kAsyncGeneratorYield), 0);
+      node,
+      Builtins::CallableFor(isolate(), Builtin::kAsyncGeneratorYieldWithAwait),
+      0);
 }
 
 Reduction JSIntrinsicLowering::ReduceGeneratorGetResumeMode(Node* node) {
@@ -277,7 +279,7 @@ Reduction JSIntrinsicLowering::ReduceIsJSReceiver(Node* node) {
 }
 
 Reduction JSIntrinsicLowering::ReduceTurbofanStaticAssert(Node* node) {
-  if (FLAG_always_turbofan) {
+  if (v8_flags.always_turbofan) {
     // Ignore static asserts, as we most likely won't have enough information
     RelaxEffectsAndControls(node);
   } else {
diff --git a/deps/v8/src/compiler/js-intrinsic-lowering.h b/deps/v8/src/compiler/js-intrinsic-lowering.h
index 00188243c15a5e..0affbb184dde75 100644
--- a/deps/v8/src/compiler/js-intrinsic-lowering.h
+++ b/deps/v8/src/compiler/js-intrinsic-lowering.h
@@ -53,7 +53,7 @@ class V8_EXPORT_PRIVATE JSIntrinsicLowering final
   Reduction ReduceAsyncGeneratorAwaitUncaught(Node* node);
   Reduction ReduceAsyncGeneratorReject(Node* node);
   Reduction ReduceAsyncGeneratorResolve(Node* node);
-  Reduction ReduceAsyncGeneratorYield(Node* node);
+  Reduction ReduceAsyncGeneratorYieldWithAwait(Node* node);
   Reduction ReduceGeneratorGetResumeMode(Node* node);
   Reduction ReduceIsInstanceType(Node* node, InstanceType instance_type);
   Reduction ReduceIsJSReceiver(Node* node);
diff --git a/deps/v8/src/compiler/js-native-context-specialization.cc b/deps/v8/src/compiler/js-native-context-specialization.cc
index 39302152ed44b2..31b6d2dd0944a4 100644
--- a/deps/v8/src/compiler/js-native-context-specialization.cc
+++ b/deps/v8/src/compiler/js-native-context-specialization.cc
@@ -20,6 +20,7 @@
 #include "src/compiler/linkage.h"
 #include "src/compiler/map-inference.h"
 #include "src/compiler/node-matchers.h"
+#include "src/compiler/node-properties.h"
 #include "src/compiler/property-access-builder.h"
 #include "src/compiler/simplified-operator.h"
 #include "src/compiler/type-cache.h"
@@ -65,7 +66,8 @@ JSNativeContextSpecialization::JSNativeContextSpecialization(
       dependencies_(dependencies),
       zone_(zone),
       shared_zone_(shared_zone),
-      type_cache_(TypeCache::Get()) {}
+      type_cache_(TypeCache::Get()),
+      created_strings_(zone) {}
 
 Reduction JSNativeContextSpecialization::Reduce(Node* node) {
   switch (node->opcode()) {
@@ -79,6 +81,8 @@ Reduction JSNativeContextSpecialization::Reduce(Node* node) {
       return ReduceJSAsyncFunctionResolve(node);
     case IrOpcode::kJSGetSuperConstructor:
       return ReduceJSGetSuperConstructor(node);
+    case IrOpcode::kJSFindNonDefaultConstructorOrConstruct:
+      return ReduceJSFindNonDefaultConstructorOrConstruct(node);
     case IrOpcode::kJSInstanceOf:
       return ReduceJSInstanceOf(node);
     case IrOpcode::kJSHasInPrototypeChain:
@@ -135,7 +139,6 @@ base::Optional<size_t> JSNativeContextSpecialization::GetMaxStringLength(
   HeapObjectMatcher matcher(node);
   if (matcher.HasResolvedValue() && matcher.Ref(broker).IsString()) {
     StringRef input = matcher.Ref(broker).AsString();
-    if (!input.IsContentAccessible()) return base::nullopt;
     return input.length();
   }
 
@@ -196,6 +199,13 @@ Handle<String> JSNativeContextSpecialization::CreateStringConstant(Node* node) {
             ->local_isolate_or_isolate()
             ->factory()
             ->NewNumber<AllocationType::kOld>(number_matcher.ResolvedValue());
+    // Note that we do not store the result of NumberToString in
+    // {created_strings_}, because the latter is used to know if strings are
+    // safe to be used in the background, but we always have as additional
+    // information the node from which the string was created ({node} is that
+    // case), and if this node is a kHeapNumber, then we know that we must have
+    // created the string, and that there it is safe to read. So, we don't need
+    // {created_strings_} in that case.
     return broker()->local_isolate_or_isolate()->factory()->NumberToString(
         num_obj);
   } else {
@@ -213,6 +223,15 @@ bool IsStringConstant(JSHeapBroker* broker, Node* node) {
   HeapObjectMatcher matcher(node);
   return matcher.HasResolvedValue() && matcher.Ref(broker).IsString();
 }
+
+bool IsStringWithNonAccessibleContent(JSHeapBroker* broker, Node* node) {
+  HeapObjectMatcher matcher(node);
+  if (matcher.HasResolvedValue() && matcher.Ref(broker).IsString()) {
+    StringRef input = matcher.Ref(broker).AsString();
+    return !input.IsContentAccessible();
+  }
+  return false;
+}
 }  // namespace
 
 Reduction JSNativeContextSpecialization::ReduceJSAsyncFunctionEnter(
@@ -321,16 +340,14 @@ Reduction JSNativeContextSpecialization::ReduceJSAsyncFunctionResolve(
   return Replace(promise);
 }
 
-namespace {
-
 // Concatenates {left} and {right}. The result is fairly similar to creating a
 // new ConsString with {left} and {right} and then flattening it, which we don't
 // do because String::Flatten does not support background threads. Rather than
 // implementing a full String::Flatten for background threads, we prefered to
 // implement this Concatenate function, which, unlike String::Flatten, doesn't
 // need to replace ConsStrings by ThinStrings.
-Handle<String> Concatenate(Handle<String> left, Handle<String> right,
-                           JSHeapBroker* broker) {
+Handle<String> JSNativeContextSpecialization::Concatenate(
+    Handle<String> left, Handle<String> right) {
   if (left->length() == 0) return right;
   if (right->length() == 0) return left;
 
@@ -357,7 +374,8 @@ Handle<String> Concatenate(Handle<String> left, Handle<String> right,
     // generational write-barrier supports background threads.
     if (!LocalHeap::Current() ||
         (!ObjectInYoungGeneration(*left) && !ObjectInYoungGeneration(*right))) {
-      return broker->local_isolate_or_isolate()
+      return broker()
+          ->local_isolate_or_isolate()
           ->factory()
           ->NewConsString(left, right, AllocationType::kOld)
           .ToHandleChecked();
@@ -367,19 +385,24 @@ Handle<String> Concatenate(Handle<String> left, Handle<String> right,
   // If one of the string is not in readonly space, then we need a
   // SharedStringAccessGuardIfNeeded before accessing its content.
   bool require_guard = SharedStringAccessGuardIfNeeded::IsNeeded(
-                           *left, broker->local_isolate_or_isolate()) ||
+                           *left, broker()->local_isolate_or_isolate()) ||
                        SharedStringAccessGuardIfNeeded::IsNeeded(
-                           *right, broker->local_isolate_or_isolate());
+                           *right, broker()->local_isolate_or_isolate());
   SharedStringAccessGuardIfNeeded access_guard(
-      require_guard ? broker->local_isolate_or_isolate() : nullptr);
+      require_guard ? broker()->local_isolate_or_isolate() : nullptr);
 
   if (left->IsOneByteRepresentation() && right->IsOneByteRepresentation()) {
     // {left} and {right} are 1-byte ==> the result will be 1-byte.
-    Handle<SeqOneByteString> flat =
-        broker->local_isolate_or_isolate()
+    // Note that we need a canonical handle, because we insert in
+    // {created_strings_} the handle's address, which is kinda meaningless if
+    // the handle isn't canonical.
+    Handle<SeqOneByteString> flat = broker()->CanonicalPersistentHandle(
+        broker()
+            ->local_isolate_or_isolate()
             ->factory()
             ->NewRawOneByteString(length, AllocationType::kOld)
-            .ToHandleChecked();
+            .ToHandleChecked());
+    created_strings_.insert(flat);
     DisallowGarbageCollection no_gc;
     String::WriteToFlat(*left, flat->GetChars(no_gc, access_guard), 0,
                         left->length(), GetPtrComprCageBase(*left),
@@ -391,11 +414,13 @@ Handle<String> Concatenate(Handle<String> left, Handle<String> right,
   } else {
     // One (or both) of {left} and {right} is 2-byte ==> the result will be
     // 2-byte.
-    Handle<SeqTwoByteString> flat =
-        broker->local_isolate_or_isolate()
+    Handle<SeqTwoByteString> flat = broker()->CanonicalPersistentHandle(
+        broker()
+            ->local_isolate_or_isolate()
             ->factory()
             ->NewRawTwoByteString(length, AllocationType::kOld)
-            .ToHandleChecked();
+            .ToHandleChecked());
+    created_strings_.insert(flat);
     DisallowGarbageCollection no_gc;
     String::WriteToFlat(*left, flat->GetChars(no_gc, access_guard), 0,
                         left->length(), GetPtrComprCageBase(*left),
@@ -407,7 +432,22 @@ Handle<String> Concatenate(Handle<String> left, Handle<String> right,
   }
 }
 
-}  // namespace
+bool JSNativeContextSpecialization::StringCanSafelyBeRead(Node* const node,
+                                                          Handle<String> str) {
+  DCHECK(node->opcode() == IrOpcode::kHeapConstant ||
+         node->opcode() == IrOpcode::kNumberConstant);
+  if (broker()->IsMainThread()) {
+    // All strings are safe to be read on the main thread.
+    return true;
+  }
+  if (node->opcode() == IrOpcode::kNumberConstant) {
+    // If {node} is a number constant, then {str} is the stringification of this
+    // number which we must have created ourselves.
+    return true;
+  }
+  return !IsStringWithNonAccessibleContent(broker(), node) ||
+         created_strings_.find(str) != created_strings_.end();
+}
 
 Reduction JSNativeContextSpecialization::ReduceJSAdd(Node* node) {
   // TODO(turbofan): This has to run together with the inlining and
@@ -427,10 +467,45 @@ Reduction JSNativeContextSpecialization::ReduceJSAdd(Node* node) {
   // addition won't throw due to too long result.
   if (*lhs_len + *rhs_len <= String::kMaxLength &&
       (IsStringConstant(broker(), lhs) || IsStringConstant(broker(), rhs))) {
-    Handle<String> left = CreateStringConstant(lhs);
-    Handle<String> right = CreateStringConstant(rhs);
+    // We need canonical handles for {left} and {right}, in order to be able to
+    // search {created_strings_} if needed.
+    Handle<String> left =
+        broker()->CanonicalPersistentHandle(CreateStringConstant(lhs));
+    Handle<String> right =
+        broker()->CanonicalPersistentHandle(CreateStringConstant(rhs));
+
+    if (!(StringCanSafelyBeRead(lhs, left) &&
+          StringCanSafelyBeRead(rhs, right))) {
+      // One of {lhs} or {rhs} is not safe to be read in the background.
+
+      if (left->length() + right->length() > ConsString::kMinLength &&
+          (!LocalHeap::Current() || (!ObjectInYoungGeneration(*left) &&
+                                     !ObjectInYoungGeneration(*right)))) {
+        // We can create a ConsString with {left} and {right}, without needing
+        // to read their content (and this ConsString will not introduce
+        // old-to-new pointers from the background).
+        Handle<String> concatenated =
+            broker()
+                ->local_isolate_or_isolate()
+                ->factory()
+                ->NewConsString(left, right, AllocationType::kOld)
+                .ToHandleChecked();
+        Node* reduced = graph()->NewNode(common()->HeapConstant(
+            broker()->CanonicalPersistentHandle(concatenated)));
+        ReplaceWithValue(node, reduced);
+        return Replace(reduced);
+      } else {
+        // Concatenating those strings would not produce a ConsString but rather
+        // a flat string (because the result is small). And, since the strings
+        // are not safe to be read in the background, this wouldn't be safe.
+        // Or, one of the string is in the young generation, and since the
+        // generational barrier doesn't support background threads, we cannot
+        // create the ConsString.
+        return NoChange();
+      }
+    }
 
-    Handle<String> concatenated = Concatenate(left, right, broker());
+    Handle<String> concatenated = Concatenate(left, right);
     Node* reduced = graph()->NewNode(common()->HeapConstant(
         broker()->CanonicalPersistentHandle(concatenated)));
 
@@ -468,6 +543,119 @@ Reduction JSNativeContextSpecialization::ReduceJSGetSuperConstructor(
   return NoChange();
 }
 
+Reduction
+JSNativeContextSpecialization::ReduceJSFindNonDefaultConstructorOrConstruct(
+    Node* node) {
+  JSFindNonDefaultConstructorOrConstructNode n(node);
+  Node* this_function = n.this_function();
+  Node* new_target = n.new_target();
+  Node* effect = n.effect();
+  Control control = n.control();
+
+  // If the JSFindNonDefaultConstructorOrConstruct operation is inside a try
+  // catch, wiring up the graph is complex (reason: if
+  // JSFindNonDefaultConstructorOrConstruct reduces to a constant which is
+  // something else than a default base ctor, it cannot throw an exception, and
+  // the try-catch structure has to be rewired). As this use case is rare, give
+  // up optimizing it here.
+  if (NodeProperties::IsExceptionalCall(node)) {
+    return NoChange();
+  }
+
+  // TODO(v8:13091): Don't produce incomplete stack traces when debug is active.
+  // We already deopt when a breakpoint is set. But it would be even nicer to
+  // avoid producting incomplete stack traces when when debug is active, even if
+  // there are no breakpoints - then a user inspecting stack traces via Dev
+  // Tools would always see the full stack trace.
+
+  // Check if the input is a known JSFunction.
+  HeapObjectMatcher m(this_function);
+  if (!m.HasResolvedValue() || !m.Ref(broker()).IsJSFunction()) {
+    return NoChange();
+  }
+
+  JSFunctionRef this_function_ref = m.Ref(broker()).AsJSFunction();
+  MapRef function_map = this_function_ref.map();
+  HeapObjectRef current = function_map.prototype();
+
+  Node* return_value;
+  Node* ctor_or_instance;
+
+  // Walk the class inheritance tree until we find a ctor which is not a default
+  // derived ctor.
+  while (true) {
+    if (!current.IsJSFunction()) {
+      return NoChange();
+    }
+    JSFunctionRef current_function = current.AsJSFunction();
+
+    // If there are class fields, bail out. TODO(v8:13091): Handle them here.
+    if (current_function.shared().requires_instance_members_initializer()) {
+      return NoChange();
+    }
+
+    // If there are private methods, bail out. TODO(v8:13091): Handle them here.
+    if (current_function.context().scope_info().ClassScopeHasPrivateBrand()) {
+      return NoChange();
+    }
+
+    FunctionKind kind = current_function.shared().kind();
+
+    if (kind != FunctionKind::kDefaultDerivedConstructor) {
+      // The hierarchy walk will end here; this is the last change to bail out
+      // before creating new nodes.
+      if (!dependencies()->DependOnArrayIteratorProtector()) {
+        return NoChange();
+      }
+
+      if (kind == FunctionKind::kDefaultBaseConstructor) {
+        return_value = jsgraph()->BooleanConstant(true);
+
+        // Generate a builtin call for creating the instance.
+        Node* constructor = jsgraph()->Constant(current_function);
+
+        effect = ctor_or_instance = graph()->NewNode(
+            jsgraph()->javascript()->Create(), constructor, new_target,
+            n.context(), n.frame_state(), effect, control);
+      } else {
+        return_value = jsgraph()->BooleanConstant(false);
+        ctor_or_instance = jsgraph()->Constant(current_function);
+      }
+      break;
+    }
+
+    // Keep walking up the class tree.
+    current = current_function.map().prototype();
+  }
+
+  dependencies()->DependOnStablePrototypeChain(function_map,
+                                               WhereToStart::kStartAtReceiver);
+
+  // Update the uses of {node}.
+  for (Edge edge : node->use_edges()) {
+    Node* const user = edge.from();
+    if (NodeProperties::IsEffectEdge(edge)) {
+      edge.UpdateTo(effect);
+    } else if (NodeProperties::IsControlEdge(edge)) {
+      edge.UpdateTo(control);
+    } else {
+      DCHECK(NodeProperties::IsValueEdge(edge));
+      switch (ProjectionIndexOf(user->op())) {
+        case 0:
+          Replace(user, return_value);
+          break;
+        case 1:
+          Replace(user, ctor_or_instance);
+          break;
+        default:
+          UNREACHABLE();
+      }
+    }
+  }
+  node->Kill();
+  return Replace(return_value);
+}
+
 Reduction JSNativeContextSpecialization::ReduceJSInstanceOf(Node* node) {
   JSInstanceOfNode n(node);
   FeedbackParameter const& p = n.Parameters();
@@ -1164,7 +1352,7 @@ Reduction JSNativeContextSpecialization::ReduceMegaDOMPropertyAccess(
       simplified()->LoadField(AccessBuilder::ForMapInstanceType()),
       receiver_map, effect, control);
 
-  if (FLAG_embedder_instance_types && range_start != 0) {
+  if (v8_flags.embedder_instance_types && range_start != 0) {
     // Embedder instance ID is set, doing a simple range check.
     Node* diff_to_start =
         graph()->NewNode(simplified()->NumberSubtract(), receiver_instance_type,
@@ -1251,7 +1439,7 @@ Reduction JSNativeContextSpecialization::ReduceNamedAccess(
   // lookup_start_object = the object where we start looking for the property.
   Node* lookup_start_object;
   if (node->opcode() == IrOpcode::kJSLoadNamedFromSuper) {
-    DCHECK(FLAG_super_ic);
+    DCHECK(v8_flags.super_ic);
     JSLoadNamedFromSuperNode n(node);
     // Lookup start object is the __proto__ of the home object.
     lookup_start_object = effect =
@@ -2438,10 +2626,11 @@ Node* JSNativeContextSpecialization::InlinePropertyGetterCall(
     if (receiver != lookup_start_object) {
       return nullptr;
     }
-    Node* holder = access_info.holder().has_value()
-                       ? jsgraph()->Constant(access_info.holder().value())
-                       : receiver;
-    value = InlineApiCall(receiver, holder, frame_state, nullptr, effect,
+    Node* api_holder =
+        access_info.api_holder().has_value()
+            ? jsgraph()->Constant(access_info.api_holder().value())
+            : receiver;
+    value = InlineApiCall(receiver, api_holder, frame_state, nullptr, effect,
                           control, constant.AsFunctionTemplateInfo());
   }
   // Remember to rewire the IfException edge if this is inside a try-block.
@@ -2472,10 +2661,11 @@ void JSNativeContextSpecialization::InlinePropertySetterCall(
         target, receiver, value, feedback, context, frame_state, *effect,
         *control);
   } else {
-    Node* holder = access_info.holder().has_value()
-                       ? jsgraph()->Constant(access_info.holder().value())
-                       : receiver;
-    InlineApiCall(receiver, holder, frame_state, value, effect, control,
+    Node* api_holder =
+        access_info.api_holder().has_value()
+            ? jsgraph()->Constant(access_info.api_holder().value())
+            : receiver;
+    InlineApiCall(receiver, api_holder, frame_state, value, effect, control,
                   constant.AsFunctionTemplateInfo());
   }
   // Remember to rewire the IfException edge if this is inside a try-block.
@@ -2490,8 +2680,9 @@ void JSNativeContextSpecialization::InlinePropertySetterCall(
 }
 
 Node* JSNativeContextSpecialization::InlineApiCall(
-    Node* receiver, Node* holder, Node* frame_state, Node* value, Node** effect,
-    Node** control, FunctionTemplateInfoRef const& function_template_info) {
+    Node* receiver, Node* api_holder, Node* frame_state, Node* value,
+    Node** effect, Node** control,
+    FunctionTemplateInfoRef const& function_template_info) {
   if (!function_template_info.call_code().has_value()) {
     TRACE_BROKER_MISSING(broker(), "call code for function template info "
                                        << function_template_info);
@@ -2520,9 +2711,8 @@ Node* JSNativeContextSpecialization::InlineApiCall(
 
   // Add CallApiCallbackStub's register argument as well.
   Node* context = jsgraph()->Constant(native_context());
-  Node* inputs[11] = {
-      code,    function_reference, jsgraph()->Constant(argc), data, holder,
-      receiver};
+  Node* inputs[11] = {code, function_reference, jsgraph()->Constant(argc),
+                      data, api_holder,         receiver};
   int index = 6 + argc;
   inputs[index++] = context;
   inputs[index++] = frame_state;
@@ -3165,7 +3355,7 @@ JSNativeContextSpecialization::BuildElementAccess(
 
     // Don't try to store to a copy-on-write backing store (unless supported by
     // the store mode).
-    if (keyed_mode.access_mode() == AccessMode::kStore &&
+    if (IsAnyStore(keyed_mode.access_mode()) &&
         IsSmiOrObjectElementsKind(elements_kind) &&
         !IsCOWHandlingStoreMode(keyed_mode.store_mode())) {
       effect = graph()->NewNode(
diff --git a/deps/v8/src/compiler/js-native-context-specialization.h b/deps/v8/src/compiler/js-native-context-specialization.h
index 4996cec82eb1a0..4730f9850d094c 100644
--- a/deps/v8/src/compiler/js-native-context-specialization.h
+++ b/deps/v8/src/compiler/js-native-context-specialization.h
@@ -10,6 +10,7 @@
 #include "src/compiler/graph-reducer.h"
 #include "src/compiler/js-heap-broker.h"
 #include "src/deoptimizer/deoptimize-reason.h"
+#include "src/zone/zone-containers.h"
 
 namespace v8 {
 namespace internal {
@@ -74,6 +75,7 @@ class V8_EXPORT_PRIVATE JSNativeContextSpecialization final
   Reduction ReduceJSAsyncFunctionReject(Node* node);
   Reduction ReduceJSAsyncFunctionResolve(Node* node);
   Reduction ReduceJSGetSuperConstructor(Node* node);
+  Reduction ReduceJSFindNonDefaultConstructorOrConstruct(Node* node);
   Reduction ReduceJSInstanceOf(Node* node);
   Reduction ReduceJSHasInPrototypeChain(Node* node);
   Reduction ReduceJSOrdinaryHasInstance(Node* node);
@@ -180,7 +182,7 @@ class V8_EXPORT_PRIVATE JSNativeContextSpecialization final
                                 Node** control,
                                 ZoneVector<Node*>* if_exceptions,
                                 PropertyAccessInfo const& access_info);
-  Node* InlineApiCall(Node* receiver, Node* holder, Node* frame_state,
+  Node* InlineApiCall(Node* receiver, Node* api_holder, Node* frame_state,
                       Node* value, Node** effect, Node** control,
                       FunctionTemplateInfoRef const& function_template_info);
 
@@ -205,6 +207,17 @@ class V8_EXPORT_PRIVATE JSNativeContextSpecialization final
   Node* BuildCheckEqualsName(NameRef const& name, Node* value, Node* effect,
                              Node* control);
 
+  // Concatenates {left} and {right}.
+  Handle<String> Concatenate(Handle<String> left, Handle<String> right);
+
+  // Returns true if {str} can safely be read:
+  //   - if we are on the main thread, then any string can safely be read
+  //   - in the background, we can only read some string shapes, except if we
+  //     created the string ourselves.
+  // {node} is the node from which we got {str}, but which is still taken as
+  // parameter to simplify the checks.
+  bool StringCanSafelyBeRead(Node* const node, Handle<String> str);
+
   // Checks if we can turn the hole into undefined when loading an element
   // from an object with one of the {receiver_maps}; sets up appropriate
   // code dependencies and might use the array protector cell.
@@ -264,6 +277,9 @@ class V8_EXPORT_PRIVATE JSNativeContextSpecialization final
   Zone* const zone_;
   Zone* const shared_zone_;
   TypeCache const* type_cache_;
+  ZoneUnorderedSet<Handle<String>, Handle<String>::hash,
+                   Handle<String>::equal_to>
+      created_strings_;
 };
 
 DEFINE_OPERATORS_FOR_FLAGS(JSNativeContextSpecialization::Flags)
diff --git a/deps/v8/src/compiler/js-operator.cc b/deps/v8/src/compiler/js-operator.cc
index 3945a8730f1d2c..8af8e7d32fb68f 100644
--- a/deps/v8/src/compiler/js-operator.cc
+++ b/deps/v8/src/compiler/js-operator.cc
@@ -770,6 +770,7 @@ Type JSWasmCallNode::TypeForWasmReturnType(const wasm::ValueType& type) {
   V(RejectPromise, Operator::kNoDeopt | Operator::kNoThrow, 3, 1)        \
   V(ResolvePromise, Operator::kNoDeopt | Operator::kNoThrow, 2, 1)       \
   V(GetSuperConstructor, Operator::kNoWrite | Operator::kNoThrow, 1, 1)  \
+  V(FindNonDefaultConstructorOrConstruct, Operator::kNoProperties, 2, 2) \
   V(ParseInt, Operator::kNoProperties, 2, 1)                             \
   V(RegExpTest, Operator::kNoProperties, 2, 1)
 
diff --git a/deps/v8/src/compiler/js-operator.h b/deps/v8/src/compiler/js-operator.h
index 12408aea6e0299..623f166bc20d9a 100644
--- a/deps/v8/src/compiler/js-operator.h
+++ b/deps/v8/src/compiler/js-operator.h
@@ -1040,6 +1040,8 @@ class V8_EXPORT_PRIVATE JSOperatorBuilder final
 
   const Operator* GetSuperConstructor();
 
+  const Operator* FindNonDefaultConstructorOrConstruct();
+
   const Operator* CreateGeneratorObject();
 
   const Operator* LoadGlobal(const NameRef& name,
@@ -1757,6 +1759,22 @@ class JSForInNextNode final : public JSNodeWrapperBase {
 #undef INPUTS
 };
 
+class JSFindNonDefaultConstructorOrConstructNode final
+    : public JSNodeWrapperBase {
+ public:
+  explicit constexpr JSFindNonDefaultConstructorOrConstructNode(Node* node)
+      : JSNodeWrapperBase(node) {
+    DCHECK_EQ(IrOpcode::kJSFindNonDefaultConstructorOrConstruct,
+              node->opcode());
+  }
+
+#define INPUTS(V)                           \
+  V(ThisFunction, this_function, 0, Object) \
+  V(NewTarget, new_target, 1, Object)
+  INPUTS(DEFINE_INPUT_ACCESSORS)
+#undef INPUTS
+};
+
 #undef DEFINE_INPUT_ACCESSORS
 
 }  // namespace compiler
diff --git a/deps/v8/src/compiler/js-type-hint-lowering.cc b/deps/v8/src/compiler/js-type-hint-lowering.cc
index 0f450106802b3c..54b3d056b5cd99 100644
--- a/deps/v8/src/compiler/js-type-hint-lowering.cc
+++ b/deps/v8/src/compiler/js-type-hint-lowering.cc
@@ -36,6 +36,7 @@ bool BinaryOperationHintToNumberOperationHint(
     case BinaryOperationHint::kNone:
     case BinaryOperationHint::kString:
     case BinaryOperationHint::kBigInt:
+    case BinaryOperationHint::kBigInt64:
       break;
   }
   return false;
@@ -52,6 +53,9 @@ bool BinaryOperationHintToBigIntOperationHint(
     case BinaryOperationHint::kNone:
     case BinaryOperationHint::kString:
       return false;
+    case BinaryOperationHint::kBigInt64:
+      *bigint_hint = BigIntOperationHint::kBigInt64;
+      return true;
     case BinaryOperationHint::kBigInt:
       *bigint_hint = BigIntOperationHint::kBigInt;
       return true;
diff --git a/deps/v8/src/compiler/linkage.h b/deps/v8/src/compiler/linkage.h
index e65efa8db68b86..3b41f3bc199a68 100644
--- a/deps/v8/src/compiler/linkage.h
+++ b/deps/v8/src/compiler/linkage.h
@@ -108,7 +108,7 @@ class LinkageLocation {
   }
 
   static LinkageLocation ForSavedCallerConstantPool() {
-    DCHECK(V8_EMBEDDED_CONSTANT_POOL);
+    DCHECK(V8_EMBEDDED_CONSTANT_POOL_BOOL);
     return ForCalleeFrameSlot((StandardFrameConstants::kCallerPCOffset -
                                StandardFrameConstants::kConstantPoolOffset) /
                                   kSystemPointerSize,
diff --git a/deps/v8/src/compiler/load-elimination.cc b/deps/v8/src/compiler/load-elimination.cc
index d526dc1cae736e..cc56abe4930470 100644
--- a/deps/v8/src/compiler/load-elimination.cc
+++ b/deps/v8/src/compiler/load-elimination.cc
@@ -72,7 +72,7 @@ bool MustAlias(Node* a, Node* b) {
 }  // namespace
 
 Reduction LoadElimination::Reduce(Node* node) {
-  if (FLAG_trace_turbo_load_elimination) {
+  if (v8_flags.trace_turbo_load_elimination) {
     if (node->op()->EffectInputCount() > 0) {
       PrintF(" visit #%d:%s", node->id(), node->op()->mnemonic());
       if (node->op()->ValueInputCount() > 0) {
diff --git a/deps/v8/src/compiler/loop-analysis.cc b/deps/v8/src/compiler/loop-analysis.cc
index a9682e955d0c44..715e6b18a34eb4 100644
--- a/deps/v8/src/compiler/loop-analysis.cc
+++ b/deps/v8/src/compiler/loop-analysis.cc
@@ -5,6 +5,7 @@
 #include "src/compiler/loop-analysis.h"
 
 #include "src/codegen/tick-counter.h"
+#include "src/compiler/all-nodes.h"
 #include "src/compiler/common-operator.h"
 #include "src/compiler/graph.h"
 #include "src/compiler/node-marker.h"
@@ -542,7 +543,7 @@ LoopTree* LoopFinder::BuildLoopTree(Graph* graph, TickCounter* tick_counter,
       graph->zone()->New<LoopTree>(graph->NodeCount(), graph->zone());
   LoopFinderImpl finder(graph, loop_tree, tick_counter, zone);
   finder.Run();
-  if (FLAG_trace_turbo_loop) {
+  if (v8_flags.trace_turbo_loop) {
     finder.Print();
   }
   return loop_tree;
@@ -551,7 +552,8 @@ LoopTree* LoopFinder::BuildLoopTree(Graph* graph, TickCounter* tick_counter,
 #if V8_ENABLE_WEBASSEMBLY
 // static
 ZoneUnorderedSet<Node*>* LoopFinder::FindSmallInnermostLoopFromHeader(
-    Node* loop_header, Zone* zone, size_t max_size, bool calls_are_large) {
+    Node* loop_header, AllNodes& all_nodes, Zone* zone, size_t max_size,
+    bool calls_are_large) {
   auto* visited = zone->New<ZoneUnorderedSet<Node*>>(zone);
   std::vector<Node*> queue;
 
@@ -655,6 +657,8 @@ ZoneUnorderedSet<Node*>* LoopFinder::FindSmallInnermostLoopFromHeader(
     // The loop header is allowed to point outside the loop.
     if (node == loop_header) continue;
 
+    if (!all_nodes.IsLive(node)) continue;
+
     for (Edge edge : node->input_edges()) {
       Node* input = edge.to();
       if (NodeProperties::IsControlEdge(edge) && visited->count(input) == 0 &&
@@ -694,7 +698,7 @@ bool LoopFinder::HasMarkedExits(LoopTree* loop_tree,
             unmarked_exit = (use->opcode() != IrOpcode::kTerminate);
         }
         if (unmarked_exit) {
-          if (FLAG_trace_turbo_loop) {
+          if (v8_flags.trace_turbo_loop) {
             PrintF(
                 "Cannot peel loop %i. Loop exit without explicit mark: Node %i "
                 "(%s) is inside loop, but its use %i (%s) is outside.\n",
diff --git a/deps/v8/src/compiler/loop-analysis.h b/deps/v8/src/compiler/loop-analysis.h
index e7c09da105dcac..d3c53b850be592 100644
--- a/deps/v8/src/compiler/loop-analysis.h
+++ b/deps/v8/src/compiler/loop-analysis.h
@@ -26,6 +26,7 @@ namespace compiler {
 static const int kAssumedLoopEntryIndex = 0;  // assume loops are entered here.
 
 class LoopFinderImpl;
+class AllNodes;
 
 using NodeRange = base::iterator_range<Node**>;
 
@@ -190,7 +191,8 @@ class V8_EXPORT_PRIVATE LoopFinder {
   //    calls to a set of wasm builtins,
   // 3) a nested loop is found in the loop.
   static ZoneUnorderedSet<Node*>* FindSmallInnermostLoopFromHeader(
-      Node* loop_header, Zone* zone, size_t max_size, bool calls_are_large);
+      Node* loop_header, AllNodes& all_nodes, Zone* zone, size_t max_size,
+      bool calls_are_large);
 #endif
 };
 
diff --git a/deps/v8/src/compiler/loop-peeling.cc b/deps/v8/src/compiler/loop-peeling.cc
index cfc149f63991ac..ee46d5e49474c4 100644
--- a/deps/v8/src/compiler/loop-peeling.cc
+++ b/deps/v8/src/compiler/loop-peeling.cc
@@ -225,7 +225,7 @@ void LoopPeeler::PeelInnerLoops(LoopTree::Loop* loop) {
   }
   // Only peel small-enough loops.
   if (loop->TotalSize() > LoopPeeler::kMaxPeeledNodes) return;
-  if (FLAG_trace_turbo_loop) {
+  if (v8_flags.trace_turbo_loop) {
     PrintF("Peeling loop with header: ");
     for (Node* node : loop_tree_->HeaderNodes(loop)) {
       PrintF("%i ", node->id());
diff --git a/deps/v8/src/compiler/loop-variable-optimizer.cc b/deps/v8/src/compiler/loop-variable-optimizer.cc
index 7f16e243c5d7bd..8d1caa22feb394 100644
--- a/deps/v8/src/compiler/loop-variable-optimizer.cc
+++ b/deps/v8/src/compiler/loop-variable-optimizer.cc
@@ -17,9 +17,9 @@ namespace internal {
 namespace compiler {
 
 // Macro for outputting trace information from representation inference.
-#define TRACE(...)                                  \
-  do {                                              \
-    if (FLAG_trace_turbo_loop) PrintF(__VA_ARGS__); \
+#define TRACE(...)                                      \
+  do {                                                  \
+    if (v8_flags.trace_turbo_loop) PrintF(__VA_ARGS__); \
   } while (false)
 
 LoopVariableOptimizer::LoopVariableOptimizer(Graph* graph,
@@ -76,7 +76,7 @@ void LoopVariableOptimizer::Run() {
 
 void InductionVariable::AddUpperBound(Node* bound,
                                       InductionVariable::ConstraintKind kind) {
-  if (FLAG_trace_turbo_loop) {
+  if (v8_flags.trace_turbo_loop) {
     StdoutStream{} << "New upper bound for " << phi()->id() << " (loop "
                    << NodeProperties::GetControlInput(phi())->id()
                    << "): " << *bound << std::endl;
@@ -86,7 +86,7 @@ void InductionVariable::AddUpperBound(Node* bound,
 
 void InductionVariable::AddLowerBound(Node* bound,
                                       InductionVariable::ConstraintKind kind) {
-  if (FLAG_trace_turbo_loop) {
+  if (v8_flags.trace_turbo_loop) {
     StdoutStream{} << "New lower bound for " << phi()->id() << " (loop "
                    << NodeProperties::GetControlInput(phi())->id()
                    << "): " << *bound;
diff --git a/deps/v8/src/compiler/machine-graph-verifier.cc b/deps/v8/src/compiler/machine-graph-verifier.cc
index 664f2748404978..64f6a5a0c0c20a 100644
--- a/deps/v8/src/compiler/machine-graph-verifier.cc
+++ b/deps/v8/src/compiler/machine-graph-verifier.cc
@@ -51,6 +51,7 @@ class MachineRepresentationInferrer {
                           : MachineRepresentation::kBit;
       case IrOpcode::kInt64AddWithOverflow:
       case IrOpcode::kInt64SubWithOverflow:
+      case IrOpcode::kInt64MulWithOverflow:
         CHECK_LE(index, static_cast<size_t>(1));
         return index == 0 ? MachineRepresentation::kWord64
                           : MachineRepresentation::kBit;
diff --git a/deps/v8/src/compiler/machine-operator-reducer.cc b/deps/v8/src/compiler/machine-operator-reducer.cc
index 0d1bc47fc3483e..9436303aded017 100644
--- a/deps/v8/src/compiler/machine-operator-reducer.cc
+++ b/deps/v8/src/compiler/machine-operator-reducer.cc
@@ -1489,15 +1489,15 @@ Reduction MachineOperatorReducer::ReduceWord64Comparisons(Node* node) {
       m.left().op() == machine()->Word64SarShiftOutZeros() &&
       m.left().node()->UseCount() == 1) {
     Int64BinopMatcher mleft(m.left().node());
-    int64_t right = m.right().ResolvedValue();
+    uint64_t right = m.right().ResolvedValue();
     if (mleft.right().HasResolvedValue()) {
       auto shift = mleft.right().ResolvedValue();
       if (CanRevertLeftShiftWithRightShift<int64_t>(right, shift)) {
         sign_extended = mleft.left().IsChangeInt32ToInt64();
-        int64_t value = right << shift;
+        uint64_t value = right << shift;
         // Reducing to 32-bit comparison when possible.
         if ((sign_extended || mleft.left().IsChangeUint32ToUint64()) &&
-            CanTruncate(value)) {
+            CanTruncate(static_cast<int64_t>(value))) {
           NodeProperties::ChangeOp(
               node, Map64To32Comparison(node->op(), sign_extended));
           node->ReplaceInput(0, mleft.left().node()->InputAt(0));
@@ -1516,16 +1516,16 @@ Reduction MachineOperatorReducer::ReduceWord64Comparisons(Node* node) {
   if (m.left().HasResolvedValue() &&
       m.right().op() == machine()->Word64SarShiftOutZeros() &&
       m.right().node()->UseCount() == 1) {
-    int64_t left = m.left().ResolvedValue();
+    uint64_t left = m.left().ResolvedValue();
     Int64BinopMatcher mright(m.right().node());
     if (mright.right().HasResolvedValue()) {
       auto shift = mright.right().ResolvedValue();
       if (CanRevertLeftShiftWithRightShift<int64_t>(left, shift)) {
         sign_extended = mright.left().IsChangeInt32ToInt64();
-        int64_t value = left << shift;
+        uint64_t value = left << shift;
         // Reducing to 32-bit comparison when possible.
         if ((sign_extended || mright.left().IsChangeUint32ToUint64()) &&
-            CanTruncate(value)) {
+            CanTruncate(static_cast<int64_t>(value))) {
           NodeProperties::ChangeOp(
               node, Map64To32Comparison(node->op(), sign_extended));
           node->ReplaceInput(0, Int32Constant(static_cast<int32_t>(value)));
diff --git a/deps/v8/src/compiler/machine-operator.cc b/deps/v8/src/compiler/machine-operator.cc
index 859de257a350d0..5a7ccfe3dcf614 100644
--- a/deps/v8/src/compiler/machine-operator.cc
+++ b/deps/v8/src/compiler/machine-operator.cc
@@ -305,25 +305,27 @@ std::ostream& operator<<(std::ostream& os, TruncateKind kind) {
 
 // The format is:
 // V(Name, properties, value_input_count, control_input_count, output_count)
-#define PURE_BINARY_OP_LIST_64(V)                                        \
-  V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
-  V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)  \
-  V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
-  V(Word64Shl, Operator::kNoProperties, 2, 0, 1)                         \
-  V(Word64Shr, Operator::kNoProperties, 2, 0, 1)                         \
-  V(Word64Ror, Operator::kNoProperties, 2, 0, 1)                         \
-  V(Word64RorLowerable, Operator::kNoProperties, 2, 1, 1)                \
-  V(Word64Equal, Operator::kCommutative, 2, 0, 1)                        \
-  V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)  \
-  V(Int64Sub, Operator::kNoProperties, 2, 0, 1)                          \
-  V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)  \
-  V(Int64Div, Operator::kNoProperties, 2, 1, 1)                          \
-  V(Int64Mod, Operator::kNoProperties, 2, 1, 1)                          \
-  V(Int64LessThan, Operator::kNoProperties, 2, 0, 1)                     \
-  V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1)              \
-  V(Uint64Div, Operator::kNoProperties, 2, 1, 1)                         \
-  V(Uint64Mod, Operator::kNoProperties, 2, 1, 1)                         \
-  V(Uint64LessThan, Operator::kNoProperties, 2, 0, 1)                    \
+#define PURE_BINARY_OP_LIST_64(V)                                            \
+  V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)     \
+  V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)      \
+  V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)     \
+  V(Word64Shl, Operator::kNoProperties, 2, 0, 1)                             \
+  V(Word64Shr, Operator::kNoProperties, 2, 0, 1)                             \
+  V(Word64Ror, Operator::kNoProperties, 2, 0, 1)                             \
+  V(Word64RorLowerable, Operator::kNoProperties, 2, 1, 1)                    \
+  V(Word64Equal, Operator::kCommutative, 2, 0, 1)                            \
+  V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)      \
+  V(Int64Sub, Operator::kNoProperties, 2, 0, 1)                              \
+  V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)      \
+  V(Int64MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1)  \
+  V(Int64Div, Operator::kNoProperties, 2, 1, 1)                              \
+  V(Int64Mod, Operator::kNoProperties, 2, 1, 1)                              \
+  V(Int64LessThan, Operator::kNoProperties, 2, 0, 1)                         \
+  V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1)                  \
+  V(Uint64MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
+  V(Uint64Div, Operator::kNoProperties, 2, 1, 1)                             \
+  V(Uint64Mod, Operator::kNoProperties, 2, 1, 1)                             \
+  V(Uint64LessThan, Operator::kNoProperties, 2, 0, 1)                        \
   V(Uint64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1)
 
 // The format is:
@@ -673,7 +675,8 @@ std::ostream& operator<<(std::ostream& os, TruncateKind kind) {
   V(Int32SubWithOverflow, Operator::kNoProperties)                         \
   V(Int32MulWithOverflow, Operator::kAssociative | Operator::kCommutative) \
   V(Int64AddWithOverflow, Operator::kAssociative | Operator::kCommutative) \
-  V(Int64SubWithOverflow, Operator::kNoProperties)
+  V(Int64SubWithOverflow, Operator::kNoProperties)                         \
+  V(Int64MulWithOverflow, Operator::kAssociative | Operator::kCommutative)
 
 #define MACHINE_TYPE_LIST(V) \
   V(Float32)                 \
diff --git a/deps/v8/src/compiler/machine-operator.h b/deps/v8/src/compiler/machine-operator.h
index b84106b2a10ea0..5e28ea15f6f8ef 100644
--- a/deps/v8/src/compiler/machine-operator.h
+++ b/deps/v8/src/compiler/machine-operator.h
@@ -533,6 +533,8 @@ class V8_EXPORT_PRIVATE MachineOperatorBuilder final
   const Operator* Int64Sub();
   const Operator* Int64SubWithOverflow();
   const Operator* Int64Mul();
+  const Operator* Int64MulHigh();
+  const Operator* Int64MulWithOverflow();
   const Operator* Int64Div();
   const Operator* Int64Mod();
   const Operator* Int64LessThan();
@@ -541,6 +543,7 @@ class V8_EXPORT_PRIVATE MachineOperatorBuilder final
   const Operator* Uint64LessThan();
   const Operator* Uint64LessThanOrEqual();
   const Operator* Uint64Mod();
+  const Operator* Uint64MulHigh();
 
   // This operator reinterprets the bits of a tagged pointer as a word.
   const Operator* BitcastTaggedToWord();
diff --git a/deps/v8/src/compiler/memory-lowering.cc b/deps/v8/src/compiler/memory-lowering.cc
index 6e7d0a2ce6d7f3..306063fba9e212 100644
--- a/deps/v8/src/compiler/memory-lowering.cc
+++ b/deps/v8/src/compiler/memory-lowering.cc
@@ -48,7 +48,7 @@ class MemoryLowering::AllocationGroup final : public ZoneObject {
   static inline AllocationType CheckAllocationType(AllocationType allocation) {
     // For non-generational heap, all young allocations are redirected to old
     // space.
-    if (FLAG_single_generation && allocation == AllocationType::kYoung) {
+    if (v8_flags.single_generation && allocation == AllocationType::kYoung) {
       return AllocationType::kOld;
     }
     return allocation;
@@ -131,13 +131,39 @@ Node* MemoryLowering::GetWasmInstanceNode() {
 
 #define __ gasm()->
 
+Node* MemoryLowering::AlignToAllocationAlignment(Node* value) {
+  if (!V8_COMPRESS_POINTERS_8GB_BOOL) return value;
+
+  auto already_aligned = __ MakeLabel(MachineRepresentation::kWord64);
+  Node* alignment_check = __ WordEqual(
+      __ WordAnd(value, __ UintPtrConstant(kObjectAlignment8GbHeapMask)),
+      __ UintPtrConstant(0));
+
+  __ GotoIf(alignment_check, &already_aligned, value);
+  {
+    Node* aligned_value;
+    if (kObjectAlignment8GbHeap == 2 * kTaggedSize) {
+      aligned_value = __ IntPtrAdd(value, __ IntPtrConstant(kTaggedSize));
+    } else {
+      aligned_value = __ WordAnd(
+          __ IntPtrAdd(value, __ IntPtrConstant(kObjectAlignment8GbHeapMask)),
+          __ UintPtrConstant(~kObjectAlignment8GbHeapMask));
+    }
+    __ Goto(&already_aligned, aligned_value);
+  }
+
+  __ Bind(&already_aligned);
+
+  return already_aligned.PhiAt(0);
+}
+
 Reduction MemoryLowering::ReduceAllocateRaw(
     Node* node, AllocationType allocation_type,
     AllowLargeObjects allow_large_objects, AllocationState const** state_ptr) {
   DCHECK_EQ(IrOpcode::kAllocateRaw, node->opcode());
   DCHECK_IMPLIES(allocation_folding_ == AllocationFolding::kDoAllocationFolding,
                  state_ptr != nullptr);
-  if (FLAG_single_generation && allocation_type == AllocationType::kYoung) {
+  if (v8_flags.single_generation && allocation_type == AllocationType::kYoung) {
     allocation_type = AllocationType::kOld;
   }
   // Code objects may have a maximum size smaller than kMaxHeapObjectSize due to
@@ -232,9 +258,10 @@ Reduction MemoryLowering::ReduceAllocateRaw(
   // Check if we can fold this allocation into a previous allocation represented
   // by the incoming {state}.
   IntPtrMatcher m(size);
-  if (m.IsInRange(0, kMaxRegularHeapObjectSize) && FLAG_inline_new &&
+  if (m.IsInRange(0, kMaxRegularHeapObjectSize) && v8_flags.inline_new &&
       allocation_folding_ == AllocationFolding::kDoAllocationFolding) {
-    intptr_t const object_size = m.ResolvedValue();
+    intptr_t const object_size =
+        ALIGN_TO_ALLOCATION_ALIGNMENT(m.ResolvedValue());
     AllocationState const* state = *state_ptr;
     if (state->size() <= kMaxRegularHeapObjectSize - object_size &&
         state->group()->allocation() == allocation_type) {
@@ -260,7 +287,9 @@ Reduction MemoryLowering::ReduceAllocateRaw(
 
       // Update the allocation top with the new object allocation.
       // TODO(bmeurer): Defer writing back top as much as possible.
-      Node* top = __ IntAdd(state->top(), size);
+      DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                     IsAligned(object_size, kObjectAlignment8GbHeap));
+      Node* top = __ IntAdd(state->top(), __ IntPtrConstant(object_size));
       __ Store(StoreRepresentation(MachineType::PointerRepresentation(),
                                    kNoWriteBarrier),
                top_address, __ IntPtrConstant(0), top);
@@ -336,7 +365,7 @@ Reduction MemoryLowering::ReduceAllocateRaw(
         __ Load(MachineType::Pointer(), limit_address, __ IntPtrConstant(0));
 
     // Compute the new top.
-    Node* new_top = __ IntAdd(top, size);
+    Node* new_top = __ IntAdd(top, AlignToAllocationAlignment(size));
 
     // Check if we can do bump pointer allocation here.
     Node* check = __ UintLessThan(new_top, limit);
@@ -463,6 +492,27 @@ Reduction MemoryLowering::ReduceLoadExternalPointerField(Node* node) {
   return Changed(node);
 }
 
+Reduction MemoryLowering::ReduceLoadBoundedSize(Node* node) {
+#ifdef V8_ENABLE_SANDBOX
+  const Operator* load_op =
+      !machine()->UnalignedLoadSupported(MachineRepresentation::kWord64)
+          ? machine()->UnalignedLoad(MachineType::Uint64())
+          : machine()->Load(MachineType::Uint64());
+  NodeProperties::ChangeOp(node, load_op);
+
+  Node* effect = NodeProperties::GetEffectInput(node);
+  Node* control = NodeProperties::GetControlInput(node);
+  __ InitializeEffectControl(effect, control);
+
+  Node* raw_value = __ AddNode(graph()->CloneNode(node));
+  Node* shift_amount = __ IntPtrConstant(kBoundedSizeShift);
+  Node* decoded_size = __ Word64Shr(raw_value, shift_amount);
+  return Replace(decoded_size);
+#else
+  UNREACHABLE();
+#endif
+}
+
 Reduction MemoryLowering::ReduceLoadMap(Node* node) {
 #ifdef V8_MAP_PACKING
   NodeProperties::ChangeOp(node, machine()->Load(MachineType::AnyTagged()));
@@ -495,6 +545,10 @@ Reduction MemoryLowering::ReduceLoadField(Node* node) {
     return ReduceLoadExternalPointerField(node);
   }
 
+  if (access.is_bounded_size_access) {
+    return ReduceLoadBoundedSize(node);
+  }
+
   NodeProperties::ChangeOp(node, machine()->Load(type));
 
   return Changed(node);
@@ -545,6 +599,8 @@ Reduction MemoryLowering::ReduceStoreField(Node* node,
   DCHECK(!access.type.Is(Type::ExternalPointer()));
   // SandboxedPointers are not currently stored by optimized code.
   DCHECK(!access.type.Is(Type::SandboxedPointer()));
+  // Bounded size fields are not currently stored by optimized code.
+  DCHECK(!access.is_bounded_size_access);
   MachineType machine_type = access.machine_type;
   Node* object = node->InputAt(0);
   Node* value = node->InputAt(1);
@@ -645,7 +701,7 @@ WriteBarrierKind MemoryLowering::ComputeWriteBarrierKind(
   if (!ValueNeedsWriteBarrier(value, isolate())) {
     write_barrier_kind = kNoWriteBarrier;
   }
-  if (FLAG_disable_write_barriers) {
+  if (v8_flags.disable_write_barriers) {
     write_barrier_kind = kNoWriteBarrier;
   }
   if (write_barrier_kind == WriteBarrierKind::kAssertNoWriteBarrier) {
diff --git a/deps/v8/src/compiler/memory-lowering.h b/deps/v8/src/compiler/memory-lowering.h
index 707a31572d2f10..536e910faea5f1 100644
--- a/deps/v8/src/compiler/memory-lowering.h
+++ b/deps/v8/src/compiler/memory-lowering.h
@@ -109,11 +109,16 @@ class MemoryLowering final : public Reducer {
                                            AllocationState const* state,
                                            WriteBarrierKind);
   Reduction ReduceLoadExternalPointerField(Node* node);
+  Reduction ReduceLoadBoundedSize(Node* node);
   Reduction ReduceLoadMap(Node* node);
   Node* ComputeIndex(ElementAccess const& access, Node* node);
   void EnsureAllocateOperator();
   Node* GetWasmInstanceNode();
 
+  // Align the value to kObjectAlignment8GbHeap if V8_COMPRESS_POINTERS_8GB is
+  // defined.
+  Node* AlignToAllocationAlignment(Node* address);
+
   Graph* graph() const { return graph_; }
   Isolate* isolate() const { return isolate_; }
   Zone* zone() const { return zone_; }
diff --git a/deps/v8/src/compiler/node.cc b/deps/v8/src/compiler/node.cc
index ae24ca7c121289..d8e201bd4871bd 100644
--- a/deps/v8/src/compiler/node.cc
+++ b/deps/v8/src/compiler/node.cc
@@ -293,6 +293,15 @@ int Node::UseCount() const {
   return use_count;
 }
 
+int Node::BranchUseCount() const {
+  int use_count = 0;
+  for (Use* use = first_use_; use; use = use->next) {
+    if (use->from()->opcode() == IrOpcode::kBranch) {
+      ++use_count;
+    }
+  }
+  return use_count;
+}
 
 void Node::ReplaceUses(Node* that) {
   DCHECK(this->first_use_ == nullptr || this->first_use_->prev == nullptr);
@@ -497,6 +506,7 @@ bool Node::Uses::empty() const { return begin() == end(); }
 }  // namespace internal
 }  // namespace v8
 
+V8_DONT_STRIP_SYMBOL
 V8_EXPORT_PRIVATE extern void _v8_internal_Node_Print(void* object) {
   reinterpret_cast<i::compiler::Node*>(object)->Print();
 }
diff --git a/deps/v8/src/compiler/node.h b/deps/v8/src/compiler/node.h
index 57d49fe1ac0009..5a323efa992932 100644
--- a/deps/v8/src/compiler/node.h
+++ b/deps/v8/src/compiler/node.h
@@ -98,6 +98,7 @@ class V8_EXPORT_PRIVATE Node final {
   void EnsureInputCount(Zone* zone, int new_input_count);
 
   int UseCount() const;
+  int BranchUseCount() const;
   void ReplaceUses(Node* replace_to);
 
   class InputEdges;
diff --git a/deps/v8/src/compiler/opcodes.h b/deps/v8/src/compiler/opcodes.h
index 9853c06f559d50..f61ec25d66e210 100644
--- a/deps/v8/src/compiler/opcodes.h
+++ b/deps/v8/src/compiler/opcodes.h
@@ -183,7 +183,8 @@
   V(JSStoreInArrayLiteral)             \
   V(JSDeleteProperty)                  \
   V(JSHasProperty)                     \
-  V(JSGetSuperConstructor)
+  V(JSGetSuperConstructor)             \
+  V(JSFindNonDefaultConstructorOrConstruct)
 
 #define JS_CONTEXT_OP_LIST(V) \
   V(JSHasContextExtension)    \
@@ -287,6 +288,7 @@
   V(CheckedUint32ToTaggedSigned)      \
   V(CheckedUint64Bounds)              \
   V(CheckedUint64ToInt32)             \
+  V(CheckedUint64ToInt64)             \
   V(CheckedUint64ToTaggedSigned)      \
   V(CheckedFloat64ToInt32)            \
   V(CheckedFloat64ToInt64)            \
@@ -297,7 +299,8 @@
   V(CheckedTaggedToFloat64)           \
   V(CheckedTaggedToInt64)             \
   V(CheckedTaggedToTaggedSigned)      \
-  V(CheckedTaggedToTaggedPointer)
+  V(CheckedTaggedToTaggedPointer)     \
+  V(CheckedBigInt64Add)
 
 #define SIMPLIFIED_COMPARE_BINOP_LIST(V) \
   V(NumberEqual)                         \
@@ -393,7 +396,8 @@
 
 #define SIMPLIFIED_BIGINT_UNOP_LIST(V) \
   V(BigIntNegate)                      \
-  V(CheckBigInt)
+  V(CheckBigInt)                       \
+  V(CheckBigInt64)
 
 #define SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(V) V(SpeculativeToNumber)
 
@@ -601,10 +605,13 @@
   V(Int64Sub)                    \
   V(Int64SubWithOverflow)        \
   V(Int64Mul)                    \
+  V(Int64MulHigh)                \
+  V(Int64MulWithOverflow)        \
   V(Int64Div)                    \
   V(Int64Mod)                    \
   V(Uint64Div)                   \
-  V(Uint64Mod)
+  V(Uint64Mod)                   \
+  V(Uint64MulHigh)
 
 #define MACHINE_FLOAT32_UNOP_LIST(V) \
   V(Float32Abs)                      \
diff --git a/deps/v8/src/compiler/operation-typer.cc b/deps/v8/src/compiler/operation-typer.cc
index a3b232a871d611..4279c54d1bbf2e 100644
--- a/deps/v8/src/compiler/operation-typer.cc
+++ b/deps/v8/src/compiler/operation-typer.cc
@@ -585,6 +585,8 @@ Type OperationTyper::SpeculativeBigIntAsUintN(Type) {
 
 Type OperationTyper::CheckBigInt(Type type) { return Type::BigInt(); }
 
+Type OperationTyper::CheckBigInt64(Type type) { return Type::SignedBigInt64(); }
+
 Type OperationTyper::NumberAdd(Type lhs, Type rhs) {
   DCHECK(lhs.Is(Type::Number()));
   DCHECK(rhs.Is(Type::Number()));
diff --git a/deps/v8/src/compiler/operator-properties.cc b/deps/v8/src/compiler/operator-properties.cc
index 0389822629f07a..2b642fdee1502e 100644
--- a/deps/v8/src/compiler/operator-properties.cc
+++ b/deps/v8/src/compiler/operator-properties.cc
@@ -91,6 +91,7 @@ bool OperatorProperties::NeedsExactContext(const Operator* op) {
     case IrOpcode::kJSSetNamedProperty:
     case IrOpcode::kJSDefineNamedOwnProperty:
     case IrOpcode::kJSSetKeyedProperty:
+    case IrOpcode::kJSFindNonDefaultConstructorOrConstruct:
       return true;
 
     case IrOpcode::kJSAsyncFunctionEnter:
@@ -239,6 +240,7 @@ bool OperatorProperties::HasFrameStateInput(const Operator* op) {
     case IrOpcode::kJSStackCheck:
     case IrOpcode::kJSDebugger:
     case IrOpcode::kJSGetSuperConstructor:
+    case IrOpcode::kJSFindNonDefaultConstructorOrConstruct:
     case IrOpcode::kJSBitwiseNot:
     case IrOpcode::kJSDecrement:
     case IrOpcode::kJSIncrement:
diff --git a/deps/v8/src/compiler/pipeline.cc b/deps/v8/src/compiler/pipeline.cc
index babd0e8dd0f36f..a142d46a4760d6 100644
--- a/deps/v8/src/compiler/pipeline.cc
+++ b/deps/v8/src/compiler/pipeline.cc
@@ -19,6 +19,7 @@
 #include "src/codegen/reloc-info.h"
 #include "src/common/high-allocation-throughput-scope.h"
 #include "src/compiler/add-type-assertions-reducer.h"
+#include "src/compiler/all-nodes.h"
 #include "src/compiler/backend/code-generator.h"
 #include "src/compiler/backend/frame-elider.h"
 #include "src/compiler/backend/instruction-selector.h"
@@ -82,8 +83,10 @@
 #include "src/compiler/turboshaft/graph-builder.h"
 #include "src/compiler/turboshaft/graph-visualizer.h"
 #include "src/compiler/turboshaft/graph.h"
+#include "src/compiler/turboshaft/machine-optimization-assembler.h"
 #include "src/compiler/turboshaft/optimization-phase.h"
 #include "src/compiler/turboshaft/recreate-schedule.h"
+#include "src/compiler/turboshaft/simplify-tf-loops.h"
 #include "src/compiler/turboshaft/value-numbering-assembler.h"
 #include "src/compiler/type-narrowing-reducer.h"
 #include "src/compiler/typed-optimization.h"
@@ -94,6 +97,7 @@
 #include "src/diagnostics/code-tracer.h"
 #include "src/diagnostics/disassembler.h"
 #include "src/execution/isolate-inl.h"
+#include "src/flags/flags.h"
 #include "src/heap/local-heap.h"
 #include "src/logging/code-events.h"
 #include "src/logging/counters.h"
@@ -160,7 +164,7 @@ class PipelineData {
         allocator_(isolate->allocator()),
         info_(info),
         debug_name_(info_->GetDebugName()),
-        may_have_unverifiable_graph_(FLAG_turboshaft),
+        may_have_unverifiable_graph_(v8_flags.turboshaft),
         zone_stats_(zone_stats),
         pipeline_statistics_(pipeline_statistics),
         graph_zone_scope_(zone_stats_, kGraphZoneName, kCompressGraphZone),
@@ -578,7 +582,7 @@ class PipelineData {
         osr_helper_, start_source_position_, jump_optimization_info_,
         assembler_options(), buffer_cache, info_->builtin(),
         max_unoptimized_frame_height(), max_pushed_argument_count(),
-        FLAG_trace_turbo_stack_accesses ? debug_name_.get() : nullptr);
+        v8_flags.trace_turbo_stack_accesses ? debug_name_.get() : nullptr);
   }
 
   void BeginPhaseKind(const char* phase_kind_name) {
@@ -919,15 +923,15 @@ void PrintParticipatingSource(OptimizedCompilationInfo* info,
 // Print the code after compiling it.
 void PrintCode(Isolate* isolate, Handle<Code> code,
                OptimizedCompilationInfo* info) {
-  if (FLAG_print_opt_source && info->IsOptimizing()) {
+  if (v8_flags.print_opt_source && info->IsOptimizing()) {
     PrintParticipatingSource(info, isolate);
   }
 
 #ifdef ENABLE_DISASSEMBLER
   const bool print_code =
-      FLAG_print_code ||
-      (info->IsOptimizing() && FLAG_print_opt_code &&
-       info->shared_info()->PassesFilter(FLAG_print_opt_code_filter));
+      v8_flags.print_code ||
+      (info->IsOptimizing() && v8_flags.print_opt_code &&
+       info->shared_info()->PassesFilter(v8_flags.print_opt_code_filter));
   if (print_code) {
     std::unique_ptr<char[]> debug_name = info->GetDebugName();
     CodeTracer::StreamScope tracing_scope(isolate->GetCodeTracer());
@@ -988,7 +992,7 @@ void TraceSchedule(OptimizedCompilationInfo* info, PipelineData* data,
     json_of << "\"},\n";
   }
 
-  if (info->trace_turbo_graph() || FLAG_trace_turbo_scheduler) {
+  if (info->trace_turbo_graph() || v8_flags.trace_turbo_scheduler) {
     UnparkedScopeIfNeeded scope(data->broker());
     AllowHandleDereference allow_deref;
 
@@ -1008,7 +1012,7 @@ void TraceScheduleAndVerify(OptimizedCompilationInfo* info, PipelineData* data,
 
   TraceSchedule(info, data, schedule, phase_name);
 
-  if (FLAG_turbo_verify) ScheduleVerifier::Run(schedule);
+  if (v8_flags.turbo_verify) ScheduleVerifier::Run(schedule);
 }
 
 void AddReducer(PipelineData* data, GraphReducer* graph_reducer,
@@ -1038,7 +1042,7 @@ PipelineStatistics* CreatePipelineStatistics(Handle<Script> script,
   bool tracing_enabled;
   TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("v8.turbofan"),
                                      &tracing_enabled);
-  if (tracing_enabled || FLAG_turbo_stats || FLAG_turbo_stats_nvp) {
+  if (tracing_enabled || v8_flags.turbo_stats || v8_flags.turbo_stats_nvp) {
     pipeline_statistics =
         new PipelineStatistics(info, isolate->GetTurboStatistics(), zone_stats);
     pipeline_statistics->BeginPhaseKind("V8.TFInitializing");
@@ -1064,7 +1068,7 @@ PipelineStatistics* CreatePipelineStatistics(
   bool tracing_enabled;
   TRACE_EVENT_CATEGORY_GROUP_ENABLED(
       TRACE_DISABLED_BY_DEFAULT("v8.wasm.turbofan"), &tracing_enabled);
-  if (tracing_enabled || FLAG_turbo_stats_wasm) {
+  if (tracing_enabled || v8_flags.turbo_stats_wasm) {
     pipeline_statistics = new PipelineStatistics(
         info, wasm::GetWasmEngine()->GetOrCreateTurboStatistics(), zone_stats);
     pipeline_statistics->BeginPhaseKind("V8.WasmInitializing");
@@ -1180,20 +1184,20 @@ PipelineCompilationJob::Status PipelineCompilationJob::PrepareJobImpl(
   PipelineJobScope scope(&data_, isolate->counters()->runtime_call_stats());
 
   if (compilation_info()->bytecode_array()->length() >
-      FLAG_max_optimized_bytecode_size) {
+      v8_flags.max_optimized_bytecode_size) {
     return AbortOptimization(BailoutReason::kFunctionTooBig);
   }
 
-  if (!FLAG_always_turbofan) {
+  if (!v8_flags.always_turbofan) {
     compilation_info()->set_bailout_on_uninitialized();
   }
-  if (FLAG_turbo_loop_peeling) {
+  if (v8_flags.turbo_loop_peeling) {
     compilation_info()->set_loop_peeling();
   }
-  if (FLAG_turbo_inlining) {
+  if (v8_flags.turbo_inlining) {
     compilation_info()->set_inlining();
   }
-  if (FLAG_turbo_allocation_folding) {
+  if (v8_flags.turbo_allocation_folding) {
     compilation_info()->set_allocation_folding();
   }
 
@@ -1461,7 +1465,7 @@ struct EarlyGraphTrimmingPhase {
     GraphTrimmer trimmer(temp_zone, data->graph());
     NodeVector roots(temp_zone);
     data->jsgraph()->GetCachedNodes(&roots);
-    UnparkedScopeIfNeeded scope(data->broker(), FLAG_trace_turbo_trimming);
+    UnparkedScopeIfNeeded scope(data->broker(), v8_flags.trace_turbo_trimming);
     trimmer.TrimGraph(roots.begin(), roots.end());
   }
 };
@@ -1479,7 +1483,7 @@ struct TyperPhase {
 
     LoopVariableOptimizer induction_vars(data->jsgraph()->graph(),
                                          data->common(), temp_zone);
-    if (FLAG_turbo_loop_variable) induction_vars.Run();
+    if (v8_flags.turbo_loop_variable) induction_vars.Run();
 
     // The typer inspects heap objects, so we need to unpark the local heap.
     UnparkedScopeIfNeeded scope(data->broker());
@@ -1634,7 +1638,8 @@ struct LoopPeelingPhase {
     NodeVector roots(temp_zone);
     data->jsgraph()->GetCachedNodes(&roots);
     {
-      UnparkedScopeIfNeeded scope(data->broker(), FLAG_trace_turbo_trimming);
+      UnparkedScopeIfNeeded scope(data->broker(),
+                                  v8_flags.trace_turbo_trimming);
       trimmer.TrimGraph(roots.begin(), roots.end());
     }
 
@@ -1698,19 +1703,21 @@ struct WasmLoopUnrollingPhase {
 
   void Run(PipelineData* data, Zone* temp_zone,
            std::vector<compiler::WasmLoopInfo>* loop_infos) {
+    if (loop_infos->empty()) return;
+    AllNodes all_nodes(temp_zone, data->graph(), data->graph()->end());
     for (WasmLoopInfo& loop_info : *loop_infos) {
-      if (loop_info.can_be_innermost) {
-        ZoneUnorderedSet<Node*>* loop =
-            LoopFinder::FindSmallInnermostLoopFromHeader(
-                loop_info.header, temp_zone,
-                // Only discover the loop until its size is the maximum unrolled
-                // size for its depth.
-                maximum_unrollable_size(loop_info.nesting_depth), true);
-        if (loop == nullptr) continue;
-        UnrollLoop(loop_info.header, loop, loop_info.nesting_depth,
-                   data->graph(), data->common(), temp_zone,
-                   data->source_positions(), data->node_origins());
-      }
+      if (!loop_info.can_be_innermost) continue;
+      if (!all_nodes.IsReachable(loop_info.header)) continue;
+      ZoneUnorderedSet<Node*>* loop =
+          LoopFinder::FindSmallInnermostLoopFromHeader(
+              loop_info.header, all_nodes, temp_zone,
+              // Only discover the loop until its size is the maximum unrolled
+              // size for its depth.
+              maximum_unrollable_size(loop_info.nesting_depth), true);
+      if (loop == nullptr) continue;
+      UnrollLoop(loop_info.header, loop, loop_info.nesting_depth, data->graph(),
+                 data->common(), temp_zone, data->source_positions(),
+                 data->node_origins());
     }
 
     EliminateLoopExits(loop_infos);
@@ -1722,19 +1729,20 @@ struct WasmLoopPeelingPhase {
 
   void Run(PipelineData* data, Zone* temp_zone,
            std::vector<compiler::WasmLoopInfo>* loop_infos) {
+    AllNodes all_nodes(temp_zone, data->graph());
     for (WasmLoopInfo& loop_info : *loop_infos) {
       if (loop_info.can_be_innermost) {
         ZoneUnorderedSet<Node*>* loop =
             LoopFinder::FindSmallInnermostLoopFromHeader(
-                loop_info.header, temp_zone, FLAG_wasm_loop_peeling_max_size,
-                false);
+                loop_info.header, all_nodes, temp_zone,
+                v8_flags.wasm_loop_peeling_max_size, false);
         if (loop == nullptr) continue;
         PeelWasmLoop(loop_info.header, loop, data->graph(), data->common(),
                      temp_zone, data->source_positions(), data->node_origins());
       }
     }
     // If we are going to unroll later, keep loop exits.
-    if (!FLAG_wasm_loop_unrolling) EliminateLoopExits(loop_infos);
+    if (!v8_flags.wasm_loop_unrolling) EliminateLoopExits(loop_infos);
   }
 };
 #endif  // V8_ENABLE_WEBASSEMBLY
@@ -1815,7 +1823,8 @@ struct EffectControlLinearizationPhase {
       NodeVector roots(temp_zone);
       data->jsgraph()->GetCachedNodes(&roots);
       {
-        UnparkedScopeIfNeeded scope(data->broker(), FLAG_trace_turbo_trimming);
+        UnparkedScopeIfNeeded scope(data->broker(),
+                                    v8_flags.trace_turbo_trimming);
         trimmer.TrimGraph(roots.begin(), roots.end());
       }
 
@@ -1868,7 +1877,8 @@ struct StoreStoreEliminationPhase {
     NodeVector roots(temp_zone);
     data->jsgraph()->GetCachedNodes(&roots);
     {
-      UnparkedScopeIfNeeded scope(data->broker(), FLAG_trace_turbo_trimming);
+      UnparkedScopeIfNeeded scope(data->broker(),
+                                  v8_flags.trace_turbo_trimming);
       trimmer.TrimGraph(roots.begin(), roots.end());
     }
 
@@ -1930,7 +1940,8 @@ struct MemoryOptimizationPhase {
     NodeVector roots(temp_zone);
     data->jsgraph()->GetCachedNodes(&roots);
     {
-      UnparkedScopeIfNeeded scope(data->broker(), FLAG_trace_turbo_trimming);
+      UnparkedScopeIfNeeded scope(data->broker(),
+                                  v8_flags.trace_turbo_trimming);
       trimmer.TrimGraph(roots.begin(), roots.end());
     }
 
@@ -2038,9 +2049,12 @@ struct BuildTurboshaftPhase {
     Schedule* schedule = data->schedule();
     data->reset_schedule();
     data->CreateTurboshaftGraph();
-    return turboshaft::BuildGraph(
-        schedule, data->graph_zone(), temp_zone, &data->turboshaft_graph(),
-        data->source_positions(), data->node_origins());
+    if (auto bailout = turboshaft::BuildGraph(
+            schedule, data->graph_zone(), temp_zone, &data->turboshaft_graph(),
+            data->source_positions(), data->node_origins())) {
+      return bailout;
+    }
+    return {};
   }
 };
 
@@ -2048,8 +2062,12 @@ struct OptimizeTurboshaftPhase {
   DECL_PIPELINE_PHASE_CONSTANTS(OptimizeTurboshaft)
 
   void Run(PipelineData* data, Zone* temp_zone) {
-    turboshaft::OptimizationPhase<turboshaft::LivenessAnalyzer,
-                                  turboshaft::ValueNumberingAssembler>::
+    UnparkedScopeIfNeeded scope(data->broker(),
+                                FLAG_turboshaft_trace_reduction);
+    turboshaft::OptimizationPhase<
+        turboshaft::AnalyzerBase,
+        turboshaft::MachineOptimizationAssembler<
+            turboshaft::ValueNumberingAssembler, false>>::
         Run(&data->turboshaft_graph(), temp_zone, data->node_origins(),
             turboshaft::VisitOrder::kDominator);
   }
@@ -2097,6 +2115,19 @@ struct WasmGCOptimizationPhase {
   }
 };
 
+struct SimplifyLoopsPhase {
+  DECL_PIPELINE_PHASE_CONSTANTS(SimplifyLoops)
+
+  void Run(PipelineData* data, Zone* temp_zone) {
+    GraphReducer graph_reducer(
+        temp_zone, data->graph(), &data->info()->tick_counter(), data->broker(),
+        data->jsgraph()->Dead(), data->observe_node_manager());
+    SimplifyTFLoops simplify_loops(&graph_reducer, data->mcgraph());
+    AddReducer(data, &graph_reducer, &simplify_loops);
+    graph_reducer.ReduceGraph();
+  }
+};
+
 struct WasmGCLoweringPhase {
   DECL_PIPELINE_PHASE_CONSTANTS(WasmGCLowering)
 
@@ -2121,7 +2152,7 @@ struct WasmOptimizationPhase {
     // then one around branch elimination. This is because those two
     // optimizations sometimes display quadratic complexity when run together.
     // We only need load elimination for managed objects.
-    if (FLAG_experimental_wasm_gc) {
+    if (v8_flags.experimental_wasm_gc) {
       GraphReducer graph_reducer(temp_zone, data->graph(),
                                  &data->info()->tick_counter(), data->broker(),
                                  data->jsgraph()->Dead(),
@@ -2314,7 +2345,7 @@ struct InstructionSelectionPhase {
             ? InstructionSelector::kAllSourcePositions
             : InstructionSelector::kCallSourcePositions,
         InstructionSelector::SupportedFeatures(),
-        FLAG_turbo_instruction_scheduling
+        v8_flags.turbo_instruction_scheduling
             ? InstructionSelector::kEnableScheduling
             : InstructionSelector::kDisableScheduling,
         data->assembler_options().enable_root_relative_access
@@ -2716,7 +2747,7 @@ CompilationJob::Status WasmHeapStubCompilationJob::PrepareJobImpl(
 CompilationJob::Status WasmHeapStubCompilationJob::ExecuteJobImpl(
     RuntimeCallStats* stats, LocalIsolate* local_isolate) {
   std::unique_ptr<PipelineStatistics> pipeline_statistics;
-  if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) {
+  if (v8_flags.turbo_stats || v8_flags.turbo_stats_nvp) {
     pipeline_statistics.reset(new PipelineStatistics(
         &info_, wasm::GetWasmEngine()->GetOrCreateTurboStatistics(),
         &zone_stats_));
@@ -2759,7 +2790,7 @@ CompilationJob::Status WasmHeapStubCompilationJob::FinalizeJobImpl(
   if (pipeline_.CommitDependencies(code)) {
     info_.SetCode(code);
 #ifdef ENABLE_DISASSEMBLER
-    if (FLAG_print_opt_code) {
+    if (v8_flags.print_opt_code) {
       CodeTracer::StreamScope tracing_scope(isolate->GetCodeTracer());
       code->Disassemble(compilation_info()->GetDebugName().get(),
                         tracing_scope.stream(), isolate);
@@ -2778,7 +2809,7 @@ void PipelineImpl::RunPrintAndVerify(const char* phase, bool untyped) {
   if (info()->trace_turbo_json() || info()->trace_turbo_graph()) {
     Run<PrintGraphPhase>(phase);
   }
-  if (FLAG_turbo_verify) {
+  if (v8_flags.turbo_verify) {
     Run<VerifyGraphPhase>(untyped);
   }
 }
@@ -2871,18 +2902,18 @@ bool PipelineImpl::OptimizeGraph(Linkage* linkage) {
     RunPrintAndVerify(LoopExitEliminationPhase::phase_name(), true);
   }
 
-  if (FLAG_turbo_load_elimination) {
+  if (v8_flags.turbo_load_elimination) {
     Run<LoadEliminationPhase>();
     RunPrintAndVerify(LoadEliminationPhase::phase_name());
   }
   data->DeleteTyper();
 
-  if (FLAG_turbo_escape) {
+  if (v8_flags.turbo_escape) {
     Run<EscapeAnalysisPhase>();
     RunPrintAndVerify(EscapeAnalysisPhase::phase_name());
   }
 
-  if (FLAG_assert_types) {
+  if (v8_flags.assert_types) {
     Run<TypeAssertionsPhase>();
     RunPrintAndVerify(TypeAssertionsPhase::phase_name());
   }
@@ -2928,13 +2959,13 @@ bool PipelineImpl::OptimizeGraph(Linkage* linkage) {
   Run<EffectControlLinearizationPhase>();
   RunPrintAndVerify(EffectControlLinearizationPhase::phase_name(), true);
 
-  if (FLAG_turbo_store_elimination) {
+  if (v8_flags.turbo_store_elimination) {
     Run<StoreStoreEliminationPhase>();
     RunPrintAndVerify(StoreStoreEliminationPhase::phase_name(), true);
   }
 
   // Optimize control flow.
-  if (FLAG_turbo_cf_optimization) {
+  if (v8_flags.turbo_cf_optimization) {
     Run<ControlFlowOptimizationPhase>();
     RunPrintAndVerify(ControlFlowOptimizationPhase::phase_name(), true);
   }
@@ -2946,13 +2977,13 @@ bool PipelineImpl::OptimizeGraph(Linkage* linkage) {
   Run<MemoryOptimizationPhase>();
   RunPrintAndVerify(MemoryOptimizationPhase::phase_name(), true);
 
-  // Run value numbering and machine operator reducer to optimize load/store
-  // address computation (in particular, reuse the address computation whenever
-  // possible).
-  Run<MachineOperatorOptimizationPhase>();
-  RunPrintAndVerify(MachineOperatorOptimizationPhase::phase_name(), true);
+  if (!v8_flags.turboshaft) {
+    // Run value numbering and machine operator reducer to optimize load/store
+    // address computation (in particular, reuse the address computation
+    // whenever possible).
+    Run<MachineOperatorOptimizationPhase>();
+    RunPrintAndVerify(MachineOperatorOptimizationPhase::phase_name(), true);
 
-  if (!FLAG_turboshaft) {
     Run<DecompressionOptimizationPhase>();
     RunPrintAndVerify(DecompressionOptimizationPhase::phase_name(), true);
   }
@@ -2967,7 +2998,7 @@ bool PipelineImpl::OptimizeGraph(Linkage* linkage) {
 
   ComputeScheduledGraph();
 
-  if (FLAG_turboshaft) {
+  if (v8_flags.turboshaft) {
     if (base::Optional<BailoutReason> bailout = Run<BuildTurboshaftPhase>()) {
       info()->AbortOptimization(*bailout);
       data->EndPhaseKind();
@@ -3072,17 +3103,17 @@ MaybeHandle<Code> Pipeline::GenerateCodeForCodeStub(
   NodeOriginTable node_origins(graph);
   JumpOptimizationInfo jump_opt;
   bool should_optimize_jumps = isolate->serializer_enabled() &&
-                               FLAG_turbo_rewrite_far_jumps &&
-                               !FLAG_turbo_profiling;
+                               v8_flags.turbo_rewrite_far_jumps &&
+                               !v8_flags.turbo_profiling;
   PipelineData data(&zone_stats, &info, isolate, isolate->allocator(), graph,
                     jsgraph, nullptr, source_positions, &node_origins,
                     should_optimize_jumps ? &jump_opt : nullptr, options,
                     profile_data);
   PipelineJobScope scope(&data, isolate->counters()->runtime_call_stats());
   RCS_SCOPE(isolate, RuntimeCallCounterId::kOptimizeCode);
-  data.set_verify_graph(FLAG_verify_csa);
+  data.set_verify_graph(v8_flags.verify_csa);
   std::unique_ptr<PipelineStatistics> pipeline_statistics;
-  if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) {
+  if (v8_flags.turbo_stats || v8_flags.turbo_stats_nvp) {
     pipeline_statistics.reset(new PipelineStatistics(
         &info, isolate->GetTurboStatistics(), &zone_stats));
     pipeline_statistics->BeginPhaseKind("V8.TFStubCodegen");
@@ -3127,13 +3158,13 @@ MaybeHandle<Code> Pipeline::GenerateCodeForCodeStub(
   pipeline.Run<VerifyGraphPhase>(true);
 
   int graph_hash_before_scheduling = 0;
-  if (FLAG_turbo_profiling || profile_data != nullptr) {
+  if (v8_flags.turbo_profiling || profile_data != nullptr) {
     graph_hash_before_scheduling = HashGraphForPGO(data.graph());
   }
 
   if (profile_data != nullptr &&
       profile_data->hash() != graph_hash_before_scheduling) {
-    if (FLAG_warn_about_builtin_profile_data) {
+    if (v8_flags.warn_about_builtin_profile_data) {
       PrintF("Rejected profile data for %s due to function change\n",
              debug_name);
       PrintF("Please use tools/builtins-pgo/generate.py to refresh it.\n");
@@ -3155,11 +3186,11 @@ MaybeHandle<Code> Pipeline::GenerateCodeForCodeStub(
                            profile_data);
   PipelineJobScope second_scope(&second_data,
                                 isolate->counters()->runtime_call_stats());
-  second_data.set_verify_graph(FLAG_verify_csa);
+  second_data.set_verify_graph(v8_flags.verify_csa);
   PipelineImpl second_pipeline(&second_data);
   second_pipeline.SelectInstructionsAndAssemble(call_descriptor);
 
-  if (FLAG_turbo_profiling) {
+  if (v8_flags.turbo_profiling) {
     info.profiler_data()->SetHash(graph_hash_before_scheduling);
   }
 
@@ -3206,7 +3237,7 @@ wasm::WasmCompilationResult Pipeline::GenerateCodeForWasmNativeStub(
   PipelineData data(&zone_stats, wasm_engine, &info, mcgraph, nullptr,
                     source_positions, node_positions, options, kNoBufferCache);
   std::unique_ptr<PipelineStatistics> pipeline_statistics;
-  if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) {
+  if (v8_flags.turbo_stats || v8_flags.turbo_stats_nvp) {
     pipeline_statistics.reset(new PipelineStatistics(
         &info, wasm_engine->GetOrCreateTurboStatistics(), &zone_stats));
     pipeline_statistics->BeginPhaseKind("V8.WasmStubCodegen");
@@ -3304,7 +3335,7 @@ void Pipeline::GenerateCodeForWasmFunction(
     wasm::AssemblerBufferCache* buffer_cache) {
   auto* wasm_engine = wasm::GetWasmEngine();
   base::TimeTicks start_time;
-  if (V8_UNLIKELY(FLAG_trace_wasm_compilation_times)) {
+  if (V8_UNLIKELY(v8_flags.trace_wasm_compilation_times)) {
     start_time = base::TimeTicks::Now();
   }
   ZoneStats zone_stats(wasm_engine->allocator());
@@ -3327,38 +3358,39 @@ void Pipeline::GenerateCodeForWasmFunction(
   pipeline.RunPrintAndVerify("V8.WasmMachineCode", true);
 
   data.BeginPhaseKind("V8.WasmOptimization");
-  if (FLAG_wasm_inlining) {
+  if (v8_flags.wasm_inlining) {
     pipeline.Run<WasmInliningPhase>(env, function_index, wire_bytes_storage,
                                     loop_info);
     pipeline.RunPrintAndVerify(WasmInliningPhase::phase_name(), true);
   }
-  if (FLAG_wasm_loop_peeling) {
+  if (v8_flags.wasm_loop_peeling) {
     pipeline.Run<WasmLoopPeelingPhase>(loop_info);
     pipeline.RunPrintAndVerify(WasmLoopPeelingPhase::phase_name(), true);
   }
-  if (FLAG_wasm_loop_unrolling) {
+  if (v8_flags.wasm_loop_unrolling) {
     pipeline.Run<WasmLoopUnrollingPhase>(loop_info);
     pipeline.RunPrintAndVerify(WasmLoopUnrollingPhase::phase_name(), true);
   }
   const bool is_asm_js = is_asmjs_module(module);
 
-  if (FLAG_experimental_wasm_gc || FLAG_experimental_wasm_stringref) {
+  if (v8_flags.experimental_wasm_gc || v8_flags.experimental_wasm_stringref) {
     pipeline.Run<WasmTypingPhase>(function_index);
     pipeline.RunPrintAndVerify(WasmTypingPhase::phase_name(), true);
-    if (FLAG_wasm_opt) {
+    if (v8_flags.wasm_opt) {
       pipeline.Run<WasmGCOptimizationPhase>(module);
       pipeline.RunPrintAndVerify(WasmGCOptimizationPhase::phase_name(), true);
     }
   }
 
   // These proposals use gc nodes.
-  if (FLAG_experimental_wasm_gc || FLAG_experimental_wasm_typed_funcref ||
-      FLAG_experimental_wasm_stringref) {
+  if (v8_flags.experimental_wasm_gc ||
+      v8_flags.experimental_wasm_typed_funcref ||
+      v8_flags.experimental_wasm_stringref) {
     pipeline.Run<WasmGCLoweringPhase>();
     pipeline.RunPrintAndVerify(WasmGCLoweringPhase::phase_name(), true);
   }
 
-  if (FLAG_wasm_opt || is_asm_js) {
+  if (v8_flags.wasm_opt || is_asm_js) {
     pipeline.Run<WasmOptimizationPhase>(is_asm_js);
     pipeline.RunPrintAndVerify(WasmOptimizationPhase::phase_name(), true);
   } else {
@@ -3369,25 +3401,32 @@ void Pipeline::GenerateCodeForWasmFunction(
   pipeline.Run<MemoryOptimizationPhase>();
   pipeline.RunPrintAndVerify(MemoryOptimizationPhase::phase_name(), true);
 
-  if (FLAG_experimental_wasm_gc && FLAG_wasm_opt) {
+  if (v8_flags.experimental_wasm_gc && v8_flags.wasm_opt) {
     // Run value numbering and machine operator reducer to optimize load/store
     // address computation (in particular, reuse the address computation
     // whenever possible).
     pipeline.Run<MachineOperatorOptimizationPhase>();
     pipeline.RunPrintAndVerify(MachineOperatorOptimizationPhase::phase_name(),
                                true);
-    pipeline.Run<DecompressionOptimizationPhase>();
-    pipeline.RunPrintAndVerify(DecompressionOptimizationPhase::phase_name(),
-                               true);
+    if (!v8_flags.turboshaft_wasm) {
+      pipeline.Run<DecompressionOptimizationPhase>();
+      pipeline.RunPrintAndVerify(DecompressionOptimizationPhase::phase_name(),
+                                 true);
+    }
   }
 
-  if (FLAG_wasm_opt) {
+  if (v8_flags.wasm_opt) {
     pipeline.Run<BranchConditionDuplicationPhase>();
     pipeline.RunPrintAndVerify(BranchConditionDuplicationPhase::phase_name(),
                                true);
   }
 
-  if (FLAG_turbo_splitting && !is_asm_js) {
+  if (v8_flags.turboshaft_wasm) {
+    pipeline.Run<SimplifyLoopsPhase>();
+    pipeline.RunPrintAndVerify(SimplifyLoopsPhase::phase_name(), true);
+  }
+
+  if (v8_flags.turbo_splitting && !is_asm_js) {
     data.info()->set_splitting();
   }
 
@@ -3399,6 +3438,30 @@ void Pipeline::GenerateCodeForWasmFunction(
   pipeline.ComputeScheduledGraph();
 
   Linkage linkage(call_descriptor);
+
+  if (v8_flags.turboshaft_wasm) {
+    if (base::Optional<BailoutReason> bailout =
+            pipeline.Run<BuildTurboshaftPhase>()) {
+      pipeline.info()->AbortOptimization(*bailout);
+      data.EndPhaseKind();
+      info->SetWasmCompilationResult({});
+      return;
+    }
+    pipeline.Run<PrintTurboshaftGraphPhase>(BuildTurboshaftPhase::phase_name());
+
+    pipeline.Run<OptimizeTurboshaftPhase>();
+    pipeline.Run<PrintTurboshaftGraphPhase>(
+        OptimizeTurboshaftPhase::phase_name());
+
+    pipeline.Run<DecompressionOptimizationPhase>();
+    pipeline.Run<PrintTurboshaftGraphPhase>(
+        DecompressionOptimizationPhase::phase_name());
+
+    pipeline.Run<TurboshaftRecreateSchedulePhase>(&linkage);
+    TraceSchedule(data.info(), &data, data.schedule(),
+                  TurboshaftRecreateSchedulePhase::phase_name());
+  }
+
   if (!pipeline.SelectInstructions(&linkage)) return;
   pipeline.AssembleCode(&linkage);
 
@@ -3443,7 +3506,7 @@ void Pipeline::GenerateCodeForWasmFunction(
         << " using TurboFan" << std::endl;
   }
 
-  if (V8_UNLIKELY(FLAG_trace_wasm_compilation_times)) {
+  if (V8_UNLIKELY(v8_flags.trace_wasm_compilation_times)) {
     base::TimeDelta time = base::TimeTicks::Now() - start_time;
     int codesize = result->code_desc.body_size();
     StdoutStream{} << "Compiled function "
@@ -3524,7 +3587,7 @@ MaybeHandle<Code> Pipeline::GenerateCodeForTesting(
                     nullptr, schedule, nullptr, node_positions, nullptr,
                     options, nullptr);
   std::unique_ptr<PipelineStatistics> pipeline_statistics;
-  if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) {
+  if (v8_flags.turbo_stats || v8_flags.turbo_stats_nvp) {
     pipeline_statistics.reset(new PipelineStatistics(
         info, isolate->GetTurboStatistics(), &zone_stats));
     pipeline_statistics->BeginPhaseKind("V8.TFTestCodegen");
@@ -3604,7 +3667,7 @@ bool PipelineImpl::SelectInstructions(Linkage* linkage) {
   DCHECK_NOT_NULL(data->graph());
   DCHECK_NOT_NULL(data->schedule());
 
-  if (FLAG_turbo_profiling) {
+  if (v8_flags.turbo_profiling) {
     UnparkedScopeIfNeeded unparked_scope(data->broker());
     data->info()->set_profiler_data(BasicBlockInstrumentor::Instrument(
         info(), data->graph(), data->schedule(), data->isolate()));
@@ -3612,9 +3675,9 @@ bool PipelineImpl::SelectInstructions(Linkage* linkage) {
 
   bool verify_stub_graph =
       data->verify_graph() ||
-      (FLAG_turbo_verify_machine_graph != nullptr &&
-       (!strcmp(FLAG_turbo_verify_machine_graph, "*") ||
-        !strcmp(FLAG_turbo_verify_machine_graph, data->debug_name())));
+      (v8_flags.turbo_verify_machine_graph != nullptr &&
+       (!strcmp(v8_flags.turbo_verify_machine_graph, "*") ||
+        !strcmp(v8_flags.turbo_verify_machine_graph, data->debug_name())));
   // Jump optimization runs instruction selection twice, but the instruction
   // selector mutates nodes like swapping the inputs of a load, which can
   // violate the machine graph verification rules. So we skip the second
@@ -3624,7 +3687,7 @@ bool PipelineImpl::SelectInstructions(Linkage* linkage) {
     verify_stub_graph = false;
   }
   if (verify_stub_graph) {
-    if (FLAG_trace_verify_csa) {
+    if (v8_flags.trace_verify_csa) {
       UnparkedScopeIfNeeded scope(data->broker());
       AllowHandleDereference allow_deref;
       CodeTracer::StreamScope tracing_scope(data->GetCodeTracer());
@@ -3689,7 +3752,7 @@ bool PipelineImpl::SelectInstructions(Linkage* linkage) {
 
   data->BeginPhaseKind("V8.TFRegisterAllocation");
 
-  bool run_verifier = FLAG_turbo_verify_allocation;
+  bool run_verifier = v8_flags.turbo_verify_allocation;
 
   // Allocate registers.
 
@@ -3705,8 +3768,8 @@ bool PipelineImpl::SelectInstructions(Linkage* linkage) {
   // JS functions.
   bool use_mid_tier_register_allocator =
       data->info()->code_kind() == CodeKind::WASM_FUNCTION &&
-      (FLAG_turbo_force_mid_tier_regalloc ||
-       (FLAG_turbo_use_mid_tier_regalloc_for_huge_functions &&
+      (v8_flags.turbo_force_mid_tier_regalloc ||
+       (v8_flags.turbo_use_mid_tier_regalloc_for_huge_functions &&
         data->sequence()->VirtualRegisterCount() >
             kTopTierVirtualRegistersLimit));
 
@@ -3733,7 +3796,7 @@ bool PipelineImpl::SelectInstructions(Linkage* linkage) {
   bool generate_frame_at_start =
       data_->sequence()->instruction_blocks().front()->must_construct_frame();
   // Optimimize jumps.
-  if (FLAG_turbo_jt) {
+  if (v8_flags.turbo_jt) {
     Run<JumpThreadingPhase>(generate_frame_at_start);
   }
 
@@ -4004,7 +4067,7 @@ void PipelineImpl::AllocateRegistersForTopTier(
 
   Run<PopulateReferenceMapsPhase>();
 
-  if (FLAG_turbo_move_optimization) {
+  if (v8_flags.turbo_move_optimization) {
     Run<OptimizeMovesPhase>();
   }
 
diff --git a/deps/v8/src/compiler/raw-machine-assembler.cc b/deps/v8/src/compiler/raw-machine-assembler.cc
index cdd6b4a55a0ac1..7302e6f2fac56d 100644
--- a/deps/v8/src/compiler/raw-machine-assembler.cc
+++ b/deps/v8/src/compiler/raw-machine-assembler.cc
@@ -88,7 +88,7 @@ Node* RawMachineAssembler::OptimizedAllocate(
 Schedule* RawMachineAssembler::ExportForTest() {
   // Compute the correct codegen order.
   DCHECK(schedule_->rpo_order()->empty());
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     PrintF("--- RAW SCHEDULE -------------------------------------------\n");
     StdoutStream{} << *schedule_;
   }
@@ -96,7 +96,7 @@ Schedule* RawMachineAssembler::ExportForTest() {
   Scheduler::ComputeSpecialRPO(zone(), schedule_);
   Scheduler::GenerateDominatorTree(schedule_);
   schedule_->PropagateDeferredMark();
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     PrintF("--- EDGE SPLIT AND PROPAGATED DEFERRED SCHEDULE ------------\n");
     StdoutStream{} << *schedule_;
   }
@@ -110,14 +110,14 @@ Schedule* RawMachineAssembler::ExportForTest() {
 Graph* RawMachineAssembler::ExportForOptimization() {
   // Compute the correct codegen order.
   DCHECK(schedule_->rpo_order()->empty());
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     PrintF("--- RAW SCHEDULE -------------------------------------------\n");
     StdoutStream{} << *schedule_;
   }
   schedule_->EnsureCFGWellFormedness();
   OptimizeControlFlow(schedule_, graph(), common());
   Scheduler::ComputeSpecialRPO(zone(), schedule_);
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     PrintF("--- SCHEDULE BEFORE GRAPH CREATION -------------------------\n");
     StdoutStream{} << *schedule_;
   }
diff --git a/deps/v8/src/compiler/raw-machine-assembler.h b/deps/v8/src/compiler/raw-machine-assembler.h
index bec0a9b2b7b6f1..57cee2f0e1d2f0 100644
--- a/deps/v8/src/compiler/raw-machine-assembler.h
+++ b/deps/v8/src/compiler/raw-machine-assembler.h
@@ -514,6 +514,15 @@ class V8_EXPORT_PRIVATE RawMachineAssembler {
   Node* Int64Mul(Node* a, Node* b) {
     return AddNode(machine()->Int64Mul(), a, b);
   }
+  Node* Int64MulHigh(Node* a, Node* b) {
+    return AddNode(machine()->Int64MulHigh(), a, b);
+  }
+  Node* Uint64MulHigh(Node* a, Node* b) {
+    return AddNode(machine()->Uint64MulHigh(), a, b);
+  }
+  Node* Int64MulWithOverflow(Node* a, Node* b) {
+    return AddNode(machine()->Int64MulWithOverflow(), a, b);
+  }
   Node* Int64Div(Node* a, Node* b) {
     return AddNode(machine()->Int64Div(), a, b);
   }
@@ -599,6 +608,8 @@ class V8_EXPORT_PRIVATE RawMachineAssembler {
   INTPTR_BINOP(Int, Sub)
   INTPTR_BINOP(Int, SubWithOverflow)
   INTPTR_BINOP(Int, Mul)
+  INTPTR_BINOP(Int, MulHigh)
+  INTPTR_BINOP(Int, MulWithOverflow)
   INTPTR_BINOP(Int, Div)
   INTPTR_BINOP(Int, LessThan)
   INTPTR_BINOP(Int, LessThanOrEqual)
@@ -619,6 +630,7 @@ class V8_EXPORT_PRIVATE RawMachineAssembler {
   UINTPTR_BINOP(Uint, LessThanOrEqual)
   UINTPTR_BINOP(Uint, GreaterThanOrEqual)
   UINTPTR_BINOP(Uint, GreaterThan)
+  UINTPTR_BINOP(Uint, MulHigh)
 
 #undef UINTPTR_BINOP
 
diff --git a/deps/v8/src/compiler/redundancy-elimination.cc b/deps/v8/src/compiler/redundancy-elimination.cc
index 110b9ba9be98bd..9f1e15f1317904 100644
--- a/deps/v8/src/compiler/redundancy-elimination.cc
+++ b/deps/v8/src/compiler/redundancy-elimination.cc
@@ -20,6 +20,7 @@ Reduction RedundancyElimination::Reduce(Node* node) {
   if (node_checks_.Get(node)) return NoChange();
   switch (node->opcode()) {
     case IrOpcode::kCheckBigInt:
+    case IrOpcode::kCheckBigInt64:
     case IrOpcode::kCheckBounds:
     case IrOpcode::kCheckClosure:
     case IrOpcode::kCheckEqualsInternalizedString:
@@ -164,6 +165,7 @@ bool CheckSubsumes(Node const* a, Node const* b) {
         case IrOpcode::kCheckString:
         case IrOpcode::kCheckNumber:
         case IrOpcode::kCheckBigInt:
+        case IrOpcode::kCheckBigInt64:
           break;
         case IrOpcode::kCheckedInt32ToTaggedSigned:
         case IrOpcode::kCheckedInt64ToInt32:
diff --git a/deps/v8/src/compiler/representation-change.cc b/deps/v8/src/compiler/representation-change.cc
index 5ec5af0be2ff0a..68e0cac877663b 100644
--- a/deps/v8/src/compiler/representation-change.cc
+++ b/deps/v8/src/compiler/representation-change.cc
@@ -136,6 +136,11 @@ bool IsWord(MachineRepresentation rep) {
          rep == MachineRepresentation::kWord32;
 }
 
+bool TypeCheckIsBigInt(TypeCheckKind type_check) {
+  return type_check == TypeCheckKind::kBigInt ||
+         type_check == TypeCheckKind::kBigInt64;
+}
+
 }  // namespace
 
 RepresentationChanger::RepresentationChanger(
@@ -164,7 +169,7 @@ Node* RepresentationChanger::GetRepresentationFor(
   // Rematerialize any truncated BigInt if user is not expecting a BigInt.
   if (output_type.Is(Type::BigInt()) &&
       output_rep == MachineRepresentation::kWord64 &&
-      use_info.type_check() != TypeCheckKind::kBigInt) {
+      !TypeCheckIsBigInt(use_info.type_check())) {
     if (output_type.Is(Type::UnsignedBigInt64())) {
       node = InsertConversion(node, simplified()->ChangeUint64ToBigInt(),
                               use_node);
@@ -182,7 +187,7 @@ Node* RepresentationChanger::GetRepresentationFor(
       // this behavior is disabled only for TypeCheckKind::kBigInt, but should
       // be fixed for all other type checks.
       (output_rep != MachineRepresentation::kWord32 &&
-       use_info.type_check() != TypeCheckKind::kBigInt)) {
+       !TypeCheckIsBigInt(use_info.type_check()))) {
     if (use_info.representation() == output_rep) {
       // Representations are the same. That's a no-op.
       return node;
@@ -234,7 +239,7 @@ Node* RepresentationChanger::GetRepresentationFor(
     case MachineRepresentation::kWord64:
       DCHECK(use_info.type_check() == TypeCheckKind::kNone ||
              use_info.type_check() == TypeCheckKind::kSigned64 ||
-             use_info.type_check() == TypeCheckKind::kBigInt ||
+             TypeCheckIsBigInt(use_info.type_check()) ||
              use_info.type_check() == TypeCheckKind::kArrayIndex);
       return GetWord64RepresentationFor(node, output_rep, output_type, use_node,
                                         use_info);
@@ -399,7 +404,7 @@ Node* RepresentationChanger::GetTaggedPointerRepresentationFor(
   // Eagerly fold representation changes for constants.
   switch (node->opcode()) {
     case IrOpcode::kHeapConstant:
-      if (use_info.type_check() == TypeCheckKind::kBigInt) break;
+      if (TypeCheckIsBigInt(use_info.type_check())) break;
       return node;  // No change necessary.
     case IrOpcode::kInt32Constant:
     case IrOpcode::kFloat64Constant:
@@ -417,7 +422,7 @@ Node* RepresentationChanger::GetTaggedPointerRepresentationFor(
         node);
   }
 
-  if (use_info.type_check() == TypeCheckKind::kBigInt &&
+  if (TypeCheckIsBigInt(use_info.type_check()) &&
       !output_type.Is(Type::BigInt())) {
     // BigInt checks can only be performed on tagged representations. Note that
     // a corresponding check is inserted down below.
@@ -490,13 +495,21 @@ Node* RepresentationChanger::GetTaggedPointerRepresentationFor(
     // TODO(turbofan): Consider adding a Bailout operator that just deopts
     // for TaggedSigned output representation.
     op = simplified()->CheckedTaggedToTaggedPointer(use_info.feedback());
-  } else if (IsAnyTagged(output_rep) &&
-             (use_info.type_check() == TypeCheckKind::kBigInt ||
-              output_type.Is(Type::BigInt()))) {
-    if (output_type.Is(Type::BigInt())) {
-      return node;
+  } else if (IsAnyTagged(output_rep)) {
+    if (use_info.type_check() == TypeCheckKind::kBigInt) {
+      if (output_type.Is(Type::BigInt())) {
+        return node;
+      }
+      op = simplified()->CheckBigInt(use_info.feedback());
+    } else if (use_info.type_check() == TypeCheckKind::kBigInt64) {
+      if (output_type.Is(Type::SignedBigInt64())) {
+        return node;
+      }
+      op = simplified()->CheckBigInt64(use_info.feedback());
+    } else {
+      return TypeError(node, output_rep, output_type,
+                       MachineRepresentation::kTaggedPointer);
     }
-    op = simplified()->CheckBigInt(use_info.feedback());
   } else {
     return TypeError(node, output_rep, output_type,
                      MachineRepresentation::kTaggedPointer);
@@ -693,7 +706,7 @@ Node* RepresentationChanger::GetFloat64RepresentationFor(
   NumberMatcher m(node);
   if (m.HasResolvedValue()) {
     // BigInts are not used as number constants.
-    DCHECK(use_info.type_check() != TypeCheckKind::kBigInt);
+    DCHECK(!TypeCheckIsBigInt(use_info.type_check()));
     switch (use_info.type_check()) {
       case TypeCheckKind::kNone:
       case TypeCheckKind::kNumber:
@@ -701,6 +714,7 @@ Node* RepresentationChanger::GetFloat64RepresentationFor(
       case TypeCheckKind::kNumberOrOddball:
         return jsgraph()->Float64Constant(m.ResolvedValue());
       case TypeCheckKind::kBigInt:
+      case TypeCheckKind::kBigInt64:
       case TypeCheckKind::kHeapObject:
       case TypeCheckKind::kSigned32:
       case TypeCheckKind::kSigned64:
@@ -1101,7 +1115,7 @@ Node* RepresentationChanger::GetWord64RepresentationFor(
     case IrOpcode::kFloat64Constant:
       UNREACHABLE();
     case IrOpcode::kNumberConstant: {
-      if (use_info.type_check() != TypeCheckKind::kBigInt) {
+      if (!TypeCheckIsBigInt(use_info.type_check())) {
         double const fv = OpParameter<double>(node->op());
         if (base::IsValueInRangeForNumericType<int64_t>(fv)) {
           int64_t const iv = static_cast<int64_t>(fv);
@@ -1128,7 +1142,7 @@ Node* RepresentationChanger::GetWord64RepresentationFor(
       break;
   }
 
-  if (use_info.type_check() == TypeCheckKind::kBigInt) {
+  if (TypeCheckIsBigInt(use_info.type_check())) {
     // BigInts are only represented as tagged pointer and word64.
     if (!CanBeTaggedPointer(output_rep) &&
         output_rep != MachineRepresentation::kWord64) {
@@ -1152,6 +1166,7 @@ Node* RepresentationChanger::GetWord64RepresentationFor(
     CHECK_NE(use_info.type_check(), TypeCheckKind::kNone);
     CHECK_NE(use_info.type_check(), TypeCheckKind::kNumberOrOddball);
     CHECK_NE(use_info.type_check(), TypeCheckKind::kBigInt);
+    CHECK_NE(use_info.type_check(), TypeCheckKind::kBigInt64);
     Node* unreachable =
         InsertUnconditionalDeopt(use_node, DeoptimizeReason::kNotASmi);
     return jsgraph()->graph()->NewNode(
@@ -1218,9 +1233,10 @@ Node* RepresentationChanger::GetWord64RepresentationFor(
                        MachineRepresentation::kWord64);
     }
   } else if (IsAnyTagged(output_rep) &&
-             use_info.truncation().IsUsedAsWord64() &&
-             (use_info.type_check() == TypeCheckKind::kBigInt ||
-              output_type.Is(Type::BigInt()))) {
+             ((use_info.truncation().IsUsedAsWord64() &&
+               (use_info.type_check() == TypeCheckKind::kBigInt ||
+                output_type.Is(Type::BigInt()))) ||
+              use_info.type_check() == TypeCheckKind::kBigInt64)) {
     node = GetTaggedPointerRepresentationFor(node, output_rep, output_type,
                                              use_node, use_info);
     op = simplified()->TruncateBigIntToWord64();
@@ -1240,10 +1256,18 @@ Node* RepresentationChanger::GetWord64RepresentationFor(
                        MachineRepresentation::kWord64);
     }
   } else if (output_rep == MachineRepresentation::kWord64) {
-    DCHECK_EQ(use_info.type_check(), TypeCheckKind::kBigInt);
-    if (output_type.Is(Type::BigInt())) {
+    DCHECK(TypeCheckIsBigInt(use_info.type_check()));
+    if (output_type.Is(Type::UnsignedBigInt64()) &&
+        use_info.type_check() == TypeCheckKind::kBigInt64) {
+      op = simplified()->CheckedUint64ToInt64(use_info.feedback());
+    } else if ((output_type.Is(Type::BigInt()) &&
+                use_info.type_check() == TypeCheckKind::kBigInt) ||
+               (output_type.Is(Type::SignedBigInt64()) &&
+                use_info.type_check() == TypeCheckKind::kBigInt64)) {
       return node;
     } else {
+      DCHECK(output_type != Type::BigInt() ||
+             use_info.type_check() != TypeCheckKind::kBigInt64);
       Node* unreachable = InsertUnconditionalDeopt(
           use_node, DeoptimizeReason::kNotABigInt, use_info.feedback());
       return jsgraph()->graph()->NewNode(
diff --git a/deps/v8/src/compiler/representation-change.h b/deps/v8/src/compiler/representation-change.h
index 5c1ffabf67459d..cbfd893eb0fceb 100644
--- a/deps/v8/src/compiler/representation-change.h
+++ b/deps/v8/src/compiler/representation-change.h
@@ -8,6 +8,7 @@
 #include "src/compiler/feedback-source.h"
 #include "src/compiler/js-graph.h"
 #include "src/compiler/simplified-operator.h"
+#include "src/compiler/use-info.h"
 
 namespace v8 {
 namespace internal {
@@ -17,305 +18,6 @@ namespace compiler {
 class SimplifiedLoweringVerifier;
 class TypeCache;
 
-enum IdentifyZeros : uint8_t { kIdentifyZeros, kDistinguishZeros };
-
-class Truncation final {
- public:
-  // Constructors.
-  static Truncation None() {
-    return Truncation(TruncationKind::kNone, kIdentifyZeros);
-  }
-  static Truncation Bool() {
-    return Truncation(TruncationKind::kBool, kIdentifyZeros);
-  }
-  static Truncation Word32() {
-    return Truncation(TruncationKind::kWord32, kIdentifyZeros);
-  }
-  static Truncation Word64() {
-    return Truncation(TruncationKind::kWord64, kIdentifyZeros);
-  }
-  static Truncation OddballAndBigIntToNumber(
-      IdentifyZeros identify_zeros = kDistinguishZeros) {
-    return Truncation(TruncationKind::kOddballAndBigIntToNumber,
-                      identify_zeros);
-  }
-  static Truncation Any(IdentifyZeros identify_zeros = kDistinguishZeros) {
-    return Truncation(TruncationKind::kAny, identify_zeros);
-  }
-
-  static Truncation Generalize(Truncation t1, Truncation t2) {
-    return Truncation(
-        Generalize(t1.kind(), t2.kind()),
-        GeneralizeIdentifyZeros(t1.identify_zeros(), t2.identify_zeros()));
-  }
-
-  // Queries.
-  bool IsUnused() const { return kind_ == TruncationKind::kNone; }
-  bool IsUsedAsBool() const {
-    return LessGeneral(kind_, TruncationKind::kBool);
-  }
-  bool IsUsedAsWord32() const {
-    return LessGeneral(kind_, TruncationKind::kWord32);
-  }
-  bool IsUsedAsWord64() const {
-    return LessGeneral(kind_, TruncationKind::kWord64);
-  }
-  bool TruncatesOddballAndBigIntToNumber() const {
-    return LessGeneral(kind_, TruncationKind::kOddballAndBigIntToNumber);
-  }
-  bool IdentifiesUndefinedAndZero() {
-    return LessGeneral(kind_, TruncationKind::kWord32) ||
-           LessGeneral(kind_, TruncationKind::kBool);
-  }
-  bool IdentifiesZeroAndMinusZero() const {
-    return identify_zeros() == kIdentifyZeros;
-  }
-
-  // Operators.
-  bool operator==(Truncation other) const {
-    return kind() == other.kind() && identify_zeros() == other.identify_zeros();
-  }
-  bool operator!=(Truncation other) const { return !(*this == other); }
-
-  // Debug utilities.
-  const char* description() const;
-  bool IsLessGeneralThan(Truncation other) const {
-    return LessGeneral(kind(), other.kind()) &&
-           LessGeneralIdentifyZeros(identify_zeros(), other.identify_zeros());
-  }
-
-  IdentifyZeros identify_zeros() const { return identify_zeros_; }
-
- private:
-  enum class TruncationKind : uint8_t {
-    kNone,
-    kBool,
-    kWord32,
-    kWord64,
-    kOddballAndBigIntToNumber,
-    kAny
-  };
-
-  explicit Truncation(TruncationKind kind, IdentifyZeros identify_zeros)
-      : kind_(kind), identify_zeros_(identify_zeros) {}
-
-  TruncationKind kind() const { return kind_; }
-
-  friend class SimplifiedLoweringVerifier;
-  TruncationKind kind_;
-  IdentifyZeros identify_zeros_;
-
-  static TruncationKind Generalize(TruncationKind rep1, TruncationKind rep2);
-  static IdentifyZeros GeneralizeIdentifyZeros(IdentifyZeros i1,
-                                               IdentifyZeros i2);
-  static bool LessGeneral(TruncationKind rep1, TruncationKind rep2);
-  static bool LessGeneralIdentifyZeros(IdentifyZeros u1, IdentifyZeros u2);
-};
-
-enum class TypeCheckKind : uint8_t {
-  kNone,
-  kSignedSmall,
-  kSigned32,
-  kSigned64,
-  kNumber,
-  kNumberOrBoolean,
-  kNumberOrOddball,
-  kHeapObject,
-  kBigInt,
-  kArrayIndex
-};
-
-inline std::ostream& operator<<(std::ostream& os, TypeCheckKind type_check) {
-  switch (type_check) {
-    case TypeCheckKind::kNone:
-      return os << "None";
-    case TypeCheckKind::kSignedSmall:
-      return os << "SignedSmall";
-    case TypeCheckKind::kSigned32:
-      return os << "Signed32";
-    case TypeCheckKind::kSigned64:
-      return os << "Signed64";
-    case TypeCheckKind::kNumber:
-      return os << "Number";
-    case TypeCheckKind::kNumberOrBoolean:
-      return os << "NumberOrBoolean";
-    case TypeCheckKind::kNumberOrOddball:
-      return os << "NumberOrOddball";
-    case TypeCheckKind::kHeapObject:
-      return os << "HeapObject";
-    case TypeCheckKind::kBigInt:
-      return os << "BigInt";
-    case TypeCheckKind::kArrayIndex:
-      return os << "ArrayIndex";
-  }
-  UNREACHABLE();
-}
-
-// The {UseInfo} class is used to describe a use of an input of a node.
-//
-// This information is used in two different ways, based on the phase:
-//
-// 1. During propagation, the use info is used to inform the input node
-//    about what part of the input is used (we call this truncation) and what
-//    is the preferred representation. For conversions that will require
-//    checks, we also keep track of whether a minus zero check is needed.
-//
-// 2. During lowering, the use info is used to properly convert the input
-//    to the preferred representation. The preferred representation might be
-//    insufficient to do the conversion (e.g. word32->float64 conv), so we also
-//    need the signedness information to produce the correct value.
-//    Additionally, use info may contain {CheckParameters} which contains
-//    information for the deoptimizer such as a CallIC on which speculation
-//    should be disallowed if the check fails.
-class UseInfo {
- public:
-  UseInfo(MachineRepresentation representation, Truncation truncation,
-          TypeCheckKind type_check = TypeCheckKind::kNone,
-          const FeedbackSource& feedback = FeedbackSource())
-      : representation_(representation),
-        truncation_(truncation),
-        type_check_(type_check),
-        feedback_(feedback) {}
-  static UseInfo TruncatingWord32() {
-    return UseInfo(MachineRepresentation::kWord32, Truncation::Word32());
-  }
-  static UseInfo CheckedBigIntTruncatingWord64(const FeedbackSource& feedback) {
-    // Note that Trunction::Word64() can safely use kIdentifyZero, because
-    // TypeCheckKind::kBigInt will make sure we deopt for anything other than
-    // type BigInt anyway.
-    return UseInfo(MachineRepresentation::kWord64, Truncation::Word64(),
-                   TypeCheckKind::kBigInt, feedback);
-  }
-  static UseInfo Word64() {
-    return UseInfo(MachineRepresentation::kWord64, Truncation::Any());
-  }
-  static UseInfo Word() {
-    return UseInfo(MachineType::PointerRepresentation(), Truncation::Any());
-  }
-  static UseInfo Bool() {
-    return UseInfo(MachineRepresentation::kBit, Truncation::Bool());
-  }
-  static UseInfo Float32() {
-    return UseInfo(MachineRepresentation::kFloat32, Truncation::Any());
-  }
-  static UseInfo Float64() {
-    return UseInfo(MachineRepresentation::kFloat64, Truncation::Any());
-  }
-  static UseInfo TruncatingFloat64(
-      IdentifyZeros identify_zeros = kDistinguishZeros) {
-    return UseInfo(MachineRepresentation::kFloat64,
-                   Truncation::OddballAndBigIntToNumber(identify_zeros));
-  }
-  static UseInfo AnyTagged() {
-    return UseInfo(MachineRepresentation::kTagged, Truncation::Any());
-  }
-  static UseInfo TaggedSigned() {
-    return UseInfo(MachineRepresentation::kTaggedSigned, Truncation::Any());
-  }
-  static UseInfo TaggedPointer() {
-    return UseInfo(MachineRepresentation::kTaggedPointer, Truncation::Any());
-  }
-
-  // Possibly deoptimizing conversions.
-  static UseInfo CheckedTaggedAsArrayIndex(const FeedbackSource& feedback) {
-    return UseInfo(MachineType::PointerRepresentation(),
-                   Truncation::Any(kIdentifyZeros), TypeCheckKind::kArrayIndex,
-                   feedback);
-  }
-  static UseInfo CheckedHeapObjectAsTaggedPointer(
-      const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kTaggedPointer, Truncation::Any(),
-                   TypeCheckKind::kHeapObject, feedback);
-  }
-
-  static UseInfo CheckedBigIntAsTaggedPointer(const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kTaggedPointer, Truncation::Any(),
-                   TypeCheckKind::kBigInt, feedback);
-  }
-
-  static UseInfo CheckedSignedSmallAsTaggedSigned(
-      const FeedbackSource& feedback,
-      IdentifyZeros identify_zeros = kDistinguishZeros) {
-    return UseInfo(MachineRepresentation::kTaggedSigned,
-                   Truncation::Any(identify_zeros), TypeCheckKind::kSignedSmall,
-                   feedback);
-  }
-  static UseInfo CheckedSignedSmallAsWord32(IdentifyZeros identify_zeros,
-                                            const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kWord32,
-                   Truncation::Any(identify_zeros), TypeCheckKind::kSignedSmall,
-                   feedback);
-  }
-  static UseInfo CheckedSigned32AsWord32(IdentifyZeros identify_zeros,
-                                         const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kWord32,
-                   Truncation::Any(identify_zeros), TypeCheckKind::kSigned32,
-                   feedback);
-  }
-  static UseInfo CheckedSigned64AsWord64(IdentifyZeros identify_zeros,
-                                         const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kWord64,
-                   Truncation::Any(identify_zeros), TypeCheckKind::kSigned64,
-                   feedback);
-  }
-  static UseInfo CheckedNumberAsFloat64(IdentifyZeros identify_zeros,
-                                        const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kFloat64,
-                   Truncation::Any(identify_zeros), TypeCheckKind::kNumber,
-                   feedback);
-  }
-  static UseInfo CheckedNumberAsWord32(const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kWord32, Truncation::Word32(),
-                   TypeCheckKind::kNumber, feedback);
-  }
-  static UseInfo CheckedNumberOrBooleanAsFloat64(
-      IdentifyZeros identify_zeros, const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kFloat64,
-                   Truncation::Any(identify_zeros),
-                   TypeCheckKind::kNumberOrBoolean, feedback);
-  }
-  static UseInfo CheckedNumberOrOddballAsFloat64(
-      IdentifyZeros identify_zeros, const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kFloat64,
-                   Truncation::Any(identify_zeros),
-                   TypeCheckKind::kNumberOrOddball, feedback);
-  }
-  static UseInfo CheckedNumberOrOddballAsWord32(
-      const FeedbackSource& feedback) {
-    return UseInfo(MachineRepresentation::kWord32, Truncation::Word32(),
-                   TypeCheckKind::kNumberOrOddball, feedback);
-  }
-
-  // Undetermined representation.
-  static UseInfo Any() {
-    return UseInfo(MachineRepresentation::kNone, Truncation::Any());
-  }
-  static UseInfo AnyTruncatingToBool() {
-    return UseInfo(MachineRepresentation::kNone, Truncation::Bool());
-  }
-
-  // Value not used.
-  static UseInfo None() {
-    return UseInfo(MachineRepresentation::kNone, Truncation::None());
-  }
-
-  MachineRepresentation representation() const { return representation_; }
-  Truncation truncation() const { return truncation_; }
-  TypeCheckKind type_check() const { return type_check_; }
-  CheckForMinusZeroMode minus_zero_check() const {
-    return truncation().IdentifiesZeroAndMinusZero()
-               ? CheckForMinusZeroMode::kDontCheckForMinusZero
-               : CheckForMinusZeroMode::kCheckForMinusZero;
-  }
-  const FeedbackSource& feedback() const { return feedback_; }
-
- private:
-  MachineRepresentation representation_;
-  Truncation truncation_;
-  TypeCheckKind type_check_;
-  FeedbackSource feedback_;
-};
-
 // Contains logic related to changing the representation of values for constants
 // and other nodes, as well as lowering Simplified->Machine operators.
 // Eagerly folds any representation changes for constants.
diff --git a/deps/v8/src/compiler/schedule.cc b/deps/v8/src/compiler/schedule.cc
index 5aeeff91238bc8..c608dd63ad1287 100644
--- a/deps/v8/src/compiler/schedule.cc
+++ b/deps/v8/src/compiler/schedule.cc
@@ -198,7 +198,7 @@ BasicBlock* Schedule::NewBasicBlock() {
 }
 
 void Schedule::PlanNode(BasicBlock* block, Node* node) {
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     StdoutStream{} << "Planning #" << node->id() << ":"
                    << node->op()->mnemonic()
                    << " for future add to id:" << block->id() << "\n";
@@ -208,7 +208,7 @@ void Schedule::PlanNode(BasicBlock* block, Node* node) {
 }
 
 void Schedule::AddNode(BasicBlock* block, Node* node) {
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     StdoutStream{} << "Adding #" << node->id() << ":" << node->op()->mnemonic()
                    << " to id:" << block->id() << "\n";
   }
diff --git a/deps/v8/src/compiler/scheduler.cc b/deps/v8/src/compiler/scheduler.cc
index e28c848e5f495d..4da855cf6e54f5 100644
--- a/deps/v8/src/compiler/scheduler.cc
+++ b/deps/v8/src/compiler/scheduler.cc
@@ -22,9 +22,9 @@ namespace v8 {
 namespace internal {
 namespace compiler {
 
-#define TRACE(...)                                       \
-  do {                                                   \
-    if (FLAG_trace_turbo_scheduler) PrintF(__VA_ARGS__); \
+#define TRACE(...)                                           \
+  do {                                                       \
+    if (v8_flags.trace_turbo_scheduler) PrintF(__VA_ARGS__); \
   } while (false)
 
 Scheduler::Scheduler(Zone* zone, Graph* graph, Schedule* schedule, Flags flags,
@@ -195,7 +195,7 @@ void Scheduler::IncrementUnscheduledUseCount(Node* node, Node* from) {
   }
 
   ++(GetData(node)->unscheduled_count_);
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     TRACE("  Use count of #%d:%s (used by #%d:%s)++ = %d\n", node->id(),
           node->op()->mnemonic(), from->id(), from->op()->mnemonic(),
           GetData(node)->unscheduled_count_);
@@ -215,7 +215,7 @@ void Scheduler::DecrementUnscheduledUseCount(Node* node, Node* from) {
 
   DCHECK_LT(0, GetData(node)->unscheduled_count_);
   --(GetData(node)->unscheduled_count_);
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     TRACE("  Use count of #%d:%s (used by #%d:%s)-- = %d\n", node->id(),
           node->op()->mnemonic(), from->id(), from->op()->mnemonic(),
           GetData(node)->unscheduled_count_);
@@ -495,7 +495,7 @@ class CFGBuilder : public ZoneObject {
         break;
     }
 
-    if (FLAG_warn_about_builtin_profile_data &&
+    if (v8_flags.warn_about_builtin_profile_data &&
         hint_from_profile != BranchHint::kNone &&
         BranchHintOf(branch->op()) != BranchHint::kNone &&
         hint_from_profile != BranchHintOf(branch->op())) {
@@ -704,7 +704,7 @@ class SpecialRPONumberer : public ZoneObject {
   // Print and verify the special reverse-post-order.
   void PrintAndVerifySpecialRPO() {
 #if DEBUG
-    if (FLAG_trace_turbo_scheduler) PrintRPO();
+    if (v8_flags.trace_turbo_scheduler) PrintRPO();
     VerifySpecialRPO();
 #endif
   }
@@ -1481,7 +1481,7 @@ void Scheduler::ScheduleEarly() {
   }
 
   TRACE("--- SCHEDULE EARLY -----------------------------------------\n");
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     TRACE("roots: ");
     for (Node* node : schedule_root_nodes_) {
       TRACE("#%d:%s ", node->id(), node->op()->mnemonic());
@@ -1847,7 +1847,7 @@ class ScheduleLateNodeVisitor {
 
 void Scheduler::ScheduleLate() {
   TRACE("--- SCHEDULE LATE ------------------------------------------\n");
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     TRACE("roots: ");
     for (Node* node : schedule_root_nodes_) {
       TRACE("#%d:%s ", node->id(), node->op()->mnemonic());
@@ -1891,7 +1891,7 @@ void Scheduler::SealFinalSchedule() {
 
 void Scheduler::FuseFloatingControl(BasicBlock* block, Node* node) {
   TRACE("--- FUSE FLOATING CONTROL ----------------------------------\n");
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     StdoutStream{} << "Schedule before control flow fusion:\n" << *schedule_;
   }
 
@@ -1919,7 +1919,7 @@ void Scheduler::FuseFloatingControl(BasicBlock* block, Node* node) {
       }
     }
   }
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     TRACE("propagation roots: ");
     for (Node* r : propagation_roots) {
       TRACE("#%d:%s ", r->id(), r->op()->mnemonic());
@@ -1934,7 +1934,7 @@ void Scheduler::FuseFloatingControl(BasicBlock* block, Node* node) {
   scheduled_nodes_.resize(schedule_->BasicBlockCount());
   MovePlannedNodes(block, schedule_->block(node));
 
-  if (FLAG_trace_turbo_scheduler) {
+  if (v8_flags.trace_turbo_scheduler) {
     StdoutStream{} << "Schedule after control flow fusion:\n" << *schedule_;
   }
 }
diff --git a/deps/v8/src/compiler/simplified-lowering-verifier.cc b/deps/v8/src/compiler/simplified-lowering-verifier.cc
index 5a376eed5ce68c..d39cd97accdc74 100644
--- a/deps/v8/src/compiler/simplified-lowering-verifier.cc
+++ b/deps/v8/src/compiler/simplified-lowering-verifier.cc
@@ -26,6 +26,10 @@ bool IsNonTruncatingMachineTypeFor(const MachineType& mt, const Type& type) {
   if (type.IsNone()) return true;
   // TODO(nicohartmann@): Add more cases here.
   if (type.Is(Type::BigInt())) {
+    if (mt.representation() == MachineRepresentation::kWord64) {
+      return type.Is(Type::SignedBigInt64()) ||
+             type.Is(Type::UnsignedBigInt64());
+    }
     return mt.representation() == MachineRepresentation::kTaggedPointer ||
            mt.representation() == MachineRepresentation::kTagged;
   }
@@ -279,6 +283,13 @@ void SimplifiedLoweringVerifier::VisitNode(Node* node,
       CheckAndSet(node, input_type, InputTruncation(node, 0));
       break;
     }
+    case IrOpcode::kCheckBigInt64: {
+      Type input_type = InputType(node, 0);
+      input_type =
+          Type::Intersect(input_type, Type::SignedBigInt64(), graph_zone());
+      CheckAndSet(node, input_type, InputTruncation(node, 0));
+      break;
+    }
     case IrOpcode::kReturn: {
       const int return_value_count = ValueInputCountOfReturn(node->op());
       for (int i = 0; i < return_value_count; ++i) {
@@ -412,6 +423,7 @@ void SimplifiedLoweringVerifier::VisitNode(Node* node,
       CASE(CheckedUint32Div)
       CASE(CheckedUint32Mod)
       CASE(CheckedInt32Mul)
+      CASE(CheckedBigInt64Add)
       CASE(CheckedInt32ToTaggedSigned)
       CASE(CheckedInt64ToInt32)
       CASE(CheckedInt64ToTaggedSigned)
@@ -420,6 +432,7 @@ void SimplifiedLoweringVerifier::VisitNode(Node* node,
       CASE(CheckedUint32ToTaggedSigned)
       CASE(CheckedUint64Bounds)
       CASE(CheckedUint64ToInt32)
+      CASE(CheckedUint64ToInt64)
       CASE(CheckedUint64ToTaggedSigned)
       CASE(CheckedFloat64ToInt64)
       CASE(CheckedTaggedSignedToInt32)
@@ -475,6 +488,9 @@ void SimplifiedLoweringVerifier::VisitNode(Node* node,
       CASE(Int64Sub)
       CASE(Int64SubWithOverflow)
       CASE(Int64Mul)
+      CASE(Int64MulHigh)
+      CASE(Uint64MulHigh)
+      CASE(Int64MulWithOverflow)
       CASE(Int64Div)
       CASE(Int64Mod)
       CASE(Uint64Div)
diff --git a/deps/v8/src/compiler/simplified-lowering.cc b/deps/v8/src/compiler/simplified-lowering.cc
index a0e4583f2ea2fb..b734532777aa5c 100644
--- a/deps/v8/src/compiler/simplified-lowering.cc
+++ b/deps/v8/src/compiler/simplified-lowering.cc
@@ -39,9 +39,9 @@ namespace internal {
 namespace compiler {
 
 // Macro for outputting trace information from representation inference.
-#define TRACE(...)                                      \
-  do {                                                  \
-    if (FLAG_trace_representation) PrintF(__VA_ARGS__); \
+#define TRACE(...)                                          \
+  do {                                                      \
+    if (v8_flags.trace_representation) PrintF(__VA_ARGS__); \
   } while (false)
 
 const char* kSimplifiedLoweringReducerName = "SimplifiedLowering";
@@ -223,6 +223,11 @@ bool IsSomePositiveOrderedNumber(Type type) {
   return type.Is(Type::OrderedNumber()) && (type.IsNone() || type.Min() > 0);
 }
 
+inline bool IsLargeBigInt(Type type) {
+  return type.Is(Type::BigInt()) && !type.Is(Type::SignedBigInt64()) &&
+         !type.Is(Type::UnsignedBigInt64());
+}
+
 class JSONGraphWriterWithVerifierTypes : public JSONGraphWriter {
  public:
   JSONGraphWriterWithVerifierTypes(std::ostream& os, const Graph* graph,
@@ -515,7 +520,7 @@ class RepresentationSelector {
 
     if (!type.IsInvalid() && new_type.Is(type)) return false;
     GetInfo(node)->set_feedback_type(new_type);
-    if (FLAG_trace_representation) {
+    if (v8_flags.trace_representation) {
       PrintNodeFeedbackType(node);
     }
     return true;
@@ -974,6 +979,13 @@ class RepresentationSelector {
             use.truncation().description());
       if (input_type.IsInvalid()) {
         input_type = TypeOf(input);
+      } else {
+        // This case is reached when ConvertInput is called for TypeGuard nodes
+        // which explicitly set the {input_type} for their input. In order to
+        // correctly verify the resulting graph, we have to preserve this
+        // forced type for the verifier.
+        DCHECK_EQ(node->opcode(), IrOpcode::kTypeGuard);
+        input = InsertTypeOverrideForVerifier(input_type, input);
       }
       Node* n = changer_->GetRepresentationFor(input, input_rep, input_type,
                                                node, use);
@@ -1307,6 +1319,14 @@ class RepresentationSelector {
       return MachineType::AnyTagged();
     }
     if (rep == MachineRepresentation::kWord64) {
+      if (type.Is(Type::SignedBigInt64())) {
+        return MachineType::SignedBigInt64();
+      }
+
+      if (type.Is(Type::UnsignedBigInt64())) {
+        return MachineType::UnsignedBigInt64();
+      }
+
       if (type.Is(Type::BigInt())) {
         return MachineType::AnyTagged();
       }
@@ -1328,13 +1348,11 @@ class RepresentationSelector {
   void VisitStateValues(Node* node) {
     if (propagate<T>()) {
       for (int i = 0; i < node->InputCount(); i++) {
-        // When lowering 64 bit BigInts to Word64 representation, we have to
-        // make sure they are rematerialized before deoptimization. By
-        // propagating a AnyTagged use, the RepresentationChanger is going to
-        // insert the necessary conversions.
-        // TODO(nicohartmann): Remove, once the deoptimizer can rematerialize
-        // truncated BigInts.
-        if (TypeOf(node->InputAt(i)).Is(Type::BigInt())) {
+        // BigInt64s are rematerialized in deoptimization. The other BigInts
+        // must be rematerialized before deoptimization. By propagating an
+        // AnyTagged use, the RepresentationChanger is going to insert the
+        // necessary conversions.
+        if (IsLargeBigInt(TypeOf(node->InputAt(i)))) {
           EnqueueInput<T>(node, i, UseInfo::AnyTagged());
         } else {
           EnqueueInput<T>(node, i, UseInfo::Any());
@@ -1346,9 +1364,7 @@ class RepresentationSelector {
           zone->New<ZoneVector<MachineType>>(node->InputCount(), zone);
       for (int i = 0; i < node->InputCount(); i++) {
         Node* input = node->InputAt(i);
-        // TODO(nicohartmann): Remove, once the deoptimizer can rematerialize
-        // truncated BigInts.
-        if (TypeOf(input).Is(Type::BigInt())) {
+        if (IsLargeBigInt(TypeOf(input))) {
           ConvertInput(node, i, UseInfo::AnyTagged());
         }
 
@@ -1377,9 +1393,7 @@ class RepresentationSelector {
     // state-values node).
     Node* accumulator = node.stack();
     if (propagate<T>()) {
-      // TODO(nicohartmann): Remove, once the deoptimizer can rematerialize
-      // truncated BigInts.
-      if (TypeOf(accumulator).Is(Type::BigInt())) {
+      if (IsLargeBigInt(TypeOf(accumulator))) {
         EnqueueInput<T>(node, FrameState::kFrameStateStackInput,
                         UseInfo::AnyTagged());
       } else {
@@ -1387,9 +1401,7 @@ class RepresentationSelector {
                         UseInfo::Any());
       }
     } else if (lower<T>()) {
-      // TODO(nicohartmann): Remove, once the deoptimizer can rematerialize
-      // truncated BigInts.
-      if (TypeOf(accumulator).Is(Type::BigInt())) {
+      if (IsLargeBigInt(TypeOf(accumulator))) {
         ConvertInput(node, FrameState::kFrameStateStackInput,
                      UseInfo::AnyTagged());
       }
@@ -1424,9 +1436,7 @@ class RepresentationSelector {
   void VisitObjectState(Node* node) {
     if (propagate<T>()) {
       for (int i = 0; i < node->InputCount(); i++) {
-        // TODO(nicohartmann): Remove, once the deoptimizer can rematerialize
-        // truncated BigInts.
-        if (TypeOf(node->InputAt(i)).Is(Type::BigInt())) {
+        if (IsLargeBigInt(TypeOf(node->InputAt(i)))) {
           EnqueueInput<T>(node, i, UseInfo::AnyTagged());
         } else {
           EnqueueInput<T>(node, i, UseInfo::Any());
@@ -1440,9 +1450,7 @@ class RepresentationSelector {
         Node* input = node->InputAt(i);
         (*types)[i] =
             DeoptMachineTypeOf(GetInfo(input)->representation(), TypeOf(input));
-        // TODO(nicohartmann): Remove, once the deoptimizer can rematerialize
-        // truncated BigInts.
-        if (TypeOf(node->InputAt(i)).Is(Type::BigInt())) {
+        if (IsLargeBigInt(TypeOf(input))) {
           ConvertInput(node, i, UseInfo::AnyTagged());
         }
       }
@@ -1891,9 +1899,9 @@ class RepresentationSelector {
                                         FeedbackSource const& feedback) {
     switch (type.GetSequenceType()) {
       case CTypeInfo::SequenceType::kScalar: {
-        // TODO(mslekova): Add clamp.
-        if (uint8_t(type.GetFlags()) &
-            uint8_t(CTypeInfo::Flags::kEnforceRangeBit)) {
+        uint8_t flags = uint8_t(type.GetFlags());
+        if (flags & uint8_t(CTypeInfo::Flags::kEnforceRangeBit) ||
+            flags & uint8_t(CTypeInfo::Flags::kClampBit)) {
           return UseInfo::CheckedNumberAsFloat64(kIdentifyZeros, feedback);
         }
         switch (type.GetType()) {
@@ -1981,7 +1989,7 @@ class RepresentationSelector {
       case wasm::kI32:
         return MachineType::Int32();
       case wasm::kI64:
-        return MachineType::Int64();
+        return MachineType::SignedBigInt64();
       case wasm::kF32:
         return MachineType::Float32();
       case wasm::kF64:
@@ -2964,6 +2972,15 @@ class RepresentationSelector {
         }
         return;
       }
+      case IrOpcode::kCheckBigInt64: {
+        if (InputIs(node, Type::BigInt())) {
+          VisitNoop<T>(node, truncation);
+        } else {
+          VisitUnop<T>(node, UseInfo::AnyTagged(),
+                       MachineRepresentation::kTaggedPointer);
+        }
+        return;
+      }
       case IrOpcode::kSpeculativeBigIntAsIntN:
       case IrOpcode::kSpeculativeBigIntAsUintN: {
         const bool is_asuintn =
@@ -2979,11 +2996,14 @@ class RepresentationSelector {
             is_asuintn ? Type::UnsignedBigInt64() : Type::SignedBigInt64());
         if (lower<T>()) {
           if (p.bits() == 0) {
-            DeferReplacement(
-                node, InsertTypeOverrideForVerifier(Type::UnsignedBigInt63(),
-                                                    jsgraph_->ZeroConstant()));
+            DeferReplacement(node, InsertTypeOverrideForVerifier(
+                                       Type::UnsignedBigInt63(),
+                                       jsgraph_->Int64Constant(0)));
           } else if (p.bits() == 64) {
-            DeferReplacement(node, node->InputAt(0));
+            DeferReplacement(node, InsertTypeOverrideForVerifier(
+                                       is_asuintn ? Type::UnsignedBigInt64()
+                                                  : Type::SignedBigInt64(),
+                                       node->InputAt(0)));
           } else {
             if (is_asuintn) {
               const uint64_t mask = (1ULL << p.bits()) - 1ULL;
@@ -3178,11 +3198,14 @@ class RepresentationSelector {
         return;
       }
       case IrOpcode::kSpeculativeBigIntAdd: {
-        // TODO(nicohartmann@, chromium:1073440): There should be special
-        // handling for trunction.IsUnused() that correctly propagates deadness,
-        // but preserves type checking which may throw exceptions. Until this
-        // is fully supported, we lower to int64 operations but keep pushing
-        // type constraints.
+        if (truncation.IsUnused()) {
+          Type left_type = GetUpperBound(node->InputAt(0));
+          Type right_type = GetUpperBound(node->InputAt(1));
+          if (left_type.Is(Type::BigInt()) && right_type.Is(Type::BigInt())) {
+            VisitUnused<T>(node);
+            return;
+          }
+        }
         if (truncation.IsUsedAsWord64()) {
           VisitBinop<T>(
               node, UseInfo::CheckedBigIntTruncatingWord64(FeedbackSource{}),
@@ -3190,17 +3213,42 @@ class RepresentationSelector {
           if (lower<T>()) {
             ChangeToPureOp(node, lowering->machine()->Int64Add());
           }
-        } else {
-          VisitBinop<T>(node,
-                        UseInfo::CheckedBigIntAsTaggedPointer(FeedbackSource{}),
-                        MachineRepresentation::kTaggedPointer);
-          if (lower<T>()) {
-            ChangeOp(node, lowering->simplified()->BigIntAdd());
+          return;
+        }
+        BigIntOperationHint hint = BigIntOperationHintOf(node->op());
+        switch (hint) {
+          case BigIntOperationHint::kBigInt64: {
+            VisitBinop<T>(
+                node, UseInfo::CheckedBigInt64AsWord64(FeedbackSource{}),
+                MachineRepresentation::kWord64, Type::SignedBigInt64());
+            if (lower<T>()) {
+              ChangeOp(node, lowering->simplified()->CheckedBigInt64Add());
+            }
+            break;
+          }
+          case BigIntOperationHint::kBigInt: {
+            VisitBinop<T>(
+                node, UseInfo::CheckedBigIntAsTaggedPointer(FeedbackSource{}),
+                MachineRepresentation::kTaggedPointer);
+            if (lower<T>()) {
+              ChangeOp(node, lowering->simplified()->BigIntAdd());
+            }
+            break;
           }
+          default:
+            UNREACHABLE();
         }
         return;
       }
       case IrOpcode::kSpeculativeBigIntSubtract: {
+        if (truncation.IsUnused()) {
+          Type left_type = GetUpperBound(node->InputAt(0));
+          Type right_type = GetUpperBound(node->InputAt(1));
+          if (left_type.Is(Type::BigInt()) && right_type.Is(Type::BigInt())) {
+            VisitUnused<T>(node);
+            return;
+          }
+        }
         if (truncation.IsUsedAsWord64()) {
           VisitBinop<T>(
               node, UseInfo::CheckedBigIntTruncatingWord64(FeedbackSource{}),
@@ -3219,6 +3267,14 @@ class RepresentationSelector {
         return;
       }
       case IrOpcode::kSpeculativeBigIntMultiply: {
+        if (truncation.IsUnused()) {
+          Type left_type = GetUpperBound(node->InputAt(0));
+          Type right_type = GetUpperBound(node->InputAt(1));
+          if (left_type.Is(Type::BigInt()) && right_type.Is(Type::BigInt())) {
+            VisitUnused<T>(node);
+            return;
+          }
+        }
         if (truncation.IsUsedAsWord64()) {
           VisitBinop<T>(
               node, UseInfo::CheckedBigIntTruncatingWord64(FeedbackSource{}),
@@ -3236,7 +3292,32 @@ class RepresentationSelector {
         }
         return;
       }
+      case IrOpcode::kSpeculativeBigIntDivide: {
+        if (truncation.IsUnused()) {
+          Type left_type = GetUpperBound(node->InputAt(0));
+          Type right_type = GetUpperBound(node->InputAt(1));
+          if (left_type.Is(Type::BigInt()) && right_type.Is(Type::BigInt())) {
+            VisitUnused<T>(node);
+            return;
+          }
+        }
+        VisitBinop<T>(node,
+                      UseInfo::CheckedBigIntAsTaggedPointer(FeedbackSource{}),
+                      MachineRepresentation::kTaggedPointer);
+        if (lower<T>()) {
+          ChangeOp(node, lowering->simplified()->BigIntDivide());
+        }
+        return;
+      }
       case IrOpcode::kSpeculativeBigIntBitwiseAnd: {
+        if (truncation.IsUnused()) {
+          Type left_type = GetUpperBound(node->InputAt(0));
+          Type right_type = GetUpperBound(node->InputAt(1));
+          if (left_type.Is(Type::BigInt()) && right_type.Is(Type::BigInt())) {
+            VisitUnused<T>(node);
+            return;
+          }
+        }
         if (truncation.IsUsedAsWord64()) {
           VisitBinop<T>(
               node, UseInfo::CheckedBigIntTruncatingWord64(FeedbackSource{}),
@@ -3254,17 +3335,10 @@ class RepresentationSelector {
         }
         return;
       }
-      case IrOpcode::kSpeculativeBigIntDivide: {
-        VisitBinop<T>(node,
-                      UseInfo::CheckedBigIntAsTaggedPointer(FeedbackSource{}),
-                      MachineRepresentation::kTaggedPointer);
-        if (lower<T>()) {
-          ChangeOp(node, lowering->simplified()->BigIntDivide());
-        }
-        return;
-      }
       case IrOpcode::kSpeculativeBigIntNegate: {
-        if (truncation.IsUsedAsWord64()) {
+        if (truncation.IsUnused()) {
+          VisitUnused<T>(node);
+        } else if (truncation.IsUsedAsWord64()) {
           VisitUnop<T>(node,
                        UseInfo::CheckedBigIntTruncatingWord64(FeedbackSource{}),
                        MachineRepresentation::kWord64);
@@ -4142,7 +4216,7 @@ class RepresentationSelector {
           if (inputType.CanBeAsserted()) {
             ChangeOp(node, simplified()->AssertType(inputType));
           } else {
-            if (!FLAG_fuzzing) {
+            if (!v8_flags.fuzzing) {
 #ifdef DEBUG
               inputType.Print();
 #endif
@@ -4440,7 +4514,7 @@ SimplifiedLowering::SimplifiedLowering(
 
 void SimplifiedLowering::LowerAllNodes() {
   SimplifiedLoweringVerifier* verifier = nullptr;
-  if (FLAG_verify_simplified_lowering) {
+  if (v8_flags.verify_simplified_lowering) {
     verifier = zone_->New<SimplifiedLoweringVerifier>(zone_, graph());
   }
   RepresentationChanger changer(jsgraph(), broker_, verifier);
diff --git a/deps/v8/src/compiler/simplified-operator.cc b/deps/v8/src/compiler/simplified-operator.cc
index 85e9bc470e70ab..5cc9a7e152fabc 100644
--- a/deps/v8/src/compiler/simplified-operator.cc
+++ b/deps/v8/src/compiler/simplified-operator.cc
@@ -235,20 +235,6 @@ CheckForMinusZeroMode CheckMinusZeroModeOf(const Operator* op) {
   return OpParameter<CheckForMinusZeroMode>(op);
 }
 
-size_t hash_value(CheckForMinusZeroMode mode) {
-  return static_cast<size_t>(mode);
-}
-
-std::ostream& operator<<(std::ostream& os, CheckForMinusZeroMode mode) {
-  switch (mode) {
-    case CheckForMinusZeroMode::kCheckForMinusZero:
-      return os << "check-for-minus-zero";
-    case CheckForMinusZeroMode::kDontCheckForMinusZero:
-      return os << "dont-check-for-minus-zero";
-  }
-  UNREACHABLE();
-}
-
 std::ostream& operator<<(std::ostream& os, CheckMapsFlags flags) {
   if (flags & CheckMapsFlag::kTryMigrateInstance) {
     return os << "TryMigrateInstance";
@@ -505,6 +491,8 @@ std::ostream& operator<<(std::ostream& os, BigIntOperationHint hint) {
   switch (hint) {
     case BigIntOperationHint::kBigInt:
       return os << "BigInt";
+    case BigIntOperationHint::kBigInt64:
+      return os << "BigInt64";
   }
   UNREACHABLE();
 }
@@ -554,6 +542,12 @@ NumberOperationHint NumberOperationHintOf(const Operator* op) {
   return OpParameter<NumberOperationHint>(op);
 }
 
+BigIntOperationHint BigIntOperationHintOf(const Operator* op) {
+  // TODO(panq): Expand the DCHECK when more BigInt operations are supported.
+  DCHECK(op->opcode() == IrOpcode::kSpeculativeBigIntAdd);
+  return OpParameter<BigIntOperationHint>(op);
+}
+
 bool operator==(NumberOperationParameters const& lhs,
                 NumberOperationParameters const& rhs) {
   return lhs.hint() == rhs.hint() && lhs.feedback() == rhs.feedback();
@@ -837,23 +831,26 @@ bool operator==(CheckMinusZeroParameters const& lhs,
   V(CheckedInt32Mod, 2, 1)                \
   V(CheckedInt32Sub, 2, 1)                \
   V(CheckedUint32Div, 2, 1)               \
-  V(CheckedUint32Mod, 2, 1)
-
-#define CHECKED_WITH_FEEDBACK_OP_LIST(V)    \
-  V(CheckNumber, 1, 1)                      \
-  V(CheckSmi, 1, 1)                         \
-  V(CheckString, 1, 1)                      \
-  V(CheckBigInt, 1, 1)                      \
-  V(CheckedInt32ToTaggedSigned, 1, 1)       \
-  V(CheckedInt64ToInt32, 1, 1)              \
-  V(CheckedInt64ToTaggedSigned, 1, 1)       \
-  V(CheckedTaggedToArrayIndex, 1, 1)        \
-  V(CheckedTaggedSignedToInt32, 1, 1)       \
-  V(CheckedTaggedToTaggedPointer, 1, 1)     \
-  V(CheckedTaggedToTaggedSigned, 1, 1)      \
-  V(CheckedUint32ToInt32, 1, 1)             \
-  V(CheckedUint32ToTaggedSigned, 1, 1)      \
-  V(CheckedUint64ToInt32, 1, 1)             \
+  V(CheckedUint32Mod, 2, 1)               \
+  V(CheckedBigInt64Add, 2, 1)
+
+#define CHECKED_WITH_FEEDBACK_OP_LIST(V) \
+  V(CheckNumber, 1, 1)                   \
+  V(CheckSmi, 1, 1)                      \
+  V(CheckString, 1, 1)                   \
+  V(CheckBigInt, 1, 1)                   \
+  V(CheckBigInt64, 1, 1)                 \
+  V(CheckedInt32ToTaggedSigned, 1, 1)    \
+  V(CheckedInt64ToInt32, 1, 1)           \
+  V(CheckedInt64ToTaggedSigned, 1, 1)    \
+  V(CheckedTaggedToArrayIndex, 1, 1)     \
+  V(CheckedTaggedSignedToInt32, 1, 1)    \
+  V(CheckedTaggedToTaggedPointer, 1, 1)  \
+  V(CheckedTaggedToTaggedSigned, 1, 1)   \
+  V(CheckedUint32ToInt32, 1, 1)          \
+  V(CheckedUint32ToTaggedSigned, 1, 1)   \
+  V(CheckedUint64ToInt32, 1, 1)          \
+  V(CheckedUint64ToInt64, 1, 1)          \
   V(CheckedUint64ToTaggedSigned, 1, 1)
 
 #define CHECKED_BOUNDS_OP_LIST(V) \
diff --git a/deps/v8/src/compiler/simplified-operator.h b/deps/v8/src/compiler/simplified-operator.h
index 6f20e466ea1aa1..8d082f01b03435 100644
--- a/deps/v8/src/compiler/simplified-operator.h
+++ b/deps/v8/src/compiler/simplified-operator.h
@@ -13,6 +13,7 @@
 #include "src/common/globals.h"
 #include "src/compiler/common-operator.h"
 #include "src/compiler/feedback-source.h"
+#include "src/compiler/globals.h"
 #include "src/compiler/node-properties.h"
 #include "src/compiler/operator.h"
 #include "src/compiler/types.h"
@@ -87,6 +88,12 @@ struct FieldAccess {
                                                    // initializing a newly
                                                    // allocated object or part
                                                    // of a map transition.
+  bool is_bounded_size_access = false;  // Whether this field is stored as a
+                                        // bounded size field. In that case,
+                                        // the size is shifted to the left to
+                                        // guarantee that the value is at most
+                                        // kMaxSafeBufferSizeForSandbox after
+                                        // decoding.
 
   FieldAccess()
       : base_is_tagged(kTaggedBase),
@@ -365,16 +372,6 @@ size_t hash_value(const CheckTaggedInputParameters& params);
 bool operator==(CheckTaggedInputParameters const&,
                 CheckTaggedInputParameters const&);
 
-enum class CheckForMinusZeroMode : uint8_t {
-  kCheckForMinusZero,
-  kDontCheckForMinusZero,
-};
-
-size_t hash_value(CheckForMinusZeroMode);
-
-V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&,
-                                           CheckForMinusZeroMode);
-
 CheckForMinusZeroMode CheckMinusZeroModeOf(const Operator*)
     V8_WARN_UNUSED_RESULT;
 
@@ -533,6 +530,7 @@ enum class NumberOperationHint : uint8_t {
 
 enum class BigIntOperationHint : uint8_t {
   kBigInt,
+  kBigInt64,
 };
 
 size_t hash_value(NumberOperationHint);
@@ -542,6 +540,8 @@ V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, NumberOperationHint);
 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, BigIntOperationHint);
 V8_EXPORT_PRIVATE NumberOperationHint NumberOperationHintOf(const Operator* op)
     V8_WARN_UNUSED_RESULT;
+V8_EXPORT_PRIVATE BigIntOperationHint BigIntOperationHintOf(const Operator* op)
+    V8_WARN_UNUSED_RESULT;
 
 class NumberOperationParameters {
  public:
@@ -917,6 +917,7 @@ class V8_EXPORT_PRIVATE SimplifiedOperatorBuilder final
   const Operator* CheckedInt32Mod();
   const Operator* CheckedInt32Mul(CheckForMinusZeroMode);
   const Operator* CheckedInt32Sub();
+  const Operator* CheckedBigInt64Add();
   const Operator* CheckedInt32ToTaggedSigned(const FeedbackSource& feedback);
   const Operator* CheckedInt64ToInt32(const FeedbackSource& feedback);
   const Operator* CheckedInt64ToTaggedSigned(const FeedbackSource& feedback);
@@ -931,6 +932,7 @@ class V8_EXPORT_PRIVATE SimplifiedOperatorBuilder final
   const Operator* CheckedTaggedToTaggedPointer(const FeedbackSource& feedback);
   const Operator* CheckedTaggedToTaggedSigned(const FeedbackSource& feedback);
   const Operator* CheckBigInt(const FeedbackSource& feedback);
+  const Operator* CheckBigInt64(const FeedbackSource& feedback);
   const Operator* CheckedTruncateTaggedToWord32(CheckTaggedInputMode,
                                                 const FeedbackSource& feedback);
   const Operator* CheckedUint32Div();
@@ -938,6 +940,7 @@ class V8_EXPORT_PRIVATE SimplifiedOperatorBuilder final
   const Operator* CheckedUint32ToInt32(const FeedbackSource& feedback);
   const Operator* CheckedUint32ToTaggedSigned(const FeedbackSource& feedback);
   const Operator* CheckedUint64ToInt32(const FeedbackSource& feedback);
+  const Operator* CheckedUint64ToInt64(const FeedbackSource& feedback);
   const Operator* CheckedUint64ToTaggedSigned(const FeedbackSource& feedback);
 
   const Operator* ConvertReceiver(ConvertReceiverMode);
diff --git a/deps/v8/src/compiler/store-store-elimination.cc b/deps/v8/src/compiler/store-store-elimination.cc
index 75a5ea421e9b67..f6ef3d52429500 100644
--- a/deps/v8/src/compiler/store-store-elimination.cc
+++ b/deps/v8/src/compiler/store-store-elimination.cc
@@ -18,7 +18,7 @@ namespace compiler {
 
 #define TRACE(fmt, ...)                                         \
   do {                                                          \
-    if (FLAG_trace_store_elimination) {                         \
+    if (v8_flags.trace_store_elimination) {                     \
       PrintF("RedundantStoreFinder: " fmt "\n", ##__VA_ARGS__); \
     }                                                           \
   } while (false)
@@ -553,7 +553,7 @@ void StoreStoreElimination::Run(JSGraph* js_graph, TickCounter* tick_counter,
 
   // Remove superfluous nodes
   for (Node* node : finder.to_remove_const()) {
-    if (FLAG_trace_store_elimination) {
+    if (v8_flags.trace_store_elimination) {
       PrintF("StoreStoreElimination::Run: Eliminating node #%d:%s\n",
              node->id(), node->op()->mnemonic());
     }
diff --git a/deps/v8/src/compiler/turboshaft/assembler.h b/deps/v8/src/compiler/turboshaft/assembler.h
index f7ed2415ee2188..f862d16c634597 100644
--- a/deps/v8/src/compiler/turboshaft/assembler.h
+++ b/deps/v8/src/compiler/turboshaft/assembler.h
@@ -11,16 +11,14 @@
 #include <memory>
 #include <type_traits>
 
-#include "src/base/iterator.h"
 #include "src/base/logging.h"
 #include "src/base/macros.h"
 #include "src/base/small-vector.h"
 #include "src/base/template-utils.h"
-#include "src/codegen/machine-type.h"
-#include "src/codegen/source-position.h"
+#include "src/codegen/reloc-info.h"
 #include "src/compiler/turboshaft/graph.h"
+#include "src/compiler/turboshaft/operation-matching.h"
 #include "src/compiler/turboshaft/operations.h"
-#include "src/zone/zone-containers.h"
 
 namespace v8::internal::compiler::turboshaft {
 
@@ -32,232 +30,376 @@ class AssemblerInterface : public Superclass {
   using Superclass::Superclass;
   using Base = Superclass;
 
-#define DECL_MULTI_REP_BINOP(name, operation, kind)                        \
-  OpIndex name(OpIndex left, OpIndex right, MachineRepresentation rep) {   \
+#define DECL_MULTI_REP_BINOP(name, operation, rep_type, kind)              \
+  OpIndex name(OpIndex left, OpIndex right, rep_type rep) {                \
     return subclass().operation(left, right, operation##Op::Kind::k##kind, \
                                 rep);                                      \
   }
 #define DECL_SINGLE_REP_BINOP(name, operation, kind, rep)                  \
   OpIndex name(OpIndex left, OpIndex right) {                              \
     return subclass().operation(left, right, operation##Op::Kind::k##kind, \
-                                MachineRepresentation::k##rep);            \
-  }
-#define DECL_SINGLE_REP_BINOP_NO_KIND(name, operation, rep)                  \
-  OpIndex name(OpIndex left, OpIndex right) {                                \
-    return subclass().operation(left, right, MachineRepresentation::k##rep); \
-  }
-  DECL_MULTI_REP_BINOP(WordAdd, WordBinop, Add)
-  DECL_SINGLE_REP_BINOP(Word32Add, WordBinop, Add, Word32)
-  DECL_SINGLE_REP_BINOP(Word64Add, WordBinop, Add, Word64)
-
-  DECL_MULTI_REP_BINOP(WordMul, WordBinop, Mul)
-  DECL_SINGLE_REP_BINOP(Word32Mul, WordBinop, Mul, Word32)
-  DECL_SINGLE_REP_BINOP(Word64Mul, WordBinop, Mul, Word64)
-
-  DECL_MULTI_REP_BINOP(WordBitwiseAnd, WordBinop, BitwiseAnd)
-  DECL_SINGLE_REP_BINOP(Word32BitwiseAnd, WordBinop, BitwiseAnd, Word32)
-  DECL_SINGLE_REP_BINOP(Word64BitwiseAnd, WordBinop, BitwiseAnd, Word64)
-
-  DECL_MULTI_REP_BINOP(WordBitwiseOr, WordBinop, BitwiseOr)
-  DECL_SINGLE_REP_BINOP(Word32BitwiseOr, WordBinop, BitwiseOr, Word32)
-  DECL_SINGLE_REP_BINOP(Word64BitwiseOr, WordBinop, BitwiseOr, Word64)
-
-  DECL_MULTI_REP_BINOP(WordBitwiseXor, WordBinop, BitwiseXor)
-  DECL_SINGLE_REP_BINOP(Word32BitwiseXor, WordBinop, BitwiseXor, Word32)
-  DECL_SINGLE_REP_BINOP(Word64BitwiseXor, WordBinop, BitwiseXor, Word64)
-
-  DECL_MULTI_REP_BINOP(WordSub, WordBinop, Sub)
-  DECL_SINGLE_REP_BINOP(Word32Sub, WordBinop, Sub, Word32)
-  DECL_SINGLE_REP_BINOP(Word64Sub, WordBinop, Sub, Word64)
-
-  DECL_MULTI_REP_BINOP(IntDiv, WordBinop, SignedDiv)
-  DECL_SINGLE_REP_BINOP(Int32Div, WordBinop, SignedDiv, Word32)
-  DECL_SINGLE_REP_BINOP(Int64Div, WordBinop, SignedDiv, Word64)
-  DECL_MULTI_REP_BINOP(UintDiv, WordBinop, UnsignedDiv)
-  DECL_SINGLE_REP_BINOP(Uint32Div, WordBinop, UnsignedDiv, Word32)
-  DECL_SINGLE_REP_BINOP(Uint64Div, WordBinop, UnsignedDiv, Word64)
-  DECL_MULTI_REP_BINOP(IntMod, WordBinop, SignedMod)
-  DECL_SINGLE_REP_BINOP(Int32Mod, WordBinop, SignedMod, Word32)
-  DECL_SINGLE_REP_BINOP(Int64Mod, WordBinop, SignedMod, Word64)
-  DECL_MULTI_REP_BINOP(UintMod, WordBinop, UnsignedMod)
-  DECL_SINGLE_REP_BINOP(Uint32Mod, WordBinop, UnsignedMod, Word32)
-  DECL_SINGLE_REP_BINOP(Uint64Mod, WordBinop, UnsignedMod, Word64)
+                                rep);                                      \
+  }
+#define DECL_SINGLE_REP_BINOP_NO_KIND(name, operation, rep) \
+  OpIndex name(OpIndex left, OpIndex right) {               \
+    return subclass().operation(left, right, rep);          \
+  }
+  DECL_MULTI_REP_BINOP(WordAdd, WordBinop, WordRepresentation, Add)
+  DECL_SINGLE_REP_BINOP(Word32Add, WordBinop, Add, WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Word64Add, WordBinop, Add, WordRepresentation::Word64())
+
+  DECL_MULTI_REP_BINOP(WordMul, WordBinop, WordRepresentation, Mul)
+  DECL_SINGLE_REP_BINOP(Word32Mul, WordBinop, Mul, WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Word64Mul, WordBinop, Mul, WordRepresentation::Word64())
+
+  DECL_MULTI_REP_BINOP(WordBitwiseAnd, WordBinop, WordRepresentation,
+                       BitwiseAnd)
+  DECL_SINGLE_REP_BINOP(Word32BitwiseAnd, WordBinop, BitwiseAnd,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Word64BitwiseAnd, WordBinop, BitwiseAnd,
+                        WordRepresentation::Word64())
+
+  DECL_MULTI_REP_BINOP(WordBitwiseOr, WordBinop, WordRepresentation, BitwiseOr)
+  DECL_SINGLE_REP_BINOP(Word32BitwiseOr, WordBinop, BitwiseOr,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Word64BitwiseOr, WordBinop, BitwiseOr,
+                        WordRepresentation::Word64())
+
+  DECL_MULTI_REP_BINOP(WordBitwiseXor, WordBinop, WordRepresentation,
+                       BitwiseXor)
+  DECL_SINGLE_REP_BINOP(Word32BitwiseXor, WordBinop, BitwiseXor,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Word64BitwiseXor, WordBinop, BitwiseXor,
+                        WordRepresentation::Word64())
+
+  DECL_MULTI_REP_BINOP(WordSub, WordBinop, WordRepresentation, Sub)
+  DECL_SINGLE_REP_BINOP(Word32Sub, WordBinop, Sub, WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Word64Sub, WordBinop, Sub, WordRepresentation::Word64())
+
+  DECL_MULTI_REP_BINOP(IntDiv, WordBinop, WordRepresentation, SignedDiv)
+  DECL_SINGLE_REP_BINOP(Int32Div, WordBinop, SignedDiv,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Int64Div, WordBinop, SignedDiv,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(UintDiv, WordBinop, WordRepresentation, UnsignedDiv)
+  DECL_SINGLE_REP_BINOP(Uint32Div, WordBinop, UnsignedDiv,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Uint64Div, WordBinop, UnsignedDiv,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(IntMod, WordBinop, WordRepresentation, SignedMod)
+  DECL_SINGLE_REP_BINOP(Int32Mod, WordBinop, SignedMod,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Int64Mod, WordBinop, SignedMod,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(UintMod, WordBinop, WordRepresentation, UnsignedMod)
+  DECL_SINGLE_REP_BINOP(Uint32Mod, WordBinop, UnsignedMod,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Uint64Mod, WordBinop, UnsignedMod,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(IntMulOverflownBits, WordBinop, WordRepresentation,
+                       SignedMulOverflownBits)
   DECL_SINGLE_REP_BINOP(Int32MulOverflownBits, WordBinop,
-                        SignedMulOverflownBits, Word32)
+                        SignedMulOverflownBits, WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Int64MulOverflownBits, WordBinop,
+                        SignedMulOverflownBits, WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(UintMulOverflownBits, WordBinop, WordRepresentation,
+                       UnsignedMulOverflownBits)
   DECL_SINGLE_REP_BINOP(Uint32MulOverflownBits, WordBinop,
-                        UnsignedMulOverflownBits, Word32)
+                        UnsignedMulOverflownBits, WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Uint64MulOverflownBits, WordBinop,
+                        UnsignedMulOverflownBits, WordRepresentation::Word64())
 
-  DECL_MULTI_REP_BINOP(IntAddCheckOverflow, OverflowCheckedBinop, SignedAdd)
+  DECL_MULTI_REP_BINOP(IntAddCheckOverflow, OverflowCheckedBinop,
+                       WordRepresentation, SignedAdd)
   DECL_SINGLE_REP_BINOP(Int32AddCheckOverflow, OverflowCheckedBinop, SignedAdd,
-                        Word32)
+                        WordRepresentation::Word32())
   DECL_SINGLE_REP_BINOP(Int64AddCheckOverflow, OverflowCheckedBinop, SignedAdd,
-                        Word64)
-  DECL_MULTI_REP_BINOP(IntSubCheckOverflow, OverflowCheckedBinop, SignedSub)
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(IntSubCheckOverflow, OverflowCheckedBinop,
+                       WordRepresentation, SignedSub)
   DECL_SINGLE_REP_BINOP(Int32SubCheckOverflow, OverflowCheckedBinop, SignedSub,
-                        Word32)
+                        WordRepresentation::Word32())
   DECL_SINGLE_REP_BINOP(Int64SubCheckOverflow, OverflowCheckedBinop, SignedSub,
-                        Word64)
-  DECL_MULTI_REP_BINOP(IntMulCheckOverflow, OverflowCheckedBinop, SignedMul)
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(IntMulCheckOverflow, OverflowCheckedBinop,
+                       WordRepresentation, SignedMul)
   DECL_SINGLE_REP_BINOP(Int32MulCheckOverflow, OverflowCheckedBinop, SignedMul,
-                        Word32)
+                        WordRepresentation::Word32())
   DECL_SINGLE_REP_BINOP(Int64MulCheckOverflow, OverflowCheckedBinop, SignedMul,
-                        Word64)
-
-  DECL_MULTI_REP_BINOP(FloatAdd, FloatBinop, Add)
-  DECL_SINGLE_REP_BINOP(Float32Add, FloatBinop, Add, Float32)
-  DECL_SINGLE_REP_BINOP(Float64Add, FloatBinop, Add, Float64)
-  DECL_MULTI_REP_BINOP(FloatMul, FloatBinop, Mul)
-  DECL_SINGLE_REP_BINOP(Float32Mul, FloatBinop, Mul, Float32)
-  DECL_SINGLE_REP_BINOP(Float64Mul, FloatBinop, Mul, Float64)
-  DECL_MULTI_REP_BINOP(FloatSub, FloatBinop, Sub)
-  DECL_SINGLE_REP_BINOP(Float32Sub, FloatBinop, Sub, Float32)
-  DECL_SINGLE_REP_BINOP(Float64Sub, FloatBinop, Sub, Float64)
-  DECL_MULTI_REP_BINOP(FloatDiv, FloatBinop, Div)
-  DECL_SINGLE_REP_BINOP(Float32Div, FloatBinop, Div, Float32)
-  DECL_SINGLE_REP_BINOP(Float64Div, FloatBinop, Div, Float64)
-  DECL_MULTI_REP_BINOP(FloatMin, FloatBinop, Min)
-  DECL_SINGLE_REP_BINOP(Float32Min, FloatBinop, Min, Float32)
-  DECL_SINGLE_REP_BINOP(Float64Min, FloatBinop, Min, Float64)
-  DECL_MULTI_REP_BINOP(FloatMax, FloatBinop, Max)
-  DECL_SINGLE_REP_BINOP(Float32Max, FloatBinop, Max, Float32)
-  DECL_SINGLE_REP_BINOP(Float64Max, FloatBinop, Max, Float64)
-  DECL_SINGLE_REP_BINOP(Float64Mod, FloatBinop, Mod, Float64)
-  DECL_SINGLE_REP_BINOP(Float64Power, FloatBinop, Power, Float64)
-  DECL_SINGLE_REP_BINOP(Float64Atan2, FloatBinop, Atan2, Float64)
+                        WordRepresentation::Word64())
+
+  DECL_MULTI_REP_BINOP(FloatAdd, FloatBinop, FloatRepresentation, Add)
+  DECL_SINGLE_REP_BINOP(Float32Add, FloatBinop, Add,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_BINOP(Float64Add, FloatBinop, Add,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_BINOP(FloatMul, FloatBinop, FloatRepresentation, Mul)
+  DECL_SINGLE_REP_BINOP(Float32Mul, FloatBinop, Mul,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_BINOP(Float64Mul, FloatBinop, Mul,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_BINOP(FloatSub, FloatBinop, FloatRepresentation, Sub)
+  DECL_SINGLE_REP_BINOP(Float32Sub, FloatBinop, Sub,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_BINOP(Float64Sub, FloatBinop, Sub,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_BINOP(FloatDiv, FloatBinop, FloatRepresentation, Div)
+  DECL_SINGLE_REP_BINOP(Float32Div, FloatBinop, Div,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_BINOP(Float64Div, FloatBinop, Div,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_BINOP(FloatMin, FloatBinop, FloatRepresentation, Min)
+  DECL_SINGLE_REP_BINOP(Float32Min, FloatBinop, Min,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_BINOP(Float64Min, FloatBinop, Min,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_BINOP(FloatMax, FloatBinop, FloatRepresentation, Max)
+  DECL_SINGLE_REP_BINOP(Float32Max, FloatBinop, Max,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_BINOP(Float64Max, FloatBinop, Max,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_BINOP(Float64Mod, FloatBinop, Mod,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_BINOP(Float64Power, FloatBinop, Power,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_BINOP(Float64Atan2, FloatBinop, Atan2,
+                        FloatRepresentation::Float64())
 
   DECL_MULTI_REP_BINOP(ShiftRightArithmeticShiftOutZeros, Shift,
-                       ShiftRightArithmeticShiftOutZeros)
+                       WordRepresentation, ShiftRightArithmeticShiftOutZeros)
   DECL_SINGLE_REP_BINOP(Word32ShiftRightArithmeticShiftOutZeros, Shift,
-                        ShiftRightArithmeticShiftOutZeros, Word32)
+                        ShiftRightArithmeticShiftOutZeros,
+                        WordRepresentation::Word32())
   DECL_SINGLE_REP_BINOP(Word64ShiftRightArithmeticShiftOutZeros, Shift,
-                        ShiftRightArithmeticShiftOutZeros, Word64)
-  DECL_MULTI_REP_BINOP(ShiftRightArithmetic, Shift, ShiftRightArithmetic)
+                        ShiftRightArithmeticShiftOutZeros,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(ShiftRightArithmetic, Shift, WordRepresentation,
+                       ShiftRightArithmetic)
   DECL_SINGLE_REP_BINOP(Word32ShiftRightArithmetic, Shift, ShiftRightArithmetic,
-                        Word32)
+                        WordRepresentation::Word32())
   DECL_SINGLE_REP_BINOP(Word64ShiftRightArithmetic, Shift, ShiftRightArithmetic,
-                        Word64)
-  DECL_MULTI_REP_BINOP(ShiftRightLogical, Shift, ShiftRightLogical)
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(ShiftRightLogical, Shift, WordRepresentation,
+                       ShiftRightLogical)
   DECL_SINGLE_REP_BINOP(Word32ShiftRightLogical, Shift, ShiftRightLogical,
-                        Word32)
+                        WordRepresentation::Word32())
   DECL_SINGLE_REP_BINOP(Word64ShiftRightLogical, Shift, ShiftRightLogical,
-                        Word64)
-  DECL_MULTI_REP_BINOP(ShiftLeft, Shift, ShiftLeft)
-  DECL_SINGLE_REP_BINOP(Word32ShiftLeft, Shift, ShiftLeft, Word32)
-  DECL_SINGLE_REP_BINOP(Word64ShiftLeft, Shift, ShiftLeft, Word64)
-  DECL_MULTI_REP_BINOP(RotateRight, Shift, RotateRight)
-  DECL_SINGLE_REP_BINOP(Word32RotateRight, Shift, RotateRight, Word32)
-  DECL_SINGLE_REP_BINOP(Word64RotateRight, Shift, RotateRight, Word64)
-  DECL_MULTI_REP_BINOP(RotateLeft, Shift, RotateLeft)
-  DECL_SINGLE_REP_BINOP(Word32RotateLeft, Shift, RotateLeft, Word32)
-  DECL_SINGLE_REP_BINOP(Word64RotateLeft, Shift, RotateLeft, Word64)
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(ShiftLeft, Shift, WordRepresentation, ShiftLeft)
+  DECL_SINGLE_REP_BINOP(Word32ShiftLeft, Shift, ShiftLeft,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Word64ShiftLeft, Shift, ShiftLeft,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(RotateRight, Shift, WordRepresentation, RotateRight)
+  DECL_SINGLE_REP_BINOP(Word32RotateRight, Shift, RotateRight,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Word64RotateRight, Shift, RotateRight,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(RotateLeft, Shift, WordRepresentation, RotateLeft)
+  DECL_SINGLE_REP_BINOP(Word32RotateLeft, Shift, RotateLeft,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Word64RotateLeft, Shift, RotateLeft,
+                        WordRepresentation::Word64())
 
   OpIndex ShiftRightLogical(OpIndex left, uint32_t right,
-                            MachineRepresentation rep) {
+                            WordRepresentation rep) {
     DCHECK_GE(right, 0);
-    DCHECK_LT(right, ElementSizeInBits(rep));
-    return ShiftRightLogical(left, Word32Constant(right), rep);
+    DCHECK_LT(right, rep.bit_width());
+    return ShiftRightLogical(left, this->Word32Constant(right), rep);
   }
   OpIndex ShiftRightArithmetic(OpIndex left, uint32_t right,
-                               MachineRepresentation rep) {
+                               WordRepresentation rep) {
     DCHECK_GE(right, 0);
-    DCHECK_LT(right, ElementSizeInBits(rep));
-    return ShiftRightArithmetic(left, Word32Constant(right), rep);
-  }
-
-  DECL_SINGLE_REP_BINOP_NO_KIND(Word32Equal, Equal, Word32)
-  DECL_SINGLE_REP_BINOP_NO_KIND(Word64Equal, Equal, Word64)
-  DECL_SINGLE_REP_BINOP_NO_KIND(Float32Equal, Equal, Float32)
-  DECL_SINGLE_REP_BINOP_NO_KIND(Float64Equal, Equal, Float64)
-
-  DECL_MULTI_REP_BINOP(IntLessThan, Comparison, SignedLessThan)
-  DECL_SINGLE_REP_BINOP(Int32LessThan, Comparison, SignedLessThan, Word32)
-  DECL_SINGLE_REP_BINOP(Int64LessThan, Comparison, SignedLessThan, Word64)
-  DECL_MULTI_REP_BINOP(UintLessThan, Comparison, UnsignedLessThan)
-  DECL_SINGLE_REP_BINOP(Uint32LessThan, Comparison, UnsignedLessThan, Word32)
-  DECL_SINGLE_REP_BINOP(Uint64LessThan, Comparison, UnsignedLessThan, Word64)
-  DECL_MULTI_REP_BINOP(FloatLessThan, Comparison, SignedLessThan)
-  DECL_SINGLE_REP_BINOP(Float32LessThan, Comparison, SignedLessThan, Float32)
-  DECL_SINGLE_REP_BINOP(Float64LessThan, Comparison, SignedLessThan, Float64)
-
-  DECL_MULTI_REP_BINOP(IntLessThanOrEqual, Comparison, SignedLessThanOrEqual)
+    DCHECK_LT(right, rep.bit_width());
+    return ShiftRightArithmetic(left, this->Word32Constant(right), rep);
+  }
+
+  DECL_SINGLE_REP_BINOP_NO_KIND(Word32Equal, Equal,
+                                WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP_NO_KIND(Word64Equal, Equal,
+                                WordRepresentation::Word64())
+  DECL_SINGLE_REP_BINOP_NO_KIND(Float32Equal, Equal,
+                                FloatRepresentation::Float32())
+  DECL_SINGLE_REP_BINOP_NO_KIND(Float64Equal, Equal,
+                                FloatRepresentation::Float64())
+
+  DECL_MULTI_REP_BINOP(IntLessThan, Comparison, RegisterRepresentation,
+                       SignedLessThan)
+  DECL_SINGLE_REP_BINOP(Int32LessThan, Comparison, SignedLessThan,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Int64LessThan, Comparison, SignedLessThan,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(UintLessThan, Comparison, RegisterRepresentation,
+                       UnsignedLessThan)
+  DECL_SINGLE_REP_BINOP(Uint32LessThan, Comparison, UnsignedLessThan,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_BINOP(Uint64LessThan, Comparison, UnsignedLessThan,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(FloatLessThan, Comparison, RegisterRepresentation,
+                       SignedLessThan)
+  DECL_SINGLE_REP_BINOP(Float32LessThan, Comparison, SignedLessThan,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_BINOP(Float64LessThan, Comparison, SignedLessThan,
+                        FloatRepresentation::Float64())
+
+  DECL_MULTI_REP_BINOP(IntLessThanOrEqual, Comparison, RegisterRepresentation,
+                       SignedLessThanOrEqual)
   DECL_SINGLE_REP_BINOP(Int32LessThanOrEqual, Comparison, SignedLessThanOrEqual,
-                        Word32)
+                        WordRepresentation::Word32())
   DECL_SINGLE_REP_BINOP(Int64LessThanOrEqual, Comparison, SignedLessThanOrEqual,
-                        Word64)
-  DECL_MULTI_REP_BINOP(UintLessThanOrEqual, Comparison, UnsignedLessThanOrEqual)
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(UintLessThanOrEqual, Comparison, RegisterRepresentation,
+                       UnsignedLessThanOrEqual)
   DECL_SINGLE_REP_BINOP(Uint32LessThanOrEqual, Comparison,
-                        UnsignedLessThanOrEqual, Word32)
+                        UnsignedLessThanOrEqual, WordRepresentation::Word32())
   DECL_SINGLE_REP_BINOP(Uint64LessThanOrEqual, Comparison,
-                        UnsignedLessThanOrEqual, Word64)
-  DECL_MULTI_REP_BINOP(FloatLessThanOrEqual, Comparison, SignedLessThanOrEqual)
+                        UnsignedLessThanOrEqual, WordRepresentation::Word64())
+  DECL_MULTI_REP_BINOP(FloatLessThanOrEqual, Comparison, RegisterRepresentation,
+                       SignedLessThanOrEqual)
   DECL_SINGLE_REP_BINOP(Float32LessThanOrEqual, Comparison,
-                        SignedLessThanOrEqual, Float32)
+                        SignedLessThanOrEqual, FloatRepresentation::Float32())
   DECL_SINGLE_REP_BINOP(Float64LessThanOrEqual, Comparison,
-                        SignedLessThanOrEqual, Float64)
+                        SignedLessThanOrEqual, FloatRepresentation::Float64())
 
 #undef DECL_SINGLE_REP_BINOP
 #undef DECL_MULTI_REP_BINOP
 #undef DECL_SINGLE_REP_BINOP_NO_KIND
 
-#define DECL_MULTI_REP_UNARY(name, operation, kind)                        \
-  OpIndex name(OpIndex input, MachineRepresentation rep) {                 \
+#define DECL_MULTI_REP_UNARY(name, operation, rep_type, kind)              \
+  OpIndex name(OpIndex input, rep_type rep) {                              \
     return subclass().operation(input, operation##Op::Kind::k##kind, rep); \
   }
-#define DECL_SINGLE_REP_UNARY(name, operation, kind, rep)            \
-  OpIndex name(OpIndex input) {                                      \
-    return subclass().operation(input, operation##Op::Kind::k##kind, \
-                                MachineRepresentation::k##rep);      \
-  }
-
-  DECL_MULTI_REP_UNARY(FloatAbs, FloatUnary, Abs)
-  DECL_SINGLE_REP_UNARY(Float32Abs, FloatUnary, Abs, Float32)
-  DECL_SINGLE_REP_UNARY(Float64Abs, FloatUnary, Abs, Float64)
-  DECL_MULTI_REP_UNARY(FloatNegate, FloatUnary, Negate)
-  DECL_SINGLE_REP_UNARY(Float32Negate, FloatUnary, Negate, Float32)
-  DECL_SINGLE_REP_UNARY(Float64Negate, FloatUnary, Negate, Float64)
-  DECL_SINGLE_REP_UNARY(Float64SilenceNaN, FloatUnary, SilenceNaN, Float64)
-  DECL_MULTI_REP_UNARY(FloatRoundDown, FloatUnary, RoundDown)
-  DECL_SINGLE_REP_UNARY(Float32RoundDown, FloatUnary, RoundDown, Float32)
-  DECL_SINGLE_REP_UNARY(Float64RoundDown, FloatUnary, RoundDown, Float64)
-  DECL_MULTI_REP_UNARY(FloatRoundUp, FloatUnary, RoundUp)
-  DECL_SINGLE_REP_UNARY(Float32RoundUp, FloatUnary, RoundUp, Float32)
-  DECL_SINGLE_REP_UNARY(Float64RoundUp, FloatUnary, RoundUp, Float64)
-  DECL_MULTI_REP_UNARY(FloatRoundToZero, FloatUnary, RoundToZero)
-  DECL_SINGLE_REP_UNARY(Float32RoundToZero, FloatUnary, RoundToZero, Float32)
-  DECL_SINGLE_REP_UNARY(Float64RoundToZero, FloatUnary, RoundToZero, Float64)
-  DECL_MULTI_REP_UNARY(FloatRoundTiesEven, FloatUnary, RoundTiesEven)
+#define DECL_SINGLE_REP_UNARY(name, operation, kind, rep)                  \
+  OpIndex name(OpIndex input) {                                            \
+    return subclass().operation(input, operation##Op::Kind::k##kind, rep); \
+  }
+
+  DECL_MULTI_REP_UNARY(FloatAbs, FloatUnary, FloatRepresentation, Abs)
+  DECL_SINGLE_REP_UNARY(Float32Abs, FloatUnary, Abs,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_UNARY(Float64Abs, FloatUnary, Abs,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_UNARY(FloatNegate, FloatUnary, FloatRepresentation, Negate)
+  DECL_SINGLE_REP_UNARY(Float32Negate, FloatUnary, Negate,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_UNARY(Float64Negate, FloatUnary, Negate,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64SilenceNaN, FloatUnary, SilenceNaN,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_UNARY(FloatRoundDown, FloatUnary, FloatRepresentation,
+                       RoundDown)
+  DECL_SINGLE_REP_UNARY(Float32RoundDown, FloatUnary, RoundDown,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_UNARY(Float64RoundDown, FloatUnary, RoundDown,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_UNARY(FloatRoundUp, FloatUnary, FloatRepresentation, RoundUp)
+  DECL_SINGLE_REP_UNARY(Float32RoundUp, FloatUnary, RoundUp,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_UNARY(Float64RoundUp, FloatUnary, RoundUp,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_UNARY(FloatRoundToZero, FloatUnary, FloatRepresentation,
+                       RoundToZero)
+  DECL_SINGLE_REP_UNARY(Float32RoundToZero, FloatUnary, RoundToZero,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_UNARY(Float64RoundToZero, FloatUnary, RoundToZero,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_UNARY(FloatRoundTiesEven, FloatUnary, FloatRepresentation,
+                       RoundTiesEven)
   DECL_SINGLE_REP_UNARY(Float32RoundTiesEven, FloatUnary, RoundTiesEven,
-                        Float32)
+                        FloatRepresentation::Float32())
   DECL_SINGLE_REP_UNARY(Float64RoundTiesEven, FloatUnary, RoundTiesEven,
-                        Float64)
-  DECL_SINGLE_REP_UNARY(Float64Log, FloatUnary, Log, Float64)
-  DECL_MULTI_REP_UNARY(FloatSqrt, FloatUnary, Sqrt)
-  DECL_SINGLE_REP_UNARY(Float32Sqrt, FloatUnary, Sqrt, Float32)
-  DECL_SINGLE_REP_UNARY(Float64Sqrt, FloatUnary, Sqrt, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Exp, FloatUnary, Exp, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Expm1, FloatUnary, Expm1, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Sin, FloatUnary, Sin, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Cos, FloatUnary, Cos, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Sinh, FloatUnary, Sinh, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Cosh, FloatUnary, Cosh, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Asin, FloatUnary, Asin, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Acos, FloatUnary, Acos, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Asinh, FloatUnary, Asinh, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Acosh, FloatUnary, Acosh, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Tan, FloatUnary, Tan, Float64)
-  DECL_SINGLE_REP_UNARY(Float64Tanh, FloatUnary, Tanh, Float64)
-
-  DECL_MULTI_REP_UNARY(WordReverseBytes, WordUnary, ReverseBytes)
-  DECL_SINGLE_REP_UNARY(Word32ReverseBytes, WordUnary, ReverseBytes, Word32)
-  DECL_SINGLE_REP_UNARY(Word64ReverseBytes, WordUnary, ReverseBytes, Word64)
-  DECL_MULTI_REP_UNARY(WordCountLeadingZeros, WordUnary, CountLeadingZeros)
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Log, FloatUnary, Log,
+                        FloatRepresentation::Float64())
+  DECL_MULTI_REP_UNARY(FloatSqrt, FloatUnary, FloatRepresentation, Sqrt)
+  DECL_SINGLE_REP_UNARY(Float32Sqrt, FloatUnary, Sqrt,
+                        FloatRepresentation::Float32())
+  DECL_SINGLE_REP_UNARY(Float64Sqrt, FloatUnary, Sqrt,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Exp, FloatUnary, Exp,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Expm1, FloatUnary, Expm1,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Sin, FloatUnary, Sin,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Cos, FloatUnary, Cos,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Sinh, FloatUnary, Sinh,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Cosh, FloatUnary, Cosh,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Asin, FloatUnary, Asin,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Acos, FloatUnary, Acos,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Asinh, FloatUnary, Asinh,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Acosh, FloatUnary, Acosh,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Tan, FloatUnary, Tan,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Tanh, FloatUnary, Tanh,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Log2, FloatUnary, Log2,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Log10, FloatUnary, Log10,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Log1p, FloatUnary, Log1p,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Atan, FloatUnary, Atan,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Atanh, FloatUnary, Atanh,
+                        FloatRepresentation::Float64())
+  DECL_SINGLE_REP_UNARY(Float64Cbrt, FloatUnary, Cbrt,
+                        FloatRepresentation::Float64())
+
+  DECL_MULTI_REP_UNARY(WordReverseBytes, WordUnary, WordRepresentation,
+                       ReverseBytes)
+  DECL_SINGLE_REP_UNARY(Word32ReverseBytes, WordUnary, ReverseBytes,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_UNARY(Word64ReverseBytes, WordUnary, ReverseBytes,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_UNARY(WordCountLeadingZeros, WordUnary, WordRepresentation,
+                       CountLeadingZeros)
   DECL_SINGLE_REP_UNARY(Word32CountLeadingZeros, WordUnary, CountLeadingZeros,
-                        Word32)
+                        WordRepresentation::Word32())
   DECL_SINGLE_REP_UNARY(Word64CountLeadingZeros, WordUnary, CountLeadingZeros,
-                        Word64)
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_UNARY(WordCountTrailingZeros, WordUnary, WordRepresentation,
+                       CountTrailingZeros)
+  DECL_SINGLE_REP_UNARY(Word32CountTrailingZeros, WordUnary, CountTrailingZeros,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_UNARY(Word64CountTrailingZeros, WordUnary, CountTrailingZeros,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_UNARY(WordPopCount, WordUnary, WordRepresentation, PopCount)
+  DECL_SINGLE_REP_UNARY(Word32PopCount, WordUnary, PopCount,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_UNARY(Word64PopCount, WordUnary, PopCount,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_UNARY(WordSignExtend8, WordUnary, WordRepresentation,
+                       SignExtend8)
+  DECL_SINGLE_REP_UNARY(Word32SignExtend8, WordUnary, SignExtend8,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_UNARY(Word64SignExtend8, WordUnary, SignExtend8,
+                        WordRepresentation::Word64())
+  DECL_MULTI_REP_UNARY(WordSignExtend16, WordUnary, WordRepresentation,
+                       SignExtend16)
+  DECL_SINGLE_REP_UNARY(Word32SignExtend16, WordUnary, SignExtend16,
+                        WordRepresentation::Word32())
+  DECL_SINGLE_REP_UNARY(Word64SignExtend16, WordUnary, SignExtend16,
+                        WordRepresentation::Word64())
 #undef DECL_SINGLE_REP_UNARY
 #undef DECL_MULTI_REP_UNARY
 
+  OpIndex Word32Select(OpIndex condition, OpIndex left, OpIndex right) {
+    return subclass().Select(condition, left, right,
+                             WordRepresentation::Word32());
+  }
+  OpIndex Word64Select(OpIndex condition, OpIndex left, OpIndex right) {
+    return subclass().Select(condition, left, right,
+                             WordRepresentation::Word64());
+  }
+
   OpIndex Word32Constant(uint32_t value) {
     return subclass().Constant(ConstantOp::Kind::kWord32, uint64_t{value});
   }
@@ -270,15 +412,12 @@ class AssemblerInterface : public Superclass {
   OpIndex Word64Constant(int64_t value) {
     return Word64Constant(static_cast<uint64_t>(value));
   }
-  OpIndex WordConstant(uint64_t value, MachineRepresentation rep) {
-    switch (rep) {
-      case MachineRepresentation::kWord32:
-        DCHECK(value <= MaxUnsignedValue(MachineRepresentation::kWord32));
+  OpIndex WordConstant(uint64_t value, WordRepresentation rep) {
+    switch (rep.value()) {
+      case WordRepresentation::Word32():
         return Word32Constant(static_cast<uint32_t>(value));
-      case MachineRepresentation::kWord64:
+      case WordRepresentation::Word64():
         return Word64Constant(value);
-      default:
-        UNREACHABLE();
     }
   }
   OpIndex Float32Constant(float value) {
@@ -287,14 +426,12 @@ class AssemblerInterface : public Superclass {
   OpIndex Float64Constant(double value) {
     return subclass().Constant(ConstantOp::Kind::kFloat64, value);
   }
-  OpIndex FloatConstant(double value, MachineRepresentation rep) {
-    switch (rep) {
-      case MachineRepresentation::kFloat32:
+  OpIndex FloatConstant(double value, FloatRepresentation rep) {
+    switch (rep.value()) {
+      case FloatRepresentation::Float32():
         return Float32Constant(static_cast<float>(value));
-      case MachineRepresentation::kFloat64:
+      case FloatRepresentation::Float64():
         return Float64Constant(value);
-      default:
-        UNREACHABLE();
     }
   }
   OpIndex NumberConstant(double value) {
@@ -313,38 +450,109 @@ class AssemblerInterface : public Superclass {
   OpIndex ExternalConstant(ExternalReference value) {
     return subclass().Constant(ConstantOp::Kind::kExternal, value);
   }
+  OpIndex RelocatableConstant(int64_t value, RelocInfo::Mode mode) {
+    DCHECK_EQ(mode, any_of(RelocInfo::WASM_CALL, RelocInfo::WASM_STUB_CALL));
+    return subclass().Constant(mode == RelocInfo::WASM_CALL
+                                   ? ConstantOp::Kind::kRelocatableWasmCall
+                                   : ConstantOp::Kind::kRelocatableWasmStubCall,
+                               static_cast<uint64_t>(value));
+  }
+
+#define DECL_CHANGE(name, kind, assumption, from, to)                  \
+  OpIndex name(OpIndex input) {                                        \
+    return subclass().Change(                                          \
+        input, ChangeOp::Kind::kind, ChangeOp::Assumption::assumption, \
+        RegisterRepresentation::from(), RegisterRepresentation::to()); \
+  }
+#define DECL_TRY_CHANGE(name, kind, from, to)                   \
+  OpIndex name(OpIndex input) {                                 \
+    return subclass().TryChange(input, TryChangeOp::Kind::kind, \
+                                FloatRepresentation::from(),    \
+                                WordRepresentation::to());      \
+  }
+
+  DECL_CHANGE(BitcastWord32ToWord64, kBitcast, kNoAssumption, Word32, Word64)
+  DECL_CHANGE(BitcastFloat32ToWord32, kBitcast, kNoAssumption, Float32, Word32)
+  DECL_CHANGE(BitcastWord32ToFloat32, kBitcast, kNoAssumption, Word32, Float32)
+  DECL_CHANGE(BitcastFloat64ToWord64, kBitcast, kNoAssumption, Float64, Word64)
+  DECL_CHANGE(BitcastWord64ToFloat64, kBitcast, kNoAssumption, Word64, Float64)
+  DECL_CHANGE(ChangeUint32ToUint64, kZeroExtend, kNoAssumption, Word32, Word64)
+  DECL_CHANGE(ChangeInt32ToInt64, kSignExtend, kNoAssumption, Word32, Word64)
+  DECL_CHANGE(ChangeInt32ToFloat64, kSignedToFloat, kNoAssumption, Word32,
+              Float64)
+  DECL_CHANGE(ChangeInt64ToFloat64, kSignedToFloat, kNoAssumption, Word64,
+              Float64)
+  DECL_CHANGE(ChangeInt32ToFloat32, kSignedToFloat, kNoAssumption, Word32,
+              Float32)
+  DECL_CHANGE(ChangeInt64ToFloat32, kSignedToFloat, kNoAssumption, Word64,
+              Float32)
+  DECL_CHANGE(ChangeUint32ToFloat32, kUnsignedToFloat, kNoAssumption, Word32,
+              Float32)
+  DECL_CHANGE(ChangeUint64ToFloat32, kUnsignedToFloat, kNoAssumption, Word64,
+              Float32)
+  DECL_CHANGE(ReversibleInt64ToFloat64, kSignedToFloat, kReversible, Word64,
+              Float64)
+  DECL_CHANGE(ChangeUint64ToFloat64, kUnsignedToFloat, kNoAssumption, Word64,
+              Float64)
+  DECL_CHANGE(ReversibleUint64ToFloat64, kUnsignedToFloat, kReversible, Word64,
+              Float64)
+  DECL_CHANGE(ChangeUint32ToFloat64, kUnsignedToFloat, kNoAssumption, Word32,
+              Float64)
+  DECL_CHANGE(ChangeFloat64ToFloat32, kFloatConversion, kNoAssumption, Float64,
+              Float32)
+  DECL_CHANGE(ChangeFloat32ToFloat64, kFloatConversion, kNoAssumption, Float32,
+              Float64)
+  DECL_CHANGE(JSTruncateFloat64ToWord32, kJSFloatTruncate, kNoAssumption,
+              Float64, Word32)
 
-#define DECL_CHANGE(name, kind, from, to)                    \
-  OpIndex name(OpIndex input) {                              \
-    return subclass().Change(input, ChangeOp::Kind::k##kind, \
-                             MachineRepresentation::k##from, \
-                             MachineRepresentation::k##to);  \
-  }
-
-  DECL_CHANGE(BitcastWord32ToWord64, Bitcast, Word32, Word64)
-  DECL_CHANGE(BitcastFloat32ToWord32, Bitcast, Float32, Word32)
-  DECL_CHANGE(BitcastWord32ToFloat32, Bitcast, Word32, Float32)
-  DECL_CHANGE(BitcastFloat64ToWord64, Bitcast, Float64, Word64)
-  DECL_CHANGE(BitcastWord6464ToFloat64, Bitcast, Word64, Float64)
-  DECL_CHANGE(ChangeUint32ToUint64, ZeroExtend, Word32, Word64)
-  DECL_CHANGE(ChangeInt32ToInt64, SignExtend, Word32, Word64)
-  DECL_CHANGE(ChangeInt32ToFloat64, SignedToFloat, Word32, Float64)
-  DECL_CHANGE(ChangeInt64ToFloat64, SignedToFloat, Word64, Float64)
-  DECL_CHANGE(ChangeUint32ToFloat64, UnsignedToFloat, Word32, Float64)
-  DECL_CHANGE(ChangeFloat64ToFloat32, FloatConversion, Float64, Float32)
-  DECL_CHANGE(ChangeFloat32ToFloat64, FloatConversion, Float32, Float64)
-  DECL_CHANGE(JSTruncateFloat64ToWord32, JSFloatTruncate, Float64, Word32)
-  DECL_CHANGE(TruncateFloat64ToInt32OverflowUndefined, SignedFloatTruncate,
+#define DECL_SIGNED_FLOAT_TRUNCATE(FloatBits, ResultBits)                     \
+  DECL_CHANGE(TruncateFloat##FloatBits##ToInt##ResultBits##OverflowUndefined, \
+              kSignedFloatTruncateOverflowToMin, kNoOverflow,                 \
+              Float##FloatBits, Word##ResultBits)                             \
+  DECL_CHANGE(TruncateFloat##FloatBits##ToInt##ResultBits##OverflowToMin,     \
+              kSignedFloatTruncateOverflowToMin, kNoAssumption,               \
+              Float##FloatBits, Word##ResultBits)                             \
+  DECL_TRY_CHANGE(TryTruncateFloat##FloatBits##ToInt##ResultBits,             \
+                  kSignedFloatTruncateOverflowUndefined, Float##FloatBits,    \
+                  Word##ResultBits)
+
+  DECL_SIGNED_FLOAT_TRUNCATE(64, 64)
+  DECL_SIGNED_FLOAT_TRUNCATE(64, 32)
+  DECL_SIGNED_FLOAT_TRUNCATE(32, 64)
+  DECL_SIGNED_FLOAT_TRUNCATE(32, 32)
+#undef DECL_SIGNED_FLOAT_TRUNCATE
+
+#define DECL_UNSIGNED_FLOAT_TRUNCATE(FloatBits, ResultBits)                    \
+  DECL_CHANGE(TruncateFloat##FloatBits##ToUint##ResultBits##OverflowUndefined, \
+              kUnsignedFloatTruncateOverflowToMin, kNoOverflow,                \
+              Float##FloatBits, Word##ResultBits)                              \
+  DECL_CHANGE(TruncateFloat##FloatBits##ToUint##ResultBits##OverflowToMin,     \
+              kUnsignedFloatTruncateOverflowToMin, kNoAssumption,              \
+              Float##FloatBits, Word##ResultBits)                              \
+  DECL_TRY_CHANGE(TryTruncateFloat##FloatBits##ToUint##ResultBits,             \
+                  kUnsignedFloatTruncateOverflowUndefined, Float##FloatBits,   \
+                  Word##ResultBits)
+
+  DECL_UNSIGNED_FLOAT_TRUNCATE(64, 64)
+  DECL_UNSIGNED_FLOAT_TRUNCATE(64, 32)
+  DECL_UNSIGNED_FLOAT_TRUNCATE(32, 64)
+  DECL_UNSIGNED_FLOAT_TRUNCATE(32, 32)
+#undef DECL_UNSIGNED_FLOAT_TRUNCATE
+
+  DECL_CHANGE(ReversibleFloat64ToInt32, kSignedFloatTruncateOverflowToMin,
+              kReversible, Float64, Word32)
+  DECL_CHANGE(ReversibleFloat64ToUint32, kUnsignedFloatTruncateOverflowToMin,
+              kReversible, Float64, Word32)
+  DECL_CHANGE(ReversibleFloat64ToInt64, kSignedFloatTruncateOverflowToMin,
+              kReversible, Float64, Word64)
+  DECL_CHANGE(ReversibleFloat64ToUint64, kUnsignedFloatTruncateOverflowToMin,
+              kReversible, Float64, Word64)
+  DECL_CHANGE(Float64ExtractLowWord32, kExtractLowHalf, kNoAssumption, Float64,
+              Word32)
+  DECL_CHANGE(Float64ExtractHighWord32, kExtractHighHalf, kNoAssumption,
               Float64, Word32)
-  DECL_CHANGE(TruncateFloat64ToInt32OverflowToMin,
-              SignedFloatTruncateOverflowToMin, Float64, Word32)
-  DECL_CHANGE(NarrowFloat64ToInt32, SignedNarrowing, Float64, Word32)
-  DECL_CHANGE(NarrowFloat64ToUint32, UnsignedNarrowing, Float64, Word32)
-  DECL_CHANGE(NarrowFloat64ToInt64, SignedNarrowing, Float64, Word64)
-  DECL_CHANGE(NarrowFloat64ToUint64, UnsignedNarrowing, Float64, Word64)
-  DECL_CHANGE(Float64ExtractLowWord32, ExtractLowHalf, Float64, Word32)
-  DECL_CHANGE(Float64ExtractHighWord32, ExtractHighHalf, Float64, Word32)
 #undef DECL_CHANGE
+#undef DECL_TRY_CHANGE
 
   using Base::Tuple;
   OpIndex Tuple(OpIndex a, OpIndex b) {
@@ -370,7 +578,8 @@ class AssemblerBase {
 };
 
 class Assembler
-    : public AssemblerInterface<Assembler, AssemblerBase<Assembler>> {
+    : public AssemblerInterface<Assembler, AssemblerBase<Assembler>>,
+      public OperationMatching<Assembler> {
  public:
   Block* NewBlock(Block::Kind kind) { return graph_.NewBlock(kind); }
 
@@ -388,7 +597,7 @@ class Assembler
     current_operation_origin_ = operation_origin;
   }
 
-  OpIndex Phi(base::Vector<const OpIndex> inputs, MachineRepresentation rep) {
+  OpIndex Phi(base::Vector<const OpIndex> inputs, RegisterRepresentation rep) {
     DCHECK(current_block()->IsMerge() &&
            inputs.size() == current_block()->Predecessors().size());
     return Base::Phi(inputs, rep);
diff --git a/deps/v8/src/compiler/turboshaft/decompression-optimization.cc b/deps/v8/src/compiler/turboshaft/decompression-optimization.cc
index 5b5ad9c6d8031f..68356b083a63c1 100644
--- a/deps/v8/src/compiler/turboshaft/decompression-optimization.cc
+++ b/deps/v8/src/compiler/turboshaft/decompression-optimization.cc
@@ -77,21 +77,22 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
     case Opcode::kStore: {
       auto& store = op.Cast<StoreOp>();
       MarkAsNeedsDecompression(store.base());
-      if (!IsAnyTagged(store.stored_rep))
+      if (!store.stored_rep.IsTagged()) {
         MarkAsNeedsDecompression(store.value());
+      }
       break;
     }
     case Opcode::kIndexedStore: {
       auto& store = op.Cast<IndexedStoreOp>();
       MarkAsNeedsDecompression(store.base());
       MarkAsNeedsDecompression(store.index());
-      if (!IsAnyTagged(store.stored_rep))
+      if (!store.stored_rep.IsTagged()) {
         MarkAsNeedsDecompression(store.value());
+      }
       break;
     }
     case Opcode::kFrameState:
-      // The deopt code knows how to handle Compressed inputs, both
-      // MachineRepresentation kCompressed values and CompressedHeapConstants.
+      // The deopt code knows how to handle compressed inputs.
       break;
     case Opcode::kPhi: {
       // Replicate the phi's state for its inputs.
@@ -107,7 +108,7 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
     }
     case Opcode::kEqual: {
       auto& equal = op.Cast<EqualOp>();
-      if (equal.rep == MachineRepresentation::kWord64) {
+      if (equal.rep == WordRepresentation::Word64()) {
         MarkAsNeedsDecompression(equal.left());
         MarkAsNeedsDecompression(equal.right());
       }
@@ -115,7 +116,7 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
     }
     case Opcode::kComparison: {
       auto& comp = op.Cast<ComparisonOp>();
-      if (comp.rep == MachineRepresentation::kWord64) {
+      if (comp.rep == WordRepresentation::Word64()) {
         MarkAsNeedsDecompression(comp.left());
         MarkAsNeedsDecompression(comp.right());
       }
@@ -123,7 +124,7 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
     }
     case Opcode::kWordBinop: {
       auto& binary_op = op.Cast<WordBinopOp>();
-      if (binary_op.rep == MachineRepresentation::kWord64) {
+      if (binary_op.rep == WordRepresentation::Word64()) {
         MarkAsNeedsDecompression(binary_op.left());
         MarkAsNeedsDecompression(binary_op.right());
       }
@@ -131,15 +132,14 @@ void DecompressionAnalyzer::ProcessOperation(const Operation& op) {
     }
     case Opcode::kShift: {
       auto& shift_op = op.Cast<ShiftOp>();
-      if (shift_op.rep == MachineRepresentation::kWord64) {
+      if (shift_op.rep == WordRepresentation::Word64()) {
         MarkAsNeedsDecompression(shift_op.left());
       }
       break;
     }
     case Opcode::kChange: {
       auto& change = op.Cast<ChangeOp>();
-      if (change.to == MachineRepresentation::kWord64 &&
-          NeedsDecompression(op)) {
+      if (change.to == WordRepresentation::Word64() && NeedsDecompression(op)) {
         MarkAsNeedsDecompression(change.input());
       }
       break;
@@ -187,28 +187,28 @@ void RunDecompressionOptimization(Graph& graph, Zone* phase_zone) {
       }
       case Opcode::kPhi: {
         auto& phi = op.Cast<PhiOp>();
-        if (phi.rep == MachineRepresentation::kTagged) {
-          phi.rep = MachineRepresentation::kCompressed;
-        } else if (phi.rep == MachineRepresentation::kTaggedPointer) {
-          phi.rep = MachineRepresentation::kCompressedPointer;
+        if (phi.rep == RegisterRepresentation::Tagged()) {
+          phi.rep = RegisterRepresentation::Tagged();
         }
         break;
       }
       case Opcode::kLoad: {
         auto& load = op.Cast<LoadOp>();
-        if (load.loaded_rep == MachineType::AnyTagged()) {
-          load.loaded_rep = MachineType::AnyCompressed();
-        } else if (load.loaded_rep == MachineType::TaggedPointer()) {
-          load.loaded_rep = MachineType::CompressedPointer();
+        if (load.loaded_rep.IsTagged()) {
+          DCHECK_EQ(load.result_rep,
+                    any_of(RegisterRepresentation::Tagged(),
+                           RegisterRepresentation::Compressed()));
+          load.result_rep = RegisterRepresentation::Compressed();
         }
         break;
       }
       case Opcode::kIndexedLoad: {
         auto& load = op.Cast<IndexedLoadOp>();
-        if (load.loaded_rep == MachineType::AnyTagged()) {
-          load.loaded_rep = MachineType::AnyCompressed();
-        } else if (load.loaded_rep == MachineType::TaggedPointer()) {
-          load.loaded_rep = MachineType::CompressedPointer();
+        if (load.loaded_rep.IsTagged()) {
+          DCHECK_EQ(load.result_rep,
+                    any_of(RegisterRepresentation::Tagged(),
+                           RegisterRepresentation::Compressed()));
+          load.result_rep = RegisterRepresentation::Compressed();
         }
         break;
       }
diff --git a/deps/v8/src/compiler/turboshaft/deopt-data.h b/deps/v8/src/compiler/turboshaft/deopt-data.h
index 216dbf83bbbcf5..def0bee47e1614 100644
--- a/deps/v8/src/compiler/turboshaft/deopt-data.h
+++ b/deps/v8/src/compiler/turboshaft/deopt-data.h
@@ -5,6 +5,7 @@
 #ifndef V8_COMPILER_TURBOSHAFT_DEOPT_DATA_H_
 #define V8_COMPILER_TURBOSHAFT_DEOPT_DATA_H_
 
+#include "src/base/small-vector.h"
 #include "src/common/globals.h"
 #include "src/compiler/turboshaft/operations.h"
 
diff --git a/deps/v8/src/compiler/turboshaft/graph-builder.cc b/deps/v8/src/compiler/turboshaft/graph-builder.cc
index 3ff92abdcd750a..7c5d2ba5d0c835 100644
--- a/deps/v8/src/compiler/turboshaft/graph-builder.cc
+++ b/deps/v8/src/compiler/turboshaft/graph-builder.cc
@@ -19,7 +19,6 @@
 #include "src/compiler/machine-operator.h"
 #include "src/compiler/node-aux-data.h"
 #include "src/compiler/node-origin-table.h"
-#include "src/compiler/node-properties.h"
 #include "src/compiler/opcodes.h"
 #include "src/compiler/operator.h"
 #include "src/compiler/schedule.h"
@@ -202,6 +201,7 @@ base::Optional<BailoutReason> GraphBuilder::Run() {
       case BasicBlock::kReturn:
       case BasicBlock::kDeoptimize:
       case BasicBlock::kThrow:
+      case BasicBlock::kTailCall:
         break;
       case BasicBlock::kCall: {
         Node* call = block->control_input();
@@ -216,8 +216,6 @@ base::Optional<BailoutReason> GraphBuilder::Run() {
         op_mapping.Set(if_exception_node, catch_exception);
         break;
       }
-      case BasicBlock::kTailCall:
-        UNIMPLEMENTED();
       case BasicBlock::kNone:
         UNREACHABLE();
     }
@@ -287,7 +285,9 @@ OpIndex GraphBuilder::Process(
 
     case IrOpcode::kPhi: {
       int input_count = op->ValueInputCount();
-      MachineRepresentation rep = PhiRepresentationOf(op);
+      RegisterRepresentation rep =
+          RegisterRepresentation::FromMachineRepresentation(
+              PhiRepresentationOf(op));
       if (assembler.current_block()->IsLoop()) {
         DCHECK_EQ(input_count, 2);
         return assembler.PendingLoopPhi(Map(node->InputAt(0)), rep,
@@ -321,7 +321,10 @@ OpIndex GraphBuilder::Process(
       return assembler.CompressedHeapConstant(HeapConstantOf(op));
     case IrOpcode::kExternalConstant:
       return assembler.ExternalConstant(OpParameter<ExternalReference>(op));
-
+    case IrOpcode::kRelocatableInt64Constant:
+      return assembler.RelocatableConstant(
+          OpParameter<RelocatablePtrConstantInfo>(op).value(),
+          OpParameter<RelocatablePtrConstantInfo>(op).rmode());
 #define BINOP_CASE(opcode, assembler_op) \
   case IrOpcode::k##opcode:              \
     return assembler.assembler_op(Map(node->InputAt(0)), Map(node->InputAt(1)));
@@ -347,7 +350,9 @@ OpIndex GraphBuilder::Process(
       BINOP_CASE(Int64Mod, Int64Mod)
       BINOP_CASE(Uint64Mod, Uint64Mod)
       BINOP_CASE(Int32MulHigh, Int32MulOverflownBits)
+      BINOP_CASE(Int64MulHigh, Int64MulOverflownBits)
       BINOP_CASE(Uint32MulHigh, Uint32MulOverflownBits)
+      BINOP_CASE(Uint64MulHigh, Uint64MulOverflownBits)
 
       BINOP_CASE(Float32Add, Float32Add)
       BINOP_CASE(Float64Add, Float64Add)
@@ -405,9 +410,9 @@ OpIndex GraphBuilder::Process(
 
     case IrOpcode::kWord64Sar:
     case IrOpcode::kWord32Sar: {
-      MachineRepresentation rep = opcode == IrOpcode::kWord64Sar
-                                      ? MachineRepresentation::kWord64
-                                      : MachineRepresentation::kWord32;
+      WordRepresentation rep = opcode == IrOpcode::kWord64Sar
+                                   ? WordRepresentation::Word64()
+                                   : WordRepresentation::Word32();
       ShiftOp::Kind kind;
       switch (ShiftKindOf(op)) {
         case ShiftKind::kShiftOutZeros:
@@ -429,6 +434,14 @@ OpIndex GraphBuilder::Process(
       UNARY_CASE(Word64ReverseBytes, Word64ReverseBytes)
       UNARY_CASE(Word32Clz, Word32CountLeadingZeros)
       UNARY_CASE(Word64Clz, Word64CountLeadingZeros)
+      UNARY_CASE(Word32Ctz, Word32CountTrailingZeros)
+      UNARY_CASE(Word64Ctz, Word64CountTrailingZeros)
+      UNARY_CASE(Word32Popcnt, Word32PopCount)
+      UNARY_CASE(Word64Popcnt, Word64PopCount)
+      UNARY_CASE(SignExtendWord8ToInt32, Word32SignExtend8)
+      UNARY_CASE(SignExtendWord16ToInt32, Word32SignExtend16)
+      UNARY_CASE(SignExtendWord8ToInt64, Word64SignExtend8)
+      UNARY_CASE(SignExtendWord16ToInt64, Word64SignExtend16)
 
       UNARY_CASE(Float32Abs, Float32Abs)
       UNARY_CASE(Float64Abs, Float64Abs)
@@ -458,53 +471,84 @@ OpIndex GraphBuilder::Process(
       UNARY_CASE(Float64Acosh, Float64Acosh)
       UNARY_CASE(Float64Tan, Float64Tan)
       UNARY_CASE(Float64Tanh, Float64Tanh)
+      UNARY_CASE(Float64Log2, Float64Log2)
+      UNARY_CASE(Float64Log10, Float64Log10)
+      UNARY_CASE(Float64Log1p, Float64Log1p)
+      UNARY_CASE(Float64Atan, Float64Atan)
+      UNARY_CASE(Float64Atanh, Float64Atanh)
+      UNARY_CASE(Float64Cbrt, Float64Cbrt)
+
+      UNARY_CASE(BitcastWord32ToWord64, BitcastWord32ToWord64)
+      UNARY_CASE(BitcastFloat32ToInt32, BitcastFloat32ToWord32)
+      UNARY_CASE(BitcastInt32ToFloat32, BitcastWord32ToFloat32)
+      UNARY_CASE(BitcastFloat64ToInt64, BitcastFloat64ToWord64)
+      UNARY_CASE(BitcastInt64ToFloat64, BitcastWord64ToFloat64)
+      UNARY_CASE(ChangeUint32ToUint64, ChangeUint32ToUint64)
+      UNARY_CASE(ChangeInt32ToInt64, ChangeInt32ToInt64)
+      UNARY_CASE(SignExtendWord32ToInt64, ChangeInt32ToInt64)
+
+      UNARY_CASE(ChangeFloat32ToFloat64, ChangeFloat32ToFloat64)
+
+      UNARY_CASE(ChangeFloat64ToInt32, ReversibleFloat64ToInt32)
+      UNARY_CASE(ChangeFloat64ToInt64, ReversibleFloat64ToInt64)
+      UNARY_CASE(ChangeFloat64ToUint32, ReversibleFloat64ToUint32)
+      UNARY_CASE(ChangeFloat64ToUint64, ReversibleFloat64ToUint64)
+
+      UNARY_CASE(ChangeInt32ToFloat64, ChangeInt32ToFloat64)
+      UNARY_CASE(ChangeInt64ToFloat64, ReversibleInt64ToFloat64)
+      UNARY_CASE(ChangeUint32ToFloat64, ChangeUint32ToFloat64)
+
+      UNARY_CASE(RoundFloat64ToInt32, TruncateFloat64ToInt32OverflowUndefined)
+      UNARY_CASE(RoundInt32ToFloat32, ChangeInt32ToFloat32)
+      UNARY_CASE(RoundInt64ToFloat32, ChangeInt64ToFloat32)
+      UNARY_CASE(RoundInt64ToFloat64, ChangeInt64ToFloat64)
+      UNARY_CASE(RoundUint32ToFloat32, ChangeUint32ToFloat32)
+      UNARY_CASE(RoundUint64ToFloat32, ChangeUint64ToFloat32)
+      UNARY_CASE(RoundUint64ToFloat64, ChangeUint64ToFloat64)
+      UNARY_CASE(TruncateFloat64ToFloat32, ChangeFloat64ToFloat32)
+      UNARY_CASE(TruncateFloat64ToUint32,
+                 TruncateFloat64ToUint32OverflowUndefined)
+      UNARY_CASE(TruncateFloat64ToWord32, JSTruncateFloat64ToWord32)
+      UNARY_CASE(TryTruncateFloat32ToInt64, TryTruncateFloat32ToInt64)
+      UNARY_CASE(TryTruncateFloat32ToUint64, TryTruncateFloat32ToUint64)
+      UNARY_CASE(TryTruncateFloat64ToInt32, TryTruncateFloat64ToInt32)
+      UNARY_CASE(TryTruncateFloat64ToInt64, TryTruncateFloat64ToInt64)
+      UNARY_CASE(TryTruncateFloat64ToUint32, TryTruncateFloat64ToUint32)
+      UNARY_CASE(TryTruncateFloat64ToUint64, TryTruncateFloat64ToUint64)
+
+      UNARY_CASE(Float64ExtractLowWord32, Float64ExtractLowWord32)
+      UNARY_CASE(Float64ExtractHighWord32, Float64ExtractHighWord32)
 #undef UNARY_CASE
-
-#define CHANGE_CASE(opcode, kind, from, to)                                 \
-  case IrOpcode::k##opcode:                                                 \
-    return assembler.Change(Map(node->InputAt(0)), ChangeOp::Kind::k##kind, \
-                            MachineRepresentation::k##from,                 \
-                            MachineRepresentation::k##to);
-
-      CHANGE_CASE(BitcastWord32ToWord64, Bitcast, Word32, Word64)
-      CHANGE_CASE(BitcastFloat32ToInt32, Bitcast, Float32, Word32)
-      CHANGE_CASE(BitcastInt32ToFloat32, Bitcast, Word32, Float32)
-      CHANGE_CASE(BitcastFloat64ToInt64, Bitcast, Float64, Word64)
-      CHANGE_CASE(BitcastInt64ToFloat64, Bitcast, Word64, Float64)
-      CHANGE_CASE(ChangeUint32ToUint64, ZeroExtend, Word32, Word64)
-      CHANGE_CASE(ChangeInt32ToInt64, SignExtend, Word32, Word64)
-      CHANGE_CASE(ChangeInt32ToFloat64, SignedToFloat, Word32, Float64)
-      CHANGE_CASE(ChangeInt64ToFloat64, SignedToFloat, Word64, Float64)
-      CHANGE_CASE(ChangeUint32ToFloat64, UnsignedToFloat, Word32, Float64)
-      CHANGE_CASE(TruncateFloat64ToWord32, JSFloatTruncate, Float64, Word32)
-      CHANGE_CASE(TruncateFloat64ToFloat32, FloatConversion, Float64, Float32)
-      CHANGE_CASE(ChangeFloat32ToFloat64, FloatConversion, Float32, Float64)
-      CHANGE_CASE(RoundFloat64ToInt32, SignedFloatTruncate, Float64, Word32)
-      CHANGE_CASE(ChangeFloat64ToInt32, SignedNarrowing, Float64, Word32)
-      CHANGE_CASE(ChangeFloat64ToUint32, UnsignedNarrowing, Float64, Word32)
-      CHANGE_CASE(ChangeFloat64ToInt64, SignedNarrowing, Float64, Word64)
-      CHANGE_CASE(ChangeFloat64ToUint64, UnsignedNarrowing, Float64, Word64)
-      CHANGE_CASE(Float64ExtractLowWord32, ExtractLowHalf, Float64, Word32)
-      CHANGE_CASE(Float64ExtractHighWord32, ExtractHighHalf, Float64, Word32)
-#undef CHANGE_CASE
     case IrOpcode::kTruncateInt64ToInt32:
       // 64- to 32-bit truncation is implicit in Turboshaft.
       return Map(node->InputAt(0));
-    case IrOpcode::kTruncateFloat64ToInt64: {
-      ChangeOp::Kind kind;
-      switch (OpParameter<TruncateKind>(op)) {
+    case IrOpcode::kTruncateFloat32ToInt32:
+      switch (OpParameter<TruncateKind>(node->op())) {
         case TruncateKind::kArchitectureDefault:
-          kind = ChangeOp::Kind::kSignedFloatTruncate;
-          break;
+          return assembler.TruncateFloat32ToInt32OverflowUndefined(
+              Map(node->InputAt(0)));
         case TruncateKind::kSetOverflowToMin:
-          kind = ChangeOp::Kind::kSignedFloatTruncateOverflowToMin;
-          break;
+          return assembler.TruncateFloat32ToInt32OverflowToMin(
+              Map(node->InputAt(0)));
+      }
+    case IrOpcode::kTruncateFloat32ToUint32:
+      switch (OpParameter<TruncateKind>(node->op())) {
+        case TruncateKind::kArchitectureDefault:
+          return assembler.TruncateFloat32ToUint32OverflowUndefined(
+              Map(node->InputAt(0)));
+        case TruncateKind::kSetOverflowToMin:
+          return assembler.TruncateFloat32ToUint32OverflowToMin(
+              Map(node->InputAt(0)));
+      }
+    case IrOpcode::kTruncateFloat64ToInt64:
+      switch (OpParameter<TruncateKind>(node->op())) {
+        case TruncateKind::kArchitectureDefault:
+          return assembler.TruncateFloat64ToInt64OverflowUndefined(
+              Map(node->InputAt(0)));
+        case TruncateKind::kSetOverflowToMin:
+          return assembler.TruncateFloat64ToInt64OverflowToMin(
+              Map(node->InputAt(0)));
       }
-      return assembler.Change(Map(node->InputAt(0)), kind,
-                              MachineRepresentation::kFloat64,
-                              MachineRepresentation::kWord64);
-    }
-
     case IrOpcode::kFloat64InsertLowWord32:
       return assembler.Float64InsertWord32(
           Map(node->InputAt(0)), Map(node->InputAt(1)),
@@ -516,70 +560,101 @@ OpIndex GraphBuilder::Process(
 
     case IrOpcode::kBitcastTaggedToWord:
       return assembler.TaggedBitcast(Map(node->InputAt(0)),
-                                     MachineRepresentation::kTagged,
-                                     MachineType::PointerRepresentation());
+                                     RegisterRepresentation::Tagged(),
+                                     RegisterRepresentation::PointerSized());
     case IrOpcode::kBitcastWordToTagged:
       return assembler.TaggedBitcast(Map(node->InputAt(0)),
-                                     MachineType::PointerRepresentation(),
-                                     MachineRepresentation::kTagged);
+                                     RegisterRepresentation::PointerSized(),
+                                     RegisterRepresentation::Tagged());
+
+    case IrOpcode::kWord32Select:
+      return assembler.Word32Select(
+          Map(node->InputAt(0)), Map(node->InputAt(1)), Map(node->InputAt(2)));
+    case IrOpcode::kWord64Select:
+      return assembler.Word64Select(
+          Map(node->InputAt(0)), Map(node->InputAt(1)), Map(node->InputAt(2)));
 
     case IrOpcode::kLoad:
+    case IrOpcode::kLoadImmutable:
     case IrOpcode::kUnalignedLoad: {
-      MachineType loaded_rep = LoadRepresentationOf(op);
+      MemoryRepresentation loaded_rep =
+          MemoryRepresentation::FromMachineType(LoadRepresentationOf(op));
+      RegisterRepresentation result_rep = loaded_rep.ToRegisterRepresentation();
       Node* base = node->InputAt(0);
       Node* index = node->InputAt(1);
-      LoadOp::Kind kind = opcode == IrOpcode::kLoad
-                              ? LoadOp::Kind::kRawAligned
-                              : LoadOp::Kind::kRawUnaligned;
+      // It's ok to merge LoadImmutable into Load after scheduling.
+      LoadOp::Kind kind = opcode == IrOpcode::kUnalignedLoad
+                              ? LoadOp::Kind::kRawUnaligned
+                              : LoadOp::Kind::kRawAligned;
       if (index->opcode() == IrOpcode::kInt32Constant) {
         int32_t offset = OpParameter<int32_t>(index->op());
-        return assembler.Load(Map(base), kind, loaded_rep, offset);
+        return assembler.Load(Map(base), kind, loaded_rep, result_rep, offset);
       }
       if (index->opcode() == IrOpcode::kInt64Constant) {
         int64_t offset = OpParameter<int64_t>(index->op());
         if (base::IsValueInRangeForNumericType<int32_t>(offset)) {
-          return assembler.Load(Map(base), kind, loaded_rep,
+          return assembler.Load(Map(base), kind, loaded_rep, result_rep,
                                 static_cast<int32_t>(offset));
         }
       }
       int32_t offset = 0;
       uint8_t element_size_log2 = 0;
       return assembler.IndexedLoad(Map(base), Map(index), kind, loaded_rep,
-                                   offset, element_size_log2);
+                                   result_rep, offset, element_size_log2);
+    }
+    case IrOpcode::kProtectedLoad: {
+      MemoryRepresentation loaded_rep =
+          MemoryRepresentation::FromMachineType(LoadRepresentationOf(op));
+      RegisterRepresentation result_rep = loaded_rep.ToRegisterRepresentation();
+      return assembler.ProtectedLoad(
+          Map(node->InputAt(0)), Map(node->InputAt(1)), loaded_rep, result_rep);
     }
 
     case IrOpcode::kStore:
     case IrOpcode::kUnalignedStore: {
-      bool aligned = opcode == IrOpcode::kStore;
+      bool aligned = opcode != IrOpcode::kUnalignedStore;
       StoreRepresentation store_rep =
           aligned ? StoreRepresentationOf(op)
                   : StoreRepresentation(UnalignedStoreRepresentationOf(op),
                                         WriteBarrierKind::kNoWriteBarrier);
-      StoreOp::Kind kind =
-          aligned ? StoreOp::Kind::kRawAligned : StoreOp::Kind::kRawUnaligned;
+      StoreOp::Kind kind = opcode == IrOpcode::kStore
+                               ? StoreOp::Kind::kRawAligned
+                               : StoreOp::Kind::kRawUnaligned;
+
       Node* base = node->InputAt(0);
       Node* index = node->InputAt(1);
       Node* value = node->InputAt(2);
       if (index->opcode() == IrOpcode::kInt32Constant) {
         int32_t offset = OpParameter<int32_t>(index->op());
         return assembler.Store(Map(base), Map(value), kind,
-                               store_rep.representation(),
+                               MemoryRepresentation::FromMachineRepresentation(
+                                   store_rep.representation()),
                                store_rep.write_barrier_kind(), offset);
       }
       if (index->opcode() == IrOpcode::kInt64Constant) {
         int64_t offset = OpParameter<int64_t>(index->op());
         if (base::IsValueInRangeForNumericType<int32_t>(offset)) {
           return assembler.Store(
-              Map(base), Map(value), kind, store_rep.representation(),
+              Map(base), Map(value), kind,
+              MemoryRepresentation::FromMachineRepresentation(
+                  store_rep.representation()),
               store_rep.write_barrier_kind(), static_cast<int32_t>(offset));
         }
       }
       int32_t offset = 0;
       uint8_t element_size_log2 = 0;
       return assembler.IndexedStore(
-          Map(base), Map(index), Map(value), kind, store_rep.representation(),
+          Map(base), Map(index), Map(value), kind,
+          MemoryRepresentation::FromMachineRepresentation(
+              store_rep.representation()),
           store_rep.write_barrier_kind(), offset, element_size_log2);
     }
+    case IrOpcode::kProtectedStore: {
+      return assembler.ProtectedStore(
+          Map(node->InputAt(0)), Map(node->InputAt(1)), Map(node->InputAt(2)),
+          MemoryRepresentation::FromMachineRepresentation(
+              OpParameter<MachineRepresentation>(node->op())));
+    }
 
     case IrOpcode::kRetain:
       return assembler.Retain(Map(node->InputAt(0)));
@@ -639,6 +714,21 @@ OpIndex GraphBuilder::Process(
       return call;
     }
 
+    case IrOpcode::kTailCall: {
+      auto call_descriptor = CallDescriptorOf(op);
+      base::SmallVector<OpIndex, 16> arguments;
+      // The input `0` is the callee, the following value inputs are the
+      // arguments. `CallDescriptor::InputCount()` counts the callee and
+      // arguments.
+      OpIndex callee = Map(node->InputAt(0));
+      for (int i = 1; i < static_cast<int>(call_descriptor->InputCount());
+           ++i) {
+        arguments.emplace_back(Map(node->InputAt(i)));
+      }
+      return assembler.TailCall(callee, base::VectorOf(arguments),
+                                call_descriptor);
+    }
+
     case IrOpcode::kFrameState: {
       FrameState frame_state{node};
       FrameStateData::Builder builder;
@@ -658,6 +748,13 @@ OpIndex GraphBuilder::Process(
                                     &DeoptimizeParametersOf(op));
     }
 
+    case IrOpcode::kTrapIf:
+    case IrOpcode::kTrapUnless: {
+      OpIndex condition = Map(node->InputAt(0));
+      bool negated = op->opcode() == IrOpcode::kTrapUnless;
+      return assembler.TrapIf(condition, negated, TrapIdOf(op));
+    }
+
     case IrOpcode::kDeoptimize: {
       OpIndex frame_state = Map(node->InputAt(0));
       return assembler.Deoptimize(frame_state, &DeoptimizeParametersOf(op));
@@ -687,8 +784,8 @@ OpIndex GraphBuilder::Process(
     }
 
     default:
-      std::cout << "unsupported node type: " << *node->op() << "\n";
-      node->Print();
+      std::cerr << "unsupported node type: " << *node->op() << "\n";
+      node->Print(std::cerr);
       UNIMPLEMENTED();
   }
 }
diff --git a/deps/v8/src/compiler/turboshaft/graph.cc b/deps/v8/src/compiler/turboshaft/graph.cc
index bf03a6ba2453e4..c1744dd68f09af 100644
--- a/deps/v8/src/compiler/turboshaft/graph.cc
+++ b/deps/v8/src/compiler/turboshaft/graph.cc
@@ -4,102 +4,12 @@
 
 #include "src/compiler/turboshaft/graph.h"
 
+#include <algorithm>
 #include <iomanip>
 
-namespace v8::internal::compiler::turboshaft {
-
-void Graph::GenerateDominatorTree() {
-  for (Block* block : bound_blocks_) {
-    if (block->index() == StartBlock().index()) {
-      // Start block has no dominators. We create a jmp_ edge to itself, so that
-      // the SetDominator algorithm does not need a special case for when the
-      // start block is reached.
-      block->jmp_ = block;
-      block->nxt_ = nullptr;
-      block->len_ = 0;
-      block->jmp_len_ = 0;
-      continue;
-    }
-    if (block->kind_ == Block::Kind::kBranchTarget) {
-      // kBranchTarget blocks always have a single predecessor, which dominates
-      // them.
-      DCHECK_EQ(block->PredecessorCount(), 1);
-      block->SetDominator(block->LastPredecessor());
-    } else if (block->kind_ == Block::Kind::kLoopHeader) {
-      // kLoopHeader blocks have 2 predecessors, but their dominator is
-      // always their first predecessor (the 2nd one is the loop's backedge).
-      DCHECK_EQ(block->PredecessorCount(), 2);
-      block->SetDominator(block->LastPredecessor()->NeighboringPredecessor());
-    } else {
-      // kMerge has (more or less) an arbitrary number of predecessors. We need
-      // to find the lowest common ancestor (LCA) of all of the predecessors.
-      DCHECK_EQ(block->kind_, Block::Kind::kMerge);
-      Block* dominator = block->LastPredecessor();
-      for (Block* pred = dominator->NeighboringPredecessor(); pred != nullptr;
-           pred = pred->NeighboringPredecessor()) {
-        dominator = dominator->GetCommonDominator(pred);
-      }
-      block->SetDominator(dominator);
-    }
-  }
-}
-
-template <class Derived>
-void RandomAccessStackDominatorNode<Derived>::SetDominator(Derived* dominator) {
-  DCHECK_NOT_NULL(dominator);
-  // Determining the jmp pointer
-  Derived* t = dominator->jmp_;
-  if (dominator->len_ - t->len_ == t->len_ - t->jmp_len_) {
-    t = t->jmp_;
-  } else {
-    t = dominator;
-  }
-  // Initializing fields
-  nxt_ = dominator;
-  jmp_ = t;
-  len_ = dominator->len_ + 1;
-  jmp_len_ = jmp_->len_;
-  dominator->AddChild(static_cast<Derived*>(this));
-}
+#include "src/base/logging.h"
 
-template <class Derived>
-Derived* RandomAccessStackDominatorNode<Derived>::GetCommonDominator(
-    RandomAccessStackDominatorNode<Derived>* b) {
-  RandomAccessStackDominatorNode* a = this;
-  if (b->len_ > a->len_) {
-    // Swapping |a| and |b| so that |a| always has a greater length.
-    std::swap(a, b);
-  }
-  DCHECK_GE(a->len_, 0);
-  DCHECK_GE(b->len_, 0);
-
-  // Going up the dominators of |a| in order to reach the level of |b|.
-  while (a->len_ != b->len_) {
-    DCHECK_GE(a->len_, 0);
-    if (a->jmp_len_ >= b->len_) {
-      a = a->jmp_;
-    } else {
-      a = a->nxt_;
-    }
-  }
-
-  // Going up the dominators of |a| and |b| simultaneously until |a| == |b|
-  while (a != b) {
-    DCHECK_EQ(a->len_, b->len_);
-    DCHECK_GE(a->len_, 0);
-    if (a->jmp_ == b->jmp_) {
-      // We found a common dominator, but we actually want to find the smallest
-      // one, so we go down in the current subtree.
-      a = a->nxt_;
-      b = b->nxt_;
-    } else {
-      a = a->jmp_;
-      b = b->jmp_;
-    }
-  }
-
-  return static_cast<Derived*>(a);
-}
+namespace v8::internal::compiler::turboshaft {
 
 // PrintDominatorTree prints the dominator tree in a format that looks like:
 //
diff --git a/deps/v8/src/compiler/turboshaft/graph.h b/deps/v8/src/compiler/turboshaft/graph.h
index ee2c30df9bf977..0685a4a0a61432 100644
--- a/deps/v8/src/compiler/turboshaft/graph.h
+++ b/deps/v8/src/compiler/turboshaft/graph.h
@@ -183,6 +183,11 @@ class OperationBuffer {
   uint16_t* operation_sizes_;
 };
 
+template <class Derived>
+class DominatorForwardTreeNode;
+template <class Derived>
+class RandomAccessStackDominatorNode;
+
 template <class Derived>
 class DominatorForwardTreeNode {
   // A class storing a forward representation of the dominator tree, since the
@@ -210,8 +215,9 @@ class DominatorForwardTreeNode {
   }
 
  private:
-  friend class Block;
-
+#ifdef DEBUG
+  friend class RandomAccessStackDominatorNode<Derived>;
+#endif
   Derived* neighboring_child_ = nullptr;
   Derived* last_child_ = nullptr;
 };
@@ -226,16 +232,26 @@ class RandomAccessStackDominatorNode
   // the height of the dominator tree.
  public:
   void SetDominator(Derived* dominator);
+  void SetAsDominatorRoot();
   Derived* GetDominator() { return nxt_; }
 
   // Returns the lowest common dominator of {this} and {other}.
-  Derived* GetCommonDominator(RandomAccessStackDominatorNode<Derived>* other);
+  Derived* GetCommonDominator(
+      RandomAccessStackDominatorNode<Derived>* other) const;
+
+  bool IsDominatedBy(const Derived* other) const {
+    // TODO(dmercadier): we don't have to call GetCommonDominator and could
+    // determine quicker that {this} isn't dominated by {other}.
+    return GetCommonDominator(other) == other;
+  }
 
   int Depth() const { return len_; }
 
  private:
-  friend class Graph;
   friend class DominatorForwardTreeNode<Derived>;
+#ifdef DEBUG
+  friend class Block;
+#endif
 
   int len_ = 0;
   Derived* nxt_ = nullptr;
@@ -254,9 +270,11 @@ class Block : public RandomAccessStackDominatorNode<Block> {
   bool IsLoopOrMerge() const { return IsLoop() || IsMerge(); }
   bool IsLoop() const { return kind_ == Kind::kLoopHeader; }
   bool IsMerge() const { return kind_ == Kind::kMerge; }
+  bool IsBranchTarget() const { return kind_ == Kind::kBranchTarget; }
   bool IsHandler() const { return false; }
   bool IsSwitchCase() const { return false; }
   Kind kind() const { return kind_; }
+  void SetKind(Kind kind) { kind_ = kind; }
 
   BlockIndex index() const { return index_; }
 
@@ -287,8 +305,7 @@ class Block : public RandomAccessStackDominatorNode<Block> {
     return result;
   }
 
-#ifdef DEBUG
-  int PredecessorCount() {
+  int PredecessorCount() const {
     int count = 0;
     for (Block* pred = last_predecessor_; pred != nullptr;
          pred = pred->neighboring_predecessor_) {
@@ -296,7 +313,6 @@ class Block : public RandomAccessStackDominatorNode<Block> {
     }
     return count;
   }
-#endif
 
   Block* LastPredecessor() const { return last_predecessor_; }
   Block* NeighboringPredecessor() const { return neighboring_predecessor_; }
@@ -320,6 +336,10 @@ class Block : public RandomAccessStackDominatorNode<Block> {
     return end_;
   }
 
+  // Computes the dominators of the this block, assuming that the dominators of
+  // its predecessors are already computed.
+  void ComputeDominator();
+
   void PrintDominatorTree(
       std::vector<const char*> tree_symbols = std::vector<const char*>(),
       bool has_next = false) const;
@@ -363,8 +383,6 @@ class Graph {
     next_block_ = 0;
   }
 
-  void GenerateDominatorTree();
-
   const Operation& Get(OpIndex i) const {
     // `Operation` contains const fields and can be overwritten with placement
     // new. Therefore, std::launder is necessary to avoid undefined behavior.
@@ -475,6 +493,7 @@ class Graph {
     DCHECK_EQ(block->index_, BlockIndex::Invalid());
     block->index_ = BlockIndex(static_cast<uint32_t>(bound_blocks_.size()));
     bound_blocks_.push_back(block);
+    block->ComputeDominator();
     return true;
   }
 
@@ -483,6 +502,19 @@ class Graph {
     block->end_ = next_operation_index();
   }
 
+  void TurnLoopIntoMerge(Block* loop) {
+    DCHECK(loop->IsLoop());
+    DCHECK_EQ(loop->PredecessorCount(), 1);
+    loop->kind_ = Block::Kind::kMerge;
+    for (Operation& op : operations(*loop)) {
+      if (auto* pending_phi = op.TryCast<PendingLoopPhiOp>()) {
+        Replace<PhiOp>(Index(*pending_phi),
+                       base::VectorOf({pending_phi->first()}),
+                       pending_phi->rep);
+      }
+    }
+  }
+
   OpIndex next_operation_index() const { return operations_.EndIndex(); }
 
   Zone* graph_zone() const { return graph_zone_; }
@@ -717,6 +749,106 @@ std::ostream& operator<<(std::ostream& os, PrintAsBlockHeader block);
 std::ostream& operator<<(std::ostream& os, const Graph& graph);
 std::ostream& operator<<(std::ostream& os, const Block::Kind& kind);
 
+inline void Block::ComputeDominator() {
+  if (V8_UNLIKELY(LastPredecessor() == nullptr)) {
+    // If the block has no predecessors, then it's the start block. We create a
+    // jmp_ edge to itself, so that the SetDominator algorithm does not need a
+    // special case for when the start block is reached.
+    SetAsDominatorRoot();
+  } else {
+    // If the block has one or more predecessors, the dominator is the lowest
+    // common ancestor (LCA) of all of the predecessors.
+
+    // Note that for BranchTarget, there is a single predecessor. This doesn't
+    // change the logic: the loop won't be entered, and the first (and only)
+    // predecessor is set as the dominator.
+    // Similarly, since we compute dominators on the fly, when we reach a
+    // kLoopHeader, we haven't visited its body yet, and it should only have one
+    // predecessor (the backedge is not here yet), which is its dominator.
+    DCHECK_IMPLIES(kind_ == Block::Kind::kLoopHeader, PredecessorCount() == 1);
+
+    Block* dominator = LastPredecessor();
+    for (Block* pred = dominator->NeighboringPredecessor(); pred != nullptr;
+         pred = pred->NeighboringPredecessor()) {
+      dominator = dominator->GetCommonDominator(pred);
+    }
+    SetDominator(dominator);
+  }
+  DCHECK_NE(jmp_, nullptr);
+  DCHECK_IMPLIES(nxt_ == nullptr, LastPredecessor() == nullptr);
+  DCHECK_IMPLIES(len_ == 0, LastPredecessor() == nullptr);
+}
+
+template <class Derived>
+inline void RandomAccessStackDominatorNode<Derived>::SetAsDominatorRoot() {
+  jmp_ = static_cast<Derived*>(this);
+  nxt_ = nullptr;
+  len_ = 0;
+  jmp_len_ = 0;
+}
+
+template <class Derived>
+inline void RandomAccessStackDominatorNode<Derived>::SetDominator(
+    Derived* dominator) {
+  DCHECK_NOT_NULL(dominator);
+  DCHECK_NULL(static_cast<Block*>(this)->neighboring_child_);
+  DCHECK_NULL(static_cast<Block*>(this)->last_child_);
+  // Determining the jmp pointer
+  Derived* t = dominator->jmp_;
+  if (dominator->len_ - t->len_ == t->len_ - t->jmp_len_) {
+    t = t->jmp_;
+  } else {
+    t = dominator;
+  }
+  // Initializing fields
+  nxt_ = dominator;
+  jmp_ = t;
+  len_ = dominator->len_ + 1;
+  jmp_len_ = jmp_->len_;
+  dominator->AddChild(static_cast<Derived*>(this));
+}
+
+template <class Derived>
+inline Derived* RandomAccessStackDominatorNode<Derived>::GetCommonDominator(
+    RandomAccessStackDominatorNode<Derived>* other) const {
+  const RandomAccessStackDominatorNode* a = this;
+  const RandomAccessStackDominatorNode* b = other;
+  if (b->len_ > a->len_) {
+    // Swapping |a| and |b| so that |a| always has a greater length.
+    std::swap(a, b);
+  }
+  DCHECK_GE(a->len_, 0);
+  DCHECK_GE(b->len_, 0);
+
+  // Going up the dominators of |a| in order to reach the level of |b|.
+  while (a->len_ != b->len_) {
+    DCHECK_GE(a->len_, 0);
+    if (a->jmp_len_ >= b->len_) {
+      a = a->jmp_;
+    } else {
+      a = a->nxt_;
+    }
+  }
+
+  // Going up the dominators of |a| and |b| simultaneously until |a| == |b|
+  while (a != b) {
+    DCHECK_EQ(a->len_, b->len_);
+    DCHECK_GE(a->len_, 0);
+    if (a->jmp_ == b->jmp_) {
+      // We found a common dominator, but we actually want to find the smallest
+      // one, so we go down in the current subtree.
+      a = a->nxt_;
+      b = b->nxt_;
+    } else {
+      a = a->jmp_;
+      b = b->jmp_;
+    }
+  }
+
+  return static_cast<Derived*>(
+      const_cast<RandomAccessStackDominatorNode<Derived>*>(a));
+}
+
 }  // namespace v8::internal::compiler::turboshaft
 
 #endif  // V8_COMPILER_TURBOSHAFT_GRAPH_H_
diff --git a/deps/v8/src/compiler/turboshaft/machine-optimization-assembler.h b/deps/v8/src/compiler/turboshaft/machine-optimization-assembler.h
new file mode 100644
index 00000000000000..b18325b1f35349
--- /dev/null
+++ b/deps/v8/src/compiler/turboshaft/machine-optimization-assembler.h
@@ -0,0 +1,1960 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_COMPILER_TURBOSHAFT_MACHINE_OPTIMIZATION_ASSEMBLER_H_
+#define V8_COMPILER_TURBOSHAFT_MACHINE_OPTIMIZATION_ASSEMBLER_H_
+
+#include <algorithm>
+#include <cmath>
+#include <cstring>
+#include <limits>
+#include <type_traits>
+
+#include "src/base/bits.h"
+#include "src/base/division-by-constant.h"
+#include "src/base/functional.h"
+#include "src/base/ieee754.h"
+#include "src/base/logging.h"
+#include "src/base/macros.h"
+#include "src/base/overflowing-math.h"
+#include "src/base/template-utils.h"
+#include "src/base/vector.h"
+#include "src/codegen/machine-type.h"
+#include "src/compiler/backend/instruction.h"
+#include "src/compiler/turboshaft/assembler.h"
+#include "src/compiler/turboshaft/operations.h"
+#include "src/numbers/conversions.h"
+
+namespace v8 ::internal::compiler::turboshaft {
+
+// The MachineOptimizationAssembler performs basic optimizations on low-level
+// operations that can be performed on-the-fly, without requiring type analysis
+// or analyzing uses. It largely corresponds to MachineOperatorReducer in
+// sea-of-nodes Turbofan.
+template <class Base, bool signalling_nan_possible>
+class MachineOptimizationAssembler
+    : public AssemblerInterface<
+          MachineOptimizationAssembler<Base, signalling_nan_possible>, Base> {
+ public:
+  template <class T>
+  bool Is(OpIndex op) {
+    return Base::template Is<T>(op);
+  }
+  template <class T>
+  const T& Cast(OpIndex op) {
+    return Base::template Cast<T>(op);
+  }
+  template <class T>
+  const T* TryCast(OpIndex op) {
+    return Base::template TryCast<T>(op);
+  }
+  using Base::Get;
+  using Base::graph;
+
+  MachineOptimizationAssembler(Graph* graph, Zone* phase_zone)
+      : AssemblerInterface<MachineOptimizationAssembler, Base>(graph,
+                                                               phase_zone) {}
+
+  OpIndex Change(OpIndex input, ChangeOp::Kind kind,
+                 ChangeOp::Assumption assumption, RegisterRepresentation from,
+                 RegisterRepresentation to) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::Change(input, kind, assumption, from, to);
+    }
+    using Kind = ChangeOp::Kind;
+    if (from == WordRepresentation::Word32()) {
+      input = TryRemoveWord32ToWord64Conversion(input);
+    }
+    if (uint64_t value;
+        from.IsWord() &&
+        this->MatchWordConstant(input, WordRepresentation(from), &value)) {
+      if (kind == Kind::kSignExtend && from == WordRepresentation::Word32() &&
+          to == WordRepresentation::Word64()) {
+        return this->Word64Constant(int64_t{static_cast<int32_t>(value)});
+      }
+      if (kind == any_of(Kind::kZeroExtend, Kind::kBitcast) &&
+          from == WordRepresentation::Word32() &&
+          to == WordRepresentation::Word64()) {
+        return this->Word64Constant(uint64_t{static_cast<uint32_t>(value)});
+      }
+      if (kind == Kind::kBitcast && from == WordRepresentation::Word32() &&
+          to == RegisterRepresentation::Float32()) {
+        return this->Float32Constant(
+            base::bit_cast<float>(static_cast<uint32_t>(value)));
+      }
+      if (kind == Kind::kBitcast && from == WordRepresentation::Word64() &&
+          to == RegisterRepresentation::Float64()) {
+        return this->Float64Constant(base::bit_cast<double>(value));
+      }
+      if (kind == Kind::kSignedToFloat &&
+          from == WordRepresentation::Word32() &&
+          to == RegisterRepresentation::Float64()) {
+        return this->Float64Constant(
+            static_cast<double>(static_cast<int32_t>(value)));
+      }
+      if (kind == Kind::kSignedToFloat &&
+          from == WordRepresentation::Word64() &&
+          to == RegisterRepresentation::Float64()) {
+        return this->Float64Constant(
+            static_cast<double>(static_cast<int64_t>(value)));
+      }
+      if (kind == Kind::kUnsignedToFloat &&
+          from == WordRepresentation::Word32() &&
+          to == RegisterRepresentation::Float64()) {
+        return this->Float64Constant(
+            static_cast<double>(static_cast<uint32_t>(value)));
+      }
+    }
+    if (float value; from == RegisterRepresentation::Float32() &&
+                     this->MatchFloat32Constant(input, &value)) {
+      if (kind == Kind::kFloatConversion &&
+          to == RegisterRepresentation::Float64()) {
+        return this->Float64Constant(value);
+      }
+      if (kind == Kind::kBitcast && to == WordRepresentation::Word32()) {
+        return this->Word32Constant(base::bit_cast<uint32_t>(value));
+      }
+    }
+    if (double value; from == RegisterRepresentation::Float64() &&
+                      this->MatchFloat64Constant(input, &value)) {
+      if (kind == Kind::kFloatConversion &&
+          to == RegisterRepresentation::Float32()) {
+        return this->Float32Constant(DoubleToFloat32_NoInline(value));
+      }
+      if (kind == Kind::kBitcast && to == WordRepresentation::Word64()) {
+        return this->Word64Constant(base::bit_cast<uint64_t>(value));
+      }
+      if (kind == Kind::kSignedFloatTruncateOverflowToMin) {
+        double truncated = std::trunc(value);
+        if (to == WordRepresentation::Word64()) {
+          int64_t result = std::numeric_limits<int64_t>::min();
+          if (truncated >= std::numeric_limits<int64_t>::min() &&
+              truncated <= kMaxDoubleRepresentableInt64) {
+            result = static_cast<int64_t>(truncated);
+          }
+          return this->Word64Constant(result);
+        }
+        if (to == WordRepresentation::Word32()) {
+          int32_t result = std::numeric_limits<int32_t>::min();
+          if (truncated >= std::numeric_limits<int32_t>::min() &&
+              truncated <= std::numeric_limits<int32_t>::max()) {
+            result = static_cast<int32_t>(truncated);
+          }
+          return this->Word32Constant(result);
+        }
+      }
+      if (kind == Kind::kJSFloatTruncate &&
+          to == WordRepresentation::Word32()) {
+        return this->Word32Constant(DoubleToInt32_NoInline(value));
+      }
+    }
+    if (float value; from == RegisterRepresentation::Float32() &&
+                     this->MatchFloat32Constant(input, &value)) {
+      if (kind == Kind::kFloatConversion &&
+          to == RegisterRepresentation::Float64()) {
+        return this->Float64Constant(value);
+      }
+    }
+
+    const Operation& input_op = Get(input);
+    if (const ChangeOp* change_op = input_op.TryCast<ChangeOp>()) {
+      if (change_op->from == to && change_op->to == from &&
+          change_op->IsReversibleBy(kind, signalling_nan_possible)) {
+        return change_op->input();
+      }
+    }
+    return Base::Change(input, kind, assumption, from, to);
+  }
+
+  OpIndex Float64InsertWord32(OpIndex float64, OpIndex word32,
+                              Float64InsertWord32Op::Kind kind) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::Float64InsertWord32(float64, word32, kind);
+    }
+    double f;
+    uint32_t w;
+    if (this->MatchFloat64Constant(float64, &f) &&
+        this->MatchWord32Constant(word32, &w)) {
+      uint64_t float_as_word = base::bit_cast<uint64_t>(f);
+      switch (kind) {
+        case Float64InsertWord32Op::Kind::kLowHalf:
+          return this->Float64Constant(base::bit_cast<double>(
+              (float_as_word & uint64_t{0xFFFFFFFF00000000}) | w));
+        case Float64InsertWord32Op::Kind::kHighHalf:
+          return this->Float64Constant(base::bit_cast<double>(
+              (float_as_word & uint64_t{0xFFFFFFFF}) | (uint64_t{w} << 32)));
+      }
+    }
+    return Base::Float64InsertWord32(float64, word32, kind);
+  }
+
+  OpIndex TaggedBitcast(OpIndex input, RegisterRepresentation from,
+                        RegisterRepresentation to) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::TaggedBitcast(input, from, to);
+    }
+    // A Tagged -> Untagged -> Tagged sequence can be short-cut.
+    // An Untagged -> Tagged -> Untagged sequence however cannot be removed,
+    // because the GC might have modified the pointer.
+    if (auto* input_bitcast = TryCast<TaggedBitcastOp>(input)) {
+      if (all_of(input_bitcast->to, from) ==
+              RegisterRepresentation::PointerSized() &&
+          all_of(input_bitcast->from, to) == RegisterRepresentation::Tagged()) {
+        return input_bitcast->input();
+      }
+    }
+    return Base::TaggedBitcast(input, from, to);
+  }
+
+  OpIndex FloatUnary(OpIndex input, FloatUnaryOp::Kind kind,
+                     FloatRepresentation rep) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::FloatUnary(input, kind, rep);
+    }
+    if (float k; rep == FloatRepresentation::Float32() &&
+                 this->MatchFloat32Constant(input, &k)) {
+      if (std::isnan(k)) {
+        return this->Float32Constant(std::numeric_limits<float>::quiet_NaN());
+      }
+      switch (kind) {
+        case FloatUnaryOp::Kind::kAbs:
+          return this->Float32Constant(std::abs(k));
+        case FloatUnaryOp::Kind::kNegate:
+          return this->Float32Constant(-k);
+        case FloatUnaryOp::Kind::kSilenceNaN:
+          DCHECK(!std::isnan(k));
+          return this->Float32Constant(k);
+        case FloatUnaryOp::Kind::kRoundDown:
+          return this->Float32Constant(std::floor(k));
+        case FloatUnaryOp::Kind::kRoundUp:
+          return this->Float32Constant(std::ceil(k));
+        case FloatUnaryOp::Kind::kRoundToZero:
+          return this->Float32Constant(std::trunc(k));
+        case FloatUnaryOp::Kind::kRoundTiesEven:
+          DCHECK_EQ(std::nearbyint(1.5), 2);
+          DCHECK_EQ(std::nearbyint(2.5), 2);
+          return this->Float32Constant(std::nearbyint(k));
+        case FloatUnaryOp::Kind::kLog:
+          return this->Float32Constant(base::ieee754::log(k));
+        case FloatUnaryOp::Kind::kSqrt:
+          return this->Float32Constant(std::sqrt(k));
+        case FloatUnaryOp::Kind::kExp:
+          return this->Float32Constant(base::ieee754::exp(k));
+        case FloatUnaryOp::Kind::kExpm1:
+          return this->Float32Constant(base::ieee754::expm1(k));
+        case FloatUnaryOp::Kind::kSin:
+          return this->Float32Constant(base::ieee754::sin(k));
+        case FloatUnaryOp::Kind::kCos:
+          return this->Float32Constant(base::ieee754::cos(k));
+        case FloatUnaryOp::Kind::kSinh:
+          return this->Float32Constant(base::ieee754::sinh(k));
+        case FloatUnaryOp::Kind::kCosh:
+          return this->Float32Constant(base::ieee754::cosh(k));
+        case FloatUnaryOp::Kind::kAcos:
+          return this->Float32Constant(base::ieee754::acos(k));
+        case FloatUnaryOp::Kind::kAsin:
+          return this->Float32Constant(base::ieee754::asin(k));
+        case FloatUnaryOp::Kind::kAsinh:
+          return this->Float32Constant(base::ieee754::asinh(k));
+        case FloatUnaryOp::Kind::kAcosh:
+          return this->Float32Constant(base::ieee754::acosh(k));
+        case FloatUnaryOp::Kind::kTan:
+          return this->Float32Constant(base::ieee754::tan(k));
+        case FloatUnaryOp::Kind::kTanh:
+          return this->Float32Constant(base::ieee754::tanh(k));
+        case FloatUnaryOp::Kind::kLog2:
+          return this->Float32Constant(base::ieee754::log2(k));
+        case FloatUnaryOp::Kind::kLog10:
+          return this->Float32Constant(base::ieee754::log10(k));
+        case FloatUnaryOp::Kind::kLog1p:
+          return this->Float32Constant(base::ieee754::log1p(k));
+        case FloatUnaryOp::Kind::kCbrt:
+          return this->Float32Constant(base::ieee754::cbrt(k));
+        case FloatUnaryOp::Kind::kAtan:
+          return this->Float32Constant(base::ieee754::atan(k));
+        case FloatUnaryOp::Kind::kAtanh:
+          return this->Float32Constant(base::ieee754::atanh(k));
+      }
+    } else if (double k; rep == FloatRepresentation::Float64() &&
+                         this->MatchFloat64Constant(input, &k)) {
+      if (std::isnan(k)) {
+        return this->Float64Constant(std::numeric_limits<double>::quiet_NaN());
+      }
+      switch (kind) {
+        case FloatUnaryOp::Kind::kAbs:
+          return this->Float64Constant(std::abs(k));
+        case FloatUnaryOp::Kind::kNegate:
+          return this->Float64Constant(-k);
+        case FloatUnaryOp::Kind::kSilenceNaN:
+          DCHECK(!std::isnan(k));
+          return this->Float64Constant(k);
+        case FloatUnaryOp::Kind::kRoundDown:
+          return this->Float64Constant(std::floor(k));
+        case FloatUnaryOp::Kind::kRoundUp:
+          return this->Float64Constant(std::ceil(k));
+        case FloatUnaryOp::Kind::kRoundToZero:
+          return this->Float64Constant(std::trunc(k));
+        case FloatUnaryOp::Kind::kRoundTiesEven:
+          DCHECK_EQ(std::nearbyint(1.5), 2);
+          DCHECK_EQ(std::nearbyint(2.5), 2);
+          return this->Float64Constant(std::nearbyint(k));
+        case FloatUnaryOp::Kind::kLog:
+          return this->Float64Constant(base::ieee754::log(k));
+        case FloatUnaryOp::Kind::kSqrt:
+          return this->Float64Constant(std::sqrt(k));
+        case FloatUnaryOp::Kind::kExp:
+          return this->Float64Constant(base::ieee754::exp(k));
+        case FloatUnaryOp::Kind::kExpm1:
+          return this->Float64Constant(base::ieee754::expm1(k));
+        case FloatUnaryOp::Kind::kSin:
+          return this->Float64Constant(base::ieee754::sin(k));
+        case FloatUnaryOp::Kind::kCos:
+          return this->Float64Constant(base::ieee754::cos(k));
+        case FloatUnaryOp::Kind::kSinh:
+          return this->Float64Constant(base::ieee754::sinh(k));
+        case FloatUnaryOp::Kind::kCosh:
+          return this->Float64Constant(base::ieee754::cosh(k));
+        case FloatUnaryOp::Kind::kAcos:
+          return this->Float64Constant(base::ieee754::acos(k));
+        case FloatUnaryOp::Kind::kAsin:
+          return this->Float64Constant(base::ieee754::asin(k));
+        case FloatUnaryOp::Kind::kAsinh:
+          return this->Float64Constant(base::ieee754::asinh(k));
+        case FloatUnaryOp::Kind::kAcosh:
+          return this->Float64Constant(base::ieee754::acosh(k));
+        case FloatUnaryOp::Kind::kTan:
+          return this->Float64Constant(base::ieee754::tan(k));
+        case FloatUnaryOp::Kind::kTanh:
+          return this->Float64Constant(base::ieee754::tanh(k));
+        case FloatUnaryOp::Kind::kLog2:
+          return this->Float64Constant(base::ieee754::log2(k));
+        case FloatUnaryOp::Kind::kLog10:
+          return this->Float64Constant(base::ieee754::log10(k));
+        case FloatUnaryOp::Kind::kLog1p:
+          return this->Float64Constant(base::ieee754::log1p(k));
+        case FloatUnaryOp::Kind::kCbrt:
+          return this->Float64Constant(base::ieee754::cbrt(k));
+        case FloatUnaryOp::Kind::kAtan:
+          return this->Float64Constant(base::ieee754::atan(k));
+        case FloatUnaryOp::Kind::kAtanh:
+          return this->Float64Constant(base::ieee754::atanh(k));
+      }
+    }
+    return Base::FloatUnary(input, kind, rep);
+  }
+
+  OpIndex WordUnary(OpIndex input, WordUnaryOp::Kind kind,
+                    WordRepresentation rep) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::WordUnary(input, kind, rep);
+    }
+    if (rep == WordRepresentation::Word32()) {
+      input = TryRemoveWord32ToWord64Conversion(input);
+    }
+    if (uint32_t k; rep == WordRepresentation::Word32() &&
+                    this->MatchWord32Constant(input, &k)) {
+      switch (kind) {
+        case WordUnaryOp::Kind::kReverseBytes:
+          return this->Word32Constant(base::bits::ReverseBytes(k));
+        case WordUnaryOp::Kind::kCountLeadingZeros:
+          return this->Word32Constant(base::bits::CountLeadingZeros(k));
+        case WordUnaryOp::Kind::kCountTrailingZeros:
+          return this->Word32Constant(base::bits::CountTrailingZeros(k));
+        case WordUnaryOp::Kind::kPopCount:
+          return this->Word32Constant(base::bits::CountPopulation(k));
+        case WordUnaryOp::Kind::kSignExtend8:
+          return this->Word32Constant(int32_t{static_cast<int8_t>(k)});
+        case WordUnaryOp::Kind::kSignExtend16:
+          return this->Word32Constant(int32_t{static_cast<int16_t>(k)});
+      }
+    } else if (uint64_t k; rep == WordRepresentation::Word64() &&
+                           this->MatchWord64Constant(input, &k)) {
+      switch (kind) {
+        case WordUnaryOp::Kind::kReverseBytes:
+          return this->Word64Constant(base::bits::ReverseBytes(k));
+        case WordUnaryOp::Kind::kCountLeadingZeros:
+          return this->Word64Constant(
+              uint64_t{base::bits::CountLeadingZeros(k)});
+        case WordUnaryOp::Kind::kCountTrailingZeros:
+          return this->Word64Constant(
+              uint64_t{base::bits::CountTrailingZeros(k)});
+        case WordUnaryOp::Kind::kPopCount:
+          return this->Word64Constant(uint64_t{base::bits::CountPopulation(k)});
+        case WordUnaryOp::Kind::kSignExtend8:
+          return this->Word64Constant(int64_t{static_cast<int8_t>(k)});
+        case WordUnaryOp::Kind::kSignExtend16:
+          return this->Word64Constant(int64_t{static_cast<int16_t>(k)});
+      }
+    }
+    return Base::WordUnary(input, kind, rep);
+  }
+
+  OpIndex FloatBinop(OpIndex lhs, OpIndex rhs, FloatBinopOp::Kind kind,
+                     FloatRepresentation rep) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::FloatBinop(lhs, rhs, kind, rep);
+    }
+
+    using Kind = FloatBinopOp::Kind;
+
+    // Place constant on the right for commutative operators.
+    if (FloatBinopOp::IsCommutative(kind) && Is<ConstantOp>(lhs) &&
+        !Is<ConstantOp>(rhs)) {
+      return FloatBinop(rhs, lhs, kind, rep);
+    }
+
+    // constant folding
+    if (float k1, k2; rep == FloatRepresentation::Float32() &&
+                      this->MatchFloat32Constant(lhs, &k1) &&
+                      this->MatchFloat32Constant(rhs, &k2)) {
+      switch (kind) {
+        case Kind::kAdd:
+          return this->Float32Constant(k1 + k2);
+        case Kind::kMul:
+          return this->Float32Constant(k1 * k2);
+        case Kind::kSub:
+          return this->Float32Constant(k1 - k2);
+        case Kind::kMin:
+          return this->Float32Constant(JSMin(k1, k2));
+        case Kind::kMax:
+          return this->Float32Constant(JSMax(k1, k2));
+        case Kind::kDiv:
+          return this->Float32Constant(k1 / k2);
+        case Kind::kPower:
+          return this->Float32Constant(base::ieee754::pow(k1, k2));
+        case Kind::kAtan2:
+          return this->Float32Constant(base::ieee754::atan2(k1, k2));
+        case Kind::kMod:
+          UNREACHABLE();
+      }
+    }
+    if (double k1, k2; rep == FloatRepresentation::Float64() &&
+                       this->MatchFloat64Constant(lhs, &k1) &&
+                       this->MatchFloat64Constant(rhs, &k2)) {
+      switch (kind) {
+        case Kind::kAdd:
+          return this->Float64Constant(k1 + k2);
+        case Kind::kMul:
+          return this->Float64Constant(k1 * k2);
+        case Kind::kSub:
+          return this->Float64Constant(k1 - k2);
+        case Kind::kMin:
+          return this->Float64Constant(JSMin(k1, k2));
+        case Kind::kMax:
+          return this->Float64Constant(JSMax(k1, k2));
+        case Kind::kDiv:
+          return this->Float64Constant(k1 / k2);
+        case Kind::kMod:
+          return this->Float64Constant(Modulo(k1, k2));
+        case Kind::kPower:
+          return this->Float64Constant(base::ieee754::pow(k1, k2));
+        case Kind::kAtan2:
+          return this->Float64Constant(base::ieee754::atan2(k1, k2));
+      }
+    }
+
+    // lhs <op> NaN  =>  NaN
+    if (this->MatchNaN(rhs) || (this->MatchNaN(lhs) && kind != Kind::kPower)) {
+      // Return a quiet NaN since Wasm operations could have signalling NaN as
+      // input but not as output.
+      return this->FloatConstant(std::numeric_limits<double>::quiet_NaN(), rep);
+    }
+
+    if (Is<ConstantOp>(rhs)) {
+      if (kind == Kind::kMul) {
+        // lhs * 1  =>  lhs
+        if (!signalling_nan_possible && this->MatchFloat(rhs, 1.0)) {
+          return lhs;
+        }
+        // lhs * 2  =>  lhs + lhs
+        if (this->MatchFloat(rhs, 2.0)) {
+          return this->FloatAdd(lhs, lhs, rep);
+        }
+        // lhs * -1  =>  -lhs
+        if (this->MatchFloat(rhs, -1.0)) {
+          return this->FloatNegate(lhs, rep);
+        }
+      }
+
+      if (kind == Kind::kDiv) {
+        // lhs / 1  =>  lhs
+        if (!signalling_nan_possible && this->MatchFloat(rhs, 1.0)) {
+          return lhs;
+        }
+        // lhs / -1  =>  -lhs
+        if (this->MatchFloat(rhs, -1.0)) {
+          return this->FloatNegate(lhs, rep);
+        }
+        // All reciprocals of non-denormal powers of two can be represented
+        // exactly, so division by power of two can be reduced to
+        // multiplication by reciprocal, with the same result.
+        // x / k  =>  x * (1 / k)
+        if (rep == FloatRepresentation::Float32()) {
+          if (float k;
+              this->MatchFloat32Constant(rhs, &k) && std::isnormal(k) &&
+              k != 0 && std::isfinite(k) &&
+              base::bits::IsPowerOfTwo(base::Double(k).Significand())) {
+            return this->FloatMul(lhs, this->FloatConstant(1.0 / k, rep), rep);
+          }
+        } else {
+          DCHECK_EQ(rep, FloatRepresentation::Float64());
+          if (double k;
+              this->MatchFloat64Constant(rhs, &k) && std::isnormal(k) &&
+              k != 0 && std::isfinite(k) &&
+              base::bits::IsPowerOfTwo(base::Double(k).Significand())) {
+            return this->FloatMul(lhs, this->FloatConstant(1.0 / k, rep), rep);
+          }
+        }
+      }
+
+      if (kind == Kind::kMod) {
+        // x % 0  =>  NaN
+        if (this->MatchFloat(rhs, 0.0)) {
+          return this->FloatConstant(std::numeric_limits<double>::quiet_NaN(),
+                                     rep);
+        }
+      }
+
+      if (kind == Kind::kSub) {
+        // lhs - +0.0  =>  lhs
+        if (!signalling_nan_possible && this->MatchFloat(rhs, +0.0)) {
+          return lhs;
+        }
+      }
+
+      if (kind == Kind::kPower) {
+        if (this->MatchFloat(rhs, 0.0) || this->MatchFloat(rhs, -0.0)) {
+          return this->FloatConstant(1.0, rep);
+        }
+        if (this->MatchFloat(rhs, 2.0)) {
+          return this->FloatMul(lhs, lhs, rep);
+        }
+        if (this->MatchFloat(rhs, 0.5)) {
+          Block* if_neg_infinity = this->NewBlock(Block::Kind::kBranchTarget);
+          if_neg_infinity->SetDeferred(true);
+          Block* otherwise = this->NewBlock(Block::Kind::kBranchTarget);
+          Block* merge = this->NewBlock(Block::Kind::kMerge);
+          this->Branch(this->FloatLessThanOrEqual(
+                           lhs, this->FloatConstant(-V8_INFINITY, rep), rep),
+                       if_neg_infinity, otherwise);
+
+          this->Bind(if_neg_infinity);
+          OpIndex infty = this->FloatConstant(V8_INFINITY, rep);
+          this->Goto(merge);
+
+          this->Bind(otherwise);
+          OpIndex sqrt = this->FloatSqrt(lhs, rep);
+          this->Goto(merge);
+
+          this->Bind(merge);
+          return this->Phi(base::VectorOf({infty, sqrt}), rep);
+        }
+      }
+    }
+
+    if (!signalling_nan_possible && kind == Kind::kSub &&
+        this->MatchFloat(lhs, -0.0)) {
+      // -0.0 - round_down(-0.0 - y) => round_up(y)
+      if (OpIndex a, b, c;
+          FloatUnaryOp::IsSupported(FloatUnaryOp::Kind::kRoundUp, rep) &&
+          this->MatchFloatRoundDown(rhs, &a, rep) &&
+          this->MatchFloatSub(a, &b, &c, rep) && this->MatchFloat(b, -0.0)) {
+        return this->FloatRoundUp(c, rep);
+      }
+      // -0.0 - rhs  =>  -rhs
+      return this->FloatNegate(rhs, rep);
+    }
+
+    return Base::FloatBinop(lhs, rhs, kind, rep);
+  }
+
+  OpIndex WordBinop(OpIndex left, OpIndex right, WordBinopOp::Kind kind,
+                    WordRepresentation rep) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::WordBinop(left, right, kind, rep);
+    }
+
+    using Kind = WordBinopOp::Kind;
+
+    DCHECK_EQ(rep, any_of(WordRepresentation::Word32(),
+                          WordRepresentation::Word64()));
+    bool is_64 = rep == WordRepresentation::Word64();
+
+    if (!is_64) {
+      left = TryRemoveWord32ToWord64Conversion(left);
+      right = TryRemoveWord32ToWord64Conversion(right);
+    }
+
+    // Place constant on the right for commutative operators.
+    if (WordBinopOp::IsCommutative(kind) && Is<ConstantOp>(left) &&
+        !Is<ConstantOp>(right)) {
+      return WordBinop(right, left, kind, rep);
+    }
+    // constant folding
+    if (uint64_t k1, k2; this->MatchWordConstant(left, rep, &k1) &&
+                         this->MatchWordConstant(right, rep, &k2)) {
+      switch (kind) {
+        case Kind::kAdd:
+          return this->WordConstant(k1 + k2, rep);
+        case Kind::kMul:
+          return this->WordConstant(k1 * k2, rep);
+        case Kind::kBitwiseAnd:
+          return this->WordConstant(k1 & k2, rep);
+        case Kind::kBitwiseOr:
+          return this->WordConstant(k1 | k2, rep);
+        case Kind::kBitwiseXor:
+          return this->WordConstant(k1 ^ k2, rep);
+        case Kind::kSub:
+          return this->WordConstant(k1 - k2, rep);
+        case Kind::kSignedMulOverflownBits:
+          return this->WordConstant(
+              is_64 ? base::bits::SignedMulHigh64(static_cast<int64_t>(k1),
+                                                  static_cast<int64_t>(k2))
+                    : base::bits::SignedMulHigh32(static_cast<int32_t>(k1),
+                                                  static_cast<int32_t>(k2)),
+              rep);
+        case Kind::kUnsignedMulOverflownBits:
+          return this->WordConstant(
+              is_64 ? base::bits::UnsignedMulHigh64(k1, k2)
+                    : base::bits::UnsignedMulHigh32(static_cast<uint32_t>(k1),
+                                                    static_cast<uint32_t>(k2)),
+              rep);
+        case Kind::kSignedDiv:
+          return this->WordConstant(
+              is_64 ? base::bits::SignedDiv64(k1, k2)
+                    : base::bits::SignedDiv32(static_cast<int32_t>(k1),
+                                              static_cast<int32_t>(k2)),
+              rep);
+        case Kind::kUnsignedDiv:
+          return this->WordConstant(
+              is_64 ? base::bits::UnsignedDiv64(k1, k2)
+                    : base::bits::UnsignedDiv32(static_cast<uint32_t>(k1),
+                                                static_cast<uint32_t>(k2)),
+              rep);
+        case Kind::kSignedMod:
+          return this->WordConstant(
+              is_64 ? base::bits::SignedMod64(k1, k2)
+                    : base::bits::SignedMod32(static_cast<int32_t>(k1),
+                                              static_cast<int32_t>(k2)),
+              rep);
+        case Kind::kUnsignedMod:
+          return this->WordConstant(
+              is_64 ? base::bits::UnsignedMod64(k1, k2)
+                    : base::bits::UnsignedMod32(static_cast<uint32_t>(k1),
+                                                static_cast<uint32_t>(k2)),
+              rep);
+      }
+    }
+
+    // TODO(tebbi): Detect and merge multiple bitfield checks for CSA/Torque
+    // code.
+
+    if (uint64_t right_value;
+        this->MatchWordConstant(right, rep, &right_value)) {
+      int64_t right_value_signed =
+          is_64 ? static_cast<int64_t>(right_value)
+                : int64_t{static_cast<int32_t>(right_value)};
+      // (a <op> k1) <op> k2  =>  a <op> (k1 <op> k2)
+      if (OpIndex a, k1; WordBinopOp::IsAssociative(kind) &&
+                         this->MatchWordBinop(left, &a, &k1, kind, rep) &&
+                         Is<ConstantOp>(k1)) {
+        OpIndex k2 = right;
+        return WordBinop(a, WordBinop(k1, k2, kind, rep), kind, rep);
+      }
+      switch (kind) {
+        case Kind::kSub:
+          // left - k  => left + -k
+          return WordBinop(left, this->WordConstant(-right_value, rep),
+                           Kind::kAdd, rep);
+        case Kind::kAdd:
+          // left + 0  =>  left
+          if (right_value == 0) {
+            return left;
+          }
+          break;
+        case Kind::kBitwiseXor:
+          // left ^ 0  =>  left
+          if (right_value == 0) {
+            return left;
+          }
+          // left ^ 1  =>  left == 0  if left is 0 or 1
+          if (right_value == 1 && IsBit(left)) {
+            return this->Word32Equal(left, this->Word32Constant(0));
+          }
+          // (x ^ -1) ^ -1  =>  x
+          {
+            OpIndex x, y;
+            int64_t k;
+            if (right_value_signed == -1 &&
+                this->MatchBitwiseAnd(left, &x, &y, rep) &&
+                this->MatchWordConstant(y, rep, &k) && k == -1) {
+              return x;
+            }
+          }
+          break;
+        case Kind::kBitwiseOr:
+          // left | 0  =>  left
+          if (right_value == 0) {
+            return left;
+          }
+          // left | -1  =>  -1
+          if (right_value_signed == -1) {
+            return right;
+          }
+          // (x & K1) | K2 => x | K2 if K2 has ones for every zero bit in K1.
+          // This case can be constructed by UpdateWord and UpdateWord32 in CSA.
+          {
+            OpIndex x, y;
+            uint64_t k1;
+            uint64_t k2 = right_value;
+            if (this->MatchBitwiseAnd(left, &x, &y, rep) &&
+                this->MatchWordConstant(y, rep, &k1) &&
+                (k1 | k2) == rep.MaxUnsignedValue()) {
+              return this->WordBitwiseOr(x, right, rep);
+            }
+          }
+          break;
+        case Kind::kMul:
+          // left * 0  =>  0
+          if (right_value == 0) {
+            return this->WordConstant(0, rep);
+          }
+          // left * 1  =>  left
+          if (right_value == 1) {
+            return left;
+          }
+          // left * -1 => 0 - left
+          if (right_value_signed == -1) {
+            return this->WordSub(this->WordConstant(0, rep), left, rep);
+          }
+          // left * 2^k  =>  left << k
+          if (base::bits::IsPowerOfTwo(right_value)) {
+            OpIndex shift_amount = this->WordConstant(
+                base::bits::WhichPowerOfTwo(right_value), rep);
+            return this->ShiftLeft(left, shift_amount, rep);
+          }
+          break;
+        case Kind::kBitwiseAnd:
+          // left & -1 => left
+          if (right_value_signed == -1) {
+            return left;
+          }
+          // x & 0  =>  0
+          if (right_value == 0) {
+            return right;
+          }
+
+          if (right_value == 1) {
+            // (x + x) & 1  =>  0
+            OpIndex left_ignore_extensions =
+                IsWord32ConvertedToWord64(left)
+                    ? UndoWord32ToWord64Conversion(left)
+                    : left;
+            if (OpIndex a, b;
+                this->MatchWordAdd(left_ignore_extensions, &a, &b,
+                                   WordRepresentation::Word32()) &&
+                a == b) {
+              return this->WordConstant(0, rep);
+            }
+
+            // CMP & 1  =>  CMP
+            if (IsBit(left_ignore_extensions)) {
+              return left;
+            }
+          }
+          break;
+        case WordBinopOp::Kind::kSignedDiv:
+          return ReduceSignedDiv(left, right_value_signed, rep);
+        case WordBinopOp::Kind::kUnsignedDiv:
+          return ReduceUnsignedDiv(left, right_value, rep);
+        case WordBinopOp::Kind::kSignedMod:
+          // left % 0  =>  0
+          // left % 1  =>  0
+          // left % -1  =>  0
+          if (right_value_signed == any_of(0, 1, -1)) {
+            return this->WordConstant(0, rep);
+          }
+          if (right_value_signed != rep.MinSignedValue()) {
+            right_value_signed = Abs(right_value_signed);
+          }
+          // left % 2^n  =>  ((left + m) & (2^n - 1)) - m
+          // where m = (left >> bits-1) >>> bits-n
+          // This is a branch-free version of the following:
+          // left >= 0 ? left & (2^n - 1)
+          //           : ((left + (2^n - 1)) & (2^n - 1)) - (2^n - 1)
+          // Adding and subtracting (2^n - 1) before and after the bitwise-and
+          // keeps the result congruent modulo 2^n, but shifts the resulting
+          // value range to become -(2^n - 1) ... 0.
+          if (base::bits::IsPowerOfTwo(right_value_signed)) {
+            uint32_t bits = rep.bit_width();
+            uint32_t n = base::bits::WhichPowerOfTwo(right_value_signed);
+            OpIndex m = this->ShiftRightLogical(
+                this->ShiftRightArithmetic(left, bits - 1, rep), bits - n, rep);
+            return this->WordSub(
+                this->WordBitwiseAnd(
+                    this->WordAdd(left, m, rep),
+                    this->WordConstant(right_value_signed - 1, rep), rep),
+                m, rep);
+          }
+          // The `IntDiv` with a constant right-hand side will be turned into a
+          // multiplication, avoiding the expensive integer division.
+          return this->WordSub(
+              left, this->WordMul(this->IntDiv(left, right, rep), right, rep),
+              rep);
+        case WordBinopOp::Kind::kUnsignedMod:
+          // left % 0  =>  0
+          // left % 1  =>  0
+          if (right_value == 0 || right_value == 1) {
+            return this->WordConstant(0, rep);
+          }
+          // x % 2^n => x & (2^n - 1)
+          if (base::bits::IsPowerOfTwo(right_value)) {
+            return this->WordBitwiseAnd(
+                left, this->WordConstant(right_value - 1, rep), rep);
+          }
+          // The `UintDiv` with a constant right-hand side will be turned into a
+          // multiplication, avoiding the expensive integer division.
+          return this->WordSub(
+              left, this->WordMul(right, this->UintDiv(left, right, rep), rep),
+              rep);
+        case WordBinopOp::Kind::kSignedMulOverflownBits:
+        case WordBinopOp::Kind::kUnsignedMulOverflownBits:
+          break;
+      }
+    }
+
+    if (kind == Kind::kAdd) {
+      OpIndex x, y, zero;
+      // (0 - x) + y => y - x
+      if (this->MatchWordSub(left, &zero, &x, rep) && this->MatchZero(zero)) {
+        y = right;
+        return this->WordSub(y, x, rep);
+      }
+      // x + (0 - y) => x - y
+      if (this->MatchWordSub(right, &zero, &y, rep) && this->MatchZero(zero)) {
+        x = left;
+        return this->WordSub(x, y, rep);
+      }
+    }
+
+    // 0 / right  =>  0
+    // 0 % right  =>  0
+    if (this->MatchZero(left) &&
+        kind == any_of(Kind::kSignedDiv, Kind::kUnsignedDiv, Kind::kUnsignedMod,
+                       Kind::kSignedMod)) {
+      return this->WordConstant(0, rep);
+    }
+
+    if (left == right) {
+      OpIndex x = left;
+      switch (kind) {
+        // x & x  =>  x
+        // x | x  =>  x
+        case WordBinopOp::Kind::kBitwiseAnd:
+        case WordBinopOp::Kind::kBitwiseOr:
+          return x;
+        // x ^ x  =>  0
+        // x - x  =>  0
+        // x % x  =>  0
+        case WordBinopOp::Kind::kBitwiseXor:
+        case WordBinopOp::Kind::kSub:
+        case WordBinopOp::Kind::kSignedMod:
+        case WordBinopOp::Kind::kUnsignedMod:
+          return this->WordConstant(0, rep);
+        // x / x  =>  x != 0
+        case WordBinopOp::Kind::kSignedDiv:
+        case WordBinopOp::Kind::kUnsignedDiv: {
+          OpIndex zero = this->WordConstant(0, rep);
+          return this->Equal(this->Equal(left, zero, rep), zero, rep);
+        }
+        case WordBinopOp::Kind::kAdd:
+        case WordBinopOp::Kind::kMul:
+        case WordBinopOp::Kind::kSignedMulOverflownBits:
+        case WordBinopOp::Kind::kUnsignedMulOverflownBits:
+          break;
+      }
+    }
+
+    if (base::Optional<OpIndex> ror = TryReduceToRor(left, right, kind, rep)) {
+      return *ror;
+    }
+
+    return Base::WordBinop(left, right, kind, rep);
+  }
+
+  base::Optional<OpIndex> TryReduceToRor(OpIndex left, OpIndex right,
+                                         WordBinopOp::Kind kind,
+                                         WordRepresentation rep) {
+    // Recognize rotation, we are this->matching and transforming as follows
+    // (assuming kWord32, kWord64 is handled correspondingly):
+    //   x << y         |  x >>> (32 - y)    =>  x ror (32 - y)
+    //   x << (32 - y)  |  x >>> y           =>  x ror y
+    //   x << y         ^  x >>> (32 - y)    =>  x ror (32 - y)   if 1 <= y < 32
+    //   x << (32 - y)  ^  x >>> y           =>  x ror y          if 1 <= y < 32
+    // (As well as the commuted forms.)
+    // Note the side condition for XOR: the optimization doesn't hold for
+    // an effective rotation amount of 0.
+
+    if (!(kind == any_of(WordBinopOp::Kind::kBitwiseAnd,
+                         WordBinopOp::Kind::kBitwiseXor))) {
+      return {};
+    }
+
+    const ShiftOp* high = TryCast<ShiftOp>(left);
+    if (!high) return {};
+    const ShiftOp* low = TryCast<ShiftOp>(right);
+    if (!low) return {};
+
+    if (low->kind == ShiftOp::Kind::kShiftLeft) {
+      std::swap(low, high);
+    }
+    if (high->kind != ShiftOp::Kind::kShiftLeft ||
+        low->kind != ShiftOp::Kind::kShiftRightLogical) {
+      return {};
+    }
+    OpIndex x = high->left();
+    if (low->left() != x) return {};
+    OpIndex amount;
+    uint64_t k;
+    if (OpIndex a, b; this->MatchWordSub(high->right(), &a, &b, rep) &&
+                      this->MatchWordConstant(a, rep, &k) &&
+                      b == low->right() && k == rep.bit_width()) {
+      amount = b;
+    } else if (OpIndex a, b; this->MatchWordSub(low->right(), &a, &b, rep) &&
+                             a == high->right() &&
+                             this->MatchWordConstant(b, rep, &k) &&
+                             k == rep.bit_width()) {
+      amount = low->right();
+    } else if (uint64_t k1, k2;
+               this->MatchWordConstant(high->right(), rep, &k1) &&
+               this->MatchWordConstant(low->right(), rep, &k2) &&
+               k1 + k2 == rep.bit_width() && k1 >= 0 && k2 >= 0) {
+      if (k1 == 0 || k2 == 0) {
+        if (kind == WordBinopOp::Kind::kBitwiseXor) {
+          return this->WordConstant(0, rep);
+        } else {
+          DCHECK_EQ(kind, WordBinopOp::Kind::kBitwiseOr);
+          return x;
+        }
+      }
+      return this->RotateRight(x, low->right(), rep);
+    } else {
+      return {};
+    }
+    if (kind == WordBinopOp::Kind::kBitwiseOr) {
+      return this->RotateRight(x, amount, rep);
+    } else {
+      DCHECK_EQ(kind, WordBinopOp::Kind::kBitwiseXor);
+      // Can't guarantee that rotation amount is not 0.
+      return {};
+    }
+  }
+
+  OpIndex Projection(OpIndex tuple, uint16_t index) {
+    if (auto* tuple_op = TryCast<TupleOp>(tuple)) {
+      return tuple_op->input(index);
+    }
+    return Base::Projection(tuple, index);
+  }
+
+  OpIndex OverflowCheckedBinop(OpIndex left, OpIndex right,
+                               OverflowCheckedBinopOp::Kind kind,
+                               WordRepresentation rep) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::OverflowCheckedBinop(left, right, kind, rep);
+    }
+    using Kind = OverflowCheckedBinopOp::Kind;
+    if (OverflowCheckedBinopOp::IsCommutative(kind) && Is<ConstantOp>(left) &&
+        !Is<ConstantOp>(right)) {
+      return OverflowCheckedBinop(right, left, kind, rep);
+    }
+    if (rep == WordRepresentation::Word32()) {
+      left = TryRemoveWord32ToWord64Conversion(left);
+      right = TryRemoveWord32ToWord64Conversion(right);
+    }
+    // constant folding
+    if (rep == WordRepresentation::Word32()) {
+      if (int32_t k1, k2; this->MatchWord32Constant(left, &k1) &&
+                          this->MatchWord32Constant(right, &k2)) {
+        bool overflow;
+        int32_t res;
+        switch (kind) {
+          case OverflowCheckedBinopOp::Kind::kSignedAdd:
+            overflow = base::bits::SignedAddOverflow32(k1, k2, &res);
+            break;
+          case OverflowCheckedBinopOp::Kind::kSignedMul:
+            overflow = base::bits::SignedMulOverflow32(k1, k2, &res);
+            break;
+          case OverflowCheckedBinopOp::Kind::kSignedSub:
+            overflow = base::bits::SignedSubOverflow32(k1, k2, &res);
+            break;
+        }
+        return this->Tuple(this->Word32Constant(res),
+                           this->Word32Constant(overflow));
+      }
+    } else {
+      DCHECK_EQ(rep, WordRepresentation::Word64());
+      if (int64_t k1, k2; this->MatchWord64Constant(left, &k1) &&
+                          this->MatchWord64Constant(right, &k2)) {
+        bool overflow;
+        int64_t res;
+        switch (kind) {
+          case OverflowCheckedBinopOp::Kind::kSignedAdd:
+            overflow = base::bits::SignedAddOverflow64(k1, k2, &res);
+            break;
+          case OverflowCheckedBinopOp::Kind::kSignedMul:
+            UNREACHABLE();
+          case OverflowCheckedBinopOp::Kind::kSignedSub:
+            overflow = base::bits::SignedSubOverflow64(k1, k2, &res);
+            break;
+        }
+        return this->Tuple(this->Word64Constant(res),
+                           this->Word32Constant(overflow));
+      }
+    }
+
+    // left + 0  =>  (left, false)
+    // left - 0  =>  (left, false)
+    if (kind == any_of(Kind::kSignedAdd, Kind::kSignedSub) &&
+        this->MatchZero(right)) {
+      return this->Tuple(left, right);
+    }
+
+    if (kind == Kind::kSignedMul) {
+      if (int64_t k; this->MatchWordConstant(right, rep, &k)) {
+        // left * 0  =>  (0, false)
+        if (k == 0) {
+          return this->Tuple(this->WordConstant(0, rep),
+                             this->Word32Constant(false));
+        }
+        // left * 1  =>  (left, false)
+        if (k == 1) {
+          return this->Tuple(left, this->Word32Constant(false));
+        }
+        // left * -1  =>  0 - left
+        if (k == -1) {
+          return this->IntSubCheckOverflow(this->WordConstant(0, rep), left,
+                                           rep);
+        }
+        // left * 2  =>  left + left
+        if (k == 2) {
+          return this->IntAddCheckOverflow(left, left, rep);
+        }
+      }
+    }
+
+    return Base::OverflowCheckedBinop(left, right, kind, rep);
+  }
+
+  OpIndex Equal(OpIndex left, OpIndex right, RegisterRepresentation rep) {
+    if (ShouldSkipOptimizationStep()) return Base::Equal(left, right, rep);
+    if (left == right && !rep.IsFloat()) {
+      return this->Word32Constant(1);
+    }
+    if (rep == WordRepresentation::Word32()) {
+      left = TryRemoveWord32ToWord64Conversion(left);
+      right = TryRemoveWord32ToWord64Conversion(right);
+    }
+    if (Is<ConstantOp>(left) && !Is<ConstantOp>(right)) {
+      return Equal(right, left, rep);
+    }
+    if (Is<ConstantOp>(right)) {
+      if (Is<ConstantOp>(left)) {
+        // k1 == k2  =>  k
+        switch (rep) {
+          case RegisterRepresentation::Word32():
+          case RegisterRepresentation::Word64(): {
+            if (uint64_t k1, k2;
+                this->MatchWordConstant(left, WordRepresentation(rep), &k1) &&
+                this->MatchWordConstant(right, WordRepresentation(rep), &k2)) {
+              return this->Word32Constant(k1 == k2);
+            }
+            break;
+          }
+          case RegisterRepresentation::Float32(): {
+            if (float k1, k2; this->MatchFloat32Constant(left, &k1) &&
+                              this->MatchFloat32Constant(right, &k2)) {
+              return this->Word32Constant(k1 == k2);
+            }
+            break;
+          }
+          case RegisterRepresentation::Float64(): {
+            if (double k1, k2; this->MatchFloat64Constant(left, &k1) &&
+                               this->MatchFloat64Constant(right, &k2)) {
+              return this->Word32Constant(k1 == k2);
+            }
+            break;
+          }
+          default:
+            UNREACHABLE();
+        }
+      }
+      if (rep.IsWord()) {
+        WordRepresentation rep_w{rep};
+        // x - y == 0  =>  x == y
+        if (OpIndex x, y;
+            this->MatchWordSub(left, &x, &y, rep_w) && this->MatchZero(right)) {
+          return Equal(x, y, rep);
+        }
+        {
+          //     ((x >> shift_amount) & mask) == k
+          // =>  (x & (mask << shift_amount)) == (k << shift_amount)
+          OpIndex shift, x, mask_op;
+          int shift_amount;
+          uint64_t mask, k;
+          if (this->MatchBitwiseAnd(left, &shift, &mask_op, rep_w) &&
+              this->MatchConstantRightShift(shift, &x, rep_w, &shift_amount) &&
+              this->MatchWordConstant(mask_op, rep_w, &mask) &&
+              this->MatchWordConstant(right, rep_w, &k) &&
+              mask <= rep.MaxUnsignedValue() >> shift_amount &&
+              k <= rep.MaxUnsignedValue() >> shift_amount) {
+            return Equal(
+                this->WordBitwiseAnd(
+                    x, this->Word64Constant(mask << shift_amount), rep_w),
+                this->Word64Constant(k << shift_amount), rep_w);
+          }
+        }
+        {
+          // (x >> k1) == k2  =>  x == (k2 << k1)  if shifts reversible
+          // Only perform the transformation if the shift is not used yet, to
+          // avoid keeping both the shift and x alive.
+          OpIndex x;
+          uint16_t k1;
+          int64_t k2;
+          if (this->MatchConstantShiftRightArithmeticShiftOutZeros(
+                  left, &x, rep_w, &k1) &&
+              this->MatchWordConstant(right, rep_w, &k2) &&
+              CountLeadingSignBits(k2, rep_w) > k1 &&
+              Get(left).saturated_use_count == 0) {
+            return this->Equal(
+                x, this->WordConstant(base::bits::Unsigned(k2) << k1, rep_w),
+                rep_w);
+          }
+        }
+      }
+    }
+    return Base::Equal(left, right, rep);
+  }
+
+  OpIndex Comparison(OpIndex left, OpIndex right, ComparisonOp::Kind kind,
+                     RegisterRepresentation rep) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::Comparison(left, right, kind, rep);
+    }
+    if (rep == WordRepresentation::Word32()) {
+      left = TryRemoveWord32ToWord64Conversion(left);
+      right = TryRemoveWord32ToWord64Conversion(right);
+    }
+    using Kind = ComparisonOp::Kind;
+    if (left == right &&
+        !(rep == any_of(RegisterRepresentation::Float32(),
+                        RegisterRepresentation::Float64())) &&
+        kind == any_of(Kind::kSignedLessThanOrEqual,
+                       Kind::kUnsignedLessThanOrEqual)) {
+      switch (kind) {
+        case Kind::kUnsignedLessThanOrEqual:
+        case Kind::kSignedLessThanOrEqual:
+          return this->Word32Constant(1);
+        case Kind::kUnsignedLessThan:
+        case Kind::kSignedLessThan:
+          return this->Word32Constant(0);
+      }
+    }
+    // constant folding
+    if (Is<ConstantOp>(right) && Is<ConstantOp>(left)) {
+      switch (rep) {
+        case RegisterRepresentation::Word32():
+        case RegisterRepresentation::Word64(): {
+          if (kind ==
+              any_of(Kind::kSignedLessThan, Kind::kSignedLessThanOrEqual)) {
+            if (int64_t k1, k2;
+                this->MatchWordConstant(left, WordRepresentation(rep), &k1) &&
+                this->MatchWordConstant(right, WordRepresentation(rep), &k2)) {
+              switch (kind) {
+                case ComparisonOp::Kind::kSignedLessThan:
+                  return this->Word32Constant(k1 < k2);
+                case ComparisonOp::Kind::kSignedLessThanOrEqual:
+                  return this->Word32Constant(k1 <= k2);
+                case ComparisonOp::Kind::kUnsignedLessThan:
+                case ComparisonOp::Kind::kUnsignedLessThanOrEqual:
+                  UNREACHABLE();
+              }
+            }
+          } else {
+            if (uint64_t k1, k2;
+                this->MatchWordConstant(left, WordRepresentation(rep), &k1) &&
+                this->MatchWordConstant(right, WordRepresentation(rep), &k2)) {
+              switch (kind) {
+                case ComparisonOp::Kind::kUnsignedLessThan:
+                  return this->Word32Constant(k1 < k2);
+                case ComparisonOp::Kind::kUnsignedLessThanOrEqual:
+                  return this->Word32Constant(k1 <= k2);
+                case ComparisonOp::Kind::kSignedLessThan:
+                case ComparisonOp::Kind::kSignedLessThanOrEqual:
+                  UNREACHABLE();
+              }
+            }
+          }
+          break;
+        }
+        case RegisterRepresentation::Float32(): {
+          if (float k1, k2; this->MatchFloat32Constant(left, &k1) &&
+                            this->MatchFloat32Constant(right, &k2)) {
+            switch (kind) {
+              case ComparisonOp::Kind::kSignedLessThan:
+                return this->Word32Constant(k1 < k2);
+              case ComparisonOp::Kind::kSignedLessThanOrEqual:
+                return this->Word32Constant(k1 <= k2);
+              case ComparisonOp::Kind::kUnsignedLessThan:
+              case ComparisonOp::Kind::kUnsignedLessThanOrEqual:
+                UNREACHABLE();
+            }
+          }
+          break;
+        }
+        case RegisterRepresentation::Float64(): {
+          if (double k1, k2; this->MatchFloat64Constant(left, &k1) &&
+                             this->MatchFloat64Constant(right, &k2)) {
+            switch (kind) {
+              case ComparisonOp::Kind::kSignedLessThan:
+                return this->Word32Constant(k1 < k2);
+              case ComparisonOp::Kind::kSignedLessThanOrEqual:
+                return this->Word32Constant(k1 <= k2);
+              case ComparisonOp::Kind::kUnsignedLessThan:
+              case ComparisonOp::Kind::kUnsignedLessThanOrEqual:
+                UNREACHABLE();
+            }
+          }
+          break;
+        }
+        default:
+          UNREACHABLE();
+      }
+    }
+    if (rep == RegisterRepresentation::Float64() &&
+        IsFloat32ConvertedToFloat64(left) &&
+        IsFloat32ConvertedToFloat64(right)) {
+      return this->Comparison(UndoFloat32ToFloat64Conversion(left),
+                              UndoFloat32ToFloat64Conversion(right), kind,
+                              RegisterRepresentation::Float32());
+    }
+    if (rep.IsWord()) {
+      WordRepresentation rep_w{rep};
+      if (kind == Kind::kUnsignedLessThanOrEqual) {
+        // 0 <= x  =>  true
+        if (uint64_t k; this->MatchWordConstant(left, rep_w, &k) && k == 0) {
+          return this->Word32Constant(1);
+        }
+        // x <= MaxUint  =>  true
+        if (uint64_t k; this->MatchWordConstant(right, rep_w, &k) &&
+                        k == rep.MaxUnsignedValue()) {
+          return this->Word32Constant(1);
+        }
+      }
+      if (kind == Kind::kUnsignedLessThan) {
+        // x < 0  =>  false
+        if (uint64_t k; this->MatchWordConstant(right, rep_w, &k) && k == 0) {
+          return this->Word32Constant(0);
+        }
+        // MaxUint < x  =>  true
+        if (uint64_t k; this->MatchWordConstant(left, rep_w, &k) &&
+                        k == rep.MaxUnsignedValue()) {
+          return this->Word32Constant(0);
+        }
+      }
+      {
+        // (x >> k) </<=  (y >> k)  =>  x </<=  y   if shifts reversible
+        OpIndex x, y;
+        uint16_t k1, k2;
+        if (this->MatchConstantShiftRightArithmeticShiftOutZeros(left, &x,
+                                                                 rep_w, &k1) &&
+            this->MatchConstantShiftRightArithmeticShiftOutZeros(right, &y,
+                                                                 rep_w, &k2) &&
+            k1 == k2) {
+          return this->Comparison(x, y, kind, rep_w);
+        }
+      }
+      {
+        // (x >> k1) </<= k2  =>  x </<= (k2 << k1)  if shifts reversible
+        // Only perform the transformation if the shift is not used yet, to
+        // avoid keeping both the shift and x alive.
+        OpIndex x;
+        uint16_t k1;
+        int64_t k2;
+        if (this->MatchConstantShiftRightArithmeticShiftOutZeros(left, &x,
+                                                                 rep_w, &k1) &&
+            this->MatchWordConstant(right, rep_w, &k2) &&
+            CountLeadingSignBits(k2, rep_w) > k1 &&
+            Get(left).saturated_use_count == 0) {
+          return this->Comparison(
+              x, this->WordConstant(base::bits::Unsigned(k2) << k1, rep_w),
+              kind, rep_w);
+        }
+        // k2 </<= (x >> k1)  =>  (k2 << k1) </<= x  if shifts reversible
+        // Only perform the transformation if the shift is not used yet, to
+        // avoid keeping both the shift and x alive.
+        if (this->MatchConstantShiftRightArithmeticShiftOutZeros(right, &x,
+                                                                 rep_w, &k1) &&
+            this->MatchWordConstant(left, rep_w, &k2) &&
+            CountLeadingSignBits(k2, rep_w) > k1 &&
+            Get(right).saturated_use_count == 0) {
+          return this->Comparison(
+              this->WordConstant(base::bits::Unsigned(k2) << k1, rep_w), x,
+              kind, rep_w);
+        }
+      }
+      // Map 64bit to 32bit comparisons.
+      if (rep_w == WordRepresentation::Word64()) {
+        base::Optional<bool> left_sign_extended;
+        base::Optional<bool> right_sign_extended;
+        if (IsWord32ConvertedToWord64(left, &left_sign_extended) &&
+            IsWord32ConvertedToWord64(right, &right_sign_extended)) {
+          if (left_sign_extended != true && right_sign_extended != true) {
+            // Both sides were zero-extended, so the resulting comparison always
+            // behaves unsigned even if it was a signed 64bit comparison.
+            return this->Comparison(UndoWord32ToWord64Conversion(left),
+                                    UndoWord32ToWord64Conversion(right),
+                                    ComparisonOp::SetSigned(kind, false),
+                                    WordRepresentation::Word32());
+          } else if (left_sign_extended != false &&
+                     right_sign_extended != false) {
+            // Both sides were sign-extended, this preserves both signed and
+            // unsigned comparisons.
+            return this->Comparison(UndoWord32ToWord64Conversion(left),
+                                    UndoWord32ToWord64Conversion(right), kind,
+                                    WordRepresentation::Word32());
+          }
+        }
+      }
+    }
+    return Base::Comparison(left, right, kind, rep);
+  }
+
+  OpIndex Shift(OpIndex left, OpIndex right, ShiftOp::Kind kind,
+                WordRepresentation rep) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::Shift(left, right, kind, rep);
+    }
+    using Kind = ShiftOp::Kind;
+    uint64_t c_unsigned;
+    int64_t c_signed;
+    if (this->MatchWordConstant(left, rep, &c_unsigned, &c_signed)) {
+      if (uint32_t amount; this->MatchWord32Constant(right, &amount)) {
+        amount = amount & (rep.bit_width() - 1);
+        switch (kind) {
+          case Kind::kShiftRightArithmeticShiftOutZeros:
+            if (base::bits::CountTrailingZeros(c_signed) < amount) {
+              // This assumes that we never hoist operations to before their
+              // original place in the control flow.
+              return this->Unreachable();
+            }
+            [[fallthrough]];
+          case Kind::kShiftRightArithmetic:
+            return this->WordConstant(c_signed >> amount, rep);
+          case Kind::kShiftRightLogical:
+            return this->WordConstant(c_unsigned >> amount, rep);
+          case Kind::kShiftLeft:
+            return this->WordConstant(c_unsigned << amount, rep);
+          case Kind::kRotateRight:
+            if (rep == WordRepresentation::Word32()) {
+              return this->WordConstant(
+                  base::bits::RotateRight32(static_cast<uint32_t>(c_unsigned),
+                                            amount),
+                  rep);
+            } else {
+              return this->WordConstant(
+                  base::bits::RotateRight64(c_unsigned, amount), rep);
+            }
+          case Kind::kRotateLeft:
+            if (rep == WordRepresentation::Word32()) {
+              return this->WordConstant(
+                  base::bits::RotateLeft32(static_cast<uint32_t>(c_unsigned),
+                                           amount),
+                  rep);
+            } else {
+              return this->WordConstant(
+                  base::bits::RotateLeft64(c_unsigned, amount), rep);
+            }
+        }
+      }
+    }
+    if (int32_t amount; this->MatchWord32Constant(right, &amount) &&
+                        0 <= amount && amount < rep.bit_width()) {
+      if (amount == 0) {
+        return left;
+      }
+      if (kind == Kind::kShiftLeft) {
+        // If x >> K only shifted out zeros:
+        // (x >> K) << L => x           if K == L
+        // (x >> K) << L => x >> (K-L) if K > L
+        // (x >> K) << L => x << (L-K)  if K < L
+        // Since this is used for Smi untagging, we currently only need it for
+        // signed shifts.
+        int k;
+        OpIndex x;
+        if (this->MatchConstantShift(
+                left, &x, Kind::kShiftRightArithmeticShiftOutZeros, rep, &k)) {
+          int32_t l = amount;
+          if (k == l) {
+            return x;
+          } else if (k > l) {
+            return this->ShiftRightArithmeticShiftOutZeros(
+                x, this->Word32Constant(k - l), rep);
+          } else if (k < l) {
+            return this->ShiftLeft(x, this->Word32Constant(l - k), rep);
+          }
+        }
+        // (x >>> K) << K => x & ~(2^K - 1)
+        // (x >> K) << K => x & ~(2^K - 1)
+        if (this->MatchConstantRightShift(left, &x, rep, &k) && k == amount) {
+          return this->WordBitwiseAnd(
+              x, this->WordConstant(rep.MaxUnsignedValue() << k, rep), rep);
+        }
+      }
+      if (kind == any_of(Kind::kShiftRightArithmetic,
+                         Kind::kShiftRightArithmeticShiftOutZeros)) {
+        OpIndex x;
+        int left_shift_amount;
+        // (x << k) >> k
+        if (this->MatchConstantShift(left, &x, ShiftOp::Kind::kShiftLeft, rep,
+                                     &left_shift_amount) &&
+            amount == left_shift_amount) {
+          // x << (bit_width - 1) >> (bit_width - 1)  =>  0 - x  if x is 0 or 1
+          if (amount == rep.bit_width() - 1 && IsBit(x)) {
+            return this->WordSub(this->WordConstant(0, rep), x, rep);
+          }
+          // x << (bit_width - 8) >> (bit_width - 8)  =>  x  if x is within Int8
+          if (amount <= rep.bit_width() - 8 && IsInt8(x)) {
+            return x;
+          }
+          // x << (bit_width - 8) >> (bit_width - 8)  =>  x  if x is within Int8
+          if (amount <= rep.bit_width() - 16 && IsInt16(x)) {
+            return x;
+          }
+        }
+      }
+      if (rep == WordRepresentation::Word32() &&
+          SupportedOperations::word32_shift_is_safe()) {
+        // Remove the explicit 'and' with 0x1F if the shift provided by the
+        // machine instruction this->matches that required by JavaScript.
+        if (OpIndex a, b; this->MatchBitwiseAnd(right, &a, &b,
+                                                WordRepresentation::Word32())) {
+          static_assert(0x1f == WordRepresentation::Word32().bit_width() - 1);
+          if (uint32_t b_value;
+              this->MatchWord32Constant(b, &b_value) && b_value == 0x1f) {
+            return this->Shift(left, a, kind, rep);
+          }
+        }
+      }
+    }
+    return Base::Shift(left, right, kind, rep);
+  }
+
+  OpIndex Branch(OpIndex condition, Block* if_true, Block* if_false) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::Branch(condition, if_true, if_false);
+    }
+    if (base::Optional<bool> decision = DecideBranchCondition(condition)) {
+      return this->Goto(*decision ? if_true : if_false);
+    }
+    bool negated = false;
+    condition = ReduceBranchCondition(condition, &negated);
+    if (negated) std::swap(if_true, if_false);
+    return Base::Branch(condition, if_true, if_false);
+  }
+
+  OpIndex DeoptimizeIf(OpIndex condition, OpIndex frame_state, bool negated,
+                       const DeoptimizeParameters* parameters) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::DeoptimizeIf(condition, frame_state, negated, parameters);
+    }
+    if (base::Optional<bool> decision = DecideBranchCondition(condition)) {
+      if (*decision != negated) {
+        this->Deoptimize(frame_state, parameters);
+      }
+      // `DeoptimizeIf` doesn't produce a value.
+      return OpIndex::Invalid();
+    }
+    condition = ReduceBranchCondition(condition, &negated);
+    return Base::DeoptimizeIf(condition, frame_state, negated, parameters);
+  }
+
+  OpIndex Store(OpIndex base, OpIndex value, StoreOp::Kind kind,
+                MemoryRepresentation stored_rep, WriteBarrierKind write_barrier,
+                int32_t offset) {
+    if (ShouldSkipOptimizationStep()) {
+      return Base::Store(base, value, kind, stored_rep, write_barrier, offset);
+    }
+    return IndexedStore(base, OpIndex::Invalid(), value, kind, stored_rep,
+                        write_barrier, offset, 0);
+  }
+
+  OpIndex IndexedStore(OpIndex base, OpIndex index, OpIndex value,
+                       IndexedStoreOp::Kind kind,
+                       MemoryRepresentation stored_rep,
+                       WriteBarrierKind write_barrier, int32_t offset,
+                       uint8_t element_scale) {
+    if (!ShouldSkipOptimizationStep()) {
+      if (stored_rep.SizeInBytes() <= 4) {
+        value = TryRemoveWord32ToWord64Conversion(value);
+      }
+      index = ReduceMemoryIndex(index, &offset, &element_scale);
+      switch (stored_rep) {
+        case MemoryRepresentation::Uint8():
+        case MemoryRepresentation::Int8():
+          value =
+              ReduceWithTruncation(value, std::numeric_limits<uint8_t>::max(),
+                                   WordRepresentation::Word32());
+          break;
+        case MemoryRepresentation::Uint16():
+        case MemoryRepresentation::Int16():
+          value =
+              ReduceWithTruncation(value, std::numeric_limits<uint16_t>::max(),
+                                   WordRepresentation::Word32());
+          break;
+        case MemoryRepresentation::Uint32():
+        case MemoryRepresentation::Int32():
+          value =
+              ReduceWithTruncation(value, std::numeric_limits<uint32_t>::max(),
+                                   WordRepresentation::Word32());
+          break;
+        default:
+          break;
+      }
+    }
+    if (index.valid()) {
+      return Base::IndexedStore(base, index, value, kind, stored_rep,
+                                write_barrier, offset, element_scale);
+    } else {
+      return Base::Store(base, value, kind, stored_rep, write_barrier, offset);
+    }
+  }
+
+  OpIndex Load(OpIndex base, LoadOp::Kind kind, MemoryRepresentation loaded_rep,
+               RegisterRepresentation result_rep, int32_t offset) {
+    if (ShouldSkipOptimizationStep())
+      return Base::Load(base, kind, loaded_rep, result_rep, offset);
+    return IndexedLoad(base, OpIndex::Invalid(), kind, loaded_rep, result_rep,
+                       offset, 0);
+  }
+
+  OpIndex IndexedLoad(OpIndex base, OpIndex index, IndexedLoadOp::Kind kind,
+                      MemoryRepresentation loaded_rep,
+                      RegisterRepresentation result_rep, int32_t offset,
+                      uint8_t element_scale) {
+    while (true) {
+      if (ShouldSkipOptimizationStep()) break;
+      index = ReduceMemoryIndex(index, &offset, &element_scale);
+      if (kind != IndexedLoadOp::Kind::kTaggedBase && !index.valid()) {
+        if (OpIndex left, right;
+            this->MatchWordAdd(base, &left, &right,
+                               WordRepresentation::PointerSized()) &&
+            TryAdjustOffset(&offset, Get(right), element_scale)) {
+          base = left;
+          continue;
+        }
+      }
+      break;
+    }
+    if (index.valid()) {
+      return Base::IndexedLoad(base, index, kind, loaded_rep, result_rep,
+                               offset, element_scale);
+    } else {
+      return Base::Load(base, kind, loaded_rep, result_rep, offset);
+    }
+  }
+
+ private:
+  bool TryAdjustOffset(int32_t* offset, const Operation& maybe_constant,
+                       uint8_t element_scale) {
+    if (!maybe_constant.Is<ConstantOp>()) return false;
+    const ConstantOp& constant = maybe_constant.Cast<ConstantOp>();
+    int64_t diff = constant.signed_integral();
+    int32_t new_offset;
+    if (diff <= (std::numeric_limits<int32_t>::max() >> element_scale) &&
+        diff >= (std::numeric_limits<int32_t>::min() >> element_scale) &&
+        !base::bits::SignedAddOverflow32(
+            *offset,
+            static_cast<int32_t>(base::bits::Unsigned(diff) << element_scale),
+            &new_offset)) {
+      *offset = new_offset;
+      return true;
+    }
+    return false;
+  }
+
+  bool TryAdjustElementScale(uint8_t* element_scale, OpIndex maybe_constant) {
+    uint64_t diff;
+    if (!this->MatchWordConstant(maybe_constant,
+                                 WordRepresentation::PointerSized(), &diff)) {
+      return false;
+    }
+    DCHECK_LT(*element_scale, WordRepresentation::PointerSized().bit_width());
+    if (diff < (WordRepresentation::PointerSized().bit_width() -
+                uint64_t{*element_scale})) {
+      *element_scale += diff;
+      return true;
+    }
+    return false;
+  }
+
+  // Fold away operations in the computation of `index` while preserving the
+  // value of `(index << element_scale) + offset)` by updating `offset`,
+  // `element_scale` and returning the updated `index`.
+  // Return `OpIndex::Invalid()` if the resulting index is zero.
+  OpIndex ReduceMemoryIndex(OpIndex index, int32_t* offset,
+                            uint8_t* element_scale) {
+    while (index.valid()) {
+      const Operation& index_op = Get(index);
+      if (TryAdjustOffset(offset, index_op, *element_scale)) {
+        index = OpIndex::Invalid();
+        *element_scale = 0;
+      } else if (const ShiftOp* shift_op = index_op.TryCast<ShiftOp>()) {
+        if (shift_op->kind == ShiftOp::Kind::kShiftLeft &&
+            TryAdjustElementScale(element_scale, shift_op->right())) {
+          index = shift_op->left();
+          continue;
+        }
+      } else if (const WordBinopOp* binary_op =
+                     index_op.TryCast<WordBinopOp>()) {
+        if (binary_op->kind == WordBinopOp::Kind::kAdd &&
+            TryAdjustOffset(offset, Get(binary_op->right()), *element_scale)) {
+          index = binary_op->left();
+          continue;
+        }
+      }
+      break;
+    }
+    return index;
+  }
+
+  bool IsFloat32ConvertedToFloat64(OpIndex value) {
+    if (OpIndex input;
+        this->MatchChange(value, &input, ChangeOp::Kind::kFloatConversion,
+                          RegisterRepresentation::Float32(),
+                          RegisterRepresentation::Float64())) {
+      return true;
+    }
+    if (double c;
+        this->MatchFloat64Constant(value, &c) && DoubleToFloat32(c) == c) {
+      return true;
+    }
+    return false;
+  }
+
+  OpIndex UndoFloat32ToFloat64Conversion(OpIndex value) {
+    if (OpIndex input;
+        this->MatchChange(value, &input, ChangeOp::Kind::kFloatConversion,
+                          RegisterRepresentation::Float32(),
+                          RegisterRepresentation::Float64())) {
+      return input;
+    }
+    if (double c;
+        this->MatchFloat64Constant(value, &c) && DoubleToFloat32(c) == c) {
+      return this->Float32Constant(DoubleToFloat32(c));
+    }
+    UNREACHABLE();
+  }
+
+  bool IsBit(OpIndex value) {
+    return Is<EqualOp>(value) || Is<ComparisonOp>(value);
+  }
+
+  bool IsInt8(OpIndex value) {
+    if (auto* op = TryCast<LoadOp>(value)) {
+      return op->loaded_rep == MemoryRepresentation::Int8();
+    } else if (auto* op = TryCast<IndexedLoadOp>(value)) {
+      return op->loaded_rep == MemoryRepresentation::Int8();
+    }
+    return false;
+  }
+
+  bool IsInt16(OpIndex value) {
+    if (auto* op = TryCast<LoadOp>(value)) {
+      return op->loaded_rep == any_of(MemoryRepresentation::Int16(),
+                                      MemoryRepresentation::Int8());
+    } else if (auto* op = TryCast<IndexedLoadOp>(value)) {
+      return op->loaded_rep == any_of(MemoryRepresentation::Int16(),
+                                      MemoryRepresentation::Int8());
+    }
+    return false;
+  }
+
+  bool IsWord32ConvertedToWord64(
+      OpIndex value, base::Optional<bool>* sign_extended = nullptr) {
+    if (const ChangeOp* change_op = TryCast<ChangeOp>(value)) {
+      if (change_op->from == WordRepresentation::Word32() &&
+          change_op->to == WordRepresentation::Word64()) {
+        if (change_op->kind == ChangeOp::Kind::kSignExtend) {
+          if (sign_extended) *sign_extended = true;
+          return true;
+        } else if (change_op->kind == ChangeOp::Kind::kZeroExtend) {
+          if (sign_extended) *sign_extended = false;
+          return true;
+        }
+      }
+    }
+    if (int64_t c; this->MatchWord64Constant(value, &c) &&
+                   c >= std::numeric_limits<int32_t>::min()) {
+      if (c < 0) {
+        if (sign_extended) *sign_extended = true;
+        return true;
+      } else if (c <= std::numeric_limits<int32_t>::max()) {
+        // Sign- and zero-extension produce the same result.
+        if (sign_extended) *sign_extended = {};
+        return true;
+      } else if (c <= std::numeric_limits<uint32_t>::max()) {
+        if (sign_extended) *sign_extended = false;
+        return true;
+      }
+    }
+    return false;
+  }
+
+  OpIndex UndoWord32ToWord64Conversion(OpIndex value) {
+    DCHECK(IsWord32ConvertedToWord64(value));
+    if (const ChangeOp* op = TryCast<ChangeOp>(value)) {
+      return op->input();
+    }
+    return this->Word32Constant(this->Cast<ConstantOp>(value).word32());
+  }
+
+  OpIndex TryRemoveWord32ToWord64Conversion(OpIndex value) {
+    if (const ChangeOp* op = TryCast<ChangeOp>(value)) {
+      if (op->from == WordRepresentation::Word32() &&
+          op->to == WordRepresentation::Word64() &&
+          op->kind == any_of(ChangeOp::Kind::kZeroExtend,
+                             ChangeOp::Kind::kSignExtend)) {
+        return op->input();
+      }
+    }
+    return value;
+  }
+
+  uint64_t TruncateWord(uint64_t value, WordRepresentation rep) {
+    if (rep == WordRepresentation::Word32()) {
+      return static_cast<uint32_t>(value);
+    } else {
+      DCHECK_EQ(rep, WordRepresentation::Word64());
+      return value;
+    }
+  }
+
+  // Reduce the given value under the assumption that only the bits set in
+  // `truncation_mask` will be observed.
+  OpIndex ReduceWithTruncation(OpIndex value, uint64_t truncation_mask,
+                               WordRepresentation rep) {
+    {  // Remove bitwise-and with a mask whose zero-bits are not observed.
+      OpIndex input, mask;
+      uint64_t mask_value;
+      if (this->MatchBitwiseAnd(value, &input, &mask, rep) &&
+          this->MatchWordConstant(mask, rep, &mask_value)) {
+        if ((mask_value & truncation_mask) == truncation_mask) {
+          return ReduceWithTruncation(input, truncation_mask, rep);
+        }
+      }
+    }
+    {
+      int left_shift_amount;
+      int right_shift_amount;
+      WordRepresentation rep;
+      OpIndex left_shift;
+      ShiftOp::Kind right_shift_kind;
+      OpIndex left_shift_input;
+      if (this->MatchConstantShift(value, &left_shift, &right_shift_kind, &rep,
+                                   &right_shift_amount) &&
+          ShiftOp::IsRightShift(right_shift_kind) &&
+          this->MatchConstantShift(left_shift, &left_shift_input,
+                                   ShiftOp::Kind::kShiftLeft, rep,
+                                   &left_shift_amount) &&
+          ((rep.MaxUnsignedValue() >> right_shift_amount) & truncation_mask) ==
+              truncation_mask) {
+        if (left_shift_amount == right_shift_amount) {
+          return left_shift_input;
+        } else if (left_shift_amount < right_shift_amount) {
+          OpIndex shift_amount =
+              this->WordConstant(right_shift_amount - left_shift_amount, rep);
+          return this->Shift(left_shift_input, shift_amount, right_shift_kind,
+                             rep);
+        } else if (left_shift_amount > right_shift_amount) {
+          OpIndex shift_amount =
+              this->WordConstant(left_shift_amount - right_shift_amount, rep);
+          return this->Shift(left_shift_input, shift_amount,
+                             ShiftOp::Kind::kShiftLeft, rep);
+        }
+      }
+    }
+    return value;
+  }
+
+  OpIndex ReduceSignedDiv(OpIndex left, int64_t right, WordRepresentation rep) {
+    // left / -1 => 0 - left
+    if (right == -1) {
+      return this->WordSub(this->WordConstant(0, rep), left, rep);
+    }
+    // left / 0 => 0
+    if (right == 0) {
+      return this->WordConstant(0, rep);
+    }
+    // left / 1 => left
+    if (right == 1) {
+      return left;
+    }
+    // left / MinSignedValue  =>  left == MinSignedValue
+    if (right == rep.MinSignedValue()) {
+      return this->ChangeUint32ToUint64(
+          this->Equal(left, this->WordConstant(right, rep), rep));
+    }
+    // left / -right  => -(left / right)
+    if (right < 0) {
+      DCHECK_NE(right, rep.MinSignedValue());
+      return this->WordSub(this->WordConstant(0, rep),
+                           ReduceSignedDiv(left, Abs(right), rep), rep);
+    }
+
+    OpIndex quotient = left;
+    if (base::bits::IsPowerOfTwo(right)) {
+      uint32_t shift = base::bits::WhichPowerOfTwo(right);
+      DCHECK_GT(shift, 0);
+      if (shift > 1) {
+        quotient =
+            this->ShiftRightArithmetic(quotient, rep.bit_width() - 1, rep);
+      }
+      quotient =
+          this->ShiftRightArithmetic(quotient, rep.bit_width() - shift, rep);
+      quotient = this->WordAdd(quotient, left, rep);
+      quotient = this->ShiftRightArithmetic(quotient, shift, rep);
+      return quotient;
+    }
+    DCHECK_GT(right, 0);
+    // Compute the magic number for `right`, using a generic lambda to treat
+    // 32- and 64-bit uniformly.
+    auto LowerToMul = [this, left](auto right, WordRepresentation rep) {
+      base::MagicNumbersForDivision<decltype(right)> magic =
+          base::SignedDivisionByConstant(right);
+      OpIndex quotient = this->IntMulOverflownBits(
+          left, this->WordConstant(magic.multiplier, rep), rep);
+      if (magic.multiplier < 0) {
+        quotient = this->WordAdd(quotient, left, rep);
+      }
+      OpIndex sign_bit =
+          this->ShiftRightLogical(left, rep.bit_width() - 1, rep);
+      return this->WordAdd(
+          this->ShiftRightArithmetic(quotient, magic.shift, rep), sign_bit,
+          rep);
+    };
+    if (rep == WordRepresentation::Word32()) {
+      return LowerToMul(static_cast<int32_t>(right),
+                        WordRepresentation::Word32());
+    } else {
+      DCHECK_EQ(rep, WordRepresentation::Word64());
+      return LowerToMul(static_cast<int64_t>(right),
+                        WordRepresentation::Word64());
+    }
+  }
+
+  OpIndex ReduceUnsignedDiv(OpIndex left, uint64_t right,
+                            WordRepresentation rep) {
+    // left / 0 => 0
+    if (right == 0) {
+      return this->WordConstant(0, rep);
+    }
+    // left / 1 => left
+    if (right == 1) {
+      return left;
+    }
+    // left / 2^k  => left >> k
+    if (base::bits::IsPowerOfTwo(right)) {
+      return this->ShiftRightLogical(left, base::bits::WhichPowerOfTwo(right),
+                                     rep);
+    }
+    DCHECK_GT(right, 0);
+    // If `right` is even, we can avoid using the expensive fixup by
+    // shifting `left` upfront.
+    unsigned const shift = base::bits::CountTrailingZeros(right);
+    left = this->ShiftRightLogical(left, shift, rep);
+    right >>= shift;
+    // Compute the magic number for `right`, using a generic lambda to treat
+    // 32- and 64-bit uniformly.
+    auto LowerToMul = [this, left, shift](auto right, WordRepresentation rep) {
+      base::MagicNumbersForDivision<decltype(right)> const mag =
+          base::UnsignedDivisionByConstant(right, shift);
+      OpIndex quotient = this->UintMulOverflownBits(
+          left, this->WordConstant(mag.multiplier, rep), rep);
+      if (mag.add) {
+        DCHECK_GE(mag.shift, 1);
+        // quotient = (((left - quotient) >> 1) + quotient) >> (mag.shift -
+        // 1)
+        quotient = this->ShiftRightLogical(
+            this->WordAdd(this->ShiftRightLogical(
+                              this->WordSub(left, quotient, rep), 1, rep),
+                          quotient, rep),
+            mag.shift - 1, rep);
+      } else {
+        quotient = this->ShiftRightLogical(quotient, mag.shift, rep);
+      }
+      return quotient;
+    };
+    if (rep == WordRepresentation::Word32()) {
+      return LowerToMul(static_cast<uint32_t>(right),
+                        WordRepresentation::Word32());
+    } else {
+      DCHECK_EQ(rep, WordRepresentation::Word64());
+      return LowerToMul(static_cast<uint64_t>(right),
+                        WordRepresentation::Word64());
+    }
+  }
+
+  OpIndex ReduceBranchCondition(OpIndex condition, bool* negated) {
+    while (true) {
+      condition = TryRemoveWord32ToWord64Conversion(condition);
+      // x == 0  =>  x with flipped branches
+      if (OpIndex left, right; this->MatchEqual(condition, &left, &right,
+                                                WordRepresentation::Word32()) &&
+                               this->MatchZero(right)) {
+        condition = left;
+        *negated = !*negated;
+        continue;
+      }
+      // x - y  =>  x == y with flipped branches
+      if (OpIndex left, right; this->MatchWordSub(
+              condition, &left, &right, WordRepresentation::Word32())) {
+        condition = this->Word32Equal(left, right);
+        *negated = !*negated;
+        continue;
+      }
+      // x & (1 << k) == (1 << k)  =>  x & (1 << k)
+      if (OpIndex left, right; this->MatchEqual(condition, &left, &right,
+                                                WordRepresentation::Word32())) {
+        OpIndex x, mask;
+        uint32_t k1, k2;
+        if (this->MatchBitwiseAnd(left, &x, &mask,
+                                  WordRepresentation::Word32()) &&
+            this->MatchWord32Constant(mask, &k1) &&
+            this->MatchWord32Constant(right, &k2) && k1 == k2 &&
+            base::bits::IsPowerOfTwo(k1)) {
+          condition = left;
+          continue;
+        }
+      }
+      break;
+    }
+    return condition;
+  }
+
+  base::Optional<bool> DecideBranchCondition(OpIndex condition) {
+    if (uint32_t value; this->MatchWord32Constant(condition, &value)) {
+      return value != 0;
+    }
+    return base::nullopt;
+  }
+
+  uint16_t CountLeadingSignBits(int64_t c, WordRepresentation rep) {
+    return base::bits::CountLeadingSignBits(c) - (64 - rep.bit_width());
+  }
+};
+
+}  // namespace v8::internal::compiler::turboshaft
+
+#endif  // V8_COMPILER_TURBOSHAFT_MACHINE_OPTIMIZATION_ASSEMBLER_H_
diff --git a/deps/v8/src/compiler/turboshaft/operation-matching.h b/deps/v8/src/compiler/turboshaft/operation-matching.h
new file mode 100644
index 00000000000000..acf0995b38c2af
--- /dev/null
+++ b/deps/v8/src/compiler/turboshaft/operation-matching.h
@@ -0,0 +1,315 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_COMPILER_TURBOSHAFT_OPERATION_MATCHING_H_
+#define V8_COMPILER_TURBOSHAFT_OPERATION_MATCHING_H_
+
+#include "src/compiler/turboshaft/operations.h"
+
+namespace v8 ::internal::compiler::turboshaft {
+
+template <class Assembler>
+class OperationMatching {
+ public:
+  template <class Op>
+  bool Is(OpIndex op_idx) {
+    return assembler().graph().Get(op_idx).template Is<Op>();
+  }
+
+  template <class Op>
+  const Op* TryCast(OpIndex op_idx) {
+    return assembler().graph().Get(op_idx).template TryCast<Op>();
+  }
+
+  template <class Op>
+  const Op& Cast(OpIndex op_idx) {
+    return assembler().graph().Get(op_idx).template Cast<Op>();
+  }
+
+  const Operation& Get(OpIndex op_idx) {
+    return assembler().graph().Get(op_idx);
+  }
+
+  bool MatchZero(OpIndex matched) {
+    const ConstantOp* op = TryCast<ConstantOp>(matched);
+    if (!op) return false;
+    switch (op->kind) {
+      case ConstantOp::Kind::kWord32:
+      case ConstantOp::Kind::kWord64:
+        return op->integral() == 0;
+      case ConstantOp::Kind::kFloat32:
+        return op->float32() == 0;
+      case ConstantOp::Kind::kFloat64:
+        return op->float64() == 0;
+      default:
+        return false;
+    }
+  }
+
+  bool MatchFloat32Constant(OpIndex matched, float* constant) {
+    const ConstantOp* op = TryCast<ConstantOp>(matched);
+    if (!op) return false;
+    if (op->kind != ConstantOp::Kind::kFloat32) return false;
+    *constant = op->float32();
+    return true;
+  }
+
+  bool MatchFloat64Constant(OpIndex matched, double* constant) {
+    const ConstantOp* op = TryCast<ConstantOp>(matched);
+    if (!op) return false;
+    if (op->kind != ConstantOp::Kind::kFloat64) return false;
+    *constant = op->float64();
+    return true;
+  }
+
+  bool MatchFloat(OpIndex matched, double* value) {
+    const ConstantOp* op = TryCast<ConstantOp>(matched);
+    if (!op) return false;
+    if (op->kind == ConstantOp::Kind::kFloat64) {
+      *value = op->float64();
+      return true;
+    } else if (op->kind == ConstantOp::Kind::kFloat32) {
+      *value = op->float32();
+      return true;
+    }
+    return false;
+  }
+
+  bool MatchFloat(OpIndex matched, double value) {
+    double k;
+    if (!MatchFloat(matched, &k)) return false;
+    return base::bit_cast<uint64_t>(value) == base::bit_cast<uint64_t>(k) ||
+           (std::isnan(k) && std::isnan(value));
+  }
+
+  bool MatchNaN(OpIndex matched) {
+    double k;
+    return MatchFloat(matched, &k) && std::isnan(k);
+  }
+
+  bool MatchWordConstant(OpIndex matched, WordRepresentation rep,
+                         uint64_t* unsigned_constant,
+                         int64_t* signed_constant = nullptr) {
+    const ConstantOp* op = TryCast<ConstantOp>(matched);
+    if (!op) return false;
+    switch (op->Representation()) {
+      case RegisterRepresentation::Word32():
+        if (rep != WordRepresentation::Word32()) return false;
+        break;
+      case RegisterRepresentation::Word64():
+        if (!(rep == any_of(WordRepresentation::Word64(),
+                            WordRepresentation::Word32()))) {
+          return false;
+        }
+        break;
+      default:
+        return false;
+    }
+    if (unsigned_constant) *unsigned_constant = op->integral();
+    if (signed_constant) *signed_constant = op->signed_integral();
+    return true;
+  }
+
+  bool MatchWordConstant(OpIndex matched, WordRepresentation rep,
+                         int64_t* signed_constant) {
+    return MatchWordConstant(matched, rep, nullptr, signed_constant);
+  }
+
+  bool MatchWord64Constant(OpIndex matched, uint64_t* constant) {
+    return MatchWordConstant(matched, WordRepresentation::Word64(), constant);
+  }
+
+  bool MatchWord32Constant(OpIndex matched, uint32_t* constant) {
+    if (uint64_t value;
+        MatchWordConstant(matched, WordRepresentation::Word32(), &value)) {
+      *constant = static_cast<uint32_t>(value);
+      return true;
+    }
+    return false;
+  }
+
+  bool MatchWord64Constant(OpIndex matched, int64_t* constant) {
+    return MatchWordConstant(matched, WordRepresentation::Word64(), constant);
+  }
+
+  bool MatchWord32Constant(OpIndex matched, int32_t* constant) {
+    if (int64_t value;
+        MatchWordConstant(matched, WordRepresentation::Word32(), &value)) {
+      *constant = static_cast<int32_t>(value);
+      return true;
+    }
+    return false;
+  }
+
+  bool MatchChange(OpIndex matched, OpIndex* input, ChangeOp::Kind kind,
+                   RegisterRepresentation from, RegisterRepresentation to) {
+    const ChangeOp* op = TryCast<ChangeOp>(matched);
+    if (!op || op->kind != kind || op->from != from || op->to != to) {
+      return false;
+    }
+    *input = op->input();
+    return true;
+  }
+
+  bool MatchWordBinop(OpIndex matched, OpIndex* left, OpIndex* right,
+                      WordBinopOp::Kind* kind, WordRepresentation* rep) {
+    const WordBinopOp* op = TryCast<WordBinopOp>(matched);
+    if (!op) return false;
+    *kind = op->kind;
+    *rep = op->rep;
+    *left = op->left();
+    *right = op->right();
+    return true;
+  }
+
+  bool MatchWordBinop(OpIndex matched, OpIndex* left, OpIndex* right,
+                      WordBinopOp::Kind kind, WordRepresentation rep) {
+    const WordBinopOp* op = TryCast<WordBinopOp>(matched);
+    if (!op || kind != op->kind) {
+      return false;
+    }
+    if (!(rep == op->rep ||
+          (WordBinopOp::AllowsWord64ToWord32Truncation(kind) &&
+           rep == WordRepresentation::Word32() &&
+           op->rep == WordRepresentation::Word64()))) {
+      return false;
+    }
+    *left = op->left();
+    *right = op->right();
+    return true;
+  }
+
+  bool MatchWordAdd(OpIndex matched, OpIndex* left, OpIndex* right,
+                    WordRepresentation rep) {
+    return MatchWordBinop(matched, left, right, WordBinopOp::Kind::kAdd, rep);
+  }
+
+  bool MatchWordSub(OpIndex matched, OpIndex* left, OpIndex* right,
+                    WordRepresentation rep) {
+    return MatchWordBinop(matched, left, right, WordBinopOp::Kind::kSub, rep);
+  }
+
+  bool MatchBitwiseAnd(OpIndex matched, OpIndex* left, OpIndex* right,
+                       WordRepresentation rep) {
+    return MatchWordBinop(matched, left, right, WordBinopOp::Kind::kBitwiseAnd,
+                          rep);
+  }
+
+  bool MatchEqual(OpIndex matched, OpIndex* left, OpIndex* right,
+                  WordRepresentation rep) {
+    const EqualOp* op = TryCast<EqualOp>(matched);
+    if (!op || rep != op->rep) return false;
+    *left = op->left();
+    *right = op->right();
+    return true;
+  }
+
+  bool MatchComparison(OpIndex matched, OpIndex* left, OpIndex* right,
+                       ComparisonOp::Kind* kind, RegisterRepresentation* rep) {
+    const ComparisonOp* op = TryCast<ComparisonOp>(matched);
+    if (!op) return false;
+    *kind = op->kind;
+    *rep = op->rep;
+    *left = op->left();
+    *right = op->right();
+    return true;
+  }
+
+  bool MatchFloatUnary(OpIndex matched, OpIndex* input, FloatUnaryOp::Kind kind,
+                       FloatRepresentation rep) {
+    const FloatUnaryOp* op = TryCast<FloatUnaryOp>(matched);
+    if (!op || op->kind != kind || op->rep != rep) return false;
+    *input = op->input();
+    return true;
+  }
+
+  bool MatchFloatRoundDown(OpIndex matched, OpIndex* input,
+                           FloatRepresentation rep) {
+    return MatchFloatUnary(matched, input, FloatUnaryOp::Kind::kRoundDown, rep);
+  }
+
+  bool MatchFloatBinary(OpIndex matched, OpIndex* left, OpIndex* right,
+                        FloatBinopOp::Kind kind, FloatRepresentation rep) {
+    const FloatBinopOp* op = TryCast<FloatBinopOp>(matched);
+    if (!op || op->kind != kind || op->rep != rep) return false;
+    *left = op->left();
+    *right = op->right();
+    return true;
+  }
+
+  bool MatchFloatSub(OpIndex matched, OpIndex* left, OpIndex* right,
+                     FloatRepresentation rep) {
+    return MatchFloatBinary(matched, left, right, FloatBinopOp::Kind::kSub,
+                            rep);
+  }
+
+  bool MatchConstantShift(OpIndex matched, OpIndex* input, ShiftOp::Kind* kind,
+                          WordRepresentation* rep, int* amount) {
+    const ShiftOp* op = TryCast<ShiftOp>(matched);
+    if (uint32_t rhs_constant;
+        op && MatchWord32Constant(op->right(), &rhs_constant) &&
+        rhs_constant < static_cast<uint64_t>(op->rep.bit_width())) {
+      *input = op->left();
+      *kind = op->kind;
+      *rep = op->rep;
+      *amount = static_cast<int>(rhs_constant);
+      return true;
+    }
+    return false;
+  }
+
+  bool MatchConstantShift(OpIndex matched, OpIndex* input, ShiftOp::Kind kind,
+                          WordRepresentation rep, int* amount) {
+    const ShiftOp* op = TryCast<ShiftOp>(matched);
+    if (uint32_t rhs_constant;
+        op && op->kind == kind &&
+        (op->rep == rep || (ShiftOp::AllowsWord64ToWord32Truncation(kind) &&
+                            rep == WordRepresentation::Word32() &&
+                            op->rep == WordRepresentation::Word64())) &&
+        MatchWord32Constant(op->right(), &rhs_constant) &&
+        rhs_constant < static_cast<uint64_t>(rep.bit_width())) {
+      *input = op->left();
+      *amount = static_cast<int>(rhs_constant);
+      return true;
+    }
+    return false;
+  }
+
+  bool MatchConstantRightShift(OpIndex matched, OpIndex* input,
+                               WordRepresentation rep, int* amount) {
+    const ShiftOp* op = TryCast<ShiftOp>(matched);
+    if (uint32_t rhs_constant;
+        op && ShiftOp::IsRightShift(op->kind) && op->rep == rep &&
+        MatchWord32Constant(op->right(), &rhs_constant) &&
+        rhs_constant < static_cast<uint32_t>(rep.bit_width())) {
+      *input = op->left();
+      *amount = static_cast<int>(rhs_constant);
+      return true;
+    }
+    return false;
+  }
+
+  bool MatchConstantShiftRightArithmeticShiftOutZeros(OpIndex matched,
+                                                      OpIndex* input,
+                                                      WordRepresentation rep,
+                                                      uint16_t* amount) {
+    const ShiftOp* op = TryCast<ShiftOp>(matched);
+    if (uint32_t rhs_constant;
+        op && op->kind == ShiftOp::Kind::kShiftRightArithmeticShiftOutZeros &&
+        op->rep == rep && MatchWord32Constant(op->right(), &rhs_constant) &&
+        rhs_constant < static_cast<uint64_t>(rep.bit_width())) {
+      *input = op->left();
+      *amount = static_cast<uint16_t>(rhs_constant);
+      return true;
+    }
+    return false;
+  }
+
+ private:
+  Assembler& assembler() { return *static_cast<Assembler*>(this); }
+};
+
+}  // namespace v8::internal::compiler::turboshaft
+
+#endif  // V8_COMPILER_TURBOSHAFT_OPERATION_MATCHING_H_
diff --git a/deps/v8/src/compiler/turboshaft/operations.cc b/deps/v8/src/compiler/turboshaft/operations.cc
index 4fd6e0ada20e35..50e9ec2dbe9624 100644
--- a/deps/v8/src/compiler/turboshaft/operations.cc
+++ b/deps/v8/src/compiler/turboshaft/operations.cc
@@ -8,9 +8,7 @@
 #include <sstream>
 
 #include "src/base/platform/mutex.h"
-#include "src/base/platform/platform.h"
 #include "src/codegen/machine-type.h"
-#include "src/common/assert-scope.h"
 #include "src/common/globals.h"
 #include "src/compiler/backend/instruction-selector.h"
 #include "src/compiler/frame-states.h"
@@ -49,6 +47,14 @@ std::ostream& operator<<(std::ostream& os, WordUnaryOp::Kind kind) {
       return os << "ReverseBytes";
     case WordUnaryOp::Kind::kCountLeadingZeros:
       return os << "CountLeadingZeros";
+    case WordUnaryOp::Kind::kCountTrailingZeros:
+      return os << "CountTrailingZeros";
+    case WordUnaryOp::Kind::kPopCount:
+      return os << "PopCount";
+    case WordUnaryOp::Kind::kSignExtend8:
+      return os << "SignExtend8";
+    case WordUnaryOp::Kind::kSignExtend16:
+      return os << "SignExtend16";
   }
 }
 
@@ -70,8 +76,16 @@ std::ostream& operator<<(std::ostream& os, FloatUnaryOp::Kind kind) {
       return os << "RoundTiesEven";
     case FloatUnaryOp::Kind::kLog:
       return os << "Log";
+    case FloatUnaryOp::Kind::kLog2:
+      return os << "Log2";
+    case FloatUnaryOp::Kind::kLog10:
+      return os << "Log10";
+    case FloatUnaryOp::Kind::kLog1p:
+      return os << "Log1p";
     case FloatUnaryOp::Kind::kSqrt:
       return os << "Sqrt";
+    case FloatUnaryOp::Kind::kCbrt:
+      return os << "Cbrt";
     case FloatUnaryOp::Kind::kExp:
       return os << "Exp";
     case FloatUnaryOp::Kind::kExpm1:
@@ -96,30 +110,61 @@ std::ostream& operator<<(std::ostream& os, FloatUnaryOp::Kind kind) {
       return os << "Tan";
     case FloatUnaryOp::Kind::kTanh:
       return os << "Tanh";
+    case FloatUnaryOp::Kind::kAtan:
+      return os << "Atan";
+    case FloatUnaryOp::Kind::kAtanh:
+      return os << "Atanh";
   }
 }
 
 // static
-bool FloatUnaryOp::IsSupported(Kind kind, MachineRepresentation rep) {
+bool FloatUnaryOp::IsSupported(Kind kind, FloatRepresentation rep) {
+  switch (rep.value()) {
+    case FloatRepresentation::Float32():
+      switch (kind) {
+        case Kind::kRoundDown:
+          return SupportedOperations::float32_round_down();
+        case Kind::kRoundUp:
+          return SupportedOperations::float32_round_up();
+        case Kind::kRoundToZero:
+          return SupportedOperations::float32_round_to_zero();
+        case Kind::kRoundTiesEven:
+          return SupportedOperations::float32_round_ties_even();
+        default:
+          return true;
+      }
+    case FloatRepresentation::Float64():
+      switch (kind) {
+        case Kind::kRoundDown:
+          return SupportedOperations::float64_round_down();
+        case Kind::kRoundUp:
+          return SupportedOperations::float64_round_up();
+        case Kind::kRoundToZero:
+          return SupportedOperations::float64_round_to_zero();
+        case Kind::kRoundTiesEven:
+          return SupportedOperations::float64_round_ties_even();
+        default:
+          return true;
+      }
+  }
+}
+
+// static
+bool WordUnaryOp::IsSupported(Kind kind, WordRepresentation rep) {
   switch (kind) {
-    case Kind::kRoundDown:
-      return rep == MachineRepresentation::kFloat32
-                 ? SupportedOperations::float32_round_down()
-                 : SupportedOperations::float64_round_down();
-    case Kind::kRoundUp:
-      return rep == MachineRepresentation::kFloat32
-                 ? SupportedOperations::float32_round_up()
-                 : SupportedOperations::float64_round_up();
-    case Kind::kRoundToZero:
-      return rep == MachineRepresentation::kFloat32
-                 ? SupportedOperations::float32_round_to_zero()
-                 : SupportedOperations::float64_round_to_zero();
-    case Kind::kRoundTiesEven:
-      return rep == MachineRepresentation::kFloat32
-                 ? SupportedOperations::float32_round_ties_even()
-                 : SupportedOperations::float64_round_ties_even();
-    default:
+    case Kind::kCountLeadingZeros:
+    case Kind::kReverseBytes:
+    case Kind::kSignExtend8:
+    case Kind::kSignExtend16:
       return true;
+    case Kind::kCountTrailingZeros:
+      return rep == WordRepresentation::Word32()
+                 ? SupportedOperations::word32_ctz()
+                 : SupportedOperations::word64_ctz();
+    case Kind::kPopCount:
+      return rep == WordRepresentation::Word32()
+                 ? SupportedOperations::word32_popcnt()
+                 : SupportedOperations::word64_popcnt();
   }
 }
 
@@ -155,18 +200,14 @@ std::ostream& operator<<(std::ostream& os, ComparisonOp::Kind kind) {
 
 std::ostream& operator<<(std::ostream& os, ChangeOp::Kind kind) {
   switch (kind) {
-    case ChangeOp::Kind::kSignedNarrowing:
-      return os << "SignedNarrowing";
-    case ChangeOp::Kind::kUnsignedNarrowing:
-      return os << "UnsignedNarrowing";
     case ChangeOp::Kind::kFloatConversion:
       return os << "FloatConversion";
-    case ChangeOp::Kind::kSignedFloatTruncate:
-      return os << "SignedFloatTruncate";
     case ChangeOp::Kind::kJSFloatTruncate:
       return os << "JSFloatTruncate";
     case ChangeOp::Kind::kSignedFloatTruncateOverflowToMin:
       return os << "SignedFloatTruncateOverflowToMin";
+    case ChangeOp::Kind::kUnsignedFloatTruncateOverflowToMin:
+      return os << "UnsignedFloatTruncateOverflowToMin";
     case ChangeOp::Kind::kSignedToFloat:
       return os << "SignedToFloat";
     case ChangeOp::Kind::kUnsignedToFloat:
@@ -184,6 +225,26 @@ std::ostream& operator<<(std::ostream& os, ChangeOp::Kind kind) {
   }
 }
 
+std::ostream& operator<<(std::ostream& os, TryChangeOp::Kind kind) {
+  switch (kind) {
+    case TryChangeOp::Kind::kSignedFloatTruncateOverflowUndefined:
+      return os << "SignedFloatTruncateOverflowUndefined";
+    case TryChangeOp::Kind::kUnsignedFloatTruncateOverflowUndefined:
+      return os << "UnsignedFloatTruncateOverflowUndefined";
+  }
+}
+
+std::ostream& operator<<(std::ostream& os, ChangeOp::Assumption assumption) {
+  switch (assumption) {
+    case ChangeOp::Assumption::kNoAssumption:
+      return os << "NoAssumption";
+    case ChangeOp::Assumption::kNoOverflow:
+      return os << "NoOverflow";
+    case ChangeOp::Assumption::kReversible:
+      return os << "Reversible";
+  }
+}
+
 std::ostream& operator<<(std::ostream& os, Float64InsertWord32Op::Kind kind) {
   switch (kind) {
     case Float64InsertWord32Op::Kind::kLowHalf:
@@ -249,6 +310,14 @@ void ConstantOp::PrintOptions(std::ostream& os) const {
     case Kind::kCompressedHeapObject:
       os << "compressed heap object: " << handle();
       break;
+    case Kind::kRelocatableWasmCall:
+      os << "relocatable wasm call: 0x"
+         << reinterpret_cast<void*>(storage.integral);
+      break;
+    case Kind::kRelocatableWasmStubCall:
+      os << "relocatable wasm stub call: 0x"
+         << reinterpret_cast<void*>(storage.integral);
+      break;
   }
   os << "]";
 }
@@ -465,8 +534,8 @@ std::ostream& operator<<(std::ostream& os, OpProperties opProperties) {
     os << "Reading";
   } else if (opProperties == OpProperties::Writing()) {
     os << "Writing";
-  } else if (opProperties == OpProperties::CanDeopt()) {
-    os << "CanDeopt";
+  } else if (opProperties == OpProperties::CanAbort()) {
+    os << "CanAbort";
   } else if (opProperties == OpProperties::AnySideEffects()) {
     os << "AnySideEffects";
   } else if (opProperties == OpProperties::BlockTerminator()) {
diff --git a/deps/v8/src/compiler/turboshaft/operations.h b/deps/v8/src/compiler/turboshaft/operations.h
index 6e6cae783c3931..d7f49e9bc58e34 100644
--- a/deps/v8/src/compiler/turboshaft/operations.h
+++ b/deps/v8/src/compiler/turboshaft/operations.h
@@ -13,21 +13,18 @@
 #include <type_traits>
 #include <utility>
 
-#include "src/base/functional.h"
 #include "src/base/logging.h"
 #include "src/base/macros.h"
 #include "src/base/platform/mutex.h"
-#include "src/base/small-vector.h"
 #include "src/base/template-utils.h"
 #include "src/base/vector.h"
 #include "src/codegen/external-reference.h"
-#include "src/codegen/machine-type.h"
 #include "src/common/globals.h"
 #include "src/compiler/globals.h"
 #include "src/compiler/turboshaft/fast-hash.h"
+#include "src/compiler/turboshaft/representations.h"
 #include "src/compiler/turboshaft/utils.h"
 #include "src/compiler/write-barrier-kind.h"
-#include "src/zone/zone.h"
 
 namespace v8::internal {
 class HeapObject;
@@ -37,6 +34,7 @@ class CallDescriptor;
 class DeoptimizeParameters;
 class FrameStateInfo;
 class Node;
+enum class TrapId : uint32_t;
 }  // namespace v8::internal::compiler
 namespace v8::internal::compiler::turboshaft {
 class Block;
@@ -72,14 +70,18 @@ class Graph;
   V(Equal)                           \
   V(Comparison)                      \
   V(Change)                          \
+  V(TryChange)                       \
   V(Float64InsertWord32)             \
   V(TaggedBitcast)                   \
+  V(Select)                          \
   V(PendingLoopPhi)                  \
   V(Constant)                        \
   V(Load)                            \
   V(IndexedLoad)                     \
+  V(ProtectedLoad)                   \
   V(Store)                           \
   V(IndexedStore)                    \
+  V(ProtectedStore)                  \
   V(Retain)                          \
   V(Parameter)                       \
   V(OsrValue)                        \
@@ -90,9 +92,11 @@ class Graph;
   V(CheckLazyDeopt)                  \
   V(Deoptimize)                      \
   V(DeoptimizeIf)                    \
+  V(TrapIf)                          \
   V(Phi)                             \
   V(FrameState)                      \
   V(Call)                            \
+  V(TailCall)                        \
   V(Unreachable)                     \
   V(Return)                          \
   V(Branch)                          \
@@ -251,7 +255,7 @@ struct OpProperties {
   static constexpr OpProperties Writing() {
     return {false, true, false, false};
   }
-  static constexpr OpProperties CanDeopt() {
+  static constexpr OpProperties CanAbort() {
     return {false, false, true, false};
   }
   static constexpr OpProperties AnySideEffects() {
@@ -260,6 +264,15 @@ struct OpProperties {
   static constexpr OpProperties BlockTerminator() {
     return {false, false, false, true};
   }
+  static constexpr OpProperties BlockTerminatorWithAnySideEffect() {
+    return {true, true, true, true};
+  }
+  static constexpr OpProperties ReadingAndCanAbort() {
+    return {true, false, true, false};
+  }
+  static constexpr OpProperties WritingAndCanAbort() {
+    return {false, true, true, false};
+  }
   bool operator==(const OpProperties& other) const {
     return can_read == other.can_read && can_write == other.can_write &&
            can_abort == other.can_abort &&
@@ -562,7 +575,7 @@ struct WordBinopOp : FixedArityOperationT<2, WordBinopOp> {
     kUnsignedMod,
   };
   Kind kind;
-  MachineRepresentation rep;
+  WordRepresentation rep;
 
   static constexpr OpProperties properties = OpProperties::Pure();
 
@@ -588,10 +601,7 @@ struct WordBinopOp : FixedArityOperationT<2, WordBinopOp> {
     }
   }
 
-  static bool IsAssociative(Kind kind, MachineRepresentation rep) {
-    if (IsFloatingPoint(rep)) {
-      return false;
-    }
+  static bool IsAssociative(Kind kind) {
     switch (kind) {
       case Kind::kAdd:
       case Kind::kMul:
@@ -630,14 +640,8 @@ struct WordBinopOp : FixedArityOperationT<2, WordBinopOp> {
     }
   }
 
-  WordBinopOp(OpIndex left, OpIndex right, Kind kind, MachineRepresentation rep)
-      : Base(left, right), kind(kind), rep(rep) {
-    DCHECK_EQ(rep, any_of(MachineRepresentation::kWord32,
-                          MachineRepresentation::kWord64));
-    DCHECK_IMPLIES(kind == any_of(Kind::kSignedMulOverflownBits,
-                                  Kind::kUnsignedMulOverflownBits),
-                   rep == MachineRepresentation::kWord32);
-  }
+  WordBinopOp(OpIndex left, OpIndex right, Kind kind, WordRepresentation rep)
+      : Base(left, right), kind(kind), rep(rep) {}
   auto options() const { return std::tuple{kind, rep}; }
   void PrintOptions(std::ostream& os) const;
 };
@@ -655,7 +659,7 @@ struct FloatBinopOp : FixedArityOperationT<2, FloatBinopOp> {
     kAtan2,
   };
   Kind kind;
-  MachineRepresentation rep;
+  FloatRepresentation rep;
 
   static constexpr OpProperties properties = OpProperties::Pure();
 
@@ -678,13 +682,10 @@ struct FloatBinopOp : FixedArityOperationT<2, FloatBinopOp> {
     }
   }
 
-  FloatBinopOp(OpIndex left, OpIndex right, Kind kind,
-               MachineRepresentation rep)
+  FloatBinopOp(OpIndex left, OpIndex right, Kind kind, FloatRepresentation rep)
       : Base(left, right), kind(kind), rep(rep) {
-    DCHECK_EQ(rep, any_of(MachineRepresentation::kFloat32,
-                          MachineRepresentation::kFloat64));
     DCHECK_IMPLIES(kind == any_of(Kind::kPower, Kind::kAtan2, Kind::kMod),
-                   rep == MachineRepresentation::kFloat64);
+                   rep == FloatRepresentation::Float64());
   }
   auto options() const { return std::tuple{kind, rep}; }
   void PrintOptions(std::ostream& os) const;
@@ -698,7 +699,7 @@ struct OverflowCheckedBinopOp
     kSignedSub,
   };
   Kind kind;
-  MachineRepresentation rep;
+  WordRepresentation rep;
 
   static constexpr OpProperties properties = OpProperties::Pure();
 
@@ -716,10 +717,8 @@ struct OverflowCheckedBinopOp
   }
 
   OverflowCheckedBinopOp(OpIndex left, OpIndex right, Kind kind,
-                         MachineRepresentation rep)
-      : Base(left, right), kind(kind), rep(rep) {
-    DCHECK_EQ(rep, MachineRepresentation::kWord32);
-  }
+                         WordRepresentation rep)
+      : Base(left, right), kind(kind), rep(rep) {}
   auto options() const { return std::tuple{kind, rep}; }
   void PrintOptions(std::ostream& os) const;
 };
@@ -728,17 +727,22 @@ struct WordUnaryOp : FixedArityOperationT<1, WordUnaryOp> {
   enum class Kind : uint8_t {
     kReverseBytes,
     kCountLeadingZeros,
+    kCountTrailingZeros,
+    kPopCount,
+    kSignExtend8,
+    kSignExtend16,
   };
   Kind kind;
-  MachineRepresentation rep;
+  WordRepresentation rep;
   static constexpr OpProperties properties = OpProperties::Pure();
 
   OpIndex input() const { return Base::input(0); }
 
-  explicit WordUnaryOp(OpIndex input, Kind kind, MachineRepresentation rep)
+  static bool IsSupported(Kind kind, WordRepresentation rep);
+
+  explicit WordUnaryOp(OpIndex input, Kind kind, WordRepresentation rep)
       : Base(input), kind(kind), rep(rep) {
-    DCHECK_EQ(rep, any_of(MachineRepresentation::kWord32,
-                          MachineRepresentation::kWord64));
+    DCHECK(IsSupported(kind, rep));
   }
   auto options() const { return std::tuple{kind, rep}; }
 };
@@ -754,7 +758,11 @@ struct FloatUnaryOp : FixedArityOperationT<1, FloatUnaryOp> {
     kRoundToZero,    // round towards 0
     kRoundTiesEven,  // break ties by rounding towards the next even number
     kLog,
+    kLog2,
+    kLog10,
+    kLog1p,
     kSqrt,
+    kCbrt,
     kExp,
     kExpm1,
     kSin,
@@ -767,19 +775,19 @@ struct FloatUnaryOp : FixedArityOperationT<1, FloatUnaryOp> {
     kAcosh,
     kTan,
     kTanh,
+    kAtan,
+    kAtanh,
   };
   Kind kind;
-  MachineRepresentation rep;
+  FloatRepresentation rep;
   static constexpr OpProperties properties = OpProperties::Pure();
 
   OpIndex input() const { return Base::input(0); }
 
-  static bool IsSupported(Kind kind, MachineRepresentation rep);
+  static bool IsSupported(Kind kind, FloatRepresentation rep);
 
-  explicit FloatUnaryOp(OpIndex input, Kind kind, MachineRepresentation rep)
+  explicit FloatUnaryOp(OpIndex input, Kind kind, FloatRepresentation rep)
       : Base(input), kind(kind), rep(rep) {
-    DCHECK_EQ(rep, any_of(MachineRepresentation::kFloat32,
-                          MachineRepresentation::kFloat64));
     DCHECK(IsSupported(kind, rep));
   }
   auto options() const { return std::tuple{kind, rep}; }
@@ -796,7 +804,7 @@ struct ShiftOp : FixedArityOperationT<2, ShiftOp> {
     kRotateLeft
   };
   Kind kind;
-  MachineRepresentation rep;
+  WordRepresentation rep;
 
   static constexpr OpProperties properties = OpProperties::Pure();
 
@@ -830,29 +838,26 @@ struct ShiftOp : FixedArityOperationT<2, ShiftOp> {
     }
   }
 
-  ShiftOp(OpIndex left, OpIndex right, Kind kind, MachineRepresentation rep)
-      : Base(left, right), kind(kind), rep(rep) {
-    DCHECK_EQ(rep, any_of(MachineRepresentation::kWord32,
-                          MachineRepresentation::kWord64));
-  }
+  ShiftOp(OpIndex left, OpIndex right, Kind kind, WordRepresentation rep)
+      : Base(left, right), kind(kind), rep(rep) {}
   auto options() const { return std::tuple{kind, rep}; }
 };
 std::ostream& operator<<(std::ostream& os, ShiftOp::Kind kind);
 
 struct EqualOp : FixedArityOperationT<2, EqualOp> {
-  MachineRepresentation rep;
+  RegisterRepresentation rep;
 
   static constexpr OpProperties properties = OpProperties::Pure();
 
   OpIndex left() const { return input(0); }
   OpIndex right() const { return input(1); }
 
-  EqualOp(OpIndex left, OpIndex right, MachineRepresentation rep)
+  EqualOp(OpIndex left, OpIndex right, RegisterRepresentation rep)
       : Base(left, right), rep(rep) {
-    DCHECK(rep == MachineRepresentation::kWord32 ||
-           rep == MachineRepresentation::kWord64 ||
-           rep == MachineRepresentation::kFloat32 ||
-           rep == MachineRepresentation::kFloat64);
+    DCHECK(rep == any_of(RegisterRepresentation::Word32(),
+                         RegisterRepresentation::Word64(),
+                         RegisterRepresentation::Float32(),
+                         RegisterRepresentation::Float64()));
   }
   auto options() const { return std::tuple{rep}; }
 };
@@ -865,7 +870,7 @@ struct ComparisonOp : FixedArityOperationT<2, ComparisonOp> {
     kUnsignedLessThanOrEqual
   };
   Kind kind;
-  MachineRepresentation rep;
+  RegisterRepresentation rep;
 
   static constexpr OpProperties properties = OpProperties::Pure();
 
@@ -873,31 +878,50 @@ struct ComparisonOp : FixedArityOperationT<2, ComparisonOp> {
   OpIndex right() const { return input(1); }
 
   ComparisonOp(OpIndex left, OpIndex right, Kind kind,
-               MachineRepresentation rep)
+               RegisterRepresentation rep)
       : Base(left, right), kind(kind), rep(rep) {
-    DCHECK_EQ(rep, any_of(MachineRepresentation::kWord32,
-                          MachineRepresentation::kWord64,
-                          MachineRepresentation::kFloat32,
-                          MachineRepresentation::kFloat64));
+    DCHECK_EQ(rep, any_of(RegisterRepresentation::Word32(),
+                          RegisterRepresentation::Word64(),
+                          RegisterRepresentation::Float32(),
+                          RegisterRepresentation::Float64()));
+    DCHECK_IMPLIES(
+        rep == any_of(RegisterRepresentation::Float32(),
+                      RegisterRepresentation::Float64()),
+        kind == any_of(Kind::kSignedLessThan, Kind::kSignedLessThanOrEqual));
   }
   auto options() const { return std::tuple{kind, rep}; }
+
+  static bool IsSigned(Kind kind) {
+    switch (kind) {
+      case Kind::kSignedLessThan:
+      case Kind::kSignedLessThanOrEqual:
+        return true;
+      case Kind::kUnsignedLessThan:
+      case Kind::kUnsignedLessThanOrEqual:
+        return false;
+    }
+  }
+  static Kind SetSigned(Kind kind, bool is_signed) {
+    switch (kind) {
+      case Kind::kSignedLessThan:
+      case Kind::kUnsignedLessThan:
+        return is_signed ? Kind::kSignedLessThan : Kind::kUnsignedLessThan;
+      case Kind::kSignedLessThanOrEqual:
+      case Kind::kUnsignedLessThanOrEqual:
+        return is_signed ? Kind::kSignedLessThanOrEqual
+                         : Kind::kUnsignedLessThanOrEqual;
+    }
+  }
 };
 std::ostream& operator<<(std::ostream& os, ComparisonOp::Kind kind);
 
 struct ChangeOp : FixedArityOperationT<1, ChangeOp> {
   enum class Kind : uint8_t {
-    // narrowing means undefined behavior if value cannot be represented
-    // precisely
-    kSignedNarrowing,
-    kUnsignedNarrowing,
     // convert between different floating-point types
     kFloatConversion,
-    // conversion to signed integer, rounding towards zero,
-    // overflow behavior system-specific
-    kSignedFloatTruncate,
-    // like kSignedFloatTruncate, but overflow guaranteed to result in the
-    // minimal integer
+    // overflow guaranteed to result in the minimal integer
     kSignedFloatTruncateOverflowToMin,
+    kUnsignedFloatTruncateOverflowToMin,
     // JS semantics float64 to word32 truncation
     // https://tc39.es/ecma262/#sec-touint32
     kJSFloatTruncate,
@@ -914,20 +938,110 @@ struct ChangeOp : FixedArityOperationT<1, ChangeOp> {
     // preserve bits, change meaning
     kBitcast
   };
+  // Violated assumptions result in undefined behavior.
+  enum class Assumption : uint8_t {
+    kNoAssumption,
+    // Used for conversions from floating-point to integer, assumes that the
+    // value doesn't exceed the integer range.
+    kNoOverflow,
+    // Assume that the original value can be recovered by a corresponding
+    // reverse transformation.
+    kReversible,
+  };
   Kind kind;
-  MachineRepresentation from;
-  MachineRepresentation to;
+  // Reversible means undefined behavior if value cannot be represented
+  // precisely.
+  Assumption assumption;
+  RegisterRepresentation from;
+  RegisterRepresentation to;
+
+  static bool IsReversible(Kind kind, Assumption assumption,
+                           RegisterRepresentation from,
+                           RegisterRepresentation to, Kind reverse_kind,
+                           bool signalling_nan_possible) {
+    switch (kind) {
+      case Kind::kFloatConversion:
+        return from == RegisterRepresentation::Float32() &&
+               to == RegisterRepresentation::Float64() &&
+               reverse_kind == Kind::kFloatConversion &&
+               !signalling_nan_possible;
+      case Kind::kSignedFloatTruncateOverflowToMin:
+        return assumption == Assumption::kReversible &&
+               reverse_kind == Kind::kSignedToFloat;
+      case Kind::kUnsignedFloatTruncateOverflowToMin:
+        return assumption == Assumption::kReversible &&
+               reverse_kind == Kind::kUnsignedToFloat;
+      case Kind::kJSFloatTruncate:
+        return false;
+      case Kind::kSignedToFloat:
+        if (from == RegisterRepresentation::Word32() &&
+            to == RegisterRepresentation::Float64()) {
+          return reverse_kind == any_of(Kind::kSignedFloatTruncateOverflowToMin,
+                                        Kind::kJSFloatTruncate);
+        } else {
+          return assumption == Assumption::kReversible &&
+                 reverse_kind ==
+                     any_of(Kind::kSignedFloatTruncateOverflowToMin);
+        }
+      case Kind::kUnsignedToFloat:
+        if (from == RegisterRepresentation::Word32() &&
+            to == RegisterRepresentation::Float64()) {
+          return reverse_kind ==
+                 any_of(Kind::kUnsignedFloatTruncateOverflowToMin,
+                        Kind::kJSFloatTruncate);
+        } else {
+          return assumption == Assumption::kReversible &&
+                 reverse_kind == Kind::kUnsignedFloatTruncateOverflowToMin;
+        }
+      case Kind::kExtractHighHalf:
+      case Kind::kExtractLowHalf:
+      case Kind::kZeroExtend:
+      case Kind::kSignExtend:
+        return false;
+      case Kind::kBitcast:
+        return reverse_kind == Kind::kBitcast;
+    }
+  }
+
+  bool IsReversibleBy(Kind reverse_kind, bool signalling_nan_possible) const {
+    return IsReversible(kind, assumption, from, to, reverse_kind,
+                        signalling_nan_possible);
+  }
 
   static constexpr OpProperties properties = OpProperties::Pure();
 
   OpIndex input() const { return Base::input(0); }
 
-  ChangeOp(OpIndex input, Kind kind, MachineRepresentation from,
-           MachineRepresentation to)
+  ChangeOp(OpIndex input, Kind kind, Assumption assumption,
+           RegisterRepresentation from, RegisterRepresentation to)
+      : Base(input), kind(kind), assumption(assumption), from(from), to(to) {}
+  auto options() const { return std::tuple{kind, assumption, from, to}; }
+};
+std::ostream& operator<<(std::ostream& os, ChangeOp::Kind kind);
+std::ostream& operator<<(std::ostream& os, ChangeOp::Assumption assumption);
+
+// Perform a conversion and return a pair of the result and a bit if it was
+// successful.
+struct TryChangeOp : FixedArityOperationT<1, TryChangeOp> {
+  enum class Kind : uint8_t {
+    // The result of the truncation is undefined if the result is out of range.
+    kSignedFloatTruncateOverflowUndefined,
+    kUnsignedFloatTruncateOverflowUndefined,
+  };
+  Kind kind;
+  FloatRepresentation from;
+  WordRepresentation to;
+
+  static constexpr OpProperties properties = OpProperties::Pure();
+
+  OpIndex input() const { return Base::input(0); }
+
+  TryChangeOp(OpIndex input, Kind kind, FloatRepresentation from,
+              WordRepresentation to)
       : Base(input), kind(kind), from(from), to(to) {}
   auto options() const { return std::tuple{kind, from, to}; }
 };
-std::ostream& operator<<(std::ostream& os, ChangeOp::Kind kind);
+std::ostream& operator<<(std::ostream& os, TryChangeOp::Kind kind);
 
 // TODO(tebbi): Unify with other operations.
 struct Float64InsertWord32Op : FixedArityOperationT<2, Float64InsertWord32Op> {
@@ -946,28 +1060,52 @@ struct Float64InsertWord32Op : FixedArityOperationT<2, Float64InsertWord32Op> {
 std::ostream& operator<<(std::ostream& os, Float64InsertWord32Op::Kind kind);
 
 struct TaggedBitcastOp : FixedArityOperationT<1, TaggedBitcastOp> {
-  MachineRepresentation from;
-  MachineRepresentation to;
+  RegisterRepresentation from;
+  RegisterRepresentation to;
 
   // Due to moving GC, converting from or to pointers doesn't commute with GC.
   static constexpr OpProperties properties = OpProperties::Reading();
 
   OpIndex input() const { return Base::input(0); }
 
-  TaggedBitcastOp(OpIndex input, MachineRepresentation from,
-                  MachineRepresentation to)
-      : Base(input), from(from), to(to) {}
+  TaggedBitcastOp(OpIndex input, RegisterRepresentation from,
+                  RegisterRepresentation to)
+      : Base(input), from(from), to(to) {
+    DCHECK((from == RegisterRepresentation::PointerSized() &&
+            to == RegisterRepresentation::Tagged()) ||
+           (from == RegisterRepresentation::Tagged() &&
+            to == RegisterRepresentation::PointerSized()));
+  }
   auto options() const { return std::tuple{from, to}; }
 };
 
+struct SelectOp : FixedArityOperationT<3, SelectOp> {
+  // TODO(12783): Support all register reps.
+  WordRepresentation rep;
+  static constexpr OpProperties properties = OpProperties::Pure();
+
+  OpIndex condition() const { return Base::input(0); }
+  OpIndex left() const { return Base::input(1); }
+  OpIndex right() const { return Base::input(2); }
+
+  SelectOp(OpIndex condition, OpIndex left, OpIndex right,
+           WordRepresentation rep)
+      : Base(condition, left, right), rep(rep) {
+    DCHECK(rep == WordRepresentation::Word32()
+               ? SupportedOperations::word32_select()
+               : SupportedOperations::word64_select());
+  }
+  auto options() const { return std::tuple{rep}; }
+};
+
 struct PhiOp : OperationT<PhiOp> {
-  MachineRepresentation rep;
+  RegisterRepresentation rep;
 
   static constexpr OpProperties properties = OpProperties::Pure();
 
   static constexpr size_t kLoopPhiBackEdgeIndex = 1;
 
-  explicit PhiOp(base::Vector<const OpIndex> inputs, MachineRepresentation rep)
+  explicit PhiOp(base::Vector<const OpIndex> inputs, RegisterRepresentation rep)
       : Base(inputs), rep(rep) {}
   auto options() const { return std::tuple{rep}; }
 };
@@ -975,7 +1113,7 @@ struct PhiOp : OperationT<PhiOp> {
 // Only used when moving a loop phi to a new graph while the loop backedge has
 // not been emitted yet.
 struct PendingLoopPhiOp : FixedArityOperationT<1, PendingLoopPhiOp> {
-  MachineRepresentation rep;
+  RegisterRepresentation rep;
   union {
     // Used when transforming a Turboshaft graph.
     // This is not an input because it refers to the old graph.
@@ -988,12 +1126,12 @@ struct PendingLoopPhiOp : FixedArityOperationT<1, PendingLoopPhiOp> {
 
   OpIndex first() const { return input(0); }
 
-  PendingLoopPhiOp(OpIndex first, MachineRepresentation rep,
+  PendingLoopPhiOp(OpIndex first, RegisterRepresentation rep,
                    OpIndex old_backedge_index)
       : Base(first), rep(rep), old_backedge_index(old_backedge_index) {
     DCHECK(old_backedge_index.valid());
   }
-  PendingLoopPhiOp(OpIndex first, MachineRepresentation rep,
+  PendingLoopPhiOp(OpIndex first, RegisterRepresentation rep,
                    Node* old_backedge_node)
       : Base(first), rep(rep), old_backedge_node(old_backedge_node) {}
   std::tuple<> options() const { UNREACHABLE(); }
@@ -1010,7 +1148,9 @@ struct ConstantOp : FixedArityOperationT<0, ConstantOp> {
     kTaggedIndex,
     kExternal,
     kHeapObject,
-    kCompressedHeapObject
+    kCompressedHeapObject,
+    kRelocatableWasmCall,
+    kRelocatableWasmStubCall
   };
 
   Kind kind;
@@ -1030,24 +1170,26 @@ struct ConstantOp : FixedArityOperationT<0, ConstantOp> {
 
   static constexpr OpProperties properties = OpProperties::Pure();
 
-  MachineRepresentation Representation() const {
+  RegisterRepresentation Representation() const {
     switch (kind) {
       case Kind::kWord32:
-        return MachineRepresentation::kWord32;
+        return RegisterRepresentation::Word32();
       case Kind::kWord64:
-        return MachineRepresentation::kWord64;
+        return RegisterRepresentation::Word64();
       case Kind::kFloat32:
-        return MachineRepresentation::kFloat32;
+        return RegisterRepresentation::Float32();
       case Kind::kFloat64:
-        return MachineRepresentation::kFloat64;
+        return RegisterRepresentation::Float64();
       case Kind::kExternal:
       case Kind::kTaggedIndex:
-        return MachineType::PointerRepresentation();
+      case Kind::kRelocatableWasmCall:
+      case Kind::kRelocatableWasmStubCall:
+        return RegisterRepresentation::PointerSized();
       case Kind::kHeapObject:
       case Kind::kNumber:
-        return MachineRepresentation::kTagged;
+        return RegisterRepresentation::Tagged();
       case Kind::kCompressedHeapObject:
-        return MachineRepresentation::kCompressed;
+        return RegisterRepresentation::Compressed();
     }
   }
 
@@ -1055,11 +1197,13 @@ struct ConstantOp : FixedArityOperationT<0, ConstantOp> {
       : Base(), kind(kind), storage(storage) {
     DCHECK_IMPLIES(
         kind == Kind::kWord32,
-        storage.integral <= MaxUnsignedValue(MachineRepresentation::kWord32));
+        storage.integral <= WordRepresentation::Word32().MaxUnsignedValue());
   }
 
   uint64_t integral() const {
-    DCHECK(kind == Kind::kWord32 || kind == Kind::kWord64);
+    DCHECK(kind == Kind::kWord32 || kind == Kind::kWord64 ||
+           kind == Kind::kRelocatableWasmCall ||
+           kind == Kind::kRelocatableWasmStubCall);
     return storage.integral;
   }
 
@@ -1128,6 +1272,8 @@ struct ConstantOp : FixedArityOperationT<0, ConstantOp> {
       case Kind::kExternal:
       case Kind::kHeapObject:
       case Kind::kCompressedHeapObject:
+      case Kind::kRelocatableWasmCall:
+      case Kind::kRelocatableWasmStubCall:
         UNREACHABLE();
     }
   }
@@ -1146,6 +1292,8 @@ struct ConstantOp : FixedArityOperationT<0, ConstantOp> {
       case Kind::kExternal:
       case Kind::kHeapObject:
       case Kind::kCompressedHeapObject:
+      case Kind::kRelocatableWasmCall:
+      case Kind::kRelocatableWasmStubCall:
         UNREACHABLE();
     }
   }
@@ -1169,6 +1317,8 @@ struct ConstantOp : FixedArityOperationT<0, ConstantOp> {
       case Kind::kWord32:
       case Kind::kWord64:
       case Kind::kTaggedIndex:
+      case Kind::kRelocatableWasmCall:
+      case Kind::kRelocatableWasmStubCall:
         return fast_hash_combine(opcode, kind, storage.integral);
       case Kind::kFloat32:
         return fast_hash_combine(opcode, kind, storage.float32);
@@ -1188,6 +1338,8 @@ struct ConstantOp : FixedArityOperationT<0, ConstantOp> {
       case Kind::kWord32:
       case Kind::kWord64:
       case Kind::kTaggedIndex:
+      case Kind::kRelocatableWasmCall:
+      case Kind::kRelocatableWasmStubCall:
         return storage.integral == other.storage.integral;
       case Kind::kFloat32:
         // Using a bit_cast to uint32_t in order to return false when comparing
@@ -1217,20 +1369,34 @@ struct ConstantOp : FixedArityOperationT<0, ConstantOp> {
 // For Kind::tagged_base: subtract kHeapObjectTag,
 //                        `base` has to be the object start.
 // For (u)int8/16, the value will be sign- or zero-extended to Word32.
+// When result_rep is RegisterRepresentation::Compressed(), then the load does
+// not decompress the value.
 struct LoadOp : FixedArityOperationT<1, LoadOp> {
-  enum class Kind { kTaggedBase, kRawAligned, kRawUnaligned };
+  enum class Kind : uint8_t { kTaggedBase, kRawAligned, kRawUnaligned };
   Kind kind;
-  MachineType loaded_rep;
+  MemoryRepresentation loaded_rep;
+  RegisterRepresentation result_rep;
   int32_t offset;
 
   static constexpr OpProperties properties = OpProperties::Reading();
 
   OpIndex base() const { return input(0); }
 
-  LoadOp(OpIndex base, Kind kind, MachineType loaded_rep, int32_t offset)
-      : Base(base), kind(kind), loaded_rep(loaded_rep), offset(offset) {}
+  LoadOp(OpIndex base, Kind kind, MemoryRepresentation loaded_rep,
+         RegisterRepresentation result_rep, int32_t offset)
+      : Base(base),
+        kind(kind),
+        loaded_rep(loaded_rep),
+        result_rep(result_rep),
+        offset(offset) {
+    DCHECK(loaded_rep.ToRegisterRepresentation() == result_rep ||
+           (loaded_rep.IsTagged() &&
+            result_rep == RegisterRepresentation::Compressed()));
+  }
   void PrintOptions(std::ostream& os) const;
-  auto options() const { return std::tuple{kind, loaded_rep, offset}; }
+  auto options() const {
+    return std::tuple{kind, loaded_rep, result_rep, offset};
+  }
 };
 
 inline bool IsAlignedAccess(LoadOp::Kind kind) {
@@ -1247,10 +1413,13 @@ inline bool IsAlignedAccess(LoadOp::Kind kind) {
 // For Kind::tagged_base: subtract kHeapObjectTag,
 //                        `base` has to be the object start.
 // For (u)int8/16, the value will be sign- or zero-extended to Word32.
+// When result_rep is RegisterRepresentation::Compressed(), then the load does
+// not decompress the value.
 struct IndexedLoadOp : FixedArityOperationT<2, IndexedLoadOp> {
   using Kind = LoadOp::Kind;
   Kind kind;
-  MachineType loaded_rep;
+  MemoryRepresentation loaded_rep;
+  RegisterRepresentation result_rep;
   uint8_t element_size_log2;  // multiply index with 2^element_size_log2
   int32_t offset;             // add offset to scaled index
 
@@ -1259,26 +1428,55 @@ struct IndexedLoadOp : FixedArityOperationT<2, IndexedLoadOp> {
   OpIndex base() const { return input(0); }
   OpIndex index() const { return input(1); }
 
-  IndexedLoadOp(OpIndex base, OpIndex index, Kind kind, MachineType loaded_rep,
-                int32_t offset, uint8_t element_size_log2)
+  IndexedLoadOp(OpIndex base, OpIndex index, Kind kind,
+                MemoryRepresentation loaded_rep,
+                RegisterRepresentation result_rep, int32_t offset,
+                uint8_t element_size_log2)
       : Base(base, index),
         kind(kind),
         loaded_rep(loaded_rep),
+        result_rep(result_rep),
         element_size_log2(element_size_log2),
-        offset(offset) {}
+        offset(offset) {
+    DCHECK(loaded_rep.ToRegisterRepresentation() == result_rep ||
+           (loaded_rep.IsTagged() &&
+            result_rep == RegisterRepresentation::Compressed()));
+  }
   void PrintOptions(std::ostream& os) const;
   auto options() const {
     return std::tuple{kind, loaded_rep, offset, element_size_log2};
   }
 };
 
+// A protected load registers a trap handler which handles out-of-bounds memory
+// accesses.
+struct ProtectedLoadOp : FixedArityOperationT<2, ProtectedLoadOp> {
+  MemoryRepresentation loaded_rep;
+  RegisterRepresentation result_rep;
+
+  static constexpr OpProperties properties = OpProperties::ReadingAndCanAbort();
+
+  OpIndex base() const { return input(0); }
+  OpIndex index() const { return input(1); }
+
+  ProtectedLoadOp(OpIndex base, OpIndex index, MemoryRepresentation loaded_rep,
+                  RegisterRepresentation result_rep)
+      : Base(base, index), loaded_rep(loaded_rep), result_rep(result_rep) {
+    DCHECK(loaded_rep.ToRegisterRepresentation() == result_rep ||
+           (loaded_rep.IsTagged() &&
+            result_rep == RegisterRepresentation::Compressed()));
+  }
+
+  auto options() const { return std::tuple{loaded_rep, result_rep}; }
+};
+
 // Store `value` to: base + offset.
 // For Kind::tagged_base: subtract kHeapObjectTag,
 //                        `base` has to be the object start.
 struct StoreOp : FixedArityOperationT<2, StoreOp> {
   using Kind = LoadOp::Kind;
   Kind kind;
-  MachineRepresentation stored_rep;
+  MemoryRepresentation stored_rep;
   WriteBarrierKind write_barrier;
   int32_t offset;
 
@@ -1288,7 +1486,7 @@ struct StoreOp : FixedArityOperationT<2, StoreOp> {
   OpIndex value() const { return input(1); }
 
   StoreOp(OpIndex base, OpIndex value, Kind kind,
-          MachineRepresentation stored_rep, WriteBarrierKind write_barrier,
+          MemoryRepresentation stored_rep, WriteBarrierKind write_barrier,
           int32_t offset)
       : Base(base, value),
         kind(kind),
@@ -1307,7 +1505,7 @@ struct StoreOp : FixedArityOperationT<2, StoreOp> {
 struct IndexedStoreOp : FixedArityOperationT<3, IndexedStoreOp> {
   using Kind = StoreOp::Kind;
   Kind kind;
-  MachineRepresentation stored_rep;
+  MemoryRepresentation stored_rep;
   WriteBarrierKind write_barrier;
   uint8_t element_size_log2;  // multiply index with 2^element_size_log2
   int32_t offset;             // add offset to scaled index
@@ -1319,7 +1517,7 @@ struct IndexedStoreOp : FixedArityOperationT<3, IndexedStoreOp> {
   OpIndex value() const { return input(2); }
 
   IndexedStoreOp(OpIndex base, OpIndex index, OpIndex value, Kind kind,
-                 MachineRepresentation stored_rep,
+                 MemoryRepresentation stored_rep,
                  WriteBarrierKind write_barrier, int32_t offset,
                  uint8_t element_size_log2)
       : Base(base, index, value),
@@ -1335,6 +1533,23 @@ struct IndexedStoreOp : FixedArityOperationT<3, IndexedStoreOp> {
   }
 };
 
+// A protected store registers a trap handler which handles out-of-bounds memory
+// accesses.
+struct ProtectedStoreOp : FixedArityOperationT<3, ProtectedStoreOp> {
+  MemoryRepresentation stored_rep;
+
+  static constexpr OpProperties properties = OpProperties::WritingAndCanAbort();
+
+  OpIndex base() const { return input(0); }
+  OpIndex index() const { return input(1); }
+  OpIndex value() const { return input(2); }
+
+  ProtectedStoreOp(OpIndex base, OpIndex index, OpIndex value,
+                   MemoryRepresentation stored_rep)
+      : Base(base, index, value), stored_rep(stored_rep) {}
+  auto options() const { return std::tuple{stored_rep}; }
+};
+
 // Retain a HeapObject to prevent it from being garbage collected too early.
 struct RetainOp : FixedArityOperationT<1, RetainOp> {
   OpIndex retained() const { return input(0); }
@@ -1415,7 +1630,7 @@ struct FrameStateOp : OperationT<FrameStateOp> {
 // Semantically, it deopts if the current code object has been
 // deoptimized. But this might also be implemented differently.
 struct CheckLazyDeoptOp : FixedArityOperationT<2, CheckLazyDeoptOp> {
-  static constexpr OpProperties properties = OpProperties::CanDeopt();
+  static constexpr OpProperties properties = OpProperties::CanAbort();
 
   OpIndex call() const { return input(0); }
   OpIndex frame_state() const { return input(1); }
@@ -1441,7 +1656,7 @@ struct DeoptimizeIfOp : FixedArityOperationT<2, DeoptimizeIfOp> {
   bool negated;
   const DeoptimizeParameters* parameters;
 
-  static constexpr OpProperties properties = OpProperties::CanDeopt();
+  static constexpr OpProperties properties = OpProperties::CanAbort();
 
   OpIndex condition() const { return input(0); }
   OpIndex frame_state() const { return input(1); }
@@ -1454,6 +1669,19 @@ struct DeoptimizeIfOp : FixedArityOperationT<2, DeoptimizeIfOp> {
   auto options() const { return std::tuple{negated, parameters}; }
 };
 
+struct TrapIfOp : FixedArityOperationT<1, TrapIfOp> {
+  bool negated;
+  const TrapId trap_id;
+
+  static constexpr OpProperties properties = OpProperties::CanAbort();
+
+  OpIndex condition() const { return input(0); }
+
+  TrapIfOp(OpIndex condition, bool negated, const TrapId trap_id)
+      : Base(condition), negated(negated), trap_id(trap_id) {}
+  auto options() const { return std::tuple{negated, trap_id}; }
+};
+
 struct ParameterOp : FixedArityOperationT<0, ParameterOp> {
   int32_t parameter_index;
   const char* debug_name;
@@ -1501,6 +1729,33 @@ struct CallOp : OperationT<CallOp> {
   auto options() const { return std::tuple{descriptor}; }
 };
 
+struct TailCallOp : OperationT<TailCallOp> {
+  const CallDescriptor* descriptor;
+
+  static constexpr OpProperties properties =
+      OpProperties::BlockTerminatorWithAnySideEffect();
+
+  OpIndex callee() const { return input(0); }
+  base::Vector<const OpIndex> arguments() const {
+    return inputs().SubVector(1, input_count);
+  }
+
+  TailCallOp(OpIndex callee, base::Vector<const OpIndex> arguments,
+             const CallDescriptor* descriptor)
+      : Base(1 + arguments.size()), descriptor(descriptor) {
+    base::Vector<OpIndex> inputs = this->inputs();
+    inputs[0] = callee;
+    inputs.SubVector(1, inputs.size()).OverwriteWith(arguments);
+  }
+  static TailCallOp& New(Graph* graph, OpIndex callee,
+                         base::Vector<const OpIndex> arguments,
+                         const CallDescriptor* descriptor) {
+    return Base::New(graph, 1 + arguments.size(), callee, arguments,
+                     descriptor);
+  }
+  auto options() const { return std::tuple{descriptor}; }
+};
+
 // Control-flow should never reach here.
 struct UnreachableOp : FixedArityOperationT<0, UnreachableOp> {
   static constexpr OpProperties properties = OpProperties::BlockTerminator();
diff --git a/deps/v8/src/compiler/turboshaft/optimization-phase.h b/deps/v8/src/compiler/turboshaft/optimization-phase.h
index 074e517c81af50..421612982aeb0f 100644
--- a/deps/v8/src/compiler/turboshaft/optimization-phase.h
+++ b/deps/v8/src/compiler/turboshaft/optimization-phase.h
@@ -111,7 +111,7 @@ class OptimizationPhase {
   static void Run(Graph* input, Zone* phase_zone, NodeOriginTable* origins,
                   VisitOrder visit_order = VisitOrder::kAsEmitted) {
     Impl phase{*input, phase_zone, origins, visit_order};
-    if (FLAG_turboshaft_trace_reduction) {
+    if (v8_flags.turboshaft_trace_reduction) {
       phase.template Run<true>();
     } else {
       phase.template Run<false>();
@@ -184,7 +184,6 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl {
   template <bool trace_reduction>
   void RunDominatorOrder() {
     base::SmallVector<Block*, 128> dominator_visit_stack;
-    input_graph.GenerateDominatorTree();
 
     dominator_visit_stack.push_back(input_graph.GetPtr(0));
     while (!dominator_visit_stack.empty()) {
@@ -208,6 +207,19 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl {
     }
     if (!assembler.Bind(MapToNewGraph(input_block.index()))) {
       if constexpr (trace_reduction) TraceBlockUnreachable();
+      // If we eliminate a loop backedge, we need to turn the loop into a
+      // single-predecessor merge block.
+      const Operation& last_op =
+          *base::Reversed(input_graph.operations(input_block)).begin();
+      if (auto* final_goto = last_op.TryCast<GotoOp>()) {
+        if (final_goto->destination->IsLoop()) {
+          Block* new_loop = MapToNewGraph(final_goto->destination->index());
+          DCHECK(new_loop->IsLoop());
+          if (new_loop->IsLoop() && new_loop->PredecessorCount() == 1) {
+            assembler.graph().TurnLoopIntoMerge(new_loop);
+          }
+        }
+      }
       assembler.ExitBlock(input_block);
       return;
     }
@@ -290,12 +302,13 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl {
 
   V8_INLINE OpIndex ReduceGoto(const GotoOp& op) {
     Block* destination = MapToNewGraph(op.destination->index());
+    assembler.current_block()->SetOrigin(current_input_block);
+    assembler.Goto(destination);
     if (destination->IsBound()) {
       DCHECK(destination->IsLoop());
       FixLoopPhis(destination);
     }
-    assembler.current_block()->SetOrigin(current_input_block);
-    return assembler.Goto(destination);
+    return OpIndex::Invalid();
   }
   V8_INLINE OpIndex ReduceBranch(const BranchOp& op) {
     Block* if_true = MapToNewGraph(op.if_true->index());
@@ -402,6 +415,11 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl {
     auto arguments = MapToNewGraph<16>(op.arguments());
     return assembler.Call(callee, base::VectorOf(arguments), op.descriptor);
   }
+  OpIndex ReduceTailCall(const TailCallOp& op) {
+    OpIndex callee = MapToNewGraph(op.callee());
+    auto arguments = MapToNewGraph<16>(op.arguments());
+    return assembler.TailCall(callee, base::VectorOf(arguments), op.descriptor);
+  }
   OpIndex ReduceReturn(const ReturnOp& op) {
     // We very rarely have tuples longer than 4.
     auto return_values = MapToNewGraph<4>(op.return_values());
@@ -431,8 +449,14 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl {
                                 MapToNewGraph(op.right()), op.kind, op.rep);
   }
   OpIndex ReduceChange(const ChangeOp& op) {
-    return assembler.Change(MapToNewGraph(op.input()), op.kind, op.from, op.to);
+    return assembler.Change(MapToNewGraph(op.input()), op.kind, op.assumption,
+                            op.from, op.to);
+  }
+  OpIndex ReduceTryChange(const TryChangeOp& op) {
+    return assembler.TryChange(MapToNewGraph(op.input()), op.kind, op.from,
+                               op.to);
   }
+
   OpIndex ReduceFloat64InsertWord32(const Float64InsertWord32Op& op) {
     return assembler.Float64InsertWord32(MapToNewGraph(op.float64()),
                                          MapToNewGraph(op.word32()), op.kind);
@@ -440,17 +464,27 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl {
   OpIndex ReduceTaggedBitcast(const TaggedBitcastOp& op) {
     return assembler.TaggedBitcast(MapToNewGraph(op.input()), op.from, op.to);
   }
+  OpIndex ReduceSelect(const SelectOp& op) {
+    return assembler.Select(MapToNewGraph(op.condition()),
+                            MapToNewGraph(op.left()), MapToNewGraph(op.right()),
+                            op.rep);
+  }
   OpIndex ReduceConstant(const ConstantOp& op) {
     return assembler.Constant(op.kind, op.storage);
   }
   OpIndex ReduceLoad(const LoadOp& op) {
     return assembler.Load(MapToNewGraph(op.base()), op.kind, op.loaded_rep,
-                          op.offset);
+                          op.result_rep, op.offset);
   }
   OpIndex ReduceIndexedLoad(const IndexedLoadOp& op) {
     return assembler.IndexedLoad(
         MapToNewGraph(op.base()), MapToNewGraph(op.index()), op.kind,
-        op.loaded_rep, op.offset, op.element_size_log2);
+        op.loaded_rep, op.result_rep, op.offset, op.element_size_log2);
+  }
+  OpIndex ReduceProtectedLoad(const ProtectedLoadOp& op) {
+    return assembler.ProtectedLoad(MapToNewGraph(op.base()),
+                                   MapToNewGraph(op.index()), op.loaded_rep,
+                                   op.result_rep);
   }
   OpIndex ReduceStore(const StoreOp& op) {
     return assembler.Store(MapToNewGraph(op.base()), MapToNewGraph(op.value()),
@@ -462,6 +496,11 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl {
         MapToNewGraph(op.value()), op.kind, op.stored_rep, op.write_barrier,
         op.offset, op.element_size_log2);
   }
+  OpIndex ReduceProtectedStore(const ProtectedStoreOp& op) {
+    return assembler.ProtectedStore(MapToNewGraph(op.base()),
+                                    MapToNewGraph(op.index()),
+                                    MapToNewGraph(op.value()), op.stored_rep);
+  }
   OpIndex ReduceRetain(const RetainOp& op) {
     return assembler.Retain(MapToNewGraph(op.retained()));
   }
@@ -493,6 +532,10 @@ struct OptimizationPhase<Analyzer, Assembler>::Impl {
                                   MapToNewGraph(op.frame_state()), op.negated,
                                   op.parameters);
   }
+  OpIndex ReduceTrapIf(const TrapIfOp& op) {
+    return assembler.TrapIf(MapToNewGraph(op.condition()), op.negated,
+                            op.trap_id);
+  }
   OpIndex ReduceTuple(const TupleOp& op) {
     return assembler.Tuple(base::VectorOf(MapToNewGraph<4>(op.inputs())));
   }
diff --git a/deps/v8/src/compiler/turboshaft/recreate-schedule.cc b/deps/v8/src/compiler/turboshaft/recreate-schedule.cc
index 52ee5369ca30f5..e8c2563909cb48 100644
--- a/deps/v8/src/compiler/turboshaft/recreate-schedule.cc
+++ b/deps/v8/src/compiler/turboshaft/recreate-schedule.cc
@@ -88,6 +88,13 @@ struct ScheduleBuilder {
     return AddNode(machine.Is64() ? machine.Word64Shl() : machine.Word32Shl(),
                    {a, b});
   }
+  Node* RelocatableIntPtrConstant(intptr_t value, RelocInfo::Mode mode) {
+    return AddNode(machine.Is64()
+                       ? common.RelocatableInt64Constant(value, mode)
+                       : common.RelocatableInt32Constant(
+                             base::checked_cast<int32_t>(value), mode),
+                   {});
+  }
   void ProcessOperation(const Operation& op);
 #define DECL_PROCESS_OPERATION(Name) Node* ProcessOperation(const Name##Op& op);
   TURBOSHAFT_OPERATION_LIST(DECL_PROCESS_OPERATION)
@@ -168,8 +175,8 @@ void ScheduleBuilder::ProcessOperation(const Operation& op) {
 Node* ScheduleBuilder::ProcessOperation(const WordBinopOp& op) {
   using Kind = WordBinopOp::Kind;
   const Operator* o;
-  switch (op.rep) {
-    case MachineRepresentation::kWord32:
+  switch (op.rep.value()) {
+    case WordRepresentation::Word32():
       switch (op.kind) {
         case Kind::kAdd:
           o = machine.Int32Add();
@@ -209,7 +216,7 @@ Node* ScheduleBuilder::ProcessOperation(const WordBinopOp& op) {
           break;
       }
       break;
-    case MachineRepresentation::kWord64:
+    case WordRepresentation::Word64():
       switch (op.kind) {
         case Kind::kAdd:
           o = machine.Int64Add();
@@ -242,8 +249,11 @@ Node* ScheduleBuilder::ProcessOperation(const WordBinopOp& op) {
           o = machine.Word64Xor();
           break;
         case Kind::kSignedMulOverflownBits:
+          o = machine.Int64MulHigh();
+          break;
         case Kind::kUnsignedMulOverflownBits:
-          UNREACHABLE();
+          o = machine.Uint64MulHigh();
+          break;
       }
       break;
     default:
@@ -254,8 +264,8 @@ Node* ScheduleBuilder::ProcessOperation(const WordBinopOp& op) {
 Node* ScheduleBuilder::ProcessOperation(const FloatBinopOp& op) {
   using Kind = FloatBinopOp::Kind;
   const Operator* o;
-  switch (op.rep) {
-    case MachineRepresentation::kFloat32:
+  switch (op.rep.value()) {
+    case FloatRepresentation::Float32():
       switch (op.kind) {
         case Kind::kAdd:
           o = machine.Float32Add();
@@ -281,7 +291,7 @@ Node* ScheduleBuilder::ProcessOperation(const FloatBinopOp& op) {
           UNREACHABLE();
       }
       break;
-    case MachineRepresentation::kFloat64:
+    case FloatRepresentation::Float64():
       switch (op.kind) {
         case Kind::kAdd:
           o = machine.Float64Add();
@@ -320,8 +330,8 @@ Node* ScheduleBuilder::ProcessOperation(const FloatBinopOp& op) {
 
 Node* ScheduleBuilder::ProcessOperation(const OverflowCheckedBinopOp& op) {
   const Operator* o;
-  switch (op.rep) {
-    case MachineRepresentation::kWord32:
+  switch (op.rep.value()) {
+    case WordRepresentation::Word32():
       switch (op.kind) {
         case OverflowCheckedBinopOp::Kind::kSignedAdd:
           o = machine.Int32AddWithOverflow();
@@ -334,7 +344,7 @@ Node* ScheduleBuilder::ProcessOperation(const OverflowCheckedBinopOp& op) {
           break;
       }
       break;
-    case MachineRepresentation::kWord64:
+    case WordRepresentation::Word64():
       switch (op.kind) {
         case OverflowCheckedBinopOp::Kind::kSignedAdd:
           o = machine.Int64AddWithOverflow();
@@ -352,9 +362,7 @@ Node* ScheduleBuilder::ProcessOperation(const OverflowCheckedBinopOp& op) {
   return AddNode(o, {GetNode(op.left()), GetNode(op.right())});
 }
 Node* ScheduleBuilder::ProcessOperation(const WordUnaryOp& op) {
-  DCHECK(op.rep == MachineRepresentation::kWord32 ||
-         op.rep == MachineRepresentation::kWord64);
-  bool word64 = op.rep == MachineRepresentation::kWord64;
+  bool word64 = op.rep == WordRepresentation::Word64();
   const Operator* o;
   switch (op.kind) {
     case WordUnaryOp::Kind::kReverseBytes:
@@ -363,13 +371,25 @@ Node* ScheduleBuilder::ProcessOperation(const WordUnaryOp& op) {
     case WordUnaryOp::Kind::kCountLeadingZeros:
       o = word64 ? machine.Word64Clz() : machine.Word32Clz();
       break;
+    case WordUnaryOp::Kind::kCountTrailingZeros:
+      o = word64 ? machine.Word64Ctz().op() : machine.Word32Ctz().op();
+      break;
+    case WordUnaryOp::Kind::kPopCount:
+      o = word64 ? machine.Word64Popcnt().op() : machine.Word32Popcnt().op();
+      break;
+    case WordUnaryOp::Kind::kSignExtend8:
+      o = word64 ? machine.SignExtendWord8ToInt64()
+                 : machine.SignExtendWord8ToInt32();
+      break;
+    case WordUnaryOp::Kind::kSignExtend16:
+      o = word64 ? machine.SignExtendWord16ToInt64()
+                 : machine.SignExtendWord16ToInt32();
+      break;
   }
   return AddNode(o, {GetNode(op.input())});
 }
 Node* ScheduleBuilder::ProcessOperation(const FloatUnaryOp& op) {
-  DCHECK(op.rep == MachineRepresentation::kFloat32 ||
-         op.rep == MachineRepresentation::kFloat64);
-  bool float64 = op.rep == MachineRepresentation::kFloat64;
+  bool float64 = op.rep == FloatRepresentation::Float64();
   const Operator* o;
   switch (op.kind) {
     case FloatUnaryOp::Kind::kAbs:
@@ -398,68 +418,92 @@ Node* ScheduleBuilder::ProcessOperation(const FloatUnaryOp& op) {
       o = float64 ? machine.Float64Sqrt() : machine.Float32Sqrt();
       break;
     case FloatUnaryOp::Kind::kSilenceNaN:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64SilenceNaN();
       break;
     case FloatUnaryOp::Kind::kLog:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Log();
       break;
     case FloatUnaryOp::Kind::kExp:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Exp();
       break;
     case FloatUnaryOp::Kind::kExpm1:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Expm1();
       break;
     case FloatUnaryOp::Kind::kSin:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Sin();
       break;
     case FloatUnaryOp::Kind::kCos:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Cos();
       break;
     case FloatUnaryOp::Kind::kAsin:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Asin();
       break;
     case FloatUnaryOp::Kind::kAcos:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Acos();
       break;
     case FloatUnaryOp::Kind::kSinh:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Sinh();
       break;
     case FloatUnaryOp::Kind::kCosh:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Cosh();
       break;
     case FloatUnaryOp::Kind::kAsinh:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Asinh();
       break;
     case FloatUnaryOp::Kind::kAcosh:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Acosh();
       break;
     case FloatUnaryOp::Kind::kTan:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Tan();
       break;
     case FloatUnaryOp::Kind::kTanh:
-      DCHECK_EQ(op.rep, MachineRepresentation::kFloat64);
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
       o = machine.Float64Tanh();
       break;
+    case FloatUnaryOp::Kind::kLog2:
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
+      o = machine.Float64Log2();
+      break;
+    case FloatUnaryOp::Kind::kLog10:
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
+      o = machine.Float64Log10();
+      break;
+    case FloatUnaryOp::Kind::kLog1p:
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
+      o = machine.Float64Log1p();
+      break;
+    case FloatUnaryOp::Kind::kAtan:
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
+      o = machine.Float64Atan();
+      break;
+    case FloatUnaryOp::Kind::kAtanh:
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
+      o = machine.Float64Atanh();
+      break;
+    case FloatUnaryOp::Kind::kCbrt:
+      DCHECK_EQ(op.rep, FloatRepresentation::Float64());
+      o = machine.Float64Cbrt();
+      break;
   }
   return AddNode(o, {GetNode(op.input())});
 }
 Node* ScheduleBuilder::ProcessOperation(const ShiftOp& op) {
-  DCHECK(op.rep == MachineRepresentation::kWord32 ||
-         op.rep == MachineRepresentation::kWord64);
-  bool word64 = op.rep == MachineRepresentation::kWord64;
+  DCHECK(op.rep == WordRepresentation::Word32() ||
+         op.rep == WordRepresentation::Word64());
+  bool word64 = op.rep == WordRepresentation::Word64();
   const Operator* o;
   switch (op.kind) {
     case ShiftOp::Kind::kShiftRightArithmeticShiftOutZeros:
@@ -487,16 +531,16 @@ Node* ScheduleBuilder::ProcessOperation(const ShiftOp& op) {
 Node* ScheduleBuilder::ProcessOperation(const EqualOp& op) {
   const Operator* o;
   switch (op.rep) {
-    case MachineRepresentation::kWord32:
+    case RegisterRepresentation::Word32():
       o = machine.Word32Equal();
       break;
-    case MachineRepresentation::kWord64:
+    case RegisterRepresentation::Word64():
       o = machine.Word64Equal();
       break;
-    case MachineRepresentation::kFloat32:
+    case RegisterRepresentation::Float32():
       o = machine.Float32Equal();
       break;
-    case MachineRepresentation::kFloat64:
+    case RegisterRepresentation::Float64():
       o = machine.Float64Equal();
       break;
     default:
@@ -507,7 +551,7 @@ Node* ScheduleBuilder::ProcessOperation(const EqualOp& op) {
 Node* ScheduleBuilder::ProcessOperation(const ComparisonOp& op) {
   const Operator* o;
   switch (op.rep) {
-    case MachineRepresentation::kWord32:
+    case RegisterRepresentation::Word32():
       switch (op.kind) {
         case ComparisonOp::Kind::kSignedLessThan:
           o = machine.Int32LessThan();
@@ -523,7 +567,7 @@ Node* ScheduleBuilder::ProcessOperation(const ComparisonOp& op) {
           break;
       }
       break;
-    case MachineRepresentation::kWord64:
+    case RegisterRepresentation::Word64():
       switch (op.kind) {
         case ComparisonOp::Kind::kSignedLessThan:
           o = machine.Int64LessThan();
@@ -539,7 +583,7 @@ Node* ScheduleBuilder::ProcessOperation(const ComparisonOp& op) {
           break;
       }
       break;
-    case MachineRepresentation::kFloat32:
+    case RegisterRepresentation::Float32():
       switch (op.kind) {
         case ComparisonOp::Kind::kSignedLessThan:
           o = machine.Float32LessThan();
@@ -552,7 +596,7 @@ Node* ScheduleBuilder::ProcessOperation(const ComparisonOp& op) {
           UNREACHABLE();
       }
       break;
-    case MachineRepresentation::kFloat64:
+    case RegisterRepresentation::Float64():
       switch (op.kind) {
         case ComparisonOp::Kind::kSignedLessThan:
           o = machine.Float64LessThan();
@@ -574,129 +618,194 @@ Node* ScheduleBuilder::ProcessOperation(const ChangeOp& op) {
   const Operator* o;
   switch (op.kind) {
     using Kind = ChangeOp::Kind;
+    using Assumption = ChangeOp::Assumption;
     case Kind::kFloatConversion:
-      if (op.from == MachineRepresentation::kFloat64 &&
-          op.to == MachineRepresentation::kFloat32) {
+      if (op.from == FloatRepresentation::Float64() &&
+          op.to == FloatRepresentation::Float32()) {
         o = machine.TruncateFloat64ToFloat32();
-      } else if (op.from == MachineRepresentation::kFloat32 &&
-                 op.to == MachineRepresentation::kFloat64) {
+      } else if (op.from == FloatRepresentation::Float32() &&
+                 op.to == FloatRepresentation::Float64()) {
         o = machine.ChangeFloat32ToFloat64();
       } else {
         UNIMPLEMENTED();
       }
       break;
-    case Kind::kSignedFloatTruncate:
-      if (op.from == MachineRepresentation::kFloat64 &&
-          op.to == MachineRepresentation::kWord64) {
-        o = machine.TruncateFloat64ToInt64(TruncateKind::kArchitectureDefault);
-      } else if (op.from == MachineRepresentation::kFloat64 &&
-                 op.to == MachineRepresentation::kWord32) {
-        o = machine.RoundFloat64ToInt32();
-      } else {
-        UNIMPLEMENTED();
-      }
-      break;
     case Kind::kSignedFloatTruncateOverflowToMin:
-      if (op.from == MachineRepresentation::kFloat64 &&
-          op.to == MachineRepresentation::kWord64) {
-        o = machine.TruncateFloat64ToInt64(TruncateKind::kSetOverflowToMin);
+    case Kind::kUnsignedFloatTruncateOverflowToMin: {
+      bool is_signed = op.kind == Kind::kSignedFloatTruncateOverflowToMin;
+      if (op.assumption == Assumption::kReversible) {
+        if (op.from == FloatRepresentation::Float64() &&
+            op.to == WordRepresentation::Word64()) {
+          o = is_signed ? machine.ChangeFloat64ToInt64()
+                        : machine.ChangeFloat64ToUint64();
+        } else if (op.from == FloatRepresentation::Float64() &&
+                   op.to == WordRepresentation::Word32()) {
+          o = is_signed ? machine.ChangeFloat64ToInt32()
+                        : machine.ChangeFloat64ToUint32();
+        } else {
+          UNIMPLEMENTED();
+        }
+        break;
+      }
+      TruncateKind truncate_kind;
+      switch (op.assumption) {
+        case ChangeOp::Assumption::kReversible:
+          UNREACHABLE();
+        case ChangeOp::Assumption::kNoAssumption:
+          truncate_kind = TruncateKind::kSetOverflowToMin;
+          break;
+        case ChangeOp::Assumption::kNoOverflow:
+          truncate_kind = TruncateKind::kArchitectureDefault;
+          break;
+      }
+      if (op.from == FloatRepresentation::Float64() &&
+          op.to == WordRepresentation::Word64()) {
+        DCHECK(is_signed);
+        o = machine.TruncateFloat64ToInt64(truncate_kind);
+      } else if (op.from == FloatRepresentation::Float64() &&
+                 op.to == WordRepresentation::Word32()) {
+        if (is_signed) {
+          DCHECK_EQ(truncate_kind, TruncateKind::kArchitectureDefault);
+          o = machine.RoundFloat64ToInt32();
+        } else {
+          machine.TruncateFloat32ToUint32(truncate_kind);
+        }
+      } else if (op.from == FloatRepresentation::Float32() &&
+                 op.to == WordRepresentation::Word32()) {
+        o = is_signed ? machine.TruncateFloat32ToInt32(truncate_kind)
+                      : machine.TruncateFloat32ToUint32(truncate_kind);
       } else {
         UNIMPLEMENTED();
       }
       break;
+    }
     case Kind::kJSFloatTruncate:
-      if (op.from == MachineRepresentation::kFloat64 &&
-          op.to == MachineRepresentation::kWord32) {
+      if (op.from == FloatRepresentation::Float64() &&
+          op.to == WordRepresentation::Word32()) {
         o = machine.TruncateFloat64ToWord32();
       } else {
         UNIMPLEMENTED();
       }
       break;
     case Kind::kSignedToFloat:
-      if (op.from == MachineRepresentation::kWord32 &&
-          op.to == MachineRepresentation::kFloat64) {
+      if (op.from == WordRepresentation::Word32() &&
+          op.to == FloatRepresentation::Float64()) {
+        DCHECK_EQ(op.assumption, Assumption::kNoAssumption);
+        o = machine.ChangeInt32ToFloat64();
+      } else if (op.from == WordRepresentation::Word64() &&
+                 op.to == FloatRepresentation::Float64()) {
+        o = op.assumption == Assumption::kReversible
+                ? machine.ChangeInt64ToFloat64()
+                : machine.RoundInt64ToFloat64();
+      } else if (op.from == WordRepresentation::Word32() &&
+                 op.to == FloatRepresentation::Float32()) {
+        o = machine.RoundInt32ToFloat32();
+      } else if (op.from == WordRepresentation::Word64() &&
+                 op.to == FloatRepresentation::Float32()) {
+        o = machine.RoundInt64ToFloat32();
+      } else if (op.from == WordRepresentation::Word32() &&
+                 op.to == FloatRepresentation::Float64()) {
         o = machine.ChangeInt32ToFloat64();
-      } else if (op.from == MachineRepresentation::kWord64 &&
-                 op.to == MachineRepresentation::kFloat64) {
-        o = machine.ChangeInt64ToFloat64();
       } else {
         UNIMPLEMENTED();
       }
       break;
     case Kind::kUnsignedToFloat:
-      if (op.from == MachineRepresentation::kWord32 &&
-          op.to == MachineRepresentation::kFloat64) {
+      if (op.from == WordRepresentation::Word32() &&
+          op.to == FloatRepresentation::Float64()) {
         o = machine.ChangeUint32ToFloat64();
+      } else if (op.from == WordRepresentation::Word32() &&
+                 op.to == FloatRepresentation::Float32()) {
+        o = machine.RoundUint32ToFloat32();
+      } else if (op.from == WordRepresentation::Word64() &&
+                 op.to == FloatRepresentation::Float32()) {
+        o = machine.RoundUint64ToFloat32();
+      } else if (op.from == WordRepresentation::Word64() &&
+                 op.to == FloatRepresentation::Float64()) {
+        o = machine.RoundUint64ToFloat64();
       } else {
         UNIMPLEMENTED();
       }
       break;
     case Kind::kExtractHighHalf:
-      DCHECK_EQ(op.from, MachineRepresentation::kFloat64);
-      DCHECK_EQ(op.to, MachineRepresentation::kWord32);
+      DCHECK_EQ(op.from, FloatRepresentation::Float64());
+      DCHECK_EQ(op.to, WordRepresentation::Word32());
       o = machine.Float64ExtractHighWord32();
       break;
     case Kind::kExtractLowHalf:
-      DCHECK_EQ(op.from, MachineRepresentation::kFloat64);
-      DCHECK_EQ(op.to, MachineRepresentation::kWord32);
+      DCHECK_EQ(op.from, FloatRepresentation::Float64());
+      DCHECK_EQ(op.to, WordRepresentation::Word32());
       o = machine.Float64ExtractLowWord32();
       break;
     case Kind::kBitcast:
-      if (op.from == MachineRepresentation::kWord32 &&
-          op.to == MachineRepresentation::kWord64) {
+      if (op.from == WordRepresentation::Word32() &&
+          op.to == WordRepresentation::Word64()) {
         o = machine.BitcastWord32ToWord64();
-      } else if (op.from == MachineRepresentation::kFloat32 &&
-                 op.to == MachineRepresentation::kWord32) {
+      } else if (op.from == FloatRepresentation::Float32() &&
+                 op.to == WordRepresentation::Word32()) {
         o = machine.BitcastFloat32ToInt32();
-      } else if (op.from == MachineRepresentation::kWord32 &&
-                 op.to == MachineRepresentation::kFloat32) {
+      } else if (op.from == WordRepresentation::Word32() &&
+                 op.to == FloatRepresentation::Float32()) {
         o = machine.BitcastInt32ToFloat32();
-      } else if (op.from == MachineRepresentation::kFloat64 &&
-                 op.to == MachineRepresentation::kWord64) {
+      } else if (op.from == FloatRepresentation::Float64() &&
+                 op.to == WordRepresentation::Word64()) {
         o = machine.BitcastFloat64ToInt64();
-      } else if (op.from == MachineRepresentation::kWord64 &&
-                 op.to == MachineRepresentation::kFloat64) {
+      } else if (op.from == WordRepresentation::Word64() &&
+                 op.to == FloatRepresentation::Float64()) {
         o = machine.BitcastInt64ToFloat64();
       } else {
         UNIMPLEMENTED();
       }
       break;
     case Kind::kSignExtend:
-      if (op.from == MachineRepresentation::kWord32 &&
-          op.to == MachineRepresentation::kWord64) {
+      if (op.from == WordRepresentation::Word32() &&
+          op.to == WordRepresentation::Word64()) {
         o = machine.ChangeInt32ToInt64();
       } else {
         UNIMPLEMENTED();
       }
       break;
     case Kind::kZeroExtend:
-      if (op.from == MachineRepresentation::kWord32 &&
-          op.to == MachineRepresentation::kWord64) {
+      if (op.from == WordRepresentation::Word32() &&
+          op.to == WordRepresentation::Word64()) {
         o = machine.ChangeUint32ToUint64();
       } else {
         UNIMPLEMENTED();
       }
       break;
-    case Kind::kSignedNarrowing:
-      if (op.from == MachineRepresentation::kFloat64 &&
-          op.to == MachineRepresentation::kWord64) {
-        o = machine.ChangeFloat64ToInt64();
-      } else if (op.from == MachineRepresentation::kFloat64 &&
-                 op.to == MachineRepresentation::kWord32) {
-        o = machine.ChangeFloat64ToInt32();
+  }
+  return AddNode(o, {GetNode(op.input())});
+}
+Node* ScheduleBuilder::ProcessOperation(const TryChangeOp& op) {
+  const Operator* o;
+  switch (op.kind) {
+    using Kind = TryChangeOp::Kind;
+    case Kind::kSignedFloatTruncateOverflowUndefined:
+      if (op.from == FloatRepresentation::Float64() &&
+          op.to == WordRepresentation::Word64()) {
+        o = machine.TryTruncateFloat64ToInt64();
+      } else if (op.from == FloatRepresentation::Float64() &&
+                 op.to == WordRepresentation::Word32()) {
+        o = machine.TryTruncateFloat64ToInt32();
+      } else if (op.from == FloatRepresentation::Float32() &&
+                 op.to == WordRepresentation::Word64()) {
+        o = machine.TryTruncateFloat32ToInt64();
       } else {
-        UNIMPLEMENTED();
+        UNREACHABLE();
       }
       break;
-    case Kind::kUnsignedNarrowing:
-      if (op.from == MachineRepresentation::kFloat64 &&
-          op.to == MachineRepresentation::kWord64) {
-        o = machine.ChangeFloat64ToUint64();
-      } else if (op.from == MachineRepresentation::kFloat64 &&
-                 op.to == MachineRepresentation::kWord32) {
-        o = machine.ChangeFloat64ToUint32();
+    case Kind::kUnsignedFloatTruncateOverflowUndefined:
+      if (op.from == FloatRepresentation::Float64() &&
+          op.to == WordRepresentation::Word64()) {
+        o = machine.TryTruncateFloat64ToUint64();
+      } else if (op.from == FloatRepresentation::Float64() &&
+                 op.to == WordRepresentation::Word32()) {
+        o = machine.TryTruncateFloat64ToUint32();
+      } else if (op.from == FloatRepresentation::Float32() &&
+                 op.to == WordRepresentation::Word64()) {
+        o = machine.TryTruncateFloat32ToUint64();
       } else {
-        UNIMPLEMENTED();
+        UNREACHABLE();
       }
       break;
   }
@@ -714,17 +823,25 @@ Node* ScheduleBuilder::ProcessOperation(const Float64InsertWord32Op& op) {
 }
 Node* ScheduleBuilder::ProcessOperation(const TaggedBitcastOp& op) {
   const Operator* o;
-  if (op.from == MachineRepresentation::kTagged &&
-      op.to == MachineType::PointerRepresentation()) {
+  if (op.from == RegisterRepresentation::Tagged() &&
+      op.to == RegisterRepresentation::PointerSized()) {
     o = machine.BitcastTaggedToWord();
-  } else if (op.from == MachineType::PointerRepresentation() &&
-             op.to == MachineRepresentation::kTagged) {
+  } else if (op.from == RegisterRepresentation::PointerSized() &&
+             op.to == RegisterRepresentation::Tagged()) {
     o = machine.BitcastWordToTagged();
   } else {
     UNIMPLEMENTED();
   }
   return AddNode(o, {GetNode(op.input())});
 }
+Node* ScheduleBuilder::ProcessOperation(const SelectOp& op) {
+  const Operator* o = op.rep == WordRepresentation::Word32()
+                          ? machine.Word32Select().op()
+                          : machine.Word64Select().op();
+  return AddNode(
+      o, {GetNode(op.condition()), GetNode(op.left()), GetNode(op.right())});
+}
+
 Node* ScheduleBuilder::ProcessOperation(const PendingLoopPhiOp& op) {
   UNREACHABLE();
 }
@@ -755,6 +872,11 @@ Node* ScheduleBuilder::ProcessOperation(const ConstantOp& op) {
       return AddNode(common.Float64Constant(op.float64()), {});
     case ConstantOp::Kind::kFloat32:
       return AddNode(common.Float32Constant(op.float32()), {});
+    case ConstantOp::Kind::kRelocatableWasmCall:
+      return RelocatableIntPtrConstant(op.integral(), RelocInfo::WASM_CALL);
+    case ConstantOp::Kind::kRelocatableWasmStubCall:
+      return RelocatableIntPtrConstant(op.integral(),
+                                       RelocInfo::WASM_STUB_CALL);
   }
 }
 Node* ScheduleBuilder::ProcessOperation(const LoadOp& op) {
@@ -764,9 +886,11 @@ Node* ScheduleBuilder::ProcessOperation(const LoadOp& op) {
     offset -= kHeapObjectTag;
   }
   Node* base = GetNode(op.base());
-  return AddNode(IsAlignedAccess(op.kind)
-                     ? machine.Load(op.loaded_rep)
-                     : machine.UnalignedLoad(op.loaded_rep),
+  return AddNode(op.kind == LoadOp::Kind::kRawAligned
+                     ? machine.Load(op.loaded_rep.ToMachineType())
+                 : op.kind == LoadOp::Kind::kRawUnaligned
+                     ? machine.UnalignedLoad(op.loaded_rep.ToMachineType())
+                     : machine.ProtectedLoad(op.loaded_rep.ToMachineType()),
                  {base, IntPtrConstant(offset)});
 }
 Node* ScheduleBuilder::ProcessOperation(const IndexedLoadOp& op) {
@@ -783,11 +907,24 @@ Node* ScheduleBuilder::ProcessOperation(const IndexedLoadOp& op) {
   if (offset != 0) {
     index = IntPtrAdd(index, IntPtrConstant(offset));
   }
-  return AddNode(IsAlignedAccess(op.kind)
-                     ? machine.Load(op.loaded_rep)
-                     : machine.UnalignedLoad(op.loaded_rep),
+  MachineType loaded_rep = op.loaded_rep.ToMachineType();
+  if (op.result_rep == RegisterRepresentation::Compressed()) {
+    if (loaded_rep == MachineType::AnyTagged()) {
+      loaded_rep = MachineType::AnyCompressed();
+    } else if (loaded_rep == MachineType::TaggedPointer()) {
+      loaded_rep = MachineType::CompressedPointer();
+    }
+  }
+  return AddNode(op.kind == LoadOp::Kind::kRawAligned ? machine.Load(loaded_rep)
+                 : op.kind == LoadOp::Kind::kRawUnaligned
+                     ? machine.UnalignedLoad(loaded_rep)
+                     : machine.ProtectedLoad(loaded_rep),
                  {base, index});
 }
+Node* ScheduleBuilder::ProcessOperation(const ProtectedLoadOp& op) {
+  return AddNode(machine.ProtectedLoad(op.loaded_rep.ToMachineType()),
+                 {GetNode(op.base()), GetNode(op.index())});
+}
 Node* ScheduleBuilder::ProcessOperation(const StoreOp& op) {
   intptr_t offset = op.offset;
   if (op.kind == StoreOp::Kind::kTaggedBase) {
@@ -798,10 +935,11 @@ Node* ScheduleBuilder::ProcessOperation(const StoreOp& op) {
   Node* value = GetNode(op.value());
   const Operator* o;
   if (IsAlignedAccess(op.kind)) {
-    o = machine.Store(StoreRepresentation(op.stored_rep, op.write_barrier));
+    o = machine.Store(StoreRepresentation(
+        op.stored_rep.ToMachineType().representation(), op.write_barrier));
   } else {
     DCHECK_EQ(op.write_barrier, WriteBarrierKind::kNoWriteBarrier);
-    o = machine.UnalignedStore(op.stored_rep);
+    o = machine.UnalignedStore(op.stored_rep.ToMachineType().representation());
   }
   return AddNode(o, {base, IntPtrConstant(offset), value});
 }
@@ -822,13 +960,19 @@ Node* ScheduleBuilder::ProcessOperation(const IndexedStoreOp& op) {
   }
   const Operator* o;
   if (IsAlignedAccess(op.kind)) {
-    o = machine.Store(StoreRepresentation(op.stored_rep, op.write_barrier));
+    o = machine.Store(StoreRepresentation(
+        op.stored_rep.ToMachineType().representation(), op.write_barrier));
   } else {
     DCHECK_EQ(op.write_barrier, WriteBarrierKind::kNoWriteBarrier);
-    o = machine.UnalignedStore(op.stored_rep);
+    o = machine.UnalignedStore(op.stored_rep.ToMachineType().representation());
   }
   return AddNode(o, {base, index, value});
 }
+Node* ScheduleBuilder::ProcessOperation(const ProtectedStoreOp& op) {
+  return AddNode(
+      machine.ProtectedStore(op.stored_rep.ToMachineType().representation()),
+      {GetNode(op.base()), GetNode(op.index()), GetNode(op.value())});
+}
 Node* ScheduleBuilder::ProcessOperation(const RetainOp& op) {
   return AddNode(common.Retain(), {GetNode(op.retained())});
 }
@@ -894,6 +1038,12 @@ Node* ScheduleBuilder::ProcessOperation(const DeoptimizeIfOp& op) {
                                                 op.parameters->feedback());
   return AddNode(o, {condition, frame_state});
 }
+Node* ScheduleBuilder::ProcessOperation(const TrapIfOp& op) {
+  Node* condition = GetNode(op.condition());
+  const Operator* o =
+      op.negated ? common.TrapUnless(op.trap_id) : common.TrapIf(op.trap_id);
+  return AddNode(o, {condition});
+}
 Node* ScheduleBuilder::ProcessOperation(const DeoptimizeOp& op) {
   Node* frame_state = GetNode(op.frame_state());
   const Operator* o =
@@ -909,7 +1059,8 @@ Node* ScheduleBuilder::ProcessOperation(const PhiOp& op) {
     Node* input = GetNode(op.input(0));
     // The second `input` is a placeholder that is patched when we process the
     // backedge.
-    Node* node = AddNode(common.Phi(op.rep, 2), {input, input});
+    Node* node =
+        AddNode(common.Phi(op.rep.machine_representation(), 2), {input, input});
     loop_phis.emplace_back(node, op.input(1));
     return node;
   } else {
@@ -917,7 +1068,8 @@ Node* ScheduleBuilder::ProcessOperation(const PhiOp& op) {
     for (OpIndex i : op.inputs()) {
       inputs.push_back(GetNode(i));
     }
-    return AddNode(common.Phi(op.rep, op.input_count), base::VectorOf(inputs));
+    return AddNode(common.Phi(op.rep.machine_representation(), op.input_count),
+                   base::VectorOf(inputs));
   }
 }
 Node* ScheduleBuilder::ProcessOperation(const ProjectionOp& op) {
@@ -1052,6 +1204,17 @@ Node* ScheduleBuilder::ProcessOperation(const CallOp& op) {
   }
   return AddNode(common.Call(op.descriptor), base::VectorOf(inputs));
 }
+Node* ScheduleBuilder::ProcessOperation(const TailCallOp& op) {
+  base::SmallVector<Node*, 16> inputs;
+  inputs.push_back(GetNode(op.callee()));
+  for (OpIndex i : op.arguments()) {
+    inputs.push_back(GetNode(i));
+  }
+  Node* call = MakeNode(common.TailCall(op.descriptor), base::VectorOf(inputs));
+  schedule->AddTailCall(current_block, call);
+  current_block = nullptr;
+  return nullptr;
+}
 Node* ScheduleBuilder::ProcessOperation(const UnreachableOp& op) {
   Node* node = MakeNode(common.Throw(), {});
   schedule->AddThrow(current_block, node);
diff --git a/deps/v8/src/compiler/turboshaft/recreate-schedule.h b/deps/v8/src/compiler/turboshaft/recreate-schedule.h
index b0b1932670abc6..8fb3108775ed3a 100644
--- a/deps/v8/src/compiler/turboshaft/recreate-schedule.h
+++ b/deps/v8/src/compiler/turboshaft/recreate-schedule.h
@@ -7,7 +7,7 @@
 
 #include "src/compiler/compiler-source-position-table.h"
 #include "src/compiler/node-origin-table.h"
-#include "src/compiler/node.h"
+
 namespace v8::internal {
 class Zone;
 }
diff --git a/deps/v8/src/compiler/turboshaft/representations.cc b/deps/v8/src/compiler/turboshaft/representations.cc
new file mode 100644
index 00000000000000..da29b989517144
--- /dev/null
+++ b/deps/v8/src/compiler/turboshaft/representations.cc
@@ -0,0 +1,59 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/compiler/turboshaft/representations.h"
+
+namespace v8::internal::compiler::turboshaft {
+
+std::ostream& operator<<(std::ostream& os, RegisterRepresentation rep) {
+  switch (rep) {
+    case RegisterRepresentation::Word32():
+      return os << "Word32";
+    case RegisterRepresentation::Word64():
+      return os << "Word64";
+    case RegisterRepresentation::Float32():
+      return os << "Float32";
+    case RegisterRepresentation::Float64():
+      return os << "Float64";
+    case RegisterRepresentation::Tagged():
+      return os << "Tagged";
+    case RegisterRepresentation::Compressed():
+      return os << "Compressed";
+  }
+}
+
+std::ostream& operator<<(std::ostream& os, MemoryRepresentation rep) {
+  switch (rep) {
+    case MemoryRepresentation::Int8():
+      return os << "Int8";
+    case MemoryRepresentation::Uint8():
+      return os << "Uint8";
+    case MemoryRepresentation::Int16():
+      return os << "Int16";
+    case MemoryRepresentation::Uint16():
+      return os << "Uint16";
+    case MemoryRepresentation::Int32():
+      return os << "Int32";
+    case MemoryRepresentation::Uint32():
+      return os << "Uint32";
+    case MemoryRepresentation::Int64():
+      return os << "Int64";
+    case MemoryRepresentation::Uint64():
+      return os << "Uint64";
+    case MemoryRepresentation::Float32():
+      return os << "Float32";
+    case MemoryRepresentation::Float64():
+      return os << "Float64";
+    case MemoryRepresentation::AnyTagged():
+      return os << "AnyTagged";
+    case MemoryRepresentation::TaggedPointer():
+      return os << "TaggedPointer";
+    case MemoryRepresentation::TaggedSigned():
+      return os << "TaggedSigned";
+    case MemoryRepresentation::SandboxedPointer():
+      return os << "SandboxedPointer";
+  }
+}
+
+}  // namespace v8::internal::compiler::turboshaft
diff --git a/deps/v8/src/compiler/turboshaft/representations.h b/deps/v8/src/compiler/turboshaft/representations.h
new file mode 100644
index 00000000000000..b99ffeec7c6d4b
--- /dev/null
+++ b/deps/v8/src/compiler/turboshaft/representations.h
@@ -0,0 +1,604 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_COMPILER_TURBOSHAFT_REPRESENTATIONS_H_
+#define V8_COMPILER_TURBOSHAFT_REPRESENTATIONS_H_
+
+#include <cstdint>
+
+#include "src/base/functional.h"
+#include "src/base/logging.h"
+#include "src/codegen/machine-type.h"
+#include "src/compiler/turboshaft/utils.h"
+
+namespace v8::internal::compiler::turboshaft {
+
+class WordRepresentation;
+class FloatRepresentation;
+
+class RegisterRepresentation {
+ public:
+  enum class Enum : uint8_t {
+    kWord32,
+    kWord64,
+    kFloat32,
+    kFloat64,
+    kTagged,
+    kCompressed
+  };
+
+  explicit constexpr RegisterRepresentation(Enum value) : value_(value) {}
+  RegisterRepresentation() : value_(kInvalid) {}
+
+  constexpr Enum value() const {
+    DCHECK_NE(value_, kInvalid);
+    return value_;
+  }
+  constexpr operator Enum() const { return value(); }
+
+  static constexpr RegisterRepresentation Word32() {
+    return RegisterRepresentation(Enum::kWord32);
+  }
+  static constexpr RegisterRepresentation Word64() {
+    return RegisterRepresentation(Enum::kWord64);
+  }
+  static constexpr RegisterRepresentation Float32() {
+    return RegisterRepresentation(Enum::kFloat32);
+  }
+  static constexpr RegisterRepresentation Float64() {
+    return RegisterRepresentation(Enum::kFloat64);
+  }
+  // A tagged pointer stored in a register, in the case of pointer compression
+  // it is an uncompressed pointer or a Smi.
+  static constexpr RegisterRepresentation Tagged() {
+    return RegisterRepresentation(Enum::kTagged);
+  }
+  // A compressed tagged pointer stored in a register, the upper 32bit are
+  // unspecified.
+  static constexpr RegisterRepresentation Compressed() {
+    return RegisterRepresentation(Enum::kCompressed);
+  }
+  // The equivalent of intptr_t/uintptr_t: An integral type with the same size
+  // as machine pointers.
+  static constexpr RegisterRepresentation PointerSized() {
+    if constexpr (kSystemPointerSize == 4) {
+      return Word32();
+    } else {
+      DCHECK_EQ(kSystemPointerSize, 8);
+      return Word64();
+    }
+  }
+
+  constexpr bool IsWord() {
+    switch (*this) {
+      case Enum::kWord32:
+      case Enum::kWord64:
+        return true;
+      case Enum::kFloat32:
+      case Enum::kFloat64:
+      case Enum::kTagged:
+      case Enum::kCompressed:
+        return false;
+    }
+  }
+
+  bool IsFloat() {
+    switch (*this) {
+      case Enum::kFloat32:
+      case Enum::kFloat64:
+        return true;
+      case Enum::kWord32:
+      case Enum::kWord64:
+      case Enum::kTagged:
+      case Enum::kCompressed:
+        return false;
+    }
+  }
+
+  uint64_t MaxUnsignedValue() const {
+    switch (this->value()) {
+      case Word32():
+        return std::numeric_limits<uint32_t>::max();
+      case Word64():
+        return std::numeric_limits<uint64_t>::max();
+      case Enum::kFloat32:
+      case Enum::kFloat64:
+      case Enum::kTagged:
+      case Enum::kCompressed:
+        UNREACHABLE();
+    }
+  }
+
+  MachineRepresentation machine_representation() const {
+    switch (*this) {
+      case Word32():
+        return MachineRepresentation::kWord32;
+      case Word64():
+        return MachineRepresentation::kWord64;
+      case Float32():
+        return MachineRepresentation::kFloat32;
+      case Float64():
+        return MachineRepresentation::kFloat64;
+      case Tagged():
+        return MachineRepresentation::kTagged;
+      case Compressed():
+        return MachineRepresentation::kCompressed;
+    }
+  }
+
+  constexpr uint16_t bit_width() const {
+    switch (*this) {
+      case Word32():
+        return 32;
+      case Word64():
+        return 64;
+      case Float32():
+        return 32;
+      case Float64():
+        return 64;
+      case Tagged():
+        return kSystemPointerSize;
+      case Compressed():
+        return kSystemPointerSize;
+    }
+  }
+
+  static RegisterRepresentation FromMachineRepresentation(
+      MachineRepresentation rep) {
+    switch (rep) {
+      case MachineRepresentation::kBit:
+      case MachineRepresentation::kWord8:
+      case MachineRepresentation::kWord16:
+      case MachineRepresentation::kWord32:
+        return Word32();
+      case MachineRepresentation::kWord64:
+        return Word64();
+      case MachineRepresentation::kTaggedSigned:
+      case MachineRepresentation::kTaggedPointer:
+      case MachineRepresentation::kTagged:
+        return Tagged();
+      case MachineRepresentation::kCompressedPointer:
+      case MachineRepresentation::kCompressed:
+        return Compressed();
+      case MachineRepresentation::kFloat32:
+        return Float32();
+      case MachineRepresentation::kFloat64:
+        return Float64();
+      case MachineRepresentation::kMapWord:
+      case MachineRepresentation::kSandboxedPointer:
+      case MachineRepresentation::kNone:
+      case MachineRepresentation::kSimd128:
+      case MachineRepresentation::kSimd256:
+        UNREACHABLE();
+    }
+  }
+
+ private:
+  Enum value_;
+
+  static constexpr Enum kInvalid = static_cast<Enum>(-1);
+};
+
+V8_INLINE bool operator==(RegisterRepresentation a, RegisterRepresentation b) {
+  return a.value() == b.value();
+}
+V8_INLINE bool operator!=(RegisterRepresentation a, RegisterRepresentation b) {
+  return a.value() != b.value();
+}
+
+V8_INLINE size_t hash_value(RegisterRepresentation rep) {
+  return static_cast<size_t>(rep.value());
+}
+
+std::ostream& operator<<(std::ostream& os, RegisterRepresentation rep);
+
+class WordRepresentation : public RegisterRepresentation {
+ public:
+  enum class Enum : uint8_t {
+    kWord32 = static_cast<int>(RegisterRepresentation::Enum::kWord32),
+    kWord64 = static_cast<int>(RegisterRepresentation::Enum::kWord64)
+  };
+  explicit constexpr WordRepresentation(Enum value)
+      : RegisterRepresentation(
+            static_cast<RegisterRepresentation::Enum>(value)) {}
+  WordRepresentation() = default;
+  explicit constexpr WordRepresentation(RegisterRepresentation rep)
+      : WordRepresentation(static_cast<Enum>(rep.value())) {
+    DCHECK(rep.IsWord());
+  }
+
+  static constexpr WordRepresentation Word32() {
+    return WordRepresentation(Enum::kWord32);
+  }
+  static constexpr WordRepresentation Word64() {
+    return WordRepresentation(Enum::kWord64);
+  }
+
+  static constexpr WordRepresentation PointerSized() {
+    return WordRepresentation(RegisterRepresentation::PointerSized());
+  }
+
+  constexpr Enum value() const {
+    return static_cast<Enum>(RegisterRepresentation::value());
+  }
+  constexpr operator Enum() const { return value(); }
+
+  constexpr uint64_t MaxUnsignedValue() const {
+    switch (this->value()) {
+      case Word32():
+        return std::numeric_limits<uint32_t>::max();
+      case Word64():
+        return std::numeric_limits<uint64_t>::max();
+    }
+  }
+  constexpr int64_t MinSignedValue() const {
+    switch (this->value()) {
+      case Word32():
+        return std::numeric_limits<int32_t>::min();
+      case Word64():
+        return std::numeric_limits<int64_t>::min();
+    }
+  }
+  constexpr int64_t MaxSignedValue() const {
+    switch (this->value()) {
+      case Word32():
+        return std::numeric_limits<int32_t>::max();
+      case Word64():
+        return std::numeric_limits<int64_t>::max();
+    }
+  }
+};
+
+class FloatRepresentation : public RegisterRepresentation {
+ public:
+  enum class Enum : uint8_t {
+    kFloat32 = static_cast<int>(RegisterRepresentation::Enum::kFloat32),
+    kFloat64 = static_cast<int>(RegisterRepresentation::Enum::kFloat64)
+  };
+
+  static constexpr FloatRepresentation Float32() {
+    return FloatRepresentation(Enum::kFloat32);
+  }
+  static constexpr FloatRepresentation Float64() {
+    return FloatRepresentation(Enum::kFloat64);
+  }
+
+  explicit constexpr FloatRepresentation(Enum value)
+      : RegisterRepresentation(
+            static_cast<RegisterRepresentation::Enum>(value)) {}
+  FloatRepresentation() = default;
+
+  constexpr Enum value() const {
+    return static_cast<Enum>(RegisterRepresentation::value());
+  }
+  constexpr operator Enum() const { return value(); }
+};
+
+class MemoryRepresentation {
+ public:
+  enum class Enum : uint8_t {
+    kInt8,
+    kUint8,
+    kInt16,
+    kUint16,
+    kInt32,
+    kUint32,
+    kInt64,
+    kUint64,
+    kFloat32,
+    kFloat64,
+    kAnyTagged,
+    kTaggedPointer,
+    kTaggedSigned,
+    kSandboxedPointer,
+  };
+
+  explicit constexpr MemoryRepresentation(Enum value) : value_(value) {}
+  MemoryRepresentation() : value_(kInvalid) {}
+  constexpr Enum value() const {
+    DCHECK_NE(value_, kInvalid);
+    return value_;
+  }
+  constexpr operator Enum() const { return value(); }
+
+  static constexpr MemoryRepresentation Int8() {
+    return MemoryRepresentation(Enum::kInt8);
+  }
+  static constexpr MemoryRepresentation Uint8() {
+    return MemoryRepresentation(Enum::kUint8);
+  }
+  static constexpr MemoryRepresentation Int16() {
+    return MemoryRepresentation(Enum::kInt16);
+  }
+  static constexpr MemoryRepresentation Uint16() {
+    return MemoryRepresentation(Enum::kUint16);
+  }
+  static constexpr MemoryRepresentation Int32() {
+    return MemoryRepresentation(Enum::kInt32);
+  }
+  static constexpr MemoryRepresentation Uint32() {
+    return MemoryRepresentation(Enum::kUint32);
+  }
+  static constexpr MemoryRepresentation Int64() {
+    return MemoryRepresentation(Enum::kInt64);
+  }
+  static constexpr MemoryRepresentation Uint64() {
+    return MemoryRepresentation(Enum::kUint64);
+  }
+  static constexpr MemoryRepresentation Float32() {
+    return MemoryRepresentation(Enum::kFloat32);
+  }
+  static constexpr MemoryRepresentation Float64() {
+    return MemoryRepresentation(Enum::kFloat64);
+  }
+  static constexpr MemoryRepresentation AnyTagged() {
+    return MemoryRepresentation(Enum::kAnyTagged);
+  }
+  static constexpr MemoryRepresentation TaggedPointer() {
+    return MemoryRepresentation(Enum::kTaggedPointer);
+  }
+  static constexpr MemoryRepresentation TaggedSigned() {
+    return MemoryRepresentation(Enum::kTaggedSigned);
+  }
+  static constexpr MemoryRepresentation SandboxedPointer() {
+    return MemoryRepresentation(Enum::kSandboxedPointer);
+  }
+
+  bool IsWord() const {
+    switch (*this) {
+      case Int8():
+      case Uint8():
+      case Int16():
+      case Uint16():
+      case Int32():
+      case Uint32():
+      case Int64():
+      case Uint64():
+        return true;
+      case Float32():
+      case Float64():
+      case AnyTagged():
+      case TaggedPointer():
+      case TaggedSigned():
+      case SandboxedPointer():
+        return false;
+    }
+  }
+
+  bool IsSigned() const {
+    switch (*this) {
+      case Int8():
+      case Int16():
+      case Int32():
+      case Int64():
+        return true;
+      case Uint8():
+      case Uint16():
+      case Uint32():
+      case Uint64():
+        return false;
+      case Float32():
+      case Float64():
+      case AnyTagged():
+      case TaggedPointer():
+      case TaggedSigned():
+      case SandboxedPointer():
+        DCHECK(false);
+        return false;
+    }
+  }
+
+  bool IsTagged() const {
+    switch (*this) {
+      case AnyTagged():
+      case TaggedPointer():
+      case TaggedSigned():
+        return true;
+      case Int8():
+      case Int16():
+      case Int32():
+      case Int64():
+      case Uint8():
+      case Uint16():
+      case Uint32():
+      case Uint64():
+      case Float32():
+      case Float64():
+      case SandboxedPointer():
+        return false;
+    }
+  }
+
+  bool CanBeTaggedPointer() const {
+    switch (*this) {
+      case AnyTagged():
+      case TaggedPointer():
+        return true;
+      case TaggedSigned():
+      case Int8():
+      case Int16():
+      case Int32():
+      case Int64():
+      case Uint8():
+      case Uint16():
+      case Uint32():
+      case Uint64():
+      case Float32():
+      case Float64():
+      case SandboxedPointer():
+        return false;
+    }
+  }
+
+  RegisterRepresentation ToRegisterRepresentation() const {
+    switch (*this) {
+      case Int8():
+      case Uint8():
+      case Int16():
+      case Uint16():
+      case Int32():
+      case Uint32():
+        return RegisterRepresentation::Word32();
+      case Int64():
+      case Uint64():
+        return RegisterRepresentation::Word64();
+      case Float32():
+        return RegisterRepresentation::Float32();
+      case Float64():
+        return RegisterRepresentation::Float64();
+      case AnyTagged():
+      case TaggedPointer():
+      case TaggedSigned():
+        return RegisterRepresentation::Tagged();
+      case SandboxedPointer():
+        return RegisterRepresentation::Word64();
+    }
+  }
+
+  MachineType ToMachineType() const {
+    switch (*this) {
+      case Int8():
+        return MachineType::Int8();
+      case Uint8():
+        return MachineType::Uint8();
+      case Int16():
+        return MachineType::Int16();
+      case Uint16():
+        return MachineType::Uint16();
+      case Int32():
+        return MachineType::Int32();
+      case Uint32():
+        return MachineType::Uint32();
+      case Int64():
+        return MachineType::Int64();
+      case Uint64():
+        return MachineType::Uint64();
+      case Float32():
+        return MachineType::Float32();
+      case Float64():
+        return MachineType::Float64();
+      case AnyTagged():
+        return MachineType::AnyTagged();
+      case TaggedPointer():
+        return MachineType::TaggedPointer();
+      case TaggedSigned():
+        return MachineType::TaggedSigned();
+      case SandboxedPointer():
+        return MachineType::SandboxedPointer();
+    }
+  }
+
+  static MemoryRepresentation FromMachineType(MachineType type) {
+    switch (type.representation()) {
+      case MachineRepresentation::kWord8:
+        return type.IsSigned() ? Int8() : Uint8();
+      case MachineRepresentation::kWord16:
+        return type.IsSigned() ? Int16() : Uint16();
+      case MachineRepresentation::kWord32:
+        return type.IsSigned() ? Int32() : Uint32();
+      case MachineRepresentation::kWord64:
+        return type.IsSigned() ? Int64() : Uint64();
+      case MachineRepresentation::kTaggedSigned:
+        return TaggedSigned();
+      case MachineRepresentation::kTaggedPointer:
+        return TaggedPointer();
+      case MachineRepresentation::kTagged:
+        return AnyTagged();
+      case MachineRepresentation::kFloat32:
+        return Float32();
+      case MachineRepresentation::kFloat64:
+        return Float64();
+      case MachineRepresentation::kSandboxedPointer:
+        return SandboxedPointer();
+      case MachineRepresentation::kNone:
+      case MachineRepresentation::kMapWord:
+      case MachineRepresentation::kBit:
+      case MachineRepresentation::kSimd128:
+      case MachineRepresentation::kSimd256:
+      case MachineRepresentation::kCompressedPointer:
+      case MachineRepresentation::kCompressed:
+        UNREACHABLE();
+    }
+  }
+
+  static MemoryRepresentation FromMachineRepresentation(
+      MachineRepresentation rep) {
+    switch (rep) {
+      case MachineRepresentation::kWord8:
+        return Uint8();
+      case MachineRepresentation::kWord16:
+        return Uint16();
+      case MachineRepresentation::kWord32:
+        return Uint32();
+      case MachineRepresentation::kWord64:
+        return Uint64();
+      case MachineRepresentation::kTaggedSigned:
+        return TaggedSigned();
+      case MachineRepresentation::kTaggedPointer:
+        return TaggedPointer();
+      case MachineRepresentation::kTagged:
+        return AnyTagged();
+      case MachineRepresentation::kFloat32:
+        return Float32();
+      case MachineRepresentation::kFloat64:
+        return Float64();
+      case MachineRepresentation::kSandboxedPointer:
+        return SandboxedPointer();
+      case MachineRepresentation::kNone:
+      case MachineRepresentation::kMapWord:
+      case MachineRepresentation::kBit:
+      case MachineRepresentation::kSimd128:
+      case MachineRepresentation::kSimd256:
+      case MachineRepresentation::kCompressedPointer:
+      case MachineRepresentation::kCompressed:
+        UNREACHABLE();
+    }
+  }
+
+  uint8_t SizeInBytes() const {
+    switch (*this) {
+      case Int8():
+      case Uint8():
+        return 1;
+      case Int16():
+      case Uint16():
+        return 2;
+      case Int32():
+      case Uint32():
+      case Float32():
+        return 4;
+      case Int64():
+      case Uint64():
+      case Float64():
+      case SandboxedPointer():
+        return 8;
+      case AnyTagged():
+      case TaggedPointer():
+      case TaggedSigned():
+        return kTaggedSize;
+    }
+  }
+
+ private:
+  Enum value_;
+
+  static constexpr Enum kInvalid = static_cast<Enum>(-1);
+};
+
+V8_INLINE bool operator==(MemoryRepresentation a, MemoryRepresentation b) {
+  return a.value() == b.value();
+}
+V8_INLINE bool operator!=(MemoryRepresentation a, MemoryRepresentation b) {
+  return a.value() != b.value();
+}
+
+V8_INLINE size_t hash_value(MemoryRepresentation rep) {
+  return static_cast<size_t>(rep.value());
+}
+
+std::ostream& operator<<(std::ostream& os, MemoryRepresentation rep);
+
+}  // namespace v8::internal::compiler::turboshaft
+
+#endif  // V8_COMPILER_TURBOSHAFT_REPRESENTATIONS_H_
diff --git a/deps/v8/src/compiler/turboshaft/simplify-tf-loops.cc b/deps/v8/src/compiler/turboshaft/simplify-tf-loops.cc
new file mode 100644
index 00000000000000..e358dec90d771c
--- /dev/null
+++ b/deps/v8/src/compiler/turboshaft/simplify-tf-loops.cc
@@ -0,0 +1,58 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/compiler/turboshaft/simplify-tf-loops.h"
+
+#include "src/base/small-vector.h"
+#include "src/compiler/machine-graph.h"
+#include "src/compiler/node-properties.h"
+
+namespace v8::internal::compiler {
+
+Reduction SimplifyTFLoops::Reduce(Node* node) {
+  if (node->opcode() != IrOpcode::kLoop) return NoChange();
+  if (node->InputCount() <= 2) return NoChange();
+
+  Node* new_loop = mcgraph_->graph()->NewNode(mcgraph_->common()->Loop(2),
+                                              node->InputAt(0), node);
+  node->RemoveInput(0);
+  NodeProperties::ChangeOp(node, mcgraph_->common()->Merge(node->InputCount()));
+
+  base::SmallVector<Edge, 4> control_uses;
+
+  for (Edge edge : node->use_edges()) {
+    Node* use = edge.from();
+    if (!NodeProperties::IsPhi(use)) {
+      control_uses.emplace_back(edge);
+      continue;
+    }
+    Node* dominating_input = use->InputAt(0);
+    use->RemoveInput(0);
+    NodeProperties::ChangeOp(
+        use, use->opcode() == IrOpcode::kPhi
+                 ? mcgraph_->common()->Phi(PhiRepresentationOf(use->op()),
+                                           use->InputCount() - 1)
+                 : mcgraph_->common()->EffectPhi(use->InputCount() - 1));
+
+    Node* new_phi = mcgraph_->graph()->NewNode(
+        use->opcode() == IrOpcode::kPhi
+            ? mcgraph_->common()->Phi(PhiRepresentationOf(use->op()), 2)
+            : mcgraph_->common()->EffectPhi(2),
+        dominating_input, use, new_loop);
+
+    ReplaceWithValue(use, new_phi, new_phi, new_phi);
+    // Restore the use <- new_phi edge we just broke.
+    new_phi->ReplaceInput(1, use);
+  }
+
+  for (Edge edge : control_uses) {
+    if (edge.from() != new_loop) {
+      edge.from()->ReplaceInput(edge.index(), new_loop);
+    }
+  }
+
+  return NoChange();
+}
+
+}  // namespace v8::internal::compiler
diff --git a/deps/v8/src/compiler/turboshaft/simplify-tf-loops.h b/deps/v8/src/compiler/turboshaft/simplify-tf-loops.h
new file mode 100644
index 00000000000000..b045e653882a0d
--- /dev/null
+++ b/deps/v8/src/compiler/turboshaft/simplify-tf-loops.h
@@ -0,0 +1,31 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_COMPILER_TURBOSHAFT_SIMPLIFY_TF_LOOPS_H_
+#define V8_COMPILER_TURBOSHAFT_SIMPLIFY_TF_LOOPS_H_
+
+#include "src/compiler/graph-reducer.h"
+
+namespace v8::internal::compiler {
+
+class MachineGraph;
+
+// Constrain loop nodes to have at most two inputs, by introducing additional
+// merges as needed.
+class SimplifyTFLoops final : public AdvancedReducer {
+ public:
+  SimplifyTFLoops(Editor* editor, MachineGraph* mcgraph)
+      : AdvancedReducer(editor), mcgraph_(mcgraph) {}
+
+  const char* reducer_name() const override { return "SimplifyTFLoops"; }
+
+  Reduction Reduce(Node* node) final;
+
+ private:
+  MachineGraph* const mcgraph_;
+};
+
+}  // namespace v8::internal::compiler
+
+#endif  // V8_COMPILER_TURBOSHAFT_SIMPLIFY_TF_LOOPS_H_
diff --git a/deps/v8/src/compiler/turboshaft/utils.cc b/deps/v8/src/compiler/turboshaft/utils.cc
new file mode 100644
index 00000000000000..7d56af0f3e6742
--- /dev/null
+++ b/deps/v8/src/compiler/turboshaft/utils.cc
@@ -0,0 +1,26 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/compiler/turboshaft/utils.h"
+
+#include "src/base/platform/platform.h"
+#include "src/flags/flags.h"
+
+namespace v8::internal::compiler::turboshaft {
+
+#ifdef DEBUG
+bool ShouldSkipOptimizationStep() {
+  static std::atomic<uint64_t> counter{0};
+  uint64_t current = counter++;
+  if (current == FLAG_turboshaft_opt_bisect_break) {
+    base::OS::DebugBreak();
+  }
+  if (current >= FLAG_turboshaft_opt_bisect_limit) {
+    return true;
+  }
+  return false;
+}
+#endif  // DEBUG
+
+}  // namespace v8::internal::compiler::turboshaft
diff --git a/deps/v8/src/compiler/turboshaft/utils.h b/deps/v8/src/compiler/turboshaft/utils.h
index 03ad96dd67cbab..5ef2a67ee88fc1 100644
--- a/deps/v8/src/compiler/turboshaft/utils.h
+++ b/deps/v8/src/compiler/turboshaft/utils.h
@@ -53,11 +53,6 @@ struct all_of : std::tuple<const Ts&...> {
     return ((value == std::get<indices>(*this)) && ...);
   }
 
-  template <class T, size_t... indices>
-  bool AllNotEqualTo(const T& value, std::index_sequence<indices...>) {
-    return ((value != std::get<indices>(*this)) && ...);
-  }
-
   template <size_t... indices>
   std::ostream& PrintTo(std::ostream& os, std::index_sequence<indices...>) {
     bool first = true;
@@ -76,16 +71,17 @@ bool operator==(all_of<Ts...> values, const T& target) {
   return values.AllEqualTo(target, std::index_sequence_for<Ts...>{});
 }
 
-template <class T, class... Ts>
-bool operator!=(const T& target, all_of<Ts...> values) {
-  return values.AllNotEqualTo(target, std::index_sequence_for<Ts...>{});
-}
-
 template <class... Ts>
 std::ostream& operator<<(std::ostream& os, all_of<Ts...> all) {
   return all.PrintTo(os, std::index_sequence_for<Ts...>{});
 }
 
+#ifdef DEBUG
+bool ShouldSkipOptimizationStep();
+#else
+inline bool ShouldSkipOptimizationStep() { return false; }
+#endif
+
 }  // namespace v8::internal::compiler::turboshaft
 
 #endif  // V8_COMPILER_TURBOSHAFT_UTILS_H_
diff --git a/deps/v8/src/compiler/turboshaft/value-numbering-assembler.h b/deps/v8/src/compiler/turboshaft/value-numbering-assembler.h
index c63841d7daf4ec..341eeb8fbd796b 100644
--- a/deps/v8/src/compiler/turboshaft/value-numbering-assembler.h
+++ b/deps/v8/src/compiler/turboshaft/value-numbering-assembler.h
@@ -77,14 +77,15 @@ class ValueNumberingAssembler : public Assembler {
 
  public:
   ValueNumberingAssembler(Graph* graph, Zone* phase_zone)
-      : Assembler(graph, phase_zone), depths_heads_(phase_zone) {
+      : Assembler(graph, phase_zone),
+        dominator_path_(phase_zone),
+        depths_heads_(phase_zone) {
     table_ = phase_zone->NewVector<Entry>(
         base::bits::RoundUpToPowerOfTwo(
             std::max<size_t>(128, graph->op_id_capacity() / 2)),
         Entry());
     entry_count_ = 0;
     mask_ = table_.size() - 1;
-    current_depth_ = -1;
   }
 
 #define EMIT_OP(Name)                                    \
@@ -99,25 +100,30 @@ class ValueNumberingAssembler : public Assembler {
   TURBOSHAFT_OPERATION_LIST(EMIT_OP)
 #undef EMIT_OP
 
-  void EnterBlock(const Block& block) {
-    int new_depth = block.Depth();
-    // Remember that this assembler should only be used for OptimizationPhases
-    // that visit the graph in VisitOrder::kDominator order. We can't properly
-    // check that here, but we do two checks, which should be enough to ensure
-    // that we are actually visiting the graph in dominator order:
-    //  - There should be only one block at depth 0 (the root).
-    //  - There should be no "jumps" downward in the dominator tree ({new_depth}
-    //    cannot be lower than {current_depth}+1).
-    DCHECK_IMPLIES(current_depth_ == 0, new_depth != 0);
-    DCHECK_LE(new_depth, current_depth_ + 1);
-    if (new_depth <= current_depth_) {
-      while (current_depth_ >= new_depth) {
+  bool Bind(Block* block) {
+    if (!Base::Bind(block)) return false;
+    ResetToBlock(block);
+    dominator_path_.push_back(block);
+    depths_heads_.push_back(nullptr);
+    return true;
+  }
+
+  // Resets {table_} up to the first dominator of {block} that it contains.
+  void ResetToBlock(Block* block) {
+    Block* target = block->GetDominator();
+    while (!dominator_path_.empty() && target != nullptr &&
+           dominator_path_.back() != target) {
+      if (dominator_path_.back()->Depth() > target->Depth()) {
         ClearCurrentDepthEntries();
-        --current_depth_;
+      } else if (dominator_path_.back()->Depth() < target->Depth()) {
+        target = target->GetDominator();
+      } else {
+        // {target} and {dominator_path.back} have the same depth but are not
+        // equal, so we go one level up for both.
+        ClearCurrentDepthEntries();
+        target = target->GetDominator();
       }
     }
-    current_depth_ = new_depth;
-    depths_heads_.push_back(nullptr);
   }
 
  private:
@@ -176,6 +182,7 @@ class ValueNumberingAssembler : public Assembler {
       --entry_count_;
     }
     depths_heads_.pop_back();
+    dominator_path_.pop_back();
   }
 
   // If the table is too full, double its size and re-insert the old entries.
@@ -254,7 +261,7 @@ class ValueNumberingAssembler : public Assembler {
     return V8_LIKELY(entry > table_.begin()) ? entry - 1 : table_.end() - 1;
   }
 
-  int current_depth_;
+  ZoneVector<Block*> dominator_path_;
   base::Vector<Entry> table_;
   size_t mask_;
   size_t entry_count_;
diff --git a/deps/v8/src/compiler/type-cache.h b/deps/v8/src/compiler/type-cache.h
index 00c3ba47fed68a..48638c0a6324ed 100644
--- a/deps/v8/src/compiler/type-cache.h
+++ b/deps/v8/src/compiler/type-cache.h
@@ -5,6 +5,7 @@
 #ifndef V8_COMPILER_TYPE_CACHE_H_
 #define V8_COMPILER_TYPE_CACHE_H_
 
+#include "src/compiler/globals.h"
 #include "src/compiler/types.h"
 #include "src/date/date.h"
 #include "src/objects/js-array-buffer.h"
@@ -202,10 +203,6 @@ class V8_EXPORT_PRIVATE TypeCache final {
   }
 
   Zone* zone() { return &zone_; }
-
-  static constexpr double kMaxDoubleRepresentableInt64 = 9223372036854774784.0;
-  static constexpr double kMaxDoubleRepresentableUint64 =
-      18446744073709549568.0;
 };
 
 }  // namespace compiler
diff --git a/deps/v8/src/compiler/typed-optimization.cc b/deps/v8/src/compiler/typed-optimization.cc
index bdeb44188cc4f6..bdc94dc904c39f 100644
--- a/deps/v8/src/compiler/typed-optimization.cc
+++ b/deps/v8/src/compiler/typed-optimization.cc
@@ -580,6 +580,11 @@ Reduction TypedOptimization::ReduceStringLength(Node* node) {
       // The first value input to the {input} is the resulting length.
       return Replace(input->InputAt(0));
     }
+    case IrOpcode::kStringFromSingleCharCode: {
+      // Note that this isn't valid for StringFromCodePointAt, since it the
+      // string it returns can be 1 or 2 characters long.
+      return Replace(jsgraph()->Constant(1));
+    }
     default:
       break;
   }
diff --git a/deps/v8/src/compiler/typer.cc b/deps/v8/src/compiler/typer.cc
index b261b5e1cd0330..fbb675a6bb9efe 100644
--- a/deps/v8/src/compiler/typer.cc
+++ b/deps/v8/src/compiler/typer.cc
@@ -434,6 +434,9 @@ Type Typer::Visitor::BitwiseNot(Type type, Typer* t) {
   if (type.Is(Type::Number())) {
     return NumberBitwiseXor(type, t->cache_->kSingletonMinusOne, t);
   }
+  if (type.Is(Type::BigInt())) {
+    return Type::BigInt();
+  }
   return Type::Numeric();
 }
 
@@ -442,6 +445,9 @@ Type Typer::Visitor::Decrement(Type type, Typer* t) {
   if (type.Is(Type::Number())) {
     return NumberSubtract(type, t->cache_->kSingletonOne, t);
   }
+  if (type.Is(Type::BigInt())) {
+    return Type::BigInt();
+  }
   return Type::Numeric();
 }
 
@@ -450,6 +456,9 @@ Type Typer::Visitor::Increment(Type type, Typer* t) {
   if (type.Is(Type::Number())) {
     return NumberAdd(type, t->cache_->kSingletonOne, t);
   }
+  if (type.Is(Type::BigInt())) {
+    return Type::BigInt();
+  }
   return Type::Numeric();
 }
 
@@ -458,6 +467,9 @@ Type Typer::Visitor::Negate(Type type, Typer* t) {
   if (type.Is(Type::Number())) {
     return NumberMultiply(type, t->cache_->kSingletonMinusOne, t);
   }
+  if (type.Is(Type::BigInt())) {
+    return Type::BigInt();
+  }
   return Type::Numeric();
 }
 
@@ -862,7 +874,7 @@ Type Typer::Visitor::TypeInductionVariablePhi(Node* node) {
     max = +V8_INFINITY;
   }
 
-  if (FLAG_trace_turbo_loop) {
+  if (v8_flags.trace_turbo_loop) {
     StdoutStream{} << std::setprecision(10) << "Loop ("
                    << NodeProperties::GetControlInput(node)->id()
                    << ") variable bounds in "
@@ -1470,6 +1482,10 @@ Type Typer::Visitor::TypeJSGetSuperConstructor(Node* node) {
   return Type::NonInternal();
 }
 
+Type Typer::Visitor::TypeJSFindNonDefaultConstructorOrConstruct(Node* node) {
+  return Type::Tuple(Type::Boolean(), Type::Object(), zone());
+}
+
 // JS context operators.
 Type Typer::Visitor::TypeJSHasContextExtension(Node* node) {
   return Type::Boolean();
diff --git a/deps/v8/src/compiler/types.cc b/deps/v8/src/compiler/types.cc
index 676af8d54c44f1..c81a185da06cc0 100644
--- a/deps/v8/src/compiler/types.cc
+++ b/deps/v8/src/compiler/types.cc
@@ -227,6 +227,7 @@ Type::bitset BitsetType::Lub(const MapRefLike& map) {
     case JS_COLLATOR_TYPE:
     case JS_DATE_TIME_FORMAT_TYPE:
     case JS_DISPLAY_NAMES_TYPE:
+    case JS_DURATION_FORMAT_TYPE:
     case JS_LIST_FORMAT_TYPE:
     case JS_LOCALE_TYPE:
     case JS_NUMBER_FORMAT_TYPE:
@@ -276,13 +277,12 @@ Type::bitset BitsetType::Lub(const MapRefLike& map) {
     case JS_TEMPORAL_PLAIN_YEAR_MONTH_TYPE:
     case JS_TEMPORAL_TIME_ZONE_TYPE:
     case JS_TEMPORAL_ZONED_DATE_TIME_TYPE:
+    case JS_RAW_JSON_TYPE:
 #if V8_ENABLE_WEBASSEMBLY
-    case WASM_ARRAY_TYPE:
     case WASM_GLOBAL_OBJECT_TYPE:
     case WASM_INSTANCE_OBJECT_TYPE:
     case WASM_MEMORY_OBJECT_TYPE:
     case WASM_MODULE_OBJECT_TYPE:
-    case WASM_STRUCT_TYPE:
     case WASM_SUSPENDER_OBJECT_TYPE:
     case WASM_TABLE_OBJECT_TYPE:
     case WASM_TAG_OBJECT_TYPE:
@@ -293,6 +293,11 @@ Type::bitset BitsetType::Lub(const MapRefLike& map) {
       DCHECK(!map.is_callable());
       DCHECK(!map.is_undetectable());
       return kOtherObject;
+#if V8_ENABLE_WEBASSEMBLY
+    case WASM_STRUCT_TYPE:
+    case WASM_ARRAY_TYPE:
+      return kWasmObject;
+#endif  // V8_ENABLE_WEBASSEMBLY
     case JS_BOUND_FUNCTION_TYPE:
       DCHECK(!map.is_undetectable());
       return kBoundFunction;
@@ -1118,6 +1123,13 @@ Type Type::Tuple(Type first, Type second, Type third, Zone* zone) {
   return FromTypeBase(tuple);
 }
 
+Type Type::Tuple(Type first, Type second, Zone* zone) {
+  TupleType* tuple = TupleType::New(2, zone);
+  tuple->InitElement(0, first);
+  tuple->InitElement(1, second);
+  return FromTypeBase(tuple);
+}
+
 // static
 Type Type::OtherNumberConstant(double value, Zone* zone) {
   return FromTypeBase(OtherNumberConstantType::New(value, zone));
diff --git a/deps/v8/src/compiler/types.h b/deps/v8/src/compiler/types.h
index dd7203046c4faa..e9353682eb0631 100644
--- a/deps/v8/src/compiler/types.h
+++ b/deps/v8/src/compiler/types.h
@@ -423,6 +423,7 @@ class V8_EXPORT_PRIVATE Type {
   static Type Constant(double value, Zone* zone);
   static Type Range(double min, double max, Zone* zone);
   static Type Tuple(Type first, Type second, Type third, Zone* zone);
+  static Type Tuple(Type first, Type second, Zone* zone);
 
   static Type Union(Type type1, Type type2, Zone* zone);
   static Type Intersect(Type type1, Type type2, Zone* zone);
diff --git a/deps/v8/src/compiler/use-info.h b/deps/v8/src/compiler/use-info.h
new file mode 100644
index 00000000000000..8a97ef093589f6
--- /dev/null
+++ b/deps/v8/src/compiler/use-info.h
@@ -0,0 +1,352 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_COMPILER_USE_INFO_H_
+#define V8_COMPILER_USE_INFO_H_
+
+#include "src/base/functional.h"
+#include "src/compiler/feedback-source.h"
+#include "src/compiler/globals.h"
+
+namespace v8::internal::compiler {
+
+enum IdentifyZeros : uint8_t { kIdentifyZeros, kDistinguishZeros };
+
+class Truncation;
+size_t hash_value(const Truncation&);
+
+class Truncation final {
+ public:
+  // Constructors.
+  static Truncation None() {
+    return Truncation(TruncationKind::kNone, kIdentifyZeros);
+  }
+  static Truncation Bool() {
+    return Truncation(TruncationKind::kBool, kIdentifyZeros);
+  }
+  static Truncation Word32() {
+    return Truncation(TruncationKind::kWord32, kIdentifyZeros);
+  }
+  static Truncation Word64() {
+    return Truncation(TruncationKind::kWord64, kIdentifyZeros);
+  }
+  static Truncation OddballAndBigIntToNumber(
+      IdentifyZeros identify_zeros = kDistinguishZeros) {
+    return Truncation(TruncationKind::kOddballAndBigIntToNumber,
+                      identify_zeros);
+  }
+  static Truncation Any(IdentifyZeros identify_zeros = kDistinguishZeros) {
+    return Truncation(TruncationKind::kAny, identify_zeros);
+  }
+
+  static Truncation Generalize(Truncation t1, Truncation t2) {
+    return Truncation(
+        Generalize(t1.kind(), t2.kind()),
+        GeneralizeIdentifyZeros(t1.identify_zeros(), t2.identify_zeros()));
+  }
+
+  // Queries.
+  bool IsUnused() const { return kind_ == TruncationKind::kNone; }
+  bool IsUsedAsBool() const {
+    return LessGeneral(kind_, TruncationKind::kBool);
+  }
+  bool IsUsedAsWord32() const {
+    return LessGeneral(kind_, TruncationKind::kWord32);
+  }
+  bool IsUsedAsWord64() const {
+    return LessGeneral(kind_, TruncationKind::kWord64);
+  }
+  bool TruncatesOddballAndBigIntToNumber() const {
+    return LessGeneral(kind_, TruncationKind::kOddballAndBigIntToNumber);
+  }
+  bool IdentifiesUndefinedAndZero() {
+    return LessGeneral(kind_, TruncationKind::kWord32) ||
+           LessGeneral(kind_, TruncationKind::kBool);
+  }
+  bool IdentifiesZeroAndMinusZero() const {
+    return identify_zeros() == kIdentifyZeros;
+  }
+
+  // Operators.
+  bool operator==(Truncation other) const {
+    return kind() == other.kind() && identify_zeros() == other.identify_zeros();
+  }
+  bool operator!=(Truncation other) const { return !(*this == other); }
+
+  // Debug utilities.
+  const char* description() const;
+  bool IsLessGeneralThan(Truncation other) const {
+    return LessGeneral(kind(), other.kind()) &&
+           LessGeneralIdentifyZeros(identify_zeros(), other.identify_zeros());
+  }
+
+  IdentifyZeros identify_zeros() const { return identify_zeros_; }
+
+ private:
+  enum class TruncationKind : uint8_t {
+    kNone,
+    kBool,
+    kWord32,
+    kWord64,
+    kOddballAndBigIntToNumber,
+    kAny
+  };
+
+  explicit Truncation(TruncationKind kind, IdentifyZeros identify_zeros)
+      : kind_(kind), identify_zeros_(identify_zeros) {}
+
+  TruncationKind kind() const { return kind_; }
+
+  friend class SimplifiedLoweringVerifier;
+  friend size_t hash_value(const Truncation&);
+  TruncationKind kind_;
+  IdentifyZeros identify_zeros_;
+
+  static TruncationKind Generalize(TruncationKind rep1, TruncationKind rep2);
+  static IdentifyZeros GeneralizeIdentifyZeros(IdentifyZeros i1,
+                                               IdentifyZeros i2);
+  static bool LessGeneral(TruncationKind rep1, TruncationKind rep2);
+  static bool LessGeneralIdentifyZeros(IdentifyZeros u1, IdentifyZeros u2);
+};
+
+inline size_t hash_value(const Truncation& truncation) {
+  return base::hash_combine(truncation.kind(), truncation.identify_zeros());
+}
+
+inline std::ostream& operator<<(std::ostream& os,
+                                const Truncation& truncation) {
+  return os << truncation.description();
+}
+
+enum class TypeCheckKind : uint8_t {
+  kNone,
+  kSignedSmall,
+  kSigned32,
+  kSigned64,
+  kNumber,
+  kNumberOrBoolean,
+  kNumberOrOddball,
+  kHeapObject,
+  kBigInt,
+  kBigInt64,
+  kArrayIndex
+};
+
+inline std::ostream& operator<<(std::ostream& os, TypeCheckKind type_check) {
+  switch (type_check) {
+    case TypeCheckKind::kNone:
+      return os << "None";
+    case TypeCheckKind::kSignedSmall:
+      return os << "SignedSmall";
+    case TypeCheckKind::kSigned32:
+      return os << "Signed32";
+    case TypeCheckKind::kSigned64:
+      return os << "Signed64";
+    case TypeCheckKind::kNumber:
+      return os << "Number";
+    case TypeCheckKind::kNumberOrBoolean:
+      return os << "NumberOrBoolean";
+    case TypeCheckKind::kNumberOrOddball:
+      return os << "NumberOrOddball";
+    case TypeCheckKind::kHeapObject:
+      return os << "HeapObject";
+    case TypeCheckKind::kBigInt:
+      return os << "BigInt";
+    case TypeCheckKind::kBigInt64:
+      return os << "BigInt64";
+    case TypeCheckKind::kArrayIndex:
+      return os << "ArrayIndex";
+  }
+  UNREACHABLE();
+}
+
+// The {UseInfo} class is used to describe a use of an input of a node.
+//
+// This information is used in two different ways, based on the phase:
+//
+// 1. During propagation, the use info is used to inform the input node
+//    about what part of the input is used (we call this truncation) and what
+//    is the preferred representation. For conversions that will require
+//    checks, we also keep track of whether a minus zero check is needed.
+//
+// 2. During lowering, the use info is used to properly convert the input
+//    to the preferred representation. The preferred representation might be
+//    insufficient to do the conversion (e.g. word32->float64 conv), so we also
+//    need the signedness information to produce the correct value.
+//    Additionally, use info may contain {CheckParameters} which contains
+//    information for the deoptimizer such as a CallIC on which speculation
+//    should be disallowed if the check fails.
+class UseInfo {
+ public:
+  UseInfo(MachineRepresentation representation, Truncation truncation,
+          TypeCheckKind type_check = TypeCheckKind::kNone,
+          const FeedbackSource& feedback = FeedbackSource())
+      : representation_(representation),
+        truncation_(truncation),
+        type_check_(type_check),
+        feedback_(feedback) {}
+  static UseInfo TruncatingWord32() {
+    return UseInfo(MachineRepresentation::kWord32, Truncation::Word32());
+  }
+  static UseInfo CheckedBigIntTruncatingWord64(const FeedbackSource& feedback) {
+    // Note that Trunction::Word64() can safely use kIdentifyZero, because
+    // TypeCheckKind::kBigInt will make sure we deopt for anything other than
+    // type BigInt anyway.
+    return UseInfo(MachineRepresentation::kWord64, Truncation::Word64(),
+                   TypeCheckKind::kBigInt, feedback);
+  }
+  static UseInfo CheckedBigInt64AsWord64(const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kWord64, Truncation::Any(),
+                   TypeCheckKind::kBigInt64, feedback);
+  }
+  static UseInfo Word64() {
+    return UseInfo(MachineRepresentation::kWord64, Truncation::Any());
+  }
+  static UseInfo Word() {
+    return UseInfo(MachineType::PointerRepresentation(), Truncation::Any());
+  }
+  static UseInfo Bool() {
+    return UseInfo(MachineRepresentation::kBit, Truncation::Bool());
+  }
+  static UseInfo Float32() {
+    return UseInfo(MachineRepresentation::kFloat32, Truncation::Any());
+  }
+  static UseInfo Float64() {
+    return UseInfo(MachineRepresentation::kFloat64, Truncation::Any());
+  }
+  static UseInfo TruncatingFloat64(
+      IdentifyZeros identify_zeros = kDistinguishZeros) {
+    return UseInfo(MachineRepresentation::kFloat64,
+                   Truncation::OddballAndBigIntToNumber(identify_zeros));
+  }
+  static UseInfo AnyTagged() {
+    return UseInfo(MachineRepresentation::kTagged, Truncation::Any());
+  }
+  static UseInfo TaggedSigned() {
+    return UseInfo(MachineRepresentation::kTaggedSigned, Truncation::Any());
+  }
+  static UseInfo TaggedPointer() {
+    return UseInfo(MachineRepresentation::kTaggedPointer, Truncation::Any());
+  }
+
+  // Possibly deoptimizing conversions.
+  static UseInfo CheckedTaggedAsArrayIndex(const FeedbackSource& feedback) {
+    return UseInfo(MachineType::PointerRepresentation(),
+                   Truncation::Any(kIdentifyZeros), TypeCheckKind::kArrayIndex,
+                   feedback);
+  }
+  static UseInfo CheckedHeapObjectAsTaggedPointer(
+      const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kTaggedPointer, Truncation::Any(),
+                   TypeCheckKind::kHeapObject, feedback);
+  }
+
+  static UseInfo CheckedBigIntAsTaggedPointer(const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kTaggedPointer, Truncation::Any(),
+                   TypeCheckKind::kBigInt, feedback);
+  }
+
+  static UseInfo CheckedSignedSmallAsTaggedSigned(
+      const FeedbackSource& feedback,
+      IdentifyZeros identify_zeros = kDistinguishZeros) {
+    return UseInfo(MachineRepresentation::kTaggedSigned,
+                   Truncation::Any(identify_zeros), TypeCheckKind::kSignedSmall,
+                   feedback);
+  }
+  static UseInfo CheckedSignedSmallAsWord32(IdentifyZeros identify_zeros,
+                                            const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kWord32,
+                   Truncation::Any(identify_zeros), TypeCheckKind::kSignedSmall,
+                   feedback);
+  }
+  static UseInfo CheckedSigned32AsWord32(IdentifyZeros identify_zeros,
+                                         const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kWord32,
+                   Truncation::Any(identify_zeros), TypeCheckKind::kSigned32,
+                   feedback);
+  }
+  static UseInfo CheckedSigned64AsWord64(IdentifyZeros identify_zeros,
+                                         const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kWord64,
+                   Truncation::Any(identify_zeros), TypeCheckKind::kSigned64,
+                   feedback);
+  }
+  static UseInfo CheckedNumberAsFloat64(IdentifyZeros identify_zeros,
+                                        const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kFloat64,
+                   Truncation::Any(identify_zeros), TypeCheckKind::kNumber,
+                   feedback);
+  }
+  static UseInfo CheckedNumberAsWord32(const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kWord32, Truncation::Word32(),
+                   TypeCheckKind::kNumber, feedback);
+  }
+  static UseInfo CheckedNumberOrBooleanAsFloat64(
+      IdentifyZeros identify_zeros, const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kFloat64,
+                   Truncation::Any(identify_zeros),
+                   TypeCheckKind::kNumberOrBoolean, feedback);
+  }
+  static UseInfo CheckedNumberOrOddballAsFloat64(
+      IdentifyZeros identify_zeros, const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kFloat64,
+                   Truncation::Any(identify_zeros),
+                   TypeCheckKind::kNumberOrOddball, feedback);
+  }
+  static UseInfo CheckedNumberOrOddballAsWord32(
+      const FeedbackSource& feedback) {
+    return UseInfo(MachineRepresentation::kWord32, Truncation::Word32(),
+                   TypeCheckKind::kNumberOrOddball, feedback);
+  }
+
+  // Undetermined representation.
+  static UseInfo Any() {
+    return UseInfo(MachineRepresentation::kNone, Truncation::Any());
+  }
+  static UseInfo AnyTruncatingToBool() {
+    return UseInfo(MachineRepresentation::kNone, Truncation::Bool());
+  }
+
+  // Value not used.
+  static UseInfo None() {
+    return UseInfo(MachineRepresentation::kNone, Truncation::None());
+  }
+
+  MachineRepresentation representation() const { return representation_; }
+  Truncation truncation() const { return truncation_; }
+  TypeCheckKind type_check() const { return type_check_; }
+  CheckForMinusZeroMode minus_zero_check() const {
+    return truncation().IdentifiesZeroAndMinusZero()
+               ? CheckForMinusZeroMode::kDontCheckForMinusZero
+               : CheckForMinusZeroMode::kCheckForMinusZero;
+  }
+  const FeedbackSource& feedback() const { return feedback_; }
+
+ private:
+  MachineRepresentation representation_;
+  Truncation truncation_;
+  TypeCheckKind type_check_;
+  FeedbackSource feedback_;
+};
+
+inline bool operator==(const UseInfo& lhs, const UseInfo& rhs) {
+  return lhs.representation() == rhs.representation() &&
+         lhs.truncation() == rhs.truncation() &&
+         lhs.type_check() == rhs.type_check() &&
+         lhs.feedback() == rhs.feedback();
+}
+
+inline size_t hash_value(const UseInfo& use_info) {
+  return base::hash_combine(use_info.representation(), use_info.truncation(),
+                            use_info.type_check(), use_info.feedback());
+}
+
+inline std::ostream& operator<<(std::ostream& os, const UseInfo& use_info) {
+  return os << use_info.representation() << ", " << use_info.truncation()
+            << ", " << use_info.type_check() << ", " << use_info.feedback();
+}
+
+}  // namespace v8::internal::compiler
+
+#endif  // V8_COMPILER_USE_INFO_H_
diff --git a/deps/v8/src/compiler/verifier.cc b/deps/v8/src/compiler/verifier.cc
index 9d1959a77616e0..1f7f74918436cd 100644
--- a/deps/v8/src/compiler/verifier.cc
+++ b/deps/v8/src/compiler/verifier.cc
@@ -48,7 +48,7 @@ class Verifier::Visitor {
  private:
   void CheckNotTyped(Node* node) {
     // Verification of simplified lowering sets types of many additional nodes.
-    if (FLAG_verify_simplified_lowering) return;
+    if (v8_flags.verify_simplified_lowering) return;
 
     if (NodeProperties::IsTyped(node)) {
       std::ostringstream str;
@@ -790,7 +790,10 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) {
       CheckValueInputIs(node, 0, Type::Any());
       CheckTypeIs(node, Type::NonInternal());
       break;
-
+    case IrOpcode::kJSFindNonDefaultConstructorOrConstruct:
+      CheckValueInputIs(node, 0, Type::Any());
+      CheckValueInputIs(node, 1, Type::Any());
+      break;
     case IrOpcode::kJSHasContextExtension:
       CheckTypeIs(node, Type::Boolean());
       break;
@@ -1513,6 +1516,7 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) {
     case IrOpcode::kCheckedUint32ToTaggedSigned:
     case IrOpcode::kCheckedUint64Bounds:
     case IrOpcode::kCheckedUint64ToInt32:
+    case IrOpcode::kCheckedUint64ToInt64:
     case IrOpcode::kCheckedUint64ToTaggedSigned:
     case IrOpcode::kCheckedFloat64ToInt32:
     case IrOpcode::kCheckedFloat64ToInt64:
@@ -1524,6 +1528,7 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) {
     case IrOpcode::kCheckedTaggedToTaggedSigned:
     case IrOpcode::kCheckedTaggedToTaggedPointer:
     case IrOpcode::kCheckedTruncateTaggedToWord32:
+    case IrOpcode::kCheckedBigInt64Add:
     case IrOpcode::kAssertType:
     case IrOpcode::kVerifyType:
       break;
@@ -1642,6 +1647,10 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) {
       CheckValueInputIs(node, 0, Type::Any());
       CheckTypeIs(node, Type::BigInt());
       break;
+    case IrOpcode::kCheckBigInt64:
+      CheckValueInputIs(node, 0, Type::Any());
+      CheckTypeIs(node, Type::SignedBigInt64());
+      break;
     case IrOpcode::kFastApiCall:
       CHECK_GE(value_count, 1);
       CheckValueInputIs(node, 0, Type::Any());  // receiver
@@ -1733,12 +1742,15 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) {
     case IrOpcode::kInt64Sub:
     case IrOpcode::kInt64SubWithOverflow:
     case IrOpcode::kInt64Mul:
+    case IrOpcode::kInt64MulHigh:
+    case IrOpcode::kInt64MulWithOverflow:
     case IrOpcode::kInt64Div:
     case IrOpcode::kInt64Mod:
     case IrOpcode::kInt64LessThan:
     case IrOpcode::kInt64LessThanOrEqual:
     case IrOpcode::kUint64Div:
     case IrOpcode::kUint64Mod:
+    case IrOpcode::kUint64MulHigh:
     case IrOpcode::kUint64LessThan:
     case IrOpcode::kUint64LessThanOrEqual:
     case IrOpcode::kFloat32Add:
diff --git a/deps/v8/src/compiler/wasm-compiler-definitions.h b/deps/v8/src/compiler/wasm-compiler-definitions.h
index 01cc8c3580ca27..f6a5eabcdddde2 100644
--- a/deps/v8/src/compiler/wasm-compiler-definitions.h
+++ b/deps/v8/src/compiler/wasm-compiler-definitions.h
@@ -20,6 +20,7 @@ namespace compiler {
 
 struct WasmTypeCheckConfig {
   bool object_can_be_null;
+  bool null_succeeds;
   uint8_t rtt_depth;
 };
 
diff --git a/deps/v8/src/compiler/wasm-compiler.cc b/deps/v8/src/compiler/wasm-compiler.cc
index 6fd0c2696dc8cf..d30177f961ea03 100644
--- a/deps/v8/src/compiler/wasm-compiler.cc
+++ b/deps/v8/src/compiler/wasm-compiler.cc
@@ -42,7 +42,6 @@
 #include "src/tracing/trace-event.h"
 #include "src/trap-handler/trap-handler.h"
 #include "src/wasm/code-space-access.h"
-#include "src/wasm/function-body-decoder-impl.h"
 #include "src/wasm/function-compiler.h"
 #include "src/wasm/graph-builder-interface.h"
 #include "src/wasm/jump-table-assembler.h"
@@ -56,6 +55,7 @@
 #include "src/wasm/wasm-module.h"
 #include "src/wasm/wasm-objects-inl.h"
 #include "src/wasm/wasm-opcodes-inl.h"
+#include "src/wasm/wasm-subtyping.h"
 
 namespace v8 {
 namespace internal {
@@ -2842,17 +2842,11 @@ Node* WasmGraphBuilder::BuildIndirectCall(uint32_t table_index,
   // Note: Since null entries are identified by having ift_sig_id (-1), we only
   // need one comparison.
   // TODO(9495): Change this if we should do full function subtyping instead.
-  Node* expected_sig_id;
-  if (v8_flags.wasm_type_canonicalization) {
-    Node* isorecursive_canonical_types =
-        LOAD_INSTANCE_FIELD(IsorecursiveCanonicalTypes, MachineType::Pointer());
-    expected_sig_id = gasm_->LoadImmutable(
-        MachineType::Uint32(), isorecursive_canonical_types,
-        gasm_->IntPtrConstant(sig_index * kInt32Size));
-  } else {
-    expected_sig_id =
-        Int32Constant(env_->module->per_module_canonical_type_ids[sig_index]);
-  }
+  Node* isorecursive_canonical_types =
+      LOAD_INSTANCE_FIELD(IsorecursiveCanonicalTypes, MachineType::Pointer());
+  Node* expected_sig_id =
+      gasm_->LoadImmutable(MachineType::Uint32(), isorecursive_canonical_types,
+                           gasm_->IntPtrConstant(sig_index * kInt32Size));
 
   Node* int32_scaled_key = gasm_->BuildChangeUint32ToUintPtr(
       gasm_->Word32Shl(key, Int32Constant(2)));
@@ -5436,21 +5430,47 @@ WasmGraphBuilder::Callbacks WasmGraphBuilder::BranchCallbacks(
 }
 
 void WasmGraphBuilder::DataCheck(Node* object, bool object_can_be_null,
-                                 Callbacks callbacks) {
+                                 Callbacks callbacks, bool null_succeeds) {
   if (object_can_be_null) {
-    callbacks.fail_if(IsNull(object), BranchHint::kFalse);
+    if (null_succeeds) {
+      callbacks.succeed_if(IsNull(object), BranchHint::kFalse);
+    } else {
+      // TODO(7748): Is the extra null check actually beneficial for
+      // performance?
+      callbacks.fail_if(IsNull(object), BranchHint::kFalse);
+    }
   }
   callbacks.fail_if(gasm_->IsI31(object), BranchHint::kFalse);
   Node* map = gasm_->LoadMap(object);
   callbacks.fail_if_not(gasm_->IsDataRefMap(map), BranchHint::kTrue);
 }
 
+void WasmGraphBuilder::EqCheck(Node* object, bool object_can_be_null,
+                               Callbacks callbacks, bool null_succeeds) {
+  // TODO(7748): Is the extra null check actually beneficial for performance?
+  if (object_can_be_null) {
+    if (null_succeeds) {
+      callbacks.succeed_if(IsNull(object), BranchHint::kFalse);
+    } else {
+      callbacks.fail_if(IsNull(object), BranchHint::kFalse);
+    }
+  }
+  callbacks.succeed_if(gasm_->IsI31(object), BranchHint::kFalse);
+  Node* map = gasm_->LoadMap(object);
+  callbacks.fail_if_not(gasm_->IsDataRefMap(map), BranchHint::kTrue);
+}
+
 void WasmGraphBuilder::ManagedObjectInstanceCheck(Node* object,
                                                   bool object_can_be_null,
                                                   InstanceType instance_type,
-                                                  Callbacks callbacks) {
+                                                  Callbacks callbacks,
+                                                  bool null_succeeds) {
   if (object_can_be_null) {
-    callbacks.fail_if(IsNull(object), BranchHint::kFalse);
+    if (null_succeeds) {
+      callbacks.succeed_if(IsNull(object), BranchHint::kFalse);
+    } else {
+      callbacks.fail_if(IsNull(object), BranchHint::kFalse);
+    }
   }
   callbacks.fail_if(gasm_->IsI31(object), BranchHint::kFalse);
   callbacks.fail_if_not(gasm_->HasInstanceType(object, instance_type),
@@ -5501,6 +5521,27 @@ Node* WasmGraphBuilder::RefTest(Node* object, Node* rtt,
   return gasm_->WasmTypeCheck(object, rtt, config);
 }
 
+Node* WasmGraphBuilder::RefTestAbstract(Node* object, wasm::HeapType type,
+                                        bool null_succeeds) {
+  bool is_nullable =
+      compiler::NodeProperties::GetType(object).AsWasm().type.is_nullable();
+  switch (type.representation()) {
+    case wasm::HeapType::kEq:
+      return RefIsEq(object, is_nullable, null_succeeds);
+    case wasm::HeapType::kI31:
+      return RefIsI31(object, null_succeeds);
+    case wasm::HeapType::kData:
+      return RefIsData(object, is_nullable, null_succeeds);
+    case wasm::HeapType::kArray:
+      return RefIsArray(object, is_nullable, null_succeeds);
+    case wasm::HeapType::kAny:
+      // Any may never need a cast as it is either implicitly convertible or
+      // never convertible for any given type.
+    default:
+      UNREACHABLE();
+  }
+}
+
 Node* WasmGraphBuilder::RefCast(Node* object, Node* rtt,
                                 WasmTypeCheckConfig config,
                                 wasm::WasmCodePosition position) {
@@ -5522,9 +5563,19 @@ void WasmGraphBuilder::BrOnCast(Node* object, Node* rtt,
   *no_match_control = false_node;
 }
 
-Node* WasmGraphBuilder::RefIsData(Node* object, bool object_can_be_null) {
+Node* WasmGraphBuilder::RefIsEq(Node* object, bool object_can_be_null,
+                                bool null_succeeds) {
   auto done = gasm_->MakeLabel(MachineRepresentation::kWord32);
-  DataCheck(object, object_can_be_null, TestCallbacks(&done));
+  EqCheck(object, object_can_be_null, TestCallbacks(&done), null_succeeds);
+  gasm_->Goto(&done, Int32Constant(1));
+  gasm_->Bind(&done);
+  return done.PhiAt(0);
+}
+
+Node* WasmGraphBuilder::RefIsData(Node* object, bool object_can_be_null,
+                                  bool null_succeeds) {
+  auto done = gasm_->MakeLabel(MachineRepresentation::kWord32);
+  DataCheck(object, object_can_be_null, TestCallbacks(&done), null_succeeds);
   gasm_->Goto(&done, Int32Constant(1));
   gasm_->Bind(&done);
   return done.PhiAt(0);
@@ -5532,8 +5583,10 @@ Node* WasmGraphBuilder::RefIsData(Node* object, bool object_can_be_null) {
 
 Node* WasmGraphBuilder::RefAsData(Node* object, bool object_can_be_null,
                                   wasm::WasmCodePosition position) {
+  bool null_succeeds = false;
   auto done = gasm_->MakeLabel();
-  DataCheck(object, object_can_be_null, CastCallbacks(&done, position));
+  DataCheck(object, object_can_be_null, CastCallbacks(&done, position),
+            null_succeeds);
   gasm_->Goto(&done);
   gasm_->Bind(&done);
   return object;
@@ -5544,16 +5597,19 @@ void WasmGraphBuilder::BrOnData(Node* object, Node* /*rtt*/,
                                 Node** match_control, Node** match_effect,
                                 Node** no_match_control,
                                 Node** no_match_effect) {
+  bool null_succeeds = false;
   BrOnCastAbs(match_control, match_effect, no_match_control, no_match_effect,
               [=](Callbacks callbacks) -> void {
-                return DataCheck(object, config.object_can_be_null, callbacks);
+                return DataCheck(object, config.object_can_be_null, callbacks,
+                                 null_succeeds);
               });
 }
 
-Node* WasmGraphBuilder::RefIsArray(Node* object, bool object_can_be_null) {
+Node* WasmGraphBuilder::RefIsArray(Node* object, bool object_can_be_null,
+                                   bool null_succeeds) {
   auto done = gasm_->MakeLabel(MachineRepresentation::kWord32);
   ManagedObjectInstanceCheck(object, object_can_be_null, WASM_ARRAY_TYPE,
-                             TestCallbacks(&done));
+                             TestCallbacks(&done), null_succeeds);
   gasm_->Goto(&done, Int32Constant(1));
   gasm_->Bind(&done);
   return done.PhiAt(0);
@@ -5561,9 +5617,10 @@ Node* WasmGraphBuilder::RefIsArray(Node* object, bool object_can_be_null) {
 
 Node* WasmGraphBuilder::RefAsArray(Node* object, bool object_can_be_null,
                                    wasm::WasmCodePosition position) {
+  bool null_succeeds = false;
   auto done = gasm_->MakeLabel();
   ManagedObjectInstanceCheck(object, object_can_be_null, WASM_ARRAY_TYPE,
-                             CastCallbacks(&done, position));
+                             CastCallbacks(&done, position), null_succeeds);
   gasm_->Goto(&done);
   gasm_->Bind(&done);
   return object;
@@ -5574,15 +5631,26 @@ void WasmGraphBuilder::BrOnArray(Node* object, Node* /*rtt*/,
                                  Node** match_control, Node** match_effect,
                                  Node** no_match_control,
                                  Node** no_match_effect) {
+  bool null_succeeds = false;
   BrOnCastAbs(match_control, match_effect, no_match_control, no_match_effect,
               [=](Callbacks callbacks) -> void {
-                return ManagedObjectInstanceCheck(object,
-                                                  config.object_can_be_null,
-                                                  WASM_ARRAY_TYPE, callbacks);
+                return ManagedObjectInstanceCheck(
+                    object, config.object_can_be_null, WASM_ARRAY_TYPE,
+                    callbacks, null_succeeds);
               });
 }
 
-Node* WasmGraphBuilder::RefIsI31(Node* object) { return gasm_->IsI31(object); }
+Node* WasmGraphBuilder::RefIsI31(Node* object, bool null_succeeds) {
+  if (null_succeeds) {
+    auto done = gasm_->MakeLabel(MachineRepresentation::kWord32);
+    gasm_->GotoIf(gasm_->IsI31(object), &done, BranchHint::kTrue,
+                  Int32Constant(1));
+    gasm_->Goto(&done, gasm_->IsNull(object));
+    gasm_->Bind(&done);
+    return done.PhiAt(0);
+  }
+  return gasm_->IsI31(object);
+}
 
 Node* WasmGraphBuilder::RefAsI31(Node* object,
                                  wasm::WasmCodePosition position) {
@@ -5731,36 +5799,49 @@ void WasmGraphBuilder::ArrayCopy(Node* dst_array, Node* dst_index,
   gasm_->Bind(&skip);
 }
 
+// General rules for operator properties for builtin calls:
+// - Use kEliminatable if it can neither throw a catchable exception nor trap.
+// - Use kNoDeopt | kNoThrow if it can trap (because in that case, eliminating
+//   it would avoid the trap and thereby observably change the code's behavior
+//   compared to its unoptimized version).
+// - If you don't use kNoThrow (nor kEliminatable which implies it), then you
+//   must also set up control nodes for the throwing case, e.g. by using
+//   WasmGraphBuildingInterface::CheckForException().
+
 Node* WasmGraphBuilder::StringNewWtf8(uint32_t memory,
                                       unibrow::Utf8Variant variant,
                                       Node* offset, Node* size) {
-  return gasm_->CallBuiltin(Builtin::kWasmStringNewWtf8, Operator::kNoDeopt,
-                            offset, size, gasm_->SmiConstant(memory),
+  return gasm_->CallBuiltin(Builtin::kWasmStringNewWtf8,
+                            Operator::kNoDeopt | Operator::kNoThrow, offset,
+                            size, gasm_->SmiConstant(memory),
                             gasm_->SmiConstant(static_cast<int32_t>(variant)));
 }
 
 Node* WasmGraphBuilder::StringNewWtf8Array(unibrow::Utf8Variant variant,
                                            Node* array, Node* start,
                                            Node* end) {
-  return gasm_->CallBuiltin(Builtin::kWasmStringNewWtf8Array,
-                            Operator::kNoDeopt, start, end, array,
-                            gasm_->SmiConstant(static_cast<int32_t>(variant)));
+  return gasm_->CallBuiltin(
+      Builtin::kWasmStringNewWtf8Array, Operator::kNoDeopt | Operator::kNoThrow,
+      start, end, array, gasm_->SmiConstant(static_cast<int32_t>(variant)));
 }
 
 Node* WasmGraphBuilder::StringNewWtf16(uint32_t memory, Node* offset,
                                        Node* size) {
-  return gasm_->CallBuiltin(Builtin::kWasmStringNewWtf16, Operator::kNoDeopt,
+  return gasm_->CallBuiltin(Builtin::kWasmStringNewWtf16,
+                            Operator::kNoDeopt | Operator::kNoThrow,
                             gasm_->Uint32Constant(memory), offset, size);
 }
 
 Node* WasmGraphBuilder::StringNewWtf16Array(Node* array, Node* start,
                                             Node* end) {
   return gasm_->CallBuiltin(Builtin::kWasmStringNewWtf16Array,
-                            Operator::kNoDeopt, array, start, end);
+                            Operator::kNoDeopt | Operator::kNoThrow, array,
+                            start, end);
 }
 
 Node* WasmGraphBuilder::StringConst(uint32_t index) {
-  return gasm_->CallBuiltin(Builtin::kWasmStringConst, Operator::kNoDeopt,
+  return gasm_->CallBuiltin(Builtin::kWasmStringConst,
+                            Operator::kNoDeopt | Operator::kNoThrow,
                             gasm_->Uint32Constant(index));
 }
 
@@ -5769,8 +5850,8 @@ Node* WasmGraphBuilder::StringMeasureUtf8(Node* string, CheckForNull null_check,
   if (null_check == kWithNullCheck) {
     string = AssertNotNull(string, position);
   }
-  return gasm_->CallBuiltin(Builtin::kWasmStringMeasureUtf8, Operator::kNoDeopt,
-                            string);
+  return gasm_->CallBuiltin(Builtin::kWasmStringMeasureUtf8,
+                            Operator::kEliminatable, string);
 }
 
 Node* WasmGraphBuilder::StringMeasureWtf8(Node* string, CheckForNull null_check,
@@ -5778,8 +5859,8 @@ Node* WasmGraphBuilder::StringMeasureWtf8(Node* string, CheckForNull null_check,
   if (null_check == kWithNullCheck) {
     string = AssertNotNull(string, position);
   }
-  return gasm_->CallBuiltin(Builtin::kWasmStringMeasureWtf8, Operator::kNoDeopt,
-                            string);
+  return gasm_->CallBuiltin(Builtin::kWasmStringMeasureWtf8,
+                            Operator::kEliminatable, string);
 }
 
 Node* WasmGraphBuilder::StringMeasureWtf16(Node* string,
@@ -5801,8 +5882,9 @@ Node* WasmGraphBuilder::StringEncodeWtf8(uint32_t memory,
   if (null_check == kWithNullCheck) {
     string = AssertNotNull(string, position);
   }
-  return gasm_->CallBuiltin(Builtin::kWasmStringEncodeWtf8, Operator::kNoDeopt,
-                            string, offset, gasm_->SmiConstant(memory),
+  return gasm_->CallBuiltin(Builtin::kWasmStringEncodeWtf8,
+                            Operator::kNoDeopt | Operator::kNoThrow, string,
+                            offset, gasm_->SmiConstant(memory),
                             gasm_->SmiConstant(static_cast<int32_t>(variant)));
 }
 
@@ -5817,7 +5899,8 @@ Node* WasmGraphBuilder::StringEncodeWtf8Array(
     array = AssertNotNull(array, position);
   }
   return gasm_->CallBuiltin(Builtin::kWasmStringEncodeWtf8Array,
-                            Operator::kNoDeopt, string, array, start,
+                            Operator::kNoDeopt | Operator::kNoThrow, string,
+                            array, start,
                             gasm_->SmiConstant(static_cast<int32_t>(variant)));
 }
 
@@ -5827,8 +5910,9 @@ Node* WasmGraphBuilder::StringEncodeWtf16(uint32_t memory, Node* string,
   if (null_check == kWithNullCheck) {
     string = AssertNotNull(string, position);
   }
-  return gasm_->CallBuiltin(Builtin::kWasmStringEncodeWtf16, Operator::kNoDeopt,
-                            string, offset, gasm_->SmiConstant(memory));
+  return gasm_->CallBuiltin(Builtin::kWasmStringEncodeWtf16,
+                            Operator::kNoDeopt | Operator::kNoThrow, string,
+                            offset, gasm_->SmiConstant(memory));
 }
 
 Node* WasmGraphBuilder::StringEncodeWtf16Array(
@@ -5842,7 +5926,8 @@ Node* WasmGraphBuilder::StringEncodeWtf16Array(
     array = AssertNotNull(array, position);
   }
   return gasm_->CallBuiltin(Builtin::kWasmStringEncodeWtf16Array,
-                            Operator::kNoDeopt, string, array, start);
+                            Operator::kNoDeopt | Operator::kNoThrow, string,
+                            array, start);
 }
 
 Node* WasmGraphBuilder::StringConcat(Node* head, CheckForNull head_null_check,
@@ -5851,7 +5936,8 @@ Node* WasmGraphBuilder::StringConcat(Node* head, CheckForNull head_null_check,
   if (head_null_check == kWithNullCheck) head = AssertNotNull(head, position);
   if (tail_null_check == kWithNullCheck) tail = AssertNotNull(tail, position);
   return gasm_->CallBuiltin(
-      Builtin::kStringAdd_CheckNone, Operator::kEliminatable, head, tail,
+      Builtin::kStringAdd_CheckNone, Operator::kNoDeopt | Operator::kNoThrow,
+      head, tail,
       LOAD_INSTANCE_FIELD(NativeContext, MachineType::TaggedPointer()));
 }
 
@@ -5868,7 +5954,7 @@ Node* WasmGraphBuilder::StringEqual(Node* a, CheckForNull a_null_check, Node* b,
     gasm_->GotoIf(gasm_->IsNull(b), &done, Int32Constant(0));
   }
   gasm_->Goto(&done, gasm_->CallBuiltin(Builtin::kWasmStringEqual,
-                                        Operator::kNoDeopt, a, b));
+                                        Operator::kEliminatable, a, b));
   gasm_->Bind(&done);
   return done.PhiAt(0);
 }
@@ -5878,14 +5964,14 @@ Node* WasmGraphBuilder::StringIsUSVSequence(Node* str, CheckForNull null_check,
   if (null_check == kWithNullCheck) str = AssertNotNull(str, position);
 
   return gasm_->CallBuiltin(Builtin::kWasmStringIsUSVSequence,
-                            Operator::kNoDeopt, str);
+                            Operator::kEliminatable, str);
 }
 
 Node* WasmGraphBuilder::StringAsWtf8(Node* str, CheckForNull null_check,
                                      wasm::WasmCodePosition position) {
   if (null_check == kWithNullCheck) str = AssertNotNull(str, position);
 
-  return gasm_->CallBuiltin(Builtin::kWasmStringAsWtf8, Operator::kNoDeopt,
+  return gasm_->CallBuiltin(Builtin::kWasmStringAsWtf8, Operator::kEliminatable,
                             str);
 }
 
@@ -5896,7 +5982,7 @@ Node* WasmGraphBuilder::StringViewWtf8Advance(Node* view,
   if (null_check == kWithNullCheck) view = AssertNotNull(view, position);
 
   return gasm_->CallBuiltin(Builtin::kWasmStringViewWtf8Advance,
-                            Operator::kNoDeopt, view, pos, bytes);
+                            Operator::kEliminatable, view, pos, bytes);
 }
 
 void WasmGraphBuilder::StringViewWtf8Encode(
@@ -5907,8 +5993,9 @@ void WasmGraphBuilder::StringViewWtf8Encode(
     view = AssertNotNull(view, position);
   }
   Node* pair =
-      gasm_->CallBuiltin(Builtin::kWasmStringViewWtf8Encode, Operator::kNoDeopt,
-                         addr, pos, bytes, view, gasm_->SmiConstant(memory),
+      gasm_->CallBuiltin(Builtin::kWasmStringViewWtf8Encode,
+                         Operator::kNoDeopt | Operator::kNoThrow, addr, pos,
+                         bytes, view, gasm_->SmiConstant(memory),
                          gasm_->SmiConstant(static_cast<int32_t>(variant)));
   *next_pos = gasm_->Projection(0, pair);
   *bytes_written = gasm_->Projection(1, pair);
@@ -5921,7 +6008,7 @@ Node* WasmGraphBuilder::StringViewWtf8Slice(Node* view, CheckForNull null_check,
     view = AssertNotNull(view, position);
   }
   return gasm_->CallBuiltin(Builtin::kWasmStringViewWtf8Slice,
-                            Operator::kNoDeopt, view, pos, bytes);
+                            Operator::kEliminatable, view, pos, bytes);
 }
 
 Node* WasmGraphBuilder::StringViewWtf16GetCodeUnit(
@@ -5931,7 +6018,8 @@ Node* WasmGraphBuilder::StringViewWtf16GetCodeUnit(
     string = AssertNotNull(string, position);
   }
   return gasm_->CallBuiltin(Builtin::kWasmStringViewWtf16GetCodeUnit,
-                            Operator::kNoDeopt, string, offset);
+                            Operator::kNoDeopt | Operator::kNoThrow, string,
+                            offset);
 }
 
 Node* WasmGraphBuilder::StringViewWtf16Encode(uint32_t memory, Node* string,
@@ -5943,8 +6031,9 @@ Node* WasmGraphBuilder::StringViewWtf16Encode(uint32_t memory, Node* string,
     string = AssertNotNull(string, position);
   }
   return gasm_->CallBuiltin(Builtin::kWasmStringViewWtf16Encode,
-                            Operator::kNoDeopt, offset, start, codeunits,
-                            string, gasm_->SmiConstant(memory));
+                            Operator::kNoDeopt | Operator::kNoThrow, offset,
+                            start, codeunits, string,
+                            gasm_->SmiConstant(memory));
 }
 
 Node* WasmGraphBuilder::StringViewWtf16Slice(Node* string,
@@ -5955,14 +6044,14 @@ Node* WasmGraphBuilder::StringViewWtf16Slice(Node* string,
     string = AssertNotNull(string, position);
   }
   return gasm_->CallBuiltin(Builtin::kWasmStringViewWtf16Slice,
-                            Operator::kNoDeopt, string, start, end);
+                            Operator::kEliminatable, string, start, end);
 }
 
 Node* WasmGraphBuilder::StringAsIter(Node* str, CheckForNull null_check,
                                      wasm::WasmCodePosition position) {
   if (null_check == kWithNullCheck) str = AssertNotNull(str, position);
 
-  return gasm_->CallBuiltin(Builtin::kWasmStringAsIter, Operator::kNoDeopt,
+  return gasm_->CallBuiltin(Builtin::kWasmStringAsIter, Operator::kEliminatable,
                             str);
 }
 
@@ -5971,7 +6060,7 @@ Node* WasmGraphBuilder::StringViewIterNext(Node* view, CheckForNull null_check,
   if (null_check == kWithNullCheck) view = AssertNotNull(view, position);
 
   return gasm_->CallBuiltin(Builtin::kWasmStringViewIterNext,
-                            Operator::kNoDeopt, view);
+                            Operator::kEliminatable, view);
 }
 
 Node* WasmGraphBuilder::StringViewIterAdvance(Node* view,
@@ -5981,7 +6070,7 @@ Node* WasmGraphBuilder::StringViewIterAdvance(Node* view,
   if (null_check == kWithNullCheck) view = AssertNotNull(view, position);
 
   return gasm_->CallBuiltin(Builtin::kWasmStringViewIterAdvance,
-                            Operator::kNoDeopt, view, codepoints);
+                            Operator::kEliminatable, view, codepoints);
 }
 
 Node* WasmGraphBuilder::StringViewIterRewind(Node* view,
@@ -5991,7 +6080,7 @@ Node* WasmGraphBuilder::StringViewIterRewind(Node* view,
   if (null_check == kWithNullCheck) view = AssertNotNull(view, position);
 
   return gasm_->CallBuiltin(Builtin::kWasmStringViewIterRewind,
-                            Operator::kNoDeopt, view, codepoints);
+                            Operator::kEliminatable, view, codepoints);
 }
 
 Node* WasmGraphBuilder::StringViewIterSlice(Node* view, CheckForNull null_check,
@@ -6000,7 +6089,7 @@ Node* WasmGraphBuilder::StringViewIterSlice(Node* view, CheckForNull null_check,
   if (null_check == kWithNullCheck) view = AssertNotNull(view, position);
 
   return gasm_->CallBuiltin(Builtin::kWasmStringViewIterSlice,
-                            Operator::kNoDeopt, view, codepoints);
+                            Operator::kEliminatable, view, codepoints);
 }
 
 // 1 bit V8 Smi tag, 31 bits V8 Smi shift, 1 bit i31ref high-bit truncation.
@@ -6905,10 +6994,10 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder {
     gasm_->GotoIf(IsSmi(value), &resume, value);
     gasm_->GotoIfNot(gasm_->HasInstanceType(value, JS_PROMISE_TYPE), &resume,
                      BranchHint::kTrue, value);
-    auto* call_descriptor = GetBuiltinCallDescriptor(
-        Builtin::kWasmSuspend, zone_, StubCallMode::kCallWasmRuntimeStub);
-    Node* call_target = mcgraph()->RelocatableIntPtrConstant(
-        wasm::WasmCode::kWasmSuspend, RelocInfo::WASM_STUB_CALL);
+    auto* call_descriptor =
+        GetBuiltinCallDescriptor(Builtin::kWasmSuspend, zone_, stub_mode_);
+    Node* call_target = GetTargetForBuiltinCall(wasm::WasmCode::kWasmSuspend,
+                                                Builtin::kWasmSuspend);
     Node* args[] = {value, suspender};
     Node* chained_promise = BuildCallToRuntimeWithContext(
         Runtime::kWasmCreateResumePromise, native_context, args, 2);
diff --git a/deps/v8/src/compiler/wasm-compiler.h b/deps/v8/src/compiler/wasm-compiler.h
index f562f7e5fe3ba3..6ff58e8ed42fd6 100644
--- a/deps/v8/src/compiler/wasm-compiler.h
+++ b/deps/v8/src/compiler/wasm-compiler.h
@@ -494,24 +494,26 @@ class WasmGraphBuilder {
   Node* RttCanon(uint32_t type_index);
 
   Node* RefTest(Node* object, Node* rtt, WasmTypeCheckConfig config);
+  Node* RefTestAbstract(Node* object, wasm::HeapType type, bool null_succeeds);
   Node* RefCast(Node* object, Node* rtt, WasmTypeCheckConfig config,
                 wasm::WasmCodePosition position);
   void BrOnCast(Node* object, Node* rtt, WasmTypeCheckConfig config,
                 Node** match_control, Node** match_effect,
                 Node** no_match_control, Node** no_match_effect);
-  Node* RefIsData(Node* object, bool object_can_be_null);
+  Node* RefIsEq(Node* object, bool object_can_be_null, bool null_succeeds);
+  Node* RefIsData(Node* object, bool object_can_be_null, bool null_succeeds);
   Node* RefAsData(Node* object, bool object_can_be_null,
                   wasm::WasmCodePosition position);
   void BrOnData(Node* object, Node* rtt, WasmTypeCheckConfig config,
                 Node** match_control, Node** match_effect,
                 Node** no_match_control, Node** no_match_effect);
-  Node* RefIsArray(Node* object, bool object_can_be_null);
+  Node* RefIsArray(Node* object, bool object_can_be_null, bool null_succeeds);
   Node* RefAsArray(Node* object, bool object_can_be_null,
                    wasm::WasmCodePosition position);
   void BrOnArray(Node* object, Node* rtt, WasmTypeCheckConfig config,
                  Node** match_control, Node** match_effect,
                  Node** no_match_control, Node** no_match_effect);
-  Node* RefIsI31(Node* object);
+  Node* RefIsI31(Node* object, bool null_succeeds);
   Node* RefAsI31(Node* object, wasm::WasmCodePosition position);
   void BrOnI31(Node* object, Node* rtt, WasmTypeCheckConfig config,
                Node** match_control, Node** match_effect,
@@ -763,10 +765,13 @@ class WasmGraphBuilder {
                             SmallNodeVector& match_controls,
                             SmallNodeVector& match_effects);
 
-  void DataCheck(Node* object, bool object_can_be_null, Callbacks callbacks);
+  void DataCheck(Node* object, bool object_can_be_null, Callbacks callbacks,
+                 bool null_succeeds);
+  void EqCheck(Node* object, bool object_can_be_null, Callbacks callbacks,
+               bool null_succeeds);
   void ManagedObjectInstanceCheck(Node* object, bool object_can_be_null,
                                   InstanceType instance_type,
-                                  Callbacks callbacks);
+                                  Callbacks callbacks, bool null_succeeds);
 
   void BrOnCastAbs(Node** match_control, Node** match_effect,
                    Node** no_match_control, Node** no_match_effect,
diff --git a/deps/v8/src/compiler/wasm-escape-analysis.h b/deps/v8/src/compiler/wasm-escape-analysis.h
index bc29438f5b97db..5a43fda26ed287 100644
--- a/deps/v8/src/compiler/wasm-escape-analysis.h
+++ b/deps/v8/src/compiler/wasm-escape-analysis.h
@@ -17,9 +17,8 @@ namespace compiler {
 
 class MachineGraph;
 
-// Eliminate allocated objects which are only assigned to.
-// Current restrictions: Does not work for arrays (until they are also allocated
-// with AllocateRaw). Does not work if the allocated object is passed to a phi.
+// Eliminate allocated objects with no uses other than as store targets.
+// Future work: Also exclude phis and renamings from uses.
 class WasmEscapeAnalysis final : public AdvancedReducer {
  public:
   WasmEscapeAnalysis(Editor* editor, MachineGraph* mcgraph)
diff --git a/deps/v8/src/compiler/wasm-gc-lowering.cc b/deps/v8/src/compiler/wasm-gc-lowering.cc
index 6d83142b0e8a60..c4fda4ee3c0237 100644
--- a/deps/v8/src/compiler/wasm-gc-lowering.cc
+++ b/deps/v8/src/compiler/wasm-gc-lowering.cc
@@ -92,10 +92,15 @@ Reduction WasmGCLowering::ReduceWasmTypeCheck(Node* node) {
   auto end_label = gasm_.MakeLabel(MachineRepresentation::kWord32);
 
   if (object_can_be_null) {
+    const int kResult = config.null_succeeds ? 1 : 0;
     gasm_.GotoIf(gasm_.TaggedEqual(object, Null()), &end_label,
-                 BranchHint::kFalse, gasm_.Int32Constant(0));
+                 BranchHint::kFalse, gasm_.Int32Constant(kResult));
   }
 
+  // TODO(7748): In some cases the Smi check is redundant. If we had information
+  // about the source type, we could skip it in those cases.
+  gasm_.GotoIf(gasm_.IsI31(object), &end_label, gasm_.Int32Constant(0));
+
   Node* map = gasm_.LoadMap(object);
 
   // First, check if types happen to be equal. This has been shown to give large
diff --git a/deps/v8/src/compiler/wasm-gc-operator-reducer.cc b/deps/v8/src/compiler/wasm-gc-operator-reducer.cc
index 7a2b1d8addd607..fa34e79debf36e 100644
--- a/deps/v8/src/compiler/wasm-gc-operator-reducer.cc
+++ b/deps/v8/src/compiler/wasm-gc-operator-reducer.cc
@@ -117,6 +117,9 @@ wasm::TypeInModule WasmGCOperatorReducer::ObjectTypeFromContext(Node* object,
              : type_from_node;
 }
 
+// If the condition of this node's branch is a type check or a null check,
+// add the additional information about the type-checked node to the path
+// state.
 Reduction WasmGCOperatorReducer::ReduceIf(Node* node, bool condition) {
   DCHECK(node->opcode() == IrOpcode::kIfTrue ||
          node->opcode() == IrOpcode::kIfFalse);
@@ -184,7 +187,7 @@ Reduction WasmGCOperatorReducer::ReduceMerge(Node* node) {
     // Change the current type block list to a longest common prefix of this
     // state list and the other list. (The common prefix should correspond to
     // the state of the common dominator.)
-    // TODO(manoskouk): Consider computing intersections for some types.
+    // TODO(manoskouk): Consider computing unions for some types.
     types.ResetToCommonAncestor(GetState(*input_it));
   }
   return UpdateStates(node, types);
@@ -282,6 +285,7 @@ Reduction WasmGCOperatorReducer::ReduceWasmTypeCast(Node* node) {
     uint8_t rtt_depth = OpParameter<WasmTypeCheckConfig>(node->op()).rtt_depth;
     NodeProperties::ChangeOp(
         node, gasm_.simplified()->WasmTypeCast({false,  // object_can_be_null
+                                                false,  // null_succeeds
                                                 rtt_depth}));
   }
 
@@ -310,12 +314,14 @@ Reduction WasmGCOperatorReducer::ReduceWasmTypeCheck(Node* node) {
   if (wasm::IsHeapSubtypeOf(object_type.type.heap_type(),
                             wasm::HeapType(rtt_type.type.ref_index()),
                             object_type.module, rtt_type.module)) {
+    bool null_succeeds =
+        OpParameter<WasmTypeCheckConfig>(node->op()).null_succeeds;
     // Type cast will fail only on null.
     gasm_.InitializeEffectControl(effect, control);
-    Node* condition =
-        SetType(object_type.type.is_nullable() ? gasm_.IsNotNull(object)
-                                               : gasm_.Int32Constant(1),
-                wasm::kWasmI32);
+    Node* condition = SetType(object_type.type.is_nullable() && !null_succeeds
+                                  ? gasm_.IsNotNull(object)
+                                  : gasm_.Int32Constant(1),
+                              wasm::kWasmI32);
     ReplaceWithValue(node, condition);
     node->Kill();
     return Replace(condition);
@@ -324,7 +330,17 @@ Reduction WasmGCOperatorReducer::ReduceWasmTypeCheck(Node* node) {
   if (wasm::HeapTypesUnrelated(object_type.type.heap_type(),
                                wasm::HeapType(rtt_type.type.ref_index()),
                                object_type.module, rtt_type.module)) {
-    Node* condition = SetType(gasm_.Int32Constant(0), wasm::kWasmI32);
+    bool null_succeeds =
+        OpParameter<WasmTypeCheckConfig>(node->op()).null_succeeds;
+    Node* condition = nullptr;
+    if (null_succeeds && object_type.type.is_nullable()) {
+      // The cast only succeeds in case of null.
+      gasm_.InitializeEffectControl(effect, control);
+      condition = SetType(gasm_.IsNull(object), wasm::kWasmI32);
+    } else {
+      // The cast never succeeds.
+      condition = SetType(gasm_.Int32Constant(0), wasm::kWasmI32);
+    }
     ReplaceWithValue(node, condition);
     node->Kill();
     return Replace(condition);
@@ -335,6 +351,7 @@ Reduction WasmGCOperatorReducer::ReduceWasmTypeCheck(Node* node) {
     uint8_t rtt_depth = OpParameter<WasmTypeCheckConfig>(node->op()).rtt_depth;
     NodeProperties::ChangeOp(
         node, gasm_.simplified()->WasmTypeCheck({false,  // object_can_be_null
+                                                 false,  // null_succeeds
                                                  rtt_depth}));
   }
 
diff --git a/deps/v8/src/compiler/wasm-gc-operator-reducer.h b/deps/v8/src/compiler/wasm-gc-operator-reducer.h
index acae0664daa1c2..d9336094487c3e 100644
--- a/deps/v8/src/compiler/wasm-gc-operator-reducer.h
+++ b/deps/v8/src/compiler/wasm-gc-operator-reducer.h
@@ -35,9 +35,11 @@ struct NodeWithType {
   wasm::TypeInModule type;
 };
 
-// This class optimizes away wasm-gc nodes based on the types of their
-// arguments. Although types have been assigned to nodes already, this class
-// also tracks additional type information along control paths.
+// This class optimizes away wasm-gc type checks and casts. Two types of
+// information are used:
+// - Types already marked on graph nodes.
+// - Path-dependent type information that is inferred when a type check is used
+//   as a branch condition.
 class WasmGCOperatorReducer final
     : public AdvancedReducerWithControlPathState<NodeWithType,
                                                  kMultipleInstances> {
@@ -61,6 +63,8 @@ class WasmGCOperatorReducer final
   Reduction ReduceStart(Node* node);
 
   Node* SetType(Node* node, wasm::ValueType type);
+  // Returns the intersection of the type marked on {object} and the type
+  // information about object tracked on {control}'s control path (if present).
   wasm::TypeInModule ObjectTypeFromContext(Node* object, Node* control);
   Reduction UpdateNodeAndAliasesTypes(Node* state_owner,
                                       ControlPathTypes parent_state, Node* node,
diff --git a/deps/v8/src/compiler/wasm-inlining.h b/deps/v8/src/compiler/wasm-inlining.h
index 44dcd83538f1d6..e7ec4eb271d155 100644
--- a/deps/v8/src/compiler/wasm-inlining.h
+++ b/deps/v8/src/compiler/wasm-inlining.h
@@ -55,7 +55,12 @@ class WasmInliner final : public AdvancedReducer {
 
   const char* reducer_name() const override { return "WasmInliner"; }
 
+  // Registers (tail) calls to possibly be inlined, prioritized by inlining
+  // heuristics provided by {LexicographicOrdering}.
+  // Only locally defined functions are inlinable, and a limited number of
+  // inlinings of a specific function is allowed.
   Reduction Reduce(Node* node) final;
+  // Inlines calls registered by {Reduce}, until an inlining budget is exceeded.
   void Finalize() final;
 
   static bool graph_size_allows_inlining(size_t graph_size) {
diff --git a/deps/v8/src/compiler/wasm-typer.h b/deps/v8/src/compiler/wasm-typer.h
index 69fecbb49f6bd8..de101f57087c36 100644
--- a/deps/v8/src/compiler/wasm-typer.h
+++ b/deps/v8/src/compiler/wasm-typer.h
@@ -18,6 +18,11 @@ namespace compiler {
 
 class MachineGraph;
 
+// Recomputes wasm-gc types along the graph to assign the narrowest possible
+// type to each node.
+// Specifically, struct field accesses, array element accesses, phis, type
+// casts, and type guards are retyped.
+// Types in loops are computed to a fixed point.
 class WasmTyper final : public AdvancedReducer {
  public:
   WasmTyper(Editor* editor, MachineGraph* mcgraph, uint32_t function_index);
diff --git a/deps/v8/src/d8/d8-console.cc b/deps/v8/src/d8/d8-console.cc
index 9481831b4a7a8f..f48095302adca0 100644
--- a/deps/v8/src/d8/d8-console.cc
+++ b/deps/v8/src/d8/d8-console.cc
@@ -73,7 +73,7 @@ void D8Console::Debug(const debug::ConsoleCallArguments& args,
 
 void D8Console::Time(const debug::ConsoleCallArguments& args,
                      const v8::debug::ConsoleContext&) {
-  if (internal::FLAG_correctness_fuzzer_suppressions) return;
+  if (i::v8_flags.correctness_fuzzer_suppressions) return;
   if (args.Length() == 0) {
     default_timer_ = base::TimeTicks::Now();
   } else {
@@ -95,7 +95,7 @@ void D8Console::Time(const debug::ConsoleCallArguments& args,
 
 void D8Console::TimeEnd(const debug::ConsoleCallArguments& args,
                         const v8::debug::ConsoleContext&) {
-  if (internal::FLAG_correctness_fuzzer_suppressions) return;
+  if (i::v8_flags.correctness_fuzzer_suppressions) return;
   base::TimeDelta delta;
   if (args.Length() == 0) {
     delta = base::TimeTicks::Now() - default_timer_;
@@ -119,7 +119,7 @@ void D8Console::TimeEnd(const debug::ConsoleCallArguments& args,
 
 void D8Console::TimeStamp(const debug::ConsoleCallArguments& args,
                           const v8::debug::ConsoleContext&) {
-  if (internal::FLAG_correctness_fuzzer_suppressions) return;
+  if (i::v8_flags.correctness_fuzzer_suppressions) return;
   base::TimeDelta delta = base::TimeTicks::Now() - default_timer_;
   if (args.Length() == 0) {
     printf("console.timeStamp: default, %f\n", delta.InMillisecondsF());
@@ -136,7 +136,7 @@ void D8Console::TimeStamp(const debug::ConsoleCallArguments& args,
 
 void D8Console::Trace(const debug::ConsoleCallArguments& args,
                       const v8::debug::ConsoleContext&) {
-  if (internal::FLAG_correctness_fuzzer_suppressions) return;
+  if (i::v8_flags.correctness_fuzzer_suppressions) return;
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate_);
   i_isolate->PrintStack(stderr, i::Isolate::kPrintStackConcise);
 }
diff --git a/deps/v8/src/d8/d8-test.cc b/deps/v8/src/d8/d8-test.cc
index 878693e3c94e91..94efb2946c37ef 100644
--- a/deps/v8/src/d8/d8-test.cc
+++ b/deps/v8/src/d8/d8-test.cc
@@ -669,10 +669,12 @@ class FastCApiObject {
     CHECK_NOT_NULL(self);
     self->fast_call_count_++;
 
-    // Number is in range.
-    CHECK(in_range && "Number range should have been enforced");
-    if (!std::isnan(real_arg)) {
-      CHECK_EQ(static_cast<IntegerT>(real_arg), checked_arg);
+    if (!i::v8_flags.fuzzing) {
+      // Number is in range.
+      CHECK(in_range && "Number range should have been enforced");
+      if (!std::isnan(real_arg)) {
+        CHECK_EQ(static_cast<IntegerT>(real_arg), checked_arg);
+      }
     }
     return true;
   }
@@ -688,6 +690,10 @@ class FastCApiObject {
 
     HandleScope handle_scope(isolate);
 
+    if (i::v8_flags.fuzzing) {
+      args.GetReturnValue().Set(Boolean::New(isolate, false));
+      return;
+    }
     double real_arg = 0;
     if (args.Length() > 1 && args[1]->IsNumber()) {
       real_arg = args[1]->NumberValue(isolate->GetCurrentContext()).FromJust();
@@ -710,6 +716,144 @@ class FastCApiObject {
     }
   }
 
+#ifdef V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+  static AnyCType ClampCompareI32Patch(AnyCType receiver, AnyCType in_range,
+                                       AnyCType real_arg, AnyCType checked_arg,
+                                       AnyCType options) {
+    AnyCType ret;
+    ret.double_value = ClampCompare<int32_t>(
+        receiver.object_value, in_range.bool_value, real_arg.double_value,
+        checked_arg.int32_value, *options.options_value);
+    return ret;
+  }
+  static AnyCType ClampCompareU32Patch(AnyCType receiver, AnyCType in_range,
+                                       AnyCType real_arg, AnyCType checked_arg,
+                                       AnyCType options) {
+    AnyCType ret;
+    ret.double_value = ClampCompare<uint32_t>(
+        receiver.object_value, in_range.bool_value, real_arg.double_value,
+        checked_arg.uint32_value, *options.options_value);
+    return ret;
+  }
+  static AnyCType ClampCompareI64Patch(AnyCType receiver, AnyCType in_range,
+                                       AnyCType real_arg, AnyCType checked_arg,
+                                       AnyCType options) {
+    AnyCType ret;
+    ret.double_value = ClampCompare<int64_t>(
+        receiver.object_value, in_range.bool_value, real_arg.double_value,
+        checked_arg.int64_value, *options.options_value);
+    return ret;
+  }
+  static AnyCType ClampCompareU64Patch(AnyCType receiver, AnyCType in_range,
+                                       AnyCType real_arg, AnyCType checked_arg,
+                                       AnyCType options) {
+    AnyCType ret;
+    ret.double_value = ClampCompare<uint64_t>(
+        receiver.object_value, in_range.bool_value, real_arg.double_value,
+        checked_arg.uint64_value, *options.options_value);
+    return ret;
+  }
+#endif  //  V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+
+  template <typename IntegerT>
+  static double ClampCompareCompute(bool in_range, double real_arg,
+                                    IntegerT checked_arg) {
+    if (!in_range) {
+      IntegerT lower_bound = std::numeric_limits<IntegerT>::min();
+      IntegerT upper_bound = std::numeric_limits<IntegerT>::max();
+      if (lower_bound < internal::kMinSafeInteger) {
+        lower_bound = static_cast<IntegerT>(internal::kMinSafeInteger);
+      }
+      if (upper_bound > internal::kMaxSafeInteger) {
+        upper_bound = static_cast<IntegerT>(internal::kMaxSafeInteger);
+      }
+      CHECK(!std::isnan(real_arg));
+      if (real_arg < static_cast<double>(lower_bound)) {
+        CHECK_EQ(lower_bound, checked_arg);
+      } else if (real_arg > static_cast<double>(upper_bound)) {
+        CHECK_EQ(upper_bound, checked_arg);
+      } else {
+        FATAL("Expected value to be out of range.");
+      }
+    } else if (!std::isnan(real_arg)) {
+      if (real_arg != checked_arg) {
+        // Check if rounding towards nearest even number happened.
+        double diff = std::fabs(real_arg - checked_arg);
+        CHECK_LE(diff, 0.5);
+        if (diff == 0) {
+          // Check if rounding towards nearest even number happened.
+          CHECK_EQ(0, checked_arg % 2);
+        } else if (checked_arg % 2 == 1) {
+          // Behave as if rounding towards nearest even number *has*
+          // happened (as it does on the fast path).
+          checked_arg += 1;
+        }
+      } else {
+        CHECK_EQ(static_cast<IntegerT>(real_arg), checked_arg);
+      }
+    }
+    return checked_arg;
+  }
+
+  template <typename IntegerT>
+  static double ClampCompare(Local<Object> receiver, bool in_range,
+                             double real_arg, IntegerT checked_arg,
+                             FastApiCallbackOptions& options) {
+    FastCApiObject* self = UnwrapObject(receiver);
+    CHECK_NOT_NULL(self);
+    self->fast_call_count_++;
+
+    double result = ClampCompareCompute(in_range, real_arg, checked_arg);
+    return static_cast<double>(result);
+  }
+
+  template <typename IntegerT>
+  static bool IsInRange(double arg) {
+    return !std::isnan(arg) &&
+           arg <= static_cast<double>(std::numeric_limits<IntegerT>::max()) &&
+           arg >= static_cast<double>(std::numeric_limits<IntegerT>::min());
+  }
+
+  template <typename IntegerT>
+  static void ClampCompareSlowCallback(
+      const FunctionCallbackInfo<Value>& args) {
+    Isolate* isolate = args.GetIsolate();
+
+    FastCApiObject* self = UnwrapObject(args.This());
+    CHECK_SELF_OR_THROW();
+    self->slow_call_count_++;
+
+    double real_arg = 0;
+    if (args.Length() > 1 && args[1]->IsNumber()) {
+      real_arg = args[1]->NumberValue(isolate->GetCurrentContext()).FromJust();
+    }
+    double checked_arg_dbl = std::numeric_limits<double>::max();
+    if (args.Length() > 2 && args[2]->IsNumber()) {
+      checked_arg_dbl = args[2].As<Number>()->Value();
+    }
+    bool in_range = args[0]->IsBoolean() && args[0]->BooleanValue(isolate) &&
+                    IsInRange<IntegerT>(real_arg) &&
+                    IsInRange<IntegerT>(checked_arg_dbl);
+
+    IntegerT checked_arg = std::numeric_limits<IntegerT>::max();
+    if (in_range) {
+      if (checked_arg_dbl != std::numeric_limits<double>::max()) {
+        checked_arg = static_cast<IntegerT>(checked_arg_dbl);
+      }
+      double result = ClampCompareCompute(in_range, real_arg, checked_arg);
+      args.GetReturnValue().Set(Number::New(isolate, result));
+    } else {
+      IntegerT clamped = std::numeric_limits<IntegerT>::max();
+      if (std::isnan(checked_arg_dbl)) {
+        clamped = 0;
+      } else {
+        clamped = std::clamp(checked_arg, std::numeric_limits<IntegerT>::min(),
+                             std::numeric_limits<IntegerT>::max());
+      }
+      args.GetReturnValue().Set(Number::New(isolate, clamped));
+    }
+  }
+
   static bool IsFastCApiObjectFastCallback(v8::Local<v8::Object> receiver,
                                            bool should_fallback,
                                            v8::Local<v8::Value> arg,
@@ -739,6 +883,7 @@ class FastCApiObject {
         ->GetTestApiObjectCtor()
         ->IsLeafTemplateForApiObject(object);
   }
+
   static void IsFastCApiObjectSlowCallback(
       const FunctionCallbackInfo<Value>& args) {
     Isolate* isolate = args.GetIsolate();
@@ -776,6 +921,10 @@ class FastCApiObject {
     CHECK_SELF_OR_FALLBACK(false);
     self->fast_call_count_++;
 
+    if (i::v8_flags.fuzzing) {
+      return true;
+    }
+
     CHECK_NOT_NULL(options.wasm_memory);
     uint8_t* memory = nullptr;
     CHECK(options.wasm_memory->getStorageIfAligned(&memory));
@@ -1066,6 +1215,8 @@ Local<FunctionTemplate> Shell::CreateTestFastCApiTemplate(Isolate* isolate) {
             signature, 1, ConstructorBehavior::kThrow,
             SideEffectType::kHasSideEffect, &add_all_annotate_c_func));
 
+    // Testing enforce range annotation.
+
     CFunction enforce_range_compare_i32_c_func =
         CFunctionBuilder()
             .Fn(FastCApiObject::EnforceRangeCompare<int32_t>)
@@ -1126,6 +1277,68 @@ Local<FunctionTemplate> Shell::CreateTestFastCApiTemplate(Isolate* isolate) {
             Local<Value>(), signature, 1, ConstructorBehavior::kThrow,
             SideEffectType::kHasSideEffect, &enforce_range_compare_u64_c_func));
 
+    // Testing clamp annotation.
+
+    CFunction clamp_compare_i32_c_func =
+        CFunctionBuilder()
+            .Fn(FastCApiObject::ClampCompare<int32_t>)
+            .Arg<3, v8::CTypeInfo::Flags::kClampBit>()
+#ifdef V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+            .Patch(FastCApiObject::ClampCompareI32Patch)
+#endif  // V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+            .Build();
+    api_obj_ctor->PrototypeTemplate()->Set(
+        isolate, "clamp_compare_i32",
+        FunctionTemplate::New(
+            isolate, FastCApiObject::ClampCompareSlowCallback<int32_t>,
+            Local<Value>(), signature, 1, ConstructorBehavior::kThrow,
+            SideEffectType::kHasSideEffect, &clamp_compare_i32_c_func));
+
+    CFunction clamp_compare_u32_c_func =
+        CFunctionBuilder()
+            .Fn(FastCApiObject::ClampCompare<uint32_t>)
+            .Arg<3, v8::CTypeInfo::Flags::kClampBit>()
+#ifdef V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+            .Patch(FastCApiObject::ClampCompareU32Patch)
+#endif  // V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+            .Build();
+    api_obj_ctor->PrototypeTemplate()->Set(
+        isolate, "clamp_compare_u32",
+        FunctionTemplate::New(
+            isolate, FastCApiObject::ClampCompareSlowCallback<uint32_t>,
+            Local<Value>(), signature, 1, ConstructorBehavior::kThrow,
+            SideEffectType::kHasSideEffect, &clamp_compare_u32_c_func));
+
+    CFunction clamp_compare_i64_c_func =
+        CFunctionBuilder()
+            .Fn(FastCApiObject::ClampCompare<int64_t>)
+            .Arg<3, v8::CTypeInfo::Flags::kClampBit>()
+#ifdef V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+            .Patch(FastCApiObject::ClampCompareI64Patch)
+#endif  // V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+            .Build();
+    api_obj_ctor->PrototypeTemplate()->Set(
+        isolate, "clamp_compare_i64",
+        FunctionTemplate::New(
+            isolate, FastCApiObject::ClampCompareSlowCallback<int64_t>,
+            Local<Value>(), signature, 1, ConstructorBehavior::kThrow,
+            SideEffectType::kHasSideEffect, &clamp_compare_i64_c_func));
+
+    CFunction clamp_compare_u64_c_func =
+        CFunctionBuilder()
+            .Fn(FastCApiObject::ClampCompare<uint64_t>)
+            .Arg<3, v8::CTypeInfo::Flags::kClampBit>()
+#ifdef V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+            .Patch(FastCApiObject::ClampCompareU64Patch)
+#endif  // V8_USE_SIMULATOR_WITH_GENERIC_C_CALLS
+            .Build();
+    api_obj_ctor->PrototypeTemplate()->Set(
+        isolate, "clamp_compare_u64",
+        FunctionTemplate::New(
+            isolate, FastCApiObject::ClampCompareSlowCallback<uint64_t>,
+            Local<Value>(), signature, 1, ConstructorBehavior::kThrow,
+            SideEffectType::kHasSideEffect, &clamp_compare_u64_c_func));
+
     CFunction is_valid_api_object_c_func =
         CFunction::Make(FastCApiObject::IsFastCApiObjectFastCallback);
     api_obj_ctor->PrototypeTemplate()->Set(
diff --git a/deps/v8/src/d8/d8.cc b/deps/v8/src/d8/d8.cc
index 8c46cc6a9f941c..37f7de888070ee 100644
--- a/deps/v8/src/d8/d8.cc
+++ b/deps/v8/src/d8/d8.cc
@@ -786,7 +786,7 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
                           ReportExceptions report_exceptions,
                           ProcessMessageQueue process_message_queue) {
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
-  if (i::FLAG_parse_only) {
+  if (i::v8_flags.parse_only) {
     i::VMState<PARSER> state(i_isolate);
     i::Handle<i::String> str = Utils::OpenHandle(*(source));
 
@@ -796,8 +796,8 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
 
     i::UnoptimizedCompileFlags flags =
         i::UnoptimizedCompileFlags::ForToplevelCompile(
-            i_isolate, true, i::construct_language_mode(i::FLAG_use_strict),
-            i::REPLMode::kNo, ScriptType::kClassic, i::FLAG_lazy);
+            i_isolate, true, i::construct_language_mode(i::v8_flags.use_strict),
+            i::REPLMode::kNo, ScriptType::kClassic, i::v8_flags.lazy);
 
     if (options.compile_options == v8::ScriptCompiler::kEagerCompile) {
       flags.set_is_eager(true);
@@ -1573,7 +1573,7 @@ bool Shell::LoadJSON(Isolate* isolate, const char* file_name) {
 PerIsolateData::PerIsolateData(Isolate* isolate)
     : isolate_(isolate), realms_(nullptr) {
   isolate->SetData(0, this);
-  if (i::FLAG_expose_async_hooks) {
+  if (i::v8_flags.expose_async_hooks) {
     async_hooks_wrapper_ = new AsyncHooks(isolate);
   }
   ignore_unhandled_promises_ = false;
@@ -1585,7 +1585,7 @@ PerIsolateData::PerIsolateData(Isolate* isolate)
 
 PerIsolateData::~PerIsolateData() {
   isolate_->SetData(0, nullptr);  // Not really needed, just to be sure...
-  if (i::FLAG_expose_async_hooks) {
+  if (i::v8_flags.expose_async_hooks) {
     delete async_hooks_wrapper_;  // This uses the isolate
   }
 #if defined(LEAK_SANITIZER)
@@ -1748,16 +1748,148 @@ int PerIsolateData::RealmIndexOrThrow(
   return index;
 }
 
-// performance.now() returns a time stamp as double, measured in milliseconds.
-// When FLAG_verify_predictable mode is enabled it returns result of
+// GetTimestamp() returns a time stamp as double, measured in milliseconds.
+// When v8_flags.verify_predictable mode is enabled it returns result of
 // v8::Platform::MonotonicallyIncreasingTime().
-void Shell::PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args) {
-  if (i::FLAG_verify_predictable) {
-    args.GetReturnValue().Set(g_platform->MonotonicallyIncreasingTime());
+double Shell::GetTimestamp() {
+  if (i::v8_flags.verify_predictable) {
+    return g_platform->MonotonicallyIncreasingTime();
   } else {
     base::TimeDelta delta = base::TimeTicks::Now() - kInitialTicks;
-    args.GetReturnValue().Set(delta.InMillisecondsF());
+    return delta.InMillisecondsF();
+  }
+}
+int64_t Shell::GetTracingTimestampFromPerformanceTimestamp(
+    double performance_timestamp) {
+  // Don't use this in --verify-predictable mode, predictable timestamps don't
+  // work well with tracing.
+  DCHECK(!i::v8_flags.verify_predictable);
+  base::TimeDelta delta =
+      base::TimeDelta::FromMillisecondsD(performance_timestamp);
+  // See TracingController::CurrentTimestampMicroseconds().
+  return (delta + kInitialTicks).ToInternalValue();
+}
+
+// performance.now() returns GetTimestamp().
+void Shell::PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args) {
+  args.GetReturnValue().Set(GetTimestamp());
+}
+
+// performance.mark() records and returns a PerformanceEntry with the current
+// timestamp.
+void Shell::PerformanceMark(const v8::FunctionCallbackInfo<v8::Value>& args) {
+  Isolate* isolate = args.GetIsolate();
+  Local<Context> context = isolate->GetCurrentContext();
+
+  if (args.Length() < 1 || !args[0]->IsString()) {
+    args.GetIsolate()->ThrowError("Invalid 'name' argument");
+    return;
+  }
+  Local<String> name = args[0].As<String>();
+
+  double timestamp = GetTimestamp();
+
+  Local<Object> performance_entry = Object::New(isolate);
+  performance_entry
+      ->DefineOwnProperty(context,
+                          String::NewFromUtf8Literal(isolate, "entryType"),
+                          String::NewFromUtf8Literal(isolate, "mark"), ReadOnly)
+      .Check();
+  performance_entry
+      ->DefineOwnProperty(context, String::NewFromUtf8Literal(isolate, "name"),
+                          name, ReadOnly)
+      .Check();
+  performance_entry
+      ->DefineOwnProperty(context,
+                          String::NewFromUtf8Literal(isolate, "startTime"),
+                          Number::New(isolate, timestamp), ReadOnly)
+      .Check();
+  performance_entry
+      ->DefineOwnProperty(context,
+                          String::NewFromUtf8Literal(isolate, "duration"),
+                          Integer::New(isolate, 0), ReadOnly)
+      .Check();
+
+  args.GetReturnValue().Set(performance_entry);
+}
+
+// performance.measure() records and returns a PerformanceEntry with a duration
+// since a given mark, or since zero.
+void Shell::PerformanceMeasure(
+    const v8::FunctionCallbackInfo<v8::Value>& args) {
+  Isolate* isolate = args.GetIsolate();
+  Local<Context> context = isolate->GetCurrentContext();
+
+  if (args.Length() < 1 || !args[0]->IsString()) {
+    args.GetIsolate()->ThrowError("Invalid 'name' argument");
+    return;
   }
+  v8::Local<String> name = args[0].As<String>();
+
+  double start_timestamp = 0;
+  if (args.Length() >= 2) {
+    Local<Value> start_mark = args[1].As<Value>();
+    if (!start_mark->IsObject()) {
+      args.GetIsolate()->ThrowError(
+          "Invalid 'startMark' argument: Not an Object");
+      return;
+    }
+    Local<Value> start_time_field;
+    if (!start_mark.As<Object>()
+             ->Get(context, String::NewFromUtf8Literal(isolate, "startTime"))
+             .ToLocal(&start_time_field)) {
+      return;
+    }
+    if (!start_time_field->IsNumber()) {
+      args.GetIsolate()->ThrowError(
+          "Invalid 'startMark' argument: No numeric 'startTime' field");
+      return;
+    }
+    start_timestamp = start_time_field.As<Number>()->Value();
+  }
+  if (args.Length() > 2) {
+    args.GetIsolate()->ThrowError("Too many arguments");
+    return;
+  }
+
+  double end_timestamp = GetTimestamp();
+
+  if (options.trace_enabled) {
+    size_t hash = base::hash_combine(name->GetIdentityHash(), start_timestamp,
+                                     end_timestamp);
+
+    String::Utf8Value utf8(isolate, name);
+    TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP1(
+        "v8", *utf8, static_cast<uint64_t>(hash),
+        GetTracingTimestampFromPerformanceTimestamp(start_timestamp),
+        "startTime", start_timestamp);
+    TRACE_EVENT_COPY_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(
+        "v8", *utf8, static_cast<uint64_t>(hash),
+        GetTracingTimestampFromPerformanceTimestamp(end_timestamp));
+  }
+
+  Local<Object> performance_entry = Object::New(isolate);
+  performance_entry
+      ->DefineOwnProperty(
+          context, String::NewFromUtf8Literal(isolate, "entryType"),
+          String::NewFromUtf8Literal(isolate, "measure"), ReadOnly)
+      .Check();
+  performance_entry
+      ->DefineOwnProperty(context, String::NewFromUtf8Literal(isolate, "name"),
+                          name, ReadOnly)
+      .Check();
+  performance_entry
+      ->DefineOwnProperty(context,
+                          String::NewFromUtf8Literal(isolate, "startTime"),
+                          Number::New(isolate, start_timestamp), ReadOnly)
+      .Check();
+  performance_entry
+      ->DefineOwnProperty(
+          context, String::NewFromUtf8Literal(isolate, "duration"),
+          Number::New(isolate, end_timestamp - start_timestamp), ReadOnly)
+      .Check();
+
+  args.GetReturnValue().Set(performance_entry);
 }
 
 // performance.measureMemory() implements JavaScript Memory API proposal.
@@ -2308,7 +2440,7 @@ void Shell::DisableDebugger(const v8::FunctionCallbackInfo<v8::Value>& args) {
 
 void Shell::SetPromiseHooks(const v8::FunctionCallbackInfo<v8::Value>& args) {
   Isolate* isolate = args.GetIsolate();
-  if (i::FLAG_correctness_fuzzer_suppressions) {
+  if (i::v8_flags.correctness_fuzzer_suppressions) {
     // Setting promise hoooks dynamically has unexpected timing side-effects
     // with certain promise optimizations. We might not get all callbacks for
     // previously scheduled Promises or optimized code-paths that skip Promise
@@ -3046,15 +3178,6 @@ Local<String> Shell::Stringify(Isolate* isolate, Local<Value> value) {
 void Shell::NodeTypeCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
   v8::Isolate* isolate = args.GetIsolate();
 
-  // HasInstance does a slow prototype chain lookup, and this function is used
-  // for micro benchmarks too.
-#ifdef DEBUG
-  PerIsolateData* data = PerIsolateData::Get(isolate);
-  if (!data->GetDomNodeCtor()->HasInstance(args.This())) {
-    isolate->ThrowError("Calling .nodeType on wrong instance type.");
-  }
-#endif
-
   args.GetReturnValue().Set(v8::Number::New(isolate, 1));
 }
 
@@ -3177,7 +3300,7 @@ Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
   global_template->Set(isolate, "Worker", Shell::CreateWorkerTemplate(isolate));
 
   // Prevent fuzzers from creating side effects.
-  if (!i::FLAG_fuzzing) {
+  if (!i::v8_flags.fuzzing) {
     global_template->Set(isolate, "os", Shell::CreateOSTemplate(isolate));
   }
   global_template->Set(isolate, "d8", Shell::CreateD8Template(isolate));
@@ -3189,7 +3312,7 @@ Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
       FunctionTemplate::New(isolate, Fuzzilli), PropertyAttribute::DontEnum);
 #endif  // V8_FUZZILLI
 
-  if (i::FLAG_expose_async_hooks) {
+  if (i::v8_flags.expose_async_hooks) {
     global_template->Set(isolate, "async_hooks",
                          Shell::CreateAsyncHookTemplate(isolate));
   }
@@ -3281,6 +3404,10 @@ Local<ObjectTemplate> Shell::CreatePerformanceTemplate(Isolate* isolate) {
   Local<ObjectTemplate> performance_template = ObjectTemplate::New(isolate);
   performance_template->Set(isolate, "now",
                             FunctionTemplate::New(isolate, PerformanceNow));
+  performance_template->Set(isolate, "mark",
+                            FunctionTemplate::New(isolate, PerformanceMark));
+  performance_template->Set(isolate, "measure",
+                            FunctionTemplate::New(isolate, PerformanceMeasure));
   performance_template->Set(
       isolate, "measureMemory",
       FunctionTemplate::New(isolate, PerformanceMeasureMemory));
@@ -3357,7 +3484,7 @@ Local<ObjectTemplate> Shell::CreateD8Template(Isolate* isolate) {
     Local<ObjectTemplate> test_template = ObjectTemplate::New(isolate);
     // For different runs of correctness fuzzing the bytecode of a function
     // might get flushed, resulting in spurious errors.
-    if (!i::FLAG_correctness_fuzzer_suppressions) {
+    if (!i::v8_flags.correctness_fuzzer_suppressions) {
       test_template->Set(
           isolate, "verifySourcePositions",
           FunctionTemplate::New(isolate, TestVerifySourcePositions));
@@ -3365,8 +3492,8 @@ Local<ObjectTemplate> Shell::CreateD8Template(Isolate* isolate) {
     // Correctness fuzzing will attempt to compare results of tests with and
     // without turbo_fast_api_calls, so we don't expose the fast_c_api
     // constructor when --correctness_fuzzer_suppressions is on.
-    if (options.expose_fast_api && i::FLAG_turbo_fast_api_calls &&
-        !i::FLAG_correctness_fuzzer_suppressions) {
+    if (options.expose_fast_api && i::v8_flags.turbo_fast_api_calls &&
+        !i::v8_flags.correctness_fuzzer_suppressions) {
       test_template->Set(isolate, "FastCAPI",
                          Shell::CreateTestFastCApiTemplate(isolate));
       test_template->Set(isolate, "LeafInterfaceType",
@@ -3496,8 +3623,8 @@ void Shell::Initialize(Isolate* isolate, D8Console* console,
   isolate->SetPromiseRejectCallback(PromiseRejectCallback);
   if (isOnMainThread) {
     // Set up counters
-    if (i::FLAG_map_counters[0] != '\0') {
-      MapCounters(isolate, i::FLAG_map_counters);
+    if (i::v8_flags.map_counters[0] != '\0') {
+      MapCounters(isolate, i::v8_flags.map_counters);
     }
     // Disable default message reporting.
     isolate->AddMessageListenerWithErrorLevel(
@@ -3559,7 +3686,8 @@ Local<Context> Shell::CreateEvaluationContext(Isolate* isolate) {
   Local<Context> context = Context::New(isolate, nullptr, global_template);
   DCHECK_IMPLIES(context.IsEmpty(), isolate->IsExecutionTerminating());
   if (context.IsEmpty()) return {};
-  if (i::FLAG_perf_prof_annotate_wasm || i::FLAG_vtune_prof_annotate_wasm) {
+  if (i::v8_flags.perf_prof_annotate_wasm ||
+      i::v8_flags.vtune_prof_annotate_wasm) {
     isolate->SetWasmLoadSourceMapCallback(Shell::WasmLoadSourceMapCallback);
   }
   InitializeModuleEmbedderData(context);
@@ -3600,7 +3728,7 @@ void Shell::WriteIgnitionDispatchCountersFile(v8::Isolate* isolate) {
           ->interpreter()
           ->GetDispatchCountersObject();
   std::ofstream dispatch_counters_stream(
-      i::FLAG_trace_ignition_dispatches_output_file);
+      i::v8_flags.trace_ignition_dispatches_output_file);
   dispatch_counters_stream << *String::Utf8Value(
       isolate, JSON::Stringify(context, Utils::ToLocal(dispatch_counters))
                    .ToLocalChecked());
@@ -3777,7 +3905,7 @@ void Dummy(char* arg) {}
 V8_NOINLINE void FuzzerMonitor::SimulateErrors() {
   // Initialize a fresh RNG to not interfere with JS execution.
   std::unique_ptr<base::RandomNumberGenerator> rng;
-  int64_t seed = internal::FLAG_random_seed;
+  int64_t seed = i::v8_flags.random_seed;
   if (seed != 0) {
     rng = std::make_unique<base::RandomNumberGenerator>(seed);
   } else {
@@ -3944,7 +4072,7 @@ MaybeLocal<String> Shell::ReadFile(Isolate* isolate, const char* name,
 
   int size = static_cast<int>(file->size());
   char* chars = static_cast<char*>(file->memory());
-  if (i::FLAG_use_external_strings && i::String::IsAscii(chars, size)) {
+  if (i::v8_flags.use_external_strings && i::String::IsAscii(chars, size)) {
     String::ExternalOneByteStringResource* resource =
         new ExternalOwningOneByteStringResource(std::move(file));
     return String::NewExternalOneByte(isolate, resource);
@@ -4721,11 +4849,11 @@ bool Shell::SetOptions(int argc, char* argv[]) {
       options.no_fail = true;
       argv[i] = nullptr;
     } else if (strcmp(argv[i], "--dump-counters") == 0) {
-      i::FLAG_slow_histograms = true;
+      i::v8_flags.slow_histograms = true;
       options.dump_counters = true;
       argv[i] = nullptr;
     } else if (strcmp(argv[i], "--dump-counters-nvp") == 0) {
-      i::FLAG_slow_histograms = true;
+      i::v8_flags.slow_histograms = true;
       options.dump_counters_nvp = true;
       argv[i] = nullptr;
     } else if (strncmp(argv[i], "--icu-data-file=", 16) == 0) {
@@ -4846,7 +4974,7 @@ bool Shell::SetOptions(int argc, char* argv[]) {
     } else if (strcmp(argv[i], "--enable-etw-stack-walking") == 0) {
       options.enable_etw_stack_walking = true;
       // This needs to be manually triggered for JIT ETW events to work.
-      i::FLAG_enable_etw_stack_walking = true;
+      i::v8_flags.enable_etw_stack_walking = true;
 #if defined(V8_ENABLE_SYSTEM_INSTRUMENTATION)
     } else if (strcmp(argv[i], "--enable-system-instrumentation") == 0) {
       options.enable_system_instrumentation = true;
@@ -4855,7 +4983,7 @@ bool Shell::SetOptions(int argc, char* argv[]) {
 #if defined(V8_OS_WIN)
       // Guard this bc the flag has a lot of overhead and is not currently used
       // by macos
-      i::FLAG_interpreted_frames_native_stack = true;
+      i::v8_flags.interpreted_frames_native_stack = true;
 #endif
       argv[i] = nullptr;
 #endif
@@ -4905,17 +5033,17 @@ bool Shell::SetOptions(int argc, char* argv[]) {
       "  --module  execute a file as a JavaScript module\n"
       "  --web-snapshot  execute a file as a web snapshot\n\n";
   using HelpOptions = i::FlagList::HelpOptions;
-  i::FLAG_abort_on_contradictory_flags = true;
+  i::v8_flags.abort_on_contradictory_flags = true;
   i::FlagList::SetFlagsFromCommandLine(&argc, argv, true,
                                        HelpOptions(HelpOptions::kExit, usage));
-  options.mock_arraybuffer_allocator = i::FLAG_mock_arraybuffer_allocator;
+  options.mock_arraybuffer_allocator = i::v8_flags.mock_arraybuffer_allocator;
   options.mock_arraybuffer_allocator_limit =
-      i::FLAG_mock_arraybuffer_allocator_limit;
+      i::v8_flags.mock_arraybuffer_allocator_limit;
 #if MULTI_MAPPED_ALLOCATOR_AVAILABLE
-  options.multi_mapped_mock_allocator = i::FLAG_multi_mapped_mock_allocator;
+  options.multi_mapped_mock_allocator = i::v8_flags.multi_mapped_mock_allocator;
 #endif
 
-  if (i::FLAG_stress_snapshot && options.expose_fast_api &&
+  if (i::v8_flags.stress_snapshot && options.expose_fast_api &&
       check_d8_flag_contradictions) {
     FATAL("Flag --expose-fast-api is incompatible with --stress-snapshot.");
   }
@@ -4935,7 +5063,7 @@ bool Shell::SetOptions(int argc, char* argv[]) {
                strcmp(str, "--json") == 0) {
       // Pass on to SourceGroup, which understands these options.
     } else if (strncmp(str, "--", 2) == 0) {
-      if (!i::FLAG_correctness_fuzzer_suppressions) {
+      if (!i::v8_flags.correctness_fuzzer_suppressions) {
         printf("Warning: unknown flag %s.\nTry --help for options\n", str);
       }
     } else if (strcmp(str, "-e") == 0 && i + 1 < argc) {
@@ -4980,7 +5108,7 @@ int Shell::RunMain(Isolate* isolate, bool last_run) {
       if (!CompleteMessageLoop(isolate)) success = false;
     }
     WriteLcovData(isolate, options.lcov_file);
-    if (last_run && i::FLAG_stress_snapshot) {
+    if (last_run && i::v8_flags.stress_snapshot) {
       static constexpr bool kClearRecompilableData = true;
       i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
       i::Handle<i::Context> i_context = Utils::OpenHandle(*context);
@@ -5089,7 +5217,7 @@ bool ProcessMessages(
       // task queue of the {kProcessGlobalPredictablePlatformWorkerTaskQueue}
       // isolate. We execute all background tasks after running one foreground
       // task.
-      if (i::FLAG_verify_predictable) {
+      if (i::v8_flags.verify_predictable) {
         while (v8::platform::PumpMessageLoop(
             g_default_platform,
             kProcessGlobalPredictablePlatformWorkerTaskQueue,
@@ -5120,7 +5248,7 @@ bool Shell::CompleteMessageLoop(Isolate* isolate) {
     return should_wait ? platform::MessageLoopBehavior::kWaitForWork
                        : platform::MessageLoopBehavior::kDoNotWait;
   };
-  if (i::FLAG_verify_predictable) {
+  if (i::v8_flags.verify_predictable) {
     bool ran_tasks = ProcessMessages(
         isolate, [] { return platform::MessageLoopBehavior::kDoNotWait; });
     if (get_waiting_behaviour() ==
@@ -5392,7 +5520,7 @@ class D8Testing {
    * stress coverage.
    */
   static int GetStressRuns() {
-    if (internal::FLAG_stress_runs != 0) return internal::FLAG_stress_runs;
+    if (i::v8_flags.stress_runs != 0) return i::v8_flags.stress_runs;
 #ifdef DEBUG
     // In debug mode the code runs much slower so stressing will only make two
     // runs.
@@ -5480,7 +5608,7 @@ void d8_sigterm_handler(int signal, siginfo_t* info, void* context) {
 
 void d8_install_sigterm_handler() {
 #ifdef V8_OS_POSIX
-  CHECK(!i::FLAG_fuzzing);
+  CHECK(!i::v8_flags.fuzzing);
   struct sigaction sa;
   sa.sa_sigaction = d8_sigterm_handler;
   sigemptyset(&sa.sa_mask);
@@ -5496,7 +5624,7 @@ void d8_install_sigterm_handler() {
 int Shell::Main(int argc, char* argv[]) {
   v8::base::EnsureConsoleOutput();
   if (!SetOptions(argc, argv)) return 1;
-  if (!i::FLAG_fuzzing) d8_install_sigterm_handler();
+  if (!i::v8_flags.fuzzing) d8_install_sigterm_handler();
 
   v8::V8::InitializeICUDefaultLocation(argv[0], options.icu_data_file);
 
@@ -5515,7 +5643,7 @@ int Shell::Main(int argc, char* argv[]) {
 
   std::ofstream trace_file;
   std::unique_ptr<platform::tracing::TracingController> tracing;
-  if (options.trace_enabled && !i::FLAG_verify_predictable) {
+  if (options.trace_enabled && !i::v8_flags.verify_predictable) {
     tracing = std::make_unique<platform::tracing::TracingController>();
 
     if (!options.enable_etw_stack_walking) {
@@ -5564,29 +5692,29 @@ int Shell::Main(int argc, char* argv[]) {
       options.thread_pool_size, v8::platform::IdleTaskSupport::kEnabled,
       in_process_stack_dumping, std::move(tracing));
   g_default_platform = g_platform.get();
-  if (i::FLAG_predictable) {
+  if (i::v8_flags.predictable) {
     g_platform = MakePredictablePlatform(std::move(g_platform));
   }
   if (options.stress_delay_tasks) {
-    int64_t random_seed = i::FLAG_fuzzer_random_seed;
-    if (!random_seed) random_seed = i::FLAG_random_seed;
+    int64_t random_seed = i::v8_flags.fuzzer_random_seed;
+    if (!random_seed) random_seed = i::v8_flags.random_seed;
     // If random_seed is still 0 here, the {DelayedTasksPlatform} will choose a
     // random seed.
     g_platform = MakeDelayedTasksPlatform(std::move(g_platform), random_seed);
   }
 
-  if (i::FLAG_trace_turbo_cfg_file == nullptr) {
+  if (i::v8_flags.trace_turbo_cfg_file == nullptr) {
     V8::SetFlagsFromString("--trace-turbo-cfg-file=turbo.cfg");
   }
-  if (i::FLAG_redirect_code_traces_to == nullptr) {
+  if (i::v8_flags.redirect_code_traces_to == nullptr) {
     V8::SetFlagsFromString("--redirect-code-traces-to=code.asm");
   }
   v8::V8::InitializePlatform(g_platform.get());
 
   // Disable flag freezing if we are producing a code cache, because for that we
-  // modify FLAG_hash_seed (below).
+  // modify v8_flags.hash_seed (below).
   if (options.code_cache_options != ShellOptions::kNoProduceCache) {
-    i::FLAG_freeze_flags_after_init = false;
+    i::v8_flags.freeze_flags_after_init = false;
   }
 
   v8::V8::Initialize();
@@ -5623,7 +5751,7 @@ int Shell::Main(int argc, char* argv[]) {
   }
   create_params.array_buffer_allocator = Shell::array_buffer_allocator;
 #ifdef ENABLE_VTUNE_JIT_INTERFACE
-  if (i::FLAG_enable_vtunejit) {
+  if (i::v8_flags.enable_vtunejit) {
     create_params.code_event_handler = vTune::GetVtuneCodeEventHandler();
   }
 #endif
@@ -5705,8 +5833,8 @@ int Shell::Main(int argc, char* argv[]) {
                                      CpuProfilingOptions{});
       }
 
-      if (i::FLAG_stress_runs > 0) {
-        options.stress_runs = i::FLAG_stress_runs;
+      if (i::v8_flags.stress_runs > 0) {
+        options.stress_runs = i::v8_flags.stress_runs;
         for (int i = 0; i < options.stress_runs && result == 0; i++) {
           printf("============ Run %d/%d ============\n", i + 1,
                  options.stress_runs.get());
@@ -5725,10 +5853,10 @@ int Shell::Main(int argc, char* argv[]) {
           Isolate::CreateParams create_params2;
           create_params2.array_buffer_allocator = Shell::array_buffer_allocator;
           // Use a different hash seed.
-          i::FLAG_hash_seed = i::FLAG_hash_seed ^ 1337;
+          i::v8_flags.hash_seed = i::v8_flags.hash_seed ^ 1337;
           Isolate* isolate2 = Isolate::New(create_params2);
           // Restore old hash seed.
-          i::FLAG_hash_seed = i::FLAG_hash_seed ^ 1337;
+          i::v8_flags.hash_seed = i::v8_flags.hash_seed ^ 1337;
           {
             D8Console console2(isolate2);
             Initialize(isolate2, &console2);
@@ -5764,7 +5892,7 @@ int Shell::Main(int argc, char* argv[]) {
         RunShell(isolate);
       }
 
-      if (i::FLAG_trace_ignition_dispatches_output_file != nullptr) {
+      if (i::v8_flags.trace_ignition_dispatches_output_file != nullptr) {
         WriteIgnitionDispatchCountersFile(isolate);
       }
 
diff --git a/deps/v8/src/d8/d8.h b/deps/v8/src/d8/d8.h
index 00e71a12e01ad9..3cfa31322dbc02 100644
--- a/deps/v8/src/d8/d8.h
+++ b/deps/v8/src/d8/d8.h
@@ -540,7 +540,14 @@ class Shell : public i::AllStatic {
   static void AddHistogramSample(void* histogram, int sample);
   static void MapCounters(v8::Isolate* isolate, const char* name);
 
+  static double GetTimestamp();
+  static int64_t GetTracingTimestampFromPerformanceTimestamp(
+      double performance_timestamp);
+
   static void PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args);
+  static void PerformanceMark(const v8::FunctionCallbackInfo<v8::Value>& args);
+  static void PerformanceMeasure(
+      const v8::FunctionCallbackInfo<v8::Value>& args);
   static void PerformanceMeasureMemory(
       const v8::FunctionCallbackInfo<v8::Value>& args);
 
diff --git a/deps/v8/src/date/date.cc b/deps/v8/src/date/date.cc
index c4742aab30f1d7..8ffeee0d1a2f83 100644
--- a/deps/v8/src/date/date.cc
+++ b/deps/v8/src/date/date.cc
@@ -53,7 +53,7 @@ void DateCache::ResetDateCache(
   after_ = &dst_[1];
   ymd_valid_ = false;
 #ifdef V8_INTL_SUPPORT
-  if (!FLAG_icu_timezone_data) {
+  if (!v8_flags.icu_timezone_data) {
 #endif
     local_offset_ms_ = kInvalidLocalOffsetInMs;
 #ifdef V8_INTL_SUPPORT
@@ -215,7 +215,7 @@ void DateCache::BreakDownTime(int64_t time_ms, int* year, int* month, int* day,
 int DateCache::GetLocalOffsetFromOS(int64_t time_ms, bool is_utc) {
   double offset;
 #ifdef V8_INTL_SUPPORT
-  if (FLAG_icu_timezone_data) {
+  if (v8_flags.icu_timezone_data) {
     offset = tz_cache_->LocalTimeOffset(static_cast<double>(time_ms), is_utc);
   } else {
 #endif
diff --git a/deps/v8/src/date/dateparser-inl.h b/deps/v8/src/date/dateparser-inl.h
index 623986d2b10acc..b45479dc516e70 100644
--- a/deps/v8/src/date/dateparser-inl.h
+++ b/deps/v8/src/date/dateparser-inl.h
@@ -192,7 +192,7 @@ DateParser::DateToken DateParser::DateStringTokenizer<CharType>::Scan() {
   if (in_->Skip('+')) return DateToken::Symbol('+');
   if (in_->Skip('.')) return DateToken::Symbol('.');
   if (in_->Skip(')')) return DateToken::Symbol(')');
-  if (in_->IsAsciiAlphaOrAbove()) {
+  if (in_->IsAsciiAlphaOrAbove() && !in_->IsWhiteSpaceChar()) {
     DCHECK_EQ(KeywordTable::kPrefixLength, 3);
     uint32_t buffer[3] = {0, 0, 0};
     int length = in_->ReadWord(buffer, 3);
diff --git a/deps/v8/src/date/dateparser.h b/deps/v8/src/date/dateparser.h
index 1a0a0b15ab7585..59b2f3c9fd235f 100644
--- a/deps/v8/src/date/dateparser.h
+++ b/deps/v8/src/date/dateparser.h
@@ -91,7 +91,8 @@ class DateParser : public AllStatic {
     // Return word length.
     int ReadWord(uint32_t* prefix, int prefix_size) {
       int len;
-      for (len = 0; IsAsciiAlphaOrAbove(); Next(), len++) {
+      for (len = 0; IsAsciiAlphaOrAbove() && !IsWhiteSpaceChar();
+           Next(), len++) {
         if (len < prefix_size) prefix[len] = AsciiAlphaToLower(ch_);
       }
       for (int i = len; i < prefix_size; i++) prefix[i] = 0;
@@ -115,6 +116,7 @@ class DateParser : public AllStatic {
     bool IsEnd() const { return ch_ == 0; }
     bool IsAsciiDigit() const { return IsDecimalDigit(ch_); }
     bool IsAsciiAlphaOrAbove() const { return ch_ >= 'A'; }
+    bool IsWhiteSpaceChar() const { return IsWhiteSpace(ch_); }
     bool IsAsciiSign() const { return ch_ == '+' || ch_ == '-'; }
 
     // Return 1 for '+' and -1 for '-'.
diff --git a/deps/v8/src/debug/debug-coverage.cc b/deps/v8/src/debug/debug-coverage.cc
index 70fdb41f3bbc41..c434cede657989 100644
--- a/deps/v8/src/debug/debug-coverage.cc
+++ b/deps/v8/src/debug/debug-coverage.cc
@@ -478,7 +478,7 @@ void CollectBlockCoverage(CoverageFunction* function, SharedFunctionInfo info,
 void PrintBlockCoverage(const CoverageFunction* function,
                         SharedFunctionInfo info, bool has_nonempty_source_range,
                         bool function_is_relevant) {
-  DCHECK(FLAG_trace_block_coverage);
+  DCHECK(v8_flags.trace_block_coverage);
   std::unique_ptr<char[]> function_name =
       function->name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
   i::PrintF(
@@ -543,10 +543,10 @@ void CollectAndMaybeResetCounts(Isolate* isolate,
           count =
               static_cast<uint32_t>(func.feedback_vector().invocation_count());
         } else if (func.raw_feedback_cell().interrupt_budget() <
-                   FLAG_interrupt_budget_for_feedback_allocation) {
+                   v8_flags.interrupt_budget_for_feedback_allocation) {
           // TODO(jgruber): The condition above is no longer precise since we
           // may use either the fixed interrupt_budget or
-          // FLAG_interrupt_budget_factor_for_feedback_allocation. If the
+          // v8_flags.interrupt_budget_factor_for_feedback_allocation. If the
           // latter, we may incorrectly set a count of 1.
           //
           // We haven't allocated feedback vector, but executed the function
@@ -605,9 +605,8 @@ std::unique_ptr<Coverage> Coverage::CollectPrecise(Isolate* isolate) {
   DCHECK(!isolate->is_best_effort_code_coverage());
   std::unique_ptr<Coverage> result =
       Collect(isolate, isolate->code_coverage_mode());
-  if (!isolate->is_collecting_type_profile() &&
-      (isolate->is_precise_binary_code_coverage() ||
-       isolate->is_block_binary_code_coverage())) {
+  if (isolate->is_precise_binary_code_coverage() ||
+      isolate->is_block_binary_code_coverage()) {
     // We do not have to hold onto feedback vectors for invocations we already
     // reported. So we can reset the list.
     isolate->SetFeedbackVectorsForProfilingTools(
@@ -735,7 +734,7 @@ std::unique_ptr<Coverage> Coverage::Collect(
         functions->emplace_back(function);
       }
 
-      if (FLAG_trace_block_coverage) {
+      if (v8_flags.trace_block_coverage) {
         PrintBlockCoverage(&function, *info, has_nonempty_source_range,
                            function_is_relevant);
       }
@@ -766,10 +765,8 @@ void Coverage::SelectMode(Isolate* isolate, debug::CoverageMode mode) {
       // following coverage recording (without reloads) will be at function
       // granularity.
       isolate->debug()->RemoveAllCoverageInfos();
-      if (!isolate->is_collecting_type_profile()) {
-        isolate->SetFeedbackVectorsForProfilingTools(
-            ReadOnlyRoots(isolate).undefined_value());
-      }
+      isolate->SetFeedbackVectorsForProfilingTools(
+          ReadOnlyRoots(isolate).undefined_value());
       break;
     case debug::CoverageMode::kBlockBinary:
     case debug::CoverageMode::kBlockCount:
diff --git a/deps/v8/src/debug/debug-evaluate.cc b/deps/v8/src/debug/debug-evaluate.cc
index 65bdfa241a1a0a..2813456b12636a 100644
--- a/deps/v8/src/debug/debug-evaluate.cc
+++ b/deps/v8/src/debug/debug-evaluate.cc
@@ -19,6 +19,7 @@
 #include "src/interpreter/bytecodes.h"
 #include "src/objects/code-inl.h"
 #include "src/objects/contexts.h"
+#include "src/objects/string-set-inl.h"
 
 #if V8_ENABLE_WEBASSEMBLY
 #include "src/debug/debug-wasm-objects.h"
@@ -210,7 +211,9 @@ DebugEvaluate::ContextBuilder::ContextBuilder(Isolate* isolate,
     : isolate_(isolate),
       frame_inspector_(frame, inlined_jsframe_index, isolate),
       scope_iterator_(isolate, &frame_inspector_,
-                      ScopeIterator::ReparseStrategy::kScript) {
+                      v8_flags.experimental_reuse_locals_blocklists
+                          ? ScopeIterator::ReparseStrategy::kScriptIfNeeded
+                          : ScopeIterator::ReparseStrategy::kScript) {
   Handle<Context> outer_context(frame_inspector_.GetFunction()->context(),
                                 isolate);
   evaluation_context_ = outer_context;
@@ -246,8 +249,16 @@ DebugEvaluate::ContextBuilder::ContextBuilder(Isolate* isolate,
     if (scope_iterator_.HasContext()) {
       context_chain_element.wrapped_context = scope_iterator_.CurrentContext();
     }
-    if (!scope_iterator_.InInnerScope()) {
-      context_chain_element.blocklist = scope_iterator_.GetLocals();
+    if (v8_flags.experimental_reuse_locals_blocklists) {
+      // With the re-use experiment we only need `DebugEvaluateContexts` up
+      // to (and including) the paused function scope so the evaluated
+      // expression can access the materialized stack locals.
+      if (!scope_iterator_.InInnerScope()) break;
+    } else {
+      CHECK(!v8_flags.experimental_reuse_locals_blocklists);
+      if (!scope_iterator_.InInnerScope()) {
+        context_chain_element.blocklist = scope_iterator_.GetLocals();
+      }
     }
     context_chain_.push_back(context_chain_element);
   }
@@ -261,10 +272,28 @@ DebugEvaluate::ContextBuilder::ContextBuilder(Isolate* isolate,
     ContextChainElement element = *rit;
     scope_info = ScopeInfo::CreateForWithScope(isolate, scope_info);
     scope_info->SetIsDebugEvaluateScope();
-    if (!element.blocklist.is_null()) {
+
+    if (v8_flags.experimental_reuse_locals_blocklists) {
+      if (rit == context_chain_.rbegin()) {
+        // The DebugEvaluateContext we create for the closure scope is the only
+        // DebugEvaluateContext with a block list. This means we'll retrieve
+        // the existing block list from the paused function scope
+        // and also associate the temporary scope_info we create here with that
+        // blocklist.
+        Handle<ScopeInfo> function_scope_info = handle(
+            frame_inspector_.GetFunction()->shared().scope_info(), isolate_);
+        Handle<Object> block_list = handle(
+            isolate_->LocalsBlockListCacheGet(function_scope_info), isolate_);
+        CHECK(block_list->IsStringSet());
+        isolate_->LocalsBlockListCacheSet(scope_info, Handle<ScopeInfo>::null(),
+                                          Handle<StringSet>::cast(block_list));
+      }
+    } else if (!element.blocklist.is_null()) {
+      CHECK(!v8_flags.experimental_reuse_locals_blocklists);
       scope_info = ScopeInfo::RecreateWithBlockList(isolate, scope_info,
                                                     element.blocklist);
     }
+
     evaluation_context_ = factory->NewDebugEvaluateContext(
         evaluation_context_, scope_info, element.materialized_object,
         element.wrapped_context);
@@ -407,7 +436,7 @@ bool DebugEvaluate::IsSideEffectFreeIntrinsic(Runtime::FunctionId id) {
     INLINE_INTRINSIC_ALLOWLIST(INLINE_CASE)
     return true;
     default:
-      if (FLAG_trace_side_effect_free_debug_evaluate) {
+      if (v8_flags.trace_side_effect_free_debug_evaluate) {
         PrintF("[debug-evaluate] intrinsic %s may cause side effect.\n",
                Runtime::FunctionForId(id)->name);
       }
@@ -573,6 +602,8 @@ DebugInfo::SideEffectState BuiltinGetSideEffectState(Builtin id) {
     case Builtin::kArrayPrototypeFlat:
     case Builtin::kArrayPrototypeFlatMap:
     case Builtin::kArrayPrototypeJoin:
+    case Builtin::kArrayPrototypeGroup:
+    case Builtin::kArrayPrototypeGroupToMap:
     case Builtin::kArrayPrototypeKeys:
     case Builtin::kArrayPrototypeLastIndexOf:
     case Builtin::kArrayPrototypeSlice:
@@ -975,7 +1006,7 @@ DebugInfo::SideEffectState BuiltinGetSideEffectState(Builtin id) {
       return DebugInfo::kRequiresRuntimeChecks;
 
     default:
-      if (FLAG_trace_side_effect_free_debug_evaluate) {
+      if (v8_flags.trace_side_effect_free_debug_evaluate) {
         PrintF("[debug-evaluate] built-in %s may cause side effect.\n",
                Builtins::name(id));
       }
@@ -1003,7 +1034,7 @@ bool BytecodeRequiresRuntimeCheck(interpreter::Bytecode bytecode) {
 // static
 DebugInfo::SideEffectState DebugEvaluate::FunctionGetSideEffectState(
     Isolate* isolate, Handle<SharedFunctionInfo> info) {
-  if (FLAG_trace_side_effect_free_debug_evaluate) {
+  if (v8_flags.trace_side_effect_free_debug_evaluate) {
     PrintF("[debug-evaluate] Checking function %s for side effect.\n",
            info->DebugNameCStr().get());
   }
@@ -1014,7 +1045,7 @@ DebugInfo::SideEffectState DebugEvaluate::FunctionGetSideEffectState(
     // Check bytecodes against allowlist.
     Handle<BytecodeArray> bytecode_array(info->GetBytecodeArray(isolate),
                                          isolate);
-    if (FLAG_trace_side_effect_free_debug_evaluate) {
+    if (v8_flags.trace_side_effect_free_debug_evaluate) {
       bytecode_array->Print();
     }
     bool requires_runtime_checks = false;
@@ -1027,7 +1058,7 @@ DebugInfo::SideEffectState DebugEvaluate::FunctionGetSideEffectState(
         continue;
       }
 
-      if (FLAG_trace_side_effect_free_debug_evaluate) {
+      if (v8_flags.trace_side_effect_free_debug_evaluate) {
         PrintF("[debug-evaluate] bytecode %s may cause side effect.\n",
                interpreter::Bytecodes::ToString(bytecode));
       }
diff --git a/deps/v8/src/debug/debug-interface.cc b/deps/v8/src/debug/debug-interface.cc
index 015fb4cec5d4f6..510e874b1a02f4 100644
--- a/deps/v8/src/debug/debug-interface.cc
+++ b/deps/v8/src/debug/debug-interface.cc
@@ -14,7 +14,6 @@
 #include "src/debug/debug-evaluate.h"
 #include "src/debug/debug-property-iterator.h"
 #include "src/debug/debug-stack-trace-iterator.h"
-#include "src/debug/debug-type-profile.h"
 #include "src/debug/debug.h"
 #include "src/execution/vm-state-inl.h"
 #include "src/heap/heap.h"
@@ -948,8 +947,8 @@ MaybeLocal<UnboundScript> CompileInspectorScript(Isolate* v8_isolate,
             isolate, str, i::ScriptDetails(), cached_data,
             ScriptCompiler::kNoCompileOptions,
             ScriptCompiler::kNoCacheBecauseInspector,
-            i::FLAG_expose_inspector_scripts ? i::NOT_NATIVES_CODE
-                                             : i::INSPECTOR_CODE);
+            i::v8_flags.expose_inspector_scripts ? i::NOT_NATIVES_CODE
+                                                 : i::INSPECTOR_CODE);
     has_pending_exception = !maybe_function_info.ToHandle(&result);
     RETURN_ON_FAILED_EXECUTION(UnboundScript);
   }
@@ -1317,48 +1316,6 @@ void Coverage::SelectMode(Isolate* isolate, CoverageMode mode) {
   i::Coverage::SelectMode(reinterpret_cast<i::Isolate*>(isolate), mode);
 }
 
-int TypeProfile::Entry::SourcePosition() const { return entry_->position; }
-
-std::vector<MaybeLocal<String>> TypeProfile::Entry::Types() const {
-  std::vector<MaybeLocal<String>> result;
-  for (const internal::Handle<internal::String>& type : entry_->types) {
-    result.emplace_back(ToApiHandle<String>(type));
-  }
-  return result;
-}
-
-TypeProfile::ScriptData::ScriptData(
-    size_t index, std::shared_ptr<i::TypeProfile> type_profile)
-    : script_(&type_profile->at(index)),
-      type_profile_(std::move(type_profile)) {}
-
-Local<Script> TypeProfile::ScriptData::GetScript() const {
-  return ToApiHandle<Script>(script_->script);
-}
-
-std::vector<TypeProfile::Entry> TypeProfile::ScriptData::Entries() const {
-  std::vector<TypeProfile::Entry> result;
-  for (const internal::TypeProfileEntry& entry : script_->entries) {
-    result.push_back(TypeProfile::Entry(&entry, type_profile_));
-  }
-  return result;
-}
-
-TypeProfile TypeProfile::Collect(Isolate* isolate) {
-  return TypeProfile(
-      i::TypeProfile::Collect(reinterpret_cast<i::Isolate*>(isolate)));
-}
-
-void TypeProfile::SelectMode(Isolate* isolate, TypeProfileMode mode) {
-  i::TypeProfile::SelectMode(reinterpret_cast<i::Isolate*>(isolate), mode);
-}
-
-size_t TypeProfile::ScriptCount() const { return type_profile_->size(); }
-
-TypeProfile::ScriptData TypeProfile::GetScriptData(size_t i) const {
-  return ScriptData(i, type_profile_);
-}
-
 MaybeLocal<v8::Value> EphemeronTable::Get(v8::Isolate* isolate,
                                           v8::Local<v8::Value> key) {
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
@@ -1431,7 +1388,11 @@ MaybeLocal<Message> GetMessageFromPromise(Local<Promise> p) {
 }
 
 bool isExperimentalAsyncStackTaggingApiEnabled() {
-  return v8::internal::FLAG_experimental_async_stack_tagging_api;
+  return i::v8_flags.experimental_async_stack_tagging_api;
+}
+
+bool isExperimentalRemoveInternalScopesPropertyEnabled() {
+  return i::v8_flags.experimental_remove_internal_scopes_property;
 }
 
 void RecordAsyncStackTaggingCreateTaskCall(v8::Isolate* v8_isolate) {
diff --git a/deps/v8/src/debug/debug-interface.h b/deps/v8/src/debug/debug-interface.h
index 3f85bb60224718..b67d61f8363ae6 100644
--- a/deps/v8/src/debug/debug-interface.h
+++ b/deps/v8/src/debug/debug-interface.h
@@ -34,13 +34,10 @@ namespace internal {
 struct CoverageBlock;
 struct CoverageFunction;
 struct CoverageScript;
-struct TypeProfileEntry;
-struct TypeProfileScript;
 class Coverage;
 class DisableBreak;
 class PostponeInterruptsScope;
 class Script;
-class TypeProfile;
 }  // namespace internal
 
 namespace debug {
@@ -438,64 +435,6 @@ class V8_EXPORT_PRIVATE Coverage {
   std::shared_ptr<i::Coverage> coverage_;
 };
 
-/*
- * Provide API layer between inspector and type profile.
- */
-class V8_EXPORT_PRIVATE TypeProfile {
- public:
-  MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(TypeProfile);
-
-  class ScriptData;  // Forward declaration.
-
-  class V8_EXPORT_PRIVATE Entry {
-   public:
-    MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(Entry);
-
-    int SourcePosition() const;
-    std::vector<MaybeLocal<String>> Types() const;
-
-   private:
-    explicit Entry(const i::TypeProfileEntry* entry,
-                   std::shared_ptr<i::TypeProfile> type_profile)
-        : entry_(entry), type_profile_(std::move(type_profile)) {}
-
-    const i::TypeProfileEntry* entry_;
-    std::shared_ptr<i::TypeProfile> type_profile_;
-
-    friend class v8::debug::TypeProfile::ScriptData;
-  };
-
-  class V8_EXPORT_PRIVATE ScriptData {
-   public:
-    MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(ScriptData);
-
-    Local<debug::Script> GetScript() const;
-    std::vector<Entry> Entries() const;
-
-   private:
-    explicit ScriptData(size_t index,
-                        std::shared_ptr<i::TypeProfile> type_profile);
-
-    i::TypeProfileScript* script_;
-    std::shared_ptr<i::TypeProfile> type_profile_;
-
-    friend class v8::debug::TypeProfile;
-  };
-
-  static TypeProfile Collect(Isolate* isolate);
-
-  static void SelectMode(Isolate* isolate, TypeProfileMode mode);
-
-  size_t ScriptCount() const;
-  ScriptData GetScriptData(size_t i) const;
-
- private:
-  explicit TypeProfile(std::shared_ptr<i::TypeProfile> type_profile)
-      : type_profile_(std::move(type_profile)) {}
-
-  std::shared_ptr<i::TypeProfile> type_profile_;
-};
-
 class V8_EXPORT_PRIVATE ScopeIterator {
  public:
   static std::unique_ptr<ScopeIterator> CreateForFunction(
@@ -732,6 +671,7 @@ AccessorPair* AccessorPair::Cast(v8::Value* value) {
 MaybeLocal<Message> GetMessageFromPromise(Local<Promise> promise);
 
 bool isExperimentalAsyncStackTaggingApiEnabled();
+bool isExperimentalRemoveInternalScopesPropertyEnabled();
 
 void RecordAsyncStackTaggingCreateTaskCall(v8::Isolate* isolate);
 
diff --git a/deps/v8/src/debug/debug-scopes.cc b/deps/v8/src/debug/debug-scopes.cc
index 3bb08e8c2ac490..03caab3900d1bf 100644
--- a/deps/v8/src/debug/debug-scopes.cc
+++ b/deps/v8/src/debug/debug-scopes.cc
@@ -220,6 +220,14 @@ void ScopeIterator::TryParseAndRetrieveScopes(ReparseStrategy strategy) {
     ignore_nested_scopes = location.IsReturn();
   }
 
+  if (strategy == ReparseStrategy::kScriptIfNeeded) {
+    CHECK(v8_flags.experimental_reuse_locals_blocklists);
+    Object maybe_block_list = isolate_->LocalsBlockListCacheGet(scope_info);
+    calculate_blocklists_ = maybe_block_list.IsTheHole();
+    strategy = calculate_blocklists_ ? ReparseStrategy::kScript
+                                     : ReparseStrategy::kFunctionLiteral;
+  }
+
   // Reparse the code and analyze the scopes.
   // Depending on the choosen strategy, the whole script or just
   // the closure is re-parsed for function scopes.
@@ -291,6 +299,7 @@ void ScopeIterator::TryParseAndRetrieveScopes(ReparseStrategy strategy) {
       }
     }
 
+    MaybeCollectAndStoreLocalBlocklists();
     UnwrapEvaluationContext();
   } else {
     // A failed reparse indicates that the preparser has diverged from the
@@ -481,9 +490,10 @@ void ScopeIterator::Next() {
     }
   }
 
-  if (leaving_closure) function_ = Handle<JSFunction>();
-
+  MaybeCollectAndStoreLocalBlocklists();
   UnwrapEvaluationContext();
+
+  if (leaving_closure) function_ = Handle<JSFunction>();
 }
 
 // Return the type of the current scope.
@@ -561,7 +571,7 @@ Handle<JSObject> ScopeIterator::ScopeObject(Mode mode) {
   auto visitor = [=](Handle<String> name, Handle<Object> value,
                      ScopeType scope_type) {
     if (value->IsOptimizedOut(isolate_)) {
-      if (FLAG_experimental_value_unavailable) {
+      if (v8_flags.experimental_value_unavailable) {
         JSObject::SetAccessor(scope, name,
                               isolate_->factory()->value_unavailable_accessor(),
                               NONE)
@@ -577,7 +587,7 @@ Handle<JSObject> ScopeIterator::ScopeObject(Mode mode) {
         // REPL mode in a script context. Catch this case.
         return false;
       }
-      if (FLAG_experimental_value_unavailable) {
+      if (v8_flags.experimental_value_unavailable) {
         JSObject::SetAccessor(scope, name,
                               isolate_->factory()->value_unavailable_accessor(),
                               NONE)
@@ -1123,5 +1133,175 @@ bool ScopeIterator::SetScriptVariableValue(Handle<String> variable_name,
   return false;
 }
 
+namespace {
+
+// Given the scope and context of a paused function, this class calculates
+// all the necessary block lists on the scope chain and stores them in the
+// global LocalsBlockListCache ephemeron table.
+//
+// Doc: bit.ly/chrome-devtools-debug-evaluate-design.
+//
+// The algorithm works in a single walk of the scope chain from the
+// paused function scope outwards to the script scope.
+//
+// When we step from scope "a" to its outer scope "b", we do:
+//
+//   1. Add all stack-allocated variables from "b" to the blocklists.
+//   2. Does "b" need a context? If yes:
+//        - Store all current blocklists in the global table
+//        - Start a new blocklist for scope "b"
+//   3. Is "b" a function scope without a context? If yes:
+//        - Start a new blocklist for scope "b"
+//
+class LocalBlocklistsCollector {
+ public:
+  LocalBlocklistsCollector(Isolate* isolate, Handle<Script> script,
+                           Handle<Context> context,
+                           DeclarationScope* closure_scope);
+  void CollectAndStore();
+
+ private:
+  void InitializeWithClosureScope();
+  void AdvanceToNextNonHiddenScope();
+  void CollectCurrentLocalsIntoBlocklists();
+  Handle<ScopeInfo> FindScopeInfoForScope(Scope* scope) const;
+  void StoreFunctionBlocklists(Handle<ScopeInfo> outer_scope_info);
+
+  Isolate* isolate_;
+  Handle<Script> script_;
+  Handle<Context> context_;
+  Scope* scope_;
+  DeclarationScope* closure_scope_;
+
+  Handle<StringSet> context_blocklist_;
+  std::map<Scope*, Handle<StringSet>> function_blocklists_;
+};
+
+LocalBlocklistsCollector::LocalBlocklistsCollector(
+    Isolate* isolate, Handle<Script> script, Handle<Context> context,
+    DeclarationScope* closure_scope)
+    : isolate_(isolate),
+      script_(script),
+      context_(context),
+      scope_(closure_scope),
+      closure_scope_(closure_scope) {}
+
+void LocalBlocklistsCollector::InitializeWithClosureScope() {
+  CHECK(scope_->is_declaration_scope());
+  function_blocklists_.emplace(scope_, StringSet::New(isolate_));
+  if (scope_->NeedsContext()) context_blocklist_ = StringSet::New(isolate_);
+}
+
+void LocalBlocklistsCollector::AdvanceToNextNonHiddenScope() {
+  DCHECK(scope_ && scope_->outer_scope());
+  do {
+    scope_ = scope_->outer_scope();
+    CHECK(scope_);
+  } while (scope_->is_hidden());
+}
+
+void LocalBlocklistsCollector::CollectCurrentLocalsIntoBlocklists() {
+  for (Variable* var : *scope_->locals()) {
+    if (var->location() == VariableLocation::PARAMETER ||
+        var->location() == VariableLocation::LOCAL) {
+      if (!context_blocklist_.is_null()) {
+        context_blocklist_ =
+            StringSet::Add(isolate_, context_blocklist_, var->name());
+      }
+      for (auto& pair : function_blocklists_) {
+        pair.second = StringSet::Add(isolate_, pair.second, var->name());
+      }
+    }
+  }
+}
+
+Handle<ScopeInfo> LocalBlocklistsCollector::FindScopeInfoForScope(
+    Scope* scope) const {
+  DisallowGarbageCollection no_gc;
+  SharedFunctionInfo::ScriptIterator iterator(isolate_, *script_);
+  for (SharedFunctionInfo info = iterator.Next(); !info.is_null();
+       info = iterator.Next()) {
+    if (scope->start_position() == info.StartPosition() &&
+        scope->end_position() == info.EndPosition()) {
+      if (info.is_compiled() && !info.scope_info().is_null()) {
+        return handle(info.scope_info(), isolate_);
+      }
+      return Handle<ScopeInfo>();
+    }
+  }
+  return Handle<ScopeInfo>();
+}
+
+void LocalBlocklistsCollector::StoreFunctionBlocklists(
+    Handle<ScopeInfo> outer_scope_info) {
+  for (const auto& pair : function_blocklists_) {
+    Handle<ScopeInfo> scope_info = FindScopeInfoForScope(pair.first);
+    // If we don't find a ScopeInfo it's not tragic. It means we'll do
+    // a full-reparse in case we pause in that function in the future.
+    // The only ScopeInfo that MUST be found is for the closure_scope_.
+    CHECK_IMPLIES(pair.first == closure_scope_, !scope_info.is_null());
+    if (scope_info.is_null()) continue;
+    isolate_->LocalsBlockListCacheSet(scope_info, outer_scope_info,
+                                      pair.second);
+  }
+}
+
+void LocalBlocklistsCollector::CollectAndStore() {
+  InitializeWithClosureScope();
+
+  while (scope_->outer_scope() && !context_->IsNativeContext()) {
+    AdvanceToNextNonHiddenScope();
+    // 1. Add all stack-allocated variables of `scope_` to the various lists.
+    CollectCurrentLocalsIntoBlocklists();
+
+    // 2. If the current scope requires a context then all the blocklists "stop"
+    //    here and we store them.  Next, advance the current context so
+    //    `context_` and `scope_` match again.
+    if (scope_->NeedsContext()) {
+      if (!context_blocklist_.is_null()) {
+        // Only store the block list and advance the context if the
+        // context_blocklist is set. This handles the case when we start on
+        // a closure scope that doesn't require a context. In that case
+        // `context_` is already the right context for `scope_` so we don't
+        // need to advance `context_`.
+        isolate_->LocalsBlockListCacheSet(
+            handle(context_->scope_info(), isolate_),
+            handle(context_->previous().scope_info(), isolate_),
+            context_blocklist_);
+        context_ = handle(context_->previous(), isolate_);
+      }
+
+      StoreFunctionBlocklists(handle(context_->scope_info(), isolate_));
+
+      context_blocklist_ = StringSet::New(isolate_);
+      function_blocklists_.clear();
+    } else if (scope_->is_function_scope()) {
+      // 3. If `scope` is a function scope with an SFI, start recording
+      //    locals for its ScopeInfo.
+      CHECK(!scope_->NeedsContext());
+      function_blocklists_.emplace(scope_, StringSet::New(isolate_));
+    }
+  }
+
+  // In case we don't have any outer scopes we still need to record the empty
+  // block list for the paused function to prevent future re-parses.
+  StoreFunctionBlocklists(handle(context_->scope_info(), isolate_));
+}
+
+}  // namespace
+
+void ScopeIterator::MaybeCollectAndStoreLocalBlocklists() const {
+  if (!calculate_blocklists_ || current_scope_ != closure_scope_) return;
+
+  CHECK(v8_flags.experimental_reuse_locals_blocklists);
+  DCHECK(isolate_
+             ->LocalsBlockListCacheGet(
+                 handle(function_->shared().scope_info(), isolate_))
+             .IsTheHole());
+  LocalBlocklistsCollector collector(isolate_, script_, context_,
+                                     closure_scope_);
+  collector.CollectAndStore();
+}
+
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/debug/debug-scopes.h b/deps/v8/src/debug/debug-scopes.h
index ca16dad72623ba..fa2a79bc46ab5d 100644
--- a/deps/v8/src/debug/debug-scopes.h
+++ b/deps/v8/src/debug/debug-scopes.h
@@ -43,6 +43,11 @@ class ScopeIterator {
   enum class ReparseStrategy {
     kScript,
     kFunctionLiteral,
+    // Checks whether the paused function (and its scope chain) already has
+    // its blocklist calculated and re-parses the whole script if not.
+    // Otherwise only the function literal is re-parsed.
+    // Only vaild with enabled "experimental_reuse_locals_blocklists" flag.
+    kScriptIfNeeded,
   };
 
   ScopeIterator(Isolate* isolate, FrameInspector* frame_inspector,
@@ -125,6 +130,7 @@ class ScopeIterator {
   Scope* start_scope_ = nullptr;
   Scope* current_scope_ = nullptr;
   bool seen_script_scope_ = false;
+  bool calculate_blocklists_ = false;
 
   inline JavaScriptFrame* GetFrame() const {
     return frame_inspector_->javascript_frame();
@@ -136,6 +142,14 @@ class ScopeIterator {
   void AdvanceContext();
   void CollectLocalsFromCurrentScope();
 
+  // Calculates all the block list starting at the current scope and stores
+  // them in the global "LocalsBlocklistCache".
+  //
+  // Is a no-op unless `calculate_blocklists_` is true and
+  // current_scope_ == closure_scope_. Otherwise `context_` does not match
+  // with current_scope_/closure_scope_.
+  void MaybeCollectAndStoreLocalBlocklists() const;
+
   int GetSourcePosition() const;
 
   void TryParseAndRetrieveScopes(ReparseStrategy strategy);
diff --git a/deps/v8/src/debug/debug-type-profile.cc b/deps/v8/src/debug/debug-type-profile.cc
deleted file mode 100644
index a4cae83e3b710d..00000000000000
--- a/deps/v8/src/debug/debug-type-profile.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/debug/debug-type-profile.h"
-
-#include "src/execution/isolate.h"
-#include "src/objects/feedback-vector.h"
-#include "src/objects/objects-inl.h"
-#include "src/objects/objects.h"
-
-namespace v8 {
-namespace internal {
-
-std::unique_ptr<TypeProfile> TypeProfile::Collect(Isolate* isolate) {
-  std::unique_ptr<TypeProfile> result(new TypeProfile());
-
-  // Feedback vectors are already listed to prevent losing them to GC.
-  DCHECK(isolate->factory()
-             ->feedback_vectors_for_profiling_tools()
-             ->IsArrayList());
-  Handle<ArrayList> list = Handle<ArrayList>::cast(
-      isolate->factory()->feedback_vectors_for_profiling_tools());
-
-  Script::Iterator scripts(isolate);
-
-  for (Script script = scripts.Next(); !script.is_null();
-       script = scripts.Next()) {
-    if (!script.IsUserJavaScript()) {
-      continue;
-    }
-
-    Handle<Script> script_handle(script, isolate);
-
-    TypeProfileScript type_profile_script(script_handle);
-    std::vector<TypeProfileEntry>* entries = &type_profile_script.entries;
-
-    // TODO(franzih): Sort the vectors by script first instead of iterating
-    // the list multiple times.
-    for (int i = 0; i < list->Length(); i++) {
-      FeedbackVector vector = FeedbackVector::cast(list->Get(i));
-      SharedFunctionInfo info = vector.shared_function_info();
-      DCHECK(info.IsSubjectToDebugging());
-
-      // Match vectors with script.
-      if (script != info.script()) {
-        continue;
-      }
-      if (!info.HasFeedbackMetadata() || info.feedback_metadata().is_empty() ||
-          !info.feedback_metadata().HasTypeProfileSlot()) {
-        continue;
-      }
-      FeedbackSlot slot = vector.GetTypeProfileSlot();
-      FeedbackNexus nexus(vector, slot);
-      std::vector<int> source_positions = nexus.GetSourcePositions();
-      for (int position : source_positions) {
-        DCHECK_GE(position, 0);
-        entries->emplace_back(position, nexus.GetTypesForSourcePositions(
-                                            static_cast<uint32_t>(position)));
-      }
-
-      // Releases type profile data collected so far.
-      nexus.ResetTypeProfile();
-    }
-    if (!entries->empty()) {
-      result->emplace_back(type_profile_script);
-    }
-  }
-  return result;
-}
-
-void TypeProfile::SelectMode(Isolate* isolate, debug::TypeProfileMode mode) {
-  if (mode != isolate->type_profile_mode()) {
-    // Changing the type profile mode can change the bytecode that would be
-    // generated for a function, which can interfere with lazy source positions,
-    // so just force source position collection whenever there's such a change.
-    isolate->CollectSourcePositionsForAllBytecodeArrays();
-  }
-
-  HandleScope handle_scope(isolate);
-
-  if (mode == debug::TypeProfileMode::kNone) {
-    if (!isolate->factory()
-             ->feedback_vectors_for_profiling_tools()
-             ->IsUndefined(isolate)) {
-      // Release type profile data collected so far.
-
-      // Feedback vectors are already listed to prevent losing them to GC.
-      DCHECK(isolate->factory()
-                 ->feedback_vectors_for_profiling_tools()
-                 ->IsArrayList());
-      Handle<ArrayList> list = Handle<ArrayList>::cast(
-          isolate->factory()->feedback_vectors_for_profiling_tools());
-
-      for (int i = 0; i < list->Length(); i++) {
-        FeedbackVector vector = FeedbackVector::cast(list->Get(i));
-        SharedFunctionInfo info = vector.shared_function_info();
-        DCHECK(info.IsSubjectToDebugging());
-        if (info.feedback_metadata().HasTypeProfileSlot()) {
-          FeedbackSlot slot = vector.GetTypeProfileSlot();
-          FeedbackNexus nexus(vector, slot);
-          nexus.ResetTypeProfile();
-        }
-      }
-
-      // Delete the feedback vectors from the list if they're not used by code
-      // coverage.
-      if (isolate->is_best_effort_code_coverage()) {
-        isolate->SetFeedbackVectorsForProfilingTools(
-            ReadOnlyRoots(isolate).undefined_value());
-      }
-    }
-  } else {
-    DCHECK_EQ(debug::TypeProfileMode::kCollect, mode);
-    isolate->MaybeInitializeVectorListFromHeap();
-  }
-  isolate->set_type_profile_mode(mode);
-}
-
-}  // namespace internal
-}  // namespace v8
diff --git a/deps/v8/src/debug/debug-type-profile.h b/deps/v8/src/debug/debug-type-profile.h
deleted file mode 100644
index a4da12f1e41c92..00000000000000
--- a/deps/v8/src/debug/debug-type-profile.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef V8_DEBUG_DEBUG_TYPE_PROFILE_H_
-#define V8_DEBUG_DEBUG_TYPE_PROFILE_H_
-
-#include <memory>
-#include <vector>
-
-#include "src/debug/debug-interface.h"
-#include "src/handles/handles.h"
-
-namespace v8 {
-namespace internal {
-
-// Forward declaration.
-class Isolate;
-
-struct TypeProfileEntry {
-  explicit TypeProfileEntry(
-      int pos, std::vector<v8::internal::Handle<internal::String>> t)
-      : position(pos), types(std::move(t)) {}
-  int position;
-  std::vector<v8::internal::Handle<internal::String>> types;
-};
-
-struct TypeProfileScript {
-  explicit TypeProfileScript(Handle<Script> s) : script(s) {}
-  Handle<Script> script;
-  std::vector<TypeProfileEntry> entries;
-};
-
-class TypeProfile : public std::vector<TypeProfileScript> {
- public:
-  static std::unique_ptr<TypeProfile> Collect(Isolate* isolate);
-  static void SelectMode(Isolate* isolate, debug::TypeProfileMode mode);
-
- private:
-  TypeProfile() = default;
-};
-
-}  // namespace internal
-}  // namespace v8
-
-#endif  // V8_DEBUG_DEBUG_TYPE_PROFILE_H_
diff --git a/deps/v8/src/debug/debug-wasm-objects.cc b/deps/v8/src/debug/debug-wasm-objects.cc
index a7933438abaf69..1a4eca61fc0041 100644
--- a/deps/v8/src/debug/debug-wasm-objects.cc
+++ b/deps/v8/src/debug/debug-wasm-objects.cc
@@ -729,6 +729,18 @@ Handle<String> GetRefTypeName(Isolate* isolate, wasm::ValueType type,
   return ToInternalString(name, isolate);
 }
 
+// Returns the type name for the given value. Uses the module object for
+// providing user-defined type names if available, otherwise falls back
+// to numbers for indexed types.
+Handle<String> GetRefTypeName(Isolate* isolate, wasm::ValueType type,
+                              Handle<WasmModuleObject> module_object) {
+  if (!module_object.is_null()) {
+    return GetRefTypeName(isolate, type, module_object->native_module());
+  }
+  std::string name = type.name();
+  return isolate->factory()->InternalizeString({name.data(), name.length()});
+}
+
 }  // namespace
 
 // static
@@ -905,49 +917,54 @@ Handle<WasmValueObject> WasmValueObject::New(
     }
     case wasm::kRefNull:
     case wasm::kRef: {
-      t = GetRefTypeName(isolate, value.type(), module_object->native_module());
       Handle<Object> ref = value.to_ref();
       if (ref->IsWasmStruct()) {
         WasmTypeInfo type_info = ref->GetHeapObject().map().wasm_type_info();
         wasm::ValueType type = wasm::ValueType::FromIndex(
             wasm::ValueKind::kRef, type_info.type_index());
-        t = GetRefTypeName(
-            isolate, type,
-            type_info.instance().module_object().native_module());
-        v = StructProxy::Create(isolate, Handle<WasmStruct>::cast(ref),
-                                module_object);
+        Handle<WasmModuleObject> module(type_info.instance().module_object(),
+                                        isolate);
+        t = GetRefTypeName(isolate, type, module->native_module());
+        v = StructProxy::Create(isolate, Handle<WasmStruct>::cast(ref), module);
       } else if (ref->IsWasmArray()) {
         WasmTypeInfo type_info = ref->GetHeapObject().map().wasm_type_info();
         wasm::ValueType type = wasm::ValueType::FromIndex(
             wasm::ValueKind::kRef, type_info.type_index());
-        t = GetRefTypeName(
-            isolate, type,
-            type_info.instance().module_object().native_module());
-        v = ArrayProxy::Create(isolate, Handle<WasmArray>::cast(ref),
-                               module_object);
+        Handle<WasmModuleObject> module(type_info.instance().module_object(),
+                                        isolate);
+        t = GetRefTypeName(isolate, type, module->native_module());
+        v = ArrayProxy::Create(isolate, Handle<WasmArray>::cast(ref), module);
       } else if (ref->IsWasmInternalFunction()) {
-        v = handle(Handle<WasmInternalFunction>::cast(ref)->external(),
-                   isolate);
+        auto internal_fct = Handle<WasmInternalFunction>::cast(ref);
+        v = handle(internal_fct->external(), isolate);
+        // If the module is not provided by the caller, retrieve it from the
+        // instance object. If the function was created in JavaScript using
+        // `new WebAssembly.Function(...)`, a module for name resolution is not
+        // available.
+        if (module_object.is_null() &&
+            internal_fct->ref().IsWasmInstanceObject()) {
+          module_object = handle(
+              WasmInstanceObject::cast(internal_fct->ref()).module_object(),
+              isolate);
+        }
+        t = GetRefTypeName(isolate, value.type(), module_object);
       } else if (ref->IsJSFunction() || ref->IsSmi() || ref->IsNull() ||
                  ref->IsString() ||
-                 value.type().is_reference_to(wasm::HeapType::kExtern)) {
+                 value.type().is_reference_to(wasm::HeapType::kExtern) ||
+                 value.type().is_reference_to(wasm::HeapType::kAny)) {
+        t = GetRefTypeName(isolate, value.type(), module_object);
         v = ref;
       } else {
         // Fail gracefully.
         base::EmbeddedVector<char, 64> error;
         int len = SNPrintF(error, "unimplemented object type: %d",
                            HeapObject::cast(*ref).map().instance_type());
+        t = GetRefTypeName(isolate, value.type(), module_object);
         v = isolate->factory()->InternalizeString(error.SubVector(0, len));
       }
       break;
     }
-    case wasm::kRtt: {
-      // TODO(7748): Expose RTTs to DevTools.
-      t = isolate->factory()->InternalizeString(base::StaticCharVector("rtt"));
-      v = isolate->factory()->InternalizeString(
-          base::StaticCharVector("(unimplemented)"));
-      break;
-    }
+    case wasm::kRtt:
     case wasm::kVoid:
     case wasm::kBottom:
       UNREACHABLE();
@@ -1037,8 +1054,11 @@ Handle<ArrayList> AddWasmTableObjectInternalProperties(
   for (int i = 0; i < length; ++i) {
     Handle<Object> entry = WasmTableObject::Get(isolate, table, i);
     wasm::WasmValue wasm_value(entry, table->type());
-    Handle<WasmModuleObject> module(
-        WasmInstanceObject::cast(table->instance()).module_object(), isolate);
+    Handle<WasmModuleObject> module;
+    if (table->instance().IsWasmInstanceObject()) {
+      module = Handle<WasmModuleObject>(
+          WasmInstanceObject::cast(table->instance()).module_object(), isolate);
+    }
     Handle<Object> debug_value =
         WasmValueObject::New(isolate, wasm_value, module);
     entries->set(i, *debug_value);
diff --git a/deps/v8/src/debug/debug.cc b/deps/v8/src/debug/debug.cc
index 674d2b39bd965d..72c8e1aa5fb00d 100644
--- a/deps/v8/src/debug/debug.cc
+++ b/deps/v8/src/debug/debug.cc
@@ -249,9 +249,11 @@ BreakIterator::BreakIterator(Handle<DebugInfo> debug_info)
 
 int BreakIterator::BreakIndexFromPosition(int source_position) {
   for (; !Done(); Next()) {
+    if (GetDebugBreakType() == DEBUG_BREAK_SLOT_AT_SUSPEND) continue;
     if (source_position <= position()) {
       int first_break = break_index();
       for (; !Done(); Next()) {
+        if (GetDebugBreakType() == DEBUG_BREAK_SLOT_AT_SUSPEND) continue;
         if (source_position == position()) return break_index();
       }
       return first_break;
@@ -297,6 +299,10 @@ DebugBreakType BreakIterator::GetDebugBreakType() {
   } else if (bytecode == interpreter::Bytecode::kReturn) {
     return DEBUG_BREAK_SLOT_AT_RETURN;
   } else if (bytecode == interpreter::Bytecode::kSuspendGenerator) {
+    // SuspendGenerator should always only carry an expression position that
+    // is used in stack trace construction, but should never be a breakable
+    // position reported to the debugger front-end.
+    DCHECK(!source_position_iterator_.is_statement());
     return DEBUG_BREAK_SLOT_AT_SUSPEND;
   } else if (interpreter::Bytecodes::IsCallOrConstruct(bytecode)) {
     return DEBUG_BREAK_SLOT_AT_CALL;
@@ -574,20 +580,21 @@ void Debug::Break(JavaScriptFrame* frame, Handle<JSFunction> break_target) {
       if (current_frame_count > target_frame_count) return;
       V8_FALLTHROUGH;
     case StepInto: {
-      // Special case StepInto and StepOver for generators that are about to
-      // suspend, in which case we go into "generator stepping" mode. The
-      // exception here is the initial implicit yield in generators (which
-      // always has a suspend ID of 0), where we return to the caller first,
-      // instead of triggering "generator stepping" mode straight away.
-      if (location.IsSuspend() && (!IsGeneratorFunction(shared->kind()) ||
-                                   location.generator_suspend_id() > 0)) {
+      // StepInto and StepOver should enter "generator stepping" mode, except
+      // for the implicit initial yield in generators, where it should simply
+      // step out of the generator function.
+      if (location.IsSuspend()) {
         DCHECK(!has_suspended_generator());
-        thread_local_.suspended_generator_ =
-            location.GetGeneratorObjectForSuspendedFrame(frame);
         ClearStepping();
+        if (!IsGeneratorFunction(shared->kind()) ||
+            location.generator_suspend_id() > 0) {
+          thread_local_.suspended_generator_ =
+              location.GetGeneratorObjectForSuspendedFrame(frame);
+        } else {
+          PrepareStep(StepOut);
+        }
         return;
       }
-
       FrameSummary summary = FrameSummary::GetTop(frame);
       step_break = step_break || location.IsReturn() ||
                    current_frame_count != last_frame_count ||
@@ -1220,9 +1227,7 @@ void Debug::PrepareStep(StepAction step_action) {
     // Any step at a return is a step-out, and a step-out at a suspend behaves
     // like a return.
     if (location.IsReturn() ||
-        (location.IsSuspend() &&
-         (step_action == StepOut || (IsGeneratorFunction(shared->kind()) &&
-                                     location.generator_suspend_id() == 0)))) {
+        (location.IsSuspend() && step_action == StepOut)) {
       // On StepOut we'll ignore our further calls to current function in
       // PrepareStepIn callback.
       if (last_step_action() == StepOut) {
@@ -1637,23 +1642,18 @@ void Debug::InstallDebugBreakTrampoline() {
 }
 
 namespace {
-template <typename Iterator>
-void GetBreakablePositions(Iterator* it, int start_position, int end_position,
-                           std::vector<BreakLocation>* locations) {
-  while (!it->Done()) {
-    if (it->position() >= start_position && it->position() < end_position) {
-      locations->push_back(it->GetBreakLocation());
-    }
-    it->Next();
-  }
-}
-
 void FindBreakablePositions(Handle<DebugInfo> debug_info, int start_position,
                             int end_position,
                             std::vector<BreakLocation>* locations) {
   DCHECK(debug_info->HasInstrumentedBytecodeArray());
   BreakIterator it(debug_info);
-  GetBreakablePositions(&it, start_position, end_position, locations);
+  while (!it.Done()) {
+    if (it.GetDebugBreakType() != DEBUG_BREAK_SLOT_AT_SUSPEND &&
+        it.position() >= start_position && it.position() < end_position) {
+      locations->push_back(it.GetBreakLocation());
+    }
+    it.Next();
+  }
 }
 
 bool CompileTopLevel(Isolate* isolate, Handle<Script> script) {
@@ -2573,7 +2573,7 @@ void Debug::HandleDebugBreak(IgnoreBreakMode ignore_break_mode,
 
 #ifdef DEBUG
 void Debug::PrintBreakLocation() {
-  if (!FLAG_print_break_location) return;
+  if (!v8_flags.print_break_location) return;
   RCS_SCOPE(isolate_, RuntimeCallCounterId::kDebugger);
   HandleScope scope(isolate_);
   StackTraceFrameIterator iterator(isolate_);
@@ -2783,7 +2783,7 @@ bool Debug::PerformSideEffectCheck(Handle<JSFunction> function,
       debug_info->GetSideEffectState(isolate_);
   switch (side_effect_state) {
     case DebugInfo::kHasSideEffects:
-      if (FLAG_trace_side_effect_free_debug_evaluate) {
+      if (v8_flags.trace_side_effect_free_debug_evaluate) {
         PrintF("[debug-evaluate] Function %s failed side effect check.\n",
                function->shared().DebugNameCStr().get());
       }
@@ -2846,7 +2846,7 @@ bool Debug::PerformSideEffectCheckForCallback(
         case SideEffectType::kHasSideEffect:
           break;
       }
-      if (FLAG_trace_side_effect_free_debug_evaluate) {
+      if (v8_flags.trace_side_effect_free_debug_evaluate) {
         PrintF("[debug-evaluate] API Callback '");
         info.name().ShortPrint();
         PrintF("' may cause side effect.\n");
@@ -2854,13 +2854,13 @@ bool Debug::PerformSideEffectCheckForCallback(
     } else if (callback_info->IsInterceptorInfo()) {
       InterceptorInfo info = InterceptorInfo::cast(*callback_info);
       if (info.has_no_side_effect()) return true;
-      if (FLAG_trace_side_effect_free_debug_evaluate) {
+      if (v8_flags.trace_side_effect_free_debug_evaluate) {
         PrintF("[debug-evaluate] API Interceptor may cause side effect.\n");
       }
     } else if (callback_info->IsCallHandlerInfo()) {
       CallHandlerInfo info = CallHandlerInfo::cast(*callback_info);
       if (info.IsSideEffectFreeCallHandlerInfo()) return true;
-      if (FLAG_trace_side_effect_free_debug_evaluate) {
+      if (v8_flags.trace_side_effect_free_debug_evaluate) {
         PrintF("[debug-evaluate] API CallHandlerInfo may cause side effect.\n");
       }
     }
@@ -2922,7 +2922,7 @@ bool Debug::PerformSideEffectCheckForObject(Handle<Object> object) {
     return true;
   }
 
-  if (FLAG_trace_side_effect_free_debug_evaluate) {
+  if (v8_flags.trace_side_effect_free_debug_evaluate) {
     PrintF("[debug-evaluate] failed runtime side effect check.\n");
   }
   side_effect_check_failed_ = true;
diff --git a/deps/v8/src/debug/debug.h b/deps/v8/src/debug/debug.h
index 24a107dd936e69..3c28d0d1aab171 100644
--- a/deps/v8/src/debug/debug.h
+++ b/deps/v8/src/debug/debug.h
@@ -148,13 +148,13 @@ class V8_EXPORT_PRIVATE BreakIterator {
   void ClearDebugBreak();
   void SetDebugBreak();
 
+  DebugBreakType GetDebugBreakType();
+
  private:
   int BreakIndexFromPosition(int position);
 
   Isolate* isolate();
 
-  DebugBreakType GetDebugBreakType();
-
   Handle<DebugInfo> debug_info_;
   int break_index_;
   int position_;
diff --git a/deps/v8/src/debug/interface-types.h b/deps/v8/src/debug/interface-types.h
index 0321a4d9c6457c..71bf7fd187e2cb 100644
--- a/deps/v8/src/debug/interface-types.h
+++ b/deps/v8/src/debug/interface-types.h
@@ -78,11 +78,6 @@ enum class CoverageMode {
   kBlockBinary,
 };
 
-enum class TypeProfileMode {
-  kNone,
-  kCollect,
-};
-
 class V8_EXPORT_PRIVATE BreakLocation : public Location {
  public:
   BreakLocation(int line_number, int column_number, BreakLocationType type)
diff --git a/deps/v8/src/debug/liveedit-diff.cc b/deps/v8/src/debug/liveedit-diff.cc
index 613561590365de..ff2f8aa88a9a9c 100644
--- a/deps/v8/src/debug/liveedit-diff.cc
+++ b/deps/v8/src/debug/liveedit-diff.cc
@@ -10,216 +10,12 @@
 
 #include "src/base/logging.h"
 #include "src/base/optional.h"
-#include "src/common/globals.h"
 
 namespace v8 {
 namespace internal {
 
 namespace {
 
-// A simple implementation of dynamic programming algorithm. It solves
-// the problem of finding the difference of 2 arrays. It uses a table of results
-// of subproblems. Each cell contains a number together with 2-bit flag
-// that helps building the chunk list.
-class Differencer {
- public:
-  explicit Differencer(Comparator::Input* input)
-      : input_(input), len1_(input->GetLength1()), len2_(input->GetLength2()) {}
-
-  void Initialize() {}
-
-  // Makes sure that result for the full problem is calculated and stored
-  // in the table together with flags showing a path through subproblems.
-  void FillTable() {
-    // Determine common prefix to skip.
-    int minLen = std::min(len1_, len2_);
-    while (prefixLen_ < minLen && input_->Equals(prefixLen_, prefixLen_)) {
-      ++prefixLen_;
-    }
-
-    // Pre-fill common suffix in the table.
-    for (int pos1 = len1_, pos2 = len2_; pos1 > prefixLen_ &&
-                                         pos2 > prefixLen_ &&
-                                         input_->Equals(--pos1, --pos2);) {
-      set_value4_and_dir(pos1, pos2, 0, EQ);
-    }
-
-    CompareUpToTail(prefixLen_, prefixLen_);
-  }
-
-  void SaveResult(Comparator::Output* chunk_writer) {
-    ResultWriter writer(chunk_writer);
-
-    if (prefixLen_) writer.eq(prefixLen_);
-    for (int pos1 = prefixLen_, pos2 = prefixLen_; true;) {
-      if (pos1 < len1_) {
-        if (pos2 < len2_) {
-          Direction dir = get_direction(pos1, pos2);
-          switch (dir) {
-            case EQ:
-              writer.eq();
-              pos1++;
-              pos2++;
-              break;
-            case SKIP1:
-              writer.skip1(1);
-              pos1++;
-              break;
-            case SKIP2:
-            case SKIP_ANY:
-              writer.skip2(1);
-              pos2++;
-              break;
-            default:
-              UNREACHABLE();
-          }
-        } else {
-          writer.skip1(len1_ - pos1);
-          break;
-        }
-      } else {
-        if (len2_ != pos2) {
-          writer.skip2(len2_ - pos2);
-        }
-        break;
-      }
-    }
-    writer.close();
-  }
-
- private:
-  Comparator::Input* input_;
-  std::map<std::pair<int, int>, int> buffer_;
-  int len1_;
-  int len2_;
-  int prefixLen_ = 0;
-
-  enum Direction {
-    EQ = 0,
-    SKIP1,
-    SKIP2,
-    SKIP_ANY,
-
-    MAX_DIRECTION_FLAG_VALUE = SKIP_ANY
-  };
-
-  // Computes result for a subtask and optionally caches it in the buffer table.
-  // All results values are shifted to make space for flags in the lower bits.
-  int CompareUpToTail(int pos1, int pos2) {
-    if (pos1 == len1_) {
-      return (len2_ - pos2) << kDirectionSizeBits;
-    }
-    if (pos2 == len2_) {
-      return (len1_ - pos1) << kDirectionSizeBits;
-    }
-    int res = get_value4(pos1, pos2);
-    if (res != kEmptyCellValue) {
-      return res;
-    }
-    Direction dir;
-    if (input_->Equals(pos1, pos2)) {
-      res = CompareUpToTail(pos1 + 1, pos2 + 1);
-      dir = EQ;
-    } else {
-      int res1 = CompareUpToTail(pos1 + 1, pos2) + (1 << kDirectionSizeBits);
-      int res2 = CompareUpToTail(pos1, pos2 + 1) + (1 << kDirectionSizeBits);
-      if (res1 == res2) {
-        res = res1;
-        dir = SKIP_ANY;
-      } else if (res1 < res2) {
-        res = res1;
-        dir = SKIP1;
-      } else {
-        res = res2;
-        dir = SKIP2;
-      }
-    }
-    set_value4_and_dir(pos1, pos2, res, dir);
-    return res;
-  }
-
-  inline int get_cell(int i1, int i2) {
-    auto it = buffer_.find(std::make_pair(i1, i2));
-    return it == buffer_.end() ? kEmptyCellValue : it->second;
-  }
-
-  inline void set_cell(int i1, int i2, int value) {
-    buffer_.insert(std::make_pair(std::make_pair(i1, i2), value));
-  }
-
-  // Each cell keeps a value plus direction. Value is multiplied by 4.
-  void set_value4_and_dir(int i1, int i2, int value4, Direction dir) {
-    DCHECK_EQ(0, value4 & kDirectionMask);
-    set_cell(i1, i2, value4 | dir);
-  }
-
-  int get_value4(int i1, int i2) {
-    return get_cell(i1, i2) & (kMaxUInt32 ^ kDirectionMask);
-  }
-  Direction get_direction(int i1, int i2) {
-    return static_cast<Direction>(get_cell(i1, i2) & kDirectionMask);
-  }
-
-  static const int kDirectionSizeBits = 2;
-  static const int kDirectionMask = (1 << kDirectionSizeBits) - 1;
-  static const int kEmptyCellValue = ~0u << kDirectionSizeBits;
-
-  // This method only holds static assert statement (unfortunately you cannot
-  // place one in class scope).
-  void StaticAssertHolder() {
-    static_assert(MAX_DIRECTION_FLAG_VALUE < (1 << kDirectionSizeBits));
-  }
-
-  class ResultWriter {
-   public:
-    explicit ResultWriter(Comparator::Output* chunk_writer)
-        : chunk_writer_(chunk_writer),
-          pos1_(0),
-          pos2_(0),
-          pos1_begin_(-1),
-          pos2_begin_(-1),
-          has_open_chunk_(false) {}
-    void eq(int len = 1) {
-      FlushChunk();
-      pos1_ += len;
-      pos2_ += len;
-    }
-    void skip1(int len1) {
-      StartChunk();
-      pos1_ += len1;
-    }
-    void skip2(int len2) {
-      StartChunk();
-      pos2_ += len2;
-    }
-    void close() { FlushChunk(); }
-
-   private:
-    Comparator::Output* chunk_writer_;
-    int pos1_;
-    int pos2_;
-    int pos1_begin_;
-    int pos2_begin_;
-    bool has_open_chunk_;
-
-    void StartChunk() {
-      if (!has_open_chunk_) {
-        pos1_begin_ = pos1_;
-        pos2_begin_ = pos2_;
-        has_open_chunk_ = true;
-      }
-    }
-
-    void FlushChunk() {
-      if (has_open_chunk_) {
-        chunk_writer_->AddChunk(pos1_begin_, pos2_begin_, pos1_ - pos1_begin_,
-                                pos2_ - pos2_begin_);
-        has_open_chunk_ = false;
-      }
-    }
-  };
-};
-
 // Implements Myer's Algorithm from
 // "An O(ND) Difference Algorithm and Its Variations", particularly the
 // linear space refinement mentioned in section 4b.
@@ -608,17 +404,8 @@ class MyersDiffer {
 }  // namespace
 
 void Comparator::CalculateDifference(Comparator::Input* input,
-                                     Comparator::Output* result_writer,
-                                     Comparator::CompareMethod method) {
-  if (method == CompareMethod::kDynamicProgramming) {
-    Differencer differencer(input);
-    differencer.Initialize();
-    differencer.FillTable();
-    differencer.SaveResult(result_writer);
-  } else {
-    CHECK_EQ(method, CompareMethod::kMyers);
-    MyersDiffer::MyersDiff(input, result_writer);
-  }
+                                     Comparator::Output* result_writer) {
+  MyersDiffer::MyersDiff(input, result_writer);
 }
 
 }  // namespace internal
diff --git a/deps/v8/src/debug/liveedit-diff.h b/deps/v8/src/debug/liveedit-diff.h
index 9649b19cdb8835..15bedc3eacfb4d 100644
--- a/deps/v8/src/debug/liveedit-diff.h
+++ b/deps/v8/src/debug/liveedit-diff.h
@@ -34,14 +34,8 @@ class Comparator {
     virtual ~Output() = default;
   };
 
-  enum class CompareMethod {
-    kDynamicProgramming,
-    kMyers,
-  };
-
   // Finds the difference between 2 arrays of elements.
-  static void CalculateDifference(Input* input, Output* result_writer,
-                                  CompareMethod = CompareMethod::kMyers);
+  static void CalculateDifference(Input* input, Output* result_writer);
 };
 
 }  // namespace internal
diff --git a/deps/v8/src/debug/liveedit.cc b/deps/v8/src/debug/liveedit.cc
index b086908c9e7196..ebcf80b37fdf58 100644
--- a/deps/v8/src/debug/liveedit.cc
+++ b/deps/v8/src/debug/liveedit.cc
@@ -511,17 +511,20 @@ class CollectFunctionLiterals final
 };
 
 bool ParseScript(Isolate* isolate, Handle<Script> script, ParseInfo* parse_info,
-                 bool compile_as_well, std::vector<FunctionLiteral*>* literals,
+                 MaybeHandle<ScopeInfo> outer_scope_info, bool compile_as_well,
+                 std::vector<FunctionLiteral*>* literals,
                  debug::LiveEditResult* result) {
   v8::TryCatch try_catch(reinterpret_cast<v8::Isolate*>(isolate));
   Handle<SharedFunctionInfo> shared;
   bool success = false;
   if (compile_as_well) {
-    success = Compiler::CompileForLiveEdit(parse_info, script, isolate)
+    success = Compiler::CompileForLiveEdit(parse_info, script, outer_scope_info,
+                                           isolate)
                   .ToHandle(&shared);
   } else {
-    success = parsing::ParseProgram(parse_info, script, isolate,
-                                    parsing::ReportStatisticsMode::kYes);
+    success =
+        parsing::ParseProgram(parse_info, script, outer_scope_info, isolate,
+                              parsing::ReportStatisticsMode::kYes);
     if (!success) {
       // Throw the parser error.
       parse_info->pending_error_handler()->PrepareErrors(
@@ -740,21 +743,80 @@ void TranslateSourcePositionTable(Isolate* isolate, Handle<BytecodeArray> code,
 }
 
 void UpdatePositions(Isolate* isolate, Handle<SharedFunctionInfo> sfi,
+                     FunctionLiteral* new_function,
                      const std::vector<SourceChangeRange>& diffs) {
-  int old_start_position = sfi->StartPosition();
-  int new_start_position =
-      LiveEdit::TranslatePosition(diffs, old_start_position);
-  int new_end_position = LiveEdit::TranslatePosition(diffs, sfi->EndPosition());
-  int new_function_token_position =
-      LiveEdit::TranslatePosition(diffs, sfi->function_token_position());
-  sfi->SetPosition(new_start_position, new_end_position);
-  sfi->SetFunctionTokenPosition(new_function_token_position,
-                                new_start_position);
+  sfi->UpdateFromFunctionLiteralForLiveEdit(new_function);
   if (sfi->HasBytecodeArray()) {
     TranslateSourcePositionTable(
         isolate, handle(sfi->GetBytecodeArray(isolate), isolate), diffs);
   }
 }
+
+#ifdef DEBUG
+ScopeInfo FindOuterScopeInfoFromScriptSfi(Isolate* isolate,
+                                          Handle<Script> script) {
+  // We take some SFI from the script and walk outwards until we find the
+  // EVAL_SCOPE. Then we do the same search as `DetermineOuterScopeInfo` and
+  // check that we found the same ScopeInfo.
+  SharedFunctionInfo::ScriptIterator it(isolate, *script);
+  ScopeInfo other_scope_info;
+  for (SharedFunctionInfo sfi = it.Next(); !sfi.is_null(); sfi = it.Next()) {
+    if (!sfi.scope_info().IsEmpty()) {
+      other_scope_info = sfi.scope_info();
+      break;
+    }
+  }
+  if (other_scope_info.is_null()) return other_scope_info;
+
+  while (!other_scope_info.IsEmpty() &&
+         other_scope_info.scope_type() != EVAL_SCOPE &&
+         other_scope_info.HasOuterScopeInfo()) {
+    other_scope_info = other_scope_info.OuterScopeInfo();
+  }
+
+  // This function is only called when we found a ScopeInfo candidate, so
+  // technically the EVAL_SCOPE must have an outer_scope_info. But, the GC can
+  // clean up some ScopeInfos it thinks are no longer needed. Abort the check
+  // in that case.
+  if (!other_scope_info.HasOuterScopeInfo()) return ScopeInfo();
+
+  DCHECK_EQ(other_scope_info.scope_type(), EVAL_SCOPE);
+  other_scope_info = other_scope_info.OuterScopeInfo();
+
+  while (!other_scope_info.IsEmpty() && !other_scope_info.HasContext() &&
+         other_scope_info.HasOuterScopeInfo()) {
+    other_scope_info = other_scope_info.OuterScopeInfo();
+  }
+  return other_scope_info;
+}
+#endif
+
+// For sloppy eval we need to know the ScopeInfo the eval was compiled in and
+// re-use it when we compile the new version of the script.
+MaybeHandle<ScopeInfo> DetermineOuterScopeInfo(Isolate* isolate,
+                                               Handle<Script> script) {
+  if (!script->has_eval_from_shared()) return kNullMaybeHandle;
+  DCHECK_EQ(script->compilation_type(), Script::COMPILATION_TYPE_EVAL);
+  ScopeInfo scope_info = script->eval_from_shared().scope_info();
+  // Sloppy eval compiles use the ScopeInfo of the context. Let's find it.
+  while (!scope_info.IsEmpty()) {
+    if (scope_info.HasContext()) {
+#ifdef DEBUG
+      ScopeInfo other_scope_info =
+          FindOuterScopeInfoFromScriptSfi(isolate, script);
+      DCHECK_IMPLIES(!other_scope_info.is_null(),
+                     scope_info == other_scope_info);
+#endif
+      return handle(scope_info, isolate);
+    } else if (!scope_info.HasOuterScopeInfo()) {
+      break;
+    }
+    scope_info = scope_info.OuterScopeInfo();
+  }
+
+  return kNullMaybeHandle;
+}
+
 }  // anonymous namespace
 
 void LiveEdit::PatchScript(Isolate* isolate, Handle<Script> script,
@@ -778,8 +840,11 @@ void LiveEdit::PatchScript(Isolate* isolate, Handle<Script> script,
   flags.set_is_eager(true);
   flags.set_is_reparse(true);
   ParseInfo parse_info(isolate, flags, &compile_state, &reusable_state);
+  MaybeHandle<ScopeInfo> outer_scope_info =
+      DetermineOuterScopeInfo(isolate, script);
   std::vector<FunctionLiteral*> literals;
-  if (!ParseScript(isolate, script, &parse_info, false, &literals, result))
+  if (!ParseScript(isolate, script, &parse_info, outer_scope_info, false,
+                   &literals, result))
     return;
 
   Handle<Script> new_script = isolate->factory()->CloneScript(script);
@@ -791,8 +856,8 @@ void LiveEdit::PatchScript(Isolate* isolate, Handle<Script> script,
   ParseInfo new_parse_info(isolate, new_flags, &new_compile_state,
                            &reusable_state);
   std::vector<FunctionLiteral*> new_literals;
-  if (!ParseScript(isolate, new_script, &new_parse_info, true, &new_literals,
-                   result)) {
+  if (!ParseScript(isolate, new_script, &new_parse_info, outer_scope_info, true,
+                   &new_literals, result)) {
     return;
   }
 
@@ -814,7 +879,7 @@ void LiveEdit::PatchScript(Isolate* isolate, Handle<Script> script,
   function_data_map.Fill(isolate);
 
   const bool allow_top_frame_live_editing =
-      allow_top_frame_live_editing_param && FLAG_live_edit_top_frame;
+      allow_top_frame_live_editing_param && v8_flags.live_edit_top_frame;
   if (!CanPatchScript(changed, script, new_script, function_data_map,
                       allow_top_frame_live_editing, result)) {
     return;
@@ -847,7 +912,7 @@ void LiveEdit::PatchScript(Isolate* isolate, Handle<Script> script,
       isolate->debug()->RemoveBreakInfoAndMaybeFree(debug_info);
     }
     SharedFunctionInfo::EnsureSourcePositionsAvailable(isolate, sfi);
-    UpdatePositions(isolate, sfi, diffs);
+    UpdatePositions(isolate, sfi, mapping.second, diffs);
 
     sfi->set_script(*new_script);
     sfi->set_function_literal_id(mapping.second->function_literal_id());
diff --git a/deps/v8/src/debug/wasm/gdb-server/gdb-remote-util.h b/deps/v8/src/debug/wasm/gdb-server/gdb-remote-util.h
index d02e0eaae3ac00..a4c8828e1e287c 100644
--- a/deps/v8/src/debug/wasm/gdb-server/gdb-remote-util.h
+++ b/deps/v8/src/debug/wasm/gdb-server/gdb-remote-util.h
@@ -15,9 +15,9 @@ namespace internal {
 namespace wasm {
 namespace gdb_server {
 
-#define TRACE_GDB_REMOTE(...)                                            \
-  do {                                                                   \
-    if (FLAG_trace_wasm_gdb_remote) PrintF("[gdb-remote] " __VA_ARGS__); \
+#define TRACE_GDB_REMOTE(...)                                                \
+  do {                                                                       \
+    if (v8_flags.trace_wasm_gdb_remote) PrintF("[gdb-remote] " __VA_ARGS__); \
   } while (false)
 
 // Convert from 0-255 to a pair of ASCII chars (0-9,a-f).
diff --git a/deps/v8/src/debug/wasm/gdb-server/gdb-server-thread.cc b/deps/v8/src/debug/wasm/gdb-server/gdb-server-thread.cc
index d3c7887a5b9a5e..b681aedc573460 100644
--- a/deps/v8/src/debug/wasm/gdb-server/gdb-server-thread.cc
+++ b/deps/v8/src/debug/wasm/gdb-server/gdb-server-thread.cc
@@ -62,7 +62,8 @@ void GdbServerThread::Run() {
 #endif
 
   // If the default port is not available, try any port.
-  SocketBinding socket_binding = SocketBinding::Bind(FLAG_wasm_gdb_remote_port);
+  SocketBinding socket_binding =
+      SocketBinding::Bind(v8_flags.wasm_gdb_remote_port);
   if (!socket_binding.IsValid()) {
     socket_binding = SocketBinding::Bind(0);
   }
diff --git a/deps/v8/src/debug/wasm/gdb-server/gdb-server.cc b/deps/v8/src/debug/wasm/gdb-server/gdb-server.cc
index b6cb5a98d20e4a..f3f891c30b76b7 100644
--- a/deps/v8/src/debug/wasm/gdb-server/gdb-server.cc
+++ b/deps/v8/src/debug/wasm/gdb-server/gdb-server.cc
@@ -119,7 +119,7 @@ auto GdbServer::RunSyncTask(Functor&& callback) const {
 
 // static
 std::unique_ptr<GdbServer> GdbServer::Create() {
-  DCHECK(FLAG_wasm_gdb_remote);
+  DCHECK(v8_flags.wasm_gdb_remote);
 
   std::unique_ptr<GdbServer> gdb_server(new GdbServer());
 
@@ -377,7 +377,7 @@ void GdbServer::AddWasmModule(uint32_t module_id,
       std::make_pair(module_id, WasmModuleDebug(isolate, wasm_script)));
   has_module_list_changed_ = true;
 
-  if (FLAG_wasm_pause_waiting_for_debugger && scripts_.size() == 1) {
+  if (v8_flags.wasm_pause_waiting_for_debugger && scripts_.size() == 1) {
     TRACE_GDB_REMOTE("Paused, waiting for a debugger to attach...\n");
     Suspend();
   }
diff --git a/deps/v8/src/deoptimizer/deoptimizer.cc b/deps/v8/src/deoptimizer/deoptimizer.cc
index f1379f90ee5f0d..9479740884d0b1 100644
--- a/deps/v8/src/deoptimizer/deoptimizer.cc
+++ b/deps/v8/src/deoptimizer/deoptimizer.cc
@@ -494,7 +494,7 @@ Deoptimizer::Deoptimizer(Isolate* isolate, JSFunction function,
       caller_constant_pool_(0),
       actual_argument_count_(0),
       stack_fp_(0),
-      trace_scope_(FLAG_trace_deopt || FLAG_log_deopt
+      trace_scope_(v8_flags.trace_deopt || v8_flags.log_deopt
                        ? new CodeTracer::Scope(isolate->GetCodeTracer())
                        : nullptr) {
   if (isolate->deoptimizer_lazy_throw()) {
@@ -678,9 +678,9 @@ void Deoptimizer::TraceDeoptBegin(int optimization_id,
          MessageFor(deopt_kind_), DeoptimizeReasonToString(info.deopt_reason));
   if (function_.IsJSFunction()) {
     function_.ShortPrint(file);
-  } else {
-    PrintF(file, "%s", CodeKindToString(compiled_code_.kind()));
+    PrintF(file, ", ");
   }
+  compiled_code_.ShortPrint(file);
   PrintF(file,
          ", opt id %d, "
 #ifdef DEBUG
@@ -711,7 +711,7 @@ void Deoptimizer::TraceDeoptEnd(double deopt_duration) {
 
 // static
 void Deoptimizer::TraceMarkForDeoptimization(Code code, const char* reason) {
-  if (!FLAG_trace_deopt && !FLAG_log_deopt) return;
+  if (!v8_flags.trace_deopt && !v8_flags.log_deopt) return;
 
   DisallowGarbageCollection no_gc;
   Isolate* isolate = code.GetIsolate();
@@ -720,14 +720,15 @@ void Deoptimizer::TraceMarkForDeoptimization(Code code, const char* reason) {
 
   DeoptimizationData deopt_data = DeoptimizationData::cast(maybe_data);
   CodeTracer::Scope scope(isolate->GetCodeTracer());
-  if (FLAG_trace_deopt) {
-    PrintF(scope.file(), "[marking dependent code " V8PRIxPTR_FMT " (",
-           code.ptr());
+  if (v8_flags.trace_deopt) {
+    PrintF(scope.file(), "[marking dependent code ");
+    code.ShortPrint(scope.file());
+    PrintF(scope.file(), " (");
     deopt_data.SharedFunctionInfo().ShortPrint(scope.file());
     PrintF(") (opt id %d) for deoptimization, reason: %s]\n",
            deopt_data.OptimizationId().value(), reason);
   }
-  if (!FLAG_log_deopt) return;
+  if (!v8_flags.log_deopt) return;
   no_gc.Release();
   {
     HandleScope handle_scope(isolate);
@@ -744,7 +745,7 @@ void Deoptimizer::TraceMarkForDeoptimization(Code code, const char* reason) {
 // static
 void Deoptimizer::TraceEvictFromOptimizedCodeCache(SharedFunctionInfo sfi,
                                                    const char* reason) {
-  if (!FLAG_trace_deopt_verbose) return;
+  if (!v8_flags.trace_deopt_verbose) return;
 
   DisallowGarbageCollection no_gc;
   CodeTracer::Scope scope(sfi.GetIsolate()->GetCodeTracer());
@@ -758,7 +759,7 @@ void Deoptimizer::TraceEvictFromOptimizedCodeCache(SharedFunctionInfo sfi,
 #ifdef DEBUG
 // static
 void Deoptimizer::TraceFoundActivation(Isolate* isolate, JSFunction function) {
-  if (!FLAG_trace_deopt_verbose) return;
+  if (!v8_flags.trace_deopt_verbose) return;
   CodeTracer::Scope scope(isolate->GetCodeTracer());
   PrintF(scope.file(), "[deoptimizer found activation of function: ");
   function.PrintName(scope.file());
@@ -768,14 +769,14 @@ void Deoptimizer::TraceFoundActivation(Isolate* isolate, JSFunction function) {
 
 // static
 void Deoptimizer::TraceDeoptAll(Isolate* isolate) {
-  if (!FLAG_trace_deopt_verbose) return;
+  if (!v8_flags.trace_deopt_verbose) return;
   CodeTracer::Scope scope(isolate->GetCodeTracer());
   PrintF(scope.file(), "[deoptimize all code in all contexts]\n");
 }
 
 // static
 void Deoptimizer::TraceDeoptMarked(Isolate* isolate) {
-  if (!FLAG_trace_deopt_verbose) return;
+  if (!v8_flags.trace_deopt_verbose) return;
   CodeTracer::Scope scope(isolate->GetCodeTracer());
   PrintF(scope.file(), "[deoptimize marked code in all contexts]\n");
 }
@@ -812,7 +813,7 @@ void Deoptimizer::DoComputeOutputFrames() {
     actual_argument_count_ = static_cast<int>(
         Memory<intptr_t>(fp_address + StandardFrameConstants::kArgCOffset));
 
-    if (FLAG_enable_embedded_constant_pool) {
+    if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
       caller_constant_pool_ = Memory<intptr_t>(
           fp_address + CommonFrameConstants::kConstantPoolOffset);
     }
@@ -1018,7 +1019,7 @@ void Deoptimizer::DoComputeUnoptimizedFrame(TranslatedFrame* translated_frame,
       (!is_topmost || (deopt_kind_ == DeoptimizeKind::kLazy)) &&
       !goto_catch_handler;
   const bool deopt_to_baseline =
-      shared.HasBaselineCode() && FLAG_deopt_to_baseline;
+      shared.HasBaselineCode() && v8_flags.deopt_to_baseline;
   const bool restart_frame = goto_catch_handler && is_restart_frame();
   CodeT dispatch_builtin = builtins->code(
       DispatchBuiltinFor(deopt_to_baseline, advance_bc, restart_frame));
@@ -1094,7 +1095,7 @@ void Deoptimizer::DoComputeUnoptimizedFrame(TranslatedFrame* translated_frame,
     output_frame->SetRegister(fp_reg.code(), fp_value);
   }
 
-  if (FLAG_enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     // For the bottommost output frame the constant pool pointer can be gotten
     // from the input frame. For subsequent output frames, it can be read from
     // the previous frame.
@@ -1242,7 +1243,7 @@ void Deoptimizer::DoComputeUnoptimizedFrame(TranslatedFrame* translated_frame,
   }
 
   // Update constant pool.
-  if (FLAG_enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     intptr_t constant_pool_value =
         static_cast<intptr_t>(dispatch_builtin.constant_pool());
     output_frame->SetConstantPool(constant_pool_value);
@@ -1407,7 +1408,7 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame,
     output_frame->SetRegister(fp_reg.code(), fp_value);
   }
 
-  if (FLAG_enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     // Read the caller's constant pool from the previous frame.
     const intptr_t caller_cp = output_[frame_index - 1]->GetConstantPool();
     frame_writer.PushCallerConstantPool(caller_cp);
@@ -1472,7 +1473,7 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame,
   }
 
   // Update constant pool.
-  if (FLAG_enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     intptr_t constant_pool_value =
         static_cast<intptr_t>(construct_stub.constant_pool());
     output_frame->SetConstantPool(constant_pool_value);
@@ -1821,7 +1822,7 @@ void Deoptimizer::DoComputeBuiltinContinuation(
 
   DCHECK_EQ(output_frame_size_above_fp, frame_writer.top_offset());
 
-  if (FLAG_enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     // Read the caller's constant pool from the previous frame.
     const intptr_t caller_cp =
         is_bottommost ? caller_constant_pool_
@@ -1943,7 +1944,7 @@ void Deoptimizer::DoComputeBuiltinContinuation(
 
 void Deoptimizer::MaterializeHeapObjects() {
   translated_state_.Prepare(static_cast<Address>(stack_fp_));
-  if (FLAG_deopt_every_n_times > 0) {
+  if (v8_flags.deopt_every_n_times > 0) {
     // Doing a GC here will find problems with the deoptimized frames.
     isolate_->heap()->CollectAllGarbage(Heap::kNoGCFlags,
                                         GarbageCollectionReason::kTesting);
diff --git a/deps/v8/src/deoptimizer/deoptimizer.h b/deps/v8/src/deoptimizer/deoptimizer.h
index ab15919301e7f3..1de0a4e6e75d4b 100644
--- a/deps/v8/src/deoptimizer/deoptimizer.h
+++ b/deps/v8/src/deoptimizer/deoptimizer.h
@@ -184,11 +184,11 @@ class Deoptimizer : public Malloced {
   // Tracing.
   bool tracing_enabled() const { return trace_scope_ != nullptr; }
   bool verbose_tracing_enabled() const {
-    return FLAG_trace_deopt_verbose && tracing_enabled();
+    return v8_flags.trace_deopt_verbose && tracing_enabled();
   }
   CodeTracer::Scope* trace_scope() const { return trace_scope_; }
   CodeTracer::Scope* verbose_trace_scope() const {
-    return FLAG_trace_deopt_verbose ? trace_scope() : nullptr;
+    return v8_flags.trace_deopt_verbose ? trace_scope() : nullptr;
   }
   void TraceDeoptBegin(int optimization_id, BytecodeOffset bytecode_offset);
   void TraceDeoptEnd(double deopt_duration);
diff --git a/deps/v8/src/deoptimizer/ppc/deoptimizer-ppc.cc b/deps/v8/src/deoptimizer/ppc/deoptimizer-ppc.cc
index 63843b326182a3..c4c9bffec69565 100644
--- a/deps/v8/src/deoptimizer/ppc/deoptimizer-ppc.cc
+++ b/deps/v8/src/deoptimizer/ppc/deoptimizer-ppc.cc
@@ -35,7 +35,7 @@ void FrameDescription::SetCallerFp(unsigned offset, intptr_t value) {
 }
 
 void FrameDescription::SetCallerConstantPool(unsigned offset, intptr_t value) {
-  DCHECK(FLAG_enable_embedded_constant_pool);
+  DCHECK(V8_EMBEDDED_CONSTANT_POOL_BOOL);
   SetFrameSlot(offset, value);
 }
 
diff --git a/deps/v8/src/deoptimizer/translated-state.cc b/deps/v8/src/deoptimizer/translated-state.cc
index 511d4ba8ca150d..2bd0f2394ebb82 100644
--- a/deps/v8/src/deoptimizer/translated-state.cc
+++ b/deps/v8/src/deoptimizer/translated-state.cc
@@ -145,6 +145,22 @@ void TranslationArrayPrintSingleFrame(
         break;
       }
 
+      case TranslationOpcode::SIGNED_BIGINT64_REGISTER: {
+        DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
+        int reg_code = iterator.NextUnsigned();
+        os << "{input=" << converter.NameOfCPURegister(reg_code)
+           << " (signed bigint64)}";
+        break;
+      }
+
+      case TranslationOpcode::UNSIGNED_BIGINT64_REGISTER: {
+        DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
+        int reg_code = iterator.NextUnsigned();
+        os << "{input=" << converter.NameOfCPURegister(reg_code)
+           << " (unsigned bigint64)}";
+        break;
+      }
+
       case TranslationOpcode::UINT32_REGISTER: {
         DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
         int reg_code = iterator.NextUnsigned();
@@ -195,6 +211,20 @@ void TranslationArrayPrintSingleFrame(
         break;
       }
 
+      case TranslationOpcode::SIGNED_BIGINT64_STACK_SLOT: {
+        DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
+        int input_slot_index = iterator.Next();
+        os << "{input=" << input_slot_index << " (signed bigint64)}";
+        break;
+      }
+
+      case TranslationOpcode::UNSIGNED_BIGINT64_STACK_SLOT: {
+        DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
+        int input_slot_index = iterator.Next();
+        os << "{input=" << input_slot_index << " (unsigned bigint64)}";
+        break;
+      }
+
       case TranslationOpcode::UINT32_STACK_SLOT: {
         DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
         int input_slot_index = iterator.Next();
@@ -329,6 +359,14 @@ TranslatedValue TranslatedValue::NewInt64ToBigInt(TranslatedState* container,
   return slot;
 }
 
+// static
+TranslatedValue TranslatedValue::NewUint64ToBigInt(TranslatedState* container,
+                                                   uint64_t value) {
+  TranslatedValue slot(container, kUint64ToBigInt);
+  slot.uint64_value_ = value;
+  return slot;
+}
+
 // static
 TranslatedValue TranslatedValue::NewUInt32(TranslatedState* container,
                                            uint32_t value) {
@@ -375,6 +413,11 @@ int64_t TranslatedValue::int64_value() const {
   return int64_value_;
 }
 
+uint64_t TranslatedValue::uint64_value() const {
+  DCHECK(kUint64ToBigInt == kind());
+  return uint64_value_;
+}
+
 uint32_t TranslatedValue::uint32_value() const {
   DCHECK(kind() == kUInt32 || kind() == kBoolBit);
   return uint32_value_;
@@ -523,8 +566,8 @@ Handle<Object> TranslatedValue::GetValue() {
     // headers.
     // TODO(hpayer): Find a cleaner way to support a group of
     // non-fully-initialized objects.
-    isolate()->heap()->mark_compact_collector()->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+    isolate()->heap()->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
 
     // 2. Initialize the objects. If we have allocated only byte arrays
     //    for some objects, we now overwrite the byte arrays with the
@@ -547,6 +590,9 @@ Handle<Object> TranslatedValue::GetValue() {
     case TranslatedValue::kInt64ToBigInt:
       heap_object = BigInt::FromInt64(isolate(), int64_value());
       break;
+    case TranslatedValue::kUint64ToBigInt:
+      heap_object = BigInt::FromUint64(isolate(), uint64_value());
+      break;
     case TranslatedValue::kUInt32:
       number = uint32_value();
       heap_object = isolate()->factory()->NewHeapNumber(number);
@@ -562,7 +608,8 @@ Handle<Object> TranslatedValue::GetValue() {
     default:
       UNREACHABLE();
   }
-  DCHECK(!IsSmiDouble(number) || kind() == TranslatedValue::kInt64ToBigInt);
+  DCHECK(!IsSmiDouble(number) || kind() == TranslatedValue::kInt64ToBigInt ||
+         kind() == TranslatedValue::kUint64ToBigInt);
   set_initialized_storage(heap_object);
   return storage_;
 }
@@ -868,6 +915,8 @@ TranslatedFrame TranslatedState::CreateNextTranslatedFrame(
     case TranslationOpcode::REGISTER:
     case TranslationOpcode::INT32_REGISTER:
     case TranslationOpcode::INT64_REGISTER:
+    case TranslationOpcode::SIGNED_BIGINT64_REGISTER:
+    case TranslationOpcode::UNSIGNED_BIGINT64_REGISTER:
     case TranslationOpcode::UINT32_REGISTER:
     case TranslationOpcode::BOOL_REGISTER:
     case TranslationOpcode::FLOAT_REGISTER:
@@ -875,6 +924,8 @@ TranslatedFrame TranslatedState::CreateNextTranslatedFrame(
     case TranslationOpcode::STACK_SLOT:
     case TranslationOpcode::INT32_STACK_SLOT:
     case TranslationOpcode::INT64_STACK_SLOT:
+    case TranslationOpcode::SIGNED_BIGINT64_STACK_SLOT:
+    case TranslationOpcode::UNSIGNED_BIGINT64_STACK_SLOT:
     case TranslationOpcode::UINT32_STACK_SLOT:
     case TranslationOpcode::BOOL_STACK_SLOT:
     case TranslationOpcode::FLOAT_STACK_SLOT:
@@ -1089,6 +1140,42 @@ int TranslatedState::CreateNextTranslatedValue(
       return translated_value.GetChildrenCount();
     }
 
+    case TranslationOpcode::SIGNED_BIGINT64_REGISTER: {
+      int input_reg = iterator->NextUnsigned();
+      if (registers == nullptr) {
+        TranslatedValue translated_value = TranslatedValue::NewInvalid(this);
+        frame.Add(translated_value);
+        return translated_value.GetChildrenCount();
+      }
+      intptr_t value = registers->GetRegister(input_reg);
+      if (trace_file != nullptr) {
+        PrintF(trace_file, "%" V8PRIdPTR " ; %s (signed bigint64)", value,
+               converter.NameOfCPURegister(input_reg));
+      }
+      TranslatedValue translated_value =
+          TranslatedValue::NewInt64ToBigInt(this, value);
+      frame.Add(translated_value);
+      return translated_value.GetChildrenCount();
+    }
+
+    case TranslationOpcode::UNSIGNED_BIGINT64_REGISTER: {
+      int input_reg = iterator->NextUnsigned();
+      if (registers == nullptr) {
+        TranslatedValue translated_value = TranslatedValue::NewInvalid(this);
+        frame.Add(translated_value);
+        return translated_value.GetChildrenCount();
+      }
+      intptr_t value = registers->GetRegister(input_reg);
+      if (trace_file != nullptr) {
+        PrintF(trace_file, "%" V8PRIdPTR " ; %s (unsigned bigint64)", value,
+               converter.NameOfCPURegister(input_reg));
+      }
+      TranslatedValue translated_value =
+          TranslatedValue::NewUint64ToBigInt(this, value);
+      frame.Add(translated_value);
+      return translated_value.GetChildrenCount();
+    }
+
     case TranslationOpcode::UINT32_REGISTER: {
       int input_reg = iterator->NextUnsigned();
       if (registers == nullptr) {
@@ -1205,6 +1292,36 @@ int TranslatedState::CreateNextTranslatedValue(
       return translated_value.GetChildrenCount();
     }
 
+    case TranslationOpcode::SIGNED_BIGINT64_STACK_SLOT: {
+      int slot_offset =
+          OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next());
+      uint64_t value = GetUInt64Slot(fp, slot_offset);
+      if (trace_file != nullptr) {
+        PrintF(trace_file, "%" V8PRIdPTR " ; (signed bigint64) [fp %c %3d] ",
+               static_cast<intptr_t>(value), slot_offset < 0 ? '-' : '+',
+               std::abs(slot_offset));
+      }
+      TranslatedValue translated_value =
+          TranslatedValue::NewInt64ToBigInt(this, value);
+      frame.Add(translated_value);
+      return translated_value.GetChildrenCount();
+    }
+
+    case TranslationOpcode::UNSIGNED_BIGINT64_STACK_SLOT: {
+      int slot_offset =
+          OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next());
+      uint64_t value = GetUInt64Slot(fp, slot_offset);
+      if (trace_file != nullptr) {
+        PrintF(trace_file, "%" V8PRIdPTR " ; (unsigned bigint64) [fp %c %3d] ",
+               static_cast<intptr_t>(value), slot_offset < 0 ? '-' : '+',
+               std::abs(slot_offset));
+      }
+      TranslatedValue translated_value =
+          TranslatedValue::NewUint64ToBigInt(this, value);
+      frame.Add(translated_value);
+      return translated_value.GetChildrenCount();
+    }
+
     case TranslationOpcode::UINT32_STACK_SLOT: {
       int slot_offset =
           OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next());
@@ -1291,7 +1408,8 @@ int TranslatedState::CreateNextTranslatedValue(
 
 Address TranslatedState::DecompressIfNeeded(intptr_t value) {
   if (COMPRESS_POINTERS_BOOL) {
-    return DecompressTaggedAny(isolate(), static_cast<uint32_t>(value));
+    return V8HeapCompressionScheme::DecompressTaggedAny(
+        isolate(), static_cast<uint32_t>(value));
   } else {
     return value;
   }
diff --git a/deps/v8/src/deoptimizer/translated-state.h b/deps/v8/src/deoptimizer/translated-state.h
index 958e99fafde756..cac57ec8324278 100644
--- a/deps/v8/src/deoptimizer/translated-state.h
+++ b/deps/v8/src/deoptimizer/translated-state.h
@@ -73,6 +73,7 @@ class TranslatedValue {
     kInt32,
     kInt64,
     kInt64ToBigInt,
+    kUint64ToBigInt,
     kUInt32,
     kBoolBit,
     kFloat,
@@ -111,6 +112,8 @@ class TranslatedValue {
   static TranslatedValue NewInt64(TranslatedState* container, int64_t value);
   static TranslatedValue NewInt64ToBigInt(TranslatedState* container,
                                           int64_t value);
+  static TranslatedValue NewUint64ToBigInt(TranslatedState* container,
+                                           uint64_t value);
   static TranslatedValue NewUInt32(TranslatedState* container, uint32_t value);
   static TranslatedValue NewBool(TranslatedState* container, uint32_t value);
   static TranslatedValue NewTagged(TranslatedState* container, Object literal);
@@ -152,7 +155,9 @@ class TranslatedValue {
     uint32_t uint32_value_;
     // kind is kInt32.
     int32_t int32_value_;
-    // kind is kInt64.
+    // kind is kUint64ToBigInt.
+    uint64_t uint64_value_;
+    // kind is kInt64 or kInt64ToBigInt.
     int64_t int64_value_;
     // kind is kFloat
     Float32 float_value_;
@@ -167,6 +172,7 @@ class TranslatedValue {
   int32_t int32_value() const;
   int64_t int64_value() const;
   uint32_t uint32_value() const;
+  uint64_t uint64_value() const;
   Float32 float_value() const;
   Float64 double_value() const;
   int object_length() const;
diff --git a/deps/v8/src/deoptimizer/translation-array.cc b/deps/v8/src/deoptimizer/translation-array.cc
index b8ab806821e91c..2a8b3dd2bbd096 100644
--- a/deps/v8/src/deoptimizer/translation-array.cc
+++ b/deps/v8/src/deoptimizer/translation-array.cc
@@ -33,7 +33,7 @@ TranslationArrayIterator::TranslationArrayIterator(TranslationArray buffer,
                                                    int index)
     : buffer_(buffer), index_(index) {
 #ifdef V8_USE_ZLIB
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     const int size = buffer_.get_int(kUncompressedSizeOffset);
     uncompressed_contents_.insert(uncompressed_contents_.begin(), size, 0);
 
@@ -50,12 +50,12 @@ TranslationArrayIterator::TranslationArrayIterator(TranslationArray buffer,
     return;
   }
 #endif  // V8_USE_ZLIB
-  DCHECK(!FLAG_turbo_compress_translation_arrays);
+  DCHECK(!v8_flags.turbo_compress_translation_arrays);
   DCHECK(index >= 0 && index < buffer.length());
 }
 
 int32_t TranslationArrayIterator::Next() {
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     return uncompressed_contents_[index_++];
   } else {
     int32_t value = base::VLQDecode(buffer_.GetDataStartAddress(), &index_);
@@ -65,7 +65,7 @@ int32_t TranslationArrayIterator::Next() {
 }
 
 uint32_t TranslationArrayIterator::NextUnsigned() {
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     return uncompressed_contents_[index_++];
   } else {
     uint32_t value =
@@ -76,7 +76,7 @@ uint32_t TranslationArrayIterator::NextUnsigned() {
 }
 
 bool TranslationArrayIterator::HasNext() const {
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     return index_ < static_cast<int>(uncompressed_contents_.size());
   } else {
     return index_ < buffer_.length();
@@ -84,7 +84,7 @@ bool TranslationArrayIterator::HasNext() const {
 }
 
 void TranslationArrayBuilder::Add(int32_t value) {
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     contents_for_compression_.push_back(value);
   } else {
     base::VLQEncode(&contents_, value);
@@ -93,7 +93,7 @@ void TranslationArrayBuilder::Add(int32_t value) {
 
 void TranslationArrayBuilder::AddOpcode(TranslationOpcode opcode) {
   static_assert(kNumTranslationOpcodes - 1 <= base::kDataMask);
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     contents_for_compression_.push_back(static_cast<byte>(opcode));
   } else {
     contents_.push_back(static_cast<byte>(opcode));
@@ -102,7 +102,7 @@ void TranslationArrayBuilder::AddOpcode(TranslationOpcode opcode) {
 
 void TranslationArrayBuilder::AddRegister(Register reg) {
   static_assert(Register::kNumRegisters - 1 <= base::kDataMask);
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     contents_for_compression_.push_back(static_cast<byte>(reg.code()));
   } else {
     contents_.push_back(static_cast<byte>(reg.code()));
@@ -111,7 +111,7 @@ void TranslationArrayBuilder::AddRegister(Register reg) {
 
 void TranslationArrayBuilder::AddFloatRegister(FloatRegister reg) {
   static_assert(FloatRegister::kNumRegisters - 1 <= base::kDataMask);
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     contents_for_compression_.push_back(static_cast<byte>(reg.code()));
   } else {
     contents_.push_back(static_cast<byte>(reg.code()));
@@ -120,7 +120,7 @@ void TranslationArrayBuilder::AddFloatRegister(FloatRegister reg) {
 
 void TranslationArrayBuilder::AddDoubleRegister(DoubleRegister reg) {
   static_assert(DoubleRegister::kNumRegisters - 1 <= base::kDataMask);
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     contents_for_compression_.push_back(static_cast<byte>(reg.code()));
   } else {
     contents_.push_back(static_cast<byte>(reg.code()));
@@ -130,7 +130,7 @@ void TranslationArrayBuilder::AddDoubleRegister(DoubleRegister reg) {
 Handle<TranslationArray> TranslationArrayBuilder::ToTranslationArray(
     Factory* factory) {
 #ifdef V8_USE_ZLIB
-  if (V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)) {
+  if (V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)) {
     const int input_size = SizeInBytes();
     uLongf compressed_data_size = compressBound(input_size);
 
@@ -155,7 +155,7 @@ Handle<TranslationArray> TranslationArrayBuilder::ToTranslationArray(
     return result;
   }
 #endif
-  DCHECK(!FLAG_turbo_compress_translation_arrays);
+  DCHECK(!v8_flags.turbo_compress_translation_arrays);
   Handle<TranslationArray> result =
       factory->NewByteArray(SizeInBytes(), AllocationType::kOld);
   memcpy(result->GetDataStartAddress(), contents_.data(),
@@ -287,6 +287,20 @@ void TranslationArrayBuilder::StoreInt64Register(Register reg) {
   DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
 }
 
+void TranslationArrayBuilder::StoreSignedBigInt64Register(Register reg) {
+  auto opcode = TranslationOpcode::SIGNED_BIGINT64_REGISTER;
+  AddOpcode(opcode);
+  AddRegister(reg);
+  DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
+}
+
+void TranslationArrayBuilder::StoreUnsignedBigInt64Register(Register reg) {
+  auto opcode = TranslationOpcode::UNSIGNED_BIGINT64_REGISTER;
+  AddOpcode(opcode);
+  AddRegister(reg);
+  DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
+}
+
 void TranslationArrayBuilder::StoreUint32Register(Register reg) {
   auto opcode = TranslationOpcode::UINT32_REGISTER;
   AddOpcode(opcode);
@@ -334,6 +348,20 @@ void TranslationArrayBuilder::StoreInt64StackSlot(int index) {
   DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
 }
 
+void TranslationArrayBuilder::StoreSignedBigInt64StackSlot(int index) {
+  auto opcode = TranslationOpcode::SIGNED_BIGINT64_STACK_SLOT;
+  AddOpcode(opcode);
+  Add(index);
+  DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
+}
+
+void TranslationArrayBuilder::StoreUnsignedBigInt64StackSlot(int index) {
+  auto opcode = TranslationOpcode::UNSIGNED_BIGINT64_STACK_SLOT;
+  AddOpcode(opcode);
+  Add(index);
+  DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 1);
+}
+
 void TranslationArrayBuilder::StoreUint32StackSlot(int index) {
   auto opcode = TranslationOpcode::UINT32_STACK_SLOT;
   AddOpcode(opcode);
diff --git a/deps/v8/src/deoptimizer/translation-array.h b/deps/v8/src/deoptimizer/translation-array.h
index f25f22c7bb5cdd..2dee8e86c225c9 100644
--- a/deps/v8/src/deoptimizer/translation-array.h
+++ b/deps/v8/src/deoptimizer/translation-array.h
@@ -90,6 +90,8 @@ class TranslationArrayBuilder {
   void StoreRegister(Register reg);
   void StoreInt32Register(Register reg);
   void StoreInt64Register(Register reg);
+  void StoreSignedBigInt64Register(Register reg);
+  void StoreUnsignedBigInt64Register(Register reg);
   void StoreUint32Register(Register reg);
   void StoreBoolRegister(Register reg);
   void StoreFloatRegister(FloatRegister reg);
@@ -97,6 +99,8 @@ class TranslationArrayBuilder {
   void StoreStackSlot(int index);
   void StoreInt32StackSlot(int index);
   void StoreInt64StackSlot(int index);
+  void StoreSignedBigInt64StackSlot(int index);
+  void StoreUnsignedBigInt64StackSlot(int index);
   void StoreUint32StackSlot(int index);
   void StoreBoolStackSlot(int index);
   void StoreFloatStackSlot(int index);
@@ -113,12 +117,12 @@ class TranslationArrayBuilder {
   void AddDoubleRegister(DoubleRegister reg);
 
   int Size() const {
-    return V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)
+    return V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)
                ? static_cast<int>(contents_for_compression_.size())
                : static_cast<int>(contents_.size());
   }
   int SizeInBytes() const {
-    return V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)
+    return V8_UNLIKELY(v8_flags.turbo_compress_translation_arrays)
                ? Size() * kInt32Size
                : Size();
   }
diff --git a/deps/v8/src/deoptimizer/translation-opcode.h b/deps/v8/src/deoptimizer/translation-opcode.h
index 32730525abe9dc..1f83738ec4b252 100644
--- a/deps/v8/src/deoptimizer/translation-opcode.h
+++ b/deps/v8/src/deoptimizer/translation-opcode.h
@@ -30,6 +30,10 @@ namespace internal {
   V(INT32_STACK_SLOT, 1)                                  \
   V(INT64_REGISTER, 1)                                    \
   V(INT64_STACK_SLOT, 1)                                  \
+  V(SIGNED_BIGINT64_REGISTER, 1)                          \
+  V(SIGNED_BIGINT64_STACK_SLOT, 1)                        \
+  V(UNSIGNED_BIGINT64_REGISTER, 1)                        \
+  V(UNSIGNED_BIGINT64_STACK_SLOT, 1)                      \
   V(INTERPRETED_FRAME, 5)                                 \
   V(JAVA_SCRIPT_BUILTIN_CONTINUATION_FRAME, 3)            \
   V(JAVA_SCRIPT_BUILTIN_CONTINUATION_WITH_CATCH_FRAME, 3) \
diff --git a/deps/v8/src/diagnostics/code-tracer.h b/deps/v8/src/diagnostics/code-tracer.h
index 801e09c8023533..ecd54c41b1685f 100644
--- a/deps/v8/src/diagnostics/code-tracer.h
+++ b/deps/v8/src/diagnostics/code-tracer.h
@@ -26,8 +26,8 @@ class CodeTracer final : public Malloced {
       return;
     }
 
-    if (FLAG_redirect_code_traces_to != nullptr) {
-      base::StrNCpy(filename_, FLAG_redirect_code_traces_to,
+    if (v8_flags.redirect_code_traces_to != nullptr) {
+      base::StrNCpy(filename_, v8_flags.redirect_code_traces_to,
                     filename_.length());
     } else if (isolate_id >= 0) {
       base::SNPrintF(filename_, "code-%d-%d.asm",
@@ -102,7 +102,7 @@ class CodeTracer final : public Malloced {
   FILE* file() const { return file_; }
 
  private:
-  static bool ShouldRedirect() { return FLAG_redirect_code_traces; }
+  static bool ShouldRedirect() { return v8_flags.redirect_code_traces; }
 
   base::EmbeddedVector<char, 128> filename_;
   FILE* file_;
diff --git a/deps/v8/src/diagnostics/disassembler.cc b/deps/v8/src/diagnostics/disassembler.cc
index b31a02283b9d82..dad22ba046e3a2 100644
--- a/deps/v8/src/diagnostics/disassembler.cc
+++ b/deps/v8/src/diagnostics/disassembler.cc
@@ -275,16 +275,6 @@ static void PrintRelocInfo(std::ostringstream& out, Isolate* isolate,
             relocinfo->wasm_stub_call_address()));
     out << "    ;; wasm stub: " << runtime_stub_name;
 #endif  // V8_ENABLE_WEBASSEMBLY
-  } else if (RelocInfo::IsRuntimeEntry(rmode) && isolate != nullptr) {
-    // A runtime entry relocinfo might be a deoptimization bailout.
-    Address addr = relocinfo->target_address();
-    DeoptimizeKind type;
-    if (Deoptimizer::IsDeoptimizationEntry(isolate, addr, &type)) {
-      out << "    ;; " << Deoptimizer::MessageFor(type)
-          << " deoptimization bailout";
-    } else {
-      out << "    ;; " << RelocInfo::RelocModeName(rmode);
-    }
   } else {
     out << "    ;; " << RelocInfo::RelocModeName(rmode);
   }
@@ -326,8 +316,7 @@ static int DecodeIt(Isolate* isolate, ExternalReferenceEncoder* ref_encoder,
       } else if (!rit.done() &&
                  rit.rinfo()->pc() == reinterpret_cast<Address>(pc) &&
                  (rit.rinfo()->rmode() == RelocInfo::INTERNAL_REFERENCE ||
-                  rit.rinfo()->rmode() == RelocInfo::LITERAL_CONSTANT ||
-                  rit.rinfo()->rmode() == RelocInfo::DATA_EMBEDDED_OBJECT)) {
+                  rit.rinfo()->rmode() == RelocInfo::LITERAL_CONSTANT)) {
         // raw pointer embedded in code stream, e.g., jump table
         byte* ptr =
             base::ReadUnalignedValue<byte*>(reinterpret_cast<Address>(pc));
@@ -376,7 +365,8 @@ static int DecodeIt(Isolate* isolate, ExternalReferenceEncoder* ref_encoder,
     }
 
     // Instruction address and instruction offset.
-    if (FLAG_log_colour && reinterpret_cast<Address>(prev_pc) == current_pc) {
+    if (v8_flags.log_colour &&
+        reinterpret_cast<Address>(prev_pc) == current_pc) {
       // If this is the given "current" pc, make it yellow and bold.
       out << "\033[33;1m";
     }
@@ -432,7 +422,8 @@ static int DecodeIt(Isolate* isolate, ExternalReferenceEncoder* ref_encoder,
       }
     }
 
-    if (FLAG_log_colour && reinterpret_cast<Address>(prev_pc) == current_pc) {
+    if (v8_flags.log_colour &&
+        reinterpret_cast<Address>(prev_pc) == current_pc) {
       out << "\033[m";
     }
 
@@ -451,7 +442,7 @@ static int DecodeIt(Isolate* isolate, ExternalReferenceEncoder* ref_encoder,
 
 int Disassembler::Decode(Isolate* isolate, std::ostream& os, byte* begin,
                          byte* end, CodeReference code, Address current_pc) {
-  DCHECK_WITH_MSG(FLAG_text_is_readable,
+  DCHECK_WITH_MSG(v8_flags.text_is_readable,
                   "Builtins disassembly requires a readable .text section");
   V8NameConverter v8NameConverter(isolate, code);
   if (isolate) {
diff --git a/deps/v8/src/diagnostics/etw-jit-win.cc b/deps/v8/src/diagnostics/etw-jit-win.cc
index 8d9719f3ede480..39395f3ea18a16 100644
--- a/deps/v8/src/diagnostics/etw-jit-win.cc
+++ b/deps/v8/src/diagnostics/etw-jit-win.cc
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 #include "src/diagnostics/etw-jit-win.h"
 
-#include <atomic>
-
 #include "include/v8-callbacks.h"
 #include "include/v8-isolate.h"
 #include "include/v8-local-handle.h"
@@ -36,7 +34,7 @@ namespace {
 
 class IsolateLoadScriptData {
  public:
-  IsolateLoadScriptData(Isolate* isolate) : isolate_(isolate) {}
+  explicit IsolateLoadScriptData(Isolate* isolate) : isolate_(isolate) {}
   virtual ~IsolateLoadScriptData() {
     // When this is destroyed, it is because Isolate is being destroyed
     // also in Isolate::Deinit, that while already cancel all cancellable
@@ -51,7 +49,7 @@ class IsolateLoadScriptData {
   static void LogIsolatePendingLogs(Isolate* isolate);
   static void UpdateAllIsolates(bool etw_enabled);
   static bool MaybeAddLoadedScript(Isolate* isolate, int script_id);
-  static void EnableLog(Isolate* isolate, bool only_if_pending);
+  static void EnableLog(Isolate* isolate);
   static void DisableLog(Isolate* isolate);
 
  private:
@@ -73,8 +71,7 @@ class IsolateLoadScriptData {
     }
     auto v8_isolate = reinterpret_cast<v8::Isolate*>(isolate_);
     Isolate* isolate = isolate_;
-    auto task =
-        MakeCancelableTask(isolate_, [isolate] { EnableLog(isolate, false); });
+    auto task = MakeCancelableTask(isolate_, [isolate] { EnableLog(isolate); });
     pending_log_task_id_ = task->id();
     auto taskrunner =
         V8::GetCurrentPlatform()->GetForegroundTaskRunner(v8_isolate);
@@ -126,7 +123,7 @@ void IsolateLoadScriptData::RemoveIsolate(Isolate* isolate) {
   isolate_map.Pointer()->erase(isolate);
 }
 
-void IsolateLoadScriptData::EnableLog(Isolate* isolate, bool only_if_pending) {
+void IsolateLoadScriptData::EnableLog(Isolate* isolate) {
   bool has_pending_log = false;
   {
     base::MutexGuard guard(isolates_mutex.Pointer());
@@ -136,15 +133,11 @@ void IsolateLoadScriptData::EnableLog(Isolate* isolate, bool only_if_pending) {
       data.CancelPendingLog();
     }
   }
-  if (only_if_pending && !has_pending_log) {
-    return;
-  }
-  auto v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
+
   // This cannot be done while isolate_mutex is locked, as it can call
   // EventHandler while in the call for all the existing code.
-  v8_isolate->SetJitCodeEventHandler(
-      has_pending_log ? kJitCodeEventEnumExisting : kJitCodeEventDefault,
-      EventHandler);
+  isolate->v8_file_logger()->SetEtwCodeEventHandler(
+      has_pending_log ? kJitCodeEventEnumExisting : kJitCodeEventDefault);
 }
 
 void IsolateLoadScriptData::DisableLog(Isolate* isolate) {
@@ -156,8 +149,7 @@ void IsolateLoadScriptData::DisableLog(Isolate* isolate) {
     }
     data.RemoveAllLoadedScripts();
   }
-  auto v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
-  v8_isolate->SetJitCodeEventHandler(kJitCodeEventDefault, EventHandler);
+  isolate->v8_file_logger()->ResetEtwCodeEventHandler();
 }
 
 void IsolateLoadScriptData::UpdateAllIsolates(bool etw_enabled) {
@@ -186,6 +178,10 @@ bool IsolateLoadScriptData::MaybeAddLoadedScript(Isolate* isolate,
 
 }  // namespace
 
+void EnableETWLog(Isolate* isolate) {
+  IsolateLoadScriptData::EnableLog(isolate);
+}
+
 // TODO(v8/11911): UnboundScript::GetLineNumber should be replaced
 SharedFunctionInfo GetSharedFunctionInfo(const JitCodeEvent* event) {
   return event->script.IsEmpty() ? SharedFunctionInfo()
@@ -237,11 +233,8 @@ std::wstring GetScriptMethodName(const JitCodeEvent* event) {
                        : GetScriptMethodNameFromSharedFunctionInfo(sfi);
 }
 
-void MaybeSetHandlerNow(Isolate* isolate) {
-  IsolateLoadScriptData::EnableLog(isolate, true);
-}
-
 void UpdateETWEnabled(bool enabled) {
+  DCHECK(v8_flags.enable_etw_stack_walking);
   if (enabled == is_etw_enabled) {
     return;
   }
@@ -258,6 +251,7 @@ void WINAPI ETWEnableCallback(LPCGUID /* source_id */, ULONG is_enabled,
                               ULONGLONG match_all_keyword,
                               PEVENT_FILTER_DESCRIPTOR /* filter_data */,
                               PVOID /* callback_context */) {
+  DCHECK(v8_flags.enable_etw_stack_walking);
   bool is_etw_enabled_now =
       is_enabled && level >= kTraceLevel &&
       (match_any_keyword & kJScriptRuntimeKeyword) &&
@@ -337,7 +331,6 @@ void EventHandler(const JitCodeEvent* event) {
       Field("MethodAddressRangeID", TlgInUINT16),
       Field("SourceID", TlgInUINT64), Field("Line", TlgInUINT32),
       Field("Column", TlgInUINT32), Field("MethodName", TlgInUNICODESTRING));
-
   LogEventData(g_v8Provider, &method_load_event_meta, &method_load_event_fields,
                script_context, event->code_start, (uint64_t)event->code_len,
                (uint32_t)0,  // MethodId
diff --git a/deps/v8/src/diagnostics/etw-jit-win.h b/deps/v8/src/diagnostics/etw-jit-win.h
index 2d123eb28eb837..324b6ad1c2efa6 100644
--- a/deps/v8/src/diagnostics/etw-jit-win.h
+++ b/deps/v8/src/diagnostics/etw-jit-win.h
@@ -5,6 +5,10 @@
 #ifndef V8_DIAGNOSTICS_ETW_JIT_WIN_H_
 #define V8_DIAGNOSTICS_ETW_JIT_WIN_H_
 
+#include <atomic>
+
+#include "include/v8config.h"
+
 namespace v8 {
 
 class Isolate;
@@ -12,12 +16,19 @@ struct JitCodeEvent;
 
 namespace internal {
 namespace ETWJITInterface {
+extern std::atomic<bool> is_etw_enabled;
+
 void Register();
 void Unregister();
 void AddIsolate(Isolate* isolate);
 void RemoveIsolate(Isolate* isolate);
 void EventHandler(const v8::JitCodeEvent* event);
-void MaybeSetHandlerNow(Isolate* isolate);
+void EnableETWLog(Isolate* isolate);
+V8_INLINE void MaybeSetHandlerNow(Isolate* isolate) {
+  if (is_etw_enabled) {
+    EnableETWLog(isolate);
+  }
+}
 }  // namespace ETWJITInterface
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/diagnostics/gdb-jit.cc b/deps/v8/src/diagnostics/gdb-jit.cc
index 4f8a027a39381b..ee087fac171b4f 100644
--- a/deps/v8/src/diagnostics/gdb-jit.cc
+++ b/deps/v8/src/diagnostics/gdb-jit.cc
@@ -1986,7 +1986,7 @@ static void AddJITCodeEntry(CodeMap* map, const base::AddressRegion region,
                             const char* name_hint) {
 #if defined(DEBUG) && !V8_OS_WIN
   static int file_num = 0;
-  if (FLAG_gdbjit_dump && dump_if_enabled) {
+  if (v8_flags.gdbjit_dump && dump_if_enabled) {
     static const int kMaxFileNameSize = 64;
     char file_name[64];
 
@@ -2014,7 +2014,7 @@ static void AddCode(const char* name, base::AddressRegion region,
   CodeMap* code_map = GetCodeMap();
   RemoveJITCodeEntries(code_map, region);
 
-  if (!FLAG_gdbjit_full && !code_desc.IsLineInfoAvailable()) {
+  if (!v8_flags.gdbjit_full && !code_desc.IsLineInfoAvailable()) {
     delete lineinfo;
     return;
   }
@@ -2026,12 +2026,12 @@ static void AddCode(const char* name, base::AddressRegion region,
 
   const char* name_hint = nullptr;
   bool should_dump = false;
-  if (FLAG_gdbjit_dump) {
-    if (strlen(FLAG_gdbjit_dump_filter) == 0) {
+  if (v8_flags.gdbjit_dump) {
+    if (strlen(v8_flags.gdbjit_dump_filter) == 0) {
       name_hint = name;
       should_dump = true;
     } else if (name != nullptr) {
-      name_hint = strstr(name, FLAG_gdbjit_dump_filter);
+      name_hint = strstr(name, v8_flags.gdbjit_dump_filter);
       should_dump = (name_hint != nullptr);
     }
   }
@@ -2039,7 +2039,7 @@ static void AddCode(const char* name, base::AddressRegion region,
 }
 
 void EventHandler(const v8::JitCodeEvent* event) {
-  if (!FLAG_gdbjit) return;
+  if (!v8_flags.gdbjit) return;
   if ((event->code_type != v8::JitCodeEvent::JIT_CODE) &&
       (event->code_type != v8::JitCodeEvent::WASM_CODE)) {
     return;
diff --git a/deps/v8/src/diagnostics/objects-debug.cc b/deps/v8/src/diagnostics/objects-debug.cc
index 3a57608e3061e2..0db2d9e2438122 100644
--- a/deps/v8/src/diagnostics/objects-debug.cc
+++ b/deps/v8/src/diagnostics/objects-debug.cc
@@ -46,6 +46,7 @@
 #ifdef V8_INTL_SUPPORT
 #include "src/objects/js-date-time-format-inl.h"
 #include "src/objects/js-display-names-inl.h"
+#include "src/objects/js-duration-format-inl.h"
 #endif  // V8_INTL_SUPPORT
 #include "src/objects/js-generator-inl.h"
 #ifdef V8_INTL_SUPPORT
@@ -63,6 +64,7 @@
 #include "src/objects/js-segmenter-inl.h"
 #include "src/objects/js-segments-inl.h"
 #endif  // V8_INTL_SUPPORT
+#include "src/objects/js-raw-json-inl.h"
 #include "src/objects/js-shared-array-inl.h"
 #include "src/objects/js-struct-inl.h"
 #include "src/objects/js-temporal-objects-inl.h"
@@ -1098,9 +1100,9 @@ void CodeDataContainer::CodeDataContainerVerify(Isolate* isolate) {
       CHECK_EQ(code.kind(), kind());
       CHECK_EQ(code.builtin_id(), builtin_id());
       if (V8_REMOVE_BUILTINS_CODE_OBJECTS) {
-        // When FLAG_interpreted_frames_native_stack is enabled each interpreted
-        // function gets its own copy of the InterpreterEntryTrampoline.
-        // Thus, there could be Code'ful builtins.
+        // When v8_flags.interpreted_frames_native_stack is enabled each
+        // interpreted function gets its own copy of the
+        // InterpreterEntryTrampoline. Thus, there could be Code'ful builtins.
         CHECK_IMPLIES(isolate->embedded_blob_code() && is_off_heap_trampoline(),
                       builtin_id() == Builtin::kInterpreterEntryTrampoline);
       }
@@ -1299,7 +1301,7 @@ void JSSharedArray::JSSharedArrayVerify(Isolate* isolate) {
 void WeakCell::WeakCellVerify(Isolate* isolate) {
   CHECK(IsWeakCell());
 
-  CHECK(target().IsJSReceiver() || target().IsUndefined(isolate));
+  CHECK(target().IsUndefined(isolate) || target().CanBeHeldWeakly());
 
   CHECK(prev().IsWeakCell() || prev().IsUndefined(isolate));
   if (prev().IsWeakCell()) {
@@ -1327,7 +1329,7 @@ void WeakCell::WeakCellVerify(Isolate* isolate) {
 void JSWeakRef::JSWeakRefVerify(Isolate* isolate) {
   CHECK(IsJSWeakRef());
   JSObjectVerify(isolate);
-  CHECK(target().IsUndefined(isolate) || target().IsJSReceiver());
+  CHECK(target().IsUndefined(isolate) || target().CanBeHeldWeakly());
 }
 
 void JSFinalizationRegistry::JSFinalizationRegistryVerify(Isolate* isolate) {
@@ -1926,7 +1928,7 @@ void Script::ScriptVerify(Isolate* isolate) {
 
 void NormalizedMapCache::NormalizedMapCacheVerify(Isolate* isolate) {
   WeakFixedArray::cast(*this).WeakFixedArrayVerify(isolate);
-  if (FLAG_enable_slow_asserts) {
+  if (v8_flags.enable_slow_asserts) {
     for (int i = 0; i < length(); i++) {
       MaybeObject e = WeakFixedArray::Get(i);
       HeapObject heap_object;
diff --git a/deps/v8/src/diagnostics/objects-printer.cc b/deps/v8/src/diagnostics/objects-printer.cc
index 55270dfe2ba5b7..ce4d15b2c27e14 100644
--- a/deps/v8/src/diagnostics/objects-printer.cc
+++ b/deps/v8/src/diagnostics/objects-printer.cc
@@ -413,7 +413,7 @@ void PrintTypedArrayElements(std::ostream& os, const ElementType* data_ptr,
                              size_t length, bool is_on_heap) {
   if (length == 0) return;
   size_t previous_index = 0;
-  if (i::FLAG_mock_arraybuffer_allocator && !is_on_heap) {
+  if (i::v8_flags.mock_arraybuffer_allocator && !is_on_heap) {
     // Don't try to print data that's not actually allocated.
     os << "\n    0-" << length << ": <mocked array buffer bytes>";
     return;
@@ -1269,10 +1269,6 @@ void FeedbackNexus::Print(std::ostream& os) {
     case FeedbackSlotKind::kStoreGlobalSloppy:
     case FeedbackSlotKind::kStoreGlobalStrict:
     case FeedbackSlotKind::kStoreInArrayLiteral:
-    case FeedbackSlotKind::kSetKeyedSloppy:
-    case FeedbackSlotKind::kSetKeyedStrict:
-    case FeedbackSlotKind::kSetNamedSloppy:
-    case FeedbackSlotKind::kSetNamedStrict:
     case FeedbackSlotKind::kDefineNamedOwn: {
       os << InlineCacheState2String(ic_state());
       break;
@@ -1306,6 +1302,24 @@ void FeedbackNexus::Print(std::ostream& os) {
       }
       break;
     }
+    case FeedbackSlotKind::kSetNamedSloppy:
+    case FeedbackSlotKind::kSetNamedStrict:
+    case FeedbackSlotKind::kSetKeyedSloppy:
+    case FeedbackSlotKind::kSetKeyedStrict: {
+      os << InlineCacheState2String(ic_state());
+      if (ic_state() == InlineCacheState::MONOMORPHIC) {
+        os << "\n   " << Brief(GetFeedback()) << ": ";
+        StoreHandler::PrintHandler(GetFeedbackExtra().GetHeapObjectOrSmi(), os);
+      } else if (ic_state() == InlineCacheState::POLYMORPHIC) {
+        WeakFixedArray array =
+            WeakFixedArray::cast(GetFeedback().GetHeapObject());
+        for (int i = 0; i < array.length(); i += 2) {
+          os << "\n   " << Brief(array.Get(i)) << ": ";
+          StoreHandler::PrintHandler(array.Get(i + 1).GetHeapObjectOrSmi(), os);
+        }
+      }
+      break;
+    }
     case FeedbackSlotKind::kBinaryOp: {
       os << "BinaryOp:" << GetBinaryOperationFeedback();
       break;
@@ -1319,7 +1333,6 @@ void FeedbackNexus::Print(std::ostream& os) {
       break;
     }
     case FeedbackSlotKind::kLiteral:
-    case FeedbackSlotKind::kTypeProfile:
       break;
     case FeedbackSlotKind::kJumpLoop:
       os << "JumpLoop";
@@ -1544,7 +1557,7 @@ void JSArrayBuffer::JSArrayBufferPrint(std::ostream& os) {
   if (is_detachable()) os << "\n - detachable";
   if (was_detached()) os << "\n - detached";
   if (is_shared()) os << "\n - shared";
-  if (is_resizable()) os << "\n - resizable";
+  if (is_resizable_by_js()) os << "\n - resizable_by_js";
   JSObjectPrintBody(os, *this, !was_detached());
 }
 
@@ -1873,7 +1886,6 @@ void ArrayBoilerplateDescription::ArrayBoilerplateDescriptionPrint(
 void AsmWasmData::AsmWasmDataPrint(std::ostream& os) {
   PrintHeader(os, "AsmWasmData");
   os << "\n - native module: " << Brief(managed_native_module());
-  os << "\n - export_wrappers: " << Brief(export_wrappers());
   os << "\n - uses bitset: " << uses_bitset().value();
   os << "\n";
 }
@@ -1881,7 +1893,6 @@ void AsmWasmData::AsmWasmDataPrint(std::ostream& os) {
 void WasmTypeInfo::WasmTypeInfoPrint(std::ostream& os) {
   PrintHeader(os, "WasmTypeInfo");
   os << "\n - type address: " << reinterpret_cast<void*>(native_type());
-  // TODO(manoskouk): Print supertype info.
   os << "\n - supertypes: ";
   for (int i = 0; i < supertypes_length(); i++) {
     os << "\n  - " << Brief(supertypes(i));
@@ -1923,7 +1934,8 @@ void WasmStruct::WasmStructPrint(std::ostream& os) {
       case wasm::kRtt: {
         Tagged_t raw = base::ReadUnalignedValue<Tagged_t>(field_address);
 #if V8_COMPRESS_POINTERS
-        Address obj = DecompressTaggedPointer(address(), raw);
+        Address obj =
+            V8HeapCompressionScheme::DecompressTaggedPointer(address(), raw);
 #else
         Address obj = raw;
 #endif
@@ -2156,7 +2168,6 @@ void WasmModuleObject::WasmModuleObjectPrint(std::ostream& os) {
   PrintHeader(os, "WasmModuleObject");
   os << "\n - module: " << module();
   os << "\n - native module: " << native_module();
-  os << "\n - export wrappers: " << Brief(export_wrappers());
   os << "\n - script: " << Brief(script());
   os << "\n";
 }
@@ -2400,6 +2411,12 @@ void JSTemporalCalendar::JSTemporalCalendarPrint(std::ostream& os) {
   JSObjectPrintHeader(os, *this, "JSTemporalCalendar");
   JSObjectPrintBody(os, *this);
 }
+
+void JSRawJson::JSRawJsonPrint(std::ostream& os) {
+  JSObjectPrintHeader(os, *this, "JSRawJson");
+  JSObjectPrintBody(os, *this);
+}
+
 #ifdef V8_INTL_SUPPORT
 void JSV8BreakIterator::JSV8BreakIteratorPrint(std::ostream& os) {
   JSObjectPrintHeader(os, *this, "JSV8BreakIterator");
@@ -2440,6 +2457,15 @@ void JSDisplayNames::JSDisplayNamesPrint(std::ostream& os) {
   JSObjectPrintBody(os, *this);
 }
 
+void JSDurationFormat::JSDurationFormatPrint(std::ostream& os) {
+  JSObjectPrintHeader(os, *this, "JSDurationFormat");
+  os << "\n - style_flags: " << style_flags();
+  os << "\n - display_flags: " << display_flags();
+  os << "\n - icu locale: " << Brief(icu_locale());
+  os << "\n - icu number formatter: " << Brief(icu_number_formatter());
+  JSObjectPrintBody(os, *this);
+}
+
 void JSListFormat::JSListFormatPrint(std::ostream& os) {
   JSObjectPrintHeader(os, *this, "JSListFormat");
   os << "\n - locale: " << Brief(locale());
@@ -2931,8 +2957,8 @@ inline i::Object GetObjectFromRaw(void* object) {
   if (RoundDown<i::kPtrComprCageBaseAlignment>(object_ptr) == i::kNullAddress) {
     // Try to decompress pointer.
     i::Isolate* isolate = i::Isolate::Current();
-    object_ptr =
-        i::DecompressTaggedAny(isolate, static_cast<i::Tagged_t>(object_ptr));
+    object_ptr = i::V8HeapCompressionScheme::DecompressTaggedAny(
+        isolate, static_cast<i::Tagged_t>(object_ptr));
   }
 #endif
   return i::Object(object_ptr);
@@ -2943,14 +2969,17 @@ inline i::Object GetObjectFromRaw(void* object) {
 //
 // The following functions are used by our gdb macros.
 //
+V8_DONT_STRIP_SYMBOL
 V8_EXPORT_PRIVATE extern i::Object _v8_internal_Get_Object(void* object) {
   return GetObjectFromRaw(object);
 }
 
+V8_DONT_STRIP_SYMBOL
 V8_EXPORT_PRIVATE extern void _v8_internal_Print_Object(void* object) {
   GetObjectFromRaw(object).Print();
 }
 
+V8_DONT_STRIP_SYMBOL
 V8_EXPORT_PRIVATE extern void _v8_internal_Print_LoadHandler(void* object) {
 #ifdef OBJECT_PRINT
   i::StdoutStream os;
@@ -2959,6 +2988,7 @@ V8_EXPORT_PRIVATE extern void _v8_internal_Print_LoadHandler(void* object) {
 #endif
 }
 
+V8_DONT_STRIP_SYMBOL
 V8_EXPORT_PRIVATE extern void _v8_internal_Print_StoreHandler(void* object) {
 #ifdef OBJECT_PRINT
   i::StdoutStream os;
@@ -2967,6 +2997,7 @@ V8_EXPORT_PRIVATE extern void _v8_internal_Print_StoreHandler(void* object) {
 #endif
 }
 
+V8_DONT_STRIP_SYMBOL
 V8_EXPORT_PRIVATE extern void _v8_internal_Print_Code(void* object) {
   i::Address address = reinterpret_cast<i::Address>(object);
   i::Isolate* isolate = i::Isolate::Current();
@@ -3009,11 +3040,13 @@ V8_EXPORT_PRIVATE extern void _v8_internal_Print_Code(void* object) {
 #endif  // ENABLE_DISASSEMBLER
 }
 
+V8_DONT_STRIP_SYMBOL
 V8_EXPORT_PRIVATE extern void _v8_internal_Print_StackTrace() {
   i::Isolate* isolate = i::Isolate::Current();
   isolate->PrintStack(stdout);
 }
 
+V8_DONT_STRIP_SYMBOL
 V8_EXPORT_PRIVATE extern void _v8_internal_Print_TransitionTree(void* object) {
   i::Object o(GetObjectFromRaw(object));
   if (!o.IsMap()) {
diff --git a/deps/v8/src/diagnostics/perf-jit.cc b/deps/v8/src/diagnostics/perf-jit.cc
index 3fde07b76ff8b6..ca5fc54a4b1895 100644
--- a/deps/v8/src/diagnostics/perf-jit.cc
+++ b/deps/v8/src/diagnostics/perf-jit.cc
@@ -143,7 +143,8 @@ void LinuxPerfJitLogger::OpenJitDumpFile() {
   // If --perf-prof-delete-file is given, unlink the file right after opening
   // it. This keeps the file handle to the file valid. This only works on Linux,
   // which is the only platform supported for --perf-prof anyway.
-  if (FLAG_perf_prof_delete_file) CHECK_EQ(0, unlink(perf_dump_name.begin()));
+  if (v8_flags.perf_prof_delete_file)
+    CHECK_EQ(0, unlink(perf_dump_name.begin()));
 
   marker_address_ = OpenMarkerFile(fd);
   if (marker_address_ == nullptr) return;
@@ -216,7 +217,7 @@ void LinuxPerfJitLogger::LogRecordedBuffer(
     Handle<AbstractCode> abstract_code,
     MaybeHandle<SharedFunctionInfo> maybe_shared, const char* name,
     int length) {
-  if (FLAG_perf_basic_prof_only_functions) {
+  if (v8_flags.perf_basic_prof_only_functions) {
     CodeKind code_kind = abstract_code->kind(isolate_);
     if (code_kind != CodeKind::INTERPRETED_FUNCTION &&
         code_kind != CodeKind::TURBOFAN && code_kind != CodeKind::MAGLEV &&
@@ -236,7 +237,7 @@ void LinuxPerfJitLogger::LogRecordedBuffer(
 
   // Debug info has to be emitted first.
   Handle<SharedFunctionInfo> shared;
-  if (FLAG_perf_prof && maybe_shared.ToHandle(&shared)) {
+  if (v8_flags.perf_prof && maybe_shared.ToHandle(&shared)) {
     // TODO(herhut): This currently breaks for js2wasm/wasm2js functions.
     if (code->kind() != CodeKind::JS_TO_WASM_FUNCTION &&
         code->kind() != CodeKind::WASM_TO_JS_FUNCTION) {
@@ -248,7 +249,7 @@ void LinuxPerfJitLogger::LogRecordedBuffer(
   uint8_t* code_pointer = reinterpret_cast<uint8_t*>(code->InstructionStart());
 
   // Unwinding info comes right after debug info.
-  if (FLAG_perf_prof_unwinding_info) LogWriteUnwindingInfo(*code);
+  if (v8_flags.perf_prof_unwinding_info) LogWriteUnwindingInfo(*code);
 
   WriteJitCodeLoadEntry(code_pointer, code->InstructionSize(), code_name,
                         length);
@@ -261,7 +262,7 @@ void LinuxPerfJitLogger::LogRecordedBuffer(const wasm::WasmCode* code,
 
   if (perf_output_handle_ == nullptr) return;
 
-  if (FLAG_perf_prof_annotate_wasm) LogWriteDebugInfo(code);
+  if (v8_flags.perf_prof_annotate_wasm) LogWriteDebugInfo(code);
 
   WriteJitCodeLoadEntry(code->instructions().begin(),
                         code->instructions().length(), name, length);
diff --git a/deps/v8/src/diagnostics/unwinding-info-win64.cc b/deps/v8/src/diagnostics/unwinding-info-win64.cc
index 37f02cbf1d2f59..767eb015ab1087 100644
--- a/deps/v8/src/diagnostics/unwinding-info-win64.cc
+++ b/deps/v8/src/diagnostics/unwinding-info-win64.cc
@@ -25,18 +25,18 @@ namespace v8 {
 namespace internal {
 namespace win64_unwindinfo {
 
-bool CanEmitUnwindInfoForBuiltins() { return FLAG_win64_unwinding_info; }
+bool CanEmitUnwindInfoForBuiltins() { return v8_flags.win64_unwinding_info; }
 
 bool CanRegisterUnwindInfoForNonABICompliantCodeRange() {
-  return !FLAG_jitless;
+  return !v8_flags.jitless;
 }
 
 bool RegisterUnwindInfoForExceptionHandlingOnly() {
   DCHECK(CanRegisterUnwindInfoForNonABICompliantCodeRange());
 #if defined(V8_OS_WIN_ARM64)
-  return !FLAG_win64_unwinding_info;
+  return !v8_flags.win64_unwinding_info;
 #else
-  return !IsWindows8OrGreater() || !FLAG_win64_unwinding_info;
+  return !IsWindows8OrGreater() || !v8_flags.win64_unwinding_info;
 #endif
 }
 
diff --git a/deps/v8/src/execution/arm64/simulator-arm64.cc b/deps/v8/src/execution/arm64/simulator-arm64.cc
index de3c992ac9278e..adb1ef10410ad5 100644
--- a/deps/v8/src/execution/arm64/simulator-arm64.cc
+++ b/deps/v8/src/execution/arm64/simulator-arm64.cc
@@ -2693,27 +2693,6 @@ void Simulator::VisitDataProcessing2Source(Instruction* instr) {
   }
 }
 
-// The algorithm used is described in section 8.2 of
-//   Hacker's Delight, by Henry S. Warren, Jr.
-// It assumes that a right shift on a signed integer is an arithmetic shift.
-static int64_t MultiplyHighSigned(int64_t u, int64_t v) {
-  uint64_t u0, v0, w0;
-  int64_t u1, v1, w1, w2, t;
-
-  u0 = u & 0xFFFFFFFFLL;
-  u1 = u >> 32;
-  v0 = v & 0xFFFFFFFFLL;
-  v1 = v >> 32;
-
-  w0 = u0 * v0;
-  t = u1 * v0 + (w0 >> 32);
-  w1 = t & 0xFFFFFFFFLL;
-  w2 = t >> 32;
-  w1 = u0 * v1 + w1;
-
-  return u1 * v1 + w2 + (w1 >> 32);
-}
-
 void Simulator::VisitDataProcessing3Source(Instruction* instr) {
   int64_t result = 0;
   // Extract and sign- or zero-extend 32-bit arguments for widening operations.
@@ -2748,7 +2727,13 @@ void Simulator::VisitDataProcessing3Source(Instruction* instr) {
       break;
     case SMULH_x:
       DCHECK_EQ(instr->Ra(), kZeroRegCode);
-      result = MultiplyHighSigned(xreg(instr->Rn()), xreg(instr->Rm()));
+      result =
+          base::bits::SignedMulHigh64(xreg(instr->Rn()), xreg(instr->Rm()));
+      break;
+    case UMULH_x:
+      DCHECK_EQ(instr->Ra(), kZeroRegCode);
+      result =
+          base::bits::UnsignedMulHigh64(xreg(instr->Rn()), xreg(instr->Rm()));
       break;
     default:
       UNIMPLEMENTED();
diff --git a/deps/v8/src/execution/frame-constants.h b/deps/v8/src/execution/frame-constants.h
index 423f41bcdd10a6..34291940b8d9b1 100644
--- a/deps/v8/src/execution/frame-constants.h
+++ b/deps/v8/src/execution/frame-constants.h
@@ -55,14 +55,14 @@ class CommonFrameConstants : public AllStatic {
   static constexpr int kCallerSPOffset = kCallerPCOffset + 1 * kPCOnStackSize;
 
   // Fixed part of the frame consists of return address, caller fp,
-  // constant pool (if v8_flags.enable_embedded_constant_pool), context, and
+  // constant pool (if V8_EMBEDDED_CONSTANT_POOL_BOOL), context, and
   // function. CommonFrame::IterateExpressions assumes that kLastObjectOffset
   // is the last object pointer.
   static constexpr int kFixedFrameSizeAboveFp = kPCOnStackSize + kFPOnStackSize;
   static constexpr int kFixedSlotCountAboveFp =
       kFixedFrameSizeAboveFp / kSystemPointerSize;
   static constexpr int kCPSlotSize =
-      v8_flags.enable_embedded_constant_pool.value() ? kSystemPointerSize : 0;
+      V8_EMBEDDED_CONSTANT_POOL_BOOL ? kSystemPointerSize : 0;
   static constexpr int kCPSlotCount = kCPSlotSize / kSystemPointerSize;
   static constexpr int kConstantPoolOffset =
       kCPSlotSize ? -1 * kSystemPointerSize : 0;
diff --git a/deps/v8/src/execution/frames.cc b/deps/v8/src/execution/frames.cc
index 8e982f83628556..0ca10a21e190f5 100644
--- a/deps/v8/src/execution/frames.cc
+++ b/deps/v8/src/execution/frames.cc
@@ -607,7 +607,7 @@ void StackFrame::IteratePc(RootVisitor* v, Address* pc_address,
   Address pc = holder.InstructionStart(isolate_, old_pc) + pc_offset;
   // TODO(v8:10026): avoid replacing a signed pointer.
   PointerAuthentication::ReplacePC(pc_address, pc, kSystemPointerSize);
-  if (v8_flags.enable_embedded_constant_pool && constant_pool_address) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL && constant_pool_address) {
     *constant_pool_address = holder.constant_pool();
   }
 }
@@ -842,7 +842,7 @@ void ExitFrame::ComputeCallerState(State* state) const {
   state->pc_address = ResolveReturnAddressLocation(
       reinterpret_cast<Address*>(fp() + ExitFrameConstants::kCallerPCOffset));
   state->callee_pc_address = nullptr;
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     state->constant_pool_address = reinterpret_cast<Address*>(
         fp() + ExitFrameConstants::kConstantPoolOffset);
   }
@@ -1109,8 +1109,8 @@ void VisitSpillSlot(Isolate* isolate, RootVisitor* v,
     if (!HAS_SMI_TAG(value) && value <= 0xffffffff) {
       // We don't need to update smi values or full pointers.
       was_compressed = true;
-      *spill_slot.location() =
-          DecompressTaggedPointer(cage_base, static_cast<Tagged_t>(value));
+      *spill_slot.location() = V8HeapCompressionScheme::DecompressTaggedPointer(
+          cage_base, static_cast<Tagged_t>(value));
       if (DEBUG_BOOL) {
         // Ensure that the spill slot contains correct heap object.
         HeapObject raw = HeapObject::cast(Object(*spill_slot.location()));
@@ -1144,8 +1144,8 @@ void VisitSpillSlot(Isolate* isolate, RootVisitor* v,
     if (!HAS_SMI_TAG(compressed_value)) {
       was_compressed = slot_contents <= 0xFFFFFFFF;
       // We don't need to update smi values.
-      *spill_slot.location() =
-          DecompressTaggedPointer(cage_base, compressed_value);
+      *spill_slot.location() = V8HeapCompressionScheme::DecompressTaggedPointer(
+          cage_base, compressed_value);
     }
   }
 #endif
@@ -1154,7 +1154,8 @@ void VisitSpillSlot(Isolate* isolate, RootVisitor* v,
   if (was_compressed) {
     // Restore compression. Generated code should be able to trust that
     // compressed spill slots remain compressed.
-    *spill_slot.location() = CompressTagged(*spill_slot.location());
+    *spill_slot.location() =
+        V8HeapCompressionScheme::CompressTagged(*spill_slot.location());
   }
 #endif
 }
@@ -1469,14 +1470,27 @@ void MaglevFrame::Iterate(RootVisitor* v) const {
     // the stack guard in the prologue of the maglev function. This means that
     // we've set up the frame header, but not the spill slots yet.
 
-    // DCHECK the frame setup under the above assumption. Include one extra slot
-    // for the single argument into StackGuardWithGap, and another for the saved
-    // new.target register.
-    DCHECK_EQ(actual_frame_size, StandardFrameConstants::kFixedFrameSizeFromFp +
-                                     2 * kSystemPointerSize);
-    DCHECK_EQ(isolate()->c_function(),
-              Runtime::FunctionForId(Runtime::kStackGuardWithGap)->entry);
-    DCHECK_EQ(maglev_safepoint_entry.num_pushed_registers(), 0);
+    if (v8_flags.maglev_ool_prologue) {
+      // DCHECK the frame setup under the above assumption. The
+      // MaglevOutOfLinePrologue builtin creates an INTERNAL frame for the
+      // StackGuardWithGap call (where extra slots and args are), so the MAGLEV
+      // frame itself is exactly kFixedFrameSizeFromFp.
+      DCHECK_EQ(actual_frame_size,
+                StandardFrameConstants::kFixedFrameSizeFromFp);
+      DCHECK_EQ(isolate()->c_function(),
+                Runtime::FunctionForId(Runtime::kStackGuardWithGap)->entry);
+      DCHECK_EQ(maglev_safepoint_entry.num_pushed_registers(), 0);
+    } else {
+      // DCHECK the frame setup under the above assumption. Include one extra
+      // slot for the single argument into StackGuardWithGap, and another for
+      // the saved new.target register.
+      DCHECK_EQ(actual_frame_size,
+                StandardFrameConstants::kFixedFrameSizeFromFp +
+                    2 * kSystemPointerSize);
+      DCHECK_EQ(isolate()->c_function(),
+                Runtime::FunctionForId(Runtime::kStackGuardWithGap)->entry);
+      DCHECK_EQ(maglev_safepoint_entry.num_pushed_registers(), 0);
+    }
     spill_slot_count = 0;
     tagged_slot_count = 0;
   }
@@ -2705,14 +2719,6 @@ void WasmCompileLazyFrame::Iterate(RootVisitor* v) const {
 
   int func_index = GetFunctionIndex();
   wasm::NativeModule* native_module = GetNativeModule();
-  if (!native_module) {
-    // This GC was triggered by lazy compilation, because otherwise this frame
-    // would not be on the stack. The native module gets set on the stack after
-    // a successful compilation. The native module being nullptr means that
-    // compilation failed, and we don't have to preserve any references because
-    // the stack will get unwound immediately after the GC.
-    return;
-  }
 
   // Scan the spill slots of the parameter registers. Parameters in WebAssembly
   // get reordered such that first all value parameters get put into registers.
@@ -2752,22 +2758,27 @@ void WasmCompileLazyFrame::Iterate(RootVisitor* v) const {
   }
 
   // Next we scan the slots of stack parameters.
-  wasm::WasmCode* wasm_code = native_module->GetCode(func_index);
-  uint32_t first_tagged_stack_slot = wasm_code->first_tagged_parameter_slot();
-  uint32_t num_tagged_stack_slots = wasm_code->num_tagged_parameter_slots();
-
-  // Visit tagged parameters that have been passed to the function of this
-  // frame. Conceptionally these parameters belong to the parent frame. However,
-  // the exact count is only known by this frame (in the presence of tail calls,
-  // this information cannot be derived from the call site).
-  if (num_tagged_stack_slots > 0) {
-    FullObjectSlot tagged_parameter_base(&Memory<Address>(caller_sp()));
-    tagged_parameter_base += first_tagged_stack_slot;
-    FullObjectSlot tagged_parameter_limit =
-        tagged_parameter_base + num_tagged_stack_slots;
-
-    v->VisitRootPointers(Root::kStackRoots, "stack parameter",
-                         tagged_parameter_base, tagged_parameter_limit);
+  // If there is no code, then lazy compilation failed (which can happen with
+  // lazy validation). In that case, just do not scan parameters, which will
+  // never be used anyway because the stack will get unwound when returning to
+  // the CEntry stub.
+  if (wasm::WasmCode* wasm_code = native_module->GetCode(func_index)) {
+    uint32_t first_tagged_stack_slot = wasm_code->first_tagged_parameter_slot();
+    uint32_t num_tagged_stack_slots = wasm_code->num_tagged_parameter_slots();
+
+    // Visit tagged parameters that have been passed to the function of this
+    // frame. Conceptionally these parameters belong to the parent frame.
+    // However, the exact count is only known by this frame (in the presence of
+    // tail calls, this information cannot be derived from the call site).
+    if (num_tagged_stack_slots > 0) {
+      FullObjectSlot tagged_parameter_base(&Memory<Address>(caller_sp()));
+      tagged_parameter_base += first_tagged_stack_slot;
+      FullObjectSlot tagged_parameter_limit =
+          tagged_parameter_base + num_tagged_stack_slots;
+
+      v->VisitRootPointers(Root::kStackRoots, "stack parameter",
+                           tagged_parameter_base, tagged_parameter_limit);
+    }
   }
 }
 #endif  // V8_ENABLE_WEBASSEMBLY
diff --git a/deps/v8/src/execution/isolate-inl.h b/deps/v8/src/execution/isolate-inl.h
index 14dc36529097ce..00b5f82f606752 100644
--- a/deps/v8/src/execution/isolate-inl.h
+++ b/deps/v8/src/execution/isolate-inl.h
@@ -115,7 +115,7 @@ Object Isolate::VerifyBuiltinsResult(Object result) {
   // because that's the assumption in generated code (which might call this
   // builtin).
   if (!result.IsSmi()) {
-    DCHECK_EQ(result.ptr(), DecompressTaggedPointer(
+    DCHECK_EQ(result.ptr(), V8HeapCompressionScheme::DecompressTaggedPointer(
                                 this, static_cast<Tagged_t>(result.ptr())));
   }
 #endif
@@ -131,12 +131,12 @@ ObjectPair Isolate::VerifyBuiltinsResult(ObjectPair pair) {
   // because that's the assumption in generated code (which might call this
   // builtin).
   if (!HAS_SMI_TAG(pair.x)) {
-    DCHECK_EQ(pair.x,
-              DecompressTaggedPointer(this, static_cast<Tagged_t>(pair.x)));
+    DCHECK_EQ(pair.x, V8HeapCompressionScheme::DecompressTaggedPointer(
+                          this, static_cast<Tagged_t>(pair.x)));
   }
   if (!HAS_SMI_TAG(pair.y)) {
-    DCHECK_EQ(pair.y,
-              DecompressTaggedPointer(this, static_cast<Tagged_t>(pair.y)));
+    DCHECK_EQ(pair.y, V8HeapCompressionScheme::DecompressTaggedPointer(
+                          this, static_cast<Tagged_t>(pair.y)));
   }
 #endif  // V8_COMPRESS_POINTERS
 #endif  // V8_HOST_ARCH_64_BIT
diff --git a/deps/v8/src/execution/isolate-utils-inl.h b/deps/v8/src/execution/isolate-utils-inl.h
index 66337c27dfe3e9..161edbe2aaf91b 100644
--- a/deps/v8/src/execution/isolate-utils-inl.h
+++ b/deps/v8/src/execution/isolate-utils-inl.h
@@ -18,8 +18,8 @@ namespace internal {
 // Aliases for GetPtrComprCageBase when
 // V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE. Each Isolate has its own cage, whose
 // base address is also the Isolate root.
-V8_INLINE constexpr Address GetIsolateRootAddress(Address on_heap_addr) {
-  return GetPtrComprCageBaseAddress(on_heap_addr);
+V8_INLINE Address GetIsolateRootAddress(Address on_heap_addr) {
+  return V8HeapCompressionScheme::GetPtrComprCageBaseAddress(on_heap_addr);
 }
 
 V8_INLINE Address GetIsolateRootAddress(PtrComprCageBase cage_base) {
diff --git a/deps/v8/src/execution/isolate.cc b/deps/v8/src/execution/isolate.cc
index bbd6855bb3be48..3d6717a8778433 100644
--- a/deps/v8/src/execution/isolate.cc
+++ b/deps/v8/src/execution/isolate.cc
@@ -94,6 +94,7 @@
 #include "src/objects/slots.h"
 #include "src/objects/smi.h"
 #include "src/objects/source-text-module-inl.h"
+#include "src/objects/string-set-inl.h"
 #include "src/objects/visitors.h"
 #include "src/profiler/heap-profiler.h"
 #include "src/profiler/tracing-cpu-profiler.h"
@@ -983,8 +984,9 @@ void CaptureAsyncStackTrace(Isolate* isolate, Handle<JSPromise> promise,
                           Builtin::kAsyncFunctionAwaitResolveClosure) ||
         IsBuiltinFunction(isolate, reaction->fulfill_handler(),
                           Builtin::kAsyncGeneratorAwaitResolveClosure) ||
-        IsBuiltinFunction(isolate, reaction->fulfill_handler(),
-                          Builtin::kAsyncGeneratorYieldResolveClosure)) {
+        IsBuiltinFunction(
+            isolate, reaction->fulfill_handler(),
+            Builtin::kAsyncGeneratorYieldWithAwaitResolveClosure)) {
       // Now peek into the handlers' AwaitContext to get to
       // the JSGeneratorObject for the async function.
       Handle<Context> context(
@@ -1106,8 +1108,9 @@ void CaptureAsyncStackTrace(Isolate* isolate, CallSiteBuilder* builder) {
                           Builtin::kAsyncFunctionAwaitResolveClosure) ||
         IsBuiltinFunction(isolate, promise_reaction_job_task->handler(),
                           Builtin::kAsyncGeneratorAwaitResolveClosure) ||
-        IsBuiltinFunction(isolate, promise_reaction_job_task->handler(),
-                          Builtin::kAsyncGeneratorYieldResolveClosure) ||
+        IsBuiltinFunction(
+            isolate, promise_reaction_job_task->handler(),
+            Builtin::kAsyncGeneratorYieldWithAwaitResolveClosure) ||
         IsBuiltinFunction(isolate, promise_reaction_job_task->handler(),
                           Builtin::kAsyncFunctionAwaitRejectClosure) ||
         IsBuiltinFunction(isolate, promise_reaction_job_task->handler(),
@@ -1949,6 +1952,15 @@ Object Isolate::UnwindAndFindHandler() {
   // Special handling of termination exceptions, uncatchable by JavaScript and
   // Wasm code, we unwind the handlers until the top ENTRY handler is found.
   bool catchable_by_js = is_catchable_by_javascript(exception);
+  if (!catchable_by_js && !context().is_null()) {
+    // Because the array join stack will not pop the elements when throwing the
+    // uncatchable terminate exception, we need to clear the array join stack to
+    // avoid leaving the stack in an invalid state.
+    // See also CycleProtectedArrayJoin.
+    raw_native_context().set_array_join_stack(
+        ReadOnlyRoots(this).undefined_value());
+  }
+
   int visited_frames = 0;
 
 #if V8_ENABLE_WEBASSEMBLY
@@ -3269,13 +3281,15 @@ Isolate* Isolate::GetProcessWideSharedIsolate(bool* created_shared_isolate) {
     DCHECK(HasFlagThatRequiresSharedHeap());
     FATAL(
         "Build configuration does not support creating shared heap. The RO "
-        "heap must be shared, and pointer compression must either be off or "
-        "use a shared cage. V8 is compiled with RO heap %s and pointers %s.",
+        "heap must be shared, pointer compression must either be off or "
+        "use a shared cage, and write barriers must not be disabled. V8 is "
+        "compiled with RO heap %s, pointers %s and write barriers %s.",
         V8_SHARED_RO_HEAP_BOOL ? "SHARED" : "NOT SHARED",
         !COMPRESS_POINTERS_BOOL ? "NOT COMPRESSED"
                                 : (COMPRESS_POINTERS_IN_SHARED_CAGE_BOOL
                                        ? "COMPRESSED IN SHARED CAGE"
-                                       : "COMPRESSED IN PER-ISOLATE CAGE"));
+                                       : "COMPRESSED IN PER-ISOLATE CAGE"),
+        V8_DISABLE_WRITE_BARRIERS_BOOL ? "DISABLED" : "ENABLED");
   }
 
   base::MutexGuard guard(process_wide_shared_isolate_mutex_.Pointer());
@@ -3573,7 +3587,7 @@ void Isolate::Deinit() {
   }
 
   // All client isolates should already be detached.
-  if (is_shared() || is_shared_space_isolate()) {
+  if (is_shared()) {
     global_safepoint()->AssertNoClientsOnTearDown();
   }
 
@@ -3617,6 +3631,9 @@ void Isolate::Deinit() {
   // At this point there are no more background threads left in this isolate.
   heap_.safepoint()->AssertMainThreadIsOnlyThread();
 
+  // Tear down data using the shared heap before detaching.
+  heap_.TearDownWithSharedHeap();
+
   {
     // This isolate might have to park for a shared GC initiated by another
     // client isolate before it can actually detach from the shared isolate.
@@ -3625,6 +3642,11 @@ void Isolate::Deinit() {
     DetachFromSharedSpaceIsolate();
   }
 
+  // All client isolates should already be detached.
+  if (is_shared_space_isolate()) {
+    global_safepoint()->AssertNoClientsOnTearDown();
+  }
+
   // Since there are no other threads left, we can lock this mutex without any
   // ceremony. This signals to the tear down code that we are in a safepoint.
   base::RecursiveMutexGuard safepoint(&heap_.safepoint()->local_heaps_mutex_);
@@ -4134,11 +4156,14 @@ bool Isolate::Init(SnapshotData* startup_snapshot_data,
 
   if (HasFlagThatRequiresSharedHeap() && v8_flags.shared_space) {
     if (process_wide_shared_space_isolate_) {
-      attach_to_shared_space_isolate = process_wide_shared_space_isolate_;
+      owns_shareable_data_ = false;
     } else {
       process_wide_shared_space_isolate_ = this;
       is_shared_space_isolate_ = true;
+      DCHECK(owns_shareable_data_);
     }
+
+    attach_to_shared_space_isolate = process_wide_shared_space_isolate_;
   }
 
   CHECK_IMPLIES(is_shared_space_isolate_, V8_CAN_CREATE_SHARED_HEAP_BOOL);
@@ -4221,8 +4246,9 @@ bool Isolate::Init(SnapshotData* startup_snapshot_data,
   // during deserialization.
   base::Optional<base::MutexGuard> clients_guard;
 
-  if (shared_isolate_) {
-    clients_guard.emplace(&shared_isolate_->global_safepoint()->clients_mutex_);
+  if (Isolate* isolate =
+          shared_isolate_ ? shared_isolate_ : attach_to_shared_space_isolate) {
+    clients_guard.emplace(&isolate->global_safepoint()->clients_mutex_);
   }
 
   // The main thread LocalHeap needs to be set up when attaching to the shared
@@ -4231,6 +4257,11 @@ bool Isolate::Init(SnapshotData* startup_snapshot_data,
   AttachToSharedIsolate();
   AttachToSharedSpaceIsolate(attach_to_shared_space_isolate);
 
+  // Ensure that we use at most one of shared_isolate() and
+  // shared_space_isolate().
+  DCHECK_IMPLIES(shared_isolate(), !shared_space_isolate());
+  DCHECK_IMPLIES(shared_space_isolate(), !shared_isolate());
+
   // SetUp the object heap.
   DCHECK(!heap_.HasBeenSetUp());
   heap_.SetUp(main_thread_local_heap());
@@ -4243,9 +4274,11 @@ bool Isolate::Init(SnapshotData* startup_snapshot_data,
     string_forwarding_table_ = std::make_shared<StringForwardingTable>(this);
   } else {
     // Only refer to shared string table after attaching to the shared isolate.
-    DCHECK_NOT_NULL(shared_isolate());
-    string_table_ = shared_isolate()->string_table_;
-    string_forwarding_table_ = shared_isolate()->string_forwarding_table_;
+    DCHECK(has_shared_heap());
+    DCHECK(!is_shared());
+    DCHECK(!is_shared_space_isolate());
+    string_table_ = shared_heap_isolate()->string_table_;
+    string_forwarding_table_ = shared_heap_isolate()->string_forwarding_table_;
   }
 
   if (V8_SHORT_BUILTIN_CALLS_BOOL && v8_flags.short_builtin_calls) {
@@ -4278,9 +4311,14 @@ bool Isolate::Init(SnapshotData* startup_snapshot_data,
   }
 #ifdef V8_EXTERNAL_CODE_SPACE
   if (heap_.code_range()) {
-    code_cage_base_ = GetPtrComprCageBaseAddress(heap_.code_range()->base());
+    code_cage_base_ = ExternalCodeCompressionScheme::GetPtrComprCageBaseAddress(
+        heap_.code_range()->base());
   } else {
-    code_cage_base_ = cage_base();
+    CHECK(jitless_);
+    // In jitless mode the code space pages will be allocated in the main
+    // pointer compression cage.
+    code_cage_base_ =
+        ExternalCodeCompressionScheme::GetPtrComprCageBaseAddress(cage_base());
   }
 #endif  // V8_EXTERNAL_CODE_SPACE
 
@@ -4292,9 +4330,9 @@ bool Isolate::Init(SnapshotData* startup_snapshot_data,
     isolate_data_.shared_external_pointer_table_ = new ExternalPointerTable();
     shared_external_pointer_table().Init(this);
   } else {
-    DCHECK_NOT_NULL(shared_isolate());
+    DCHECK(has_shared_heap());
     isolate_data_.shared_external_pointer_table_ =
-        shared_isolate()->isolate_data_.shared_external_pointer_table_;
+        shared_heap_isolate()->isolate_data_.shared_external_pointer_table_;
   }
 #endif  // V8_COMPRESS_POINTERS
 
@@ -5937,6 +5975,7 @@ void Isolate::AttachToSharedIsolate() {
 
   if (shared_isolate_) {
     DCHECK(shared_isolate_->is_shared());
+    DCHECK(!v8_flags.shared_space);
     shared_isolate_->global_safepoint()->AppendClient(this);
   }
 
@@ -5949,6 +5988,7 @@ void Isolate::DetachFromSharedIsolate() {
   DCHECK(attached_to_shared_isolate_);
 
   if (shared_isolate_) {
+    DCHECK(!v8_flags.shared_space);
     shared_isolate_->global_safepoint()->RemoveClient(this);
     shared_isolate_ = nullptr;
   }
@@ -5962,6 +6002,7 @@ void Isolate::AttachToSharedSpaceIsolate(Isolate* shared_space_isolate) {
   DCHECK(!shared_space_isolate_.has_value());
   shared_space_isolate_ = shared_space_isolate;
   if (shared_space_isolate) {
+    DCHECK(v8_flags.shared_space);
     shared_space_isolate->global_safepoint()->AppendClient(this);
   }
 }
@@ -5970,6 +6011,7 @@ void Isolate::DetachFromSharedSpaceIsolate() {
   DCHECK(shared_space_isolate_.has_value());
   Isolate* shared_space_isolate = shared_space_isolate_.value();
   if (shared_space_isolate) {
+    DCHECK(v8_flags.shared_space);
     shared_space_isolate->global_safepoint()->RemoveClient(this);
   }
   shared_space_isolate_.reset();
@@ -5991,6 +6033,49 @@ ExternalPointerHandle Isolate::GetOrCreateWaiterQueueNodeExternalPointer() {
 }
 #endif  // V8_COMPRESS_POINTERS
 
+void Isolate::LocalsBlockListCacheSet(Handle<ScopeInfo> scope_info,
+                                      Handle<ScopeInfo> outer_scope_info,
+                                      Handle<StringSet> locals_blocklist) {
+  Handle<EphemeronHashTable> cache;
+  if (heap()->locals_block_list_cache().IsEphemeronHashTable()) {
+    cache = handle(EphemeronHashTable::cast(heap()->locals_block_list_cache()),
+                   this);
+  } else {
+    CHECK(heap()->locals_block_list_cache().IsUndefined());
+    constexpr int kInitialCapacity = 8;
+    cache = EphemeronHashTable::New(this, kInitialCapacity);
+  }
+  DCHECK(cache->IsEphemeronHashTable());
+
+  Handle<Object> value;
+  if (!outer_scope_info.is_null()) {
+    value = factory()->NewTuple2(outer_scope_info, locals_blocklist,
+                                 AllocationType::kYoung);
+  } else {
+    value = locals_blocklist;
+  }
+
+  CHECK(!value.is_null());
+  cache = EphemeronHashTable::Put(cache, scope_info, value);
+  heap()->set_locals_block_list_cache(*cache);
+}
+
+Object Isolate::LocalsBlockListCacheGet(Handle<ScopeInfo> scope_info) {
+  DisallowGarbageCollection no_gc;
+
+  if (!heap()->locals_block_list_cache().IsEphemeronHashTable()) {
+    return ReadOnlyRoots(this).the_hole_value();
+  }
+
+  Object maybe_value =
+      EphemeronHashTable::cast(heap()->locals_block_list_cache())
+          .Lookup(scope_info);
+  if (maybe_value.IsTuple2()) return Tuple2::cast(maybe_value).value2();
+
+  CHECK(maybe_value.IsStringSet() || maybe_value.IsTheHole());
+  return maybe_value;
+}
+
 namespace {
 class DefaultWasmAsyncResolvePromiseTask : public v8::Task {
  public:
diff --git a/deps/v8/src/execution/isolate.h b/deps/v8/src/execution/isolate.h
index 0fd3597f0cb17d..c25ad662bf3579 100644
--- a/deps/v8/src/execution/isolate.h
+++ b/deps/v8/src/execution/isolate.h
@@ -529,7 +529,6 @@ using DebugObjectCache = std::vector<Handle<HeapObject>>;
   V(bool, formatting_stack_trace, false)                                      \
   /* Perform side effect checks on function call and API callbacks. */        \
   V(DebugInfo::ExecutionMode, debug_execution_mode, DebugInfo::kBreakpoints)  \
-  V(debug::TypeProfileMode, type_profile_mode, debug::TypeProfileMode::kNone) \
   V(bool, disable_bytecode_flushing, false)                                   \
   V(int, last_console_context_id, 0)                                          \
   V(v8_inspector::V8Inspector*, inspector, nullptr)                           \
@@ -1431,10 +1430,6 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
     return is_precise_count_code_coverage() || is_block_count_code_coverage();
   }
 
-  bool is_collecting_type_profile() const {
-    return type_profile_mode() == debug::TypeProfileMode::kCollect;
-  }
-
   // Collect feedback vectors with data for code coverage or type profile.
   // Reset the list, when both code coverage and type profile are not
   // needed anymore. This keeps many feedback vectors alive, but code
@@ -1712,7 +1707,9 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
   // shared heap object cache holds objects in shared among Isolates. Otherwise
   // this object cache is per-Isolate like the startup object cache.
   std::vector<Object>* shared_heap_object_cache() {
-    if (shared_isolate()) return shared_isolate()->shared_heap_object_cache();
+    if (has_shared_heap()) {
+      return &shared_heap_isolate()->shared_heap_object_cache_;
+    }
     return &shared_heap_object_cache_;
   }
 
@@ -1996,10 +1993,29 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
     DCHECK(shared_isolate->is_shared());
     DCHECK_NULL(shared_isolate_);
     DCHECK(!attached_to_shared_isolate_);
+    DCHECK(!v8_flags.shared_space);
     shared_isolate_ = shared_isolate;
     owns_shareable_data_ = false;
   }
 
+  // Returns true when this isolate supports allocation in shared spaces.
+  bool has_shared_heap() const {
+    return v8_flags.shared_space ? shared_space_isolate() : shared_isolate();
+  }
+
+  // Returns the isolate that owns the shared spaces.
+  Isolate* shared_heap_isolate() const {
+    DCHECK(has_shared_heap());
+    Isolate* isolate =
+        v8_flags.shared_space ? shared_space_isolate() : shared_isolate();
+    DCHECK_NOT_NULL(isolate);
+    return isolate;
+  }
+
+  bool is_shared_heap_isolate() const {
+    return is_shared() || is_shared_space_isolate();
+  }
+
   GlobalSafepoint* global_safepoint() const { return global_safepoint_.get(); }
 
   bool owns_shareable_data() { return owns_shareable_data_; }
@@ -2009,7 +2025,8 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
   // TODO(pthier): Unify with owns_shareable_data() once the flag
   // --shared-string-table is removed.
   bool OwnsStringTables() {
-    return !v8_flags.shared_string_table || is_shared();
+    return !v8_flags.shared_string_table || is_shared() ||
+           is_shared_space_isolate();
   }
 
 #if USE_SIMULATOR
@@ -2020,6 +2037,16 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory {
   wasm::StackMemory*& wasm_stacks() { return wasm_stacks_; }
 #endif
 
+  // Access to the global "locals block list cache". Caches outer-stack
+  // allocated variables per ScopeInfo for debug-evaluate.
+  // We also store a strong reference to the outer ScopeInfo to keep all
+  // blocklists along a scope chain alive.
+  void LocalsBlockListCacheSet(Handle<ScopeInfo> scope_info,
+                               Handle<ScopeInfo> outer_scope_info,
+                               Handle<StringSet> locals_blocklist);
+  // Returns either `TheHole` or `StringSet`.
+  Object LocalsBlockListCacheGet(Handle<ScopeInfo> scope_info);
+
  private:
   explicit Isolate(std::unique_ptr<IsolateAllocator> isolate_allocator,
                    bool is_shared);
diff --git a/deps/v8/src/execution/local-isolate.cc b/deps/v8/src/execution/local-isolate.cc
index aa30289ae6a293..ff3cfc99eff732 100644
--- a/deps/v8/src/execution/local-isolate.cc
+++ b/deps/v8/src/execution/local-isolate.cc
@@ -60,11 +60,6 @@ int LocalIsolate::GetNextUniqueSharedFunctionInfoId() {
 }
 #endif  // V8_SFI_HAS_UNIQUE_ID
 
-bool LocalIsolate::is_collecting_type_profile() const {
-  // TODO(leszeks): Figure out if it makes sense to check this asynchronously.
-  return isolate_->is_collecting_type_profile();
-}
-
 // Used for lazy initialization, based on an assumption that most
 // LocalIsolates won't be used to parse any BigInt literals.
 void LocalIsolate::InitializeBigIntProcessor() {
diff --git a/deps/v8/src/execution/local-isolate.h b/deps/v8/src/execution/local-isolate.h
index 149b332ca752d6..f67bc7845295cd 100644
--- a/deps/v8/src/execution/local-isolate.h
+++ b/deps/v8/src/execution/local-isolate.h
@@ -106,8 +106,6 @@ class V8_EXPORT_PRIVATE LocalIsolate final : private HiddenLocalFactory {
   int GetNextUniqueSharedFunctionInfoId();
 #endif  // V8_SFI_HAS_UNIQUE_ID
 
-  bool is_collecting_type_profile() const;
-
   // TODO(cbruni): rename this back to logger() once the V8FileLogger
   // refactoring is completed.
   LocalLogger* v8_file_logger() const { return logger_.get(); }
diff --git a/deps/v8/src/execution/loong64/simulator-loong64.cc b/deps/v8/src/execution/loong64/simulator-loong64.cc
index f15015fcb68cf3..9e5f13b1e1fdca 100644
--- a/deps/v8/src/execution/loong64/simulator-loong64.cc
+++ b/deps/v8/src/execution/loong64/simulator-loong64.cc
@@ -45,42 +45,6 @@ uint32_t get_fcsr_condition_bit(uint32_t cc) {
   }
 }
 
-static int64_t MultiplyHighSigned(int64_t u, int64_t v) {
-  uint64_t u0, v0, w0;
-  int64_t u1, v1, w1, w2, t;
-
-  u0 = u & 0xFFFFFFFFL;
-  u1 = u >> 32;
-  v0 = v & 0xFFFFFFFFL;
-  v1 = v >> 32;
-
-  w0 = u0 * v0;
-  t = u1 * v0 + (w0 >> 32);
-  w1 = t & 0xFFFFFFFFL;
-  w2 = t >> 32;
-  w1 = u0 * v1 + w1;
-
-  return u1 * v1 + w2 + (w1 >> 32);
-}
-
-static uint64_t MultiplyHighUnsigned(uint64_t u, uint64_t v) {
-  uint64_t u0, v0, w0;
-  uint64_t u1, v1, w1, w2, t;
-
-  u0 = u & 0xFFFFFFFFL;
-  u1 = u >> 32;
-  v0 = v & 0xFFFFFFFFL;
-  v1 = v >> 32;
-
-  w0 = u0 * v0;
-  t = u1 * v0 + (w0 >> 32);
-  w1 = t & 0xFFFFFFFFL;
-  w2 = t >> 32;
-  w1 = u0 * v1 + w1;
-
-  return u1 * v1 + w2 + (w1 >> 32);
-}
-
 #ifdef PRINT_SIM_LOG
 inline void printf_instr(const char* _Format, ...) {
   va_list varList;
@@ -3793,13 +3757,13 @@ void Simulator::DecodeTypeOp17() {
       printf_instr("MULH_D\t %s: %016lx, %s, %016lx, %s, %016lx\n",
                    Registers::Name(rd_reg()), rd(), Registers::Name(rj_reg()),
                    rj(), Registers::Name(rk_reg()), rk());
-      SetResult(rd_reg(), MultiplyHighSigned(rj(), rk()));
+      SetResult(rd_reg(), base::bits::SignedMulHigh64(rj(), rk()));
       break;
     case MULH_DU:
       printf_instr("MULH_DU\t %s: %016lx, %s, %016lx, %s, %016lx\n",
                    Registers::Name(rd_reg()), rd(), Registers::Name(rj_reg()),
                    rj(), Registers::Name(rk_reg()), rk());
-      SetResult(rd_reg(), MultiplyHighUnsigned(rj_u(), rk_u()));
+      SetResult(rd_reg(), base::bits::UnsignedMulHigh64(rj_u(), rk_u()));
       break;
     case MULW_D_W: {
       printf_instr("MULW_D_W\t %s: %016lx, %s, %016lx, %s, %016lx\n",
diff --git a/deps/v8/src/execution/mips64/simulator-mips64.cc b/deps/v8/src/execution/mips64/simulator-mips64.cc
index b3149083ac8191..2dce655aede342 100644
--- a/deps/v8/src/execution/mips64/simulator-mips64.cc
+++ b/deps/v8/src/execution/mips64/simulator-mips64.cc
@@ -43,24 +43,6 @@ uint32_t get_fcsr_condition_bit(uint32_t cc) {
   }
 }
 
-static int64_t MultiplyHighSigned(int64_t u, int64_t v) {
-  uint64_t u0, v0, w0;
-  int64_t u1, v1, w1, w2, t;
-
-  u0 = u & 0xFFFFFFFFL;
-  u1 = u >> 32;
-  v0 = v & 0xFFFFFFFFL;
-  v1 = v >> 32;
-
-  w0 = u0 * v0;
-  t = u1 * v0 + (w0 >> 32);
-  w1 = t & 0xFFFFFFFFL;
-  w2 = t >> 32;
-  w1 = u0 * v1 + w1;
-
-  return u1 * v1 + w2 + (w1 >> 32);
-}
-
 // This macro provides a platform independent use of sscanf. The reason for
 // SScanF not being implemented in a platform independent was through
 // ::v8::internal::OS in the same way as base::SNPrintF is that the Windows C
@@ -4090,14 +4072,14 @@ void Simulator::DecodeTypeRegisterSPECIAL() {
     case DMULT:  // DMULT == D_MUL_MUH.
       if (kArchVariant != kMips64r6) {
         set_register(LO, rs() * rt());
-        set_register(HI, MultiplyHighSigned(rs(), rt()));
+        set_register(HI, base::bits::SignedMulHigh64(rs(), rt()));
       } else {
         switch (sa()) {
           case MUL_OP:
             SetResult(rd_reg(), rs() * rt());
             break;
           case MUH_OP:
-            SetResult(rd_reg(), MultiplyHighSigned(rs(), rt()));
+            SetResult(rd_reg(), base::bits::SignedMulHigh64(rs(), rt()));
             break;
           default:
             UNIMPLEMENTED_MIPS();
@@ -4106,7 +4088,12 @@ void Simulator::DecodeTypeRegisterSPECIAL() {
       }
       break;
     case DMULTU:
-      UNIMPLEMENTED_MIPS();
+      if (kArchVariant != kMips64r6) {
+        set_register(LO, rs_u() * rt_u());
+        set_register(HI, base::bits::UnsignedMulHigh64(rs_u(), rt_u()));
+      } else {
+        UNIMPLEMENTED_MIPS();
+      }
       break;
     case DIV:
     case DDIV: {
diff --git a/deps/v8/src/execution/ppc/frame-constants-ppc.cc b/deps/v8/src/execution/ppc/frame-constants-ppc.cc
index 757d20249e66fa..45a53b07b6d0ae 100644
--- a/deps/v8/src/execution/ppc/frame-constants-ppc.cc
+++ b/deps/v8/src/execution/ppc/frame-constants-ppc.cc
@@ -16,7 +16,7 @@ namespace internal {
 Register JavaScriptFrame::fp_register() { return v8::internal::fp; }
 Register JavaScriptFrame::context_register() { return cp; }
 Register JavaScriptFrame::constant_pool_pointer_register() {
-  DCHECK(v8_flags.enable_embedded_constant_pool);
+  DCHECK(V8_EMBEDDED_CONSTANT_POOL_BOOL);
   return kConstantPoolRegister;
 }
 
diff --git a/deps/v8/src/execution/ppc/frame-constants-ppc.h b/deps/v8/src/execution/ppc/frame-constants-ppc.h
index 6c82a864fe57c8..352d309379d421 100644
--- a/deps/v8/src/execution/ppc/frame-constants-ppc.h
+++ b/deps/v8/src/execution/ppc/frame-constants-ppc.h
@@ -16,9 +16,9 @@ namespace internal {
 class EntryFrameConstants : public AllStatic {
  public:
   // Need to take constant pool into account.
-  static constexpr int kCallerFPOffset =
-      v8_flags.enable_embedded_constant_pool.value() ? -4 * kSystemPointerSize
-                                                     : -3 * kSystemPointerSize;
+  static constexpr int kCallerFPOffset = V8_EMBEDDED_CONSTANT_POOL_BOOL
+                                             ? -4 * kSystemPointerSize
+                                             : -3 * kSystemPointerSize;
 };
 
 class WasmCompileLazyFrameConstants : public TypedFrameConstants {
diff --git a/deps/v8/src/execution/ppc/simulator-ppc.cc b/deps/v8/src/execution/ppc/simulator-ppc.cc
index 0177f2b784dd8b..cf4c11d6cb038f 100644
--- a/deps/v8/src/execution/ppc/simulator-ppc.cc
+++ b/deps/v8/src/execution/ppc/simulator-ppc.cc
@@ -2584,6 +2584,32 @@ void Simulator::ExecuteGeneric(Instruction* instr) {
       }
       break;
     }
+    case MULHD: {
+      int rt = instr->RTValue();
+      int ra = instr->RAValue();
+      int rb = instr->RBValue();
+      int64_t ra_val = get_register(ra);
+      int64_t rb_val = get_register(rb);
+      int64_t alu_out = base::bits::SignedMulHigh64(ra_val, rb_val);
+      set_register(rt, alu_out);
+      if (instr->Bit(0)) {  // RC bit set
+        SetCR0(static_cast<intptr_t>(alu_out));
+      }
+      break;
+    }
+    case MULHDU: {
+      int rt = instr->RTValue();
+      int ra = instr->RAValue();
+      int rb = instr->RBValue();
+      uint64_t ra_val = get_register(ra);
+      uint64_t rb_val = get_register(rb);
+      uint64_t alu_out = base::bits::UnsignedMulHigh64(ra_val, rb_val);
+      set_register(rt, alu_out);
+      if (instr->Bit(0)) {  // RC bit set
+        SetCR0(static_cast<intptr_t>(alu_out));
+      }
+      break;
+    }
     case NEGX: {
       int rt = instr->RTValue();
       int ra = instr->RAValue();
diff --git a/deps/v8/src/execution/riscv/simulator-riscv.cc b/deps/v8/src/execution/riscv/simulator-riscv.cc
index c97f77cc52c68f..334ce9fcf51362 100644
--- a/deps/v8/src/execution/riscv/simulator-riscv.cc
+++ b/deps/v8/src/execution/riscv/simulator-riscv.cc
@@ -867,7 +867,7 @@ struct type_sew_t<128> {
       double vs2 = vs2_is_widen                                                \
                        ? Rvvelt<double>(rvv_vs2_reg(), i)                      \
                        : static_cast<double>(Rvvelt<float>(rvv_vs2_reg(), i)); \
-      double vs3 = static_cast<double>(Rvvelt<float>(rvv_vd_reg(), i));        \
+      double vs3 = Rvvelt<double>(rvv_vd_reg(), i);                            \
       BODY32;                                                                  \
       break;                                                                   \
     }                                                                          \
@@ -892,7 +892,7 @@ struct type_sew_t<128> {
                        ? static_cast<double>(Rvvelt<double>(rvv_vs2_reg(), i)) \
                        : static_cast<double>(Rvvelt<float>(rvv_vs2_reg(), i)); \
       double vs1 = static_cast<double>(Rvvelt<float>(rvv_vs1_reg(), i));       \
-      double vs3 = static_cast<double>(Rvvelt<float>(rvv_vd_reg(), i));        \
+      double vs3 = Rvvelt<double>(rvv_vd_reg(), i);                            \
       BODY32;                                                                  \
       break;                                                                   \
     }                                                                          \
@@ -6861,7 +6861,7 @@ void Simulator::DecodeRvvFVV() {
         }
         case E32: {
           double& vd = Rvvelt<double>(rvv_vd_reg(), 0, true);
-          float vs1 = Rvvelt<float>(rvv_vs1_reg(), 0);
+          double vs1 = Rvvelt<double>(rvv_vs1_reg(), 0);
           double alu_out = vs1;
           for (uint64_t i = rvv_vstart(); i < rvv_vl(); ++i) {
             double vs2 = static_cast<double>(Rvvelt<float>(rvv_vs2_reg(), i));
@@ -6921,19 +6921,19 @@ void Simulator::DecodeRvvFVV() {
       break;
     case RO_V_VFWMACC_VV:
       RVV_VI_CHECK_DSS(true);
-      RVV_VI_VFP_VV_LOOP_WIDEN({RVV_VI_VFP_FMA(float, vs2, vs1, vs3)}, false)
+      RVV_VI_VFP_VV_LOOP_WIDEN({RVV_VI_VFP_FMA(double, vs2, vs1, vs3)}, false)
       break;
     case RO_V_VFWNMACC_VV:
       RVV_VI_CHECK_DSS(true);
-      RVV_VI_VFP_VV_LOOP_WIDEN({RVV_VI_VFP_FMA(float, -vs2, vs1, -vs3)}, false)
+      RVV_VI_VFP_VV_LOOP_WIDEN({RVV_VI_VFP_FMA(double, -vs2, vs1, -vs3)}, false)
       break;
     case RO_V_VFWMSAC_VV:
       RVV_VI_CHECK_DSS(true);
-      RVV_VI_VFP_VV_LOOP_WIDEN({RVV_VI_VFP_FMA(float, vs2, vs1, -vs3)}, false)
+      RVV_VI_VFP_VV_LOOP_WIDEN({RVV_VI_VFP_FMA(double, vs2, vs1, -vs3)}, false)
       break;
     case RO_V_VFWNMSAC_VV:
       RVV_VI_CHECK_DSS(true);
-      RVV_VI_VFP_VV_LOOP_WIDEN({RVV_VI_VFP_FMA(float, -vs2, vs1, +vs3)}, false)
+      RVV_VI_VFP_VV_LOOP_WIDEN({RVV_VI_VFP_FMA(double, -vs2, vs1, +vs3)}, false)
       break;
     case RO_V_VFMV_FS:
       switch (rvv_vsew()) {
@@ -7071,19 +7071,19 @@ void Simulator::DecodeRvvFVF() {
       break;
     case RO_V_VFWMACC_VF:
       RVV_VI_CHECK_DSS(true);
-      RVV_VI_VFP_VF_LOOP_WIDEN({RVV_VI_VFP_FMA(float, vs2, fs1, vs3)}, false)
+      RVV_VI_VFP_VF_LOOP_WIDEN({RVV_VI_VFP_FMA(double, vs2, fs1, vs3)}, false)
       break;
     case RO_V_VFWNMACC_VF:
       RVV_VI_CHECK_DSS(true);
-      RVV_VI_VFP_VF_LOOP_WIDEN({RVV_VI_VFP_FMA(float, -vs2, fs1, -vs3)}, false)
+      RVV_VI_VFP_VF_LOOP_WIDEN({RVV_VI_VFP_FMA(double, -vs2, fs1, -vs3)}, false)
       break;
     case RO_V_VFWMSAC_VF:
       RVV_VI_CHECK_DSS(true);
-      RVV_VI_VFP_VF_LOOP_WIDEN({RVV_VI_VFP_FMA(float, vs2, fs1, -vs3)}, false)
+      RVV_VI_VFP_VF_LOOP_WIDEN({RVV_VI_VFP_FMA(double, vs2, fs1, -vs3)}, false)
       break;
     case RO_V_VFWNMSAC_VF:
       RVV_VI_CHECK_DSS(true);
-      RVV_VI_VFP_VF_LOOP_WIDEN({RVV_VI_VFP_FMA(float, -vs2, fs1, vs3)}, false)
+      RVV_VI_VFP_VF_LOOP_WIDEN({RVV_VI_VFP_FMA(double, -vs2, fs1, vs3)}, false)
       break;
     default:
       UNSUPPORTED_RISCV();
diff --git a/deps/v8/src/execution/s390/simulator-s390.cc b/deps/v8/src/execution/s390/simulator-s390.cc
index 66fe039cb3e0f6..4d4a0bbf395872 100644
--- a/deps/v8/src/execution/s390/simulator-s390.cc
+++ b/deps/v8/src/execution/s390/simulator-s390.cc
@@ -1291,6 +1291,8 @@ void Simulator::EvalTableInit() {
   EvalTable[LLGCR] = &Simulator::Evaluate_LLGCR;
   EvalTable[LLGHR] = &Simulator::Evaluate_LLGHR;
   EvalTable[MLGR] = &Simulator::Evaluate_MLGR;
+  EvalTable[MGRK] = &Simulator::Evaluate_MGRK;
+  EvalTable[MG] = &Simulator::Evaluate_MG;
   EvalTable[DLGR] = &Simulator::Evaluate_DLGR;
   EvalTable[ALCGR] = &Simulator::Evaluate_ALCGR;
   EvalTable[SLBGR] = &Simulator::Evaluate_SLBGR;
@@ -8744,7 +8746,37 @@ EVALUATE(LLGHR) {
   return length;
 }
 
+EVALUATE(MG) {
+  UNIMPLEMENTED();
+  USE(instr);
+  return 0;
+}
+
+EVALUATE(MGRK) {
+  DCHECK_OPCODE(MGRK);
+  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
+  // 64-bit Non-clobbering arithmetics / bitwise ops.
+  int64_t r2_val = get_register(r2);
+  int64_t r3_val = get_register(r3);
+  set_register(r1, base::bits::SignedMulHigh64(r2_val, r3_val));
+  set_register(r1 + 1, r2_val * r3_val);
+  return length;
+}
+
 EVALUATE(MLGR) {
+  DCHECK_OPCODE(MLGR);
+  DECODE_RRE_INSTRUCTION(r1, r2);
+  // 64-bit Non-clobbering unsigned arithmetics
+  CHECK_EQ(r1 % 2, 0);
+  uint64_t r1_plus_1_val = get_register(r1 + 1);
+  uint64_t r2_val = get_register(r2);
+
+  set_register(r1, base::bits::UnsignedMulHigh64(r2_val, r1_plus_1_val));
+  set_register(r1 + 1, r2_val * r1_plus_1_val);
+  return length;
+}
+
+EVALUATE(MLG) {
   UNIMPLEMENTED();
   USE(instr);
   return 0;
@@ -9957,12 +9989,6 @@ EVALUATE(LGAT) {
   return 0;
 }
 
-EVALUATE(MLG) {
-  UNIMPLEMENTED();
-  USE(instr);
-  return 0;
-}
-
 EVALUATE(DLG) {
   DCHECK_OPCODE(DLG);
 #ifdef V8_TARGET_ARCH_S390X
diff --git a/deps/v8/src/execution/s390/simulator-s390.h b/deps/v8/src/execution/s390/simulator-s390.h
index 399207725f69c0..b7ccf1007cd7ab 100644
--- a/deps/v8/src/execution/s390/simulator-s390.h
+++ b/deps/v8/src/execution/s390/simulator-s390.h
@@ -1205,6 +1205,9 @@ class Simulator : public SimulatorBase {
   EVALUATE(CZXT);
   EVALUATE(CDZT);
   EVALUATE(CXZT);
+  EVALUATE(MG);
+  EVALUATE(MGRK);
+
 #undef EVALUATE
 };
 
diff --git a/deps/v8/src/execution/tiering-manager.cc b/deps/v8/src/execution/tiering-manager.cc
index 7da8359550b4c6..a18463e7ec4a0d 100644
--- a/deps/v8/src/execution/tiering-manager.cc
+++ b/deps/v8/src/execution/tiering-manager.cc
@@ -11,12 +11,14 @@
 #include "src/codegen/compilation-cache.h"
 #include "src/codegen/compiler.h"
 #include "src/codegen/pending-optimization-table.h"
+#include "src/common/globals.h"
 #include "src/diagnostics/code-tracer.h"
 #include "src/execution/execution.h"
 #include "src/execution/frames-inl.h"
 #include "src/handles/global-handles.h"
 #include "src/init/bootstrapper.h"
 #include "src/interpreter/interpreter.h"
+#include "src/objects/code-kind.h"
 #include "src/objects/code.h"
 #include "src/tracing/trace-event.h"
 
@@ -261,7 +263,7 @@ void TieringManager::RequestOsrAtNextOpportunity(JSFunction function) {
 }
 
 void TieringManager::MaybeOptimizeFrame(JSFunction function,
-                                        CodeKind code_kind) {
+                                        CodeKind calling_code_kind) {
   const TieringState tiering_state = function.feedback_vector().tiering_state();
   const TieringState osr_tiering_state =
       function.feedback_vector().osr_tiering_state();
@@ -288,24 +290,15 @@ void TieringManager::MaybeOptimizeFrame(JSFunction function,
     // Continue below and do a normal optimized compile as well.
   }
 
-  const bool is_marked_for_any_optimization =
-      (static_cast<uint32_t>(tiering_state) & kNoneOrInProgressMask) != 0;
   // Baseline OSR uses a separate mechanism and must not be considered here,
   // therefore we limit to kOptimizedJSFunctionCodeKindsMask.
   // TODO(v8:7700): Change the condition below for Maglev OSR once it is
   // implemented.
-  if (is_marked_for_any_optimization ||
-      function.HasAvailableHigherTierCodeThanWithFilter(
-          code_kind, kOptimizedJSFunctionCodeKindsMask)) {
+  if (IsRequestTurbofan(tiering_state) ||
+      function.HasAvailableCodeKind(CodeKind::TURBOFAN)) {
     // OSR kicks in only once we've previously decided to tier up, but we are
-    // still in the lower-tier frame (this implies a long-running loop).
-    //
-    // TODO(v8:7700): In the presence of Maglev, OSR is triggered much earlier
-    // than with the old pipeline since we tier up to Maglev earlier which
-    // affects both conditions above. This *seems* fine (when stuck in a loop
-    // we want to tier up, regardless of the active tier), but we may want to
-    // think about this again at some point.
-    if (SmallEnoughForOSR(isolate_, function, code_kind)) {
+    // still in a lower-tier frame (this implies a long-running loop).
+    if (SmallEnoughForOSR(isolate_, function, calling_code_kind)) {
       TryIncrementOsrUrgency(isolate_, function);
     }
 
@@ -314,20 +307,33 @@ void TieringManager::MaybeOptimizeFrame(JSFunction function,
     return;
   }
 
-  DCHECK(!is_marked_for_any_optimization &&
-         !function.HasAvailableHigherTierCodeThanWithFilter(
-             code_kind, kOptimizedJSFunctionCodeKindsMask));
-  OptimizationDecision d = ShouldOptimize(function, code_kind);
+  DCHECK(!IsRequestTurbofan(tiering_state));
+  DCHECK(!function.HasAvailableCodeKind(CodeKind::TURBOFAN));
+  OptimizationDecision d = ShouldOptimize(function, calling_code_kind);
+  // We might be stuck in a baseline frame that wants to tier up to Maglev, but
+  // is in a loop, and can't OSR, because Maglev doesn't have OSR. Allow it to
+  // skip over Maglev by re-checking ShouldOptimize as if we were in Maglev.
+  // TODO(v8:7700): Remove this when Maglev can OSR.
+  static_assert(!CodeKindCanOSR(CodeKind::MAGLEV));
+  if (d.should_optimize() && d.code_kind == CodeKind::MAGLEV) {
+    bool is_marked_for_maglev_optimization =
+        IsRequestMaglev(tiering_state) ||
+        function.HasAvailableCodeKind(CodeKind::MAGLEV);
+    if (is_marked_for_maglev_optimization) {
+      d = ShouldOptimize(function, CodeKind::MAGLEV);
+    }
+  }
+
   if (d.should_optimize()) Optimize(function, d);
 }
 
-OptimizationDecision TieringManager::ShouldOptimize(JSFunction function,
-                                                    CodeKind code_kind) {
-  if (TiersUpToMaglev(code_kind) &&
+OptimizationDecision TieringManager::ShouldOptimize(
+    JSFunction function, CodeKind calling_code_kind) {
+  if (TiersUpToMaglev(calling_code_kind) &&
       function.shared().PassesFilter(v8_flags.maglev_filter) &&
       !function.shared(isolate_).maglev_compilation_failed()) {
     return OptimizationDecision::Maglev();
-  } else if (code_kind == CodeKind::TURBOFAN) {
+  } else if (calling_code_kind == CodeKind::TURBOFAN) {
     // Already in the top tier.
     return OptimizationDecision::DoNotOptimize();
   }
diff --git a/deps/v8/src/flags/flag-definitions.h b/deps/v8/src/flags/flag-definitions.h
index 16f796d43d0b0a..c31a38930475db 100644
--- a/deps/v8/src/flags/flag-definitions.h
+++ b/deps/v8/src/flags/flag-definitions.h
@@ -225,26 +225,28 @@ DEFINE_BOOL(harmony_shipping, true, "enable all shipped harmony features")
 #define HARMONY_INPROGRESS_BASE(V)                                             \
   V(harmony_weak_refs_with_cleanup_some,                                       \
     "harmony weak references with FinalizationRegistry.prototype.cleanupSome") \
-  V(harmony_import_assertions, "harmony import assertions")                    \
   V(harmony_temporal, "Temporal")                                              \
   V(harmony_shadow_realm, "harmony ShadowRealm")                               \
   V(harmony_struct, "harmony structs, shared structs, and shared arrays")      \
-  V(harmony_change_array_by_copy, "harmony change-Array-by-copy")              \
-  V(harmony_regexp_unicode_sets, "harmony RegExp Unicode Sets")
+  V(harmony_regexp_unicode_sets, "harmony RegExp Unicode Sets")                \
+  V(harmony_json_parse_with_source, "harmony json parse with source")
 
 #ifdef V8_INTL_SUPPORT
-#define HARMONY_INPROGRESS(V) \
-  HARMONY_INPROGRESS_BASE(V)  \
-  V(harmony_intl_best_fit_matcher, "Intl BestFitMatcher")
+#define HARMONY_INPROGRESS(V)                             \
+  HARMONY_INPROGRESS_BASE(V)                              \
+  V(harmony_intl_best_fit_matcher, "Intl BestFitMatcher") \
+  V(harmony_intl_duration_format, "Intl DurationFormat API")
 #else
 #define HARMONY_INPROGRESS(V) HARMONY_INPROGRESS_BASE(V)
 #endif
 
 // Features that are complete (but still behind the --harmony flag).
-#define HARMONY_STAGED_BASE(V)                        \
-  V(harmony_array_grouping, "harmony array grouping") \
-  V(harmony_rab_gsab,                                 \
-    "harmony ResizableArrayBuffer / GrowableSharedArrayBuffer")
+#define HARMONY_STAGED_BASE(V)                                    \
+  V(harmony_rab_gsab,                                             \
+    "harmony ResizableArrayBuffer / GrowableSharedArrayBuffer")   \
+  V(harmony_array_grouping, "harmony array grouping")             \
+  V(harmony_change_array_by_copy, "harmony change-Array-by-copy") \
+  V(harmony_symbol_as_weakmap_key, "harmony symbols as weakmap keys")
 
 #ifdef V8_INTL_SUPPORT
 #define HARMONY_STAGED(V) HARMONY_STAGED_BASE(V)
@@ -257,7 +259,8 @@ DEFINE_BOOL(harmony_shipping, true, "enable all shipped harmony features")
   V(harmony_sharedarraybuffer, "harmony sharedarraybuffer")           \
   V(harmony_atomics, "harmony atomics")                               \
   V(harmony_class_static_blocks, "harmony static initializer blocks") \
-  V(harmony_array_find_last, "harmony array find last helpers")
+  V(harmony_array_find_last, "harmony array find last helpers")       \
+  V(harmony_import_assertions, "harmony import assertions")
 
 #ifdef V8_INTL_SUPPORT
 #define HARMONY_SHIPPING(V) \
@@ -453,7 +456,7 @@ DEFINE_BOOL(future, FUTURE_BOOL,
 DEFINE_BOOL(maglev, false, "enable the maglev optimizing compiler")
 DEFINE_BOOL(maglev_inlining, false,
             "enable inlining in the maglev optimizing compiler")
-DEFINE_BOOL(maglev_reuse_stack_slots, false,
+DEFINE_BOOL(maglev_reuse_stack_slots, true,
             "reuse stack slots in the maglev optimizing compiler")
 
 // We stress maglev by setting a very low interrupt budget for maglev. This
@@ -475,6 +478,11 @@ DEFINE_BOOL(print_maglev_code, false, "print maglev code")
 DEFINE_BOOL(trace_maglev_graph_building, false, "trace maglev graph building")
 DEFINE_BOOL(trace_maglev_regalloc, false, "trace maglev register allocation")
 
+// TODO(v8:7700): Remove once stable.
+DEFINE_BOOL(maglev_function_context_specialization, true,
+            "enable function context specialization in maglev")
+DEFINE_BOOL(maglev_ool_prologue, false, "use the Maglev out of line prologue")
+
 #if ENABLE_SPARKPLUG
 DEFINE_WEAK_IMPLICATION(future, sparkplug)
 DEFINE_WEAK_IMPLICATION(future, flush_baseline_code)
@@ -958,9 +966,20 @@ DEFINE_FLOAT(script_delay_fraction, 0.0,
              "busy wait after each Script::Run by the given fraction of the "
              "run's duration")
 
-DEFINE_BOOL(turboshaft, false, "enable TurboFan's Turboshaft phases")
+DEFINE_BOOL(turboshaft, false, "enable TurboFan's Turboshaft phases for JS")
+DEFINE_WEAK_IMPLICATION(future, turboshaft)
 DEFINE_BOOL(turboshaft_trace_reduction, false,
             "trace individual Turboshaft reduction steps")
+DEFINE_BOOL(turboshaft_wasm, false,
+            "enable TurboFan's Turboshaft phases for wasm")
+#ifdef DEBUG
+DEFINE_UINT64(turboshaft_opt_bisect_limit, std::numeric_limits<uint64_t>::max(),
+              "stop applying optional optimizations after a specified number "
+              "of steps, useful for bisecting optimization bugs")
+DEFINE_UINT64(turboshaft_opt_bisect_break, std::numeric_limits<uint64_t>::max(),
+              "abort after a specified number of steps, useful for bisecting "
+              "optimization bugs")
+#endif  // DEBUG
 
 // Favor memory over execution speed.
 DEFINE_BOOL(optimize_for_size, false,
@@ -1093,7 +1112,10 @@ FOREACH_WASM_FEATURE_FLAG(DECL_WASM_FLAG)
 
 DEFINE_IMPLICATION(experimental_wasm_gc, experimental_wasm_typed_funcref)
 
-DEFINE_BOOL(wasm_gc_js_interop, false, "experimental WasmGC-JS interop")
+DEFINE_IMPLICATION(experimental_wasm_stack_switching,
+                   experimental_wasm_type_reflection)
+
+DEFINE_BOOL(wasm_gc_js_interop, true, "experimental WasmGC-JS interop")
 
 DEFINE_BOOL(wasm_staging, false, "enable staged wasm features")
 
@@ -1127,12 +1149,8 @@ DEFINE_BOOL(trace_wasm_inlining, false, "trace wasm inlining")
 DEFINE_BOOL(trace_wasm_speculative_inlining, false,
             "trace wasm speculative inlining")
 DEFINE_BOOL(trace_wasm_typer, false, "trace wasm typer")
-DEFINE_BOOL(wasm_type_canonicalization, false,
-            "apply isorecursive canonicalization on wasm types")
 DEFINE_IMPLICATION(wasm_speculative_inlining, wasm_inlining)
 DEFINE_WEAK_IMPLICATION(experimental_wasm_gc, wasm_speculative_inlining)
-DEFINE_WEAK_IMPLICATION(experimental_wasm_typed_funcref,
-                        wasm_type_canonicalization)
 
 DEFINE_BOOL(wasm_loop_unrolling, true,
             "enable loop unrolling for wasm functions")
@@ -1224,6 +1242,8 @@ DEFINE_BOOL(global_gc_scheduling, true,
 DEFINE_BOOL(gc_global, false, "always perform global GCs")
 DEFINE_BOOL(shared_space, false,
             "Implement shared heap as shared space on a main isolate.")
+// Don't use a map space with --shared-space in order to avoid shared map space.
+DEFINE_NEG_IMPLICATION(shared_space, use_map_space)
 
 // TODO(12950): The next two flags only have an effect if
 // V8_ENABLE_ALLOCATION_TIMEOUT is set, so we should only define them in that
@@ -1399,9 +1419,9 @@ DEFINE_BOOL(compact, true,
             "Perform compaction on full GCs based on V8's default heuristics")
 DEFINE_BOOL(compact_code_space, true,
             "Perform code space compaction on full collections.")
-DEFINE_BOOL(compact_maps, false,
+DEFINE_BOOL(compact_maps, true,
             "Perform compaction on maps on full collections.")
-DEFINE_BOOL(use_map_space, true, "Use separate space for maps.")
+DEFINE_BOOL(use_map_space, false, "Use separate space for maps.")
 // Without a map space we have to compact maps.
 DEFINE_NEG_VALUE_IMPLICATION(use_map_space, compact_maps, true)
 DEFINE_BOOL(compact_on_every_full_gc, false,
@@ -1685,15 +1705,20 @@ DEFINE_BOOL(
     trace_side_effect_free_debug_evaluate, false,
     "print debug messages for side-effect-free debug-evaluate for testing")
 DEFINE_BOOL(hard_abort, true, "abort by crashing")
+DEFINE_NEG_IMPLICATION(fuzzing, hard_abort)
 
 DEFINE_BOOL(experimental_async_stack_tagging_api, true,
             "enable experimental async stacks tagging API")
 DEFINE_BOOL(experimental_value_unavailable, false,
             "enable experimental <value unavailable> in scopes")
+DEFINE_BOOL(experimental_reuse_locals_blocklists, false,
+            "enable reuse of local blocklists across multiple debug-evaluates")
 
 DEFINE_BOOL(
     live_edit_top_frame, true,
     "enable support for live-editing the top-most function on the stack")
+DEFINE_BOOL(experimental_remove_internal_scopes_property, true,
+            "don't report the artificial [[Scopes]] property for functions")
 
 // disassembler
 DEFINE_BOOL(log_colour, ENABLE_LOG_COLOUR,
@@ -1973,11 +1998,14 @@ DEFINE_BOOL(trace_minor_mc_parallel_marking, false,
             "trace parallel marking for the young generation")
 DEFINE_BOOL(minor_mc, false, "perform young generation mark compact GCs")
 DEFINE_IMPLICATION(minor_mc, separate_gc_phases)
-DEFINE_BOOL(concurrent_minor_mc, false,
-            "perform young generation mark compact GCs concurrently")
-DEFINE_NEG_NEG_IMPLICATION(concurrent_marking, concurrent_minor_mc)
-DEFINE_IMPLICATION(concurrent_minor_mc, minor_mc)
-DEFINE_IMPLICATION(concurrent_minor_mc, concurrent_marking)
+
+DEFINE_BOOL(concurrent_minor_mc_marking, false,
+            "perform young generation marking concurrently")
+DEFINE_NEG_NEG_IMPLICATION(concurrent_marking, concurrent_minor_mc_marking)
+
+DEFINE_BOOL(concurrent_minor_mc_sweeping, false,
+            "perform young generation sweeping concurrently")
+DEFINE_NEG_NEG_IMPLICATION(concurrent_sweeping, concurrent_minor_mc_sweeping)
 
 //
 // Dev shell flags
@@ -2216,12 +2244,15 @@ DEFINE_BOOL(interpreted_frames_native_stack, false,
             "Show interpreted frames on the native stack (useful for external "
             "profilers).")
 
+#if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
 DEFINE_BOOL(enable_etw_stack_walking, false,
             "Enable etw stack walking for windows")
+DEFINE_WEAK_IMPLICATION(future, enable_etw_stack_walking)
 // Don't move code objects.
 DEFINE_NEG_IMPLICATION(enable_etw_stack_walking, compact_code_space)
-#ifndef V8_TARGET_ARCH_ARM
-DEFINE_IMPLICATION(enable_etw_stack_walking, interpreted_frames_native_stack)
+#else
+DEFINE_BOOL_READONLY(enable_etw_stack_walking, false,
+                     "Enable etw stack walking for windows")
 #endif
 
 //
@@ -2335,16 +2366,6 @@ DEFINE_IMPLICATION(verify_predictable, predictable)
 DEFINE_INT(dump_allocations_digest_at_alloc, -1,
            "dump allocations digest each n-th allocation")
 
-//
-// Read-only flags
-//
-#undef FLAG
-#define FLAG FLAG_READONLY
-
-// assembler.h
-DEFINE_BOOL(enable_embedded_constant_pool, V8_EMBEDDED_CONSTANT_POOL,
-            "enable use of embedded constant pools (PPC only)")
-
 // Cleanup...
 #undef FLAG_FULL
 #undef FLAG_READONLY
diff --git a/deps/v8/src/handles/global-handles.cc b/deps/v8/src/handles/global-handles.cc
index 40051df972b3a8..d5958fae0ed740 100644
--- a/deps/v8/src/handles/global-handles.cc
+++ b/deps/v8/src/handles/global-handles.cc
@@ -292,6 +292,7 @@ void GlobalHandles::NodeSpace<NodeType>::Release(NodeType* node) {
 
 template <class NodeType>
 void GlobalHandles::NodeSpace<NodeType>::Free(NodeType* node) {
+  CHECK(node->IsInUse());
   node->Release(first_free_);
   first_free_ = node;
   BlockType* block = BlockType::From(node);
@@ -730,14 +731,13 @@ void GlobalHandles::TracedNode::Verify(const Address* const* slot) {
   const TracedNode* node = FromLocation(*slot);
   auto* global_handles = GlobalHandles::From(node);
   DCHECK(node->IsInUse());
-  auto* incremental_marking =
-      global_handles->isolate()->heap()->incremental_marking();
+  Heap* heap = global_handles->isolate()->heap();
+  auto* incremental_marking = heap->incremental_marking();
   if (incremental_marking && incremental_marking->IsMarking()) {
     Object object = node->object();
     if (object.IsHeapObject()) {
       DCHECK_IMPLIES(node->markbit<AccessMode::ATOMIC>(),
-                     !incremental_marking->marking_state()->IsWhite(
-                         HeapObject::cast(object)));
+                     !heap->marking_state()->IsWhite(HeapObject::cast(object)));
     }
   }
   DCHECK_IMPLIES(ObjectInYoungGeneration(node->object()),
@@ -817,7 +817,7 @@ Handle<Object> GlobalHandles::CopyGlobal(Address* location) {
   GlobalHandles* global_handles =
       Node::FromLocation(location)->global_handles();
 #ifdef VERIFY_HEAP
-  if (i::FLAG_verify_heap) {
+  if (v8_flags.verify_heap) {
     Object(*location).ObjectVerify(global_handles->isolate());
   }
 #endif  // VERIFY_HEAP
@@ -847,7 +847,7 @@ void GlobalHandles::CopyTracedReference(const Address* const* from,
   TracedNode::Verify(from);
   TracedNode::Verify(to);
 #ifdef VERIFY_HEAP
-  if (i::FLAG_verify_heap) {
+  if (v8_flags.verify_heap) {
     Object(**to).ObjectVerify(global_handles->isolate());
   }
 #endif  // VERIFY_HEAP
@@ -931,17 +931,26 @@ void GlobalHandles::Destroy(Address* location) {
 
 // static
 void GlobalHandles::DestroyTracedReference(Address* location) {
-  if (location != nullptr) {
-    TracedNode* node = TracedNode::FromLocation(location);
-    auto* global_handles = GlobalHandles::From(node);
-    // When marking is off the handle may be freed immediately. Note that this
-    // includes also the case when invoking the first pass callbacks during the
-    // atomic pause which requires releasing a node fully.
-    if (!global_handles->is_marking_) {
-      NodeSpace<TracedNode>::Release(node);
-      return;
-    }
+  if (!location) return;
 
+  TracedNode* node = TracedNode::FromLocation(location);
+  auto* global_handles = GlobalHandles::From(node);
+  DCHECK_IMPLIES(global_handles->is_marking_,
+                 !global_handles->is_sweeping_on_mutator_thread_);
+  DCHECK_IMPLIES(global_handles->is_sweeping_on_mutator_thread_,
+                 !global_handles->is_marking_);
+
+  // If sweeping on the mutator thread is running then the handle destruction
+  // may be a result of a Reset() call from a destructor. The node will be
+  // reclaimed on the next cycle.
+  //
+  // This allows v8::TracedReference::Reset() calls from destructors on
+  // objects that may be used from stack and heap.
+  if (global_handles->is_sweeping_on_mutator_thread_) {
+    return;
+  }
+
+  if (global_handles->is_marking_) {
     // Incremental marking is on. This also covers the scavenge case which
     // prohibits eagerly reclaiming nodes when marking is on during a scavenge.
     //
@@ -950,7 +959,13 @@ void GlobalHandles::DestroyTracedReference(Address* location) {
     // marked. Eagerly clear out the object here to avoid needlessly marking it
     // from this point on. The node will be reclaimed on the next cycle.
     node->clear_object();
+    return;
   }
+
+  // In case marking and sweeping are off, the handle may be freed immediately.
+  // Note that this includes also the case when invoking the first pass
+  // callbacks during the atomic pause which requires releasing a node fully.
+  NodeSpace<TracedNode>::Release(node);
 }
 
 using GenericCallback = v8::WeakCallbackInfo<void>::Callback;
@@ -1022,7 +1037,7 @@ void GlobalHandles::IterateWeakRootsForPhantomHandles(
 
 void GlobalHandles::ComputeWeaknessForYoungObjects(
     WeakSlotCallback is_unmodified) {
-  if (!FLAG_reclaim_unmodified_wrappers) return;
+  if (!v8_flags.reclaim_unmodified_wrappers) return;
 
   // Treat all objects as roots during incremental marking to avoid corrupting
   // marking worklists.
@@ -1068,7 +1083,7 @@ void GlobalHandles::ProcessWeakYoungObjects(
     }
   }
 
-  if (!FLAG_reclaim_unmodified_wrappers) return;
+  if (!v8_flags.reclaim_unmodified_wrappers) return;
 
   auto* const handler = isolate()->heap()->GetEmbedderRootsHandler();
   for (TracedNode* node : traced_young_nodes_) {
@@ -1220,7 +1235,7 @@ void GlobalHandles::PostGarbageCollectionProcessing(
   DCHECK_EQ(Heap::NOT_IN_GC, isolate_->heap()->gc_state());
 
   const bool synchronous_second_pass =
-      FLAG_optimize_for_size || FLAG_predictable ||
+      v8_flags.optimize_for_size || v8_flags.predictable ||
       isolate_->heap()->IsTearingDown() ||
       (gc_callback_flags &
        (kGCCallbackFlagForced | kGCCallbackFlagCollectAllAvailableGarbage |
diff --git a/deps/v8/src/handles/global-handles.h b/deps/v8/src/handles/global-handles.h
index 47a921a1e1e6f7..7ab929f9ca567b 100644
--- a/deps/v8/src/handles/global-handles.h
+++ b/deps/v8/src/handles/global-handles.h
@@ -165,6 +165,13 @@ class V8_EXPORT_PRIVATE GlobalHandles final {
 
   void IterateAllRootsForTesting(v8::PersistentHandleVisitor* v);
 
+  void NotifyStartSweepingOnMutatorThread() {
+    is_sweeping_on_mutator_thread_ = true;
+  }
+  void NotifyEndSweepingOnMutatorThread() {
+    is_sweeping_on_mutator_thread_ = false;
+  }
+
 #ifdef DEBUG
   void PrintStats();
   void Print();
@@ -198,6 +205,7 @@ class V8_EXPORT_PRIVATE GlobalHandles final {
 
   Isolate* const isolate_;
   bool is_marking_ = false;
+  bool is_sweeping_on_mutator_thread_ = false;
 
   std::unique_ptr<NodeSpace<Node>> regular_nodes_;
   // Contains all nodes holding young objects. Note: when the list
diff --git a/deps/v8/src/handles/handles-inl.h b/deps/v8/src/handles/handles-inl.h
index 43c2ef807ea58b..e47ee146bff615 100644
--- a/deps/v8/src/handles/handles-inl.h
+++ b/deps/v8/src/handles/handles-inl.h
@@ -115,7 +115,7 @@ HandleScope& HandleScope::operator=(HandleScope&& other) V8_NOEXCEPT {
 void HandleScope::CloseScope(Isolate* isolate, Address* prev_next,
                              Address* prev_limit) {
 #ifdef DEBUG
-  int before = FLAG_check_handle_count ? NumberOfHandles(isolate) : 0;
+  int before = v8_flags.check_handle_count ? NumberOfHandles(isolate) : 0;
 #endif
   DCHECK_NOT_NULL(isolate);
   HandleScopeData* current = isolate->handle_scope_data();
@@ -136,7 +136,7 @@ void HandleScope::CloseScope(Isolate* isolate, Address* prev_next,
       static_cast<size_t>(reinterpret_cast<Address>(limit) -
                           reinterpret_cast<Address>(current->next)));
 #ifdef DEBUG
-  int after = FLAG_check_handle_count ? NumberOfHandles(isolate) : 0;
+  int after = v8_flags.check_handle_count ? NumberOfHandles(isolate) : 0;
   DCHECK_LT(after - before, kCheckHandleThreshold);
   DCHECK_LT(before, kCheckHandleThreshold);
 #endif
diff --git a/deps/v8/src/handles/handles.cc b/deps/v8/src/handles/handles.cc
index 940da8eb95b947..332dc723b063bb 100644
--- a/deps/v8/src/handles/handles.cc
+++ b/deps/v8/src/handles/handles.cc
@@ -34,6 +34,13 @@ ASSERT_TRIVIALLY_COPYABLE(HandleBase);
 ASSERT_TRIVIALLY_COPYABLE(Handle<Object>);
 ASSERT_TRIVIALLY_COPYABLE(MaybeHandle<Object>);
 
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+
+ASSERT_TRIVIALLY_COPYABLE(DirectHandle<Object>);
+ASSERT_TRIVIALLY_COPYABLE(DirectMaybeHandle<Object>);
+
+#endif  // V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+
 #ifdef DEBUG
 bool HandleBase::IsDereferenceAllowed() const {
   DCHECK_NOT_NULL(location_);
@@ -51,7 +58,7 @@ bool HandleBase::IsDereferenceAllowed() const {
   if (!AllowHandleDereference::IsAllowed()) return false;
 
   // Allocations in the shared heap may be dereferenced by multiple threads.
-  if (isolate->is_shared()) return true;
+  if (heap_object.InSharedWritableHeap()) return true;
 
   LocalHeap* local_heap = isolate->CurrentLocalHeap();
 
@@ -78,7 +85,42 @@ bool HandleBase::IsDereferenceAllowed() const {
   // TODO(leszeks): Check if the main thread owns this handle.
   return true;
 }
-#endif
+
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+
+template <typename T>
+bool DirectHandle<T>::IsDereferenceAllowed() const {
+  DCHECK_NE(obj_, kTaggedNullAddress);
+  Object object(obj_);
+  if (object.IsSmi()) return true;
+  HeapObject heap_object = HeapObject::cast(object);
+  if (IsReadOnlyHeapObject(heap_object)) return true;
+  Isolate* isolate = GetIsolateFromWritableObject(heap_object);
+  if (!AllowHandleDereference::IsAllowed()) return false;
+
+  // Allocations in the shared heap may be dereferenced by multiple threads.
+  if (isolate->is_shared()) return true;
+
+  LocalHeap* local_heap = isolate->CurrentLocalHeap();
+
+  // Local heap can't access handles when parked
+  if (!local_heap->IsHandleDereferenceAllowed()) {
+    StdoutStream{} << "Cannot dereference handle owned by "
+                   << "non-running local heap\n";
+    return false;
+  }
+
+  // If LocalHeap::Current() is null, we're on the main thread -- if we were to
+  // check main thread HandleScopes here, we should additionally check the
+  // main-thread LocalHeap.
+  DCHECK_EQ(ThreadId::Current(), isolate->thread_id());
+
+  return true;
+}
+
+#endif  // V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+
+#endif  // DEBUG
 
 int HandleScope::NumberOfHandles(Isolate* isolate) {
   HandleScopeImplementer* impl = isolate->handle_scope_implementer();
diff --git a/deps/v8/src/handles/handles.h b/deps/v8/src/handles/handles.h
index 0d2bdb078fb98d..29da54bf9fa59a 100644
--- a/deps/v8/src/handles/handles.h
+++ b/deps/v8/src/handles/handles.h
@@ -37,6 +37,8 @@ class SmallOrderedNameDictionary;
 class SwissNameDictionary;
 class WasmExportedFunctionData;
 
+constexpr Address kTaggedNullAddress = 0x1;
+
 // ----------------------------------------------------------------------------
 // Base class for Handle instantiations.  Don't use directly.
 class HandleBase {
@@ -371,6 +373,87 @@ struct HandleScopeData final {
   }
 };
 
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+
+// ----------------------------------------------------------------------------
+// A DirectHandle provides a reference to an object without an intermediate
+// pointer.
+//
+// A DirectHandle is a simple wrapper around a tagged pointer to a heap object
+// or a SMI. Its methods are symmetrical with Handle, so that Handles can be
+// easily migrated.
+//
+// DirectHandles are intended to be used with conservative stack scanning, as
+// they do not provide a mechanism for keeping an object alive across a garbage
+// collection.
+//
+// Further motivation is explained in the design doc:
+// https://docs.google.com/document/d/1uRGYQM76vk1fc_aDqDH3pm2qhaJtnK2oyzeVng4cS6I/
+template <typename T>
+class DirectHandle final {
+ public:
+  V8_INLINE explicit DirectHandle() : obj_(kTaggedNullAddress) {
+    // Skip static type check in order to allow DirectHandle<XXX>::null() as
+    // default parameter values in non-inl header files without requiring full
+    // definition of type XXX.
+  }
+
+  V8_INLINE bool is_null() const { return obj_ == kTaggedNullAddress; }
+
+  V8_INLINE explicit DirectHandle(Address object) : obj_(object) {
+    // This static type check also fails for forward class declarations.
+    static_assert(std::is_convertible<T*, Object*>::value,
+                  "static type violation");
+  }
+
+  // Constructor for handling automatic up casting.
+  // Ex. DirectHandle<JSFunction> can be passed when DirectHandle<Object> is
+  // expected.
+  template <typename S, typename = typename std::enable_if<
+                            std::is_convertible<S*, T*>::value>::type>
+  V8_INLINE DirectHandle(DirectHandle<S> handle) : obj_(handle.obj_) {}
+
+  V8_INLINE T operator->() const { return obj_; }
+
+  V8_INLINE T operator*() const {
+    SLOW_DCHECK(IsDereferenceAllowed());
+    return T::unchecked_cast(Object(obj_));
+  }
+
+  template <typename S>
+  inline static const DirectHandle<T> cast(DirectHandle<S> that);
+
+  // Consider declaring values that contain empty handles as
+  // MaybeHandle to force validation before being used as handles.
+  static const DirectHandle<T> null() { return DirectHandle<T>(); }
+
+ protected:
+#ifdef DEBUG
+  bool V8_EXPORT_PRIVATE IsDereferenceAllowed() const;
+#else
+  V8_INLINE
+  bool V8_EXPORT_PRIVATE IsDereferenceAllowed() const { return true; }
+#endif  // DEBUG
+
+ private:
+  // DirectHandles of different classes are allowed to access each other's
+  // obj_.
+  template <typename>
+  friend class DirectHandle;
+  // MaybeDirectHandle is allowed to access obj_.
+  template <typename>
+  friend class MaybeDirectHandle;
+
+  // This is a direct pointer to either a tagged object or SMI. Design overview:
+  // https://docs.google.com/document/d/1uRGYQM76vk1fc_aDqDH3pm2qhaJtnK2oyzeVng4cS6I/
+  T obj_;
+};
+
+template <typename T>
+std::ostream& operator<<(std::ostream& os, DirectHandle<T> handle);
+
+#endif
+
 }  // namespace internal
 }  // namespace v8
 
diff --git a/deps/v8/src/handles/maybe-handles.h b/deps/v8/src/handles/maybe-handles.h
index 15397ef0df5628..07607a71733034 100644
--- a/deps/v8/src/handles/maybe-handles.h
+++ b/deps/v8/src/handles/maybe-handles.h
@@ -117,6 +117,71 @@ class MaybeObjectHandle {
   MaybeHandle<Object> handle_;
 };
 
+#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+
+template <typename T>
+class DirectMaybeHandle final {
+ public:
+  V8_INLINE DirectMaybeHandle() = default;
+
+  V8_INLINE DirectMaybeHandle(NullMaybeHandleType) {}
+
+  // Constructor for handling automatic up casting from DirectHandle.
+  // Ex. DirectHandle<JSArray> can be passed when DirectMaybeHandle<Object> is
+  // expected.
+  template <typename S, typename = typename std::enable_if<
+                            std::is_convertible<S*, T*>::value>::type>
+  V8_INLINE DirectMaybeHandle(DirectHandle<S> handle)
+      : location_(handle.location_) {}
+
+  // Constructor for handling automatic up casting.
+  // Ex. DirectMaybeHandle<JSArray> can be passed when DirectHandle<Object> is
+  // expected.
+  template <typename S, typename = typename std::enable_if<
+                            std::is_convertible<S*, T*>::value>::type>
+  V8_INLINE DirectMaybeHandle(DirectMaybeHandle<S> maybe_handle)
+      : location_(maybe_handle.location_) {}
+
+  V8_INLINE DirectMaybeHandle(T object, Isolate* isolate);
+  V8_INLINE DirectMaybeHandle(T object, LocalHeap* local_heap);
+
+  V8_INLINE void Assert() const { DCHECK_NE(location_, kTaggedNullAddress); }
+  V8_INLINE void Check() const { CHECK_NE(location_, kTaggedNullAddress); }
+
+  V8_INLINE DirectHandle<T> ToDirectHandleChecked() const {
+    Check();
+    return DirectHandle<T>(location_);
+  }
+
+  // Convert to a DirectHandle with a type that can be upcasted to.
+  template <typename S>
+  V8_WARN_UNUSED_RESULT V8_INLINE bool ToDirectHandle(
+      DirectHandle<S>* out) const {
+    if (location_ == kTaggedNullAddress) {
+      *out = DirectHandle<T>::null();
+      return false;
+    } else {
+      *out = DirectHandle<T>(location_);
+      return true;
+    }
+  }
+
+  // Returns the raw address where this direct handle is stored.
+  V8_INLINE Address address() const { return location_; }
+
+  bool is_null() const { return location_ == kTaggedNullAddress; }
+
+ protected:
+  Address location_ = kTaggedNullAddress;
+
+  // DirectMaybeHandles of different classes are allowed to access each
+  // other's location_.
+  template <typename>
+  friend class DirectMaybeHandle;
+};
+
+#endif  // V8_ENABLE_CONSERVATIVE_STACK_SCANNING
+
 }  // namespace internal
 }  // namespace v8
 
diff --git a/deps/v8/src/handles/shared-object-conveyor-handles.cc b/deps/v8/src/handles/shared-object-conveyor-handles.cc
index 839ce212bd9666..37b4a2672a9d90 100644
--- a/deps/v8/src/handles/shared-object-conveyor-handles.cc
+++ b/deps/v8/src/handles/shared-object-conveyor-handles.cc
@@ -12,7 +12,8 @@ namespace internal {
 // TODO(v8:12547): Currently the shared isolate owns all the conveyors. Change
 // the owner to the main isolate once the shared isolate is removed.
 SharedObjectConveyorHandles::SharedObjectConveyorHandles(Isolate* isolate)
-    : persistent_handles_(isolate->shared_isolate()->NewPersistentHandles()) {}
+    : persistent_handles_(
+          isolate->shared_heap_isolate()->NewPersistentHandles()) {}
 
 uint32_t SharedObjectConveyorHandles::Persist(HeapObject shared_object) {
   DCHECK(shared_object.IsShared());
diff --git a/deps/v8/src/heap/allocation-stats.h b/deps/v8/src/heap/allocation-stats.h
index a024b956e0edc0..f02f2594d98666 100644
--- a/deps/v8/src/heap/allocation-stats.h
+++ b/deps/v8/src/heap/allocation-stats.h
@@ -59,6 +59,8 @@ class AllocationStats {
 #endif
 
   void IncreaseAllocatedBytes(size_t bytes, const BasicMemoryChunk* page) {
+    DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                   IsAligned(bytes, kObjectAlignment8GbHeap));
 #ifdef DEBUG
     size_t size = size_;
     DCHECK_GE(size + bytes, size);
diff --git a/deps/v8/src/heap/array-buffer-sweeper.cc b/deps/v8/src/heap/array-buffer-sweeper.cc
index fd36cf89c035d3..088e9e4ac565b5 100644
--- a/deps/v8/src/heap/array-buffer-sweeper.cc
+++ b/deps/v8/src/heap/array-buffer-sweeper.cc
@@ -109,7 +109,6 @@ ArrayBufferSweeper::~ArrayBufferSweeper() {
 void ArrayBufferSweeper::EnsureFinished() {
   if (!sweeping_in_progress()) return;
 
-  TRACE_GC(heap_->tracer(), GCTracer::Scope::MC_COMPLETE_SWEEP_ARRAY_BUFFERS);
   TryAbortResult abort_result =
       heap_->isolate()->cancelable_task_manager()->TryAbort(job_->id_);
 
diff --git a/deps/v8/src/heap/base-space.cc b/deps/v8/src/heap/base-space.cc
index aabbeaebf540a8..5f28afc2406010 100644
--- a/deps/v8/src/heap/base-space.cc
+++ b/deps/v8/src/heap/base-space.cc
@@ -17,12 +17,16 @@ const char* BaseSpace::GetSpaceName(AllocationSpace space) {
       return "map_space";
     case CODE_SPACE:
       return "code_space";
+    case SHARED_SPACE:
+      return "shared_space";
     case LO_SPACE:
       return "large_object_space";
     case NEW_LO_SPACE:
       return "new_large_object_space";
     case CODE_LO_SPACE:
       return "code_large_object_space";
+    case SHARED_LO_SPACE:
+      return "shared_large_object_space";
     case RO_SPACE:
       return "read_only_space";
   }
diff --git a/deps/v8/src/heap/base/basic-slot-set.h b/deps/v8/src/heap/base/basic-slot-set.h
new file mode 100644
index 00000000000000..2f0bc1c8727697
--- /dev/null
+++ b/deps/v8/src/heap/base/basic-slot-set.h
@@ -0,0 +1,464 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_BASE_BASIC_SLOT_SET_H_
+#define V8_HEAP_BASE_BASIC_SLOT_SET_H_
+
+#include <cstddef>
+#include <memory>
+
+#include "src/base/atomic-utils.h"
+#include "src/base/bits.h"
+#include "src/base/platform/memory.h"
+
+namespace heap {
+namespace base {
+
+enum SlotCallbackResult { KEEP_SLOT, REMOVE_SLOT };
+
+// Data structure for maintaining a set of slots in a standard (non-large)
+// page.
+// The data structure assumes that the slots are pointer size aligned and
+// splits the valid slot offset range into buckets.
+// Each bucket is a bitmap with a bit corresponding to a single slot offset.
+template <size_t SlotGranularity>
+class BasicSlotSet {
+  static constexpr auto kSystemPointerSize = sizeof(void*);
+
+ public:
+  using Address = uintptr_t;
+
+  enum AccessMode : uint8_t {
+    ATOMIC,
+    NON_ATOMIC,
+  };
+
+  enum EmptyBucketMode {
+    FREE_EMPTY_BUCKETS,  // An empty bucket will be deallocated immediately.
+    KEEP_EMPTY_BUCKETS   // An empty bucket will be kept.
+  };
+
+  BasicSlotSet() = delete;
+
+  static BasicSlotSet* Allocate(size_t buckets) {
+    //  BasicSlotSet* slot_set --+
+    //                           |
+    //                           v
+    //         +-----------------+-------------------------+
+    //         | initial buckets |     buckets array       |
+    //         +-----------------+-------------------------+
+    //            pointer-sized    pointer-sized * buckets
+    //
+    //
+    // The BasicSlotSet pointer points to the beginning of the buckets array for
+    // faster access in the write barrier. The number of buckets is needed for
+    // calculating the size of this data structure.
+    size_t buckets_size = buckets * sizeof(Bucket*);
+    size_t size = kInitialBucketsSize + buckets_size;
+    void* allocation = v8::base::AlignedAlloc(size, kSystemPointerSize);
+    CHECK(allocation);
+    BasicSlotSet* slot_set = reinterpret_cast<BasicSlotSet*>(
+        reinterpret_cast<uint8_t*>(allocation) + kInitialBucketsSize);
+    DCHECK(
+        IsAligned(reinterpret_cast<uintptr_t>(slot_set), kSystemPointerSize));
+#ifdef DEBUG
+    *slot_set->initial_buckets() = buckets;
+#endif
+    for (size_t i = 0; i < buckets; i++) {
+      *slot_set->bucket(i) = nullptr;
+    }
+    return slot_set;
+  }
+
+  static void Delete(BasicSlotSet* slot_set, size_t buckets) {
+    if (slot_set == nullptr) return;
+
+    for (size_t i = 0; i < buckets; i++) {
+      slot_set->ReleaseBucket(i);
+    }
+
+#ifdef DEBUG
+    size_t initial_buckets = *slot_set->initial_buckets();
+
+    for (size_t i = buckets; i < initial_buckets; i++) {
+      DCHECK_NULL(*slot_set->bucket(i));
+    }
+#endif
+
+    v8::base::AlignedFree(reinterpret_cast<uint8_t*>(slot_set) -
+                          kInitialBucketsSize);
+  }
+
+  constexpr static size_t BucketsForSize(size_t size) {
+    return (size + (SlotGranularity * kBitsPerBucket) - 1) /
+           (SlotGranularity * kBitsPerBucket);
+  }
+
+  // Converts the slot offset into bucket index.
+  constexpr static size_t BucketForSlot(size_t slot_offset) {
+    DCHECK(IsAligned(slot_offset, SlotGranularity));
+    return slot_offset / (SlotGranularity * kBitsPerBucket);
+  }
+
+  // The slot offset specifies a slot at address page_start_ + slot_offset.
+  // AccessMode defines whether there can be concurrent access on the buckets
+  // or not.
+  template <AccessMode access_mode>
+  void Insert(size_t slot_offset) {
+    size_t bucket_index;
+    int cell_index, bit_index;
+    SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index);
+    Bucket* bucket = LoadBucket<access_mode>(bucket_index);
+    if (bucket == nullptr) {
+      bucket = new Bucket;
+      if (!SwapInNewBucket<access_mode>(bucket_index, bucket)) {
+        delete bucket;
+        bucket = LoadBucket<access_mode>(bucket_index);
+      }
+    }
+    // Check that monotonicity is preserved, i.e., once a bucket is set we do
+    // not free it concurrently.
+    DCHECK(bucket != nullptr);
+    DCHECK_EQ(bucket->cells(), LoadBucket<access_mode>(bucket_index)->cells());
+    uint32_t mask = 1u << bit_index;
+    if ((bucket->template LoadCell<access_mode>(cell_index) & mask) == 0) {
+      bucket->template SetCellBits<access_mode>(cell_index, mask);
+    }
+  }
+
+  // The slot offset specifies a slot at address page_start_ + slot_offset.
+  // Returns true if the set contains the slot.
+  bool Contains(size_t slot_offset) {
+    size_t bucket_index;
+    int cell_index, bit_index;
+    SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index);
+    Bucket* bucket = LoadBucket(bucket_index);
+    if (bucket == nullptr) return false;
+    return (bucket->LoadCell(cell_index) & (1u << bit_index)) != 0;
+  }
+
+  // The slot offset specifies a slot at address page_start_ + slot_offset.
+  void Remove(size_t slot_offset) {
+    size_t bucket_index;
+    int cell_index, bit_index;
+    SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index);
+    Bucket* bucket = LoadBucket(bucket_index);
+    if (bucket != nullptr) {
+      uint32_t cell = bucket->LoadCell(cell_index);
+      uint32_t bit_mask = 1u << bit_index;
+      if (cell & bit_mask) {
+        bucket->ClearCellBits(cell_index, bit_mask);
+      }
+    }
+  }
+
+  // The slot offsets specify a range of slots at addresses:
+  // [page_start_ + start_offset ... page_start_ + end_offset).
+  void RemoveRange(size_t start_offset, size_t end_offset, size_t buckets,
+                   EmptyBucketMode mode) {
+    CHECK_LE(end_offset, buckets * kBitsPerBucket * SlotGranularity);
+    DCHECK_LE(start_offset, end_offset);
+    size_t start_bucket;
+    int start_cell, start_bit;
+    SlotToIndices(start_offset, &start_bucket, &start_cell, &start_bit);
+    size_t end_bucket;
+    int end_cell, end_bit;
+    SlotToIndices(end_offset, &end_bucket, &end_cell, &end_bit);
+    uint32_t start_mask = (1u << start_bit) - 1;
+    uint32_t end_mask = ~((1u << end_bit) - 1);
+    Bucket* bucket;
+    if (start_bucket == end_bucket && start_cell == end_cell) {
+      bucket = LoadBucket(start_bucket);
+      if (bucket != nullptr) {
+        bucket->ClearCellBits(start_cell, ~(start_mask | end_mask));
+      }
+      return;
+    }
+    size_t current_bucket = start_bucket;
+    int current_cell = start_cell;
+    bucket = LoadBucket(current_bucket);
+    if (bucket != nullptr) {
+      bucket->ClearCellBits(current_cell, ~start_mask);
+    }
+    current_cell++;
+    if (current_bucket < end_bucket) {
+      if (bucket != nullptr) {
+        ClearBucket(bucket, current_cell, kCellsPerBucket);
+      }
+      // The rest of the current bucket is cleared.
+      // Move on to the next bucket.
+      current_bucket++;
+      current_cell = 0;
+    }
+    DCHECK(current_bucket == end_bucket ||
+           (current_bucket < end_bucket && current_cell == 0));
+    while (current_bucket < end_bucket) {
+      if (mode == FREE_EMPTY_BUCKETS) {
+        ReleaseBucket(current_bucket);
+      } else {
+        DCHECK(mode == KEEP_EMPTY_BUCKETS);
+        bucket = LoadBucket(current_bucket);
+        if (bucket != nullptr) {
+          ClearBucket(bucket, 0, kCellsPerBucket);
+        }
+      }
+      current_bucket++;
+    }
+    // All buckets between start_bucket and end_bucket are cleared.
+    DCHECK(current_bucket == end_bucket);
+    if (current_bucket == buckets) return;
+    bucket = LoadBucket(current_bucket);
+    DCHECK(current_cell <= end_cell);
+    if (bucket == nullptr) return;
+    while (current_cell < end_cell) {
+      bucket->StoreCell(current_cell, 0);
+      current_cell++;
+    }
+    // All cells between start_cell and end_cell are cleared.
+    DCHECK(current_bucket == end_bucket && current_cell == end_cell);
+    bucket->ClearCellBits(end_cell, ~end_mask);
+  }
+
+  // The slot offset specifies a slot at address page_start_ + slot_offset.
+  bool Lookup(size_t slot_offset) {
+    size_t bucket_index;
+    int cell_index, bit_index;
+    SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index);
+    Bucket* bucket = LoadBucket(bucket_index);
+    if (bucket == nullptr) return false;
+    return (bucket->LoadCell(cell_index) & (1u << bit_index)) != 0;
+  }
+
+  // Iterate over all slots in the set and for each slot invoke the callback.
+  // If the callback returns REMOVE_SLOT then the slot is removed from the set.
+  // Returns the new number of slots.
+  //
+  // Iteration can be performed concurrently with other operations that use
+  // atomic access mode such as insertion and removal. However there is no
+  // guarantee about ordering and linearizability.
+  //
+  // Sample usage:
+  // Iterate([](Address slot) {
+  //    if (good(slot)) return KEEP_SLOT;
+  //    else return REMOVE_SLOT;
+  // });
+  //
+  // Releases memory for empty buckets with FREE_EMPTY_BUCKETS.
+  template <typename Callback>
+  size_t Iterate(Address chunk_start, size_t start_bucket, size_t end_bucket,
+                 Callback callback, EmptyBucketMode mode) {
+    return Iterate(chunk_start, start_bucket, end_bucket, callback,
+                   [this, mode](size_t bucket_index) {
+                     if (mode == EmptyBucketMode::FREE_EMPTY_BUCKETS) {
+                       ReleaseBucket(bucket_index);
+                     }
+                   });
+  }
+
+  bool FreeEmptyBuckets(size_t buckets) {
+    bool empty = true;
+    for (size_t bucket_index = 0; bucket_index < buckets; bucket_index++) {
+      if (!FreeBucketIfEmpty(bucket_index)) {
+        empty = false;
+      }
+    }
+
+    return empty;
+  }
+
+  static const int kCellsPerBucket = 32;
+  static const int kCellsPerBucketLog2 = 5;
+  static const int kCellSizeBytesLog2 = 2;
+  static const int kCellSizeBytes = 1 << kCellSizeBytesLog2;
+  static const int kBitsPerCell = 32;
+  static const int kBitsPerCellLog2 = 5;
+  static const int kBitsPerBucket = kCellsPerBucket * kBitsPerCell;
+  static const int kBitsPerBucketLog2 = kCellsPerBucketLog2 + kBitsPerCellLog2;
+
+  class Bucket final {
+    uint32_t cells_[kCellsPerBucket];
+
+   public:
+    Bucket() {
+      for (int i = 0; i < kCellsPerBucket; i++) {
+        cells_[i] = 0;
+      }
+    }
+
+    uint32_t* cells() { return cells_; }
+    uint32_t* cell(int cell_index) { return cells() + cell_index; }
+
+    template <AccessMode access_mode = AccessMode::ATOMIC>
+    uint32_t LoadCell(int cell_index) {
+      DCHECK_LT(cell_index, kCellsPerBucket);
+      if (access_mode == AccessMode::ATOMIC)
+        return v8::base::AsAtomic32::Acquire_Load(cells() + cell_index);
+      return *(cells() + cell_index);
+    }
+
+    template <AccessMode access_mode = AccessMode::ATOMIC>
+    void SetCellBits(int cell_index, uint32_t mask) {
+      if (access_mode == AccessMode::ATOMIC) {
+        v8::base::AsAtomic32::SetBits(cell(cell_index), mask, mask);
+      } else {
+        uint32_t* c = cell(cell_index);
+        *c = (*c & ~mask) | mask;
+      }
+    }
+
+    void ClearCellBits(int cell_index, uint32_t mask) {
+      v8::base::AsAtomic32::SetBits(cell(cell_index), 0u, mask);
+    }
+
+    void StoreCell(int cell_index, uint32_t value) {
+      v8::base::AsAtomic32::Release_Store(cell(cell_index), value);
+    }
+
+    bool IsEmpty() {
+      for (int i = 0; i < kCellsPerBucket; i++) {
+        if (cells_[i] != 0) {
+          return false;
+        }
+      }
+      return true;
+    }
+  };
+
+ protected:
+  template <typename Callback, typename EmptyBucketCallback>
+  size_t Iterate(Address chunk_start, size_t start_bucket, size_t end_bucket,
+                 Callback callback, EmptyBucketCallback empty_bucket_callback) {
+    size_t new_count = 0;
+    for (size_t bucket_index = start_bucket; bucket_index < end_bucket;
+         bucket_index++) {
+      Bucket* bucket = LoadBucket(bucket_index);
+      if (bucket != nullptr) {
+        size_t in_bucket_count = 0;
+        size_t cell_offset = bucket_index << kBitsPerBucketLog2;
+        for (int i = 0; i < kCellsPerBucket; i++, cell_offset += kBitsPerCell) {
+          uint32_t cell = bucket->LoadCell(i);
+          if (cell) {
+            uint32_t old_cell = cell;
+            uint32_t mask = 0;
+            while (cell) {
+              int bit_offset = v8::base::bits::CountTrailingZeros(cell);
+              uint32_t bit_mask = 1u << bit_offset;
+              Address slot = (cell_offset + bit_offset) * SlotGranularity;
+              if (callback(chunk_start + slot) == KEEP_SLOT) {
+                ++in_bucket_count;
+              } else {
+                mask |= bit_mask;
+              }
+              cell ^= bit_mask;
+            }
+            uint32_t new_cell = old_cell & ~mask;
+            if (old_cell != new_cell) {
+              bucket->ClearCellBits(i, mask);
+            }
+          }
+        }
+        if (in_bucket_count == 0) {
+          empty_bucket_callback(bucket_index);
+        }
+        new_count += in_bucket_count;
+      }
+    }
+    return new_count;
+  }
+
+  bool FreeBucketIfEmpty(size_t bucket_index) {
+    Bucket* bucket = LoadBucket<AccessMode::NON_ATOMIC>(bucket_index);
+    if (bucket != nullptr) {
+      if (bucket->IsEmpty()) {
+        ReleaseBucket<AccessMode::NON_ATOMIC>(bucket_index);
+      } else {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  void ClearBucket(Bucket* bucket, int start_cell, int end_cell) {
+    DCHECK_GE(start_cell, 0);
+    DCHECK_LE(end_cell, kCellsPerBucket);
+    int current_cell = start_cell;
+    while (current_cell < kCellsPerBucket) {
+      bucket->StoreCell(current_cell, 0);
+      current_cell++;
+    }
+  }
+
+  template <AccessMode access_mode = AccessMode::ATOMIC>
+  void ReleaseBucket(size_t bucket_index) {
+    Bucket* bucket = LoadBucket<access_mode>(bucket_index);
+    StoreBucket<access_mode>(bucket_index, nullptr);
+    delete bucket;
+  }
+
+  template <AccessMode access_mode = AccessMode::ATOMIC>
+  Bucket* LoadBucket(Bucket** bucket) {
+    if (access_mode == AccessMode::ATOMIC)
+      return v8::base::AsAtomicPointer::Acquire_Load(bucket);
+    return *bucket;
+  }
+
+  template <AccessMode access_mode = AccessMode::ATOMIC>
+  Bucket* LoadBucket(size_t bucket_index) {
+    return LoadBucket(bucket(bucket_index));
+  }
+
+  template <AccessMode access_mode = AccessMode::ATOMIC>
+  void StoreBucket(Bucket** bucket, Bucket* value) {
+    if (access_mode == AccessMode::ATOMIC) {
+      v8::base::AsAtomicPointer::Release_Store(bucket, value);
+    } else {
+      *bucket = value;
+    }
+  }
+
+  template <AccessMode access_mode = AccessMode::ATOMIC>
+  void StoreBucket(size_t bucket_index, Bucket* value) {
+    StoreBucket(bucket(bucket_index), value);
+  }
+
+  template <AccessMode access_mode = AccessMode::ATOMIC>
+  bool SwapInNewBucket(size_t bucket_index, Bucket* value) {
+    Bucket** b = bucket(bucket_index);
+    if (access_mode == AccessMode::ATOMIC) {
+      return v8::base::AsAtomicPointer::Release_CompareAndSwap(
+                 b, nullptr, value) == nullptr;
+    } else {
+      DCHECK_NULL(*b);
+      *b = value;
+      return true;
+    }
+  }
+
+  // Converts the slot offset into bucket/cell/bit index.
+  static void SlotToIndices(size_t slot_offset, size_t* bucket_index,
+                            int* cell_index, int* bit_index) {
+    DCHECK(IsAligned(slot_offset, SlotGranularity));
+    size_t slot = slot_offset / SlotGranularity;
+    *bucket_index = slot >> kBitsPerBucketLog2;
+    *cell_index =
+        static_cast<int>((slot >> kBitsPerCellLog2) & (kCellsPerBucket - 1));
+    *bit_index = static_cast<int>(slot & (kBitsPerCell - 1));
+  }
+
+  Bucket** buckets() { return reinterpret_cast<Bucket**>(this); }
+  Bucket** bucket(size_t bucket_index) { return buckets() + bucket_index; }
+
+#ifdef DEBUG
+  size_t* initial_buckets() { return reinterpret_cast<size_t*>(this) - 1; }
+  static const int kInitialBucketsSize = sizeof(size_t);
+#else
+  static const int kInitialBucketsSize = 0;
+#endif
+};
+
+}  // namespace base
+}  // namespace heap
+
+#endif  // V8_HEAP_BASE_BASIC_SLOT_SET_H_
diff --git a/deps/v8/src/heap/basic-memory-chunk.h b/deps/v8/src/heap/basic-memory-chunk.h
index db80da75c995ce..60a711b622e614 100644
--- a/deps/v8/src/heap/basic-memory-chunk.h
+++ b/deps/v8/src/heap/basic-memory-chunk.h
@@ -353,7 +353,7 @@ class BasicMemoryChunk {
   size_t size_;
 
   // Flags that are only mutable from the main thread when no concurrent
-  // component (e.g. marker, sweeper) is running.
+  // component (e.g. marker, sweeper, compilation, allocation) is running.
   MainThreadFlags main_thread_flags_{NO_FLAGS};
 
   // TODO(v8:7464): Find a way to remove this.
diff --git a/deps/v8/src/heap/code-range.cc b/deps/v8/src/heap/code-range.cc
index dfe730730cd41e..ae240d0f1c1188 100644
--- a/deps/v8/src/heap/code-range.cc
+++ b/deps/v8/src/heap/code-range.cc
@@ -147,15 +147,14 @@ bool CodeRange::InitReservation(v8::PageAllocator* page_allocator,
 
   if (!VirtualMemoryCage::InitReservation(params)) return false;
 
-  if (V8_EXTERNAL_CODE_SPACE_BOOL) {
-    // Ensure that the code range does not cross the 4Gb boundary and thus
-    // default compression scheme of truncating the Code pointers to 32-bits
-    // still works.
-    Address base = page_allocator_->begin();
-    Address last = base + page_allocator_->size() - 1;
-    CHECK_EQ(GetPtrComprCageBaseAddress(base),
-             GetPtrComprCageBaseAddress(last));
-  }
+#ifdef V8_EXTERNAL_CODE_SPACE
+  // Ensure that ExternalCodeCompressionScheme is applicable to all objects
+  // stored in the code range.
+  Address base = page_allocator_->begin();
+  Address last = base + page_allocator_->size() - 1;
+  CHECK_EQ(ExternalCodeCompressionScheme::GetPtrComprCageBaseAddress(base),
+           ExternalCodeCompressionScheme::GetPtrComprCageBaseAddress(last));
+#endif  // V8_EXTERNAL_CODE_SPACE
 
   // On some platforms, specifically Win64, we need to reserve some pages at
   // the beginning of an executable space. See
diff --git a/deps/v8/src/heap/concurrent-allocator-inl.h b/deps/v8/src/heap/concurrent-allocator-inl.h
index f6eed1b696ffb4..efce44d36398a7 100644
--- a/deps/v8/src/heap/concurrent-allocator-inl.h
+++ b/deps/v8/src/heap/concurrent-allocator-inl.h
@@ -13,7 +13,6 @@
 #include "src/heap/incremental-marking.h"
 #include "src/heap/local-heap.h"
 #include "src/heap/spaces-inl.h"
-#include "src/heap/spaces.h"
 #include "src/objects/heap-object.h"
 
 namespace v8 {
@@ -22,6 +21,7 @@ namespace internal {
 AllocationResult ConcurrentAllocator::AllocateRaw(int size_in_bytes,
                                                   AllocationAlignment alignment,
                                                   AllocationOrigin origin) {
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
   DCHECK(!v8_flags.enable_third_party_heap);
   // TODO(dinfuehr): Add support for allocation observers
 #ifdef DEBUG
@@ -34,15 +34,47 @@ AllocationResult ConcurrentAllocator::AllocateRaw(int size_in_bytes,
 
   AllocationResult result;
   if (USE_ALLOCATION_ALIGNMENT_BOOL && alignment != kTaggedAligned) {
-    result = lab_.AllocateRawAligned(size_in_bytes, alignment);
+    result = AllocateInLabFastAligned(size_in_bytes, alignment);
   } else {
-    result = lab_.AllocateRawUnaligned(size_in_bytes);
+    result = AllocateInLabFastUnaligned(size_in_bytes);
   }
   return result.IsFailure()
              ? AllocateInLabSlow(size_in_bytes, alignment, origin)
              : result;
 }
 
+AllocationResult ConcurrentAllocator::AllocateInLabFastUnaligned(
+    int size_in_bytes) {
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
+
+  if (!lab_.CanIncrementTop(size_in_bytes)) {
+    return AllocationResult::Failure();
+  }
+
+  HeapObject object = HeapObject::FromAddress(lab_.IncrementTop(size_in_bytes));
+  return AllocationResult::FromObject(object);
+}
+
+AllocationResult ConcurrentAllocator::AllocateInLabFastAligned(
+    int size_in_bytes, AllocationAlignment alignment) {
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
+  Address current_top = lab_.top();
+  int filler_size = Heap::GetFillToAlign(current_top, alignment);
+  int aligned_size = filler_size + size_in_bytes;
+
+  if (!lab_.CanIncrementTop(aligned_size)) {
+    return AllocationResult::Failure();
+  }
+
+  HeapObject object = HeapObject::FromAddress(lab_.IncrementTop(aligned_size));
+
+  if (filler_size > 0) {
+    object = owning_heap()->PrecedeWithFiller(object, filler_size);
+  }
+
+  return AllocationResult::FromObject(object);
+}
+
 }  // namespace internal
 }  // namespace v8
 
diff --git a/deps/v8/src/heap/concurrent-allocator.cc b/deps/v8/src/heap/concurrent-allocator.cc
index 4b02b141709d12..b4494d9a6311eb 100644
--- a/deps/v8/src/heap/concurrent-allocator.cc
+++ b/deps/v8/src/heap/concurrent-allocator.cc
@@ -8,7 +8,9 @@
 #include "src/execution/isolate.h"
 #include "src/handles/persistent-handles.h"
 #include "src/heap/concurrent-allocator-inl.h"
+#include "src/heap/gc-tracer-inl.h"
 #include "src/heap/heap.h"
+#include "src/heap/linear-allocation-area.h"
 #include "src/heap/local-heap-inl.h"
 #include "src/heap/local-heap.h"
 #include "src/heap/marking.h"
@@ -41,7 +43,7 @@ void StressConcurrentAllocatorTask::RunInternal() {
       heap->CreateFillerObjectAtBackground(result.ToAddress(),
                                            kSmallObjectSize);
     } else {
-      local_heap.TryPerformCollection();
+      heap->CollectGarbageFromAnyThread(&local_heap);
     }
 
     result = local_heap.AllocateRaw(kMediumObjectSize, AllocationType::kOld,
@@ -51,7 +53,7 @@ void StressConcurrentAllocatorTask::RunInternal() {
       heap->CreateFillerObjectAtBackground(result.ToAddress(),
                                            kMediumObjectSize);
     } else {
-      local_heap.TryPerformCollection();
+      heap->CollectGarbageFromAnyThread(&local_heap);
     }
 
     result = local_heap.AllocateRaw(kLargeObjectSize, AllocationType::kOld,
@@ -61,7 +63,7 @@ void StressConcurrentAllocatorTask::RunInternal() {
       heap->CreateFillerObjectAtBackground(result.ToAddress(),
                                            kLargeObjectSize);
     } else {
-      local_heap.TryPerformCollection();
+      heap->CollectGarbageFromAnyThread(&local_heap);
     }
     local_heap.Safepoint();
   }
@@ -77,24 +79,35 @@ void StressConcurrentAllocatorTask::Schedule(Isolate* isolate) {
                                                       kDelayInSeconds);
 }
 
+ConcurrentAllocator::ConcurrentAllocator(LocalHeap* local_heap,
+                                         PagedSpace* space)
+    : local_heap_(local_heap), space_(space), owning_heap_(space_->heap()) {}
+
 void ConcurrentAllocator::FreeLinearAllocationArea() {
   // The code page of the linear allocation area needs to be unprotected
   // because we are going to write a filler into that memory area below.
   base::Optional<CodePageMemoryModificationScope> optional_scope;
-  if (lab_.IsValid() && space_->identity() == CODE_SPACE) {
+  if (IsLabValid() && space_->identity() == CODE_SPACE) {
     optional_scope.emplace(MemoryChunk::FromAddress(lab_.top()));
   }
-  lab_.CloseAndMakeIterable();
+  if (lab_.top() != lab_.limit() &&
+      owning_heap()->incremental_marking()->black_allocation()) {
+    Page::FromAddress(lab_.top())
+        ->DestroyBlackAreaBackground(lab_.top(), lab_.limit());
+  }
+
+  MakeLabIterable();
+  ResetLab();
 }
 
 void ConcurrentAllocator::MakeLinearAllocationAreaIterable() {
   // The code page of the linear allocation area needs to be unprotected
   // because we are going to write a filler into that memory area below.
   base::Optional<CodePageMemoryModificationScope> optional_scope;
-  if (lab_.IsValid() && space_->identity() == CODE_SPACE) {
+  if (IsLabValid() && space_->identity() == CODE_SPACE) {
     optional_scope.emplace(MemoryChunk::FromAddress(lab_.top()));
   }
-  lab_.MakeIterable();
+  MakeLabIterable();
 }
 
 void ConcurrentAllocator::MarkLinearAllocationAreaBlack() {
@@ -128,54 +141,134 @@ void ConcurrentAllocator::UnmarkLinearAllocationArea() {
 
 AllocationResult ConcurrentAllocator::AllocateInLabSlow(
     int size_in_bytes, AllocationAlignment alignment, AllocationOrigin origin) {
-  if (!EnsureLab(origin)) {
+  if (!AllocateLab(origin)) {
     return AllocationResult::Failure();
   }
   AllocationResult allocation =
-      lab_.AllocateRawAligned(size_in_bytes, alignment);
+      AllocateInLabFastAligned(size_in_bytes, alignment);
   DCHECK(!allocation.IsFailure());
   return allocation;
 }
 
-bool ConcurrentAllocator::EnsureLab(AllocationOrigin origin) {
-  auto result = space_->RawAllocateBackground(local_heap_, kMinLabSize,
-                                              kMaxLabSize, origin);
+bool ConcurrentAllocator::AllocateLab(AllocationOrigin origin) {
+  auto result = AllocateFromSpaceFreeList(kMinLabSize, kMaxLabSize, origin);
   if (!result) return false;
 
+  owning_heap()->StartIncrementalMarkingIfAllocationLimitIsReachedBackground();
+
+  FreeLinearAllocationArea();
+
+  Address lab_start = result->first;
+  Address lab_end = lab_start + result->second;
+  lab_ = LinearAllocationArea(lab_start, lab_end);
+  DCHECK(IsLabValid());
+
   if (IsBlackAllocationEnabled()) {
-    Address top = result->first;
-    Address limit = top + result->second;
+    Address top = lab_.top();
+    Address limit = lab_.limit();
     Page::FromAllocationAreaAddress(top)->CreateBlackAreaBackground(top, limit);
   }
 
-  HeapObject object = HeapObject::FromAddress(result->first);
-  LocalAllocationBuffer saved_lab = std::move(lab_);
-  lab_ = LocalAllocationBuffer::FromResult(
-      space_->heap(), AllocationResult::FromObject(object), result->second);
-  DCHECK(lab_.IsValid());
-  if (!lab_.TryMerge(&saved_lab)) {
-    saved_lab.CloseAndMakeIterable();
-  }
   return true;
 }
 
+base::Optional<std::pair<Address, size_t>>
+ConcurrentAllocator::AllocateFromSpaceFreeList(size_t min_size_in_bytes,
+                                               size_t max_size_in_bytes,
+                                               AllocationOrigin origin) {
+  DCHECK(!space_->is_compaction_space());
+  DCHECK(space_->identity() == OLD_SPACE || space_->identity() == CODE_SPACE ||
+         space_->identity() == MAP_SPACE || space_->identity() == SHARED_SPACE);
+  DCHECK(origin == AllocationOrigin::kRuntime ||
+         origin == AllocationOrigin::kGC);
+  DCHECK_IMPLIES(!local_heap_, origin == AllocationOrigin::kGC);
+
+  base::Optional<std::pair<Address, size_t>> result =
+      space_->TryAllocationFromFreeListBackground(min_size_in_bytes,
+                                                  max_size_in_bytes, origin);
+  if (result) return result;
+
+  // Sweeping is still in progress.
+  if (owning_heap()->sweeping_in_progress()) {
+    // First try to refill the free-list, concurrent sweeper threads
+    // may have freed some objects in the meantime.
+    {
+      TRACE_GC_EPOCH(owning_heap()->tracer(),
+                     GCTracer::Scope::MC_BACKGROUND_SWEEPING,
+                     ThreadKind::kBackground);
+      space_->RefillFreeList();
+    }
+
+    // Retry the free list allocation.
+    result = space_->TryAllocationFromFreeListBackground(
+        min_size_in_bytes, max_size_in_bytes, origin);
+    if (result) return result;
+
+    // Now contribute to sweeping from background thread and then try to
+    // reallocate.
+    int max_freed;
+    {
+      TRACE_GC_EPOCH(owning_heap()->tracer(),
+                     GCTracer::Scope::MC_BACKGROUND_SWEEPING,
+                     ThreadKind::kBackground);
+      const int kMaxPagesToSweep = 1;
+      max_freed = owning_heap()->sweeper()->ParallelSweepSpace(
+          space_->identity(), Sweeper::SweepingMode::kLazyOrConcurrent,
+          static_cast<int>(min_size_in_bytes), kMaxPagesToSweep);
+      space_->RefillFreeList();
+    }
+
+    if (static_cast<size_t>(max_freed) >= min_size_in_bytes) {
+      result = space_->TryAllocationFromFreeListBackground(
+          min_size_in_bytes, max_size_in_bytes, origin);
+      if (result) return result;
+    }
+  }
+
+  if (owning_heap()->ShouldExpandOldGenerationOnSlowAllocation(local_heap_) &&
+      owning_heap()->CanExpandOldGenerationBackground(local_heap_,
+                                                      space_->AreaSize())) {
+    result = space_->TryExpandBackground(max_size_in_bytes);
+    if (result) return result;
+  }
+
+  if (owning_heap()->sweeping_in_progress()) {
+    // Complete sweeping for this space.
+    TRACE_GC_EPOCH(owning_heap()->tracer(),
+                   GCTracer::Scope::MC_BACKGROUND_SWEEPING,
+                   ThreadKind::kBackground);
+    owning_heap()->DrainSweepingWorklistForSpace(space_->identity());
+
+    space_->RefillFreeList();
+
+    // Last try to acquire memory from free list.
+    return space_->TryAllocationFromFreeListBackground(
+        min_size_in_bytes, max_size_in_bytes, origin);
+  }
+
+  return {};
+}
+
 AllocationResult ConcurrentAllocator::AllocateOutsideLab(
     int size_in_bytes, AllocationAlignment alignment, AllocationOrigin origin) {
   // Conservative estimate as we don't know the alignment of the allocation.
   const int requested_filler_size = Heap::GetMaximumFillToAlign(alignment);
   const int aligned_size_in_bytes = size_in_bytes + requested_filler_size;
-  auto result = space_->RawAllocateBackground(
-      local_heap_, aligned_size_in_bytes, aligned_size_in_bytes, origin);
+  auto result = AllocateFromSpaceFreeList(aligned_size_in_bytes,
+                                          aligned_size_in_bytes, origin);
 
   if (!result) return AllocationResult::Failure();
+
+  owning_heap()->StartIncrementalMarkingIfAllocationLimitIsReachedBackground();
+
   DCHECK_GE(result->second, aligned_size_in_bytes);
 
-  HeapObject object =
-      (requested_filler_size)
-          ? owning_heap()->AlignWithFiller(
-                HeapObject::FromAddress(result->first), size_in_bytes,
-                static_cast<int>(result->second), alignment)
-          : HeapObject::FromAddress(result->first);
+  HeapObject object = HeapObject::FromAddress(result->first);
+  if (requested_filler_size > 0) {
+    object = owning_heap()->AlignWithFiller(
+        object, size_in_bytes, static_cast<int>(result->second), alignment);
+  }
+
   if (IsBlackAllocationEnabled()) {
     owning_heap()->incremental_marking()->MarkBlackBackground(object,
                                                               size_in_bytes);
@@ -187,7 +280,12 @@ bool ConcurrentAllocator::IsBlackAllocationEnabled() const {
   return owning_heap()->incremental_marking()->black_allocation();
 }
 
-Heap* ConcurrentAllocator::owning_heap() const { return space_->heap(); }
+void ConcurrentAllocator::MakeLabIterable() {
+  if (IsLabValid()) {
+    owning_heap()->CreateFillerObjectAtBackground(
+        lab_.top(), static_cast<int>(lab_.limit() - lab_.top()));
+  }
+}
 
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/heap/concurrent-allocator.h b/deps/v8/src/heap/concurrent-allocator.h
index c7c3a28465a40c..b9e003e6cbe0e4 100644
--- a/deps/v8/src/heap/concurrent-allocator.h
+++ b/deps/v8/src/heap/concurrent-allocator.h
@@ -5,8 +5,10 @@
 #ifndef V8_HEAP_CONCURRENT_ALLOCATOR_H_
 #define V8_HEAP_CONCURRENT_ALLOCATOR_H_
 
+#include "src/base/optional.h"
 #include "src/common/globals.h"
 #include "src/heap/heap.h"
+#include "src/heap/linear-allocation-area.h"
 #include "src/heap/spaces.h"
 #include "src/tasks/cancelable-task.h"
 
@@ -37,10 +39,7 @@ class ConcurrentAllocator {
   static constexpr int kMaxLabSize = 32 * KB;
   static constexpr int kMaxLabObjectSize = 2 * KB;
 
-  ConcurrentAllocator(LocalHeap* local_heap, PagedSpace* space)
-      : local_heap_(local_heap),
-        space_(space),
-        lab_(LocalAllocationBuffer::InvalidBuffer()) {}
+  ConcurrentAllocator(LocalHeap* local_heap, PagedSpace* space);
 
   inline AllocationResult AllocateRaw(int object_size,
                                       AllocationAlignment alignment,
@@ -59,10 +58,20 @@ class ConcurrentAllocator {
       "size <= kMaxLabObjectSize will fit into a newly allocated LAB of size "
       "kLabSize after computing the alignment requirements.");
 
+  V8_EXPORT_PRIVATE V8_INLINE AllocationResult
+  AllocateInLabFastUnaligned(int size_in_bytes);
+
+  V8_EXPORT_PRIVATE V8_INLINE AllocationResult
+  AllocateInLabFastAligned(int size_in_bytes, AllocationAlignment alignment);
+
   V8_EXPORT_PRIVATE AllocationResult
   AllocateInLabSlow(int size_in_bytes, AllocationAlignment alignment,
                     AllocationOrigin origin);
-  bool EnsureLab(AllocationOrigin origin);
+  bool AllocateLab(AllocationOrigin origin);
+
+  base::Optional<std::pair<Address, size_t>> AllocateFromSpaceFreeList(
+      size_t min_size_in_bytes, size_t max_size_in_bytes,
+      AllocationOrigin origin);
 
   V8_EXPORT_PRIVATE AllocationResult
   AllocateOutsideLab(int size_in_bytes, AllocationAlignment alignment,
@@ -70,13 +79,23 @@ class ConcurrentAllocator {
 
   bool IsBlackAllocationEnabled() const;
 
+  // Checks whether the LAB is currently in use.
+  V8_INLINE bool IsLabValid() { return lab_.top() != kNullAddress; }
+
+  // Resets the LAB.
+  void ResetLab() { lab_ = LinearAllocationArea(kNullAddress, kNullAddress); }
+
+  // Installs a filler object between the LABs top and limit pointers.
+  void MakeLabIterable();
+
   // Returns the Heap of space_. This might differ from the LocalHeap's Heap for
   // shared spaces.
-  Heap* owning_heap() const;
+  Heap* owning_heap() const { return owning_heap_; }
 
   LocalHeap* const local_heap_;
   PagedSpace* const space_;
-  LocalAllocationBuffer lab_;
+  Heap* const owning_heap_;
+  LinearAllocationArea lab_;
 };
 
 }  // namespace internal
diff --git a/deps/v8/src/heap/concurrent-marking.cc b/deps/v8/src/heap/concurrent-marking.cc
index d15cb26bcd4850..652037e2e40ea9 100644
--- a/deps/v8/src/heap/concurrent-marking.cc
+++ b/deps/v8/src/heap/concurrent-marking.cc
@@ -16,6 +16,7 @@
 #include "src/heap/heap.h"
 #include "src/heap/mark-compact-inl.h"
 #include "src/heap/mark-compact.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/marking-visitor-inl.h"
 #include "src/heap/marking-visitor.h"
 #include "src/heap/marking.h"
@@ -52,6 +53,8 @@ class ConcurrentMarkingState final
   }
 
   void IncrementLiveBytes(MemoryChunk* chunk, intptr_t by) {
+    DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                   IsAligned(by, kObjectAlignment8GbHeap));
     (*memory_chunk_data_)[chunk].live_bytes += by;
   }
 
@@ -145,9 +148,7 @@ class ConcurrentMarkingVisitorUtility {
       if (!object.IsHeapObject()) continue;
       HeapObject heap_object = HeapObject::cast(object);
       visitor->SynchronizePageAccess(heap_object);
-      BasicMemoryChunk* target_page =
-          BasicMemoryChunk::FromHeapObject(heap_object);
-      if (!visitor->is_shared_heap() && target_page->InSharedHeap()) continue;
+      if (!visitor->ShouldMarkObject(heap_object)) continue;
       visitor->MarkObject(host, heap_object);
       visitor->RecordSlot(host, slot, heap_object);
     }
@@ -262,7 +263,9 @@ class YoungGenerationConcurrentMarkingVisitor final
             heap->isolate(), worklists_local),
         marking_state_(heap->isolate(), memory_chunk_data) {}
 
-  bool is_shared_heap() { return false; }
+  bool ShouldMarkObject(HeapObject object) const {
+    return !object.InSharedHeap();
+  }
 
   void SynchronizePageAccess(HeapObject heap_object) {
 #ifdef THREAD_SANITIZER
@@ -555,7 +558,7 @@ class ConcurrentMarkingVisitor final
     DCHECK(length.IsSmi());
     int size = T::SizeFor(Smi::ToInt(length));
     marking_state_.IncrementLiveBytes(MemoryChunk::FromHeapObject(object),
-                                      size);
+                                      ALIGN_TO_ALLOCATION_ALIGNMENT(size));
     VisitMapPointer(object);
     T::BodyDescriptor::IterateBody(map, object, size, this);
     return size;
diff --git a/deps/v8/src/heap/conservative-stack-visitor.cc b/deps/v8/src/heap/conservative-stack-visitor.cc
index eaf28607875043..a9785fb284f7c9 100644
--- a/deps/v8/src/heap/conservative-stack-visitor.cc
+++ b/deps/v8/src/heap/conservative-stack-visitor.cc
@@ -4,9 +4,13 @@
 
 #include "src/heap/conservative-stack-visitor.h"
 
-#include "src/heap/large-spaces.h"
-#include "src/heap/paged-spaces-inl.h"
-#include "src/heap/paged-spaces.h"
+#include "src/execution/isolate-inl.h"
+#include "src/heap/mark-compact.h"
+#include "src/objects/visitors.h"
+
+#ifdef V8_COMPRESS_POINTERS
+#include "src/common/ptr-compr-inl.h"
+#endif  // V8_COMPRESS_POINTERS
 
 namespace v8 {
 namespace internal {
@@ -16,61 +20,30 @@ ConservativeStackVisitor::ConservativeStackVisitor(Isolate* isolate,
     : isolate_(isolate), delegate_(delegate) {}
 
 void ConservativeStackVisitor::VisitPointer(const void* pointer) {
-  VisitConservativelyIfPointer(pointer);
+  auto address = reinterpret_cast<Address>(const_cast<void*>(pointer));
+  VisitConservativelyIfPointer(address);
+#ifdef V8_COMPRESS_POINTERS
+  V8HeapCompressionScheme::ProcessIntermediatePointers(
+      isolate_, address,
+      [this](Address ptr) { VisitConservativelyIfPointer(ptr); });
+#endif  // V8_COMPRESS_POINTERS
 }
 
-bool ConservativeStackVisitor::CheckPage(Address address, MemoryChunk* page) {
-  if (address < page->area_start() || address >= page->area_end()) return false;
-
+void ConservativeStackVisitor::VisitConservativelyIfPointer(Address address) {
   Address base_ptr;
-#ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
-  base_ptr = page->object_start_bitmap()->FindBasePtr(address);
-#elif V8_ENABLE_INNER_POINTER_RESOLUTION_MB
+#ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_MB
   base_ptr = isolate_->heap()->mark_compact_collector()->FindBasePtrForMarking(
       address);
 #else
 #error "Some inner pointer resolution mechanism is needed"
-#endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_(OSB|MB)
-
-  if (base_ptr == kNullAddress) return false;
-
-  // At this point, base_ptr *must* refer to the valid object. We check if
-  // |address| resides inside the object or beyond it in unused memory.
+#endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_MB
+  if (base_ptr == kNullAddress) return;
   HeapObject obj = HeapObject::FromAddress(base_ptr);
-  Address obj_end = obj.address() + obj.Size();
-
-  if (address >= obj_end) {
-    // |address| points to unused memory.
-    return false;
-  }
-
   Object root = obj;
   delegate_->VisitRootPointer(Root::kHandleScope, nullptr,
                               FullObjectSlot(&root));
   // Check that the delegate visitor did not modify the root slot.
   DCHECK_EQ(root, obj);
-  return true;
-}
-
-void ConservativeStackVisitor::VisitConservativelyIfPointer(
-    const void* pointer) {
-  auto address = reinterpret_cast<Address>(pointer);
-
-  for (Page* page : *isolate_->heap()->old_space()) {
-    if (CheckPage(address, page)) {
-      return;
-    }
-  }
-
-  for (LargePage* page : *isolate_->heap()->lo_space()) {
-    if (address >= page->area_start() && address < page->area_end()) {
-      Object ptr = page->GetObject();
-      FullObjectSlot root = FullObjectSlot(&ptr);
-      delegate_->VisitRootPointer(Root::kHandleScope, nullptr, root);
-      DCHECK(root == FullObjectSlot(&ptr));
-      return;
-    }
-  }
 }
 
 }  // namespace internal
diff --git a/deps/v8/src/heap/conservative-stack-visitor.h b/deps/v8/src/heap/conservative-stack-visitor.h
index 649608b4235e67..e63ba5b6737802 100644
--- a/deps/v8/src/heap/conservative-stack-visitor.h
+++ b/deps/v8/src/heap/conservative-stack-visitor.h
@@ -5,22 +5,23 @@
 #ifndef V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_
 #define V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_
 
+#include "include/v8-internal.h"
 #include "src/heap/base/stack.h"
-#include "src/heap/memory-chunk.h"
 
 namespace v8 {
 namespace internal {
 
-class ConservativeStackVisitor : public ::heap::base::StackVisitor {
+class RootVisitor;
+
+class V8_EXPORT_PRIVATE ConservativeStackVisitor
+    : public ::heap::base::StackVisitor {
  public:
   ConservativeStackVisitor(Isolate* isolate, RootVisitor* delegate);
 
   void VisitPointer(const void* pointer) final;
 
  private:
-  bool CheckPage(Address address, MemoryChunk* page);
-
-  void VisitConservativelyIfPointer(const void* pointer);
+  void VisitConservativelyIfPointer(Address address);
 
   Isolate* isolate_ = nullptr;
   RootVisitor* delegate_ = nullptr;
diff --git a/deps/v8/src/heap/cppgc-js/cpp-heap.cc b/deps/v8/src/heap/cppgc-js/cpp-heap.cc
index 2a9742b1ea52b4..28beb83e2760ed 100644
--- a/deps/v8/src/heap/cppgc-js/cpp-heap.cc
+++ b/deps/v8/src/heap/cppgc-js/cpp-heap.cc
@@ -55,6 +55,49 @@
 
 namespace v8 {
 
+namespace internal {
+
+class MinorGCHeapGrowing
+    : public cppgc::internal::StatsCollector::AllocationObserver {
+ public:
+  explicit MinorGCHeapGrowing(cppgc::internal::StatsCollector& stats_collector)
+      : stats_collector_(stats_collector) {
+    stats_collector.RegisterObserver(this);
+  }
+  virtual ~MinorGCHeapGrowing() = default;
+
+  void AllocatedObjectSizeIncreased(size_t) final {}
+  void AllocatedObjectSizeDecreased(size_t) final {}
+  void ResetAllocatedObjectSize(size_t allocated_object_size) final {
+    ConfigureLimit(allocated_object_size);
+  }
+
+  bool LimitReached() const {
+    return stats_collector_.allocated_object_size() >= limit_for_atomic_gc_;
+  }
+
+ private:
+  void ConfigureLimit(size_t allocated_object_size) {
+    // Constant growing factor for growing the heap limit.
+    static constexpr double kGrowingFactor = 1.5;
+    // For smaller heaps, allow allocating at least LAB in each regular space
+    // before triggering GC again.
+    static constexpr size_t kMinLimitIncrease =
+        cppgc::internal::kPageSize *
+        cppgc::internal::RawHeap::kNumberOfRegularSpaces;
+
+    const size_t size = std::max(allocated_object_size, initial_heap_size_);
+    limit_for_atomic_gc_ = std::max(static_cast<size_t>(size * kGrowingFactor),
+                                    size + kMinLimitIncrease);
+  }
+
+  cppgc::internal::StatsCollector& stats_collector_;
+  size_t initial_heap_size_ = 1 * cppgc::internal::kMB;
+  size_t limit_for_atomic_gc_ = 0;  // See ConfigureLimit().
+};
+
+}  // namespace internal
+
 namespace {
 
 START_ALLOW_USE_DEPRECATED()
@@ -286,7 +329,8 @@ class UnifiedHeapConservativeMarkingVisitor final
 class UnifiedHeapMarker final : public cppgc::internal::MarkerBase {
  public:
   UnifiedHeapMarker(Heap* v8_heap, cppgc::internal::HeapBase& cpp_heap,
-                    cppgc::Platform* platform, MarkingConfig config);
+                    cppgc::Platform* platform,
+                    cppgc::internal::MarkingConfig config);
 
   ~UnifiedHeapMarker() final = default;
 
@@ -324,7 +368,7 @@ class UnifiedHeapMarker final : public cppgc::internal::MarkerBase {
 UnifiedHeapMarker::UnifiedHeapMarker(Heap* v8_heap,
                                      cppgc::internal::HeapBase& heap,
                                      cppgc::Platform* platform,
-                                     MarkingConfig config)
+                                     cppgc::internal::MarkingConfig config)
     : cppgc::internal::MarkerBase(heap, platform, config),
       mutator_unified_heap_marking_state_(v8_heap, nullptr),
       marking_visitor_(config.collection_type == CppHeap::CollectionType::kMajor
@@ -487,6 +531,8 @@ CppHeap::CppHeap(
           cppgc::internal::HeapBase::StackSupport::
               kSupportsConservativeStackScan,
           marking_support, sweeping_support, *this),
+      minor_gc_heap_growing_(
+          std::make_unique<MinorGCHeapGrowing>(*stats_collector())),
       wrapper_descriptor_(wrapper_descriptor) {
   CHECK_NE(WrapperDescriptor::kUnknownEmbedderId,
            wrapper_descriptor_.embedder_id_for_garbage_collected);
@@ -509,6 +555,29 @@ void CppHeap::Terminate() {
   HeapBase::Terminate();
 }
 
+namespace {
+
+class SweepingOnMutatorThreadForGlobalHandlesObserver final
+    : public cppgc::internal::Sweeper::SweepingOnMutatorThreadObserver {
+ public:
+  SweepingOnMutatorThreadForGlobalHandlesObserver(CppHeap& cpp_heap,
+                                                  GlobalHandles& global_handles)
+      : cppgc::internal::Sweeper::SweepingOnMutatorThreadObserver(
+            cpp_heap.sweeper()),
+        global_handles_(global_handles) {}
+
+  void Start() override {
+    global_handles_.NotifyStartSweepingOnMutatorThread();
+  }
+
+  void End() override { global_handles_.NotifyEndSweepingOnMutatorThread(); }
+
+ private:
+  GlobalHandles& global_handles_;
+};
+
+}  // namespace
+
 void CppHeap::AttachIsolate(Isolate* isolate) {
   CHECK(!in_detached_testing_mode_);
   CHECK_NULL(isolate_);
@@ -522,6 +591,9 @@ void CppHeap::AttachIsolate(Isolate* isolate) {
   SetMetricRecorder(std::make_unique<MetricRecorderAdapter>(*this));
   oom_handler().SetCustomHandler(&FatalOutOfMemoryHandlerImpl);
   ReduceGCCapabilititesFromFlags();
+  sweeping_on_mutator_thread_observer_ =
+      std::make_unique<SweepingOnMutatorThreadForGlobalHandlesObserver>(
+          *this, *isolate_->global_handles());
   no_gc_scope_--;
 }
 
@@ -538,6 +610,8 @@ void CppHeap::DetachIsolate() {
   }
   sweeper_.FinishIfRunning();
 
+  sweeping_on_mutator_thread_observer_.reset();
+
   auto* heap_profiler = isolate_->heap_profiler();
   if (heap_profiler) {
     heap_profiler->RemoveBuildEmbedderGraphCallback(&CppGraphBuilder::Run,
@@ -619,17 +693,20 @@ void CppHeap::InitializeTracing(CollectionType collection_type,
 
 #if defined(CPPGC_YOUNG_GENERATION)
   if (generational_gc_supported() &&
-      *collection_type_ == CollectionType::kMajor)
+      *collection_type_ == CollectionType::kMajor) {
+    cppgc::internal::StatsCollector::EnabledScope stats_scope(
+        stats_collector(), cppgc::internal::StatsCollector::kUnmark);
     cppgc::internal::SequentialUnmarker unmarker(raw_heap());
+  }
 #endif  // defined(CPPGC_YOUNG_GENERATION)
 
   current_gc_flags_ = gc_flags;
 
-  const UnifiedHeapMarker::MarkingConfig marking_config{
+  const cppgc::internal::MarkingConfig marking_config{
       *collection_type_, StackState::kNoHeapPointers, SelectMarkingType(),
       IsForceGC(current_gc_flags_)
-          ? UnifiedHeapMarker::MarkingConfig::IsForcedGC::kForced
-          : UnifiedHeapMarker::MarkingConfig::IsForcedGC::kNotForced};
+          ? cppgc::internal::MarkingConfig::IsForcedGC::kForced
+          : cppgc::internal::MarkingConfig::IsForcedGC::kNotForced};
   DCHECK_IMPLIES(!isolate_,
                  (MarkingType::kAtomic == marking_config.marking_type) ||
                      force_incremental_marking_for_testing_);
@@ -695,8 +772,7 @@ void CppHeap::EnterFinalPause(cppgc::EmbedderStackState stack_state) {
     auto& heap = *isolate()->heap();
     marker.conservative_visitor().SetGlobalHandlesMarkingVisitor(
         std::make_unique<GlobalHandleMarkingVisitor>(
-            heap, *heap.mark_compact_collector()->marking_state(),
-            *heap.mark_compact_collector()->local_marking_worklists()));
+            heap, *heap.mark_compact_collector()->local_marking_worklists()));
   }
   marker.EnterAtomicPause(stack_state);
   if (isolate_ && *collection_type_ == CollectionType::kMinor) {
@@ -753,14 +829,14 @@ void CppHeap::TraceEpilogue() {
 
   {
     cppgc::subtle::NoGarbageCollectionScope no_gc(*this);
-    cppgc::internal::Sweeper::SweepingConfig::CompactableSpaceHandling
+    cppgc::internal::SweepingConfig::CompactableSpaceHandling
         compactable_space_handling = compactor_.CompactSpacesIfEnabled();
-    const cppgc::internal::Sweeper::SweepingConfig sweeping_config{
+    const cppgc::internal::SweepingConfig sweeping_config{
         SelectSweepingType(), compactable_space_handling,
         ShouldReduceMemory(current_gc_flags_)
-            ? cppgc::internal::Sweeper::SweepingConfig::FreeMemoryHandling::
+            ? cppgc::internal::SweepingConfig::FreeMemoryHandling::
                   kDiscardWherePossible
-            : cppgc::internal::Sweeper::SweepingConfig::FreeMemoryHandling::
+            : cppgc::internal::SweepingConfig::FreeMemoryHandling::
                   kDoNotDiscard};
     DCHECK_IMPLIES(!isolate_,
                    SweepingType::kAtomic == sweeping_config.sweeping_type);
@@ -772,15 +848,17 @@ void CppHeap::TraceEpilogue() {
   sweeper().NotifyDoneIfNeeded();
 }
 
-void CppHeap::RunMinorGC(StackState stack_state) {
-  DCHECK(!sweeper_.IsSweepingInProgress());
-
+void CppHeap::RunMinorGCIfNeeded(StackState stack_state) {
   if (!generational_gc_supported()) return;
   if (in_no_gc_scope()) return;
   // Minor GC does not support nesting in full GCs.
   if (IsMarking()) return;
   // Minor GCs with the stack are currently not supported.
   if (stack_state == StackState::kMayContainHeapPointers) return;
+  // Run only when the limit is reached.
+  if (!minor_gc_heap_growing_->LimitReached()) return;
+
+  DCHECK(!sweeper_.IsSweepingInProgress());
 
   // Notify GC tracer that CppGC started young GC cycle.
   isolate_->heap()->tracer()->NotifyYoungCppGCRunning();
@@ -928,8 +1006,8 @@ class CollectCustomSpaceStatisticsAtLastGCTask final : public v8::Task {
   void Run() final {
     cppgc::internal::Sweeper& sweeper = heap_.sweeper();
     if (sweeper.PerformSweepOnMutatorThread(
-            heap_.platform()->MonotonicallyIncreasingTime() +
-            kStepSizeMs.InSecondsF())) {
+            kStepSizeMs,
+            cppgc::internal::StatsCollector::kSweepInTaskForStatistics)) {
       // Sweeping is done.
       DCHECK(!sweeper.IsSweepingInProgress());
       ReportCustomSpaceStatistics(heap_.raw_heap(), std::move(custom_spaces_),
@@ -1004,14 +1082,15 @@ CppHeap::PauseConcurrentMarkingScope::PauseConcurrentMarkingScope(
   }
 }
 
-void CppHeap::CollectGarbage(Config config) {
+void CppHeap::CollectGarbage(cppgc::internal::GCConfig config) {
   if (in_no_gc_scope() || !isolate_) return;
 
   // TODO(mlippautz): Respect full config.
-  const int flags = (config.free_memory_handling ==
-                     Config::FreeMemoryHandling::kDiscardWherePossible)
-                        ? Heap::kReduceMemoryFootprintMask
-                        : Heap::kNoGCFlags;
+  const int flags =
+      (config.free_memory_handling ==
+       cppgc::internal::GCConfig::FreeMemoryHandling::kDiscardWherePossible)
+          ? Heap::kReduceMemoryFootprintMask
+          : Heap::kNoGCFlags;
   isolate_->heap()->CollectAllGarbage(
       flags, GarbageCollectionReason::kCppHeapAllocationFailure);
 }
@@ -1020,7 +1099,9 @@ const cppgc::EmbedderStackState* CppHeap::override_stack_state() const {
   return HeapBase::override_stack_state();
 }
 
-void CppHeap::StartIncrementalGarbageCollection(Config) { UNIMPLEMENTED(); }
+void CppHeap::StartIncrementalGarbageCollection(cppgc::internal::GCConfig) {
+  UNIMPLEMENTED();
+}
 size_t CppHeap::epoch() const { UNIMPLEMENTED(); }
 
 }  // namespace internal
diff --git a/deps/v8/src/heap/cppgc-js/cpp-heap.h b/deps/v8/src/heap/cppgc-js/cpp-heap.h
index c109841ea23626..87473682d091dc 100644
--- a/deps/v8/src/heap/cppgc-js/cpp-heap.h
+++ b/deps/v8/src/heap/cppgc-js/cpp-heap.h
@@ -28,6 +28,7 @@ class Isolate;
 namespace internal {
 
 class CppMarkingState;
+class MinorGCHeapGrowing;
 
 // A C++ heap implementation used with V8 to implement unified heap.
 class V8_EXPORT_PRIVATE CppHeap final
@@ -43,9 +44,8 @@ class V8_EXPORT_PRIVATE CppHeap final
   };
 
   using GarbageCollectionFlags = base::Flags<GarbageCollectionFlagValues>;
-  using StackState = cppgc::internal::GarbageCollector::Config::StackState;
-  using CollectionType =
-      cppgc::internal::GarbageCollector::Config::CollectionType;
+  using StackState = cppgc::internal::StackState;
+  using CollectionType = cppgc::internal::CollectionType;
 
   class MetricRecorderAdapter final : public cppgc::internal::MetricRecorder {
    public:
@@ -139,9 +139,7 @@ class V8_EXPORT_PRIVATE CppHeap final
   void FinishSweepingIfRunning();
   void FinishSweepingIfOutOfWork();
 
-  void InitializeTracing(
-      cppgc::internal::GarbageCollector::Config::CollectionType,
-      GarbageCollectionFlags);
+  void InitializeTracing(CollectionType, GarbageCollectionFlags);
   void StartTracing();
   bool AdvanceTracing(double max_duration);
   bool IsTracingDone();
@@ -149,7 +147,7 @@ class V8_EXPORT_PRIVATE CppHeap final
   void EnterFinalPause(cppgc::EmbedderStackState stack_state);
   bool FinishConcurrentMarkingIfNeeded();
 
-  void RunMinorGC(StackState);
+  void RunMinorGCIfNeeded(StackState);
 
   // StatsCollector::AllocationObserver interface.
   void AllocatedObjectSizeIncreased(size_t) final;
@@ -168,9 +166,9 @@ class V8_EXPORT_PRIVATE CppHeap final
   std::unique_ptr<CppMarkingState> CreateCppMarkingStateForMutatorThread();
 
   // cppgc::internal::GarbageCollector interface.
-  void CollectGarbage(Config) override;
+  void CollectGarbage(cppgc::internal::GCConfig) override;
   const cppgc::EmbedderStackState* override_stack_state() const override;
-  void StartIncrementalGarbageCollection(Config) override;
+  void StartIncrementalGarbageCollection(cppgc::internal::GCConfig) override;
   size_t epoch() const override;
 
  private:
@@ -194,10 +192,14 @@ class V8_EXPORT_PRIVATE CppHeap final
   Isolate* isolate_ = nullptr;
   bool marking_done_ = false;
   // |collection_type_| is initialized when marking is in progress.
-  base::Optional<cppgc::internal::GarbageCollector::Config::CollectionType>
-      collection_type_;
+  base::Optional<CollectionType> collection_type_;
   GarbageCollectionFlags current_gc_flags_;
 
+  std::unique_ptr<MinorGCHeapGrowing> minor_gc_heap_growing_;
+
+  std::unique_ptr<cppgc::internal::Sweeper::SweepingOnMutatorThreadObserver>
+      sweeping_on_mutator_thread_observer_;
+
   // Buffered allocated bytes. Reporting allocated bytes to V8 can trigger a GC
   // atomic pause. Allocated bytes are buffer in case this is temporarily
   // prohibited.
@@ -207,7 +209,6 @@ class V8_EXPORT_PRIVATE CppHeap final
 
   bool in_detached_testing_mode_ = false;
   bool force_incremental_marking_for_testing_ = false;
-
   bool is_in_v8_marking_step_ = false;
 
   friend class MetricRecorderAdapter;
diff --git a/deps/v8/src/heap/cppgc-js/unified-heap-marking-state-inl.h b/deps/v8/src/heap/cppgc-js/unified-heap-marking-state-inl.h
index afa830b0519e9b..212b41ed1d3ecf 100644
--- a/deps/v8/src/heap/cppgc-js/unified-heap-marking-state-inl.h
+++ b/deps/v8/src/heap/cppgc-js/unified-heap-marking-state-inl.h
@@ -14,6 +14,7 @@
 #include "src/heap/cppgc-js/unified-heap-marking-state.h"
 #include "src/heap/heap.h"
 #include "src/heap/mark-compact.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/marking-worklist-inl.h"
 
 namespace v8 {
diff --git a/deps/v8/src/heap/cppgc-js/unified-heap-marking-state.cc b/deps/v8/src/heap/cppgc-js/unified-heap-marking-state.cc
index 10c2c19cac7a5b..116563769f45c1 100644
--- a/deps/v8/src/heap/cppgc-js/unified-heap-marking-state.cc
+++ b/deps/v8/src/heap/cppgc-js/unified-heap-marking-state.cc
@@ -13,8 +13,7 @@ namespace internal {
 UnifiedHeapMarkingState::UnifiedHeapMarkingState(
     Heap* heap, MarkingWorklists::Local* local_marking_worklist)
     : heap_(heap),
-      marking_state_(heap_ ? heap_->mark_compact_collector()->marking_state()
-                           : nullptr),
+      marking_state_(heap_ ? heap_->marking_state() : nullptr),
       local_marking_worklist_(local_marking_worklist),
       track_retaining_path_(v8_flags.track_retaining_path) {
   DCHECK_IMPLIES(v8_flags.track_retaining_path,
diff --git a/deps/v8/src/heap/cppgc-js/unified-heap-marking-verifier.cc b/deps/v8/src/heap/cppgc-js/unified-heap-marking-verifier.cc
index b8940d145a387f..3ac2a93dee8f27 100644
--- a/deps/v8/src/heap/cppgc-js/unified-heap-marking-verifier.cc
+++ b/deps/v8/src/heap/cppgc-js/unified-heap-marking-verifier.cc
@@ -57,7 +57,7 @@ class UnifiedHeapVerificationVisitor final : public JSVisitor {
 
 UnifiedHeapMarkingVerifier::UnifiedHeapMarkingVerifier(
     cppgc::internal::HeapBase& heap_base,
-    cppgc::internal::Heap::Config::CollectionType collection_type)
+    cppgc::internal::CollectionType collection_type)
     : MarkingVerifierBase(
           heap_base, collection_type, state_,
           std::make_unique<UnifiedHeapVerificationVisitor>(state_)) {}
diff --git a/deps/v8/src/heap/cppgc-js/unified-heap-marking-verifier.h b/deps/v8/src/heap/cppgc-js/unified-heap-marking-verifier.h
index 71bed04573541a..78a6ce1e69168f 100644
--- a/deps/v8/src/heap/cppgc-js/unified-heap-marking-verifier.h
+++ b/deps/v8/src/heap/cppgc-js/unified-heap-marking-verifier.h
@@ -14,7 +14,7 @@ class V8_EXPORT_PRIVATE UnifiedHeapMarkingVerifier final
     : public cppgc::internal::MarkingVerifierBase {
  public:
   UnifiedHeapMarkingVerifier(cppgc::internal::HeapBase&,
-                             cppgc::internal::Heap::Config::CollectionType);
+                             cppgc::internal::CollectionType);
   ~UnifiedHeapMarkingVerifier() final = default;
 
  private:
diff --git a/deps/v8/src/heap/cppgc/compactor.cc b/deps/v8/src/heap/cppgc/compactor.cc
index e3792a32f83f01..68ee147dda8798 100644
--- a/deps/v8/src/heap/cppgc/compactor.cc
+++ b/deps/v8/src/heap/cppgc/compactor.cc
@@ -452,13 +452,11 @@ Compactor::Compactor(RawHeap& heap) : heap_(heap) {
   }
 }
 
-bool Compactor::ShouldCompact(
-    GarbageCollector::Config::MarkingType marking_type,
-    GarbageCollector::Config::StackState stack_state) const {
+bool Compactor::ShouldCompact(GCConfig::MarkingType marking_type,
+                              StackState stack_state) const {
   if (compactable_spaces_.empty() ||
-      (marking_type == GarbageCollector::Config::MarkingType::kAtomic &&
-       stack_state ==
-           GarbageCollector::Config::StackState::kMayContainHeapPointers)) {
+      (marking_type == GCConfig::MarkingType::kAtomic &&
+       stack_state == StackState::kMayContainHeapPointers)) {
     // The following check ensures that tests that want to test compaction are
     // not interrupted by garbage collections that cannot use compaction.
     DCHECK(!enable_for_next_gc_for_testing_);
@@ -474,9 +472,8 @@ bool Compactor::ShouldCompact(
   return free_list_size > kFreeListSizeThreshold;
 }
 
-void Compactor::InitializeIfShouldCompact(
-    GarbageCollector::Config::MarkingType marking_type,
-    GarbageCollector::Config::StackState stack_state) {
+void Compactor::InitializeIfShouldCompact(GCConfig::MarkingType marking_type,
+                                          StackState stack_state) {
   DCHECK(!is_enabled_);
 
   if (!ShouldCompact(marking_type, stack_state)) return;
@@ -487,9 +484,8 @@ void Compactor::InitializeIfShouldCompact(
   is_cancelled_ = false;
 }
 
-void Compactor::CancelIfShouldNotCompact(
-    GarbageCollector::Config::MarkingType marking_type,
-    GarbageCollector::Config::StackState stack_state) {
+void Compactor::CancelIfShouldNotCompact(GCConfig::MarkingType marking_type,
+                                         StackState stack_state) {
   if (!is_enabled_ || ShouldCompact(marking_type, stack_state)) return;
 
   is_cancelled_ = true;
diff --git a/deps/v8/src/heap/cppgc/compactor.h b/deps/v8/src/heap/cppgc/compactor.h
index d79e6a7a65053b..9638996a429002 100644
--- a/deps/v8/src/heap/cppgc/compactor.h
+++ b/deps/v8/src/heap/cppgc/compactor.h
@@ -12,9 +12,10 @@
 namespace cppgc {
 namespace internal {
 
+class NormalPageSpace;
+
 class V8_EXPORT_PRIVATE Compactor final {
-  using CompactableSpaceHandling =
-      Sweeper::SweepingConfig::CompactableSpaceHandling;
+  using CompactableSpaceHandling = SweepingConfig::CompactableSpaceHandling;
 
  public:
   explicit Compactor(RawHeap&);
@@ -23,10 +24,8 @@ class V8_EXPORT_PRIVATE Compactor final {
   Compactor(const Compactor&) = delete;
   Compactor& operator=(const Compactor&) = delete;
 
-  void InitializeIfShouldCompact(GarbageCollector::Config::MarkingType,
-                                 GarbageCollector::Config::StackState);
-  void CancelIfShouldNotCompact(GarbageCollector::Config::MarkingType,
-                                GarbageCollector::Config::StackState);
+  void InitializeIfShouldCompact(GCConfig::MarkingType, StackState);
+  void CancelIfShouldNotCompact(GCConfig::MarkingType, StackState);
   // Returns whether spaces need to be processed by the Sweeper after
   // compaction.
   CompactableSpaceHandling CompactSpacesIfEnabled();
@@ -39,8 +38,7 @@ class V8_EXPORT_PRIVATE Compactor final {
   bool IsEnabledForTesting() const { return is_enabled_; }
 
  private:
-  bool ShouldCompact(GarbageCollector::Config::MarkingType,
-                     GarbageCollector::Config::StackState) const;
+  bool ShouldCompact(GCConfig::MarkingType, StackState) const;
 
   RawHeap& heap_;
   // Compactor does not own the compactable spaces. The heap owns all spaces.
diff --git a/deps/v8/src/heap/cppgc/explicit-management.cc b/deps/v8/src/heap/cppgc/explicit-management.cc
index 3a18bd3369e841..560b18dc588d5d 100644
--- a/deps/v8/src/heap/cppgc/explicit-management.cc
+++ b/deps/v8/src/heap/cppgc/explicit-management.cc
@@ -11,6 +11,7 @@
 #include "src/heap/cppgc/heap-object-header.h"
 #include "src/heap/cppgc/heap-page.h"
 #include "src/heap/cppgc/memory.h"
+#include "src/heap/cppgc/object-view.h"
 
 namespace cppgc {
 namespace internal {
@@ -36,21 +37,30 @@ void ExplicitManagementImpl::FreeUnreferencedObject(HeapHandle& heap_handle,
   auto& header = HeapObjectHeader::FromObject(object);
   header.Finalize();
 
-  size_t object_size = 0;
-  USE(object_size);
-
   // `object` is guaranteed to be of type GarbageCollected, so getting the
   // BasePage is okay for regular and large objects.
   BasePage* base_page = BasePage::FromPayload(object);
+
+#if defined(CPPGC_YOUNG_GENERATION)
+  const size_t object_size = ObjectView<>(header).Size();
+
+  if (auto& heap_base = HeapBase::From(heap_handle);
+      heap_base.generational_gc_supported()) {
+    heap_base.remembered_set().InvalidateRememberedSlotsInRange(
+        object, reinterpret_cast<uint8_t*>(object) + object_size);
+    // If this object was registered as remembered, remove it. Do that before
+    // the page gets destroyed.
+    heap_base.remembered_set().InvalidateRememberedSourceObject(header);
+  }
+#endif  // defined(CPPGC_YOUNG_GENERATION)
+
   if (base_page->is_large()) {  // Large object.
-    object_size = LargePage::From(base_page)->ObjectSize();
     base_page->space().RemovePage(base_page);
     base_page->heap().stats_collector()->NotifyExplicitFree(
         LargePage::From(base_page)->PayloadSize());
     LargePage::Destroy(LargePage::From(base_page));
   } else {  // Regular object.
     const size_t header_size = header.AllocatedSize();
-    object_size = header.ObjectSize();
     auto* normal_page = NormalPage::From(base_page);
     auto& normal_space = *static_cast<NormalPageSpace*>(&base_page->space());
     auto& lab = normal_space.linear_allocation_buffer();
@@ -66,15 +76,6 @@ void ExplicitManagementImpl::FreeUnreferencedObject(HeapHandle& heap_handle,
       // list entry.
     }
   }
-#if defined(CPPGC_YOUNG_GENERATION)
-  auto& heap_base = HeapBase::From(heap_handle);
-  if (heap_base.generational_gc_supported()) {
-    heap_base.remembered_set().InvalidateRememberedSlotsInRange(
-        object, reinterpret_cast<uint8_t*>(object) + object_size);
-    // If this object was registered as remembered, remove it.
-    heap_base.remembered_set().InvalidateRememberedSourceObject(header);
-  }
-#endif  // defined(CPPGC_YOUNG_GENERATION)
 }
 
 namespace {
diff --git a/deps/v8/src/heap/cppgc/garbage-collector.h b/deps/v8/src/heap/cppgc/garbage-collector.h
index a49a7a1badbaf4..8a08f56b6b177a 100644
--- a/deps/v8/src/heap/cppgc/garbage-collector.h
+++ b/deps/v8/src/heap/cppgc/garbage-collector.h
@@ -6,8 +6,7 @@
 #define V8_HEAP_CPPGC_GARBAGE_COLLECTOR_H_
 
 #include "include/cppgc/common.h"
-#include "src/heap/cppgc/marker.h"
-#include "src/heap/cppgc/sweeper.h"
+#include "src/heap/cppgc/heap-config.h"
 
 namespace cppgc {
 namespace internal {
@@ -16,62 +15,9 @@ namespace internal {
 // needed to mock/fake GC for testing.
 class GarbageCollector {
  public:
-  struct Config {
-    using CollectionType = Marker::MarkingConfig::CollectionType;
-    using StackState = cppgc::Heap::StackState;
-    using MarkingType = Marker::MarkingConfig::MarkingType;
-    using SweepingType = Sweeper::SweepingConfig::SweepingType;
-    using FreeMemoryHandling = Sweeper::SweepingConfig::FreeMemoryHandling;
-    using IsForcedGC = Marker::MarkingConfig::IsForcedGC;
-
-    static constexpr Config ConservativeAtomicConfig() {
-      return {CollectionType::kMajor, StackState::kMayContainHeapPointers,
-              MarkingType::kAtomic, SweepingType::kAtomic};
-    }
-
-    static constexpr Config PreciseAtomicConfig() {
-      return {CollectionType::kMajor, StackState::kNoHeapPointers,
-              MarkingType::kAtomic, SweepingType::kAtomic};
-    }
-
-    static constexpr Config ConservativeIncrementalConfig() {
-      return {CollectionType::kMajor, StackState::kMayContainHeapPointers,
-              MarkingType::kIncremental, SweepingType::kAtomic};
-    }
-
-    static constexpr Config PreciseIncrementalConfig() {
-      return {CollectionType::kMajor, StackState::kNoHeapPointers,
-              MarkingType::kIncremental, SweepingType::kAtomic};
-    }
-
-    static constexpr Config
-    PreciseIncrementalMarkingConcurrentSweepingConfig() {
-      return {CollectionType::kMajor, StackState::kNoHeapPointers,
-              MarkingType::kIncremental,
-              SweepingType::kIncrementalAndConcurrent};
-    }
-
-    static constexpr Config MinorPreciseAtomicConfig() {
-      return {CollectionType::kMinor, StackState::kNoHeapPointers,
-              MarkingType::kAtomic, SweepingType::kAtomic};
-    }
-
-    static constexpr Config MinorConservativeAtomicConfig() {
-      return {CollectionType::kMinor, StackState::kMayContainHeapPointers,
-              MarkingType::kAtomic, SweepingType::kAtomic};
-    }
-
-    CollectionType collection_type = CollectionType::kMajor;
-    StackState stack_state = StackState::kMayContainHeapPointers;
-    MarkingType marking_type = MarkingType::kAtomic;
-    SweepingType sweeping_type = SweepingType::kAtomic;
-    FreeMemoryHandling free_memory_handling = FreeMemoryHandling::kDoNotDiscard;
-    IsForcedGC is_forced_gc = IsForcedGC::kNotForced;
-  };
-
   // Executes a garbage collection specified in config.
-  virtual void CollectGarbage(Config) = 0;
-  virtual void StartIncrementalGarbageCollection(Config) = 0;
+  virtual void CollectGarbage(GCConfig) = 0;
+  virtual void StartIncrementalGarbageCollection(GCConfig) = 0;
 
   // The current epoch that the GC maintains. The epoch is increased on every
   // GC invocation.
diff --git a/deps/v8/src/heap/cppgc/gc-invoker.cc b/deps/v8/src/heap/cppgc/gc-invoker.cc
index 1bddad7a7e0d4f..8561437552eb71 100644
--- a/deps/v8/src/heap/cppgc/gc-invoker.cc
+++ b/deps/v8/src/heap/cppgc/gc-invoker.cc
@@ -8,7 +8,6 @@
 
 #include "include/cppgc/common.h"
 #include "include/cppgc/platform.h"
-#include "src/heap/cppgc/heap.h"
 #include "src/heap/cppgc/task-handle.h"
 
 namespace cppgc {
@@ -22,8 +21,8 @@ class GCInvoker::GCInvokerImpl final : public GarbageCollector {
   GCInvokerImpl(const GCInvokerImpl&) = delete;
   GCInvokerImpl& operator=(const GCInvokerImpl&) = delete;
 
-  void CollectGarbage(GarbageCollector::Config) final;
-  void StartIncrementalGarbageCollection(GarbageCollector::Config) final;
+  void CollectGarbage(GCConfig) final;
+  void StartIncrementalGarbageCollection(GCConfig) final;
   size_t epoch() const final { return collector_->epoch(); }
   const EmbedderStackState* override_stack_state() const final {
     return collector_->override_stack_state();
@@ -35,7 +34,7 @@ class GCInvoker::GCInvokerImpl final : public GarbageCollector {
     using Handle = SingleThreadedHandle;
 
     static Handle Post(GarbageCollector* collector, cppgc::TaskRunner* runner,
-                       GarbageCollector::Config config) {
+                       GCConfig config) {
       auto task =
           std::make_unique<GCInvoker::GCInvokerImpl::GCTask>(collector, config);
       auto handle = task->GetHandle();
@@ -43,8 +42,7 @@ class GCInvoker::GCInvokerImpl final : public GarbageCollector {
       return handle;
     }
 
-    explicit GCTask(GarbageCollector* collector,
-                    GarbageCollector::Config config)
+    explicit GCTask(GarbageCollector* collector, GCConfig config)
         : collector_(collector),
           config_(config),
           handle_(Handle::NonEmptyTag{}),
@@ -63,7 +61,7 @@ class GCInvoker::GCInvokerImpl final : public GarbageCollector {
     Handle GetHandle() { return handle_; }
 
     GarbageCollector* collector_;
-    GarbageCollector::Config config_;
+    GCConfig config_;
     Handle handle_;
     size_t saved_epoch_;
   };
@@ -87,10 +85,9 @@ GCInvoker::GCInvokerImpl::~GCInvokerImpl() {
   }
 }
 
-void GCInvoker::GCInvokerImpl::CollectGarbage(GarbageCollector::Config config) {
+void GCInvoker::GCInvokerImpl::CollectGarbage(GCConfig config) {
   DCHECK_EQ(config.marking_type, cppgc::Heap::MarkingType::kAtomic);
-  if ((config.stack_state ==
-       GarbageCollector::Config::StackState::kNoHeapPointers) ||
+  if ((config.stack_state == StackState::kNoHeapPointers) ||
       (stack_support_ ==
        cppgc::Heap::StackSupport::kSupportsConservativeStackScan)) {
     collector_->CollectGarbage(config);
@@ -98,8 +95,7 @@ void GCInvoker::GCInvokerImpl::CollectGarbage(GarbageCollector::Config config) {
              platform_->GetForegroundTaskRunner()->NonNestableTasksEnabled()) {
     if (!gc_task_handle_) {
       // Force a precise GC since it will run in a non-nestable task.
-      config.stack_state =
-          GarbageCollector::Config::StackState::kNoHeapPointers;
+      config.stack_state = StackState::kNoHeapPointers;
       DCHECK_NE(cppgc::Heap::StackSupport::kSupportsConservativeStackScan,
                 stack_support_);
       gc_task_handle_ = GCTask::Post(
@@ -109,7 +105,7 @@ void GCInvoker::GCInvokerImpl::CollectGarbage(GarbageCollector::Config config) {
 }
 
 void GCInvoker::GCInvokerImpl::StartIncrementalGarbageCollection(
-    GarbageCollector::Config config) {
+    GCConfig config) {
   DCHECK_NE(config.marking_type, cppgc::Heap::MarkingType::kAtomic);
   if ((stack_support_ !=
        cppgc::Heap::StackSupport::kSupportsConservativeStackScan) &&
@@ -134,12 +130,11 @@ GCInvoker::GCInvoker(GarbageCollector* collector, cppgc::Platform* platform,
 
 GCInvoker::~GCInvoker() = default;
 
-void GCInvoker::CollectGarbage(GarbageCollector::Config config) {
+void GCInvoker::CollectGarbage(GCConfig config) {
   impl_->CollectGarbage(config);
 }
 
-void GCInvoker::StartIncrementalGarbageCollection(
-    GarbageCollector::Config config) {
+void GCInvoker::StartIncrementalGarbageCollection(GCConfig config) {
   impl_->StartIncrementalGarbageCollection(config);
 }
 
diff --git a/deps/v8/src/heap/cppgc/gc-invoker.h b/deps/v8/src/heap/cppgc/gc-invoker.h
index ceebca139c8355..c3c379721b5bf0 100644
--- a/deps/v8/src/heap/cppgc/gc-invoker.h
+++ b/deps/v8/src/heap/cppgc/gc-invoker.h
@@ -34,8 +34,8 @@ class V8_EXPORT_PRIVATE GCInvoker final : public GarbageCollector {
   GCInvoker(const GCInvoker&) = delete;
   GCInvoker& operator=(const GCInvoker&) = delete;
 
-  void CollectGarbage(GarbageCollector::Config) final;
-  void StartIncrementalGarbageCollection(GarbageCollector::Config) final;
+  void CollectGarbage(GCConfig) final;
+  void StartIncrementalGarbageCollection(GCConfig) final;
   size_t epoch() const final;
   const EmbedderStackState* override_stack_state() const final;
 
diff --git a/deps/v8/src/heap/cppgc/globals.h b/deps/v8/src/heap/cppgc/globals.h
index 19d5cca59cbb9d..84fb389a7efd27 100644
--- a/deps/v8/src/heap/cppgc/globals.h
+++ b/deps/v8/src/heap/cppgc/globals.h
@@ -80,6 +80,12 @@ constexpr size_t kCagedHeapReservationSize = static_cast<size_t>(4) * kGB;
 #endif  // !defined(CPPGC_2GB_CAGE)
 constexpr size_t kCagedHeapReservationAlignment = kCagedHeapReservationSize;
 
+#if defined(CPPGC_POINTER_COMPRESSION)
+constexpr size_t kSlotSize = sizeof(uint32_t);
+#else   // !defined(CPPGC_POINTER_COMPRESSION)
+constexpr size_t kSlotSize = sizeof(uintptr_t);
+#endif  // !defined(CPPGC_POINTER_COMPRESSION)
+
 }  // namespace internal
 }  // namespace cppgc
 
diff --git a/deps/v8/src/heap/cppgc/heap-base.cc b/deps/v8/src/heap/cppgc/heap-base.cc
index d057d820c8d82b..3b17bb8aa68d1c 100644
--- a/deps/v8/src/heap/cppgc/heap-base.cc
+++ b/deps/v8/src/heap/cppgc/heap-base.cc
@@ -250,18 +250,16 @@ void HeapBase::Terminate() {
 #endif  // defined(CPPGC_YOUNG_GENERATION)
 
     in_atomic_pause_ = true;
-    stats_collector()->NotifyMarkingStarted(
-        GarbageCollector::Config::CollectionType::kMajor,
-        GarbageCollector::Config::MarkingType::kAtomic,
-        GarbageCollector::Config::IsForcedGC::kForced);
+    stats_collector()->NotifyMarkingStarted(CollectionType::kMajor,
+                                            GCConfig::MarkingType::kAtomic,
+                                            GCConfig::IsForcedGC::kForced);
     object_allocator().ResetLinearAllocationBuffers();
     stats_collector()->NotifyMarkingCompleted(0);
     ExecutePreFinalizers();
     // TODO(chromium:1029379): Prefinalizers may black-allocate objects (under a
     // compile-time option). Run sweeping with forced finalization here.
-    sweeper().Start(
-        {Sweeper::SweepingConfig::SweepingType::kAtomic,
-         Sweeper::SweepingConfig::CompactableSpaceHandling::kSweep});
+    sweeper().Start({SweepingConfig::SweepingType::kAtomic,
+                     SweepingConfig::CompactableSpaceHandling::kSweep});
     in_atomic_pause_ = false;
 
     sweeper().NotifyDoneIfNeeded();
diff --git a/deps/v8/src/heap/cppgc/heap-config.h b/deps/v8/src/heap/cppgc/heap-config.h
new file mode 100644
index 00000000000000..a89581387bff69
--- /dev/null
+++ b/deps/v8/src/heap/cppgc/heap-config.h
@@ -0,0 +1,103 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_CPPGC_HEAP_CONFIG_H_
+#define V8_HEAP_CPPGC_HEAP_CONFIG_H_
+
+#include "include/cppgc/heap.h"
+
+namespace cppgc::internal {
+
+using StackState = cppgc::Heap::StackState;
+
+enum class CollectionType : uint8_t {
+  kMinor,
+  kMajor,
+};
+
+struct MarkingConfig {
+  using MarkingType = cppgc::Heap::MarkingType;
+  enum class IsForcedGC : uint8_t {
+    kNotForced,
+    kForced,
+  };
+
+  static constexpr MarkingConfig Default() { return {}; }
+
+  const CollectionType collection_type = CollectionType::kMajor;
+  StackState stack_state = StackState::kMayContainHeapPointers;
+  MarkingType marking_type = MarkingType::kIncremental;
+  IsForcedGC is_forced_gc = IsForcedGC::kNotForced;
+};
+
+struct SweepingConfig {
+  using SweepingType = cppgc::Heap::SweepingType;
+  enum class CompactableSpaceHandling { kSweep, kIgnore };
+  enum class FreeMemoryHandling { kDoNotDiscard, kDiscardWherePossible };
+
+  SweepingType sweeping_type = SweepingType::kIncrementalAndConcurrent;
+  CompactableSpaceHandling compactable_space_handling =
+      CompactableSpaceHandling::kSweep;
+  FreeMemoryHandling free_memory_handling = FreeMemoryHandling::kDoNotDiscard;
+};
+
+struct GCConfig {
+  using MarkingType = MarkingConfig::MarkingType;
+  using SweepingType = SweepingConfig::SweepingType;
+  using FreeMemoryHandling = SweepingConfig::FreeMemoryHandling;
+  using IsForcedGC = MarkingConfig::IsForcedGC;
+
+  static constexpr GCConfig ConservativeAtomicConfig() {
+    return {CollectionType::kMajor, StackState::kMayContainHeapPointers,
+            MarkingType::kAtomic, SweepingType::kAtomic};
+  }
+
+  static constexpr GCConfig PreciseAtomicConfig() {
+    return {CollectionType::kMajor, StackState::kNoHeapPointers,
+            MarkingType::kAtomic, SweepingType::kAtomic};
+  }
+
+  static constexpr GCConfig ConservativeIncrementalConfig() {
+    return {CollectionType::kMajor, StackState::kMayContainHeapPointers,
+            MarkingType::kIncremental, SweepingType::kAtomic};
+  }
+
+  static constexpr GCConfig PreciseIncrementalConfig() {
+    return {CollectionType::kMajor, StackState::kNoHeapPointers,
+            MarkingType::kIncremental, SweepingType::kAtomic};
+  }
+
+  static constexpr GCConfig
+  PreciseIncrementalMarkingConcurrentSweepingConfig() {
+    return {CollectionType::kMajor, StackState::kNoHeapPointers,
+            MarkingType::kIncremental, SweepingType::kIncrementalAndConcurrent};
+  }
+
+  static constexpr GCConfig PreciseConcurrentConfig() {
+    return {CollectionType::kMajor, StackState::kNoHeapPointers,
+            MarkingType::kIncrementalAndConcurrent,
+            SweepingType::kIncrementalAndConcurrent};
+  }
+
+  static constexpr GCConfig MinorPreciseAtomicConfig() {
+    return {CollectionType::kMinor, StackState::kNoHeapPointers,
+            MarkingType::kAtomic, SweepingType::kAtomic};
+  }
+
+  static constexpr GCConfig MinorConservativeAtomicConfig() {
+    return {CollectionType::kMinor, StackState::kMayContainHeapPointers,
+            MarkingType::kAtomic, SweepingType::kAtomic};
+  }
+
+  CollectionType collection_type = CollectionType::kMajor;
+  StackState stack_state = StackState::kMayContainHeapPointers;
+  MarkingType marking_type = MarkingType::kAtomic;
+  SweepingType sweeping_type = SweepingType::kAtomic;
+  FreeMemoryHandling free_memory_handling = FreeMemoryHandling::kDoNotDiscard;
+  IsForcedGC is_forced_gc = IsForcedGC::kNotForced;
+};
+
+}  // namespace cppgc::internal
+
+#endif  // V8_HEAP_CPPGC_HEAP_CONFIG_H_
diff --git a/deps/v8/src/heap/cppgc/heap-growing.cc b/deps/v8/src/heap/cppgc/heap-growing.cc
index 1055626a0a3548..0af0119863aebd 100644
--- a/deps/v8/src/heap/cppgc/heap-growing.cc
+++ b/deps/v8/src/heap/cppgc/heap-growing.cc
@@ -93,14 +93,12 @@ void HeapGrowing::HeapGrowingImpl::AllocatedObjectSizeIncreased(size_t) {
   size_t allocated_object_size = stats_collector_->allocated_object_size();
   if (allocated_object_size > limit_for_atomic_gc_) {
     collector_->CollectGarbage(
-        {GarbageCollector::Config::CollectionType::kMajor,
-         GarbageCollector::Config::StackState::kMayContainHeapPointers,
-         GarbageCollector::Config::MarkingType::kAtomic, sweeping_support_});
+        {CollectionType::kMajor, StackState::kMayContainHeapPointers,
+         GCConfig::MarkingType::kAtomic, sweeping_support_});
   } else if (allocated_object_size > limit_for_incremental_gc_) {
     if (marking_support_ == cppgc::Heap::MarkingType::kAtomic) return;
     collector_->StartIncrementalGarbageCollection(
-        {GarbageCollector::Config::CollectionType::kMajor,
-         GarbageCollector::Config::StackState::kMayContainHeapPointers,
+        {CollectionType::kMajor, StackState::kMayContainHeapPointers,
          marking_support_, sweeping_support_});
   }
 }
diff --git a/deps/v8/src/heap/cppgc/heap-page.cc b/deps/v8/src/heap/cppgc/heap-page.cc
index 07baf2e79d2c14..7e85eeca475e3d 100644
--- a/deps/v8/src/heap/cppgc/heap-page.cc
+++ b/deps/v8/src/heap/cppgc/heap-page.cc
@@ -18,6 +18,7 @@
 #include "src/heap/cppgc/object-start-bitmap.h"
 #include "src/heap/cppgc/page-memory.h"
 #include "src/heap/cppgc/raw-heap.h"
+#include "src/heap/cppgc/remembered-set.h"
 #include "src/heap/cppgc/stats-collector.h"
 
 namespace cppgc {
@@ -85,6 +86,13 @@ ConstAddress BasePage::PayloadEnd() const {
   return const_cast<BasePage*>(this)->PayloadEnd();
 }
 
+size_t BasePage::AllocatedSize() const {
+  return is_large() ? LargePage::PageHeaderSize() +
+                          LargePage::From(this)->PayloadSize()
+                    : NormalPage::From(this)->PayloadSize() +
+                          RoundUp(sizeof(NormalPage), kAllocationGranularity);
+}
+
 size_t BasePage::AllocatedBytesAtLastGC() const {
   return is_large() ? LargePage::From(this)->AllocatedBytesAtLastGC()
                     : NormalPage::From(this)->AllocatedBytesAtLastGC();
@@ -120,8 +128,32 @@ const HeapObjectHeader* BasePage::TryObjectHeaderFromInnerAddress(
   return header;
 }
 
+#if defined(CPPGC_YOUNG_GENERATION)
+void BasePage::AllocateSlotSet() {
+  DCHECK_NULL(slot_set_);
+  slot_set_ = decltype(slot_set_)(
+      static_cast<SlotSet*>(
+          SlotSet::Allocate(SlotSet::BucketsForSize(AllocatedSize()))),
+      SlotSetDeleter{AllocatedSize()});
+}
+
+void BasePage::SlotSetDeleter::operator()(SlotSet* slot_set) const {
+  DCHECK_NOT_NULL(slot_set);
+  SlotSet::Delete(slot_set, SlotSet::BucketsForSize(page_size_));
+}
+
+void BasePage::ResetSlotSet() { slot_set_.reset(); }
+#endif  // defined(CPPGC_YOUNG_GENERATION)
+
 BasePage::BasePage(HeapBase& heap, BaseSpace& space, PageType type)
-    : BasePageHandle(heap), space_(space), type_(type) {
+    : BasePageHandle(heap),
+      space_(space),
+      type_(type)
+#if defined(CPPGC_YOUNG_GENERATION)
+      ,
+      slot_set_(nullptr, SlotSetDeleter{})
+#endif  // defined(CPPGC_YOUNG_GENERATION)
+{
   DCHECK_EQ(0u, (reinterpret_cast<uintptr_t>(this) - kGuardPageSize) &
                     kPageOffsetMask);
   DCHECK_EQ(&heap.raw_heap(), space_.raw_heap());
diff --git a/deps/v8/src/heap/cppgc/heap-page.h b/deps/v8/src/heap/cppgc/heap-page.h
index f20f159e73a65e..a60bb1448d29c8 100644
--- a/deps/v8/src/heap/cppgc/heap-page.h
+++ b/deps/v8/src/heap/cppgc/heap-page.h
@@ -8,6 +8,7 @@
 #include "include/cppgc/internal/base-page-handle.h"
 #include "src/base/iterator.h"
 #include "src/base/macros.h"
+#include "src/heap/base/basic-slot-set.h"
 #include "src/heap/cppgc/globals.h"
 #include "src/heap/cppgc/heap-object-header.h"
 #include "src/heap/cppgc/object-start-bitmap.h"
@@ -20,6 +21,7 @@ class NormalPageSpace;
 class LargePageSpace;
 class HeapBase;
 class PageBackend;
+class SlotSet;
 
 class V8_EXPORT_PRIVATE BasePage : public BasePageHandle {
  public:
@@ -45,6 +47,9 @@ class V8_EXPORT_PRIVATE BasePage : public BasePageHandle {
   Address PayloadEnd();
   ConstAddress PayloadEnd() const;
 
+  // Size of the payload with the page header.
+  size_t AllocatedSize() const;
+
   // Returns the size of live objects on the page at the last GC.
   // The counter is update after sweeping.
   size_t AllocatedBytesAtLastGC() const;
@@ -92,14 +97,29 @@ class V8_EXPORT_PRIVATE BasePage : public BasePageHandle {
     contains_young_objects_ = value;
   }
 
+#if defined(CPPGC_YOUNG_GENERATION)
+  V8_INLINE SlotSet* slot_set() const { return slot_set_.get(); }
+  V8_INLINE SlotSet& GetOrAllocateSlotSet();
+  void ResetSlotSet();
+#endif  // defined(CPPGC_YOUNG_GENERATION)
+
  protected:
   enum class PageType : uint8_t { kNormal, kLarge };
   BasePage(HeapBase&, BaseSpace&, PageType);
 
  private:
+  struct SlotSetDeleter {
+    void operator()(SlotSet*) const;
+    size_t page_size_ = 0;
+  };
+  void AllocateSlotSet();
+
   BaseSpace& space_;
   PageType type_;
   bool contains_young_objects_ = false;
+#if defined(CPPGC_YOUNG_GENERATION)
+  std::unique_ptr<SlotSet, SlotSetDeleter> slot_set_;
+#endif  // defined(CPPGC_YOUNG_GENERATION)
   size_t discarded_memory_ = 0;
 };
 
@@ -311,6 +331,13 @@ const HeapObjectHeader& BasePage::ObjectHeaderFromInnerAddress(
   return *header;
 }
 
+#if defined(CPPGC_YOUNG_GENERATION)
+SlotSet& BasePage::GetOrAllocateSlotSet() {
+  if (!slot_set_) AllocateSlotSet();
+  return *slot_set_;
+}
+#endif  // defined(CPPGC_YOUNG_GENERATION)
+
 }  // namespace internal
 }  // namespace cppgc
 
diff --git a/deps/v8/src/heap/cppgc/heap.cc b/deps/v8/src/heap/cppgc/heap.cc
index 9cd52b8dd0c8ba..7bc55b51dea6c0 100644
--- a/deps/v8/src/heap/cppgc/heap.cc
+++ b/deps/v8/src/heap/cppgc/heap.cc
@@ -45,11 +45,10 @@ std::unique_ptr<Heap> Heap::Create(std::shared_ptr<cppgc::Platform> platform,
 void Heap::ForceGarbageCollectionSlow(const char* source, const char* reason,
                                       Heap::StackState stack_state) {
   internal::Heap::From(this)->CollectGarbage(
-      {internal::GarbageCollector::Config::CollectionType::kMajor, stack_state,
-       MarkingType::kAtomic, SweepingType::kAtomic,
-       internal::GarbageCollector::Config::FreeMemoryHandling::
-           kDiscardWherePossible,
-       internal::GarbageCollector::Config::IsForcedGC::kForced});
+      {internal::CollectionType::kMajor, stack_state, MarkingType::kAtomic,
+       SweepingType::kAtomic,
+       internal::GCConfig::FreeMemoryHandling::kDiscardWherePossible,
+       internal::GCConfig::IsForcedGC::kForced});
 }
 
 AllocationHandle& Heap::GetAllocationHandle() {
@@ -62,12 +61,11 @@ namespace internal {
 
 namespace {
 
-void CheckConfig(Heap::Config config, HeapBase::MarkingType marking_support,
+void CheckConfig(GCConfig config, HeapBase::MarkingType marking_support,
                  HeapBase::SweepingType sweeping_support) {
-  CHECK_WITH_MSG(
-      (config.collection_type != Heap::Config::CollectionType::kMinor) ||
-          (config.stack_state == Heap::Config::StackState::kNoHeapPointers),
-      "Minor GCs with stack is currently not supported");
+  CHECK_WITH_MSG((config.collection_type != CollectionType::kMinor) ||
+                     (config.stack_state == StackState::kNoHeapPointers),
+                 "Minor GCs with stack is currently not supported");
   CHECK_LE(static_cast<int>(config.marking_type),
            static_cast<int>(marking_support));
   CHECK_LE(static_cast<int>(config.sweeping_type),
@@ -94,17 +92,16 @@ Heap::~Heap() {
   // Gracefully finish already running GC if any, but don't finalize live
   // objects.
   FinalizeIncrementalGarbageCollectionIfRunning(
-      {Config::CollectionType::kMajor,
-       Config::StackState::kMayContainHeapPointers,
-       Config::MarkingType::kAtomic, Config::SweepingType::kAtomic});
+      {CollectionType::kMajor, StackState::kMayContainHeapPointers,
+       GCConfig::MarkingType::kAtomic, GCConfig::SweepingType::kAtomic});
   {
     subtle::NoGarbageCollectionScope no_gc(*this);
     sweeper_.FinishIfRunning();
   }
 }
 
-void Heap::CollectGarbage(Config config) {
-  DCHECK_EQ(Config::MarkingType::kAtomic, config.marking_type);
+void Heap::CollectGarbage(GCConfig config) {
+  DCHECK_EQ(GCConfig::MarkingType::kAtomic, config.marking_type);
   CheckConfig(config, marking_support_, sweeping_support_);
 
   if (in_no_gc_scope()) return;
@@ -118,9 +115,9 @@ void Heap::CollectGarbage(Config config) {
   FinalizeGarbageCollection(config.stack_state);
 }
 
-void Heap::StartIncrementalGarbageCollection(Config config) {
-  DCHECK_NE(Config::MarkingType::kAtomic, config.marking_type);
-  DCHECK_NE(marking_support_, Config::MarkingType::kAtomic);
+void Heap::StartIncrementalGarbageCollection(GCConfig config) {
+  DCHECK_NE(GCConfig::MarkingType::kAtomic, config.marking_type);
+  DCHECK_NE(marking_support_, GCConfig::MarkingType::kAtomic);
   CheckConfig(config, marking_support_, sweeping_support_);
 
   if (IsMarking() || in_no_gc_scope()) return;
@@ -130,19 +127,19 @@ void Heap::StartIncrementalGarbageCollection(Config config) {
   StartGarbageCollection(config);
 }
 
-void Heap::FinalizeIncrementalGarbageCollectionIfRunning(Config config) {
+void Heap::FinalizeIncrementalGarbageCollectionIfRunning(GCConfig config) {
   CheckConfig(config, marking_support_, sweeping_support_);
 
   if (!IsMarking()) return;
 
   DCHECK(!in_no_gc_scope());
 
-  DCHECK_NE(Config::MarkingType::kAtomic, config_.marking_type);
+  DCHECK_NE(GCConfig::MarkingType::kAtomic, config_.marking_type);
   config_ = config;
   FinalizeGarbageCollection(config.stack_state);
 }
 
-void Heap::StartGarbageCollection(Config config) {
+void Heap::StartGarbageCollection(GCConfig config) {
   DCHECK(!IsMarking());
   DCHECK(!in_no_gc_scope());
 
@@ -152,18 +149,17 @@ void Heap::StartGarbageCollection(Config config) {
   epoch_++;
 
 #if defined(CPPGC_YOUNG_GENERATION)
-  if (config.collection_type == Config::CollectionType::kMajor)
+  if (config.collection_type == CollectionType::kMajor)
     SequentialUnmarker unmarker(raw_heap());
 #endif  // defined(CPPGC_YOUNG_GENERATION)
 
-  const Marker::MarkingConfig marking_config{
-      config.collection_type, config.stack_state, config.marking_type,
-      config.is_forced_gc};
+  const MarkingConfig marking_config{config.collection_type, config.stack_state,
+                                     config.marking_type, config.is_forced_gc};
   marker_ = std::make_unique<Marker>(AsBase(), platform_.get(), marking_config);
   marker_->StartMarking();
 }
 
-void Heap::FinalizeGarbageCollection(Config::StackState stack_state) {
+void Heap::FinalizeGarbageCollection(StackState stack_state) {
   DCHECK(IsMarking());
   DCHECK(!in_no_gc_scope());
   CHECK(!in_disallow_gc_scope());
@@ -203,9 +199,8 @@ void Heap::FinalizeGarbageCollection(Config::StackState stack_state) {
 #endif  // defined(CPPGC_YOUNG_GENERATION)
 
   subtle::NoGarbageCollectionScope no_gc(*this);
-  const Sweeper::SweepingConfig sweeping_config{
-      config_.sweeping_type,
-      Sweeper::SweepingConfig::CompactableSpaceHandling::kSweep,
+  const SweepingConfig sweeping_config{
+      config_.sweeping_type, SweepingConfig::CompactableSpaceHandling::kSweep,
       config_.free_memory_handling};
   sweeper_.Start(sweeping_config);
   in_atomic_pause_ = false;
@@ -221,7 +216,7 @@ void Heap::EnableGenerationalGC() {
 void Heap::DisableHeapGrowingForTesting() { growing_.DisableForTesting(); }
 
 void Heap::FinalizeIncrementalGarbageCollectionIfNeeded(
-    Config::StackState stack_state) {
+    StackState stack_state) {
   StatsCollector::EnabledScope stats_scope(
       stats_collector(), StatsCollector::kMarkIncrementalFinalize);
   FinalizeGarbageCollection(stack_state);
@@ -230,10 +225,9 @@ void Heap::FinalizeIncrementalGarbageCollectionIfNeeded(
 void Heap::StartIncrementalGarbageCollectionForTesting() {
   DCHECK(!IsMarking());
   DCHECK(!in_no_gc_scope());
-  StartGarbageCollection({Config::CollectionType::kMajor,
-                          Config::StackState::kNoHeapPointers,
-                          Config::MarkingType::kIncrementalAndConcurrent,
-                          Config::SweepingType::kIncrementalAndConcurrent});
+  StartGarbageCollection({CollectionType::kMajor, StackState::kNoHeapPointers,
+                          GCConfig::MarkingType::kIncrementalAndConcurrent,
+                          GCConfig::SweepingType::kIncrementalAndConcurrent});
 }
 
 void Heap::FinalizeIncrementalGarbageCollectionForTesting(
diff --git a/deps/v8/src/heap/cppgc/heap.h b/deps/v8/src/heap/cppgc/heap.h
index cc027974f81a40..3a9e09fa5ffbcc 100644
--- a/deps/v8/src/heap/cppgc/heap.h
+++ b/deps/v8/src/heap/cppgc/heap.h
@@ -32,9 +32,9 @@ class V8_EXPORT_PRIVATE Heap final : public HeapBase,
   HeapBase& AsBase() { return *this; }
   const HeapBase& AsBase() const { return *this; }
 
-  void CollectGarbage(Config) final;
-  void StartIncrementalGarbageCollection(Config) final;
-  void FinalizeIncrementalGarbageCollectionIfRunning(Config);
+  void CollectGarbage(GCConfig) final;
+  void StartIncrementalGarbageCollection(GCConfig) final;
+  void FinalizeIncrementalGarbageCollectionIfRunning(GCConfig);
 
   size_t epoch() const final { return epoch_; }
   const EmbedderStackState* override_stack_state() const final {
@@ -46,15 +46,15 @@ class V8_EXPORT_PRIVATE Heap final : public HeapBase,
   void DisableHeapGrowingForTesting();
 
  private:
-  void StartGarbageCollection(Config);
-  void FinalizeGarbageCollection(Config::StackState);
+  void StartGarbageCollection(GCConfig);
+  void FinalizeGarbageCollection(StackState);
 
-  void FinalizeIncrementalGarbageCollectionIfNeeded(Config::StackState) final;
+  void FinalizeIncrementalGarbageCollectionIfNeeded(StackState) final;
 
   void StartIncrementalGarbageCollectionForTesting() final;
   void FinalizeIncrementalGarbageCollectionForTesting(EmbedderStackState) final;
 
-  Config config_;
+  GCConfig config_;
   GCInvoker gc_invoker_;
   HeapGrowing growing_;
   bool generational_gc_enabled_ = false;
diff --git a/deps/v8/src/heap/cppgc/marker.cc b/deps/v8/src/heap/cppgc/marker.cc
index 056f18912e6048..11197dafb88326 100644
--- a/deps/v8/src/heap/cppgc/marker.cc
+++ b/deps/v8/src/heap/cppgc/marker.cc
@@ -32,11 +32,10 @@ namespace internal {
 
 namespace {
 
-bool EnterIncrementalMarkingIfNeeded(Marker::MarkingConfig config,
-                                     HeapBase& heap) {
-  if (config.marking_type == Marker::MarkingConfig::MarkingType::kIncremental ||
+bool EnterIncrementalMarkingIfNeeded(MarkingConfig config, HeapBase& heap) {
+  if (config.marking_type == MarkingConfig::MarkingType::kIncremental ||
       config.marking_type ==
-          Marker::MarkingConfig::MarkingType::kIncrementalAndConcurrent) {
+          MarkingConfig::MarkingType::kIncrementalAndConcurrent) {
     WriteBarrier::FlagUpdater::Enter();
     heap.set_incremental_marking_in_progress(true);
     return true;
@@ -44,11 +43,10 @@ bool EnterIncrementalMarkingIfNeeded(Marker::MarkingConfig config,
   return false;
 }
 
-bool ExitIncrementalMarkingIfNeeded(Marker::MarkingConfig config,
-                                    HeapBase& heap) {
-  if (config.marking_type == Marker::MarkingConfig::MarkingType::kIncremental ||
+bool ExitIncrementalMarkingIfNeeded(MarkingConfig config, HeapBase& heap) {
+  if (config.marking_type == MarkingConfig::MarkingType::kIncremental ||
       config.marking_type ==
-          Marker::MarkingConfig::MarkingType::kIncrementalAndConcurrent) {
+          MarkingConfig::MarkingType::kIncrementalAndConcurrent) {
     WriteBarrier::FlagUpdater::Exit();
     heap.set_incremental_marking_in_progress(false);
     return true;
@@ -87,7 +85,7 @@ class MarkerBase::IncrementalMarkingTask final : public cppgc::Task {
  public:
   using Handle = SingleThreadedHandle;
 
-  IncrementalMarkingTask(MarkerBase*, MarkingConfig::StackState);
+  IncrementalMarkingTask(MarkerBase*, StackState);
 
   static Handle Post(cppgc::TaskRunner*, MarkerBase*);
 
@@ -95,13 +93,13 @@ class MarkerBase::IncrementalMarkingTask final : public cppgc::Task {
   void Run() final;
 
   MarkerBase* const marker_;
-  MarkingConfig::StackState stack_state_;
+  StackState stack_state_;
   // TODO(chromium:1056170): Change to CancelableTask.
   Handle handle_;
 };
 
 MarkerBase::IncrementalMarkingTask::IncrementalMarkingTask(
-    MarkerBase* marker, MarkingConfig::StackState stack_state)
+    MarkerBase* marker, StackState stack_state)
     : marker_(marker),
       stack_state_(stack_state),
       handle_(Handle::NonEmptyTag{}) {}
@@ -117,10 +115,9 @@ MarkerBase::IncrementalMarkingTask::Post(cppgc::TaskRunner* runner,
   DCHECK_IMPLIES(marker->heap().stack_support() !=
                      HeapBase::StackSupport::kSupportsConservativeStackScan,
                  runner->NonNestableTasksEnabled());
-  MarkingConfig::StackState stack_state_for_task =
-      runner->NonNestableTasksEnabled()
-          ? MarkingConfig::StackState::kNoHeapPointers
-          : MarkingConfig::StackState::kMayContainHeapPointers;
+  const auto stack_state_for_task = runner->NonNestableTasksEnabled()
+                                        ? StackState::kNoHeapPointers
+                                        : StackState::kMayContainHeapPointers;
   auto task =
       std::make_unique<IncrementalMarkingTask>(marker, stack_state_for_task);
   auto handle = task->handle_;
@@ -152,9 +149,8 @@ MarkerBase::MarkerBase(HeapBase& heap, cppgc::Platform* platform,
       foreground_task_runner_(platform_->GetForegroundTaskRunner()),
       mutator_marking_state_(heap, marking_worklists_,
                              heap.compactor().compaction_worklists()) {
-  DCHECK_IMPLIES(
-      config_.collection_type == MarkingConfig::CollectionType::kMinor,
-      heap_.generational_gc_supported());
+  DCHECK_IMPLIES(config_.collection_type == CollectionType::kMinor,
+                 heap_.generational_gc_supported());
 }
 
 MarkerBase::~MarkerBase() {
@@ -163,7 +159,7 @@ MarkerBase::~MarkerBase() {
   // and should thus already be marked.
   if (!marking_worklists_.not_fully_constructed_worklist()->IsEmpty()) {
 #if DEBUG
-    DCHECK_NE(MarkingConfig::StackState::kNoHeapPointers, config_.stack_state);
+    DCHECK_NE(StackState::kNoHeapPointers, config_.stack_state);
     std::unordered_set<HeapObjectHeader*> objects =
         mutator_marking_state_.not_fully_constructed_worklist().Extract();
     for (HeapObjectHeader* object : objects) DCHECK(object->IsMarked());
@@ -229,7 +225,7 @@ void MarkerBase::StartMarking() {
     // Performing incremental or concurrent marking.
     schedule_.NotifyIncrementalMarkingStart();
     // Scanning the stack is expensive so we only do it at the atomic pause.
-    VisitRoots(MarkingConfig::StackState::kNoHeapPointers);
+    VisitRoots(StackState::kNoHeapPointers);
     ScheduleIncrementalMarkingTask();
     if (config_.marking_type ==
         MarkingConfig::MarkingType::kIncrementalAndConcurrent) {
@@ -244,14 +240,14 @@ void MarkerBase::StartMarking() {
 }
 
 void MarkerBase::HandleNotFullyConstructedObjects() {
-  if (config_.stack_state == MarkingConfig::StackState::kNoHeapPointers) {
+  if (config_.stack_state == StackState::kNoHeapPointers) {
     mutator_marking_state_.FlushNotFullyConstructedObjects();
   } else {
     MarkNotFullyConstructedObjects();
   }
 }
 
-void MarkerBase::EnterAtomicPause(MarkingConfig::StackState stack_state) {
+void MarkerBase::EnterAtomicPause(StackState stack_state) {
   StatsCollector::EnabledScope top_stats_scope(heap().stats_collector(),
                                                StatsCollector::kAtomicMark);
   StatsCollector::EnabledScope stats_scope(heap().stats_collector(),
@@ -310,7 +306,7 @@ void MarkerBase::LeaveAtomicPause() {
   heap().SetStackStateOfPrevGC(config_.stack_state);
 }
 
-void MarkerBase::FinishMarking(MarkingConfig::StackState stack_state) {
+void MarkerBase::FinishMarking(StackState stack_state) {
   DCHECK(is_marking_);
   EnterAtomicPause(stack_state);
   {
@@ -383,7 +379,7 @@ void MarkerBase::ProcessWeakness() {
 #if defined(CPPGC_YOUNG_GENERATION)
   if (heap().generational_gc_supported()) {
     auto& remembered_set = heap().remembered_set();
-    if (config_.collection_type == MarkingConfig::CollectionType::kMinor) {
+    if (config_.collection_type == CollectionType::kMinor) {
       // Custom callbacks assume that untraced pointers point to not yet freed
       // objects. They must make sure that upon callback completion no
       // UntracedMember points to a freed object. This may not hold true if a
@@ -425,7 +421,7 @@ void MarkerBase::ProcessWeakness() {
   DCHECK(marking_worklists_.marking_worklist()->IsEmpty());
 }
 
-void MarkerBase::VisitRoots(MarkingConfig::StackState stack_state) {
+void MarkerBase::VisitRoots(StackState stack_state) {
   StatsCollector::EnabledScope stats_scope(heap().stats_collector(),
                                            StatsCollector::kMarkVisitRoots);
 
@@ -442,13 +438,13 @@ void MarkerBase::VisitRoots(MarkingConfig::StackState stack_state) {
     }
   }
 
-  if (stack_state != MarkingConfig::StackState::kNoHeapPointers) {
+  if (stack_state != StackState::kNoHeapPointers) {
     StatsCollector::DisabledScope stack_stats_scope(
         heap().stats_collector(), StatsCollector::kMarkVisitStack);
     heap().stack()->IteratePointers(&stack_visitor());
   }
 #if defined(CPPGC_YOUNG_GENERATION)
-  if (config_.collection_type == MarkingConfig::CollectionType::kMinor) {
+  if (config_.collection_type == CollectionType::kMinor) {
     StatsCollector::EnabledScope stats_scope(
         heap().stats_collector(), StatsCollector::kMarkVisitRememberedSets);
     heap().remembered_set().Visit(visitor(), mutator_marking_state_);
@@ -482,13 +478,12 @@ void MarkerBase::ScheduleIncrementalMarkingTask() {
       IncrementalMarkingTask::Post(foreground_task_runner_.get(), this);
 }
 
-bool MarkerBase::IncrementalMarkingStepForTesting(
-    MarkingConfig::StackState stack_state) {
+bool MarkerBase::IncrementalMarkingStepForTesting(StackState stack_state) {
   return IncrementalMarkingStep(stack_state);
 }
 
-bool MarkerBase::IncrementalMarkingStep(MarkingConfig::StackState stack_state) {
-  if (stack_state == MarkingConfig::StackState::kNoHeapPointers) {
+bool MarkerBase::IncrementalMarkingStep(StackState stack_state) {
+  if (stack_state == StackState::kNoHeapPointers) {
     mutator_marking_state_.FlushNotFullyConstructedObjects();
   }
   config_.stack_state = stack_state;
diff --git a/deps/v8/src/heap/cppgc/marker.h b/deps/v8/src/heap/cppgc/marker.h
index 9c471250adafe9..7586a43957304f 100644
--- a/deps/v8/src/heap/cppgc/marker.h
+++ b/deps/v8/src/heap/cppgc/marker.h
@@ -15,6 +15,7 @@
 #include "src/heap/base/worklist.h"
 #include "src/heap/cppgc/concurrent-marker.h"
 #include "src/heap/cppgc/globals.h"
+#include "src/heap/cppgc/heap-config.h"
 #include "src/heap/cppgc/incremental-marking-schedule.h"
 #include "src/heap/cppgc/marking-state.h"
 #include "src/heap/cppgc/marking-visitor.h"
@@ -39,26 +40,6 @@ class V8_EXPORT_PRIVATE MarkerBase {
  public:
   class IncrementalMarkingTask;
 
-  struct MarkingConfig {
-    enum class CollectionType : uint8_t {
-      kMinor,
-      kMajor,
-    };
-    using StackState = cppgc::Heap::StackState;
-    using MarkingType = cppgc::Heap::MarkingType;
-    enum class IsForcedGC : uint8_t {
-      kNotForced,
-      kForced,
-    };
-
-    static constexpr MarkingConfig Default() { return {}; }
-
-    const CollectionType collection_type = CollectionType::kMajor;
-    StackState stack_state = StackState::kMayContainHeapPointers;
-    MarkingType marking_type = MarkingType::kIncremental;
-    IsForcedGC is_forced_gc = IsForcedGC::kNotForced;
-  };
-
   enum class WriteBarrierType {
     kDijkstra,
     kSteele,
@@ -89,7 +70,7 @@ class V8_EXPORT_PRIVATE MarkerBase {
   // - stops incremental/concurrent marking;
   // - flushes back any in-construction worklists if needed;
   // - Updates the MarkingConfig if the stack state has changed;
-  void EnterAtomicPause(MarkingConfig::StackState);
+  void EnterAtomicPause(StackState);
 
   // Makes marking progress.  A `marked_bytes_limit` of 0 means that the limit
   // is determined by the internal marking scheduler.
@@ -113,7 +94,7 @@ class V8_EXPORT_PRIVATE MarkerBase {
   // - AdvanceMarkingWithLimits()
   // - ProcessWeakness()
   // - LeaveAtomicPause()
-  void FinishMarking(MarkingConfig::StackState);
+  void FinishMarking(StackState);
 
   void ProcessWeakness();
 
@@ -134,7 +115,7 @@ class V8_EXPORT_PRIVATE MarkerBase {
   void SetMainThreadMarkingDisabledForTesting(bool);
   void WaitForConcurrentMarkingForTesting();
   void ClearAllWorklistsForTesting();
-  bool IncrementalMarkingStepForTesting(MarkingConfig::StackState);
+  bool IncrementalMarkingStepForTesting(StackState);
 
   MarkingWorklists& MarkingWorklistsForTesting() { return marking_worklists_; }
   MutatorMarkingState& MutatorMarkingStateForTesting() {
@@ -157,7 +138,7 @@ class V8_EXPORT_PRIVATE MarkerBase {
 
   bool ProcessWorklistsWithDeadline(size_t, v8::base::TimeTicks);
 
-  void VisitRoots(MarkingConfig::StackState);
+  void VisitRoots(StackState);
 
   bool VisitCrossThreadPersistentsIfNeeded();
 
@@ -165,7 +146,7 @@ class V8_EXPORT_PRIVATE MarkerBase {
 
   void ScheduleIncrementalMarkingTask();
 
-  bool IncrementalMarkingStep(MarkingConfig::StackState);
+  bool IncrementalMarkingStep(StackState);
 
   void AdvanceMarkingOnAllocation();
 
diff --git a/deps/v8/src/heap/cppgc/marking-verifier.cc b/deps/v8/src/heap/cppgc/marking-verifier.cc
index a64a6d5f252f64..666e715cd76407 100644
--- a/deps/v8/src/heap/cppgc/marking-verifier.cc
+++ b/deps/v8/src/heap/cppgc/marking-verifier.cc
@@ -36,7 +36,7 @@ void VerificationState::VerifyMarked(const void* base_object_payload) const {
 }
 
 MarkingVerifierBase::MarkingVerifierBase(
-    HeapBase& heap, Heap::Config::CollectionType collection_type,
+    HeapBase& heap, CollectionType collection_type,
     VerificationState& verification_state,
     std::unique_ptr<cppgc::Visitor> visitor)
     : ConservativeTracingVisitor(heap, *heap.page_backend(), *visitor.get()),
@@ -45,7 +45,7 @@ MarkingVerifierBase::MarkingVerifierBase(
       collection_type_(collection_type) {}
 
 void MarkingVerifierBase::Run(
-    Heap::Config::StackState stack_state, uintptr_t stack_end,
+    StackState stack_state, uintptr_t stack_end,
     v8::base::Optional<size_t> expected_marked_bytes) {
   Traverse(heap_.raw_heap());
 // Avoid verifying the stack when running with TSAN as the TSAN runtime changes
@@ -61,7 +61,7 @@ void MarkingVerifierBase::Run(
 // TODO(chromium:1325007): Investigate if Oilpan verification can be moved
 // before V8 compaction or compaction never runs with stack.
 #if !defined(THREAD_SANITIZER) && !defined(CPPGC_POINTER_COMPRESSION)
-  if (stack_state == Heap::Config::StackState::kMayContainHeapPointers) {
+  if (stack_state == StackState::kMayContainHeapPointers) {
     in_construction_objects_ = &in_construction_objects_stack_;
     heap_.stack()->IteratePointersUnsafe(this, stack_end);
     // The objects found through the unsafe iteration are only a subset of the
@@ -114,7 +114,7 @@ bool MarkingVerifierBase::VisitHeapObjectHeader(HeapObjectHeader& header) {
   DCHECK(!header.IsFree());
 
 #if defined(CPPGC_YOUNG_GENERATION)
-  if (collection_type_ == Heap::Config::CollectionType::kMinor) {
+  if (collection_type_ == CollectionType::kMinor) {
     auto& caged_heap = CagedHeap::Instance();
     const auto age = CagedHeapLocalData::Get().age_table.GetAge(
         caged_heap.OffsetFromAddress(header.ObjectStart()));
@@ -185,7 +185,7 @@ class VerificationVisitor final : public cppgc::Visitor {
 }  // namespace
 
 MarkingVerifier::MarkingVerifier(HeapBase& heap_base,
-                                 Heap::Config::CollectionType collection_type)
+                                 CollectionType collection_type)
     : MarkingVerifierBase(heap_base, collection_type, state_,
                           std::make_unique<VerificationVisitor>(state_)) {}
 
diff --git a/deps/v8/src/heap/cppgc/marking-verifier.h b/deps/v8/src/heap/cppgc/marking-verifier.h
index cb2eb4c80cbb97..c966aea51fa1ca 100644
--- a/deps/v8/src/heap/cppgc/marking-verifier.h
+++ b/deps/v8/src/heap/cppgc/marking-verifier.h
@@ -41,11 +41,11 @@ class V8_EXPORT_PRIVATE MarkingVerifierBase
   MarkingVerifierBase(const MarkingVerifierBase&) = delete;
   MarkingVerifierBase& operator=(const MarkingVerifierBase&) = delete;
 
-  void Run(Heap::Config::StackState, uintptr_t, v8::base::Optional<size_t>);
+  void Run(StackState, uintptr_t, v8::base::Optional<size_t>);
 
  protected:
-  MarkingVerifierBase(HeapBase&, Heap::Config::CollectionType,
-                      VerificationState&, std::unique_ptr<cppgc::Visitor>);
+  MarkingVerifierBase(HeapBase&, CollectionType, VerificationState&,
+                      std::unique_ptr<cppgc::Visitor>);
 
  private:
   void VisitInConstructionConservatively(HeapObjectHeader&,
@@ -63,12 +63,12 @@ class V8_EXPORT_PRIVATE MarkingVerifierBase
       &in_construction_objects_heap_;
   size_t verifier_found_marked_bytes_ = 0;
   bool verifier_found_marked_bytes_are_exact_ = true;
-  Heap::Config::CollectionType collection_type_;
+  CollectionType collection_type_;
 };
 
 class V8_EXPORT_PRIVATE MarkingVerifier final : public MarkingVerifierBase {
  public:
-  MarkingVerifier(HeapBase&, Heap::Config::CollectionType);
+  MarkingVerifier(HeapBase&, CollectionType);
   ~MarkingVerifier() final = default;
 
  private:
diff --git a/deps/v8/src/heap/cppgc/member-storage.cc b/deps/v8/src/heap/cppgc/member-storage.cc
index a0e45624724919..c457c60ba4923c 100644
--- a/deps/v8/src/heap/cppgc/member-storage.cc
+++ b/deps/v8/src/heap/cppgc/member-storage.cc
@@ -4,6 +4,11 @@
 
 #include "include/cppgc/internal/member-storage.h"
 
+#include "include/cppgc/garbage-collected.h"
+#include "include/cppgc/member.h"
+#include "src/base/compiler-specific.h"
+#include "src/base/macros.h"
+
 namespace cppgc {
 namespace internal {
 
@@ -11,5 +16,26 @@ namespace internal {
 uintptr_t CageBaseGlobal::g_base_ = CageBaseGlobal::kLowerHalfWordMask;
 #endif  // defined(CPPGC_POINTER_COMPRESSION)
 
+// Debugging helpers.
+
+#if defined(CPPGC_POINTER_COMPRESSION)
+extern "C" V8_DONT_STRIP_SYMBOL V8_EXPORT_PRIVATE void*
+_cppgc_internal_Decompress_Compressed_Pointer(uint32_t cmprsd) {
+  return MemberStorage::Decompress(cmprsd);
+}
+#endif  // !defined(CPPGC_POINTER_COMPRESSION)
+
+class MemberDebugHelper final {
+ public:
+  static void* PrintUncompressed(MemberBase* m) {
+    return const_cast<void*>(m->GetRaw());
+  }
+};
+
+extern "C" V8_DONT_STRIP_SYMBOL V8_EXPORT_PRIVATE void*
+_cppgc_internal_Print_Member(MemberBase* m) {
+  return MemberDebugHelper::PrintUncompressed(m);
+}
+
 }  // namespace internal
 }  // namespace cppgc
diff --git a/deps/v8/src/heap/cppgc/object-allocator.cc b/deps/v8/src/heap/cppgc/object-allocator.cc
index 38a3ccd8e9c09d..b88ba5c20069ce 100644
--- a/deps/v8/src/heap/cppgc/object-allocator.cc
+++ b/deps/v8/src/heap/cppgc/object-allocator.cc
@@ -148,9 +148,9 @@ void* ObjectAllocator::OutOfLineAllocateImpl(NormalPageSpace& space,
     void* result = TryAllocateLargeObject(page_backend_, large_space,
                                           stats_collector_, size, gcinfo);
     if (!result) {
-      auto config = GarbageCollector::Config::ConservativeAtomicConfig();
+      auto config = GCConfig::ConservativeAtomicConfig();
       config.free_memory_handling =
-          GarbageCollector::Config::FreeMemoryHandling::kDiscardWherePossible;
+          GCConfig::FreeMemoryHandling::kDiscardWherePossible;
       garbage_collector_.CollectGarbage(config);
       result = TryAllocateLargeObject(page_backend_, large_space,
                                       stats_collector_, size, gcinfo);
@@ -170,9 +170,9 @@ void* ObjectAllocator::OutOfLineAllocateImpl(NormalPageSpace& space,
   }
 
   if (!TryRefillLinearAllocationBuffer(space, request_size)) {
-    auto config = GarbageCollector::Config::ConservativeAtomicConfig();
+    auto config = GCConfig::ConservativeAtomicConfig();
     config.free_memory_handling =
-        GarbageCollector::Config::FreeMemoryHandling::kDiscardWherePossible;
+        GCConfig::FreeMemoryHandling::kDiscardWherePossible;
     garbage_collector_.CollectGarbage(config);
     if (!TryRefillLinearAllocationBuffer(space, request_size)) {
       oom_handler_("Oilpan: Normal allocation.");
@@ -187,42 +187,64 @@ void* ObjectAllocator::OutOfLineAllocateImpl(NormalPageSpace& space,
   return result;
 }
 
+bool ObjectAllocator::TryExpandAndRefillLinearAllocationBuffer(
+    NormalPageSpace& space) {
+  auto* const new_page = NormalPage::TryCreate(page_backend_, space);
+  if (!new_page) return false;
+
+  space.AddPage(new_page);
+  // Set linear allocation buffer to new page.
+  ReplaceLinearAllocationBuffer(space, stats_collector_,
+                                new_page->PayloadStart(),
+                                new_page->PayloadSize());
+  return true;
+}
+
 bool ObjectAllocator::TryRefillLinearAllocationBuffer(NormalPageSpace& space,
                                                       size_t size) {
   // Try to allocate from the freelist.
   if (TryRefillLinearAllocationBufferFromFreeList(space, size)) return true;
 
-  // Lazily sweep pages of this heap until we find a freed area for this
-  // allocation or we finish sweeping all pages of this heap.
   Sweeper& sweeper = raw_heap_.heap()->sweeper();
-  // TODO(chromium:1056170): Investigate whether this should be a loop which
-  // would result in more aggressive re-use of memory at the expense of
-  // potentially larger allocation time.
-  if (sweeper.SweepForAllocationIfRunning(&space, size)) {
-    // Sweeper found a block of at least `size` bytes. Allocation from the
-    // free list may still fail as actual  buckets are not exhaustively
-    // searched for a suitable block. Instead, buckets are tested from larger
-    // sizes that are guaranteed to fit the block to smaller bucket sizes that
-    // may only potentially fit the block. For the bucket that may exactly fit
-    // the allocation of `size` bytes (no overallocation), only the first
-    // entry is checked.
-    if (TryRefillLinearAllocationBufferFromFreeList(space, size)) return true;
+  // Lazily sweep pages of this heap. This is not exhaustive to limit jank on
+  // allocation. Allocation from the free list may still fail as actual  buckets
+  // are not exhaustively searched for a suitable block. Instead, buckets are
+  // tested from larger sizes that are guaranteed to fit the block to smaller
+  // bucket sizes that may only potentially fit the block. For the bucket that
+  // may exactly fit the allocation of `size` bytes (no overallocation), only
+  // the first entry is checked.
+  if (sweeper.SweepForAllocationIfRunning(
+          &space, size, v8::base::TimeDelta::FromMicroseconds(500)) &&
+      TryRefillLinearAllocationBufferFromFreeList(space, size)) {
+    return true;
   }
 
-  sweeper.FinishIfRunning();
-  // TODO(chromium:1056170): Make use of the synchronously freed memory.
-
-  auto* new_page = NormalPage::TryCreate(page_backend_, space);
-  if (!new_page) {
-    return false;
+  // Sweeping was off or did not yield in any memory within limited
+  // contributing. We expand at this point as that's cheaper than possibly
+  // continuing sweeping the whole heap.
+  if (TryExpandAndRefillLinearAllocationBuffer(space)) return true;
+
+  // Expansion failed. Before finishing all sweeping, finish sweeping of a given
+  // space which is cheaper.
+  if (sweeper.SweepForAllocationIfRunning(&space, size,
+                                          v8::base::TimeDelta::Max()) &&
+      TryRefillLinearAllocationBufferFromFreeList(space, size)) {
+    return true;
   }
 
-  space.AddPage(new_page);
-  // Set linear allocation buffer to new page.
-  ReplaceLinearAllocationBuffer(space, stats_collector_,
-                                new_page->PayloadStart(),
-                                new_page->PayloadSize());
-  return true;
+  // Heap expansion and sweeping of a space failed. At this point the caller
+  // could run OOM or do a full GC which needs to finish sweeping if it's
+  // running. Hence, we may as well finish sweeping here. Note that this is
+  // possibly very expensive but not more expensive than running a full GC as
+  // the alternative is OOM.
+  if (sweeper.FinishIfRunning()) {
+    // Sweeping may have added memory to the free list.
+    if (TryRefillLinearAllocationBufferFromFreeList(space, size)) return true;
+
+    // Sweeping may have freed pages completely.
+    if (TryExpandAndRefillLinearAllocationBuffer(space)) return true;
+  }
+  return false;
 }
 
 bool ObjectAllocator::TryRefillLinearAllocationBufferFromFreeList(
diff --git a/deps/v8/src/heap/cppgc/object-allocator.h b/deps/v8/src/heap/cppgc/object-allocator.h
index ea01f671f7cf6c..77f26ce3b59f07 100644
--- a/deps/v8/src/heap/cppgc/object-allocator.h
+++ b/deps/v8/src/heap/cppgc/object-allocator.h
@@ -70,6 +70,7 @@ class V8_EXPORT_PRIVATE ObjectAllocator final : public cppgc::AllocationHandle {
 
   bool TryRefillLinearAllocationBuffer(NormalPageSpace&, size_t);
   bool TryRefillLinearAllocationBufferFromFreeList(NormalPageSpace&, size_t);
+  bool TryExpandAndRefillLinearAllocationBuffer(NormalPageSpace&);
 
   RawHeap& raw_heap_;
   PageBackend& page_backend_;
diff --git a/deps/v8/src/heap/cppgc/remembered-set.cc b/deps/v8/src/heap/cppgc/remembered-set.cc
index 485fb4057f6763..60e8f978eff6f5 100644
--- a/deps/v8/src/heap/cppgc/remembered-set.cc
+++ b/deps/v8/src/heap/cppgc/remembered-set.cc
@@ -2,15 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#if defined(CPPGC_YOUNG_GENERATION)
+
 #include "src/heap/cppgc/remembered-set.h"
 
 #include <algorithm>
 
 #include "include/cppgc/member.h"
 #include "include/cppgc/visitor.h"
+#include "src/heap/base/basic-slot-set.h"
 #include "src/heap/cppgc/heap-base.h"
 #include "src/heap/cppgc/heap-object-header.h"
 #include "src/heap/cppgc/heap-page.h"
+#include "src/heap/cppgc/heap-visitor.h"
 #include "src/heap/cppgc/marking-state.h"
 
 namespace cppgc {
@@ -20,23 +24,54 @@ namespace {
 
 enum class SlotType { kCompressed, kUncompressed };
 
-template <SlotType slot_type>
-void InvalidateRememberedSlots(std::set<void*>& slots, void* begin, void* end) {
+void EraseFromSet(std::set<void*>& set, void* begin, void* end) {
   // TODO(1029379): The 2 binary walks can be optimized with a custom algorithm.
-  auto from = slots.lower_bound(begin), to = slots.lower_bound(end);
-  slots.erase(from, to);
+  auto from = set.lower_bound(begin), to = set.lower_bound(end);
+  set.erase(from, to);
+}
+
+// TODO(1029379): Make the implementation functions private functions of
+// OldToNewRememberedSet to avoid parameter passing.
+void InvalidateCompressedRememberedSlots(
+    const HeapBase& heap, void* begin, void* end,
+    std::set<void*>& remembered_slots_for_verification) {
+  DCHECK_LT(begin, end);
+
+  BasePage* page = BasePage::FromInnerAddress(&heap, begin);
+  DCHECK_NOT_NULL(page);
+  // The input range must reside within the same page.
+  DCHECK_EQ(page, BasePage::FromInnerAddress(
+                      &heap, reinterpret_cast<void*>(
+                                 reinterpret_cast<uintptr_t>(end) - 1)));
+
+  auto* slot_set = page->slot_set();
+  if (!slot_set) return;
+
+  const size_t buckets_size = SlotSet::BucketsForSize(page->AllocatedSize());
+
+  const uintptr_t page_start = reinterpret_cast<uintptr_t>(page);
+  const uintptr_t ubegin = reinterpret_cast<uintptr_t>(begin);
+  const uintptr_t uend = reinterpret_cast<uintptr_t>(end);
+
+  slot_set->RemoveRange(ubegin - page_start, uend - page_start, buckets_size,
+                        SlotSet::EmptyBucketMode::FREE_EMPTY_BUCKETS);
+#if DEBUG
+  EraseFromSet(remembered_slots_for_verification, begin, end);
+#endif  // DEBUG
+}
+
+void InvalidateUncompressedRememberedSlots(
+    std::set<void*>& slots, void* begin, void* end,
+    std::set<void*>& remembered_slots_for_verification) {
+  EraseFromSet(slots, begin, end);
+#if DEBUG
+  EraseFromSet(remembered_slots_for_verification, begin, end);
+#endif  // DEBUG
 #if defined(ENABLE_SLOW_DCHECKS)
   // Check that no remembered slots are referring to the freed area.
   DCHECK(std::none_of(slots.begin(), slots.end(), [begin, end](void* slot) {
     void* value = nullptr;
-#if defined(CPPGC_POINTER_COMPRESSION)
-    if constexpr (slot_type == SlotType::kCompressed)
-      value = CompressedPointer::Decompress(*reinterpret_cast<uint32_t*>(slot));
-    else
-      value = *reinterpret_cast<void**>(slot);
-#else   // !defined(CPPGC_POINTER_COMPRESSION)
     value = *reinterpret_cast<void**>(slot);
-#endif  // !defined(CPPGC_POINTER_COMPRESSION)
     return begin <= value && value < end;
   }));
 #endif  // defined(ENABLE_SLOW_DCHECKS)
@@ -44,45 +79,155 @@ void InvalidateRememberedSlots(std::set<void*>& slots, void* begin, void* end) {
 
 // Visit remembered set that was recorded in the generational barrier.
 template <SlotType slot_type>
-void VisitRememberedSlots(const std::set<void*>& slots, const HeapBase& heap,
-                          MutatorMarkingState& mutator_marking_state) {
-  for (void* slot : slots) {
-    // Slot must always point to a valid, not freed object.
-    auto& slot_header = BasePage::FromInnerAddress(&heap, slot)
-                            ->ObjectHeaderFromInnerAddress(slot);
-    // The age checking in the generational barrier is imprecise, since a card
-    // may have mixed young/old objects. Check here precisely if the object is
-    // old.
-    if (slot_header.IsYoung()) continue;
-    // The design of young generation requires collections to be executed at the
-    // top level (with the guarantee that no objects are currently being in
-    // construction). This can be ensured by running young GCs from safe points
-    // or by reintroducing nested allocation scopes that avoid finalization.
-    DCHECK(!slot_header.template IsInConstruction<AccessMode::kNonAtomic>());
+void VisitSlot(const HeapBase& heap, const BasePage& page, Address slot,
+               MutatorMarkingState& marking_state,
+               const std::set<void*>& slots_for_verification) {
+#if defined(DEBUG)
+  DCHECK_EQ(BasePage::FromInnerAddress(&heap, slot), &page);
+  DCHECK_NE(slots_for_verification.end(), slots_for_verification.find(slot));
+#endif  // defined(DEBUG)
+
+  // Slot must always point to a valid, not freed object.
+  auto& slot_header = page.ObjectHeaderFromInnerAddress(slot);
+  // The age checking in the generational barrier is imprecise, since a card
+  // may have mixed young/old objects. Check here precisely if the object is
+  // old.
+  if (slot_header.IsYoung()) return;
+  // The design of young generation requires collections to be executed at the
+  // top level (with the guarantee that no objects are currently being in
+  // construction). This can be ensured by running young GCs from safe points
+  // or by reintroducing nested allocation scopes that avoid finalization.
+  DCHECK(!slot_header.template IsInConstruction<AccessMode::kNonAtomic>());
 
 #if defined(CPPGC_POINTER_COMPRESSION)
-    void* value = nullptr;
-    if constexpr (slot_type == SlotType::kCompressed) {
-      value = CompressedPointer::Decompress(*reinterpret_cast<uint32_t*>(slot));
-    } else {
-      value = *reinterpret_cast<void**>(slot);
-    }
+  void* value = nullptr;
+  if constexpr (slot_type == SlotType::kCompressed) {
+    value = CompressedPointer::Decompress(*reinterpret_cast<uint32_t*>(slot));
+  } else {
+    value = *reinterpret_cast<void**>(slot);
+  }
 #else   // !defined(CPPGC_POINTER_COMPRESSION)
-    void* value = *reinterpret_cast<void**>(slot);
+  void* value = *reinterpret_cast<void**>(slot);
 #endif  // !defined(CPPGC_POINTER_COMPRESSION)
 
-    // Slot could be updated to nullptr or kSentinelPointer by the mutator.
-    if (value == kSentinelPointer || value == nullptr) continue;
+  // Slot could be updated to nullptr or kSentinelPointer by the mutator.
+  if (value == kSentinelPointer || value == nullptr) return;
 
-#if DEBUG
-    // Check that the slot can not point to a freed object.
-    HeapObjectHeader& header =
-        BasePage::FromPayload(value)->ObjectHeaderFromInnerAddress(value);
-    DCHECK(!header.IsFree());
-#endif
+#if defined(DEBUG)
+  // Check that the slot can not point to a freed object.
+  HeapObjectHeader& header =
+      BasePage::FromPayload(value)->ObjectHeaderFromInnerAddress(value);
+  DCHECK(!header.IsFree());
+#endif  // defined(DEBUG)
+
+  marking_state.DynamicallyMarkAddress(static_cast<Address>(value));
+}
+
+class CompressedSlotVisitor : HeapVisitor<CompressedSlotVisitor> {
+  friend class HeapVisitor<CompressedSlotVisitor>;
+
+ public:
+  CompressedSlotVisitor(HeapBase& heap, MutatorMarkingState& marking_state,
+                        const std::set<void*>& slots_for_verification)
+      : heap_(heap),
+        marking_state_(marking_state),
+        remembered_slots_for_verification_(slots_for_verification) {}
 
-    mutator_marking_state.DynamicallyMarkAddress(static_cast<Address>(value));
+  size_t Run() {
+    Traverse(heap_.raw_heap());
+    return objects_visited_;
   }
+
+ private:
+  heap::base::SlotCallbackResult VisitCompressedSlot(Address slot) {
+    DCHECK(current_page_);
+    VisitSlot<SlotType::kCompressed>(heap_, *current_page_, slot,
+                                     marking_state_,
+                                     remembered_slots_for_verification_);
+    ++objects_visited_;
+    return heap::base::KEEP_SLOT;
+  }
+
+  void VisitSlotSet(SlotSet* slot_set) {
+    DCHECK(current_page_);
+
+    if (!slot_set) return;
+
+    const uintptr_t page_start = reinterpret_cast<uintptr_t>(current_page_);
+    const size_t buckets_size =
+        SlotSet::BucketsForSize(current_page_->AllocatedSize());
+
+    slot_set->Iterate(
+        page_start, 0, buckets_size,
+        [this](SlotSet::Address slot) {
+          return VisitCompressedSlot(reinterpret_cast<Address>(slot));
+        },
+        SlotSet::EmptyBucketMode::FREE_EMPTY_BUCKETS);
+  }
+
+  bool VisitNormalPage(NormalPage& page) {
+    current_page_ = &page;
+    VisitSlotSet(page.slot_set());
+    return true;
+  }
+
+  bool VisitLargePage(LargePage& page) {
+    current_page_ = &page;
+    VisitSlotSet(page.slot_set());
+    return true;
+  }
+
+  HeapBase& heap_;
+  MutatorMarkingState& marking_state_;
+  BasePage* current_page_ = nullptr;
+
+  const std::set<void*>& remembered_slots_for_verification_;
+  size_t objects_visited_ = 0u;
+};
+
+class SlotRemover : HeapVisitor<SlotRemover> {
+  friend class HeapVisitor<SlotRemover>;
+
+ public:
+  explicit SlotRemover(HeapBase& heap) : heap_(heap) {}
+
+  void Run() { Traverse(heap_.raw_heap()); }
+
+ private:
+  bool VisitNormalPage(NormalPage& page) {
+    page.ResetSlotSet();
+    return true;
+  }
+
+  bool VisitLargePage(LargePage& page) {
+    page.ResetSlotSet();
+    return true;
+  }
+
+  HeapBase& heap_;
+};
+
+// Visit remembered set that was recorded in the generational barrier.
+void VisitRememberedSlots(
+    HeapBase& heap, MutatorMarkingState& mutator_marking_state,
+    const std::set<void*>& remembered_uncompressed_slots,
+    const std::set<void*>& remembered_slots_for_verification) {
+  size_t objects_visited = 0;
+  {
+    CompressedSlotVisitor slot_visitor(heap, mutator_marking_state,
+                                       remembered_slots_for_verification);
+    objects_visited += slot_visitor.Run();
+  }
+  for (void* uncompressed_slot : remembered_uncompressed_slots) {
+    auto* page = BasePage::FromInnerAddress(&heap, uncompressed_slot);
+    DCHECK(page);
+    VisitSlot<SlotType::kUncompressed>(
+        heap, *page, static_cast<Address>(uncompressed_slot),
+        mutator_marking_state, remembered_slots_for_verification);
+    ++objects_visited;
+  }
+  DCHECK_EQ(remembered_slots_for_verification.size(), objects_visited);
+  USE(objects_visited);
 }
 
 // Visits source objects that were recorded in the generational barrier for
@@ -114,12 +259,29 @@ void VisitRememberedSourceObjects(
 
 void OldToNewRememberedSet::AddSlot(void* slot) {
   DCHECK(heap_.generational_gc_supported());
-  remembered_slots_.insert(slot);
+
+  BasePage* source_page = BasePage::FromInnerAddress(&heap_, slot);
+  DCHECK(source_page);
+
+  auto& slot_set = source_page->GetOrAllocateSlotSet();
+
+  const uintptr_t slot_offset = reinterpret_cast<uintptr_t>(slot) -
+                                reinterpret_cast<uintptr_t>(source_page);
+
+  slot_set.Insert<SlotSet::AccessMode::NON_ATOMIC>(
+      static_cast<size_t>(slot_offset));
+
+#if defined(DEBUG)
+  remembered_slots_for_verification_.insert(slot);
+#endif  // defined(DEBUG)
 }
 
 void OldToNewRememberedSet::AddUncompressedSlot(void* uncompressed_slot) {
   DCHECK(heap_.generational_gc_supported());
   remembered_uncompressed_slots_.insert(uncompressed_slot);
+#if defined(DEBUG)
+  remembered_slots_for_verification_.insert(uncompressed_slot);
+#endif  // defined(DEBUG)
 }
 
 void OldToNewRememberedSet::AddSourceObject(HeapObjectHeader& hoh) {
@@ -138,10 +300,11 @@ void OldToNewRememberedSet::AddWeakCallback(WeakCallbackItem item) {
 void OldToNewRememberedSet::InvalidateRememberedSlotsInRange(void* begin,
                                                              void* end) {
   DCHECK(heap_.generational_gc_supported());
-  InvalidateRememberedSlots<SlotType::kCompressed>(remembered_slots_, begin,
-                                                   end);
-  InvalidateRememberedSlots<SlotType::kUncompressed>(
-      remembered_uncompressed_slots_, begin, end);
+  InvalidateCompressedRememberedSlots(heap_, begin, end,
+                                      remembered_slots_for_verification_);
+  InvalidateUncompressedRememberedSlots(remembered_uncompressed_slots_, begin,
+                                        end,
+                                        remembered_slots_for_verification_);
 }
 
 void OldToNewRememberedSet::InvalidateRememberedSourceObject(
@@ -153,10 +316,8 @@ void OldToNewRememberedSet::InvalidateRememberedSourceObject(
 void OldToNewRememberedSet::Visit(Visitor& visitor,
                                   MutatorMarkingState& marking_state) {
   DCHECK(heap_.generational_gc_supported());
-  VisitRememberedSlots<SlotType::kCompressed>(remembered_slots_, heap_,
-                                              marking_state);
-  VisitRememberedSlots<SlotType::kUncompressed>(remembered_uncompressed_slots_,
-                                                heap_, marking_state);
+  VisitRememberedSlots(heap_, marking_state, remembered_uncompressed_slots_,
+                       remembered_slots_for_verification_);
   VisitRememberedSourceObjects(remembered_source_objects_, visitor);
 }
 
@@ -174,16 +335,23 @@ void OldToNewRememberedSet::ReleaseCustomCallbacks() {
 
 void OldToNewRememberedSet::Reset() {
   DCHECK(heap_.generational_gc_supported());
-  remembered_slots_.clear();
+  SlotRemover slot_remover(heap_);
+  slot_remover.Run();
   remembered_uncompressed_slots_.clear();
   remembered_source_objects_.clear();
+#if DEBUG
+  remembered_slots_for_verification_.clear();
+#endif  // DEBUG
 }
 
 bool OldToNewRememberedSet::IsEmpty() const {
-  return remembered_slots_.empty() && remembered_uncompressed_slots_.empty() &&
+  // TODO(1029379): Add visitor to check if empty.
+  return remembered_uncompressed_slots_.empty() &&
          remembered_source_objects_.empty() &&
          remembered_weak_callbacks_.empty();
 }
 
 }  // namespace internal
 }  // namespace cppgc
+
+#endif  // defined(CPPGC_YOUNG_GENERATION)
diff --git a/deps/v8/src/heap/cppgc/remembered-set.h b/deps/v8/src/heap/cppgc/remembered-set.h
index 24e460d438f2b5..086ba622890e0f 100644
--- a/deps/v8/src/heap/cppgc/remembered-set.h
+++ b/deps/v8/src/heap/cppgc/remembered-set.h
@@ -5,9 +5,12 @@
 #ifndef V8_HEAP_CPPGC_REMEMBERED_SET_H_
 #define V8_HEAP_CPPGC_REMEMBERED_SET_H_
 
+#if defined(CPPGC_YOUNG_GENERATION)
+
 #include <set>
 
 #include "src/base/macros.h"
+#include "src/heap/base/basic-slot-set.h"
 #include "src/heap/cppgc/marking-worklists.h"
 
 namespace cppgc {
@@ -21,11 +24,14 @@ class HeapBase;
 class HeapObjectHeader;
 class MutatorMarkingState;
 
+class SlotSet : public ::heap::base::BasicSlotSet<kSlotSize> {};
+
+// OldToNewRememberedSet represents a per-heap set of old-to-new references.
 class V8_EXPORT_PRIVATE OldToNewRememberedSet final {
  public:
   using WeakCallbackItem = MarkingWorklists::WeakCallbackItem;
 
-  explicit OldToNewRememberedSet(const HeapBase& heap)
+  explicit OldToNewRememberedSet(HeapBase& heap)
       : heap_(heap), remembered_weak_callbacks_(compare_parameter) {}
 
   OldToNewRememberedSet(const OldToNewRememberedSet&) = delete;
@@ -58,15 +64,19 @@ class V8_EXPORT_PRIVATE OldToNewRememberedSet final {
     }
   } compare_parameter{};
 
-  const HeapBase& heap_;
-  std::set<void*> remembered_slots_;
-  std::set<void*> remembered_uncompressed_slots_;
+  HeapBase& heap_;
   std::set<HeapObjectHeader*> remembered_source_objects_;
   std::set<WeakCallbackItem, decltype(compare_parameter)>
       remembered_weak_callbacks_;
+  // Compressed slots are stored in slot-sets (per-page two-level bitmaps),
+  // whereas uncompressed are stored in std::set.
+  std::set<void*> remembered_uncompressed_slots_;
+  std::set<void*> remembered_slots_for_verification_;
 };
 
 }  // namespace internal
 }  // namespace cppgc
 
+#endif  // defined(CPPGC_YOUNG_GENERATION)
+
 #endif  // V8_HEAP_CPPGC_REMEMBERED_SET_H_
diff --git a/deps/v8/src/heap/cppgc/stats-collector.cc b/deps/v8/src/heap/cppgc/stats-collector.cc
index ca0112220845a0..f65309b6f47fdd 100644
--- a/deps/v8/src/heap/cppgc/stats-collector.cc
+++ b/deps/v8/src/heap/cppgc/stats-collector.cc
@@ -171,8 +171,7 @@ int64_t SumPhases(const MetricRecorder::GCCycle::Phases& phases) {
 }
 
 MetricRecorder::GCCycle GetCycleEventForMetricRecorder(
-    StatsCollector::CollectionType type,
-    StatsCollector::MarkingType marking_type,
+    CollectionType type, StatsCollector::MarkingType marking_type,
     StatsCollector::SweepingType sweeping_type, int64_t atomic_mark_us,
     int64_t atomic_weak_us, int64_t atomic_compact_us, int64_t atomic_sweep_us,
     int64_t incremental_mark_us, int64_t incremental_sweep_us,
@@ -181,7 +180,7 @@ MetricRecorder::GCCycle GetCycleEventForMetricRecorder(
     int64_t objects_freed_bytes, int64_t memory_before_bytes,
     int64_t memory_after_bytes, int64_t memory_freed_bytes) {
   MetricRecorder::GCCycle event;
-  event.type = (type == StatsCollector::CollectionType::kMajor)
+  event.type = (type == CollectionType::kMajor)
                    ? MetricRecorder::GCCycle::Type::kMajor
                    : MetricRecorder::GCCycle::Type::kMinor;
   // MainThread.Incremental:
diff --git a/deps/v8/src/heap/cppgc/stats-collector.h b/deps/v8/src/heap/cppgc/stats-collector.h
index c78db86acf2cd5..ff040a3dcc646a 100644
--- a/deps/v8/src/heap/cppgc/stats-collector.h
+++ b/deps/v8/src/heap/cppgc/stats-collector.h
@@ -33,6 +33,7 @@ namespace internal {
   V(IncrementalSweep)
 
 #define CPPGC_FOR_ALL_SCOPES(V)             \
+  V(Unmark)                                 \
   V(MarkIncrementalStart)                   \
   V(MarkIncrementalFinalize)                \
   V(MarkAtomicPrologue)                     \
@@ -52,9 +53,10 @@ namespace internal {
   V(MarkVisitCrossThreadPersistents)        \
   V(MarkVisitStack)                         \
   V(MarkVisitRememberedSets)                \
+  V(SweepFinishIfOutOfWork)                 \
   V(SweepInvokePreFinalizers)               \
-  V(SweepIdleStep)                          \
   V(SweepInTask)                            \
+  V(SweepInTaskForStatistics)               \
   V(SweepOnAllocation)                      \
   V(SweepFinalize)
 
@@ -67,12 +69,11 @@ namespace internal {
 
 // Sink for various time and memory statistics.
 class V8_EXPORT_PRIVATE StatsCollector final {
-  using IsForcedGC = GarbageCollector::Config::IsForcedGC;
+  using IsForcedGC = GCConfig::IsForcedGC;
 
  public:
-  using CollectionType = GarbageCollector::Config::CollectionType;
-  using MarkingType = GarbageCollector::Config::MarkingType;
-  using SweepingType = GarbageCollector::Config::SweepingType;
+  using MarkingType = GCConfig::MarkingType;
+  using SweepingType = GCConfig::SweepingType;
 
 #if defined(CPPGC_DECLARE_ENUM)
   static_assert(false, "CPPGC_DECLARE_ENUM macro is already defined");
diff --git a/deps/v8/src/heap/cppgc/sweeper.cc b/deps/v8/src/heap/cppgc/sweeper.cc
index 23e684ed4da9a7..3cb96f8baa972e 100644
--- a/deps/v8/src/heap/cppgc/sweeper.cc
+++ b/deps/v8/src/heap/cppgc/sweeper.cc
@@ -11,6 +11,7 @@
 #include "include/cppgc/platform.h"
 #include "src/base/optional.h"
 #include "src/base/platform/mutex.h"
+#include "src/base/platform/time.h"
 #include "src/heap/cppgc/free-list.h"
 #include "src/heap/cppgc/globals.h"
 #include "src/heap/cppgc/heap-base.h"
@@ -25,13 +26,41 @@
 #include "src/heap/cppgc/stats-collector.h"
 #include "src/heap/cppgc/task-handle.h"
 
-namespace cppgc {
-namespace internal {
+namespace cppgc::internal {
 
 namespace {
 
+class DeadlineChecker final {
+ public:
+  explicit DeadlineChecker(v8::base::TimeTicks end) : end_(end) {}
+
+  bool Check() {
+    return (++count_ % kInterval == 0) && (end_ < v8::base::TimeTicks::Now());
+  }
+
+ private:
+  static constexpr size_t kInterval = 4;
+
+  const v8::base::TimeTicks end_;
+  size_t count_ = 0;
+};
+
 using v8::base::Optional;
 
+enum class MutatorThreadSweepingMode {
+  kOnlyFinalizers,
+  kAll,
+};
+
+constexpr const char* ToString(MutatorThreadSweepingMode sweeping_mode) {
+  switch (sweeping_mode) {
+    case MutatorThreadSweepingMode::kAll:
+      return "all";
+    case MutatorThreadSweepingMode::kOnlyFinalizers:
+      return "only-finalizers";
+  }
+}
+
 enum class StickyBits : uint8_t {
   kDisabled,
   kEnabled,
@@ -220,6 +249,9 @@ class InlinedFinalizationBuilderBase {
     bool is_empty = false;
     size_t largest_new_free_list_entry = 0;
   };
+
+ protected:
+  ResultType result_;
 };
 
 // Builder that finalizes objects and adds freelist entries right away.
@@ -238,10 +270,13 @@ class InlinedFinalizationBuilder final : public InlinedFinalizationBuilderBase,
 
   void AddFreeListEntry(Address start, size_t size) {
     FreeHandler::Free({start, size});
+    result_.largest_new_free_list_entry =
+        std::max(result_.largest_new_free_list_entry, size);
   }
 
-  ResultType GetResult(bool is_empty, size_t largest_new_free_list_entry) {
-    return {is_empty, largest_new_free_list_entry};
+  ResultType&& GetResult(bool is_empty) {
+    result_.is_empty = is_empty;
+    return std::move(result_);
   }
 };
 
@@ -282,12 +317,13 @@ class DeferredFinalizationBuilder final : public FreeHandler {
     } else {
       FreeHandler::Free({start, size});
     }
+    result_.largest_new_free_list_entry =
+        std::max(result_.largest_new_free_list_entry, size);
     found_finalizer_ = false;
   }
 
-  ResultType&& GetResult(bool is_empty, size_t largest_new_free_list_entry) {
+  ResultType&& GetResult(bool is_empty) {
     result_.is_empty = is_empty;
-    result_.largest_new_free_list_entry = largest_new_free_list_entry;
     return std::move(result_);
   }
 
@@ -305,7 +341,6 @@ typename FinalizationBuilder::ResultType SweepNormalPage(
 
   PlatformAwareObjectStartBitmap& bitmap = page->object_start_bitmap();
 
-  size_t largest_new_free_list_entry = 0;
   size_t live_bytes = 0;
 
   Address start_of_gap = page->PayloadStart();
@@ -346,12 +381,10 @@ typename FinalizationBuilder::ResultType SweepNormalPage(
     // The object is alive.
     const Address header_address = reinterpret_cast<Address>(header);
     if (start_of_gap != header_address) {
-      size_t new_free_list_entry_size =
+      const size_t new_free_list_entry_size =
           static_cast<size_t>(header_address - start_of_gap);
       builder.AddFreeListEntry(start_of_gap, new_free_list_entry_size);
       DCHECK(bitmap.CheckBit<AccessMode::kAtomic>(start_of_gap));
-      largest_new_free_list_entry =
-          std::max(largest_new_free_list_entry, new_free_list_entry_size);
     }
     StickyUnmark(header, sticky_bits);
     begin += size;
@@ -368,7 +401,7 @@ typename FinalizationBuilder::ResultType SweepNormalPage(
   page->SetAllocatedBytesAtLastGC(live_bytes);
 
   const bool is_empty = (start_of_gap == page->PayloadStart());
-  return builder.GetResult(is_empty, largest_new_free_list_entry);
+  return builder.GetResult(is_empty);
 }
 
 // SweepFinalizer is responsible for heap/space/page finalization. Finalization
@@ -377,7 +410,7 @@ typename FinalizationBuilder::ResultType SweepNormalPage(
 // - returns (unmaps) empty pages;
 // - merges freelists to the space's freelist.
 class SweepFinalizer final {
-  using FreeMemoryHandling = Sweeper::SweepingConfig::FreeMemoryHandling;
+  using FreeMemoryHandling = SweepingConfig::FreeMemoryHandling;
 
  public:
   SweepFinalizer(cppgc::Platform* platform,
@@ -397,20 +430,13 @@ class SweepFinalizer final {
   }
 
   bool FinalizeSpaceWithDeadline(SpaceState* space_state,
-                                 double deadline_in_seconds) {
+                                 v8::base::TimeTicks deadline) {
     DCHECK(platform_);
-    static constexpr size_t kDeadlineCheckInterval = 8;
-    size_t page_count = 1;
-
+    DeadlineChecker deadline_check(deadline);
     while (auto page_state = space_state->swept_unfinalized_pages.Pop()) {
       FinalizePage(&*page_state);
 
-      if (page_count % kDeadlineCheckInterval == 0 &&
-          deadline_in_seconds <= platform_->MonotonicallyIncreasingTime()) {
-        return false;
-      }
-
-      page_count++;
+      if (deadline_check.Check()) return false;
     }
 
     return true;
@@ -488,7 +514,7 @@ class SweepFinalizer final {
 class MutatorThreadSweeper final : private HeapVisitor<MutatorThreadSweeper> {
   friend class HeapVisitor<MutatorThreadSweeper>;
 
-  using FreeMemoryHandling = Sweeper::SweepingConfig::FreeMemoryHandling;
+  using FreeMemoryHandling = SweepingConfig::FreeMemoryHandling;
 
  public:
   MutatorThreadSweeper(HeapBase* heap, SpaceStates* states,
@@ -511,25 +537,23 @@ class MutatorThreadSweeper final : private HeapVisitor<MutatorThreadSweeper> {
 
   void SweepPage(BasePage& page) { Traverse(page); }
 
-  bool SweepWithDeadline(double deadline_in_seconds) {
+  bool SweepWithDeadline(v8::base::TimeDelta max_duration,
+                         MutatorThreadSweepingMode sweeping_mode) {
     DCHECK(platform_);
-    static constexpr double kSlackInSeconds = 0.001;
     for (SpaceState& state : *states_) {
-      // FinalizeSpaceWithDeadline() and SweepSpaceWithDeadline() won't check
-      // the deadline until it sweeps 10 pages. So we give a small slack for
-      // safety.
-      const double remaining_budget = deadline_in_seconds - kSlackInSeconds -
-                                      platform_->MonotonicallyIncreasingTime();
-      if (remaining_budget <= 0.) return false;
+      const auto deadline = v8::base::TimeTicks::Now() + max_duration;
 
       // First, prioritize finalization of pages that were swept concurrently.
       SweepFinalizer finalizer(platform_, free_memory_handling_);
-      if (!finalizer.FinalizeSpaceWithDeadline(&state, deadline_in_seconds)) {
+      if (!finalizer.FinalizeSpaceWithDeadline(&state, deadline)) {
         return false;
       }
 
+      if (sweeping_mode == MutatorThreadSweepingMode::kOnlyFinalizers)
+        return false;
+
       // Help out the concurrent sweeper.
-      if (!SweepSpaceWithDeadline(&state, deadline_in_seconds)) {
+      if (!SweepSpaceWithDeadline(&state, deadline)) {
         return false;
       }
     }
@@ -541,16 +565,11 @@ class MutatorThreadSweeper final : private HeapVisitor<MutatorThreadSweeper> {
   }
 
  private:
-  bool SweepSpaceWithDeadline(SpaceState* state, double deadline_in_seconds) {
-    static constexpr size_t kDeadlineCheckInterval = 8;
-    size_t page_count = 1;
+  bool SweepSpaceWithDeadline(SpaceState* state, v8::base::TimeTicks deadline) {
+    DeadlineChecker deadline_check(deadline);
     while (auto page = state->unswept_pages.Pop()) {
       Traverse(**page);
-      if (page_count % kDeadlineCheckInterval == 0 &&
-          deadline_in_seconds <= platform_->MonotonicallyIncreasingTime()) {
-        return false;
-      }
-      page_count++;
+      if (deadline_check.Check()) return false;
     }
 
     return true;
@@ -603,7 +622,7 @@ class ConcurrentSweepTask final : public cppgc::JobTask,
                                   private HeapVisitor<ConcurrentSweepTask> {
   friend class HeapVisitor<ConcurrentSweepTask>;
 
-  using FreeMemoryHandling = Sweeper::SweepingConfig::FreeMemoryHandling;
+  using FreeMemoryHandling = SweepingConfig::FreeMemoryHandling;
 
  public:
   ConcurrentSweepTask(HeapBase& heap, SpaceStates* states, Platform* platform,
@@ -693,8 +712,7 @@ class ConcurrentSweepTask final : public cppgc::JobTask,
 class PrepareForSweepVisitor final
     : protected HeapVisitor<PrepareForSweepVisitor> {
   friend class HeapVisitor<PrepareForSweepVisitor>;
-  using CompactableSpaceHandling =
-      Sweeper::SweepingConfig::CompactableSpaceHandling;
+  using CompactableSpaceHandling = SweepingConfig::CompactableSpaceHandling;
 
  public:
   PrepareForSweepVisitor(SpaceStates* states,
@@ -746,7 +764,7 @@ class PrepareForSweepVisitor final
 }  // namespace
 
 class Sweeper::SweeperImpl final {
-  using FreeMemoryHandling = Sweeper::SweepingConfig::FreeMemoryHandling;
+  using FreeMemoryHandling = SweepingConfig::FreeMemoryHandling;
 
  public:
   SweeperImpl(RawHeap& heap, StatsCollector* stats_collector)
@@ -787,7 +805,8 @@ class Sweeper::SweeperImpl final {
     }
   }
 
-  bool SweepForAllocationIfRunning(NormalPageSpace* space, size_t size) {
+  bool SweepForAllocationIfRunning(NormalPageSpace* space, size_t size,
+                                   v8::base::TimeDelta max_duration) {
     if (!is_in_progress_) return false;
 
     // Bail out for recursive sweeping calls. This can happen when finalizers
@@ -808,14 +827,19 @@ class Sweeper::SweeperImpl final {
     StatsCollector::EnabledScope inner_scope(
         stats_collector_, StatsCollector::kSweepOnAllocation);
     MutatorThreadSweepingScope sweeping_in_progress(*this);
-
+    DeadlineChecker deadline_check(v8::base::TimeTicks::Now() + max_duration);
     {
       // First, process unfinalized pages as finalizing a page is faster than
       // sweeping.
       SweepFinalizer finalizer(platform_, config_.free_memory_handling);
       while (auto page = space_state.swept_unfinalized_pages.Pop()) {
         finalizer.FinalizePage(&*page);
-        if (size <= finalizer.largest_new_free_list_entry()) return true;
+        if (size <= finalizer.largest_new_free_list_entry()) {
+          return true;
+        }
+        if (deadline_check.Check()) {
+          return false;
+        }
       }
     }
     {
@@ -825,19 +849,24 @@ class Sweeper::SweeperImpl final {
                                    config_.free_memory_handling);
       while (auto page = space_state.unswept_pages.Pop()) {
         sweeper.SweepPage(**page);
-        if (size <= sweeper.largest_new_free_list_entry()) return true;
+        if (size <= sweeper.largest_new_free_list_entry()) {
+          return true;
+        }
+        if (deadline_check.Check()) {
+          return false;
+        }
       }
     }
 
     return false;
   }
 
-  void FinishIfRunning() {
-    if (!is_in_progress_) return;
+  bool FinishIfRunning() {
+    if (!is_in_progress_) return false;
 
     // Bail out for recursive sweeping calls. This can happen when finalizers
     // allocate new memory.
-    if (is_sweeping_on_mutator_thread_) return;
+    if (is_sweeping_on_mutator_thread_) return false;
 
     {
       StatsCollector::EnabledScope stats_scope(
@@ -852,12 +881,22 @@ class Sweeper::SweeperImpl final {
       Finish();
     }
     NotifyDone();
+    return true;
+  }
+
+  bool IsConcurrentSweepingDone() const {
+    return !concurrent_sweeper_handle_ ||
+           (concurrent_sweeper_handle_->IsValid() &&
+            !concurrent_sweeper_handle_->IsActive());
   }
 
   void FinishIfOutOfWork() {
     if (is_in_progress_ && !is_sweeping_on_mutator_thread_ &&
         concurrent_sweeper_handle_ && concurrent_sweeper_handle_->IsValid() &&
         !concurrent_sweeper_handle_->IsActive()) {
+      StatsCollector::EnabledScope stats_scope(
+          stats_collector_, StatsCollector::kSweepFinishIfOutOfWork);
+      MutatorThreadSweepingScope sweeping_in_progress(*this);
       // At this point we know that the concurrent sweeping task has run
       // out-of-work: all pages are swept. The main thread still needs to finish
       // sweeping though.
@@ -865,8 +904,18 @@ class Sweeper::SweeperImpl final {
                          [](const SpaceState& state) {
                            return state.unswept_pages.IsEmpty();
                          }));
-      FinishIfRunning();
+
+      // There may be unfinalized pages left. Since it's hard to estimate
+      // the actual amount of sweeping necessary, we sweep with a small
+      // deadline to see if sweeping can be fully finished.
+      MutatorThreadSweeper sweeper(heap_.heap(), &space_states_, platform_,
+                                   config_.free_memory_handling);
+      if (sweeper.SweepWithDeadline(v8::base::TimeDelta::FromMilliseconds(2),
+                                    MutatorThreadSweepingMode::kAll)) {
+        FinalizeSweep();
+      }
     }
+    NotifyDoneIfNeeded();
   }
 
   void Finish() {
@@ -920,8 +969,9 @@ class Sweeper::SweeperImpl final {
 
   bool IsSweepingInProgress() const { return is_in_progress_; }
 
-  bool PerformSweepOnMutatorThread(double deadline_in_seconds,
-                                   StatsCollector::ScopeId internal_scope_id) {
+  bool PerformSweepOnMutatorThread(v8::base::TimeDelta max_duration,
+                                   StatsCollector::ScopeId internal_scope_id,
+                                   MutatorThreadSweepingMode sweeping_mode) {
     if (!is_in_progress_) return true;
 
     MutatorThreadSweepingScope sweeping_in_progress(*this);
@@ -935,10 +985,10 @@ class Sweeper::SweeperImpl final {
                                    config_.free_memory_handling);
       {
         StatsCollector::EnabledScope inner_stats_scope(
-            stats_collector_, internal_scope_id, "deltaInSeconds",
-            deadline_in_seconds - platform_->MonotonicallyIncreasingTime());
-
-        sweep_complete = sweeper.SweepWithDeadline(deadline_in_seconds);
+            stats_collector_, internal_scope_id, "max_duration_ms",
+            max_duration.InMillisecondsF(), "sweeping_mode",
+            ToString(sweeping_mode));
+        sweep_complete = sweeper.SweepWithDeadline(max_duration, sweeping_mode);
       }
       if (sweep_complete) {
         FinalizeSweep();
@@ -948,6 +998,23 @@ class Sweeper::SweeperImpl final {
     return sweep_complete;
   }
 
+  void AddMutatorThreadSweepingObserver(
+      Sweeper::SweepingOnMutatorThreadObserver* observer) {
+    DCHECK_EQ(mutator_thread_sweeping_observers_.end(),
+              std::find(mutator_thread_sweeping_observers_.begin(),
+                        mutator_thread_sweeping_observers_.end(), observer));
+    mutator_thread_sweeping_observers_.push_back(observer);
+  }
+
+  void RemoveMutatorThreadSweepingObserver(
+      Sweeper::SweepingOnMutatorThreadObserver* observer) {
+    const auto it =
+        std::find(mutator_thread_sweeping_observers_.begin(),
+                  mutator_thread_sweeping_observers_.end(), observer);
+    DCHECK_NE(mutator_thread_sweeping_observers_.end(), it);
+    mutator_thread_sweeping_observers_.erase(it);
+  }
+
  private:
   class MutatorThreadSweepingScope final {
    public:
@@ -955,9 +1022,15 @@ class Sweeper::SweeperImpl final {
         : sweeper_(sweeper) {
       DCHECK(!sweeper_.is_sweeping_on_mutator_thread_);
       sweeper_.is_sweeping_on_mutator_thread_ = true;
+      for (auto* observer : sweeper_.mutator_thread_sweeping_observers_) {
+        observer->Start();
+      }
     }
     ~MutatorThreadSweepingScope() {
       sweeper_.is_sweeping_on_mutator_thread_ = false;
+      for (auto* observer : sweeper_.mutator_thread_sweeping_observers_) {
+        observer->End();
+      }
     }
 
     MutatorThreadSweepingScope(const MutatorThreadSweepingScope&) = delete;
@@ -968,33 +1041,37 @@ class Sweeper::SweeperImpl final {
     SweeperImpl& sweeper_;
   };
 
-  class IncrementalSweepTask : public cppgc::IdleTask {
+  class IncrementalSweepTask final : public cppgc::Task {
    public:
     using Handle = SingleThreadedHandle;
 
-    explicit IncrementalSweepTask(SweeperImpl* sweeper)
+    explicit IncrementalSweepTask(SweeperImpl& sweeper)
         : sweeper_(sweeper), handle_(Handle::NonEmptyTag{}) {}
 
-    static Handle Post(SweeperImpl* sweeper, cppgc::TaskRunner* runner) {
+    static Handle Post(SweeperImpl& sweeper, cppgc::TaskRunner* runner) {
       auto task = std::make_unique<IncrementalSweepTask>(sweeper);
       auto handle = task->GetHandle();
-      runner->PostIdleTask(std::move(task));
+      runner->PostTask(std::move(task));
       return handle;
     }
 
    private:
-    void Run(double deadline_in_seconds) override {
+    void Run() override {
       if (handle_.IsCanceled()) return;
 
-      if (!sweeper_->PerformSweepOnMutatorThread(
-              deadline_in_seconds, StatsCollector::kSweepIdleStep)) {
-        sweeper_->ScheduleIncrementalSweeping();
+      if (!sweeper_.PerformSweepOnMutatorThread(
+              v8::base::TimeDelta::FromMilliseconds(5),
+              StatsCollector::kSweepInTask,
+              sweeper_.IsConcurrentSweepingDone()
+                  ? MutatorThreadSweepingMode::kAll
+                  : MutatorThreadSweepingMode::kOnlyFinalizers)) {
+        sweeper_.ScheduleIncrementalSweeping();
       }
     }
 
     Handle GetHandle() const { return handle_; }
 
-    SweeperImpl* sweeper_;
+    SweeperImpl& sweeper_;
     // TODO(chromium:1056170): Change to CancelableTask.
     Handle handle_;
   };
@@ -1002,10 +1079,10 @@ class Sweeper::SweeperImpl final {
   void ScheduleIncrementalSweeping() {
     DCHECK(platform_);
     auto runner = platform_->GetForegroundTaskRunner();
-    if (!runner || !runner->IdleTasksEnabled()) return;
+    if (!runner) return;
 
     incremental_sweeper_handle_ =
-        IncrementalSweepTask::Post(this, runner.get());
+        IncrementalSweepTask::Post(*this, runner.get());
   }
 
   void ScheduleConcurrentSweeping() {
@@ -1042,6 +1119,8 @@ class Sweeper::SweeperImpl final {
   SweepingConfig config_;
   IncrementalSweepTask::Handle incremental_sweeper_handle_;
   std::unique_ptr<cppgc::JobHandle> concurrent_sweeper_handle_;
+  std::vector<Sweeper::SweepingOnMutatorThreadObserver*>
+      mutator_thread_sweeping_observers_;
   // Indicates whether the sweeping phase is in progress.
   bool is_in_progress_ = false;
   bool notify_done_pending_ = false;
@@ -1060,14 +1139,16 @@ Sweeper::~Sweeper() = default;
 void Sweeper::Start(SweepingConfig config) {
   impl_->Start(config, heap_.platform());
 }
-void Sweeper::FinishIfRunning() { impl_->FinishIfRunning(); }
+
+bool Sweeper::FinishIfRunning() { return impl_->FinishIfRunning(); }
 void Sweeper::FinishIfOutOfWork() { impl_->FinishIfOutOfWork(); }
 void Sweeper::WaitForConcurrentSweepingForTesting() {
   impl_->WaitForConcurrentSweepingForTesting();
 }
 void Sweeper::NotifyDoneIfNeeded() { impl_->NotifyDoneIfNeeded(); }
-bool Sweeper::SweepForAllocationIfRunning(NormalPageSpace* space, size_t size) {
-  return impl_->SweepForAllocationIfRunning(space, size);
+bool Sweeper::SweepForAllocationIfRunning(NormalPageSpace* space, size_t size,
+                                          v8::base::TimeDelta max_duration) {
+  return impl_->SweepForAllocationIfRunning(space, size, max_duration);
 }
 bool Sweeper::IsSweepingOnMutatorThread() const {
   return impl_->IsSweepingOnMutatorThread();
@@ -1077,10 +1158,20 @@ bool Sweeper::IsSweepingInProgress() const {
   return impl_->IsSweepingInProgress();
 }
 
-bool Sweeper::PerformSweepOnMutatorThread(double deadline_in_seconds) {
-  return impl_->PerformSweepOnMutatorThread(deadline_in_seconds,
-                                            StatsCollector::kSweepInTask);
+bool Sweeper::PerformSweepOnMutatorThread(v8::base::TimeDelta max_duration,
+                                          StatsCollector::ScopeId scope_id) {
+  return impl_->PerformSweepOnMutatorThread(max_duration, scope_id,
+                                            MutatorThreadSweepingMode::kAll);
+}
+
+Sweeper::SweepingOnMutatorThreadObserver::SweepingOnMutatorThreadObserver(
+    Sweeper& sweeper)
+    : sweeper_(sweeper) {
+  sweeper_.impl_->AddMutatorThreadSweepingObserver(this);
+}
+
+Sweeper::SweepingOnMutatorThreadObserver::~SweepingOnMutatorThreadObserver() {
+  sweeper_.impl_->RemoveMutatorThreadSweepingObserver(this);
 }
 
-}  // namespace internal
-}  // namespace cppgc
+}  // namespace cppgc::internal
diff --git a/deps/v8/src/heap/cppgc/sweeper.h b/deps/v8/src/heap/cppgc/sweeper.h
index 845dfbbfc1261e..95b61729b865cc 100644
--- a/deps/v8/src/heap/cppgc/sweeper.h
+++ b/deps/v8/src/heap/cppgc/sweeper.h
@@ -7,16 +7,13 @@
 
 #include <memory>
 
-#include "include/cppgc/heap.h"
 #include "src/base/macros.h"
 #include "src/base/platform/time.h"
+#include "src/heap/cppgc/heap-config.h"
 #include "src/heap/cppgc/memory.h"
+#include "src/heap/cppgc/stats-collector.h"
 
-namespace cppgc {
-
-class Platform;
-
-namespace internal {
+namespace cppgc::internal {
 
 class HeapBase;
 class ConcurrentSweeperTest;
@@ -24,15 +21,16 @@ class NormalPageSpace;
 
 class V8_EXPORT_PRIVATE Sweeper final {
  public:
-  struct SweepingConfig {
-    using SweepingType = cppgc::Heap::SweepingType;
-    enum class CompactableSpaceHandling { kSweep, kIgnore };
-    enum class FreeMemoryHandling { kDoNotDiscard, kDiscardWherePossible };
-
-    SweepingType sweeping_type = SweepingType::kIncrementalAndConcurrent;
-    CompactableSpaceHandling compactable_space_handling =
-        CompactableSpaceHandling::kSweep;
-    FreeMemoryHandling free_memory_handling = FreeMemoryHandling::kDoNotDiscard;
+  class V8_EXPORT_PRIVATE SweepingOnMutatorThreadObserver {
+   public:
+    explicit SweepingOnMutatorThreadObserver(Sweeper&);
+    virtual ~SweepingOnMutatorThreadObserver();
+
+    virtual void Start() = 0;
+    virtual void End() = 0;
+
+   private:
+    Sweeper& sweeper_;
   };
 
   static constexpr bool CanDiscardMemory() {
@@ -47,19 +45,24 @@ class V8_EXPORT_PRIVATE Sweeper final {
 
   // Sweeper::Start assumes the heap holds no linear allocation buffers.
   void Start(SweepingConfig);
-  void FinishIfRunning();
+  // Returns true when sweeping was finished and false if it was not running or
+  // couldn't be finished due to being a recursive sweep call.
+  bool FinishIfRunning();
   void FinishIfOutOfWork();
   void NotifyDoneIfNeeded();
-  // SweepForAllocationIfRunning sweeps the given |space| until a slot that can
-  // fit an allocation of size |size| is found. Returns true if a slot was
-  // found.
-  bool SweepForAllocationIfRunning(NormalPageSpace* space, size_t size);
+  // SweepForAllocationIfRunning sweeps the given `space` until a slot that can
+  // fit an allocation of `min_wanted_size` bytes is found. Returns true if a
+  // slot was found. Aborts after `max_duration`.
+  bool SweepForAllocationIfRunning(NormalPageSpace* space,
+                                   size_t min_wanted_size,
+                                   v8::base::TimeDelta max_duration);
 
   bool IsSweepingOnMutatorThread() const;
   bool IsSweepingInProgress() const;
 
   // Assist with sweeping. Returns true if sweeping is done.
-  bool PerformSweepOnMutatorThread(double deadline_in_seconds);
+  bool PerformSweepOnMutatorThread(v8::base::TimeDelta max_duration,
+                                   StatsCollector::ScopeId);
 
  private:
   void WaitForConcurrentSweepingForTesting();
@@ -72,7 +75,6 @@ class V8_EXPORT_PRIVATE Sweeper final {
   friend class ConcurrentSweeperTest;
 };
 
-}  // namespace internal
-}  // namespace cppgc
+}  // namespace cppgc::internal
 
 #endif  // V8_HEAP_CPPGC_SWEEPER_H_
diff --git a/deps/v8/src/heap/cppgc/write-barrier.cc b/deps/v8/src/heap/cppgc/write-barrier.cc
index 098f950d2a47da..5cbec656a9236c 100644
--- a/deps/v8/src/heap/cppgc/write-barrier.cc
+++ b/deps/v8/src/heap/cppgc/write-barrier.cc
@@ -187,24 +187,6 @@ void WriteBarrier::CheckParams(Type expected_type, const Params& params) {
 }
 #endif  // V8_ENABLE_CHECKS
 
-// static
-bool WriteBarrierTypeForNonCagedHeapPolicy::IsMarking(const void* object,
-                                                      HeapHandle** handle) {
-  // Large objects cannot have mixins, so we are guaranteed to always have
-  // a pointer on the same page.
-  const auto* page = BasePage::FromPayload(object);
-  *handle = &page->heap();
-  const MarkerBase* marker = page->heap().marker();
-  return marker && marker->IsMarking();
-}
-
-// static
-bool WriteBarrierTypeForNonCagedHeapPolicy::IsMarking(HeapHandle& heap_handle) {
-  const auto& heap_base = internal::HeapBase::From(heap_handle);
-  const MarkerBase* marker = heap_base.marker();
-  return marker && marker->IsMarking();
-}
-
 #if defined(CPPGC_YOUNG_GENERATION)
 
 // static
diff --git a/deps/v8/src/heap/embedder-tracing.cc b/deps/v8/src/heap/embedder-tracing.cc
index 8bb5bcad4e9b85..ceac516f9c4eb9 100644
--- a/deps/v8/src/heap/embedder-tracing.cc
+++ b/deps/v8/src/heap/embedder-tracing.cc
@@ -45,9 +45,8 @@ CppHeap::GarbageCollectionFlags ConvertTraceFlags(
 void LocalEmbedderHeapTracer::PrepareForTrace(
     EmbedderHeapTracer::TraceFlags flags) {
   if (cpp_heap_)
-    cpp_heap()->InitializeTracing(
-        cppgc::internal::GarbageCollector::Config::CollectionType::kMajor,
-        ConvertTraceFlags(flags));
+    cpp_heap()->InitializeTracing(cppgc::internal::CollectionType::kMajor,
+                                  ConvertTraceFlags(flags));
 }
 
 void LocalEmbedderHeapTracer::TracePrologue(
diff --git a/deps/v8/src/heap/evacuation-allocator-inl.h b/deps/v8/src/heap/evacuation-allocator-inl.h
index b474664a62472a..8d83eaad1cac81 100644
--- a/deps/v8/src/heap/evacuation-allocator-inl.h
+++ b/deps/v8/src/heap/evacuation-allocator-inl.h
@@ -16,6 +16,7 @@ AllocationResult EvacuationAllocator::Allocate(AllocationSpace space,
                                                int object_size,
                                                AllocationOrigin origin,
                                                AllocationAlignment alignment) {
+  object_size = ALIGN_TO_ALLOCATION_ALIGNMENT(object_size);
   switch (space) {
     case NEW_SPACE:
       return AllocateInNewSpace(object_size, origin, alignment);
@@ -28,6 +29,9 @@ AllocationResult EvacuationAllocator::Allocate(AllocationSpace space,
     case CODE_SPACE:
       return compaction_spaces_.Get(CODE_SPACE)
           ->AllocateRaw(object_size, alignment, origin);
+    case SHARED_SPACE:
+      return compaction_spaces_.Get(SHARED_SPACE)
+          ->AllocateRaw(object_size, alignment, origin);
     default:
       UNREACHABLE();
   }
@@ -35,15 +39,19 @@ AllocationResult EvacuationAllocator::Allocate(AllocationSpace space,
 
 void EvacuationAllocator::FreeLast(AllocationSpace space, HeapObject object,
                                    int object_size) {
+  object_size = ALIGN_TO_ALLOCATION_ALIGNMENT(object_size);
   switch (space) {
     case NEW_SPACE:
       FreeLastInNewSpace(object, object_size);
       return;
     case OLD_SPACE:
-      FreeLastInOldSpace(object, object_size);
+      FreeLastInCompactionSpace(OLD_SPACE, object, object_size);
       return;
     case MAP_SPACE:
-      FreeLastInMapSpace(object, object_size);
+      FreeLastInCompactionSpace(MAP_SPACE, object, object_size);
+      return;
+    case SHARED_SPACE:
+      FreeLastInCompactionSpace(SHARED_SPACE, object, object_size);
       return;
     default:
       // Only new and old space supported.
@@ -59,19 +67,11 @@ void EvacuationAllocator::FreeLastInNewSpace(HeapObject object,
   }
 }
 
-void EvacuationAllocator::FreeLastInOldSpace(HeapObject object,
-                                             int object_size) {
-  if (!compaction_spaces_.Get(OLD_SPACE)->TryFreeLast(object.address(),
-                                                      object_size)) {
-    // We couldn't free the last object so we have to write a proper filler.
-    heap_->CreateFillerObjectAt(object.address(), object_size);
-  }
-}
-
-void EvacuationAllocator::FreeLastInMapSpace(HeapObject object,
-                                             int object_size) {
-  if (!compaction_spaces_.Get(MAP_SPACE)->TryFreeLast(object.address(),
-                                                      object_size)) {
+void EvacuationAllocator::FreeLastInCompactionSpace(AllocationSpace space,
+                                                    HeapObject object,
+                                                    int object_size) {
+  if (!compaction_spaces_.Get(space)->TryFreeLast(object.address(),
+                                                  object_size)) {
     // We couldn't free the last object so we have to write a proper filler.
     heap_->CreateFillerObjectAt(object.address(), object_size);
   }
diff --git a/deps/v8/src/heap/evacuation-allocator.h b/deps/v8/src/heap/evacuation-allocator.h
index 6dbeab1b2987fc..14f5cb0a1f86e8 100644
--- a/deps/v8/src/heap/evacuation-allocator.h
+++ b/deps/v8/src/heap/evacuation-allocator.h
@@ -39,6 +39,10 @@ class EvacuationAllocator {
       heap_->map_space()->MergeCompactionSpace(
           compaction_spaces_.Get(MAP_SPACE));
     }
+    if (heap_->shared_space()) {
+      heap_->shared_space()->MergeCompactionSpace(
+          compaction_spaces_.Get(SHARED_SPACE));
+    }
 
     // Give back remaining LAB space if this EvacuationAllocator's new space LAB
     // sits right next to new space allocation top.
@@ -60,8 +64,8 @@ class EvacuationAllocator {
   inline AllocationResult AllocateInLAB(int object_size,
                                         AllocationAlignment alignment);
   inline void FreeLastInNewSpace(HeapObject object, int object_size);
-  inline void FreeLastInOldSpace(HeapObject object, int object_size);
-  inline void FreeLastInMapSpace(HeapObject object, int object_size);
+  inline void FreeLastInCompactionSpace(AllocationSpace space,
+                                        HeapObject object, int object_size);
 
   Heap* const heap_;
   NewSpace* const new_space_;
diff --git a/deps/v8/src/heap/evacuation-verifier-inl.h b/deps/v8/src/heap/evacuation-verifier-inl.h
new file mode 100644
index 00000000000000..cf1eee13517c7c
--- /dev/null
+++ b/deps/v8/src/heap/evacuation-verifier-inl.h
@@ -0,0 +1,64 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_EVACUATION_VERIFIER_INL_H_
+#define V8_HEAP_EVACUATION_VERIFIER_INL_H_
+
+#include "src/heap/evacuation-verifier.h"
+#include "src/heap/heap-inl.h"
+#include "src/heap/mark-compact.h"
+
+namespace v8 {
+namespace internal {
+
+#ifdef VERIFY_HEAP
+
+void FullEvacuationVerifier::VerifyHeapObjectImpl(HeapObject heap_object) {
+  if (!ShouldVerifyObject(heap_object)) return;
+  CHECK_IMPLIES(Heap::InYoungGeneration(heap_object),
+                Heap::InToPage(heap_object));
+  CHECK(!MarkCompactCollector::IsOnEvacuationCandidate(heap_object));
+}
+
+bool FullEvacuationVerifier::ShouldVerifyObject(HeapObject heap_object) {
+  const bool in_shared_heap = heap_object.InSharedWritableHeap();
+  return heap_->isolate()->is_shared_heap_isolate() ? in_shared_heap
+                                                    : !in_shared_heap;
+}
+
+template <typename TSlot>
+void FullEvacuationVerifier::VerifyPointersImpl(TSlot start, TSlot end) {
+  for (TSlot current = start; current < end; ++current) {
+    typename TSlot::TObject object = current.load(cage_base());
+    HeapObject heap_object;
+    if (object.GetHeapObjectIfStrong(&heap_object)) {
+      VerifyHeapObjectImpl(heap_object);
+    }
+  }
+}
+
+void YoungGenerationEvacuationVerifier::VerifyHeapObjectImpl(
+    HeapObject heap_object) {
+  CHECK_IMPLIES(Heap::InYoungGeneration(heap_object),
+                Heap::InToPage(heap_object));
+}
+
+template <typename TSlot>
+void YoungGenerationEvacuationVerifier::VerifyPointersImpl(TSlot start,
+                                                           TSlot end) {
+  for (TSlot current = start; current < end; ++current) {
+    typename TSlot::TObject object = current.load(cage_base());
+    HeapObject heap_object;
+    if (object.GetHeapObject(&heap_object)) {
+      VerifyHeapObjectImpl(heap_object);
+    }
+  }
+}
+
+#endif  // VERIFY_HEAP
+
+}  // namespace internal
+}  // namespace v8
+
+#endif  // V8_HEAP_EVACUATION_VERIFIER_INL_H_
diff --git a/deps/v8/src/heap/evacuation-verifier.cc b/deps/v8/src/heap/evacuation-verifier.cc
new file mode 100644
index 00000000000000..2396e73f36f080
--- /dev/null
+++ b/deps/v8/src/heap/evacuation-verifier.cc
@@ -0,0 +1,179 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/codegen/assembler-inl.h"
+#include "src/codegen/reloc-info.h"
+#include "src/heap/evacuation-verifier-inl.h"
+#include "src/objects/map-inl.h"
+
+namespace v8 {
+namespace internal {
+
+#ifdef VERIFY_HEAP
+
+EvacuationVerifier::EvacuationVerifier(Heap* heap)
+    : ObjectVisitorWithCageBases(heap), heap_(heap) {}
+
+void EvacuationVerifier::VisitPointers(HeapObject host, ObjectSlot start,
+                                       ObjectSlot end) {
+  VerifyPointers(start, end);
+}
+
+void EvacuationVerifier::VisitPointers(HeapObject host, MaybeObjectSlot start,
+                                       MaybeObjectSlot end) {
+  VerifyPointers(start, end);
+}
+
+void EvacuationVerifier::VisitCodePointer(HeapObject host,
+                                          CodeObjectSlot slot) {
+  CHECK(V8_EXTERNAL_CODE_SPACE_BOOL);
+  VerifyCodePointer(slot);
+}
+
+void EvacuationVerifier::VisitRootPointers(Root root, const char* description,
+                                           FullObjectSlot start,
+                                           FullObjectSlot end) {
+  VerifyRootPointers(start, end);
+}
+
+void EvacuationVerifier::VisitMapPointer(HeapObject object) {
+  VerifyMap(object.map(cage_base()));
+}
+void EvacuationVerifier::VerifyRoots() {
+  heap_->IterateRootsIncludingClients(this,
+                                      base::EnumSet<SkipRoot>{SkipRoot::kWeak});
+}
+
+void EvacuationVerifier::VerifyEvacuationOnPage(Address start, Address end) {
+  Address current = start;
+  while (current < end) {
+    HeapObject object = HeapObject::FromAddress(current);
+    if (!object.IsFreeSpaceOrFiller(cage_base())) {
+      object.Iterate(cage_base(), this);
+    }
+    current += ALIGN_TO_ALLOCATION_ALIGNMENT(object.Size(cage_base()));
+  }
+}
+
+void EvacuationVerifier::VerifyEvacuation(NewSpace* space) {
+  if (!space) return;
+  if (v8_flags.minor_mc) {
+    VerifyEvacuation(PagedNewSpace::From(space)->paged_space());
+    return;
+  }
+  PageRange range(space->first_allocatable_address(), space->top());
+  for (auto it = range.begin(); it != range.end();) {
+    Page* page = *(it++);
+    Address current = page->area_start();
+    Address limit = it != range.end() ? page->area_end() : space->top();
+    CHECK(limit == space->top() || !page->Contains(space->top()));
+    VerifyEvacuationOnPage(current, limit);
+  }
+}
+
+void EvacuationVerifier::VerifyEvacuation(PagedSpaceBase* space) {
+  for (Page* p : *space) {
+    if (p->IsEvacuationCandidate()) continue;
+    if (p->Contains(space->top())) {
+      CodePageMemoryModificationScope memory_modification_scope(p);
+      heap_->CreateFillerObjectAt(
+          space->top(), static_cast<int>(space->limit() - space->top()));
+    }
+    VerifyEvacuationOnPage(p->area_start(), p->area_end());
+  }
+}
+
+FullEvacuationVerifier::FullEvacuationVerifier(Heap* heap)
+    : EvacuationVerifier(heap) {}
+
+void FullEvacuationVerifier::Run() {
+  DCHECK(!heap_->sweeping_in_progress());
+  VerifyRoots();
+  VerifyEvacuation(heap_->new_space());
+  VerifyEvacuation(heap_->old_space());
+  VerifyEvacuation(heap_->code_space());
+  if (heap_->shared_space()) VerifyEvacuation(heap_->shared_space());
+  if (heap_->map_space()) VerifyEvacuation(heap_->map_space());
+}
+
+void FullEvacuationVerifier::VerifyMap(Map map) { VerifyHeapObjectImpl(map); }
+void FullEvacuationVerifier::VerifyPointers(ObjectSlot start, ObjectSlot end) {
+  VerifyPointersImpl(start, end);
+}
+void FullEvacuationVerifier::VerifyPointers(MaybeObjectSlot start,
+                                            MaybeObjectSlot end) {
+  VerifyPointersImpl(start, end);
+}
+void FullEvacuationVerifier::VerifyCodePointer(CodeObjectSlot slot) {
+  CHECK(V8_EXTERNAL_CODE_SPACE_BOOL);
+  Object maybe_code = slot.load(code_cage_base());
+  HeapObject code;
+  // The slot might contain smi during CodeDataContainer creation, so skip it.
+  if (maybe_code.GetHeapObject(&code)) {
+    VerifyHeapObjectImpl(code);
+  }
+}
+void FullEvacuationVerifier::VisitCodeTarget(Code host, RelocInfo* rinfo) {
+  Code target = Code::GetCodeFromTargetAddress(rinfo->target_address());
+  VerifyHeapObjectImpl(target);
+}
+void FullEvacuationVerifier::VisitEmbeddedPointer(Code host, RelocInfo* rinfo) {
+  VerifyHeapObjectImpl(rinfo->target_object(cage_base()));
+}
+void FullEvacuationVerifier::VerifyRootPointers(FullObjectSlot start,
+                                                FullObjectSlot end) {
+  VerifyPointersImpl(start, end);
+}
+
+YoungGenerationEvacuationVerifier::YoungGenerationEvacuationVerifier(Heap* heap)
+    : EvacuationVerifier(heap) {}
+
+void YoungGenerationEvacuationVerifier::YoungGenerationEvacuationVerifier::
+    Run() {
+  DCHECK(!heap_->sweeping_in_progress());
+  VerifyRoots();
+  VerifyEvacuation(heap_->new_space());
+  VerifyEvacuation(heap_->old_space());
+  VerifyEvacuation(heap_->code_space());
+  if (heap_->map_space()) VerifyEvacuation(heap_->map_space());
+}
+
+void YoungGenerationEvacuationVerifier::VerifyMap(Map map) {
+  VerifyHeapObjectImpl(map);
+}
+void YoungGenerationEvacuationVerifier::VerifyPointers(ObjectSlot start,
+                                                       ObjectSlot end) {
+  VerifyPointersImpl(start, end);
+}
+void YoungGenerationEvacuationVerifier::VerifyPointers(MaybeObjectSlot start,
+                                                       MaybeObjectSlot end) {
+  VerifyPointersImpl(start, end);
+}
+void YoungGenerationEvacuationVerifier::VerifyCodePointer(CodeObjectSlot slot) {
+  CHECK(V8_EXTERNAL_CODE_SPACE_BOOL);
+  Object maybe_code = slot.load(code_cage_base());
+  HeapObject code;
+  // The slot might contain smi during CodeDataContainer creation, so skip it.
+  if (maybe_code.GetHeapObject(&code)) {
+    VerifyHeapObjectImpl(code);
+  }
+}
+void YoungGenerationEvacuationVerifier::VisitCodeTarget(Code host,
+                                                        RelocInfo* rinfo) {
+  Code target = Code::GetCodeFromTargetAddress(rinfo->target_address());
+  VerifyHeapObjectImpl(target);
+}
+void YoungGenerationEvacuationVerifier::VisitEmbeddedPointer(Code host,
+                                                             RelocInfo* rinfo) {
+  VerifyHeapObjectImpl(rinfo->target_object(cage_base()));
+}
+void YoungGenerationEvacuationVerifier::VerifyRootPointers(FullObjectSlot start,
+                                                           FullObjectSlot end) {
+  VerifyPointersImpl(start, end);
+}
+
+#endif  // VERIFY_HEAP
+
+}  // namespace internal
+}  // namespace v8
diff --git a/deps/v8/src/heap/evacuation-verifier.h b/deps/v8/src/heap/evacuation-verifier.h
new file mode 100644
index 00000000000000..3aa4702eaa2bbb
--- /dev/null
+++ b/deps/v8/src/heap/evacuation-verifier.h
@@ -0,0 +1,104 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_EVACUATION_VERIFIER_H_
+#define V8_HEAP_EVACUATION_VERIFIER_H_
+
+#include "src/heap/new-spaces.h"
+#include "src/heap/paged-spaces.h"
+#include "src/objects/map.h"
+#include "src/objects/visitors.h"
+
+namespace v8 {
+namespace internal {
+
+#ifdef VERIFY_HEAP
+
+class EvacuationVerifier : public ObjectVisitorWithCageBases,
+                           public RootVisitor {
+ public:
+  virtual void Run() = 0;
+
+  void VisitPointers(HeapObject host, ObjectSlot start,
+                     ObjectSlot end) override;
+
+  void VisitPointers(HeapObject host, MaybeObjectSlot start,
+                     MaybeObjectSlot end) override;
+
+  void VisitCodePointer(HeapObject host, CodeObjectSlot slot) override;
+
+  void VisitRootPointers(Root root, const char* description,
+                         FullObjectSlot start, FullObjectSlot end) override;
+
+  void VisitMapPointer(HeapObject object) override;
+
+ protected:
+  explicit EvacuationVerifier(Heap* heap);
+
+  inline Heap* heap() { return heap_; }
+
+  virtual void VerifyMap(Map map) = 0;
+  virtual void VerifyPointers(ObjectSlot start, ObjectSlot end) = 0;
+  virtual void VerifyPointers(MaybeObjectSlot start, MaybeObjectSlot end) = 0;
+  virtual void VerifyCodePointer(CodeObjectSlot slot) = 0;
+  virtual void VerifyRootPointers(FullObjectSlot start, FullObjectSlot end) = 0;
+
+  void VerifyRoots();
+  void VerifyEvacuationOnPage(Address start, Address end);
+  void VerifyEvacuation(NewSpace* new_space);
+  void VerifyEvacuation(PagedSpaceBase* paged_space);
+
+  Heap* heap_;
+};
+
+class FullEvacuationVerifier : public EvacuationVerifier {
+ public:
+  explicit FullEvacuationVerifier(Heap* heap);
+
+  void Run() override;
+
+ protected:
+  V8_INLINE void VerifyHeapObjectImpl(HeapObject heap_object);
+
+  V8_INLINE bool ShouldVerifyObject(HeapObject heap_object);
+
+  template <typename TSlot>
+  void VerifyPointersImpl(TSlot start, TSlot end);
+
+  void VerifyMap(Map map) override;
+  void VerifyPointers(ObjectSlot start, ObjectSlot end) override;
+  void VerifyPointers(MaybeObjectSlot start, MaybeObjectSlot end) override;
+  void VerifyCodePointer(CodeObjectSlot slot) override;
+  void VisitCodeTarget(Code host, RelocInfo* rinfo) override;
+  void VisitEmbeddedPointer(Code host, RelocInfo* rinfo) override;
+  void VerifyRootPointers(FullObjectSlot start, FullObjectSlot end) override;
+};
+
+class YoungGenerationEvacuationVerifier : public EvacuationVerifier {
+ public:
+  explicit YoungGenerationEvacuationVerifier(Heap* heap);
+
+  void Run() override;
+
+ protected:
+  V8_INLINE void VerifyHeapObjectImpl(HeapObject heap_object);
+
+  template <typename TSlot>
+  void VerifyPointersImpl(TSlot start, TSlot end);
+
+  void VerifyMap(Map map) override;
+  void VerifyPointers(ObjectSlot start, ObjectSlot end) override;
+  void VerifyPointers(MaybeObjectSlot start, MaybeObjectSlot end) override;
+  void VerifyCodePointer(CodeObjectSlot slot) override;
+  void VisitCodeTarget(Code host, RelocInfo* rinfo) override;
+  void VisitEmbeddedPointer(Code host, RelocInfo* rinfo) override;
+  void VerifyRootPointers(FullObjectSlot start, FullObjectSlot end) override;
+};
+
+#endif  // VERIFY_HEAP
+
+}  // namespace internal
+}  // namespace v8
+
+#endif  // V8_HEAP_EVACUATION_VERIFIER_H_
diff --git a/deps/v8/src/heap/factory-base.cc b/deps/v8/src/heap/factory-base.cc
index 9533456935d345..0dec79f03456d0 100644
--- a/deps/v8/src/heap/factory-base.cc
+++ b/deps/v8/src/heap/factory-base.cc
@@ -216,7 +216,7 @@ Handle<ByteArray> FactoryBase<Impl>::NewByteArray(int length,
     UNREACHABLE();
   }
   if (length == 0) return impl()->empty_byte_array();
-  int size = ByteArray::SizeFor(length);
+  int size = ALIGN_TO_ALLOCATION_ALIGNMENT(ByteArray::SizeFor(length));
   HeapObject result = AllocateRawWithImmortalMap(
       size, allocation, read_only_roots().byte_array_map());
   DisallowGarbageCollection no_gc;
diff --git a/deps/v8/src/heap/factory.cc b/deps/v8/src/heap/factory.cc
index 7afbc9b6836e43..bcb2f6475ec357 100644
--- a/deps/v8/src/heap/factory.cc
+++ b/deps/v8/src/heap/factory.cc
@@ -351,7 +351,7 @@ HeapObject Factory::AllocateRawWithAllocationSite(
   int size = map->instance_size();
   if (!allocation_site.is_null()) {
     DCHECK(V8_ALLOCATION_SITE_TRACKING_BOOL);
-    size += AllocationMemento::kSize;
+    size += ALIGN_TO_ALLOCATION_ALIGNMENT(AllocationMemento::kSize);
   }
   HeapObject result = allocator()->AllocateRawWith<HeapAllocator::kRetryOrFail>(
       size, allocation);
@@ -360,8 +360,9 @@ HeapObject Factory::AllocateRawWithAllocationSite(
                                             : UPDATE_WRITE_BARRIER;
   result.set_map_after_allocation(*map, write_barrier_mode);
   if (!allocation_site.is_null()) {
-    AllocationMemento alloc_memento = AllocationMemento::unchecked_cast(
-        Object(result.ptr() + map->instance_size()));
+    int aligned_size = ALIGN_TO_ALLOCATION_ALIGNMENT(map->instance_size());
+    AllocationMemento alloc_memento =
+        AllocationMemento::unchecked_cast(Object(result.ptr() + aligned_size));
     InitializeAllocationMemento(alloc_memento, *allocation_site);
   }
   return result;
@@ -774,6 +775,11 @@ MaybeHandle<String> NewStringFromUtf8Variant(Isolate* isolate,
 MaybeHandle<String> Factory::NewStringFromUtf8(
     const base::Vector<const uint8_t>& string,
     unibrow::Utf8Variant utf8_variant, AllocationType allocation) {
+  if (string.size() > kMaxInt) {
+    // The Utf8Decode can't handle longer inputs, and we couldn't create
+    // strings from them anyway.
+    THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String);
+  }
   auto peek_bytes = [&]() -> base::Vector<const uint8_t> { return string; };
   return NewStringFromUtf8Variant(isolate(), peek_bytes, utf8_variant,
                                   allocation);
@@ -792,6 +798,8 @@ MaybeHandle<String> Factory::NewStringFromUtf8(
   DCHECK_EQ(sizeof(uint8_t), array->type()->element_type().value_kind_size());
   DCHECK_LE(start, end);
   DCHECK_LE(end, array->length());
+  // {end - start} can never be more than what the Utf8Decoder can handle.
+  static_assert(WasmArray::MaxLength(sizeof(uint8_t)) <= kMaxInt);
   auto peek_bytes = [&]() -> base::Vector<const uint8_t> {
     const uint8_t* contents =
         reinterpret_cast<const uint8_t*>(array->ElementAddress(0));
@@ -806,6 +814,8 @@ MaybeHandle<String> Factory::NewStringFromUtf8(
     unibrow::Utf8Variant utf8_variant, AllocationType allocation) {
   DCHECK_LE(start, end);
   DCHECK_LE(end, array->length());
+  // {end - start} can never be more than what the Utf8Decoder can handle.
+  static_assert(ByteArray::kMaxLength <= kMaxInt);
   auto peek_bytes = [&]() -> base::Vector<const uint8_t> {
     const uint8_t* contents =
         reinterpret_cast<const uint8_t*>(array->GetDataStartAddress());
@@ -838,6 +848,8 @@ MaybeHandle<String> Factory::NewStringFromUtf16(Handle<WasmArray> array,
   DCHECK_EQ(sizeof(uint16_t), array->type()->element_type().value_kind_size());
   DCHECK_LE(start, end);
   DCHECK_LE(end, array->length());
+  // {end - start} can never be more than what the Utf8Decoder can handle.
+  static_assert(WasmArray::MaxLength(sizeof(uint16_t)) <= kMaxInt);
   auto peek_bytes = [&]() -> base::Vector<const uint16_t> {
     const uint16_t* contents =
         reinterpret_cast<const uint16_t*>(array->ElementAddress(0));
@@ -2036,7 +2048,7 @@ Handle<Map> Factory::NewMap(InstanceType type, int instance_size,
   DisallowGarbageCollection no_gc;
   Heap* roots = allocation_type == AllocationType::kMap
                     ? isolate()->heap()
-                    : isolate()->shared_isolate()->heap();
+                    : isolate()->shared_heap_isolate()->heap();
   result.set_map_after_allocation(ReadOnlyRoots(roots).meta_map(),
                                   SKIP_WRITE_BARRIER);
   return handle(InitializeMap(Map::cast(result), type, instance_size,
@@ -2119,10 +2131,12 @@ Handle<JSObject> Factory::CopyJSObjectWithAllocationSite(
   DCHECK(site.is_null() || AllocationSite::CanTrack(instance_type));
 
   int object_size = map->instance_size();
-  int adjusted_object_size = object_size;
+  int aligned_object_size = ALIGN_TO_ALLOCATION_ALIGNMENT(object_size);
+  int adjusted_object_size = aligned_object_size;
   if (!site.is_null()) {
     DCHECK(V8_ALLOCATION_SITE_TRACKING_BOOL);
-    adjusted_object_size += AllocationMemento::kSize;
+    adjusted_object_size +=
+        ALIGN_TO_ALLOCATION_ALIGNMENT(AllocationMemento::kSize);
   }
   HeapObject raw_clone =
       allocator()->AllocateRawWith<HeapAllocator::kRetryOrFail>(
@@ -2142,7 +2156,7 @@ Handle<JSObject> Factory::CopyJSObjectWithAllocationSite(
   }
   if (!site.is_null()) {
     AllocationMemento alloc_memento = AllocationMemento::unchecked_cast(
-        Object(raw_clone.ptr() + object_size));
+        Object(raw_clone.ptr() + aligned_object_size));
     InitializeAllocationMemento(alloc_memento, *site);
   }
 
@@ -2716,6 +2730,10 @@ Handle<JSObject> Factory::NewJSObjectFromMap(
   InitializeJSObjectFromMap(js_obj, *empty_fixed_array(), *map);
 
   DCHECK(js_obj.HasFastElements() ||
+         (isolate()->bootstrapper()->IsActive() ||
+          *map == isolate()
+                      ->raw_native_context()
+                      .js_array_template_literal_object_map()) ||
          js_obj.HasTypedArrayOrRabGsabTypedArrayElements() ||
          js_obj.HasFastStringWrapperElements() ||
          js_obj.HasFastArgumentsElements() || js_obj.HasDictionaryElements() ||
@@ -2788,7 +2806,9 @@ Handle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements,
                                                 AllocationType allocation) {
   Handle<JSArray> array = NewJSArrayWithUnverifiedElements(
       elements, elements_kind, length, allocation);
+#ifdef ENABLE_SLOW_DCHECKS
   JSObject::ValidateElements(*array);
+#endif
   return array;
 }
 
@@ -2802,8 +2822,14 @@ Handle<JSArray> Factory::NewJSArrayWithUnverifiedElements(
     JSFunction array_function = native_context.array_function();
     map = array_function.initial_map();
   }
-  Handle<JSArray> array = Handle<JSArray>::cast(
-      NewJSObjectFromMap(handle(map, isolate()), allocation));
+  return NewJSArrayWithUnverifiedElements(handle(map, isolate()), elements,
+                                          length, allocation);
+}
+
+Handle<JSArray> Factory::NewJSArrayWithUnverifiedElements(
+    Handle<Map> map, Handle<FixedArrayBase> elements, int length,
+    AllocationType allocation) {
+  auto array = Handle<JSArray>::cast(NewJSObjectFromMap(map, allocation));
   DisallowGarbageCollection no_gc;
   JSArray raw = *array;
   raw.set_elements(*elements);
@@ -2811,6 +2837,23 @@ Handle<JSArray> Factory::NewJSArrayWithUnverifiedElements(
   return array;
 }
 
+Handle<JSArray> Factory::NewJSArrayForTemplateLiteralArray(
+    Handle<FixedArray> cooked_strings, Handle<FixedArray> raw_strings) {
+  Handle<JSArray> raw_object =
+      NewJSArrayWithElements(raw_strings, PACKED_ELEMENTS,
+                             raw_strings->length(), AllocationType::kOld);
+  JSObject::SetIntegrityLevel(raw_object, FROZEN, kThrowOnError).ToChecked();
+
+  Handle<NativeContext> native_context = isolate()->native_context();
+  Handle<JSArray> template_object = NewJSArrayWithUnverifiedElements(
+      handle(native_context->js_array_template_literal_object_map(), isolate()),
+      cooked_strings, cooked_strings->length(), AllocationType::kOld);
+  TemplateLiteralObject::SetRaw(template_object, raw_object);
+  DCHECK_EQ(template_object->map(),
+            native_context->js_array_template_literal_object_map());
+  return template_object;
+}
+
 void Factory::NewJSArrayStorage(Handle<JSArray> array, int length, int capacity,
                                 ArrayStorageAllocationMode mode) {
   DCHECK(capacity >= length);
@@ -3011,13 +3054,14 @@ MaybeHandle<JSArrayBuffer> Factory::NewJSArrayBufferAndBackingStore(
 
 Handle<JSArrayBuffer> Factory::NewJSSharedArrayBuffer(
     std::shared_ptr<BackingStore> backing_store) {
-  DCHECK_IMPLIES(backing_store->is_resizable(), v8_flags.harmony_rab_gsab);
+  DCHECK_IMPLIES(backing_store->is_resizable_by_js(),
+                 v8_flags.harmony_rab_gsab);
   Handle<Map> map(
       isolate()->native_context()->shared_array_buffer_fun().initial_map(),
       isolate());
   auto result = Handle<JSArrayBuffer>::cast(
       NewJSObjectFromMap(map, AllocationType::kYoung));
-  ResizableFlag resizable = backing_store->is_resizable()
+  ResizableFlag resizable = backing_store->is_resizable_by_js()
                                 ? ResizableFlag::kResizable
                                 : ResizableFlag::kNotResizable;
   result->Setup(SharedFlag::kShared, resizable, std::move(backing_store));
@@ -3133,7 +3177,8 @@ Handle<JSTypedArray> Factory::NewJSTypedArray(ExternalArrayType type,
   raw.set_length(length);
   raw.SetOffHeapDataPtr(isolate(), buffer->backing_store(), byte_offset);
   raw.set_is_length_tracking(false);
-  raw.set_is_backed_by_rab(!buffer->is_shared() && buffer->is_resizable());
+  raw.set_is_backed_by_rab(!buffer->is_shared() &&
+                           buffer->is_resizable_by_js());
   return typed_array;
 }
 
@@ -3148,7 +3193,8 @@ Handle<JSDataView> Factory::NewJSDataView(Handle<JSArrayBuffer> buffer,
       isolate(), static_cast<uint8_t*>(buffer->backing_store()) + byte_offset);
   // TODO(v8:11111): Support creating length tracking DataViews via the API.
   obj->set_is_length_tracking(false);
-  obj->set_is_backed_by_rab(!buffer->is_shared() && buffer->is_resizable());
+  obj->set_is_backed_by_rab(!buffer->is_shared() &&
+                            buffer->is_resizable_by_js());
   return obj;
 }
 
diff --git a/deps/v8/src/heap/factory.h b/deps/v8/src/heap/factory.h
index 75676b4624cbea..6c9cc2d4d8ed1e 100644
--- a/deps/v8/src/heap/factory.h
+++ b/deps/v8/src/heap/factory.h
@@ -606,6 +606,9 @@ class V8_EXPORT_PRIVATE Factory : public FactoryBase<Factory> {
       ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND,
       AllocationType allocation = AllocationType::kYoung);
 
+  Handle<JSArray> NewJSArrayForTemplateLiteralArray(
+      Handle<FixedArray> cooked_strings, Handle<FixedArray> raw_strings);
+
   void NewJSArrayStorage(
       Handle<JSArray> array, int length, int capacity,
       ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS);
@@ -1141,6 +1144,9 @@ class V8_EXPORT_PRIVATE Factory : public FactoryBase<Factory> {
   Handle<JSArray> NewJSArrayWithUnverifiedElements(
       Handle<FixedArrayBase> elements, ElementsKind elements_kind, int length,
       AllocationType allocation = AllocationType::kYoung);
+  Handle<JSArray> NewJSArrayWithUnverifiedElements(
+      Handle<Map> map, Handle<FixedArrayBase> elements, int length,
+      AllocationType allocation = AllocationType::kYoung);
 
   // Creates the backing storage for a JSArray. This handle must be discarded
   // before returning the JSArray reference to code outside Factory, which might
diff --git a/deps/v8/src/heap/gc-tracer-inl.h b/deps/v8/src/heap/gc-tracer-inl.h
index 9dc46c7431dab9..248c3490fb2ed8 100644
--- a/deps/v8/src/heap/gc-tracer-inl.h
+++ b/deps/v8/src/heap/gc-tracer-inl.h
@@ -121,6 +121,10 @@ bool GCTracer::IsInObservablePause() const {
   return 0.0 < start_of_observable_pause_;
 }
 
+bool GCTracer::IsInAtomicPause() const {
+  return current_.state == Event::State::ATOMIC;
+}
+
 bool GCTracer::IsConsistentWithCollector(GarbageCollector collector) const {
   return (collector == GarbageCollector::SCAVENGER &&
           current_.type == Event::SCAVENGER) ||
diff --git a/deps/v8/src/heap/gc-tracer.cc b/deps/v8/src/heap/gc-tracer.cc
index 47a97f91a118b0..b9dc605f5d0549 100644
--- a/deps/v8/src/heap/gc-tracer.cc
+++ b/deps/v8/src/heap/gc-tracer.cc
@@ -76,7 +76,7 @@ const char* GCTracer::Event::TypeName(bool short_name) const {
       return (short_name) ? "s" : "Scavenge";
     case MARK_COMPACTOR:
     case INCREMENTAL_MARK_COMPACTOR:
-      return (short_name) ? "ms" : "Mark-sweep";
+      return (short_name) ? "mc" : "Mark-Compact";
     case MINOR_MARK_COMPACTOR:
     case INCREMENTAL_MINOR_MARK_COMPACTOR:
       return (short_name) ? "mmc" : "Minor Mark-Compact";
@@ -223,14 +223,6 @@ void GCTracer::ResetForTesting() {
   }
 }
 
-void GCTracer::NotifyYoungGenerationHandling(
-    YoungGenerationHandling young_generation_handling) {
-  DCHECK_GE(1, start_counter_);
-  DCHECK_EQ(Event::SCAVENGER, current_.type);
-  heap_->isolate()->counters()->young_generation_handling()->AddSample(
-      static_cast<int>(young_generation_handling));
-}
-
 void GCTracer::StartObservablePause() {
   DCHECK_EQ(0, start_counter_);
   start_counter_++;
@@ -269,6 +261,8 @@ void GCTracer::StartCycle(GarbageCollector collector,
   DCHECK_IMPLIES(young_gc_while_full_gc_,
                  Heap::IsYoungGenerationCollector(collector) &&
                      !Event::IsYoungGenerationEvent(current_.type));
+  DCHECK_IMPLIES(collector != GarbageCollector::SCAVENGER,
+                 !young_gc_while_full_gc_);
 
   Event::Type type;
   switch (collector) {
@@ -468,6 +462,7 @@ void GCTracer::StopCycle(GarbageCollector collector) {
     // If a young generation GC interrupted an unfinished full GC cycle, restore
     // the event corresponding to the full GC cycle.
     if (young_gc_while_full_gc_) {
+      DCHECK_EQ(current_.type, Event::Type::SCAVENGER);
       std::swap(current_, previous_);
       young_gc_while_full_gc_ = false;
     }
@@ -517,7 +512,7 @@ void GCTracer::NotifySweepingCompleted() {
     DCHECK((current_.type == Event::MARK_COMPACTOR ||
             current_.type == Event::INCREMENTAL_MARK_COMPACTOR) &&
            (current_.state == Event::State::SWEEPING ||
-            (v8_flags.verify_heap && current_.state == Event::State::ATOMIC)));
+            current_.state == Event::State::ATOMIC));
   } else {
     DCHECK(IsSweepingInProgress());
   }
@@ -762,14 +757,14 @@ void GCTracer::PrintNVP() const {
           "holes_size_after=%zu "
           "allocated=%zu "
           "promoted=%zu "
-          "semi_space_copied=%zu "
+          "new_space_survived=%zu "
           "nodes_died_in_new=%d "
           "nodes_copied_in_new=%d "
           "nodes_promoted=%d "
           "promotion_ratio=%.1f%% "
           "average_survival_ratio=%.1f%% "
           "promotion_rate=%.1f%% "
-          "semi_space_copy_rate=%.1f%% "
+          "new_space_survive_rate_=%.1f%% "
           "new_space_allocation_throughput=%.1f "
           "unmapper_chunks=%d\n",
           duration, spent_in_mutator, current_.TypeName(true),
@@ -800,11 +795,11 @@ void GCTracer::PrintNVP() const {
           current_.end_object_size, current_.start_holes_size,
           current_.end_holes_size, allocated_since_last_gc,
           heap_->promoted_objects_size(),
-          heap_->semi_space_copied_object_size(),
+          heap_->new_space_surviving_object_size(),
           heap_->nodes_died_in_new_space_, heap_->nodes_copied_in_new_space_,
           heap_->nodes_promoted_, heap_->promotion_ratio_,
           AverageSurvivalRatio(), heap_->promotion_rate_,
-          heap_->semi_space_copied_rate_,
+          heap_->new_space_surviving_rate_,
           NewSpaceAllocationThroughputInBytesPerMillisecond(),
           heap_->memory_allocator()->unmapper()->NumberOfChunks());
       break;
@@ -817,46 +812,92 @@ void GCTracer::PrintNVP() const {
           "minor_mc=%.2f "
           "time_to_safepoint=%.2f "
           "mark=%.2f "
+          "mark.incremental_roots=%.2f "
+          "mark.finish_incremental=%.2f "
           "mark.seed=%.2f "
-          "mark.roots=%.2f "
-          "mark.weak=%.2f "
+          "mark.closure_parallel=%.2f "
+          "mark.closure=%.2f "
           "mark.global_handles=%.2f "
           "clear=%.2f "
           "clear.string_table=%.2f "
-          "clear.weak_lists=%.2f "
+          "complete.sweep_array_buffers=%.2f "
           "evacuate=%.2f "
+          "evacuate.clean_up=%.2f "
           "evacuate.copy=%.2f "
+          "evacuate.prologue=%.2f "
+          "evacuate.epilogue=%.2f "
+          "evacuate.rebalance=%.2f "
           "evacuate.update_pointers=%.2f "
           "evacuate.update_pointers.slots=%.2f "
+          "evacuate.update_pointers.weak=%.2f "
+          "sweep=%.2f "
+          "sweep.new=%.2f "
+          "sweep.new_lo=%.2f "
+          "finish=%.2f "
+          "finish.sweep_array_buffers=%.2f "
           "background.mark=%.2f "
+          "background.sweep=%.2f "
           "background.evacuate.copy=%.2f "
           "background.evacuate.update_pointers=%.2f "
           "background.unmapper=%.2f "
           "unmapper=%.2f "
-          "update_marking_deque=%.2f "
-          "reset_liveness=%.2f\n",
+          "total_size_before=%zu "
+          "total_size_after=%zu "
+          "holes_size_before=%zu "
+          "holes_size_after=%zu "
+          "allocated=%zu "
+          "promoted=%zu "
+          "new_space_survived=%zu "
+          "nodes_died_in_new=%d "
+          "nodes_copied_in_new=%d "
+          "nodes_promoted=%d "
+          "promotion_ratio=%.1f%% "
+          "average_survival_ratio=%.1f%% "
+          "promotion_rate=%.1f%% "
+          "new_space_survive_rate_=%.1f%% "
+          "new_space_allocation_throughput=%.1f\n",
           duration, spent_in_mutator, "mmc", current_.reduce_memory,
           current_scope(Scope::MINOR_MC),
           current_scope(Scope::TIME_TO_SAFEPOINT),
           current_scope(Scope::MINOR_MC_MARK),
-          current_scope(Scope::MINOR_MC_MARK_SEED),
           current_scope(Scope::MINOR_MC_MARK_ROOTS),
-          current_scope(Scope::MINOR_MC_MARK_WEAK),
+          current_scope(Scope::MINOR_MC_MARK_FINISH_INCREMENTAL),
+          current_scope(Scope::MINOR_MC_MARK_SEED),
+          current_scope(Scope::MINOR_MC_MARK_CLOSURE_PARALLEL),
+          current_scope(Scope::MINOR_MC_MARK_CLOSURE),
           current_scope(Scope::MINOR_MC_MARK_GLOBAL_HANDLES),
           current_scope(Scope::MINOR_MC_CLEAR),
           current_scope(Scope::MINOR_MC_CLEAR_STRING_TABLE),
-          current_scope(Scope::MINOR_MC_CLEAR_WEAK_LISTS),
+          current_scope(Scope::MINOR_MC_COMPLETE_SWEEP_ARRAY_BUFFERS),
           current_scope(Scope::MINOR_MC_EVACUATE),
+          current_scope(Scope::MINOR_MC_EVACUATE_CLEAN_UP),
           current_scope(Scope::MINOR_MC_EVACUATE_COPY),
+          current_scope(Scope::MINOR_MC_EVACUATE_PROLOGUE),
+          current_scope(Scope::MINOR_MC_EVACUATE_EPILOGUE),
+          current_scope(Scope::MINOR_MC_EVACUATE_REBALANCE),
           current_scope(Scope::MINOR_MC_EVACUATE_UPDATE_POINTERS),
           current_scope(Scope::MINOR_MC_EVACUATE_UPDATE_POINTERS_SLOTS),
+          current_scope(Scope::MINOR_MC_EVACUATE_UPDATE_POINTERS_WEAK),
+          current_scope(Scope::MINOR_MC_SWEEP),
+          current_scope(Scope::MINOR_MC_SWEEP_NEW),
+          current_scope(Scope::MINOR_MC_SWEEP_NEW_LO),
+          current_scope(Scope::MINOR_MC_FINISH),
+          current_scope(Scope::MINOR_MC_FINISH_SWEEP_ARRAY_BUFFERS),
           current_scope(Scope::MINOR_MC_BACKGROUND_MARKING),
+          current_scope(Scope::MINOR_MC_BACKGROUND_SWEEPING),
           current_scope(Scope::MINOR_MC_BACKGROUND_EVACUATE_COPY),
           current_scope(Scope::MINOR_MC_BACKGROUND_EVACUATE_UPDATE_POINTERS),
           current_scope(Scope::BACKGROUND_UNMAPPER),
-          current_scope(Scope::UNMAPPER),
-          current_scope(Scope::MINOR_MC_MARKING_DEQUE),
-          current_scope(Scope::MINOR_MC_RESET_LIVENESS));
+          current_scope(Scope::UNMAPPER), current_.start_object_size,
+          current_.end_object_size, current_.start_holes_size,
+          current_.end_holes_size, allocated_since_last_gc,
+          heap_->promoted_objects_size(),
+          heap_->new_space_surviving_object_size(),
+          heap_->nodes_died_in_new_space_, heap_->nodes_copied_in_new_space_,
+          heap_->nodes_promoted_, heap_->promotion_ratio_,
+          AverageSurvivalRatio(), heap_->promotion_rate_,
+          heap_->new_space_surviving_rate_,
+          NewSpaceAllocationThroughputInBytesPerMillisecond());
       break;
     case Event::MARK_COMPACTOR:
     case Event::INCREMENTAL_MARK_COMPACTOR:
@@ -912,6 +953,8 @@ void GCTracer::PrintNVP() const {
           "sweep=%.1f "
           "sweep.code=%.1f "
           "sweep.map=%.1f "
+          "sweep.new=%.1f "
+          "sweep.new_lo=%.1f "
           "sweep.old=%.1f "
           "incremental=%.1f "
           "incremental.finalize=%.1f "
@@ -939,14 +982,14 @@ void GCTracer::PrintNVP() const {
           "holes_size_after=%zu "
           "allocated=%zu "
           "promoted=%zu "
-          "semi_space_copied=%zu "
+          "new_space_survived=%zu "
           "nodes_died_in_new=%d "
           "nodes_copied_in_new=%d "
           "nodes_promoted=%d "
           "promotion_ratio=%.1f%% "
           "average_survival_ratio=%.1f%% "
           "promotion_rate=%.1f%% "
-          "semi_space_copy_rate=%.1f%% "
+          "new_space_survive_rate=%.1f%% "
           "new_space_allocation_throughput=%.1f "
           "unmapper_chunks=%d "
           "compaction_speed=%.f\n",
@@ -996,6 +1039,8 @@ void GCTracer::PrintNVP() const {
           current_scope(Scope::MC_PROLOGUE), current_scope(Scope::MC_SWEEP),
           current_scope(Scope::MC_SWEEP_CODE),
           current_scope(Scope::MC_SWEEP_MAP),
+          current_scope(Scope::MC_SWEEP_NEW),
+          current_scope(Scope::MC_SWEEP_NEW_LO),
           current_scope(Scope::MC_SWEEP_OLD),
           current_scope(Scope::MC_INCREMENTAL),
           current_scope(Scope::MC_INCREMENTAL_FINALIZE),
@@ -1021,11 +1066,11 @@ void GCTracer::PrintNVP() const {
           current_.end_object_size, current_.start_holes_size,
           current_.end_holes_size, allocated_since_last_gc,
           heap_->promoted_objects_size(),
-          heap_->semi_space_copied_object_size(),
+          heap_->new_space_surviving_object_size(),
           heap_->nodes_died_in_new_space_, heap_->nodes_copied_in_new_space_,
           heap_->nodes_promoted_, heap_->promotion_ratio_,
           AverageSurvivalRatio(), heap_->promotion_rate_,
-          heap_->semi_space_copied_rate_,
+          heap_->new_space_surviving_rate_,
           NewSpaceAllocationThroughputInBytesPerMillisecond(),
           heap_->memory_allocator()->unmapper()->NumberOfChunks(),
           CompactionSpeedInBytesPerMillisecond());
@@ -1320,29 +1365,6 @@ void GCTracer::RecordGCPhasesHistograms(RecordGCPhasesInfo::Mode mode) {
     heap_->isolate()->counters()->gc_marking_sum()->AddSample(
         static_cast<int>(overall_marking_time));
 
-    // Filter out samples where
-    // - we don't have high-resolution timers;
-    // - size of marked objects is very small;
-    // - marking time is rounded to 0;
-    constexpr size_t kMinObjectSizeForReportingThroughput = 1024 * 1024;
-    if (base::TimeTicks::IsHighResolution() &&
-        heap_->SizeOfObjects() > kMinObjectSizeForReportingThroughput &&
-        overall_marking_time > 0) {
-      const double overall_v8_marking_time =
-          overall_marking_time -
-          current_.scopes[Scope::MC_MARK_EMBEDDER_TRACING];
-      if (overall_v8_marking_time > 0) {
-        const int main_thread_marking_throughput_mb_per_s =
-            static_cast<int>(static_cast<double>(heap_->SizeOfObjects()) /
-                             overall_v8_marking_time * 1000 / 1024 / 1024);
-        heap_->isolate()
-            ->counters()
-            ->gc_main_thread_marking_throughput()
-            ->AddSample(
-                static_cast<int>(main_thread_marking_throughput_mb_per_s));
-      }
-    }
-
     DCHECK_EQ(Scope::LAST_TOP_MC_SCOPE, Scope::MC_SWEEP);
   } else if (mode == RecordGCPhasesInfo::Mode::Scavenger) {
     counters->gc_scavenger_scavenge_main()->AddSample(
diff --git a/deps/v8/src/heap/gc-tracer.h b/deps/v8/src/heap/gc-tracer.h
index 9be60cf7c5af58..586aa86bf1c739 100644
--- a/deps/v8/src/heap/gc-tracer.h
+++ b/deps/v8/src/heap/gc-tracer.h
@@ -11,7 +11,6 @@
 #include "src/base/optional.h"
 #include "src/base/ring-buffer.h"
 #include "src/common/globals.h"
-#include "src/heap/heap.h"
 #include "src/init/heap-symbols.h"
 #include "src/logging/counters.h"
 #include "testing/gtest/include/gtest/gtest_prod.h"  // nogncheck
@@ -120,8 +119,8 @@ class V8_EXPORT_PRIVATE GCTracer {
       MARK_COMPACTOR = 1,
       INCREMENTAL_MARK_COMPACTOR = 2,
       MINOR_MARK_COMPACTOR = 3,
-      START = 4,
-      INCREMENTAL_MINOR_MARK_COMPACTOR = 5,
+      INCREMENTAL_MINOR_MARK_COMPACTOR = 4,
+      START = 5,
     };
 
     // Returns true if the event corresponds to a young generation GC.
@@ -270,11 +269,9 @@ class V8_EXPORT_PRIVATE GCTracer {
   void NotifyYoungCppGCRunning();
   void NotifyYoungCppGCCompleted();
 
-  void NotifyYoungGenerationHandling(
-      YoungGenerationHandling young_generation_handling);
-
 #ifdef DEBUG
   V8_INLINE bool IsInObservablePause() const;
+  V8_INLINE bool IsInAtomicPause() const;
 
   // Checks if the current event is consistent with a collector.
   V8_INLINE bool IsConsistentWithCollector(GarbageCollector collector) const;
@@ -402,6 +399,10 @@ class V8_EXPORT_PRIVATE GCTracer {
   V8_INLINE WorkerThreadRuntimeCallStats* worker_thread_runtime_call_stats();
 #endif  // defined(V8_RUNTIME_CALL_STATS)
 
+  bool IsCurrentGCDueToAllocationFailure() const {
+    return current_.gc_reason == GarbageCollectionReason::kAllocationFailure;
+  }
+
  private:
   FRIEND_TEST(GCTracer, AverageSpeed);
   FRIEND_TEST(GCTracerTest, AllocationThroughput);
diff --git a/deps/v8/src/heap/global-handle-marking-visitor.cc b/deps/v8/src/heap/global-handle-marking-visitor.cc
index fc0d669fce9aad..b466051380ec16 100644
--- a/deps/v8/src/heap/global-handle-marking-visitor.cc
+++ b/deps/v8/src/heap/global-handle-marking-visitor.cc
@@ -4,16 +4,16 @@
 
 #include "src/heap/global-handle-marking-visitor.h"
 
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/marking-worklist-inl.h"
 
 namespace v8 {
 namespace internal {
 
 GlobalHandleMarkingVisitor::GlobalHandleMarkingVisitor(
-    Heap& heap, MarkingState& marking_state,
-    MarkingWorklists::Local& local_marking_worklist)
+    Heap& heap, MarkingWorklists::Local& local_marking_worklist)
     : heap_(heap),
-      marking_state_(marking_state),
+      marking_state_(*heap_.marking_state()),
       local_marking_worklist_(local_marking_worklist),
       traced_node_bounds_(
           heap.isolate()->global_handles()->GetTracedNodeBounds()) {}
diff --git a/deps/v8/src/heap/global-handle-marking-visitor.h b/deps/v8/src/heap/global-handle-marking-visitor.h
index 1b2fbd9cbb862e..71e805810e9414 100644
--- a/deps/v8/src/heap/global-handle-marking-visitor.h
+++ b/deps/v8/src/heap/global-handle-marking-visitor.h
@@ -18,7 +18,7 @@ namespace internal {
 // which requires them to be kept alive.
 class GlobalHandleMarkingVisitor final : public ::heap::base::StackVisitor {
  public:
-  GlobalHandleMarkingVisitor(Heap&, MarkingState&, MarkingWorklists::Local&);
+  GlobalHandleMarkingVisitor(Heap&, MarkingWorklists::Local&);
   ~GlobalHandleMarkingVisitor() override = default;
 
   void VisitPointer(const void*) override;
diff --git a/deps/v8/src/heap/heap-allocator-inl.h b/deps/v8/src/heap/heap-allocator-inl.h
index 0abf92fb107219..06783b5ac699ec 100644
--- a/deps/v8/src/heap/heap-allocator-inl.h
+++ b/deps/v8/src/heap/heap-allocator-inl.h
@@ -225,6 +225,7 @@ V8_WARN_UNUSED_RESULT V8_INLINE HeapObject HeapAllocator::AllocateRawWith(
     AllocationAlignment alignment) {
   AllocationResult result;
   HeapObject object;
+  size = ALIGN_TO_ALLOCATION_ALIGNMENT(size);
   if (allocation == AllocationType::kYoung) {
     result = AllocateRaw<AllocationType::kYoung>(size, origin, alignment);
     if (result.To(&object)) {
diff --git a/deps/v8/src/heap/heap-allocator.cc b/deps/v8/src/heap/heap-allocator.cc
index c78098ef289695..8824d45bccd577 100644
--- a/deps/v8/src/heap/heap-allocator.cc
+++ b/deps/v8/src/heap/heap-allocator.cc
@@ -27,11 +27,11 @@ void HeapAllocator::Setup() {
                         ? static_cast<PagedSpace*>(spaces_[MAP_SPACE])
                         : static_cast<PagedSpace*>(spaces_[OLD_SPACE]);
 
-  shared_old_allocator_ = heap_->shared_old_allocator_.get();
+  shared_old_allocator_ = heap_->shared_space_allocator_.get();
   shared_map_allocator_ = heap_->shared_map_allocator_
                               ? heap_->shared_map_allocator_.get()
                               : shared_old_allocator_;
-  shared_lo_space_ = heap_->shared_lo_space();
+  shared_lo_space_ = heap_->shared_lo_allocation_space();
 }
 
 void HeapAllocator::SetReadOnlySpace(ReadOnlySpace* read_only_space) {
@@ -90,7 +90,8 @@ AllocationResult HeapAllocator::AllocateRawWithLightRetrySlowPath(
   // Two GCs before returning failure.
   for (int i = 0; i < 2; i++) {
     if (IsSharedAllocationType(allocation)) {
-      heap_->CollectSharedGarbage(GarbageCollectionReason::kAllocationFailure);
+      heap_->CollectGarbageShared(heap_->main_thread_local_heap(),
+                                  GarbageCollectionReason::kAllocationFailure);
     } else {
       AllocationSpace space_to_gc = AllocationTypeToGCSpace(allocation);
       if (v8_flags.minor_mc && i > 0) {
@@ -117,12 +118,13 @@ AllocationResult HeapAllocator::AllocateRawWithRetryOrFailSlowPath(
   if (!result.IsFailure()) return result;
 
   if (IsSharedAllocationType(allocation)) {
-    heap_->CollectSharedGarbage(GarbageCollectionReason::kLastResort);
+    heap_->CollectGarbageShared(heap_->main_thread_local_heap(),
+                                GarbageCollectionReason::kLastResort);
 
     // We need always_allocate() to be true both on the client- and
     // server-isolate. It is used in both code paths.
     AlwaysAllocateScope shared_scope(
-        heap_->isolate()->shared_isolate()->heap());
+        heap_->isolate()->shared_heap_isolate()->heap());
     AlwaysAllocateScope client_scope(heap_);
     result = AllocateRaw(size, allocation, origin, alignment);
   } else {
diff --git a/deps/v8/src/heap/heap-inl.h b/deps/v8/src/heap/heap-inl.h
index 6991a6dca52b49..64c075f269588d 100644
--- a/deps/v8/src/heap/heap-inl.h
+++ b/deps/v8/src/heap/heap-inl.h
@@ -14,7 +14,6 @@
 #include "src/base/atomicops.h"
 #include "src/base/platform/mutex.h"
 #include "src/base/platform/platform.h"
-#include "src/base/sanitizer/msan.h"
 #include "src/common/assert-scope.h"
 #include "src/common/code-memory-access-inl.h"
 #include "src/execution/isolate-data.h"
@@ -26,6 +25,7 @@
 #include "src/heap/heap-write-barrier.h"
 #include "src/heap/heap.h"
 #include "src/heap/large-spaces.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/memory-allocator.h"
 #include "src/heap/memory-chunk-layout.h"
 #include "src/heap/memory-chunk.h"
@@ -99,16 +99,15 @@ base::EnumSet<CodeFlushMode> Heap::GetCodeFlushMode(Isolate* isolate) {
 
 Isolate* Heap::isolate() const { return Isolate::FromHeap(this); }
 
-#ifdef DEBUG
 bool Heap::IsMainThread() const {
   return isolate()->thread_id() == ThreadId::Current();
 }
 
 bool Heap::IsSharedMainThread() const {
-  Isolate* shared_isolate = isolate()->shared_isolate();
-  return shared_isolate && shared_isolate->thread_id() == ThreadId::Current();
+  if (!isolate()->has_shared_heap()) return false;
+  Isolate* shared_heap_isolate = isolate()->shared_heap_isolate();
+  return shared_heap_isolate->thread_id() == ThreadId::Current();
 }
-#endif
 
 int64_t Heap::external_memory() { return external_memory_.total(); }
 
@@ -123,7 +122,7 @@ PagedSpace* Heap::space_for_maps() {
 
 ConcurrentAllocator* Heap::concurrent_allocator_for_maps() {
   return V8_LIKELY(shared_map_allocator_) ? shared_map_allocator_.get()
-                                          : shared_old_allocator_.get();
+                                          : shared_space_allocator_.get();
 }
 
 RootsTable& Heap::roots_table() { return isolate()->roots_table(); }
@@ -171,11 +170,12 @@ void Heap::SetPendingOptimizeForTestBytecode(Object hash_table) {
 }
 
 PagedSpace* Heap::paged_space(int idx) {
-  DCHECK(idx == OLD_SPACE || idx == CODE_SPACE || idx == MAP_SPACE);
-  return static_cast<PagedSpace*>(space_[idx]);
+  DCHECK(idx == OLD_SPACE || idx == CODE_SPACE || idx == MAP_SPACE ||
+         idx == SHARED_SPACE);
+  return static_cast<PagedSpace*>(space_[idx].get());
 }
 
-Space* Heap::space(int idx) { return space_[idx]; }
+Space* Heap::space(int idx) { return space_[idx].get(); }
 
 Address* Heap::NewSpaceAllocationTopAddress() {
   return new_space_ ? new_space_->allocation_top_address() : nullptr;
@@ -353,93 +353,6 @@ void Heap::CopyBlock(Address dst, Address src, int byte_size) {
   CopyTagged(dst, src, static_cast<size_t>(byte_size / kTaggedSize));
 }
 
-template <Heap::FindMementoMode mode>
-AllocationMemento Heap::FindAllocationMemento(Map map, HeapObject object) {
-  Address object_address = object.address();
-  Address memento_address = object_address + object.SizeFromMap(map);
-  Address last_memento_word_address = memento_address + kTaggedSize;
-  // If the memento would be on another page, bail out immediately.
-  if (!Page::OnSamePage(object_address, last_memento_word_address)) {
-    return AllocationMemento();
-  }
-  HeapObject candidate = HeapObject::FromAddress(memento_address);
-  ObjectSlot candidate_map_slot = candidate.map_slot();
-  // This fast check may peek at an uninitialized word. However, the slow check
-  // below (memento_address == top) ensures that this is safe. Mark the word as
-  // initialized to silence MemorySanitizer warnings.
-  MSAN_MEMORY_IS_INITIALIZED(candidate_map_slot.address(), kTaggedSize);
-  if (!candidate_map_slot.contains_map_value(
-          ReadOnlyRoots(this).allocation_memento_map().ptr())) {
-    return AllocationMemento();
-  }
-
-  // Bail out if the memento is below the age mark, which can happen when
-  // mementos survived because a page got moved within new space.
-  Page* object_page = Page::FromAddress(object_address);
-  if (object_page->IsFlagSet(Page::NEW_SPACE_BELOW_AGE_MARK)) {
-    Address age_mark =
-        reinterpret_cast<SemiSpace*>(object_page->owner())->age_mark();
-    if (!object_page->Contains(age_mark)) {
-      return AllocationMemento();
-    }
-    // Do an exact check in the case where the age mark is on the same page.
-    if (object_address < age_mark) {
-      return AllocationMemento();
-    }
-  }
-
-  AllocationMemento memento_candidate = AllocationMemento::cast(candidate);
-
-  // Depending on what the memento is used for, we might need to perform
-  // additional checks.
-  Address top;
-  switch (mode) {
-    case Heap::kForGC:
-      return memento_candidate;
-    case Heap::kForRuntime:
-      if (memento_candidate.is_null()) return AllocationMemento();
-      // Either the object is the last object in the new space, or there is
-      // another object of at least word size (the header map word) following
-      // it, so suffices to compare ptr and top here.
-      top = NewSpaceTop();
-      DCHECK(memento_address >= new_space()->limit() ||
-             memento_address + AllocationMemento::kSize <= top);
-      if ((memento_address != top) && memento_candidate.IsValid()) {
-        return memento_candidate;
-      }
-      return AllocationMemento();
-    default:
-      UNREACHABLE();
-  }
-  UNREACHABLE();
-}
-
-void Heap::UpdateAllocationSite(Map map, HeapObject object,
-                                PretenuringFeedbackMap* pretenuring_feedback) {
-  DCHECK_NE(pretenuring_feedback, &global_pretenuring_feedback_);
-#ifdef DEBUG
-  BasicMemoryChunk* chunk = BasicMemoryChunk::FromHeapObject(object);
-  DCHECK_IMPLIES(chunk->IsToPage(),
-                 v8_flags.minor_mc ||
-                     chunk->IsFlagSet(MemoryChunk::PAGE_NEW_NEW_PROMOTION));
-  DCHECK_IMPLIES(!chunk->InYoungGeneration(),
-                 chunk->IsFlagSet(MemoryChunk::PAGE_NEW_OLD_PROMOTION));
-#endif
-  if (!v8_flags.allocation_site_pretenuring ||
-      !AllocationSite::CanTrack(map.instance_type())) {
-    return;
-  }
-  AllocationMemento memento_candidate =
-      FindAllocationMemento<kForGC>(map, object);
-  if (memento_candidate.is_null()) return;
-
-  // Entering cached feedback is used in the parallel case. We are not allowed
-  // to dereference the allocation site and rather have to postpone all checks
-  // till actually merging the data.
-  Address key = memento_candidate.GetAllocationSiteUnchecked();
-  (*pretenuring_feedback)[AllocationSite::unchecked_cast(Object(key))]++;
-}
-
 bool Heap::IsPendingAllocationInternal(HeapObject object) {
   DCHECK(deserialization_complete());
 
@@ -485,6 +398,8 @@ bool Heap::IsPendingAllocationInternal(HeapObject object) {
       return addr == large_space->pending_object();
     }
 
+    case SHARED_SPACE:
+    case SHARED_LO_SPACE:
     case RO_SPACE:
       UNREACHABLE();
   }
diff --git a/deps/v8/src/heap/heap-verifier.cc b/deps/v8/src/heap/heap-verifier.cc
index 28061588c4a558..2c4e3fa8708d63 100644
--- a/deps/v8/src/heap/heap-verifier.cc
+++ b/deps/v8/src/heap/heap-verifier.cc
@@ -200,7 +200,6 @@ class SlotVerifyingVisitor : public ObjectVisitorWithCageBases {
     if (ShouldHaveBeenRecorded(host, MaybeObject::FromObject(target))) {
       CHECK(InTypedSet(SlotType::kEmbeddedObjectFull, rinfo->pc()) ||
             InTypedSet(SlotType::kEmbeddedObjectCompressed, rinfo->pc()) ||
-            InTypedSet(SlotType::kEmbeddedObjectData, rinfo->pc()) ||
             (rinfo->IsInConstantPool() &&
              InTypedSet(SlotType::kConstPoolEmbeddedObjectCompressed,
                         rinfo->constant_pool_entry_address())) ||
diff --git a/deps/v8/src/heap/heap-write-barrier-inl.h b/deps/v8/src/heap/heap-write-barrier-inl.h
index 5423eaaadbdfe6..e56924cb9ce790 100644
--- a/deps/v8/src/heap/heap-write-barrier-inl.h
+++ b/deps/v8/src/heap/heap-write-barrier-inl.h
@@ -115,7 +115,7 @@ inline void CombinedWriteBarrierInternal(HeapObject host, HeapObjectSlot slot,
   }
 
   // Marking barrier: mark value & record slots when marking is on.
-  if (is_marking) {
+  if (V8_UNLIKELY(is_marking)) {
 #ifdef V8_EXTERNAL_CODE_SPACE
     // CodePageHeaderModificationScope is not required because the only case
     // when a Code value is stored somewhere is during creation of a new Code
@@ -259,7 +259,7 @@ base::Optional<Heap*> WriteBarrier::GetHeapIfMarking(HeapObject object) {
   if (V8_ENABLE_THIRD_PARTY_HEAP_BOOL) return {};
   heap_internals::MemoryChunk* chunk =
       heap_internals::MemoryChunk::FromHeapObject(object);
-  if (!chunk->IsMarking()) return {};
+  if (V8_LIKELY(!chunk->IsMarking())) return {};
   return chunk->GetHeap();
 }
 
diff --git a/deps/v8/src/heap/heap.cc b/deps/v8/src/heap/heap.cc
index d966d979c87c99..c607af988019ff 100644
--- a/deps/v8/src/heap/heap.cc
+++ b/deps/v8/src/heap/heap.cc
@@ -16,6 +16,7 @@
 #include "src/base/bits.h"
 #include "src/base/flags.h"
 #include "src/base/logging.h"
+#include "src/base/macros.h"
 #include "src/base/once.h"
 #include "src/base/platform/memory.h"
 #include "src/base/platform/mutex.h"
@@ -33,6 +34,7 @@
 #include "src/execution/microtask-queue.h"
 #include "src/execution/v8threads.h"
 #include "src/execution/vm-state-inl.h"
+#include "src/flags/flags.h"
 #include "src/handles/global-handles-inl.h"
 #include "src/heap/array-buffer-sweeper.h"
 #include "src/heap/base/stack.h"
@@ -46,6 +48,7 @@
 #include "src/heap/concurrent-marking.h"
 #include "src/heap/cppgc-js/cpp-heap.h"
 #include "src/heap/embedder-tracing.h"
+#include "src/heap/evacuation-verifier-inl.h"
 #include "src/heap/finalization-registry-cleanup-task.h"
 #include "src/heap/gc-idle-time-handler.h"
 #include "src/heap/gc-tracer-inl.h"
@@ -62,6 +65,8 @@
 #include "src/heap/mark-compact.h"
 #include "src/heap/marking-barrier-inl.h"
 #include "src/heap/marking-barrier.h"
+#include "src/heap/marking-state-inl.h"
+#include "src/heap/marking-state.h"
 #include "src/heap/memory-chunk-inl.h"
 #include "src/heap/memory-chunk-layout.h"
 #include "src/heap/memory-measurement.h"
@@ -72,6 +77,7 @@
 #include "src/heap/objects-visiting.h"
 #include "src/heap/paged-spaces-inl.h"
 #include "src/heap/parked-scope.h"
+#include "src/heap/pretenuring-handler.h"
 #include "src/heap/read-only-heap.h"
 #include "src/heap/remembered-set.h"
 #include "src/heap/safepoint.h"
@@ -199,7 +205,7 @@ class MinorMCTaskObserver final : public AllocationObserver {
       : AllocationObserver(step_size), heap_(heap) {}
 
   void Step(int bytes_allocated, Address, size_t) override {
-    if (v8_flags.concurrent_minor_mc) {
+    if (v8_flags.concurrent_minor_mc_marking) {
       if (heap_->incremental_marking()->IsMinorMarking()) {
         heap_->concurrent_marking()->RescheduleJobIfNeeded(
             GarbageCollector::MINOR_MARK_COMPACTOR);
@@ -217,13 +223,16 @@ Heap::Heap()
     : isolate_(isolate()),
       heap_allocator_(this),
       memory_pressure_level_(MemoryPressureLevel::kNone),
-      global_pretenuring_feedback_(kInitialFeedbackCapacity),
       safepoint_(std::make_unique<IsolateSafepoint>(this)),
       external_string_table_(this),
       allocation_type_for_in_place_internalizable_strings_(
           isolate()->OwnsStringTables() ? AllocationType::kOld
                                         : AllocationType::kSharedOld),
-      collection_barrier_(new CollectionBarrier(this)) {
+      collection_barrier_(new CollectionBarrier(this)),
+      marking_state_(isolate_),
+      non_atomic_marking_state_(isolate_),
+      atomic_marking_state_(isolate_),
+      pretenuring_handler_(this) {
   // Ensure old_generation_size_ is a multiple of kPageSize.
   DCHECK_EQ(0, max_old_generation_size() & (Page::kPageSize - 1));
 
@@ -1066,8 +1075,8 @@ void Heap::GarbageCollectionPrologue(
 
   // Reset GC statistics.
   promoted_objects_size_ = 0;
-  previous_semi_space_copied_object_size_ = semi_space_copied_object_size_;
-  semi_space_copied_object_size_ = 0;
+  previous_new_space_surviving_object_size_ = new_space_surviving_object_size_;
+  new_space_surviving_object_size_ = 0;
   nodes_died_in_new_space_ = 0;
   nodes_copied_in_new_space_ = 0;
   nodes_promoted_ = 0;
@@ -1082,9 +1091,9 @@ void Heap::GarbageCollectionPrologue(
 #endif  // DEBUG
 
   if (new_space_ && new_space_->IsAtMaximumCapacity()) {
-    maximum_size_scavenges_++;
+    maximum_size_minor_gcs_++;
   } else {
-    maximum_size_scavenges_ = 0;
+    maximum_size_minor_gcs_ = 0;
   }
   memory_allocator()->unmapper()->PrepareForGC();
 }
@@ -1126,31 +1135,6 @@ size_t Heap::UsedGlobalHandlesSize() {
   return isolate_->global_handles()->UsedSize();
 }
 
-void Heap::MergeAllocationSitePretenuringFeedback(
-    const PretenuringFeedbackMap& local_pretenuring_feedback) {
-  PtrComprCageBase cage_base(isolate());
-  AllocationSite site;
-  for (auto& site_and_count : local_pretenuring_feedback) {
-    site = site_and_count.first;
-    MapWord map_word = site.map_word(cage_base, kRelaxedLoad);
-    if (map_word.IsForwardingAddress()) {
-      site = AllocationSite::cast(map_word.ToForwardingAddress());
-    }
-
-    // We have not validated the allocation site yet, since we have not
-    // dereferenced the site during collecting information.
-    // This is an inlined check of AllocationMemento::IsValid.
-    if (!site.IsAllocationSite() || site.IsZombie()) continue;
-
-    const int value = static_cast<int>(site_and_count.second);
-    DCHECK_LT(0, value);
-    if (site.IncrementMementoFoundCount(value)) {
-      // For sites in the global map the count is accessed through the site.
-      global_pretenuring_feedback_.insert(std::make_pair(site, 0));
-    }
-  }
-}
-
 void Heap::AddAllocationObserversToAllSpaces(
     AllocationObserver* observer, AllocationObserver* new_space_observer) {
   DCHECK(observer && new_space_observer);
@@ -1192,197 +1176,6 @@ void Heap::PublishPendingAllocations() {
   code_lo_space_->ResetPendingObject();
 }
 
-namespace {
-inline bool MakePretenureDecision(
-    AllocationSite site, AllocationSite::PretenureDecision current_decision,
-    double ratio, bool maximum_size_scavenge) {
-  // Here we just allow state transitions from undecided or maybe tenure
-  // to don't tenure, maybe tenure, or tenure.
-  if ((current_decision == AllocationSite::kUndecided ||
-       current_decision == AllocationSite::kMaybeTenure)) {
-    if (ratio >= AllocationSite::kPretenureRatio) {
-      // We just transition into tenure state when the semi-space was at
-      // maximum capacity.
-      if (maximum_size_scavenge) {
-        site.set_deopt_dependent_code(true);
-        site.set_pretenure_decision(AllocationSite::kTenure);
-        // Currently we just need to deopt when we make a state transition to
-        // tenure.
-        return true;
-      }
-      site.set_pretenure_decision(AllocationSite::kMaybeTenure);
-    } else {
-      site.set_pretenure_decision(AllocationSite::kDontTenure);
-    }
-  }
-  return false;
-}
-
-// Clear feedback calculation fields until the next gc.
-inline void ResetPretenuringFeedback(AllocationSite site) {
-  site.set_memento_found_count(0);
-  site.set_memento_create_count(0);
-}
-
-inline bool DigestPretenuringFeedback(Isolate* isolate, AllocationSite site,
-                                      bool maximum_size_scavenge) {
-  bool deopt = false;
-  int create_count = site.memento_create_count();
-  int found_count = site.memento_found_count();
-  bool minimum_mementos_created =
-      create_count >= AllocationSite::kPretenureMinimumCreated;
-  double ratio =
-      minimum_mementos_created || v8_flags.trace_pretenuring_statistics
-          ? static_cast<double>(found_count) / create_count
-          : 0.0;
-  AllocationSite::PretenureDecision current_decision =
-      site.pretenure_decision();
-
-  if (minimum_mementos_created) {
-    deopt = MakePretenureDecision(site, current_decision, ratio,
-                                  maximum_size_scavenge);
-  }
-
-  if (v8_flags.trace_pretenuring_statistics) {
-    PrintIsolate(isolate,
-                 "pretenuring: AllocationSite(%p): (created, found, ratio) "
-                 "(%d, %d, %f) %s => %s\n",
-                 reinterpret_cast<void*>(site.ptr()), create_count, found_count,
-                 ratio, site.PretenureDecisionName(current_decision),
-                 site.PretenureDecisionName(site.pretenure_decision()));
-  }
-
-  ResetPretenuringFeedback(site);
-  return deopt;
-}
-
-bool PretenureAllocationSiteManually(Isolate* isolate, AllocationSite site) {
-  AllocationSite::PretenureDecision current_decision =
-      site.pretenure_decision();
-  bool deopt = true;
-  if (current_decision == AllocationSite::kUndecided ||
-      current_decision == AllocationSite::kMaybeTenure) {
-    site.set_deopt_dependent_code(true);
-    site.set_pretenure_decision(AllocationSite::kTenure);
-  } else {
-    deopt = false;
-  }
-  if (v8_flags.trace_pretenuring_statistics) {
-    PrintIsolate(isolate,
-                 "pretenuring manually requested: AllocationSite(%p): "
-                 "%s => %s\n",
-                 reinterpret_cast<void*>(site.ptr()),
-                 site.PretenureDecisionName(current_decision),
-                 site.PretenureDecisionName(site.pretenure_decision()));
-  }
-
-  ResetPretenuringFeedback(site);
-  return deopt;
-}
-
-}  // namespace
-
-void Heap::RemoveAllocationSitePretenuringFeedback(AllocationSite site) {
-  global_pretenuring_feedback_.erase(site);
-}
-
-bool Heap::DeoptMaybeTenuredAllocationSites() {
-  return new_space_ && new_space_->IsAtMaximumCapacity() &&
-         maximum_size_scavenges_ == 0;
-}
-
-void Heap::ProcessPretenuringFeedback() {
-  bool trigger_deoptimization = false;
-  if (v8_flags.allocation_site_pretenuring) {
-    int tenure_decisions = 0;
-    int dont_tenure_decisions = 0;
-    int allocation_mementos_found = 0;
-    int allocation_sites = 0;
-    int active_allocation_sites = 0;
-
-    AllocationSite site;
-
-    // Step 1: Digest feedback for recorded allocation sites.
-    bool maximum_size_scavenge = MaximumSizeScavenge();
-    for (auto& site_and_count : global_pretenuring_feedback_) {
-      allocation_sites++;
-      site = site_and_count.first;
-      // Count is always access through the site.
-      DCHECK_EQ(0, site_and_count.second);
-      int found_count = site.memento_found_count();
-      // An entry in the storage does not imply that the count is > 0 because
-      // allocation sites might have been reset due to too many objects dying
-      // in old space.
-      if (found_count > 0) {
-        DCHECK(site.IsAllocationSite());
-        active_allocation_sites++;
-        allocation_mementos_found += found_count;
-        if (DigestPretenuringFeedback(isolate_, site, maximum_size_scavenge)) {
-          trigger_deoptimization = true;
-        }
-        if (site.GetAllocationType() == AllocationType::kOld) {
-          tenure_decisions++;
-        } else {
-          dont_tenure_decisions++;
-        }
-      }
-    }
-
-    // Step 2: Pretenure allocation sites for manual requests.
-    if (allocation_sites_to_pretenure_) {
-      while (!allocation_sites_to_pretenure_->empty()) {
-        auto pretenure_site = allocation_sites_to_pretenure_->Pop();
-        if (PretenureAllocationSiteManually(isolate_, pretenure_site)) {
-          trigger_deoptimization = true;
-        }
-      }
-      allocation_sites_to_pretenure_.reset();
-    }
-
-    // Step 3: Deopt maybe tenured allocation sites if necessary.
-    bool deopt_maybe_tenured = DeoptMaybeTenuredAllocationSites();
-    if (deopt_maybe_tenured) {
-      ForeachAllocationSite(
-          allocation_sites_list(),
-          [&allocation_sites, &trigger_deoptimization](AllocationSite site) {
-            DCHECK(site.IsAllocationSite());
-            allocation_sites++;
-            if (site.IsMaybeTenure()) {
-              site.set_deopt_dependent_code(true);
-              trigger_deoptimization = true;
-            }
-          });
-    }
-
-    if (trigger_deoptimization) {
-      isolate_->stack_guard()->RequestDeoptMarkedAllocationSites();
-    }
-
-    if (v8_flags.trace_pretenuring_statistics &&
-        (allocation_mementos_found > 0 || tenure_decisions > 0 ||
-         dont_tenure_decisions > 0)) {
-      PrintIsolate(isolate(),
-                   "pretenuring: deopt_maybe_tenured=%d visited_sites=%d "
-                   "active_sites=%d "
-                   "mementos=%d tenured=%d not_tenured=%d\n",
-                   deopt_maybe_tenured ? 1 : 0, allocation_sites,
-                   active_allocation_sites, allocation_mementos_found,
-                   tenure_decisions, dont_tenure_decisions);
-    }
-
-    global_pretenuring_feedback_.clear();
-    global_pretenuring_feedback_.reserve(kInitialFeedbackCapacity);
-  }
-}
-
-void Heap::PretenureAllocationSiteOnNextCollection(AllocationSite site) {
-  if (!allocation_sites_to_pretenure_) {
-    allocation_sites_to_pretenure_.reset(
-        new GlobalHandleVector<AllocationSite>(this));
-  }
-  allocation_sites_to_pretenure_->Push(site);
-}
-
 void Heap::InvalidateCodeDeoptimizationData(Code code) {
   CodePageMemoryModificationScope modification_scope(code);
   code.set_deoptimization_data(ReadOnlyRoots(this).empty_fixed_array());
@@ -1485,6 +1278,10 @@ void Heap::GarbageCollectionEpilogueInSafepoint(GarbageCollector collector) {
     TRACE_GC(tracer(), GCTracer::Scope::HEAP_EPILOGUE_REDUCE_NEW_SPACE);
     ReduceNewSpaceSize();
 
+    if (!v8_flags.minor_mc) {
+      SemiSpaceNewSpace::From(new_space())->MakeAllPagesInFromSpaceIterable();
+    }
+
 #ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
     new_space()->ClearUnusedObjectStartBitmaps();
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
@@ -1587,7 +1384,7 @@ size_t Heap::MinorMCTaskTriggerSize() const {
 }
 
 void Heap::StartMinorMCIncrementalMarkingIfNeeded() {
-  if (v8_flags.concurrent_minor_mc && !IsTearingDown() &&
+  if (v8_flags.concurrent_minor_mc_marking && !IsTearingDown() &&
       !incremental_marking()->IsMarking() &&
       incremental_marking()->CanBeStarted() && V8_LIKELY(!v8_flags.gc_global) &&
       (new_space()->Size() >= MinorMCTaskTriggerSize())) {
@@ -2035,16 +1832,26 @@ void Heap::StartIncrementalMarking(int gc_flags,
                                    GarbageCollector collector) {
   DCHECK(incremental_marking()->IsStopped());
 
-  // Sweeping needs to be completed such that markbits are all cleared before
-  // starting marking again.
-  CompleteSweepingFull();
+  if (IsYoungGenerationCollector(collector)) {
+    CompleteSweepingYoung(collector);
+  } else {
+    // Sweeping needs to be completed such that markbits are all cleared before
+    // starting marking again.
+    CompleteSweepingFull();
+  }
 
+  base::Optional<GlobalSafepointScope> global_safepoint_scope;
   base::Optional<SafepointScope> safepoint_scope;
 
   {
     AllowGarbageCollection allow_shared_gc;
     IgnoreLocalGCRequests ignore_gc_requests(this);
-    safepoint_scope.emplace(this);
+
+    if (isolate()->is_shared_heap_isolate()) {
+      global_safepoint_scope.emplace(isolate());
+    } else {
+      safepoint_scope.emplace(this);
+    }
   }
 
 #ifdef DEBUG
@@ -2062,11 +1869,13 @@ void Heap::StartIncrementalMarking(int gc_flags,
 }
 
 void Heap::CompleteSweepingFull() {
-  array_buffer_sweeper()->EnsureFinished();
-  mark_compact_collector()->EnsureSweepingCompleted(
-      MarkCompactCollector::SweepingForcedFinalizationMode::kUnifiedHeap);
+  {
+    TRACE_GC(tracer(), GCTracer::Scope::MC_COMPLETE_SWEEP_ARRAY_BUFFERS);
+    array_buffer_sweeper()->EnsureFinished();
+  }
+  EnsureSweepingCompleted(SweepingForcedFinalizationMode::kUnifiedHeap);
 
-  DCHECK(!mark_compact_collector()->sweeping_in_progress());
+  DCHECK(!sweeping_in_progress());
   DCHECK_IMPLIES(cpp_heap(),
                  !CppHeap::From(cpp_heap())->sweeper().IsSweepingInProgress());
   DCHECK(!tracer()->IsSweepingInProgress());
@@ -2078,7 +1887,7 @@ void Heap::StartIncrementalMarkingIfAllocationLimitIsReached(
     // Do not start incremental marking while invoking GC callbacks.
     // Heap::CollectGarbage already decided which GC is going to be invoked. In
     // case it chose a young-gen GC, starting an incremental full GC during
-    // callbacks would break the seperate GC phases guarantee.
+    // callbacks would break the separate GC phases guarantee.
     return;
   }
   if (incremental_marking()->IsStopped()) {
@@ -2230,12 +2039,26 @@ void Heap::CheckCollectionRequested() {
 
 #if V8_ENABLE_WEBASSEMBLY
 void Heap::EnsureWasmCanonicalRttsSize(int length) {
+  HandleScope scope(isolate());
+
   Handle<WeakArrayList> current_rtts = handle(wasm_canonical_rtts(), isolate_);
   if (length <= current_rtts->length()) return;
-  Handle<WeakArrayList> result = WeakArrayList::EnsureSpace(
+  Handle<WeakArrayList> new_rtts = WeakArrayList::EnsureSpace(
       isolate(), current_rtts, length, AllocationType::kOld);
-  result->set_length(length);
-  set_wasm_canonical_rtts(*result);
+  new_rtts->set_length(length);
+  set_wasm_canonical_rtts(*new_rtts);
+
+  // Wrappers are indexed by canonical rtt length, and an additional boolean
+  // storing whether the corresponding function is imported or not.
+  int required_wrapper_length = 2 * length;
+  Handle<WeakArrayList> current_wrappers =
+      handle(js_to_wasm_wrappers(), isolate_);
+  if (required_wrapper_length <= current_wrappers->length()) return;
+  Handle<WeakArrayList> new_wrappers =
+      WeakArrayList::EnsureSpace(isolate(), current_wrappers,
+                                 required_wrapper_length, AllocationType::kOld);
+  new_wrappers->set_length(required_wrapper_length);
+  set_js_to_wasm_wrappers(*new_wrappers);
 }
 #endif
 
@@ -2245,19 +2068,19 @@ void Heap::UpdateSurvivalStatistics(int start_new_space_size) {
   promotion_ratio_ = (static_cast<double>(promoted_objects_size_) /
                       static_cast<double>(start_new_space_size) * 100);
 
-  if (previous_semi_space_copied_object_size_ > 0) {
+  if (previous_new_space_surviving_object_size_ > 0) {
     promotion_rate_ =
         (static_cast<double>(promoted_objects_size_) /
-         static_cast<double>(previous_semi_space_copied_object_size_) * 100);
+         static_cast<double>(previous_new_space_surviving_object_size_) * 100);
   } else {
     promotion_rate_ = 0;
   }
 
-  semi_space_copied_rate_ =
-      (static_cast<double>(semi_space_copied_object_size_) /
+  new_space_surviving_rate_ =
+      (static_cast<double>(new_space_surviving_object_size_) /
        static_cast<double>(start_new_space_size) * 100);
 
-  double survival_rate = promotion_ratio_ + semi_space_copied_rate_;
+  double survival_rate = promotion_ratio_ + new_space_surviving_rate_;
   tracer()->AddSurvivalRatio(survival_rate);
 }
 
@@ -2319,18 +2142,31 @@ size_t Heap::PerformGarbageCollection(
   DCHECK(tracer()->IsConsistentWithCollector(collector));
   TRACE_GC_EPOCH(tracer(), CollectorScopeId(collector), ThreadKind::kMain);
 
-  base::Optional<SafepointScope> safepoint_scope;
+  base::Optional<GlobalSafepointScope> global_safepoint_scope;
+  base::Optional<SafepointScope> isolate_safepoint_scope;
 
   {
     AllowGarbageCollection allow_shared_gc;
     IgnoreLocalGCRequests ignore_gc_requests(this);
-    safepoint_scope.emplace(this);
+
+    if (isolate()->is_shared_heap_isolate()) {
+      global_safepoint_scope.emplace(isolate());
+    } else {
+      isolate_safepoint_scope.emplace(this);
+    }
   }
 
   collection_barrier_->StopTimeToCollectionTimer();
 
   HeapVerifier::VerifyHeapIfEnabled(this);
 
+  if (isolate()->is_shared_heap_isolate()) {
+    isolate()->global_safepoint()->IterateClientIsolates([](Isolate* client) {
+      if (client->is_shared_heap_isolate()) return;
+      HeapVerifier::VerifyHeapIfEnabled(client->heap());
+    });
+  }
+
   tracer()->StartInSafepoint();
 
   GarbageCollectionPrologueInSafepoint();
@@ -2349,7 +2185,7 @@ size_t Heap::PerformGarbageCollection(
     Scavenge();
   }
 
-  ProcessPretenuringFeedback();
+  pretenuring_handler_.ProcessPretenuringFeedback();
 
   UpdateSurvivalStatistics(static_cast<int>(start_young_generation_size));
   ConfigureInitialOldGenerationSize();
@@ -2395,8 +2231,9 @@ size_t Heap::PerformGarbageCollection(
   if (cpp_heap() && IsYoungGenerationCollector(collector)) {
     const bool with_stack = (gc_reason != GarbageCollectionReason::kTask);
     CppHeap::From(cpp_heap())
-        ->RunMinorGC(with_stack ? CppHeap::StackState::kMayContainHeapPointers
-                                : CppHeap::StackState::kNoHeapPointers);
+        ->RunMinorGCIfNeeded(with_stack
+                                 ? CppHeap::StackState::kMayContainHeapPointers
+                                 : CppHeap::StackState::kNoHeapPointers);
   }
 #endif  // defined(CPPGC_YOUNG_GENERATION)
 
@@ -2408,16 +2245,59 @@ size_t Heap::PerformGarbageCollection(
 
   HeapVerifier::VerifyHeapIfEnabled(this);
 
+  if (isolate()->is_shared_heap_isolate()) {
+    isolate()->global_safepoint()->IterateClientIsolates([](Isolate* client) {
+      if (client->is_shared_heap_isolate()) return;
+      HeapVerifier::VerifyHeapIfEnabled(client->heap());
+    });
+  }
+
   return freed_global_handles;
 }
 
-void Heap::CollectSharedGarbage(GarbageCollectionReason gc_reason) {
+bool Heap::CollectGarbageShared(LocalHeap* local_heap,
+                                GarbageCollectionReason gc_reason) {
   CHECK(deserialization_complete());
-  DCHECK(!IsShared());
-  DCHECK_NOT_NULL(isolate()->shared_isolate());
+  DCHECK(isolate()->has_shared_heap());
+
+  if (v8_flags.shared_space) {
+    Isolate* shared_space_isolate = isolate()->shared_space_isolate();
+    return shared_space_isolate->heap()->CollectGarbageFromAnyThread(local_heap,
+                                                                     gc_reason);
+
+  } else {
+    DCHECK(!IsShared());
+    DCHECK_NOT_NULL(isolate()->shared_isolate());
+
+    isolate()->shared_isolate()->heap()->PerformSharedGarbageCollection(
+        isolate(), gc_reason);
+    return true;
+  }
+}
+
+bool Heap::CollectGarbageFromAnyThread(LocalHeap* local_heap,
+                                       GarbageCollectionReason gc_reason) {
+  DCHECK(local_heap->IsRunning());
+
+  if (isolate() == local_heap->heap()->isolate() &&
+      local_heap->is_main_thread()) {
+    CollectAllGarbage(current_gc_flags_, gc_reason, current_gc_callback_flags_);
+    return true;
+  } else {
+    if (!collection_barrier_->TryRequestGC()) return false;
+
+    const LocalHeap::ThreadState old_state =
+        main_thread_local_heap()->state_.SetCollectionRequested();
 
-  isolate()->shared_isolate()->heap()->PerformSharedGarbageCollection(
-      isolate(), gc_reason);
+    if (old_state.IsRunning()) {
+      const bool performed_gc =
+          collection_barrier_->AwaitCollectionBackground(local_heap);
+      return performed_gc;
+    } else {
+      DCHECK(old_state.IsParked());
+      return false;
+    }
+  }
 }
 
 void Heap::PerformSharedGarbageCollection(Isolate* initiator,
@@ -2486,19 +2366,29 @@ void Heap::CompleteSweepingYoung(GarbageCollector collector) {
     array_buffer_sweeper()->EnsureFinished();
   }
 
-  // If sweeping is in progress and there are no sweeper tasks running, finish
-  // the sweeping here, to avoid having to pause and resume during the young
-  // generation GC.
-  mark_compact_collector()->FinishSweepingIfOutOfWork();
+  if (v8_flags.minor_mc) {
+    DCHECK(v8_flags.separate_gc_phases);
+    // Do not interleave sweeping.
+    EnsureSweepingCompleted(SweepingForcedFinalizationMode::kV8Only);
+  } else {
+    // If sweeping is in progress and there are no sweeper tasks running, finish
+    // the sweeping here, to avoid having to pause and resume during the young
+    // generation GC.
+    FinishSweepingIfOutOfWork();
+  }
 
 #if defined(CPPGC_YOUNG_GENERATION)
   // Always complete sweeping if young generation is enabled.
-  if (cpp_heap()) CppHeap::From(cpp_heap())->FinishSweepingIfRunning();
+  if (cpp_heap()) {
+    if (auto* iheap = CppHeap::From(cpp_heap());
+        iheap->generational_gc_supported())
+      iheap->FinishSweepingIfRunning();
+  }
 #endif  // defined(CPPGC_YOUNG_GENERATION)
 }
 
-void Heap::EnsureSweepingCompleted(HeapObject object) {
-  if (!mark_compact_collector()->sweeping_in_progress()) return;
+void Heap::EnsureSweepingCompletedForObject(HeapObject object) {
+  if (!sweeping_in_progress()) return;
 
   BasicMemoryChunk* basic_chunk = BasicMemoryChunk::FromHeapObject(object);
   if (basic_chunk->InReadOnlySpace()) return;
@@ -2510,7 +2400,7 @@ void Heap::EnsureSweepingCompleted(HeapObject object) {
   DCHECK(!chunk->IsLargePage());
 
   Page* page = Page::cast(chunk);
-  mark_compact_collector()->EnsurePageIsSwept(page);
+  sweeper()->EnsurePageIsSwept(page);
 }
 
 void Heap::RecomputeLimits(GarbageCollector collector) {
@@ -2700,9 +2590,6 @@ void Heap::Scavenge() {
         "[IncrementalMarking] Scavenge during marking.\n");
   }
 
-  tracer()->NotifyYoungGenerationHandling(
-      YoungGenerationHandling::kRegularScavenge);
-
   TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SCAVENGE);
   base::MutexGuard guard(relocation_mutex());
   // Young generation garbage collection is orthogonal from full GC marking. It
@@ -3043,7 +2930,8 @@ void Heap::ResetAllAllocationSitesDependentCode(AllocationType allocation) {
                             site.ResetPretenureDecision();
                             site.set_deopt_dependent_code(true);
                             marked = true;
-                            RemoveAllocationSitePretenuringFeedback(site);
+                            pretenuring_handler_
+                                .RemoveAllocationSitePretenuringFeedback(site);
                             return;
                           }
                         });
@@ -3114,6 +3002,7 @@ static_assert(!USE_ALLOCATION_ALIGNMENT_BOOL ||
               (HeapNumber::kValueOffset & kDoubleAlignmentMask) == kTaggedSize);
 
 int Heap::GetMaximumFillToAlign(AllocationAlignment alignment) {
+  if (V8_COMPRESS_POINTERS_8GB_BOOL) return 0;
   switch (alignment) {
     case kTaggedAligned:
       return 0;
@@ -3127,10 +3016,12 @@ int Heap::GetMaximumFillToAlign(AllocationAlignment alignment) {
 
 // static
 int Heap::GetFillToAlign(Address address, AllocationAlignment alignment) {
+  if (V8_COMPRESS_POINTERS_8GB_BOOL) return 0;
   if (alignment == kDoubleAligned && (address & kDoubleAlignmentMask) != 0)
     return kTaggedSize;
-  if (alignment == kDoubleUnaligned && (address & kDoubleAlignmentMask) == 0)
+  if (alignment == kDoubleUnaligned && (address & kDoubleAlignmentMask) == 0) {
     return kDoubleSize - kTaggedSize;  // No fill if double is always aligned.
+  }
   return 0;
 }
 
@@ -3229,6 +3120,12 @@ namespace {
 void CreateFillerObjectAtImpl(Heap* heap, Address addr, int size,
                               ClearFreedMemoryMode clear_memory_mode) {
   if (size == 0) return;
+  DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                 IsAligned(addr, kObjectAlignment8GbHeap));
+  DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                 IsAligned(size, kObjectAlignment8GbHeap));
+  // TODO(v8:13070): Filler sizes are irrelevant for 8GB+ heaps. Adding them
+  // should be avoided in this mode.
   HeapObject filler = HeapObject::FromAddress(addr);
   ReadOnlyRoots roots(heap);
   if (size == kTaggedSize) {
@@ -3569,6 +3466,7 @@ void Heap::CreateFillerForArray(T object, int elements_to_trim,
   if (MayContainRecordedSlots(object)) {
     MemoryChunk* chunk = MemoryChunk::FromHeapObject(object);
     DCHECK(!chunk->RegisteredObjectWithInvalidatedSlots<OLD_TO_NEW>(object));
+    DCHECK(!chunk->RegisteredObjectWithInvalidatedSlots<OLD_TO_SHARED>(object));
     DCHECK(!chunk->RegisteredObjectWithInvalidatedSlots<OLD_TO_OLD>(object));
   }
 #endif
@@ -3587,9 +3485,9 @@ void Heap::CreateFillerForArray(T object, int elements_to_trim,
     // Clear the mark bits of the black area that belongs now to the filler.
     // This is an optimization. The sweeper will release black fillers anyway.
     if (incremental_marking()->black_allocation() &&
-        incremental_marking()->marking_state()->IsBlackOrGrey(filler)) {
+        marking_state()->IsBlackOrGrey(filler)) {
       Page* page = Page::FromAddress(new_end);
-      incremental_marking()->marking_state()->bitmap(page)->ClearRange(
+      marking_state()->bitmap(page)->ClearRange(
           page->AddressToMarkbitIndex(new_end),
           page->AddressToMarkbitIndex(new_end + bytes_to_trim));
     }
@@ -3613,8 +3511,7 @@ void Heap::CreateFillerForArray(T object, int elements_to_trim,
 }
 
 void Heap::MakeHeapIterable() {
-  mark_compact_collector()->EnsureSweepingCompleted(
-      MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  EnsureSweepingCompleted(SweepingForcedFinalizationMode::kV8Only);
 
   safepoint()->IterateLocalHeaps([](LocalHeap* local_heap) {
     local_heap->MakeLinearAllocationAreaIterable();
@@ -3626,6 +3523,9 @@ void Heap::MakeHeapIterable() {
     space->MakeLinearAllocationAreaIterable();
   }
 
+  if (v8_flags.shared_space && shared_space_allocator_) {
+    shared_space_allocator_->MakeLinearAllocationAreaIterable();
+  }
   if (new_space()) new_space()->MakeLinearAllocationAreaIterable();
 }
 
@@ -3633,17 +3533,26 @@ void Heap::FreeLinearAllocationAreas() {
   safepoint()->IterateLocalHeaps(
       [](LocalHeap* local_heap) { local_heap->FreeLinearAllocationArea(); });
 
+  if (isolate()->is_shared_space_isolate()) {
+    isolate()->global_safepoint()->IterateClientIsolates([](Isolate* client) {
+      client->heap()->FreeSharedLinearAllocationAreas();
+    });
+  }
+
   PagedSpaceIterator spaces(this);
   for (PagedSpace* space = spaces.Next(); space != nullptr;
        space = spaces.Next()) {
     space->FreeLinearAllocationArea();
   }
 
+  if (v8_flags.shared_space && shared_space_allocator_) {
+    shared_space_allocator_->FreeLinearAllocationArea();
+  }
   if (new_space()) new_space()->FreeLinearAllocationArea();
 }
 
 void Heap::FreeSharedLinearAllocationAreas() {
-  if (!isolate()->shared_isolate()) return;
+  if (!isolate()->has_shared_heap()) return;
   safepoint()->IterateLocalHeaps([](LocalHeap* local_heap) {
     local_heap->FreeSharedLinearAllocationArea();
   });
@@ -3651,12 +3560,34 @@ void Heap::FreeSharedLinearAllocationAreas() {
 }
 
 void Heap::FreeMainThreadSharedLinearAllocationAreas() {
-  if (!isolate()->shared_isolate()) return;
-  shared_old_allocator_->FreeLinearAllocationArea();
+  if (!isolate()->has_shared_heap()) return;
+  shared_space_allocator_->FreeLinearAllocationArea();
   if (shared_map_allocator_) shared_map_allocator_->FreeLinearAllocationArea();
   main_thread_local_heap()->FreeSharedLinearAllocationArea();
 }
 
+void Heap::MarkSharedLinearAllocationAreasBlack() {
+  DCHECK(v8_flags.shared_space);
+  if (shared_space_allocator_) {
+    shared_space_allocator_->MarkLinearAllocationAreaBlack();
+  }
+  safepoint()->IterateLocalHeaps([](LocalHeap* local_heap) {
+    local_heap->MarkSharedLinearAllocationAreaBlack();
+  });
+  main_thread_local_heap()->MarkSharedLinearAllocationAreaBlack();
+}
+
+void Heap::UnmarkSharedLinearAllocationAreas() {
+  DCHECK(v8_flags.shared_space);
+  if (shared_space_allocator_) {
+    shared_space_allocator_->UnmarkLinearAllocationArea();
+  }
+  safepoint()->IterateLocalHeaps([](LocalHeap* local_heap) {
+    local_heap->MarkSharedLinearAllocationAreaBlack();
+  });
+  main_thread_local_heap()->MarkSharedLinearAllocationAreaBlack();
+}
+
 namespace {
 
 double ComputeMutatorUtilizationImpl(double mutator_speed, double gc_speed) {
@@ -3789,19 +3720,25 @@ void Heap::ActivateMemoryReducerIfNeeded() {
   }
 }
 
-void Heap::ReduceNewSpaceSize() {
+bool Heap::ShouldReduceNewSpaceSize() const {
   static const size_t kLowAllocationThroughput = 1000;
+
+  if (v8_flags.predictable) return false;
+
   const double allocation_throughput =
-      tracer()->CurrentAllocationThroughputInBytesPerMillisecond();
+      tracer_->CurrentAllocationThroughputInBytesPerMillisecond();
 
-  if (v8_flags.predictable) return;
+  return ShouldReduceMemory() ||
+         ((allocation_throughput != 0) &&
+          (allocation_throughput < kLowAllocationThroughput));
+}
 
-  if (ShouldReduceMemory() ||
-      ((allocation_throughput != 0) &&
-       (allocation_throughput < kLowAllocationThroughput))) {
-    new_space_->Shrink();
-    new_lo_space_->SetCapacity(new_space_->Capacity());
-  }
+void Heap::ReduceNewSpaceSize() {
+  if (!ShouldReduceNewSpaceSize()) return;
+
+  // MinorMC shrinks new space as part of sweeping.
+  if (!v8_flags.minor_mc) new_space_->Shrink();
+  new_lo_space_->SetCapacity(new_space_->Capacity());
 }
 
 size_t Heap::NewSpaceSize() { return new_space() ? new_space()->Size() : 0; }
@@ -3874,22 +3811,46 @@ void Heap::NotifyObjectLayoutChange(
 #endif
 }
 
-void Heap::NotifyObjectSizeChange(HeapObject object, int old_size, int new_size,
-                                  ClearRecordedSlots clear_recorded_slots) {
+void Heap::NotifyObjectSizeChange(
+    HeapObject object, int old_size, int new_size,
+    ClearRecordedSlots clear_recorded_slots,
+    enum UpdateInvalidatedObjectSize update_invalidated_object_size) {
+  old_size = ALIGN_TO_ALLOCATION_ALIGNMENT(old_size);
+  new_size = ALIGN_TO_ALLOCATION_ALIGNMENT(new_size);
   DCHECK_LE(new_size, old_size);
   if (new_size == old_size) return;
 
-  UpdateInvalidatedObjectSize(object, new_size);
+  const bool is_main_thread = LocalHeap::Current() == nullptr;
 
-  const bool is_background = LocalHeap::Current() != nullptr;
-  DCHECK_IMPLIES(is_background,
+  DCHECK_IMPLIES(!is_main_thread,
                  clear_recorded_slots == ClearRecordedSlots::kNo);
+  DCHECK_IMPLIES(!is_main_thread, update_invalidated_object_size ==
+                                      UpdateInvalidatedObjectSize::kNo);
+
+  if (update_invalidated_object_size == UpdateInvalidatedObjectSize::kYes) {
+    UpdateInvalidatedObjectSize(object, new_size);
+  } else {
+    DCHECK_EQ(update_invalidated_object_size, UpdateInvalidatedObjectSize::kNo);
 
-  const VerifyNoSlotsRecorded verify_no_slots_recorded =
-      is_background ? VerifyNoSlotsRecorded::kNo : VerifyNoSlotsRecorded::kYes;
+#if DEBUG
+    if (is_main_thread) {
+      // When running on the main thread we can actually DCHECK that this object
+      // wasn't recorded in the invalidated_slots map yet.
+      MemoryChunk* chunk = MemoryChunk::FromHeapObject(object);
+      DCHECK(!chunk->RegisteredObjectWithInvalidatedSlots<OLD_TO_NEW>(object));
+      DCHECK(
+          !chunk->RegisteredObjectWithInvalidatedSlots<OLD_TO_SHARED>(object));
+      DCHECK_IMPLIES(
+          incremental_marking()->IsCompacting(),
+          !chunk->RegisteredObjectWithInvalidatedSlots<OLD_TO_OLD>(object));
+    }
+#endif
+  }
+
+  const auto verify_no_slots_recorded =
+      is_main_thread ? VerifyNoSlotsRecorded::kYes : VerifyNoSlotsRecorded::kNo;
 
-  const ClearFreedMemoryMode clear_memory_mode =
-      ClearFreedMemoryMode::kDontClearFreedMemory;
+  const auto clear_memory_mode = ClearFreedMemoryMode::kDontClearFreedMemory;
 
   const Address filler = object.address() + new_size;
   const int filler_size = old_size - new_size;
@@ -3900,7 +3861,12 @@ void Heap::NotifyObjectSizeChange(HeapObject object, int old_size, int new_size,
 void Heap::UpdateInvalidatedObjectSize(HeapObject object, int new_size) {
   if (!MayContainRecordedSlots(object)) return;
 
-  if (incremental_marking()->IsCompacting()) {
+  // Updating invalidated_slots is unsychronized and thus needs to happen on the
+  // main thread.
+  DCHECK_NULL(LocalHeap::Current());
+  DCHECK_EQ(isolate()->thread_id(), ThreadId::Current());
+
+  if (incremental_marking()->IsCompacting() || gc_state() == MARK_COMPACT) {
     MemoryChunk::FromHeapObject(object)
         ->UpdateInvalidatedObjectSize<OLD_TO_OLD>(object, new_size);
   }
@@ -4298,12 +4264,16 @@ bool Heap::Contains(HeapObject value) const {
   if (memory_allocator()->IsOutsideAllocatedSpace(value.address())) {
     return false;
   }
-  return HasBeenSetUp() &&
-         ((new_space_ && new_space_->Contains(value)) ||
-          old_space_->Contains(value) || code_space_->Contains(value) ||
-          (map_space_ && map_space_->Contains(value)) ||
-          lo_space_->Contains(value) || code_lo_space_->Contains(value) ||
-          (new_lo_space_ && new_lo_space_->Contains(value)));
+
+  if (!HasBeenSetUp()) return false;
+
+  return (new_space_ && new_space_->Contains(value)) ||
+         old_space_->Contains(value) || code_space_->Contains(value) ||
+         (map_space_ && map_space_->Contains(value)) ||
+         (shared_space_ && shared_space_->Contains(value)) ||
+         lo_space_->Contains(value) || code_lo_space_->Contains(value) ||
+         (new_lo_space_ && new_lo_space_->Contains(value)) ||
+         (shared_lo_space_ && shared_lo_space_->Contains(value));
 }
 
 bool Heap::ContainsCode(HeapObject value) const {
@@ -4319,9 +4289,14 @@ bool Heap::ContainsCode(HeapObject value) const {
 }
 
 bool Heap::SharedHeapContains(HeapObject value) const {
-  if (shared_old_space_)
-    return shared_old_space_->Contains(value) ||
-           (shared_map_space_ && shared_map_space_->Contains(value));
+  if (shared_allocation_space_) {
+    if (shared_allocation_space_->Contains(value)) return true;
+    if (shared_lo_allocation_space_->Contains(value)) return true;
+    if (shared_map_allocation_space_ &&
+        shared_map_allocation_space_->Contains(value))
+      return true;
+  }
+
   return false;
 }
 
@@ -4352,19 +4327,27 @@ bool Heap::InSpace(HeapObject value, AllocationSpace space) const {
     case MAP_SPACE:
       DCHECK(map_space_);
       return map_space_->Contains(value);
+    case SHARED_SPACE:
+      return shared_space_->Contains(value);
     case LO_SPACE:
       return lo_space_->Contains(value);
     case CODE_LO_SPACE:
       return code_lo_space_->Contains(value);
     case NEW_LO_SPACE:
       return new_lo_space_->Contains(value);
+    case SHARED_LO_SPACE:
+      return shared_lo_space_->Contains(value);
     case RO_SPACE:
       return ReadOnlyHeap::Contains(value);
   }
   UNREACHABLE();
 }
 
-bool Heap::IsShared() { return isolate()->is_shared(); }
+bool Heap::IsShared() const { return isolate()->is_shared(); }
+
+bool Heap::ShouldMarkSharedHeap() const {
+  return isolate()->is_shared() || isolate()->is_shared_space_isolate();
+}
 
 bool Heap::InSpaceSlow(Address addr, AllocationSpace space) const {
   if (memory_allocator()->IsOutsideAllocatedSpace(addr)) {
@@ -4382,12 +4365,16 @@ bool Heap::InSpaceSlow(Address addr, AllocationSpace space) const {
     case MAP_SPACE:
       DCHECK(map_space_);
       return map_space_->ContainsSlow(addr);
+    case SHARED_SPACE:
+      return shared_space_->ContainsSlow(addr);
     case LO_SPACE:
       return lo_space_->ContainsSlow(addr);
     case CODE_LO_SPACE:
       return code_lo_space_->ContainsSlow(addr);
     case NEW_LO_SPACE:
       return new_lo_space_->ContainsSlow(addr);
+    case SHARED_LO_SPACE:
+      return shared_lo_space_->ContainsSlow(addr);
     case RO_SPACE:
       return read_only_space_->ContainsSlow(addr);
   }
@@ -4400,9 +4387,11 @@ bool Heap::IsValidAllocationSpace(AllocationSpace space) {
     case OLD_SPACE:
     case CODE_SPACE:
     case MAP_SPACE:
+    case SHARED_SPACE:
     case LO_SPACE:
     case NEW_LO_SPACE:
     case CODE_LO_SPACE:
+    case SHARED_LO_SPACE:
     case RO_SPACE:
       return true;
     default:
@@ -4426,7 +4415,7 @@ void Heap::VerifyCountersBeforeConcurrentSweeping() {
     // We need to refine the counters on pages that are already swept and have
     // not been moved over to the actual space. Otherwise, the AccountingStats
     // are just an over approximation.
-    space->RefillFreeList(mark_compact_collector()->sweeper());
+    space->RefillFreeList();
     space->VerifyCountersBeforeConcurrentSweeping();
   }
 }
@@ -4689,13 +4678,15 @@ void Heap::IterateRoots(RootVisitor* v, base::EnumSet<SkipRoot> options) {
     SerializerDeserializer::IterateStartupObjectCache(isolate_, v);
     v->Synchronize(VisitorSynchronization::kStartupObjectCache);
 
-    // When shared_isolate() is null, isolate_ is either an unshared (instead of
-    // a client) Isolate or the shared Isolate. In both cases isolate_ owns its
-    // shared heap object cache and should iterate it.
+    // Iterate over shared heap object cache when the isolate owns this data
+    // structure. Isolates which own the shared heap object cache are:
+    //   * Shared isolate
+    //   * Shared space/main isolate
+    //   * All isolates which do not use the shared heap feature.
     //
-    // When shared_isolate() is not null, isolate_ is a client Isolate, does not
-    // own its shared heap object cache, and should not iterate it.
-    if (isolate_->shared_isolate() == nullptr) {
+    // However, worker/client isolates do not own the shared heap object cache
+    // and should not iterate it.
+    if (isolate_->is_shared_heap_isolate() || !isolate_->has_shared_heap()) {
       SerializerDeserializer::IterateSharedHeapObjectCache(isolate_, v);
       v->Synchronize(VisitorSynchronization::kSharedHeapObjectCache);
     }
@@ -4706,13 +4697,56 @@ void Heap::IterateRoots(RootVisitor* v, base::EnumSet<SkipRoot> options) {
   }
 }
 
+class ClientRootVisitor : public RootVisitor {
+ public:
+  explicit ClientRootVisitor(RootVisitor* actual_visitor)
+      : actual_visitor_(actual_visitor) {}
+
+  void VisitRootPointers(Root root, const char* description,
+                         FullObjectSlot start, FullObjectSlot end) final {
+    for (FullObjectSlot p = start; p < end; ++p) {
+      MaybeForwardSlot(root, description, p);
+    }
+  }
+
+  void VisitRootPointers(Root root, const char* description,
+                         OffHeapObjectSlot start, OffHeapObjectSlot end) final {
+    actual_visitor_->VisitRootPointers(root, description, start, end);
+  }
+
+  void VisitRunningCode(FullObjectSlot slot) final {
+#if DEBUG
+    HeapObject object = HeapObject::cast(*slot);
+    DCHECK(!object.InSharedWritableHeap());
+#endif
+  }
+
+  void Synchronize(VisitorSynchronization::SyncTag tag) final {
+    actual_visitor_->Synchronize(tag);
+  }
+
+ private:
+  void MaybeForwardSlot(Root root, const char* description,
+                        FullObjectSlot slot) {
+    Object object = *slot;
+    if (!object.IsHeapObject()) return;
+    HeapObject heap_object = HeapObject::cast(object);
+    if (heap_object.InSharedWritableHeap()) {
+      actual_visitor_->VisitRootPointer(root, description, slot);
+    }
+  }
+
+  RootVisitor* const actual_visitor_;
+};
+
 void Heap::IterateRootsIncludingClients(RootVisitor* v,
                                         base::EnumSet<SkipRoot> options) {
   IterateRoots(v, options);
 
-  if (isolate()->is_shared()) {
+  if (isolate()->is_shared_heap_isolate()) {
+    ClientRootVisitor client_root_visitor(v);
     isolate()->global_safepoint()->IterateClientIsolates(
-        [v, options](Isolate* client) {
+        [v = &client_root_visitor, options](Isolate* client) {
           client->heap()->IterateRoots(v, options);
         });
   }
@@ -4720,9 +4754,12 @@ void Heap::IterateRootsIncludingClients(RootVisitor* v,
 
 void Heap::IterateRootsFromStackIncludingClient(RootVisitor* v) {
   IterateStackRoots(v);
-  if (isolate()->is_shared()) {
+  if (isolate()->is_shared_heap_isolate()) {
+    ClientRootVisitor client_root_visitor(v);
     isolate()->global_safepoint()->IterateClientIsolates(
-        [v](Isolate* client) { client->heap()->IterateStackRoots(v); });
+        [v = &client_root_visitor](Isolate* client) {
+          client->heap()->IterateStackRoots(v);
+        });
   }
 }
 
@@ -4915,7 +4952,7 @@ void Heap::ConfigureHeap(const v8::ResourceConstraints& constraints) {
   DCHECK(kMaxRegularHeapObjectSize >=
          (JSArray::kHeaderSize +
           FixedArray::SizeFor(JSArray::kInitialMaxFastElementArray) +
-          AllocationMemento::kSize));
+          ALIGN_TO_ALLOCATION_ALIGNMENT(AllocationMemento::kSize)));
 
   code_range_size_ = constraints.code_range_size_in_bytes();
 
@@ -5344,6 +5381,8 @@ void Heap::SetUp(LocalHeap* main_thread_local_heap) {
   memory_allocator_.reset(
       new MemoryAllocator(isolate_, code_page_allocator, MaxReserved()));
 
+  sweeper_.reset(new Sweeper(this));
+
   mark_compact_collector_.reset(new MarkCompactCollector(this));
 
   scavenger_collector_.reset(new ScavengerCollector(this));
@@ -5359,10 +5398,6 @@ void Heap::SetUp(LocalHeap* main_thread_local_heap) {
     concurrent_marking_.reset(new ConcurrentMarking(this, nullptr));
   }
 
-  for (int i = FIRST_SPACE; i <= LAST_SPACE; i++) {
-    space_[i] = nullptr;
-  }
-
   // Set up layout tracing callback.
   if (V8_UNLIKELY(v8_flags.trace_gc_heap_layout)) {
     v8::GCType gc_type = kGCTypeMarkSweepCompact;
@@ -5381,7 +5416,7 @@ void Heap::SetUpFromReadOnlyHeap(ReadOnlyHeap* ro_heap) {
   DCHECK_NOT_NULL(ro_heap);
   DCHECK_IMPLIES(read_only_space_ != nullptr,
                  read_only_space_ == ro_heap->read_only_space());
-  space_[RO_SPACE] = nullptr;
+  DCHECK_NULL(space_[RO_SPACE].get());
   read_only_space_ = ro_heap->read_only_space();
   heap_allocator_.SetReadOnlySpace(read_only_space_);
 }
@@ -5424,24 +5459,50 @@ void Heap::SetUpSpaces(LinearAllocationArea& new_allocation_info,
   const bool has_young_gen = !v8_flags.single_generation && !IsShared();
   if (has_young_gen) {
     if (v8_flags.minor_mc) {
-      space_[NEW_SPACE] = new_space_ =
-          new PagedNewSpace(this, initial_semispace_size_, max_semi_space_size_,
-                            new_allocation_info);
+      space_[NEW_SPACE] = std::make_unique<PagedNewSpace>(
+          this, initial_semispace_size_, max_semi_space_size_,
+          new_allocation_info);
     } else {
-      space_[NEW_SPACE] = new_space_ =
-          new SemiSpaceNewSpace(this, initial_semispace_size_,
-                                max_semi_space_size_, new_allocation_info);
+      space_[NEW_SPACE] = std::make_unique<SemiSpaceNewSpace>(
+          this, initial_semispace_size_, max_semi_space_size_,
+          new_allocation_info);
     }
-    space_[NEW_LO_SPACE] = new_lo_space_ =
-        new NewLargeObjectSpace(this, NewSpaceCapacity());
+    new_space_ = static_cast<NewSpace*>(space_[NEW_SPACE].get());
+
+    space_[NEW_LO_SPACE] =
+        std::make_unique<NewLargeObjectSpace>(this, NewSpaceCapacity());
+    new_lo_space_ =
+        static_cast<NewLargeObjectSpace*>(space_[NEW_LO_SPACE].get());
   }
-  space_[OLD_SPACE] = old_space_ = new OldSpace(this, old_allocation_info);
-  space_[CODE_SPACE] = code_space_ = new CodeSpace(this);
+
+  space_[OLD_SPACE] = std::make_unique<OldSpace>(this, old_allocation_info);
+  old_space_ = static_cast<OldSpace*>(space_[OLD_SPACE].get());
+
+  space_[CODE_SPACE] = std::make_unique<CodeSpace>(this);
+  code_space_ = static_cast<CodeSpace*>(space_[CODE_SPACE].get());
+
   if (v8_flags.use_map_space) {
-    space_[MAP_SPACE] = map_space_ = new MapSpace(this);
+    space_[MAP_SPACE] = std::make_unique<MapSpace>(this);
+    map_space_ = static_cast<MapSpace*>(space_[MAP_SPACE].get());
+  }
+
+  if (isolate()->is_shared_space_isolate()) {
+    space_[SHARED_SPACE] = std::make_unique<SharedSpace>(this);
+    shared_space_ = static_cast<SharedSpace*>(space_[SHARED_SPACE].get());
+  }
+
+  space_[LO_SPACE] = std::make_unique<OldLargeObjectSpace>(this);
+  lo_space_ = static_cast<OldLargeObjectSpace*>(space_[LO_SPACE].get());
+
+  space_[CODE_LO_SPACE] = std::make_unique<CodeLargeObjectSpace>(this);
+  code_lo_space_ =
+      static_cast<CodeLargeObjectSpace*>(space_[CODE_LO_SPACE].get());
+
+  if (isolate()->is_shared_space_isolate()) {
+    space_[SHARED_LO_SPACE] = std::make_unique<SharedLargeObjectSpace>(this);
+    shared_lo_space_ =
+        static_cast<SharedLargeObjectSpace*>(space_[SHARED_LO_SPACE].get());
   }
-  space_[LO_SPACE] = lo_space_ = new OldLargeObjectSpace(this);
-  space_[CODE_LO_SPACE] = code_lo_space_ = new CodeLargeObjectSpace(this);
 
   for (int i = 0; i < static_cast<int>(v8::Isolate::kUseCounterFeatureCount);
        i++) {
@@ -5475,12 +5536,12 @@ void Heap::SetUpSpaces(LinearAllocationArea& new_allocation_info,
   }
 
   if (new_space()) {
-    if (v8_flags.concurrent_minor_mc) {
+    if (v8_flags.concurrent_minor_mc_marking) {
       // TODO(v8:13012): Atomic MinorMC should not use ScavengeJob. Instead, we
       // should schedule MinorMC tasks at a soft limit, which are used by atomic
       // MinorMC, and to finalize concurrent MinorMC. The condition
-      // v8_flags.concurrent_minor_mc can then be changed to v8_flags.minor_mc
-      // (here and at the RemoveAllocationObserver call site).
+      // v8_flags.concurrent_minor_mc_marking can then be changed to
+      // v8_flags.minor_mc (here and at the RemoveAllocationObserver call site).
       minor_mc_task_observer_.reset(
           new MinorMCTaskObserver(this, MinorMCTaskObserver::kStepSize));
       new_space()->AddAllocationObserver(minor_mc_task_observer_.get());
@@ -5516,19 +5577,33 @@ void Heap::SetUpSpaces(LinearAllocationArea& new_allocation_info,
   }
 #endif  // V8_HEAP_USE_PKU_JIT_WRITE_PROTECT
 
-  if (isolate()->shared_isolate()) {
+  if (isolate()->shared_space_isolate()) {
+    Heap* heap = isolate()->shared_space_isolate()->heap();
+
+    shared_space_allocator_ = std::make_unique<ConcurrentAllocator>(
+        main_thread_local_heap(), heap->shared_space_);
+
+    DCHECK_NULL(shared_map_allocator_.get());
+
+    shared_allocation_space_ = heap->shared_space_;
+    shared_lo_allocation_space_ = heap->shared_lo_space_;
+    DCHECK(!v8_flags.use_map_space);
+    DCHECK_NULL(shared_map_allocation_space_);
+
+  } else if (isolate()->shared_isolate()) {
     Heap* shared_heap = isolate()->shared_isolate()->heap();
 
-    shared_old_space_ = shared_heap->old_space();
-    shared_lo_space_ = shared_heap->lo_space();
-    shared_old_allocator_.reset(
-        new ConcurrentAllocator(main_thread_local_heap(), shared_old_space_));
+    shared_space_allocator_ = std::make_unique<ConcurrentAllocator>(
+        main_thread_local_heap(), shared_heap->old_space());
 
     if (shared_heap->map_space()) {
-      shared_map_space_ = shared_heap->map_space();
-      shared_map_allocator_.reset(
-          new ConcurrentAllocator(main_thread_local_heap(), shared_map_space_));
+      shared_map_allocator_ = std::make_unique<ConcurrentAllocator>(
+          main_thread_local_heap(), shared_heap->map_space());
     }
+
+    shared_allocation_space_ = shared_heap->old_space();
+    shared_lo_allocation_space_ = shared_heap->lo_space();
+    shared_map_allocation_space_ = shared_heap->map_space();
   }
 
   main_thread_local_heap()->SetUpMainThread();
@@ -5668,8 +5743,8 @@ void Heap::AttachCppHeap(v8::CppHeap* cpp_heap) {
 
 void Heap::DetachCppHeap() {
   CppHeap::From(cpp_heap_)->DetachIsolate();
-  cpp_heap_ = nullptr;
   local_embedder_heap_tracer()->SetCppHeap(nullptr);
+  cpp_heap_ = nullptr;
 }
 
 const cppgc::EmbedderStackState* Heap::overriden_stack_state() const {
@@ -5738,6 +5813,17 @@ void Heap::StartTearDown() {
   }
 }
 
+void Heap::TearDownWithSharedHeap() {
+  DCHECK_EQ(gc_state(), TEAR_DOWN);
+
+  // Assert that there are no background threads left and no executable memory
+  // chunks are unprotected.
+  safepoint()->AssertMainThreadIsOnlyThread();
+
+  // Might use the external pointer which might be in the shared heap.
+  external_string_table_.TearDown();
+}
+
 void Heap::TearDown() {
   DCHECK_EQ(gc_state(), TEAR_DOWN);
 
@@ -5763,9 +5849,11 @@ void Heap::TearDown() {
   }
 
   if (new_space()) {
-    if (v8_flags.concurrent_minor_mc) {
+    if (minor_mc_task_observer_) {
+      DCHECK_NULL(scavenge_task_observer_);
       new_space()->RemoveAllocationObserver(minor_mc_task_observer_.get());
     } else {
+      DCHECK_NOT_NULL(scavenge_task_observer_);
       new_space()->RemoveAllocationObserver(scavenge_task_observer_.get());
     }
   }
@@ -5804,6 +5892,9 @@ void Heap::TearDown() {
     minor_mark_compact_collector_.reset();
   }
 
+  sweeper_->TearDown();
+  sweeper_.reset();
+
   scavenger_collector_.reset();
   array_buffer_sweeper_.reset();
   incremental_marking_.reset();
@@ -5830,16 +5921,11 @@ void Heap::TearDown() {
     cpp_heap_ = nullptr;
   }
 
-  external_string_table_.TearDown();
-
   tracer_.reset();
 
-  allocation_sites_to_pretenure_.reset();
-
-  shared_old_space_ = nullptr;
-  shared_old_allocator_.reset();
+  pretenuring_handler_.reset();
 
-  shared_map_space_ = nullptr;
+  shared_space_allocator_.reset();
   shared_map_allocator_.reset();
 
   {
@@ -5847,8 +5933,7 @@ void Heap::TearDown() {
         "Deletion of CODE_SPACE and CODE_LO_SPACE requires write access to "
         "Code page headers");
     for (int i = FIRST_MUTABLE_SPACE; i <= LAST_MUTABLE_SPACE; i++) {
-      delete space_[i];
-      space_[i] = nullptr;
+      space_[i].reset();
     }
   }
 
@@ -6060,6 +6145,7 @@ void Heap::ClearRecordedSlot(HeapObject object, ObjectSlot slot) {
       // No need to update old-to-old here since that remembered set is gone
       // after a full GC and not re-recorded until sweeping is finished.
       RememberedSet<OLD_TO_NEW>::Remove(page, slot.address());
+      RememberedSet<OLD_TO_SHARED>::Remove(page, slot.address());
     }
   }
 #endif
@@ -6090,6 +6176,7 @@ void Heap::VerifySlotRangeHasNoRecordedSlots(Address start, Address end) {
 #ifndef V8_DISABLE_WRITE_BARRIERS
   Page* page = Page::FromAddress(start);
   RememberedSet<OLD_TO_NEW>::CheckNoneInRange(page, start, end);
+  RememberedSet<OLD_TO_SHARED>::CheckNoneInRange(page, start, end);
 #endif
 }
 #endif
@@ -6104,6 +6191,8 @@ void Heap::ClearRecordedSlotRange(Address start, Address end) {
     if (!page->SweepingDone()) {
       RememberedSet<OLD_TO_NEW>::RemoveRange(page, start, end,
                                              SlotSet::KEEP_EMPTY_BUCKETS);
+      RememberedSet<OLD_TO_SHARED>::RemoveRange(page, start, end,
+                                                SlotSet::KEEP_EMPTY_BUCKETS);
     }
   }
 #endif
@@ -6567,7 +6656,7 @@ void Heap::RemoveDirtyFinalizationRegistriesOnContext(NativeContext context) {
   set_dirty_js_finalization_registries_list_tail(prev);
 }
 
-void Heap::KeepDuringJob(Handle<JSReceiver> target) {
+void Heap::KeepDuringJob(Handle<HeapObject> target) {
   DCHECK(weak_refs_keep_during_job().IsUndefined() ||
          weak_refs_keep_during_job().IsOrderedHashSet());
   Handle<OrderedHashSet> table;
@@ -6773,9 +6862,12 @@ bool Heap::AllowedToBeMigrated(Map map, HeapObject obj, AllocationSpace dst) {
       return dst == CODE_SPACE && type == CODE_TYPE;
     case MAP_SPACE:
       return dst == MAP_SPACE && type == MAP_TYPE;
+    case SHARED_SPACE:
+      return dst == SHARED_SPACE;
     case LO_SPACE:
     case CODE_LO_SPACE:
     case NEW_LO_SPACE:
+    case SHARED_LO_SPACE:
     case RO_SPACE:
       return false;
   }
@@ -7214,6 +7306,69 @@ void Heap::set_allocation_timeout(int allocation_timeout) {
 }
 #endif  // V8_ENABLE_ALLOCATION_TIMEOUT
 
+void Heap::FinishSweepingIfOutOfWork() {
+  if (sweeper()->sweeping_in_progress() && v8_flags.concurrent_sweeping &&
+      !sweeper()->AreSweeperTasksRunning()) {
+    // At this point we know that all concurrent sweeping tasks have run
+    // out of work and quit: all pages are swept. The main thread still needs
+    // to complete sweeping though.
+    EnsureSweepingCompleted(SweepingForcedFinalizationMode::kV8Only);
+  }
+  if (cpp_heap()) {
+    // Ensure that sweeping is also completed for the C++ managed heap, if one
+    // exists and it's out of work.
+    CppHeap::From(cpp_heap())->FinishSweepingIfOutOfWork();
+  }
+}
+
+void Heap::EnsureSweepingCompleted(SweepingForcedFinalizationMode mode) {
+  if (sweeper()->sweeping_in_progress()) {
+    TRACE_GC_EPOCH(tracer(), GCTracer::Scope::MC_COMPLETE_SWEEPING,
+                   ThreadKind::kMain);
+
+    sweeper()->EnsureCompleted();
+    old_space()->RefillFreeList();
+    {
+      CodePageHeaderModificationScope rwx_write_scope(
+          "Updating per-page stats stored in page headers requires write "
+          "access to Code page headers");
+      code_space()->RefillFreeList();
+    }
+    if (shared_space()) {
+      shared_space()->RefillFreeList();
+    }
+    if (map_space()) {
+      map_space()->RefillFreeList();
+      map_space()->SortFreeList();
+    }
+
+    tracer()->NotifySweepingCompleted();
+
+#ifdef VERIFY_HEAP
+    if (v8_flags.verify_heap && !evacuation()) {
+      FullEvacuationVerifier verifier(this);
+      verifier.Run();
+    }
+#endif
+  }
+
+  if (mode == SweepingForcedFinalizationMode::kUnifiedHeap && cpp_heap()) {
+    // Ensure that sweeping is also completed for the C++ managed heap, if one
+    // exists.
+    CppHeap::From(cpp_heap())->FinishSweepingIfRunning();
+    DCHECK(!CppHeap::From(cpp_heap())->sweeper().IsSweepingInProgress());
+  }
+
+  DCHECK_IMPLIES(
+      mode == SweepingForcedFinalizationMode::kUnifiedHeap || !cpp_heap(),
+      !tracer()->IsSweepingInProgress());
+}
+
+void Heap::DrainSweepingWorklistForSpace(AllocationSpace space) {
+  if (!sweeper()->sweeping_in_progress()) return;
+  sweeper()->DrainSweepingWorklistForSpace(space);
+}
+
 EmbedderStackStateScope::EmbedderStackStateScope(Heap* heap, Origin origin,
                                                  StackState stack_state)
     : local_tracer_(heap->local_embedder_heap_tracer()),
diff --git a/deps/v8/src/heap/heap.h b/deps/v8/src/heap/heap.h
index 6e270f246df648..0cf23b5ef4d128 100644
--- a/deps/v8/src/heap/heap.h
+++ b/deps/v8/src/heap/heap.h
@@ -31,6 +31,9 @@
 #include "src/heap/base/stack.h"
 #include "src/heap/gc-callbacks.h"
 #include "src/heap/heap-allocator.h"
+#include "src/heap/marking-state.h"
+#include "src/heap/pretenuring-handler.h"
+#include "src/heap/sweeper.h"
 #include "src/init/heap-symbols.h"
 #include "src/objects/allocation-site.h"
 #include "src/objects/fixed-array.h"
@@ -98,8 +101,6 @@ class CppHeap;
 class GCIdleTimeHandler;
 class GCIdleTimeHeapState;
 class GCTracer;
-template <typename T>
-class GlobalHandleVector;
 class IsolateSafepoint;
 class HeapObjectAllocationTracker;
 class HeapObjectsFilter;
@@ -127,7 +128,9 @@ class SafepointScope;
 class ScavengeJob;
 class Scavenger;
 class ScavengerCollector;
+class SharedLargeObjectSpace;
 class SharedReadOnlySpace;
+class SharedSpace;
 class Space;
 class StressScavengeObserver;
 class TimedHistogram;
@@ -140,6 +143,8 @@ enum ArrayStorageAllocationMode {
 
 enum class ClearRecordedSlots { kYes, kNo };
 
+enum class UpdateInvalidatedObjectSize { kYes, kNo };
+
 enum class InvalidateRecordedSlots { kYes, kNo };
 
 enum class ClearFreedMemoryMode { kClearFreedMemory, kDontClearFreedMemory };
@@ -148,46 +153,6 @@ enum ExternalBackingStoreType { kArrayBuffer, kExternalString, kNumTypes };
 
 enum class RetainingPathOption { kDefault, kTrackEphemeronPath };
 
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused. If you add new items here, update
-// src/tools/metrics/histograms/enums.xml in chromium.
-enum class GarbageCollectionReason : int {
-  kUnknown = 0,
-  kAllocationFailure = 1,
-  kAllocationLimit = 2,
-  kContextDisposal = 3,
-  kCountersExtension = 4,
-  kDebugger = 5,
-  kDeserializer = 6,
-  kExternalMemoryPressure = 7,
-  kFinalizeMarkingViaStackGuard = 8,
-  kFinalizeMarkingViaTask = 9,
-  kFullHashtable = 10,
-  kHeapProfiler = 11,
-  kTask = 12,
-  kLastResort = 13,
-  kLowMemoryNotification = 14,
-  kMakeHeapIterable = 15,
-  kMemoryPressure = 16,
-  kMemoryReducer = 17,
-  kRuntime = 18,
-  kSamplingProfiler = 19,
-  kSnapshotCreator = 20,
-  kTesting = 21,
-  kExternalFinalize = 22,
-  kGlobalAllocationLimit = 23,
-  kMeasureMemory = 24,
-  kBackgroundAllocationFailure = 25,
-  kFinalizeMinorMC = 26,
-  kCppHeapAllocationFailure = 27,
-
-  kLastReason = kCppHeapAllocationFailure,
-};
-
-static_assert(kGarbageCollectionReasonMaxValue ==
-                  static_cast<int>(GarbageCollectionReason::kLastReason),
-              "The value of kGarbageCollectionReasonMaxValue is inconsistent.");
-
 enum class YoungGenerationHandling {
   kRegularScavenge = 0,
   kFastPromotionDuringScavenge = 1,
@@ -254,7 +219,6 @@ class Heap {
   // and the key of the entry is in new-space. Such keys do not appear in the
   // usual OLD_TO_NEW remembered set.
   EphemeronRememberedSet ephemeron_remembered_set_;
-  enum FindMementoMode { kForRuntime, kForGC };
 
   enum class HeapGrowingMode { kSlow, kConservative, kMinimal, kDefault };
 
@@ -334,9 +298,6 @@ class Heap {
     std::atomic<int64_t> low_since_mark_compact_{0};
   };
 
-  using PretenuringFeedbackMap =
-      std::unordered_map<AllocationSite, size_t, Object::Hasher>;
-
   // Taking this mutex prevents the GC from entering a phase that relocates
   // object references.
   base::Mutex* relocation_mutex() { return &relocation_mutex_; }
@@ -695,11 +656,6 @@ class Heap {
 
   bool IsGCWithStack() const;
 
-  // If an object has an AllocationMemento trailing it, return it, otherwise
-  // return a null AllocationMemento.
-  template <FindMementoMode mode>
-  inline AllocationMemento FindAllocationMemento(Map map, HeapObject object);
-
   // Performs GC after background allocation failure.
   void CollectGarbageForBackground(LocalHeap* local_heap);
 
@@ -818,9 +774,9 @@ class Heap {
   }
 
 #if V8_ENABLE_WEBASSEMBLY
-  // TODO(manoskouk): Inline this if STRONG_MUTABLE_MOVABLE_ROOT_LIST setters
-  // become public.
-  void EnsureWasmCanonicalRttsSize(int length);
+  // TODO(manoskouk): Consider inlining/moving this if
+  // STRONG_MUTABLE_MOVABLE_ROOT_LIST setters become public.
+  V8_EXPORT_PRIVATE void EnsureWasmCanonicalRttsSize(int length);
 #endif
 
   // ===========================================================================
@@ -861,6 +817,9 @@ class Heap {
   // Sets the TearDown state, so no new GC tasks get posted.
   void StartTearDown();
 
+  // Destroys all data that might require the shared heap.
+  void TearDownWithSharedHeap();
+
   // Destroys all memory allocated by the heap.
   void TearDown();
 
@@ -876,16 +835,23 @@ class Heap {
   NewSpace* new_space() const { return new_space_; }
   inline PagedNewSpace* paged_new_space() const;
   OldSpace* old_space() const { return old_space_; }
-  OldSpace* shared_old_space() const { return shared_old_space_; }
   CodeSpace* code_space() const { return code_space_; }
+  SharedSpace* shared_space() const { return shared_space_; }
   MapSpace* map_space() const { return map_space_; }
   inline PagedSpace* space_for_maps();
   OldLargeObjectSpace* lo_space() const { return lo_space_; }
-  OldLargeObjectSpace* shared_lo_space() const { return shared_lo_space_; }
   CodeLargeObjectSpace* code_lo_space() const { return code_lo_space_; }
+  SharedLargeObjectSpace* shared_lo_space() const { return shared_lo_space_; }
   NewLargeObjectSpace* new_lo_space() const { return new_lo_space_; }
   ReadOnlySpace* read_only_space() const { return read_only_space_; }
 
+  PagedSpace* shared_allocation_space() const {
+    return shared_allocation_space_;
+  }
+  OldLargeObjectSpace* shared_lo_allocation_space() const {
+    return shared_lo_allocation_space_;
+  }
+
   inline PagedSpace* paged_space(int idx);
   inline Space* space(int idx);
 
@@ -904,13 +870,11 @@ class Heap {
 
   inline Isolate* isolate() const;
 
-#ifdef DEBUG
   // Check if we run on isolate's main thread.
   inline bool IsMainThread() const;
   // Check if we run on the current main thread of the shared isolate during
   // shared GC.
   inline bool IsSharedMainThread() const;
-#endif
 
   MarkCompactCollector* mark_compact_collector() {
     return mark_compact_collector_.get();
@@ -920,6 +884,8 @@ class Heap {
     return minor_mark_compact_collector_.get();
   }
 
+  Sweeper* sweeper() { return sweeper_.get(); }
+
   ArrayBufferSweeper* array_buffer_sweeper() {
     return array_buffer_sweeper_.get();
   }
@@ -991,7 +957,7 @@ class Heap {
     return is_finalization_registry_cleanup_task_posted_;
   }
 
-  V8_EXPORT_PRIVATE void KeepDuringJob(Handle<JSReceiver> target);
+  V8_EXPORT_PRIVATE void KeepDuringJob(Handle<HeapObject> target);
   void ClearKeptObjects();
 
   // ===========================================================================
@@ -1030,8 +996,14 @@ class Heap {
       const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags);
 
   // Performs garbage collection operation for the shared heap.
-  V8_EXPORT_PRIVATE void CollectSharedGarbage(
-      GarbageCollectionReason gc_reason);
+  V8_EXPORT_PRIVATE bool CollectGarbageShared(
+      LocalHeap* local_heap, GarbageCollectionReason gc_reason);
+
+  // Requests garbage collection from some other thread.
+  V8_EXPORT_PRIVATE bool CollectGarbageFromAnyThread(
+      LocalHeap* local_heap,
+      GarbageCollectionReason gc_reason =
+          GarbageCollectionReason::kBackgroundAllocationFailure);
 
   // Reports and external memory pressure event, either performs a major GC or
   // completes incremental marking in order to free external resources.
@@ -1125,7 +1097,7 @@ class Heap {
   void CompleteSweepingYoung(GarbageCollector collector);
 
   // Ensures that sweeping is finished for that object's page.
-  void EnsureSweepingCompleted(HeapObject object);
+  void EnsureSweepingCompletedForObject(HeapObject object);
 
   IncrementalMarking* incremental_marking() const {
     return incremental_marking_.get();
@@ -1151,8 +1123,11 @@ class Heap {
   // The runtime uses this function to inform the GC of object size changes. The
   // GC will fill this area with a filler object and might clear recorded slots
   // in that area.
-  void NotifyObjectSizeChange(HeapObject, int old_size, int new_size,
-                              ClearRecordedSlots clear_recorded_slots);
+  void NotifyObjectSizeChange(
+      HeapObject, int old_size, int new_size,
+      ClearRecordedSlots clear_recorded_slots,
+      UpdateInvalidatedObjectSize update_invalidated_object_size =
+          UpdateInvalidatedObjectSize::kYes);
 
   // ===========================================================================
   // Deoptimization support API. ===============================================
@@ -1169,8 +1144,6 @@ class Heap {
 
   void DeoptMarkedAllocationSites();
 
-  bool DeoptMaybeTenuredAllocationSites();
-
   // ===========================================================================
   // Embedder heap tracer support. =============================================
   // ===========================================================================
@@ -1202,7 +1175,7 @@ class Heap {
 
   V8_EXPORT_PRIVATE void SetStackStart(void* stack_start);
 
-  ::heap::base::Stack& stack();
+  V8_EXPORT_PRIVATE ::heap::base::Stack& stack();
 
   // ===========================================================================
   // Embedder roots optimizations. =============================================
@@ -1274,7 +1247,8 @@ class Heap {
   V8_EXPORT_PRIVATE bool InSpace(HeapObject value, AllocationSpace space) const;
 
   // Returns true when this heap is shared.
-  V8_EXPORT_PRIVATE bool IsShared();
+  V8_EXPORT_PRIVATE bool IsShared() const;
+  V8_EXPORT_PRIVATE bool ShouldMarkSharedHeap() const;
 
   // Slow methods that can be used for verification as they can also be used
   // with off-heap Addresses.
@@ -1393,15 +1367,15 @@ class Heap {
   }
   inline size_t promoted_objects_size() { return promoted_objects_size_; }
 
-  inline void IncrementSemiSpaceCopiedObjectSize(size_t object_size) {
-    semi_space_copied_object_size_ += object_size;
+  inline void IncrementNewSpaceSurvivingObjectSize(size_t object_size) {
+    new_space_surviving_object_size_ += object_size;
   }
-  inline size_t semi_space_copied_object_size() {
-    return semi_space_copied_object_size_;
+  inline size_t new_space_surviving_object_size() {
+    return new_space_surviving_object_size_;
   }
 
   inline size_t SurvivedYoungObjectSize() {
-    return promoted_objects_size_ + semi_space_copied_object_size_;
+    return promoted_objects_size_ + new_space_surviving_object_size_;
   }
 
   inline void IncrementNodesDiedInNewSpace(int count) {
@@ -1413,7 +1387,6 @@ class Heap {
   inline void IncrementNodesPromoted() { nodes_promoted_++; }
 
   inline void IncrementYoungSurvivorsCounter(size_t survived) {
-    survived_last_scavenge_ = survived;
     survived_since_last_expansion_ += survived;
   }
 
@@ -1531,27 +1504,6 @@ class Heap {
   V8_EXPORT_PRIVATE void* AllocateExternalBackingStore(
       const std::function<void*(size_t)>& allocate, size_t byte_length);
 
-  // ===========================================================================
-  // Allocation site tracking. =================================================
-  // ===========================================================================
-
-  // Updates the AllocationSite of a given {object}. The entry (including the
-  // count) is cached on the local pretenuring feedback.
-  inline void UpdateAllocationSite(
-      Map map, HeapObject object, PretenuringFeedbackMap* pretenuring_feedback);
-
-  // Merges local pretenuring feedback into the global one. Note that this
-  // method needs to be called after evacuation, as allocation sites may be
-  // evacuated and this method resolves forward pointers accordingly.
-  void MergeAllocationSitePretenuringFeedback(
-      const PretenuringFeedbackMap& local_pretenuring_feedback);
-
-  // Adds an allocation site to the list of sites to be pretenured during the
-  // next collection. Added allocation sites are pretenured independent of
-  // their feedback.
-  V8_EXPORT_PRIVATE void PretenureAllocationSiteOnNextCollection(
-      AllocationSite site);
-
   // ===========================================================================
   // Allocation tracking. ======================================================
   // ===========================================================================
@@ -1627,6 +1579,28 @@ class Heap {
   // it supports a forwarded map. Fails if the map is not the code map.
   Map GcSafeMapOfCodeSpaceObject(HeapObject object);
 
+  // ===========================================================================
+  // Sweeping. =================================================================
+  // ===========================================================================
+
+  bool sweeping_in_progress() const { return sweeper_->sweeping_in_progress(); }
+
+  void FinishSweepingIfOutOfWork();
+
+  enum class SweepingForcedFinalizationMode { kUnifiedHeap, kV8Only };
+
+  // Ensures that sweeping is finished.
+  //
+  // Note: Can only be called safely from main thread.
+  V8_EXPORT_PRIVATE void EnsureSweepingCompleted(
+      SweepingForcedFinalizationMode mode);
+
+  void DrainSweepingWorklistForSpace(AllocationSpace space);
+
+  void set_evacuation(bool evacuation) { evacuation_ = evacuation; }
+
+  bool evacuation() const { return evacuation_; }
+
   // =============================================================================
 
 #ifdef V8_ENABLE_ALLOCATION_TIMEOUT
@@ -1683,6 +1657,16 @@ class Heap {
     return (current_gc_flags_ & kReduceMemoryFootprintMask) != 0;
   }
 
+  MarkingState* marking_state() { return &marking_state_; }
+
+  NonAtomicMarkingState* non_atomic_marking_state() {
+    return &non_atomic_marking_state_;
+  }
+
+  AtomicMarkingState* atomic_marking_state() { return &atomic_marking_state_; }
+
+  PretenturingHandler* pretenuring_handler() { return &pretenuring_handler_; }
+
  private:
   class AllocationTrackerForDebugging;
 
@@ -1763,8 +1747,6 @@ class Heap {
 
   static const int kMaxMarkCompactsInIdleRound = 7;
 
-  static const int kInitialFeedbackCapacity = 256;
-
   Heap();
   ~Heap();
 
@@ -1802,6 +1784,10 @@ class Heap {
   // Free all shared LABs of main thread.
   void FreeMainThreadSharedLinearAllocationAreas();
 
+  // Enables/Disables black allocation in shared LABs.
+  void MarkSharedLinearAllocationAreasBlack();
+  void UnmarkSharedLinearAllocationAreas();
+
   // Performs garbage collection in a safepoint.
   // Returns the number of freed global handles.
   size_t PerformGarbageCollection(
@@ -1869,6 +1855,7 @@ class Heap {
   bool HasLowOldGenerationAllocationRate();
   bool HasLowEmbedderAllocationRate();
 
+  bool ShouldReduceNewSpaceSize() const;
   void ReduceNewSpaceSize();
 
   GCIdleTimeHeapState ComputeHeapState();
@@ -1900,18 +1887,6 @@ class Heap {
   void InvokeIncrementalMarkingPrologueCallbacks();
   void InvokeIncrementalMarkingEpilogueCallbacks();
 
-  // ===========================================================================
-  // Pretenuring. ==============================================================
-  // ===========================================================================
-
-  // Pretenuring decisions are made based on feedback collected during new space
-  // evacuation. Note that between feedback collection and calling this method
-  // object in old space must not move.
-  void ProcessPretenuringFeedback();
-
-  // Removes an entry from the global pretenuring storage.
-  void RemoveAllocationSitePretenuringFeedback(AllocationSite site);
-
   // ===========================================================================
   // Actual GC. ================================================================
   // ===========================================================================
@@ -1962,7 +1937,7 @@ class Heap {
 
   void UpdateTotalGCTime(double duration);
 
-  bool MaximumSizeScavenge() { return maximum_size_scavenges_ > 0; }
+  bool MaximumSizeMinorGC() { return maximum_size_minor_gcs_ > 0; }
 
   bool IsIneffectiveMarkCompact(size_t old_generation_size,
                                 double mutator_utilization);
@@ -2173,9 +2148,6 @@ class Heap {
   // scavenge since last new space expansion.
   size_t survived_since_last_expansion_ = 0;
 
-  // ... and since the last scavenge.
-  size_t survived_last_scavenge_ = 0;
-
   // This is not the depth of nested AlwaysAllocateScope's but rather a single
   // count, as scopes can be acquired from multiple tasks (read: threads).
   std::atomic<size_t> always_allocate_scope_count_{0};
@@ -2190,24 +2162,30 @@ class Heap {
   // For keeping track of context disposals.
   int contexts_disposed_ = 0;
 
+  // Spaces owned by this heap through space_.
   NewSpace* new_space_ = nullptr;
   OldSpace* old_space_ = nullptr;
   CodeSpace* code_space_ = nullptr;
   MapSpace* map_space_ = nullptr;
+  SharedSpace* shared_space_ = nullptr;
   OldLargeObjectSpace* lo_space_ = nullptr;
   CodeLargeObjectSpace* code_lo_space_ = nullptr;
   NewLargeObjectSpace* new_lo_space_ = nullptr;
+  SharedLargeObjectSpace* shared_lo_space_ = nullptr;
   ReadOnlySpace* read_only_space_ = nullptr;
 
-  OldSpace* shared_old_space_ = nullptr;
-  OldLargeObjectSpace* shared_lo_space_ = nullptr;
-  MapSpace* shared_map_space_ = nullptr;
+  // Either pointer to owned shared spaces or pointer to unowned shared spaces
+  // in another isolate.
+  PagedSpace* shared_allocation_space_ = nullptr;
+  OldLargeObjectSpace* shared_lo_allocation_space_ = nullptr;
+  PagedSpace* shared_map_allocation_space_ = nullptr;
 
-  std::unique_ptr<ConcurrentAllocator> shared_old_allocator_;
+  // Allocators for the shared spaces.
+  std::unique_ptr<ConcurrentAllocator> shared_space_allocator_;
   std::unique_ptr<ConcurrentAllocator> shared_map_allocator_;
 
   // Map from the space id to the space.
-  Space* space_[LAST_SPACE + 1];
+  std::unique_ptr<Space> space_[LAST_SPACE + 1];
 
   LocalHeap* main_thread_local_heap_ = nullptr;
 
@@ -2284,9 +2262,9 @@ class Heap {
   size_t promoted_objects_size_ = 0;
   double promotion_ratio_ = 0.0;
   double promotion_rate_ = 0.0;
-  size_t semi_space_copied_object_size_ = 0;
-  size_t previous_semi_space_copied_object_size_ = 0;
-  double semi_space_copied_rate_ = 0.0;
+  size_t new_space_surviving_object_size_ = 0;
+  size_t previous_new_space_surviving_object_size_ = 0;
+  double new_space_surviving_rate_ = 0.0;
   int nodes_died_in_new_space_ = 0;
   int nodes_copied_in_new_space_ = 0;
   int nodes_promoted_ = 0;
@@ -2295,7 +2273,7 @@ class Heap {
   // tenure state. When we switched to the maximum new space size we deoptimize
   // the code that belongs to the allocation site and derive the lifetime
   // of the allocation site.
-  unsigned int maximum_size_scavenges_ = 0;
+  unsigned int maximum_size_minor_gcs_ = 0;
 
   // Total time spent in GC.
   double total_gc_time_ms_ = 0.0;
@@ -2304,6 +2282,7 @@ class Heap {
   double last_gc_time_ = 0.0;
 
   std::unique_ptr<GCTracer> tracer_;
+  std::unique_ptr<Sweeper> sweeper_;
   std::unique_ptr<MarkCompactCollector> mark_compact_collector_;
   std::unique_ptr<MinorMarkCompactCollector> minor_mark_compact_collector_;
   std::unique_ptr<ScavengerCollector> scavenger_collector_;
@@ -2359,16 +2338,6 @@ class Heap {
   // The size of global memory after the last MarkCompact GC.
   size_t global_memory_at_last_gc_ = 0;
 
-  // The feedback storage is used to store allocation sites (keys) and how often
-  // they have been visited (values) by finding a memento behind an object. The
-  // storage is only alive temporary during a GC. The invariant is that all
-  // pointers in this map are already fixed, i.e., they do not point to
-  // forwarding pointers.
-  PretenuringFeedbackMap global_pretenuring_feedback_;
-
-  std::unique_ptr<GlobalHandleVector<AllocationSite>>
-      allocation_sites_to_pretenure_;
-
   char trace_ring_buffer_[kTraceRingBufferSize];
 
   // If it's not full then the data is from 0 to ring_buffer_end_.  If it's
@@ -2433,12 +2402,22 @@ class Heap {
 
   bool is_finalization_registry_cleanup_task_posted_ = false;
 
+  bool evacuation_ = false;
+
   std::unique_ptr<third_party_heap::Heap> tp_heap_;
 
+  MarkingState marking_state_;
+  NonAtomicMarkingState non_atomic_marking_state_;
+  AtomicMarkingState atomic_marking_state_;
+
+  PretenturingHandler pretenuring_handler_;
+
   // Classes in "heap" can be friends.
   friend class AlwaysAllocateScope;
   friend class ArrayBufferCollector;
   friend class ArrayBufferSweeper;
+  friend class CollectorBase;
+  friend class ConcurrentAllocator;
   friend class ConcurrentMarking;
   friend class EvacuateVisitorBase;
   friend class GCCallbacksScope;
@@ -2468,6 +2447,7 @@ class Heap {
   friend class ObjectStatsCollector;
   friend class Page;
   friend class PagedSpaceBase;
+  friend class PretenturingHandler;
   friend class ReadOnlyRoots;
   friend class Scavenger;
   friend class ScavengerCollector;
@@ -2887,6 +2867,18 @@ class V8_NODISCARD CppClassNamesAsHeapObjectNameScope final {
   std::unique_ptr<cppgc::internal::ClassNameAsHeapObjectNameScope> scope_;
 };
 
+class V8_NODISCARD EvacuationScope {
+ public:
+  explicit EvacuationScope(Heap* heap) : heap_(heap) {
+    heap_->set_evacuation(true);
+  }
+
+  ~EvacuationScope() { heap_->set_evacuation(false); }
+
+ private:
+  Heap* const heap_;
+};
+
 }  // namespace internal
 }  // namespace v8
 
diff --git a/deps/v8/src/heap/incremental-marking-inl.h b/deps/v8/src/heap/incremental-marking-inl.h
index 797026352d6732..cc413f2b82c385 100644
--- a/deps/v8/src/heap/incremental-marking-inl.h
+++ b/deps/v8/src/heap/incremental-marking-inl.h
@@ -8,6 +8,7 @@
 #include "src/execution/isolate.h"
 #include "src/heap/heap-inl.h"
 #include "src/heap/incremental-marking.h"
+#include "src/heap/marking-state-inl.h"
 
 namespace v8 {
 namespace internal {
diff --git a/deps/v8/src/heap/incremental-marking.cc b/deps/v8/src/heap/incremental-marking.cc
index 780bf08da7eba8..6f633f073365f0 100644
--- a/deps/v8/src/heap/incremental-marking.cc
+++ b/deps/v8/src/heap/incremental-marking.cc
@@ -58,9 +58,8 @@ IncrementalMarking::IncrementalMarking(Heap* heap, WeakObjects* weak_objects)
       incremental_marking_job_(heap),
       new_generation_observer_(this, kYoungGenerationAllocatedThreshold),
       old_generation_observer_(this, kOldGenerationAllocatedThreshold),
-      marking_state_(heap->isolate()),
-      atomic_marking_state_(heap->isolate()),
-      non_atomic_marking_state_(heap->isolate()) {}
+      marking_state_(heap->marking_state()),
+      atomic_marking_state_(heap->atomic_marking_state()) {}
 
 void IncrementalMarking::MarkBlackAndVisitObjectDueToLayoutChange(
     HeapObject obj) {
@@ -131,7 +130,7 @@ bool IncrementalMarking::IsBelowActivationThresholds() const {
 
 void IncrementalMarking::Start(GarbageCollector garbage_collector,
                                GarbageCollectionReason gc_reason) {
-  DCHECK(!major_collector_->sweeping_in_progress());
+  DCHECK(!heap_->sweeping_in_progress());
   DCHECK(!heap_->IsShared());
 
   if (v8_flags.trace_incremental_marking) {
@@ -160,15 +159,22 @@ void IncrementalMarking::Start(GarbageCollector garbage_collector,
 
   Counters* counters = heap_->isolate()->counters();
 
-  counters->incremental_marking_reason()->AddSample(
-      static_cast<int>(gc_reason));
+  const bool is_major = garbage_collector == GarbageCollector::MARK_COMPACTOR;
+  if (is_major) {
+    // Reasons are only reported for major GCs
+    counters->incremental_marking_reason()->AddSample(
+        static_cast<int>(gc_reason));
+  }
   NestedTimedHistogramScope incremental_marking_scope(
-      counters->gc_incremental_marking_start());
-  TRACE_EVENT1(
-      "v8", "V8.GCIncrementalMarkingStart", "epoch",
-      heap_->tracer()->CurrentEpoch(GCTracer::Scope::MC_INCREMENTAL_START));
-  TRACE_GC_EPOCH(heap()->tracer(), GCTracer::Scope::MC_INCREMENTAL_START,
-                 ThreadKind::kMain);
+      is_major ? counters->gc_incremental_marking_start()
+               : counters->gc_minor_incremental_marking_start());
+  const auto scope_id = is_major ? GCTracer::Scope::MC_INCREMENTAL_START
+                                 : GCTracer::Scope::MINOR_MC_INCREMENTAL_START;
+  TRACE_EVENT1("v8",
+               is_major ? "V8.GCIncrementalMarkingStart"
+                        : "V8.GCMinorIncrementalMarkingStart",
+               "epoch", heap_->tracer()->CurrentEpoch(scope_id));
+  TRACE_GC_EPOCH(heap()->tracer(), scope_id, ThreadKind::kMain);
   heap_->tracer()->NotifyIncrementalMarkingStart();
 
   start_time_ms_ = heap()->MonotonicallyIncreasingTimeInMs();
@@ -181,7 +187,7 @@ void IncrementalMarking::Start(GarbageCollector garbage_collector,
   schedule_update_time_ms_ = start_time_ms_;
   bytes_marked_concurrently_ = 0;
 
-  if (garbage_collector == GarbageCollector::MARK_COMPACTOR) {
+  if (is_major) {
     current_collector_ = CurrentCollector::kMajorMC;
     StartMarkingMajor();
     heap_->AddAllocationObserversToAllSpaces(&old_generation_observer_,
@@ -266,7 +272,20 @@ void IncrementalMarking::MarkRoots() {
 
     heap()->isolate()->global_handles()->IterateYoungStrongAndDependentRoots(
         &visitor);
-    // TODO(v8:13012): Do PageMarkingItem processing.
+
+    std::vector<PageMarkingItem> marking_items;
+    RememberedSet<OLD_TO_NEW>::IterateMemoryChunks(
+        heap_, [&marking_items](MemoryChunk* chunk) {
+          marking_items.emplace_back(chunk);
+        });
+
+    V8::GetCurrentPlatform()
+        ->CreateJob(
+            v8::TaskPriority::kUserBlocking,
+            std::make_unique<YoungGenerationMarkingJob>(
+                heap_->isolate(), heap_, minor_collector_->marking_worklists(),
+                std::move(marking_items), YoungMarkingJobType::kIncremental))
+        ->Join();
   }
 }
 
@@ -389,6 +408,13 @@ void IncrementalMarking::StartBlackAllocation() {
         "Marking Code objects requires write access to the Code page header");
     heap()->code_space()->MarkLinearAllocationAreaBlack();
   }
+  if (heap()->isolate()->is_shared_heap_isolate()) {
+    DCHECK_EQ(heap()->shared_space()->top(), kNullAddress);
+    heap()->isolate()->global_safepoint()->IterateClientIsolates(
+        [](Isolate* client) {
+          client->heap()->MarkSharedLinearAllocationAreasBlack();
+        });
+  }
   heap()->safepoint()->IterateLocalHeaps([](LocalHeap* local_heap) {
     local_heap->MarkLinearAllocationAreaBlack();
   });
@@ -407,6 +433,13 @@ void IncrementalMarking::PauseBlackAllocation() {
         "Marking Code objects requires write access to the Code page header");
     heap()->code_space()->UnmarkLinearAllocationArea();
   }
+  if (heap()->isolate()->is_shared_heap_isolate()) {
+    DCHECK_EQ(heap()->shared_space()->top(), kNullAddress);
+    heap()->isolate()->global_safepoint()->IterateClientIsolates(
+        [](Isolate* client) {
+          client->heap()->UnmarkSharedLinearAllocationAreas();
+        });
+  }
   heap()->safepoint()->IterateLocalHeaps(
       [](LocalHeap* local_heap) { local_heap->UnmarkLinearAllocationArea(); });
   if (v8_flags.trace_incremental_marking) {
@@ -433,14 +466,13 @@ void IncrementalMarking::UpdateMarkingWorklistAfterYoungGenGC() {
 
   Map filler_map = ReadOnlyRoots(heap_).one_pointer_filler_map();
 
-  MarkingState* minor_marking_state =
-      heap()->minor_mark_compact_collector()->marking_state();
+  MarkingState* marking_state = heap()->marking_state();
 
   major_collector_->local_marking_worklists()->Publish();
   MarkingBarrier::PublishAll(heap());
   PtrComprCageBase cage_base(heap_->isolate());
-  major_collector_->marking_worklists()->Update([this, minor_marking_state,
-                                                 cage_base, filler_map](
+  major_collector_->marking_worklists()->Update([this, marking_state, cage_base,
+                                                 filler_map](
                                                     HeapObject obj,
                                                     HeapObject* out) -> bool {
     DCHECK(obj.IsHeapObject());
@@ -458,7 +490,7 @@ void IncrementalMarking::UpdateMarkingWorklistAfterYoungGenGC() {
       }
       HeapObject dest = map_word.ToForwardingAddress();
       USE(this);
-      DCHECK_IMPLIES(marking_state()->IsWhite(obj), obj.IsFreeSpaceOrFiller());
+      DCHECK_IMPLIES(marking_state->IsWhite(obj), obj.IsFreeSpaceOrFiller());
       if (dest.InSharedHeap()) {
         // Object got promoted into the shared heap. Drop it from the client
         // heap marking worklist.
@@ -476,7 +508,7 @@ void IncrementalMarking::UpdateMarkingWorklistAfterYoungGenGC() {
       DCHECK_IMPLIES(
           v8_flags.minor_mc,
           !obj.map_word(cage_base, kRelaxedLoad).IsForwardingAddress());
-      if (minor_marking_state->IsWhite(obj)) {
+      if (marking_state->IsWhite(obj)) {
         return false;
       }
       // Either a large object or an object marked by the minor
@@ -488,13 +520,13 @@ void IncrementalMarking::UpdateMarkingWorklistAfterYoungGenGC() {
       // Only applicable during minor MC garbage collections.
       if (!Heap::IsLargeObject(obj) &&
           Page::FromHeapObject(obj)->IsFlagSet(Page::PAGE_NEW_OLD_PROMOTION)) {
-        if (minor_marking_state->IsWhite(obj)) {
+        if (marking_state->IsWhite(obj)) {
           return false;
         }
         *out = obj;
         return true;
       }
-      DCHECK_IMPLIES(marking_state()->IsWhite(obj),
+      DCHECK_IMPLIES(marking_state->IsWhite(obj),
                      obj.IsFreeSpaceOrFiller(cage_base));
       // Skip one word filler objects that appear on the
       // stack when we perform in place array shift.
@@ -730,6 +762,7 @@ void IncrementalMarking::AdvanceAndFinalizeIfComplete() {
 }
 
 void IncrementalMarking::AdvanceAndFinalizeIfNecessary() {
+  if (!IsMajorMarking()) return;
   DCHECK(!heap_->always_allocate());
   AdvanceOnAllocation();
 
@@ -746,7 +779,7 @@ void IncrementalMarking::AdvanceForTesting(double max_step_size_in_ms) {
 void IncrementalMarking::AdvanceOnAllocation() {
   DCHECK_EQ(heap_->gc_state(), Heap::NOT_IN_GC);
   DCHECK(v8_flags.incremental_marking);
-  DCHECK(IsMarking());
+  DCHECK(IsMajorMarking());
 
   // Code using an AlwaysAllocateScope assumes that the GC state does not
   // change; that implies that no marking steps must be performed.
diff --git a/deps/v8/src/heap/incremental-marking.h b/deps/v8/src/heap/incremental-marking.h
index de99330123cc9f..a3fb20a0af1b83 100644
--- a/deps/v8/src/heap/incremental-marking.h
+++ b/deps/v8/src/heap/incremental-marking.h
@@ -86,12 +86,6 @@ class V8_EXPORT_PRIVATE IncrementalMarking final {
 
   IncrementalMarking(Heap* heap, WeakObjects* weak_objects);
 
-  MarkingState* marking_state() { return &marking_state_; }
-  AtomicMarkingState* atomic_marking_state() { return &atomic_marking_state_; }
-  NonAtomicMarkingState* non_atomic_marking_state() {
-    return &non_atomic_marking_state_;
-  }
-
   void NotifyLeftTrimming(HeapObject from, HeapObject to);
 
   bool IsStopped() const { return !IsMarking(); }
@@ -169,6 +163,9 @@ class V8_EXPORT_PRIVATE IncrementalMarking final {
   }
 
  private:
+  MarkingState* marking_state() { return marking_state_; }
+  AtomicMarkingState* atomic_marking_state() { return atomic_marking_state_; }
+
   class IncrementalMarkingRootMarkingVisitor;
 
   class Observer : public AllocationObserver {
@@ -270,9 +267,8 @@ class V8_EXPORT_PRIVATE IncrementalMarking final {
   Observer new_generation_observer_;
   Observer old_generation_observer_;
 
-  MarkingState marking_state_;
-  AtomicMarkingState atomic_marking_state_;
-  NonAtomicMarkingState non_atomic_marking_state_;
+  MarkingState* const marking_state_;
+  AtomicMarkingState* const atomic_marking_state_;
 
   base::Mutex background_live_bytes_mutex_;
   std::unordered_map<MemoryChunk*, intptr_t> background_live_bytes_;
diff --git a/deps/v8/src/heap/invalidated-slots-inl.h b/deps/v8/src/heap/invalidated-slots-inl.h
index 5c776ff3fb3df6..3ab25a0c7ef21f 100644
--- a/deps/v8/src/heap/invalidated-slots-inl.h
+++ b/deps/v8/src/heap/invalidated-slots-inl.h
@@ -7,6 +7,7 @@
 
 #include "src/base/logging.h"
 #include "src/heap/invalidated-slots.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/spaces.h"
 #include "src/objects/heap-object.h"
 #include "src/objects/objects-inl.h"
diff --git a/deps/v8/src/heap/invalidated-slots.cc b/deps/v8/src/heap/invalidated-slots.cc
index 696b7f318aa8d5..d17394cc2c9725 100644
--- a/deps/v8/src/heap/invalidated-slots.cc
+++ b/deps/v8/src/heap/invalidated-slots.cc
@@ -34,7 +34,10 @@ InvalidatedSlotsFilter InvalidatedSlotsFilter::OldToShared(
 
 InvalidatedSlotsFilter::InvalidatedSlotsFilter(
     MemoryChunk* chunk, InvalidatedSlots* invalidated_slots,
-    RememberedSetType remembered_set_type, LivenessCheck liveness_check) {
+    RememberedSetType remembered_set_type, LivenessCheck liveness_check)
+    : marking_state_(liveness_check == LivenessCheck::kYes
+                         ? chunk->heap()->non_atomic_marking_state()
+                         : nullptr) {
   USE(remembered_set_type);
   invalidated_slots = invalidated_slots ? invalidated_slots : &empty_;
 
@@ -42,14 +45,6 @@ InvalidatedSlotsFilter::InvalidatedSlotsFilter(
   iterator_end_ = invalidated_slots->end();
   sentinel_ = chunk->area_end();
 
-  if (liveness_check == LivenessCheck::kYes) {
-    marking_state_ =
-        chunk->heap()->mark_compact_collector()->non_atomic_marking_state();
-  } else {
-    DCHECK_EQ(LivenessCheck::kNo, liveness_check);
-    marking_state_ = nullptr;
-  }
-
   // Invoke NextInvalidatedObject twice, to initialize
   // invalidated_start_ to the first invalidated object and
   // next_invalidated_object_ to the second one.
diff --git a/deps/v8/src/heap/invalidated-slots.h b/deps/v8/src/heap/invalidated-slots.h
index cace4202c6ddb5..1215664575bcad 100644
--- a/deps/v8/src/heap/invalidated-slots.h
+++ b/deps/v8/src/heap/invalidated-slots.h
@@ -64,7 +64,7 @@ class V8_EXPORT_PRIVATE InvalidatedSlotsFilter {
   Address sentinel_;
   InvalidatedObjectInfo current_{kNullAddress, 0, false};
   InvalidatedObjectInfo next_{kNullAddress, 0, false};
-  NonAtomicMarkingState* marking_state_;
+  NonAtomicMarkingState* const marking_state_;
   InvalidatedSlots empty_;
 #ifdef DEBUG
   Address last_slot_;
diff --git a/deps/v8/src/heap/large-spaces.cc b/deps/v8/src/heap/large-spaces.cc
index 74c621e81f1066..20697a2fd466bd 100644
--- a/deps/v8/src/heap/large-spaces.cc
+++ b/deps/v8/src/heap/large-spaces.cc
@@ -11,6 +11,7 @@
 #include "src/heap/combined-heap.h"
 #include "src/heap/incremental-marking.h"
 #include "src/heap/list.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/marking.h"
 #include "src/heap/memory-allocator.h"
 #include "src/heap/memory-chunk-inl.h"
@@ -132,6 +133,7 @@ AllocationResult OldLargeObjectSpace::AllocateRaw(int object_size) {
 
 AllocationResult OldLargeObjectSpace::AllocateRaw(int object_size,
                                                   Executability executable) {
+  object_size = ALIGN_TO_ALLOCATION_ALIGNMENT(object_size);
   DCHECK(!v8_flags.enable_third_party_heap);
   // Check if we want to force a GC before growing the old space further.
   // If so, fail the allocation.
@@ -150,11 +152,10 @@ AllocationResult OldLargeObjectSpace::AllocateRaw(int object_size,
       heap()->GCFlagsForIncrementalMarking(),
       kGCCallbackScheduleIdleGarbageCollection);
   if (heap()->incremental_marking()->black_allocation()) {
-    heap()->incremental_marking()->marking_state()->WhiteToBlack(object);
+    heap()->marking_state()->WhiteToBlack(object);
   }
-  DCHECK_IMPLIES(
-      heap()->incremental_marking()->black_allocation(),
-      heap()->incremental_marking()->marking_state()->IsBlack(object));
+  DCHECK_IMPLIES(heap()->incremental_marking()->black_allocation(),
+                 heap()->marking_state()->IsBlack(object));
   page->InitializationMemoryFence();
   heap()->NotifyOldGenerationExpansion(identity(), page);
   AdvanceAndInvokeAllocationObservers(object.address(),
@@ -169,6 +170,7 @@ AllocationResult OldLargeObjectSpace::AllocateRawBackground(
 
 AllocationResult OldLargeObjectSpace::AllocateRawBackground(
     LocalHeap* local_heap, int object_size, Executability executable) {
+  object_size = ALIGN_TO_ALLOCATION_ALIGNMENT(object_size);
   DCHECK(!v8_flags.enable_third_party_heap);
   // Check if we want to force a GC before growing the old space further.
   // If so, fail the allocation.
@@ -183,11 +185,10 @@ AllocationResult OldLargeObjectSpace::AllocateRawBackground(
   HeapObject object = page->GetObject();
   heap()->StartIncrementalMarkingIfAllocationLimitIsReachedBackground();
   if (heap()->incremental_marking()->black_allocation()) {
-    heap()->incremental_marking()->marking_state()->WhiteToBlack(object);
+    heap()->marking_state()->WhiteToBlack(object);
   }
-  DCHECK_IMPLIES(
-      heap()->incremental_marking()->black_allocation(),
-      heap()->incremental_marking()->marking_state()->IsBlack(object));
+  DCHECK_IMPLIES(heap()->incremental_marking()->black_allocation(),
+                 heap()->marking_state()->IsBlack(object));
   page->InitializationMemoryFence();
   if (identity() == CODE_LO_SPACE) {
     heap()->isolate()->AddCodeMemoryChunk(page);
@@ -478,6 +479,7 @@ NewLargeObjectSpace::NewLargeObjectSpace(Heap* heap, size_t capacity)
       capacity_(capacity) {}
 
 AllocationResult NewLargeObjectSpace::AllocateRaw(int object_size) {
+  object_size = ALIGN_TO_ALLOCATION_ALIGNMENT(object_size);
   DCHECK(!v8_flags.enable_third_party_heap);
   // Do not allocate more objects if promoting the existing object would exceed
   // the old generation capacity.
@@ -501,10 +503,7 @@ AllocationResult NewLargeObjectSpace::AllocateRaw(int object_size) {
   page->SetFlag(MemoryChunk::TO_PAGE);
   UpdatePendingObject(result);
   if (v8_flags.minor_mc) {
-    heap()
-        ->minor_mark_compact_collector()
-        ->non_atomic_marking_state()
-        ->ClearLiveness(page);
+    heap()->non_atomic_marking_state()->ClearLiveness(page);
   }
   page->InitializationMemoryFence();
   DCHECK(page->IsLargePage());
@@ -582,5 +581,15 @@ void CodeLargeObjectSpace::RemovePage(LargePage* page) {
   OldLargeObjectSpace::RemovePage(page);
 }
 
+SharedLargeObjectSpace::SharedLargeObjectSpace(Heap* heap)
+    : OldLargeObjectSpace(heap, SHARED_LO_SPACE) {}
+
+AllocationResult SharedLargeObjectSpace::AllocateRawBackground(
+    LocalHeap* local_heap, int object_size) {
+  DCHECK(!v8_flags.enable_third_party_heap);
+  return OldLargeObjectSpace::AllocateRawBackground(local_heap, object_size,
+                                                    NOT_EXECUTABLE);
+}
+
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/heap/large-spaces.h b/deps/v8/src/heap/large-spaces.h
index 70c55833e18ded..576c672fff49c0 100644
--- a/deps/v8/src/heap/large-spaces.h
+++ b/deps/v8/src/heap/large-spaces.h
@@ -190,6 +190,14 @@ class OldLargeObjectSpace : public LargeObjectSpace {
       LocalHeap* local_heap, int object_size, Executability executable);
 };
 
+class SharedLargeObjectSpace : public OldLargeObjectSpace {
+ public:
+  explicit SharedLargeObjectSpace(Heap* heap);
+
+  V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT AllocationResult
+  AllocateRawBackground(LocalHeap* local_heap, int object_size);
+};
+
 class NewLargeObjectSpace : public LargeObjectSpace {
  public:
   NewLargeObjectSpace(Heap* heap, size_t capacity);
diff --git a/deps/v8/src/heap/linear-allocation-area.h b/deps/v8/src/heap/linear-allocation-area.h
index 2b9b3a9132d84b..873dd31f7f2ca6 100644
--- a/deps/v8/src/heap/linear-allocation-area.h
+++ b/deps/v8/src/heap/linear-allocation-area.h
@@ -98,7 +98,11 @@ class LinearAllocationArea final {
 #ifdef DEBUG
     SLOW_DCHECK(start_ <= top_);
     SLOW_DCHECK(top_ <= limit_);
-    SLOW_DCHECK(top_ == kNullAddress || (top_ & kHeapObjectTagMask) == 0);
+    if (V8_COMPRESS_POINTERS_8GB_BOOL) {
+      SLOW_DCHECK(IsAligned(top_, kObjectAlignment8GbHeap));
+    } else {
+      SLOW_DCHECK(IsAligned(top_, kObjectAlignment));
+    }
 #endif  // DEBUG
   }
 
diff --git a/deps/v8/src/heap/local-heap-inl.h b/deps/v8/src/heap/local-heap-inl.h
index cb6210fd571f43..401b7a4903ba2a 100644
--- a/deps/v8/src/heap/local-heap-inl.h
+++ b/deps/v8/src/heap/local-heap-inl.h
@@ -64,7 +64,8 @@ AllocationResult LocalHeap::AllocateRaw(int size_in_bytes, AllocationType type,
 
   DCHECK_EQ(type, AllocationType::kSharedOld);
   if (large_object) {
-    return heap()->code_lo_space()->AllocateRawBackground(this, size_in_bytes);
+    return heap()->shared_lo_allocation_space()->AllocateRawBackground(
+        this, size_in_bytes);
   } else {
     return shared_old_space_allocator()->AllocateRaw(size_in_bytes, alignment,
                                                      origin);
@@ -74,6 +75,7 @@ AllocationResult LocalHeap::AllocateRaw(int size_in_bytes, AllocationType type,
 Address LocalHeap::AllocateRawOrFail(int object_size, AllocationType type,
                                      AllocationOrigin origin,
                                      AllocationAlignment alignment) {
+  object_size = ALIGN_TO_ALLOCATION_ALIGNMENT(object_size);
   DCHECK(!v8_flags.enable_third_party_heap);
   AllocationResult result = AllocateRaw(object_size, type, origin, alignment);
   HeapObject object;
diff --git a/deps/v8/src/heap/local-heap.cc b/deps/v8/src/heap/local-heap.cc
index 611537708bb6dc..1541683ee59d7b 100644
--- a/deps/v8/src/heap/local-heap.cc
+++ b/deps/v8/src/heap/local-heap.cc
@@ -85,6 +85,7 @@ LocalHeap::~LocalHeap() {
 
   heap_->safepoint()->RemoveLocalHeap(this, [this] {
     FreeLinearAllocationArea();
+    FreeSharedLinearAllocationArea();
 
     if (!is_main_thread()) {
       CodePageHeaderModificationScope rwx_write_scope(
@@ -120,9 +121,9 @@ void LocalHeap::SetUp() {
       std::make_unique<ConcurrentAllocator>(this, heap_->code_space());
 
   DCHECK_NULL(shared_old_space_allocator_);
-  if (heap_->isolate()->shared_isolate()) {
-    shared_old_space_allocator_ =
-        std::make_unique<ConcurrentAllocator>(this, heap_->shared_old_space());
+  if (heap_->isolate()->has_shared_heap()) {
+    shared_old_space_allocator_ = std::make_unique<ConcurrentAllocator>(
+        this, heap_->shared_allocation_space());
   }
 
   DCHECK_NULL(marking_barrier_);
@@ -347,7 +348,9 @@ void LocalHeap::FreeLinearAllocationArea() {
 }
 
 void LocalHeap::FreeSharedLinearAllocationArea() {
-  shared_old_space_allocator_->FreeLinearAllocationArea();
+  if (shared_old_space_allocator_) {
+    shared_old_space_allocator_->FreeLinearAllocationArea();
+  }
 }
 
 void LocalHeap::MakeLinearAllocationAreaIterable() {
@@ -365,26 +368,15 @@ void LocalHeap::UnmarkLinearAllocationArea() {
   code_space_allocator_->UnmarkLinearAllocationArea();
 }
 
-bool LocalHeap::TryPerformCollection() {
-  if (is_main_thread()) {
-    heap_->CollectGarbageForBackground(this);
-    return true;
-  } else {
-    DCHECK(IsRunning());
-    if (!heap_->collection_barrier_->TryRequestGC()) return false;
-
-    LocalHeap* main_thread = heap_->main_thread_local_heap();
-
-    const ThreadState old_state = main_thread->state_.SetCollectionRequested();
+void LocalHeap::MarkSharedLinearAllocationAreaBlack() {
+  if (shared_old_space_allocator_) {
+    shared_old_space_allocator_->MarkLinearAllocationAreaBlack();
+  }
+}
 
-    if (old_state.IsRunning()) {
-      const bool performed_gc =
-          heap_->collection_barrier_->AwaitCollectionBackground(this);
-      return performed_gc;
-    } else {
-      DCHECK(old_state.IsParked());
-      return false;
-    }
+void LocalHeap::UnmarkSharedLinearAllocationArea() {
+  if (shared_old_space_allocator_) {
+    shared_old_space_allocator_->UnmarkLinearAllocationArea();
   }
 }
 
@@ -395,21 +387,34 @@ Address LocalHeap::PerformCollectionAndAllocateAgain(
   CHECK(!main_thread_parked_);
   allocation_failed_ = true;
   static const int kMaxNumberOfRetries = 3;
+  int failed_allocations = 0;
+  int parked_allocations = 0;
 
   for (int i = 0; i < kMaxNumberOfRetries; i++) {
-    if (!TryPerformCollection()) {
+    if (!heap_->CollectGarbageFromAnyThread(this)) {
       main_thread_parked_ = true;
+      parked_allocations++;
     }
 
     AllocationResult result = AllocateRaw(object_size, type, origin, alignment);
 
-    if (!result.IsFailure()) {
+    if (result.IsFailure()) {
+      failed_allocations++;
+    } else {
       allocation_failed_ = false;
       main_thread_parked_ = false;
       return result.ToObjectChecked().address();
     }
   }
 
+  if (v8_flags.trace_gc) {
+    heap_->isolate()->PrintWithTimestamp(
+        "Background allocation failure: "
+        "allocations=%d"
+        "allocations.parked=%d",
+        failed_allocations, parked_allocations);
+  }
+
   heap_->FatalProcessOutOfMemory("LocalHeap: allocation failed");
 }
 
@@ -433,9 +438,11 @@ void LocalHeap::InvokeGCEpilogueCallbacksInSafepoint(GCType gc_type,
 
 void LocalHeap::NotifyObjectSizeChange(
     HeapObject object, int old_size, int new_size,
-    ClearRecordedSlots clear_recorded_slots) {
+    ClearRecordedSlots clear_recorded_slots,
+    UpdateInvalidatedObjectSize update_invalidated_object_size) {
   heap()->NotifyObjectSizeChange(object, old_size, new_size,
-                                 clear_recorded_slots);
+                                 clear_recorded_slots,
+                                 update_invalidated_object_size);
 }
 
 }  // namespace internal
diff --git a/deps/v8/src/heap/local-heap.h b/deps/v8/src/heap/local-heap.h
index a4f0e49b0792fb..4e6437669a69a2 100644
--- a/deps/v8/src/heap/local-heap.h
+++ b/deps/v8/src/heap/local-heap.h
@@ -115,6 +115,11 @@ class V8_EXPORT_PRIVATE LocalHeap {
   void MarkLinearAllocationAreaBlack();
   void UnmarkLinearAllocationArea();
 
+  // Mark/Unmark linear allocation areas in shared heap black. Used for black
+  // allocation.
+  void MarkSharedLinearAllocationAreaBlack();
+  void UnmarkSharedLinearAllocationArea();
+
   // Give up linear allocation areas. Used for mark-compact GC.
   void FreeLinearAllocationArea();
 
@@ -149,8 +154,11 @@ class V8_EXPORT_PRIVATE LocalHeap {
       AllocationOrigin origin = AllocationOrigin::kRuntime,
       AllocationAlignment alignment = kTaggedAligned);
 
-  void NotifyObjectSizeChange(HeapObject object, int old_size, int new_size,
-                              ClearRecordedSlots clear_recorded_slots);
+  void NotifyObjectSizeChange(
+      HeapObject object, int old_size, int new_size,
+      ClearRecordedSlots clear_recorded_slots,
+      UpdateInvalidatedObjectSize update_invalidated_object_size =
+          UpdateInvalidatedObjectSize::kYes);
 
   bool is_main_thread() const { return is_main_thread_; }
   bool deserialization_complete() const {
@@ -158,9 +166,6 @@ class V8_EXPORT_PRIVATE LocalHeap {
   }
   ReadOnlySpace* read_only_space() { return heap_->read_only_space(); }
 
-  // Requests GC and blocks until the collection finishes.
-  bool TryPerformCollection();
-
   // Adds a callback that is invoked with the given |data| after each GC.
   // The callback is invoked on the main thread before any background thread
   // resumes. The callback must not allocate or make any other calls that
diff --git a/deps/v8/src/heap/mark-compact-inl.h b/deps/v8/src/heap/mark-compact-inl.h
index 2ce0abfe9a4453..1a14b388a0b662 100644
--- a/deps/v8/src/heap/mark-compact-inl.h
+++ b/deps/v8/src/heap/mark-compact-inl.h
@@ -9,7 +9,9 @@
 #include "src/codegen/assembler-inl.h"
 #include "src/heap/heap-inl.h"
 #include "src/heap/incremental-marking.h"
+#include "src/heap/index-generator.h"
 #include "src/heap/mark-compact.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/marking-worklist-inl.h"
 #include "src/heap/marking-worklist.h"
 #include "src/heap/objects-visiting-inl.h"
@@ -42,7 +44,7 @@ void MarkCompactCollector::MarkRootObject(Root root, HeapObject obj) {
 
 void MinorMarkCompactCollector::MarkRootObject(HeapObject obj) {
   if (Heap::InYoungGeneration(obj) &&
-      non_atomic_marking_state_.WhiteToGrey(obj)) {
+      non_atomic_marking_state()->WhiteToGrey(obj)) {
     local_marking_worklists_->Push(obj);
   }
 }
@@ -88,6 +90,16 @@ void MarkCompactCollector::AddTransitionArray(TransitionArray array) {
   local_weak_objects()->transition_arrays_local.Push(array);
 }
 
+bool MarkCompactCollector::ShouldMarkObject(HeapObject object) const {
+  if (V8_LIKELY(!uses_shared_heap_)) return true;
+  if (v8_flags.shared_space) {
+    if (is_shared_heap_isolate_) return true;
+    return !object.InSharedHeap();
+  } else {
+    return is_shared_heap_isolate_ == object.InSharedHeap();
+  }
+}
+
 template <typename MarkingState>
 template <typename T, typename TBodyDescriptor>
 int MainMarkingVisitor<MarkingState>::VisitJSObjectSubclass(Map map, T object) {
@@ -199,8 +211,9 @@ void LiveObjectRange<mode>::iterator::AdvanceToNextValidObject() {
         // Map might be forwarded during GC.
         DCHECK(MarkCompactCollector::IsMapOrForwarded(map));
         size = black_object.SizeFromMap(map);
-        CHECK_LE(addr + size, chunk_->area_end());
-        Address end = addr + size - kTaggedSize;
+        int aligned_size = ALIGN_TO_ALLOCATION_ALIGNMENT(size);
+        CHECK_LE(addr + aligned_size, chunk_->area_end());
+        Address end = addr + aligned_size - kTaggedSize;
         // One word filler objects do not borrow the second mark bit. We have
         // to jump over the advancing and clearing part.
         // Note that we know that we are at a one word filler when
@@ -231,7 +244,8 @@ void LiveObjectRange<mode>::iterator::AdvanceToNextValidObject() {
         map = Map::cast(map_object);
         DCHECK(map.IsMap(cage_base));
         size = object.SizeFromMap(map);
-        CHECK_LE(addr + size, chunk_->area_end());
+        CHECK_LE(addr + ALIGN_TO_ALLOCATION_ALIGNMENT(size),
+                 chunk_->area_end());
       }
 
       // We found a live object.
@@ -281,6 +295,64 @@ typename LiveObjectRange<mode>::iterator LiveObjectRange<mode>::end() {
 
 Isolate* CollectorBase::isolate() { return heap()->isolate(); }
 
+class YoungGenerationMarkingTask;
+
+class PageMarkingItem : public ParallelWorkItem {
+ public:
+  explicit PageMarkingItem(MemoryChunk* chunk) : chunk_(chunk) {}
+  ~PageMarkingItem() = default;
+
+  void Process(YoungGenerationMarkingTask* task);
+
+ private:
+  inline Heap* heap() { return chunk_->heap(); }
+
+  void MarkUntypedPointers(YoungGenerationMarkingTask* task);
+
+  void MarkTypedPointers(YoungGenerationMarkingTask* task);
+
+  template <typename TSlot>
+  V8_INLINE SlotCallbackResult
+  CheckAndMarkObject(YoungGenerationMarkingTask* task, TSlot slot);
+
+  MemoryChunk* chunk_;
+};
+
+enum class YoungMarkingJobType { kAtomic, kIncremental };
+
+class YoungGenerationMarkingJob : public v8::JobTask {
+ public:
+  YoungGenerationMarkingJob(Isolate* isolate, Heap* heap,
+                            MarkingWorklists* global_worklists,
+                            std::vector<PageMarkingItem> marking_items,
+                            YoungMarkingJobType young_marking_job_type)
+      : isolate_(isolate),
+        heap_(heap),
+        global_worklists_(global_worklists),
+        marking_items_(std::move(marking_items)),
+        remaining_marking_items_(marking_items_.size()),
+        generator_(marking_items_.size()),
+        young_marking_job_type_(young_marking_job_type) {}
+
+  void Run(JobDelegate* delegate) override;
+  size_t GetMaxConcurrency(size_t worker_count) const override;
+  bool incremental() const {
+    return young_marking_job_type_ == YoungMarkingJobType::kIncremental;
+  }
+
+ private:
+  void ProcessItems(JobDelegate* delegate);
+  void ProcessMarkingItems(YoungGenerationMarkingTask* task);
+
+  Isolate* isolate_;
+  Heap* heap_;
+  MarkingWorklists* global_worklists_;
+  std::vector<PageMarkingItem> marking_items_;
+  std::atomic_size_t remaining_marking_items_{0};
+  IndexGenerator generator_;
+  YoungMarkingJobType young_marking_job_type_;
+};
+
 }  // namespace internal
 }  // namespace v8
 
diff --git a/deps/v8/src/heap/mark-compact.cc b/deps/v8/src/heap/mark-compact.cc
index 5fd704b6229d38..180aabb5f5e5d6 100644
--- a/deps/v8/src/heap/mark-compact.cc
+++ b/deps/v8/src/heap/mark-compact.cc
@@ -19,12 +19,14 @@
 #include "src/execution/isolate-utils-inl.h"
 #include "src/execution/isolate-utils.h"
 #include "src/execution/vm-state-inl.h"
+#include "src/flags/flags.h"
 #include "src/handles/global-handles.h"
 #include "src/heap/array-buffer-sweeper.h"
 #include "src/heap/basic-memory-chunk.h"
 #include "src/heap/code-object-registry.h"
 #include "src/heap/concurrent-allocator.h"
 #include "src/heap/evacuation-allocator-inl.h"
+#include "src/heap/evacuation-verifier-inl.h"
 #include "src/heap/gc-tracer-inl.h"
 #include "src/heap/gc-tracer.h"
 #include "src/heap/global-handle-marking-visitor.h"
@@ -36,6 +38,7 @@
 #include "src/heap/large-spaces.h"
 #include "src/heap/mark-compact-inl.h"
 #include "src/heap/marking-barrier.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/marking-visitor-inl.h"
 #include "src/heap/marking-visitor.h"
 #include "src/heap/memory-chunk-layout.h"
@@ -46,6 +49,8 @@
 #include "src/heap/object-stats.h"
 #include "src/heap/objects-visiting-inl.h"
 #include "src/heap/parallel-work-item.h"
+#include "src/heap/pretenuring-handler-inl.h"
+#include "src/heap/pretenuring-handler.h"
 #include "src/heap/read-only-heap.h"
 #include "src/heap/read-only-spaces.h"
 #include "src/heap/remembered-set.h"
@@ -218,8 +223,7 @@ class FullMarkingVerifier : public MarkingVerifier {
  public:
   explicit FullMarkingVerifier(Heap* heap)
       : MarkingVerifier(heap),
-        marking_state_(
-            heap->mark_compact_collector()->non_atomic_marking_state()) {}
+        marking_state_(heap->non_atomic_marking_state()) {}
 
   void Run() override {
     VerifyRoots();
@@ -227,9 +231,11 @@ class FullMarkingVerifier : public MarkingVerifier {
     VerifyMarking(heap_->new_lo_space());
     VerifyMarking(heap_->old_space());
     VerifyMarking(heap_->code_space());
+    if (heap_->shared_space()) VerifyMarking(heap_->shared_space());
     if (heap_->map_space()) VerifyMarking(heap_->map_space());
     VerifyMarking(heap_->lo_space());
     VerifyMarking(heap_->code_lo_space());
+    if (heap_->shared_lo_space()) VerifyMarking(heap_->shared_lo_space());
   }
 
  protected:
@@ -281,9 +287,7 @@ class FullMarkingVerifier : public MarkingVerifier {
 
  private:
   V8_INLINE void VerifyHeapObjectImpl(HeapObject heap_object) {
-    if (heap_->IsShared() !=
-        BasicMemoryChunk::FromHeapObject(heap_object)->InSharedHeap())
-      return;
+    if (!ShouldVerifyObject(heap_object)) return;
 
     if (heap_->MustBeInSharedOldSpace(heap_object)) {
       CHECK(heap_->SharedHeapContains(heap_object));
@@ -292,6 +296,12 @@ class FullMarkingVerifier : public MarkingVerifier {
     CHECK(marking_state_->IsBlack(heap_object));
   }
 
+  V8_INLINE bool ShouldVerifyObject(HeapObject heap_object) {
+    const bool in_shared_heap = heap_object.InSharedWritableHeap();
+    return heap_->isolate()->is_shared_heap_isolate() ? in_shared_heap
+                                                      : !in_shared_heap;
+  }
+
   template <typename TSlot>
   V8_INLINE void VerifyPointersImpl(TSlot start, TSlot end) {
     for (TSlot slot = start; slot < end; ++slot) {
@@ -303,170 +313,15 @@ class FullMarkingVerifier : public MarkingVerifier {
     }
   }
 
-  NonAtomicMarkingState* marking_state_;
-};
-
-class EvacuationVerifier : public ObjectVisitorWithCageBases,
-                           public RootVisitor {
- public:
-  virtual void Run() = 0;
-
-  void VisitPointers(HeapObject host, ObjectSlot start,
-                     ObjectSlot end) override {
-    VerifyPointers(start, end);
-  }
-
-  void VisitPointers(HeapObject host, MaybeObjectSlot start,
-                     MaybeObjectSlot end) override {
-    VerifyPointers(start, end);
-  }
-
-  void VisitCodePointer(HeapObject host, CodeObjectSlot slot) override {
-    CHECK(V8_EXTERNAL_CODE_SPACE_BOOL);
-    VerifyCodePointer(slot);
-  }
-
-  void VisitRootPointers(Root root, const char* description,
-                         FullObjectSlot start, FullObjectSlot end) override {
-    VerifyRootPointers(start, end);
-  }
-
-  void VisitMapPointer(HeapObject object) override {
-    VerifyMap(object.map(cage_base()));
-  }
-
- protected:
-  explicit EvacuationVerifier(Heap* heap)
-      : ObjectVisitorWithCageBases(heap), heap_(heap) {}
-
-  inline Heap* heap() { return heap_; }
-
-  virtual void VerifyMap(Map map) = 0;
-  virtual void VerifyPointers(ObjectSlot start, ObjectSlot end) = 0;
-  virtual void VerifyPointers(MaybeObjectSlot start, MaybeObjectSlot end) = 0;
-  virtual void VerifyCodePointer(CodeObjectSlot slot) = 0;
-  virtual void VerifyRootPointers(FullObjectSlot start, FullObjectSlot end) = 0;
-
-  void VerifyRoots();
-  void VerifyEvacuationOnPage(Address start, Address end);
-  void VerifyEvacuation(NewSpace* new_space);
-  void VerifyEvacuation(PagedSpaceBase* paged_space);
-
-  Heap* heap_;
-};
-
-void EvacuationVerifier::VerifyRoots() {
-  heap_->IterateRootsIncludingClients(this,
-                                      base::EnumSet<SkipRoot>{SkipRoot::kWeak});
-}
-
-void EvacuationVerifier::VerifyEvacuationOnPage(Address start, Address end) {
-  Address current = start;
-  while (current < end) {
-    HeapObject object = HeapObject::FromAddress(current);
-    if (!object.IsFreeSpaceOrFiller(cage_base())) {
-      object.Iterate(cage_base(), this);
-    }
-    current += object.Size(cage_base());
-  }
-}
-
-void EvacuationVerifier::VerifyEvacuation(NewSpace* space) {
-  if (!space) return;
-  if (v8_flags.minor_mc) {
-    VerifyEvacuation(PagedNewSpace::From(space)->paged_space());
-    return;
-  }
-  PageRange range(space->first_allocatable_address(), space->top());
-  for (auto it = range.begin(); it != range.end();) {
-    Page* page = *(it++);
-    Address current = page->area_start();
-    Address limit = it != range.end() ? page->area_end() : space->top();
-    CHECK(limit == space->top() || !page->Contains(space->top()));
-    VerifyEvacuationOnPage(current, limit);
-  }
-}
-
-void EvacuationVerifier::VerifyEvacuation(PagedSpaceBase* space) {
-  for (Page* p : *space) {
-    if (p->IsEvacuationCandidate()) continue;
-    if (p->Contains(space->top())) {
-      CodePageMemoryModificationScope memory_modification_scope(p);
-      heap_->CreateFillerObjectAt(
-          space->top(), static_cast<int>(space->limit() - space->top()));
-    }
-    VerifyEvacuationOnPage(p->area_start(), p->area_end());
-  }
-}
-
-class FullEvacuationVerifier : public EvacuationVerifier {
- public:
-  explicit FullEvacuationVerifier(Heap* heap) : EvacuationVerifier(heap) {}
-
-  void Run() override {
-    DCHECK(!heap_->mark_compact_collector()->sweeping_in_progress());
-    VerifyRoots();
-    VerifyEvacuation(heap_->new_space());
-    VerifyEvacuation(heap_->old_space());
-    VerifyEvacuation(heap_->code_space());
-    if (heap_->map_space()) VerifyEvacuation(heap_->map_space());
-  }
-
- protected:
-  V8_INLINE void VerifyHeapObjectImpl(HeapObject heap_object) {
-    if (heap_->IsShared() !=
-        BasicMemoryChunk::FromHeapObject(heap_object)->InSharedHeap())
-      return;
-
-    CHECK_IMPLIES(Heap::InYoungGeneration(heap_object),
-                  Heap::InToPage(heap_object));
-    CHECK(!MarkCompactCollector::IsOnEvacuationCandidate(heap_object));
-  }
-
-  template <typename TSlot>
-  void VerifyPointersImpl(TSlot start, TSlot end) {
-    for (TSlot current = start; current < end; ++current) {
-      typename TSlot::TObject object = current.load(cage_base());
-      HeapObject heap_object;
-      if (object.GetHeapObjectIfStrong(&heap_object)) {
-        VerifyHeapObjectImpl(heap_object);
-      }
-    }
-  }
-  void VerifyMap(Map map) override { VerifyHeapObjectImpl(map); }
-  void VerifyPointers(ObjectSlot start, ObjectSlot end) override {
-    VerifyPointersImpl(start, end);
-  }
-  void VerifyPointers(MaybeObjectSlot start, MaybeObjectSlot end) override {
-    VerifyPointersImpl(start, end);
-  }
-  void VerifyCodePointer(CodeObjectSlot slot) override {
-    CHECK(V8_EXTERNAL_CODE_SPACE_BOOL);
-    Object maybe_code = slot.load(code_cage_base());
-    HeapObject code;
-    // The slot might contain smi during CodeDataContainer creation, so skip it.
-    if (maybe_code.GetHeapObject(&code)) {
-      VerifyHeapObjectImpl(code);
-    }
-  }
-  void VisitCodeTarget(Code host, RelocInfo* rinfo) override {
-    Code target = Code::GetCodeFromTargetAddress(rinfo->target_address());
-    VerifyHeapObjectImpl(target);
-  }
-  void VisitEmbeddedPointer(Code host, RelocInfo* rinfo) override {
-    VerifyHeapObjectImpl(rinfo->target_object(cage_base()));
-  }
-  void VerifyRootPointers(FullObjectSlot start, FullObjectSlot end) override {
-    VerifyPointersImpl(start, end);
-  }
+  NonAtomicMarkingState* const marking_state_;
 };
 
 }  // namespace
 #endif  // VERIFY_HEAP
 
-// =============================================================================
-// MarkCompactCollectorBase, MinorMarkCompactCollector, MarkCompactCollector
-// =============================================================================
+// ==================================================================
+// CollectorBase, MinorMarkCompactCollector, MarkCompactCollector
+// ==================================================================
 
 namespace {
 
@@ -492,8 +347,8 @@ int NumberOfParallelCompactionTasks(Heap* heap) {
 CollectorBase::CollectorBase(Heap* heap, GarbageCollector collector)
     : heap_(heap),
       garbage_collector_(collector),
-      marking_state_(heap->isolate()),
-      non_atomic_marking_state_(heap->isolate()) {
+      marking_state_(heap_->marking_state()),
+      non_atomic_marking_state_(heap_->non_atomic_marking_state()) {
   DCHECK_NE(GarbageCollector::SCAVENGER, garbage_collector_);
 }
 
@@ -501,16 +356,120 @@ bool CollectorBase::IsMajorMC() {
   return !heap_->IsYoungGenerationCollector(garbage_collector_);
 }
 
+void CollectorBase::StartSweepSpace(PagedSpace* space) {
+  DCHECK_NE(NEW_SPACE, space->identity());
+  space->ClearAllocatorState();
+
+  int will_be_swept = 0;
+  bool unused_page_present = false;
+
+  Sweeper* sweeper = heap()->sweeper();
+
+  // Loop needs to support deletion if live bytes == 0 for a page.
+  for (auto it = space->begin(); it != space->end();) {
+    Page* p = *(it++);
+    DCHECK(p->SweepingDone());
+
+    if (p->IsEvacuationCandidate()) {
+      DCHECK_NE(NEW_SPACE, space->identity());
+      // Will be processed in Evacuate.
+      continue;
+    }
+
+    // One unused page is kept, all further are released before sweeping them.
+    if (non_atomic_marking_state()->live_bytes(p) == 0) {
+      if (unused_page_present) {
+        if (v8_flags.gc_verbose) {
+          PrintIsolate(isolate(), "sweeping: released page: %p",
+                       static_cast<void*>(p));
+        }
+        space->ReleasePage(p);
+        continue;
+      }
+      unused_page_present = true;
+    }
+
+    sweeper->AddPage(space->identity(), p, Sweeper::REGULAR);
+    will_be_swept++;
+  }
+
+  if (v8_flags.gc_verbose) {
+    PrintIsolate(isolate(), "sweeping: space=%s initialized_for_sweeping=%d",
+                 space->name(), will_be_swept);
+  }
+}
+
+void CollectorBase::StartSweepNewSpace() {
+  PagedSpaceForNewSpace* paged_space = heap()->paged_new_space()->paged_space();
+  paged_space->ClearAllocatorState();
+
+  int will_be_swept = 0;
+
+  if (heap()->ShouldReduceNewSpaceSize()) {
+    paged_space->StartShrinking();
+    is_new_space_shrinking_ = true;
+  }
+
+  Sweeper* sweeper = heap()->sweeper();
+
+  for (auto it = paged_space->begin(); it != paged_space->end();) {
+    Page* p = *(it++);
+    DCHECK(p->SweepingDone());
+
+    if (non_atomic_marking_state()->live_bytes(p) > 0) {
+      // Non-empty pages will be evacuated/promoted.
+      continue;
+    }
+
+    if (is_new_space_shrinking_ && paged_space->ShouldReleasePage()) {
+      paged_space->ReleasePage(p);
+    } else {
+      sweeper->AddNewSpacePage(p);
+    }
+    will_be_swept++;
+  }
+
+  if (v8_flags.gc_verbose) {
+    PrintIsolate(isolate(), "sweeping: space=%s initialized_for_sweeping=%d",
+                 paged_space->name(), will_be_swept);
+  }
+}
+
+void CollectorBase::SweepLargeSpace(LargeObjectSpace* space) {
+  auto* marking_state = heap()->non_atomic_marking_state();
+  PtrComprCageBase cage_base(heap()->isolate());
+  size_t surviving_object_size = 0;
+  for (auto it = space->begin(); it != space->end();) {
+    LargePage* current = *(it++);
+    HeapObject object = current->GetObject();
+    DCHECK(!marking_state->IsGrey(object));
+    if (!marking_state->IsBlack(object)) {
+      // Object is dead and page can be released.
+      space->RemovePage(current);
+      heap()->memory_allocator()->Free(MemoryAllocator::FreeMode::kConcurrently,
+                                       current);
+
+      continue;
+    }
+    Marking::MarkWhite(non_atomic_marking_state()->MarkBitFrom(object));
+    current->ProgressBar().ResetIfEnabled();
+    non_atomic_marking_state()->SetLiveBytes(current, 0);
+    surviving_object_size += static_cast<size_t>(object.Size(cage_base));
+  }
+  space->set_objects_size(surviving_object_size);
+}
+
 MarkCompactCollector::MarkCompactCollector(Heap* heap)
     : CollectorBase(heap, GarbageCollector::MARK_COMPACTOR),
 #ifdef DEBUG
       state_(IDLE),
 #endif
-      is_shared_heap_(heap->IsShared()),
-      sweeper_(new Sweeper(heap, non_atomic_marking_state())) {
+      uses_shared_heap_(isolate()->has_shared_heap() || isolate()->is_shared()),
+      is_shared_heap_isolate_(isolate()->is_shared_heap_isolate()),
+      sweeper_(heap_->sweeper()) {
 }
 
-MarkCompactCollector::~MarkCompactCollector() { delete sweeper_; }
+MarkCompactCollector::~MarkCompactCollector() = default;
 
 void MarkCompactCollector::SetUp() {
   DCHECK_EQ(0, strcmp(Marking::kWhiteBitPattern, "00"));
@@ -529,7 +488,6 @@ void MarkCompactCollector::TearDown() {
     local_weak_objects()->Publish();
     weak_objects()->Clear();
   }
-  sweeper()->TearDown();
 }
 
 // static
@@ -585,6 +543,10 @@ bool MarkCompactCollector::StartCompaction(StartCompactionMode mode) {
     CollectEvacuationCandidates(heap()->map_space());
   }
 
+  if (heap()->shared_space()) {
+    CollectEvacuationCandidates(heap()->shared_space());
+  }
+
   if (v8_flags.compact_code_space &&
       (!heap()->IsGCWithStack() || v8_flags.compact_code_space_with_stack)) {
     CollectEvacuationCandidates(heap()->code_space());
@@ -702,74 +664,6 @@ void MarkCompactCollector::VerifyMarkbitsAreClean() {
 
 #endif  // VERIFY_HEAP
 
-void MarkCompactCollector::FinishSweepingIfOutOfWork() {
-  if (sweeper()->sweeping_in_progress() && v8_flags.concurrent_sweeping &&
-      !sweeper()->AreSweeperTasksRunning()) {
-    // At this point we know that all concurrent sweeping tasks have run
-    // out of work and quit: all pages are swept. The main thread still needs
-    // to complete sweeping though.
-    EnsureSweepingCompleted(SweepingForcedFinalizationMode::kV8Only);
-  }
-  if (heap()->cpp_heap()) {
-    // Ensure that sweeping is also completed for the C++ managed heap, if one
-    // exists and it's out of work.
-    CppHeap::From(heap()->cpp_heap())->FinishSweepingIfOutOfWork();
-  }
-}
-
-void MarkCompactCollector::EnsureSweepingCompleted(
-    SweepingForcedFinalizationMode mode) {
-  if (sweeper()->sweeping_in_progress()) {
-    TRACE_GC_EPOCH(heap()->tracer(), GCTracer::Scope::MC_COMPLETE_SWEEPING,
-                   ThreadKind::kMain);
-
-    sweeper()->EnsureCompleted();
-    heap()->old_space()->RefillFreeList(sweeper());
-    {
-      CodePageHeaderModificationScope rwx_write_scope(
-          "Updating per-page stats stored in page headers requires write "
-          "access to Code page headers");
-      heap()->code_space()->RefillFreeList(sweeper());
-    }
-    if (heap()->map_space()) {
-      heap()->map_space()->RefillFreeList(sweeper());
-      heap()->map_space()->SortFreeList();
-    }
-
-    heap()->tracer()->NotifySweepingCompleted();
-
-#ifdef VERIFY_HEAP
-    if (v8_flags.verify_heap && !evacuation()) {
-      FullEvacuationVerifier verifier(heap());
-      verifier.Run();
-    }
-#endif
-  }
-
-  if (mode == SweepingForcedFinalizationMode::kUnifiedHeap &&
-      heap()->cpp_heap()) {
-    // Ensure that sweeping is also completed for the C++ managed heap, if one
-    // exists.
-    CppHeap::From(heap()->cpp_heap())->FinishSweepingIfRunning();
-    DCHECK(
-        !CppHeap::From(heap()->cpp_heap())->sweeper().IsSweepingInProgress());
-  }
-
-  DCHECK_IMPLIES(mode == SweepingForcedFinalizationMode::kUnifiedHeap ||
-                     !heap()->cpp_heap(),
-                 !heap()->tracer()->IsSweepingInProgress());
-}
-
-void MarkCompactCollector::EnsurePageIsSwept(Page* page) {
-  sweeper()->EnsurePageIsSwept(page);
-}
-
-void MarkCompactCollector::DrainSweepingWorklistForSpace(
-    AllocationSpace space) {
-  if (!sweeper()->sweeping_in_progress()) return;
-  sweeper()->DrainSweepingWorklistForSpace(space);
-}
-
 void MarkCompactCollector::ComputeEvacuationHeuristics(
     size_t area_size, int* target_fragmentation_percent,
     size_t* max_evacuated_bytes) {
@@ -820,7 +714,7 @@ void MarkCompactCollector::ComputeEvacuationHeuristics(
 
 void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
   DCHECK(space->identity() == OLD_SPACE || space->identity() == CODE_SPACE ||
-         space->identity() == MAP_SPACE);
+         space->identity() == MAP_SPACE || space->identity() == SHARED_SPACE);
 
   int number_of_pages = space->CountTotalPages();
   size_t area_size = space->AreaSize();
@@ -854,7 +748,7 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
   CodePageHeaderModificationScope rwx_write_scope(
       "Modification of Code page header flags requires write access");
 
-  DCHECK(!sweeping_in_progress());
+  DCHECK(!sweeper()->sweeping_in_progress());
   Page* owner_of_linear_allocation_area =
       space->top() == space->limit()
           ? nullptr
@@ -1002,7 +896,7 @@ void MarkCompactCollector::Prepare() {
   state_ = PREPARE_GC;
 #endif
 
-  DCHECK(!sweeping_in_progress());
+  DCHECK(!sweeper()->sweeping_in_progress());
 
   // Unmapper tasks needs to be stopped during the GC, otherwise pages queued
   // for freeing might get unmapped during the GC.
@@ -1031,22 +925,8 @@ void MarkCompactCollector::Prepare() {
 
   heap_->FreeLinearAllocationAreas();
 
-  PagedSpaceIterator spaces(heap());
-  for (PagedSpace* space = spaces.Next(); space != nullptr;
-       space = spaces.Next()) {
-    space->PrepareForMarkCompact();
-  }
-
-  // All objects are guaranteed to be initialized in atomic pause
-  if (heap()->new_lo_space()) {
-    heap()->new_lo_space()->ResetPendingObject();
-  }
-
   NewSpace* new_space = heap()->new_space();
   if (new_space) {
-    if (v8_flags.minor_mc) {
-      PagedNewSpace::From(new_space)->paged_space()->PrepareForMarkCompact();
-    }
     DCHECK_EQ(new_space->top(), new_space->original_top_acquire());
   }
 }
@@ -1081,6 +961,7 @@ void MarkCompactCollector::VerifyMarking() {
     heap()->old_space()->VerifyLiveBytes();
     if (heap()->map_space()) heap()->map_space()->VerifyLiveBytes();
     heap()->code_space()->VerifyLiveBytes();
+    if (heap()->shared_space()) heap()->shared_space()->VerifyLiveBytes();
     if (v8_flags.minor_mc && heap()->paged_new_space())
       heap()->paged_new_space()->paged_space()->VerifyLiveBytes();
   }
@@ -1105,16 +986,34 @@ void ShrinkPagesToObjectSizes(Heap* heap, OldLargeObjectSpace* space) {
 }  // namespace
 
 void MarkCompactCollector::Finish() {
+  {
+    TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_SWEEP);
+    if (heap()->new_lo_space()) {
+      TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_SWEEP_NEW_LO);
+      SweepLargeSpace(heap()->new_lo_space());
+    }
+
+    if (v8_flags.minor_mc && heap()->new_space()) {
+      // Keep new space sweeping atomic.
+      GCTracer::Scope sweep_scope(heap()->tracer(),
+                                  GCTracer::Scope::MC_SWEEP_FINISH_NEW,
+                                  ThreadKind::kMain);
+      sweeper()->ParallelSweepSpace(NEW_SPACE,
+                                    Sweeper::SweepingMode::kEagerDuringGC, 0);
+      heap()->paged_new_space()->paged_space()->RefillFreeList();
+    }
+
+#ifdef DEBUG
+    heap()->VerifyCountersBeforeConcurrentSweeping();
+#endif
+  }
+
   TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_FINISH);
 
   heap()->isolate()->global_handles()->ClearListOfYoungNodes();
 
   SweepArrayBufferExtensions();
 
-#ifdef DEBUG
-  heap()->VerifyCountersBeforeConcurrentSweeping();
-#endif
-
   marking_visitor_.reset();
   local_marking_worklists_.reset();
   marking_worklists_.ReleaseContextWorklists();
@@ -1126,23 +1025,6 @@ void MarkCompactCollector::Finish() {
   local_weak_objects_.reset();
   weak_objects_.next_ephemerons.Clear();
 
-  if (heap()->new_lo_space()) {
-    GCTracer::Scope sweep_scope(heap()->tracer(),
-                                GCTracer::Scope::MC_FINISH_SWEEP_NEW_LO,
-                                ThreadKind::kMain);
-    SweepLargeSpace(heap()->new_lo_space());
-  }
-
-  if (v8_flags.minor_mc && heap()->new_space()) {
-    // Keep new space sweeping atomic.
-    GCTracer::Scope sweep_scope(heap()->tracer(),
-                                GCTracer::Scope::MC_FINISH_SWEEP_NEW,
-                                ThreadKind::kMain);
-    sweeper()->ParallelSweepSpace(NEW_SPACE,
-                                  Sweeper::SweepingMode::kEagerDuringGC, 0);
-    heap()->paged_new_space()->paged_space()->RefillFreeList(sweeper());
-  }
-
   sweeper()->StartSweeperTasks();
 
   // Ensure unmapper tasks are stopped such that queued pages aren't freed
@@ -1175,7 +1057,7 @@ void MarkCompactCollector::SweepArrayBufferExtensions() {
 class MarkCompactCollector::RootMarkingVisitor final : public RootVisitor {
  public:
   explicit RootMarkingVisitor(MarkCompactCollector* collector)
-      : collector_(collector), is_shared_heap_(collector->is_shared_heap()) {}
+      : collector_(collector) {}
 
   void VisitRootPointer(Root root, const char* description,
                         FullObjectSlot p) final {
@@ -1231,14 +1113,11 @@ class MarkCompactCollector::RootMarkingVisitor final : public RootVisitor {
     Object object = *p;
     if (!object.IsHeapObject()) return;
     HeapObject heap_object = HeapObject::cast(object);
-    BasicMemoryChunk* target_page =
-        BasicMemoryChunk::FromHeapObject(heap_object);
-    if (is_shared_heap_ != target_page->InSharedHeap()) return;
+    if (!collector_->ShouldMarkObject(heap_object)) return;
     collector_->MarkRootObject(root, heap_object);
   }
 
   MarkCompactCollector* const collector_;
-  const bool is_shared_heap_;
 };
 
 // This visitor is used to visit the body of special objects held alive by
@@ -1300,12 +1179,7 @@ class MarkCompactCollector::CustomRootBodyMarkingVisitor final
   V8_INLINE void MarkObject(HeapObject host, Object object) {
     if (!object.IsHeapObject()) return;
     HeapObject heap_object = HeapObject::cast(object);
-    // We use this visitor both in client and shared GCs. The client GC should
-    // not mark objects in the shared heap. In shared GCs we are marking each
-    // client's top stack frame, so it is actually legal to encounter references
-    // into the client heap here in a shared GC. We need to bail out in these
-    // cases as well.
-    if (collector_->is_shared_heap() != heap_object.InSharedHeap()) return;
+    if (!collector_->ShouldMarkObject(heap_object)) return;
     collector_->MarkObject(host, heap_object);
   }
 
@@ -1394,7 +1268,7 @@ class InternalizedStringTableCleaner final : public RootVisitor {
                          OffHeapObjectSlot end) override {
     DCHECK_EQ(root, Root::kStringTable);
     // Visit all HeapObject pointers in [start, end).
-    auto* marking_state = heap_->mark_compact_collector()->marking_state();
+    auto* marking_state = heap_->marking_state();
     Isolate* isolate = heap_->isolate();
     for (OffHeapObjectSlot p = start; p < end; ++p) {
       Object o = p.load(isolate);
@@ -1424,8 +1298,7 @@ class ExternalStringTableCleaner : public RootVisitor {
   void VisitRootPointers(Root root, const char* description,
                          FullObjectSlot start, FullObjectSlot end) override {
     // Visit all HeapObject pointers in [start, end).
-    NonAtomicMarkingState* marking_state =
-        heap_->mark_compact_collector()->non_atomic_marking_state();
+    NonAtomicMarkingState* marking_state = heap_->non_atomic_marking_state();
     Object the_hole = ReadOnlyRoots(heap_).the_hole_value();
     for (FullObjectSlot p = start; p < end; ++p) {
       Object o = *p;
@@ -1552,10 +1425,9 @@ class MarkCompactWeakObjectRetainer : public WeakObjectRetainer {
 class RecordMigratedSlotVisitor : public ObjectVisitorWithCageBases {
  public:
   explicit RecordMigratedSlotVisitor(
-      MarkCompactCollector* collector,
-      EphemeronRememberedSet* ephemeron_remembered_set)
-      : ObjectVisitorWithCageBases(collector->isolate()),
-        collector_(collector),
+      Heap* heap, EphemeronRememberedSet* ephemeron_remembered_set)
+      : ObjectVisitorWithCageBases(heap->isolate()),
+        heap_(heap),
         ephemeron_remembered_set_(ephemeron_remembered_set) {}
 
   inline void VisitPointer(HeapObject host, ObjectSlot p) final {
@@ -1623,7 +1495,7 @@ class RecordMigratedSlotVisitor : public ObjectVisitorWithCageBases {
     // the old-to-new remembered set.
     DCHECK(!Heap::InYoungGeneration(target));
     DCHECK(!target.InSharedWritableHeap());
-    collector_->RecordRelocSlot(host, rinfo, target);
+    heap_->mark_compact_collector()->RecordRelocSlot(host, rinfo, target);
   }
 
   inline void VisitEmbeddedPointer(Code host, RelocInfo* rinfo) override {
@@ -1632,12 +1504,11 @@ class RecordMigratedSlotVisitor : public ObjectVisitorWithCageBases {
     HeapObject object = rinfo->target_object(cage_base());
     GenerationalBarrierForCode(host, rinfo, object);
     WriteBarrier::Shared(host, rinfo, object);
-    collector_->RecordRelocSlot(host, rinfo, object);
+    heap_->mark_compact_collector()->RecordRelocSlot(host, rinfo, object);
   }
 
   // Entries that are skipped for recording.
   inline void VisitExternalReference(Code host, RelocInfo* rinfo) final {}
-  inline void VisitRuntimeEntry(Code host, RelocInfo* rinfo) final {}
   inline void VisitInternalReference(Code host, RelocInfo* rinfo) final {}
   inline void VisitExternalPointer(HeapObject host, ExternalPointerSlot slot,
                                    ExternalPointerTag tag) final {}
@@ -1667,14 +1538,14 @@ class RecordMigratedSlotVisitor : public ObjectVisitorWithCageBases {
           RememberedSet<OLD_TO_OLD>::Insert<AccessMode::NON_ATOMIC>(
               MemoryChunk::FromHeapObject(host), slot);
         }
-      } else if (p->InSharedHeap() && !collector_->is_shared_heap()) {
+      } else if (p->InSharedHeap() && !host.InSharedWritableHeap()) {
         RememberedSet<OLD_TO_SHARED>::Insert<AccessMode::NON_ATOMIC>(
             MemoryChunk::FromHeapObject(host), slot);
       }
     }
   }
 
-  MarkCompactCollector* collector_;
+  Heap* const heap_;
   EphemeronRememberedSet* ephemeron_remembered_set_;
 };
 
@@ -1778,7 +1649,7 @@ class EvacuateVisitorBase : public HeapObjectVisitor {
       if (V8_UNLIKELY(v8_flags.minor_mc)) {
         base->record_visitor_->MarkArrayBufferExtensionPromoted(dst);
       }
-    } else if (dest == MAP_SPACE) {
+    } else if (dest == MAP_SPACE || dest == SHARED_SPACE) {
       DCHECK_OBJECT_SIZE(size);
       DCHECK(IsAligned(size, kTaggedSize));
       base->heap_->CopyBlock(dst_addr, src_addr, size);
@@ -1832,8 +1703,7 @@ class EvacuateVisitorBase : public HeapObjectVisitor {
     Map map = object.map(cage_base());
     AllocationAlignment alignment = HeapObject::RequiredAlignment(map);
     AllocationResult allocation;
-    if (ShouldPromoteIntoSharedHeap(map)) {
-      DCHECK_EQ(target_space, OLD_SPACE);
+    if (target_space == OLD_SPACE && ShouldPromoteIntoSharedHeap(map)) {
       DCHECK_NOT_NULL(shared_old_allocator_);
       allocation = shared_old_allocator_->AllocateRaw(size, alignment,
                                                       AllocationOrigin::kGC);
@@ -1890,13 +1760,14 @@ class EvacuateNewSpaceVisitor final : public EvacuateVisitorBase {
       Heap* heap, EvacuationAllocator* local_allocator,
       ConcurrentAllocator* shared_old_allocator,
       RecordMigratedSlotVisitor* record_visitor,
-      Heap::PretenuringFeedbackMap* local_pretenuring_feedback,
+      PretenturingHandler::PretenuringFeedbackMap* local_pretenuring_feedback,
       AlwaysPromoteYoung always_promote_young)
       : EvacuateVisitorBase(heap, local_allocator, shared_old_allocator,
                             record_visitor),
         buffer_(LocalAllocationBuffer::InvalidBuffer()),
         promoted_size_(0),
         semispace_copied_size_(0),
+        pretenuring_handler_(heap_->pretenuring_handler()),
         local_pretenuring_feedback_(local_pretenuring_feedback),
         is_incremental_marking_(heap->incremental_marking()->IsMarking()),
         always_promote_young_(always_promote_young) {}
@@ -1906,8 +1777,8 @@ class EvacuateNewSpaceVisitor final : public EvacuateVisitorBase {
     HeapObject target_object;
 
     if (always_promote_young_ == AlwaysPromoteYoung::kYes) {
-      heap_->UpdateAllocationSite(object.map(), object,
-                                  local_pretenuring_feedback_);
+      pretenuring_handler_->UpdateAllocationSite(object.map(), object,
+                                                 local_pretenuring_feedback_);
 
       if (!TryEvacuateObject(OLD_SPACE, object, size, &target_object)) {
         heap_->FatalProcessOutOfMemory(
@@ -1918,17 +1789,18 @@ class EvacuateNewSpaceVisitor final : public EvacuateVisitorBase {
       return true;
     }
 
+    DCHECK(!v8_flags.minor_mc);
+
     if (heap_->new_space()->ShouldBePromoted(object.address()) &&
         TryEvacuateObject(OLD_SPACE, object, size, &target_object)) {
       // Full GCs use AlwaysPromoteYoung::kYes above and MinorMC should never
       // move objects.
-      DCHECK(!v8_flags.minor_mc);
       promoted_size_ += size;
       return true;
     }
 
-    heap_->UpdateAllocationSite(object.map(), object,
-                                local_pretenuring_feedback_);
+    pretenuring_handler_->UpdateAllocationSite(object.map(), object,
+                                               local_pretenuring_feedback_);
 
     HeapObject target;
     AllocationSpace space = AllocateTargetObject(object, size, &target);
@@ -1990,7 +1862,8 @@ class EvacuateNewSpaceVisitor final : public EvacuateVisitorBase {
   LocalAllocationBuffer buffer_;
   intptr_t promoted_size_;
   intptr_t semispace_copied_size_;
-  Heap::PretenuringFeedbackMap* local_pretenuring_feedback_;
+  PretenturingHandler* const pretenuring_handler_;
+  PretenturingHandler::PretenuringFeedbackMap* local_pretenuring_feedback_;
   bool is_incremental_marking_;
   AlwaysPromoteYoung always_promote_young_;
 };
@@ -2000,10 +1873,11 @@ class EvacuateNewSpacePageVisitor final : public HeapObjectVisitor {
  public:
   explicit EvacuateNewSpacePageVisitor(
       Heap* heap, RecordMigratedSlotVisitor* record_visitor,
-      Heap::PretenuringFeedbackMap* local_pretenuring_feedback)
+      PretenturingHandler::PretenuringFeedbackMap* local_pretenuring_feedback)
       : heap_(heap),
         record_visitor_(record_visitor),
         moved_bytes_(0),
+        pretenuring_handler_(heap_->pretenuring_handler()),
         local_pretenuring_feedback_(local_pretenuring_feedback) {}
 
   static void Move(Page* page) {
@@ -2022,12 +1896,12 @@ class EvacuateNewSpacePageVisitor final : public HeapObjectVisitor {
   inline bool Visit(HeapObject object, int size) override {
     if (mode == NEW_TO_NEW) {
       DCHECK(!v8_flags.minor_mc);
-      heap_->UpdateAllocationSite(object.map(), object,
-                                  local_pretenuring_feedback_);
+      pretenuring_handler_->UpdateAllocationSite(object.map(), object,
+                                                 local_pretenuring_feedback_);
     } else if (mode == NEW_TO_OLD) {
       if (v8_flags.minor_mc) {
-        heap_->UpdateAllocationSite(object.map(), object,
-                                    local_pretenuring_feedback_);
+        pretenuring_handler_->UpdateAllocationSite(object.map(), object,
+                                                   local_pretenuring_feedback_);
       }
       DCHECK_IMPLIES(V8_EXTERNAL_CODE_SPACE_BOOL, !IsCodeSpaceObject(object));
       PtrComprCageBase cage_base = GetPtrComprCageBase(object);
@@ -2046,7 +1920,8 @@ class EvacuateNewSpacePageVisitor final : public HeapObjectVisitor {
   Heap* heap_;
   RecordMigratedSlotVisitor* record_visitor_;
   intptr_t moved_bytes_;
-  Heap::PretenuringFeedbackMap* local_pretenuring_feedback_;
+  PretenturingHandler* const pretenuring_handler_;
+  PretenturingHandler::PretenuringFeedbackMap* local_pretenuring_feedback_;
 };
 
 class EvacuateOldSpaceVisitor final : public EvacuateVisitorBase {
@@ -2091,8 +1966,7 @@ class EvacuateRecordOnlyVisitor final : public HeapObjectVisitor {
   }
 
   inline bool Visit(HeapObject object, int size) override {
-    RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector(),
-                                      &heap_->ephemeron_remembered_set_);
+    RecordMigratedSlotVisitor visitor(heap_, &heap_->ephemeron_remembered_set_);
     Map map = object.map(cage_base());
     // Instead of calling object.IterateFast(cage_base(), &visitor) here
     // we can shortcut and use the precomputed size value passed to the visitor.
@@ -2126,7 +2000,7 @@ void MarkCompactCollector::MarkRoots(RootVisitor* root_visitor,
   // Custom marking for top optimized frame.
   ProcessTopOptimizedFrame(custom_root_body_visitor, isolate());
 
-  if (isolate()->is_shared()) {
+  if (isolate()->is_shared_heap_isolate()) {
     isolate()->global_safepoint()->IterateClientIsolates(
         [this, custom_root_body_visitor](Isolate* client) {
           ProcessTopOptimizedFrame(custom_root_body_visitor, client);
@@ -2142,7 +2016,7 @@ void MarkCompactCollector::MarkRoots(RootVisitor* root_visitor,
         heap_->local_embedder_heap_tracer()->embedder_stack_state() ==
             cppgc::EmbedderStackState::kMayContainHeapPointers) {
       GlobalHandleMarkingVisitor global_handles_marker(
-          *heap_, marking_state_, *local_marking_worklists_);
+          *heap_, *local_marking_worklists_);
       stack.IteratePointers(&global_handles_marker);
     }
   }
@@ -2246,9 +2120,14 @@ Address MarkCompactCollector::FindBasePtrForMarking(Address maybe_inner_ptr) {
   if (chunk->IsLargePage()) return chunk->area_start();
   // Otherwise, we have a pointer inside a normal page.
   const Page* page = static_cast<const Page*>(chunk);
+  // If it is in the young generation "from" semispace, it is not used and we
+  // must ignore it, as its markbits may not be clean.
+  if (page->IsFromPage()) return kNullAddress;
+  // Try to find the address of a previous valid object on this page.
   Address base_ptr =
       FindPreviousObjectForConservativeMarking(page, maybe_inner_ptr);
-  // If the markbit is set, then we have an object that does not need be marked.
+  // If the markbit is set, then we have an object that does not need to be
+  // marked.
   if (base_ptr == kNullAddress) return kNullAddress;
   // Iterate through the objects in the page forwards, until we find the object
   // containing maybe_inner_ptr.
@@ -2271,10 +2150,11 @@ void MarkCompactCollector::MarkRootsFromStack(RootVisitor* root_visitor) {
 }
 
 void MarkCompactCollector::MarkObjectsFromClientHeaps() {
-  if (!isolate()->is_shared()) return;
+  if (!isolate()->is_shared_heap_isolate()) return;
 
   isolate()->global_safepoint()->IterateClientIsolates(
       [collector = this](Isolate* client) {
+        if (client->is_shared_heap_isolate()) return;
         collector->MarkObjectsFromClientHeap(client);
       });
 }
@@ -2290,6 +2170,9 @@ void MarkCompactCollector::MarkObjectsFromClientHeap(Isolate* client) {
   PtrComprCageBase cage_base(client);
   Heap* heap = client->heap();
 
+  // Ensure new space is iterable.
+  heap->MakeHeapIterable();
+
   if (heap->new_space()) {
     std::unique_ptr<ObjectIterator> iterator =
         heap->new_space()->GetObjectIterator(heap);
@@ -2312,6 +2195,9 @@ void MarkCompactCollector::MarkObjectsFromClientHeap(Isolate* client) {
   // find all incoming pointers into the shared heap.
   OldGenerationMemoryChunkIterator chunk_iterator(heap);
 
+  // Tracking OLD_TO_SHARED requires the write barrier.
+  DCHECK(!v8_flags.disable_write_barriers);
+
   for (MemoryChunk* chunk = chunk_iterator.next(); chunk;
        chunk = chunk_iterator.next()) {
     InvalidatedSlotsFilter filter = InvalidatedSlotsFilter::OldToShared(
@@ -2333,6 +2219,18 @@ void MarkCompactCollector::MarkObjectsFromClientHeap(Isolate* client) {
         },
         SlotSet::FREE_EMPTY_BUCKETS);
     chunk->ReleaseInvalidatedSlots<OLD_TO_SHARED>();
+
+    RememberedSet<OLD_TO_SHARED>::IterateTyped(
+        chunk, [collector = this, heap](SlotType slot_type, Address slot) {
+          HeapObject heap_object =
+              UpdateTypedSlotHelper::GetTargetObject(heap, slot_type, slot);
+          if (heap_object.InSharedWritableHeap()) {
+            collector->MarkRootObject(Root::kClientHeap, heap_object);
+            return KEEP_SLOT;
+          } else {
+            return REMOVE_SLOT;
+          }
+        });
   }
 
 #ifdef V8_COMPRESS_POINTERS
@@ -2934,8 +2832,7 @@ class StringForwardingTableCleaner final {
   explicit StringForwardingTableCleaner(Heap* heap)
       : heap_(heap),
         isolate_(heap_->isolate()),
-        marking_state_(
-            heap_->mark_compact_collector()->non_atomic_marking_state()) {}
+        marking_state_(heap_->non_atomic_marking_state()) {}
   void Run() {
     StringForwardingTable* forwarding_table =
         isolate_->string_forwarding_table();
@@ -3013,9 +2910,9 @@ class StringForwardingTableCleaner final {
         ThinString::cast(original_string).RawField(ThinString::kActualOffset);
     MarkCompactCollector::RecordSlot(original_string, slot, forward_string);
   }
-  Heap* heap_;
-  Isolate* isolate_;
-  NonAtomicMarkingState* marking_state_;
+  Heap* const heap_;
+  Isolate* const isolate_;
+  NonAtomicMarkingState* const marking_state_;
 };
 
 }  // namespace
@@ -3192,13 +3089,16 @@ void MarkCompactCollector::FlushBytecodeFromSFI(
   // Replace bytecode array with an uncompiled data array.
   HeapObject compiled_data = shared_info.GetBytecodeArray(isolate());
   Address compiled_data_start = compiled_data.address();
-  int compiled_data_size = compiled_data.Size();
+  int compiled_data_size = ALIGN_TO_ALLOCATION_ALIGNMENT(compiled_data.Size());
   MemoryChunk* chunk = MemoryChunk::FromAddress(compiled_data_start);
 
   // Clear any recorded slots for the compiled data as being invalid.
   RememberedSet<OLD_TO_NEW>::RemoveRange(
       chunk, compiled_data_start, compiled_data_start + compiled_data_size,
       SlotSet::FREE_EMPTY_BUCKETS);
+  RememberedSet<OLD_TO_SHARED>::RemoveRange(
+      chunk, compiled_data_start, compiled_data_start + compiled_data_size,
+      SlotSet::FREE_EMPTY_BUCKETS);
   RememberedSet<OLD_TO_OLD>::RemoveRange(
       chunk, compiled_data_start, compiled_data_start + compiled_data_size,
       SlotSet::FREE_EMPTY_BUCKETS);
@@ -3211,9 +3111,11 @@ void MarkCompactCollector::FlushBytecodeFromSFI(
 
   // Create a filler object for any left over space in the bytecode array.
   if (!heap()->IsLargeObject(compiled_data)) {
+    const int aligned_filler_offset =
+        ALIGN_TO_ALLOCATION_ALIGNMENT(UncompiledDataWithoutPreparseData::kSize);
     heap()->CreateFillerObjectAt(
-        compiled_data.address() + UncompiledDataWithoutPreparseData::kSize,
-        compiled_data_size - UncompiledDataWithoutPreparseData::kSize);
+        compiled_data.address() + aligned_filler_offset,
+        compiled_data_size - aligned_filler_offset);
   }
 
   // Initialize the uncompiled data.
@@ -3226,8 +3128,8 @@ void MarkCompactCollector::FlushBytecodeFromSFI(
 
   // Mark the uncompiled data as black, and ensure all fields have already been
   // marked.
-  DCHECK(marking_state()->IsBlackOrGrey(inferred_name) ||
-         (!is_shared_heap() && inferred_name.InSharedWritableHeap()));
+  DCHECK(!ShouldMarkObject(inferred_name) ||
+         marking_state()->IsBlackOrGrey(inferred_name));
   marking_state()->WhiteToBlack(uncompiled_data);
 
   // Use the raw function data setter to avoid validity checks, since we're
@@ -3452,9 +3354,25 @@ void MarkCompactCollector::RightTrimDescriptorArray(DescriptorArray array,
   MemoryChunk* chunk = MemoryChunk::FromHeapObject(array);
   RememberedSet<OLD_TO_NEW>::RemoveRange(chunk, start, end,
                                          SlotSet::FREE_EMPTY_BUCKETS);
+  RememberedSet<OLD_TO_SHARED>::RemoveRange(chunk, start, end,
+                                            SlotSet::FREE_EMPTY_BUCKETS);
   RememberedSet<OLD_TO_OLD>::RemoveRange(chunk, start, end,
                                          SlotSet::FREE_EMPTY_BUCKETS);
-  heap()->CreateFillerObjectAt(start, static_cast<int>(end - start));
+  if (V8_COMPRESS_POINTERS_8GB_BOOL) {
+    Address aligned_start = ALIGN_TO_ALLOCATION_ALIGNMENT(start);
+    Address aligned_end = ALIGN_TO_ALLOCATION_ALIGNMENT(end);
+    if (aligned_start < aligned_end) {
+      heap()->CreateFillerObjectAt(
+          aligned_start, static_cast<int>(aligned_end - aligned_start));
+    }
+    if (Heap::ShouldZapGarbage()) {
+      Address zap_end = std::min(aligned_start, end);
+      MemsetTagged(ObjectSlot(start), Object(static_cast<Address>(kZapValue)),
+                   (zap_end - start) >> kTaggedSizeLog2);
+    }
+  } else {
+    heap()->CreateFillerObjectAt(start, static_cast<int>(end - start));
+  }
   array.set_number_of_all_descriptors(new_nof_all_descriptors);
 }
 
@@ -3509,14 +3427,14 @@ void MarkCompactCollector::ClearWeakCollections() {
         if (value.IsHeapObject()) {
           HeapObject heap_object = HeapObject::cast(value);
           CHECK_IMPLIES(
-              (!is_shared_heap_ && key.InSharedHeap()) ||
+              !ShouldMarkObject(key) ||
                   non_atomic_marking_state()->IsBlackOrGrey(key),
-              (!is_shared_heap_ && heap_object.InSharedHeap()) ||
+              !ShouldMarkObject(heap_object) ||
                   non_atomic_marking_state()->IsBlackOrGrey(heap_object));
         }
       }
 #endif
-      if (!is_shared_heap_ && key.InSharedHeap()) continue;
+      if (!ShouldMarkObject(key)) continue;
       if (!non_atomic_marking_state()->IsBlackOrGrey(key)) {
         table.RemoveEntry(i);
       }
@@ -3580,7 +3498,7 @@ void MarkCompactCollector::ClearJSWeakRefs() {
     };
     HeapObject target = HeapObject::cast(weak_cell.target());
     if (!non_atomic_marking_state()->IsBlackOrGrey(target)) {
-      DCHECK(!target.IsUndefined());
+      DCHECK(target.CanBeHeldWeakly());
       // The value of the WeakCell is dead.
       JSFinalizationRegistry finalization_registry =
           JSFinalizationRegistry::cast(weak_cell.finalization_registry());
@@ -3602,6 +3520,7 @@ void MarkCompactCollector::ClearJSWeakRefs() {
 
     HeapObject unregister_token = weak_cell.unregister_token();
     if (!non_atomic_marking_state()->IsBlackOrGrey(unregister_token)) {
+      DCHECK(unregister_token.CanBeHeldWeakly());
       // The unregister token is dead. Remove any corresponding entries in the
       // key map. Multiple WeakCell with the same token will have all their
       // unregister_token field set to undefined when processing the first
@@ -3610,7 +3529,7 @@ void MarkCompactCollector::ClearJSWeakRefs() {
       JSFinalizationRegistry finalization_registry =
           JSFinalizationRegistry::cast(weak_cell.finalization_registry());
       finalization_registry.RemoveUnregisterToken(
-          JSReceiver::cast(unregister_token), isolate(),
+          unregister_token, isolate(),
           JSFinalizationRegistry::kKeepMatchedCellsInRegistry,
           gc_notify_updated_slot);
     } else {
@@ -3664,11 +3583,9 @@ MarkCompactCollector::ProcessRelocInfo(Code host, RelocInfo* rinfo,
       slot_type = SlotType::kCodeEntry;
     } else if (RelocInfo::IsFullEmbeddedObject(rmode)) {
       slot_type = SlotType::kEmbeddedObjectFull;
-    } else if (RelocInfo::IsCompressedEmbeddedObject(rmode)) {
-      slot_type = SlotType::kEmbeddedObjectCompressed;
     } else {
-      DCHECK(RelocInfo::IsDataEmbeddedObject(rmode));
-      slot_type = SlotType::kEmbeddedObjectData;
+      DCHECK(RelocInfo::IsCompressedEmbeddedObject(rmode));
+      slot_type = SlotType::kEmbeddedObjectCompressed;
     }
   }
 
@@ -3959,71 +3876,6 @@ class PointersUpdatingVisitor final : public ObjectVisitorWithCageBases,
   }
 };
 
-#ifdef VERIFY_HEAP
-// Visitor for updating root pointers and to-space pointers.
-// It does not expect to encounter pointers to dead objects.
-class ClientHeapVerifier final : public ObjectVisitorWithCageBases {
- public:
-  explicit ClientHeapVerifier(Heap* heap) : ObjectVisitorWithCageBases(heap) {}
-
-  void VisitPointer(HeapObject host, ObjectSlot p) override {
-    VerifySlot(cage_base(), p);
-  }
-
-  void VisitPointer(HeapObject host, MaybeObjectSlot p) override {
-    VerifySlot(cage_base(), p);
-  }
-
-  void VisitPointers(HeapObject host, ObjectSlot start,
-                     ObjectSlot end) override {
-    for (ObjectSlot p = start; p < end; ++p) {
-      VerifySlot(cage_base(), p);
-    }
-  }
-
-  void VisitPointers(HeapObject host, MaybeObjectSlot start,
-                     MaybeObjectSlot end) final {
-    for (MaybeObjectSlot p = start; p < end; ++p) {
-      VerifySlot(cage_base(), p);
-    }
-  }
-
-  void VisitMapPointer(HeapObject host) override {
-    VerifySlot(cage_base(), host.map_slot());
-  }
-
-  void VisitCodePointer(HeapObject host, CodeObjectSlot slot) override {
-    VerifySlot(code_cage_base(), ObjectSlot(slot.address()));
-  }
-
-  void VisitCodeTarget(Code host, RelocInfo* rinfo) override {}
-
-  void VisitEmbeddedPointer(Code host, RelocInfo* rinfo) override {}
-
- private:
-  void VerifySlot(PtrComprCageBase cage_base, ObjectSlot slot) {
-    HeapObject heap_object;
-    if (slot.load(cage_base).GetHeapObject(&heap_object)) {
-      VerifyHeapObject(heap_object);
-    }
-  }
-
-  void VerifySlot(PtrComprCageBase cage_base, MaybeObjectSlot slot) {
-    HeapObject heap_object;
-    if (slot.load(cage_base).GetHeapObject(&heap_object)) {
-      VerifyHeapObject(heap_object);
-    }
-  }
-
-  void VerifyHeapObject(HeapObject heap_object) {
-    if (BasicMemoryChunk::FromHeapObject(heap_object)->InReadOnlySpace())
-      return;
-    if (!heap_object.InSharedHeap()) return;
-    CHECK(!heap_object.map_word(kRelaxedLoad).IsForwardingAddress());
-  }
-};
-#endif  // VERIFY_HEAP
-
 static String UpdateReferenceInExternalStringTableEntry(Heap* heap,
                                                         FullObjectSlot p) {
   HeapObject old_string = HeapObject::cast(*p);
@@ -4097,6 +3949,15 @@ void MarkCompactCollector::EvacuateEpilogue() {
     DCHECK_NULL((chunk->slot_set<OLD_TO_NEW, AccessMode::ATOMIC>()));
     DCHECK_NULL((chunk->typed_slot_set<OLD_TO_NEW, AccessMode::ATOMIC>()));
 
+    // Old-to-shared slots may survive GC but there should never be any slots in
+    // new or shared spaces.
+    AllocationSpace id = chunk->owner_identity();
+    if (id == SHARED_SPACE || id == SHARED_LO_SPACE || id == NEW_SPACE ||
+        id == NEW_LO_SPACE || isolate()->is_shared()) {
+      DCHECK_NULL((chunk->slot_set<OLD_TO_SHARED, AccessMode::ATOMIC>()));
+      DCHECK_NULL((chunk->typed_slot_set<OLD_TO_SHARED, AccessMode::ATOMIC>()));
+    }
+
     // GCs need to filter invalidated slots.
     DCHECK_NULL(chunk->invalidated_slots<OLD_TO_OLD>());
     DCHECK_NULL(chunk->invalidated_slots<OLD_TO_NEW>());
@@ -4107,8 +3968,8 @@ void MarkCompactCollector::EvacuateEpilogue() {
 
 namespace {
 ConcurrentAllocator* CreateSharedOldAllocator(Heap* heap) {
-  if (v8_flags.shared_string_table && heap->isolate()->shared_isolate()) {
-    return new ConcurrentAllocator(nullptr, heap->shared_old_space());
+  if (v8_flags.shared_string_table && heap->isolate()->has_shared_heap()) {
+    return new ConcurrentAllocator(nullptr, heap->shared_allocation_space());
   }
 
   return nullptr;
@@ -4158,7 +4019,8 @@ class Evacuator : public Malloced {
             EvacuationAllocator* local_allocator,
             AlwaysPromoteYoung always_promote_young)
       : heap_(heap),
-        local_pretenuring_feedback_(kInitialLocalPretenuringFeedbackCapacity),
+        local_pretenuring_feedback_(
+            PretenturingHandler::kInitialFeedbackCapacity),
         shared_old_allocator_(CreateSharedOldAllocator(heap_)),
         new_space_visitor_(heap_, local_allocator, shared_old_allocator_.get(),
                            record_visitor, &local_pretenuring_feedback_,
@@ -4191,10 +4053,8 @@ class Evacuator : public Malloced {
   virtual GCTracer::Scope::ScopeId GetTracingScope() = 0;
 
  protected:
-  static const int kInitialLocalPretenuringFeedbackCapacity = 256;
-
   // |saved_live_bytes| returns the live bytes of the page that was processed.
-  virtual void RawEvacuatePage(MemoryChunk* chunk,
+  virtual bool RawEvacuatePage(MemoryChunk* chunk,
                                intptr_t* saved_live_bytes) = 0;
 
   inline Heap* heap() { return heap_; }
@@ -4206,7 +4066,7 @@ class Evacuator : public Malloced {
 
   Heap* heap_;
 
-  Heap::PretenuringFeedbackMap local_pretenuring_feedback_;
+  PretenturingHandler::PretenuringFeedbackMap local_pretenuring_feedback_;
 
   // Allocator for the shared heap.
   std::unique_ptr<ConcurrentAllocator> shared_old_allocator_;
@@ -4232,10 +4092,11 @@ void Evacuator::EvacuatePage(MemoryChunk* chunk) {
   DCHECK(chunk->SweepingDone());
   intptr_t saved_live_bytes = 0;
   double evacuation_time = 0.0;
+  bool success = false;
   {
     AlwaysAllocateScope always_allocate(heap());
     TimedScope timed_scope(&evacuation_time);
-    RawEvacuatePage(chunk, &saved_live_bytes);
+    success = RawEvacuatePage(chunk, &saved_live_bytes);
   }
   ReportCompactionProgress(evacuation_time, saved_live_bytes);
   if (v8_flags.trace_evacuation) {
@@ -4249,8 +4110,7 @@ void Evacuator::EvacuatePage(MemoryChunk* chunk) {
                      chunk->IsFlagSet(Page::PAGE_NEW_NEW_PROMOTION),
                  chunk->IsFlagSet(MemoryChunk::IS_EXECUTABLE),
                  heap()->new_space()->IsPromotionCandidate(chunk),
-                 saved_live_bytes, evacuation_time,
-                 chunk->IsFlagSet(Page::COMPACTION_WAS_ABORTED));
+                 saved_live_bytes, evacuation_time, success);
   }
 }
 
@@ -4260,7 +4120,7 @@ void Evacuator::Finalize() {
   heap()->tracer()->AddCompactionEvent(duration_, bytes_compacted_);
   heap()->IncrementPromotedObjectsSize(new_space_visitor_.promoted_size() +
                                        new_to_old_page_visitor_.moved_bytes());
-  heap()->IncrementSemiSpaceCopiedObjectSize(
+  heap()->IncrementNewSpaceSurvivingObjectSize(
       new_space_visitor_.semispace_copied_size() +
       new_to_new_page_visitor_.moved_bytes());
   heap()->IncrementYoungSurvivorsCounter(
@@ -4268,18 +4128,18 @@ void Evacuator::Finalize() {
       new_space_visitor_.semispace_copied_size() +
       new_to_old_page_visitor_.moved_bytes() +
       new_to_new_page_visitor_.moved_bytes());
-  heap()->MergeAllocationSitePretenuringFeedback(local_pretenuring_feedback_);
+  heap()->pretenuring_handler()->MergeAllocationSitePretenuringFeedback(
+      local_pretenuring_feedback_);
 }
 
 class FullEvacuator : public Evacuator {
  public:
-  explicit FullEvacuator(MarkCompactCollector* collector)
-      : Evacuator(collector->heap(), &record_visitor_, &local_allocator_,
+  explicit FullEvacuator(Heap* heap)
+      : Evacuator(heap, &record_visitor_, &local_allocator_,
                   AlwaysPromoteYoung::kYes),
-        record_visitor_(collector, &ephemeron_remembered_set_),
+        record_visitor_(heap_, &ephemeron_remembered_set_),
         local_allocator_(heap_,
-                         CompactionSpaceKind::kCompactionSpaceForMarkCompact),
-        collector_(collector) {}
+                         CompactionSpaceKind::kCompactionSpaceForMarkCompact) {}
 
   GCTracer::Scope::ScopeId GetBackgroundTracingScope() override {
     return GCTracer::Scope::MC_BACKGROUND_EVACUATE_COPY;
@@ -4307,18 +4167,16 @@ class FullEvacuator : public Evacuator {
   }
 
  protected:
-  void RawEvacuatePage(MemoryChunk* chunk, intptr_t* live_bytes) override;
+  bool RawEvacuatePage(MemoryChunk* chunk, intptr_t* live_bytes) override;
 
   EphemeronRememberedSet ephemeron_remembered_set_;
   RecordMigratedSlotVisitor record_visitor_;
   EvacuationAllocator local_allocator_;
-
-  MarkCompactCollector* collector_;
 };
 
-void FullEvacuator::RawEvacuatePage(MemoryChunk* chunk, intptr_t* live_bytes) {
+bool FullEvacuator::RawEvacuatePage(MemoryChunk* chunk, intptr_t* live_bytes) {
   const EvacuationMode evacuation_mode = ComputeEvacuationMode(chunk);
-  NonAtomicMarkingState* marking_state = collector_->non_atomic_marking_state();
+  NonAtomicMarkingState* marking_state = heap_->non_atomic_marking_state();
   *live_bytes = marking_state->live_bytes(chunk);
   TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("v8.gc"),
                "FullEvacuator::RawEvacuatePage", "evacuation_mode",
@@ -4363,13 +4221,17 @@ void FullEvacuator::RawEvacuatePage(MemoryChunk* chunk, intptr_t* live_bytes) {
         } else {
           // Aborted compaction page. Actual processing happens on the main
           // thread for simplicity reasons.
-          collector_->ReportAbortedEvacuationCandidateDueToOOM(
-              failed_object.address(), static_cast<Page*>(chunk));
+          heap_->mark_compact_collector()
+              ->ReportAbortedEvacuationCandidateDueToOOM(
+                  failed_object.address(), static_cast<Page*>(chunk));
+          return false;
         }
       }
       break;
     }
   }
+
+  return true;
 }
 
 class PageEvacuationJob : public v8::JobTask {
@@ -4433,20 +4295,19 @@ class PageEvacuationJob : public v8::JobTask {
 };
 
 namespace {
-template <class Evacuator, class Collector>
+template <class Evacuator>
 size_t CreateAndExecuteEvacuationTasks(
-    Collector* collector,
+    Heap* heap,
     std::vector<std::pair<ParallelWorkItem, MemoryChunk*>> evacuation_items,
     MigrationObserver* migration_observer) {
   base::Optional<ProfilingMigrationObserver> profiling_observer;
-  if (collector->isolate()->log_object_relocation()) {
-    profiling_observer.emplace(collector->heap());
+  if (heap->isolate()->log_object_relocation()) {
+    profiling_observer.emplace(heap);
   }
   std::vector<std::unique_ptr<v8::internal::Evacuator>> evacuators;
-  const int wanted_num_tasks =
-      NumberOfParallelCompactionTasks(collector->heap());
+  const int wanted_num_tasks = NumberOfParallelCompactionTasks(heap);
   for (int i = 0; i < wanted_num_tasks; i++) {
-    auto evacuator = std::make_unique<Evacuator>(collector);
+    auto evacuator = std::make_unique<Evacuator>(heap);
     if (profiling_observer) {
       evacuator->AddObserver(&profiling_observer.value());
     }
@@ -4458,7 +4319,7 @@ size_t CreateAndExecuteEvacuationTasks(
   V8::GetCurrentPlatform()
       ->CreateJob(
           v8::TaskPriority::kUserBlocking,
-          std::make_unique<PageEvacuationJob>(collector->isolate(), &evacuators,
+          std::make_unique<PageEvacuationJob>(heap->isolate(), &evacuators,
                                               std::move(evacuation_items)))
       ->Join();
   for (auto& evacuator : evacuators) {
@@ -4469,13 +4330,16 @@ size_t CreateAndExecuteEvacuationTasks(
 
 bool ShouldMovePage(Page* p, intptr_t live_bytes, intptr_t wasted_bytes,
                     MemoryReductionMode memory_reduction_mode,
-                    AlwaysPromoteYoung always_promote_young) {
+                    AlwaysPromoteYoung always_promote_young,
+                    PromoteUnusablePages promote_unusable_pages) {
   Heap* heap = p->heap();
   return v8_flags.page_promotion &&
          (memory_reduction_mode == MemoryReductionMode::kNone) &&
          !p->NeverEvacuate() &&
-         (live_bytes + wasted_bytes >
-          Evacuator::NewSpacePageEvacuationThreshold()) &&
+         ((live_bytes + wasted_bytes >
+           Evacuator::NewSpacePageEvacuationThreshold()) ||
+          (promote_unusable_pages == PromoteUnusablePages::kYes &&
+           !p->WasUsedForAllocation())) &&
          (always_promote_young == AlwaysPromoteYoung::kYes ||
           heap->new_space()->IsPromotionCandidate(p)) &&
          heap->CanExpandOldGeneration(live_bytes);
@@ -4516,7 +4380,7 @@ void MarkCompactCollector::EvacuatePagesInParallel() {
         heap()->ShouldReduceMemory() ? MemoryReductionMode::kShouldReduceMemory
                                      : MemoryReductionMode::kNone;
     if (ShouldMovePage(page, live_bytes_on_page, 0, memory_reduction_mode,
-                       AlwaysPromoteYoung::kYes) ||
+                       AlwaysPromoteYoung::kYes, PromoteUnusablePages::kNo) ||
         force_page_promotion) {
       EvacuateNewSpacePageVisitor<NEW_TO_OLD>::Move(page);
       DCHECK_EQ(heap()->old_space(), page->owner());
@@ -4563,8 +4427,7 @@ void MarkCompactCollector::EvacuatePagesInParallel() {
 
   // Promote young generation large objects.
   if (auto* new_lo_space = heap()->new_lo_space()) {
-    auto* marking_state =
-        heap()->incremental_marking()->non_atomic_marking_state();
+    auto* marking_state = heap()->non_atomic_marking_state();
     for (auto it = new_lo_space->begin(); it != new_lo_space->end();) {
       LargePage* current = *(it++);
       HeapObject object = current->GetObject();
@@ -4587,7 +4450,7 @@ void MarkCompactCollector::EvacuatePagesInParallel() {
                  evacuation_items.size());
 
     wanted_num_tasks = CreateAndExecuteEvacuationTasks<FullEvacuator>(
-        this, std::move(evacuation_items), nullptr);
+        heap(), std::move(evacuation_items), nullptr);
   }
 
   const size_t aborted_pages = PostProcessAbortedEvacuationCandidates();
@@ -4667,7 +4530,7 @@ void LiveObjectVisitor::RecomputeLiveBytes(MemoryChunk* chunk,
   int new_live_size = 0;
   for (auto object_and_size :
        LiveObjectRange<kAllLiveObjects>(chunk, marking_state->bitmap(chunk))) {
-    new_live_size += object_and_size.second;
+    new_live_size += ALIGN_TO_ALLOCATION_ALIGNMENT(object_and_size.second);
   }
   marking_state->SetLiveBytes(chunk, new_live_size);
 }
@@ -4683,19 +4546,12 @@ void MarkCompactCollector::Evacuate() {
 
   {
     TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_EVACUATE_COPY);
-    EvacuationScope evacuation_scope(this);
+    EvacuationScope evacuation_scope(heap());
     EvacuatePagesInParallel();
   }
 
   UpdatePointersAfterEvacuation();
 
-  if (heap()->new_space()) {
-    TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_EVACUATE_REBALANCE);
-    if (!heap()->new_space()->EnsureCurrentCapacity()) {
-      heap()->FatalProcessOutOfMemory("NewSpace::Rebalance");
-    }
-  }
-
   {
     TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_EVACUATE_CLEAN_UP);
 
@@ -4709,11 +4565,31 @@ void MarkCompactCollector::Evacuate() {
       } else if (v8_flags.minor_mc) {
         // Sweep non-promoted pages to add them back to the free list.
         DCHECK_EQ(NEW_SPACE, p->owner_identity());
-        sweeper()->AddPage(NEW_SPACE, p, Sweeper::REGULAR);
+        DCHECK_EQ(0, non_atomic_marking_state()->live_bytes(p));
+        DCHECK(p->SweepingDone());
+        PagedNewSpace* space = heap()->paged_new_space();
+        if (is_new_space_shrinking_ && space->ShouldReleasePage()) {
+          space->ReleasePage(p);
+        } else {
+          sweeper()->AddNewSpacePage(p);
+        }
       }
     }
     new_space_evacuation_pages_.clear();
 
+    if (is_new_space_shrinking_) {
+      DCHECK(v8_flags.minor_mc);
+      heap()->paged_new_space()->FinishShrinking();
+      is_new_space_shrinking_ = false;
+    }
+
+    if (heap()->new_space()) {
+      TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_EVACUATE_REBALANCE);
+      if (!heap()->new_space()->EnsureCurrentCapacity()) {
+        heap()->FatalProcessOutOfMemory("NewSpace::Rebalance");
+      }
+    }
+
     for (LargePage* p : promoted_large_pages_) {
       DCHECK(p->IsFlagSet(Page::PAGE_NEW_OLD_PROMOTION));
       p->ClearFlag(Page::PAGE_NEW_OLD_PROMOTION);
@@ -4874,7 +4750,9 @@ class RememberedSetUpdatingItem : public UpdatingItem {
       : heap_(heap),
         marking_state_(marking_state),
         chunk_(chunk),
-        updating_mode_(updating_mode) {}
+        updating_mode_(updating_mode),
+        record_old_to_shared_slots_(heap->isolate()->has_shared_heap() &&
+                                    !chunk->InSharedHeap()) {}
   ~RememberedSetUpdatingItem() override = default;
 
   void Process() override {
@@ -4988,7 +4866,6 @@ class RememberedSetUpdatingItem : public UpdatingItem {
   }
 
   void UpdateUntypedPointers() {
-    const bool has_shared_isolate = this->heap_->isolate()->shared_isolate();
     const PtrComprCageBase cage_base = heap_->isolate();
     if (chunk_->slot_set<OLD_TO_NEW, AccessMode::NON_ATOMIC>() != nullptr) {
       // Marking bits are cleared already when the page is already swept. This
@@ -5003,12 +4880,12 @@ class RememberedSetUpdatingItem : public UpdatingItem {
           InvalidatedSlotsFilter::OldToNew(chunk_, liveness_check);
       int slots = RememberedSet<OLD_TO_NEW>::Iterate(
           chunk_,
-          [this, &filter, has_shared_isolate, cage_base](MaybeObjectSlot slot) {
+          [this, &filter, cage_base](MaybeObjectSlot slot) {
             if (!filter.IsValid(slot.address())) return REMOVE_SLOT;
             SlotCallbackResult result = CheckAndUpdateOldToNewSlot(slot);
             // A new space string might have been promoted into the shared heap
             // during GC.
-            if (has_shared_isolate) {
+            if (record_old_to_shared_slots_) {
               CheckSlotForOldToSharedUntyped(cage_base, chunk_, slot);
             }
             return result;
@@ -5034,12 +4911,12 @@ class RememberedSetUpdatingItem : public UpdatingItem {
           chunk_, InvalidatedSlotsFilter::LivenessCheck::kNo);
       RememberedSet<OLD_TO_OLD>::Iterate(
           chunk_,
-          [this, has_shared_isolate, &filter, cage_base](MaybeObjectSlot slot) {
+          [this, &filter, cage_base](MaybeObjectSlot slot) {
             if (filter.IsValid(slot.address())) {
               UpdateSlot<AccessMode::NON_ATOMIC>(cage_base, slot);
               // A string might have been promoted into the shared heap during
               // GC.
-              if (has_shared_isolate) {
+              if (record_old_to_shared_slots_) {
                 CheckSlotForOldToSharedUntyped(cage_base, chunk_, slot);
               }
             }
@@ -5104,7 +4981,6 @@ class RememberedSetUpdatingItem : public UpdatingItem {
   }
 
   void UpdateTypedPointers() {
-    const bool has_shared_isolate = heap_->isolate()->shared_isolate();
     if (chunk_->typed_slot_set<OLD_TO_NEW, AccessMode::NON_ATOMIC>() !=
         nullptr) {
       CHECK_NE(chunk_->owner(), heap_->map_space());
@@ -5113,14 +4989,13 @@ class RememberedSetUpdatingItem : public UpdatingItem {
             return CheckAndUpdateOldToNewSlot(slot);
           };
       RememberedSet<OLD_TO_NEW>::IterateTyped(
-          chunk_,
-          [this, has_shared_isolate, &check_and_update_old_to_new_slot_fn](
-              SlotType slot_type, Address slot) {
+          chunk_, [this, &check_and_update_old_to_new_slot_fn](
+                      SlotType slot_type, Address slot) {
             SlotCallbackResult result = UpdateTypedSlotHelper::UpdateTypedSlot(
                 heap_, slot_type, slot, check_and_update_old_to_new_slot_fn);
             // A new space string might have been promoted into the shared heap
             // during GC.
-            if (has_shared_isolate) {
+            if (record_old_to_shared_slots_) {
               CheckSlotForOldToSharedTyped(chunk_, slot_type, slot);
             }
             return result;
@@ -5131,7 +5006,7 @@ class RememberedSetUpdatingItem : public UpdatingItem {
          nullptr)) {
       CHECK_NE(chunk_->owner(), heap_->map_space());
       RememberedSet<OLD_TO_OLD>::IterateTyped(
-          chunk_, [this, has_shared_isolate](SlotType slot_type, Address slot) {
+          chunk_, [this](SlotType slot_type, Address slot) {
             // Using UpdateStrongSlot is OK here, because there are no weak
             // typed slots.
             PtrComprCageBase cage_base = heap_->isolate();
@@ -5143,7 +5018,7 @@ class RememberedSetUpdatingItem : public UpdatingItem {
                   return KEEP_SLOT;
                 });
             // A string might have been promoted into the shared heap during GC.
-            if (has_shared_isolate) {
+            if (record_old_to_shared_slots_) {
               CheckSlotForOldToSharedTyped(chunk_, slot_type, slot);
             }
             return result;
@@ -5156,6 +5031,7 @@ class RememberedSetUpdatingItem : public UpdatingItem {
   MarkingState* marking_state_;
   MemoryChunk* chunk_;
   RememberedSetUpdatingMode updating_mode_;
+  const bool record_old_to_shared_slots_;
 };
 
 std::unique_ptr<UpdatingItem>
@@ -5294,11 +5170,21 @@ void MarkCompactCollector::UpdatePointersAfterEvacuation() {
     CollectRememberedSetUpdatingItems(this, &updating_items,
                                       heap()->code_space(),
                                       RememberedSetUpdatingMode::ALL);
+    if (heap()->shared_space()) {
+      CollectRememberedSetUpdatingItems(this, &updating_items,
+                                        heap()->shared_space(),
+                                        RememberedSetUpdatingMode::ALL);
+    }
     CollectRememberedSetUpdatingItems(this, &updating_items, heap()->lo_space(),
                                       RememberedSetUpdatingMode::ALL);
     CollectRememberedSetUpdatingItems(this, &updating_items,
                                       heap()->code_lo_space(),
                                       RememberedSetUpdatingMode::ALL);
+    if (heap()->shared_lo_space()) {
+      CollectRememberedSetUpdatingItems(this, &updating_items,
+                                        heap()->shared_lo_space(),
+                                        RememberedSetUpdatingMode::ALL);
+    }
     if (heap()->map_space()) {
       CollectRememberedSetUpdatingItems(this, &updating_items,
                                         heap()->map_space(),
@@ -5336,10 +5222,12 @@ void MarkCompactCollector::UpdatePointersAfterEvacuation() {
 }
 
 void MarkCompactCollector::UpdatePointersInClientHeaps() {
-  if (!isolate()->is_shared()) return;
+  if (!isolate()->is_shared_heap_isolate()) return;
 
-  isolate()->global_safepoint()->IterateClientIsolates(
-      [this](Isolate* client) { UpdatePointersInClientHeap(client); });
+  isolate()->global_safepoint()->IterateClientIsolates([this](Isolate* client) {
+    if (client->is_shared_heap_isolate()) return;
+    UpdatePointersInClientHeap(client);
+  });
 }
 
 void MarkCompactCollector::UpdatePointersInClientHeap(Isolate* client) {
@@ -5372,25 +5260,10 @@ void MarkCompactCollector::UpdatePointersInClientHeap(Isolate* client) {
     });
     if (chunk->InYoungGeneration()) chunk->ReleaseTypedSlotSet<OLD_TO_SHARED>();
   }
-
-#ifdef VERIFY_HEAP
-  if (v8_flags.verify_heap) {
-    ClientHeapVerifier verifier_visitor(client->heap());
-
-    HeapObjectIterator iterator(client->heap(),
-                                HeapObjectIterator::kNoFiltering);
-    for (HeapObject obj = iterator.Next(); !obj.is_null();
-         obj = iterator.Next()) {
-      obj.IterateFast(cage_base, &verifier_visitor);
-    }
-  }
-#endif  // VERIFY_HEAP
 }
 
 void MarkCompactCollector::ReportAbortedEvacuationCandidateDueToOOM(
     Address failed_start, Page* page) {
-  DCHECK(!page->IsFlagSet(Page::COMPACTION_WAS_ABORTED));
-  page->SetFlag(Page::COMPACTION_WAS_ABORTED);
   base::MutexGuard guard(&mutex_);
   aborted_evacuation_candidates_due_to_oom_.push_back(
       std::make_pair(failed_start, page));
@@ -5407,11 +5280,10 @@ void MarkCompactCollector::ReportAbortedEvacuationCandidateDueToFlags(
 
 namespace {
 
-void ReRecordPage(Heap* heap,
-                  v8::internal::NonAtomicMarkingState* marking_state,
-                  Address failed_start, Page* page) {
+void ReRecordPage(Heap* heap, Address failed_start, Page* page) {
   DCHECK(page->IsFlagSet(Page::COMPACTION_WAS_ABORTED));
 
+  NonAtomicMarkingState* marking_state = heap->non_atomic_marking_state();
   // Aborted compaction page. We have to record slots here, since we
   // might not have recorded them in first place.
 
@@ -5457,12 +5329,15 @@ size_t MarkCompactCollector::PostProcessAbortedEvacuationCandidates() {
   CHECK_IMPLIES(v8_flags.crash_on_aborted_evacuation,
                 aborted_evacuation_candidates_due_to_oom_.empty());
   for (auto start_and_page : aborted_evacuation_candidates_due_to_oom_) {
-    ReRecordPage(heap(), non_atomic_marking_state(), start_and_page.first,
-                 start_and_page.second);
+    Page* page = start_and_page.second;
+    DCHECK(!page->IsFlagSet(Page::COMPACTION_WAS_ABORTED));
+    page->SetFlag(Page::COMPACTION_WAS_ABORTED);
+  }
+  for (auto start_and_page : aborted_evacuation_candidates_due_to_oom_) {
+    ReRecordPage(heap(), start_and_page.first, start_and_page.second);
   }
   for (auto start_and_page : aborted_evacuation_candidates_due_to_flags_) {
-    ReRecordPage(heap(), non_atomic_marking_state(), start_and_page.first,
-                 start_and_page.second);
+    ReRecordPage(heap(), start_and_page.first, start_and_page.second);
   }
   const size_t aborted_pages =
       aborted_evacuation_candidates_due_to_oom_.size() +
@@ -5476,163 +5351,72 @@ size_t MarkCompactCollector::PostProcessAbortedEvacuationCandidates() {
       // the evacuation candidate flag the page is again in a regular state.
       p->ClearEvacuationCandidate();
       aborted_pages_verified++;
-    } else {
-      DCHECK(p->IsEvacuationCandidate());
-      DCHECK(p->SweepingDone());
-    }
-  }
-  DCHECK_EQ(aborted_pages_verified, aborted_pages);
-  USE(aborted_pages_verified);
-  return aborted_pages;
-}
-
-void MarkCompactCollector::ReleaseEvacuationCandidates() {
-  for (Page* p : old_space_evacuation_pages_) {
-    if (!p->IsEvacuationCandidate()) continue;
-    PagedSpace* space = static_cast<PagedSpace*>(p->owner());
-    non_atomic_marking_state()->SetLiveBytes(p, 0);
-    CHECK(p->SweepingDone());
-    space->memory_chunk_list().Remove(p);
-    space->ReleasePage(p);
-  }
-  old_space_evacuation_pages_.clear();
-  compacting_ = false;
-}
-
-void MarkCompactCollector::SweepLargeSpace(LargeObjectSpace* space) {
-  auto* marking_state =
-      heap()->incremental_marking()->non_atomic_marking_state();
-  PtrComprCageBase cage_base(heap()->isolate());
-  size_t surviving_object_size = 0;
-  for (auto it = space->begin(); it != space->end();) {
-    LargePage* current = *(it++);
-    HeapObject object = current->GetObject();
-    DCHECK(!marking_state->IsGrey(object));
-    if (!marking_state->IsBlack(object)) {
-      // Object is dead and page can be released.
-      space->RemovePage(current);
-      heap()->memory_allocator()->Free(MemoryAllocator::FreeMode::kConcurrently,
-                                       current);
-
-      continue;
-    }
-    Marking::MarkWhite(non_atomic_marking_state()->MarkBitFrom(object));
-    current->ProgressBar().ResetIfEnabled();
-    non_atomic_marking_state()->SetLiveBytes(current, 0);
-    surviving_object_size += static_cast<size_t>(object.Size(cage_base));
-  }
-  space->set_objects_size(surviving_object_size);
-}
-
-void MarkCompactCollector::StartSweepSpace(PagedSpace* space) {
-  space->ClearAllocatorState();
-
-  int will_be_swept = 0;
-  bool unused_page_present = false;
-
-  // Loop needs to support deletion if live bytes == 0 for a page.
-  for (auto it = space->begin(); it != space->end();) {
-    Page* p = *(it++);
-    DCHECK(p->SweepingDone());
-
-    if (p->IsEvacuationCandidate()) {
-      // Will be processed in Evacuate.
-      DCHECK(!evacuation_candidates_.empty());
-      continue;
-    }
-
-    // One unused page is kept, all further are released before sweeping them.
-    if (non_atomic_marking_state()->live_bytes(p) == 0) {
-      if (unused_page_present) {
-        if (v8_flags.gc_verbose) {
-          PrintIsolate(isolate(), "sweeping: released page: %p",
-                       static_cast<void*>(p));
-        }
-        space->memory_chunk_list().Remove(p);
-        space->ReleasePage(p);
-        continue;
-      }
-      unused_page_present = true;
-    }
-
-    sweeper()->AddPage(space->identity(), p, Sweeper::REGULAR);
-    will_be_swept++;
-  }
-
-  if (v8_flags.gc_verbose) {
-    PrintIsolate(isolate(), "sweeping: space=%s initialized_for_sweeping=%d",
-                 space->name(), will_be_swept);
-  }
-}
-
-void MarkCompactCollector::StartSweepNewSpace() {
-  PagedSpaceBase* paged_space = heap()->paged_new_space()->paged_space();
-  paged_space->ClearAllocatorState();
-
-  int will_be_swept = 0;
-
-  for (auto it = paged_space->begin(); it != paged_space->end();) {
-    Page* p = *(it++);
-    DCHECK(p->SweepingDone());
-
-    if (non_atomic_marking_state()->live_bytes(p) > 0) {
-      // Non-empty pages will be evacuated/promoted.
-      continue;
+    } else {
+      DCHECK(p->IsEvacuationCandidate());
+      DCHECK(p->SweepingDone());
     }
-
-    // New space preallocates all its pages. Don't free empty pages since they
-    // will just be reallocated.
-    DCHECK_EQ(NEW_SPACE, paged_space->identity());
-    sweeper_->AddPage(NEW_SPACE, p, Sweeper::REGULAR);
-    will_be_swept++;
   }
+  DCHECK_EQ(aborted_pages_verified, aborted_pages);
+  USE(aborted_pages_verified);
+  return aborted_pages;
+}
 
-  if (v8_flags.gc_verbose) {
-    PrintIsolate(isolate(), "sweeping: space=%s initialized_for_sweeping=%d",
-                 paged_space->name(), will_be_swept);
+void MarkCompactCollector::ReleaseEvacuationCandidates() {
+  for (Page* p : old_space_evacuation_pages_) {
+    if (!p->IsEvacuationCandidate()) continue;
+    PagedSpace* space = static_cast<PagedSpace*>(p->owner());
+    non_atomic_marking_state()->SetLiveBytes(p, 0);
+    CHECK(p->SweepingDone());
+    space->ReleasePage(p);
   }
+  old_space_evacuation_pages_.clear();
+  compacting_ = false;
 }
 
 void MarkCompactCollector::Sweep() {
+  DCHECK(!sweeper()->sweeping_in_progress());
   TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_SWEEP);
 #ifdef DEBUG
   state_ = SWEEP_SPACES;
 #endif
 
   {
-    {
-      GCTracer::Scope sweep_scope(
-          heap()->tracer(), GCTracer::Scope::MC_SWEEP_LO, ThreadKind::kMain);
-      SweepLargeSpace(heap()->lo_space());
-    }
-    {
-      GCTracer::Scope sweep_scope(heap()->tracer(),
-                                  GCTracer::Scope::MC_SWEEP_CODE_LO,
-                                  ThreadKind::kMain);
-      SweepLargeSpace(heap()->code_lo_space());
-    }
-    {
-      GCTracer::Scope sweep_scope(
-          heap()->tracer(), GCTracer::Scope::MC_SWEEP_OLD, ThreadKind::kMain);
-      StartSweepSpace(heap()->old_space());
-    }
-    {
-      GCTracer::Scope sweep_scope(
-          heap()->tracer(), GCTracer::Scope::MC_SWEEP_CODE, ThreadKind::kMain);
-      StartSweepSpace(heap()->code_space());
-    }
-    if (heap()->map_space()) {
-      GCTracer::Scope sweep_scope(
-          heap()->tracer(), GCTracer::Scope::MC_SWEEP_MAP, ThreadKind::kMain);
-      StartSweepSpace(heap()->map_space());
-    }
-    if (v8_flags.minor_mc && heap()->new_space()) {
-      GCTracer::Scope sweep_scope(
-          heap()->tracer(), GCTracer::Scope::MC_SWEEP_NEW, ThreadKind::kMain);
-      StartSweepNewSpace();
-    }
-    sweeper()->StartSweeping();
+    GCTracer::Scope sweep_scope(heap()->tracer(), GCTracer::Scope::MC_SWEEP_LO,
+                                ThreadKind::kMain);
+    SweepLargeSpace(heap()->lo_space());
+  }
+  {
+    GCTracer::Scope sweep_scope(
+        heap()->tracer(), GCTracer::Scope::MC_SWEEP_CODE_LO, ThreadKind::kMain);
+    SweepLargeSpace(heap()->code_lo_space());
+  }
+  {
+    GCTracer::Scope sweep_scope(heap()->tracer(), GCTracer::Scope::MC_SWEEP_OLD,
+                                ThreadKind::kMain);
+    StartSweepSpace(heap()->old_space());
+  }
+  {
+    GCTracer::Scope sweep_scope(
+        heap()->tracer(), GCTracer::Scope::MC_SWEEP_CODE, ThreadKind::kMain);
+    StartSweepSpace(heap()->code_space());
+  }
+  if (heap()->map_space()) {
+    GCTracer::Scope sweep_scope(heap()->tracer(), GCTracer::Scope::MC_SWEEP_MAP,
+                                ThreadKind::kMain);
+    StartSweepSpace(heap()->map_space());
+  }
+  if (heap()->shared_space()) {
+    GCTracer::Scope sweep_scope(heap()->tracer(), GCTracer::Scope::MC_SWEEP_MAP,
+                                ThreadKind::kMain);
+    StartSweepSpace(heap()->shared_space());
   }
+  if (v8_flags.minor_mc && heap()->new_space()) {
+    GCTracer::Scope sweep_scope(heap()->tracer(), GCTracer::Scope::MC_SWEEP_NEW,
+                                ThreadKind::kMain);
+    StartSweepNewSpace();
+  }
+
+  sweeper()->StartSweeping(garbage_collector_);
 }
 
 namespace {
@@ -5643,8 +5427,7 @@ class YoungGenerationMarkingVerifier : public MarkingVerifier {
  public:
   explicit YoungGenerationMarkingVerifier(Heap* heap)
       : MarkingVerifier(heap),
-        marking_state_(
-            heap->minor_mark_compact_collector()->non_atomic_marking_state()) {}
+        marking_state_(heap->non_atomic_marking_state()) {}
 
   ConcurrentBitmap<AccessMode::NON_ATOMIC>* bitmap(
       const MemoryChunk* chunk) override {
@@ -5708,75 +5491,15 @@ class YoungGenerationMarkingVerifier : public MarkingVerifier {
     }
   }
 
-  NonAtomicMarkingState* marking_state_;
-};
-
-class YoungGenerationEvacuationVerifier : public EvacuationVerifier {
- public:
-  explicit YoungGenerationEvacuationVerifier(Heap* heap)
-      : EvacuationVerifier(heap) {}
-
-  void Run() override {
-    DCHECK(!heap_->mark_compact_collector()->sweeping_in_progress());
-    DCHECK(!heap_->minor_mark_compact_collector()->sweeping_in_progress());
-    VerifyRoots();
-    VerifyEvacuation(heap_->new_space());
-    VerifyEvacuation(heap_->old_space());
-    VerifyEvacuation(heap_->code_space());
-    if (heap_->map_space()) VerifyEvacuation(heap_->map_space());
-  }
-
- protected:
-  V8_INLINE void VerifyHeapObjectImpl(HeapObject heap_object) {
-    CHECK_IMPLIES(Heap::InYoungGeneration(heap_object),
-                  Heap::InToPage(heap_object));
-  }
-
-  template <typename TSlot>
-  void VerifyPointersImpl(TSlot start, TSlot end) {
-    for (TSlot current = start; current < end; ++current) {
-      typename TSlot::TObject object = current.load(cage_base());
-      HeapObject heap_object;
-      if (object.GetHeapObject(&heap_object)) {
-        VerifyHeapObjectImpl(heap_object);
-      }
-    }
-  }
-  void VerifyMap(Map map) override { VerifyHeapObjectImpl(map); }
-  void VerifyPointers(ObjectSlot start, ObjectSlot end) override {
-    VerifyPointersImpl(start, end);
-  }
-  void VerifyPointers(MaybeObjectSlot start, MaybeObjectSlot end) override {
-    VerifyPointersImpl(start, end);
-  }
-  void VerifyCodePointer(CodeObjectSlot slot) override {
-    CHECK(V8_EXTERNAL_CODE_SPACE_BOOL);
-    Object maybe_code = slot.load(code_cage_base());
-    HeapObject code;
-    // The slot might contain smi during CodeDataContainer creation, so skip it.
-    if (maybe_code.GetHeapObject(&code)) {
-      VerifyHeapObjectImpl(code);
-    }
-  }
-  void VisitCodeTarget(Code host, RelocInfo* rinfo) override {
-    Code target = Code::GetCodeFromTargetAddress(rinfo->target_address());
-    VerifyHeapObjectImpl(target);
-  }
-  void VisitEmbeddedPointer(Code host, RelocInfo* rinfo) override {
-    VerifyHeapObjectImpl(rinfo->target_object(cage_base()));
-  }
-  void VerifyRootPointers(FullObjectSlot start, FullObjectSlot end) override {
-    VerifyPointersImpl(start, end);
-  }
+  NonAtomicMarkingState* const marking_state_;
 };
 
 #endif  // VERIFY_HEAP
 
 bool IsUnmarkedObjectForYoungGeneration(Heap* heap, FullObjectSlot p) {
   DCHECK_IMPLIES(Heap::InYoungGeneration(*p), Heap::InToPage(*p));
-  return Heap::InYoungGeneration(*p) && !heap->minor_mark_compact_collector()
-                                             ->non_atomic_marking_state()
-                                             ->IsBlack(HeapObject::cast(*p));
+  return Heap::InYoungGeneration(*p) &&
+         !heap->non_atomic_marking_state()->IsBlack(HeapObject::cast(*p));
 }
 
 }  // namespace
@@ -5821,7 +5544,7 @@ constexpr size_t MinorMarkCompactCollector::kMaxParallelTasks;
 MinorMarkCompactCollector::MinorMarkCompactCollector(Heap* heap)
     : CollectorBase(heap, GarbageCollector::MINOR_MARK_COMPACTOR),
       page_parallel_job_semaphore_(0),
-      sweeper_(std::make_unique<Sweeper>(heap_, non_atomic_marking_state())) {}
+      sweeper_(heap_->sweeper()) {}
 
 std::pair<size_t, size_t> MinorMarkCompactCollector::ProcessMarkingWorklist(
     size_t bytes_to_process) {
@@ -5872,8 +5595,7 @@ class YoungGenerationMigrationObserver final : public MigrationObserver {
     // Migrate color to old generation marking in case the object survived
     // young generation garbage collection.
     if (heap_->incremental_marking()->IsMarking()) {
-      DCHECK(
-          heap_->incremental_marking()->atomic_marking_state()->IsWhite(dst));
+      DCHECK(heap_->atomic_marking_state()->IsWhite(dst));
       heap_->incremental_marking()->TransferColor(src, dst);
     }
   }
@@ -5886,9 +5608,8 @@ class YoungGenerationMigrationObserver final : public MigrationObserver {
 class YoungGenerationRecordMigratedSlotVisitor final
     : public RecordMigratedSlotVisitor {
  public:
-  explicit YoungGenerationRecordMigratedSlotVisitor(
-      MarkCompactCollector* collector)
-      : RecordMigratedSlotVisitor(collector, nullptr) {}
+  explicit YoungGenerationRecordMigratedSlotVisitor(Heap* heap)
+      : RecordMigratedSlotVisitor(heap, nullptr) {}
 
   void VisitCodeTarget(Code host, RelocInfo* rinfo) final { UNREACHABLE(); }
   void VisitEmbeddedPointer(Code host, RelocInfo* rinfo) final {
@@ -5904,7 +5625,7 @@ class YoungGenerationRecordMigratedSlotVisitor final
   // Only record slots for host objects that are considered as live by the
   // full collector.
   inline bool IsLive(HeapObject object) {
-    return collector_->non_atomic_marking_state()->IsBlack(object);
+    return heap_->non_atomic_marking_state()->IsBlack(object);
   }
 
   inline void RecordMigratedSlot(HeapObject host, MaybeObject value,
@@ -5928,6 +5649,10 @@ class YoungGenerationRecordMigratedSlotVisitor final
           RememberedSet<OLD_TO_OLD>::Insert<AccessMode::NON_ATOMIC>(
               MemoryChunk::FromHeapObject(host), slot);
         }
+      } else if (p->InSharedHeap()) {
+        DCHECK(!host.InSharedWritableHeap());
+        RememberedSet<OLD_TO_SHARED>::Insert<AccessMode::NON_ATOMIC>(
+            MemoryChunk::FromHeapObject(host), slot);
       }
     }
   }
@@ -5939,25 +5664,28 @@ void MinorMarkCompactCollector::UpdatePointersAfterEvacuation() {
 
   std::vector<std::unique_ptr<UpdatingItem>> updating_items;
 
-  // Create batches of global handles.
-  CollectRememberedSetUpdatingItems(this, &updating_items, heap()->old_space(),
-                                    RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
-  CollectRememberedSetUpdatingItems(this, &updating_items, heap()->code_space(),
-                                    RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
-  if (heap()->map_space()) {
-    CollectRememberedSetUpdatingItems(
-        this, &updating_items, heap()->map_space(),
-        RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
-  }
-  CollectRememberedSetUpdatingItems(this, &updating_items, heap()->lo_space(),
-                                    RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
-  CollectRememberedSetUpdatingItems(this, &updating_items,
-                                    heap()->code_lo_space(),
-                                    RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
-
   {
     TRACE_GC(heap()->tracer(),
              GCTracer::Scope::MINOR_MC_EVACUATE_UPDATE_POINTERS_SLOTS);
+    // Create batches of global handles.
+    CollectRememberedSetUpdatingItems(
+        this, &updating_items, heap()->old_space(),
+        RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
+    CollectRememberedSetUpdatingItems(
+        this, &updating_items, heap()->code_space(),
+        RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
+    if (heap()->map_space()) {
+      CollectRememberedSetUpdatingItems(
+          this, &updating_items, heap()->map_space(),
+          RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
+    }
+    CollectRememberedSetUpdatingItems(
+        this, &updating_items, heap()->lo_space(),
+        RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
+    CollectRememberedSetUpdatingItems(
+        this, &updating_items, heap()->code_lo_space(),
+        RememberedSetUpdatingMode::OLD_TO_NEW_ONLY);
+
     V8::GetCurrentPlatform()
         ->CreateJob(
             v8::TaskPriority::kUserBlocking,
@@ -6027,17 +5755,26 @@ void MinorMarkCompactCollector::StartMarking() {
 }
 
 void MinorMarkCompactCollector::Finish() {
-  TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_FINISH);
-
   {
-    // Keep new space sweeping atomic.
-    GCTracer::Scope sweep_scope(heap()->tracer(),
-                                GCTracer::Scope::MC_FINISH_SWEEP_NEW,
-                                ThreadKind::kMain);
-    sweeper_->EnsureCompleted(Sweeper::SweepingMode::kEagerDuringGC);
-    heap()->paged_new_space()->paged_space()->RefillFreeList(sweeper());
+    TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_SWEEP);
+    {
+      DCHECK_NOT_NULL(heap()->new_lo_space());
+      TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_SWEEP_NEW_LO);
+      SweepLargeSpace(heap()->new_lo_space());
+    }
+
+    {
+      // Keep new space sweeping atomic.
+      GCTracer::Scope sweep_scope(heap()->tracer(),
+                                  GCTracer::Scope::MINOR_MC_SWEEP_FINISH_NEW,
+                                  ThreadKind::kMain);
+      sweeper_->EnsureCompleted(Sweeper::SweepingMode::kEagerDuringGC);
+      heap()->paged_new_space()->paged_space()->RefillFreeList();
+    }
   }
 
+  TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_FINISH);
+
   local_marking_worklists_.reset();
   main_marking_visitor_.reset();
 }
@@ -6070,25 +5807,6 @@ void MinorMarkCompactCollector::CollectGarbage() {
   }
 #endif  // VERIFY_HEAP
 
-  {
-    TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_MARKING_DEQUE);
-    heap()->incremental_marking()->UpdateMarkingWorklistAfterYoungGenGC();
-  }
-
-  {
-    TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_RESET_LIVENESS);
-    // Since we promote all surviving large objects immediately, all remaining
-    // large objects must be dead.
-    NonAtomicMarkingState* marking_state = non_atomic_marking_state();
-    heap()->new_lo_space()->FreeDeadObjects([marking_state](HeapObject obj) {
-      // New large object space is not swept and markbits for non-promoted
-      // objects are still in tact.
-      USE(marking_state);
-      DCHECK(marking_state->IsWhite(obj));
-      return true;
-    });
-  }
-
   CleanupPromotedPages();
 
   SweepArrayBufferExtensions();
@@ -6101,7 +5819,6 @@ void MinorMarkCompactCollector::MakeIterable(
   CHECK(!p->IsLargePage());
   // We have to clear the full collectors markbits for the areas that we
   // remove here.
-  MarkCompactCollector* full_collector = heap()->mark_compact_collector();
   Address free_start = p->area_start();
 
   for (auto object_and_size :
@@ -6112,7 +5829,7 @@ void MinorMarkCompactCollector::MakeIterable(
     if (free_end != free_start) {
       CHECK_GT(free_end, free_start);
       size_t size = static_cast<size_t>(free_end - free_start);
-      full_collector->non_atomic_marking_state()->bitmap(p)->ClearRange(
+      heap()->non_atomic_marking_state()->bitmap(p)->ClearRange(
           p->AddressToMarkbitIndex(free_start),
           p->AddressToMarkbitIndex(free_end));
       if (free_space_mode == FreeSpaceTreatmentMode::kZapFreeSpace) {
@@ -6129,7 +5846,7 @@ void MinorMarkCompactCollector::MakeIterable(
   if (free_start != p->area_end()) {
     CHECK_GT(p->area_end(), free_start);
     size_t size = static_cast<size_t>(p->area_end() - free_start);
-    full_collector->non_atomic_marking_state()->bitmap(p)->ClearRange(
+    heap()->non_atomic_marking_state()->bitmap(p)->ClearRange(
         p->AddressToMarkbitIndex(free_start),
         p->AddressToMarkbitIndex(p->area_end()));
     if (free_space_mode == FreeSpaceTreatmentMode::kZapFreeSpace) {
@@ -6144,10 +5861,8 @@ namespace {
 // Helper class for pruning the string table.
 class YoungGenerationExternalStringTableCleaner : public RootVisitor {
  public:
-  explicit YoungGenerationExternalStringTableCleaner(
-      MinorMarkCompactCollector* collector)
-      : heap_(collector->heap()),
-        marking_state_(collector->non_atomic_marking_state()) {}
+  explicit YoungGenerationExternalStringTableCleaner(Heap* heap)
+      : heap_(heap), marking_state_(heap_->non_atomic_marking_state()) {}
 
   void VisitRootPointers(Root root, const char* description,
                          FullObjectSlot start, FullObjectSlot end) override {
@@ -6173,8 +5888,8 @@ class YoungGenerationExternalStringTableCleaner : public RootVisitor {
   }
 
  private:
-  Heap* heap_;
-  NonAtomicMarkingState* marking_state_;
+  Heap* const heap_;
+  NonAtomicMarkingState* const marking_state_;
 };
 
 }  // namespace
@@ -6186,7 +5901,7 @@ void MinorMarkCompactCollector::ClearNonLiveReferences() {
     TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_CLEAR_STRING_TABLE);
     // Internalized strings are always stored in old space, so there is no
     // need to clean them here.
-    YoungGenerationExternalStringTableCleaner external_visitor(this);
+    YoungGenerationExternalStringTableCleaner external_visitor(heap());
     heap()->external_string_table_.IterateYoung(&external_visitor);
     heap()->external_string_table_.CleanUpYoung();
   }
@@ -6220,16 +5935,14 @@ MinorMarkCompactCollector::CreateRememberedSetUpdatingItem(
 
 class PageMarkingItem;
 class RootMarkingItem;
-class YoungGenerationMarkingTask;
 
 class YoungGenerationMarkingTask {
  public:
-  YoungGenerationMarkingTask(Isolate* isolate,
-                             MinorMarkCompactCollector* collector,
+  YoungGenerationMarkingTask(Isolate* isolate, Heap* heap,
                              MarkingWorklists* global_worklists)
       : marking_worklists_local_(
             std::make_unique<MarkingWorklists::Local>(global_worklists)),
-        marking_state_(collector->marking_state()),
+        marking_state_(heap->marking_state()),
         visitor_(isolate, marking_state_, marking_worklists_local()) {}
 
   void MarkObject(Object object) {
@@ -6250,6 +5963,8 @@ class YoungGenerationMarkingTask {
     }
   }
 
+  void PublishMarkingWorklist() { marking_worklists_local_->Publish(); }
+
   MarkingWorklists::Local* marking_worklists_local() {
     return marking_worklists_local_.get();
   }
@@ -6260,155 +5975,138 @@ class YoungGenerationMarkingTask {
   YoungGenerationMainMarkingVisitor visitor_;
 };
 
-class PageMarkingItem : public ParallelWorkItem {
- public:
-  explicit PageMarkingItem(MemoryChunk* chunk) : chunk_(chunk) {}
-  ~PageMarkingItem() = default;
-
-  void Process(YoungGenerationMarkingTask* task) {
-    TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.gc"),
-                 "PageMarkingItem::Process");
-    base::MutexGuard guard(chunk_->mutex());
-    MarkUntypedPointers(task);
-    MarkTypedPointers(task);
-  }
-
- private:
-  inline Heap* heap() { return chunk_->heap(); }
-
-  void MarkUntypedPointers(YoungGenerationMarkingTask* task) {
-    InvalidatedSlotsFilter filter = InvalidatedSlotsFilter::OldToNew(
-        chunk_, InvalidatedSlotsFilter::LivenessCheck::kNo);
-    RememberedSet<OLD_TO_NEW>::Iterate(
-        chunk_,
-        [this, task, &filter](MaybeObjectSlot slot) {
-          if (!filter.IsValid(slot.address())) return REMOVE_SLOT;
-          return CheckAndMarkObject(task, slot);
-        },
-        SlotSet::FREE_EMPTY_BUCKETS);
-  }
+void PageMarkingItem::Process(YoungGenerationMarkingTask* task) {
+  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.gc"), "PageMarkingItem::Process");
+  base::MutexGuard guard(chunk_->mutex());
+  MarkUntypedPointers(task);
+  MarkTypedPointers(task);
+}
+
+void PageMarkingItem::MarkUntypedPointers(YoungGenerationMarkingTask* task) {
+  InvalidatedSlotsFilter filter = InvalidatedSlotsFilter::OldToNew(
+      chunk_, InvalidatedSlotsFilter::LivenessCheck::kNo);
+  RememberedSet<OLD_TO_NEW>::Iterate(
+      chunk_,
+      [this, task, &filter](MaybeObjectSlot slot) {
+        if (!filter.IsValid(slot.address())) return REMOVE_SLOT;
+        return CheckAndMarkObject(task, slot);
+      },
+      SlotSet::FREE_EMPTY_BUCKETS);
+}
 
-  void MarkTypedPointers(YoungGenerationMarkingTask* task) {
-    RememberedSet<OLD_TO_NEW>::IterateTyped(
-        chunk_, [=](SlotType slot_type, Address slot) {
-          return UpdateTypedSlotHelper::UpdateTypedSlot(
-              heap(), slot_type, slot, [this, task](FullMaybeObjectSlot slot) {
-                return CheckAndMarkObject(task, slot);
-              });
-        });
-  }
+void PageMarkingItem::MarkTypedPointers(YoungGenerationMarkingTask* task) {
+  RememberedSet<OLD_TO_NEW>::IterateTyped(
+      chunk_, [=](SlotType slot_type, Address slot) {
+        return UpdateTypedSlotHelper::UpdateTypedSlot(
+            heap(), slot_type, slot, [this, task](FullMaybeObjectSlot slot) {
+              return CheckAndMarkObject(task, slot);
+            });
+      });
+}
 
-  template <typename TSlot>
-  V8_INLINE SlotCallbackResult
-  CheckAndMarkObject(YoungGenerationMarkingTask* task, TSlot slot) {
-    static_assert(
-        std::is_same<TSlot, FullMaybeObjectSlot>::value ||
-            std::is_same<TSlot, MaybeObjectSlot>::value,
-        "Only FullMaybeObjectSlot and MaybeObjectSlot are expected here");
-    MaybeObject object = *slot;
-    if (Heap::InYoungGeneration(object)) {
-      // Marking happens before flipping the young generation, so the object
-      // has to be in a to page.
-      DCHECK(Heap::InToPage(object));
-      HeapObject heap_object;
-      bool success = object.GetHeapObject(&heap_object);
-      USE(success);
-      DCHECK(success);
-      task->MarkObject(heap_object);
-      return KEEP_SLOT;
-    }
-    return REMOVE_SLOT;
+template <typename TSlot>
+V8_INLINE SlotCallbackResult PageMarkingItem::CheckAndMarkObject(
+    YoungGenerationMarkingTask* task, TSlot slot) {
+  static_assert(
+      std::is_same<TSlot, FullMaybeObjectSlot>::value ||
+          std::is_same<TSlot, MaybeObjectSlot>::value,
+      "Only FullMaybeObjectSlot and MaybeObjectSlot are expected here");
+  MaybeObject object = *slot;
+  if (Heap::InYoungGeneration(object)) {
+    // Marking happens before flipping the young generation, so the object
+    // has to be in a to page.
+    DCHECK(Heap::InToPage(object));
+    HeapObject heap_object;
+    bool success = object.GetHeapObject(&heap_object);
+    USE(success);
+    DCHECK(success);
+    task->MarkObject(heap_object);
+    return KEEP_SLOT;
   }
+  return REMOVE_SLOT;
+}
 
-  MemoryChunk* chunk_;
-};
-
-class YoungGenerationMarkingJob : public v8::JobTask {
- public:
-  YoungGenerationMarkingJob(Isolate* isolate,
-                            MinorMarkCompactCollector* collector,
-                            MarkingWorklists* global_worklists,
-                            std::vector<PageMarkingItem> marking_items)
-      : isolate_(isolate),
-        collector_(collector),
-        global_worklists_(global_worklists),
-        marking_items_(std::move(marking_items)),
-        remaining_marking_items_(marking_items_.size()),
-        generator_(marking_items_.size()) {}
-
-  void Run(JobDelegate* delegate) override {
-    if (delegate->IsJoiningThread()) {
-      TRACE_GC(collector_->heap()->tracer(),
-               GCTracer::Scope::MINOR_MC_MARK_PARALLEL);
-      ProcessItems(delegate);
-    } else {
-      TRACE_GC_EPOCH(collector_->heap()->tracer(),
-                     GCTracer::Scope::MINOR_MC_BACKGROUND_MARKING,
-                     ThreadKind::kBackground);
-      ProcessItems(delegate);
-    }
+void YoungGenerationMarkingJob::Run(JobDelegate* delegate) {
+  if (delegate->IsJoiningThread()) {
+    TRACE_GC(heap_->tracer(), GCTracer::Scope::MINOR_MC_MARK_PARALLEL);
+    ProcessItems(delegate);
+  } else {
+    TRACE_GC_EPOCH(heap_->tracer(),
+                   GCTracer::Scope::MINOR_MC_BACKGROUND_MARKING,
+                   ThreadKind::kBackground);
+    ProcessItems(delegate);
   }
+}
 
-  size_t GetMaxConcurrency(size_t worker_count) const override {
-    // Pages are not private to markers but we can still use them to estimate
-    // the amount of marking that is required.
-    const int kPagesPerTask = 2;
-    size_t items = remaining_marking_items_.load(std::memory_order_relaxed);
-    size_t num_tasks = std::max(
+size_t YoungGenerationMarkingJob::GetMaxConcurrency(size_t worker_count) const {
+  // Pages are not private to markers but we can still use them to estimate
+  // the amount of marking that is required.
+  const int kPagesPerTask = 2;
+  size_t items = remaining_marking_items_.load(std::memory_order_relaxed);
+  size_t num_tasks;
+  if (!incremental()) {
+    num_tasks = std::max(
         (items + 1) / kPagesPerTask,
         global_worklists_->shared()->Size() +
             global_worklists_->on_hold()
                 ->Size());  // TODO(v8:13012): If this is used with concurrent
                             // marking, we need to remove on_hold() here.
-    if (!v8_flags.parallel_marking) {
-      num_tasks = std::min<size_t>(1, num_tasks);
-    }
-    return std::min<size_t>(num_tasks,
-                            MinorMarkCompactCollector::kMaxParallelTasks);
+  } else {
+    num_tasks = (items + 1) / kPagesPerTask;
   }
 
- private:
-  void ProcessItems(JobDelegate* delegate) {
-    double marking_time = 0.0;
-    {
-      TimedScope scope(&marking_time);
-      YoungGenerationMarkingTask task(isolate_, collector_, global_worklists_);
-      ProcessMarkingItems(&task);
-      task.EmptyMarkingWorklist();
-    }
-    if (v8_flags.trace_minor_mc_parallel_marking) {
-      PrintIsolate(collector_->isolate(), "marking[%p]: time=%f\n",
-                   static_cast<void*>(this), marking_time);
-    }
+  if (!v8_flags.parallel_marking) {
+    num_tasks = std::min<size_t>(1, num_tasks);
   }
+  return std::min<size_t>(num_tasks,
+                          MinorMarkCompactCollector::kMaxParallelTasks);
+}
 
-  void ProcessMarkingItems(YoungGenerationMarkingTask* task) {
-    while (remaining_marking_items_.load(std::memory_order_relaxed) > 0) {
-      base::Optional<size_t> index = generator_.GetNext();
-      if (!index) return;
-      for (size_t i = *index; i < marking_items_.size(); ++i) {
-        auto& work_item = marking_items_[i];
-        if (!work_item.TryAcquire()) break;
-        work_item.Process(task);
+void YoungGenerationMarkingJob::ProcessItems(JobDelegate* delegate) {
+  double marking_time = 0.0;
+  {
+    TimedScope scope(&marking_time);
+    YoungGenerationMarkingTask task(isolate_, heap_, global_worklists_);
+    ProcessMarkingItems(&task);
+    if (!incremental()) {
+      task.EmptyMarkingWorklist();
+    } else {
+      task.PublishMarkingWorklist();
+    }
+  }
+  if (v8_flags.trace_minor_mc_parallel_marking) {
+    PrintIsolate(isolate_, "marking[%p]: time=%f\n", static_cast<void*>(this),
+                 marking_time);
+  }
+}
+
+void YoungGenerationMarkingJob::ProcessMarkingItems(
+    YoungGenerationMarkingTask* task) {
+  // TODO(v8:13012): YoungGenerationMarkingJob is generally used to compute the
+  // transitive closure. In the context of concurrent MinorMC, it currently only
+  // seeds the worklists from the old-to-new remembered set, but does not empty
+  // them (this is done concurrently). The class should be refactored to make
+  // this clearer.
+  while (remaining_marking_items_.load(std::memory_order_relaxed) > 0) {
+    base::Optional<size_t> index = generator_.GetNext();
+    if (!index) return;
+    for (size_t i = *index; i < marking_items_.size(); ++i) {
+      auto& work_item = marking_items_[i];
+      if (!work_item.TryAcquire()) break;
+      work_item.Process(task);
+      if (!incremental()) {
         task->EmptyMarkingWorklist();
-        if (remaining_marking_items_.fetch_sub(1, std::memory_order_relaxed) <=
-            1) {
-          return;
-        }
+      }
+      if (remaining_marking_items_.fetch_sub(1, std::memory_order_relaxed) <=
+          1) {
+        return;
       }
     }
   }
-
-  Isolate* isolate_;
-  MinorMarkCompactCollector* collector_;
-  MarkingWorklists* global_worklists_;
-  std::vector<PageMarkingItem> marking_items_;
-  std::atomic_size_t remaining_marking_items_{0};
-  IndexGenerator generator_;
-};
+}
 
 void MinorMarkCompactCollector::MarkRootSetInParallel(
-    RootMarkingVisitor* root_visitor) {
+    RootMarkingVisitor* root_visitor, bool was_marked_incrementally) {
   {
     std::vector<PageMarkingItem> marking_items;
 
@@ -6426,11 +6124,14 @@ void MinorMarkCompactCollector::MarkRootSetInParallel(
                                                 SkipRoot::kOldGeneration});
       isolate()->global_handles()->IterateYoungStrongAndDependentRoots(
           root_visitor);
-      // Create items for each page.
-      RememberedSet<OLD_TO_NEW>::IterateMemoryChunks(
-          heap(), [&marking_items](MemoryChunk* chunk) {
-            marking_items.emplace_back(chunk);
-          });
+
+      if (!was_marked_incrementally) {
+        // Create items for each page.
+        RememberedSet<OLD_TO_NEW>::IterateMemoryChunks(
+            heap(), [&marking_items](MemoryChunk* chunk) {
+              marking_items.emplace_back(chunk);
+            });
+      }
     }
 
     // Add tasks and run in parallel.
@@ -6439,12 +6140,14 @@ void MinorMarkCompactCollector::MarkRootSetInParallel(
       // 0. Flush to ensure these items are visible globally and picked up
       // by the job.
       local_marking_worklists_->Publish();
-      TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_MARK_ROOTS);
+      TRACE_GC(heap()->tracer(),
+               GCTracer::Scope::MINOR_MC_MARK_CLOSURE_PARALLEL);
       V8::GetCurrentPlatform()
-          ->CreateJob(v8::TaskPriority::kUserBlocking,
-                      std::make_unique<YoungGenerationMarkingJob>(
-                          isolate(), this, marking_worklists(),
-                          std::move(marking_items)))
+          ->CreateJob(
+              v8::TaskPriority::kUserBlocking,
+              std::make_unique<YoungGenerationMarkingJob>(
+                  isolate(), heap(), marking_worklists(),
+                  std::move(marking_items), YoungMarkingJobType::kAtomic))
           ->Join();
 
       DCHECK(local_marking_worklists_->IsEmpty());
@@ -6462,7 +6165,8 @@ void MinorMarkCompactCollector::MarkLiveObjects() {
 
   bool was_marked_incrementally = false;
   {
-    // TODO(v8:13012): TRACE_GC with MINOR_MC_MARK_FINISH_INCREMENTAL.
+    TRACE_GC(heap()->tracer(),
+             GCTracer::Scope::MINOR_MC_MARK_FINISH_INCREMENTAL);
     if (heap_->incremental_marking()->Stop()) {
       MarkingBarrier::PublishAll(heap());
       // TODO(v8:13012): TRACE_GC with MINOR_MC_MARK_FULL_CLOSURE_PARALLEL_JOIN.
@@ -6475,11 +6179,11 @@ void MinorMarkCompactCollector::MarkLiveObjects() {
 
   RootMarkingVisitor root_visitor(this);
 
-  MarkRootSetInParallel(&root_visitor);
+  MarkRootSetInParallel(&root_visitor, was_marked_incrementally);
 
   // Mark rest on the main thread.
   {
-    TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_MARK_WEAK);
+    TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_MARK_CLOSURE);
     DrainMarkingWorklist();
   }
 
@@ -6577,18 +6281,12 @@ void MinorMarkCompactCollector::Evacuate() {
 
   {
     TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_EVACUATE_COPY);
+    EvacuationScope evacuation_scope(heap());
     EvacuatePagesInParallel();
   }
 
   UpdatePointersAfterEvacuation();
 
-  {
-    TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_EVACUATE_REBALANCE);
-    if (!heap()->new_space()->EnsureCurrentCapacity()) {
-      heap()->FatalProcessOutOfMemory("NewSpace::Rebalance");
-    }
-  }
-
   {
     TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_EVACUATE_CLEAN_UP);
     for (Page* p : new_space_evacuation_pages_) {
@@ -6598,12 +6296,24 @@ void MinorMarkCompactCollector::Evacuate() {
       } else {
         // Page was not promoted. Sweep it instead.
         DCHECK_EQ(NEW_SPACE, p->owner_identity());
-        sweeper()->AddPage(NEW_SPACE, p, Sweeper::REGULAR);
+        sweeper()->AddNewSpacePage(p);
       }
     }
     new_space_evacuation_pages_.clear();
   }
 
+  if (is_new_space_shrinking_) {
+    heap()->paged_new_space()->FinishShrinking();
+    is_new_space_shrinking_ = false;
+  }
+
+  {
+    TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_EVACUATE_REBALANCE);
+    if (!heap()->new_space()->EnsureCurrentCapacity()) {
+      heap()->FatalProcessOutOfMemory("NewSpace::Rebalance");
+    }
+  }
+
   {
     TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_EVACUATE_EPILOGUE);
     EvacuateEpilogue();
@@ -6614,13 +6324,13 @@ namespace {
 
 class YoungGenerationEvacuator : public Evacuator {
  public:
-  explicit YoungGenerationEvacuator(MinorMarkCompactCollector* collector)
-      : Evacuator(collector->heap(), &record_visitor_, &local_allocator_,
+  explicit YoungGenerationEvacuator(Heap* heap)
+      : Evacuator(heap, &record_visitor_, &local_allocator_,
                   AlwaysPromoteYoung::kNo),
-        record_visitor_(collector->heap()->mark_compact_collector()),
+        record_visitor_(heap_),
         local_allocator_(
             heap_, CompactionSpaceKind::kCompactionSpaceForMinorMarkCompact),
-        collector_(collector) {}
+        collector_(heap_->minor_mark_compact_collector()) {}
 
   GCTracer::Scope::ScopeId GetBackgroundTracingScope() override {
     return GCTracer::Scope::MINOR_MC_BACKGROUND_EVACUATE_COPY;
@@ -6631,18 +6341,18 @@ class YoungGenerationEvacuator : public Evacuator {
   }
 
  protected:
-  void RawEvacuatePage(MemoryChunk* chunk, intptr_t* live_bytes) override;
+  bool RawEvacuatePage(MemoryChunk* chunk, intptr_t* live_bytes) override;
 
   YoungGenerationRecordMigratedSlotVisitor record_visitor_;
   EvacuationAllocator local_allocator_;
   MinorMarkCompactCollector* collector_;
 };
 
-void YoungGenerationEvacuator::RawEvacuatePage(MemoryChunk* chunk,
+bool YoungGenerationEvacuator::RawEvacuatePage(MemoryChunk* chunk,
                                                intptr_t* live_bytes) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.gc"),
                "YoungGenerationEvacuator::RawEvacuatePage");
-  NonAtomicMarkingState* marking_state = collector_->non_atomic_marking_state();
+  NonAtomicMarkingState* marking_state = heap_->non_atomic_marking_state();
   *live_bytes = marking_state->live_bytes(chunk);
   DCHECK_EQ(kPageNewToOld, ComputeEvacuationMode(chunk));
   LiveObjectVisitor::VisitBlackObjectsNoFail(chunk, marking_state,
@@ -6662,6 +6372,8 @@ void YoungGenerationEvacuator::RawEvacuatePage(MemoryChunk* chunk,
                                FreeSpaceTreatmentMode::kIgnoreFreeSpace);
     }
   }
+
+  return true;
 }
 
 }  // namespace
@@ -6675,7 +6387,10 @@ void MinorMarkCompactCollector::EvacuatePagesInParallel() {
     DCHECK_LT(0, live_bytes_on_page);
     live_bytes += live_bytes_on_page;
     if (ShouldMovePage(page, live_bytes_on_page, page->wasted_memory(),
-                       MemoryReductionMode::kNone, AlwaysPromoteYoung::kNo)) {
+                       MemoryReductionMode::kNone, AlwaysPromoteYoung::kNo,
+                       heap()->tracer()->IsCurrentGCDueToAllocationFailure()
+                           ? PromoteUnusablePages::kYes
+                           : PromoteUnusablePages::kNo)) {
       EvacuateNewSpacePageVisitor<NEW_TO_OLD>::Move(page);
       evacuation_items.emplace_back(ParallelWorkItem{}, page);
     }
@@ -6687,7 +6402,7 @@ void MinorMarkCompactCollector::EvacuatePagesInParallel() {
     LargePage* current = *it;
     it++;
     HeapObject object = current->GetObject();
-    if (non_atomic_marking_state_.IsBlack(object)) {
+    if (non_atomic_marking_state()->IsBlack(object)) {
       heap_->lo_space()->PromoteNewLargeObject(current);
       current->SetFlag(Page::PAGE_NEW_OLD_PROMOTION);
       promoted_large_pages_.push_back(current);
@@ -6702,43 +6417,15 @@ void MinorMarkCompactCollector::EvacuatePagesInParallel() {
   const auto pages_count = evacuation_items.size();
   const auto wanted_num_tasks =
       CreateAndExecuteEvacuationTasks<YoungGenerationEvacuator>(
-          this, std::move(evacuation_items), &observer);
+          heap(), std::move(evacuation_items), &observer);
 
   if (v8_flags.trace_evacuation) {
     TraceEvacuation(isolate(), pages_count, wanted_num_tasks, live_bytes, 0);
   }
 }
 
-void MinorMarkCompactCollector::StartSweepNewSpace() {
-  PagedSpaceBase* paged_space = heap()->paged_new_space()->paged_space();
-  paged_space->ClearAllocatorState();
-
-  int will_be_swept = 0;
-
-  // Loop needs to support deletion if live bytes == 0 for a page.
-  for (auto it = paged_space->begin(); it != paged_space->end();) {
-    Page* p = *(it++);
-    DCHECK(p->SweepingDone());
-
-    if (non_atomic_marking_state()->live_bytes(p) > 0) {
-      // Non-empty pages will be evacuated/promoted.
-      continue;
-    }
-
-    // New space preallocates all its pages. Don't free empty pages since they
-    // will just be reallocated.
-    DCHECK_EQ(NEW_SPACE, paged_space->identity());
-    sweeper_->AddPage(NEW_SPACE, p, Sweeper::REGULAR);
-    will_be_swept++;
-  }
-
-  if (v8_flags.gc_verbose) {
-    PrintIsolate(isolate(), "sweeping: space=%s initialized_for_sweeping=%d",
-                 paged_space->name(), will_be_swept);
-  }
-}
-
 void MinorMarkCompactCollector::Sweep() {
+  DCHECK(!sweeper()->sweeping_in_progress());
   TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_SWEEP);
   {
     GCTracer::Scope sweep_scope(heap()->tracer(),
@@ -6746,7 +6433,7 @@ void MinorMarkCompactCollector::Sweep() {
                                 ThreadKind::kMain);
     StartSweepNewSpace();
   }
-  sweeper_->StartSweeping();
+  sweeper_->StartSweeping(garbage_collector_);
 }
 
 }  // namespace internal
diff --git a/deps/v8/src/heap/mark-compact.h b/deps/v8/src/heap/mark-compact.h
index 9d960cd3602adb..40b6019de5ca18 100644
--- a/deps/v8/src/heap/mark-compact.h
+++ b/deps/v8/src/heap/mark-compact.h
@@ -11,6 +11,7 @@
 #include "include/v8-internal.h"
 #include "src/heap/base/worklist.h"
 #include "src/heap/concurrent-marking.h"
+#include "src/heap/marking-state.h"
 #include "src/heap/marking-visitor.h"
 #include "src/heap/marking-worklist.h"
 #include "src/heap/marking.h"
@@ -173,79 +174,11 @@ class LiveObjectVisitor : AllStatic {
 };
 
 enum class AlwaysPromoteYoung { kYes, kNo };
+enum class PromoteUnusablePages { kYes, kNo };
 enum class MemoryReductionMode { kNone, kShouldReduceMemory };
 enum PageEvacuationMode { NEW_TO_NEW, NEW_TO_OLD };
 enum class RememberedSetUpdatingMode { ALL, OLD_TO_NEW_ONLY };
 
-// This is used by marking visitors.
-class MarkingState final
-    : public MarkingStateBase<MarkingState, AccessMode::ATOMIC> {
- public:
-  explicit MarkingState(PtrComprCageBase cage_base)
-      : MarkingStateBase(cage_base) {}
-
-  ConcurrentBitmap<AccessMode::ATOMIC>* bitmap(
-      const BasicMemoryChunk* chunk) const {
-    return chunk->marking_bitmap<AccessMode::ATOMIC>();
-  }
-
-  // Concurrent marking uses local live bytes so we may do these accesses
-  // non-atomically.
-  void IncrementLiveBytes(MemoryChunk* chunk, intptr_t by) {
-    chunk->live_byte_count_.fetch_add(by, std::memory_order_relaxed);
-  }
-
-  intptr_t live_bytes(const MemoryChunk* chunk) const {
-    return chunk->live_byte_count_.load(std::memory_order_relaxed);
-  }
-
-  void SetLiveBytes(MemoryChunk* chunk, intptr_t value) {
-    chunk->live_byte_count_.store(value, std::memory_order_relaxed);
-  }
-};
-
-// This is used by Scavenger and Evacuator in TransferColor.
-// Live byte increments have to be atomic.
-class AtomicMarkingState final
-    : public MarkingStateBase<AtomicMarkingState, AccessMode::ATOMIC> {
- public:
-  explicit AtomicMarkingState(PtrComprCageBase cage_base)
-      : MarkingStateBase(cage_base) {}
-
-  ConcurrentBitmap<AccessMode::ATOMIC>* bitmap(
-      const BasicMemoryChunk* chunk) const {
-    return chunk->marking_bitmap<AccessMode::ATOMIC>();
-  }
-
-  void IncrementLiveBytes(MemoryChunk* chunk, intptr_t by) {
-    chunk->live_byte_count_.fetch_add(by);
-  }
-};
-
-class NonAtomicMarkingState final
-    : public MarkingStateBase<NonAtomicMarkingState, AccessMode::NON_ATOMIC> {
- public:
-  explicit NonAtomicMarkingState(PtrComprCageBase cage_base)
-      : MarkingStateBase(cage_base) {}
-
-  ConcurrentBitmap<AccessMode::NON_ATOMIC>* bitmap(
-      const BasicMemoryChunk* chunk) const {
-    return chunk->marking_bitmap<AccessMode::NON_ATOMIC>();
-  }
-
-  void IncrementLiveBytes(MemoryChunk* chunk, intptr_t by) {
-    chunk->live_byte_count_.fetch_add(by, std::memory_order_relaxed);
-  }
-
-  intptr_t live_bytes(const MemoryChunk* chunk) const {
-    return chunk->live_byte_count_.load(std::memory_order_relaxed);
-  }
-
-  void SetLiveBytes(MemoryChunk* chunk, intptr_t value) {
-    chunk->live_byte_count_.store(value, std::memory_order_relaxed);
-  }
-};
-
 // This visitor is used for marking on the main thread. It is cheaper than
 // the concurrent marking visitor because it does not snapshot JSObjects.
 template <typename MarkingState>
@@ -328,15 +261,6 @@ class CollectorBase {
   virtual void Prepare() = 0;
   virtual void StartMarking() = 0;
 
-  MarkingState* marking_state() { return &marking_state_; }
-
-  NonAtomicMarkingState* non_atomic_marking_state() {
-    return &non_atomic_marking_state_;
-  }
-
-  inline Heap* heap() const { return heap_; }
-  inline Isolate* isolate();
-
   MarkingWorklists* marking_worklists() { return &marking_worklists_; }
 
   MarkingWorklists::Local* local_marking_worklists() {
@@ -352,8 +276,6 @@ class CollectorBase {
   // Used by incremental marking for object that change their layout.
   virtual void VisitObject(HeapObject obj) = 0;
 
-  virtual bool sweeping_in_progress() const = 0;
-
   virtual void Finish() = 0;
 
   bool IsMajorMC();
@@ -363,14 +285,29 @@ class CollectorBase {
   std::vector<LargePage*> promoted_large_pages_;
 
  protected:
+  inline Heap* heap() const { return heap_; }
+  inline Isolate* isolate();
+
+  MarkingState* marking_state() { return marking_state_; }
+
+  NonAtomicMarkingState* non_atomic_marking_state() {
+    return non_atomic_marking_state_;
+  }
+
+  void StartSweepSpace(PagedSpace* space);
+  void StartSweepNewSpace();
+  void SweepLargeSpace(LargeObjectSpace* space);
+
   Heap* heap_;
   GarbageCollector garbage_collector_;
   MarkingWorklists marking_worklists_;
 
   std::unique_ptr<MarkingWorklists::Local> local_marking_worklists_;
 
-  MarkingState marking_state_;
-  NonAtomicMarkingState non_atomic_marking_state_;
+  MarkingState* const marking_state_;
+  NonAtomicMarkingState* const non_atomic_marking_state_;
+
+  bool is_new_space_shrinking_ = false;
 
   explicit CollectorBase(Heap* heap, GarbageCollector collector);
   virtual ~CollectorBase() = default;
@@ -459,35 +396,9 @@ class MarkCompactCollector final : public CollectorBase {
   void RecordLiveSlotsOnPage(Page* page);
 
   bool is_compacting() const { return compacting_; }
-  bool is_shared_heap() const { return is_shared_heap_; }
-
-  void FinishSweepingIfOutOfWork();
-
-  enum class SweepingForcedFinalizationMode { kUnifiedHeap, kV8Only };
-
-  // Ensures that sweeping is finished.
-  //
-  // Note: Can only be called safely from main thread.
-  V8_EXPORT_PRIVATE void EnsureSweepingCompleted(
-      SweepingForcedFinalizationMode mode);
-
-  void EnsurePageIsSwept(Page* page);
-
-  void DrainSweepingWorklistForSpace(AllocationSpace space);
-
-  // Checks if sweeping is in progress right now on any space.
-  bool sweeping_in_progress() const final {
-    return sweeper_->sweeping_in_progress();
-  }
-
-  void set_evacuation(bool evacuation) { evacuation_ = evacuation; }
-
-  bool evacuation() const { return evacuation_; }
 
   inline void AddTransitionArray(TransitionArray array);
 
-  Sweeper* sweeper() { return sweeper_; }
-
 #ifdef DEBUG
   // Checks whether performing mark-compact collection.
   bool in_use() { return state_ > PREPARE_GC; }
@@ -544,10 +455,12 @@ class MarkCompactCollector final : public CollectorBase {
   // `kNullAddress` if the parameter does not point to (the interior of) a valid
   // heap object, or if it points to (the interior of) some object that is
   // already marked as live (black or grey).
-  Address FindBasePtrForMarking(Address maybe_inner_ptr);
+  V8_EXPORT_PRIVATE Address FindBasePtrForMarking(Address maybe_inner_ptr);
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_MB
 
  private:
+  Sweeper* sweeper() { return sweeper_; }
+
   void ComputeEvacuationHeuristics(size_t area_size,
                                    int* target_fragmentation_percent,
                                    size_t* max_evacuated_bytes);
@@ -560,9 +473,6 @@ class MarkCompactCollector final : public CollectorBase {
   // Free unmarked ArrayBufferExtensions.
   void SweepArrayBufferExtensions();
 
-  // Free unmarked entries in the ExternalPointerTable.
-  void SweepExternalPointerTable();
-
   void MarkLiveObjects();
 
   // Marks the object grey and adds it to the marking work list.
@@ -677,9 +587,6 @@ class MarkCompactCollector final : public CollectorBase {
   // Starts sweeping of spaces by contributing on the main thread and setting
   // up other pages for sweeping. Does not start sweeper tasks.
   void Sweep();
-  void StartSweepSpace(PagedSpace* space);
-  void StartSweepNewSpace();
-  void SweepLargeSpace(LargeObjectSpace* space);
 
   void EvacuatePrologue();
   void EvacuateEpilogue();
@@ -701,6 +608,8 @@ class MarkCompactCollector final : public CollectorBase {
 
   void RightTrimDescriptorArray(DescriptorArray array, int descriptors_to_trim);
 
+  V8_INLINE bool ShouldMarkObject(HeapObject) const;
+
   base::Mutex mutex_;
   base::Semaphore page_parallel_job_semaphore_{0};
 
@@ -717,9 +626,9 @@ class MarkCompactCollector final : public CollectorBase {
   CollectorState state_;
 #endif
 
-  const bool is_shared_heap_;
+  const bool uses_shared_heap_;
+  const bool is_shared_heap_isolate_;
 
-  bool evacuation_ = false;
   // True if we are collecting slots to perform evacuation from evacuation
   // candidates.
   bool compacting_ = false;
@@ -746,7 +655,7 @@ class MarkCompactCollector final : public CollectorBase {
       aborted_evacuation_candidates_due_to_flags_;
   std::vector<LargePage*> promoted_large_pages_;
 
-  Sweeper* sweeper_;
+  Sweeper* const sweeper_;
 
   // Counts the number of major mark-compact collections. The counter is
   // incremented right after marking. This is used for:
@@ -765,19 +674,6 @@ class MarkCompactCollector final : public CollectorBase {
   friend class RecordMigratedSlotVisitor;
 };
 
-class V8_NODISCARD EvacuationScope {
- public:
-  explicit EvacuationScope(MarkCompactCollector* collector)
-      : collector_(collector) {
-    collector_->set_evacuation(true);
-  }
-
-  ~EvacuationScope() { collector_->set_evacuation(false); }
-
- private:
-  MarkCompactCollector* collector_;
-};
-
 // Collector for young-generation only.
 class MinorMarkCompactCollector final : public CollectorBase {
  public:
@@ -807,9 +703,6 @@ class MinorMarkCompactCollector final : public CollectorBase {
 
   void Finish() final;
 
-  Sweeper* sweeper() { return sweeper_.get(); }
-  bool sweeping_in_progress() const { return sweeper_->sweeping_in_progress(); }
-
   void VisitObject(HeapObject obj) final;
 
  private:
@@ -818,15 +711,17 @@ class MinorMarkCompactCollector final : public CollectorBase {
   static const int kNumMarkers = 8;
   static const int kMainMarker = 0;
 
+  Sweeper* sweeper() { return sweeper_; }
+
   void MarkLiveObjects();
-  void MarkRootSetInParallel(RootMarkingVisitor* root_visitor);
+  void MarkRootSetInParallel(RootMarkingVisitor* root_visitor,
+                             bool was_marked_incrementally);
   V8_INLINE void MarkRootObject(HeapObject obj);
   void DrainMarkingWorklist();
   void TraceFragmentation();
   void ClearNonLiveReferences();
 
   void Sweep();
-  void StartSweepNewSpace();
 
   void EvacuatePrologue();
   void EvacuateEpilogue();
@@ -844,7 +739,7 @@ class MinorMarkCompactCollector final : public CollectorBase {
   std::vector<Page*> promoted_pages_;
   std::vector<LargePage*> promoted_large_pages_;
 
-  std::unique_ptr<Sweeper> sweeper_;
+  Sweeper* const sweeper_;
 
   friend class YoungGenerationMarkingTask;
   friend class YoungGenerationMarkingJob;
diff --git a/deps/v8/src/heap/marking-barrier-inl.h b/deps/v8/src/heap/marking-barrier-inl.h
index 5f50081c4e1ec7..4d83a533e02b9c 100644
--- a/deps/v8/src/heap/marking-barrier-inl.h
+++ b/deps/v8/src/heap/marking-barrier-inl.h
@@ -28,8 +28,7 @@ bool MarkingBarrier::MarkValue(HeapObject host, HeapObject value) {
     // visits the host object.
     return false;
   }
-  BasicMemoryChunk* target_page = BasicMemoryChunk::FromHeapObject(value);
-  if (is_shared_heap_ != target_page->InSharedHeap()) return false;
+  if (!ShouldMarkObject(value)) return false;
 
   if (is_minor()) {
     // We do not need to insert into RememberedSet<OLD_TO_NEW> here because the
@@ -48,6 +47,16 @@ bool MarkingBarrier::MarkValue(HeapObject host, HeapObject value) {
   }
 }
 
+bool MarkingBarrier::ShouldMarkObject(HeapObject object) const {
+  if (V8_LIKELY(!uses_shared_heap_)) return true;
+  if (v8_flags.shared_space) {
+    if (is_shared_heap_isolate_) return true;
+    return !object.InSharedHeap();
+  } else {
+    return is_shared_heap_isolate_ == object.InSharedHeap();
+  }
+}
+
 template <typename TSlot>
 inline void MarkingBarrier::MarkRange(HeapObject host, TSlot start, TSlot end) {
   auto* isolate = heap_->isolate();
diff --git a/deps/v8/src/heap/marking-barrier.cc b/deps/v8/src/heap/marking-barrier.cc
index e028a67295fae5..c66bf9d4b2019c 100644
--- a/deps/v8/src/heap/marking-barrier.cc
+++ b/deps/v8/src/heap/marking-barrier.cc
@@ -31,7 +31,8 @@ MarkingBarrier::MarkingBarrier(LocalHeap* local_heap)
       minor_worklist_(*minor_collector_->marking_worklists()->shared()),
       marking_state_(heap_->isolate()),
       is_main_thread_barrier_(local_heap->is_main_thread()),
-      is_shared_heap_(heap_->IsShared()) {}
+      uses_shared_heap_(heap_->isolate()->has_shared_heap()),
+      is_shared_heap_isolate_(heap_->isolate()->is_shared_heap_isolate()) {}
 
 MarkingBarrier::~MarkingBarrier() { DCHECK(typed_slots_map_.empty()); }
 
@@ -212,6 +213,9 @@ void MarkingBarrier::Deactivate() {
     if (heap_->map_space()) DeactivateSpace(heap_->map_space());
     DeactivateSpace(heap_->code_space());
     DeactivateSpace(heap_->new_space());
+    if (heap_->shared_space()) {
+      DeactivateSpace(heap_->shared_space());
+    }
     for (LargePage* p : *heap_->new_lo_space()) {
       p->SetYoungGenerationPageFlags(false);
       DCHECK(p->IsLargePage());
@@ -222,6 +226,11 @@ void MarkingBarrier::Deactivate() {
     for (LargePage* p : *heap_->code_lo_space()) {
       p->SetOldGenerationPageFlags(false);
     }
+    if (heap_->shared_lo_space()) {
+      for (LargePage* p : *heap_->shared_lo_space()) {
+        p->SetOldGenerationPageFlags(false);
+      }
+    }
   }
   DCHECK(typed_slots_map_.empty());
   DCHECK(current_worklist_->IsLocalEmpty());
@@ -259,6 +268,9 @@ void MarkingBarrier::Activate(bool is_compacting,
       ActivateSpace(heap_->code_space());
     }
     ActivateSpace(heap_->new_space());
+    if (heap_->shared_space()) {
+      ActivateSpace(heap_->shared_space());
+    }
 
     for (LargePage* p : *heap_->new_lo_space()) {
       p->SetYoungGenerationPageFlags(true);
@@ -276,6 +288,12 @@ void MarkingBarrier::Activate(bool is_compacting,
         p->SetOldGenerationPageFlags(true);
       }
     }
+
+    if (heap_->shared_lo_space()) {
+      for (LargePage* p : *heap_->shared_lo_space()) {
+        p->SetOldGenerationPageFlags(true);
+      }
+    }
   }
 }
 
diff --git a/deps/v8/src/heap/marking-barrier.h b/deps/v8/src/heap/marking-barrier.h
index 8d04a25d105c42..96d0b329266998 100644
--- a/deps/v8/src/heap/marking-barrier.h
+++ b/deps/v8/src/heap/marking-barrier.h
@@ -50,6 +50,7 @@ class MarkingBarrier {
   }
 
  private:
+  inline bool ShouldMarkObject(HeapObject value) const;
   inline bool WhiteToGreyAndPush(HeapObject value);
 
   void RecordRelocSlot(Code host, RelocInfo* rinfo, HeapObject target);
@@ -83,7 +84,8 @@ class MarkingBarrier {
   bool is_compacting_ = false;
   bool is_activated_ = false;
   bool is_main_thread_barrier_;
-  bool is_shared_heap_;
+  const bool uses_shared_heap_;
+  const bool is_shared_heap_isolate_;
   MarkingBarrierType marking_barrier_type_;
 };
 
diff --git a/deps/v8/src/heap/marking-state-inl.h b/deps/v8/src/heap/marking-state-inl.h
new file mode 100644
index 00000000000000..0ab19a91a1bb9e
--- /dev/null
+++ b/deps/v8/src/heap/marking-state-inl.h
@@ -0,0 +1,155 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_MARKING_STATE_INL_H_
+#define V8_HEAP_MARKING_STATE_INL_H_
+
+#include "src/heap/marking-state.h"
+#include "src/heap/memory-chunk.h"
+
+namespace v8 {
+namespace internal {
+
+template <typename ConcreteState, AccessMode access_mode>
+MarkBit MarkingStateBase<ConcreteState, access_mode>::MarkBitFrom(
+    const HeapObject obj) const {
+  return MarkBitFrom(BasicMemoryChunk::FromHeapObject(obj), obj.ptr());
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+MarkBit MarkingStateBase<ConcreteState, access_mode>::MarkBitFrom(
+    const BasicMemoryChunk* p, Address addr) const {
+  return static_cast<const ConcreteState*>(this)->bitmap(p)->MarkBitFromIndex(
+      p->AddressToMarkbitIndex(addr));
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+Marking::ObjectColor MarkingStateBase<ConcreteState, access_mode>::Color(
+    const HeapObject obj) const {
+  return Marking::Color(MarkBitFrom(obj));
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+bool MarkingStateBase<ConcreteState, access_mode>::IsImpossible(
+    const HeapObject obj) const {
+  return Marking::IsImpossible<access_mode>(MarkBitFrom(obj));
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+bool MarkingStateBase<ConcreteState, access_mode>::IsBlack(
+    const HeapObject obj) const {
+  return Marking::IsBlack<access_mode>(MarkBitFrom(obj));
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+bool MarkingStateBase<ConcreteState, access_mode>::IsWhite(
+    const HeapObject obj) const {
+  return Marking::IsWhite<access_mode>(MarkBitFrom(obj));
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+bool MarkingStateBase<ConcreteState, access_mode>::IsGrey(
+    const HeapObject obj) const {
+  return Marking::IsGrey<access_mode>(MarkBitFrom(obj));
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+bool MarkingStateBase<ConcreteState, access_mode>::IsBlackOrGrey(
+    const HeapObject obj) const {
+  return Marking::IsBlackOrGrey<access_mode>(MarkBitFrom(obj));
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+bool MarkingStateBase<ConcreteState, access_mode>::WhiteToGrey(HeapObject obj) {
+  return Marking::WhiteToGrey<access_mode>(MarkBitFrom(obj));
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+bool MarkingStateBase<ConcreteState, access_mode>::WhiteToBlack(
+    HeapObject obj) {
+  return WhiteToGrey(obj) && GreyToBlack(obj);
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+bool MarkingStateBase<ConcreteState, access_mode>::GreyToBlack(HeapObject obj) {
+  BasicMemoryChunk* chunk = BasicMemoryChunk::FromHeapObject(obj);
+  MarkBit markbit = MarkBitFrom(chunk, obj.address());
+  if (!Marking::GreyToBlack<access_mode>(markbit)) return false;
+  static_cast<ConcreteState*>(this)->IncrementLiveBytes(
+      MemoryChunk::cast(chunk),
+      ALIGN_TO_ALLOCATION_ALIGNMENT(obj.Size(cage_base())));
+  return true;
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+bool MarkingStateBase<ConcreteState, access_mode>::GreyToBlackUnaccounted(
+    HeapObject obj) {
+  return Marking::GreyToBlack<access_mode>(MarkBitFrom(obj));
+}
+
+template <typename ConcreteState, AccessMode access_mode>
+void MarkingStateBase<ConcreteState, access_mode>::ClearLiveness(
+    MemoryChunk* chunk) {
+  static_cast<ConcreteState*>(this)->bitmap(chunk)->Clear();
+  static_cast<ConcreteState*>(this)->SetLiveBytes(chunk, 0);
+}
+
+ConcurrentBitmap<AccessMode::ATOMIC>* MarkingState::bitmap(
+    const BasicMemoryChunk* chunk) const {
+  return chunk->marking_bitmap<AccessMode::ATOMIC>();
+}
+
+void MarkingState::IncrementLiveBytes(MemoryChunk* chunk, intptr_t by) {
+  DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                 IsAligned(by, kObjectAlignment8GbHeap));
+  chunk->live_byte_count_.fetch_add(by, std::memory_order_relaxed);
+}
+
+intptr_t MarkingState::live_bytes(const MemoryChunk* chunk) const {
+  return chunk->live_byte_count_.load(std::memory_order_relaxed);
+}
+
+void MarkingState::SetLiveBytes(MemoryChunk* chunk, intptr_t value) {
+  DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                 IsAligned(value, kObjectAlignment8GbHeap));
+  chunk->live_byte_count_.store(value, std::memory_order_relaxed);
+}
+
+ConcurrentBitmap<AccessMode::NON_ATOMIC>* NonAtomicMarkingState::bitmap(
+    const BasicMemoryChunk* chunk) const {
+  return chunk->marking_bitmap<AccessMode::NON_ATOMIC>();
+}
+
+void NonAtomicMarkingState::IncrementLiveBytes(MemoryChunk* chunk,
+                                               intptr_t by) {
+  DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                 IsAligned(by, kObjectAlignment8GbHeap));
+  chunk->live_byte_count_.fetch_add(by, std::memory_order_relaxed);
+}
+
+intptr_t NonAtomicMarkingState::live_bytes(const MemoryChunk* chunk) const {
+  return chunk->live_byte_count_.load(std::memory_order_relaxed);
+}
+
+void NonAtomicMarkingState::SetLiveBytes(MemoryChunk* chunk, intptr_t value) {
+  DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                 IsAligned(value, kObjectAlignment8GbHeap));
+  chunk->live_byte_count_.store(value, std::memory_order_relaxed);
+}
+
+ConcurrentBitmap<AccessMode::ATOMIC>* AtomicMarkingState::bitmap(
+    const BasicMemoryChunk* chunk) const {
+  return chunk->marking_bitmap<AccessMode::ATOMIC>();
+}
+
+void AtomicMarkingState::IncrementLiveBytes(MemoryChunk* chunk, intptr_t by) {
+  DCHECK_IMPLIES(V8_COMPRESS_POINTERS_8GB_BOOL,
+                 IsAligned(by, kObjectAlignment8GbHeap));
+  chunk->live_byte_count_.fetch_add(by);
+}
+
+}  // namespace internal
+}  // namespace v8
+
+#endif  // V8_HEAP_MARKING_STATE_INL_H_
diff --git a/deps/v8/src/heap/marking-state.h b/deps/v8/src/heap/marking-state.h
new file mode 100644
index 00000000000000..c197c102436e40
--- /dev/null
+++ b/deps/v8/src/heap/marking-state.h
@@ -0,0 +1,137 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_MARKING_STATE_H_
+#define V8_HEAP_MARKING_STATE_H_
+
+#include "src/common/globals.h"
+#include "src/heap/marking.h"
+#include "src/objects/heap-object.h"
+
+namespace v8 {
+namespace internal {
+
+class BasicMemoryChunk;
+class MemoryChunk;
+
+template <typename ConcreteState, AccessMode access_mode>
+class MarkingStateBase {
+ public:
+  // Declares that this marking state is not collecting retainers, so the
+  // marking visitor may update the heap state to store information about
+  // progress, and may avoid fully visiting an object if it is safe to do so.
+  static constexpr bool kCollectRetainers = false;
+
+  explicit MarkingStateBase(PtrComprCageBase cage_base)
+#if V8_COMPRESS_POINTERS
+      : cage_base_(cage_base)
+#endif
+  {
+  }
+
+  // The pointer compression cage base value used for decompression of all
+  // tagged values except references to Code objects.
+  V8_INLINE PtrComprCageBase cage_base() const {
+#if V8_COMPRESS_POINTERS
+    return cage_base_;
+#else
+    return PtrComprCageBase{};
+#endif  // V8_COMPRESS_POINTERS
+  }
+
+  V8_INLINE MarkBit MarkBitFrom(const HeapObject obj) const;
+
+  // {addr} may be tagged or aligned.
+  V8_INLINE MarkBit MarkBitFrom(const BasicMemoryChunk* p, Address addr) const;
+
+  V8_INLINE Marking::ObjectColor Color(const HeapObject obj) const;
+
+  V8_INLINE bool IsImpossible(const HeapObject obj) const;
+
+  V8_INLINE bool IsBlack(const HeapObject obj) const;
+
+  V8_INLINE bool IsWhite(const HeapObject obj) const;
+
+  V8_INLINE bool IsGrey(const HeapObject obj) const;
+
+  V8_INLINE bool IsBlackOrGrey(const HeapObject obj) const;
+
+  V8_INLINE bool WhiteToGrey(HeapObject obj);
+
+  V8_INLINE bool WhiteToBlack(HeapObject obj);
+
+  V8_INLINE bool GreyToBlack(HeapObject obj);
+
+  V8_INLINE bool GreyToBlackUnaccounted(HeapObject obj);
+
+  V8_INLINE void ClearLiveness(MemoryChunk* chunk);
+
+  void AddStrongReferenceForReferenceSummarizer(HeapObject host,
+                                                HeapObject obj) {
+    // This is not a reference summarizer, so there is nothing to do here.
+  }
+
+  void AddWeakReferenceForReferenceSummarizer(HeapObject host, HeapObject obj) {
+    // This is not a reference summarizer, so there is nothing to do here.
+  }
+
+ private:
+#if V8_COMPRESS_POINTERS
+  const PtrComprCageBase cage_base_;
+#endif  // V8_COMPRESS_POINTERS
+};
+
+// This is used by marking visitors.
+class MarkingState final
+    : public MarkingStateBase<MarkingState, AccessMode::ATOMIC> {
+ public:
+  explicit MarkingState(PtrComprCageBase cage_base)
+      : MarkingStateBase(cage_base) {}
+
+  V8_INLINE ConcurrentBitmap<AccessMode::ATOMIC>* bitmap(
+      const BasicMemoryChunk* chunk) const;
+
+  // Concurrent marking uses local live bytes so we may do these accesses
+  // non-atomically.
+  V8_INLINE void IncrementLiveBytes(MemoryChunk* chunk, intptr_t by);
+
+  V8_INLINE intptr_t live_bytes(const MemoryChunk* chunk) const;
+
+  V8_INLINE void SetLiveBytes(MemoryChunk* chunk, intptr_t value);
+};
+
+class NonAtomicMarkingState final
+    : public MarkingStateBase<NonAtomicMarkingState, AccessMode::NON_ATOMIC> {
+ public:
+  explicit NonAtomicMarkingState(PtrComprCageBase cage_base)
+      : MarkingStateBase(cage_base) {}
+
+  V8_INLINE ConcurrentBitmap<AccessMode::NON_ATOMIC>* bitmap(
+      const BasicMemoryChunk* chunk) const;
+
+  V8_INLINE void IncrementLiveBytes(MemoryChunk* chunk, intptr_t by);
+
+  V8_INLINE intptr_t live_bytes(const MemoryChunk* chunk) const;
+
+  V8_INLINE void SetLiveBytes(MemoryChunk* chunk, intptr_t value);
+};
+
+// This is used by Scavenger and Evacuator in TransferColor.
+// Live byte increments have to be atomic.
+class AtomicMarkingState final
+    : public MarkingStateBase<AtomicMarkingState, AccessMode::ATOMIC> {
+ public:
+  explicit AtomicMarkingState(PtrComprCageBase cage_base)
+      : MarkingStateBase(cage_base) {}
+
+  V8_INLINE ConcurrentBitmap<AccessMode::ATOMIC>* bitmap(
+      const BasicMemoryChunk* chunk) const;
+
+  V8_INLINE void IncrementLiveBytes(MemoryChunk* chunk, intptr_t by);
+};
+
+}  // namespace internal
+}  // namespace v8
+
+#endif  // V8_HEAP_MARKING_STATE_H_
diff --git a/deps/v8/src/heap/marking-visitor-inl.h b/deps/v8/src/heap/marking-visitor-inl.h
index dfaa739317dea4..64053c60425f41 100644
--- a/deps/v8/src/heap/marking-visitor-inl.h
+++ b/deps/v8/src/heap/marking-visitor-inl.h
@@ -5,6 +5,7 @@
 #ifndef V8_HEAP_MARKING_VISITOR_INL_H_
 #define V8_HEAP_MARKING_VISITOR_INL_H_
 
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/marking-visitor.h"
 #include "src/heap/marking-worklist.h"
 #include "src/heap/objects-visiting-inl.h"
@@ -44,7 +45,7 @@ template <typename THeapObjectSlot>
 void MarkingVisitorBase<ConcreteVisitor, MarkingState>::ProcessStrongHeapObject(
     HeapObject host, THeapObjectSlot slot, HeapObject heap_object) {
   SynchronizePageAccess(heap_object);
-  if (!is_shared_heap_ && heap_object.InSharedHeap()) return;
+  if (!ShouldMarkObject(heap_object)) return;
   MarkObject(host, heap_object);
   concrete_visitor()->RecordSlot(host, slot, heap_object);
 }
@@ -56,7 +57,7 @@ template <typename THeapObjectSlot>
 void MarkingVisitorBase<ConcreteVisitor, MarkingState>::ProcessWeakHeapObject(
     HeapObject host, THeapObjectSlot slot, HeapObject heap_object) {
   SynchronizePageAccess(heap_object);
-  if (!is_shared_heap_ && heap_object.InSharedHeap()) return;
+  if (!ShouldMarkObject(heap_object)) return;
   if (concrete_visitor()->marking_state()->IsBlackOrGrey(heap_object)) {
     // Weak references with live values are directly processed here to
     // reduce the processing time of weak cells during the main GC
@@ -116,7 +117,7 @@ void MarkingVisitorBase<ConcreteVisitor, MarkingState>::VisitEmbeddedPointer(
   DCHECK(RelocInfo::IsEmbeddedObjectMode(rinfo->rmode()));
   HeapObject object =
       rinfo->target_object(ObjectVisitorWithCageBases::cage_base());
-  if (!is_shared_heap_ && object.InSharedHeap()) return;
+  if (!ShouldMarkObject(object)) return;
 
   if (!concrete_visitor()->marking_state()->IsBlackOrGrey(object)) {
     if (host.IsWeakObject(object)) {
@@ -136,7 +137,7 @@ void MarkingVisitorBase<ConcreteVisitor, MarkingState>::VisitCodeTarget(
   DCHECK(RelocInfo::IsCodeTargetMode(rinfo->rmode()));
   Code target = Code::GetCodeFromTargetAddress(rinfo->target_address());
 
-  if (!is_shared_heap_ && target.InSharedHeap()) return;
+  if (!ShouldMarkObject(target)) return;
   MarkObject(host, target);
   concrete_visitor()->RecordRelocSlot(host, rinfo, target);
 }
@@ -371,7 +372,7 @@ int MarkingVisitorBase<ConcreteVisitor, MarkingState>::VisitEphemeronHashTable(
     ObjectSlot value_slot =
         table.RawFieldOfElementAt(EphemeronHashTable::EntryToValueIndex(i));
 
-    if ((!is_shared_heap_ && key.InSharedHeap()) ||
+    if (!ShouldMarkObject(key) ||
         concrete_visitor()->marking_state()->IsBlackOrGrey(key)) {
       VisitPointer(table, value_slot);
     } else {
@@ -383,7 +384,7 @@ int MarkingVisitorBase<ConcreteVisitor, MarkingState>::VisitEphemeronHashTable(
         concrete_visitor()->RecordSlot(table, value_slot, value);
         AddWeakReferenceForReferenceSummarizer(table, value);
 
-        if (!is_shared_heap_ && value.InSharedHeap()) continue;
+        if (!ShouldMarkObject(value)) continue;
 
         // Revisit ephemerons with both key and value unreachable at end
         // of concurrent marking cycle.
diff --git a/deps/v8/src/heap/marking-visitor.h b/deps/v8/src/heap/marking-visitor.h
index 81c81d24b8cd67..3e6937bb41c552 100644
--- a/deps/v8/src/heap/marking-visitor.h
+++ b/deps/v8/src/heap/marking-visitor.h
@@ -6,9 +6,8 @@
 #define V8_HEAP_MARKING_VISITOR_H_
 
 #include "src/common/globals.h"
+#include "src/heap/marking-state.h"
 #include "src/heap/marking-worklist.h"
-#include "src/heap/marking.h"
-#include "src/heap/memory-chunk.h"
 #include "src/heap/objects-visiting.h"
 #include "src/heap/spaces.h"
 #include "src/heap/weak-object-worklists.h"
@@ -22,106 +21,6 @@ struct EphemeronMarking {
   size_t newly_discovered_limit;
 };
 
-template <typename ConcreteState, AccessMode access_mode>
-class MarkingStateBase {
- public:
-  // Declares that this marking state is not collecting retainers, so the
-  // marking visitor may update the heap state to store information about
-  // progress, and may avoid fully visiting an object if it is safe to do so.
-  static constexpr bool kCollectRetainers = false;
-
-  explicit MarkingStateBase(PtrComprCageBase cage_base)
-#if V8_COMPRESS_POINTERS
-      : cage_base_(cage_base)
-#endif
-  {
-  }
-
-  // The pointer compression cage base value used for decompression of all
-  // tagged values except references to Code objects.
-  V8_INLINE PtrComprCageBase cage_base() const {
-#if V8_COMPRESS_POINTERS
-    return cage_base_;
-#else
-    return PtrComprCageBase{};
-#endif  // V8_COMPRESS_POINTERS
-  }
-
-  V8_INLINE MarkBit MarkBitFrom(const HeapObject obj) const {
-    return MarkBitFrom(BasicMemoryChunk::FromHeapObject(obj), obj.ptr());
-  }
-
-  // {addr} may be tagged or aligned.
-  V8_INLINE MarkBit MarkBitFrom(const BasicMemoryChunk* p, Address addr) const {
-    return static_cast<const ConcreteState*>(this)->bitmap(p)->MarkBitFromIndex(
-        p->AddressToMarkbitIndex(addr));
-  }
-
-  Marking::ObjectColor Color(const HeapObject obj) const {
-    return Marking::Color(MarkBitFrom(obj));
-  }
-
-  V8_INLINE bool IsImpossible(const HeapObject obj) const {
-    return Marking::IsImpossible<access_mode>(MarkBitFrom(obj));
-  }
-
-  V8_INLINE bool IsBlack(const HeapObject obj) const {
-    return Marking::IsBlack<access_mode>(MarkBitFrom(obj));
-  }
-
-  V8_INLINE bool IsWhite(const HeapObject obj) const {
-    return Marking::IsWhite<access_mode>(MarkBitFrom(obj));
-  }
-
-  V8_INLINE bool IsGrey(const HeapObject obj) const {
-    return Marking::IsGrey<access_mode>(MarkBitFrom(obj));
-  }
-
-  V8_INLINE bool IsBlackOrGrey(const HeapObject obj) const {
-    return Marking::IsBlackOrGrey<access_mode>(MarkBitFrom(obj));
-  }
-
-  V8_INLINE bool WhiteToGrey(HeapObject obj) {
-    return Marking::WhiteToGrey<access_mode>(MarkBitFrom(obj));
-  }
-
-  V8_INLINE bool WhiteToBlack(HeapObject obj) {
-    return WhiteToGrey(obj) && GreyToBlack(obj);
-  }
-
-  V8_INLINE bool GreyToBlack(HeapObject obj) {
-    BasicMemoryChunk* chunk = BasicMemoryChunk::FromHeapObject(obj);
-    MarkBit markbit = MarkBitFrom(chunk, obj.address());
-    if (!Marking::GreyToBlack<access_mode>(markbit)) return false;
-    static_cast<ConcreteState*>(this)->IncrementLiveBytes(
-        MemoryChunk::cast(chunk), obj.Size(cage_base()));
-    return true;
-  }
-
-  V8_INLINE bool GreyToBlackUnaccounted(HeapObject obj) {
-    return Marking::GreyToBlack<access_mode>(MarkBitFrom(obj));
-  }
-
-  void ClearLiveness(MemoryChunk* chunk) {
-    static_cast<ConcreteState*>(this)->bitmap(chunk)->Clear();
-    static_cast<ConcreteState*>(this)->SetLiveBytes(chunk, 0);
-  }
-
-  void AddStrongReferenceForReferenceSummarizer(HeapObject host,
-                                                HeapObject obj) {
-    // This is not a reference summarizer, so there is nothing to do here.
-  }
-
-  void AddWeakReferenceForReferenceSummarizer(HeapObject host, HeapObject obj) {
-    // This is not a reference summarizer, so there is nothing to do here.
-  }
-
- private:
-#if V8_COMPRESS_POINTERS
-  const PtrComprCageBase cage_base_;
-#endif  // V8_COMPRESS_POINTERS
-};
-
 // The base class for all marking visitors. It implements marking logic with
 // support of bytecode flushing, embedder tracing, weak and references.
 //
@@ -153,7 +52,7 @@ class MarkingVisitorBase : public HeapVisitor<int, ConcreteVisitor> {
         code_flush_mode_(code_flush_mode),
         is_embedder_tracing_enabled_(is_embedder_tracing_enabled),
         should_keep_ages_unchanged_(should_keep_ages_unchanged),
-        is_shared_heap_(heap->IsShared())
+        should_mark_shared_heap_(heap->ShouldMarkSharedHeap())
 #ifdef V8_ENABLE_SANDBOX
         ,
         external_pointer_table_(&heap->isolate()->external_pointer_table()),
@@ -220,7 +119,10 @@ class MarkingVisitorBase : public HeapVisitor<int, ConcreteVisitor> {
 #endif
   }
 
-  bool is_shared_heap() { return is_shared_heap_; }
+  bool ShouldMarkObject(HeapObject object) const {
+    if (should_mark_shared_heap_) return true;
+    return !object.InSharedHeap();
+  }
 
   // Marks the object grey and pushes it on the marking work list.
   V8_INLINE void MarkObject(HeapObject host, HeapObject obj);
@@ -289,7 +191,7 @@ class MarkingVisitorBase : public HeapVisitor<int, ConcreteVisitor> {
   const base::EnumSet<CodeFlushMode> code_flush_mode_;
   const bool is_embedder_tracing_enabled_;
   const bool should_keep_ages_unchanged_;
-  const bool is_shared_heap_;
+  const bool should_mark_shared_heap_;
 #ifdef V8_ENABLE_SANDBOX
   ExternalPointerTable* const external_pointer_table_;
   ExternalPointerTable* const shared_external_pointer_table_;
diff --git a/deps/v8/src/heap/memory-allocator.cc b/deps/v8/src/heap/memory-allocator.cc
index 381eba7bf64987..dd9afbdfa6a5a2 100644
--- a/deps/v8/src/heap/memory-allocator.cc
+++ b/deps/v8/src/heap/memory-allocator.cc
@@ -777,7 +777,6 @@ const MemoryChunk* MemoryAllocator::LookupChunkContainingAddress(
       it != normal_pages_.end()) {
     // The chunk is a normal page.
     DCHECK_LE(chunk->address(), addr);
-    DCHECK_GT(chunk->area_end(), addr);
     if (chunk->Contains(addr)) return *it;
   } else if (auto it = large_pages_.upper_bound(static_cast<LargePage*>(chunk));
              it != large_pages_.begin()) {
diff --git a/deps/v8/src/heap/memory-allocator.h b/deps/v8/src/heap/memory-allocator.h
index 0485a7fe8c7972..ed6e4c82fabad1 100644
--- a/deps/v8/src/heap/memory-allocator.h
+++ b/deps/v8/src/heap/memory-allocator.h
@@ -265,7 +265,8 @@ class MemoryAllocator {
 
   // Return the normal or large page that contains this address, if it is owned
   // by this heap, otherwise a nullptr.
-  const MemoryChunk* LookupChunkContainingAddress(Address addr) const;
+  V8_EXPORT_PRIVATE const MemoryChunk* LookupChunkContainingAddress(
+      Address addr) const;
 
   // Insert and remove normal and large pages that are owned by this heap.
   void RecordNormalPageCreated(const Page& page);
diff --git a/deps/v8/src/heap/memory-chunk-layout.cc b/deps/v8/src/heap/memory-chunk-layout.cc
index ff2dbd915f7b4e..e81aaec8f3a165 100644
--- a/deps/v8/src/heap/memory-chunk-layout.cc
+++ b/deps/v8/src/heap/memory-chunk-layout.cc
@@ -42,7 +42,8 @@ size_t MemoryChunkLayout::AllocatableMemoryInCodePage() {
 }
 
 intptr_t MemoryChunkLayout::ObjectStartOffsetInDataPage() {
-  return RoundUp(MemoryChunk::kHeaderSize + Bitmap::kSize, kDoubleSize);
+  return RoundUp(MemoryChunk::kHeaderSize + Bitmap::kSize,
+                 ALIGN_TO_ALLOCATION_ALIGNMENT(kDoubleSize));
 }
 
 size_t MemoryChunkLayout::ObjectStartOffsetInMemoryChunk(
diff --git a/deps/v8/src/heap/memory-chunk-layout.h b/deps/v8/src/heap/memory-chunk-layout.h
index 053f35f3091328..8c771f8b2b411d 100644
--- a/deps/v8/src/heap/memory-chunk-layout.h
+++ b/deps/v8/src/heap/memory-chunk-layout.h
@@ -37,8 +37,13 @@ using ActiveSystemPages = ::heap::base::ActiveSystemPages;
 
 class V8_EXPORT_PRIVATE MemoryChunkLayout {
  public:
-  static const int kNumSets = NUMBER_OF_REMEMBERED_SET_TYPES;
-  static const int kNumTypes = ExternalBackingStoreType::kNumTypes;
+  static constexpr int kNumSets = NUMBER_OF_REMEMBERED_SET_TYPES;
+  static constexpr int kNumTypes = ExternalBackingStoreType::kNumTypes;
+#if V8_CC_MSVC && V8_TARGET_ARCH_IA32
+  static constexpr int kMemoryChunkAlignment = 8;
+#else
+  static constexpr int kMemoryChunkAlignment = sizeof(size_t);
+#endif  // V8_CC_MSVC && V8_TARGET_ARCH_IA32
 #define FIELD(Type, Name) \
   k##Name##Offset, k##Name##End = k##Name##Offset + sizeof(Type) - 1
   enum Header {
@@ -72,12 +77,19 @@ class V8_EXPORT_PRIVATE MemoryChunkLayout {
 #ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
     FIELD(ObjectStartBitmap, ObjectStartBitmap),
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
+    FIELD(size_t, WasUsedForAllocation),
     kMarkingBitmapOffset,
-    kMemoryChunkHeaderSize = kMarkingBitmapOffset,
+    kMemoryChunkHeaderSize =
+        kMarkingBitmapOffset +
+        ((kMarkingBitmapOffset % kMemoryChunkAlignment) == 0
+             ? 0
+             : kMemoryChunkAlignment -
+                   (kMarkingBitmapOffset % kMemoryChunkAlignment)),
     kMemoryChunkHeaderStart = kSlotSetOffset,
     kBasicMemoryChunkHeaderSize = kMemoryChunkHeaderStart,
     kBasicMemoryChunkHeaderStart = 0,
   };
+#undef FIELD
   static size_t CodePageGuardStartOffset();
   static size_t CodePageGuardSize();
   static intptr_t ObjectStartOffsetInCodePage();
@@ -89,6 +101,8 @@ class V8_EXPORT_PRIVATE MemoryChunkLayout {
   static size_t AllocatableMemoryInMemoryChunk(AllocationSpace space);
 
   static int MaxRegularCodeObjectSize();
+
+  static_assert(kMemoryChunkHeaderSize % alignof(size_t) == 0);
 };
 
 }  // namespace internal
diff --git a/deps/v8/src/heap/memory-chunk.cc b/deps/v8/src/heap/memory-chunk.cc
index 0a5ffa17b94917..fd26d5d73b95a1 100644
--- a/deps/v8/src/heap/memory-chunk.cc
+++ b/deps/v8/src/heap/memory-chunk.cc
@@ -9,6 +9,7 @@
 #include "src/common/globals.h"
 #include "src/heap/basic-memory-chunk.h"
 #include "src/heap/code-object-registry.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/memory-allocator.h"
 #include "src/heap/memory-chunk-inl.h"
 #include "src/heap/memory-chunk-layout.h"
@@ -162,8 +163,7 @@ MemoryChunk::MemoryChunk(Heap* heap, BaseSpace* space, size_t chunk_size,
 
   categories_ = nullptr;
 
-  heap->incremental_marking()->non_atomic_marking_state()->SetLiveBytes(this,
-                                                                        0);
+  heap->non_atomic_marking_state()->SetLiveBytes(this, 0);
   if (executable == EXECUTABLE) {
     SetFlag(IS_EXECUTABLE);
     if (heap->write_protect_code_memory()) {
@@ -195,7 +195,10 @@ MemoryChunk::MemoryChunk(Heap* heap, BaseSpace* space, size_t chunk_size,
   }
 
   // All pages of a shared heap need to be marked with this flag.
-  if (heap->IsShared()) SetFlag(MemoryChunk::IN_SHARED_HEAP);
+  if (heap->IsShared() || owner()->identity() == SHARED_SPACE ||
+      owner()->identity() == SHARED_LO_SPACE) {
+    SetFlag(MemoryChunk::IN_SHARED_HEAP);
+  }
 
 #ifdef DEBUG
   ValidateOffsets(this);
@@ -233,6 +236,7 @@ void MemoryChunk::SetYoungGenerationPageFlags(bool is_marking) {
 // MemoryChunk implementation
 
 void MemoryChunk::ReleaseAllocatedMemoryNeededForWritableChunk() {
+  DCHECK(SweepingDone());
   if (mutex_ != nullptr) {
     delete mutex_;
     mutex_ = nullptr;
@@ -492,6 +496,17 @@ void MemoryChunk::ValidateOffsets(MemoryChunk* chunk) {
   DCHECK_EQ(reinterpret_cast<Address>(&chunk->possibly_empty_buckets_) -
                 chunk->address(),
             MemoryChunkLayout::kPossiblyEmptyBucketsOffset);
+  DCHECK_EQ(reinterpret_cast<Address>(&chunk->active_system_pages_) -
+                chunk->address(),
+            MemoryChunkLayout::kActiveSystemPagesOffset);
+#ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
+  DCHECK_EQ(reinterpret_cast<Address>(&chunk->object_start_bitmap_) -
+                chunk->address(),
+            MemoryChunkLayout::kObjectStartBitmapOffset);
+#endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
+  DCHECK_EQ(reinterpret_cast<Address>(&chunk->was_used_for_allocation_) -
+                chunk->address(),
+            MemoryChunkLayout::kWasUsedForAllocationOffset);
 }
 #endif
 
diff --git a/deps/v8/src/heap/memory-chunk.h b/deps/v8/src/heap/memory-chunk.h
index 042072450d5bc8..906ff6a23e9061 100644
--- a/deps/v8/src/heap/memory-chunk.h
+++ b/deps/v8/src/heap/memory-chunk.h
@@ -220,6 +220,10 @@ class MemoryChunk : public BasicMemoryChunk {
   }
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
 
+  void MarkWasUsedForAllocation() { was_used_for_allocation_ = true; }
+  void ClearWasUsedForAllocation() { was_used_for_allocation_ = false; }
+  bool WasUsedForAllocation() const { return was_used_for_allocation_; }
+
  protected:
   // Release all memory allocated by the chunk. Should be called when memory
   // chunk is about to be freed.
@@ -287,6 +291,10 @@ class MemoryChunk : public BasicMemoryChunk {
   ObjectStartBitmap object_start_bitmap_;
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
 
+  // Marks a chunk that was used for allocation since it was last swept. Used
+  // only for new space pages.
+  size_t was_used_for_allocation_ = false;
+
  private:
   friend class ConcurrentMarkingState;
   friend class MarkingState;
diff --git a/deps/v8/src/heap/new-spaces-inl.h b/deps/v8/src/heap/new-spaces-inl.h
index e4648502d6ddab..14c675380457f0 100644
--- a/deps/v8/src/heap/new-spaces-inl.h
+++ b/deps/v8/src/heap/new-spaces-inl.h
@@ -61,6 +61,7 @@ V8_WARN_UNUSED_RESULT inline AllocationResult NewSpace::AllocateRawSynchronized(
 V8_INLINE bool SemiSpaceNewSpace::EnsureAllocation(
     int size_in_bytes, AllocationAlignment alignment, AllocationOrigin origin,
     int* out_max_aligned_size) {
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
   DCHECK_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_);
 #if DEBUG
   VerifyTop();
@@ -116,22 +117,21 @@ V8_INLINE bool PagedSpaceForNewSpace::EnsureAllocation(
 // -----------------------------------------------------------------------------
 // SemiSpaceObjectIterator
 
+SemiSpaceObjectIterator::SemiSpaceObjectIterator(const SemiSpaceNewSpace* space)
+    : current_(space->first_allocatable_address()) {}
+
 HeapObject SemiSpaceObjectIterator::Next() {
-  while (current_ != limit_) {
+  while (true) {
     if (Page::IsAlignedToPageSize(current_)) {
       Page* page = Page::FromAllocationAreaAddress(current_);
       page = page->next_page();
-      DCHECK(page);
+      if (page == nullptr) return HeapObject();
       current_ = page->area_start();
-      if (current_ == limit_) return HeapObject();
     }
     HeapObject object = HeapObject::FromAddress(current_);
-    current_ += object.Size();
-    if (!object.IsFreeSpaceOrFiller()) {
-      return object;
-    }
+    current_ += ALIGN_TO_ALLOCATION_ALIGNMENT(object.Size());
+    if (!object.IsFreeSpaceOrFiller()) return object;
   }
-  return HeapObject();
 }
 
 }  // namespace internal
diff --git a/deps/v8/src/heap/new-spaces.cc b/deps/v8/src/heap/new-spaces.cc
index 4ba1f7889122d0..ad69308c730ef4 100644
--- a/deps/v8/src/heap/new-spaces.cc
+++ b/deps/v8/src/heap/new-spaces.cc
@@ -7,9 +7,12 @@
 #include "src/common/globals.h"
 #include "src/heap/allocation-observer.h"
 #include "src/heap/array-buffer-sweeper.h"
+#include "src/heap/gc-tracer-inl.h"
 #include "src/heap/heap-inl.h"
 #include "src/heap/incremental-marking.h"
 #include "src/heap/mark-compact.h"
+#include "src/heap/marking-state-inl.h"
+#include "src/heap/marking-state.h"
 #include "src/heap/memory-allocator.h"
 #include "src/heap/paged-spaces.h"
 #include "src/heap/safepoint.h"
@@ -26,10 +29,7 @@ Page* SemiSpace::InitializePage(MemoryChunk* chunk) {
   page->SetYoungGenerationPageFlags(heap()->incremental_marking()->IsMarking());
   page->list_node().Initialize();
   if (v8_flags.minor_mc) {
-    heap()
-        ->minor_mark_compact_collector()
-        ->non_atomic_marking_state()
-        ->ClearLiveness(page);
+    heap()->non_atomic_marking_state()->ClearLiveness(page);
   }
   page->InitializationMemoryFence();
   return page;
@@ -76,8 +76,7 @@ bool SemiSpace::EnsureCurrentCapacity() {
     }
 
     // Add more pages if we have less than expected_pages.
-    NonAtomicMarkingState* marking_state =
-        heap()->incremental_marking()->non_atomic_marking_state();
+    NonAtomicMarkingState* marking_state = heap()->non_atomic_marking_state();
     while (actual_pages < expected_pages) {
       actual_pages++;
       current_page = heap()->memory_allocator()->AllocatePage(
@@ -133,6 +132,8 @@ bool SemiSpace::Commit() {
     }
     memory_chunk_list_.PushBack(new_page);
     IncrementCommittedPhysicalMemory(new_page->CommittedPhysicalMemory());
+    heap()->CreateFillerObjectAt(new_page->area_start(),
+                                 static_cast<int>(new_page->area_size()));
   }
   Reset();
   AccountCommitted(target_capacity_);
@@ -181,8 +182,7 @@ bool SemiSpace::GrowTo(size_t new_capacity) {
   DCHECK(IsAligned(delta, AllocatePageSize()));
   const int delta_pages = static_cast<int>(delta / Page::kPageSize);
   DCHECK(last_page());
-  NonAtomicMarkingState* marking_state =
-      heap()->incremental_marking()->non_atomic_marking_state();
+  NonAtomicMarkingState* marking_state = heap()->non_atomic_marking_state();
   for (int pages_added = 0; pages_added < delta_pages; pages_added++) {
     Page* new_page = heap()->memory_allocator()->AllocatePage(
         MemoryAllocator::AllocationMode::kUsePool, this, NOT_EXECUTABLE);
@@ -195,6 +195,8 @@ bool SemiSpace::GrowTo(size_t new_capacity) {
     IncrementCommittedPhysicalMemory(new_page->CommittedPhysicalMemory());
     // Duplicate the flags that was set on the old page.
     new_page->SetFlags(last_page()->GetFlags(), Page::kCopyOnFlipFlagsMask);
+    heap()->CreateFillerObjectAt(new_page->area_start(),
+                                 static_cast<int>(new_page->area_size()));
   }
   AccountCommitted(delta);
   target_capacity_ = new_capacity;
@@ -426,20 +428,6 @@ void SemiSpace::AssertValidRange(Address start, Address end) {
 }
 #endif
 
-// -----------------------------------------------------------------------------
-// SemiSpaceObjectIterator implementation.
-
-SemiSpaceObjectIterator::SemiSpaceObjectIterator(
-    const SemiSpaceNewSpace* space) {
-  Initialize(space->first_allocatable_address(), space->top());
-}
-
-void SemiSpaceObjectIterator::Initialize(Address start, Address end) {
-  SemiSpace::AssertValidRange(start, end);
-  current_ = start;
-  limit_ = end;
-}
-
 // -----------------------------------------------------------------------------
 // NewSpace implementation
 
@@ -481,8 +469,7 @@ void NewSpace::VerifyTop() const {
 // We do not use the SemiSpaceObjectIterator because verification doesn't assume
 // that it works (it depends on the invariants we are checking).
 void NewSpace::VerifyImpl(Isolate* isolate, const Page* current_page,
-                          Address current_address,
-                          Address stop_iteration_at_address) const {
+                          Address current_address) const {
   DCHECK(current_page->ContainsLimit(current_address));
 
   size_t external_space_bytes[kNumTypes];
@@ -496,13 +483,8 @@ void NewSpace::VerifyImpl(Isolate* isolate, const Page* current_page,
   PtrComprCageBase cage_base(isolate);
   VerifyPointersVisitor visitor(heap());
   const Page* page = current_page;
-  while (current_address != stop_iteration_at_address) {
+  while (true) {
     if (!Page::IsAlignedToPageSize(current_address)) {
-      // The allocation pointer should not be in the middle of an object.
-      CHECK_IMPLIES(!v8_flags.minor_mc,
-                    !Page::FromAddress(current_address)->ContainsLimit(top()) ||
-                        current_address < top());
-
       HeapObject object = HeapObject::FromAddress(current_address);
 
       // The first word should be a map, and we expect all map pointers to
@@ -530,7 +512,7 @@ void NewSpace::VerifyImpl(Isolate* isolate, const Page* current_page,
             string_size;
       }
 
-      current_address += size;
+      current_address += ALIGN_TO_ALLOCATION_ALIGNMENT(size);
     } else {
       // At end of page, switch to next page.
       page = page->next_page();
@@ -554,7 +536,7 @@ void NewSpace::VerifyImpl(Isolate* isolate, const Page* current_page,
   }
 
 #ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
-  page->object_start_bitmap()->Verify();
+  current_page->object_start_bitmap()->Verify();
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
 }
 #endif  // VERIFY_HEAP
@@ -562,6 +544,7 @@ void NewSpace::VerifyImpl(Isolate* isolate, const Page* current_page,
 void NewSpace::PromotePageToOldSpace(Page* page) {
   DCHECK(!page->IsFlagSet(Page::PAGE_NEW_OLD_PROMOTION));
   DCHECK(page->InYoungGeneration());
+  page->ClearWasUsedForAllocation();
   RemovePage(page);
   Page* new_page = Page::ConvertNewToOld(page);
   DCHECK(!new_page->InYoungGeneration());
@@ -660,6 +643,10 @@ void SemiSpaceNewSpace::UpdateLinearAllocationArea(Address known_top) {
     linear_area_original_data_.set_original_top_release(top());
   }
 
+  // The linear allocation area should reach the end of the page, so no filler
+  // object is needed there to make the page iterable.
+  DCHECK_EQ(limit(), to_space_.page_high());
+
   to_space_.AddRangeToActiveSystemPages(top(), limit());
   DCHECK_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_);
 
@@ -670,8 +657,7 @@ void SemiSpaceNewSpace::ResetLinearAllocationArea() {
   to_space_.Reset();
   UpdateLinearAllocationArea();
   // Clear all mark-bits in the to-space.
-  NonAtomicMarkingState* marking_state =
-      heap()->incremental_marking()->non_atomic_marking_state();
+  NonAtomicMarkingState* marking_state = heap()->non_atomic_marking_state();
   for (Page* p : to_space_) {
     marking_state->ClearLiveness(p);
     // Concurrent marking may have local live bytes for this page.
@@ -680,12 +666,18 @@ void SemiSpaceNewSpace::ResetLinearAllocationArea() {
 }
 
 void SemiSpaceNewSpace::UpdateInlineAllocationLimit(size_t min_size) {
-  Address new_limit = ComputeLimit(top(), to_space_.page_high(), min_size);
+  Address new_limit = ComputeLimit(top(), to_space_.page_high(),
+                                   ALIGN_TO_ALLOCATION_ALIGNMENT(min_size));
   DCHECK_LE(top(), new_limit);
   DCHECK_LE(new_limit, to_space_.page_high());
   allocation_info_.SetLimit(new_limit);
   DCHECK_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_);
 
+  // Add a filler object after the linear allocation area (if there is space
+  // left), to ensure that the page will be iterable.
+  heap()->CreateFillerObjectAt(
+      limit(), static_cast<int>(to_space_.page_high() - limit()));
+
 #if DEBUG
   VerifyTop();
 #endif
@@ -770,7 +762,7 @@ void SemiSpaceNewSpace::Verify(Isolate* isolate) const {
   Address current = to_space_.first_page()->area_start();
   CHECK_EQ(current, to_space_.space_start());
 
-  VerifyImpl(isolate, Page::FromAllocationAreaAddress(current), current, top());
+  VerifyImpl(isolate, Page::FromAllocationAreaAddress(current), current);
 
   // Check semi-spaces.
   CHECK_EQ(from_space_.id(), kFromSpace);
@@ -780,6 +772,37 @@ void SemiSpaceNewSpace::Verify(Isolate* isolate) const {
 }
 #endif  // VERIFY_HEAP
 
+void SemiSpaceNewSpace::MakeIterable() {
+  MakeAllPagesInFromSpaceIterable();
+  MakeUnusedPagesInToSpaceIterable();
+}
+
+void SemiSpaceNewSpace::MakeAllPagesInFromSpaceIterable() {
+  if (!IsFromSpaceCommitted()) return;
+
+  // Fix all pages in the "from" semispace.
+  for (Page* page : from_space()) {
+    heap()->CreateFillerObjectAt(page->area_start(),
+                                 static_cast<int>(page->area_size()));
+  }
+}
+
+void SemiSpaceNewSpace::MakeUnusedPagesInToSpaceIterable() {
+  PageIterator it(to_space().current_page());
+
+  // Fix the current page, above the LAB.
+  DCHECK_NOT_NULL(*it);
+  DCHECK((*it)->Contains(limit()));
+  heap()->CreateFillerObjectAt(limit(),
+                               static_cast<int>((*it)->area_end() - limit()));
+
+  // Fix the remaining unused pages in the "to" semispace.
+  for (Page* page = *(++it); page != nullptr; page = *(++it)) {
+    heap()->CreateFillerObjectAt(page->area_start(),
+                                 static_cast<int>(page->area_size()));
+  }
+}
+
 #ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
 void SemiSpaceNewSpace::ClearUnusedObjectStartBitmaps() {
   if (!IsFromSpaceCommitted()) return;
@@ -918,10 +941,7 @@ Page* PagedSpaceForNewSpace::InitializePage(MemoryChunk* chunk) {
   page->ResetAllocationStatistics();
   page->SetFlags(Page::TO_PAGE);
   page->SetYoungGenerationPageFlags(heap()->incremental_marking()->IsMarking());
-  heap()
-      ->minor_mark_compact_collector()
-      ->non_atomic_marking_state()
-      ->ClearLiveness(page);
+  heap()->non_atomic_marking_state()->ClearLiveness(page);
   page->AllocateFreeListCategories();
   page->InitializeFreeListCategories();
   page->list_node().Initialize();
@@ -941,23 +961,29 @@ void PagedSpaceForNewSpace::Grow() {
   CHECK(EnsureCurrentCapacity());
 }
 
-void PagedSpaceForNewSpace::Shrink() {
-  target_capacity_ =
+bool PagedSpaceForNewSpace::StartShrinking() {
+  DCHECK_EQ(current_capacity_, target_capacity_);
+  DCHECK(heap()->tracer()->IsInAtomicPause());
+  size_t new_target_capacity =
       RoundUp(std::max(initial_capacity_, 2 * Size()), Page::kPageSize);
-  if (target_capacity_ < current_capacity_) {
-    // Try to shrink by freeing empty pages.
-    for (Page* page = first_page();
-         page != last_page() && (current_capacity_ > target_capacity_);) {
-      Page* current_page = page;
-      page = page->next_page();
-      if (current_page->allocated_bytes() == 0) {
-        memory_chunk_list().Remove(current_page);
-        ReleasePage(current_page);
-      }
+  if (new_target_capacity > target_capacity_) return false;
+  target_capacity_ = new_target_capacity;
+  return true;
+}
+
+void PagedSpaceForNewSpace::FinishShrinking() {
+  DCHECK(heap()->tracer()->IsInAtomicPause());
+  if (current_capacity_ > target_capacity_) {
+#if DEBUG
+    // If `current_capacity_` is higher than `target_capacity_`, i.e. the
+    // space could not be shrunk all the way down to `target_capacity_`, it
+    // must mean that all pages contain live objects.
+    for (Page* page : *this) {
+      DCHECK_NE(0, heap()->non_atomic_marking_state()->live_bytes(page));
     }
+#endif  // DEBUG
+    target_capacity_ = current_capacity_;
   }
-  // Shrinking to target capacity may not have been possible.
-  target_capacity_ = current_capacity_;
 }
 
 void PagedSpaceForNewSpace::UpdateInlineAllocationLimit(size_t size_in_bytes) {
@@ -982,15 +1008,7 @@ void PagedSpaceForNewSpace::ReleasePage(Page* page) {
   PagedSpaceBase::ReleasePage(page);
 }
 
-bool PagedSpaceForNewSpace::AddFreshPage() {
-  DCHECK_LE(TotalCapacity(), MaximumCapacity());
-  if (current_capacity_ >= target_capacity_) return false;
-  return EnsureCurrentCapacity();
-}
-
 bool PagedSpaceForNewSpace::PreallocatePages() {
-  // Verify that the free space map is already initialized. Otherwise, new free
-  // list entries will be invalid.
   while (current_capacity_ < target_capacity_) {
     if (!TryExpandImpl()) return false;
   }
@@ -1001,7 +1019,8 @@ bool PagedSpaceForNewSpace::PreallocatePages() {
 bool PagedSpaceForNewSpace::EnsureCurrentCapacity() {
   // Verify that the free space map is already initialized. Otherwise, new free
   // list entries will be invalid.
-  DCHECK_NE(0, heap()->isolate()->root(RootIndex::kFreeSpaceMap).ptr());
+  DCHECK_NE(kNullAddress,
+            heap()->isolate()->root(RootIndex::kFreeSpaceMap).ptr());
   return PreallocatePages();
 }
 
@@ -1022,6 +1041,10 @@ void PagedSpaceForNewSpace::Verify(Isolate* isolate,
 }
 #endif  // VERIFY_HEAP
 
+bool PagedSpaceForNewSpace::ShouldReleasePage() const {
+  return current_capacity_ > target_capacity_;
+}
+
 // -----------------------------------------------------------------------------
 // PagedNewSpace implementation
 
@@ -1044,10 +1067,7 @@ PagedNewSpace::~PagedNewSpace() {
 void PagedNewSpace::Verify(Isolate* isolate) const {
   const Page* first_page = paged_space_.first_page();
 
-  if (first_page) {
-    // No bailout needed since all pages are iterable.
-    VerifyImpl(isolate, first_page, first_page->area_start(), kNullAddress);
-  }
+  if (first_page) VerifyImpl(isolate, first_page, first_page->area_start());
 
   // Check paged-spaces.
   VerifyPointersVisitor visitor(heap());
diff --git a/deps/v8/src/heap/new-spaces.h b/deps/v8/src/heap/new-spaces.h
index ebfca7edc0c209..b0e61af300e882 100644
--- a/deps/v8/src/heap/new-spaces.h
+++ b/deps/v8/src/heap/new-spaces.h
@@ -8,6 +8,7 @@
 #include <atomic>
 #include <memory>
 
+#include "src/base/logging.h"
 #include "src/base/macros.h"
 #include "src/base/platform/mutex.h"
 #include "src/common/globals.h"
@@ -217,24 +218,17 @@ class SemiSpace final : public Space {
 };
 
 // A SemiSpaceObjectIterator is an ObjectIterator that iterates over the active
-// semispace of the heap's new space.  It iterates over the objects in the
-// semispace from a given start address (defaulting to the bottom of the
-// semispace) to the top of the semispace.  New objects allocated after the
-// iterator is created are not iterated.
+// semispace of the heap's new space.
 class SemiSpaceObjectIterator : public ObjectIterator {
  public:
-  // Create an iterator over the allocated objects in the given to-space.
-  explicit SemiSpaceObjectIterator(const SemiSpaceNewSpace* space);
+  // Create an iterator over the objects in the given to-space.
+  inline explicit SemiSpaceObjectIterator(const SemiSpaceNewSpace* space);
 
   inline HeapObject Next() final;
 
  private:
-  void Initialize(Address start, Address end);
-
   // The current iteration point.
   Address current_;
-  // The end of iteration.
-  Address limit_;
 };
 
 class NewSpace : NON_EXPORTED_BASE(public SpaceWithLinearArea) {
@@ -294,14 +288,15 @@ class NewSpace : NON_EXPORTED_BASE(public SpaceWithLinearArea) {
 
 #ifdef VERIFY_HEAP
   virtual void Verify(Isolate* isolate) const = 0;
-  // VerifyImpl verifies objects on the space starting from |page| and
-  // |address|. |address| should be a valid limit on |page| (see
-  // BasicMemoryChunk::ContainsLimit).
+  // VerifyImpl verifies objects on the space starting from |current_page| and
+  // |current_address|. |current_address| should be a valid limit on
+  // |current_page| (see BasicMemoryChunk::ContainsLimit).
   void VerifyImpl(Isolate* isolate, const Page* current_page,
-                  Address current_address,
-                  Address stop_iteration_at_address) const;
+                  Address current_address) const;
 #endif
 
+  virtual void MakeIterable() = 0;
+
 #ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
   virtual void ClearUnusedObjectStartBitmaps() = 0;
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
@@ -483,6 +478,11 @@ class V8_EXPORT_PRIVATE SemiSpaceNewSpace final : public NewSpace {
   void Print() override { to_space_.Print(); }
 #endif
 
+  void MakeIterable() override;
+
+  void MakeAllPagesInFromSpaceIterable();
+  void MakeUnusedPagesInToSpaceIterable();
+
 #ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
   void ClearUnusedObjectStartBitmaps() override;
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
@@ -565,7 +565,9 @@ class V8_EXPORT_PRIVATE PagedSpaceForNewSpace final : public PagedSpaceBase {
   void Grow();
 
   // Shrink the capacity of the space.
-  void Shrink();
+  void Shrink() { UNREACHABLE(); }
+  bool StartShrinking();
+  void FinishShrinking();
 
   size_t AllocatedSinceLastGC() const {
     // allocated since last gc is compiuted as allocated linear areas minus
@@ -599,7 +601,7 @@ class V8_EXPORT_PRIVATE PagedSpaceForNewSpace final : public PagedSpaceBase {
   // Returns false if this isn't possible or reasonable (i.e., there
   // are no pages, or the current page is already empty), or true
   // if successful.
-  bool AddFreshPage();
+  bool AddFreshPage() { return false; }
 
   bool EnsureAllocation(int size_in_bytes, AllocationAlignment alignment,
                         AllocationOrigin origin,
@@ -625,10 +627,14 @@ class V8_EXPORT_PRIVATE PagedSpaceForNewSpace final : public PagedSpaceBase {
   void Verify(Isolate* isolate, ObjectVisitor* visitor) const final;
 #endif
 
+  void MakeIterable() { free_list()->RepairLists(heap()); }
+
 #ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
   void ClearUnusedObjectStartBitmaps() {}
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
 
+  bool ShouldReleasePage() const;
+
  private:
   bool PreallocatePages();
 
@@ -664,11 +670,13 @@ class V8_EXPORT_PRIVATE PagedNewSpace final : public NewSpace {
 
   // Shrink the capacity of the space.
   void Shrink() final { paged_space_.Shrink(); }
+  bool StartShrinking() { return paged_space_.StartShrinking(); }
+  void FinishShrinking() { paged_space_.FinishShrinking(); }
 
   // Return the allocated bytes in the active space.
   size_t Size() const final { return paged_space_.Size(); }
 
-  size_t SizeOfObjects() const final { return Size(); }
+  size_t SizeOfObjects() const final { return paged_space_.SizeOfObjects(); }
 
   // Return the allocatable capacity of the space.
   size_t Capacity() const final { return paged_space_.Capacity(); }
@@ -781,7 +789,9 @@ class V8_EXPORT_PRIVATE PagedNewSpace final : public NewSpace {
     paged_space_.MakeLinearAllocationAreaIterable();
   }
 
-  PagedSpaceBase* paged_space() { return &paged_space_; }
+  PagedSpaceForNewSpace* paged_space() { return &paged_space_; }
+
+  void MakeIterable() override { paged_space_.MakeIterable(); }
 
 #ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
   void ClearUnusedObjectStartBitmaps() override {
@@ -789,6 +799,12 @@ class V8_EXPORT_PRIVATE PagedNewSpace final : public NewSpace {
   }
 #endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
 
+  // All operations on `memory_chunk_list_` should go through `paged_space_`.
+  heap::List<MemoryChunk>& memory_chunk_list() final { UNREACHABLE(); }
+
+  bool ShouldReleasePage() const { return paged_space_.ShouldReleasePage(); }
+  void ReleasePage(Page* page) { paged_space_.ReleasePage(page); }
+
  private:
   bool EnsureAllocation(int size_in_bytes, AllocationAlignment alignment,
                         AllocationOrigin origin,
diff --git a/deps/v8/src/heap/object-stats.cc b/deps/v8/src/heap/object-stats.cc
index d28d03dc494191..e15b5f332e746b 100644
--- a/deps/v8/src/heap/object-stats.cc
+++ b/deps/v8/src/heap/object-stats.cc
@@ -15,6 +15,7 @@
 #include "src/heap/combined-heap.h"
 #include "src/heap/heap-inl.h"
 #include "src/heap/mark-compact.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/logging/counters.h"
 #include "src/objects/compilation-cache-table-inl.h"
 #include "src/objects/heap-object.h"
@@ -448,9 +449,9 @@ class ObjectStatsCollectorImpl {
     return field_stats_collector_.cage_base();
   }
 
-  Heap* heap_;
-  ObjectStats* stats_;
-  NonAtomicMarkingState* marking_state_;
+  Heap* const heap_;
+  ObjectStats* const stats_;
+  NonAtomicMarkingState* const marking_state_;
   std::unordered_set<HeapObject, Object::Hasher, Object::KeyEqualSafe>
       virtual_objects_;
   std::unordered_set<Address> external_resources_;
@@ -461,8 +462,7 @@ ObjectStatsCollectorImpl::ObjectStatsCollectorImpl(Heap* heap,
                                                    ObjectStats* stats)
     : heap_(heap),
       stats_(stats),
-      marking_state_(
-          heap->mark_compact_collector()->non_atomic_marking_state()),
+      marking_state_(heap->non_atomic_marking_state()),
       field_stats_collector_(
           heap_, &stats->tagged_fields_count_, &stats->embedder_fields_count_,
           &stats->inobject_smi_fields_count_,
@@ -1089,8 +1089,7 @@ class ObjectStatsVisitor {
                      ObjectStatsCollectorImpl::Phase phase)
       : live_collector_(live_collector),
         dead_collector_(dead_collector),
-        marking_state_(
-            heap->mark_compact_collector()->non_atomic_marking_state()),
+        marking_state_(heap->non_atomic_marking_state()),
         phase_(phase) {}
 
   void Visit(HeapObject obj) {
@@ -1105,9 +1104,9 @@ class ObjectStatsVisitor {
   }
 
  private:
-  ObjectStatsCollectorImpl* live_collector_;
-  ObjectStatsCollectorImpl* dead_collector_;
-  NonAtomicMarkingState* marking_state_;
+  ObjectStatsCollectorImpl* const live_collector_;
+  ObjectStatsCollectorImpl* const dead_collector_;
+  NonAtomicMarkingState* const marking_state_;
   ObjectStatsCollectorImpl::Phase phase_;
 };
 
diff --git a/deps/v8/src/heap/paged-spaces-inl.h b/deps/v8/src/heap/paged-spaces-inl.h
index 341cc40569e027..6283e00540a33d 100644
--- a/deps/v8/src/heap/paged-spaces-inl.h
+++ b/deps/v8/src/heap/paged-spaces-inl.h
@@ -29,7 +29,7 @@ HeapObject PagedSpaceObjectIterator::Next() {
 HeapObject PagedSpaceObjectIterator::FromCurrentPage() {
   while (cur_addr_ != cur_end_) {
     HeapObject obj = HeapObject::FromAddress(cur_addr_);
-    const int obj_size = obj.Size(cage_base());
+    const int obj_size = ALIGN_TO_ALLOCATION_ALIGNMENT(obj.Size(cage_base()));
     cur_addr_ += obj_size;
     DCHECK_LE(cur_addr_, cur_end_);
     if (!obj.IsFreeSpaceOrFiller(cage_base())) {
diff --git a/deps/v8/src/heap/paged-spaces.cc b/deps/v8/src/heap/paged-spaces.cc
index c2c62658244907..7159a1e8779a03 100644
--- a/deps/v8/src/heap/paged-spaces.cc
+++ b/deps/v8/src/heap/paged-spaces.cc
@@ -14,8 +14,11 @@
 #include "src/execution/vm-state-inl.h"
 #include "src/heap/allocation-observer.h"
 #include "src/heap/array-buffer-sweeper.h"
+#include "src/heap/gc-tracer-inl.h"
+#include "src/heap/gc-tracer.h"
 #include "src/heap/heap.h"
 #include "src/heap/incremental-marking.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/memory-allocator.h"
 #include "src/heap/memory-chunk-inl.h"
 #include "src/heap/memory-chunk-layout.h"
@@ -139,12 +142,14 @@ void PagedSpaceBase::TearDown() {
   accounting_stats_.Clear();
 }
 
-void PagedSpaceBase::RefillFreeList(Sweeper* sweeper) {
+void PagedSpaceBase::RefillFreeList() {
   // Any PagedSpace might invoke RefillFreeList. We filter all but our old
   // generation spaces out.
   DCHECK(identity() == OLD_SPACE || identity() == CODE_SPACE ||
-         identity() == MAP_SPACE || identity() == NEW_SPACE);
+         identity() == MAP_SPACE || identity() == NEW_SPACE ||
+         identity() == SHARED_SPACE);
 
+  Sweeper* sweeper = heap()->sweeper();
   size_t added = 0;
 
   {
@@ -283,8 +288,7 @@ bool PagedSpaceBase::ContainsSlow(Address addr) const {
 
 void PagedSpaceBase::RefineAllocatedBytesAfterSweeping(Page* page) {
   CHECK(page->SweepingDone());
-  auto marking_state =
-      heap()->mark_compact_collector()->non_atomic_marking_state();
+  auto marking_state = heap()->non_atomic_marking_state();
   // The live_byte on the page was accounted in the space allocated
   // bytes counter. After sweeping allocated_bytes() contains the
   // accurate live byte count on the page.
@@ -426,9 +430,14 @@ int PagedSpaceBase::CountTotalPages() const {
 
 void PagedSpaceBase::SetLinearAllocationArea(Address top, Address limit) {
   SetTopAndLimit(top, limit);
-  if (top != kNullAddress && top != limit && identity() != NEW_SPACE &&
-      heap()->incremental_marking()->black_allocation()) {
-    Page::FromAllocationAreaAddress(top)->CreateBlackArea(top, limit);
+  if (top != kNullAddress && top != limit) {
+    Page* page = Page::FromAllocationAreaAddress(top);
+    if (identity() == NEW_SPACE) {
+      page->MarkWasUsedForAllocation();
+    } else if (heap()->incremental_marking()->black_allocation()) {
+      DCHECK_NE(NEW_SPACE, identity());
+      page->CreateBlackArea(top, limit);
+    }
   }
 }
 
@@ -534,21 +543,22 @@ void PagedSpaceBase::FreeLinearAllocationArea() {
         GetUnprotectMemoryOrigin(is_compaction_space()));
   }
 
-  DCHECK_IMPLIES(current_limit - current_top >= 2 * kTaggedSize,
-                 heap()->incremental_marking()->marking_state()->IsWhite(
-                     HeapObject::FromAddress(current_top)));
+  DCHECK_IMPLIES(
+      current_limit - current_top >= 2 * kTaggedSize,
+      heap()->marking_state()->IsWhite(HeapObject::FromAddress(current_top)));
   Free(current_top, current_limit - current_top,
        SpaceAccountingMode::kSpaceAccounted);
 }
 
 void PagedSpaceBase::ReleasePage(Page* page) {
-  DCHECK_EQ(
-      0, heap()->incremental_marking()->non_atomic_marking_state()->live_bytes(
-             page));
+  DCHECK(page->SweepingDone());
+  DCHECK_EQ(0, heap()->non_atomic_marking_state()->live_bytes(page));
   DCHECK_EQ(page->owner(), this);
 
   DCHECK_IMPLIES(identity() == NEW_SPACE, page->IsFlagSet(Page::TO_PAGE));
 
+  memory_chunk_list().Remove(page);
+
   free_list_->EvictFreeListItems(page);
 
   if (Page::FromAllocationAreaAddress(allocation_info_.top()) == page) {
@@ -648,76 +658,6 @@ bool PagedSpaceBase::TryAllocationFromFreeListMain(size_t size_in_bytes,
   return true;
 }
 
-base::Optional<std::pair<Address, size_t>>
-PagedSpaceBase::RawAllocateBackground(LocalHeap* local_heap,
-                                      size_t min_size_in_bytes,
-                                      size_t max_size_in_bytes,
-                                      AllocationOrigin origin) {
-  DCHECK(!is_compaction_space());
-  DCHECK(identity() == OLD_SPACE || identity() == CODE_SPACE ||
-         identity() == MAP_SPACE);
-  DCHECK(origin == AllocationOrigin::kRuntime ||
-         origin == AllocationOrigin::kGC);
-  DCHECK_IMPLIES(!local_heap, origin == AllocationOrigin::kGC);
-
-  base::Optional<std::pair<Address, size_t>> result =
-      TryAllocationFromFreeListBackground(min_size_in_bytes, max_size_in_bytes,
-                                          origin);
-  if (result) return result;
-
-  MarkCompactCollector* collector = heap()->mark_compact_collector();
-  // Sweeping is still in progress.
-  if (collector->sweeping_in_progress()) {
-    // First try to refill the free-list, concurrent sweeper threads
-    // may have freed some objects in the meantime.
-    RefillFreeList(collector->sweeper());
-
-    // Retry the free list allocation.
-    result = TryAllocationFromFreeListBackground(min_size_in_bytes,
-                                                 max_size_in_bytes, origin);
-    if (result) return result;
-
-    if (IsSweepingAllowedOnThread(local_heap)) {
-      // Now contribute to sweeping from background thread and then try to
-      // reallocate.
-      const int kMaxPagesToSweep = 1;
-      int max_freed = collector->sweeper()->ParallelSweepSpace(
-          identity(), Sweeper::SweepingMode::kLazyOrConcurrent,
-          static_cast<int>(min_size_in_bytes), kMaxPagesToSweep);
-
-      // Keep new space sweeping atomic.
-      RefillFreeList(collector->sweeper());
-
-      if (static_cast<size_t>(max_freed) >= min_size_in_bytes) {
-        result = TryAllocationFromFreeListBackground(min_size_in_bytes,
-                                                     max_size_in_bytes, origin);
-        if (result) return result;
-      }
-    }
-  }
-
-  if (heap()->ShouldExpandOldGenerationOnSlowAllocation(local_heap) &&
-      heap()->CanExpandOldGenerationBackground(local_heap, AreaSize())) {
-    result = TryExpandBackground(max_size_in_bytes);
-    if (result) return result;
-  }
-
-  if (collector->sweeping_in_progress()) {
-    // Complete sweeping for this space.
-    if (IsSweepingAllowedOnThread(local_heap)) {
-      collector->DrainSweepingWorklistForSpace(identity());
-    }
-
-    RefillFreeList(collector->sweeper());
-
-    // Last try to acquire memory from free list.
-    return TryAllocationFromFreeListBackground(min_size_in_bytes,
-                                               max_size_in_bytes, origin);
-  }
-
-  return {};
-}
-
 base::Optional<std::pair<Address, size_t>>
 PagedSpaceBase::TryAllocationFromFreeListBackground(size_t min_size_in_bytes,
                                                     size_t max_size_in_bytes,
@@ -725,7 +665,7 @@ PagedSpaceBase::TryAllocationFromFreeListBackground(size_t min_size_in_bytes,
   base::MutexGuard lock(&space_mutex_);
   DCHECK_LE(min_size_in_bytes, max_size_in_bytes);
   DCHECK(identity() == OLD_SPACE || identity() == CODE_SPACE ||
-         identity() == MAP_SPACE);
+         identity() == MAP_SPACE || identity() == SHARED_SPACE);
 
   size_t new_node_size = 0;
   FreeSpace new_node =
@@ -743,8 +683,6 @@ PagedSpaceBase::TryAllocationFromFreeListBackground(size_t min_size_in_bytes,
   Page* page = Page::FromHeapObject(new_node);
   IncreaseAllocatedBytes(new_node_size, page);
 
-  heap()->StartIncrementalMarkingIfAllocationLimitIsReachedBackground();
-
   size_t used_size_in_bytes = std::min(new_node_size, max_size_in_bytes);
 
   Address start = new_node.address();
@@ -764,12 +702,6 @@ PagedSpaceBase::TryAllocationFromFreeListBackground(size_t min_size_in_bytes,
   return std::make_pair(start, used_size_in_bytes);
 }
 
-bool PagedSpaceBase::IsSweepingAllowedOnThread(LocalHeap* local_heap) const {
-  // Code space sweeping is only allowed on main thread.
-  return (local_heap && local_heap->is_main_thread()) ||
-         identity() != CODE_SPACE;
-}
-
 #ifdef DEBUG
 void PagedSpaceBase::Print() {}
 #endif
@@ -788,6 +720,7 @@ void PagedSpaceBase::Verify(Isolate* isolate, ObjectVisitor* visitor) const {
   PtrComprCageBase cage_base(isolate);
   for (const Page* page : *this) {
     CHECK_EQ(page->owner(), this);
+    CHECK_IMPLIES(identity() != NEW_SPACE, !page->WasUsedForAllocation());
 
     for (int i = 0; i < kNumTypes; i++) {
       external_page_bytes[static_cast<ExternalBackingStoreType>(i)] = 0;
@@ -866,7 +799,7 @@ void PagedSpaceBase::Verify(Isolate* isolate, ObjectVisitor* visitor) const {
 }
 
 void PagedSpaceBase::VerifyLiveBytes() const {
-  MarkingState* marking_state = heap()->incremental_marking()->marking_state();
+  MarkingState* marking_state = heap()->marking_state();
   PtrComprCageBase cage_base(heap()->isolate());
   for (const Page* page : *this) {
     CHECK(page->SweepingDone());
@@ -895,7 +828,7 @@ void PagedSpaceBase::VerifyCountersAfterSweeping(Heap* heap) const {
     size_t real_allocated = 0;
     for (HeapObject object = it.Next(); !object.is_null(); object = it.Next()) {
       if (!object.IsFreeSpaceOrFiller()) {
-        real_allocated += object.Size(cage_base);
+        real_allocated += ALIGN_TO_ALLOCATION_ALIGNMENT(object.Size(cage_base));
       }
     }
     total_allocated += page->allocated_bytes();
@@ -911,8 +844,7 @@ void PagedSpaceBase::VerifyCountersAfterSweeping(Heap* heap) const {
 void PagedSpaceBase::VerifyCountersBeforeConcurrentSweeping() const {
   size_t total_capacity = 0;
   size_t total_allocated = 0;
-  auto marking_state =
-      heap()->incremental_marking()->non_atomic_marking_state();
+  auto marking_state = heap()->non_atomic_marking_state();
   for (const Page* page : *this) {
     size_t page_allocated =
         page->SweepingDone()
@@ -940,11 +872,6 @@ void PagedSpaceBase::UpdateInlineAllocationLimit(size_t min_size) {
 // -----------------------------------------------------------------------------
 // OldSpace implementation
 
-void PagedSpaceBase::PrepareForMarkCompact() {
-  // Clear the free list before a full GC---it will be rebuilt afterward.
-  free_list_->Reset();
-}
-
 bool PagedSpaceBase::RefillLabMain(int size_in_bytes, AllocationOrigin origin) {
   VMState<GC> state(heap()->isolate());
   RCS_SCOPE(heap()->isolate(),
@@ -989,21 +916,33 @@ bool PagedSpaceBase::RawRefillLabMain(int size_in_bytes,
     return false;
   }
 
-  MarkCompactCollector* collector = heap()->mark_compact_collector();
+  const bool is_main_thread =
+      heap()->IsMainThread() || heap()->IsSharedMainThread();
+  const auto sweeping_scope_id = is_main_thread
+                                     ? GCTracer::Scope::MC_SWEEP
+                                     : GCTracer::Scope::MC_BACKGROUND_SWEEPING;
+  const auto sweeping_scope_kind =
+      is_main_thread ? ThreadKind::kMain : ThreadKind::kBackground;
   // Sweeping is still in progress.
-  if (collector->sweeping_in_progress()) {
+  if (heap()->sweeping_in_progress()) {
     // First try to refill the free-list, concurrent sweeper threads
     // may have freed some objects in the meantime.
-    RefillFreeList(collector->sweeper());
+    {
+      TRACE_GC_EPOCH(heap()->tracer(), sweeping_scope_id, sweeping_scope_kind);
+      RefillFreeList();
+    }
 
     // Retry the free list allocation.
     if (TryAllocationFromFreeListMain(static_cast<size_t>(size_in_bytes),
                                       origin))
       return true;
 
-    if (ContributeToSweepingMain(size_in_bytes, kMaxPagesToSweep, size_in_bytes,
-                                 origin))
-      return true;
+    {
+      TRACE_GC_EPOCH(heap()->tracer(), sweeping_scope_id, sweeping_scope_kind);
+      if (ContributeToSweepingMain(size_in_bytes, kMaxPagesToSweep,
+                                   size_in_bytes, origin))
+        return true;
+    }
   }
 
   if (is_compaction_space()) {
@@ -1029,8 +968,9 @@ bool PagedSpaceBase::RawRefillLabMain(int size_in_bytes,
   }
 
   // Try sweeping all pages.
-  if (ContributeToSweepingMain(0, 0, size_in_bytes, origin)) {
-    return true;
+  {
+    TRACE_GC_EPOCH(heap()->tracer(), sweeping_scope_id, sweeping_scope_kind);
+    if (ContributeToSweepingMain(0, 0, size_in_bytes, origin)) return true;
   }
 
   if (heap()->gc_state() != Heap::NOT_IN_GC && !heap()->force_oom()) {
@@ -1054,11 +994,10 @@ bool PagedSpaceBase::ContributeToSweepingMain(int required_freed_bytes,
       is_compaction_space() ? Sweeper::SweepingMode::kEagerDuringGC
                             : Sweeper::SweepingMode::kLazyOrConcurrent;
 
-  MarkCompactCollector* collector = heap()->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->sweeper()->ParallelSweepSpace(identity(), sweeping_mode,
-                                             required_freed_bytes, max_pages);
-    RefillFreeList(collector->sweeper());
+  if (heap()->sweeping_in_progress()) {
+    heap()->sweeper()->ParallelSweepSpace(identity(), sweeping_mode,
+                                          required_freed_bytes, max_pages);
+    RefillFreeList();
     return TryAllocationFromFreeListMain(size_in_bytes, origin);
   }
   return false;
diff --git a/deps/v8/src/heap/paged-spaces.h b/deps/v8/src/heap/paged-spaces.h
index 7241a29b0e3476..70da63e53d6da6 100644
--- a/deps/v8/src/heap/paged-spaces.h
+++ b/deps/v8/src/heap/paged-spaces.h
@@ -110,9 +110,6 @@ class V8_EXPORT_PRIVATE PagedSpaceBase
   // Does the space need executable memory?
   Executability executable() const { return executable_; }
 
-  // Prepares for a mark-compact GC.
-  void PrepareForMarkCompact();
-
   // Current capacity without growing (Size() + Available()).
   size_t Capacity() const { return accounting_stats_.Capacity(); }
 
@@ -280,7 +277,7 @@ class V8_EXPORT_PRIVATE PagedSpaceBase
 
   // Refills the free list from the corresponding free list filled by the
   // sweeper.
-  void RefillFreeList(Sweeper* sweeper);
+  void RefillFreeList();
 
   base::Mutex* mutex() { return &space_mutex_; }
 
@@ -321,6 +318,19 @@ class V8_EXPORT_PRIVATE PagedSpaceBase
   void ReduceActiveSystemPages(Page* page,
                                ActiveSystemPages active_system_pages);
 
+  // Allocates memory with the given size constraints from the space's free
+  // list.
+  V8_WARN_UNUSED_RESULT base::Optional<std::pair<Address, size_t>>
+  TryAllocationFromFreeListBackground(size_t min_size_in_bytes,
+                                      size_t max_size_in_bytes,
+                                      AllocationOrigin origin);
+
+  // Expands the space by a single page from a background thread and allocates
+  // a memory area of the given size in it. If successful the method returns
+  // the address and size of the area.
+  base::Optional<std::pair<Address, size_t>> TryExpandBackground(
+      size_t size_in_bytes);
+
  private:
   class ConcurrentAllocationMutex {
    public:
@@ -353,10 +363,6 @@ class V8_EXPORT_PRIVATE PagedSpaceBase
 
   bool HasPages() const { return first_page() != nullptr; }
 
-  // Returns whether sweeping of this space is safe on this thread. Code space
-  // sweeping is only allowed on the main thread.
-  bool IsSweepingAllowedOnThread(LocalHeap* local_heap) const;
-
   // Cleans up the space, frees all pages in this space except those belonging
   // to the initial chunk, uncommits addresses in the initial chunk.
   void TearDown();
@@ -366,12 +372,6 @@ class V8_EXPORT_PRIVATE PagedSpaceBase
   // size limit has been hit.
   virtual Page* TryExpandImpl();
 
-  // Expands the space by a single page from a background thread and allocates
-  // a memory area of the given size in it. If successful the method returns
-  // the address and size of the area.
-  base::Optional<std::pair<Address, size_t>> TryExpandBackground(
-      size_t size_in_bytes);
-
   bool EnsureAllocation(int size_in_bytes, AllocationAlignment alignment,
                         AllocationOrigin origin,
                         int* out_max_aligned_size) override;
@@ -395,11 +395,6 @@ class V8_EXPORT_PRIVATE PagedSpaceBase
   V8_WARN_UNUSED_RESULT bool RawRefillLabMain(int size_in_bytes,
                                               AllocationOrigin origin);
 
-  V8_WARN_UNUSED_RESULT base::Optional<std::pair<Address, size_t>>
-  TryAllocationFromFreeListBackground(size_t min_size_in_bytes,
-                                      size_t max_size_in_bytes,
-                                      AllocationOrigin origin);
-
   V8_WARN_UNUSED_RESULT bool TryExpand(int size_in_bytes,
                                        AllocationOrigin origin);
 
@@ -483,7 +478,9 @@ class CompactionSpaceCollection : public Malloced {
         map_space_(heap, MAP_SPACE, Executability::NOT_EXECUTABLE,
                    compaction_space_kind),
         code_space_(heap, CODE_SPACE, Executability::EXECUTABLE,
-                    compaction_space_kind) {}
+                    compaction_space_kind),
+        shared_space_(heap, SHARED_SPACE, Executability::NOT_EXECUTABLE,
+                      compaction_space_kind) {}
 
   CompactionSpace* Get(AllocationSpace space) {
     switch (space) {
@@ -493,6 +490,8 @@ class CompactionSpaceCollection : public Malloced {
         return &map_space_;
       case CODE_SPACE:
         return &code_space_;
+      case SHARED_SPACE:
+        return &shared_space_;
       default:
         UNREACHABLE();
     }
@@ -503,6 +502,7 @@ class CompactionSpaceCollection : public Malloced {
   CompactionSpace old_space_;
   CompactionSpace map_space_;
   CompactionSpace code_space_;
+  CompactionSpace shared_space_;
 };
 
 // -----------------------------------------------------------------------------
@@ -554,7 +554,9 @@ class MapSpace final : public PagedSpace {
                    paged_allocation_info_) {}
 
   int RoundSizeDownToObjectAlignment(int size) const override {
-    if (base::bits::IsPowerOfTwo(Map::kSize)) {
+    if (V8_COMPRESS_POINTERS_8GB_BOOL) {
+      return RoundDown(size, kObjectAlignment8GbHeap);
+    } else if (base::bits::IsPowerOfTwo(Map::kSize)) {
       return RoundDown(size, Map::kSize);
     } else {
       return (size / Map::kSize) * Map::kSize;
@@ -571,6 +573,32 @@ class MapSpace final : public PagedSpace {
   LinearAllocationArea paged_allocation_info_;
 };
 
+// -----------------------------------------------------------------------------
+// Shared space regular object space.
+
+class SharedSpace final : public PagedSpace {
+ public:
+  // Creates an old space object. The constructor does not allocate pages
+  // from OS.
+  explicit SharedSpace(Heap* heap)
+      : PagedSpace(heap, SHARED_SPACE, NOT_EXECUTABLE,
+                   FreeList::CreateFreeList(), allocation_info) {}
+
+  static bool IsAtPageStart(Address addr) {
+    return static_cast<intptr_t>(addr & kPageAlignmentMask) ==
+           MemoryChunkLayout::ObjectStartOffsetInDataPage();
+  }
+
+  size_t ExternalBackingStoreBytes(ExternalBackingStoreType type) const final {
+    if (type == ExternalBackingStoreType::kArrayBuffer) return 0;
+    DCHECK_EQ(type, ExternalBackingStoreType::kExternalString);
+    return external_backing_store_bytes_[type];
+  }
+
+ private:
+  LinearAllocationArea allocation_info;
+};
+
 // Iterates over the chunks (pages and large object pages) that can contain
 // pointers to new space or to evacuation candidates.
 class OldGenerationMemoryChunkIterator {
diff --git a/deps/v8/src/heap/pretenuring-handler-inl.h b/deps/v8/src/heap/pretenuring-handler-inl.h
new file mode 100644
index 00000000000000..7447b08b8b9995
--- /dev/null
+++ b/deps/v8/src/heap/pretenuring-handler-inl.h
@@ -0,0 +1,112 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_PRETENURING_HANDLER_INL_H_
+#define V8_HEAP_PRETENURING_HANDLER_INL_H_
+
+#include "src/base/sanitizer/msan.h"
+#include "src/heap/memory-chunk.h"
+#include "src/heap/new-spaces.h"
+#include "src/heap/pretenuring-handler.h"
+#include "src/heap/spaces.h"
+#include "src/objects/allocation-site-inl.h"
+
+namespace v8 {
+namespace internal {
+
+void PretenturingHandler::UpdateAllocationSite(
+    Map map, HeapObject object, PretenuringFeedbackMap* pretenuring_feedback) {
+  DCHECK_NE(pretenuring_feedback, &global_pretenuring_feedback_);
+#ifdef DEBUG
+  BasicMemoryChunk* chunk = BasicMemoryChunk::FromHeapObject(object);
+  DCHECK_IMPLIES(chunk->IsToPage(),
+                 v8_flags.minor_mc ||
+                     chunk->IsFlagSet(MemoryChunk::PAGE_NEW_NEW_PROMOTION));
+  DCHECK_IMPLIES(!chunk->InYoungGeneration(),
+                 chunk->IsFlagSet(MemoryChunk::PAGE_NEW_OLD_PROMOTION));
+#endif
+  if (!v8_flags.allocation_site_pretenuring ||
+      !AllocationSite::CanTrack(map.instance_type())) {
+    return;
+  }
+  AllocationMemento memento_candidate =
+      FindAllocationMemento<kForGC>(map, object);
+  if (memento_candidate.is_null()) return;
+
+  // Entering cached feedback is used in the parallel case. We are not allowed
+  // to dereference the allocation site and rather have to postpone all checks
+  // till actually merging the data.
+  Address key = memento_candidate.GetAllocationSiteUnchecked();
+  (*pretenuring_feedback)[AllocationSite::unchecked_cast(Object(key))]++;
+}
+
+template <PretenturingHandler::FindMementoMode mode>
+AllocationMemento PretenturingHandler::FindAllocationMemento(
+    Map map, HeapObject object) {
+  Address object_address = object.address();
+  Address memento_address =
+      object_address + ALIGN_TO_ALLOCATION_ALIGNMENT(object.SizeFromMap(map));
+  Address last_memento_word_address = memento_address + kTaggedSize;
+  // If the memento would be on another page, bail out immediately.
+  if (!Page::OnSamePage(object_address, last_memento_word_address)) {
+    return AllocationMemento();
+  }
+  HeapObject candidate = HeapObject::FromAddress(memento_address);
+  ObjectSlot candidate_map_slot = candidate.map_slot();
+  // This fast check may peek at an uninitialized word. However, the slow check
+  // below (memento_address == top) ensures that this is safe. Mark the word as
+  // initialized to silence MemorySanitizer warnings.
+  MSAN_MEMORY_IS_INITIALIZED(candidate_map_slot.address(), kTaggedSize);
+  if (!candidate_map_slot.contains_map_value(
+          ReadOnlyRoots(heap_).allocation_memento_map().ptr())) {
+    return AllocationMemento();
+  }
+
+  // Bail out if the memento is below the age mark, which can happen when
+  // mementos survived because a page got moved within new space.
+  Page* object_page = Page::FromAddress(object_address);
+  if (object_page->IsFlagSet(Page::NEW_SPACE_BELOW_AGE_MARK)) {
+    Address age_mark =
+        reinterpret_cast<SemiSpace*>(object_page->owner())->age_mark();
+    if (!object_page->Contains(age_mark)) {
+      return AllocationMemento();
+    }
+    // Do an exact check in the case where the age mark is on the same page.
+    if (object_address < age_mark) {
+      return AllocationMemento();
+    }
+  }
+
+  AllocationMemento memento_candidate = AllocationMemento::cast(candidate);
+
+  // Depending on what the memento is used for, we might need to perform
+  // additional checks.
+  Address top;
+  switch (mode) {
+    case kForGC:
+      return memento_candidate;
+    case kForRuntime:
+      if (memento_candidate.is_null()) return AllocationMemento();
+      // Either the object is the last object in the new space, or there is
+      // another object of at least word size (the header map word) following
+      // it, so suffices to compare ptr and top here.
+      top = heap_->NewSpaceTop();
+      DCHECK(memento_address >= heap_->new_space()->limit() ||
+             memento_address +
+                     ALIGN_TO_ALLOCATION_ALIGNMENT(AllocationMemento::kSize) <=
+                 top);
+      if ((memento_address != top) && memento_candidate.IsValid()) {
+        return memento_candidate;
+      }
+      return AllocationMemento();
+    default:
+      UNREACHABLE();
+  }
+  UNREACHABLE();
+}
+
+}  // namespace internal
+}  // namespace v8
+
+#endif  // V8_HEAP_PRETENURING_HANDLER_INL_H_
diff --git a/deps/v8/src/heap/pretenuring-handler.cc b/deps/v8/src/heap/pretenuring-handler.cc
new file mode 100644
index 00000000000000..3276bdec01bbd8
--- /dev/null
+++ b/deps/v8/src/heap/pretenuring-handler.cc
@@ -0,0 +1,244 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/pretenuring-handler.h"
+
+#include "src/execution/isolate.h"
+#include "src/handles/global-handles-inl.h"
+#include "src/heap/new-spaces.h"
+#include "src/objects/allocation-site-inl.h"
+
+namespace v8 {
+namespace internal {
+
+PretenturingHandler::PretenturingHandler(Heap* heap)
+    : heap_(heap), global_pretenuring_feedback_(kInitialFeedbackCapacity) {}
+
+PretenturingHandler::~PretenturingHandler() = default;
+
+void PretenturingHandler::MergeAllocationSitePretenuringFeedback(
+    const PretenuringFeedbackMap& local_pretenuring_feedback) {
+  PtrComprCageBase cage_base(heap_->isolate());
+  AllocationSite site;
+  for (auto& site_and_count : local_pretenuring_feedback) {
+    site = site_and_count.first;
+    MapWord map_word = site.map_word(cage_base, kRelaxedLoad);
+    if (map_word.IsForwardingAddress()) {
+      site = AllocationSite::cast(map_word.ToForwardingAddress());
+    }
+
+    // We have not validated the allocation site yet, since we have not
+    // dereferenced the site during collecting information.
+    // This is an inlined check of AllocationMemento::IsValid.
+    if (!site.IsAllocationSite() || site.IsZombie()) continue;
+
+    const int value = static_cast<int>(site_and_count.second);
+    DCHECK_LT(0, value);
+    if (site.IncrementMementoFoundCount(value)) {
+      // For sites in the global map the count is accessed through the site.
+      global_pretenuring_feedback_.insert(std::make_pair(site, 0));
+    }
+  }
+}
+
+bool PretenturingHandler::DeoptMaybeTenuredAllocationSites() const {
+  NewSpace* new_space = heap_->new_space();
+  return new_space && new_space->IsAtMaximumCapacity() &&
+         !heap_->MaximumSizeMinorGC();
+}
+
+namespace {
+
+inline bool MakePretenureDecision(
+    AllocationSite site, AllocationSite::PretenureDecision current_decision,
+    double ratio, bool maximum_size_scavenge) {
+  // Here we just allow state transitions from undecided or maybe tenure
+  // to don't tenure, maybe tenure, or tenure.
+  if ((current_decision == AllocationSite::kUndecided ||
+       current_decision == AllocationSite::kMaybeTenure)) {
+    if (ratio >= AllocationSite::kPretenureRatio) {
+      // We just transition into tenure state when the semi-space was at
+      // maximum capacity.
+      if (maximum_size_scavenge) {
+        site.set_deopt_dependent_code(true);
+        site.set_pretenure_decision(AllocationSite::kTenure);
+        // Currently we just need to deopt when we make a state transition to
+        // tenure.
+        return true;
+      }
+      site.set_pretenure_decision(AllocationSite::kMaybeTenure);
+    } else {
+      site.set_pretenure_decision(AllocationSite::kDontTenure);
+    }
+  }
+  return false;
+}
+
+// Clear feedback calculation fields until the next gc.
+inline void ResetPretenuringFeedback(AllocationSite site) {
+  site.set_memento_found_count(0);
+  site.set_memento_create_count(0);
+}
+
+inline bool DigestPretenuringFeedback(Isolate* isolate, AllocationSite site,
+                                      bool maximum_size_scavenge) {
+  bool deopt = false;
+  int create_count = site.memento_create_count();
+  int found_count = site.memento_found_count();
+  bool minimum_mementos_created =
+      create_count >= AllocationSite::kPretenureMinimumCreated;
+  double ratio =
+      minimum_mementos_created || v8_flags.trace_pretenuring_statistics
+          ? static_cast<double>(found_count) / create_count
+          : 0.0;
+  AllocationSite::PretenureDecision current_decision =
+      site.pretenure_decision();
+
+  if (minimum_mementos_created) {
+    deopt = MakePretenureDecision(site, current_decision, ratio,
+                                  maximum_size_scavenge);
+  }
+
+  if (v8_flags.trace_pretenuring_statistics) {
+    PrintIsolate(isolate,
+                 "pretenuring: AllocationSite(%p): (created, found, ratio) "
+                 "(%d, %d, %f) %s => %s\n",
+                 reinterpret_cast<void*>(site.ptr()), create_count, found_count,
+                 ratio, site.PretenureDecisionName(current_decision),
+                 site.PretenureDecisionName(site.pretenure_decision()));
+  }
+
+  ResetPretenuringFeedback(site);
+  return deopt;
+}
+
+bool PretenureAllocationSiteManually(Isolate* isolate, AllocationSite site) {
+  AllocationSite::PretenureDecision current_decision =
+      site.pretenure_decision();
+  bool deopt = true;
+  if (current_decision == AllocationSite::kUndecided ||
+      current_decision == AllocationSite::kMaybeTenure) {
+    site.set_deopt_dependent_code(true);
+    site.set_pretenure_decision(AllocationSite::kTenure);
+  } else {
+    deopt = false;
+  }
+  if (v8_flags.trace_pretenuring_statistics) {
+    PrintIsolate(isolate,
+                 "pretenuring manually requested: AllocationSite(%p): "
+                 "%s => %s\n",
+                 reinterpret_cast<void*>(site.ptr()),
+                 site.PretenureDecisionName(current_decision),
+                 site.PretenureDecisionName(site.pretenure_decision()));
+  }
+
+  ResetPretenuringFeedback(site);
+  return deopt;
+}
+
+}  // namespace
+
+void PretenturingHandler::RemoveAllocationSitePretenuringFeedback(
+    AllocationSite site) {
+  global_pretenuring_feedback_.erase(site);
+}
+
+void PretenturingHandler::ProcessPretenuringFeedback() {
+  bool trigger_deoptimization = false;
+  if (v8_flags.allocation_site_pretenuring) {
+    int tenure_decisions = 0;
+    int dont_tenure_decisions = 0;
+    int allocation_mementos_found = 0;
+    int allocation_sites = 0;
+    int active_allocation_sites = 0;
+
+    AllocationSite site;
+
+    // Step 1: Digest feedback for recorded allocation sites.
+    bool maximum_size_scavenge = heap_->MaximumSizeMinorGC();
+    for (auto& site_and_count : global_pretenuring_feedback_) {
+      allocation_sites++;
+      site = site_and_count.first;
+      // Count is always access through the site.
+      DCHECK_EQ(0, site_and_count.second);
+      int found_count = site.memento_found_count();
+      // An entry in the storage does not imply that the count is > 0 because
+      // allocation sites might have been reset due to too many objects dying
+      // in old space.
+      if (found_count > 0) {
+        DCHECK(site.IsAllocationSite());
+        active_allocation_sites++;
+        allocation_mementos_found += found_count;
+        if (DigestPretenuringFeedback(heap_->isolate(), site,
+                                      maximum_size_scavenge)) {
+          trigger_deoptimization = true;
+        }
+        if (site.GetAllocationType() == AllocationType::kOld) {
+          tenure_decisions++;
+        } else {
+          dont_tenure_decisions++;
+        }
+      }
+    }
+
+    // Step 2: Pretenure allocation sites for manual requests.
+    if (allocation_sites_to_pretenure_) {
+      while (!allocation_sites_to_pretenure_->empty()) {
+        auto pretenure_site = allocation_sites_to_pretenure_->Pop();
+        if (PretenureAllocationSiteManually(heap_->isolate(), pretenure_site)) {
+          trigger_deoptimization = true;
+        }
+      }
+      allocation_sites_to_pretenure_.reset();
+    }
+
+    // Step 3: Deopt maybe tenured allocation sites if necessary.
+    bool deopt_maybe_tenured = DeoptMaybeTenuredAllocationSites();
+    if (deopt_maybe_tenured) {
+      heap_->ForeachAllocationSite(
+          heap_->allocation_sites_list(),
+          [&allocation_sites, &trigger_deoptimization](AllocationSite site) {
+            DCHECK(site.IsAllocationSite());
+            allocation_sites++;
+            if (site.IsMaybeTenure()) {
+              site.set_deopt_dependent_code(true);
+              trigger_deoptimization = true;
+            }
+          });
+    }
+
+    if (trigger_deoptimization) {
+      heap_->isolate()->stack_guard()->RequestDeoptMarkedAllocationSites();
+    }
+
+    if (v8_flags.trace_pretenuring_statistics &&
+        (allocation_mementos_found > 0 || tenure_decisions > 0 ||
+         dont_tenure_decisions > 0)) {
+      PrintIsolate(heap_->isolate(),
+                   "pretenuring: deopt_maybe_tenured=%d visited_sites=%d "
+                   "active_sites=%d "
+                   "mementos=%d tenured=%d not_tenured=%d\n",
+                   deopt_maybe_tenured ? 1 : 0, allocation_sites,
+                   active_allocation_sites, allocation_mementos_found,
+                   tenure_decisions, dont_tenure_decisions);
+    }
+
+    global_pretenuring_feedback_.clear();
+    global_pretenuring_feedback_.reserve(kInitialFeedbackCapacity);
+  }
+}
+
+void PretenturingHandler::PretenureAllocationSiteOnNextCollection(
+    AllocationSite site) {
+  if (!allocation_sites_to_pretenure_) {
+    allocation_sites_to_pretenure_.reset(
+        new GlobalHandleVector<AllocationSite>(heap_));
+  }
+  allocation_sites_to_pretenure_->Push(site);
+}
+
+void PretenturingHandler::reset() { allocation_sites_to_pretenure_.reset(); }
+
+}  // namespace internal
+}  // namespace v8
diff --git a/deps/v8/src/heap/pretenuring-handler.h b/deps/v8/src/heap/pretenuring-handler.h
new file mode 100644
index 00000000000000..4c31141fb83378
--- /dev/null
+++ b/deps/v8/src/heap/pretenuring-handler.h
@@ -0,0 +1,90 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_HEAP_PRETENURING_HANDLER_H_
+#define V8_HEAP_PRETENURING_HANDLER_H_
+
+#include <memory>
+
+#include "src/objects/allocation-site.h"
+#include "src/objects/heap-object.h"
+#include "src/objects/map.h"
+
+namespace v8 {
+namespace internal {
+
+template <typename T>
+class GlobalHandleVector;
+class Heap;
+
+class PretenturingHandler final {
+ public:
+  static const int kInitialFeedbackCapacity = 256;
+  using PretenuringFeedbackMap =
+      std::unordered_map<AllocationSite, size_t, Object::Hasher>;
+  enum FindMementoMode { kForRuntime, kForGC };
+
+  explicit PretenturingHandler(Heap* heap);
+  ~PretenturingHandler();
+
+  void reset();
+
+  // If an object has an AllocationMemento trailing it, return it, otherwise
+  // return a null AllocationMemento.
+  template <FindMementoMode mode>
+  inline AllocationMemento FindAllocationMemento(Map map, HeapObject object);
+
+  // ===========================================================================
+  // Allocation site tracking. =================================================
+  // ===========================================================================
+
+  // Updates the AllocationSite of a given {object}. The entry (including the
+  // count) is cached on the local pretenuring feedback.
+  inline void UpdateAllocationSite(
+      Map map, HeapObject object, PretenuringFeedbackMap* pretenuring_feedback);
+
+  // Merges local pretenuring feedback into the global one. Note that this
+  // method needs to be called after evacuation, as allocation sites may be
+  // evacuated and this method resolves forward pointers accordingly.
+  void MergeAllocationSitePretenuringFeedback(
+      const PretenuringFeedbackMap& local_pretenuring_feedback);
+
+  // Adds an allocation site to the list of sites to be pretenured during the
+  // next collection. Added allocation sites are pretenured independent of
+  // their feedback.
+  V8_EXPORT_PRIVATE void PretenureAllocationSiteOnNextCollection(
+      AllocationSite site);
+
+  // ===========================================================================
+  // Pretenuring. ==============================================================
+  // ===========================================================================
+
+  // Pretenuring decisions are made based on feedback collected during new space
+  // evacuation. Note that between feedback collection and calling this method
+  // object in old space must not move.
+  void ProcessPretenuringFeedback();
+
+  // Removes an entry from the global pretenuring storage.
+  void RemoveAllocationSitePretenuringFeedback(AllocationSite site);
+
+ private:
+  bool DeoptMaybeTenuredAllocationSites() const;
+
+  Heap* const heap_;
+
+  // The feedback storage is used to store allocation sites (keys) and how often
+  // they have been visited (values) by finding a memento behind an object. The
+  // storage is only alive temporary during a GC. The invariant is that all
+  // pointers in this map are already fixed, i.e., they do not point to
+  // forwarding pointers.
+  PretenuringFeedbackMap global_pretenuring_feedback_;
+
+  std::unique_ptr<GlobalHandleVector<AllocationSite>>
+      allocation_sites_to_pretenure_;
+};
+
+}  // namespace internal
+}  // namespace v8
+
+#endif  // V8_HEAP_PRETENURING_HANDLER_H_
diff --git a/deps/v8/src/heap/read-only-heap.cc b/deps/v8/src/heap/read-only-heap.cc
index a365fe38331f11..07db0d09da7b59 100644
--- a/deps/v8/src/heap/read-only-heap.cc
+++ b/deps/v8/src/heap/read-only-heap.cc
@@ -9,6 +9,7 @@
 
 #include "src/base/lazy-instance.h"
 #include "src/base/platform/mutex.h"
+#include "src/common/globals.h"
 #include "src/common/ptr-compr-inl.h"
 #include "src/heap/basic-memory-chunk.h"
 #include "src/heap/heap-write-barrier-inl.h"
@@ -298,7 +299,7 @@ HeapObject ReadOnlyHeapObjectIterator::Next() {
     }
     HeapObject object = HeapObject::FromAddress(current_addr_);
     const int object_size = object.Size();
-    current_addr_ += object_size;
+    current_addr_ += ALIGN_TO_ALLOCATION_ALIGNMENT(object_size);
 
     if (object.IsFreeSpaceOrFiller()) {
       continue;
diff --git a/deps/v8/src/heap/read-only-spaces.cc b/deps/v8/src/heap/read-only-spaces.cc
index 0277f18dd53176..7385fd23533c8e 100644
--- a/deps/v8/src/heap/read-only-spaces.cc
+++ b/deps/v8/src/heap/read-only-spaces.cc
@@ -15,6 +15,7 @@
 #include "src/heap/allocation-stats.h"
 #include "src/heap/basic-memory-chunk.h"
 #include "src/heap/heap-inl.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/memory-allocator.h"
 #include "src/heap/read-only-heap.h"
 #include "src/objects/objects-inl.h"
@@ -185,7 +186,9 @@ ReadOnlyHeap* PointerCompressedReadOnlyArtifacts::GetReadOnlyHeapForIsolate(
   Address isolate_root = isolate->isolate_root();
   for (Object original_object : original_cache) {
     Address original_address = original_object.ptr();
-    Address new_address = isolate_root + CompressTagged(original_address);
+    Address new_address =
+        isolate_root +
+        V8HeapCompressionScheme::CompressTagged(original_address);
     Object new_object = Object(new_address);
     cache.push_back(new_object);
   }
@@ -235,7 +238,8 @@ void PointerCompressedReadOnlyArtifacts::Initialize(
     pages_.push_back(new_page);
     shared_memory_.push_back(std::move(shared_memory));
     // This is just CompressTagged but inlined so it will always compile.
-    Tagged_t compressed_address = CompressTagged(page->address());
+    Tagged_t compressed_address =
+        V8HeapCompressionScheme::CompressTagged(page->address());
     page_offsets_.push_back(compressed_address);
 
     // 3. Update the accounting stats so the allocated bytes are for the new
@@ -332,10 +336,7 @@ ReadOnlyPage::ReadOnlyPage(Heap* heap, BaseSpace* space, size_t chunk_size,
                        std::move(reservation)) {
   allocated_bytes_ = 0;
   SetFlags(Flag::NEVER_EVACUATE | Flag::READ_ONLY_HEAP);
-  heap->incremental_marking()
-      ->non_atomic_marking_state()
-      ->bitmap(this)
-      ->MarkAllBits();
+  heap->non_atomic_marking_state()->bitmap(this)->MarkAllBits();
 }
 
 void ReadOnlyPage::MakeHeaderRelocatable() {
@@ -436,7 +437,7 @@ class ReadOnlySpaceObjectIterator : public ObjectIterator {
       }
       HeapObject obj = HeapObject::FromAddress(cur_addr_);
       const int obj_size = obj.Size();
-      cur_addr_ += obj_size;
+      cur_addr_ += ALIGN_TO_ALLOCATION_ALIGNMENT(obj_size);
       DCHECK_LE(cur_addr_, cur_end_);
       if (!obj.IsFreeSpaceOrFiller()) {
         if (obj.IsCode()) {
@@ -575,7 +576,7 @@ void ReadOnlySpace::FreeLinearAllocationArea() {
 
   // Clear the bits in the unused black area.
   ReadOnlyPage* page = pages_.back();
-  heap()->incremental_marking()->marking_state()->bitmap(page)->ClearRange(
+  heap()->marking_state()->bitmap(page)->ClearRange(
       page->AddressToMarkbitIndex(top_), page->AddressToMarkbitIndex(limit_));
 
   heap()->CreateFillerObjectAt(top_, static_cast<int>(limit_ - top_));
@@ -614,6 +615,7 @@ void ReadOnlySpace::EnsureSpaceForAllocation(int size_in_bytes) {
 
 HeapObject ReadOnlySpace::TryAllocateLinearlyAligned(
     int size_in_bytes, AllocationAlignment alignment) {
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
   Address current_top = top_;
   int filler_size = Heap::GetFillToAlign(current_top, alignment);
 
@@ -639,6 +641,7 @@ AllocationResult ReadOnlySpace::AllocateRawAligned(
     int size_in_bytes, AllocationAlignment alignment) {
   DCHECK(!v8_flags.enable_third_party_heap);
   DCHECK(!IsDetached());
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
   int allocation_size = size_in_bytes;
 
   HeapObject object = TryAllocateLinearlyAligned(allocation_size, alignment);
@@ -658,6 +661,7 @@ AllocationResult ReadOnlySpace::AllocateRawAligned(
 
 AllocationResult ReadOnlySpace::AllocateRawUnaligned(int size_in_bytes) {
   DCHECK(!IsDetached());
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
   EnsureSpaceForAllocation(size_in_bytes);
   Address current_top = top_;
   Address new_top = current_top + size_in_bytes;
@@ -684,7 +688,7 @@ AllocationResult ReadOnlySpace::AllocateRaw(int size_in_bytes,
           : AllocateRawUnaligned(size_in_bytes);
   HeapObject heap_obj;
   if (result.To(&heap_obj)) {
-    DCHECK(heap()->incremental_marking()->marking_state()->IsBlack(heap_obj));
+    DCHECK(heap()->marking_state()->IsBlack(heap_obj));
   }
   return result;
 }
diff --git a/deps/v8/src/heap/remembered-set-inl.h b/deps/v8/src/heap/remembered-set-inl.h
index fe446a6b8ca6e5..03e22cb806c2ea 100644
--- a/deps/v8/src/heap/remembered-set-inl.h
+++ b/deps/v8/src/heap/remembered-set-inl.h
@@ -34,18 +34,16 @@ SlotCallbackResult UpdateTypedSlotHelper::UpdateTypedSlot(Heap* heap,
       RelocInfo rinfo(addr, RelocInfo::FULL_EMBEDDED_OBJECT, 0, Code());
       return UpdateEmbeddedPointer(heap, &rinfo, callback);
     }
-    case SlotType::kEmbeddedObjectData: {
-      RelocInfo rinfo(addr, RelocInfo::DATA_EMBEDDED_OBJECT, 0, Code());
-      return UpdateEmbeddedPointer(heap, &rinfo, callback);
-    }
     case SlotType::kConstPoolEmbeddedObjectCompressed: {
-      HeapObject old_target = HeapObject::cast(Object(
-          DecompressTaggedAny(heap->isolate(), base::Memory<Tagged_t>(addr))));
+      HeapObject old_target =
+          HeapObject::cast(Object(V8HeapCompressionScheme::DecompressTaggedAny(
+              heap->isolate(), base::Memory<Tagged_t>(addr))));
       HeapObject new_target = old_target;
       SlotCallbackResult result = callback(FullMaybeObjectSlot(&new_target));
       DCHECK(!HasWeakHeapObjectTag(new_target));
       if (new_target != old_target) {
-        base::Memory<Tagged_t>(addr) = CompressTagged(new_target.ptr());
+        base::Memory<Tagged_t>(addr) =
+            V8HeapCompressionScheme::CompressTagged(new_target.ptr());
       }
       return result;
     }
@@ -77,13 +75,9 @@ HeapObject UpdateTypedSlotHelper::GetTargetObject(Heap* heap,
       RelocInfo rinfo(addr, RelocInfo::FULL_EMBEDDED_OBJECT, 0, Code());
       return rinfo.target_object(heap->isolate());
     }
-    case SlotType::kEmbeddedObjectData: {
-      RelocInfo rinfo(addr, RelocInfo::DATA_EMBEDDED_OBJECT, 0, Code());
-      return rinfo.target_object(heap->isolate());
-    }
     case SlotType::kConstPoolEmbeddedObjectCompressed: {
-      Address full =
-          DecompressTaggedAny(heap->isolate(), base::Memory<Tagged_t>(addr));
+      Address full = V8HeapCompressionScheme::DecompressTaggedAny(
+          heap->isolate(), base::Memory<Tagged_t>(addr));
       return HeapObject::cast(Object(full));
     }
     case SlotType::kConstPoolEmbeddedObjectFull: {
diff --git a/deps/v8/src/heap/remembered-set.h b/deps/v8/src/heap/remembered-set.h
index 08c5e88010c35a..d7dac8809d35a7 100644
--- a/deps/v8/src/heap/remembered-set.h
+++ b/deps/v8/src/heap/remembered-set.h
@@ -31,7 +31,10 @@ class RememberedSetOperations {
   static void Insert(SlotSet* slot_set, MemoryChunk* chunk, Address slot_addr) {
     DCHECK(chunk->Contains(slot_addr));
     uintptr_t offset = slot_addr - chunk->address();
-    slot_set->Insert<access_mode>(offset);
+    slot_set->Insert<access_mode == v8::internal::AccessMode::ATOMIC
+                         ? v8::internal::SlotSet::AccessMode::ATOMIC
+                         : v8::internal::SlotSet::AccessMode::NON_ATOMIC>(
+        offset);
   }
 
   template <typename Callback>
diff --git a/deps/v8/src/heap/safepoint.cc b/deps/v8/src/heap/safepoint.cc
index cec6ab7fcbdac3..ea36ba296d9243 100644
--- a/deps/v8/src/heap/safepoint.cc
+++ b/deps/v8/src/heap/safepoint.cc
@@ -72,7 +72,7 @@ class PerClientSafepointData final {
 
 void IsolateSafepoint::InitiateGlobalSafepointScope(
     Isolate* initiator, PerClientSafepointData* client_data) {
-  shared_isolate()->global_safepoint()->AssertActive();
+  shared_heap_isolate()->global_safepoint()->AssertActive();
   IgnoreLocalGCRequests ignore_gc_requests(initiator->heap());
   LockMutex(initiator->main_thread_local_heap());
   InitiateGlobalSafepointScopeRaw(initiator, client_data);
@@ -80,7 +80,7 @@ void IsolateSafepoint::InitiateGlobalSafepointScope(
 
 void IsolateSafepoint::TryInitiateGlobalSafepointScope(
     Isolate* initiator, PerClientSafepointData* client_data) {
-  shared_isolate()->global_safepoint()->AssertActive();
+  shared_heap_isolate()->global_safepoint()->AssertActive();
   if (!local_heaps_mutex_.TryLock()) return;
   InitiateGlobalSafepointScopeRaw(initiator, client_data);
 }
@@ -278,8 +278,8 @@ void IsolateSafepoint::AssertMainThreadIsOnlyThread() {
 
 Isolate* IsolateSafepoint::isolate() const { return heap_->isolate(); }
 
-Isolate* IsolateSafepoint::shared_isolate() const {
-  return isolate()->shared_isolate();
+Isolate* IsolateSafepoint::shared_heap_isolate() const {
+  return isolate()->shared_heap_isolate();
 }
 
 SafepointScope::SafepointScope(Heap* heap) : safepoint_(heap->safepoint()) {
@@ -289,7 +289,7 @@ SafepointScope::SafepointScope(Heap* heap) : safepoint_(heap->safepoint()) {
 SafepointScope::~SafepointScope() { safepoint_->LeaveLocalSafepointScope(); }
 
 GlobalSafepoint::GlobalSafepoint(Isolate* isolate)
-    : shared_isolate_(isolate), shared_heap_(isolate->heap()) {}
+    : shared_heap_isolate_(isolate) {}
 
 void GlobalSafepoint::AppendClient(Isolate* client) {
   clients_mutex_.AssertHeld();
@@ -306,7 +306,6 @@ void GlobalSafepoint::AppendClient(Isolate* client) {
   client->global_safepoint_next_client_isolate_ = clients_head_;
 
   clients_head_ = client;
-  client->shared_isolate_ = shared_isolate_;
 }
 
 void GlobalSafepoint::RemoveClient(Isolate* client) {
@@ -369,11 +368,15 @@ void GlobalSafepoint::EnterGlobalSafepointScope(Isolate* initiator) {
         initiator, &clients.back());
   });
 
-  // Make it possible to use AssertActive() on shared isolates.
-  CHECK(shared_isolate_->heap()->safepoint()->local_heaps_mutex_.TryLock());
+  if (shared_heap_isolate_->is_shared()) {
+    // Make it possible to use AssertActive() on shared isolates.
+    CHECK(shared_heap_isolate_->heap()
+              ->safepoint()
+              ->local_heaps_mutex_.TryLock());
 
-  // Shared isolates should never have multiple threads.
-  shared_isolate_->heap()->safepoint()->AssertMainThreadIsOnlyThread();
+    // Shared isolates should never have multiple threads.
+    shared_heap_isolate_->heap()->safepoint()->AssertMainThreadIsOnlyThread();
+  }
 
   // Iterate all clients again to initiate the safepoint for all of them - even
   // if that means blocking.
@@ -384,7 +387,7 @@ void GlobalSafepoint::EnterGlobalSafepointScope(Isolate* initiator) {
 
 #if DEBUG
   for (const PerClientSafepointData& client : clients) {
-    DCHECK_EQ(client.isolate()->shared_isolate(), shared_isolate_);
+    DCHECK_EQ(client.isolate()->shared_heap_isolate(), shared_heap_isolate_);
     DCHECK(client.heap()->deserialization_complete());
   }
 #endif  // DEBUG
@@ -398,7 +401,9 @@ void GlobalSafepoint::EnterGlobalSafepointScope(Isolate* initiator) {
 }
 
 void GlobalSafepoint::LeaveGlobalSafepointScope(Isolate* initiator) {
-  shared_isolate_->heap()->safepoint()->local_heaps_mutex_.Unlock();
+  if (shared_heap_isolate_->is_shared()) {
+    shared_heap_isolate_->heap()->safepoint()->local_heaps_mutex_.Unlock();
+  }
 
   IterateClientIsolates([initiator](Isolate* client) {
     Heap* client_heap = client->heap();
@@ -409,17 +414,22 @@ void GlobalSafepoint::LeaveGlobalSafepointScope(Isolate* initiator) {
 }
 
 GlobalSafepointScope::GlobalSafepointScope(Isolate* initiator)
-    : initiator_(initiator), shared_isolate_(initiator->shared_isolate()) {
-  if (shared_isolate_) {
-    shared_isolate_->global_safepoint()->EnterGlobalSafepointScope(initiator_);
+    : initiator_(initiator),
+      shared_heap_isolate_(initiator->has_shared_heap()
+                               ? initiator->shared_heap_isolate()
+                               : nullptr) {
+  if (shared_heap_isolate_) {
+    shared_heap_isolate_->global_safepoint()->EnterGlobalSafepointScope(
+        initiator_);
   } else {
     initiator_->heap()->safepoint()->EnterLocalSafepointScope();
   }
 }
 
 GlobalSafepointScope::~GlobalSafepointScope() {
-  if (shared_isolate_) {
-    shared_isolate_->global_safepoint()->LeaveGlobalSafepointScope(initiator_);
+  if (shared_heap_isolate_) {
+    shared_heap_isolate_->global_safepoint()->LeaveGlobalSafepointScope(
+        initiator_);
   } else {
     initiator_->heap()->safepoint()->LeaveLocalSafepointScope();
   }
diff --git a/deps/v8/src/heap/safepoint.h b/deps/v8/src/heap/safepoint.h
index 82e76fe6d53e7f..97e0e54591cb23 100644
--- a/deps/v8/src/heap/safepoint.h
+++ b/deps/v8/src/heap/safepoint.h
@@ -133,7 +133,7 @@ class IsolateSafepoint final {
   }
 
   Isolate* isolate() const;
-  Isolate* shared_isolate() const;
+  Isolate* shared_heap_isolate() const;
 
   Barrier barrier_;
   Heap* heap_;
@@ -186,8 +186,7 @@ class GlobalSafepoint final {
   void EnterGlobalSafepointScope(Isolate* initiator);
   void LeaveGlobalSafepointScope(Isolate* initiator);
 
-  Isolate* const shared_isolate_;
-  Heap* const shared_heap_;
+  Isolate* const shared_heap_isolate_;
   base::Mutex clients_mutex_;
   Isolate* clients_head_ = nullptr;
 
@@ -202,7 +201,7 @@ class V8_NODISCARD GlobalSafepointScope {
 
  private:
   Isolate* const initiator_;
-  Isolate* const shared_isolate_;
+  Isolate* const shared_heap_isolate_;
 };
 
 }  // namespace internal
diff --git a/deps/v8/src/heap/scavenger-inl.h b/deps/v8/src/heap/scavenger-inl.h
index 91f4f528d0161f..59d837e1a35e09 100644
--- a/deps/v8/src/heap/scavenger-inl.h
+++ b/deps/v8/src/heap/scavenger-inl.h
@@ -8,9 +8,11 @@
 #include "src/codegen/assembler-inl.h"
 #include "src/heap/evacuation-allocator-inl.h"
 #include "src/heap/incremental-marking-inl.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/memory-chunk.h"
 #include "src/heap/new-spaces.h"
 #include "src/heap/objects-visiting-inl.h"
+#include "src/heap/pretenuring-handler-inl.h"
 #include "src/heap/scavenger.h"
 #include "src/objects/map.h"
 #include "src/objects/objects-body-descriptors-inl.h"
@@ -110,10 +112,11 @@ bool Scavenger::MigrateObject(Map map, HeapObject source, HeapObject target,
   }
 
   if (is_incremental_marking_ &&
-      promotion_heap_choice != kPromoteIntoSharedHeap) {
+      (promotion_heap_choice != kPromoteIntoSharedHeap || mark_shared_heap_)) {
     heap()->incremental_marking()->TransferColor(source, target);
   }
-  heap()->UpdateAllocationSite(map, source, &local_pretenuring_feedback_);
+  pretenuring_handler_->UpdateAllocationSite(map, source,
+                                             &local_pretenuring_feedback_);
 
   return true;
 }
@@ -132,8 +135,7 @@ CopyAndForwardResult Scavenger::SemiSpaceCopyObject(
 
   HeapObject target;
   if (allocation.To(&target)) {
-    DCHECK(heap()->incremental_marking()->non_atomic_marking_state()->IsWhite(
-        target));
+    DCHECK(heap()->non_atomic_marking_state()->IsWhite(target));
     const bool self_success =
         MigrateObject(map, object, target, object_size, kPromoteIntoLocalHeap);
     if (!self_success) {
@@ -181,8 +183,7 @@ CopyAndForwardResult Scavenger::PromoteObject(Map map, THeapObjectSlot slot,
 
   HeapObject target;
   if (allocation.To(&target)) {
-    DCHECK(heap()->incremental_marking()->non_atomic_marking_state()->IsWhite(
-        target));
+    DCHECK(heap()->non_atomic_marking_state()->IsWhite(target));
     const bool self_success =
         MigrateObject(map, object, target, object_size, promotion_heap_choice);
     if (!self_success) {
diff --git a/deps/v8/src/heap/scavenger.cc b/deps/v8/src/heap/scavenger.cc
index dfebb0b89be209..8f1c27c05c0774 100644
--- a/deps/v8/src/heap/scavenger.cc
+++ b/deps/v8/src/heap/scavenger.cc
@@ -18,6 +18,7 @@
 #include "src/heap/memory-chunk-inl.h"
 #include "src/heap/memory-chunk.h"
 #include "src/heap/objects-visiting-inl.h"
+#include "src/heap/pretenuring-handler.h"
 #include "src/heap/remembered-set-inl.h"
 #include "src/heap/scavenger-inl.h"
 #include "src/heap/slot-set.h"
@@ -330,7 +331,7 @@ void ScavengerCollector::CollectGarbage() {
   EphemeronTableList ephemeron_table_list;
 
   {
-    Sweeper* sweeper = heap_->mark_compact_collector()->sweeper();
+    Sweeper* sweeper = heap_->sweeper();
 
     // Pause the concurrent sweeper.
     Sweeper::PauseScope pause_scope(sweeper);
@@ -540,8 +541,7 @@ void ScavengerCollector::SweepArrayBufferExtensions() {
 
 void ScavengerCollector::HandleSurvivingNewLargeObjects() {
   const bool is_compacting = heap_->incremental_marking()->IsCompacting();
-  AtomicMarkingState* marking_state =
-      heap_->incremental_marking()->atomic_marking_state();
+  AtomicMarkingState* marking_state = heap_->atomic_marking_state();
 
   for (SurvivingNewLargeObjectMapEntry update_info :
        surviving_new_large_objects_) {
@@ -598,8 +598,8 @@ Scavenger::PromotionList::Local::Local(Scavenger::PromotionList* promotion_list)
 
 namespace {
 ConcurrentAllocator* CreateSharedOldAllocator(Heap* heap) {
-  if (v8_flags.shared_string_table && heap->isolate()->shared_isolate()) {
-    return new ConcurrentAllocator(nullptr, heap->shared_old_space());
+  if (v8_flags.shared_string_table && heap->isolate()->has_shared_heap()) {
+    return new ConcurrentAllocator(nullptr, heap->shared_allocation_space());
   }
   return nullptr;
 }
@@ -615,7 +615,9 @@ Scavenger::Scavenger(ScavengerCollector* collector, Heap* heap, bool is_logging,
       promotion_list_local_(promotion_list),
       copied_list_local_(*copied_list),
       ephemeron_table_list_local_(*ephemeron_table_list),
-      local_pretenuring_feedback_(kInitialLocalPretenuringFeedbackCapacity),
+      pretenuring_handler_(heap_->pretenuring_handler()),
+      local_pretenuring_feedback_(
+          PretenturingHandler::kInitialFeedbackCapacity),
       copied_size_(0),
       promoted_size_(0),
       allocator_(heap, CompactionSpaceKind::kCompactionSpaceForScavenge),
@@ -625,7 +627,8 @@ Scavenger::Scavenger(ScavengerCollector* collector, Heap* heap, bool is_logging,
       is_compacting_(heap->incremental_marking()->IsCompacting()),
       is_compacting_including_map_space_(is_compacting_ &&
                                          v8_flags.compact_maps),
-      shared_string_table_(shared_old_allocator_.get() != nullptr) {}
+      shared_string_table_(shared_old_allocator_.get() != nullptr),
+      mark_shared_heap_(heap->isolate()->is_shared_space_isolate()) {}
 
 void Scavenger::IterateAndScavengePromotedObject(HeapObject target, Map map,
                                                  int size) {
@@ -636,8 +639,7 @@ void Scavenger::IterateAndScavengePromotedObject(HeapObject target, Map map,
   // the end of collection it would be a violation of the invariant to record
   // its slots.
   const bool record_slots =
-      is_compacting_ &&
-      heap()->incremental_marking()->atomic_marking_state()->IsBlack(target);
+      is_compacting_ && heap()->atomic_marking_state()->IsBlack(target);
 
   IterateAndScavengePromotedObjectsVisitor visitor(this, record_slots);
 
@@ -663,27 +665,29 @@ void Scavenger::RememberPromotedEphemeron(EphemeronHashTable table, int entry) {
 void Scavenger::AddPageToSweeperIfNecessary(MemoryChunk* page) {
   AllocationSpace space = page->owner_identity();
   if ((space == OLD_SPACE) && !page->SweepingDone()) {
-    heap()->mark_compact_collector()->sweeper()->AddPage(
-        space, reinterpret_cast<Page*>(page),
-        Sweeper::READD_TEMPORARY_REMOVED_PAGE);
+    heap()->sweeper()->AddPage(space, reinterpret_cast<Page*>(page),
+                               Sweeper::READD_TEMPORARY_REMOVED_PAGE);
   }
 }
 
 void Scavenger::ScavengePage(MemoryChunk* page) {
   CodePageMemoryModificationScope memory_modification_scope(page);
-  const bool has_shared_isolate = heap_->isolate()->shared_isolate();
+  const bool record_old_to_shared_slots = heap_->isolate()->has_shared_heap();
 
   if (page->slot_set<OLD_TO_NEW, AccessMode::ATOMIC>() != nullptr) {
     InvalidatedSlotsFilter filter = InvalidatedSlotsFilter::OldToNew(
         page, InvalidatedSlotsFilter::LivenessCheck::kNo);
     RememberedSet<OLD_TO_NEW>::IterateAndTrackEmptyBuckets(
         page,
-        [this, page, has_shared_isolate, &filter](MaybeObjectSlot slot) {
+        [this, page, record_old_to_shared_slots,
+         &filter](MaybeObjectSlot slot) {
           if (!filter.IsValid(slot.address())) return REMOVE_SLOT;
           SlotCallbackResult result = CheckAndScavengeObject(heap_, slot);
           // A new space string might have been promoted into the shared heap
           // during GC.
-          if (has_shared_isolate) CheckOldToNewSlotForSharedUntyped(page, slot);
+          if (record_old_to_shared_slots) {
+            CheckOldToNewSlotForSharedUntyped(page, slot);
+          }
           return result;
         },
         &empty_chunks_local_);
@@ -700,11 +704,11 @@ void Scavenger::ScavengePage(MemoryChunk* page) {
         return UpdateTypedSlotHelper::UpdateTypedSlot(
             heap_, slot_type, slot_address,
             [this, page, slot_type, slot_address,
-             has_shared_isolate](FullMaybeObjectSlot slot) {
+             record_old_to_shared_slots](FullMaybeObjectSlot slot) {
               SlotCallbackResult result = CheckAndScavengeObject(heap(), slot);
               // A new space string might have been promoted into the shared
               // heap during GC.
-              if (has_shared_isolate) {
+              if (record_old_to_shared_slots) {
                 CheckOldToNewSlotForSharedTyped(page, slot_type, slot_address);
               }
               return result;
@@ -809,8 +813,9 @@ void ScavengerCollector::ClearOldEphemerons() {
 }
 
 void Scavenger::Finalize() {
-  heap()->MergeAllocationSitePretenuringFeedback(local_pretenuring_feedback_);
-  heap()->IncrementSemiSpaceCopiedObjectSize(copied_size_);
+  pretenuring_handler_->MergeAllocationSitePretenuringFeedback(
+      local_pretenuring_feedback_);
+  heap()->IncrementNewSpaceSurvivingObjectSize(copied_size_);
   heap()->IncrementPromotedObjectsSize(promoted_size_);
   collector_->MergeSurvivingNewLargeObjects(surviving_new_large_objects_);
   allocator_.Finalize();
diff --git a/deps/v8/src/heap/scavenger.h b/deps/v8/src/heap/scavenger.h
index 38979bcf1d7454..6476d1c9270131 100644
--- a/deps/v8/src/heap/scavenger.h
+++ b/deps/v8/src/heap/scavenger.h
@@ -12,6 +12,7 @@
 #include "src/heap/memory-chunk.h"
 #include "src/heap/objects-visiting.h"
 #include "src/heap/parallel-work-item.h"
+#include "src/heap/pretenuring-handler.h"
 #include "src/heap/slot-set.h"
 
 namespace v8 {
@@ -116,7 +117,6 @@ class Scavenger {
   // Number of objects to process before interrupting for potentially waking
   // up other tasks.
   static const int kInterruptThreshold = 128;
-  static const int kInitialLocalPretenuringFeedbackCapacity = 256;
 
   inline Heap* heap() { return heap_; }
 
@@ -199,7 +199,8 @@ class Scavenger {
   PromotionList::Local promotion_list_local_;
   CopiedList::Local copied_list_local_;
   EphemeronTableList::Local ephemeron_table_list_local_;
-  Heap::PretenuringFeedbackMap local_pretenuring_feedback_;
+  PretenturingHandler* const pretenuring_handler_;
+  PretenturingHandler::PretenuringFeedbackMap local_pretenuring_feedback_;
   size_t copied_size_;
   size_t promoted_size_;
   EvacuationAllocator allocator_;
@@ -212,6 +213,7 @@ class Scavenger {
   const bool is_compacting_;
   const bool is_compacting_including_map_space_;
   const bool shared_string_table_;
+  const bool mark_shared_heap_;
 
   friend class IterateAndScavengePromotedObjectsVisitor;
   friend class RootScavengeVisitor;
diff --git a/deps/v8/src/heap/setup-heap-internal.cc b/deps/v8/src/heap/setup-heap-internal.cc
index c1b2fab13d11a0..601d1b832283f4 100644
--- a/deps/v8/src/heap/setup-heap-internal.cc
+++ b/deps/v8/src/heap/setup-heap-internal.cc
@@ -75,9 +75,11 @@ bool SetupIsolateDelegate::SetupHeapInternal(Heap* heap) {
 bool Heap::CreateHeapObjects() {
   // Create initial maps.
   if (!CreateInitialMaps()) return false;
-  if (v8_flags.minor_mc && new_space()) {
-    paged_new_space()->paged_space()->free_list()->RepairLists(this);
-  }
+
+  // Ensure that all young generation pages are iterable. It must be after heap
+  // setup, so that the maps have been created.
+  if (new_space()) new_space()->MakeIterable();
+
   CreateApiObjects();
 
   // Create initial objects
@@ -876,9 +878,11 @@ void Heap::CreateInitialObjects() {
   set_feedback_vectors_for_profiling_tools(roots.undefined_value());
   set_pending_optimize_for_test_bytecode(roots.undefined_value());
   set_shared_wasm_memories(roots.empty_weak_array_list());
+  set_locals_block_list_cache(roots.undefined_value());
 #ifdef V8_ENABLE_WEBASSEMBLY
   set_active_continuation(roots.undefined_value());
   set_active_suspender(roots.undefined_value());
+  set_js_to_wasm_wrappers(roots.empty_weak_array_list());
   set_wasm_canonical_rtts(roots.empty_weak_array_list());
 #endif  // V8_ENABLE_WEBASSEMBLY
 
@@ -1025,8 +1029,8 @@ void Heap::CreateInitialObjects() {
     set_async_generator_await_reject_shared_fun(*info);
 
     info = CreateSharedFunctionInfo(
-        isolate(), Builtin::kAsyncGeneratorYieldResolveClosure, 1);
-    set_async_generator_yield_resolve_shared_fun(*info);
+        isolate(), Builtin::kAsyncGeneratorYieldWithAwaitResolveClosure, 1);
+    set_async_generator_yield_with_await_resolve_shared_fun(*info);
 
     info = CreateSharedFunctionInfo(
         isolate(), Builtin::kAsyncGeneratorReturnResolveClosure, 1);
diff --git a/deps/v8/src/heap/slot-set.h b/deps/v8/src/heap/slot-set.h
index a67f3e94c5d969..a3a40885f804f7 100644
--- a/deps/v8/src/heap/slot-set.h
+++ b/deps/v8/src/heap/slot-set.h
@@ -10,9 +10,8 @@
 #include <stack>
 #include <vector>
 
-#include "src/base/atomic-utils.h"
 #include "src/base/bit-field.h"
-#include "src/base/bits.h"
+#include "src/heap/base/basic-slot-set.h"
 #include "src/objects/compressed-slots.h"
 #include "src/objects/slots.h"
 #include "src/utils/allocation.h"
@@ -22,7 +21,9 @@
 namespace v8 {
 namespace internal {
 
-enum SlotCallbackResult { KEEP_SLOT, REMOVE_SLOT };
+using ::heap::base::KEEP_SLOT;
+using ::heap::base::REMOVE_SLOT;
+using ::heap::base::SlotCallbackResult;
 
 // Possibly empty buckets (buckets that do not contain any slots) are discovered
 // by the scavenger. Buckets might become non-empty when promoting objects later
@@ -126,256 +127,46 @@ class PossiblyEmptyBuckets {
 static_assert(std::is_standard_layout<PossiblyEmptyBuckets>::value);
 static_assert(sizeof(PossiblyEmptyBuckets) == kSystemPointerSize);
 
-// Data structure for maintaining a set of slots in a standard (non-large)
-// page.
-// The data structure assumes that the slots are pointer size aligned and
-// splits the valid slot offset range into buckets.
-// Each bucket is a bitmap with a bit corresponding to a single slot offset.
-class SlotSet {
- public:
-  enum EmptyBucketMode {
-    FREE_EMPTY_BUCKETS,  // An empty bucket will be deallocated immediately.
-    KEEP_EMPTY_BUCKETS   // An empty bucket will be kept.
-  };
+class SlotSet final : public ::heap::base::BasicSlotSet<kTaggedSize> {
+  using BasicSlotSet = ::heap::base::BasicSlotSet<kTaggedSize>;
 
-  SlotSet() = delete;
+ public:
+  static const int kBucketsRegularPage =
+      (1 << kPageSizeBits) / kTaggedSize / kCellsPerBucket / kBitsPerCell;
 
   static SlotSet* Allocate(size_t buckets) {
-    //  SlotSet* slot_set --+
-    //                      |
-    //                      v
-    //    +-----------------+-------------------------+
-    //    | initial buckets |     buckets array       |
-    //    +-----------------+-------------------------+
-    //       pointer-sized    pointer-sized * buckets
-    //
-    //
-    // The SlotSet pointer points to the beginning of the buckets array for
-    // faster access in the write barrier. The number of buckets is needed for
-    // calculating the size of this data structure.
-    size_t buckets_size = buckets * sizeof(Bucket*);
-    size_t size = kInitialBucketsSize + buckets_size;
-    void* allocation = AlignedAllocWithRetry(size, kSystemPointerSize);
-    SlotSet* slot_set = reinterpret_cast<SlotSet*>(
-        reinterpret_cast<uint8_t*>(allocation) + kInitialBucketsSize);
-    DCHECK(
-        IsAligned(reinterpret_cast<uintptr_t>(slot_set), kSystemPointerSize));
-#ifdef DEBUG
-    *slot_set->initial_buckets() = buckets;
-#endif
-    for (size_t i = 0; i < buckets; i++) {
-      *slot_set->bucket(i) = nullptr;
-    }
-    return slot_set;
-  }
-
-  static void Delete(SlotSet* slot_set, size_t buckets) {
-    if (slot_set == nullptr) return;
-
-    for (size_t i = 0; i < buckets; i++) {
-      slot_set->ReleaseBucket(i);
-    }
-
-#ifdef DEBUG
-    size_t initial_buckets = *slot_set->initial_buckets();
-
-    for (size_t i = buckets; i < initial_buckets; i++) {
-      DCHECK_NULL(*slot_set->bucket(i));
-    }
-#endif
-
-    AlignedFree(reinterpret_cast<uint8_t*>(slot_set) - kInitialBucketsSize);
-  }
-
-  static size_t BucketsForSize(size_t size) {
-    return (size + (kTaggedSize * kBitsPerBucket) - 1) >>
-           (kTaggedSizeLog2 + kBitsPerBucketLog2);
-  }
-
-  // Converts the slot offset into bucket index.
-  static size_t BucketForSlot(size_t slot_offset) {
-    DCHECK(IsAligned(slot_offset, kTaggedSize));
-    return slot_offset >> (kTaggedSizeLog2 + kBitsPerBucketLog2);
-  }
-
-  // The slot offset specifies a slot at address page_start_ + slot_offset.
-  // AccessMode defines whether there can be concurrent access on the buckets
-  // or not.
-  template <AccessMode access_mode>
-  void Insert(size_t slot_offset) {
-    size_t bucket_index;
-    int cell_index, bit_index;
-    SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index);
-    Bucket* bucket = LoadBucket<access_mode>(bucket_index);
-    if (bucket == nullptr) {
-      bucket = new Bucket;
-      if (!SwapInNewBucket<access_mode>(bucket_index, bucket)) {
-        delete bucket;
-        bucket = LoadBucket<access_mode>(bucket_index);
-      }
-    }
-    // Check that monotonicity is preserved, i.e., once a bucket is set we do
-    // not free it concurrently.
-    DCHECK(bucket != nullptr);
-    DCHECK_EQ(bucket->cells(), LoadBucket<access_mode>(bucket_index)->cells());
-    uint32_t mask = 1u << bit_index;
-    if ((bucket->LoadCell<access_mode>(cell_index) & mask) == 0) {
-      bucket->SetCellBits<access_mode>(cell_index, mask);
-    }
-  }
-
-  // The slot offset specifies a slot at address page_start_ + slot_offset.
-  // Returns true if the set contains the slot.
-  bool Contains(size_t slot_offset) {
-    size_t bucket_index;
-    int cell_index, bit_index;
-    SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index);
-    Bucket* bucket = LoadBucket(bucket_index);
-    if (bucket == nullptr) return false;
-    return (bucket->LoadCell(cell_index) & (1u << bit_index)) != 0;
-  }
-
-  // The slot offset specifies a slot at address page_start_ + slot_offset.
-  void Remove(size_t slot_offset) {
-    size_t bucket_index;
-    int cell_index, bit_index;
-    SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index);
-    Bucket* bucket = LoadBucket(bucket_index);
-    if (bucket != nullptr) {
-      uint32_t cell = bucket->LoadCell(cell_index);
-      uint32_t bit_mask = 1u << bit_index;
-      if (cell & bit_mask) {
-        bucket->ClearCellBits(cell_index, bit_mask);
-      }
-    }
-  }
-
-  // The slot offsets specify a range of slots at addresses:
-  // [page_start_ + start_offset ... page_start_ + end_offset).
-  void RemoveRange(size_t start_offset, size_t end_offset, size_t buckets,
-                   EmptyBucketMode mode) {
-    CHECK_LE(end_offset, buckets * kBitsPerBucket * kTaggedSize);
-    DCHECK_LE(start_offset, end_offset);
-    size_t start_bucket;
-    int start_cell, start_bit;
-    SlotToIndices(start_offset, &start_bucket, &start_cell, &start_bit);
-    size_t end_bucket;
-    int end_cell, end_bit;
-    SlotToIndices(end_offset, &end_bucket, &end_cell, &end_bit);
-    uint32_t start_mask = (1u << start_bit) - 1;
-    uint32_t end_mask = ~((1u << end_bit) - 1);
-    Bucket* bucket;
-    if (start_bucket == end_bucket && start_cell == end_cell) {
-      bucket = LoadBucket(start_bucket);
-      if (bucket != nullptr) {
-        bucket->ClearCellBits(start_cell, ~(start_mask | end_mask));
-      }
-      return;
-    }
-    size_t current_bucket = start_bucket;
-    int current_cell = start_cell;
-    bucket = LoadBucket(current_bucket);
-    if (bucket != nullptr) {
-      bucket->ClearCellBits(current_cell, ~start_mask);
-    }
-    current_cell++;
-    if (current_bucket < end_bucket) {
-      if (bucket != nullptr) {
-        ClearBucket(bucket, current_cell, kCellsPerBucket);
-      }
-      // The rest of the current bucket is cleared.
-      // Move on to the next bucket.
-      current_bucket++;
-      current_cell = 0;
-    }
-    DCHECK(current_bucket == end_bucket ||
-           (current_bucket < end_bucket && current_cell == 0));
-    while (current_bucket < end_bucket) {
-      if (mode == FREE_EMPTY_BUCKETS) {
-        ReleaseBucket(current_bucket);
-      } else {
-        DCHECK(mode == KEEP_EMPTY_BUCKETS);
-        bucket = LoadBucket(current_bucket);
-        if (bucket != nullptr) {
-          ClearBucket(bucket, 0, kCellsPerBucket);
-        }
-      }
-      current_bucket++;
-    }
-    // All buckets between start_bucket and end_bucket are cleared.
-    DCHECK(current_bucket == end_bucket);
-    if (current_bucket == buckets) return;
-    bucket = LoadBucket(current_bucket);
-    DCHECK(current_cell <= end_cell);
-    if (bucket == nullptr) return;
-    while (current_cell < end_cell) {
-      bucket->StoreCell(current_cell, 0);
-      current_cell++;
-    }
-    // All cells between start_cell and end_cell are cleared.
-    DCHECK(current_bucket == end_bucket && current_cell == end_cell);
-    bucket->ClearCellBits(end_cell, ~end_mask);
-  }
-
-  // The slot offset specifies a slot at address page_start_ + slot_offset.
-  bool Lookup(size_t slot_offset) {
-    size_t bucket_index;
-    int cell_index, bit_index;
-    SlotToIndices(slot_offset, &bucket_index, &cell_index, &bit_index);
-    Bucket* bucket = LoadBucket(bucket_index);
-    if (bucket == nullptr) return false;
-    return (bucket->LoadCell(cell_index) & (1u << bit_index)) != 0;
+    return static_cast<SlotSet*>(BasicSlotSet::Allocate(buckets));
   }
 
-  // Iterate over all slots in the set and for each slot invoke the callback.
-  // If the callback returns REMOVE_SLOT then the slot is removed from the set.
-  // Returns the new number of slots.
-  //
-  // Iteration can be performed concurrently with other operations that use
-  // atomic access mode such as insertion and removal. However there is no
-  // guarantee about ordering and linearizability.
-  //
-  // Sample usage:
-  // Iterate([](MaybeObjectSlot slot) {
-  //    if (good(slot)) return KEEP_SLOT;
-  //    else return REMOVE_SLOT;
-  // });
-  //
-  // Releases memory for empty buckets with FREE_EMPTY_BUCKETS.
+  // Similar to BasicSlotSet::Iterate() but Callback takes the parameter of type
+  // MaybeObjectSlot.
   template <typename Callback>
   size_t Iterate(Address chunk_start, size_t start_bucket, size_t end_bucket,
                  Callback callback, EmptyBucketMode mode) {
-    return Iterate(chunk_start, start_bucket, end_bucket, callback,
-                   [this, mode](size_t bucket_index) {
-                     if (mode == EmptyBucketMode::FREE_EMPTY_BUCKETS) {
-                       ReleaseBucket(bucket_index);
-                     }
-                   });
+    return BasicSlotSet::Iterate(
+        chunk_start, start_bucket, end_bucket,
+        [&callback](Address slot) { return callback(MaybeObjectSlot(slot)); },
+        [this, mode](size_t bucket_index) {
+          if (mode == EmptyBucketMode::FREE_EMPTY_BUCKETS) {
+            ReleaseBucket(bucket_index);
+          }
+        });
   }
 
-  // Similar to Iterate but marks potentially empty buckets internally. Stores
-  // true in empty_bucket_found in case a potentially empty bucket was found.
-  // Assumes that the possibly empty-array was already cleared by
-  // CheckPossiblyEmptyBuckets.
+  // Similar to SlotSet::Iterate() but marks potentially empty buckets
+  // internally. Stores true in empty_bucket_found in case a potentially empty
+  // bucket was found. Assumes that the possibly empty-array was already cleared
+  // by CheckPossiblyEmptyBuckets.
   template <typename Callback>
   size_t IterateAndTrackEmptyBuckets(
       Address chunk_start, size_t start_bucket, size_t end_bucket,
       Callback callback, PossiblyEmptyBuckets* possibly_empty_buckets) {
-    return Iterate(chunk_start, start_bucket, end_bucket, callback,
-                   [possibly_empty_buckets, end_bucket](size_t bucket_index) {
-                     possibly_empty_buckets->Insert(bucket_index, end_bucket);
-                   });
-  }
-
-  bool FreeEmptyBuckets(size_t buckets) {
-    bool empty = true;
-    for (size_t bucket_index = 0; bucket_index < buckets; bucket_index++) {
-      if (!FreeBucketIfEmpty(bucket_index)) {
-        empty = false;
-      }
-    }
-
-    return empty;
+    return BasicSlotSet::Iterate(
+        chunk_start, start_bucket, end_bucket,
+        [&callback](Address slot) { return callback(MaybeObjectSlot(slot)); },
+        [possibly_empty_buckets, end_bucket](size_t bucket_index) {
+          possibly_empty_buckets->Insert(bucket_index, end_bucket);
+        });
   }
 
   // Check whether possibly empty buckets are really empty. Empty buckets are
@@ -406,198 +197,6 @@ class SlotSet {
 
     return empty;
   }
-
-  static const int kCellsPerBucket = 32;
-  static const int kCellsPerBucketLog2 = 5;
-  static const int kCellSizeBytesLog2 = 2;
-  static const int kCellSizeBytes = 1 << kCellSizeBytesLog2;
-  static const int kBitsPerCell = 32;
-  static const int kBitsPerCellLog2 = 5;
-  static const int kBitsPerBucket = kCellsPerBucket * kBitsPerCell;
-  static const int kBitsPerBucketLog2 = kCellsPerBucketLog2 + kBitsPerCellLog2;
-  static const int kBucketsRegularPage =
-      (1 << kPageSizeBits) / kTaggedSize / kCellsPerBucket / kBitsPerCell;
-
-  class Bucket : public Malloced {
-    uint32_t cells_[kCellsPerBucket];
-
-   public:
-    Bucket() {
-      for (int i = 0; i < kCellsPerBucket; i++) {
-        cells_[i] = 0;
-      }
-    }
-
-    uint32_t* cells() { return cells_; }
-    uint32_t* cell(int cell_index) { return cells() + cell_index; }
-
-    template <AccessMode access_mode = AccessMode::ATOMIC>
-    uint32_t LoadCell(int cell_index) {
-      DCHECK_LT(cell_index, kCellsPerBucket);
-      if (access_mode == AccessMode::ATOMIC)
-        return base::AsAtomic32::Acquire_Load(cells() + cell_index);
-      return *(cells() + cell_index);
-    }
-
-    template <AccessMode access_mode = AccessMode::ATOMIC>
-    void SetCellBits(int cell_index, uint32_t mask) {
-      if (access_mode == AccessMode::ATOMIC) {
-        base::AsAtomic32::SetBits(cell(cell_index), mask, mask);
-      } else {
-        uint32_t* c = cell(cell_index);
-        *c = (*c & ~mask) | mask;
-      }
-    }
-
-    void ClearCellBits(int cell_index, uint32_t mask) {
-      base::AsAtomic32::SetBits(cell(cell_index), 0u, mask);
-    }
-
-    void StoreCell(int cell_index, uint32_t value) {
-      base::AsAtomic32::Release_Store(cell(cell_index), value);
-    }
-
-    bool IsEmpty() {
-      for (int i = 0; i < kCellsPerBucket; i++) {
-        if (cells_[i] != 0) {
-          return false;
-        }
-      }
-      return true;
-    }
-  };
-
- private:
-  template <typename Callback, typename EmptyBucketCallback>
-  size_t Iterate(Address chunk_start, size_t start_bucket, size_t end_bucket,
-                 Callback callback, EmptyBucketCallback empty_bucket_callback) {
-    size_t new_count = 0;
-    for (size_t bucket_index = start_bucket; bucket_index < end_bucket;
-         bucket_index++) {
-      Bucket* bucket = LoadBucket(bucket_index);
-      if (bucket != nullptr) {
-        size_t in_bucket_count = 0;
-        size_t cell_offset = bucket_index << kBitsPerBucketLog2;
-        for (int i = 0; i < kCellsPerBucket; i++, cell_offset += kBitsPerCell) {
-          uint32_t cell = bucket->LoadCell(i);
-          if (cell) {
-            uint32_t old_cell = cell;
-            uint32_t mask = 0;
-            while (cell) {
-              int bit_offset = base::bits::CountTrailingZeros(cell);
-              uint32_t bit_mask = 1u << bit_offset;
-              Address slot = (cell_offset + bit_offset) << kTaggedSizeLog2;
-              if (callback(MaybeObjectSlot(chunk_start + slot)) == KEEP_SLOT) {
-                ++in_bucket_count;
-              } else {
-                mask |= bit_mask;
-              }
-              cell ^= bit_mask;
-            }
-            uint32_t new_cell = old_cell & ~mask;
-            if (old_cell != new_cell) {
-              bucket->ClearCellBits(i, mask);
-            }
-          }
-        }
-        if (in_bucket_count == 0) {
-          empty_bucket_callback(bucket_index);
-        }
-        new_count += in_bucket_count;
-      }
-    }
-    return new_count;
-  }
-
-  bool FreeBucketIfEmpty(size_t bucket_index) {
-    Bucket* bucket = LoadBucket<AccessMode::NON_ATOMIC>(bucket_index);
-    if (bucket != nullptr) {
-      if (bucket->IsEmpty()) {
-        ReleaseBucket<AccessMode::NON_ATOMIC>(bucket_index);
-      } else {
-        return false;
-      }
-    }
-
-    return true;
-  }
-
-  void ClearBucket(Bucket* bucket, int start_cell, int end_cell) {
-    DCHECK_GE(start_cell, 0);
-    DCHECK_LE(end_cell, kCellsPerBucket);
-    int current_cell = start_cell;
-    while (current_cell < kCellsPerBucket) {
-      bucket->StoreCell(current_cell, 0);
-      current_cell++;
-    }
-  }
-
-  template <AccessMode access_mode = AccessMode::ATOMIC>
-  void ReleaseBucket(size_t bucket_index) {
-    Bucket* bucket = LoadBucket<access_mode>(bucket_index);
-    StoreBucket<access_mode>(bucket_index, nullptr);
-    delete bucket;
-  }
-
-  template <AccessMode access_mode = AccessMode::ATOMIC>
-  Bucket* LoadBucket(Bucket** bucket) {
-    if (access_mode == AccessMode::ATOMIC)
-      return base::AsAtomicPointer::Acquire_Load(bucket);
-    return *bucket;
-  }
-
-  template <AccessMode access_mode = AccessMode::ATOMIC>
-  Bucket* LoadBucket(size_t bucket_index) {
-    return LoadBucket(bucket(bucket_index));
-  }
-
-  template <AccessMode access_mode = AccessMode::ATOMIC>
-  void StoreBucket(Bucket** bucket, Bucket* value) {
-    if (access_mode == AccessMode::ATOMIC) {
-      base::AsAtomicPointer::Release_Store(bucket, value);
-    } else {
-      *bucket = value;
-    }
-  }
-
-  template <AccessMode access_mode = AccessMode::ATOMIC>
-  void StoreBucket(size_t bucket_index, Bucket* value) {
-    StoreBucket(bucket(bucket_index), value);
-  }
-
-  template <AccessMode access_mode = AccessMode::ATOMIC>
-  bool SwapInNewBucket(size_t bucket_index, Bucket* value) {
-    Bucket** b = bucket(bucket_index);
-    if (access_mode == AccessMode::ATOMIC) {
-      return base::AsAtomicPointer::Release_CompareAndSwap(b, nullptr, value) ==
-             nullptr;
-    } else {
-      DCHECK_NULL(*b);
-      *b = value;
-      return true;
-    }
-  }
-
-  // Converts the slot offset into bucket/cell/bit index.
-  static void SlotToIndices(size_t slot_offset, size_t* bucket_index,
-                            int* cell_index, int* bit_index) {
-    DCHECK(IsAligned(slot_offset, kTaggedSize));
-    size_t slot = slot_offset >> kTaggedSizeLog2;
-    *bucket_index = slot >> kBitsPerBucketLog2;
-    *cell_index =
-        static_cast<int>((slot >> kBitsPerCellLog2) & (kCellsPerBucket - 1));
-    *bit_index = static_cast<int>(slot & (kBitsPerCell - 1));
-  }
-
-  Bucket** buckets() { return reinterpret_cast<Bucket**>(this); }
-  Bucket** bucket(size_t bucket_index) { return buckets() + bucket_index; }
-
-#ifdef DEBUG
-  size_t* initial_buckets() { return reinterpret_cast<size_t*>(this) - 1; }
-  static const int kInitialBucketsSize = sizeof(size_t);
-#else
-  static const int kInitialBucketsSize = 0;
-#endif
 };
 
 static_assert(std::is_standard_layout<SlotSet>::value);
@@ -614,11 +213,6 @@ enum class SlotType : uint8_t {
   // accessing. Used when pointer is stored in the instruction stream.
   kEmbeddedObjectCompressed,
 
-  // Full pointer sized slot storing an object start address.
-  // RelocInfo::target_object/RelocInfo::set_target_object methods are used for
-  // accessing. Used when pointer is stored in the instruction stream.
-  kEmbeddedObjectData,
-
   // Full pointer sized slot storing instruction start of Code object.
   // RelocInfo::target_address/RelocInfo::set_target_address methods are used
   // for accessing. Used when pointer is stored in the instruction stream.
diff --git a/deps/v8/src/heap/spaces-inl.h b/deps/v8/src/heap/spaces-inl.h
index 4397ad5ba229c0..9986f84f1bc887 100644
--- a/deps/v8/src/heap/spaces-inl.h
+++ b/deps/v8/src/heap/spaces-inl.h
@@ -149,6 +149,7 @@ MemoryChunk* OldGenerationMemoryChunkIterator::next() {
 
 AllocationResult LocalAllocationBuffer::AllocateRawAligned(
     int size_in_bytes, AllocationAlignment alignment) {
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
   Address current_top = allocation_info_.top();
   int filler_size = Heap::GetFillToAlign(current_top, alignment);
   int aligned_size = filler_size + size_in_bytes;
@@ -164,6 +165,7 @@ AllocationResult LocalAllocationBuffer::AllocateRawAligned(
 
 AllocationResult LocalAllocationBuffer::AllocateRawUnaligned(
     int size_in_bytes) {
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
   return allocation_info_.CanIncrementTop(size_in_bytes)
              ? AllocationResult::FromObject(HeapObject::FromAddress(
                    allocation_info_.IncrementTop(size_in_bytes)))
@@ -214,6 +216,7 @@ MemoryChunk* MemoryChunkIterator::Next() {
 
 AllocationResult SpaceWithLinearArea::AllocateFastUnaligned(
     int size_in_bytes, AllocationOrigin origin) {
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
   if (!allocation_info_.CanIncrementTop(size_in_bytes)) {
     return AllocationResult::Failure();
   }
@@ -253,6 +256,7 @@ AllocationResult SpaceWithLinearArea::AllocateRaw(int size_in_bytes,
                                                   AllocationAlignment alignment,
                                                   AllocationOrigin origin) {
   DCHECK(!v8_flags.enable_third_party_heap);
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
 
   AllocationResult result;
 
diff --git a/deps/v8/src/heap/spaces.cc b/deps/v8/src/heap/spaces.cc
index cb80998276d5a0..a29cb88d5a7f52 100644
--- a/deps/v8/src/heap/spaces.cc
+++ b/deps/v8/src/heap/spaces.cc
@@ -174,7 +174,7 @@ void Page::CreateBlackArea(Address start, Address end) {
   DCHECK_EQ(Page::FromAddress(start), this);
   DCHECK_LT(start, end);
   DCHECK_EQ(Page::FromAddress(end - 1), this);
-  MarkingState* marking_state = heap()->incremental_marking()->marking_state();
+  MarkingState* marking_state = heap()->marking_state();
   marking_state->bitmap(this)->SetRange(AddressToMarkbitIndex(start),
                                         AddressToMarkbitIndex(end));
   marking_state->IncrementLiveBytes(this, static_cast<intptr_t>(end - start));
@@ -186,8 +186,7 @@ void Page::CreateBlackAreaBackground(Address start, Address end) {
   DCHECK_EQ(Page::FromAddress(start), this);
   DCHECK_LT(start, end);
   DCHECK_EQ(Page::FromAddress(end - 1), this);
-  AtomicMarkingState* marking_state =
-      heap()->incremental_marking()->atomic_marking_state();
+  AtomicMarkingState* marking_state = heap()->atomic_marking_state();
   marking_state->bitmap(this)->SetRange(AddressToMarkbitIndex(start),
                                         AddressToMarkbitIndex(end));
   heap()->incremental_marking()->IncrementLiveBytesBackground(
@@ -200,7 +199,7 @@ void Page::DestroyBlackArea(Address start, Address end) {
   DCHECK_EQ(Page::FromAddress(start), this);
   DCHECK_LT(start, end);
   DCHECK_EQ(Page::FromAddress(end - 1), this);
-  MarkingState* marking_state = heap()->incremental_marking()->marking_state();
+  MarkingState* marking_state = heap()->marking_state();
   marking_state->bitmap(this)->ClearRange(AddressToMarkbitIndex(start),
                                           AddressToMarkbitIndex(end));
   marking_state->IncrementLiveBytes(this, -static_cast<intptr_t>(end - start));
@@ -212,8 +211,7 @@ void Page::DestroyBlackAreaBackground(Address start, Address end) {
   DCHECK_EQ(Page::FromAddress(start), this);
   DCHECK_LT(start, end);
   DCHECK_EQ(Page::FromAddress(end - 1), this);
-  AtomicMarkingState* marking_state =
-      heap()->incremental_marking()->atomic_marking_state();
+  AtomicMarkingState* marking_state = heap()->atomic_marking_state();
   marking_state->bitmap(this)->ClearRange(AddressToMarkbitIndex(start),
                                           AddressToMarkbitIndex(end));
   heap()->incremental_marking()->IncrementLiveBytesBackground(
diff --git a/deps/v8/src/heap/spaces.h b/deps/v8/src/heap/spaces.h
index 1d60095de3e292..48b8c9fc41c67f 100644
--- a/deps/v8/src/heap/spaces.h
+++ b/deps/v8/src/heap/spaces.h
@@ -153,6 +153,8 @@ class V8_EXPORT_PRIVATE Space : public BaseSpace {
   virtual int RoundSizeDownToObjectAlignment(int size) const {
     if (id_ == CODE_SPACE) {
       return RoundDown(size, kCodeAlignment);
+    } else if (V8_COMPRESS_POINTERS_8GB_BOOL) {
+      return RoundDown(size, kObjectAlignment8GbHeap);
     } else {
       return RoundDown(size, kTaggedSize);
     }
@@ -182,7 +184,9 @@ class V8_EXPORT_PRIVATE Space : public BaseSpace {
     return memory_chunk_list_.back();
   }
 
-  heap::List<MemoryChunk>& memory_chunk_list() { return memory_chunk_list_; }
+  virtual heap::List<MemoryChunk>& memory_chunk_list() {
+    return memory_chunk_list_;
+  }
 
   virtual Page* InitializePage(MemoryChunk* chunk) { UNREACHABLE(); }
 
@@ -299,7 +303,7 @@ class Page : public MemoryChunk {
     return categories_[type];
   }
 
-  size_t ShrinkToHighWaterMark();
+  V8_EXPORT_PRIVATE size_t ShrinkToHighWaterMark();
 
   V8_EXPORT_PRIVATE void CreateBlackArea(Address start, Address end);
   V8_EXPORT_PRIVATE void CreateBlackAreaBackground(Address start, Address end);
@@ -346,7 +350,11 @@ static_assert(sizeof(Page) <= MemoryChunk::kHeaderSize);
 
 class V8_EXPORT_PRIVATE ObjectIterator : public Malloced {
  public:
-  virtual ~ObjectIterator() = default;
+  // Note: The destructor can not be marked as `= default` as this causes
+  // the compiler on C++20 to define it as `constexpr` resulting in the
+  // compiler producing warnings about undefined inlines for Next()
+  // on classes inheriting from it.
+  virtual ~ObjectIterator() {}
   virtual HeapObject Next() = 0;
 };
 
diff --git a/deps/v8/src/heap/stress-scavenge-observer.cc b/deps/v8/src/heap/stress-scavenge-observer.cc
index 9515f6bb8037ee..4c72416e8c864c 100644
--- a/deps/v8/src/heap/stress-scavenge-observer.cc
+++ b/deps/v8/src/heap/stress-scavenge-observer.cc
@@ -62,8 +62,10 @@ bool StressScavengeObserver::HasRequestedGC() const {
 }
 
 void StressScavengeObserver::RequestedGCDone() {
+  size_t new_space_size = heap_->new_space()->Size();
   double current_percent =
-      heap_->new_space()->Size() * 100.0 / heap_->new_space()->Capacity();
+      new_space_size ? new_space_size * 100.0 / heap_->new_space()->Capacity()
+                     : 0;
   limit_percentage_ = NextLimit(static_cast<int>(current_percent));
 
   if (v8_flags.trace_stress_scavenge) {
diff --git a/deps/v8/src/heap/sweeper.cc b/deps/v8/src/heap/sweeper.cc
index a910dddcbe5e37..24ad9beeea40b0 100644
--- a/deps/v8/src/heap/sweeper.cc
+++ b/deps/v8/src/heap/sweeper.cc
@@ -10,6 +10,7 @@
 #include "src/base/logging.h"
 #include "src/common/globals.h"
 #include "src/execution/vm-state-inl.h"
+#include "src/flags/flags.h"
 #include "src/heap/base/active-system-pages.h"
 #include "src/heap/code-object-registry.h"
 #include "src/heap/free-list-inl.h"
@@ -19,21 +20,20 @@
 #include "src/heap/mark-compact-inl.h"
 #include "src/heap/new-spaces.h"
 #include "src/heap/paged-spaces.h"
+#include "src/heap/pretenuring-handler-inl.h"
+#include "src/heap/pretenuring-handler.h"
 #include "src/heap/remembered-set.h"
 #include "src/objects/objects-inl.h"
 
 namespace v8 {
 namespace internal {
 
-namespace {
-static const int kInitialLocalPretenuringFeedbackCapacity = 256;
-}  // namespace
-
 class Sweeper::ConcurrentSweeper final {
  public:
   explicit ConcurrentSweeper(Sweeper* sweeper)
       : sweeper_(sweeper),
-        local_pretenuring_feedback_(kInitialLocalPretenuringFeedbackCapacity) {}
+        local_pretenuring_feedback_(
+            PretenturingHandler::kInitialFeedbackCapacity) {}
 
   bool ConcurrentSweepSpace(AllocationSpace identity, JobDelegate* delegate) {
     while (!delegate->ShouldYield()) {
@@ -45,13 +45,13 @@ class Sweeper::ConcurrentSweeper final {
     return false;
   }
 
-  Heap::PretenuringFeedbackMap* local_pretenuring_feedback() {
+  PretenturingHandler::PretenuringFeedbackMap* local_pretenuring_feedback() {
     return &local_pretenuring_feedback_;
   }
 
  private:
   Sweeper* const sweeper_;
-  Heap::PretenuringFeedbackMap local_pretenuring_feedback_;
+  PretenturingHandler::PretenuringFeedbackMap local_pretenuring_feedback_;
 };
 
 class Sweeper::SweeperJob final : public JobTask {
@@ -69,12 +69,20 @@ class Sweeper::SweeperJob final : public JobTask {
 
   void Run(JobDelegate* delegate) final {
     RwxMemoryWriteScope::SetDefaultPermissionsForNewThread();
+    DCHECK(sweeper_->current_collector_.has_value());
     if (delegate->IsJoiningThread()) {
-      TRACE_GC(tracer_, GCTracer::Scope::MC_SWEEP);
+      TRACE_GC(tracer_, sweeper_->current_collector_ ==
+                                GarbageCollector::MINOR_MARK_COMPACTOR
+                            ? GCTracer::Scope::MINOR_MC_SWEEP
+                            : GCTracer::Scope::MC_SWEEP);
       RunImpl(delegate);
     } else {
-      TRACE_GC_EPOCH(tracer_, GCTracer::Scope::MC_BACKGROUND_SWEEPING,
-                     ThreadKind::kBackground);
+      TRACE_GC_EPOCH(
+          tracer_,
+          sweeper_->current_collector_ == GarbageCollector::MINOR_MARK_COMPACTOR
+              ? GCTracer::Scope::MINOR_MC_BACKGROUND_SWEEPING
+              : GCTracer::Scope::MC_BACKGROUND_SWEEPING,
+          ThreadKind::kBackground);
       RunImpl(delegate);
     }
   }
@@ -106,12 +114,14 @@ class Sweeper::SweeperJob final : public JobTask {
   GCTracer* const tracer_;
 };
 
-Sweeper::Sweeper(Heap* heap, NonAtomicMarkingState* marking_state)
+Sweeper::Sweeper(Heap* heap)
     : heap_(heap),
-      marking_state_(marking_state),
+      marking_state_(heap_->non_atomic_marking_state()),
       sweeping_in_progress_(false),
       should_reduce_memory_(false),
-      local_pretenuring_feedback_(kInitialLocalPretenuringFeedbackCapacity) {}
+      pretenuring_handler_(heap_->pretenuring_handler()),
+      local_pretenuring_feedback_(
+          PretenturingHandler::kInitialFeedbackCapacity) {}
 
 Sweeper::~Sweeper() {
   DCHECK(concurrent_sweepers_.empty());
@@ -160,9 +170,10 @@ void Sweeper::TearDown() {
   if (job_handle_ && job_handle_->IsValid()) job_handle_->Cancel();
 }
 
-void Sweeper::StartSweeping() {
+void Sweeper::StartSweeping(GarbageCollector collector) {
   DCHECK(local_pretenuring_feedback_.empty());
   sweeping_in_progress_ = true;
+  current_collector_ = collector;
   should_reduce_memory_ = heap_->ShouldReduceMemory();
   ForAllSweepingSpaces([this](AllocationSpace space) {
     // Sorting is done in order to make compaction more efficient: by sweeping
@@ -188,6 +199,7 @@ int Sweeper::NumberOfConcurrentSweepers() const {
 }
 
 void Sweeper::StartSweeperTasks() {
+  DCHECK(current_collector_.has_value());
   DCHECK(!job_handle_ || !job_handle_->IsValid());
   if (v8_flags.concurrent_sweeping && sweeping_in_progress_ &&
       !heap_->delay_sweeper_tasks_for_testing_) {
@@ -230,14 +242,16 @@ void Sweeper::EnsureCompleted(SweepingMode sweeping_mode) {
     CHECK(sweeping_list_[GetSweepSpaceIndex(space)].empty());
   });
 
-  heap_->MergeAllocationSitePretenuringFeedback(local_pretenuring_feedback_);
+  pretenuring_handler_->MergeAllocationSitePretenuringFeedback(
+      local_pretenuring_feedback_);
   for (ConcurrentSweeper& concurrent_sweeper : concurrent_sweepers_) {
-    heap_->MergeAllocationSitePretenuringFeedback(
+    pretenuring_handler_->MergeAllocationSitePretenuringFeedback(
         *concurrent_sweeper.local_pretenuring_feedback());
   }
   local_pretenuring_feedback_.clear();
   concurrent_sweepers_.clear();
 
+  current_collector_.reset();
   sweeping_in_progress_ = false;
 }
 
@@ -246,14 +260,6 @@ void Sweeper::DrainSweepingWorklistForSpace(AllocationSpace space) {
   ParallelSweepSpace(space, SweepingMode::kLazyOrConcurrent, 0);
 }
 
-void Sweeper::SupportConcurrentSweeping() {
-  ForAllSweepingSpaces([this](AllocationSpace space) {
-    const int kMaxPagesToSweepPerSpace = 1;
-    ParallelSweepSpace(space, SweepingMode::kLazyOrConcurrent, 0,
-                       kMaxPagesToSweepPerSpace);
-  });
-}
-
 bool Sweeper::AreSweeperTasksRunning() {
   return job_handle_ && job_handle_->IsValid() && job_handle_->IsActive();
 }
@@ -268,8 +274,8 @@ V8_INLINE size_t Sweeper::FreeAndProcessFreedMemory(
     ZapCode(free_start, size);
   }
   page->heap()->CreateFillerObjectAtSweeper(free_start, static_cast<int>(size));
-  freed_bytes =
-      reinterpret_cast<PagedSpace*>(space)->UnaccountedFree(free_start, size);
+  freed_bytes = reinterpret_cast<PagedSpaceBase*>(space)->UnaccountedFree(
+      free_start, size);
   if (should_reduce_memory_) page->DiscardUnusedMemory(free_start, size);
 
   return freed_bytes;
@@ -349,11 +355,11 @@ void Sweeper::ClearMarkBitsAndHandleLivenessStatistics(Page* page,
 int Sweeper::RawSweep(
     Page* p, FreeSpaceTreatmentMode free_space_treatment_mode,
     SweepingMode sweeping_mode, const base::MutexGuard& page_guard,
-    Heap::PretenuringFeedbackMap* local_pretenuring_feedback) {
+    PretenturingHandler::PretenuringFeedbackMap* local_pretenuring_feedback) {
   Space* space = p->owner();
   DCHECK_NOT_NULL(space);
   DCHECK(space->identity() == OLD_SPACE || space->identity() == CODE_SPACE ||
-         space->identity() == MAP_SPACE ||
+         space->identity() == MAP_SPACE || space->identity() == SHARED_SPACE ||
          (space->identity() == NEW_SPACE && v8_flags.minor_mc));
   DCHECK_IMPLIES(space->identity() == NEW_SPACE,
                  sweeping_mode == SweepingMode::kEagerDuringGC);
@@ -434,12 +440,13 @@ int Sweeper::RawSweep(
     }
     Map map = object.map(cage_base, kAcquireLoad);
     DCHECK(MarkCompactCollector::IsMapOrForwarded(map));
-    int size = object.SizeFromMap(map);
+    int size = ALIGN_TO_ALLOCATION_ALIGNMENT(object.SizeFromMap(map));
     live_bytes += size;
     free_start = free_end + size;
 
     if (p->InYoungGeneration()) {
-      heap_->UpdateAllocationSite(map, object, local_pretenuring_feedback);
+      pretenuring_handler_->UpdateAllocationSite(map, object,
+                                                 local_pretenuring_feedback);
     }
 
     if (active_system_pages_after_sweeping) {
@@ -519,7 +526,7 @@ int Sweeper::ParallelSweepSpace(AllocationSpace identity,
 
 int Sweeper::ParallelSweepPage(
     Page* page, AllocationSpace identity,
-    Heap::PretenuringFeedbackMap* local_pretenuring_feedback,
+    PretenturingHandler::PretenuringFeedbackMap* local_pretenuring_feedback,
     SweepingMode sweeping_mode) {
   DCHECK(IsValidSweepingSpace(identity));
 
@@ -572,7 +579,7 @@ void Sweeper::EnsurePageIsSwept(Page* page) {
       }
     }
   } else {
-    DCHECK(page->InNewSpace());
+    DCHECK(page->InNewSpace() && !v8_flags.minor_mc);
   }
 
   CHECK(page->SweepingDone());
@@ -592,6 +599,21 @@ bool Sweeper::TryRemoveSweepingPageSafe(AllocationSpace space, Page* page) {
 
 void Sweeper::AddPage(AllocationSpace space, Page* page,
                       Sweeper::AddPageMode mode) {
+  DCHECK_NE(NEW_SPACE, space);
+  AddPageImpl(space, page, mode);
+}
+
+void Sweeper::AddNewSpacePage(Page* page) {
+  DCHECK_EQ(NEW_SPACE, page->owner_identity());
+  size_t live_bytes = marking_state_->live_bytes(page);
+  heap_->IncrementNewSpaceSurvivingObjectSize(live_bytes);
+  heap_->IncrementYoungSurvivorsCounter(live_bytes);
+  page->ClearWasUsedForAllocation();
+  AddPageImpl(NEW_SPACE, page, AddPageMode::REGULAR);
+}
+
+void Sweeper::AddPageImpl(AllocationSpace space, Page* page,
+                          Sweeper::AddPageMode mode) {
   base::MutexGuard guard(&mutex_);
   DCHECK(IsValidSweepingSpace(space));
   DCHECK(!v8_flags.concurrent_sweeping || !job_handle_ ||
diff --git a/deps/v8/src/heap/sweeper.h b/deps/v8/src/heap/sweeper.h
index 6b747547dbb002..aa40f0b5460b97 100644
--- a/deps/v8/src/heap/sweeper.h
+++ b/deps/v8/src/heap/sweeper.h
@@ -8,11 +8,12 @@
 #include <map>
 #include <vector>
 
+#include "src/base/optional.h"
 #include "src/base/platform/condition-variable.h"
 #include "src/base/platform/semaphore.h"
 #include "src/common/globals.h"
 #include "src/flags/flags.h"
-#include "src/heap/heap.h"
+#include "src/heap/pretenuring-handler.h"
 #include "src/heap/slot-set.h"
 #include "src/tasks/cancelable-task.h"
 
@@ -76,7 +77,7 @@ class Sweeper {
   enum AddPageMode { REGULAR, READD_TEMPORARY_REMOVED_PAGE };
   enum class SweepingMode { kEagerDuringGC, kLazyOrConcurrent };
 
-  Sweeper(Heap* heap, NonAtomicMarkingState* marking_state);
+  Sweeper(Heap* heap);
   ~Sweeper();
 
   bool sweeping_in_progress() const { return sweeping_in_progress_; }
@@ -84,38 +85,39 @@ class Sweeper {
   void TearDown();
 
   void AddPage(AllocationSpace space, Page* page, AddPageMode mode);
+  void AddNewSpacePage(Page* page);
 
   int ParallelSweepSpace(AllocationSpace identity, SweepingMode sweeping_mode,
                          int required_freed_bytes, int max_pages = 0);
   int ParallelSweepPage(
       Page* page, AllocationSpace identity,
-      Heap::PretenuringFeedbackMap* local_pretenuring_feedback,
+      PretenturingHandler::PretenuringFeedbackMap* local_pretenuring_feedback,
       SweepingMode sweeping_mode);
 
   void EnsurePageIsSwept(Page* page);
 
-  int RawSweep(Page* p, FreeSpaceTreatmentMode free_space_treatment_mode,
-               SweepingMode sweeping_mode, const base::MutexGuard& page_guard,
-               Heap::PretenuringFeedbackMap* local_pretenuring_feedback);
+  int RawSweep(
+      Page* p, FreeSpaceTreatmentMode free_space_treatment_mode,
+      SweepingMode sweeping_mode, const base::MutexGuard& page_guard,
+      PretenturingHandler::PretenuringFeedbackMap* local_pretenuring_feedback);
 
   // After calling this function sweeping is considered to be in progress
   // and the main thread can sweep lazily, but the background sweeper tasks
   // are not running yet.
-  void StartSweeping();
+  void StartSweeping(GarbageCollector collector);
   V8_EXPORT_PRIVATE void StartSweeperTasks();
   void EnsureCompleted(
       SweepingMode sweeping_mode = SweepingMode::kLazyOrConcurrent);
   void DrainSweepingWorklistForSpace(AllocationSpace space);
   bool AreSweeperTasksRunning();
 
-  // Support concurrent sweepers from main thread
-  void SupportConcurrentSweeping();
-
   Page* GetSweptPageSafe(PagedSpaceBase* space);
 
+ private:
   NonAtomicMarkingState* marking_state() const { return marking_state_; }
 
- private:
+  void AddPageImpl(AllocationSpace space, Page* page, AddPageMode mode);
+
   class ConcurrentSweeper;
   class SweeperJob;
 
@@ -131,6 +133,7 @@ class Sweeper {
     callback(OLD_SPACE);
     callback(CODE_SPACE);
     callback(MAP_SPACE);
+    callback(SHARED_SPACE);
   }
 
   // Helper function for RawSweep. Depending on the FreeListRebuildingMode and
@@ -187,7 +190,7 @@ class Sweeper {
   int NumberOfConcurrentSweepers() const;
 
   Heap* const heap_;
-  NonAtomicMarkingState* marking_state_;
+  NonAtomicMarkingState* const marking_state_;
   std::unique_ptr<JobHandle> job_handle_;
   base::Mutex mutex_;
   base::ConditionVariable cv_page_swept_;
@@ -198,7 +201,9 @@ class Sweeper {
   // path checks this flag to see whether it could support concurrent sweeping.
   std::atomic<bool> sweeping_in_progress_;
   bool should_reduce_memory_;
-  Heap::PretenuringFeedbackMap local_pretenuring_feedback_;
+  PretenturingHandler* const pretenuring_handler_;
+  PretenturingHandler::PretenuringFeedbackMap local_pretenuring_feedback_;
+  base::Optional<GarbageCollector> current_collector_;
 };
 
 }  // namespace internal
diff --git a/deps/v8/src/ic/accessor-assembler.cc b/deps/v8/src/ic/accessor-assembler.cc
index f98413fc553e73..33bcb390610b5a 100644
--- a/deps/v8/src/ic/accessor-assembler.cc
+++ b/deps/v8/src/ic/accessor-assembler.cc
@@ -1280,10 +1280,14 @@ void AccessorAssembler::HandleStoreICHandlerCase(
 
     TVARIABLE(IntPtrT, var_name_index);
     Label dictionary_found(this, &var_name_index);
-    NameDictionaryLookup<PropertyDictionary>(
-        properties, CAST(p->name()),
-        p->IsAnyDefineOwn() ? &if_slow : &dictionary_found, &var_name_index,
-        miss);
+    if (p->IsAnyDefineOwn()) {
+      NameDictionaryLookup<PropertyDictionary>(properties, CAST(p->name()),
+                                               &if_slow, nullptr, miss);
+    } else {
+      NameDictionaryLookup<PropertyDictionary>(properties, CAST(p->name()),
+                                               &dictionary_found,
+                                               &var_name_index, miss);
+    }
 
     // When dealing with class fields defined with DefineKeyedOwnIC or
     // DefineNamedOwnIC, use the slow path to check the existing property.
@@ -2887,7 +2891,7 @@ enum AccessorAssembler::StubCacheTable : int {
 TNode<IntPtrT> AccessorAssembler::StubCachePrimaryOffset(TNode<Name> name,
                                                          TNode<Map> map) {
   // Compute the hash of the name (use entire hash field).
-  TNode<Uint32T> raw_hash_field = LoadNameRawHashField(name);
+  TNode<Uint32T> raw_hash_field = LoadNameRawHash(name);
   CSA_DCHECK(this,
              Word32Equal(Word32And(raw_hash_field,
                                    Int32Constant(Name::kHashNotComputedMask)),
@@ -3622,7 +3626,7 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) {
 
     BIND(&if_notunique);
     {
-      if (FLAG_internalize_on_the_fly) {
+      if (v8_flags.internalize_on_the_fly) {
         // Ideally we could return undefined directly here if the name is not
         // found in the string table, i.e. it was never internalized, but that
         // invariant doesn't hold with named property interceptors (at this
diff --git a/deps/v8/src/ic/binary-op-assembler.cc b/deps/v8/src/ic/binary-op-assembler.cc
index 51c403ceb49038..403d4b9bbe49ad 100644
--- a/deps/v8/src/ic/binary-op-assembler.cc
+++ b/deps/v8/src/ic/binary-op-assembler.cc
@@ -17,7 +17,8 @@ TNode<Object> BinaryOpAssembler::Generate_AddWithFeedback(
   Label do_fadd(this), if_lhsisnotnumber(this, Label::kDeferred),
       check_rhsisoddball(this, Label::kDeferred),
       call_with_oddball_feedback(this), call_with_any_feedback(this),
-      call_add_stub(this), end(this), bigint(this, Label::kDeferred);
+      call_add_stub(this), end(this), bigint(this, Label::kDeferred),
+      bigint64(this);
   TVARIABLE(Float64T, var_fadd_lhs);
   TVARIABLE(Float64T, var_fadd_rhs);
   TVARIABLE(Smi, var_type_feedback);
@@ -158,7 +159,16 @@ TNode<Object> BinaryOpAssembler::Generate_AddWithFeedback(
       Goto(&call_with_any_feedback);
 
       BIND(&lhs_is_bigint);
-      Branch(IsBigInt(rhs_heap_object), &bigint, &call_with_any_feedback);
+      {
+        GotoIfNot(IsBigInt(rhs_heap_object), &call_with_any_feedback);
+        if (Is64()) {
+          GotoIfLargeBigInt(CAST(lhs), &bigint);
+          GotoIfLargeBigInt(CAST(rhs), &bigint);
+          Goto(&bigint64);
+        } else {
+          Goto(&bigint);
+        }
+      }
 
       BIND(&lhs_is_string);
       {
@@ -191,6 +201,30 @@ TNode<Object> BinaryOpAssembler::Generate_AddWithFeedback(
     Goto(&call_with_any_feedback);
   }
 
+  if (Is64()) {
+    BIND(&bigint64);
+    {
+      // Both {lhs} and {rhs} are of BigInt type and can fit in 64-bit
+      // registers.
+      Label if_overflow(this);
+      TVARIABLE(UintPtrT, lhs_raw);
+      TVARIABLE(UintPtrT, rhs_raw);
+      BigIntToRawBytes(CAST(lhs), &lhs_raw, &lhs_raw);
+      BigIntToRawBytes(CAST(rhs), &rhs_raw, &rhs_raw);
+      var_result = BigIntFromInt64(
+          TryIntPtrAdd(UncheckedCast<IntPtrT>(lhs_raw.value()),
+                       UncheckedCast<IntPtrT>(rhs_raw.value()), &if_overflow));
+
+      var_type_feedback = SmiConstant(BinaryOperationFeedback::kBigInt64);
+      UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector(),
+                     slot_id, update_feedback_mode);
+      Goto(&end);
+
+      BIND(&if_overflow);
+      Goto(&bigint);
+    }
+  }
+
   BIND(&bigint);
   {
     // Both {lhs} and {rhs} are of BigInt type.
@@ -245,7 +279,7 @@ TNode<Object> BinaryOpAssembler::Generate_BinaryOperationWithFeedback(
   Label do_float_operation(this), end(this), call_stub(this),
       check_rhsisoddball(this, Label::kDeferred), call_with_any_feedback(this),
       if_lhsisnotnumber(this, Label::kDeferred),
-      if_both_bigint(this, Label::kDeferred);
+      if_both_bigint(this, Label::kDeferred), if_both_bigint64(this);
   TVARIABLE(Float64T, var_float_lhs);
   TVARIABLE(Float64T, var_float_rhs);
   TVARIABLE(Smi, var_type_feedback);
@@ -377,7 +411,14 @@ TNode<Object> BinaryOpAssembler::Generate_BinaryOperationWithFeedback(
     BIND(&if_left_bigint);
     {
       GotoIf(TaggedIsSmi(rhs), &call_with_any_feedback);
-      Branch(IsBigInt(CAST(rhs)), &if_both_bigint, &call_with_any_feedback);
+      GotoIfNot(IsBigInt(CAST(rhs)), &call_with_any_feedback);
+      if (Is64()) {
+        GotoIfLargeBigInt(CAST(lhs), &if_both_bigint);
+        GotoIfLargeBigInt(CAST(rhs), &if_both_bigint);
+        Goto(&if_both_bigint64);
+      } else {
+        Goto(&if_both_bigint);
+      }
     }
   }
 
@@ -394,31 +435,130 @@ TNode<Object> BinaryOpAssembler::Generate_BinaryOperationWithFeedback(
     Goto(&call_stub);
   }
 
+  if (Is64()) {
+    BIND(&if_both_bigint64);
+    // TODO(panq): Remove the condition when all the operations are supported.
+    if (op == Operation::kSubtract || op == Operation::kMultiply) {
+      var_type_feedback = SmiConstant(BinaryOperationFeedback::kBigInt64);
+      UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector(),
+                     slot_id, update_feedback_mode);
+
+      TVARIABLE(UintPtrT, lhs_raw);
+      TVARIABLE(UintPtrT, rhs_raw);
+      BigIntToRawBytes(CAST(lhs), &lhs_raw, &lhs_raw);
+      BigIntToRawBytes(CAST(rhs), &rhs_raw, &rhs_raw);
+
+      switch (op) {
+        case Operation::kSubtract: {
+          var_result = BigIntFromInt64(TryIntPtrSub(
+              UncheckedCast<IntPtrT>(lhs_raw.value()),
+              UncheckedCast<IntPtrT>(rhs_raw.value()), &if_both_bigint));
+          Goto(&end);
+          break;
+        }
+        case Operation::kMultiply: {
+          var_result = BigIntFromInt64(TryIntPtrMul(
+              UncheckedCast<IntPtrT>(lhs_raw.value()),
+              UncheckedCast<IntPtrT>(rhs_raw.value()), &if_both_bigint));
+          Goto(&end);
+          break;
+        }
+        default:
+          UNREACHABLE();
+      }
+    } else {
+      Goto(&if_both_bigint);
+    }
+  }
+
   BIND(&if_both_bigint);
   {
     var_type_feedback = SmiConstant(BinaryOperationFeedback::kBigInt);
     UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector(), slot_id,
                    update_feedback_mode);
-    if (op == Operation::kSubtract) {
-      Label bigint_too_big(this);
-      var_result =
-          CallBuiltin(Builtin::kBigIntSubtractNoThrow, context(), lhs, rhs);
+    switch (op) {
+      case Operation::kSubtract: {
+        Label bigint_too_big(this);
+        var_result =
+            CallBuiltin(Builtin::kBigIntSubtractNoThrow, context(), lhs, rhs);
 
-      // Check for sentinel that signals BigIntTooBig exception.
-      GotoIf(TaggedIsSmi(var_result.value()), &bigint_too_big);
-      Goto(&end);
+        // Check for sentinel that signals BigIntTooBig exception.
+        GotoIfNot(TaggedIsSmi(var_result.value()), &end);
 
-      BIND(&bigint_too_big);
-      {
         // Update feedback to prevent deopt loop.
         UpdateFeedback(SmiConstant(BinaryOperationFeedback::kAny),
                        maybe_feedback_vector(), slot_id, update_feedback_mode);
         ThrowRangeError(context(), MessageTemplate::kBigIntTooBig);
+        break;
+      }
+      case Operation::kMultiply: {
+        Label bigint_too_big(this),
+            termination_requested(this, Label::kDeferred);
+        var_result =
+            CallBuiltin(Builtin::kBigIntMultiplyNoThrow, context(), lhs, rhs);
+
+        GotoIfNot(TaggedIsSmi(var_result.value()), &end);
+
+        // Check for sentinel that signals TerminationReqeusted exception.
+        GotoIf(TaggedEqual(var_result.value(), SmiConstant(1)),
+               &termination_requested);
+
+        // Handles BigIntTooBig exception.
+        // Update feedback to prevent deopt loop.
+        UpdateFeedback(SmiConstant(BinaryOperationFeedback::kAny),
+                       maybe_feedback_vector(), slot_id, update_feedback_mode);
+        ThrowRangeError(context(), MessageTemplate::kBigIntTooBig);
+
+        BIND(&termination_requested);
+        TerminateExecution(context());
+        break;
+      }
+      case Operation::kDivide: {
+        Label bigint_div_zero(this),
+            termination_requested(this, Label::kDeferred);
+        var_result =
+            CallBuiltin(Builtin::kBigIntDivideNoThrow, context(), lhs, rhs);
+
+        GotoIfNot(TaggedIsSmi(var_result.value()), &end);
+
+        // Check for sentinel that signals TerminationReqeusted exception.
+        GotoIf(TaggedEqual(var_result.value(), SmiConstant(1)),
+               &termination_requested);
+
+        // Handles BigIntDivZero exception.
+        // Update feedback to prevent deopt loop.
+        UpdateFeedback(SmiConstant(BinaryOperationFeedback::kAny),
+                       maybe_feedback_vector(), slot_id, update_feedback_mode);
+        ThrowRangeError(context(), MessageTemplate::kBigIntDivZero);
+
+        BIND(&termination_requested);
+        TerminateExecution(context());
+        break;
+      }
+      case Operation::kBitwiseAnd: {
+        Label bigint_too_big(this);
+        var_result =
+            CallBuiltin(Builtin::kBigIntBitwiseAndNoThrow, context(), lhs, rhs);
+
+        // Check for sentinel that signals BigIntTooBig exception.
+        GotoIf(TaggedIsSmi(var_result.value()), &bigint_too_big);
+        Goto(&end);
+
+        BIND(&bigint_too_big);
+        {
+          // Update feedback to prevent deopt loop.
+          UpdateFeedback(SmiConstant(BinaryOperationFeedback::kAny),
+                         maybe_feedback_vector(), slot_id,
+                         update_feedback_mode);
+          ThrowRangeError(context(), MessageTemplate::kBigIntTooBig);
+        }
+        break;
+      }
+      default: {
+        var_result = CallRuntime(Runtime::kBigIntBinaryOp, context(), lhs, rhs,
+                                 SmiConstant(op));
+        Goto(&end);
       }
-    } else {
-      var_result = CallRuntime(Runtime::kBigIntBinaryOp, context(), lhs, rhs,
-                               SmiConstant(op));
-      Goto(&end);
     }
   }
 
diff --git a/deps/v8/src/ic/handler-configuration.cc b/deps/v8/src/ic/handler-configuration.cc
index 5bfd53c698468a..43511407e0eb54 100644
--- a/deps/v8/src/ic/handler-configuration.cc
+++ b/deps/v8/src/ic/handler-configuration.cc
@@ -426,7 +426,8 @@ void PrintSmiLoadHandler(int raw_handler, std::ostream& os) {
          << LoadHandler::ExportsIndexBits::decode(raw_handler);
       break;
     default:
-      UNREACHABLE();
+      os << "<invalid value " << static_cast<int>(kind) << ">";
+      break;
   }
 }
 
@@ -518,7 +519,7 @@ void LoadHandler::PrintHandler(Object handler, std::ostream& os) {
        << Builtins::name(CodeT::cast(handler).builtin_id()) << ")";
   } else if (handler.IsSymbol()) {
     os << "LoadHandler(Symbol)(" << Brief(Symbol::cast(handler)) << ")";
-  } else {
+  } else if (handler.IsLoadHandler()) {
     LoadHandler load_handler = LoadHandler::cast(handler);
     int raw_handler = load_handler.smi_handler().ToSmi().value();
     os << "LoadHandler(do access check on lookup start object = "
@@ -526,9 +527,10 @@ void LoadHandler::PrintHandler(Object handler, std::ostream& os) {
        << ", lookup on lookup start object = "
        << LookupOnLookupStartObjectBits::decode(raw_handler) << ", ";
     PrintSmiLoadHandler(raw_handler, os);
-    DCHECK_GE(load_handler.data_field_count(), 1);
-    os << ", data1 = ";
-    load_handler.data1().ShortPrint(os);
+    if (load_handler.data_field_count() >= 1) {
+      os << ", data1 = ";
+      load_handler.data1().ShortPrint(os);
+    }
     if (load_handler.data_field_count() >= 2) {
       os << ", data2 = ";
       load_handler.data2().ShortPrint(os);
@@ -540,6 +542,8 @@ void LoadHandler::PrintHandler(Object handler, std::ostream& os) {
     os << ", validity cell = ";
     load_handler.validity_cell().ShortPrint(os);
     os << ")";
+  } else {
+    os << "LoadHandler(<unexpected>)(" << Brief(handler) << ")";
   }
 }
 
@@ -550,11 +554,11 @@ void StoreHandler::PrintHandler(Object handler, std::ostream& os) {
     os << "StoreHandler(Smi)(";
     PrintSmiStoreHandler(raw_handler, os);
     os << ")" << std::endl;
-  } else {
+  } else if (handler.IsStoreHandler()) {
     os << "StoreHandler(";
     StoreHandler store_handler = StoreHandler::cast(handler);
-    if (store_handler.smi_handler().IsCode()) {
-      Code code = Code::cast(store_handler.smi_handler());
+    if (store_handler.smi_handler().IsCodeT()) {
+      CodeT code = CodeT::cast(store_handler.smi_handler());
       os << "builtin = ";
       code.ShortPrint(os);
     } else {
@@ -565,9 +569,10 @@ void StoreHandler::PrintHandler(Object handler, std::ostream& os) {
          << LookupOnLookupStartObjectBits::decode(raw_handler) << ", ";
       PrintSmiStoreHandler(raw_handler, os);
     }
-    DCHECK_GE(store_handler.data_field_count(), 1);
-    os << ", data1 = ";
-    store_handler.data1().ShortPrint(os);
+    if (store_handler.data_field_count() >= 1) {
+      os << ", data1 = ";
+      store_handler.data1().ShortPrint(os);
+    }
     if (store_handler.data_field_count() >= 2) {
       os << ", data2 = ";
       store_handler.data2().ShortPrint(os);
@@ -579,6 +584,8 @@ void StoreHandler::PrintHandler(Object handler, std::ostream& os) {
     os << ", validity cell = ";
     store_handler.validity_cell().ShortPrint(os);
     os << ")" << std::endl;
+  } else {
+    os << "StoreHandler(<unexpected>)(" << Brief(handler) << ")";
   }
 }
 
diff --git a/deps/v8/src/ic/ic.cc b/deps/v8/src/ic/ic.cc
index e86d04c44d5113..ae1dde1a8c587d 100644
--- a/deps/v8/src/ic/ic.cc
+++ b/deps/v8/src/ic/ic.cc
@@ -5,9 +5,7 @@
 #include "src/ic/ic.h"
 
 #include "src/api/api-arguments-inl.h"
-#include "src/api/api.h"
 #include "src/ast/ast.h"
-#include "src/base/bits.h"
 #include "src/base/logging.h"
 #include "src/builtins/accessors.h"
 #include "src/common/assert-scope.h"
@@ -16,9 +14,11 @@
 #include "src/execution/execution.h"
 #include "src/execution/frames-inl.h"
 #include "src/execution/isolate-inl.h"
+#include "src/execution/isolate.h"
 #include "src/execution/protectors-inl.h"
 #include "src/execution/tiering-manager.h"
 #include "src/handles/handles-inl.h"
+#include "src/handles/maybe-handles.h"
 #include "src/ic/call-optimization.h"
 #include "src/ic/handler-configuration-inl.h"
 #include "src/ic/ic-inl.h"
@@ -26,19 +26,13 @@
 #include "src/ic/stub-cache.h"
 #include "src/numbers/conversions.h"
 #include "src/objects/api-callbacks.h"
-#include "src/objects/data-handler-inl.h"
 #include "src/objects/field-type.h"
-#include "src/objects/hash-table-inl.h"
-#include "src/objects/heap-number-inl.h"
 #include "src/objects/instance-type.h"
 #include "src/objects/js-array-buffer-inl.h"
 #include "src/objects/js-array-inl.h"
 #include "src/objects/megadom-handler.h"
-#include "src/objects/module-inl.h"
 #include "src/objects/property-descriptor.h"
 #include "src/objects/prototype.h"
-#include "src/objects/struct-inl.h"
-#include "src/runtime/runtime-utils.h"
 #include "src/runtime/runtime.h"
 #include "src/tracing/trace-event.h"
 #include "src/tracing/tracing-category-observer.h"
@@ -210,6 +204,7 @@ static void LookupForRead(LookupIterator* it, bool is_has_property) {
       case LookupIterator::TRANSITION:
         UNREACHABLE();
       case LookupIterator::JSPROXY:
+      case LookupIterator::WASM_OBJECT:
         return;
       case LookupIterator::INTERCEPTOR: {
         // If there is a getter, return; otherwise loop to perform the lookup.
@@ -314,7 +309,7 @@ void IC::OnFeedbackChanged(const char* reason) {
 // static
 void IC::OnFeedbackChanged(Isolate* isolate, FeedbackVector vector,
                            FeedbackSlot slot, const char* reason) {
-  if (FLAG_trace_opt_verbose) {
+  if (v8_flags.trace_opt_verbose) {
     if (vector.profiler_ticks() != 0) {
       StdoutStream os;
       os << "[resetting ticks for ";
@@ -326,7 +321,7 @@ void IC::OnFeedbackChanged(Isolate* isolate, FeedbackVector vector,
   vector.set_profiler_ticks(0);
 
 #ifdef V8_TRACE_FEEDBACK_UPDATES
-  if (FLAG_trace_feedback_updates) {
+  if (v8_flags.trace_feedback_updates) {
     int slot_count = vector.metadata().slot_count();
     StdoutStream os;
     if (slot.IsInvalid()) {
@@ -415,7 +410,7 @@ void IC::ConfigureVectorState(
 MaybeHandle<Object> LoadIC::Load(Handle<Object> object, Handle<Name> name,
                                  bool update_feedback,
                                  Handle<Object> receiver) {
-  bool use_ic = (state() != NO_FEEDBACK) && FLAG_use_ic && update_feedback;
+  bool use_ic = (state() != NO_FEEDBACK) && v8_flags.use_ic && update_feedback;
 
   if (receiver.is_null()) {
     receiver = object;
@@ -548,7 +543,8 @@ MaybeHandle<Object> LoadGlobalIC::Load(Handle<Name> name,
             Object);
       }
 
-      bool use_ic = (state() != NO_FEEDBACK) && FLAG_use_ic && update_feedback;
+      bool use_ic =
+          (state() != NO_FEEDBACK) && v8_flags.use_ic && update_feedback;
       if (use_ic) {
         // 'const' Variables are mutable if REPL mode is enabled. This disables
         // compiler inlining for all 'const' variables declared in REPL mode.
@@ -601,10 +597,10 @@ static bool AddOneReceiverMapIfMissing(
 }
 
 bool IC::UpdateMegaDOMIC(const MaybeObjectHandle& handler, Handle<Name> name) {
-  if (!FLAG_enable_mega_dom_ic) return false;
+  if (!v8_flags.enable_mega_dom_ic) return false;
 
   // TODO(gsathya): Enable fuzzing once this feature is more stable.
-  if (FLAG_fuzzing) return false;
+  if (v8_flags.fuzzing) return false;
 
   // TODO(gsathya): Support KeyedLoadIC, StoreIC and KeyedStoreIC.
   if (!IsLoadIC()) return false;
@@ -665,7 +661,7 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name,
   Handle<Map> map = lookup_start_object_map();
 
   std::vector<MapAndHandler> maps_and_handlers;
-  maps_and_handlers.reserve(FLAG_max_valid_polymorphic_map_count);
+  maps_and_handlers.reserve(v8_flags.max_valid_polymorphic_map_count);
   int deprecated_maps = 0;
   int handler_to_overwrite = -1;
 
@@ -712,7 +708,7 @@ bool IC::UpdatePolymorphicIC(Handle<Name> name,
   int number_of_valid_maps =
       number_of_maps - deprecated_maps - (handler_to_overwrite != -1);
 
-  if (number_of_valid_maps >= FLAG_max_valid_polymorphic_map_count)
+  if (number_of_valid_maps >= v8_flags.max_valid_polymorphic_map_count)
     return false;
   if (number_of_maps == 0 && state() != MONOMORPHIC && state() != POLYMORPHIC) {
     return false;
@@ -869,68 +865,6 @@ void IC::UpdateMegamorphicCache(Handle<Map> map, Handle<Name> name,
   }
 }
 
-namespace {
-
-#if V8_ENABLE_WEBASSEMBLY
-
-inline WasmValueType GetWasmValueType(wasm::ValueType type) {
-#define TYPE_CASE(Name) \
-  case wasm::k##Name:   \
-    return WasmValueType::k##Name;
-
-  switch (type.kind()) {
-    TYPE_CASE(I8)
-    TYPE_CASE(I16)
-    TYPE_CASE(I32)
-    TYPE_CASE(I64)
-    TYPE_CASE(F32)
-    TYPE_CASE(F64)
-    TYPE_CASE(S128)
-    TYPE_CASE(Ref)
-    TYPE_CASE(RefNull)
-
-    case wasm::kRtt:
-      // Rtt values are not supposed to be made available to JavaScript side.
-      UNREACHABLE();
-
-    case wasm::kVoid:
-    case wasm::kBottom:
-      UNREACHABLE();
-  }
-#undef TYPE_CASE
-}
-
-Handle<Smi> MakeLoadWasmStructFieldHandler(Isolate* isolate,
-                                           Handle<JSReceiver> holder,
-                                           LookupIterator* lookup) {
-  DCHECK(holder->IsWasmObject(isolate));
-  WasmValueType type;
-  int field_offset;
-  if (holder->IsWasmArray(isolate)) {
-    // The only named property that WasmArray has is length.
-    DCHECK_EQ(0, lookup->property_details().field_index());
-    DCHECK_EQ(*isolate->factory()->length_string(), *lookup->name());
-    type = WasmValueType::kU32;
-    field_offset = WasmArray::kLengthOffset;
-  } else {
-    wasm::StructType* struct_type = Handle<WasmStruct>::cast(holder)->type();
-    int field_index = lookup->property_details().field_index();
-    type = GetWasmValueType(struct_type->field(field_index));
-    field_offset =
-        WasmStruct::kHeaderSize + struct_type->field_offset(field_index);
-
-    const size_t kMaxWasmFieldOffset =
-        WasmStruct::kHeaderSize + wasm::StructType::kMaxFieldOffset;
-    static_assert(kMaxWasmFieldOffset <= LoadHandler::WasmFieldOffsetBits::kMax,
-                  "Bigger numbers of struct fields require different approach");
-  }
-  return LoadHandler::LoadWasmStructField(isolate, type, field_offset);
-}
-
-#endif  // V8_ENABLE_WEBASSEMBLY
-
-}  // namespace
-
 MaybeObjectHandle LoadIC::ComputeHandler(LookupIterator* lookup) {
   Handle<Object> receiver = lookup->GetReceiver();
   ReadOnlyRoots roots(isolate());
@@ -1154,30 +1088,14 @@ MaybeObjectHandle LoadIC::ComputeHandler(LookupIterator* lookup) {
           return MaybeObjectHandle(smi_handler);
         TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalFromPrototypeDH);
       } else if (lookup->IsElement(*holder)) {
-#if V8_ENABLE_WEBASSEMBLY
-        if (holder_is_lookup_start_object && holder->IsWasmStruct()) {
-          // TODO(ishell): Consider supporting indexed access to WasmStruct
-          // fields.
-          TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonexistentDH);
-          return MaybeObjectHandle(LoadHandler::LoadNonExistent(isolate()));
-        }
-#endif  // V8_ENABLE_WEBASSEMBLY
         TRACE_HANDLER_STATS(isolate(), LoadIC_SlowStub);
         return MaybeObjectHandle(LoadHandler::LoadSlow(isolate()));
       } else {
         DCHECK_EQ(PropertyLocation::kField,
                   lookup->property_details().location());
-#if V8_ENABLE_WEBASSEMBLY
-        if (V8_UNLIKELY(holder->IsWasmObject(isolate()))) {
-          smi_handler =
-              MakeLoadWasmStructFieldHandler(isolate(), holder, lookup);
-        } else  // NOLINT(readability/braces)
-#endif          // V8_ENABLE_WEBASSEMBLY
-        {
-          DCHECK(holder->IsJSObject(isolate()));
-          FieldIndex field = lookup->GetFieldIndex();
-          smi_handler = LoadHandler::LoadField(isolate(), field);
-        }
+        DCHECK(holder->IsJSObject(isolate()));
+        FieldIndex field = lookup->GetFieldIndex();
+        smi_handler = LoadHandler::LoadField(isolate(), field);
         TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldDH);
         if (holder_is_lookup_start_object)
           return MaybeObjectHandle(smi_handler);
@@ -1226,6 +1144,9 @@ MaybeObjectHandle LoadIC::ComputeHandler(LookupIterator* lookup) {
       return MaybeObjectHandle(LoadHandler::LoadFromPrototype(
           isolate(), map, holder_proxy, smi_handler));
     }
+
+    case LookupIterator::WASM_OBJECT:
+      return MaybeObjectHandle(LoadHandler::LoadSlow(isolate()));
     case LookupIterator::ACCESS_CHECK:
     case LookupIterator::NOT_FOUND:
     case LookupIterator::TRANSITION:
@@ -1277,11 +1198,8 @@ void KeyedLoadIC::UpdateLoadElement(Handle<HeapObject> receiver,
     if ((receiver->IsJSObject() &&
          IsMoreGeneralElementsKindTransition(
              target_receiver_maps.at(0)->elements_kind(),
-             Handle<JSObject>::cast(receiver)->GetElementsKind()))
-#ifdef V8_ENABLE_WEBASSEMBLY
-        || receiver->IsWasmObject()
-#endif
-    ) {
+             Handle<JSObject>::cast(receiver)->GetElementsKind())) ||
+        receiver->IsWasmObject()) {
       Handle<Object> handler = LoadElementHandler(receiver_map, load_mode);
       return ConfigureVectorState(Handle<Name>(), receiver_map, handler);
     }
@@ -1307,7 +1225,7 @@ void KeyedLoadIC::UpdateLoadElement(Handle<HeapObject> receiver,
   // If the maximum number of receiver maps has been exceeded, use the generic
   // version of the IC.
   if (static_cast<int>(target_receiver_maps.size()) >
-      FLAG_max_valid_polymorphic_map_count) {
+      v8_flags.max_valid_polymorphic_map_count) {
     set_slow_stub_reason("max polymorph exceeded");
     return;
   }
@@ -1514,7 +1432,7 @@ bool IntPtrKeyToSize(intptr_t index, Handle<HeapObject> receiver, size_t* out) {
 }
 
 bool CanCache(Handle<Object> receiver, InlineCacheState state) {
-  if (!FLAG_use_ic || state == NO_FEEDBACK) return false;
+  if (!v8_flags.use_ic || state == NO_FEEDBACK) return false;
   if (!receiver->IsJSReceiver() && !receiver->IsString()) return false;
   return !receiver->IsAccessCheckNeeded() && !receiver->IsJSPrimitiveWrapper();
 }
@@ -1615,6 +1533,8 @@ bool StoreIC::LookupForWrite(LookupIterator* it, Handle<Object> value,
   if (it->state() != LookupIterator::TRANSITION) {
     for (; it->IsFound(); it->Next()) {
       switch (it->state()) {
+        case LookupIterator::WASM_OBJECT:
+          return false;
         case LookupIterator::NOT_FOUND:
         case LookupIterator::TRANSITION:
           UNREACHABLE();
@@ -1725,7 +1645,7 @@ MaybeHandle<Object> StoreGlobalIC::Store(Handle<Name> name,
           Object);
     }
 
-    bool use_ic = (state() != NO_FEEDBACK) && FLAG_use_ic;
+    bool use_ic = (state() != NO_FEEDBACK) && v8_flags.use_ic;
     if (use_ic) {
       if (nexus()->ConfigureLexicalVarMode(
               lookup_result.context_index, lookup_result.slot_index,
@@ -1772,11 +1692,15 @@ Maybe<bool> DefineOwnDataProperty(LookupIterator* it,
       return JSProxy::DefineOwnProperty(it->isolate(), it->GetHolder<JSProxy>(),
                                         it->GetName(), &new_desc, should_throw);
     }
+    case LookupIterator::WASM_OBJECT:
+      RETURN_FAILURE(it->isolate(), kThrowOnError,
+                     NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
     // When lazy feedback is disabled, the original state could be different
     // while the object is already prepared for TRANSITION.
     case LookupIterator::TRANSITION: {
       switch (original_state) {
         case LookupIterator::JSPROXY:
+        case LookupIterator::WASM_OBJECT:
         case LookupIterator::TRANSITION:
         case LookupIterator::DATA:
         case LookupIterator::INTERCEPTOR:
@@ -1838,7 +1762,7 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, Handle<Name> name,
     return value;
   }
 
-  bool use_ic = (state() != NO_FEEDBACK) && FLAG_use_ic;
+  bool use_ic = (state() != NO_FEEDBACK) && v8_flags.use_ic;
   // If the object is undefined or null it's illegal to try to set any
   // properties on it; throw a TypeError in that case.
   if (object->IsNullOrUndefined(isolate())) {
@@ -2199,6 +2123,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
     case LookupIterator::INTEGER_INDEXED_EXOTIC:
     case LookupIterator::ACCESS_CHECK:
     case LookupIterator::NOT_FOUND:
+    case LookupIterator::WASM_OBJECT:
       UNREACHABLE();
   }
   return MaybeObjectHandle();
@@ -2288,7 +2213,7 @@ void KeyedStoreIC::UpdateStoreElement(Handle<Map> receiver_map,
   // If the maximum number of receiver maps has been exceeded, use the
   // megamorphic version of the IC.
   if (static_cast<int>(target_maps_and_handlers.size()) >
-      FLAG_max_valid_polymorphic_map_count) {
+      v8_flags.max_valid_polymorphic_map_count) {
     return;
   }
 
@@ -2537,7 +2462,7 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
   JSObject::MakePrototypesFast(object, kStartAtPrototype, isolate());
 
   // TODO(jkummerow): Refactor the condition logic here and below.
-  bool use_ic = (state() != NO_FEEDBACK) && FLAG_use_ic &&
+  bool use_ic = (state() != NO_FEEDBACK) && v8_flags.use_ic &&
                 !object->IsStringWrapper() && !object->IsAccessCheckNeeded() &&
                 !object->IsJSGlobalProxy();
   if (use_ic && !object->IsSmi()) {
@@ -2549,6 +2474,12 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
       set_slow_stub_reason("map in array prototype");
       use_ic = false;
     }
+#if V8_ENABLE_WEBASSEMBLY
+    if (heap_object->map().IsWasmObjectMap()) {
+      set_slow_stub_reason("wasm object");
+      use_ic = false;
+    }
+#endif
   }
 
   Handle<Map> old_receiver_map;
@@ -2571,16 +2502,19 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
   }
 
   DCHECK(store_handle.is_null());
-  ASSIGN_RETURN_ON_EXCEPTION(
-      isolate(), store_handle,
-      // TODO(v8:12548): refactor DefineKeyedOwnIC as a subclass of StoreIC
-      // so the logic doesn't get mixed here.
+  // TODO(v8:12548): refactor DefineKeyedOwnIC as a subclass of StoreIC
+  // so the logic doesn't get mixed here.
+  MaybeHandle<Object> result =
       IsDefineKeyedOwnIC()
           ? Runtime::DefineObjectOwnProperty(isolate(), object, key, value,
                                              StoreOrigin::kMaybeKeyed)
           : Runtime::SetObjectProperty(isolate(), object, key, value,
-                                       StoreOrigin::kMaybeKeyed),
-      Object);
+                                       StoreOrigin::kMaybeKeyed);
+  if (result.is_null()) {
+    DCHECK(isolate()->has_pending_exception());
+    set_slow_stub_reason("failed to set property");
+    use_ic = false;
+  }
   if (use_ic) {
     if (!old_receiver_map.is_null()) {
       if (is_arguments) {
@@ -2624,7 +2558,7 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
   }
   TraceIC("StoreIC", key);
 
-  return store_handle;
+  return result;
 }
 
 namespace {
@@ -2647,7 +2581,7 @@ MaybeHandle<Object> StoreInArrayLiteralIC::Store(Handle<JSArray> array,
   DCHECK(!array->map().IsMapInArrayPrototypeChain(isolate()));
   DCHECK(index->IsNumber());
 
-  if (!FLAG_use_ic || state() == NO_FEEDBACK ||
+  if (!v8_flags.use_ic || state() == NO_FEEDBACK ||
       MigrateDeprecated(isolate(), array)) {
     MAYBE_RETURN_NULL(StoreOwnElement(isolate(), array, index, value));
     TraceIC("StoreInArrayLiteralIC", index);
diff --git a/deps/v8/src/ic/keyed-store-generic.cc b/deps/v8/src/ic/keyed-store-generic.cc
index 7f541b701d0344..69e4c3e4e502c4 100644
--- a/deps/v8/src/ic/keyed-store-generic.cc
+++ b/deps/v8/src/ic/keyed-store-generic.cc
@@ -1129,7 +1129,7 @@ void KeyedStoreGenericAssembler::KeyedStoreGeneric(
 
   BIND(&not_internalized);
   {
-    if (FLAG_internalize_on_the_fly) {
+    if (v8_flags.internalize_on_the_fly) {
       TryInternalizeString(CAST(key), &if_index, &var_index, &if_unique_name,
                            &var_unique, &slow, &slow);
     } else {
diff --git a/deps/v8/src/ic/stub-cache.cc b/deps/v8/src/ic/stub-cache.cc
index 2a786398cbead1..4dd60fdfa9f27e 100644
--- a/deps/v8/src/ic/stub-cache.cc
+++ b/deps/v8/src/ic/stub-cache.cc
@@ -50,7 +50,7 @@ void StubCache::Initialize() {
 // is scaled by 1 << kCacheIndexShift.
 int StubCache::PrimaryOffset(Name name, Map map) {
   // Compute the hash of the name (use entire hash field).
-  uint32_t field = name.raw_hash_field();
+  uint32_t field = name.RawHash();
   DCHECK(Name::IsHashFieldComputed(field));
   // Using only the low bits in 64-bit mode is unlikely to increase the
   // risk of collision even if the heap is spread over an area larger than
diff --git a/deps/v8/src/init/bootstrapper.cc b/deps/v8/src/init/bootstrapper.cc
index a9afa3f41367cf..fc7b17d582e79b 100644
--- a/deps/v8/src/init/bootstrapper.cc
+++ b/deps/v8/src/init/bootstrapper.cc
@@ -47,6 +47,7 @@
 #include "src/objects/js-collator.h"
 #include "src/objects/js-date-time-format.h"
 #include "src/objects/js-display-names.h"
+#include "src/objects/js-duration-format.h"
 #include "src/objects/js-list-format.h"
 #include "src/objects/js-locale.h"
 #include "src/objects/js-number-format.h"
@@ -62,12 +63,14 @@
 #include "src/objects/js-segments.h"
 #endif  // V8_INTL_SUPPORT
 #include "src/codegen/script-details.h"
+#include "src/objects/js-raw-json.h"
 #include "src/objects/js-shared-array.h"
 #include "src/objects/js-struct.h"
 #include "src/objects/js-temporal-objects-inl.h"
 #include "src/objects/js-weak-refs.h"
 #include "src/objects/ordered-hash-table.h"
 #include "src/objects/property-cell.h"
+#include "src/objects/property-descriptor.h"
 #include "src/objects/slots-inl.h"
 #include "src/objects/swiss-name-dictionary-inl.h"
 #include "src/objects/templates.h"
@@ -134,13 +137,13 @@ void Bootstrapper::Initialize(bool create_heap_objects) {
 
 static const char* GCFunctionName() {
   bool flag_given =
-      FLAG_expose_gc_as != nullptr && strlen(FLAG_expose_gc_as) != 0;
-  return flag_given ? FLAG_expose_gc_as : "gc";
+      v8_flags.expose_gc_as != nullptr && strlen(v8_flags.expose_gc_as) != 0;
+  return flag_given ? v8_flags.expose_gc_as : "gc";
 }
 
 static bool isValidCpuTraceMarkFunctionName() {
-  return FLAG_expose_cputracemark_as != nullptr &&
-         strlen(FLAG_expose_cputracemark_as) != 0;
+  return v8_flags.expose_cputracemark_as != nullptr &&
+         strlen(v8_flags.expose_cputracemark_as) != 0;
 }
 
 void Bootstrapper::InitializeOncePerProcess() {
@@ -150,8 +153,8 @@ void Bootstrapper::InitializeOncePerProcess() {
   v8::RegisterExtension(std::make_unique<TriggerFailureExtension>());
   v8::RegisterExtension(std::make_unique<IgnitionStatisticsExtension>());
   if (isValidCpuTraceMarkFunctionName()) {
-    v8::RegisterExtension(
-        std::make_unique<CpuTraceMarkExtension>(FLAG_expose_cputracemark_as));
+    v8::RegisterExtension(std::make_unique<CpuTraceMarkExtension>(
+        v8_flags.expose_cputracemark_as));
   }
 #ifdef ENABLE_VTUNE_TRACEMARK
   v8::RegisterExtension(
@@ -360,7 +363,7 @@ Handle<JSGlobalProxy> Bootstrapper::NewRemoteContext(
 }
 
 void Bootstrapper::LogAllMaps() {
-  if (!FLAG_log_maps || isolate_->initialized_from_snapshot()) return;
+  if (!v8_flags.log_maps || isolate_->initialized_from_snapshot()) return;
   // Log all created Map objects that are on the heap. For snapshots the Map
   // logging happens during deserialization in order to avoid printing Maps
   // multiple times during partial deserialization.
@@ -1774,9 +1777,7 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
     native_context()->set_initial_array_prototype(*proto);
 
     InitializeJSArrayMaps(isolate_, native_context(),
-
                           handle(array_function->initial_map(), isolate_));
-
     SimpleInstallFunction(isolate_, array_function, "isArray",
                           Builtin::kArrayIsArray, 1, true);
     SimpleInstallFunction(isolate_, array_function, "from", Builtin::kArrayFrom,
@@ -2785,6 +2786,7 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
     SimpleInstallFunction(isolate_, json_object, "stringify",
                           Builtin::kJsonStringify, 3, true);
     InstallToStringTag(isolate_, json_object, "JSON");
+    native_context()->set_json_object(*json_object);
   }
 
   {  // -- M a t h
@@ -3921,7 +3923,7 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
     // The cleanupSome function is created but not exposed, as it is used
     // internally by InvokeFinalizationRegistryCleanupFromTask.
     //
-    // It is exposed by FLAG_harmony_weak_refs_with_cleanup_some.
+    // It is exposed by v8_flags.harmony_weak_refs_with_cleanup_some.
     Handle<JSFunction> cleanup_some_fun = SimpleCreateFunction(
         isolate_, factory->InternalizeUtf8String("cleanupSome"),
         Builtin::kFinalizationRegistryPrototypeCleanupSome, 0, false);
@@ -4506,6 +4508,7 @@ void Genesis::InitializeConsole(Handle<JSObject> extras_binding) {
 
 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_import_assertions)
 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_class_static_blocks)
+EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_symbol_as_weakmap_key)
 
 #ifdef V8_INTL_SUPPORT
 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_intl_best_fit_matcher)
@@ -4513,8 +4516,30 @@ EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_intl_best_fit_matcher)
 
 #undef EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE
 
+void Genesis::InitializeGlobal_harmony_json_parse_with_source() {
+  if (!v8_flags.harmony_json_parse_with_source) return;
+  Handle<Map> map = factory()->NewMap(JS_RAW_JSON_TYPE, JSRawJson::kSize,
+                                      TERMINAL_FAST_ELEMENTS_KIND, 1);
+  Map::EnsureDescriptorSlack(isolate_, map, 1);
+  {
+    Descriptor d = Descriptor::DataField(
+        isolate(), factory()->raw_json_string(), JSRawJson::kRawJsonIndex, NONE,
+        Representation::Tagged());
+    map->AppendDescriptor(isolate(), &d);
+  }
+  map->SetPrototype(isolate(), map, isolate()->factory()->null_value());
+  map->SetConstructor(native_context()->object_function());
+  native_context()->set_js_raw_json_map(*map);
+  SimpleInstallFunction(isolate_,
+                        handle(native_context()->json_object(), isolate_),
+                        "rawJSON", Builtin::kJsonRawJson, 1, true);
+  SimpleInstallFunction(isolate_,
+                        handle(native_context()->json_object(), isolate_),
+                        "isRawJSON", Builtin::kJsonIsRawJson, 1, true);
+}
+
 void Genesis::InitializeGlobal_harmony_change_array_by_copy() {
-  if (!FLAG_harmony_change_array_by_copy) return;
+  if (!v8_flags.harmony_change_array_by_copy) return;
 
   {
     Handle<JSFunction> array_function(native_context()->array_function(),
@@ -4546,13 +4571,15 @@ void Genesis::InitializeGlobal_harmony_change_array_by_copy() {
                                isolate());
     SimpleInstallFunction(isolate_, prototype, "toReversed",
                           Builtin::kTypedArrayPrototypeToReversed, 0, true);
+    SimpleInstallFunction(isolate_, prototype, "toSorted",
+                          Builtin::kTypedArrayPrototypeToSorted, 1, false);
     SimpleInstallFunction(isolate_, prototype, "with",
                           Builtin::kTypedArrayPrototypeWith, 2, true);
   }
 }
 
 void Genesis::InitializeGlobal_harmony_regexp_unicode_sets() {
-  if (!FLAG_harmony_regexp_unicode_sets) return;
+  if (!v8_flags.harmony_regexp_unicode_sets) return;
 
   Handle<JSFunction> regexp_fun(native_context()->regexp_function(), isolate());
   Handle<JSObject> regexp_prototype(
@@ -4566,7 +4593,7 @@ void Genesis::InitializeGlobal_harmony_regexp_unicode_sets() {
 }
 
 void Genesis::InitializeGlobal_harmony_shadow_realm() {
-  if (!FLAG_harmony_shadow_realm) return;
+  if (!v8_flags.harmony_shadow_realm) return;
   Factory* factory = isolate()->factory();
   // -- S h a d o w R e a l m
   // #sec-shadowrealm-objects
@@ -4638,7 +4665,7 @@ void Genesis::InitializeGlobal_harmony_shadow_realm() {
 }
 
 void Genesis::InitializeGlobal_harmony_struct() {
-  if (!FLAG_harmony_struct) return;
+  if (!v8_flags.harmony_struct) return;
 
   Handle<JSGlobalObject> global(native_context()->global_object(), isolate());
   Handle<String> name =
@@ -4670,8 +4697,11 @@ void Genesis::InitializeGlobal_harmony_struct() {
         isolate()->factory()->NewDescriptorArray(1, 0,
                                                  AllocationType::kSharedOld);
     Descriptor descriptor = Descriptor::AccessorConstant(
-        isolate()->shared_isolate()->factory()->length_string(),
-        isolate()->shared_isolate()->factory()->shared_array_length_accessor(),
+        isolate()->shared_heap_isolate()->factory()->length_string(),
+        isolate()
+            ->shared_heap_isolate()
+            ->factory()
+            ->shared_array_length_accessor(),
         ALL_ATTRIBUTES_MASK);
     descriptors->Set(InternalIndex(0), &descriptor);
     shared_array_fun->initial_map().InitializeDescriptors(isolate(),
@@ -4728,7 +4758,7 @@ void Genesis::InitializeGlobal_harmony_struct() {
 }
 
 void Genesis::InitializeGlobal_harmony_array_find_last() {
-  if (!FLAG_harmony_array_find_last) return;
+  if (!v8_flags.harmony_array_find_last) return;
 
   {
     Handle<JSFunction> array_function(native_context()->array_function(),
@@ -4761,7 +4791,7 @@ void Genesis::InitializeGlobal_harmony_array_find_last() {
 }
 
 void Genesis::InitializeGlobal_harmony_array_grouping() {
-  if (!FLAG_harmony_array_grouping) return;
+  if (!v8_flags.harmony_array_grouping) return;
 
   Handle<JSFunction> array_function(native_context()->array_function(),
                                     isolate());
@@ -4783,8 +4813,8 @@ void Genesis::InitializeGlobal_harmony_array_grouping() {
 }
 
 void Genesis::InitializeGlobal_harmony_sharedarraybuffer() {
-  if (!FLAG_harmony_sharedarraybuffer ||
-      FLAG_enable_sharedarraybuffer_per_context) {
+  if (!v8_flags.harmony_sharedarraybuffer ||
+      v8_flags.enable_sharedarraybuffer_per_context) {
     return;
   }
 
@@ -4795,7 +4825,7 @@ void Genesis::InitializeGlobal_harmony_sharedarraybuffer() {
 }
 
 void Genesis::InitializeGlobal_harmony_atomics() {
-  if (!FLAG_harmony_atomics) return;
+  if (!v8_flags.harmony_atomics) return;
 
   Handle<JSGlobalObject> global(native_context()->global_object(), isolate());
 
@@ -4805,7 +4835,7 @@ void Genesis::InitializeGlobal_harmony_atomics() {
 }
 
 void Genesis::InitializeGlobal_harmony_weak_refs_with_cleanup_some() {
-  if (!FLAG_harmony_weak_refs_with_cleanup_some) return;
+  if (!v8_flags.harmony_weak_refs_with_cleanup_some) return;
 
   Handle<JSFunction> finalization_registry_fun =
       isolate()->js_finalization_registry_fun();
@@ -4820,7 +4850,7 @@ void Genesis::InitializeGlobal_harmony_weak_refs_with_cleanup_some() {
 }
 
 void Genesis::InitializeGlobal_regexp_linear_flag() {
-  if (!FLAG_enable_experimental_regexp_engine) return;
+  if (!v8_flags.enable_experimental_regexp_engine) return;
 
   Handle<JSFunction> regexp_fun(native_context()->regexp_function(), isolate());
   Handle<JSObject> regexp_prototype(
@@ -4834,7 +4864,7 @@ void Genesis::InitializeGlobal_regexp_linear_flag() {
 }
 
 void Genesis::InitializeGlobal_harmony_rab_gsab() {
-  if (!FLAG_harmony_rab_gsab) return;
+  if (!v8_flags.harmony_rab_gsab) return;
   Handle<JSObject> array_buffer_prototype(
       JSObject::cast(native_context()->array_buffer_fun().instance_prototype()),
       isolate());
@@ -4865,7 +4895,7 @@ void Genesis::InitializeGlobal_harmony_rab_gsab() {
 }
 
 void Genesis::InitializeGlobal_harmony_temporal() {
-  if (!FLAG_harmony_temporal) return;
+  if (!v8_flags.harmony_temporal) return;
   // -- T e m p o r a l
   // #sec-temporal-objects
   Handle<JSObject> temporal =
@@ -5508,7 +5538,7 @@ void Genesis::InitializeGlobal_harmony_temporal() {
 #ifdef V8_INTL_SUPPORT
 
 void Genesis::InitializeGlobal_harmony_intl_number_format_v3() {
-  if (!FLAG_harmony_intl_number_format_v3) return;
+  if (!v8_flags.harmony_intl_number_format_v3) return;
 
   {
     Handle<JSFunction> number_format_constructor =
@@ -5538,7 +5568,7 @@ void Genesis::InitializeGlobal_harmony_intl_number_format_v3() {
 #endif  // V8_INTL_SUPPORT
 
 void Genesis::InitializeGlobal_experimental_web_snapshots() {
-  if (!FLAG_experimental_web_snapshots) return;
+  if (!v8_flags.experimental_web_snapshots) return;
 
   Handle<JSGlobalObject> global(native_context()->global_object(), isolate());
   Handle<JSObject> web_snapshot_object =
@@ -5552,6 +5582,46 @@ void Genesis::InitializeGlobal_experimental_web_snapshots() {
                         Builtin::kWebSnapshotDeserialize, 2, false);
 }
 
+#ifdef V8_INTL_SUPPORT
+void Genesis::InitializeGlobal_harmony_intl_duration_format() {
+  if (!FLAG_harmony_intl_duration_format) return;
+  Handle<JSObject> intl = Handle<JSObject>::cast(
+      JSReceiver::GetProperty(
+          isolate(),
+          Handle<JSReceiver>(native_context()->global_object(), isolate()),
+          factory()->InternalizeUtf8String("Intl"))
+          .ToHandleChecked());
+
+  Handle<JSFunction> duration_format_fun = InstallFunction(
+      isolate(), intl, "DurationFormat", JS_DURATION_FORMAT_TYPE,
+      JSDurationFormat::kHeaderSize, 0, factory()->the_hole_value(),
+      Builtin::kDurationFormatConstructor);
+  duration_format_fun->shared().set_length(0);
+  duration_format_fun->shared().DontAdaptArguments();
+  InstallWithIntrinsicDefaultProto(
+      isolate(), duration_format_fun,
+      Context::INTL_DURATION_FORMAT_FUNCTION_INDEX);
+
+  SimpleInstallFunction(isolate(), duration_format_fun, "supportedLocalesOf",
+                        Builtin::kDurationFormatSupportedLocalesOf, 1, false);
+
+  Handle<JSObject> prototype(
+      JSObject::cast(duration_format_fun->instance_prototype()), isolate());
+
+  InstallToStringTag(isolate(), prototype, "Intl.DurationFormat");
+
+  SimpleInstallFunction(isolate(), prototype, "resolvedOptions",
+                        Builtin::kDurationFormatPrototypeResolvedOptions, 0,
+                        false);
+
+  SimpleInstallFunction(isolate(), prototype, "format",
+                        Builtin::kDurationFormatPrototypeFormat, 1, false);
+  SimpleInstallFunction(isolate(), prototype, "formatToParts",
+                        Builtin::kDurationFormatPrototypeFormatToParts, 1,
+                        false);
+}
+#endif  // V8_INTL_SUPPORT
+
 Handle<JSFunction> Genesis::CreateArrayBuffer(
     Handle<String> name, ArrayBufferKind array_buffer_kind) {
   // Create the %ArrayBufferPrototype%
@@ -5791,6 +5861,58 @@ bool Genesis::InstallABunchOfRandomThings() {
     native_context()->set_data_property_descriptor_map(*map);
   }
 
+  {
+    // -- TemplateLiteral JSArray Map
+    Handle<JSFunction> array_function(native_context()->array_function(),
+                                      isolate());
+    Handle<Map> template_map(array_function->initial_map(), isolate_);
+    template_map = Map::CopyAsElementsKind(isolate_, template_map,
+                                           PACKED_ELEMENTS, OMIT_TRANSITION);
+    template_map->set_instance_size(template_map->instance_size() +
+                                    kTaggedSize);
+    // Temporarily instantiate full template_literal_object to get the final
+    // map.
+    auto template_object =
+        Handle<JSArray>::cast(factory()->NewJSObjectFromMap(template_map));
+    {
+      DisallowGarbageCollection no_gc;
+      JSArray raw = *template_object;
+      raw.set_elements(ReadOnlyRoots(isolate()).empty_fixed_array());
+      raw.set_length(Smi::FromInt(0));
+    }
+
+    // Install a "raw" data property for {raw_object} on {template_object}.
+    // See ES#sec-gettemplateobject.
+    PropertyDescriptor raw_desc;
+    // Use arbrirary object {template_object} as ".raw" value.
+    raw_desc.set_value(template_object);
+    raw_desc.set_configurable(false);
+    raw_desc.set_enumerable(false);
+    raw_desc.set_writable(false);
+    JSArray::DefineOwnProperty(isolate(), template_object,
+                               factory()->raw_string(), &raw_desc,
+                               Just(kThrowOnError))
+        .ToChecked();
+
+    // Freeze the {template_object} as well.
+    JSObject::SetIntegrityLevel(template_object, FROZEN, kThrowOnError)
+        .ToChecked();
+    {
+      DisallowGarbageCollection no_gc;
+      // Verify TemplateLiteralObject::kRawFieldOffset
+      DescriptorArray desc = template_object->map().instance_descriptors();
+      InternalIndex descriptor_index =
+          desc.Search(*factory()->raw_string(), desc.number_of_descriptors());
+      FieldIndex index =
+          FieldIndex::ForDescriptor(template_object->map(), descriptor_index);
+      CHECK(index.is_inobject());
+      CHECK_EQ(index.offset(), TemplateLiteralObject::kRawFieldOffset);
+    }
+
+    native_context()->set_js_array_template_literal_object_map(
+        template_object->map());
+  }
+
   // Create a constructor for RegExp results (a variant of Array that
   // predefines the properties index, input, and groups).
   {
@@ -6000,15 +6122,16 @@ bool Genesis::InstallSpecialObjects(Isolate* isolate,
 
   Handle<JSObject> Error = isolate->error_function();
   Handle<String> name = isolate->factory()->stackTraceLimit_string();
-  Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate);
+  Handle<Smi> stack_trace_limit(Smi::FromInt(v8_flags.stack_trace_limit),
+                                isolate);
   JSObject::AddProperty(isolate, Error, name, stack_trace_limit, NONE);
 
 #if V8_ENABLE_WEBASSEMBLY
-  if (FLAG_expose_wasm) {
+  if (v8_flags.expose_wasm) {
     // Install the internal data structures into the isolate and expose on
     // the global object.
     WasmJs::Install(isolate, true);
-  } else if (FLAG_validate_asm) {
+  } else if (v8_flags.validate_asm) {
     // Install the internal data structures only; these are needed for asm.js
     // translated to Wasm to work correctly.
     WasmJs::Install(isolate, false);
@@ -6051,21 +6174,22 @@ bool Genesis::InstallExtensions(Isolate* isolate,
                                 v8::ExtensionConfiguration* extensions) {
   ExtensionStates extension_states;  // All extensions have state UNVISITED.
   return InstallAutoExtensions(isolate, &extension_states) &&
-         (!FLAG_expose_gc ||
+         (!v8_flags.expose_gc ||
           InstallExtension(isolate, "v8/gc", &extension_states)) &&
-         (!FLAG_expose_externalize_string ||
+         (!v8_flags.expose_externalize_string ||
           InstallExtension(isolate, "v8/externalize", &extension_states)) &&
-         (!(FLAG_expose_statistics || TracingFlags::is_gc_stats_enabled()) ||
+         (!(v8_flags.expose_statistics ||
+            TracingFlags::is_gc_stats_enabled()) ||
           InstallExtension(isolate, "v8/statistics", &extension_states)) &&
-         (!FLAG_expose_trigger_failure ||
+         (!v8_flags.expose_trigger_failure ||
           InstallExtension(isolate, "v8/trigger-failure", &extension_states)) &&
-         (!FLAG_expose_ignition_statistics ||
+         (!v8_flags.expose_ignition_statistics ||
           InstallExtension(isolate, "v8/ignition-statistics",
                            &extension_states)) &&
          (!isValidCpuTraceMarkFunctionName() ||
           InstallExtension(isolate, "v8/cpumark", &extension_states)) &&
 #ifdef ENABLE_VTUNE_TRACEMARK
-         (!FLAG_enable_vtune_domain_support ||
+         (!v8_flags.enable_vtune_domain_support ||
           InstallExtension(isolate, "v8/vtunedomain", &extension_states)) &&
 #endif  // ENABLE_VTUNE_TRACEMARK
          InstallRequestedExtensions(isolate, extensions, &extension_states);
@@ -6465,7 +6589,7 @@ Genesis::Genesis(
     DCHECK(native_context().is_null());
 
     base::ElapsedTimer timer;
-    if (FLAG_profile_deserialization) timer.Start();
+    if (v8_flags.profile_deserialization) timer.Start();
     DCHECK_EQ(0u, context_snapshot_index);
     // We get here if there was no context snapshot.
     CreateRoots();
@@ -6488,7 +6612,7 @@ Genesis::Genesis(
     if (!InstallExtrasBindings()) return;
     if (!ConfigureGlobalObject(global_proxy_template)) return;
 
-    if (FLAG_profile_deserialization) {
+    if (v8_flags.profile_deserialization) {
       double ms = timer.Elapsed().InMillisecondsF();
       PrintF("[Initializing context from scratch took %0.3f ms]\n", ms);
     }
@@ -6515,7 +6639,7 @@ Genesis::Genesis(
         string_function_prototype.map());
   }
 
-  if (FLAG_disallow_code_generation_from_strings) {
+  if (v8_flags.disallow_code_generation_from_strings) {
     native_context()->set_allow_code_gen_from_strings(
         ReadOnlyRoots(isolate).false_value());
   }
diff --git a/deps/v8/src/init/heap-symbols.h b/deps/v8/src/init/heap-symbols.h
index edc998f27ee3fa..7443a5c0e7be9a 100644
--- a/deps/v8/src/init/heap-symbols.h
+++ b/deps/v8/src/init/heap-symbols.h
@@ -27,8 +27,10 @@
   V(_, dateStyle_string, "dateStyle")                               \
   V(_, dateTimeField_string, "dateTimeField")                       \
   V(_, dayPeriod_string, "dayPeriod")                               \
+  V(_, daysDisplay_string, "daysDisplay")                           \
   V(_, decimal_string, "decimal")                                   \
   V(_, dialect_string, "dialect")                                   \
+  V(_, digital_string, "digital")                                   \
   V(_, direction_string, "direction")                               \
   V(_, endRange_string, "endRange")                                 \
   V(_, engineering_string, "engineering")                           \
@@ -43,6 +45,7 @@
   V(_, floor_string, "floor")                                       \
   V(_, format_string, "format")                                     \
   V(_, fraction_string, "fraction")                                 \
+  V(_, fractionalDigits_string, "fractionalDigits")                 \
   V(_, fractionalSecond_string, "fractionalSecond")                 \
   V(_, full_string, "full")                                         \
   V(_, granularity_string, "granularity")                           \
@@ -60,6 +63,7 @@
   V(_, hour12_string, "hour12")                                     \
   V(_, hourCycle_string, "hourCycle")                               \
   V(_, hourCycles_string, "hourCycles")                             \
+  V(_, hoursDisplay_string, "hoursDisplay")                         \
   V(_, ideo_string, "ideo")                                         \
   V(_, ignorePunctuation_string, "ignorePunctuation")               \
   V(_, Invalid_Date_string, "Invalid Date")                         \
@@ -78,6 +82,8 @@
   V(_, ltr_string, "ltr")                                           \
   V(_, maximumFractionDigits_string, "maximumFractionDigits")       \
   V(_, maximumSignificantDigits_string, "maximumSignificantDigits") \
+  V(_, microsecondsDisplay_string, "microsecondsDisplay")           \
+  V(_, millisecondsDisplay_string, "millisecondsDisplay")           \
   V(_, min2_string, "min2")                                         \
   V(_, minimalDays_string, "minimalDays")                           \
   V(_, minimumFractionDigits_string, "minimumFractionDigits")       \
@@ -85,8 +91,11 @@
   V(_, minimumSignificantDigits_string, "minimumSignificantDigits") \
   V(_, minus_0, "-0")                                               \
   V(_, minusSign_string, "minusSign")                               \
+  V(_, minutesDisplay_string, "minutesDisplay")                     \
+  V(_, monthsDisplay_string, "monthsDisplay")                       \
   V(_, morePrecision_string, "morePrecision")                       \
   V(_, nan_string, "nan")                                           \
+  V(_, nanosecondsDisplay_string, "nanosecondsDisplay")             \
   V(_, narrowSymbol_string, "narrowSymbol")                         \
   V(_, negative_string, "negative")                                 \
   V(_, never_string, "never")                                       \
@@ -106,6 +115,7 @@
   V(_, roundingPriority_string, "roundingPriority")                 \
   V(_, rtl_string, "rtl")                                           \
   V(_, scientific_string, "scientific")                             \
+  V(_, secondsDisplay_string, "secondsDisplay")                     \
   V(_, segment_string, "segment")                                   \
   V(_, SegmentIterator_string, "Segment Iterator")                  \
   V(_, Segments_string, "Segments")                                 \
@@ -125,6 +135,7 @@
   V(_, timeZoneName_string, "timeZoneName")                         \
   V(_, trailingZeroDisplay_string, "trailingZeroDisplay")           \
   V(_, trunc_string, "trunc")                                       \
+  V(_, two_digit_string, "2-digit")                                 \
   V(_, type_string, "type")                                         \
   V(_, unknown_string, "unknown")                                   \
   V(_, upper_string, "upper")                                       \
@@ -133,8 +144,10 @@
   V(_, unitDisplay_string, "unitDisplay")                           \
   V(_, weekday_string, "weekday")                                   \
   V(_, weekend_string, "weekend")                                   \
+  V(_, weeksDisplay_string, "weeksDisplay")                         \
   V(_, weekInfo_string, "weekInfo")                                 \
-  V(_, yearName_string, "yearName")
+  V(_, yearName_string, "yearName")                                 \
+  V(_, yearsDisplay_string, "yearsDisplay")
 #else  // V8_INTL_SUPPORT
 #define INTERNALIZED_STRING_LIST_GENERATOR_INTL(V, _)
 #endif  // V8_INTL_SUPPORT
@@ -359,6 +372,7 @@
   V(_, Proxy_string, "Proxy")                                        \
   V(_, query_colon_string, "(?:)")                                   \
   V(_, RangeError_string, "RangeError")                              \
+  V(_, raw_json_string, "rawJSON")                                   \
   V(_, raw_string, "raw")                                            \
   V(_, ReferenceError_string, "ReferenceError")                      \
   V(_, ReflectGet_string, "Reflect.get")                             \
@@ -528,6 +542,8 @@
   F(MC_INCREMENTAL_START)                                          \
   F(MC_INCREMENTAL_SWEEPING)
 
+#define MINOR_INCREMENTAL_SCOPES(F) F(MINOR_MC_INCREMENTAL_START)
+
 #define TOP_MC_SCOPES(F) \
   F(MC_CLEAR)            \
   F(MC_EPILOGUE)         \
@@ -537,8 +553,16 @@
   F(MC_PROLOGUE)         \
   F(MC_SWEEP)
 
+#define TOP_MINOR_MC_SCOPES(F) \
+  F(MINOR_MC_CLEAR)            \
+  F(MINOR_MC_EVACUATE)         \
+  F(MINOR_MC_FINISH)           \
+  F(MINOR_MC_MARK)             \
+  F(MINOR_MC_SWEEP)
+
 #define TRACER_SCOPES(F)                             \
   INCREMENTAL_SCOPES(F)                              \
+  MINOR_INCREMENTAL_SCOPES(F)                        \
   F(HEAP_EMBEDDER_TRACING_EPILOGUE)                  \
   F(HEAP_EPILOGUE)                                   \
   F(HEAP_EPILOGUE_REDUCE_NEW_SPACE)                  \
@@ -580,8 +604,6 @@
   F(MC_EVACUATE_UPDATE_POINTERS_SLOTS_MAIN)          \
   F(MC_EVACUATE_UPDATE_POINTERS_TO_NEW_ROOTS)        \
   F(MC_EVACUATE_UPDATE_POINTERS_WEAK)                \
-  F(MC_FINISH_SWEEP_NEW_LO)                          \
-  F(MC_FINISH_SWEEP_NEW)                             \
   F(MC_FINISH_SWEEP_ARRAY_BUFFERS)                   \
   F(MC_MARK_CLIENT_HEAPS)                            \
   F(MC_MARK_EMBEDDER_PROLOGUE)                       \
@@ -596,17 +618,18 @@
   F(MC_MARK_WEAK_CLOSURE_EPHEMERON_LINEAR)           \
   F(MC_SWEEP_CODE)                                   \
   F(MC_SWEEP_CODE_LO)                                \
+  F(MC_SWEEP_FINISH_NEW)                             \
   F(MC_SWEEP_LO)                                     \
   F(MC_SWEEP_MAP)                                    \
   F(MC_SWEEP_NEW)                                    \
+  F(MC_SWEEP_NEW_LO)                                 \
   F(MC_SWEEP_OLD)                                    \
+  F(MC_SWEEP_SHARED)                                 \
   F(MINOR_MARK_COMPACTOR)                            \
   F(MINOR_MC)                                        \
-  F(MINOR_MC_CLEAR)                                  \
+  TOP_MINOR_MC_SCOPES(F)                             \
   F(MINOR_MC_CLEAR_STRING_TABLE)                     \
-  F(MINOR_MC_CLEAR_WEAK_LISTS)                       \
   F(MINOR_MC_COMPLETE_SWEEP_ARRAY_BUFFERS)           \
-  F(MINOR_MC_EVACUATE)                               \
   F(MINOR_MC_EVACUATE_CLEAN_UP)                      \
   F(MINOR_MC_EVACUATE_COPY)                          \
   F(MINOR_MC_EVACUATE_COPY_PARALLEL)                 \
@@ -617,19 +640,17 @@
   F(MINOR_MC_EVACUATE_UPDATE_POINTERS_PARALLEL)      \
   F(MINOR_MC_EVACUATE_UPDATE_POINTERS_SLOTS)         \
   F(MINOR_MC_EVACUATE_UPDATE_POINTERS_WEAK)          \
-  F(MINOR_MC_FINISH)                                 \
   F(MINOR_MC_FINISH_SWEEP_ARRAY_BUFFERS)             \
-  F(MINOR_MC_FINISH_SWEEP_NEW)                       \
-  F(MINOR_MC_MARK)                                   \
   F(MINOR_MC_MARK_GLOBAL_HANDLES)                    \
+  F(MINOR_MC_MARK_FINISH_INCREMENTAL)                \
   F(MINOR_MC_MARK_PARALLEL)                          \
   F(MINOR_MC_MARK_SEED)                              \
   F(MINOR_MC_MARK_ROOTS)                             \
-  F(MINOR_MC_MARK_WEAK)                              \
-  F(MINOR_MC_MARKING_DEQUE)                          \
-  F(MINOR_MC_RESET_LIVENESS)                         \
-  F(MINOR_MC_SWEEP)                                  \
+  F(MINOR_MC_MARK_CLOSURE_PARALLEL)                  \
+  F(MINOR_MC_MARK_CLOSURE)                           \
   F(MINOR_MC_SWEEP_NEW)                              \
+  F(MINOR_MC_SWEEP_NEW_LO)                           \
+  F(MINOR_MC_SWEEP_FINISH_NEW)                       \
   F(SAFEPOINT)                                       \
   F(SCAVENGER)                                       \
   F(SCAVENGER_COMPLETE_SWEEP_ARRAY_BUFFERS)          \
@@ -664,6 +685,7 @@
   F(MINOR_MC_BACKGROUND_EVACUATE_COPY)            \
   F(MINOR_MC_BACKGROUND_EVACUATE_UPDATE_POINTERS) \
   F(MINOR_MC_BACKGROUND_MARKING)                  \
+  F(MINOR_MC_BACKGROUND_SWEEPING)                 \
   F(SCAVENGER_BACKGROUND_SCAVENGE_PARALLEL)
 
 #define TRACER_YOUNG_EPOCH_SCOPES(F)              \
@@ -673,6 +695,7 @@
   F(MINOR_MC_BACKGROUND_EVACUATE_COPY)            \
   F(MINOR_MC_BACKGROUND_EVACUATE_UPDATE_POINTERS) \
   F(MINOR_MC_BACKGROUND_MARKING)                  \
+  F(MINOR_MC_BACKGROUND_SWEEPING)                 \
   F(SCAVENGER)                                    \
   F(SCAVENGER_BACKGROUND_SCAVENGE_PARALLEL)       \
   F(SCAVENGER_COMPLETE_SWEEP_ARRAY_BUFFERS)
diff --git a/deps/v8/src/init/v8.cc b/deps/v8/src/init/v8.cc
index 13c2244df23571..b6f68c6f17fa64 100644
--- a/deps/v8/src/init/v8.cc
+++ b/deps/v8/src/init/v8.cc
@@ -99,7 +99,7 @@ void V8::InitializePlatform(v8::Platform* platform) {
   v8::base::SetPrintStackTrace(platform_->GetStackTracePrinter());
   v8::tracing::TracingCategoryObserver::SetUp();
 #if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
-  if (FLAG_enable_etw_stack_walking) {
+  if (v8_flags.enable_etw_stack_walking) {
     // TODO(sartang@microsoft.com): Move to platform specific diagnostics object
     v8::internal::ETWJITInterface::Register();
   }
@@ -114,10 +114,10 @@ void V8::InitializePlatform(v8::Platform* platform) {
 }
 
 #define DISABLE_FLAG(flag)                                                    \
-  if (FLAG_##flag) {                                                          \
+  if (v8_flags.flag) {                                                        \
     PrintF(stderr,                                                            \
            "Warning: disabling flag --" #flag " due to conflicting flags\n"); \
-    FLAG_##flag = false;                                                      \
+    v8_flags.flag = false;                                                    \
   }
 
 void V8::Initialize() {
@@ -125,52 +125,50 @@ void V8::Initialize() {
   CHECK(platform_);
 
   // Update logging information before enforcing flag implications.
-  FlagValue<bool>* log_all_flags[] = {&FLAG_log_all,
-                                      &FLAG_log_code,
-                                      &FLAG_log_code_disassemble,
-                                      &FLAG_log_source_code,
-                                      &FLAG_log_source_position,
-                                      &FLAG_log_feedback_vector,
+  FlagValue<bool>* log_all_flags[] = {&v8_flags.log_all,
+                                      &v8_flags.log_code,
+                                      &v8_flags.log_code_disassemble,
+                                      &v8_flags.log_source_code,
+                                      &v8_flags.log_source_position,
+                                      &v8_flags.log_feedback_vector,
                                       &v8_flags.log_function_events,
-                                      &FLAG_log_internal_timer_events,
-                                      &FLAG_log_deopt,
-                                      &FLAG_log_ic,
-                                      &FLAG_log_maps};
-  if (FLAG_log_all) {
+                                      &v8_flags.log_internal_timer_events,
+                                      &v8_flags.log_deopt,
+                                      &v8_flags.log_ic,
+                                      &v8_flags.log_maps};
+  if (v8_flags.log_all) {
     // Enable all logging flags
     for (auto* flag : log_all_flags) {
       *flag = true;
     }
-    FLAG_log = true;
-  } else if (!FLAG_log) {
+    v8_flags.log = true;
+  } else if (!v8_flags.log) {
     // Enable --log if any log flag is set.
     for (const auto* flag : log_all_flags) {
       if (!*flag) continue;
-      FLAG_log = true;
+      v8_flags.log = true;
       break;
     }
     // Profiling flags depend on logging.
-    FLAG_log = FLAG_log || FLAG_perf_prof || FLAG_perf_basic_prof ||
-               FLAG_ll_prof || FLAG_prof || FLAG_prof_cpp || FLAG_gdbjit;
-#if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
-    FLAG_log = FLAG_log || FLAG_enable_etw_stack_walking;
-#endif
+    v8_flags.log = v8_flags.log || v8_flags.perf_prof ||
+                   v8_flags.perf_basic_prof || v8_flags.ll_prof ||
+                   v8_flags.prof || v8_flags.prof_cpp || v8_flags.gdbjit;
   }
 
   FlagList::EnforceFlagImplications();
 
-  if (FLAG_predictable && FLAG_random_seed == 0) {
+  if (v8_flags.predictable && v8_flags.random_seed == 0) {
     // Avoid random seeds in predictable mode.
-    FLAG_random_seed = 12347;
+    v8_flags.random_seed = 12347;
   }
 
-  if (FLAG_stress_compaction) {
-    FLAG_force_marking_deque_overflows = true;
-    FLAG_gc_global = true;
-    FLAG_max_semi_space_size = 1;
+  if (v8_flags.stress_compaction) {
+    v8_flags.force_marking_deque_overflows = true;
+    v8_flags.gc_global = true;
+    v8_flags.max_semi_space_size = 1;
   }
 
-  if (FLAG_trace_turbo) {
+  if (v8_flags.trace_turbo) {
     // Create an empty file shared by the process (e.g. the wasm engine).
     std::ofstream(Isolate::GetTurboCfgFileName(nullptr).c_str(),
                   std::ios_base::trunc);
@@ -187,7 +185,7 @@ void V8::Initialize() {
   // TODO(jgruber): Remove this once / if wasm can run without executable
   // memory.
 #if V8_ENABLE_WEBASSEMBLY
-  if (FLAG_jitless && !FLAG_correctness_fuzzer_suppressions) {
+  if (v8_flags.jitless && !v8_flags.correctness_fuzzer_suppressions) {
     DISABLE_FLAG(expose_wasm);
   }
 #endif
@@ -197,7 +195,7 @@ void V8::Initialize() {
   // leads to false positives on TSAN bots.
   // TODO(chromium:1205289): Teach relevant fuzzers to not pass TF tracing
   // flags instead, and remove this section.
-  if (FLAG_fuzzing && FLAG_concurrent_recompilation) {
+  if (v8_flags.fuzzing && v8_flags.concurrent_recompilation) {
     DISABLE_FLAG(trace_turbo);
     DISABLE_FLAG(trace_turbo_graph);
     DISABLE_FLAG(trace_turbo_scheduled);
@@ -215,16 +213,16 @@ void V8::Initialize() {
   // The --jitless and --interpreted-frames-native-stack flags are incompatible
   // since the latter requires code generation while the former prohibits code
   // generation.
-  CHECK(!FLAG_interpreted_frames_native_stack || !FLAG_jitless);
+  CHECK(!v8_flags.interpreted_frames_native_stack || !v8_flags.jitless);
 
-  base::OS::Initialize(FLAG_hard_abort, FLAG_gc_fake_mmap);
+  base::OS::Initialize(v8_flags.hard_abort, v8_flags.gc_fake_mmap);
 
-  if (FLAG_random_seed) {
-    GetPlatformPageAllocator()->SetRandomMmapSeed(FLAG_random_seed);
-    GetPlatformVirtualAddressSpace()->SetRandomSeed(FLAG_random_seed);
+  if (v8_flags.random_seed) {
+    GetPlatformPageAllocator()->SetRandomMmapSeed(v8_flags.random_seed);
+    GetPlatformVirtualAddressSpace()->SetRandomSeed(v8_flags.random_seed);
   }
 
-  if (FLAG_print_flag_values) FlagList::PrintValues();
+  if (v8_flags.print_flag_values) FlagList::PrintValues();
 
   // Initialize the default FlagList::Hash.
   FlagList::Hash();
@@ -232,7 +230,7 @@ void V8::Initialize() {
   // Before initializing internals, freeze the flags such that further changes
   // are not allowed. Global initialization of the Isolate or the WasmEngine
   // already reads flags, so they should not be changed afterwards.
-  if (FLAG_freeze_flags_after_init) FlagList::FreezeFlags();
+  if (v8_flags.freeze_flags_after_init) FlagList::FreezeFlags();
 
 #if defined(V8_ENABLE_SANDBOX)
   // If enabled, the sandbox must be initialized first.
@@ -291,7 +289,7 @@ void V8::DisposePlatform() {
   AdvanceStartupState(V8StartupState::kPlatformDisposing);
   CHECK(platform_);
 #if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
-  if (FLAG_enable_etw_stack_walking) {
+  if (v8_flags.enable_etw_stack_walking) {
     v8::internal::ETWJITInterface::Unregister();
   }
 #endif
diff --git a/deps/v8/src/inspector/injected-script.cc b/deps/v8/src/inspector/injected-script.cc
index c86d658d22dd50..3a917918814124 100644
--- a/deps/v8/src/inspector/injected-script.cc
+++ b/deps/v8/src/inspector/injected-script.cc
@@ -68,22 +68,39 @@ using protocol::Runtime::PrivatePropertyDescriptor;
 using protocol::Runtime::PropertyDescriptor;
 using protocol::Runtime::RemoteObject;
 
+// static
+void EvaluateCallback::sendSuccess(
+    std::weak_ptr<EvaluateCallback> callback, InjectedScript* injectedScript,
+    std::unique_ptr<protocol::Runtime::RemoteObject> result,
+    protocol::Maybe<protocol::Runtime::ExceptionDetails> exceptionDetails) {
+  std::shared_ptr<EvaluateCallback> cb = callback.lock();
+  if (!cb) return;
+  injectedScript->deleteEvaluateCallback(cb);
+  CHECK_EQ(cb.use_count(), 1);
+  cb->sendSuccess(std::move(result), std::move(exceptionDetails));
+}
+
+// static
+void EvaluateCallback::sendFailure(std::weak_ptr<EvaluateCallback> callback,
+                                   InjectedScript* injectedScript,
+                                   const protocol::DispatchResponse& response) {
+  std::shared_ptr<EvaluateCallback> cb = callback.lock();
+  if (!cb) return;
+  injectedScript->deleteEvaluateCallback(cb);
+  CHECK_EQ(cb.use_count(), 1);
+  cb->sendFailure(response);
+}
+
 class InjectedScript::ProtocolPromiseHandler {
  public:
-  static bool add(V8InspectorSessionImpl* session,
+  static void add(V8InspectorSessionImpl* session,
                   v8::Local<v8::Context> context, v8::Local<v8::Value> value,
                   int executionContextId, const String16& objectGroup,
                   WrapMode wrapMode, bool replMode, bool throwOnSideEffect,
-                  EvaluateCallback* callback) {
-    v8::Local<v8::Promise::Resolver> resolver;
-    if (!v8::Promise::Resolver::New(context).ToLocal(&resolver)) {
-      callback->sendFailure(Response::InternalError());
-      return false;
-    }
-    if (!resolver->Resolve(context, value).FromMaybe(false)) {
-      callback->sendFailure(Response::InternalError());
-      return false;
-    }
+                  std::weak_ptr<EvaluateCallback> callback) {
+    InjectedScript::ContextScope scope(session, executionContextId);
+    Response response = scope.initialize();
+    if (!response.IsSuccess()) return;
 
     v8::MaybeLocal<v8::Promise> originalPromise =
         value->IsPromise() ? value.As<v8::Promise>()
@@ -101,13 +118,36 @@ class InjectedScript::ProtocolPromiseHandler {
         v8::Function::New(context, catchCallback, wrapper, 0,
                           v8::ConstructorBehavior::kThrow)
             .ToLocalChecked();
-    v8::Local<v8::Promise> promise = resolver->GetPromise();
+
+    v8::Local<v8::Promise> promise;
+    v8::Local<v8::Promise::Resolver> resolver;
+    if (value->IsPromise()) {
+      // If value is a promise, we can chain the handlers directly onto `value`.
+      promise = value.As<v8::Promise>();
+    } else {
+      // Otherwise we do `Promise.resolve(value)`.
+      CHECK(!replMode);
+      if (!v8::Promise::Resolver::New(context).ToLocal(&resolver)) {
+        EvaluateCallback::sendFailure(callback, scope.injectedScript(),
+                                      Response::InternalError());
+        return;
+      }
+      if (!resolver->Resolve(context, value).FromMaybe(false)) {
+        EvaluateCallback::sendFailure(callback, scope.injectedScript(),
+                                      Response::InternalError());
+        return;
+      }
+      promise = resolver->GetPromise();
+    }
+
     if (promise->Then(context, thenCallbackFunction, catchCallbackFunction)
             .IsEmpty()) {
-      callback->sendFailure(Response::InternalError());
-      return false;
+      // Re-initialize after returning from JS.
+      Response response = scope.initialize();
+      if (!response.IsSuccess()) return;
+      EvaluateCallback::sendFailure(callback, scope.injectedScript(),
+                                    Response::InternalError());
     }
-    return true;
   }
 
  private:
@@ -143,7 +183,8 @@ class InjectedScript::ProtocolPromiseHandler {
   ProtocolPromiseHandler(V8InspectorSessionImpl* session,
                          int executionContextId, const String16& objectGroup,
                          WrapMode wrapMode, bool replMode,
-                         bool throwOnSideEffect, EvaluateCallback* callback,
+                         bool throwOnSideEffect,
+                         std::weak_ptr<EvaluateCallback> callback,
                          v8::MaybeLocal<v8::Promise> maybeEvaluationResult)
       : m_inspector(session->inspector()),
         m_sessionId(session->sessionId()),
@@ -184,24 +225,22 @@ class InjectedScript::ProtocolPromiseHandler {
     Response response = scope.initialize();
     if (!response.IsSuccess()) return;
 
-    std::unique_ptr<EvaluateCallback> callback =
-        scope.injectedScript()->takeEvaluateCallback(m_callback);
-    if (!callback) return;
-
     // In REPL mode the result is additionally wrapped in an object.
     // The evaluation result can be found at ".repl_result".
     v8::Local<v8::Value> result = value;
     if (m_replMode) {
       v8::Local<v8::Object> object;
       if (!result->ToObject(scope.context()).ToLocal(&object)) {
-        callback->sendFailure(response);
+        EvaluateCallback::sendFailure(m_callback, scope.injectedScript(),
+                                      response);
         return;
       }
 
       v8::Local<v8::String> name =
           GetDotReplResultString(m_inspector->isolate());
       if (!object->Get(scope.context(), name).ToLocal(&result)) {
-        callback->sendFailure(response);
+        EvaluateCallback::sendFailure(m_callback, scope.injectedScript(),
+                                      response);
         return;
       }
     }
@@ -214,11 +253,13 @@ class InjectedScript::ProtocolPromiseHandler {
     response = scope.injectedScript()->wrapObject(result, m_objectGroup,
                                                   m_wrapMode, &wrappedValue);
     if (!response.IsSuccess()) {
-      callback->sendFailure(response);
+      EvaluateCallback::sendFailure(m_callback, scope.injectedScript(),
+                                    response);
       return;
     }
-    callback->sendSuccess(std::move(wrappedValue),
-                          Maybe<protocol::Runtime::ExceptionDetails>());
+    EvaluateCallback::sendSuccess(m_callback, scope.injectedScript(),
+                                  std::move(wrappedValue),
+                                  Maybe<protocol::Runtime::ExceptionDetails>());
   }
 
   void catchCallback(v8::Local<v8::Value> result) {
@@ -228,14 +269,12 @@ class InjectedScript::ProtocolPromiseHandler {
     InjectedScript::ContextScope scope(session, m_executionContextId);
     Response response = scope.initialize();
     if (!response.IsSuccess()) return;
-    std::unique_ptr<EvaluateCallback> callback =
-        scope.injectedScript()->takeEvaluateCallback(m_callback);
-    if (!callback) return;
     std::unique_ptr<protocol::Runtime::RemoteObject> wrappedValue;
     response = scope.injectedScript()->wrapObject(result, m_objectGroup,
                                                   m_wrapMode, &wrappedValue);
     if (!response.IsSuccess()) {
-      callback->sendFailure(response);
+      EvaluateCallback::sendFailure(m_callback, scope.injectedScript(),
+                                    response);
       return;
     }
     v8::Isolate* isolate = session->inspector()->isolate();
@@ -258,12 +297,14 @@ class InjectedScript::ProtocolPromiseHandler {
       response = scope.injectedScript()->createExceptionDetails(
           message, exception, m_objectGroup, &exceptionDetails);
       if (!response.IsSuccess()) {
-        callback->sendFailure(response);
+        EvaluateCallback::sendFailure(m_callback, scope.injectedScript(),
+                                      response);
         return;
       }
 
-      callback->sendSuccess(std::move(wrappedValue),
-                            std::move(exceptionDetails));
+      EvaluateCallback::sendSuccess(m_callback, scope.injectedScript(),
+                                    std::move(wrappedValue),
+                                    std::move(exceptionDetails));
       return;
     }
 
@@ -304,7 +345,8 @@ class InjectedScript::ProtocolPromiseHandler {
     response = scope.injectedScript()->addExceptionToDetails(
         result, exceptionDetails.get(), m_objectGroup);
     if (!response.IsSuccess()) {
-      callback->sendFailure(response);
+      EvaluateCallback::sendFailure(m_callback, scope.injectedScript(),
+                                    response);
       return;
     }
     if (stack)
@@ -313,7 +355,9 @@ class InjectedScript::ProtocolPromiseHandler {
     if (stack && !stack->isEmpty())
       exceptionDetails->setScriptId(
           String16::fromInteger(stack->topScriptId()));
-    callback->sendSuccess(std::move(wrappedValue), std::move(exceptionDetails));
+    EvaluateCallback::sendSuccess(m_callback, scope.injectedScript(),
+                                  std::move(wrappedValue),
+                                  std::move(exceptionDetails));
   }
 
   void sendPromiseCollected() {
@@ -323,10 +367,9 @@ class InjectedScript::ProtocolPromiseHandler {
     InjectedScript::ContextScope scope(session, m_executionContextId);
     Response response = scope.initialize();
     if (!response.IsSuccess()) return;
-    std::unique_ptr<EvaluateCallback> callback =
-        scope.injectedScript()->takeEvaluateCallback(m_callback);
-    if (!callback) return;
-    callback->sendFailure(Response::ServerError("Promise was collected"));
+    EvaluateCallback::sendFailure(
+        m_callback, scope.injectedScript(),
+        Response::ServerError("Promise was collected"));
   }
 
   V8InspectorImpl* m_inspector;
@@ -337,7 +380,7 @@ class InjectedScript::ProtocolPromiseHandler {
   WrapMode m_wrapMode;
   bool m_replMode;
   bool m_throwOnSideEffect;
-  EvaluateCallback* m_callback;
+  std::weak_ptr<EvaluateCallback> m_callback;
   v8::Global<v8::External> m_wrapper;
   v8::Global<v8::Promise> m_evaluationResult;
 };
@@ -655,37 +698,46 @@ std::unique_ptr<protocol::Runtime::RemoteObject> InjectedScript::wrapTable(
 void InjectedScript::addPromiseCallback(
     V8InspectorSessionImpl* session, v8::MaybeLocal<v8::Value> value,
     const String16& objectGroup, WrapMode wrapMode, bool replMode,
-    bool throwOnSideEffect, std::unique_ptr<EvaluateCallback> callback) {
+    bool throwOnSideEffect, std::shared_ptr<EvaluateCallback> callback) {
+  m_evaluateCallbacks.insert(callback);
+  // After stashing the shared_ptr in `m_evaluateCallback`, we reset `callback`.
+  // `ProtocolPromiseHandler:add` can take longer than the life time of this
+  // `InjectedScript` and we don't want `callback` to survive that.
+  std::weak_ptr<EvaluateCallback> weak_callback = callback;
+  callback.reset();
+  CHECK_EQ(weak_callback.use_count(), 1);
+
   if (value.IsEmpty()) {
-    callback->sendFailure(Response::InternalError());
+    EvaluateCallback::sendFailure(weak_callback, this,
+                                  Response::InternalError());
     return;
   }
+
   v8::MicrotasksScope microtasksScope(m_context->isolate(),
                                       v8::MicrotasksScope::kRunMicrotasks);
-  if (ProtocolPromiseHandler::add(
-          session, m_context->context(), value.ToLocalChecked(),
-          m_context->contextId(), objectGroup, wrapMode, replMode,
-          throwOnSideEffect, callback.get())) {
-    m_evaluateCallbacks.insert(callback.release());
-  }
+  ProtocolPromiseHandler::add(session, m_context->context(),
+                              value.ToLocalChecked(), m_context->contextId(),
+                              objectGroup, wrapMode, replMode,
+                              throwOnSideEffect, weak_callback);
+  // Do not add any code here! `this` might be invalid.
+  // `ProtocolPromiseHandler::add` calls into JS which could kill this
+  // `InjectedScript`.
 }
 
 void InjectedScript::discardEvaluateCallbacks() {
-  for (auto& callback : m_evaluateCallbacks) {
-    callback->sendFailure(
+  while (!m_evaluateCallbacks.empty()) {
+    EvaluateCallback::sendFailure(
+        *m_evaluateCallbacks.begin(), this,
         Response::ServerError("Execution context was destroyed."));
-    delete callback;
   }
-  m_evaluateCallbacks.clear();
+  CHECK(m_evaluateCallbacks.empty());
 }
 
-std::unique_ptr<EvaluateCallback> InjectedScript::takeEvaluateCallback(
-    EvaluateCallback* callback) {
+void InjectedScript::deleteEvaluateCallback(
+    std::shared_ptr<EvaluateCallback> callback) {
   auto it = m_evaluateCallbacks.find(callback);
-  if (it == m_evaluateCallbacks.end()) return nullptr;
-  std::unique_ptr<EvaluateCallback> value(*it);
+  CHECK_NE(it, m_evaluateCallbacks.end());
   m_evaluateCallbacks.erase(it);
-  return value;
 }
 
 Response InjectedScript::findObject(const RemoteObjectId& objectId,
diff --git a/deps/v8/src/inspector/injected-script.h b/deps/v8/src/inspector/injected-script.h
index fd14bb40fbf65d..4f5bbf2823386f 100644
--- a/deps/v8/src/inspector/injected-script.h
+++ b/deps/v8/src/inspector/injected-script.h
@@ -58,12 +58,22 @@ using protocol::Response;
 
 class EvaluateCallback {
  public:
+  static void sendSuccess(
+      std::weak_ptr<EvaluateCallback> callback, InjectedScript* injectedScript,
+      std::unique_ptr<protocol::Runtime::RemoteObject> result,
+      protocol::Maybe<protocol::Runtime::ExceptionDetails> exceptionDetails);
+  static void sendFailure(std::weak_ptr<EvaluateCallback> callback,
+                          InjectedScript* injectedScript,
+                          const protocol::DispatchResponse& response);
+
+  virtual ~EvaluateCallback() = default;
+
+ private:
   virtual void sendSuccess(
       std::unique_ptr<protocol::Runtime::RemoteObject> result,
       protocol::Maybe<protocol::Runtime::ExceptionDetails>
           exceptionDetails) = 0;
   virtual void sendFailure(const protocol::DispatchResponse& response) = 0;
-  virtual ~EvaluateCallback() = default;
 };
 
 class InjectedScript final {
@@ -114,7 +124,7 @@ class InjectedScript final {
                           v8::MaybeLocal<v8::Value> value,
                           const String16& objectGroup, WrapMode wrapMode,
                           bool replMode, bool throwOnSideEffect,
-                          std::unique_ptr<EvaluateCallback> callback);
+                          std::shared_ptr<EvaluateCallback> callback);
 
   Response findObject(const RemoteObjectId&, v8::Local<v8::Value>*) const;
   String16 objectGroupName(const RemoteObjectId&) const;
@@ -221,6 +231,8 @@ class InjectedScript final {
   String16 bindObject(v8::Local<v8::Value>, const String16& groupName);
 
  private:
+  friend class EvaluateCallback;
+
   v8::Local<v8::Object> commandLineAPI();
   void unbindObject(int id);
 
@@ -230,8 +242,7 @@ class InjectedScript final {
 
   class ProtocolPromiseHandler;
   void discardEvaluateCallbacks();
-  std::unique_ptr<EvaluateCallback> takeEvaluateCallback(
-      EvaluateCallback* callback);
+  void deleteEvaluateCallback(std::shared_ptr<EvaluateCallback> callback);
   Response addExceptionToDetails(
       v8::Local<v8::Value> exception,
       protocol::Runtime::ExceptionDetails* exceptionDetails,
@@ -245,7 +256,7 @@ class InjectedScript final {
   std::unordered_map<int, v8::Global<v8::Value>> m_idToWrappedObject;
   std::unordered_map<int, String16> m_idToObjectGroupName;
   std::unordered_map<String16, std::vector<int>> m_nameToObjectGroup;
-  std::unordered_set<EvaluateCallback*> m_evaluateCallbacks;
+  std::unordered_set<std::shared_ptr<EvaluateCallback>> m_evaluateCallbacks;
   bool m_customPreviewEnabled = false;
 };
 
diff --git a/deps/v8/src/inspector/v8-debugger.cc b/deps/v8/src/inspector/v8-debugger.cc
index 01a8ce439c535e..00fc67465a34b2 100644
--- a/deps/v8/src/inspector/v8-debugger.cc
+++ b/deps/v8/src/inspector/v8-debugger.cc
@@ -786,6 +786,11 @@ v8::MaybeLocal<v8::Array> V8Debugger::internalProperties(
                        toV8StringInternalized(m_isolate, "[[Entries]]"));
     createDataProperty(context, properties, properties->Length(), entries);
   }
+
+  if (v8::debug::isExperimentalRemoveInternalScopesPropertyEnabled()) {
+    return properties;
+  }
+
   if (value->IsGeneratorObject()) {
     v8::Local<v8::Value> scopes;
     if (generatorScopes(context, value).ToLocal(&scopes)) {
diff --git a/deps/v8/src/inspector/v8-profiler-agent-impl.cc b/deps/v8/src/inspector/v8-profiler-agent-impl.cc
index be6e8ab85c1b7a..4b9ad7c40a7994 100644
--- a/deps/v8/src/inspector/v8-profiler-agent-impl.cc
+++ b/deps/v8/src/inspector/v8-profiler-agent-impl.cc
@@ -28,7 +28,6 @@ static const char preciseCoverageCallCount[] = "preciseCoverageCallCount";
 static const char preciseCoverageDetailed[] = "preciseCoverageDetailed";
 static const char preciseCoverageAllowTriggeredUpdates[] =
     "preciseCoverageAllowTriggeredUpdates";
-static const char typeProfileStarted[] = "typeProfileStarted";
 }  // namespace ProfilerAgentState
 
 namespace {
@@ -450,80 +449,6 @@ Response V8ProfilerAgentImpl::getBestEffortCoverage(
   return coverageToProtocol(m_session->inspector(), coverage, out_result);
 }
 
-namespace {
-std::unique_ptr<protocol::Array<protocol::Profiler::ScriptTypeProfile>>
-typeProfileToProtocol(V8InspectorImpl* inspector,
-                      const v8::debug::TypeProfile& type_profile) {
-  auto result = std::make_unique<
-      protocol::Array<protocol::Profiler::ScriptTypeProfile>>();
-  v8::Isolate* isolate = inspector->isolate();
-  for (size_t i = 0; i < type_profile.ScriptCount(); i++) {
-    v8::debug::TypeProfile::ScriptData script_data =
-        type_profile.GetScriptData(i);
-    v8::Local<v8::debug::Script> script = script_data.GetScript();
-    auto entries = std::make_unique<
-        protocol::Array<protocol::Profiler::TypeProfileEntry>>();
-
-    for (const auto& entry : script_data.Entries()) {
-      auto types =
-          std::make_unique<protocol::Array<protocol::Profiler::TypeObject>>();
-      for (const auto& type : entry.Types()) {
-        types->emplace_back(
-            protocol::Profiler::TypeObject::create()
-                .setName(toProtocolString(
-                    isolate, type.FromMaybe(v8::Local<v8::String>())))
-                .build());
-      }
-      entries->emplace_back(protocol::Profiler::TypeProfileEntry::create()
-                                .setOffset(entry.SourcePosition())
-                                .setTypes(std::move(types))
-                                .build());
-    }
-    String16 url;
-    v8::Local<v8::String> name;
-    if (script->SourceURL().ToLocal(&name) && name->Length()) {
-      url = toProtocolString(isolate, name);
-    } else if (script->Name().ToLocal(&name) && name->Length()) {
-      url = resourceNameToUrl(inspector, name);
-    }
-    result->emplace_back(protocol::Profiler::ScriptTypeProfile::create()
-                             .setScriptId(String16::fromInteger(script->Id()))
-                             .setUrl(url)
-                             .setEntries(std::move(entries))
-                             .build());
-  }
-  return result;
-}
-}  // anonymous namespace
-
-Response V8ProfilerAgentImpl::startTypeProfile() {
-  m_state->setBoolean(ProfilerAgentState::typeProfileStarted, true);
-  v8::debug::TypeProfile::SelectMode(m_isolate,
-                                     v8::debug::TypeProfileMode::kCollect);
-  return Response::Success();
-}
-
-Response V8ProfilerAgentImpl::stopTypeProfile() {
-  m_state->setBoolean(ProfilerAgentState::typeProfileStarted, false);
-  v8::debug::TypeProfile::SelectMode(m_isolate,
-                                     v8::debug::TypeProfileMode::kNone);
-  return Response::Success();
-}
-
-Response V8ProfilerAgentImpl::takeTypeProfile(
-    std::unique_ptr<protocol::Array<protocol::Profiler::ScriptTypeProfile>>*
-        out_result) {
-  if (!m_state->booleanProperty(ProfilerAgentState::typeProfileStarted,
-                                false)) {
-    return Response::ServerError("Type profile has not been started.");
-  }
-  v8::HandleScope handle_scope(m_isolate);
-  v8::debug::TypeProfile type_profile =
-      v8::debug::TypeProfile::Collect(m_isolate);
-  *out_result = typeProfileToProtocol(m_session->inspector(), type_profile);
-  return Response::Success();
-}
-
 String16 V8ProfilerAgentImpl::nextProfileId() {
   return String16::fromInteger(
       v8::base::Relaxed_AtomicIncrement(&s_lastProfileId, 1));
diff --git a/deps/v8/src/inspector/v8-profiler-agent-impl.h b/deps/v8/src/inspector/v8-profiler-agent-impl.h
index 4fba6e6c704d69..6e76ff57ff9b9d 100644
--- a/deps/v8/src/inspector/v8-profiler-agent-impl.h
+++ b/deps/v8/src/inspector/v8-profiler-agent-impl.h
@@ -53,12 +53,6 @@ class V8ProfilerAgentImpl : public protocol::Profiler::Backend {
       std::unique_ptr<protocol::Array<protocol::Profiler::ScriptCoverage>>*
           out_result) override;
 
-  Response startTypeProfile() override;
-  Response stopTypeProfile() override;
-  Response takeTypeProfile(
-      std::unique_ptr<protocol::Array<protocol::Profiler::ScriptTypeProfile>>*
-          out_result) override;
-
   void consoleProfile(const String16& title);
   void consoleProfileEnd(const String16& title);
 
diff --git a/deps/v8/src/inspector/v8-runtime-agent-impl.cc b/deps/v8/src/inspector/v8-runtime-agent-impl.cc
index a598af680a20d4..d695d018e1b5a1 100644
--- a/deps/v8/src/inspector/v8-runtime-agent-impl.cc
+++ b/deps/v8/src/inspector/v8-runtime-agent-impl.cc
@@ -70,9 +70,9 @@ namespace {
 template <typename ProtocolCallback>
 class EvaluateCallbackWrapper : public EvaluateCallback {
  public:
-  static std::unique_ptr<EvaluateCallback> wrap(
+  static std::shared_ptr<EvaluateCallback> wrap(
       std::unique_ptr<ProtocolCallback> callback) {
-    return std::unique_ptr<EvaluateCallback>(
+    return std::shared_ptr<EvaluateCallback>(
         new EvaluateCallbackWrapper(std::move(callback)));
   }
   void sendSuccess(std::unique_ptr<protocol::Runtime::RemoteObject> result,
diff --git a/deps/v8/src/inspector/v8-webdriver-serializer.cc b/deps/v8/src/inspector/v8-webdriver-serializer.cc
index f29c56f2aa5371..bf68a4cdb30b5d 100644
--- a/deps/v8/src/inspector/v8-webdriver-serializer.cc
+++ b/deps/v8/src/inspector/v8-webdriver-serializer.cc
@@ -56,6 +56,9 @@ String16 _descriptionForRegExpFlags(v8::Local<v8::RegExp> value) {
   if (flags & v8::RegExp::Flags::kMultiline) result_string_builder.append('m');
   if (flags & v8::RegExp::Flags::kDotAll) result_string_builder.append('s');
   if (flags & v8::RegExp::Flags::kUnicode) result_string_builder.append('u');
+  if (flags & v8::RegExp::Flags::kUnicodeSets) {
+    result_string_builder.append('v');
+  }
   if (flags & v8::RegExp::Flags::kSticky) result_string_builder.append('y');
   return result_string_builder.toString();
 }
diff --git a/deps/v8/src/inspector/value-mirror.cc b/deps/v8/src/inspector/value-mirror.cc
index f13463b9fb3ac8..59369cac651ba6 100644
--- a/deps/v8/src/inspector/value-mirror.cc
+++ b/deps/v8/src/inspector/value-mirror.cc
@@ -243,6 +243,7 @@ String16 descriptionForRegExp(v8::Isolate* isolate,
   if (flags & v8::RegExp::Flags::kMultiline) description.append('m');
   if (flags & v8::RegExp::Flags::kDotAll) description.append('s');
   if (flags & v8::RegExp::Flags::kUnicode) description.append('u');
+  if (flags & v8::RegExp::Flags::kUnicodeSets) description.append('v');
   if (flags & v8::RegExp::Flags::kSticky) description.append('y');
   return description.toString();
 }
@@ -651,6 +652,18 @@ class SymbolMirror final : public ValueMirror {
                    .build();
   }
 
+  void buildEntryPreview(
+      v8::Local<v8::Context> context, int* nameLimit, int* indexLimit,
+      std::unique_ptr<ObjectPreview>* preview) const override {
+    *preview =
+        ObjectPreview::create()
+            .setType(RemoteObject::TypeEnum::Symbol)
+            .setDescription(descriptionForSymbol(context, m_symbol))
+            .setOverflow(false)
+            .setProperties(std::make_unique<protocol::Array<PropertyPreview>>())
+            .build();
+  }
+
   v8::Local<v8::Value> v8Value() const override { return m_symbol; }
 
   std::unique_ptr<protocol::Runtime::WebDriverValue> buildWebDriverValue(
diff --git a/deps/v8/src/interpreter/bytecode-array-builder.cc b/deps/v8/src/interpreter/bytecode-array-builder.cc
index 1548986e0ed70a..784d88a9a8f327 100644
--- a/deps/v8/src/interpreter/bytecode-array-builder.cc
+++ b/deps/v8/src/interpreter/bytecode-array-builder.cc
@@ -58,7 +58,7 @@ BytecodeArrayBuilder::BytecodeArrayBuilder(
   DCHECK_GE(parameter_count_, 0);
   DCHECK_GE(local_register_count_, 0);
 
-  if (FLAG_ignition_reo) {
+  if (v8_flags.ignition_reo) {
     register_optimizer_ = zone->New<BytecodeRegisterOptimizer>(
         zone, &register_allocator_, fixed_register_count(), parameter_count,
         zone->New<RegisterTransferWriter>(this));
@@ -138,7 +138,7 @@ BytecodeSourceInfo BytecodeArrayBuilder::CurrentSourcePosition(
     // throw (if expression position filtering is turned on). We only
     // invalidate the existing source position information if it is used.
     if (latest_source_info_.is_statement() ||
-        !FLAG_ignition_filter_expression_positions ||
+        !v8_flags.ignition_filter_expression_positions ||
         !Bytecodes::IsWithoutExternalSideEffects(bytecode)) {
       source_position = latest_source_info_;
       latest_source_info_.set_invalid();
@@ -526,9 +526,10 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::GetSuperConstructor(Register out) {
   return *this;
 }
 
-BytecodeArrayBuilder& BytecodeArrayBuilder::FindNonDefaultConstructor(
+BytecodeArrayBuilder&
+BytecodeArrayBuilder::FindNonDefaultConstructorOrConstruct(
     Register this_function, Register new_target, RegisterList output) {
-  OutputFindNonDefaultConstructor(this_function, new_target, output);
+  OutputFindNonDefaultConstructorOrConstruct(this_function, new_target, output);
   return *this;
 }
 
@@ -880,11 +881,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::DefineKeyedOwnPropertyInLiteral(
   return *this;
 }
 
-BytecodeArrayBuilder& BytecodeArrayBuilder::CollectTypeProfile(int position) {
-  OutputCollectTypeProfile(position);
-  return *this;
-}
-
 BytecodeArrayBuilder& BytecodeArrayBuilder::SetNamedProperty(
     Register object, size_t name_index, int feedback_slot,
     LanguageMode language_mode) {
diff --git a/deps/v8/src/interpreter/bytecode-array-builder.h b/deps/v8/src/interpreter/bytecode-array-builder.h
index 9fb13b8cf34929..a9d21998405b39 100644
--- a/deps/v8/src/interpreter/bytecode-array-builder.h
+++ b/deps/v8/src/interpreter/bytecode-array-builder.h
@@ -158,10 +158,6 @@ class V8_EXPORT_PRIVATE BytecodeArrayBuilder final {
       Register object, Register name,
       DefineKeyedOwnPropertyInLiteralFlags flags, int feedback_slot);
 
-  // Collect type information for developer tools. The value for which we
-  // record the type is stored in the accumulator.
-  BytecodeArrayBuilder& CollectTypeProfile(int position);
-
   // Set a property named by a property name, trigger the setters and
   // set traps if necessary. The value to be set should be in the
   // accumulator.
@@ -386,9 +382,8 @@ class V8_EXPORT_PRIVATE BytecodeArrayBuilder final {
   // throws a TypeError exception.
   BytecodeArrayBuilder& GetSuperConstructor(Register out);
 
-  BytecodeArrayBuilder& FindNonDefaultConstructor(Register this_function,
-                                                  Register new_target,
-                                                  RegisterList output);
+  BytecodeArrayBuilder& FindNonDefaultConstructorOrConstruct(
+      Register this_function, Register new_target, RegisterList output);
 
   // Deletes property from an object. This expects that accumulator contains
   // the key to be deleted and the register contains a reference to the object.
diff --git a/deps/v8/src/interpreter/bytecode-array-writer.cc b/deps/v8/src/interpreter/bytecode-array-writer.cc
index 06c9e6537248ca..6962891133e35e 100644
--- a/deps/v8/src/interpreter/bytecode-array-writer.cc
+++ b/deps/v8/src/interpreter/bytecode-array-writer.cc
@@ -31,7 +31,8 @@ BytecodeArrayWriter::BytecodeArrayWriter(
       last_bytecode_(Bytecode::kIllegal),
       last_bytecode_offset_(0),
       last_bytecode_had_source_info_(false),
-      elide_noneffectful_bytecodes_(FLAG_ignition_elide_noneffectful_bytecodes),
+      elide_noneffectful_bytecodes_(
+          v8_flags.ignition_elide_noneffectful_bytecodes),
       exit_seen_in_block_(false) {
   bytecodes_.reserve(512);  // Derived via experimentation.
 }
diff --git a/deps/v8/src/interpreter/bytecode-generator.cc b/deps/v8/src/interpreter/bytecode-generator.cc
index c027fb8b0721f4..706d897d8a760f 100644
--- a/deps/v8/src/interpreter/bytecode-generator.cc
+++ b/deps/v8/src/interpreter/bytecode-generator.cc
@@ -1213,7 +1213,7 @@ Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(
     Handle<CoverageInfo> coverage_info =
         isolate->factory()->NewCoverageInfo(block_coverage_builder_->slots());
     info()->set_coverage_info(coverage_info);
-    if (FLAG_trace_block_coverage) {
+    if (v8_flags.trace_block_coverage) {
       StdoutStream os;
       coverage_info->CoverageInfoPrint(os, info()->literal()->GetDebugName());
     }
@@ -1421,18 +1421,7 @@ void BytecodeGenerator::GenerateBytecodeBody() {
   }
 
   // Emit tracing call if requested to do so.
-  if (FLAG_trace) builder()->CallRuntime(Runtime::kTraceEnter);
-
-  // Emit type profile call.
-  if (info()->flags().collect_type_profile()) {
-    feedback_spec()->AddTypeProfileSlot();
-    int num_parameters = closure_scope()->num_parameters();
-    for (int i = 0; i < num_parameters; i++) {
-      Register parameter(builder()->Parameter(i));
-      builder()->LoadAccumulatorWithRegister(parameter).CollectTypeProfile(
-          closure_scope()->parameter(i)->initializer_position());
-    }
-  }
+  if (v8_flags.trace) builder()->CallRuntime(Runtime::kTraceEnter);
 
   // Increment the function-scope block coverage counter.
   BuildIncrementBlockCoverageCounterIfEnabled(literal, SourceRangeKind::kBody);
@@ -1831,7 +1820,7 @@ inline int ReduceToSmiSwitchCaseValue(Expression* expr) {
 
 // Is the range of Smi's small enough relative to number of cases?
 inline bool IsSpreadAcceptable(int spread, int ncases) {
-  return spread < FLAG_switch_table_spread_threshold * ncases;
+  return spread < v8_flags.switch_table_spread_threshold * ncases;
 }
 
 struct SwitchInfo {
@@ -1894,7 +1883,7 @@ bool IsSwitchOptimizable(SwitchStatement* stmt, SwitchInfo* info) {
 
   // GCC also jump-table optimizes switch statements with 6 cases or more.
   if (static_cast<int>(info->covered_cases.size()) >=
-      FLAG_switch_table_min_cases) {
+      v8_flags.switch_table_min_cases) {
     // Due to case spread will be used as the size of jump-table,
     // we need to check if it doesn't overflow by casting its
     // min and max bounds to int64_t, and calculate if the difference is less
@@ -3484,8 +3473,7 @@ void BytecodeGenerator::BuildCreateArrayLiteral(
     Expression* subexpr = *current;
     if (subexpr->IsSpread()) {
       RegisterAllocationScope scope(this);
-      builder()->SetExpressionAsStatementPosition(
-          subexpr->AsSpread()->expression());
+      builder()->SetExpressionPosition(subexpr->AsSpread()->expression());
       VisitForAccumulatorValue(subexpr->AsSpread()->expression());
       builder()->SetExpressionPosition(subexpr->AsSpread()->expression());
       IteratorRecord iterator = BuildGetIteratorRecord(IteratorType::kNormal);
@@ -3680,16 +3668,13 @@ void BytecodeGenerator::BuildVariableLoadForAccumulatorValue(
 }
 
 void BytecodeGenerator::BuildReturn(int source_position) {
-  if (FLAG_trace) {
+  if (v8_flags.trace) {
     RegisterAllocationScope register_scope(this);
     Register result = register_allocator()->NewRegister();
     // Runtime returns {result} value, preserving accumulator.
     builder()->StoreAccumulatorInRegister(result).CallRuntime(
         Runtime::kTraceExit, result);
   }
-  if (info()->flags().collect_type_profile()) {
-    builder()->CollectTypeProfile(info()->literal()->return_position());
-  }
   builder()->SetStatementPosition(source_position);
   builder()->Return();
 }
@@ -4216,9 +4201,7 @@ void BytecodeGenerator::BuildDestructuringArrayAssignment(
           }
 
           Expression* default_value = GetDestructuringDefaultValue(&target);
-          if (!target->IsPattern()) {
-            builder()->SetExpressionAsStatementPosition(target);
-          }
+          builder()->SetExpressionPosition(target);
 
           AssignmentLhsData lhs_data = PrepareAssignmentLhs(target);
 
@@ -4292,10 +4275,7 @@ void BytecodeGenerator::BuildDestructuringArrayAssignment(
 
           // A spread is turned into a loop over the remainer of the iterator.
           Expression* target = spread->expression();
-
-          if (!target->IsPattern()) {
-            builder()->SetExpressionAsStatementPosition(spread);
-          }
+          builder()->SetExpressionPosition(spread);
 
           AssignmentLhsData lhs_data = PrepareAssignmentLhs(target);
 
@@ -4418,10 +4398,7 @@ void BytecodeGenerator::BuildDestructuringObjectAssignment(
     Expression* pattern_key = pattern_property->key();
     Expression* target = pattern_property->value();
     Expression* default_value = GetDestructuringDefaultValue(&target);
-
-    if (!target->IsPattern()) {
-      builder()->SetExpressionAsStatementPosition(target);
-    }
+    builder()->SetExpressionPosition(target);
 
     // Calculate this property's key into the assignment RHS value, additionally
     // storing the key for rest_runtime_callargs if needed.
@@ -4723,8 +4700,11 @@ void BytecodeGenerator::VisitYield(Yield* expr) {
   if (suspend_count_ > 0) {
     if (IsAsyncGeneratorFunction(function_kind())) {
       // AsyncGenerator yields (with the exception of the initial yield)
-      // delegate work to the AsyncGeneratorYield stub, which Awaits the operand
-      // and on success, wraps the value in an IteratorResult.
+      // delegate work to the AsyncGeneratorYieldWithAwait stub, which Awaits
+      // the operand and on success, wraps the value in an IteratorResult.
+      //
+      // In the spec the Await is a separate operation, but they are combined
+      // here to reduce bytecode size.
       RegisterAllocationScope register_scope(this);
       RegisterList args = register_allocator()->NewRegisterList(3);
       builder()
@@ -4732,7 +4712,7 @@ void BytecodeGenerator::VisitYield(Yield* expr) {
           .StoreAccumulatorInRegister(args[1])         // value
           .LoadBoolean(catch_prediction() != HandlerTable::ASYNC_AWAIT)
           .StoreAccumulatorInRegister(args[2])  // is_caught
-          .CallRuntime(Runtime::kInlineAsyncGeneratorYield, args);
+          .CallRuntime(Runtime::kInlineAsyncGeneratorYieldWithAwait, args);
     } else {
       // Generator yields (with the exception of the initial yield) wrap the
       // value into IteratorResult.
@@ -4849,9 +4829,8 @@ void BytecodeGenerator::VisitYield(Yield* expr) {
 //       // From the generator to its user:
 //       // Forward output, receive new input, and determine resume mode.
 //       if (IS_ASYNC_GENERATOR) {
-//         // AsyncGeneratorYield abstract operation awaits the operand before
-//         // resolving the promise for the current AsyncGeneratorRequest.
-//         %_AsyncGeneratorYield(output.value)
+//         // Resolve the promise for the current AsyncGeneratorRequest.
+//         %_AsyncGeneratorResolve(output.value, /* done = */ false)
 //       }
 //       input = Suspend(output);
 //       resumeMode = %GeneratorGetResumeMode();
@@ -4986,9 +4965,10 @@ void BytecodeGenerator::VisitYieldStar(YieldStar* expr) {
       } else {
         RegisterAllocationScope inner_register_scope(this);
         DCHECK_EQ(iterator_type, IteratorType::kAsync);
-        // If generatorKind is async, perform AsyncGeneratorYield(output.value),
-        // which will await `output.value` before resolving the current
-        // AsyncGeneratorRequest's promise.
+        // If generatorKind is async, perform
+        // AsyncGeneratorResolve(output.value, /* done = */ false), which will
+        // resolve the current AsyncGeneratorRequest's promise with
+        // output.value.
         builder()->LoadNamedProperty(
             output, ast_string_constants()->value_string(),
             feedback_index(feedback_spec()->AddLoadICSlot()));
@@ -4997,9 +4977,9 @@ void BytecodeGenerator::VisitYieldStar(YieldStar* expr) {
         builder()
             ->MoveRegister(generator_object(), args[0])  // generator
             .StoreAccumulatorInRegister(args[1])         // value
-            .LoadBoolean(catch_prediction() != HandlerTable::ASYNC_AWAIT)
-            .StoreAccumulatorInRegister(args[2])  // is_caught
-            .CallRuntime(Runtime::kInlineAsyncGeneratorYield, args);
+            .LoadFalse()
+            .StoreAccumulatorInRegister(args[2])  // done
+            .CallRuntime(Runtime::kInlineAsyncGeneratorResolve, args);
       }
 
       BuildSuspendPoint(expr->position());
@@ -5322,7 +5302,7 @@ void BytecodeGenerator::VisitPropertyLoadForRegister(Register obj,
 void BytecodeGenerator::VisitNamedSuperPropertyLoad(Property* property,
                                                     Register opt_receiver_out) {
   RegisterAllocationScope register_scope(this);
-  if (FLAG_super_ic) {
+  if (v8_flags.super_ic) {
     Register receiver = register_allocator()->NewRegister();
     BuildThisVariableLoad();
     builder()->StoreAccumulatorInRegister(receiver);
@@ -5650,12 +5630,12 @@ void BytecodeGenerator::VisitCallSuper(Call* expr) {
   Register this_function = VisitForRegisterValue(super->this_function_var());
   // This register will initially hold the constructor, then afterward it will
   // hold the instance -- the lifetimes of the two don't need to overlap, and
-  // this way FindNonDefaultConstructor can choose to write either the instance
-  // or the constructor into the same register.
+  // this way FindNonDefaultConstructorOrConstruct can choose to write either
+  // the instance or the constructor into the same register.
   Register constructor_then_instance = register_allocator()->NewRegister();
 
   BytecodeLabel super_ctor_call_done;
-  bool omit_super_ctor = FLAG_omit_default_ctors &&
+  bool omit_super_ctor = v8_flags.omit_default_ctors &&
                          IsDerivedConstructor(info()->literal()->kind());
 
   if (spread_position == Call::kHasNonFinalSpread) {
@@ -5790,9 +5770,10 @@ void BytecodeGenerator::VisitCallSuper(Call* expr) {
 void BytecodeGenerator::BuildSuperCallOptimization(
     Register this_function, Register new_target,
     Register constructor_then_instance, BytecodeLabel* super_ctor_call_done) {
-  DCHECK(FLAG_omit_default_ctors);
+  DCHECK(v8_flags.omit_default_ctors);
   RegisterList output = register_allocator()->NewRegisterList(2);
-  builder()->FindNonDefaultConstructor(this_function, new_target, output);
+  builder()->FindNonDefaultConstructorOrConstruct(this_function, new_target,
+                                                  output);
   builder()->MoveRegister(output[1], constructor_then_instance);
   builder()->LoadAccumulatorWithRegister(output[0]).JumpIfTrue(
       ToBooleanMode::kAlreadyBoolean, super_ctor_call_done);
@@ -6618,6 +6599,7 @@ void BytecodeGenerator::VisitSuperPropertyReference(
 
 void BytecodeGenerator::VisitCommaExpression(BinaryOperation* binop) {
   VisitForEffect(binop->left());
+  builder()->SetExpressionAsStatementPosition(binop->right());
   Visit(binop->right());
 }
 
@@ -6626,8 +6608,11 @@ void BytecodeGenerator::VisitNaryCommaExpression(NaryOperation* expr) {
 
   VisitForEffect(expr->first());
   for (size_t i = 0; i < expr->subsequent_length() - 1; ++i) {
+    builder()->SetExpressionAsStatementPosition(expr->subsequent(i));
     VisitForEffect(expr->subsequent(i));
   }
+  builder()->SetExpressionAsStatementPosition(
+      expr->subsequent(expr->subsequent_length() - 1));
   Visit(expr->subsequent(expr->subsequent_length() - 1));
 }
 
@@ -7347,7 +7332,7 @@ FeedbackSlot BytecodeGenerator::GetCachedStoreGlobalICSlot(
 FeedbackSlot BytecodeGenerator::GetCachedLoadICSlot(const Expression* expr,
                                                     const AstRawString* name) {
   DCHECK(!expr->IsSuperPropertyReference());
-  if (!FLAG_ignition_share_named_property_feedback) {
+  if (!v8_flags.ignition_share_named_property_feedback) {
     return feedback_spec()->AddLoadICSlot();
   }
   FeedbackSlotCache::SlotKind slot_kind =
@@ -7369,7 +7354,7 @@ FeedbackSlot BytecodeGenerator::GetCachedLoadICSlot(const Expression* expr,
 
 FeedbackSlot BytecodeGenerator::GetCachedLoadSuperICSlot(
     const AstRawString* name) {
-  if (!FLAG_ignition_share_named_property_feedback) {
+  if (!v8_flags.ignition_share_named_property_feedback) {
     return feedback_spec()->AddLoadICSlot();
   }
   FeedbackSlotCache::SlotKind slot_kind =
@@ -7386,7 +7371,7 @@ FeedbackSlot BytecodeGenerator::GetCachedLoadSuperICSlot(
 
 FeedbackSlot BytecodeGenerator::GetCachedStoreICSlot(const Expression* expr,
                                                      const AstRawString* name) {
-  if (!FLAG_ignition_share_named_property_feedback) {
+  if (!v8_flags.ignition_share_named_property_feedback) {
     return feedback_spec()->AddStoreICSlot(language_mode());
   }
   FeedbackSlotCache::SlotKind slot_kind =
diff --git a/deps/v8/src/interpreter/bytecodes.h b/deps/v8/src/interpreter/bytecodes.h
index bb0dafe16d9d9a..3919daeb20312e 100644
--- a/deps/v8/src/interpreter/bytecodes.h
+++ b/deps/v8/src/interpreter/bytecodes.h
@@ -157,8 +157,6 @@ namespace interpreter {
   V(DefineKeyedOwnPropertyInLiteral, ImplicitRegisterUse::kReadAccumulator,    \
     OperandType::kReg, OperandType::kReg, OperandType::kFlag8,                 \
     OperandType::kIdx)                                                         \
-  V(CollectTypeProfile, ImplicitRegisterUse::kReadAccumulator,                 \
-    OperandType::kImm)                                                         \
                                                                                \
   /* Binary Operators */                                                       \
   V(Add, ImplicitRegisterUse::kReadWriteAccumulator, OperandType::kReg,        \
@@ -228,8 +226,8 @@ namespace interpreter {
   /* GetSuperConstructor operator */                                           \
   V(GetSuperConstructor, ImplicitRegisterUse::kReadAccumulator,                \
     OperandType::kRegOut)                                                      \
-  V(FindNonDefaultConstructor, ImplicitRegisterUse::kNone, OperandType::kReg,  \
-    OperandType::kReg, OperandType::kRegOutPair)                               \
+  V(FindNonDefaultConstructorOrConstruct, ImplicitRegisterUse::kNone,          \
+    OperandType::kReg, OperandType::kReg, OperandType::kRegOutPair)            \
                                                                                \
   /* Call operations */                                                        \
   V(CallAnyReceiver, ImplicitRegisterUse::kWriteAccumulator,                   \
@@ -611,6 +609,22 @@ class V8_EXPORT_PRIVATE Bytecodes final : public AllStatic {
   // Returns the scaling applied to scalable operands if bytecode is
   // is a scaling prefix.
   static OperandScale PrefixBytecodeToOperandScale(Bytecode bytecode) {
+#ifdef V8_TARGET_OS_ANDROID
+    // The compiler is very smart, turning the switch into branchless code.
+    // However this triggers a CPU bug on some android devices (see
+    // crbug.com/1379788). We therefore intentionally use code the compiler has
+    // a harder time optimizing on Android. At least until clang 15.0 the
+    // current workaround prevents hitting the CPU bug.
+    // TODO(chromium:1379788): Remove this hack if we get an external fix.
+    if (bytecode == Bytecode::kWide || bytecode == Bytecode::kDebugBreakWide) {
+      return OperandScale::kDouble;
+    } else if (bytecode == Bytecode::kExtraWide ||
+               bytecode == Bytecode::kDebugBreakExtraWide) {
+      return OperandScale::kQuadruple;
+    } else {
+      UNREACHABLE();
+    }
+#else
     switch (bytecode) {
       case Bytecode::kExtraWide:
       case Bytecode::kDebugBreakExtraWide:
@@ -621,6 +635,7 @@ class V8_EXPORT_PRIVATE Bytecodes final : public AllStatic {
       default:
         UNREACHABLE();
     }
+#endif
   }
 
   // Returns how accumulator is used by |bytecode|.
diff --git a/deps/v8/src/interpreter/interpreter-assembler.cc b/deps/v8/src/interpreter/interpreter-assembler.cc
index 14e06e2d27d2a1..deca631416832f 100644
--- a/deps/v8/src/interpreter/interpreter-assembler.cc
+++ b/deps/v8/src/interpreter/interpreter-assembler.cc
@@ -1494,7 +1494,7 @@ TNode<FixedArray> InterpreterAssembler::ExportParametersAndRegisterFile(
   TNode<IntPtrT> formal_parameter_count_intptr =
       Signed(ChangeUint32ToWord(formal_parameter_count));
   TNode<UintPtrT> register_count = ChangeUint32ToWord(registers.reg_count());
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     CSA_DCHECK(this, IntPtrEqual(registers.base_reg_location(),
                                  RegisterLocation(Register(0))));
     AbortIfRegisterCountInvalid(array, formal_parameter_count_intptr,
@@ -1566,7 +1566,7 @@ TNode<FixedArray> InterpreterAssembler::ImportRegisterFile(
   TNode<IntPtrT> formal_parameter_count_intptr =
       Signed(ChangeUint32ToWord(formal_parameter_count));
   TNode<UintPtrT> register_count = ChangeUint32ToWord(registers.reg_count());
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     CSA_DCHECK(this, IntPtrEqual(registers.base_reg_location(),
                                  RegisterLocation(Register(0))));
     AbortIfRegisterCountInvalid(array, formal_parameter_count_intptr,
diff --git a/deps/v8/src/interpreter/interpreter-generator.cc b/deps/v8/src/interpreter/interpreter-generator.cc
index 57f2eeae3ccf8e..82f053300c3af4 100644
--- a/deps/v8/src/interpreter/interpreter-generator.cc
+++ b/deps/v8/src/interpreter/interpreter-generator.cc
@@ -743,18 +743,6 @@ IGNITION_HANDLER(DefineKeyedOwnPropertyInLiteral, InterpreterAssembler) {
   Dispatch();
 }
 
-IGNITION_HANDLER(CollectTypeProfile, InterpreterAssembler) {
-  TNode<Smi> position = BytecodeOperandImmSmi(0);
-  TNode<Object> value = GetAccumulator();
-
-  TNode<HeapObject> feedback_vector = LoadFeedbackVector();
-  TNode<Context> context = GetContext();
-
-  CallRuntime(Runtime::kCollectTypeProfile, context, position, value,
-              feedback_vector);
-  Dispatch();
-}
-
 // LdaModuleVariable <cell_index> <depth>
 //
 // Load the contents of a module variable into the accumulator.  The variable is
@@ -2781,14 +2769,14 @@ IGNITION_HANDLER(ThrowIfNotSuperConstructor, InterpreterAssembler) {
   }
 }
 
-// FinNonDefaultConstructor <this_function> <new_target> <output>
+// FindNonDefaultConstructorOrConstruct <this_function> <new_target> <output>
 //
 // Walks the prototype chain from <this_function>'s super ctor until we see a
 // non-default ctor. If the walk ends at a default base ctor, creates an
 // instance and stores it in <output[1]> and stores true into output[0].
 // Otherwise, stores the first non-default ctor into <output[1]> and false into
 // <output[0]>.
-IGNITION_HANDLER(FindNonDefaultConstructor, InterpreterAssembler) {
+IGNITION_HANDLER(FindNonDefaultConstructorOrConstruct, InterpreterAssembler) {
   TNode<Context> context = GetContext();
   TVARIABLE(Object, constructor);
   Label found_default_base_ctor(this, &constructor),
@@ -2796,8 +2784,9 @@ IGNITION_HANDLER(FindNonDefaultConstructor, InterpreterAssembler) {
 
   TNode<JSFunction> this_function = CAST(LoadRegisterAtOperandIndex(0));
 
-  FindNonDefaultConstructor(context, this_function, constructor,
-                            &found_default_base_ctor, &found_something_else);
+  FindNonDefaultConstructorOrConstruct(context, this_function, constructor,
+                                       &found_default_base_ctor,
+                                       &found_something_else);
 
   BIND(&found_default_base_ctor);
   {
@@ -3176,7 +3165,7 @@ Handle<Code> GenerateBytecodeHandler(Isolate* isolate, const char* debug_name,
       &state, options, ProfileDataFromFile::TryRead(debug_name));
 
 #ifdef ENABLE_DISASSEMBLER
-  if (FLAG_trace_ignition_codegen) {
+  if (v8_flags.trace_ignition_codegen) {
     StdoutStream os;
     code->Disassemble(Bytecodes::ToString(bytecode), os, isolate);
     os << std::flush;
diff --git a/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc b/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc
index c211631e1805f1..68b6bdcb850038 100644
--- a/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc
+++ b/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc
@@ -82,7 +82,7 @@ TNode<Object> IntrinsicsGenerator::InvokeIntrinsic(
 #define HANDLE_CASE(name, lower_case, expected_arg_count)            \
   __ BIND(&lower_case);                                              \
   {                                                                  \
-    if (FLAG_debug_code && expected_arg_count >= 0) {                \
+    if (v8_flags.debug_code && expected_arg_count >= 0) {            \
       AbortIfArgCountMismatch(expected_arg_count, args.reg_count()); \
     }                                                                \
     TNode<Object> value = name(args, context, expected_arg_count);   \
@@ -261,11 +261,11 @@ TNode<Object> IntrinsicsGenerator::AsyncGeneratorResolve(
                                 arg_count);
 }
 
-TNode<Object> IntrinsicsGenerator::AsyncGeneratorYield(
+TNode<Object> IntrinsicsGenerator::AsyncGeneratorYieldWithAwait(
     const InterpreterAssembler::RegListNodePair& args, TNode<Context> context,
     int arg_count) {
-  return IntrinsicAsBuiltinCall(args, context, Builtin::kAsyncGeneratorYield,
-                                arg_count);
+  return IntrinsicAsBuiltinCall(
+      args, context, Builtin::kAsyncGeneratorYieldWithAwait, arg_count);
 }
 
 void IntrinsicsGenerator::AbortIfArgCountMismatch(int expected,
diff --git a/deps/v8/src/interpreter/interpreter-intrinsics.h b/deps/v8/src/interpreter/interpreter-intrinsics.h
index 94ff5e88bbbfb5..028e1f40b7c540 100644
--- a/deps/v8/src/interpreter/interpreter-intrinsics.h
+++ b/deps/v8/src/interpreter/interpreter-intrinsics.h
@@ -13,25 +13,25 @@ namespace interpreter {
 
 // List of supported intrisics, with upper case name, lower case name and
 // expected number of arguments (-1 denoting argument count is variable).
-#define INTRINSICS_LIST(V)                                          \
-  V(AsyncFunctionAwaitCaught, async_function_await_caught, 2)       \
-  V(AsyncFunctionAwaitUncaught, async_function_await_uncaught, 2)   \
-  V(AsyncFunctionEnter, async_function_enter, 2)                    \
-  V(AsyncFunctionReject, async_function_reject, 2)                  \
-  V(AsyncFunctionResolve, async_function_resolve, 2)                \
-  V(AsyncGeneratorAwaitCaught, async_generator_await_caught, 2)     \
-  V(AsyncGeneratorAwaitUncaught, async_generator_await_uncaught, 2) \
-  V(AsyncGeneratorReject, async_generator_reject, 2)                \
-  V(AsyncGeneratorResolve, async_generator_resolve, 3)              \
-  V(AsyncGeneratorYield, async_generator_yield, 3)                  \
-  V(CreateJSGeneratorObject, create_js_generator_object, 2)         \
-  V(GeneratorGetResumeMode, generator_get_resume_mode, 1)           \
-  V(GeneratorClose, generator_close, 1)                             \
-  V(GetImportMetaObject, get_import_meta_object, 0)                 \
-  V(CopyDataProperties, copy_data_properties, 2)                    \
-  V(CopyDataPropertiesWithExcludedPropertiesOnStack,                \
-    copy_data_properties_with_excluded_properties_on_stack, -1)     \
-  V(CreateIterResultObject, create_iter_result_object, 2)           \
+#define INTRINSICS_LIST(V)                                             \
+  V(AsyncFunctionAwaitCaught, async_function_await_caught, 2)          \
+  V(AsyncFunctionAwaitUncaught, async_function_await_uncaught, 2)      \
+  V(AsyncFunctionEnter, async_function_enter, 2)                       \
+  V(AsyncFunctionReject, async_function_reject, 2)                     \
+  V(AsyncFunctionResolve, async_function_resolve, 2)                   \
+  V(AsyncGeneratorAwaitCaught, async_generator_await_caught, 2)        \
+  V(AsyncGeneratorAwaitUncaught, async_generator_await_uncaught, 2)    \
+  V(AsyncGeneratorReject, async_generator_reject, 2)                   \
+  V(AsyncGeneratorResolve, async_generator_resolve, 3)                 \
+  V(AsyncGeneratorYieldWithAwait, async_generator_yield_with_await, 3) \
+  V(CreateJSGeneratorObject, create_js_generator_object, 2)            \
+  V(GeneratorGetResumeMode, generator_get_resume_mode, 1)              \
+  V(GeneratorClose, generator_close, 1)                                \
+  V(GetImportMetaObject, get_import_meta_object, 0)                    \
+  V(CopyDataProperties, copy_data_properties, 2)                       \
+  V(CopyDataPropertiesWithExcludedPropertiesOnStack,                   \
+    copy_data_properties_with_excluded_properties_on_stack, -1)        \
+  V(CreateIterResultObject, create_iter_result_object, 2)              \
   V(CreateAsyncFromSyncIterator, create_async_from_sync_iterator, 1)
 
 class IntrinsicsHelper {
diff --git a/deps/v8/src/interpreter/interpreter.cc b/deps/v8/src/interpreter/interpreter.cc
index 6d474ba89dbe80..11c83fa9b58c85 100644
--- a/deps/v8/src/interpreter/interpreter.cc
+++ b/deps/v8/src/interpreter/interpreter.cc
@@ -139,7 +139,7 @@ namespace {
 
 void MaybePrintAst(ParseInfo* parse_info,
                    UnoptimizedCompilationInfo* compilation_info) {
-  if (!FLAG_print_ast) return;
+  if (!v8_flags.print_ast) return;
 
   StdoutStream os;
   std::unique_ptr<char[]> name = compilation_info->literal()->GetDebugName();
@@ -153,15 +153,15 @@ void MaybePrintAst(ParseInfo* parse_info,
 }
 
 bool ShouldPrintBytecode(Handle<SharedFunctionInfo> shared) {
-  if (!FLAG_print_bytecode) return false;
+  if (!v8_flags.print_bytecode) return false;
 
   // Checks whether function passed the filter.
   if (shared->is_toplevel()) {
     base::Vector<const char> filter =
-        base::CStrVector(FLAG_print_bytecode_filter);
+        base::CStrVector(v8_flags.print_bytecode_filter);
     return (filter.length() == 0) || (filter.length() == 1 && filter[0] == '*');
   } else {
-    return shared->PassesFilter(FLAG_print_bytecode_filter);
+    return shared->PassesFilter(v8_flags.print_bytecode_filter);
   }
 }
 
diff --git a/deps/v8/src/json/json-parser.cc b/deps/v8/src/json/json-parser.cc
index c124eedb475996..8d5f563fdf94cf 100644
--- a/deps/v8/src/json/json-parser.cc
+++ b/deps/v8/src/json/json-parser.cc
@@ -122,20 +122,34 @@ static const constexpr uint8_t character_json_scan_flags[256] = {
 }  // namespace
 
 MaybeHandle<Object> JsonParseInternalizer::Internalize(Isolate* isolate,
-                                                       Handle<Object> object,
-                                                       Handle<Object> reviver) {
+                                                       Handle<Object> result,
+                                                       Handle<Object> reviver,
+                                                       Handle<String> source) {
   DCHECK(reviver->IsCallable());
-  JsonParseInternalizer internalizer(isolate,
-                                     Handle<JSReceiver>::cast(reviver));
+  JsonParseInternalizer internalizer(isolate, Handle<JSReceiver>::cast(reviver),
+                                     source);
   Handle<JSObject> holder =
       isolate->factory()->NewJSObject(isolate->object_function());
   Handle<String> name = isolate->factory()->empty_string();
-  JSObject::AddProperty(isolate, holder, name, object, NONE);
-  return internalizer.InternalizeJsonProperty(holder, name);
+  if (v8_flags.harmony_json_parse_with_source) {
+    DCHECK(result->IsFixedArray());
+    Handle<FixedArray> array = Handle<FixedArray>::cast(result);
+    DCHECK_EQ(2, array->length());
+    Handle<Object> object(array->get(0), isolate);
+    Handle<Object> val_node(array->get(1), isolate);
+    JSObject::AddProperty(isolate, holder, name, object, NONE);
+    return internalizer.InternalizeJsonProperty(holder, name, val_node);
+  } else {
+    JSObject::AddProperty(isolate, holder, name, result, NONE);
+    return internalizer.InternalizeJsonProperty(holder, name, Handle<Object>());
+  }
 }
 
+// TODO(v8:12955): Fix the parse node assert bug. See
+// https://github.com/tc39/proposal-json-parse-with-source/issues/35.
 MaybeHandle<Object> JsonParseInternalizer::InternalizeJsonProperty(
-    Handle<JSReceiver> holder, Handle<String> name) {
+    Handle<JSReceiver> holder, Handle<String> name, Handle<Object> val_node) {
+  DCHECK(reviver_->IsCallable());
   HandleScope outer_scope(isolate_);
   Handle<Object> value;
   ASSIGN_RETURN_ON_EXCEPTION(
@@ -151,11 +165,31 @@ MaybeHandle<Object> JsonParseInternalizer::InternalizeJsonProperty(
           isolate_, length_object,
           Object::GetLengthFromArrayLike(isolate_, object), Object);
       double length = length_object->Number();
-      for (double i = 0; i < length; i++) {
-        HandleScope inner_scope(isolate_);
-        Handle<Object> index = isolate_->factory()->NewNumber(i);
-        Handle<String> index_name = isolate_->factory()->NumberToString(index);
-        if (!RecurseAndApply(object, index_name)) return MaybeHandle<Object>();
+
+      if (v8_flags.harmony_json_parse_with_source) {
+        DCHECK(val_node->IsFixedArray());
+        Handle<FixedArray> val_nodes = Handle<FixedArray>::cast(val_node);
+        for (double i = 0; i < length; i++) {
+          HandleScope inner_scope(isolate_);
+          Handle<Object> index = isolate_->factory()->NewNumber(i);
+          Handle<String> index_name =
+              isolate_->factory()->NumberToString(index);
+          if (!RecurseAndApply(object, index_name,
+                               handle(val_nodes->get(i), isolate_))) {
+            return MaybeHandle<Object>();
+          }
+        }
+      } else {
+        DCHECK(val_node.is_null());
+        for (double i = 0; i < length; i++) {
+          HandleScope inner_scope(isolate_);
+          Handle<Object> index = isolate_->factory()->NewNumber(i);
+          Handle<String> index_name =
+              isolate_->factory()->NumberToString(index);
+          if (!RecurseAndApply(object, index_name, Handle<Object>())) {
+            return MaybeHandle<Object>();
+          }
+        }
       }
     } else {
       Handle<FixedArray> contents;
@@ -165,28 +199,64 @@ MaybeHandle<Object> JsonParseInternalizer::InternalizeJsonProperty(
                                   ENUMERABLE_STRINGS,
                                   GetKeysConversion::kConvertToString),
           Object);
-      for (int i = 0; i < contents->length(); i++) {
-        HandleScope inner_scope(isolate_);
-        Handle<String> key_name(String::cast(contents->get(i)), isolate_);
-        if (!RecurseAndApply(object, key_name)) return MaybeHandle<Object>();
+      if (v8_flags.harmony_json_parse_with_source) {
+        DCHECK(val_node->IsObjectHashTable());
+        Handle<ObjectHashTable> val_nodes =
+            Handle<ObjectHashTable>::cast(val_node);
+        for (int i = 0; i < contents->length(); i++) {
+          HandleScope inner_scope(isolate_);
+          Handle<String> key_name(String::cast(contents->get(i)), isolate_);
+          Handle<Object> node = handle(val_nodes->Lookup(key_name), isolate_);
+          DCHECK(!node->IsTheHole());
+          if (!RecurseAndApply(object, key_name, node)) {
+            return MaybeHandle<Object>();
+          }
+        }
+      } else {
+        DCHECK(val_node.is_null());
+        for (int i = 0; i < contents->length(); i++) {
+          HandleScope inner_scope(isolate_);
+          Handle<String> key_name(String::cast(contents->get(i)), isolate_);
+          if (!RecurseAndApply(object, key_name, Handle<Object>())) {
+            return MaybeHandle<Object>();
+          }
+        }
       }
     }
   }
-  Handle<Object> argv[] = {name, value};
   Handle<Object> result;
-  ASSIGN_RETURN_ON_EXCEPTION(
-      isolate_, result, Execution::Call(isolate_, reviver_, holder, 2, argv),
-      Object);
+  if (v8_flags.harmony_json_parse_with_source) {
+    DCHECK(!val_node.is_null());
+    Handle<JSObject> context =
+        isolate_->factory()->NewJSObject(isolate_->object_function());
+    if (val_node->IsString()) {
+      JSReceiver::CreateDataProperty(isolate_, context,
+                                     isolate_->factory()->source_string(),
+                                     val_node, Just(kThrowOnError))
+          .Check();
+    }
+    Handle<Object> argv[] = {name, value, context};
+    ASSIGN_RETURN_ON_EXCEPTION(
+        isolate_, result, Execution::Call(isolate_, reviver_, holder, 3, argv),
+        Object);
+  } else {
+    DCHECK(val_node.is_null());
+    Handle<Object> argv[] = {name, value};
+    ASSIGN_RETURN_ON_EXCEPTION(
+        isolate_, result, Execution::Call(isolate_, reviver_, holder, 2, argv),
+        Object);
+  }
   return outer_scope.CloseAndEscape(result);
 }
 
 bool JsonParseInternalizer::RecurseAndApply(Handle<JSReceiver> holder,
-                                            Handle<String> name) {
+                                            Handle<String> name,
+                                            Handle<Object> val_node) {
   STACK_CHECK(isolate_, false);
-
+  DCHECK(reviver_->IsCallable());
   Handle<Object> result;
   ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-      isolate_, result, InternalizeJsonProperty(holder, name), false);
+      isolate_, result, InternalizeJsonProperty(holder, name, val_node), false);
   Maybe<bool> change_result = Nothing<bool>();
   if (result->IsUndefined(isolate_)) {
     change_result = JSReceiver::DeletePropertyOrElement(holder, name,
@@ -403,12 +473,28 @@ JsonParser<Char>::~JsonParser() {
 }
 
 template <typename Char>
-MaybeHandle<Object> JsonParser<Char>::ParseJson() {
-  MaybeHandle<Object> result = ParseJsonValue();
-  if (!Check(JsonToken::EOS))
+MaybeHandle<Object> JsonParser<Char>::ParseJson(Handle<Object> reviver) {
+  Handle<Object> result;
+  // Only record the val node when reviver is callable.
+  bool reviver_is_callable = reviver->IsCallable();
+  bool should_track_json_source =
+      v8_flags.harmony_json_parse_with_source && reviver_is_callable;
+  if (should_track_json_source) {
+    ASSIGN_RETURN_ON_EXCEPTION(isolate(), result, ParseJsonValue<true>(reviver),
+                               Object);
+  } else {
+    ASSIGN_RETURN_ON_EXCEPTION(isolate(), result,
+                               ParseJsonValue<false>(reviver), Object);
+  }
+
+  if (!Check(JsonToken::EOS)) {
     ReportUnexpectedToken(
         peek(), MessageTemplate::kJsonParseUnexpectedNonWhiteSpaceCharacter);
-  if (isolate_->has_pending_exception()) return MaybeHandle<Object>();
+    return MaybeHandle<Object>();
+  }
+  if (isolate_->has_pending_exception()) {
+    return MaybeHandle<Object>();
+  }
   return result;
 }
 
@@ -662,7 +748,7 @@ Handle<Object> JsonParser<Char>::BuildJsonObject(
             : reinterpret_cast<Address>(
                   mutable_double_buffer->GetDataStartAddress());
     Address filler_address = mutable_double_address;
-    if (kTaggedSize != kDoubleSize) {
+    if (!V8_COMPRESS_POINTERS_8GB_BOOL && kTaggedSize != kDoubleSize) {
       if (IsAligned(mutable_double_address, kDoubleAlignment)) {
         mutable_double_address += kTaggedSize;
       } else {
@@ -681,7 +767,7 @@ Handle<Object> JsonParser<Char>::BuildJsonObject(
 
       if (details.representation().IsDouble()) {
         if (value.IsSmi()) {
-          if (kTaggedSize != kDoubleSize) {
+          if (!V8_COMPRESS_POINTERS_8GB_BOOL && kTaggedSize != kDoubleSize) {
             // Write alignment filler.
             HeapObject filler = HeapObject::FromAddress(filler_address);
             filler.set_map_after_allocation(
@@ -698,7 +784,8 @@ Handle<Object> JsonParser<Char>::BuildJsonObject(
           hn.set_map_after_allocation(*factory()->heap_number_map());
           HeapNumber::cast(hn).set_value_as_bits(bits, kRelaxedStore);
           value = hn;
-          mutable_double_address += kMutableDoubleSize;
+          mutable_double_address +=
+              ALIGN_TO_ALLOCATION_ALIGNMENT(kMutableDoubleSize);
         } else {
           DCHECK(value.IsHeapNumber());
           HeapObject::cast(value).set_map(*factory()->heap_number_map(),
@@ -712,7 +799,7 @@ Handle<Object> JsonParser<Char>::BuildJsonObject(
 #ifdef DEBUG
       Address end =
           reinterpret_cast<Address>(mutable_double_buffer->GetDataEndAddress());
-      if (kTaggedSize != kDoubleSize) {
+      if (!V8_COMPRESS_POINTERS_8GB_BOOL && kTaggedSize != kDoubleSize) {
         DCHECK_EQ(std::min(filler_address, mutable_double_address), end);
         DCHECK_GE(filler_address, end);
         DCHECK_GE(mutable_double_address, end);
@@ -724,7 +811,8 @@ Handle<Object> JsonParser<Char>::BuildJsonObject(
       // must ensure that the sweeper is not running or has already swept the
       // object's page. Otherwise the GC can add the contents of
       // mutable_double_buffer to the free list.
-      isolate()->heap()->EnsureSweepingCompleted(*mutable_double_buffer);
+      isolate()->heap()->EnsureSweepingCompletedForObject(
+          *mutable_double_buffer);
       mutable_double_buffer->set_length(0);
     }
   }
@@ -787,9 +875,56 @@ Handle<Object> JsonParser<Char>::BuildJsonArray(
   return array;
 }
 
+// Parse rawJSON value.
+template <typename Char>
+bool JsonParser<Char>::ParseRawJson() {
+  if (end_ == cursor_) {
+    isolate_->Throw(*isolate_->factory()->NewSyntaxError(
+        MessageTemplate::kInvalidRawJsonValue));
+    return false;
+  }
+  next_ = V8_LIKELY(*cursor_ <= unibrow::Latin1::kMaxChar)
+              ? one_char_json_tokens[*cursor_]
+              : JsonToken::ILLEGAL;
+  switch (peek()) {
+    case JsonToken::STRING:
+      Consume(JsonToken::STRING);
+      ScanJsonString(false);
+      break;
+
+    case JsonToken::NUMBER:
+      ParseJsonNumber();
+      break;
+
+    case JsonToken::TRUE_LITERAL:
+      ScanLiteral("true");
+      break;
+
+    case JsonToken::FALSE_LITERAL:
+      ScanLiteral("false");
+      break;
+
+    case JsonToken::NULL_LITERAL:
+      ScanLiteral("null");
+      break;
+
+    default:
+      ReportUnexpectedCharacter(CurrentCharacter());
+      return false;
+  }
+  if (isolate_->has_pending_exception()) return false;
+  if (cursor_ != end_) {
+    isolate_->Throw(*isolate_->factory()->NewSyntaxError(
+        MessageTemplate::kInvalidRawJsonValue));
+    return false;
+  }
+  return true;
+}
+
 // Parse any JSON value.
 template <typename Char>
-MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
+template <bool should_track_json_source>
+MaybeHandle<Object> JsonParser<Char>::ParseJsonValue(Handle<Object> reviver) {
   std::vector<JsonContinuation> cont_stack;
   SmallVector<JsonProperty> property_stack;
   SmallVector<Handle<Object>> element_stack;
@@ -799,6 +934,34 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
   JsonContinuation cont(isolate_, JsonContinuation::kReturn, 0);
 
   Handle<Object> value;
+
+  // We use val_node to record current json value's parse node. For primitive
+  // values, the val_node is the source string of the json value. For JSObject
+  // values, the val_node is an ObjectHashTable in which the key is the property
+  // name and the value is the property value's parse node. For JSArray values,
+  // the val_node is a FixedArray containing the parse nodes of the elements.
+  // And for JSObject values, The order in which properties are defined may be
+  // different from the order in which properties are enumerated when calling
+  // InternalizeJSONProperty for the JSObject value. E.g., the json source
+  // string is '{"a": 1, "1": 2}', and the properties enumerate order is ["1",
+  // "a"]. Moreover, properties may be defined repeatedly in the json string.
+  // E.g., the json string is '{"a": 1, "a": 1}', and the properties enumerate
+  // order is ["a"]. So we cannot use the FixedArray to record the properties's
+  // parse node by the order in which properties are defined and we use a
+  // ObjectHashTable here to record the property name and the property's parse
+  // node. We then look up the property's parse node by the property name when
+  // calling InternalizeJSONProperty.
+  Handle<Object> val_node;
+  // Record the start position and end position for the primitive values.
+  int start_position;
+  int end_position;
+
+  // element_val_node_stack is used to track all the elements's parse node. And
+  // we use this to construct the JSArray's parse node.
+  SmallVector<Handle<Object>> element_val_node_stack;
+  // property_val_node_stack is used to track all the property value's parse
+  // node. And we use this to construct the JSObject's parse node.
+  SmallVector<Handle<Object>> property_val_node_stack;
   while (true) {
     // Produce a json value.
     //
@@ -809,14 +972,28 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
       SkipWhitespace();
       // The switch is immediately followed by 'break' so we can use 'break' to
       // break out of the loop, and 'continue' to continue the loop.
+
+      if (should_track_json_source) {
+        start_position = position();
+      }
       switch (peek()) {
         case JsonToken::STRING:
           Consume(JsonToken::STRING);
           value = MakeString(ScanJsonString(false));
+          if (should_track_json_source) {
+            end_position = position();
+            val_node = isolate_->factory()->NewSubString(
+                source_, start_position, end_position);
+          }
           break;
 
         case JsonToken::NUMBER:
           value = ParseJsonNumber();
+          if (should_track_json_source) {
+            end_position = position();
+            val_node = isolate_->factory()->NewSubString(
+                source_, start_position, end_position);
+          }
           break;
 
         case JsonToken::LBRACE: {
@@ -824,6 +1001,7 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
           if (Check(JsonToken::RBRACE)) {
             // TODO(verwaest): Directly use the map instead.
             value = factory()->NewJSObject(object_constructor_);
+            val_node = ObjectHashTable::New(isolate_, 0);
             break;
           }
 
@@ -836,6 +1014,9 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
           ExpectNext(JsonToken::STRING,
                      MessageTemplate::kJsonParseExpectedPropNameOrRBrace);
           property_stack.emplace_back(ScanJsonPropertyKey(&cont));
+          if (should_track_json_source) {
+            property_val_node_stack.emplace_back(Handle<Object>());
+          }
 
           ExpectNext(JsonToken::COLON,
                      MessageTemplate::kJsonParseExpectedColonAfterPropertyName);
@@ -848,6 +1029,7 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
           Consume(JsonToken::LBRACK);
           if (Check(JsonToken::RBRACK)) {
             value = factory()->NewJSArray(0, PACKED_SMI_ELEMENTS);
+            val_node = factory()->NewFixedArray(0);
             break;
           }
 
@@ -862,16 +1044,25 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
         case JsonToken::TRUE_LITERAL:
           ScanLiteral("true");
           value = factory()->true_value();
+          if (should_track_json_source) {
+            val_node = isolate_->factory()->true_string();
+          }
           break;
 
         case JsonToken::FALSE_LITERAL:
           ScanLiteral("false");
           value = factory()->false_value();
+          if (should_track_json_source) {
+            val_node = isolate_->factory()->false_string();
+          }
           break;
 
         case JsonToken::NULL_LITERAL:
           ScanLiteral("null");
           value = factory()->null_value();
+          if (should_track_json_source) {
+            val_node = isolate_->factory()->null_string();
+          }
           break;
 
         case JsonToken::COLON:
@@ -891,7 +1082,6 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
         case JsonToken::WHITESPACE:
           UNREACHABLE();
       }
-
       // Done producing a value, consume it.
       break;
     }
@@ -905,11 +1095,22 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
       // break out of the loop, and 'continue' to continue the loop.
       switch (cont.type()) {
         case JsonContinuation::kReturn:
-          return cont.scope.CloseAndEscape(value);
+          if (should_track_json_source) {
+            DCHECK(!val_node.is_null());
+            Handle<FixedArray> result = factory()->NewFixedArray(2);
+            result->set(0, *value);
+            result->set(1, *val_node);
+            return cont.scope.CloseAndEscape(result);
+          } else {
+            return cont.scope.CloseAndEscape(value);
+          }
 
         case JsonContinuation::kObjectProperty: {
           // Store the previous property value into its property info.
           property_stack.back().value = value;
+          if (should_track_json_source) {
+            property_val_node_stack.back() = val_node;
+          }
 
           if (V8_LIKELY(Check(JsonToken::COMMA))) {
             // Parse the property key.
@@ -918,6 +1119,9 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
                 MessageTemplate::kJsonParseExpectedDoubleQuotedPropertyName);
 
             property_stack.emplace_back(ScanJsonPropertyKey(&cont));
+            if (should_track_json_source) {
+              property_val_node_stack.emplace_back(Handle<Object>());
+            }
             ExpectNext(JsonToken::COLON);
 
             // Break to start producing the subsequent property value.
@@ -940,12 +1144,35 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
             }
           }
           value = BuildJsonObject(cont, property_stack, feedback);
-          property_stack.resize_no_init(cont.index);
           Expect(JsonToken::RBRACE,
                  MessageTemplate::kJsonParseExpectedCommaOrRBrace);
-
           // Return the object.
-          value = cont.scope.CloseAndEscape(value);
+          if (should_track_json_source) {
+            size_t start = cont.index;
+            int length = static_cast<int>(property_stack.size() - start);
+            Handle<ObjectHashTable> table =
+                ObjectHashTable::New(isolate(), length);
+            for (int i = 0; i < length; i++) {
+              const JsonProperty& property = property_stack[start + i];
+              if (property.string.is_index()) {
+                table = ObjectHashTable::Put(
+                    table, factory()->Uint32ToString(property.string.index()),
+                    property_val_node_stack[start + i]);
+              } else {
+                table =
+                    ObjectHashTable::Put(table, MakeString(property.string),
+                                         property_val_node_stack[start + i]);
+              }
+            }
+            property_val_node_stack.resize_no_init(cont.index);
+            Object value_obj = *value;
+            val_node = cont.scope.CloseAndEscape(table);
+            value = cont.scope.CloseAndEscape(handle(value_obj, isolate_));
+          } else {
+            value = cont.scope.CloseAndEscape(value);
+          }
+          property_stack.resize_no_init(cont.index);
+
           // Pop the continuation.
           cont = std::move(cont_stack.back());
           cont_stack.pop_back();
@@ -956,16 +1183,31 @@ MaybeHandle<Object> JsonParser<Char>::ParseJsonValue() {
         case JsonContinuation::kArrayElement: {
           // Store the previous element on the stack.
           element_stack.emplace_back(value);
+          if (should_track_json_source) {
+            element_val_node_stack.emplace_back(val_node);
+          }
           // Break to start producing the subsequent element value.
           if (V8_LIKELY(Check(JsonToken::COMMA))) break;
 
           value = BuildJsonArray(cont, element_stack);
-          element_stack.resize_no_init(cont.index);
           Expect(JsonToken::RBRACK,
                  MessageTemplate::kJsonParseExpectedCommaOrRBrack);
-
           // Return the array.
-          value = cont.scope.CloseAndEscape(value);
+          if (should_track_json_source) {
+            size_t start = cont.index;
+            int length = static_cast<int>(element_stack.size() - start);
+            Handle<FixedArray> array = factory()->NewFixedArray(length);
+            for (int i = 0; i < length; i++) {
+              array->set(i, *element_val_node_stack[start + i]);
+            }
+            element_val_node_stack.resize_no_init(cont.index);
+            Object value_obj = *value;
+            val_node = cont.scope.CloseAndEscape(array);
+            value = cont.scope.CloseAndEscape(handle(value_obj, isolate_));
+          } else {
+            value = cont.scope.CloseAndEscape(value);
+          }
+          element_stack.resize_no_init(cont.index);
           // Pop the continuation.
           cont = std::move(cont_stack.back());
           cont_stack.pop_back();
diff --git a/deps/v8/src/json/json-parser.h b/deps/v8/src/json/json-parser.h
index 38d45bcf292a44..9304c163b30bef 100644
--- a/deps/v8/src/json/json-parser.h
+++ b/deps/v8/src/json/json-parser.h
@@ -103,20 +103,25 @@ struct JsonProperty {
 class JsonParseInternalizer {
  public:
   static MaybeHandle<Object> Internalize(Isolate* isolate,
-                                         Handle<Object> object,
-                                         Handle<Object> reviver);
+                                         Handle<Object> result,
+                                         Handle<Object> reviver,
+                                         Handle<String> source);
 
  private:
-  JsonParseInternalizer(Isolate* isolate, Handle<JSReceiver> reviver)
-      : isolate_(isolate), reviver_(reviver) {}
+  JsonParseInternalizer(Isolate* isolate, Handle<JSReceiver> reviver,
+                        Handle<String> source)
+      : isolate_(isolate), reviver_(reviver), source_(source) {}
 
   MaybeHandle<Object> InternalizeJsonProperty(Handle<JSReceiver> holder,
-                                              Handle<String> key);
+                                              Handle<String> key,
+                                              Handle<Object> val_node);
 
-  bool RecurseAndApply(Handle<JSReceiver> holder, Handle<String> name);
+  bool RecurseAndApply(Handle<JSReceiver> holder, Handle<String> name,
+                       Handle<Object> val_node);
 
   Isolate* isolate_;
   Handle<JSReceiver> reviver_;
+  Handle<String> source_;
 };
 
 enum class JsonToken : uint8_t {
@@ -143,15 +148,22 @@ class JsonParser final {
   using SeqString = typename CharTraits<Char>::String;
   using SeqExternalString = typename CharTraits<Char>::ExternalString;
 
+  V8_WARN_UNUSED_RESULT static bool CheckRawJson(Isolate* isolate,
+                                                 Handle<String> source) {
+    return JsonParser(isolate, source).ParseRawJson();
+  }
+
   V8_WARN_UNUSED_RESULT static MaybeHandle<Object> Parse(
       Isolate* isolate, Handle<String> source, Handle<Object> reviver) {
     HighAllocationThroughputScope high_throughput_scope(
         V8::GetCurrentPlatform());
     Handle<Object> result;
     ASSIGN_RETURN_ON_EXCEPTION(isolate, result,
-                               JsonParser(isolate, source).ParseJson(), Object);
+                               JsonParser(isolate, source).ParseJson(reviver),
+                               Object);
     if (reviver->IsCallable()) {
-      return JsonParseInternalizer::Internalize(isolate, result, reviver);
+      return JsonParseInternalizer::Internalize(isolate, result, reviver,
+                                                source);
     }
     return result;
   }
@@ -187,7 +199,9 @@ class JsonParser final {
   ~JsonParser();
 
   // Parse a string containing a single JSON value.
-  MaybeHandle<Object> ParseJson();
+  MaybeHandle<Object> ParseJson(Handle<Object> reviver);
+
+  bool ParseRawJson();
 
   void advance() { ++cursor_; }
 
@@ -295,7 +309,8 @@ class JsonParser final {
   // Parse a single JSON value from input (grammar production JSONValue).
   // A JSON value is either a (double-quoted) string literal, a number literal,
   // one of "true", "false", or "null", or an object or array literal.
-  MaybeHandle<Object> ParseJsonValue();
+  template <bool should_track_json_source>
+  MaybeHandle<Object> ParseJsonValue(Handle<Object> reviver);
 
   Handle<Object> BuildJsonObject(
       const JsonContinuation& cont,
diff --git a/deps/v8/src/json/json-stringifier.cc b/deps/v8/src/json/json-stringifier.cc
index cbc951d88a0004..98ff273a2e76d0 100644
--- a/deps/v8/src/json/json-stringifier.cc
+++ b/deps/v8/src/json/json-stringifier.cc
@@ -9,6 +9,7 @@
 #include "src/numbers/conversions.h"
 #include "src/objects/heap-number-inl.h"
 #include "src/objects/js-array-inl.h"
+#include "src/objects/js-raw-json-inl.h"
 #include "src/objects/lookup.h"
 #include "src/objects/objects-inl.h"
 #include "src/objects/oddball-inl.h"
@@ -582,6 +583,14 @@ JsonStringifier::Result JsonStringifier::Serialize_(Handle<Object> object,
           Handle<JSPrimitiveWrapper>::cast(object), key);
     case SYMBOL_TYPE:
       return UNCHANGED;
+    case JS_RAW_JSON_TYPE:
+      DCHECK(v8_flags.harmony_json_parse_with_source);
+      if (deferred_string_key) SerializeDeferredKey(comma, key);
+      builder_.AppendString(Handle<String>::cast(
+          handle(Handle<JSRawJson>::cast(object)->InObjectPropertyAt(
+                     JSRawJson::kRawJsonIndex),
+                 isolate_)));
+      return SUCCESS;
     default:
       if (InstanceTypeChecker::IsString(instance_type)) {
         if (deferred_string_key) SerializeDeferredKey(comma, key);
diff --git a/deps/v8/src/libplatform/tracing/recorder-win.cc b/deps/v8/src/libplatform/tracing/recorder-win.cc
index 955a400928a654..ce431c94920e82 100644
--- a/deps/v8/src/libplatform/tracing/recorder-win.cc
+++ b/deps/v8/src/libplatform/tracing/recorder-win.cc
@@ -33,13 +33,13 @@ bool Recorder::IsEnabled(const uint8_t level) {
 void Recorder::AddEvent(TraceObject* trace_event) {
   // TODO(sartang@microsoft.com): Figure out how to write the conditional
   // arguments
-  wchar_t* wName = new wchar_t[4096];
+  wchar_t wName[4096];
   MultiByteToWideChar(CP_ACP, 0, trace_event->name(), -1, wName, 4096);
 
 #if defined(V8_USE_PERFETTO)
   const wchar_t* wCategoryGroupName = L"";
 #else  // defined(V8_USE_PERFETTO)
-  wchar_t* wCategoryGroupName = new wchar_t[4096];
+  wchar_t wCategoryGroupName[4096];
   MultiByteToWideChar(CP_ACP, 0,
                       TracingController::GetCategoryGroupName(
                           trace_event->category_enabled_flag()),
diff --git a/deps/v8/src/logging/counters-definitions.h b/deps/v8/src/logging/counters-definitions.h
index e1e27fb4ed58c7..c487e9cf85b9a8 100644
--- a/deps/v8/src/logging/counters-definitions.h
+++ b/deps/v8/src/logging/counters-definitions.h
@@ -32,10 +32,6 @@ namespace internal {
   HR(gc_scavenger_scavenge_main, V8.GCScavenger.ScavengeMain, 0, 10000, 101)   \
   HR(gc_scavenger_scavenge_roots, V8.GCScavenger.ScavengeRoots, 0, 10000, 101) \
   HR(gc_marking_sum, V8.GCMarkingSum, 0, 10000, 101)                           \
-  /* Range and bucket matches BlinkGC.MainThreadMarkingThroughput. */          \
-  HR(gc_main_thread_marking_throughput, V8.GCMainThreadMarkingThroughput, 0,   \
-     100000, 50)                                                               \
-  HR(young_generation_handling, V8.GCYoungGenerationHandling, 0, 2, 3)         \
   /* Asm/Wasm. */                                                              \
   HR(wasm_functions_per_asm_module, V8.WasmFunctionsPerModule.asm, 1, 1000000, \
      51)                                                                       \
@@ -131,8 +127,8 @@ namespace internal {
   HT(gc_incremental_marking, V8.GCIncrementalMarking, 10000, MILLISECOND)     \
   HT(gc_incremental_marking_start, V8.GCIncrementalMarkingStart, 10000,       \
      MILLISECOND)                                                             \
-  HT(gc_incremental_marking_finalize, V8.GCIncrementalMarkingFinalize, 10000, \
-     MILLISECOND)                                                             \
+  HT(gc_minor_incremental_marking_start, V8.GCMinorIncrementalMarkingStart,   \
+     10000, MILLISECOND)                                                      \
   HT(gc_low_memory_notification, V8.GCLowMemoryNotification, 10000,           \
      MILLISECOND)                                                             \
   /* Compilation times. */                                                    \
diff --git a/deps/v8/src/logging/counters.h b/deps/v8/src/logging/counters.h
index 1e284bf3312a2f..354bc54845ac48 100644
--- a/deps/v8/src/logging/counters.h
+++ b/deps/v8/src/logging/counters.h
@@ -367,7 +367,7 @@ class V8_NODISCARD AggregatedHistogramTimerScope {
 // AggretatedMemoryHistogram collects (time, value) sample pairs and turns
 // them into time-uniform samples for the backing historgram, such that the
 // backing histogram receives one sample every T ms, where the T is controlled
-// by the FLAG_histogram_interval.
+// by the v8_flags.histogram_interval.
 //
 // More formally: let F be a real-valued function that maps time to sample
 // values. We define F as a linear interpolation between adjacent samples. For
@@ -388,7 +388,7 @@ class AggregatedMemoryHistogram {
   // 1) For we processed samples that came in before start_ms_ and sent the
   // corresponding aggregated samples to backing histogram.
   // 2) (last_ms_, last_value_) is the last received sample.
-  // 3) last_ms_ < start_ms_ + FLAG_histogram_interval.
+  // 3) last_ms_ < start_ms_ + v8_flags.histogram_interval.
   // 4) aggregate_value_ is the average of the function that is constructed by
   // linearly interpolating samples received between start_ms_ and last_ms_.
   void AddSample(double current_ms, double current_value);
@@ -429,7 +429,7 @@ void AggregatedMemoryHistogram<Histogram>::AddSample(double current_ms,
       // Two samples have the same time, remember the last one.
       last_value_ = current_value;
     } else {
-      double sample_interval_ms = FLAG_histogram_interval;
+      double sample_interval_ms = v8_flags.histogram_interval;
       double end_ms = start_ms_ + sample_interval_ms;
       if (end_ms <= current_ms + kEpsilon) {
         // Linearly interpolate between the last_ms_ and the current_ms.
@@ -520,10 +520,10 @@ class Counters : public std::enable_shared_from_this<Counters> {
   NESTED_TIMED_HISTOGRAM_LIST(HT)
 #undef HT
 
-#define HT(name, caption, max, res)              \
-  NestedTimedHistogram* name() {                 \
-    name##_.EnsureCreated(FLAG_slow_histograms); \
-    return &name##_;                             \
+#define HT(name, caption, max, res)                  \
+  NestedTimedHistogram* name() {                     \
+    name##_.EnsureCreated(v8_flags.slow_histograms); \
+    return &name##_;                                 \
   }
   NESTED_TIMED_HISTOGRAM_LIST_SLOW(HT)
 #undef HT
diff --git a/deps/v8/src/logging/log-file.cc b/deps/v8/src/logging/log-file.cc
index 21f2d1c968abbd..acdd24701c64b5 100644
--- a/deps/v8/src/logging/log-file.cc
+++ b/deps/v8/src/logging/log-file.cc
@@ -28,7 +28,7 @@ const char* const LogFile::kLogToConsole = "-";
 // static
 FILE* LogFile::CreateOutputHandle(std::string file_name) {
   // If we're logging anything, we need to open the log file.
-  if (!FLAG_log) {
+  if (!v8_flags.log) {
     return nullptr;
   } else if (LogFile::IsLoggingToConsole(file_name)) {
     return stdout;
diff --git a/deps/v8/src/logging/log.cc b/deps/v8/src/logging/log.cc
index b406ab4a17b0de..e591ce8224af42 100644
--- a/deps/v8/src/logging/log.cc
+++ b/deps/v8/src/logging/log.cc
@@ -11,6 +11,7 @@
 
 #include "include/v8-locker.h"
 #include "src/api/api-inl.h"
+#include "src/base/functional.h"
 #include "src/base/platform/mutex.h"
 #include "src/base/platform/platform.h"
 #include "src/base/platform/wrappers.h"
@@ -127,7 +128,7 @@ const char* ComputeMarker(SharedFunctionInfo shared, AbstractCode code) {
   CodeKind kind = code.kind(cage_base);
   // We record interpreter trampoline builtin copies as having the
   // "interpreted" marker.
-  if (FLAG_interpreted_frames_native_stack && kind == CodeKind::BUILTIN &&
+  if (v8_flags.interpreted_frames_native_stack && kind == CodeKind::BUILTIN &&
       !code.is_off_heap_trampoline(cage_base)) {
     DCHECK_EQ(code.builtin_id(cage_base), Builtin::kInterpreterEntryTrampoline);
     kind = CodeKind::INTERPRETED_FUNCTION;
@@ -416,7 +417,7 @@ void LinuxPerfBasicLogger::LogRecordedBuffer(Handle<AbstractCode> code,
                                              MaybeHandle<SharedFunctionInfo>,
                                              const char* name, int length) {
   PtrComprCageBase cage_base(isolate_);
-  if (FLAG_perf_basic_prof_only_functions &&
+  if (v8_flags.perf_basic_prof_only_functions &&
       CodeKindIsBuiltinOrJSFunction(code->kind(cage_base))) {
     return;
   }
@@ -946,6 +947,14 @@ class SamplingThread : public base::Thread {
   const int interval_microseconds_;
 };
 
+#if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
+class ETWJitLogger : public JitLogger {
+ public:
+  explicit ETWJitLogger(Isolate* isolate)
+      : JitLogger(isolate, i::ETWJITInterface::EventHandler) {}
+};
+#endif
+
 // The Profiler samples pc and sp values for the main thread.
 // Each sample is appended to a circular buffer.
 // An independent thread removes data and writes it to the log.
@@ -1128,7 +1137,7 @@ V8FileLogger::~V8FileLogger() = default;
 const LogSeparator V8FileLogger::kNext = LogSeparator::kSeparator;
 
 int64_t V8FileLogger::Time() {
-  if (FLAG_verify_predictable) {
+  if (v8_flags.verify_predictable) {
     return isolate_->heap()->MonotonicallyIncreasingTimeInMs() * 1000;
   }
   return timer_.Elapsed().InMicroseconds();
@@ -1145,12 +1154,13 @@ void V8FileLogger::RemoveLogEventListener(LogEventListener* listener) {
 
 void V8FileLogger::ProfilerBeginEvent() {
   MSG_BUILDER();
-  msg << "profiler" << kNext << "begin" << kNext << FLAG_prof_sampling_interval;
+  msg << "profiler" << kNext << "begin" << kNext
+      << v8_flags.prof_sampling_interval;
   msg.WriteToLogFile();
 }
 
 void V8FileLogger::StringEvent(const char* name, const char* value) {
-  if (FLAG_log) UncheckedStringEvent(name, value);
+  if (v8_flags.log) UncheckedStringEvent(name, value);
 }
 
 void V8FileLogger::UncheckedStringEvent(const char* name, const char* value) {
@@ -1160,7 +1170,7 @@ void V8FileLogger::UncheckedStringEvent(const char* name, const char* value) {
 }
 
 void V8FileLogger::IntPtrTEvent(const char* name, intptr_t value) {
-  if (!FLAG_log) return;
+  if (!v8_flags.log) return;
   MSG_BUILDER();
   msg << name << kNext;
   msg.AppendFormatString("%" V8PRIdPTR, value);
@@ -1170,7 +1180,7 @@ void V8FileLogger::IntPtrTEvent(const char* name, intptr_t value) {
 void V8FileLogger::SharedLibraryEvent(const std::string& library_path,
                                       uintptr_t start, uintptr_t end,
                                       intptr_t aslr_slide) {
-  if (!FLAG_prof_cpp) return;
+  if (!v8_flags.prof_cpp) return;
   MSG_BUILDER();
   msg << "shared-library" << kNext << library_path.c_str() << kNext
       << reinterpret_cast<void*>(start) << kNext << reinterpret_cast<void*>(end)
@@ -1179,14 +1189,14 @@ void V8FileLogger::SharedLibraryEvent(const std::string& library_path,
 }
 
 void V8FileLogger::SharedLibraryEnd() {
-  if (!FLAG_prof_cpp) return;
+  if (!v8_flags.prof_cpp) return;
   MSG_BUILDER();
   msg << "shared-library-end";
   msg.WriteToLogFile();
 }
 
 void V8FileLogger::CurrentTimeEvent() {
-  DCHECK(FLAG_log_internal_timer_events);
+  DCHECK(v8_flags.log_internal_timer_events);
   MSG_BUILDER();
   msg << "current-time" << kNext << Time();
   msg.WriteToLogFile();
@@ -1222,7 +1232,7 @@ TIMER_EVENTS_LIST(V)
 #undef V
 
 void V8FileLogger::NewEvent(const char* name, void* object, size_t size) {
-  if (!FLAG_log) return;
+  if (!v8_flags.log) return;
   MSG_BUILDER();
   msg << "new" << kNext << name << kNext << object << kNext
       << static_cast<unsigned int>(size);
@@ -1230,7 +1240,7 @@ void V8FileLogger::NewEvent(const char* name, void* object, size_t size) {
 }
 
 void V8FileLogger::DeleteEvent(const char* name, void* object) {
-  if (!FLAG_log) return;
+  if (!v8_flags.log) return;
   MSG_BUILDER();
   msg << "delete" << kNext << name << kNext << object;
   msg.WriteToLogFile();
@@ -1288,7 +1298,7 @@ void V8FileLogger::LogSourceCodeInformation(Handle<AbstractCode> code,
   Script script = Script::cast(script_object);
   EnsureLogScriptSource(script);
 
-  if (!FLAG_log_source_position) return;
+  if (!v8_flags.log_source_position) return;
   MSG_BUILDER();
   msg << "code-source-info" << V8FileLogger::kNext
       << reinterpret_cast<void*>(code->InstructionStart(cage_base))
@@ -1349,7 +1359,7 @@ void V8FileLogger::LogSourceCodeInformation(Handle<AbstractCode> code,
 }
 
 void V8FileLogger::LogCodeDisassemble(Handle<AbstractCode> code) {
-  if (!FLAG_log_code_disassemble) return;
+  if (!v8_flags.log_code_disassemble) return;
   PtrComprCageBase cage_base(isolate_);
   MSG_BUILDER();
   msg << "code-disassemble" << V8FileLogger::kNext
@@ -1380,7 +1390,7 @@ void V8FileLogger::LogCodeDisassemble(Handle<AbstractCode> code) {
 void V8FileLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
                                    const char* name) {
   if (!is_listening_to_code_events()) return;
-  if (!FLAG_log_code) return;
+  if (!v8_flags.log_code) return;
   {
     MSG_BUILDER();
     AppendCodeCreateHeader(isolate_, msg, tag, *code, Time());
@@ -1393,7 +1403,7 @@ void V8FileLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
 void V8FileLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
                                    Handle<Name> name) {
   if (!is_listening_to_code_events()) return;
-  if (!FLAG_log_code) return;
+  if (!v8_flags.log_code) return;
   {
     MSG_BUILDER();
     AppendCodeCreateHeader(isolate_, msg, tag, *code, Time());
@@ -1408,7 +1418,7 @@ void V8FileLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
                                    Handle<SharedFunctionInfo> shared,
                                    Handle<Name> script_name) {
   if (!is_listening_to_code_events()) return;
-  if (!FLAG_log_code) return;
+  if (!v8_flags.log_code) return;
   if (*code ==
       AbstractCode::cast(isolate_->builtins()->code(Builtin::kCompileLazy))) {
     return;
@@ -1427,7 +1437,7 @@ void V8FileLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
 void V8FileLogger::FeedbackVectorEvent(FeedbackVector vector,
                                        AbstractCode code) {
   DisallowGarbageCollection no_gc;
-  if (!FLAG_log_feedback_vector) return;
+  if (!v8_flags.log_feedback_vector) return;
   PtrComprCageBase cage_base(isolate_);
   MSG_BUILDER();
   msg << "feedback-vector" << kNext << Time();
@@ -1460,7 +1470,7 @@ void V8FileLogger::CodeCreateEvent(CodeTag tag, Handle<AbstractCode> code,
                                    Handle<Name> script_name, int line,
                                    int column) {
   if (!is_listening_to_code_events()) return;
-  if (!FLAG_log_code) return;
+  if (!v8_flags.log_code) return;
   {
     MSG_BUILDER();
     AppendCodeCreateHeader(isolate_, msg, tag, *code, Time());
@@ -1480,7 +1490,7 @@ void V8FileLogger::CodeCreateEvent(CodeTag tag, const wasm::WasmCode* code,
                                    const char* /*source_url*/,
                                    int /*code_offset*/, int /*script_id*/) {
   if (!is_listening_to_code_events()) return;
-  if (!FLAG_log_code) return;
+  if (!v8_flags.log_code) return;
   MSG_BUILDER();
   AppendCodeCreateHeader(msg, tag, CodeKind::WASM_FUNCTION,
                          code->instructions().begin(),
@@ -1502,7 +1512,7 @@ void V8FileLogger::CodeCreateEvent(CodeTag tag, const wasm::WasmCode* code,
 
 void V8FileLogger::CallbackEventInternal(const char* prefix, Handle<Name> name,
                                          Address entry_point) {
-  if (!FLAG_log_code) return;
+  if (!v8_flags.log_code) return;
   MSG_BUILDER();
   msg << Event::kCodeCreation << kNext << CodeTag::kCallback << kNext << -2
       << kNext << Time() << kNext << reinterpret_cast<void*>(entry_point)
@@ -1525,7 +1535,7 @@ void V8FileLogger::SetterCallbackEvent(Handle<Name> name, Address entry_point) {
 void V8FileLogger::RegExpCodeCreateEvent(Handle<AbstractCode> code,
                                          Handle<String> source) {
   if (!is_listening_to_code_events()) return;
-  if (!FLAG_log_code) return;
+  if (!v8_flags.log_code) return;
   MSG_BUILDER();
   AppendCodeCreateHeader(isolate_, msg, LogEventListener::CodeTag::kRegExp,
                          *code, Time());
@@ -1547,14 +1557,14 @@ void V8FileLogger::SharedFunctionInfoMoveEvent(Address from, Address to) {
 
 void V8FileLogger::CodeMovingGCEvent() {
   if (!is_listening_to_code_events()) return;
-  if (!FLAG_ll_prof) return;
+  if (!v8_flags.ll_prof) return;
   base::OS::SignalCodeMovingGC();
 }
 
 void V8FileLogger::CodeDisableOptEvent(Handle<AbstractCode> code,
                                        Handle<SharedFunctionInfo> shared) {
   if (!is_listening_to_code_events()) return;
-  if (!FLAG_log_code) return;
+  if (!v8_flags.log_code) return;
   MSG_BUILDER();
   msg << Event::kCodeDisableOpt << kNext << shared->DebugNameCStr().get()
       << kNext << GetBailoutReason(shared->disabled_optimization_reason());
@@ -1585,7 +1595,7 @@ void V8FileLogger::ProcessDeoptEvent(Handle<Code> code, SourcePosition position,
 
 void V8FileLogger::CodeDeoptEvent(Handle<Code> code, DeoptimizeKind kind,
                                   Address pc, int fp_to_sp_delta) {
-  if (!is_logging() || !FLAG_log_deopt) return;
+  if (!is_logging() || !v8_flags.log_deopt) return;
   Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(*code, pc);
   ProcessDeoptEvent(code, info.position, Deoptimizer::MessageFor(kind),
                     DeoptimizeReasonToString(info.deopt_reason));
@@ -1594,7 +1604,7 @@ void V8FileLogger::CodeDeoptEvent(Handle<Code> code, DeoptimizeKind kind,
 void V8FileLogger::CodeDependencyChangeEvent(Handle<Code> code,
                                              Handle<SharedFunctionInfo> sfi,
                                              const char* reason) {
-  if (!is_logging() || !FLAG_log_deopt) return;
+  if (!is_logging() || !v8_flags.log_deopt) return;
   SourcePosition position(sfi->StartPosition(), -1);
   ProcessDeoptEvent(code, position, "dependency-change", reason);
 }
@@ -1647,7 +1657,7 @@ void V8FileLogger::CodeNameEvent(Address addr, int pos, const char* code_name) {
 }
 
 void V8FileLogger::MoveEventInternal(Event event, Address from, Address to) {
-  if (!FLAG_log_code) return;
+  if (!v8_flags.log_code) return;
   MSG_BUILDER();
   msg << event << kNext << reinterpret_cast<void*>(from) << kNext
       << reinterpret_cast<void*>(to);
@@ -1661,7 +1671,7 @@ void AppendFunctionMessage(LogFile::MessageBuilder& msg, const char* reason,
   msg << "function" << V8FileLogger::kNext << reason << V8FileLogger::kNext
       << script_id << V8FileLogger::kNext << start_position
       << V8FileLogger::kNext << end_position << V8FileLogger::kNext;
-  if (V8_UNLIKELY(FLAG_predictable)) {
+  if (V8_UNLIKELY(v8_flags.predictable)) {
     msg << 0.1;
   } else {
     msg << time_delta;
@@ -1757,7 +1767,7 @@ void V8FileLogger::ScriptDetails(Script script) {
 }
 
 bool V8FileLogger::EnsureLogScriptSource(Script script) {
-  if (!FLAG_log_source_code) return true;
+  if (!v8_flags.log_source_code) return true;
   // Make sure the script is written to the log file.
   int script_id = script.id();
   if (logged_source_code_.find(script_id) != logged_source_code_.end()) {
@@ -1800,7 +1810,7 @@ void V8FileLogger::RuntimeCallTimerEvent() {
 }
 
 void V8FileLogger::TickEvent(TickSample* sample, bool overflow) {
-  if (!FLAG_prof_cpp) return;
+  if (!v8_flags.prof_cpp) return;
   if (V8_UNLIKELY(TracingFlags::runtime_stats.load(std::memory_order_relaxed) ==
                   v8::tracing::TracingCategoryObserver::ENABLED_BY_NATIVE)) {
     RuntimeCallTimerEvent();
@@ -1825,7 +1835,7 @@ void V8FileLogger::TickEvent(TickSample* sample, bool overflow) {
 void V8FileLogger::ICEvent(const char* type, bool keyed, Handle<Map> map,
                            Handle<Object> key, char old_state, char new_state,
                            const char* modifier, const char* slow_stub_reason) {
-  if (!FLAG_log_ic) return;
+  if (!v8_flags.log_ic) return;
   int line;
   int column;
   // GetAbstractPC must come before MSG_BUILDER(), as it can GC, which might
@@ -1854,7 +1864,7 @@ void V8FileLogger::ICEvent(const char* type, bool keyed, Handle<Map> map,
 void V8FileLogger::MapEvent(const char* type, Handle<Map> from, Handle<Map> to,
                             const char* reason,
                             Handle<HeapObject> name_or_sfi) {
-  if (!FLAG_log_maps) return;
+  if (!v8_flags.log_maps) return;
   if (!to.is_null()) MapDetails(*to);
   int line = -1;
   int column = -1;
@@ -1885,7 +1895,7 @@ void V8FileLogger::MapEvent(const char* type, Handle<Map> from, Handle<Map> to,
 }
 
 void V8FileLogger::MapCreate(Map map) {
-  if (!FLAG_log_maps) return;
+  if (!v8_flags.log_maps) return;
   DisallowGarbageCollection no_gc;
   MSG_BUILDER();
   msg << "map-create" << kNext << Time() << kNext << AsHex::Address(map.ptr());
@@ -1893,12 +1903,12 @@ void V8FileLogger::MapCreate(Map map) {
 }
 
 void V8FileLogger::MapDetails(Map map) {
-  if (!FLAG_log_maps) return;
+  if (!v8_flags.log_maps) return;
   DisallowGarbageCollection no_gc;
   MSG_BUILDER();
   msg << "map-details" << kNext << Time() << kNext << AsHex::Address(map.ptr())
       << kNext;
-  if (FLAG_log_maps_details) {
+  if (v8_flags.log_maps_details) {
     std::ostringstream buffer;
     map.PrintMapDetails(buffer);
     msg << buffer.str().c_str();
@@ -1913,6 +1923,17 @@ EnumerateCompiledFunctions(Heap* heap) {
   std::vector<std::pair<Handle<SharedFunctionInfo>, Handle<AbstractCode>>>
       compiled_funcs;
   Isolate* isolate = heap->isolate();
+  auto hash = [](const std::pair<SharedFunctionInfo, AbstractCode>& p) {
+    return base::hash_combine(p.first.address(), p.second.address());
+  };
+  std::unordered_set<std::pair<SharedFunctionInfo, AbstractCode>,
+                     decltype(hash)>
+      seen(8, hash);
+
+  auto record = [&](SharedFunctionInfo sfi, AbstractCode c) {
+    if (auto [iter, inserted] = seen.emplace(sfi, c); inserted)
+      compiled_funcs.emplace_back(handle(sfi, isolate), handle(c, isolate));
+  };
 
   // Iterate the heap to find JSFunctions and record their optimized code.
   for (HeapObject obj = iterator.Next(); !obj.is_null();
@@ -1920,9 +1941,7 @@ EnumerateCompiledFunctions(Heap* heap) {
     if (obj.IsSharedFunctionInfo()) {
       SharedFunctionInfo sfi = SharedFunctionInfo::cast(obj);
       if (sfi.is_compiled() && !sfi.HasBytecodeArray()) {
-        compiled_funcs.emplace_back(
-            handle(sfi, isolate),
-            handle(AbstractCode::cast(sfi.abstract_code(isolate)), isolate));
+        record(sfi, AbstractCode::cast(sfi.abstract_code(isolate)));
       }
     } else if (obj.IsJSFunction()) {
       // Given that we no longer iterate over all optimized JSFunctions, we need
@@ -1933,9 +1952,8 @@ EnumerateCompiledFunctions(Heap* heap) {
       // only on a type feedback vector. We should make this mroe precise.
       if (function.HasAttachedOptimizedCode() &&
           Script::cast(function.shared().script()).HasValidSource()) {
-        compiled_funcs.emplace_back(
-            handle(function.shared(), isolate),
-            handle(AbstractCode::cast(FromCodeT(function.code())), isolate));
+        record(function.shared(),
+               AbstractCode::cast(FromCodeT(function.code())));
       }
     }
   }
@@ -1949,9 +1967,7 @@ EnumerateCompiledFunctions(Heap* heap) {
     for (SharedFunctionInfo sfi = sfi_iterator.Next(); !sfi.is_null();
          sfi = sfi_iterator.Next()) {
       if (sfi.is_compiled()) {
-        compiled_funcs.emplace_back(
-            handle(sfi, isolate),
-            handle(AbstractCode::cast(sfi.abstract_code(isolate)), isolate));
+        record(sfi, AbstractCode::cast(sfi.abstract_code(isolate)));
       }
     }
   }
@@ -2013,7 +2029,7 @@ void V8FileLogger::LogAllMaps() {
 }
 
 static void AddIsolateIdIfNeeded(std::ostream& os, Isolate* isolate) {
-  if (!FLAG_logfile_per_isolate) return;
+  if (!v8_flags.logfile_per_isolate) return;
   os << "isolate-" << isolate << "-" << base::OS::GetCurrentProcessId() << "-";
 }
 
@@ -2067,30 +2083,30 @@ bool V8FileLogger::SetUp(Isolate* isolate) {
   is_initialized_ = true;
 
   std::ostringstream log_file_name;
-  PrepareLogFileName(log_file_name, isolate, FLAG_logfile);
+  PrepareLogFileName(log_file_name, isolate, v8_flags.logfile);
   log_ = std::make_unique<LogFile>(this, log_file_name.str());
 
 #if V8_OS_LINUX
-  if (FLAG_perf_basic_prof) {
+  if (v8_flags.perf_basic_prof) {
     perf_basic_logger_ = std::make_unique<LinuxPerfBasicLogger>(isolate);
     AddLogEventListener(perf_basic_logger_.get());
   }
 
-  if (FLAG_perf_prof) {
+  if (v8_flags.perf_prof) {
     perf_jit_logger_ = std::make_unique<LinuxPerfJitLogger>(isolate);
     AddLogEventListener(perf_jit_logger_.get());
   }
 #else
   static_assert(
-      !FLAG_perf_prof.value(),
+      !v8_flags.perf_prof.value(),
       "--perf-prof should be statically disabled on non-Linux platforms");
   static_assert(
-      !FLAG_perf_basic_prof.value(),
+      !v8_flags.perf_basic_prof.value(),
       "--perf-basic-prof should be statically disabled on non-Linux platforms");
 #endif
 
 #ifdef ENABLE_GDB_JIT_INTERFACE
-  if (i::FLAG_gdbjit) {
+  if (v8_flags.gdbjit) {
     gdb_jit_logger_ =
         std::make_unique<JitLogger>(isolate, i::GDBJITInterface::EventHandler);
     AddLogEventListener(gdb_jit_logger_.get());
@@ -2098,25 +2114,16 @@ bool V8FileLogger::SetUp(Isolate* isolate) {
   }
 #endif  // ENABLE_GDB_JIT_INTERFACE
 
-#if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
-  if (i::FLAG_enable_etw_stack_walking) {
-    etw_jit_logger_ =
-        std::make_unique<JitLogger>(isolate, i::ETWJITInterface::EventHandler);
-    AddLogEventListener(etw_jit_logger_.get());
-    CHECK(isolate->logger()->is_listening_to_code_events());
-  }
-#endif  // defined(V8_OS_WIN)
-
-  if (FLAG_ll_prof) {
+  if (v8_flags.ll_prof) {
     ll_logger_ =
         std::make_unique<LowLevelLogger>(isolate, log_file_name.str().c_str());
     AddLogEventListener(ll_logger_.get());
   }
-  ticker_ = std::make_unique<Ticker>(isolate, FLAG_prof_sampling_interval);
-  if (FLAG_log) UpdateIsLogging(true);
+  ticker_ = std::make_unique<Ticker>(isolate, v8_flags.prof_sampling_interval);
+  if (v8_flags.log) UpdateIsLogging(true);
   timer_.Start();
-  if (FLAG_prof_cpp) {
-    CHECK(FLAG_log);
+  if (v8_flags.prof_cpp) {
+    CHECK(v8_flags.log);
     CHECK(is_logging());
     profiler_ = std::make_unique<Profiler>(isolate);
     profiler_->Engage();
@@ -2133,6 +2140,42 @@ void V8FileLogger::LateSetup(Isolate* isolate) {
 #endif
 }
 
+#if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
+void V8FileLogger::SetEtwCodeEventHandler(uint32_t options) {
+  DCHECK(v8_flags.enable_etw_stack_walking);
+  isolate_->UpdateLogObjectRelocation();
+#if V8_ENABLE_WEBASSEMBLY
+  wasm::GetWasmEngine()->EnableCodeLogging(isolate_);
+#endif  // V8_ENABLE_WEBASSEMBLY
+
+  if (!etw_jit_logger_) {
+    etw_jit_logger_ = std::make_unique<ETWJitLogger>(isolate_);
+    AddLogEventListener(etw_jit_logger_.get());
+    CHECK(isolate_->logger()->is_listening_to_code_events());
+  }
+
+  if (options & kJitCodeEventEnumExisting) {
+    // TODO(v8:11043) Here we log the existing code to all the listeners
+    // registered to this Isolate logger, while we should only log to the newly
+    // created ETWJitLogger. This should not generally be a problem because it
+    // is quite unlikely to have both file logger and ETW tracing both enabled
+    // by default.
+    HandleScope scope(isolate_);
+    LogBuiltins();
+    LogCodeObjects();
+    LogCompiledFunctions();
+  }
+}
+
+void V8FileLogger::ResetEtwCodeEventHandler() {
+  DCHECK(v8_flags.enable_etw_stack_walking);
+  if (etw_jit_logger_) {
+    RemoveLogEventListener(etw_jit_logger_.get());
+    etw_jit_logger_.reset();
+  }
+}
+#endif
+
 void V8FileLogger::SetCodeEventHandler(uint32_t options,
                                        JitCodeEventHandler event_handler) {
   if (jit_logger_) {
diff --git a/deps/v8/src/logging/log.h b/deps/v8/src/logging/log.h
index 18560d78e2373e..339031c4ff84b2 100644
--- a/deps/v8/src/logging/log.h
+++ b/deps/v8/src/logging/log.h
@@ -69,10 +69,14 @@ class Profiler;
 class SourcePosition;
 class Ticker;
 
+#if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
+class ETWJitLogger;
+#endif
+
 #undef LOG
-#define LOG(isolate, Call)                                         \
-  do {                                                             \
-    if (v8::internal::FLAG_log) (isolate)->v8_file_logger()->Call; \
+#define LOG(isolate, Call)                                             \
+  do {                                                                 \
+    if (v8::internal::v8_flags.log) (isolate)->v8_file_logger()->Call; \
   } while (false)
 
 #define LOG_CODE_EVENT(isolate, Call)                        \
@@ -134,6 +138,11 @@ class V8FileLogger : public LogEventListener {
   // Sets the current code event handler.
   void SetCodeEventHandler(uint32_t options, JitCodeEventHandler event_handler);
 
+#if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
+  void SetEtwCodeEventHandler(uint32_t options);
+  void ResetEtwCodeEventHandler();
+#endif
+
   sampler::Sampler* sampler();
   V8_EXPORT_PRIVATE std::string file_name() const;
 
@@ -261,7 +270,11 @@ class V8FileLogger : public LogEventListener {
   V8_EXPORT_PRIVATE bool is_logging();
 
   bool is_listening_to_code_events() override {
-    return is_logging() || jit_logger_ != nullptr;
+    return
+#if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
+        etw_jit_logger_ != nullptr ||
+#endif
+        is_logging() || jit_logger_ != nullptr;
   }
 
   void LogExistingFunction(Handle<SharedFunctionInfo> shared,
@@ -299,7 +312,7 @@ class V8FileLogger : public LogEventListener {
   void TickEvent(TickSample* sample, bool overflow);
   void RuntimeCallTimerEvent();
 
-  // Logs a StringEvent regardless of whether FLAG_log is true.
+  // Logs a StringEvent regardless of whether v8_flags.log is true.
   void UncheckedStringEvent(const char* name, const char* value);
 
   // Logs a scripts sources. Keeps track of all logged scripts to ensure that
@@ -345,7 +358,7 @@ class V8FileLogger : public LogEventListener {
   std::unique_ptr<JitLogger> gdb_jit_logger_;
 #endif
 #if defined(V8_OS_WIN) && defined(V8_ENABLE_ETW_STACK_WALKING)
-  std::unique_ptr<JitLogger> etw_jit_logger_;
+  std::unique_ptr<ETWJitLogger> etw_jit_logger_;
 #endif
   std::set<int> logged_source_code_;
   uint32_t next_source_info_id_ = 0;
diff --git a/deps/v8/src/logging/runtime-call-stats.cc b/deps/v8/src/logging/runtime-call-stats.cc
index 82f3979befa8be..e9f5e1755fb80b 100644
--- a/deps/v8/src/logging/runtime-call-stats.cc
+++ b/deps/v8/src/logging/runtime-call-stats.cc
@@ -157,7 +157,7 @@ RuntimeCallStats::RuntimeCallStats(ThreadType thread_type)
   for (int i = 0; i < kNumberOfCounters; i++) {
     this->counters_[i] = RuntimeCallCounter(kNames[i]);
   }
-  if (FLAG_rcs_cpu_time) {
+  if (v8_flags.rcs_cpu_time) {
     CHECK(base::ThreadTicks::IsSupported());
     base::ThreadTicks::WaitUntilInitialized();
     RuntimeCallTimer::Now = &RuntimeCallTimer::NowCPUTime;
diff --git a/deps/v8/src/logging/runtime-call-stats.h b/deps/v8/src/logging/runtime-call-stats.h
index 4c02309b7493dd..202c379f640777 100644
--- a/deps/v8/src/logging/runtime-call-stats.h
+++ b/deps/v8/src/logging/runtime-call-stats.h
@@ -368,6 +368,7 @@ class RuntimeCallTimer final {
   ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, Scheduling)                      \
   ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, SelectInstructions)              \
   ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, SimplifiedLowering)              \
+  ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, SimplifyLoops)                   \
   ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, StoreStoreElimination)           \
   ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, TraceScheduleAndVerify)          \
   ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, BuildTurboshaft)                 \
diff --git a/deps/v8/src/logging/tracing-flags.h b/deps/v8/src/logging/tracing-flags.h
index b3ccb896aa6ed8..7ebd8e3e1987e0 100644
--- a/deps/v8/src/logging/tracing-flags.h
+++ b/deps/v8/src/logging/tracing-flags.h
@@ -13,8 +13,8 @@ namespace v8 {
 namespace internal {
 
 // This struct contains a set of flags that can be modified from multiple
-// threads at runtime unlike the normal FLAG_-like flags which are not modified
-// after V8 instance is initialized.
+// threads at runtime unlike the normal v8_flags.-like flags which are not
+// modified after V8 instance is initialized.
 
 struct TracingFlags {
   static V8_EXPORT_PRIVATE std::atomic_uint runtime_stats;
diff --git a/deps/v8/src/maglev/maglev-assembler-inl.h b/deps/v8/src/maglev/maglev-assembler-inl.h
index f9fefb53f99a8f..309e74a50249af 100644
--- a/deps/v8/src/maglev/maglev-assembler-inl.h
+++ b/deps/v8/src/maglev/maglev-assembler-inl.h
@@ -5,6 +5,10 @@
 #ifndef V8_MAGLEV_MAGLEV_ASSEMBLER_INL_H_
 #define V8_MAGLEV_MAGLEV_ASSEMBLER_INL_H_
 
+#include <tuple>
+#include <type_traits>
+#include <utility>
+
 #include "src/codegen/macro-assembler-inl.h"
 #include "src/maglev/maglev-assembler.h"
 #include "src/maglev/maglev-basic-block.h"
@@ -131,6 +135,9 @@ struct CopyForDeferredHelper<MaglevCompilationInfo*>
 template <>
 struct CopyForDeferredHelper<Register>
     : public CopyForDeferredByValue<Register> {};
+template <>
+struct CopyForDeferredHelper<DoubleRegister>
+    : public CopyForDeferredByValue<DoubleRegister> {};
 // Bytecode offsets are copied by value.
 template <>
 struct CopyForDeferredHelper<BytecodeOffset>
@@ -187,10 +194,10 @@ struct FunctionArgumentsTupleHelper<R (&)(A...)> {
 };
 
 template <typename T>
-struct StripFirstTwoTupleArgs;
+struct StripFirstTupleArg;
 
-template <typename T1, typename T2, typename... T>
-struct StripFirstTwoTupleArgs<std::tuple<T1, T2, T...>> {
+template <typename T1, typename... T>
+struct StripFirstTupleArg<std::tuple<T1, T...>> {
   using Stripped = std::tuple<T...>;
 };
 
@@ -199,9 +206,8 @@ class DeferredCodeInfoImpl final : public DeferredCodeInfo {
  public:
   using FunctionPointer =
       typename FunctionArgumentsTupleHelper<Function>::FunctionPointer;
-  using Tuple = typename StripFirstTwoTupleArgs<
+  using Tuple = typename StripFirstTupleArg<
       typename FunctionArgumentsTupleHelper<Function>::Tuple>::Stripped;
-  static constexpr size_t kSize = FunctionArgumentsTupleHelper<Function>::kSize;
 
   template <typename... InArgs>
   explicit DeferredCodeInfoImpl(MaglevCompilationInfo* compilation_info,
@@ -213,18 +219,12 @@ class DeferredCodeInfoImpl final : public DeferredCodeInfo {
   DeferredCodeInfoImpl(DeferredCodeInfoImpl&&) = delete;
   DeferredCodeInfoImpl(const DeferredCodeInfoImpl&) = delete;
 
-  void Generate(MaglevAssembler* masm, Label* return_label) override {
-    DoCall(masm, return_label, std::make_index_sequence<kSize - 2>{});
+  void Generate(MaglevAssembler* masm) override {
+    std::apply(function,
+               std::tuple_cat(std::make_tuple(masm), std::move(args)));
   }
 
  private:
-  template <size_t... I>
-  auto DoCall(MaglevAssembler* masm, Label* return_label,
-              std::index_sequence<I...>) {
-    // TODO(leszeks): This could be replaced with std::apply in C++17.
-    return function(masm, return_label, std::get<I>(args)...);
-  }
-
   FunctionPointer function;
   Tuple args;
 };
@@ -234,6 +234,16 @@ class DeferredCodeInfoImpl final : public DeferredCodeInfo {
 template <typename Function, typename... Args>
 inline DeferredCodeInfo* MaglevAssembler::PushDeferredCode(
     Function&& deferred_code_gen, Args&&... args) {
+  using FunctionPointer =
+      typename detail::FunctionArgumentsTupleHelper<Function>::FunctionPointer;
+  static_assert(
+      std::is_invocable_v<FunctionPointer, MaglevAssembler*,
+                          decltype(detail::CopyForDeferred(
+                              std::declval<MaglevCompilationInfo*>(),
+                              std::declval<Args>()))...>,
+      "Parameters of deferred_code_gen function should match arguments into "
+      "PushDeferredCode");
+
   using DeferredCodeInfoT = detail::DeferredCodeInfoImpl<Function>;
   DeferredCodeInfoT* deferred_code =
       compilation_info()->zone()->New<DeferredCodeInfoT>(
@@ -252,11 +262,10 @@ inline void MaglevAssembler::JumpToDeferredIf(Condition cond,
                                               Args&&... args) {
   DeferredCodeInfo* deferred_code = PushDeferredCode<Function, Args...>(
       std::forward<Function>(deferred_code_gen), std::forward<Args>(args)...);
-  if (FLAG_code_comments) {
+  if (v8_flags.code_comments) {
     RecordComment("-- Jump to deferred code");
   }
   j(cond, &deferred_code->deferred_code_label);
-  bind(&deferred_code->return_label);
 }
 
 // ---
diff --git a/deps/v8/src/maglev/maglev-assembler.h b/deps/v8/src/maglev/maglev-assembler.h
index ec85919ef07b33..0bfac0bbdf512d 100644
--- a/deps/v8/src/maglev/maglev-assembler.h
+++ b/deps/v8/src/maglev/maglev-assembler.h
@@ -12,25 +12,6 @@ namespace v8 {
 namespace internal {
 namespace maglev {
 
-// Label allowed to be passed to deferred code.
-class ZoneLabelRef {
- public:
-  explicit ZoneLabelRef(Zone* zone) : label_(zone->New<Label>()) {}
-
-  static ZoneLabelRef UnsafeFromLabelPointer(Label* label) {
-    // This is an unsafe operation, {label} must be zone allocated.
-    return ZoneLabelRef(label);
-  }
-
-  Label* operator*() { return label_; }
-
- private:
-  Label* label_;
-
-  // Unsafe constructor. {label} must be zone allocated.
-  explicit ZoneLabelRef(Label* label) : label_(label) {}
-};
-
 class MaglevAssembler : public MacroAssembler {
  public:
   explicit MaglevAssembler(MaglevCodeGenState* code_gen_state)
@@ -103,6 +84,27 @@ class MaglevAssembler : public MacroAssembler {
   MaglevCodeGenState* const code_gen_state_;
 };
 
+// Label allowed to be passed to deferred code.
+class ZoneLabelRef {
+ public:
+  explicit ZoneLabelRef(Zone* zone) : label_(zone->New<Label>()) {}
+  explicit inline ZoneLabelRef(MaglevAssembler* masm)
+      : ZoneLabelRef(masm->compilation_info()->zone()) {}
+
+  static ZoneLabelRef UnsafeFromLabelPointer(Label* label) {
+    // This is an unsafe operation, {label} must be zone allocated.
+    return ZoneLabelRef(label);
+  }
+
+  Label* operator*() { return label_; }
+
+ private:
+  Label* label_;
+
+  // Unsafe constructor. {label} must be zone allocated.
+  explicit ZoneLabelRef(Label* label) : label_(label) {}
+};
+
 }  // namespace maglev
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/maglev/maglev-basic-block.h b/deps/v8/src/maglev/maglev-basic-block.h
index 11ca4c1c69e892..12c652942a213e 100644
--- a/deps/v8/src/maglev/maglev-basic-block.h
+++ b/deps/v8/src/maglev/maglev-basic-block.h
@@ -52,11 +52,6 @@ class BasicBlock {
 
   bool is_empty_block() const { return is_empty_block_; }
 
-  BasicBlock* empty_block_predecessor() const {
-    DCHECK(is_empty_block());
-    return empty_block_predecessor_;
-  }
-
   MergePointRegisterState& empty_block_register_state() {
     DCHECK(is_empty_block());
     return *empty_block_register_state_;
@@ -67,13 +62,12 @@ class BasicBlock {
     empty_block_register_state_ = register_state;
   }
 
-  void set_empty_block_predecessor(BasicBlock* predecessor) {
+  void set_empty_block() {
     DCHECK(nodes_.is_empty());
     DCHECK(control_node()->Is<Jump>());
     DCHECK_NULL(state_);
     is_empty_block_ = true;
     empty_block_register_state_ = nullptr;
-    empty_block_predecessor_ = predecessor;
   }
 
   Phi::List* phis() const {
@@ -112,7 +106,6 @@ class BasicBlock {
     MergePointInterpreterFrameState* state_;
     MergePointRegisterState* empty_block_register_state_;
   };
-  BasicBlock* empty_block_predecessor_;
   Label label_;
 };
 
diff --git a/deps/v8/src/maglev/maglev-code-gen-state.h b/deps/v8/src/maglev/maglev-code-gen-state.h
index 01fdb8216b3624..72c4c42d067ba8 100644
--- a/deps/v8/src/maglev/maglev-code-gen-state.h
+++ b/deps/v8/src/maglev/maglev-code-gen-state.h
@@ -24,16 +24,16 @@ class MaglevAssembler;
 
 class DeferredCodeInfo {
  public:
-  virtual void Generate(MaglevAssembler* masm, Label* return_label) = 0;
+  virtual void Generate(MaglevAssembler* masm) = 0;
   Label deferred_code_label;
-  Label return_label;
 };
 
 class MaglevCodeGenState {
  public:
-  MaglevCodeGenState(MaglevCompilationInfo* compilation_info,
+  MaglevCodeGenState(Isolate* isolate, MaglevCompilationInfo* compilation_info,
                      MaglevSafepointTableBuilder* safepoint_table_builder)
-      : compilation_info_(compilation_info),
+      : isolate_(isolate),
+        compilation_info_(compilation_info),
         safepoint_table_builder_(safepoint_table_builder) {}
 
   void set_tagged_slots(int slots) { tagged_slots_ = slots; }
@@ -45,6 +45,9 @@ class MaglevCodeGenState {
   const std::vector<DeferredCodeInfo*>& deferred_code() const {
     return deferred_code_;
   }
+  std::vector<DeferredCodeInfo*> TakeDeferredCode() {
+    return std::exchange(deferred_code_, std::vector<DeferredCodeInfo*>());
+  }
   void PushEagerDeopt(EagerDeoptInfo* info) { eager_deopts_.push_back(info); }
   void PushLazyDeopt(LazyDeoptInfo* info) { lazy_deopts_.push_back(info); }
   const std::vector<EagerDeoptInfo*>& eager_deopts() const {
@@ -60,7 +63,7 @@ class MaglevCodeGenState {
   compiler::NativeContextRef native_context() const {
     return broker()->target_native_context();
   }
-  Isolate* isolate() const { return compilation_info_->isolate(); }
+  Isolate* isolate() const { return isolate_; }
   compiler::JSHeapBroker* broker() const { return compilation_info_->broker(); }
   MaglevGraphLabeller* graph_labeller() const {
     return compilation_info_->graph_labeller();
@@ -73,6 +76,7 @@ class MaglevCodeGenState {
   MaglevCompilationInfo* compilation_info() const { return compilation_info_; }
 
  private:
+  Isolate* const isolate_;
   MaglevCompilationInfo* const compilation_info_;
   MaglevSafepointTableBuilder* const safepoint_table_builder_;
 
diff --git a/deps/v8/src/maglev/maglev-code-generator.cc b/deps/v8/src/maglev/maglev-code-generator.cc
index e1578c118bd5cf..7c72a9e040b6aa 100644
--- a/deps/v8/src/maglev/maglev-code-generator.cc
+++ b/deps/v8/src/maglev/maglev-code-generator.cc
@@ -286,6 +286,7 @@ class ParallelMoveResolver {
     if (has_cycle) {
       if (!scratch_has_cycle_start_) {
         Pop(kScratchRegT);
+        scratch_has_cycle_start_ = true;
       }
       EmitMovesFromSource(kScratchRegT, targets);
       scratch_has_cycle_start_ = false;
@@ -366,6 +367,7 @@ class ParallelMoveResolver {
     }
     if (scratch_has_cycle_start_ && !targets.stack_slots.empty()) {
       Push(kScratchRegT);
+      scratch_has_cycle_start_ = false;
     }
     for (uint32_t target_slot : targets.stack_slots) {
       DCHECK_EQ(moves_from_stack_slot_.find(target_slot),
@@ -432,203 +434,210 @@ class ParallelMoveResolver {
 
 class ExceptionHandlerTrampolineBuilder {
  public:
+  static void Build(MaglevAssembler* masm, NodeBase* node) {
+    ExceptionHandlerTrampolineBuilder builder(masm);
+    builder.EmitTrampolineFor(node);
+  }
+
+ private:
   explicit ExceptionHandlerTrampolineBuilder(MaglevAssembler* masm)
       : masm_(masm) {}
 
+  struct Move {
+    explicit Move(const ValueLocation& target, ValueNode* source)
+        : target(target), source(source) {}
+    const ValueLocation& target;
+    ValueNode* const source;
+  };
+  using MoveVector = base::SmallVector<Move, 16>;
+
   void EmitTrampolineFor(NodeBase* node) {
     DCHECK(node->properties().can_throw());
 
-    ExceptionHandlerInfo* handler_info = node->exception_handler_info();
+    ExceptionHandlerInfo* const handler_info = node->exception_handler_info();
     DCHECK(handler_info->HasExceptionHandler());
+    BasicBlock* const catch_block = handler_info->catch_block.block_ptr();
+    LazyDeoptInfo* const deopt_info = node->lazy_deopt_info();
+
+    // The exception handler trampoline resolves moves for exception phis and
+    // then jumps to the actual catch block. There are a few points worth
+    // noting:
+    //
+    // - All source locations are assumed to be stack slots, except the
+    // accumulator which is stored in kReturnRegister0. We don't emit an
+    // explicit move for it, instead it is pushed and popped at the boundaries
+    // of the entire move sequence (necessary due to materialisation).
+    //
+    // - Some values may require materialisation, i.e. heap number construction
+    // through calls to the NewHeapNumber builtin. To avoid potential conflicts
+    // with other moves (which may happen due to stack slot reuse, i.e. a
+    // target location of move A may equal source location of move B), we
+    // materialise and push results to new temporary stack slots before the
+    // main move sequence, and then pop results into their final target
+    // locations afterwards. Note this is only safe because a) materialised
+    // values are tagged and b) the stack walk treats unknown stack slots as
+    // tagged.
+
+    // TODO(v8:7700): Handle inlining.
 
-    BasicBlock* block = handler_info->catch_block.block_ptr();
-    LazyDeoptInfo* deopt_info = node->lazy_deopt_info();
+    ParallelMoveResolver<Register> direct_moves(masm_);
+    MoveVector materialising_moves;
+    bool save_accumulator = false;
+    RecordMoves(deopt_info->unit, catch_block, deopt_info->state.register_frame,
+                &direct_moves, &materialising_moves, &save_accumulator);
 
     __ bind(&handler_info->trampoline_entry);
-    ClearState();
-    // TODO(v8:7700): Handle inlining.
-    RecordMoves(deopt_info->unit, block, deopt_info->state.register_frame);
-    // We do moves that need to materialise values first, since we might need to
-    // call a builtin to create a HeapNumber, and therefore we would need to
-    // spill all registers.
-    DoMaterialiseMoves();
-    // Move the rest, we will not call HeapNumber anymore.
-    DoDirectMoves();
-    // Jump to the catch block.
-    __ jmp(block->label());
+    __ RecordComment("-- Exception handler trampoline START");
+    EmitMaterialisationsAndPushResults(materialising_moves, save_accumulator);
+    __ RecordComment("EmitMoves");
+    direct_moves.EmitMoves();
+    EmitPopMaterialisedResults(materialising_moves, save_accumulator);
+    __ jmp(catch_block->label());
+    __ RecordComment("-- Exception handler trampoline END");
   }
 
- private:
-  MaglevAssembler* const masm_;
-  using Move = std::pair<const ValueLocation&, ValueNode*>;
-  base::SmallVector<Move, 16> direct_moves_;
-  base::SmallVector<Move, 16> materialisation_moves_;
-  bool save_accumulator_ = false;
-
   MacroAssembler* masm() const { return masm_; }
 
-  void ClearState() {
-    direct_moves_.clear();
-    materialisation_moves_.clear();
-    save_accumulator_ = false;
-  }
-
-  void RecordMoves(const MaglevCompilationUnit& unit, BasicBlock* block,
-                   const CompactInterpreterFrameState* register_frame) {
-    for (Phi* phi : *block->phis()) {
-      DCHECK_EQ(phi->input_count(), 0);
+  void RecordMoves(const MaglevCompilationUnit& unit, BasicBlock* catch_block,
+                   const CompactInterpreterFrameState* register_frame,
+                   ParallelMoveResolver<Register>* direct_moves,
+                   MoveVector* materialising_moves, bool* save_accumulator) {
+    for (Phi* phi : *catch_block->phis()) {
+      DCHECK(phi->is_exception_phi());
       if (!phi->has_valid_live_range()) continue;
+
+      const ValueLocation& target = phi->result();
       if (phi->owner() == interpreter::Register::virtual_accumulator()) {
         // If the accumulator is live, then it is the exception object located
-        // at kReturnRegister0. This is also the first phi in the list.
-        DCHECK_EQ(phi->result().AssignedGeneralRegister(), kReturnRegister0);
-        save_accumulator_ = true;
+        // at kReturnRegister0.  We don't emit a move for it since the value is
+        // already in the right spot, but we do have to ensure it isn't
+        // clobbered by calls to the NewHeapNumber builtin during
+        // materialisation.
+        DCHECK_EQ(target.AssignedGeneralRegister(), kReturnRegister0);
+        *save_accumulator = true;
         continue;
       }
-      ValueNode* value = register_frame->GetValueOf(phi->owner(), unit);
-      DCHECK_NOT_NULL(value);
-      switch (value->properties().value_representation()) {
+
+      ValueNode* const source = register_frame->GetValueOf(phi->owner(), unit);
+      DCHECK_NOT_NULL(source);
+      // All registers must have been spilled due to the call.
+      // TODO(jgruber): Which call? Because any throw requires at least a call
+      // to Runtime::kThrowFoo?
+      DCHECK(!source->allocation().IsRegister());
+
+      switch (source->properties().value_representation()) {
         case ValueRepresentation::kTagged:
-          // All registers should have been spilled due to the call.
-          DCHECK(!value->allocation().IsRegister());
-          direct_moves_.emplace_back(phi->result(), value);
+          direct_moves->RecordMove(
+              source, source->allocation(),
+              compiler::AllocatedOperand::cast(target.operand()));
           break;
         case ValueRepresentation::kInt32:
-          if (value->allocation().IsConstant()) {
-            direct_moves_.emplace_back(phi->result(), value);
+          if (source->allocation().IsConstant()) {
+            // TODO(jgruber): Why is it okay for Int32 constants to remain
+            // untagged while non-constants are unconditionally smi-tagged or
+            // converted to a HeapNumber during materialisation?
+            direct_moves->RecordMove(
+                source, source->allocation(),
+                compiler::AllocatedOperand::cast(target.operand()));
           } else {
-            materialisation_moves_.emplace_back(phi->result(), value);
+            materialising_moves->emplace_back(target, source);
           }
           break;
         case ValueRepresentation::kFloat64:
-          materialisation_moves_.emplace_back(phi->result(), value);
+          materialising_moves->emplace_back(target, source);
           break;
       }
     }
   }
 
-  void DoMaterialiseMoves() {
-    if (materialisation_moves_.size() == 0) return;
-    if (save_accumulator_) {
+  void EmitMaterialisationsAndPushResults(const MoveVector& moves,
+                                          bool save_accumulator) const {
+    if (moves.size() == 0) return;
+
+    // It's possible to optimize this further, at the cost of additional
+    // complexity:
+    //
+    // - If the target location is a register, we could theoretically move the
+    // materialised result there immediately, with the additional complication
+    // that following calls to NewHeapNumber may clobber the register.
+    //
+    // - If the target location is a stack slot which is neither a source nor
+    // target slot for any other moves (direct or materialising), we could move
+    // the result there directly instead of pushing and later popping it. This
+    // doesn't seem worth the extra code complexity though, given we are
+    // talking about a presumably infrequent case for exception handlers.
+
+    __ RecordComment("EmitMaterialisationsAndPushResults");
+    if (save_accumulator) __ Push(kReturnRegister0);
+    for (const Move& move : moves) {
+      MaterialiseTo(move.source, kReturnRegister0);
       __ Push(kReturnRegister0);
     }
-    for (auto it = materialisation_moves_.begin();
-         it < materialisation_moves_.end(); it++) {
-      switch (it->second->properties().value_representation()) {
-        case ValueRepresentation::kInt32: {
-          EmitMoveInt32ToReturnValue0(it->second);
-          break;
-        }
-        case ValueRepresentation::kFloat64:
-          EmitMoveFloat64ToReturnValue0(it->second);
-          break;
-        case ValueRepresentation::kTagged:
-          UNREACHABLE();
-      }
-      if (it->first.operand().IsStackSlot()) {
-        // If the target is in a stack sot, we can immediately move
-        // the result to it.
-        __ movq(ToMemOperand(it->first), kReturnRegister0);
-      } else {
-        // We spill the result to the stack, in order to be able to call the
-        // NewHeapNumber builtin again, however we don't need to push the result
-        // of the last one.
-        if (it != materialisation_moves_.end() - 1) {
-          __ Push(kReturnRegister0);
-        }
-      }
-    }
-    // If the last move target is a register, the result should be in
-    // kReturnValue0, so so we emit a simple move. Otherwise it has already been
-    // moved.
-    const ValueLocation& last_move_target =
-        materialisation_moves_.rbegin()->first;
-    if (last_move_target.operand().IsRegister()) {
-      __ Move(last_move_target.AssignedGeneralRegister(), kReturnRegister0);
-    }
-    // And then pop the rest.
-    for (auto it = materialisation_moves_.rbegin() + 1;
-         it < materialisation_moves_.rend(); it++) {
-      if (it->first.operand().IsRegister()) {
-        __ Pop(it->first.AssignedGeneralRegister());
-      }
-    }
-    if (save_accumulator_) {
-      __ Pop(kReturnRegister0);
-    }
   }
 
-  void DoDirectMoves() {
-    for (auto& [target, value] : direct_moves_) {
-      if (value->allocation().IsConstant()) {
-        if (Int32Constant* constant = value->TryCast<Int32Constant>()) {
-          EmitMove(target, Smi::FromInt(constant->value()));
-        } else {
-          // Int32 and Float64 constants should have already been dealt with.
-          DCHECK_EQ(value->properties().value_representation(),
-                    ValueRepresentation::kTagged);
-          EmitConstantLoad(target, value);
-        }
+  void EmitPopMaterialisedResults(const MoveVector& moves,
+                                  bool save_accumulator) const {
+    if (moves.size() == 0) return;
+    __ RecordComment("EmitPopMaterialisedResults");
+    for (auto it = moves.rbegin(); it < moves.rend(); it++) {
+      const ValueLocation& target = it->target;
+      if (target.operand().IsRegister()) {
+        __ Pop(target.AssignedGeneralRegister());
       } else {
-        EmitMove(target, ToMemOperand(value));
+        DCHECK(target.operand().IsStackSlot());
+        __ Pop(kScratchRegister);
+        __ movq(masm_->ToMemOperand(target.operand()), kScratchRegister);
       }
     }
-  }
 
-  void EmitMoveInt32ToReturnValue0(ValueNode* value) {
-    // We consider Int32Constants together with tagged values.
-    DCHECK(!value->allocation().IsConstant());
-    using D = NewHeapNumberDescriptor;
-    Label done;
-    __ movq(kReturnRegister0, ToMemOperand(value));
-    __ addl(kReturnRegister0, kReturnRegister0);
-    __ j(no_overflow, &done);
-    // If we overflow, instead of bailing out (deopting), we change
-    // representation to a HeapNumber.
-    __ Cvtlsi2sd(D::GetDoubleRegisterParameter(D::kValue), ToMemOperand(value));
-    __ CallBuiltin(Builtin::kNewHeapNumber);
-    __ bind(&done);
+    if (save_accumulator) __ Pop(kReturnRegister0);
   }
 
-  void EmitMoveFloat64ToReturnValue0(ValueNode* value) {
+  void MaterialiseTo(ValueNode* value, Register dst) const {
     using D = NewHeapNumberDescriptor;
-    if (Float64Constant* constant = value->TryCast<Float64Constant>()) {
-      __ Move(D::GetDoubleRegisterParameter(D::kValue), constant->value());
-    } else {
-      __ Movsd(D::GetDoubleRegisterParameter(D::kValue), ToMemOperand(value));
+    switch (value->properties().value_representation()) {
+      case ValueRepresentation::kInt32: {
+        // We consider Int32Constants together with tagged values.
+        DCHECK(!value->allocation().IsConstant());
+        Label done;
+        __ movq(dst, ToMemOperand(value));
+        __ addl(dst, dst);
+        __ j(no_overflow, &done);
+        // If we overflow, instead of bailing out (deopting), we change
+        // representation to a HeapNumber.
+        __ Cvtlsi2sd(D::GetDoubleRegisterParameter(D::kValue),
+                     ToMemOperand(value));
+        __ CallBuiltin(Builtin::kNewHeapNumber);
+        __ Move(dst, kReturnRegister0);
+        __ bind(&done);
+        break;
+      }
+      case ValueRepresentation::kFloat64:
+        if (Float64Constant* constant = value->TryCast<Float64Constant>()) {
+          __ Move(D::GetDoubleRegisterParameter(D::kValue), constant->value());
+        } else {
+          __ Movsd(D::GetDoubleRegisterParameter(D::kValue),
+                   ToMemOperand(value));
+        }
+        __ CallBuiltin(Builtin::kNewHeapNumber);
+        __ Move(dst, kReturnRegister0);
+        break;
+      case ValueRepresentation::kTagged:
+        UNREACHABLE();
     }
-    __ CallBuiltin(Builtin::kNewHeapNumber);
   }
 
-  MemOperand ToMemOperand(ValueNode* node) {
+  MemOperand ToMemOperand(ValueNode* node) const {
     DCHECK(node->allocation().IsAnyStackSlot());
     return masm_->ToMemOperand(node->allocation());
   }
 
-  MemOperand ToMemOperand(const ValueLocation& location) {
+  MemOperand ToMemOperand(const ValueLocation& location) const {
     DCHECK(location.operand().IsStackSlot());
     return masm_->ToMemOperand(location.operand());
   }
 
-  template <typename Operand>
-  void EmitMove(const ValueLocation& dst, Operand src) {
-    if (dst.operand().IsRegister()) {
-      __ Move(dst.AssignedGeneralRegister(), src);
-    } else {
-      __ Move(kScratchRegister, src);
-      __ movq(ToMemOperand(dst), kScratchRegister);
-    }
-  }
-
-  void EmitConstantLoad(const ValueLocation& dst, ValueNode* value) {
-    DCHECK(value->allocation().IsConstant());
-    if (dst.operand().IsRegister()) {
-      value->LoadToRegister(masm_, dst.AssignedGeneralRegister());
-    } else {
-      value->LoadToRegister(masm_, kScratchRegister);
-      __ movq(ToMemOperand(dst), kScratchRegister);
-    }
-  }
+  MaglevAssembler* const masm_;
 };
 
 class MaglevCodeGeneratingNodeProcessor {
@@ -637,134 +646,145 @@ class MaglevCodeGeneratingNodeProcessor {
       : masm_(masm) {}
 
   void PreProcessGraph(Graph* graph) {
-    if (FLAG_maglev_break_on_entry) {
+    code_gen_state()->set_untagged_slots(graph->untagged_stack_slots());
+    code_gen_state()->set_tagged_slots(graph->tagged_stack_slots());
+
+    if (v8_flags.maglev_break_on_entry) {
       __ int3();
     }
 
-    __ BailoutIfDeoptimized(rbx);
+    if (v8_flags.maglev_ool_prologue) {
+      // Call the out-of-line prologue (with parameters passed on the stack).
+      __ Push(Immediate(code_gen_state()->stack_slots() * kSystemPointerSize));
+      __ Push(Immediate(code_gen_state()->tagged_slots() * kSystemPointerSize));
+      __ CallBuiltin(Builtin::kMaglevOutOfLinePrologue);
+    } else {
+      __ BailoutIfDeoptimized(rbx);
 
-    // Tiering support.
-    // TODO(jgruber): Extract to a builtin (the tiering prologue is ~230 bytes
-    // per Maglev code object on x64).
-    {
-      // Scratch registers. Don't clobber regs related to the calling
-      // convention (e.g. kJavaScriptCallArgCountRegister).
-      Register flags = rcx;
-      Register feedback_vector = r9;
-
-      // Load the feedback vector.
-      __ LoadTaggedPointerField(
-          feedback_vector,
-          FieldOperand(kJSFunctionRegister, JSFunction::kFeedbackCellOffset));
-      __ LoadTaggedPointerField(
-          feedback_vector, FieldOperand(feedback_vector, Cell::kValueOffset));
-      __ AssertFeedbackVector(feedback_vector);
-
-      Label flags_need_processing, next;
-      __ LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
-          flags, feedback_vector, CodeKind::MAGLEV, &flags_need_processing);
-      __ jmp(&next);
-
-      __ bind(&flags_need_processing);
+      // Tiering support.
+      // TODO(jgruber): Extract to a builtin (the tiering prologue is ~230 bytes
+      // per Maglev code object on x64).
       {
-        ASM_CODE_COMMENT_STRING(masm(), "Optimized marker check");
-        __ MaybeOptimizeCodeOrTailCallOptimizedCodeSlot(
-            flags, feedback_vector, kJSFunctionRegister, JumpMode::kJump);
-        __ Trap();
-      }
-
-      __ bind(&next);
-    }
-
-    __ EnterFrame(StackFrame::MAGLEV);
+        // Scratch registers. Don't clobber regs related to the calling
+        // convention (e.g. kJavaScriptCallArgCountRegister).
+        Register flags = rcx;
+        Register feedback_vector = r9;
+
+        // Load the feedback vector.
+        __ LoadTaggedPointerField(
+            feedback_vector,
+            FieldOperand(kJSFunctionRegister, JSFunction::kFeedbackCellOffset));
+        __ LoadTaggedPointerField(
+            feedback_vector, FieldOperand(feedback_vector, Cell::kValueOffset));
+        __ AssertFeedbackVector(feedback_vector);
+
+        Label flags_need_processing, next;
+        __ LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(
+            flags, feedback_vector, CodeKind::MAGLEV, &flags_need_processing);
+        __ jmp(&next);
+
+        __ bind(&flags_need_processing);
+        {
+          ASM_CODE_COMMENT_STRING(masm(), "Optimized marker check");
+          __ OptimizeCodeOrTailCallOptimizedCodeSlot(
+              flags, feedback_vector, kJSFunctionRegister, JumpMode::kJump);
+          __ Trap();
+        }
 
-    // Save arguments in frame.
-    // TODO(leszeks): Consider eliding this frame if we don't make any calls
-    // that could clobber these registers.
-    __ Push(kContextRegister);
-    __ Push(kJSFunctionRegister);              // Callee's JS function.
-    __ Push(kJavaScriptCallArgCountRegister);  // Actual argument count.
+        __ bind(&next);
+      }
 
-    code_gen_state()->set_untagged_slots(graph->untagged_stack_slots());
-    code_gen_state()->set_tagged_slots(graph->tagged_stack_slots());
+      __ EnterFrame(StackFrame::MAGLEV);
 
-    {
-      ASM_CODE_COMMENT_STRING(masm(), " Stack/interrupt check");
-      // Stack check. This folds the checks for both the interrupt stack limit
-      // check and the real stack limit into one by just checking for the
-      // interrupt limit. The interrupt limit is either equal to the real stack
-      // limit or tighter. By ensuring we have space until that limit after
-      // building the frame we can quickly precheck both at once.
-      __ Move(kScratchRegister, rsp);
-      // TODO(leszeks): Include a max call argument size here.
-      __ subq(kScratchRegister,
-              Immediate(code_gen_state()->stack_slots() * kSystemPointerSize));
-      __ cmpq(kScratchRegister,
-              __ StackLimitAsOperand(StackLimitKind::kInterruptStackLimit));
+      // Save arguments in frame.
+      // TODO(leszeks): Consider eliding this frame if we don't make any calls
+      // that could clobber these registers.
+      __ Push(kContextRegister);
+      __ Push(kJSFunctionRegister);              // Callee's JS function.
+      __ Push(kJavaScriptCallArgCountRegister);  // Actual argument count.
 
-      __ j(below, &deferred_call_stack_guard_);
-      __ bind(&deferred_call_stack_guard_return_);
-    }
+      {
+        ASM_CODE_COMMENT_STRING(masm(), " Stack/interrupt check");
+        // Stack check. This folds the checks for both the interrupt stack limit
+        // check and the real stack limit into one by just checking for the
+        // interrupt limit. The interrupt limit is either equal to the real
+        // stack limit or tighter. By ensuring we have space until that limit
+        // after building the frame we can quickly precheck both at once.
+        __ Move(kScratchRegister, rsp);
+        // TODO(leszeks): Include a max call argument size here.
+        __ subq(kScratchRegister, Immediate(code_gen_state()->stack_slots() *
+                                            kSystemPointerSize));
+        __ cmpq(kScratchRegister,
+                __ StackLimitAsOperand(StackLimitKind::kInterruptStackLimit));
+
+        __ j(below, &deferred_call_stack_guard_);
+        __ bind(&deferred_call_stack_guard_return_);
+      }
 
-    // Initialize stack slots.
-    if (graph->tagged_stack_slots() > 0) {
-      ASM_CODE_COMMENT_STRING(masm(), "Initializing stack slots");
-      // TODO(leszeks): Consider filling with xmm + movdqa instead.
-      __ Move(rax, Immediate(0));
-
-      // Magic value. Experimentally, an unroll size of 8 doesn't seem any worse
-      // than fully unrolled pushes.
-      const int kLoopUnrollSize = 8;
-      int tagged_slots = graph->tagged_stack_slots();
-      if (tagged_slots < 2 * kLoopUnrollSize) {
-        // If the frame is small enough, just unroll the frame fill completely.
-        for (int i = 0; i < tagged_slots; ++i) {
-          __ pushq(rax);
-        }
-      } else {
-        // Extract the first few slots to round to the unroll size.
-        int first_slots = tagged_slots % kLoopUnrollSize;
-        for (int i = 0; i < first_slots; ++i) {
-          __ pushq(rax);
-        }
-        __ Move(rbx, Immediate(tagged_slots / kLoopUnrollSize));
-        // We enter the loop unconditionally, so make sure we need to loop at
-        // least once.
-        DCHECK_GT(tagged_slots / kLoopUnrollSize, 0);
-        Label loop;
-        __ bind(&loop);
-        for (int i = 0; i < kLoopUnrollSize; ++i) {
-          __ pushq(rax);
+      // Initialize stack slots.
+      if (graph->tagged_stack_slots() > 0) {
+        ASM_CODE_COMMENT_STRING(masm(), "Initializing stack slots");
+        // TODO(leszeks): Consider filling with xmm + movdqa instead.
+        __ Move(rax, Immediate(0));
+
+        // Magic value. Experimentally, an unroll size of 8 doesn't seem any
+        // worse than fully unrolled pushes.
+        const int kLoopUnrollSize = 8;
+        int tagged_slots = graph->tagged_stack_slots();
+        if (tagged_slots < 2 * kLoopUnrollSize) {
+          // If the frame is small enough, just unroll the frame fill
+          // completely.
+          for (int i = 0; i < tagged_slots; ++i) {
+            __ pushq(rax);
+          }
+        } else {
+          // Extract the first few slots to round to the unroll size.
+          int first_slots = tagged_slots % kLoopUnrollSize;
+          for (int i = 0; i < first_slots; ++i) {
+            __ pushq(rax);
+          }
+          __ Move(rbx, Immediate(tagged_slots / kLoopUnrollSize));
+          // We enter the loop unconditionally, so make sure we need to loop at
+          // least once.
+          DCHECK_GT(tagged_slots / kLoopUnrollSize, 0);
+          Label loop;
+          __ bind(&loop);
+          for (int i = 0; i < kLoopUnrollSize; ++i) {
+            __ pushq(rax);
+          }
+          __ decl(rbx);
+          __ j(greater, &loop);
         }
-        __ decl(rbx);
-        __ j(greater, &loop);
       }
-    }
-    if (graph->untagged_stack_slots() > 0) {
-      // Extend rsp by the size of the remaining untagged part of the frame, no
-      // need to initialise these.
-      __ subq(rsp,
-              Immediate(graph->untagged_stack_slots() * kSystemPointerSize));
+      if (graph->untagged_stack_slots() > 0) {
+        // Extend rsp by the size of the remaining untagged part of the frame,
+        // no need to initialise these.
+        __ subq(rsp,
+                Immediate(graph->untagged_stack_slots() * kSystemPointerSize));
+      }
     }
   }
 
   void PostProcessGraph(Graph*) {
     __ int3();
-    __ bind(&deferred_call_stack_guard_);
-    ASM_CODE_COMMENT_STRING(masm(), "Stack/interrupt call");
-    // Save any registers that can be referenced by RegisterInput.
-    // TODO(leszeks): Only push those that are used by the graph.
-    __ PushAll(RegisterInput::kAllowedRegisters);
-    // Push the frame size
-    __ Push(Immediate(
-        Smi::FromInt(code_gen_state()->stack_slots() * kSystemPointerSize)));
-    __ CallRuntime(Runtime::kStackGuardWithGap, 1);
-    __ PopAll(RegisterInput::kAllowedRegisters);
-    __ jmp(&deferred_call_stack_guard_return_);
+
+    if (!v8_flags.maglev_ool_prologue) {
+      __ bind(&deferred_call_stack_guard_);
+      ASM_CODE_COMMENT_STRING(masm(), "Stack/interrupt call");
+      // Save any registers that can be referenced by RegisterInput.
+      // TODO(leszeks): Only push those that are used by the graph.
+      __ PushAll(RegisterInput::kAllowedRegisters);
+      // Push the frame size
+      __ Push(Immediate(
+          Smi::FromInt(code_gen_state()->stack_slots() * kSystemPointerSize)));
+      __ CallRuntime(Runtime::kStackGuardWithGap, 1);
+      __ PopAll(RegisterInput::kAllowedRegisters);
+      __ jmp(&deferred_call_stack_guard_return_);
+    }
   }
 
   void PreProcessBasicBlock(BasicBlock* block) {
-    if (FLAG_code_comments) {
+    if (v8_flags.code_comments) {
       std::stringstream ss;
       ss << "-- Block b" << graph_labeller()->BlockId(block);
       __ RecordComment(ss.str());
@@ -775,14 +795,14 @@ class MaglevCodeGeneratingNodeProcessor {
 
   template <typename NodeT>
   void Process(NodeT* node, const ProcessingState& state) {
-    if (FLAG_code_comments) {
+    if (v8_flags.code_comments) {
       std::stringstream ss;
       ss << "--   " << graph_labeller()->NodeId(node) << ": "
          << PrintNode(graph_labeller(), node);
       __ RecordComment(ss.str());
     }
 
-    if (FLAG_debug_code) {
+    if (v8_flags.debug_code) {
       __ movq(kScratchRegister, rbp);
       __ subq(kScratchRegister, rsp);
       __ cmpq(kScratchRegister,
@@ -806,7 +826,7 @@ class MaglevCodeGeneratingNodeProcessor {
             compiler::AllocatedOperand::cast(value_node->result().operand());
         // We shouldn't spill nodes which already output to the stack.
         if (!source.IsAnyStackSlot()) {
-          if (FLAG_code_comments) __ RecordComment("--   Spill:");
+          if (v8_flags.code_comments) __ RecordComment("--   Spill:");
           if (source.IsRegister()) {
             __ movq(masm()->GetStackSlot(value_node->spill_slot()),
                     ToRegister(source));
@@ -851,7 +871,7 @@ class MaglevCodeGeneratingNodeProcessor {
         // TODO(leszeks): We should remove dead phis entirely and turn this into
         // a DCHECK.
         if (!phi->has_valid_live_range()) {
-          if (FLAG_code_comments) {
+          if (v8_flags.code_comments) {
             std::stringstream ss;
             ss << "--   * "
                << phi->input(state.block()->predecessor_id()).operand() << " → "
@@ -866,7 +886,7 @@ class MaglevCodeGeneratingNodeProcessor {
         compiler::InstructionOperand source = input.operand();
         compiler::AllocatedOperand target =
             compiler::AllocatedOperand::cast(phi->result().operand());
-        if (FLAG_code_comments) {
+        if (v8_flags.code_comments) {
           std::stringstream ss;
           ss << "--   * " << source << " → " << target << " (n"
              << graph_labeller()->NodeId(phi) << ")";
@@ -889,7 +909,7 @@ class MaglevCodeGeneratingNodeProcessor {
           if (LoadMergeState(state, &node, &merge)) {
             compiler::InstructionOperand source =
                 merge->operand(predecessor_id);
-            if (FLAG_code_comments) {
+            if (v8_flags.code_comments) {
               std::stringstream ss;
               ss << "--   * " << source << " → " << reg;
               __ RecordComment(ss.str());
@@ -909,7 +929,7 @@ class MaglevCodeGeneratingNodeProcessor {
           if (LoadMergeState(state, &node, &merge)) {
             compiler::InstructionOperand source =
                 merge->operand(predecessor_id);
-            if (FLAG_code_comments) {
+            if (v8_flags.code_comments) {
               std::stringstream ss;
               ss << "--   * " << source << " → " << reg;
               __ RecordComment(ss.str());
@@ -943,17 +963,19 @@ class MaglevCodeGeneratingNodeProcessor {
 
 class MaglevCodeGeneratorImpl final {
  public:
-  static MaybeHandle<Code> Generate(MaglevCompilationInfo* compilation_info,
+  static MaybeHandle<Code> Generate(Isolate* isolate,
+                                    MaglevCompilationInfo* compilation_info,
                                     Graph* graph) {
-    return MaglevCodeGeneratorImpl(compilation_info, graph).Generate();
+    return MaglevCodeGeneratorImpl(isolate, compilation_info, graph).Generate();
   }
 
  private:
-  MaglevCodeGeneratorImpl(MaglevCompilationInfo* compilation_info, Graph* graph)
+  MaglevCodeGeneratorImpl(Isolate* isolate,
+                          MaglevCompilationInfo* compilation_info, Graph* graph)
       : safepoint_table_builder_(compilation_info->zone(),
                                  graph->tagged_stack_slots(),
                                  graph->untagged_stack_slots()),
-        code_gen_state_(compilation_info, safepoint_table_builder()),
+        code_gen_state_(isolate, compilation_info, safepoint_table_builder()),
         masm_(&code_gen_state_),
         processor_(&masm_),
         graph_(graph) {}
@@ -968,15 +990,20 @@ class MaglevCodeGeneratorImpl final {
     processor_.ProcessGraph(graph_);
     EmitDeferredCode();
     EmitDeopts();
-    EmitExceptionHandlersTrampolines();
+    EmitExceptionHandlerTrampolines();
   }
 
   void EmitDeferredCode() {
-    for (DeferredCodeInfo* deferred_code : code_gen_state_.deferred_code()) {
-      __ RecordComment("-- Deferred block");
-      __ bind(&deferred_code->deferred_code_label);
-      deferred_code->Generate(masm(), &deferred_code->return_label);
-      __ Trap();
+    // Loop over deferred_code() multiple times, clearing the vector on each
+    // outer loop, so that deferred code can itself emit deferred code.
+    while (!code_gen_state_.deferred_code().empty()) {
+      for (DeferredCodeInfo* deferred_code :
+           code_gen_state_.TakeDeferredCode()) {
+        __ RecordComment("-- Deferred block");
+        __ bind(&deferred_code->deferred_code_label);
+        deferred_code->Generate(masm());
+        __ Trap();
+      }
     }
   }
 
@@ -1014,12 +1041,11 @@ class MaglevCodeGeneratorImpl final {
     }
   }
 
-  void EmitExceptionHandlersTrampolines() {
+  void EmitExceptionHandlerTrampolines() {
     if (code_gen_state_.handlers().size() == 0) return;
-    ExceptionHandlerTrampolineBuilder builder(masm());
-    __ RecordComment("-- Exception handlers trampolines");
+    __ RecordComment("-- Exception handler trampolines");
     for (NodeBase* node : code_gen_state_.handlers()) {
-      builder.EmitTrampolineFor(node);
+      ExceptionHandlerTrampolineBuilder::Build(masm(), node);
     }
   }
 
@@ -1151,9 +1177,7 @@ class MaglevCodeGeneratorImpl final {
     return stack_slot_count() + StandardFrameConstants::kFixedSlotCount;
   }
 
-  Isolate* isolate() const {
-    return code_gen_state_.compilation_info()->isolate();
-  }
+  Isolate* isolate() const { return code_gen_state_.isolate(); }
   MaglevAssembler* masm() { return &masm_; }
   MaglevSafepointTableBuilder* safepoint_table_builder() {
     return &safepoint_table_builder_;
@@ -1171,8 +1195,8 @@ class MaglevCodeGeneratorImpl final {
 
 // static
 MaybeHandle<Code> MaglevCodeGenerator::Generate(
-    MaglevCompilationInfo* compilation_info, Graph* graph) {
-  return MaglevCodeGeneratorImpl::Generate(compilation_info, graph);
+    Isolate* isolate, MaglevCompilationInfo* compilation_info, Graph* graph) {
+  return MaglevCodeGeneratorImpl::Generate(isolate, compilation_info, graph);
 }
 
 }  // namespace maglev
diff --git a/deps/v8/src/maglev/maglev-code-generator.h b/deps/v8/src/maglev/maglev-code-generator.h
index 8dbd8921aba423..64ac1df0bc0737 100644
--- a/deps/v8/src/maglev/maglev-code-generator.h
+++ b/deps/v8/src/maglev/maglev-code-generator.h
@@ -16,7 +16,8 @@ class MaglevCompilationInfo;
 
 class MaglevCodeGenerator : public AllStatic {
  public:
-  static MaybeHandle<Code> Generate(MaglevCompilationInfo* compilation_info,
+  static MaybeHandle<Code> Generate(Isolate* isolate,
+                                    MaglevCompilationInfo* compilation_info,
                                     Graph* graph);
 };
 
diff --git a/deps/v8/src/maglev/maglev-compilation-info.cc b/deps/v8/src/maglev/maglev-compilation-info.cc
index e15a30cac74f26..300d7e66e12227 100644
--- a/deps/v8/src/maglev/maglev-compilation-info.cc
+++ b/deps/v8/src/maglev/maglev-compilation-info.cc
@@ -52,14 +52,17 @@ class V8_NODISCARD MaglevCompilationHandleScope final {
 MaglevCompilationInfo::MaglevCompilationInfo(Isolate* isolate,
                                              Handle<JSFunction> function)
     : zone_(isolate->allocator(), kMaglevZoneName),
-      isolate_(isolate),
       broker_(new compiler::JSHeapBroker(
-          isolate, zone(), FLAG_trace_heap_broker, CodeKind::MAGLEV))
-#define V(Name) , Name##_(FLAG_##Name)
+          isolate, zone(), v8_flags.trace_heap_broker, CodeKind::MAGLEV))
+#define V(Name) , Name##_(v8_flags.Name)
           MAGLEV_COMPILATION_FLAG_LIST(V)
 #undef V
-{
-  DCHECK(FLAG_maglev);
+      ,
+      specialize_to_function_context_(
+          v8_flags.maglev_function_context_specialization &&
+          function->raw_feedback_cell().map() ==
+              ReadOnlyRoots(isolate).one_closure_cell_map()) {
+  DCHECK(v8_flags.maglev);
 
   MaglevCompilationHandleScope compilation(isolate, this);
 
diff --git a/deps/v8/src/maglev/maglev-compilation-info.h b/deps/v8/src/maglev/maglev-compilation-info.h
index 049990f222a10a..ad65623bbde191 100644
--- a/deps/v8/src/maglev/maglev-compilation-info.h
+++ b/deps/v8/src/maglev/maglev-compilation-info.h
@@ -34,6 +34,8 @@ class Graph;
 class MaglevCompilationUnit;
 class MaglevGraphLabeller;
 
+// A list of v8_flag values copied into the MaglevCompilationInfo for
+// guaranteed {immutable,threadsafe} access.
 #define MAGLEV_COMPILATION_FLAG_LIST(V) \
   V(code_comments)                      \
   V(maglev)                             \
@@ -51,7 +53,6 @@ class MaglevCompilationInfo final {
   }
   ~MaglevCompilationInfo();
 
-  Isolate* isolate() const { return isolate_; }
   Zone* zone() { return &zone_; }
   compiler::JSHeapBroker* broker() const { return broker_.get(); }
   MaglevCompilationUnit* toplevel_compilation_unit() const {
@@ -88,6 +89,10 @@ class MaglevCompilationInfo final {
   MAGLEV_COMPILATION_FLAG_LIST(V)
 #undef V
 
+  bool specialize_to_function_context() const {
+    return specialize_to_function_context_;
+  }
+
   // Must be called from within a MaglevCompilationHandleScope. Transfers owned
   // handles (e.g. shared_, function_) to the new scope.
   void ReopenHandlesInNewHandleScope(Isolate* isolate);
@@ -105,7 +110,6 @@ class MaglevCompilationInfo final {
   MaglevCompilationInfo(Isolate* isolate, Handle<JSFunction> function);
 
   Zone zone_;
-  Isolate* const isolate_;
   const std::unique_ptr<compiler::JSHeapBroker> broker_;
   // Must be initialized late since it requires an initialized heap broker.
   MaglevCompilationUnit* toplevel_compilation_unit_ = nullptr;
@@ -123,6 +127,12 @@ class MaglevCompilationInfo final {
   MAGLEV_COMPILATION_FLAG_LIST(V)
 #undef V
 
+  // If enabled, the generated code can rely on the function context to be a
+  // constant (known at compile-time). This opens new optimization
+  // opportunities, but prevents code sharing between different function
+  // contexts.
+  const bool specialize_to_function_context_;
+
   // 1) PersistentHandles created via PersistentHandlesScope inside of
   //    CompilationHandleScope.
   // 2) Owned by MaglevCompilationInfo.
diff --git a/deps/v8/src/maglev/maglev-compilation-unit.cc b/deps/v8/src/maglev/maglev-compilation-unit.cc
index 16b8ae08ea49a6..590b2e3f785f92 100644
--- a/deps/v8/src/maglev/maglev-compilation-unit.cc
+++ b/deps/v8/src/maglev/maglev-compilation-unit.cc
@@ -40,8 +40,6 @@ compiler::JSHeapBroker* MaglevCompilationUnit::broker() const {
   return info_->broker();
 }
 
-Isolate* MaglevCompilationUnit::isolate() const { return info_->isolate(); }
-
 Zone* MaglevCompilationUnit::zone() const { return info_->zone(); }
 
 bool MaglevCompilationUnit::has_graph_labeller() const {
diff --git a/deps/v8/src/maglev/maglev-compilation-unit.h b/deps/v8/src/maglev/maglev-compilation-unit.h
index 5281fa16fc7500..000e93696551f9 100644
--- a/deps/v8/src/maglev/maglev-compilation-unit.h
+++ b/deps/v8/src/maglev/maglev-compilation-unit.h
@@ -42,7 +42,6 @@ class MaglevCompilationUnit : public ZoneObject {
   MaglevCompilationInfo* info() const { return info_; }
   const MaglevCompilationUnit* caller() const { return caller_; }
   compiler::JSHeapBroker* broker() const;
-  Isolate* isolate() const;
   LocalIsolate* local_isolate() const;
   Zone* zone() const;
   int register_count() const { return register_count_; }
diff --git a/deps/v8/src/maglev/maglev-compiler.cc b/deps/v8/src/maglev/maglev-compiler.cc
index 78decb2857af6f..2855bdbf5a1e19 100644
--- a/deps/v8/src/maglev/maglev-compiler.cc
+++ b/deps/v8/src/maglev/maglev-compiler.cc
@@ -35,6 +35,7 @@
 #include "src/maglev/maglev-graph-verifier.h"
 #include "src/maglev/maglev-graph.h"
 #include "src/maglev/maglev-interpreter-frame-state.h"
+#include "src/maglev/maglev-ir-inl.h"
 #include "src/maglev/maglev-ir.h"
 #include "src/maglev/maglev-regalloc.h"
 #include "src/maglev/maglev-vreg-allocator.h"
@@ -175,56 +176,24 @@ class UseMarkingProcessor {
     }
   }
 
-  void MarkCheckpointNodes(NodeBase* node, const MaglevCompilationUnit& unit,
-                           const CheckpointedInterpreterState* checkpoint_state,
-                           InputLocation* input_locations,
-                           LoopUsedNodes* loop_used_nodes,
-                           const ProcessingState& state, int& index) {
-    if (checkpoint_state->parent) {
-      MarkCheckpointNodes(node, *unit.caller(), checkpoint_state->parent,
-                          input_locations, loop_used_nodes, state, index);
-    }
-
-    const CompactInterpreterFrameState* register_frame =
-        checkpoint_state->register_frame;
-    int use_id = node->id();
-
-    register_frame->ForEachValue(
-        unit, [&](ValueNode* node, interpreter::Register reg) {
-          MarkUse(node, use_id, &input_locations[index++], loop_used_nodes);
-        });
-  }
   void MarkCheckpointNodes(NodeBase* node, const EagerDeoptInfo* deopt_info,
                            LoopUsedNodes* loop_used_nodes,
                            const ProcessingState& state) {
-    int index = 0;
-    MarkCheckpointNodes(node, deopt_info->unit, &deopt_info->state,
-                        deopt_info->input_locations, loop_used_nodes, state,
-                        index);
+    int use_id = node->id();
+    detail::DeepForEachInput(
+        deopt_info,
+        [&](ValueNode* node, interpreter::Register reg, InputLocation* input) {
+          MarkUse(node, use_id, input, loop_used_nodes);
+        });
   }
   void MarkCheckpointNodes(NodeBase* node, const LazyDeoptInfo* deopt_info,
                            LoopUsedNodes* loop_used_nodes,
                            const ProcessingState& state) {
-    int index = 0;
-
-    if (deopt_info->state.parent) {
-      MarkCheckpointNodes(node, *deopt_info->unit.caller(),
-                          deopt_info->state.parent, deopt_info->input_locations,
-                          loop_used_nodes, state, index);
-    }
-
-    // Handle the top-of-frame info manually, since we have to handle the result
-    // location.
-    const CompactInterpreterFrameState* register_frame =
-        deopt_info->state.register_frame;
     int use_id = node->id();
-
-    register_frame->ForEachValue(
-        deopt_info->unit, [&](ValueNode* node, interpreter::Register reg) {
-          // Skip over the result location.
-          if (deopt_info->IsResultRegister(reg)) return;
-          MarkUse(node, use_id, &deopt_info->input_locations[index++],
-                  loop_used_nodes);
+    detail::DeepForEachInput(
+        deopt_info,
+        [&](ValueNode* node, interpreter::Register reg, InputLocation* input) {
+          MarkUse(node, use_id, input, loop_used_nodes);
         });
   }
 
@@ -264,14 +233,13 @@ class TranslationArrayProcessor {
   }
 
  private:
-  const InputLocation* EmitDeoptFrame(const MaglevCompilationUnit& unit,
-                                      const CheckpointedInterpreterState& state,
-                                      const InputLocation* input_locations) {
+  void EmitDeoptFrame(const MaglevCompilationUnit& unit,
+                      const CheckpointedInterpreterState& state,
+                      const InputLocation* input_locations) {
     if (state.parent) {
       // Deopt input locations are in the order of deopt frame emission, so
       // update the pointer after emitting the parent frame.
-      input_locations =
-          EmitDeoptFrame(*unit.caller(), *state.parent, input_locations);
+      EmitDeoptFrame(*unit.caller(), *state.parent, input_locations);
     }
 
     // Returns are used for updating an accumulator or register after a lazy
@@ -283,9 +251,8 @@ class TranslationArrayProcessor {
         GetDeoptLiteral(*unit.shared_function_info().object()),
         unit.register_count(), return_offset, return_count);
 
-    return EmitDeoptFrameValues(unit, state.register_frame, input_locations,
-                                interpreter::Register::invalid_value(),
-                                return_count);
+    EmitDeoptFrameValues(unit, state.register_frame, input_locations,
+                         interpreter::Register::invalid_value(), return_count);
   }
 
   void EmitEagerDeopt(EagerDeoptInfo* deopt_info) {
@@ -314,8 +281,8 @@ class TranslationArrayProcessor {
     if (deopt_info->state.parent) {
       // Deopt input locations are in the order of deopt frame emission, so
       // update the pointer after emitting the parent frame.
-      input_locations = EmitDeoptFrame(
-          *unit.caller(), *deopt_info->state.parent, input_locations);
+      EmitDeoptFrame(*unit.caller(), *deopt_info->state.parent,
+                     input_locations);
     }
 
     // Return offsets are counted from the end of the translation frame, which
@@ -431,10 +398,10 @@ class TranslationArrayProcessor {
                            result_location.index() + result_size - 1);
   }
 
-  const InputLocation* EmitDeoptFrameValues(
+  void EmitDeoptFrameValues(
       const MaglevCompilationUnit& compilation_unit,
       const CompactInterpreterFrameState* checkpoint_state,
-      const InputLocation* input_locations,
+      const InputLocation*& input_location,
       interpreter::Register result_location, int result_size) {
     // Closure
     if (compilation_unit.inlining_depth() == 0) {
@@ -449,7 +416,6 @@ class TranslationArrayProcessor {
     // TODO(leszeks): The input locations array happens to be in the same order
     // as parameters+context+locals+accumulator are accessed here. We should
     // make this clearer and guard against this invariant failing.
-    const InputLocation* input_location = input_locations;
 
     // Parameters
     {
@@ -461,9 +427,9 @@ class TranslationArrayProcessor {
               translation_array_builder().StoreOptimizedOut();
             } else {
               EmitDeoptFrameSingleValue(value, *input_location);
+              input_location++;
             }
             i++;
-            input_location++;
           });
     }
 
@@ -478,18 +444,15 @@ class TranslationArrayProcessor {
       checkpoint_state->ForEachLocal(
           compilation_unit, [&](ValueNode* value, interpreter::Register reg) {
             DCHECK_LE(i, reg.index());
-            if (InReturnValues(reg, result_location, result_size)) {
-              input_location++;
-              return;
-            }
+            if (InReturnValues(reg, result_location, result_size)) return;
             while (i < reg.index()) {
               translation_array_builder().StoreOptimizedOut();
               i++;
             }
             DCHECK_EQ(i, reg.index());
             EmitDeoptFrameSingleValue(value, *input_location);
-            i++;
             input_location++;
+            i++;
           });
       while (i < compilation_unit.register_count()) {
         translation_array_builder().StoreOptimizedOut();
@@ -504,12 +467,11 @@ class TranslationArrayProcessor {
                           result_location, result_size)) {
         ValueNode* value = checkpoint_state->accumulator(compilation_unit);
         EmitDeoptFrameSingleValue(value, *input_location);
+        input_location++;
       } else {
         translation_array_builder().StoreOptimizedOut();
       }
     }
-
-    return input_location;
   }
 
   int GetDeoptLiteral(Object obj) {
@@ -539,13 +501,14 @@ void MaglevCompiler::Compile(LocalIsolate* local_isolate,
   compiler::UnparkedScopeIfNeeded unparked_scope(compilation_info->broker());
 
   // Build graph.
-  if (FLAG_print_maglev_code || FLAG_code_comments || FLAG_print_maglev_graph ||
-      FLAG_trace_maglev_graph_building || FLAG_trace_maglev_regalloc) {
+  if (v8_flags.print_maglev_code || v8_flags.code_comments ||
+      v8_flags.print_maglev_graph || v8_flags.trace_maglev_graph_building ||
+      v8_flags.trace_maglev_regalloc) {
     compilation_info->set_graph_labeller(new MaglevGraphLabeller());
   }
 
-  if (FLAG_print_maglev_code || FLAG_print_maglev_graph ||
-      FLAG_trace_maglev_graph_building || FLAG_trace_maglev_regalloc) {
+  if (v8_flags.print_maglev_code || v8_flags.print_maglev_graph ||
+      v8_flags.trace_maglev_graph_building || v8_flags.trace_maglev_regalloc) {
     MaglevCompilationUnit* top_level_unit =
         compilation_info->toplevel_compilation_unit();
     std::cout << "Compiling " << Brief(*top_level_unit->function().object())
@@ -561,7 +524,7 @@ void MaglevCompiler::Compile(LocalIsolate* local_isolate,
 
   graph_builder.Build();
 
-  if (FLAG_print_maglev_graph) {
+  if (v8_flags.print_maglev_graph) {
     std::cout << "\nAfter graph buiding" << std::endl;
     PrintGraph(std::cout, compilation_info, graph_builder.graph());
   }
@@ -579,7 +542,7 @@ void MaglevCompiler::Compile(LocalIsolate* local_isolate,
     processor.ProcessGraph(graph_builder.graph());
   }
 
-  if (FLAG_print_maglev_graph) {
+  if (v8_flags.print_maglev_graph) {
     std::cout << "After node processor" << std::endl;
     PrintGraph(std::cout, compilation_info, graph_builder.graph());
   }
@@ -587,7 +550,7 @@ void MaglevCompiler::Compile(LocalIsolate* local_isolate,
   StraightForwardRegisterAllocator allocator(compilation_info,
                                              graph_builder.graph());
 
-  if (FLAG_print_maglev_graph) {
+  if (v8_flags.print_maglev_graph) {
     std::cout << "After register allocation" << std::endl;
     PrintGraph(std::cout, compilation_info, graph_builder.graph());
   }
@@ -602,7 +565,7 @@ void MaglevCompiler::Compile(LocalIsolate* local_isolate,
 
 // static
 MaybeHandle<CodeT> MaglevCompiler::GenerateCode(
-    MaglevCompilationInfo* compilation_info) {
+    Isolate* isolate, MaglevCompilationInfo* compilation_info) {
   Graph* const graph = compilation_info->graph();
   if (graph == nullptr) {
     // Compilation failed.
@@ -614,7 +577,8 @@ MaybeHandle<CodeT> MaglevCompiler::GenerateCode(
   }
 
   Handle<Code> code;
-  if (!MaglevCodeGenerator::Generate(compilation_info, graph).ToHandle(&code)) {
+  if (!MaglevCodeGenerator::Generate(isolate, compilation_info, graph)
+           .ToHandle(&code)) {
     compilation_info->toplevel_compilation_unit()
         ->shared_function_info()
         .object()
@@ -629,11 +593,10 @@ MaybeHandle<CodeT> MaglevCompiler::GenerateCode(
     return {};
   }
 
-  if (FLAG_print_maglev_code) {
+  if (v8_flags.print_maglev_code) {
     code->Print();
   }
 
-  Isolate* const isolate = compilation_info->isolate();
   isolate->native_context()->AddOptimizedCode(ToCodeT(*code));
   return ToCodeT(code, isolate);
 }
diff --git a/deps/v8/src/maglev/maglev-compiler.h b/deps/v8/src/maglev/maglev-compiler.h
index 1bb7ad6d376a59..febe387d87542c 100644
--- a/deps/v8/src/maglev/maglev-compiler.h
+++ b/deps/v8/src/maglev/maglev-compiler.h
@@ -30,7 +30,7 @@ class MaglevCompiler : public AllStatic {
   // Called on the main thread after Compile has completed.
   // TODO(v8:7700): Move this to a different class?
   static MaybeHandle<CodeT> GenerateCode(
-      MaglevCompilationInfo* compilation_info);
+      Isolate* isolate, MaglevCompilationInfo* compilation_info);
 };
 
 }  // namespace maglev
diff --git a/deps/v8/src/maglev/maglev-concurrent-dispatcher.cc b/deps/v8/src/maglev/maglev-concurrent-dispatcher.cc
index 87756c21a0f881..cb8e1044ee5aa9 100644
--- a/deps/v8/src/maglev/maglev-concurrent-dispatcher.cc
+++ b/deps/v8/src/maglev/maglev-concurrent-dispatcher.cc
@@ -88,7 +88,7 @@ MaglevCompilationJob::MaglevCompilationJob(
     std::unique_ptr<MaglevCompilationInfo>&& info)
     : OptimizedCompilationJob(kMaglevCompilerName, State::kReadyToPrepare),
       info_(std::move(info)) {
-  DCHECK(FLAG_maglev);
+  DCHECK(v8_flags.maglev);
 }
 
 MaglevCompilationJob::~MaglevCompilationJob() = default;
@@ -108,7 +108,7 @@ CompilationJob::Status MaglevCompilationJob::ExecuteJobImpl(
 
 CompilationJob::Status MaglevCompilationJob::FinalizeJobImpl(Isolate* isolate) {
   Handle<CodeT> codet;
-  if (!maglev::MaglevCompiler::GenerateCode(info()).ToHandle(&codet)) {
+  if (!maglev::MaglevCompiler::GenerateCode(isolate, info()).ToHandle(&codet)) {
     return CompilationJob::FAILED;
   }
   info()->toplevel_compilation_unit()->function().object()->set_code(*codet);
@@ -119,6 +119,10 @@ Handle<JSFunction> MaglevCompilationJob::function() const {
   return info_->toplevel_compilation_unit()->function().object();
 }
 
+bool MaglevCompilationJob::specialize_to_function_context() const {
+  return info_->specialize_to_function_context();
+}
+
 // The JobTask is posted to V8::GetCurrentPlatform(). It's responsible for
 // processing the incoming queue on a worker thread.
 class MaglevConcurrentDispatcher::JobTask final : public v8::JobTask {
@@ -134,6 +138,9 @@ class MaglevConcurrentDispatcher::JobTask final : public v8::JobTask {
       std::unique_ptr<MaglevCompilationJob> job;
       if (!incoming_queue()->Dequeue(&job)) break;
       DCHECK_NOT_NULL(job);
+      TRACE_EVENT_WITH_FLOW0(
+          TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.MaglevBackground",
+          job.get(), TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
       RuntimeCallStats* rcs = nullptr;  // TODO(v8:7700): Implement.
       CompilationJob::Status status = job->ExecuteJob(rcs, &local_isolate);
       CHECK_EQ(status, CompilationJob::SUCCEEDED);
@@ -157,7 +164,7 @@ class MaglevConcurrentDispatcher::JobTask final : public v8::JobTask {
 
 MaglevConcurrentDispatcher::MaglevConcurrentDispatcher(Isolate* isolate)
     : isolate_(isolate) {
-  if (FLAG_concurrent_recompilation && FLAG_maglev) {
+  if (v8_flags.concurrent_recompilation && v8_flags.maglev) {
     job_handle_ = V8::GetCurrentPlatform()->PostJob(
         TaskPriority::kUserVisible, std::make_unique<JobTask>(this));
     DCHECK(is_enabled());
@@ -188,6 +195,9 @@ void MaglevConcurrentDispatcher::FinalizeFinishedJobs() {
   while (!outgoing_queue_.IsEmpty()) {
     std::unique_ptr<MaglevCompilationJob> job;
     outgoing_queue_.Dequeue(&job);
+    TRACE_EVENT_WITH_FLOW0(TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+                           "V8.MaglevConcurrentFinalize", job.get(),
+                           TRACE_EVENT_FLAG_FLOW_IN);
     Compiler::FinalizeMaglevCompilationJob(job.get(), isolate_);
   }
 }
diff --git a/deps/v8/src/maglev/maglev-concurrent-dispatcher.h b/deps/v8/src/maglev/maglev-concurrent-dispatcher.h
index 5510fa7c9efc14..09f046eee2a74b 100644
--- a/deps/v8/src/maglev/maglev-concurrent-dispatcher.h
+++ b/deps/v8/src/maglev/maglev-concurrent-dispatcher.h
@@ -56,6 +56,8 @@ class MaglevCompilationJob final : public OptimizedCompilationJob {
 
   Handle<JSFunction> function() const;
 
+  bool specialize_to_function_context() const;
+
   base::TimeDelta time_taken_to_prepare() { return time_taken_to_prepare_; }
   base::TimeDelta time_taken_to_execute() { return time_taken_to_execute_; }
   base::TimeDelta time_taken_to_finalize() { return time_taken_to_finalize_; }
diff --git a/deps/v8/src/maglev/maglev-graph-builder.cc b/deps/v8/src/maglev/maglev-graph-builder.cc
index 27d0b7d75d1e84..d47b82713b4b96 100644
--- a/deps/v8/src/maglev/maglev-graph-builder.cc
+++ b/deps/v8/src/maglev/maglev-graph-builder.cc
@@ -9,6 +9,7 @@
 #include "src/builtins/builtins-constructor.h"
 #include "src/codegen/interface-descriptors-inl.h"
 #include "src/common/globals.h"
+#include "src/compiler/access-info.h"
 #include "src/compiler/compilation-dependencies.h"
 #include "src/compiler/feedback-source.h"
 #include "src/compiler/heap-refs.h"
@@ -30,10 +31,59 @@
 #include "src/objects/property-details.h"
 #include "src/objects/slots-inl.h"
 
-namespace v8 {
-namespace internal {
+namespace v8::internal::maglev {
 
-namespace maglev {
+namespace {
+
+ValueNode* TryGetParentContext(ValueNode* node) {
+  if (CreateFunctionContext* n = node->TryCast<CreateFunctionContext>()) {
+    return n->context().node();
+  }
+
+  if (CallRuntime* n = node->TryCast<CallRuntime>()) {
+    switch (n->function_id()) {
+      case Runtime::kPushBlockContext:
+      case Runtime::kPushCatchContext:
+      case Runtime::kNewFunctionContext:
+        return n->context().node();
+      default:
+        break;
+    }
+  }
+
+  return nullptr;
+}
+
+// Attempts to walk up the context chain through the graph in order to reduce
+// depth and thus the number of runtime loads.
+void MinimizeContextChainDepth(ValueNode** context, size_t* depth) {
+  while (*depth > 0) {
+    ValueNode* parent_context = TryGetParentContext(*context);
+    if (parent_context == nullptr) return;
+    *context = parent_context;
+    (*depth)--;
+  }
+}
+
+class FunctionContextSpecialization final : public AllStatic {
+ public:
+  static base::Optional<compiler::ContextRef> TryToRef(
+      const MaglevCompilationUnit* unit, ValueNode* context, size_t* depth) {
+    DCHECK(unit->info()->specialize_to_function_context());
+    base::Optional<compiler::ContextRef> ref;
+    if (InitialValue* n = context->TryCast<InitialValue>()) {
+      if (n->source().is_current_context()) {
+        ref = unit->function().context();
+      }
+    } else if (Constant* n = context->TryCast<Constant>()) {
+      ref = n->ref().AsContext();
+    }
+    if (!ref.has_value()) return {};
+    return ref->previous(depth);
+  }
+};
+
+}  // namespace
 
 MaglevGraphBuilder::MaglevGraphBuilder(LocalIsolate* local_isolate,
                                        MaglevCompilationUnit* compilation_unit,
@@ -76,11 +126,10 @@ MaglevGraphBuilder::MaglevGraphBuilder(LocalIsolate* local_isolate,
 
 void MaglevGraphBuilder::StartPrologue() {
   current_block_ = zone()->New<BasicBlock>(nullptr);
-  block_offset_ = -1;
 }
 
 BasicBlock* MaglevGraphBuilder::EndPrologue() {
-  BasicBlock* first_block = CreateBlock<Jump>({}, &jump_targets_[0]);
+  BasicBlock* first_block = FinishBlock<Jump>({}, &jump_targets_[0]);
   MergeIntoFrameState(first_block, 0);
   return first_block;
 }
@@ -133,12 +182,12 @@ void MaglevGraphBuilder::BuildMergeStates() {
     const compiler::LoopInfo& loop_info = offset_and_info.second;
     const compiler::BytecodeLivenessState* liveness = GetInLivenessFor(offset);
     DCHECK_NULL(merge_states_[offset]);
-    if (FLAG_trace_maglev_graph_building) {
+    if (v8_flags.trace_maglev_graph_building) {
       std::cout << "- Creating loop merge state at @" << offset << std::endl;
     }
     merge_states_[offset] = MergePointInterpreterFrameState::NewForLoop(
-        *compilation_unit_, offset, NumPredecessors(offset), liveness,
-        &loop_info);
+        current_interpreter_frame_, *compilation_unit_, offset,
+        NumPredecessors(offset), liveness, &loop_info);
   }
 
   if (bytecode().handler_table_size() > 0) {
@@ -150,7 +199,7 @@ void MaglevGraphBuilder::BuildMergeStates() {
           GetInLivenessFor(offset);
       DCHECK_EQ(NumPredecessors(offset), 0);
       DCHECK_NULL(merge_states_[offset]);
-      if (FLAG_trace_maglev_graph_building) {
+      if (v8_flags.trace_maglev_graph_building) {
         std::cout << "- Creating exception merge state at @" << offset
                   << ", context register r" << context_reg.index() << std::endl;
       }
@@ -326,13 +375,9 @@ void MaglevGraphBuilder::BuildGenericBinarySmiOperationNode() {
 template <Operation kOperation>
 void MaglevGraphBuilder::BuildInt32BinaryOperationNode() {
   // TODO(v8:7700): Do constant folding.
-  ValueNode *left, *right;
-  if (IsRegisterEqualToAccumulator(0)) {
-    left = right = LoadRegisterInt32(0);
-  } else {
-    left = LoadRegisterInt32(0);
-    right = GetAccumulatorInt32();
-  }
+  ValueNode* left = LoadRegisterInt32(0);
+  ValueNode* right = GetAccumulatorInt32();
+
   SetAccumulator(AddNewInt32BinaryOperationNode<kOperation>({left, right}));
 }
 
@@ -362,13 +407,9 @@ void MaglevGraphBuilder::BuildFloat64BinarySmiOperationNode() {
 template <Operation kOperation>
 void MaglevGraphBuilder::BuildFloat64BinaryOperationNode() {
   // TODO(v8:7700): Do constant folding.
-  ValueNode *left, *right;
-  if (IsRegisterEqualToAccumulator(0)) {
-    left = right = LoadRegisterFloat64(0);
-  } else {
-    left = LoadRegisterFloat64(0);
-    right = GetAccumulatorFloat64();
-  }
+  ValueNode* left = LoadRegisterFloat64(0);
+  ValueNode* right = GetAccumulatorFloat64();
+
   SetAccumulator(AddNewFloat64BinaryOperationNode<kOperation>({left, right}));
 }
 
@@ -488,9 +529,21 @@ bool MaglevGraphBuilder::TryBuildCompareOperation(Operation operation,
   }
 
   BasicBlock* block = FinishBlock<CompareControlNode>(
-      next_offset(), {left, right}, operation, &jump_targets_[true_offset],
+      {left, right}, operation, &jump_targets_[true_offset],
       &jump_targets_[false_offset]);
+  if (true_offset == iterator_.GetJumpTargetOffset()) {
+    block->control_node()
+        ->Cast<BranchControlNode>()
+        ->set_true_interrupt_correction(
+            iterator_.GetRelativeJumpTargetOffset());
+  } else {
+    block->control_node()
+        ->Cast<BranchControlNode>()
+        ->set_false_interrupt_correction(
+            iterator_.GetRelativeJumpTargetOffset());
+  }
   MergeIntoFrameState(block, iterator_.GetJumpTargetOffset());
+  StartFallthroughBlock(next_offset(), block);
   return true;
 }
 
@@ -504,13 +557,9 @@ void MaglevGraphBuilder::VisitCompareOperation() {
       return;
     case CompareOperationHint::kSignedSmall:
       if (BinaryOperationHasInt32FastPath<kOperation>()) {
-        ValueNode *left, *right;
-        if (IsRegisterEqualToAccumulator(0)) {
-          left = right = LoadRegisterInt32(0);
-        } else {
-          left = LoadRegisterInt32(0);
-          right = GetAccumulatorInt32();
-        }
+        ValueNode* left = LoadRegisterInt32(0);
+        ValueNode* right = GetAccumulatorInt32();
+
         if (TryBuildCompareOperation<BranchIfInt32Compare>(kOperation, left,
                                                            right)) {
           return;
@@ -522,13 +571,9 @@ void MaglevGraphBuilder::VisitCompareOperation() {
       break;
     case CompareOperationHint::kNumber:
       if (BinaryOperationHasFloat64FastPath<kOperation>()) {
-        ValueNode *left, *right;
-        if (IsRegisterEqualToAccumulator(0)) {
-          left = right = LoadRegisterFloat64(0);
-        } else {
-          left = LoadRegisterFloat64(0);
-          right = GetAccumulatorFloat64();
-        }
+        ValueNode* left = LoadRegisterFloat64(0);
+        ValueNode* right = GetAccumulatorFloat64();
+
         if (TryBuildCompareOperation<BranchIfFloat64Compare>(kOperation, left,
                                                              right)) {
           return;
@@ -549,10 +594,28 @@ void MaglevGraphBuilder::VisitCompareOperation() {
              kOperation == Operation::kStrictEqual);
       ValueNode *left, *right;
       if (IsRegisterEqualToAccumulator(0)) {
-        left = right = LoadRegister<CheckedInternalizedString>(0);
+        interpreter::Register reg = iterator_.GetRegisterOperand(0);
+        ValueNode* value = GetTaggedValue(reg);
+        if (!value->Is<CheckedInternalizedString>()) {
+          value = AddNewNode<CheckedInternalizedString>({value});
+          current_interpreter_frame_.set(reg, value);
+          current_interpreter_frame_.set(
+              interpreter::Register::virtual_accumulator(), value);
+        }
+        left = right = value;
       } else {
-        left = LoadRegister<CheckedInternalizedString>(0);
-        right = GetAccumulator<CheckedInternalizedString>();
+        interpreter::Register reg = iterator_.GetRegisterOperand(0);
+        left = GetTaggedValue(reg);
+        if (!left->Is<CheckedInternalizedString>()) {
+          left = AddNewNode<CheckedInternalizedString>({left});
+          current_interpreter_frame_.set(reg, left);
+        }
+        right = GetAccumulatorTagged();
+        if (!right->Is<CheckedInternalizedString>()) {
+          right = AddNewNode<CheckedInternalizedString>({right});
+          current_interpreter_frame_.set(
+              interpreter::Register::virtual_accumulator(), right);
+        }
       }
       if (TryBuildCompareOperation<BranchIfReferenceCompare>(kOperation, left,
                                                              right)) {
@@ -564,16 +627,10 @@ void MaglevGraphBuilder::VisitCompareOperation() {
     case CompareOperationHint::kSymbol: {
       DCHECK(kOperation == Operation::kEqual ||
              kOperation == Operation::kStrictEqual);
-      ValueNode *left, *right;
-      if (IsRegisterEqualToAccumulator(0)) {
-        left = right = LoadRegisterTagged(0);
-        BuildCheckSymbol(left);
-      } else {
-        left = LoadRegisterTagged(0);
-        right = GetAccumulatorTagged();
-        BuildCheckSymbol(left);
-        BuildCheckSymbol(right);
-      }
+      ValueNode* left = LoadRegisterTagged(0);
+      ValueNode* right = GetAccumulatorTagged();
+      BuildCheckSymbol(left);
+      BuildCheckSymbol(right);
       if (TryBuildCompareOperation<BranchIfReferenceCompare>(kOperation, left,
                                                              right)) {
         return;
@@ -617,12 +674,69 @@ void MaglevGraphBuilder::VisitLdaConstant() {
   SetAccumulator(GetConstant(GetRefOperand<HeapObject>(0)));
 }
 
-void MaglevGraphBuilder::VisitLdaContextSlot() {
-  ValueNode* context = LoadRegisterTagged(0);
-  int slot_index = iterator_.GetIndexOperand(1);
-  int depth = iterator_.GetUnsignedImmediateOperand(2);
+bool MaglevGraphBuilder::TrySpecializeLoadContextSlotToFunctionContext(
+    ValueNode** context, size_t* depth, int slot_index,
+    ContextSlotMutability slot_mutability) {
+  DCHECK(compilation_unit_->info()->specialize_to_function_context());
+
+  size_t new_depth = *depth;
+  base::Optional<compiler::ContextRef> maybe_context_ref =
+      FunctionContextSpecialization::TryToRef(compilation_unit_, *context,
+                                              &new_depth);
+  if (!maybe_context_ref.has_value()) return false;
+
+  compiler::ContextRef context_ref = maybe_context_ref.value();
+  if (slot_mutability == kMutable || new_depth != 0) {
+    *depth = new_depth;
+    *context = GetConstant(context_ref);
+    return false;
+  }
+
+  base::Optional<compiler::ObjectRef> maybe_slot_value =
+      context_ref.get(slot_index);
+  if (!maybe_slot_value.has_value()) {
+    *depth = new_depth;
+    *context = GetConstant(context_ref);
+    return false;
+  }
+
+  compiler::ObjectRef slot_value = maybe_slot_value.value();
+  if (slot_value.IsHeapObject()) {
+    // Even though the context slot is immutable, the context might have escaped
+    // before the function to which it belongs has initialized the slot.  We
+    // must be conservative and check if the value in the slot is currently the
+    // hole or undefined. Only if it is neither of these, can we be sure that it
+    // won't change anymore.
+    //
+    // See also: JSContextSpecialization::ReduceJSLoadContext.
+    compiler::OddballType oddball_type =
+        slot_value.AsHeapObject().map().oddball_type();
+    if (oddball_type == compiler::OddballType::kUndefined ||
+        oddball_type == compiler::OddballType::kHole) {
+      *depth = new_depth;
+      *context = GetConstant(context_ref);
+      return false;
+    }
+  }
 
-  for (int i = 0; i < depth; ++i) {
+  // Fold the load of the immutable slot.
+
+  SetAccumulator(GetConstant(slot_value));
+  return true;
+}
+
+void MaglevGraphBuilder::BuildLoadContextSlot(
+    ValueNode* context, size_t depth, int slot_index,
+    ContextSlotMutability slot_mutability) {
+  MinimizeContextChainDepth(&context, &depth);
+
+  if (compilation_unit_->info()->specialize_to_function_context() &&
+      TrySpecializeLoadContextSlotToFunctionContext(
+          &context, &depth, slot_index, slot_mutability)) {
+    return;  // Our work here is done.
+  }
+
+  for (size_t i = 0; i < depth; ++i) {
     context = AddNewNode<LoadTaggedField>(
         {context}, Context::OffsetOfElementAt(Context::PREVIOUS_INDEX));
   }
@@ -630,28 +744,47 @@ void MaglevGraphBuilder::VisitLdaContextSlot() {
   SetAccumulator(AddNewNode<LoadTaggedField>(
       {context}, Context::OffsetOfElementAt(slot_index)));
 }
+
+void MaglevGraphBuilder::VisitLdaContextSlot() {
+  ValueNode* context = LoadRegisterTagged(0);
+  int slot_index = iterator_.GetIndexOperand(1);
+  size_t depth = iterator_.GetUnsignedImmediateOperand(2);
+  BuildLoadContextSlot(context, depth, slot_index, kMutable);
+}
 void MaglevGraphBuilder::VisitLdaImmutableContextSlot() {
-  // TODO(leszeks): Consider context specialising.
-  VisitLdaContextSlot();
+  ValueNode* context = LoadRegisterTagged(0);
+  int slot_index = iterator_.GetIndexOperand(1);
+  size_t depth = iterator_.GetUnsignedImmediateOperand(2);
+  BuildLoadContextSlot(context, depth, slot_index, kImmutable);
 }
 void MaglevGraphBuilder::VisitLdaCurrentContextSlot() {
   ValueNode* context = GetContext();
   int slot_index = iterator_.GetIndexOperand(0);
-
-  SetAccumulator(AddNewNode<LoadTaggedField>(
-      {context}, Context::OffsetOfElementAt(slot_index)));
+  BuildLoadContextSlot(context, 0, slot_index, kMutable);
 }
 void MaglevGraphBuilder::VisitLdaImmutableCurrentContextSlot() {
-  // TODO(leszeks): Consider context specialising.
-  VisitLdaCurrentContextSlot();
+  ValueNode* context = GetContext();
+  int slot_index = iterator_.GetIndexOperand(0);
+  BuildLoadContextSlot(context, 0, slot_index, kImmutable);
 }
 
 void MaglevGraphBuilder::VisitStaContextSlot() {
   ValueNode* context = LoadRegisterTagged(0);
   int slot_index = iterator_.GetIndexOperand(1);
-  int depth = iterator_.GetUnsignedImmediateOperand(2);
+  size_t depth = iterator_.GetUnsignedImmediateOperand(2);
+
+  MinimizeContextChainDepth(&context, &depth);
+
+  if (compilation_unit_->info()->specialize_to_function_context()) {
+    base::Optional<compiler::ContextRef> maybe_ref =
+        FunctionContextSpecialization::TryToRef(compilation_unit_, context,
+                                                &depth);
+    if (maybe_ref.has_value()) {
+      context = GetConstant(maybe_ref.value());
+    }
+  }
 
-  for (int i = 0; i < depth; ++i) {
+  for (size_t i = 0; i < depth; ++i) {
     context = AddNewNode<LoadTaggedField>(
         {context}, Context::OffsetOfElementAt(Context::PREVIOUS_INDEX));
   }
@@ -918,28 +1051,54 @@ void MaglevGraphBuilder::VisitStaLookupSlot() {
   SetAccumulator(BuildCallRuntime(StaLookupSlotFunction(flags), {name, value}));
 }
 
+namespace {
+NodeType StaticTypeForNode(ValueNode* node) {
+  DCHECK(node->is_tagged());
+  switch (node->opcode()) {
+    case Opcode::kCheckedSmiTag:
+    case Opcode::kSmiConstant:
+      return NodeType::kSmi;
+    case Opcode::kConstant: {
+      compiler::HeapObjectRef ref = node->Cast<Constant>()->object();
+      if (ref.IsString()) {
+        return NodeType::kString;
+      } else if (ref.IsSymbol()) {
+        return NodeType::kSymbol;
+      } else if (ref.IsHeapNumber()) {
+        return NodeType::kHeapNumber;
+      }
+      return NodeType::kHeapObjectWithKnownMap;
+    }
+    default:
+      return NodeType::kUnknown;
+  }
+}
+}  // namespace
+
 void MaglevGraphBuilder::BuildCheckSmi(ValueNode* object) {
-  NodeInfo* known_info = known_node_aspects().GetInfoFor(object);
-  if (NodeInfo::IsSmi(known_info)) return;
+  NodeInfo* known_info = known_node_aspects().GetOrCreateInfoFor(object);
+  if (known_info->is_smi()) return;
+  known_info->type = StaticTypeForNode(object);
+  if (known_info->is_smi()) return;
 
   // TODO(leszeks): Figure out a way to also handle CheckedSmiUntag.
   AddNewNode<CheckSmi>({object});
-  known_node_aspects().InsertOrUpdateNodeType(object, known_info,
-                                              NodeType::kSmi);
+  known_info->type = NodeType::kSmi;
 }
 
 void MaglevGraphBuilder::BuildCheckHeapObject(ValueNode* object) {
-  NodeInfo* known_info = known_node_aspects().GetInfoFor(object);
-  if (NodeInfo::IsAnyHeapObject(known_info)) return;
+  NodeInfo* known_info = known_node_aspects().GetOrCreateInfoFor(object);
+  if (known_info->is_any_heap_object()) return;
+  known_info->type = StaticTypeForNode(object);
+  if (known_info->is_any_heap_object()) return;
 
   AddNewNode<CheckHeapObject>({object});
-  known_node_aspects().InsertOrUpdateNodeType(object, known_info,
-                                              NodeType::kAnyHeapObject);
+  known_info->type = NodeType::kAnyHeapObject;
 }
 
 namespace {
 CheckType GetCheckType(NodeInfo* known_info) {
-  if (NodeInfo::IsAnyHeapObject(known_info)) {
+  if (known_info->is_any_heap_object()) {
     return CheckType::kOmitHeapObjectCheck;
   }
   return CheckType::kCheckHeapObject;
@@ -947,21 +1106,23 @@ CheckType GetCheckType(NodeInfo* known_info) {
 }  // namespace
 
 void MaglevGraphBuilder::BuildCheckString(ValueNode* object) {
-  NodeInfo* known_info = known_node_aspects().GetInfoFor(object);
-  if (NodeInfo::IsString(known_info)) return;
+  NodeInfo* known_info = known_node_aspects().GetOrCreateInfoFor(object);
+  if (known_info->is_string()) return;
+  known_info->type = StaticTypeForNode(object);
+  if (known_info->is_string()) return;
 
   AddNewNode<CheckString>({object}, GetCheckType(known_info));
-  known_node_aspects().InsertOrUpdateNodeType(object, known_info,
-                                              NodeType::kString);
+  known_info->type = NodeType::kString;
 }
 
 void MaglevGraphBuilder::BuildCheckSymbol(ValueNode* object) {
-  NodeInfo* known_info = known_node_aspects().GetInfoFor(object);
-  if (NodeInfo::IsSymbol(known_info)) return;
+  NodeInfo* known_info = known_node_aspects().GetOrCreateInfoFor(object);
+  if (known_info->is_symbol()) return;
+  known_info->type = StaticTypeForNode(object);
+  if (known_info->is_symbol()) return;
 
   AddNewNode<CheckSymbol>({object}, GetCheckType(known_info));
-  known_node_aspects().InsertOrUpdateNodeType(object, known_info,
-                                              NodeType::kSymbol);
+  known_info->type = NodeType::kSymbol;
 }
 
 void MaglevGraphBuilder::BuildMapCheck(ValueNode* object,
@@ -975,10 +1136,32 @@ void MaglevGraphBuilder::BuildMapCheck(ValueNode* object,
       // Map is already checked.
       return;
     }
-    // TODO(leszeks): Insert an unconditional deopt if the known type doesn't
-    // match the required type.
+    // TODO(leszeks): Insert an unconditional deopt if the known map doesn't
+    // match the required map.
+  }
+  NodeInfo* known_info = known_node_aspects().GetOrCreateInfoFor(object);
+  if (known_info->type == NodeType::kUnknown) {
+    known_info->type = StaticTypeForNode(object);
+    if (known_info->type == NodeType::kHeapObjectWithKnownMap) {
+      // The only case where the type becomes a heap-object with a known map is
+      // when the object is a constant.
+      DCHECK(object->Is<Constant>());
+      // For constants with stable maps that match the desired map, we don't
+      // need to emit a map check, and can use the dependency -- we can't do
+      // this for unstable maps because the constant could migrate during
+      // compilation.
+      // TODO(leszeks): Insert an unconditional deopt if the constant map
+      // doesn't match the required map.
+      compiler::MapRef constant_map = object->Cast<Constant>()->object().map();
+      if (constant_map.equals(map) && map.is_stable()) {
+        DCHECK_EQ(&map_of_maps, &known_node_aspects().stable_maps);
+        map_of_maps.emplace(object, map);
+        broker()->dependencies()->DependOnStableMap(map);
+        return;
+      }
+    }
   }
-  NodeInfo* known_info = known_node_aspects().GetInfoFor(object);
+
   if (map.is_migration_target()) {
     AddNewNode<CheckMapsWithMigration>({object}, map, GetCheckType(known_info));
   } else {
@@ -986,210 +1169,384 @@ void MaglevGraphBuilder::BuildMapCheck(ValueNode* object,
   }
   map_of_maps.emplace(object, map);
   if (map.is_stable()) {
-    compilation_unit_->broker()->dependencies()->DependOnStableMap(map);
+    broker()->dependencies()->DependOnStableMap(map);
+  }
+  known_info->type = NodeType::kHeapObjectWithKnownMap;
+}
+
+bool MaglevGraphBuilder::TryFoldLoadDictPrototypeConstant(
+    compiler::PropertyAccessInfo access_info) {
+  DCHECK(V8_DICT_PROPERTY_CONST_TRACKING_BOOL);
+  DCHECK(access_info.IsDictionaryProtoDataConstant());
+  DCHECK(access_info.holder().has_value());
+
+  base::Optional<compiler::ObjectRef> constant =
+      access_info.holder()->GetOwnDictionaryProperty(
+          access_info.dictionary_index(), broker()->dependencies());
+  if (!constant.has_value()) return false;
+
+  for (compiler::MapRef map : access_info.lookup_start_object_maps()) {
+    Handle<Map> map_handle = map.object();
+    // Non-JSReceivers that passed AccessInfoFactory::ComputePropertyAccessInfo
+    // must have different lookup start map.
+    if (!map_handle->IsJSReceiverMap()) {
+      // Perform the implicit ToObject for primitives here.
+      // Implemented according to ES6 section 7.3.2 GetV (V, P).
+      JSFunction constructor =
+          Map::GetConstructorFunction(
+              *map_handle, *broker()->target_native_context().object())
+              .value();
+      // {constructor.initial_map()} is loaded/stored with acquire-release
+      // semantics for constructors.
+      map = MakeRefAssumeMemoryFence(broker(), constructor.initial_map());
+      DCHECK(map.object()->IsJSObjectMap());
+    }
+    broker()->dependencies()->DependOnConstantInDictionaryPrototypeChain(
+        map, access_info.name(), constant.value(), PropertyKind::kData);
+  }
+
+  SetAccumulator(GetConstant(constant.value()));
+  return true;
+}
+
+bool MaglevGraphBuilder::TryFoldLoadConstantDataField(
+    compiler::PropertyAccessInfo access_info) {
+  if (access_info.holder().has_value()) {
+    base::Optional<compiler::ObjectRef> constant =
+        access_info.holder()->GetOwnFastDataProperty(
+            access_info.field_representation(), access_info.field_index(),
+            broker()->dependencies());
+    if (constant.has_value()) {
+      SetAccumulator(GetConstant(constant.value()));
+      return true;
+    }
   }
-  known_node_aspects().InsertOrUpdateNodeType(
-      object, known_info, NodeType::kHeapObjectWithKnownMap);
+  // TODO(victorgomes): Check if lookup_start_object is a constant object and
+  // unfold the load.
+  return false;
 }
 
-bool MaglevGraphBuilder::TryBuildMonomorphicLoad(ValueNode* receiver,
-                                                 ValueNode* lookup_start_object,
-                                                 const compiler::MapRef& map,
-                                                 MaybeObjectHandle handler) {
-  if (handler.is_null()) return false;
+bool MaglevGraphBuilder::TryBuildPropertyGetterCall(
+    compiler::PropertyAccessInfo access_info, ValueNode* receiver) {
+  compiler::ObjectRef constant = access_info.constant().value();
 
-  if (handler->IsSmi()) {
-    return TryBuildMonomorphicLoadFromSmiHandler(receiver, lookup_start_object,
-                                                 map, handler->ToSmi().value());
+  if (access_info.IsDictionaryProtoAccessorConstant()) {
+    // For fast mode holders we recorded dependencies in BuildPropertyLoad.
+    for (const compiler::MapRef map : access_info.lookup_start_object_maps()) {
+      broker()->dependencies()->DependOnConstantInDictionaryPrototypeChain(
+          map, access_info.name(), constant, PropertyKind::kAccessor);
+    }
   }
-  HeapObject ho_handler;
-  if (!handler->GetHeapObject(&ho_handler)) return false;
 
-  if (ho_handler.IsCodeT()) {
-    // TODO(leszeks): Call the code object directly.
-    return false;
-  } else if (ho_handler.IsAccessorPair()) {
-    // TODO(leszeks): Call the getter directly.
-    return false;
+  // Introduce the call to the getter function.
+  if (constant.IsJSFunction()) {
+    Call* call = CreateNewNode<Call>(Call::kFixedInputCount + 1,
+                                     ConvertReceiverMode::kNotNullOrUndefined,
+                                     GetConstant(constant), GetContext());
+    call->set_arg(0, receiver);
+    SetAccumulator(AddNode(call));
+    return true;
   } else {
-    return TryBuildMonomorphicLoadFromLoadHandler(
-        receiver, lookup_start_object, map, LoadHandler::cast(ho_handler));
+    // TODO(victorgomes): API calls.
+    return false;
   }
 }
 
-bool MaglevGraphBuilder::TryBuildMonomorphicLoadFromSmiHandler(
-    ValueNode* receiver, ValueNode* lookup_start_object,
-    const compiler::MapRef& map, int32_t handler) {
-  // Smi handler, emit a map check and LoadField.
-  LoadHandler::Kind kind = LoadHandler::KindBits::decode(handler);
-  if (kind != LoadHandler::Kind::kField) return false;
-  if (LoadHandler::IsWasmStructBits::decode(handler)) return false;
+bool MaglevGraphBuilder::TryBuildPropertySetterCall(
+    compiler::PropertyAccessInfo access_info, ValueNode* receiver,
+    ValueNode* value) {
+  compiler::ObjectRef constant = access_info.constant().value();
+  if (constant.IsJSFunction()) {
+    Call* call = CreateNewNode<Call>(Call::kFixedInputCount + 2,
+                                     ConvertReceiverMode::kNotNullOrUndefined,
+                                     GetConstant(constant), GetContext());
+    call->set_arg(0, receiver);
+    call->set_arg(1, value);
+    SetAccumulator(AddNode(call));
+    return true;
+  } else {
+    // TODO(victorgomes): API calls.
+    return false;
+  }
+}
 
-  BuildMapCheck(lookup_start_object, map);
+void MaglevGraphBuilder::BuildLoadField(
+    compiler::PropertyAccessInfo access_info, ValueNode* lookup_start_object) {
+  if (TryFoldLoadConstantDataField(access_info)) return;
 
+  // Resolve property holder.
   ValueNode* load_source;
-  if (LoadHandler::IsInobjectBits::decode(handler)) {
-    load_source = lookup_start_object;
+  if (access_info.holder().has_value()) {
+    load_source = GetConstant(access_info.holder().value());
   } else {
+    load_source = lookup_start_object;
+  }
+
+  FieldIndex field_index = access_info.field_index();
+  if (!field_index.is_inobject()) {
     // The field is in the property array, first load it from there.
     load_source = AddNewNode<LoadTaggedField>(
-        {lookup_start_object}, JSReceiver::kPropertiesOrHashOffset);
-  }
-  int field_index = LoadHandler::FieldIndexBits::decode(handler);
-  if (LoadHandler::IsDoubleBits::decode(handler)) {
-    FieldIndex field = FieldIndex::ForSmiLoadHandler(*map.object(), handler);
-    DescriptorArray descriptors = *map.instance_descriptors().object();
-    InternalIndex index =
-        descriptors.Search(field.property_index(), *map.object());
-    DCHECK(index.is_found());
-    DCHECK(Representation::Double().CanBeInPlaceChangedTo(
-        descriptors.GetDetails(index).representation()));
-    const compiler::CompilationDependency* dep =
-        broker()->dependencies()->FieldRepresentationDependencyOffTheRecord(
-            map, index, Representation::Double());
-    broker()->dependencies()->RecordDependency(dep);
+        {load_source}, JSReceiver::kPropertiesOrHashOffset);
+  }
 
+  // Do the load.
+  if (field_index.is_double()) {
     SetAccumulator(
-        AddNewNode<LoadDoubleField>({load_source}, field_index * kTaggedSize));
+        AddNewNode<LoadDoubleField>({load_source}, field_index.offset()));
   } else {
     SetAccumulator(
-        AddNewNode<LoadTaggedField>({load_source}, field_index * kTaggedSize));
+        AddNewNode<LoadTaggedField>({load_source}, field_index.offset()));
   }
-  return true;
 }
 
-bool MaglevGraphBuilder::TryBuildMonomorphicLoadFromLoadHandler(
-    ValueNode* receiver, ValueNode* lookup_start_object,
-    const compiler::MapRef& map, LoadHandler handler) {
-  Object maybe_smi_handler = handler.smi_handler(local_isolate_);
-  if (!maybe_smi_handler.IsSmi()) return false;
-  int smi_handler = Smi::cast(maybe_smi_handler).value();
-  LoadHandler::Kind kind = LoadHandler::KindBits::decode(smi_handler);
-  bool do_access_check_on_lookup_start_object =
-      LoadHandler::DoAccessCheckOnLookupStartObjectBits::decode(smi_handler);
-  bool lookup_on_lookup_start_object =
-      LoadHandler::LookupOnLookupStartObjectBits::decode(smi_handler);
-  if (lookup_on_lookup_start_object) return false;
-  if (kind != LoadHandler::Kind::kConstantFromPrototype &&
-      kind != LoadHandler::Kind::kAccessorFromPrototype)
-    return false;
+bool MaglevGraphBuilder::TryBuildStoreField(
+    compiler::PropertyAccessInfo access_info, ValueNode* receiver) {
+  FieldIndex field_index = access_info.field_index();
+  Representation field_representation = access_info.field_representation();
 
-  if (map.IsStringMap()) {
-    // Check for string maps before checking if we need to do an access check.
-    // Primitive strings always get the prototype from the native context
-    // they're operated on, so they don't need the access check.
-    BuildCheckString(lookup_start_object);
-  } else if (do_access_check_on_lookup_start_object) {
-    return false;
+  // TODO(victorgomes): Support double stores.
+  if (field_representation.IsDouble()) return false;
+
+  // TODO(victorgomes): Support transition maps.
+  if (access_info.HasTransitionMap()) return false;
+
+  ValueNode* store_target;
+  if (field_index.is_inobject()) {
+    store_target = receiver;
   } else {
-    BuildMapCheck(lookup_start_object, map);
+    // The field is in the property array, first load it from there.
+    store_target = AddNewNode<LoadTaggedField>(
+        {receiver}, JSReceiver::kPropertiesOrHashOffset);
   }
 
-  Object validity_cell = handler.validity_cell(local_isolate_);
-  if (validity_cell.IsCell(local_isolate_)) {
-    compiler::MapRef receiver_map = map;
-    if (receiver_map.IsPrimitiveMap()) {
-      // Perform the implicit ToObject for primitives here.
-      // Implemented according to ES6 section 7.3.2 GetV (V, P).
-      // Note: Keep sync'd with AccessInfoFactory::ComputePropertyAccessInfo.
-      base::Optional<compiler::JSFunctionRef> constructor =
-          broker()->target_native_context().GetConstructorFunction(
-              receiver_map);
-      receiver_map = constructor.value().initial_map(broker()->dependencies());
+  if (field_representation.IsSmi()) {
+    ValueNode* value = GetAccumulatorTagged();
+    BuildCheckSmi(value);
+    AddNewNode<StoreTaggedFieldNoWriteBarrier>({store_target, value},
+                                               field_index.offset());
+  } else if (field_representation.IsDouble()) {
+    // TODO(victorgomes): Implement store double.
+    UNREACHABLE();
+  } else {
+    ValueNode* value = GetAccumulatorTagged();
+    if (field_representation.IsHeapObject()) {
+      // Emit a map check for the field type, if needed, otherwise just a
+      // HeapObject check.
+      if (access_info.field_map().has_value()) {
+        BuildMapCheck(value, access_info.field_map().value());
+      } else {
+        BuildCheckHeapObject(value);
+      }
     }
+    AddNewNode<StoreTaggedFieldWithWriteBarrier>({store_target, value},
+                                                 field_index.offset());
+  }
+  return true;
+}
 
-    compiler::MapRef proto_map = receiver_map.prototype().map();
-    while (proto_map.object()->prototype_validity_cell(
-               local_isolate_, kRelaxedLoad) == validity_cell) {
-      broker()->dependencies()->DependOnStableMap(proto_map);
-      proto_map = proto_map.prototype().map();
+bool MaglevGraphBuilder::TryBuildPropertyLoad(
+    ValueNode* receiver, ValueNode* lookup_start_object,
+    compiler::PropertyAccessInfo const& access_info) {
+  if (access_info.holder().has_value() && !access_info.HasDictionaryHolder()) {
+    broker()->dependencies()->DependOnStablePrototypeChains(
+        access_info.lookup_start_object_maps(), kStartAtPrototype,
+        access_info.holder().value());
+  }
+
+  switch (access_info.kind()) {
+    case compiler::PropertyAccessInfo::kInvalid:
+      UNREACHABLE();
+    case compiler::PropertyAccessInfo::kNotFound:
+      SetAccumulator(GetRootConstant(RootIndex::kUndefinedValue));
+      return true;
+    case compiler::PropertyAccessInfo::kDataField:
+    case compiler::PropertyAccessInfo::kFastDataConstant:
+      BuildLoadField(access_info, lookup_start_object);
+      return true;
+    case compiler::PropertyAccessInfo::kDictionaryProtoDataConstant:
+      return TryFoldLoadDictPrototypeConstant(access_info);
+    case compiler::PropertyAccessInfo::kFastAccessorConstant:
+    case compiler::PropertyAccessInfo::kDictionaryProtoAccessorConstant:
+      return TryBuildPropertyGetterCall(access_info, receiver);
+    case compiler::PropertyAccessInfo::kModuleExport: {
+      ValueNode* cell = GetConstant(access_info.constant().value().AsCell());
+      SetAccumulator(AddNewNode<LoadTaggedField>({cell}, Cell::kValueOffset));
+      return true;
     }
+    case compiler::PropertyAccessInfo::kStringLength:
+      DCHECK_EQ(receiver, lookup_start_object);
+      SetAccumulator(AddNewNode<StringLength>({receiver}));
+      return true;
+  }
+}
+
+bool MaglevGraphBuilder::TryBuildPropertyStore(
+    ValueNode* receiver, compiler::PropertyAccessInfo const& access_info) {
+  if (access_info.holder().has_value()) {
+    broker()->dependencies()->DependOnStablePrototypeChains(
+        access_info.lookup_start_object_maps(), kStartAtPrototype,
+        access_info.holder().value());
+  }
+
+  if (access_info.IsFastAccessorConstant()) {
+    return TryBuildPropertySetterCall(access_info, receiver,
+                                      GetAccumulatorTagged());
   } else {
-    DCHECK_EQ(Smi::ToInt(validity_cell), Map::kPrototypeChainValid);
+    DCHECK(access_info.IsDataField() || access_info.IsFastDataConstant());
+    return TryBuildStoreField(access_info, receiver);
+  }
+}
+
+bool MaglevGraphBuilder::TryBuildPropertyAccess(
+    ValueNode* receiver, ValueNode* lookup_start_object,
+    compiler::PropertyAccessInfo const& access_info,
+    compiler::AccessMode access_mode) {
+  switch (access_mode) {
+    case compiler::AccessMode::kLoad:
+      return TryBuildPropertyLoad(receiver, lookup_start_object, access_info);
+    case compiler::AccessMode::kStore:
+    case compiler::AccessMode::kStoreInLiteral:
+    case compiler::AccessMode::kDefine:
+      DCHECK_EQ(receiver, lookup_start_object);
+      return TryBuildPropertyStore(receiver, access_info);
+    case compiler::AccessMode::kHas:
+      // TODO(victorgomes): BuildPropertyTest.
+      return false;
   }
+}
 
-  switch (kind) {
-    case LoadHandler::Kind::kConstantFromPrototype: {
-      MaybeObject value = handler.data1(local_isolate_);
-      if (value.IsSmi()) {
-        SetAccumulator(GetSmiConstant(value.ToSmi().value()));
-      } else {
-        SetAccumulator(GetConstant(MakeRefAssumeMemoryFence(
-            broker(),
-            broker()->CanonicalPersistentHandle(value.GetHeapObject()))));
-      }
-      break;
+bool MaglevGraphBuilder::TryBuildNamedAccess(
+    ValueNode* receiver, ValueNode* lookup_start_object,
+    compiler::NamedAccessFeedback const& feedback,
+    compiler::AccessMode access_mode) {
+  ZoneVector<compiler::PropertyAccessInfo> access_infos(zone());
+  {
+    ZoneVector<compiler::PropertyAccessInfo> access_infos_for_feedback(zone());
+    for (const compiler::MapRef& map : feedback.maps()) {
+      if (map.is_deprecated()) continue;
+      compiler::PropertyAccessInfo access_info =
+          broker()->GetPropertyAccessInfo(map, feedback.name(), access_mode,
+                                          broker()->dependencies());
+      access_infos_for_feedback.push_back(access_info);
     }
-    case LoadHandler::Kind::kAccessorFromPrototype: {
-      MaybeObject getter = handler.data1(local_isolate_);
-      compiler::ObjectRef getter_ref = MakeRefAssumeMemoryFence(
-          broker(),
-          broker()->CanonicalPersistentHandle(getter.GetHeapObject()));
-
-      Call* call = CreateNewNode<Call>(Call::kFixedInputCount + 1,
-                                       ConvertReceiverMode::kNotNullOrUndefined,
-                                       GetConstant(getter_ref), GetContext());
-      call->set_arg(0, receiver);
-      SetAccumulator(AddNode(call));
-      break;
+
+    compiler::AccessInfoFactory access_info_factory(
+        broker(), broker()->dependencies(), zone());
+    if (!access_info_factory.FinalizePropertyAccessInfos(
+            access_infos_for_feedback, access_mode, &access_infos)) {
+      return false;
     }
-    default:
-      UNREACHABLE();
   }
-  return true;
-}
 
-bool MaglevGraphBuilder::TryBuildMonomorphicElementLoad(
-    ValueNode* object, ValueNode* index, const compiler::MapRef& map,
-    MaybeObjectHandle handler) {
-  if (handler.is_null()) return false;
+  // Check for monomorphic case.
+  if (access_infos.size() == 1) {
+    compiler::PropertyAccessInfo access_info = access_infos.front();
+    const compiler::MapRef& map =
+        access_info.lookup_start_object_maps().front();
+    if (map.IsStringMap()) {
+      // Check for string maps before checking if we need to do an access
+      // check. Primitive strings always get the prototype from the native
+      // context they're operated on, so they don't need the access check.
+      BuildCheckString(lookup_start_object);
+    } else {
+      BuildMapCheck(lookup_start_object, map);
+    }
 
-  if (handler->IsSmi()) {
-    return TryBuildMonomorphicElementLoadFromSmiHandler(
-        object, index, map, handler->ToSmi().value());
+    // Generate the actual property access.
+    return TryBuildPropertyAccess(receiver, lookup_start_object, access_info,
+                                  access_mode);
+  } else {
+    // TODO(victorgomes): polymorphic case.
+    return false;
   }
-  return false;
 }
 
-bool MaglevGraphBuilder::TryBuildMonomorphicElementLoadFromSmiHandler(
-    ValueNode* object, ValueNode* index, const compiler::MapRef& map,
-    int32_t handler) {
-  LoadHandler::Kind kind = LoadHandler::KindBits::decode(handler);
+bool MaglevGraphBuilder::TryBuildElementAccess(
+    ValueNode* object, ValueNode* index,
+    compiler::ElementAccessFeedback const& feedback) {
+  // TODO(victorgomes): Implement other access modes.
+  if (feedback.keyed_mode().access_mode() != compiler::AccessMode::kLoad) {
+    return false;
+  }
 
-  switch (kind) {
-    case LoadHandler::Kind::kElement: {
-      if (LoadHandler::AllowOutOfBoundsBits::decode(handler)) {
-        return false;
-      }
-      ElementsKind elements_kind =
-          LoadHandler::ElementsKindBits::decode(handler);
-      if (!IsFastElementsKind(elements_kind)) return false;
+  // TODO(victorgomes): Add fast path for loading from HeapConstant.
+  // TODO(victorgomes): Add fast path for loading from String.
 
-      // TODO(leszeks): Handle holey elements.
-      if (IsHoleyElementsKind(elements_kind)) return false;
-      DCHECK(!LoadHandler::ConvertHoleBits::decode(handler));
+  compiler::AccessInfoFactory access_info_factory(
+      broker(), broker()->dependencies(), zone());
+  ZoneVector<compiler::ElementAccessInfo> access_infos(zone());
+  if (!access_info_factory.ComputeElementAccessInfos(feedback, &access_infos) ||
+      access_infos.empty()) {
+    return false;
+  }
 
-      BuildMapCheck(object, map);
-      BuildCheckSmi(index);
+  // Check for monomorphic case.
+  if (access_infos.size() == 1) {
+    compiler::ElementAccessInfo access_info = access_infos.front();
 
-      if (LoadHandler::IsJsArrayBits::decode(handler)) {
-        DCHECK(map.IsJSArrayMap());
-        AddNewNode<CheckJSArrayBounds>({object, index});
-      } else {
-        DCHECK(!map.IsJSArrayMap());
-        DCHECK(map.IsJSObjectMap());
-        AddNewNode<CheckJSObjectElementsBounds>({object, index});
+    // TODO(victorgomes): Support elment kind transitions.
+    if (access_info.transition_sources().size() != 0) return false;
+
+    // TODO(victorgomes): Support more elements kind.
+    ElementsKind elements_kind = access_info.elements_kind();
+    if (!IsFastElementsKind(elements_kind)) return false;
+    if (IsHoleyElementsKind(elements_kind)) return false;
+
+    const compiler::MapRef& map =
+        access_info.lookup_start_object_maps().front();
+    BuildMapCheck(object, map);
+
+    switch (index->properties().value_representation()) {
+      case ValueRepresentation::kTagged: {
+        if (SmiConstant* constant = index->TryCast<SmiConstant>()) {
+          index = GetInt32Constant(constant->value().value());
+        } else {
+          NodeInfo* node_info = known_node_aspects().GetOrCreateInfoFor(index);
+          if (node_info->is_smi()) {
+            if (!node_info->int32_alternative) {
+              // TODO(leszeks): This could be unchecked.
+              node_info->int32_alternative =
+                  AddNewNode<CheckedSmiUntag>({index});
+            }
+            index = node_info->int32_alternative;
+          } else {
+            // TODO(leszeks): Cache this knowledge/converted value somehow on
+            // the node info.
+            index = AddNewNode<CheckedObjectToIndex>({index});
+          }
+        }
+        break;
       }
-      if (elements_kind == ElementsKind::PACKED_DOUBLE_ELEMENTS) {
-        SetAccumulator(AddNewNode<LoadDoubleElement>({object, index}));
-      } else {
-        DCHECK(!IsDoubleElementsKind(elements_kind));
-        SetAccumulator(AddNewNode<LoadTaggedElement>({object, index}));
+      case ValueRepresentation::kInt32: {
+        // Already good.
+        break;
+      }
+      case ValueRepresentation::kFloat64: {
+        // TODO(leszeks): Pass in the index register (probably the
+        // accumulator), so that we can save this truncation on there as a
+        // conversion node.
+        index = AddNewNode<CheckedTruncateFloat64ToInt32>({index});
+        break;
       }
-      return true;
     }
-    default:
-      return false;
+
+    if (map.IsJSArrayMap()) {
+      AddNewNode<CheckJSArrayBounds>({object, index});
+    } else {
+      DCHECK(map.IsJSObjectMap());
+      AddNewNode<CheckJSObjectElementsBounds>({object, index});
+    }
+    if (elements_kind == ElementsKind::PACKED_DOUBLE_ELEMENTS) {
+      SetAccumulator(AddNewNode<LoadDoubleElement>({object, index}));
+    } else {
+      DCHECK(!IsDoubleElementsKind(elements_kind));
+      SetAccumulator(AddNewNode<LoadTaggedElement>({object, index}));
+    }
+    return true;
+
+  } else {
+    // TODO(victorgomes): polymorphic case.
+    return false;
   }
 }
 
@@ -1210,20 +1567,13 @@ void MaglevGraphBuilder::VisitGetNamedProperty() {
           DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess);
       return;
 
-    case compiler::ProcessedFeedback::kNamedAccess: {
-      const compiler::NamedAccessFeedback& named_feedback =
-          processed_feedback.AsNamedAccess();
-      if (named_feedback.maps().size() != 1) break;
-      compiler::MapRef map = named_feedback.maps()[0];
-
-      // Monomorphic load, check the handler.
-      // TODO(leszeks): Make GetFeedbackForPropertyAccess read the handler.
-      MaybeObjectHandle handler =
-          FeedbackNexusForSlot(slot).FindHandlerForMap(map.object());
-
-      if (TryBuildMonomorphicLoad(object, object, map, handler)) return;
-    } break;
-
+    case compiler::ProcessedFeedback::kNamedAccess:
+      if (TryBuildNamedAccess(object, object,
+                              processed_feedback.AsNamedAccess(),
+                              compiler::AccessMode::kLoad)) {
+        return;
+      }
+      break;
     default:
       break;
   }
@@ -1258,20 +1608,13 @@ void MaglevGraphBuilder::VisitGetNamedPropertyFromSuper() {
           DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess);
       return;
 
-    case compiler::ProcessedFeedback::kNamedAccess: {
-      const compiler::NamedAccessFeedback& named_feedback =
-          processed_feedback.AsNamedAccess();
-      if (named_feedback.maps().size() != 1) break;
-      compiler::MapRef map = named_feedback.maps()[0];
-
-      // Monomorphic load, check the handler.
-      // TODO(leszeks): Make GetFeedbackForPropertyAccess read the handler.
-      MaybeObjectHandle handler =
-          FeedbackNexusForSlot(slot).FindHandlerForMap(map.object());
-
-      if (TryBuildMonomorphicLoad(receiver, lookup_start_object, map, handler))
+    case compiler::ProcessedFeedback::kNamedAccess:
+      if (TryBuildNamedAccess(receiver, lookup_start_object,
+                              processed_feedback.AsNamedAccess(),
+                              compiler::AccessMode::kLoad)) {
         return;
-    } break;
+      }
+      break;
 
     default:
       break;
@@ -1288,7 +1631,6 @@ void MaglevGraphBuilder::VisitGetKeyedProperty() {
   ValueNode* object = LoadRegisterTagged(0);
   // TODO(leszeks): We don't need to tag the key if it's an Int32 and a simple
   // monomorphic element load.
-  ValueNode* key = GetAccumulatorTagged();
   FeedbackSlot slot = GetSlotOperand(1);
   compiler::FeedbackSource feedback_source{feedback(), slot};
 
@@ -1303,19 +1645,13 @@ void MaglevGraphBuilder::VisitGetKeyedProperty() {
       return;
 
     case compiler::ProcessedFeedback::kElementAccess: {
-      const compiler::ElementAccessFeedback& element_feedback =
-          processed_feedback.AsElementAccess();
-      if (element_feedback.transition_groups().size() != 1) break;
-      if (element_feedback.transition_groups()[0].size() != 1) break;
-      compiler::MapRef map = MakeRefAssumeMemoryFence(
-          broker(), element_feedback.transition_groups()[0].front());
-
-      // Monomorphic load, check the handler.
-      // TODO(leszeks): Make GetFeedbackForPropertyAccess read the handler.
-      MaybeObjectHandle handler =
-          FeedbackNexusForSlot(slot).FindHandlerForMap(map.object());
-
-      if (TryBuildMonomorphicElementLoad(object, key, map, handler)) return;
+      // Get the accumulator without conversion. TryBuildElementAccess
+      // will try to pick the best representation.
+      ValueNode* index = current_interpreter_frame_.accumulator();
+      if (TryBuildElementAccess(object, index,
+                                processed_feedback.AsElementAccess())) {
+        return;
+      }
       break;
     }
 
@@ -1325,6 +1661,7 @@ void MaglevGraphBuilder::VisitGetKeyedProperty() {
 
   // Create a generic store in the fallthrough.
   ValueNode* context = GetContext();
+  ValueNode* key = GetAccumulatorTagged();
   SetAccumulator(
       AddNewNode<GetKeyedGeneric>({context, object, key}, feedback_source));
 }
@@ -1332,10 +1669,21 @@ void MaglevGraphBuilder::VisitGetKeyedProperty() {
 void MaglevGraphBuilder::VisitLdaModuleVariable() {
   // LdaModuleVariable <cell_index> <depth>
   int cell_index = iterator_.GetImmediateOperand(0);
-  int depth = iterator_.GetUnsignedImmediateOperand(1);
+  size_t depth = iterator_.GetUnsignedImmediateOperand(1);
 
   ValueNode* context = GetContext();
-  for (int i = 0; i < depth; i++) {
+  MinimizeContextChainDepth(&context, &depth);
+
+  if (compilation_unit_->info()->specialize_to_function_context()) {
+    base::Optional<compiler::ContextRef> maybe_ref =
+        FunctionContextSpecialization::TryToRef(compilation_unit_, context,
+                                                &depth);
+    if (maybe_ref.has_value()) {
+      context = GetConstant(maybe_ref.value());
+    }
+  }
+
+  for (size_t i = 0; i < depth; i++) {
     context = AddNewNode<LoadTaggedField>(
         {context}, Context::OffsetOfElementAt(Context::PREVIOUS_INDEX));
   }
@@ -1366,9 +1714,21 @@ void MaglevGraphBuilder::VisitStaModuleVariable() {
                          AbortReason::kUnsupportedModuleOperation))});
     return;
   }
+
   ValueNode* context = GetContext();
-  int depth = iterator_.GetUnsignedImmediateOperand(1);
-  for (int i = 0; i < depth; i++) {
+  size_t depth = iterator_.GetUnsignedImmediateOperand(1);
+  MinimizeContextChainDepth(&context, &depth);
+
+  if (compilation_unit_->info()->specialize_to_function_context()) {
+    base::Optional<compiler::ContextRef> maybe_ref =
+        FunctionContextSpecialization::TryToRef(compilation_unit_, context,
+                                                &depth);
+    if (maybe_ref.has_value()) {
+      context = GetConstant(maybe_ref.value());
+    }
+  }
+
+  for (size_t i = 0; i < depth; i++) {
     context = AddNewNode<LoadTaggedField>(
         {context}, Context::OffsetOfElementAt(Context::PREVIOUS_INDEX));
   }
@@ -1383,86 +1743,6 @@ void MaglevGraphBuilder::VisitStaModuleVariable() {
                                                Cell::kValueOffset);
 }
 
-bool MaglevGraphBuilder::TryBuildMonomorphicStoreFromSmiHandler(
-    ValueNode* object, const compiler::MapRef& map, int32_t handler) {
-  StoreHandler::Kind kind = StoreHandler::KindBits::decode(handler);
-  if (kind != StoreHandler::Kind::kField) return false;
-
-  Representation::Kind representation =
-      StoreHandler::RepresentationBits::decode(handler);
-  if (representation == Representation::kDouble) return false;
-
-  InternalIndex descriptor_idx(StoreHandler::DescriptorBits::decode(handler));
-  PropertyDetails property_details =
-      map.instance_descriptors().GetPropertyDetails(descriptor_idx);
-
-  // TODO(leszeks): Allow a fast path which checks for equality with the current
-  // value.
-  if (property_details.constness() == PropertyConstness::kConst) return false;
-
-  BuildMapCheck(object, map);
-
-  ValueNode* store_target;
-  if (StoreHandler::IsInobjectBits::decode(handler)) {
-    store_target = object;
-  } else {
-    // The field is in the property array, first Store it from there.
-    store_target = AddNewNode<LoadTaggedField>(
-        {object}, JSReceiver::kPropertiesOrHashOffset);
-  }
-
-  int field_index = StoreHandler::FieldIndexBits::decode(handler);
-  int offset = field_index * kTaggedSize;
-
-  ValueNode* value = GetAccumulatorTagged();
-  if (representation == Representation::kSmi) {
-    BuildCheckSmi(value);
-    AddNewNode<StoreTaggedFieldNoWriteBarrier>({store_target, value}, offset);
-    return true;
-  }
-
-  if (representation == Representation::kHeapObject) {
-    FieldType descriptors_field_type =
-        map.instance_descriptors().object()->GetFieldType(descriptor_idx);
-    if (descriptors_field_type.IsNone()) {
-      // Store is not safe if the field type was cleared. Since we check this
-      // late, we'll emit a useless map check and maybe property store load, but
-      // that's fine, this case should be rare.
-      return false;
-    }
-
-    // Emit a map check for the field type, if needed, otherwise just a
-    // HeapObject check.
-    if (descriptors_field_type.IsClass()) {
-      // Check that the value matches the expected field type.
-      base::Optional<compiler::MapRef> maybe_field_map =
-          TryMakeRef(broker(), descriptors_field_type.AsClass());
-      if (!maybe_field_map.has_value()) return false;
-
-      BuildMapCheck(value, *maybe_field_map);
-    } else {
-      BuildCheckHeapObject(value);
-    }
-  }
-  AddNewNode<StoreTaggedFieldWithWriteBarrier>({store_target, value}, offset);
-  return true;
-}
-
-bool MaglevGraphBuilder::TryBuildMonomorphicStore(ValueNode* object,
-                                                  const compiler::MapRef& map,
-                                                  MaybeObjectHandle handler) {
-  if (handler.is_null()) return false;
-
-  if (handler->IsSmi()) {
-    return TryBuildMonomorphicStoreFromSmiHandler(object, map,
-                                                  handler->ToSmi().value());
-  }
-  // TODO(leszeks): If we add non-Smi paths here, make sure to differentiate
-  // between Define and Set.
-
-  return false;
-}
-
 void MaglevGraphBuilder::BuildLoadGlobal(
     compiler::NameRef name, compiler::FeedbackSource& feedback_source,
     TypeofMode typeof_mode) {
@@ -1504,20 +1784,13 @@ void MaglevGraphBuilder::VisitSetNamedProperty() {
           DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess);
       return;
 
-    case compiler::ProcessedFeedback::kNamedAccess: {
-      const compiler::NamedAccessFeedback& named_feedback =
-          processed_feedback.AsNamedAccess();
-      if (named_feedback.maps().size() != 1) break;
-      compiler::MapRef map = named_feedback.maps()[0];
-
-      // Monomorphic store, check the handler.
-      // TODO(leszeks): Make GetFeedbackForPropertyAccess read the handler.
-      MaybeObjectHandle handler =
-          FeedbackNexusForSlot(slot).FindHandlerForMap(map.object());
-
-      if (TryBuildMonomorphicStore(object, map, handler)) return;
-    } break;
-
+    case compiler::ProcessedFeedback::kNamedAccess:
+      if (TryBuildNamedAccess(object, object,
+                              processed_feedback.AsNamedAccess(),
+                              compiler::AccessMode::kStore)) {
+        return;
+      }
+      break;
     default:
       break;
   }
@@ -1546,19 +1819,13 @@ void MaglevGraphBuilder::VisitDefineNamedOwnProperty() {
           DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess);
       return;
 
-    case compiler::ProcessedFeedback::kNamedAccess: {
-      const compiler::NamedAccessFeedback& named_feedback =
-          processed_feedback.AsNamedAccess();
-      if (named_feedback.maps().size() != 1) break;
-      compiler::MapRef map = named_feedback.maps()[0];
-
-      // Monomorphic store, check the handler.
-      // TODO(leszeks): Make GetFeedbackForPropertyAccess read the handler.
-      MaybeObjectHandle handler =
-          FeedbackNexusForSlot(slot).FindHandlerForMap(map.object());
-
-      if (TryBuildMonomorphicStore(object, map, handler)) return;
-    } break;
+    case compiler::ProcessedFeedback::kNamedAccess:
+      if (TryBuildNamedAccess(object, object,
+                              processed_feedback.AsNamedAccess(),
+                              compiler::AccessMode::kDefine)) {
+        return;
+      }
+      break;
 
     default:
       break;
@@ -1644,14 +1911,6 @@ void MaglevGraphBuilder::VisitDefineKeyedOwnPropertyInLiteral() {
                        {object, name, value, flags, feedback_vector, slot}));
 }
 
-void MaglevGraphBuilder::VisitCollectTypeProfile() {
-  ValueNode* position = GetSmiConstant(GetFlag8Operand(0));
-  ValueNode* value = GetAccumulatorTagged();
-  ValueNode* feedback_vector = GetConstant(feedback());
-  SetAccumulator(BuildCallRuntime(Runtime::kCollectTypeProfile,
-                                  {position, value, feedback_vector}));
-}
-
 void MaglevGraphBuilder::VisitAdd() { VisitBinaryOperation<Operation::kAdd>(); }
 void MaglevGraphBuilder::VisitSub() {
   VisitBinaryOperation<Operation::kSubtract>();
@@ -1802,9 +2061,15 @@ void MaglevGraphBuilder::VisitGetSuperConstructor() {
   StoreRegister(iterator_.GetRegisterOperand(0), map_proto);
 }
 
-void MaglevGraphBuilder::VisitFindNonDefaultConstructor() {
-  // TODO(v8:13091): Implement.
-  CHECK(false);
+void MaglevGraphBuilder::VisitFindNonDefaultConstructorOrConstruct() {
+  ValueNode* this_function = LoadRegisterTagged(0);
+  ValueNode* new_target = LoadRegisterTagged(1);
+
+  CallBuiltin* call_builtin =
+      BuildCallBuiltin<Builtin::kFindNonDefaultConstructorOrConstruct>(
+          {this_function, new_target});
+  auto result = iterator_.GetRegisterPairOperand(2);
+  StoreRegisterPair(result, call_builtin);
 }
 
 void MaglevGraphBuilder::InlineCallFromRegisters(
@@ -1826,8 +2091,7 @@ void MaglevGraphBuilder::InlineCallFromRegisters(
 
   // Finish the current block with a jump to the inlined function.
   BasicBlockRef start_ref, end_ref;
-  BasicBlock* block = CreateBlock<JumpToInlined>({}, &start_ref, inner_unit);
-  ResolveJumpsToBlockAtOffset(block, block_offset_);
+  BasicBlock* block = FinishBlock<JumpToInlined>({}, &start_ref, inner_unit);
 
   // Manually create the prologue of the inner function graph, so that we
   // can manually set up the arguments.
@@ -1877,10 +2141,7 @@ void MaglevGraphBuilder::InlineCallFromRegisters(
   inner_graph_builder.ProcessMergePoint(
       inner_graph_builder.inline_exit_offset());
   inner_graph_builder.StartNewBlock(inner_graph_builder.inline_exit_offset());
-  BasicBlock* end_block =
-      inner_graph_builder.CreateBlock<JumpFromInlined>({}, &end_ref);
-  inner_graph_builder.ResolveJumpsToBlockAtOffset(
-      end_block, inner_graph_builder.inline_exit_offset());
+  inner_graph_builder.FinishBlock<JumpFromInlined>({}, &end_ref);
 
   // Pull the returned accumulator value out of the inlined function's final
   // merged return state.
@@ -1893,7 +2154,6 @@ void MaglevGraphBuilder::InlineCallFromRegisters(
   current_block_ = zone()->New<BasicBlock>(MergePointInterpreterFrameState::New(
       *compilation_unit_, current_interpreter_frame_,
       iterator_.current_offset(), 1, block, GetInLiveness()));
-  block_offset_ = iterator_.current_offset();
   // Set the exit JumpFromInlined to jump to this resume block.
   // TODO(leszeks): Passing start_ref to JumpFromInlined creates a two-element
   // linked list of refs. Consider adding a helper to explicitly set the target
@@ -1952,7 +2212,7 @@ void MaglevGraphBuilder::BuildCallFromRegisters(
       return;
 
     case compiler::ProcessedFeedback::kCall: {
-      if (!FLAG_maglev_inlining) break;
+      if (!v8_flags.maglev_inlining) break;
 
       const compiler::CallFeedback& call_feedback = processed_feedback.AsCall();
       CallFeedbackContent content = call_feedback.call_feedback_content();
@@ -2245,10 +2505,10 @@ void MaglevGraphBuilder::VisitIntrinsicAsyncGeneratorResolve(
        GetTaggedValue(args[2])}));
 }
 
-void MaglevGraphBuilder::VisitIntrinsicAsyncGeneratorYield(
+void MaglevGraphBuilder::VisitIntrinsicAsyncGeneratorYieldWithAwait(
     interpreter::RegisterList args) {
   DCHECK_EQ(args.register_count(), 3);
-  SetAccumulator(BuildCallBuiltin<Builtin::kAsyncGeneratorYield>(
+  SetAccumulator(BuildCallBuiltin<Builtin::kAsyncGeneratorYieldWithAwait>(
       {GetTaggedValue(args[0]), GetTaggedValue(args[1]),
        GetTaggedValue(args[2])}));
 }
@@ -2258,10 +2518,12 @@ void MaglevGraphBuilder::VisitConstruct() {
   ValueNode* constructor = LoadRegisterTagged(0);
   interpreter::RegisterList args = iterator_.GetRegisterListOperand(1);
   ValueNode* context = GetContext();
+  FeedbackSlot slot = GetSlotOperand(3);
+  compiler::FeedbackSource feedback_source{feedback(), slot};
 
   size_t input_count = args.register_count() + 1 + Construct::kFixedInputCount;
-  Construct* construct =
-      CreateNewNode<Construct>(input_count, constructor, new_target, context);
+  Construct* construct = CreateNewNode<Construct>(
+      input_count, feedback_source, constructor, new_target, context);
   int arg_index = 0;
   // Add undefined receiver.
   construct->set_arg(arg_index++, GetRootConstant(RootIndex::kUndefinedValue));
@@ -2319,10 +2581,9 @@ void MaglevGraphBuilder::VisitTestInstanceOf() {
 
   // TODO(victorgomes): Check feedback slot and a do static lookup for
   // @@hasInstance.
-  USE(feedback_source);
-
   ValueNode* context = GetContext();
-  SetAccumulator(AddNewNode<TestInstanceOf>({context, object, callable}));
+  SetAccumulator(
+      AddNewNode<TestInstanceOf>({context, object, callable}, feedback_source));
 }
 
 void MaglevGraphBuilder::VisitTestIn() {
@@ -2358,6 +2619,7 @@ void MaglevGraphBuilder::BuildToNumberOrToNumeric(Object::Conversion mode) {
       UNREACHABLE();
     case BinaryOperationHint::kNumber:
     case BinaryOperationHint::kBigInt:
+    case BinaryOperationHint::kBigInt64:
       AddNewNode<CheckNumber>({value}, mode);
       break;
     default:
@@ -2514,6 +2776,8 @@ void MaglevGraphBuilder::VisitCreateClosure() {
 
 void MaglevGraphBuilder::VisitCreateBlockContext() {
   // TODO(v8:7700): Inline allocation when context is small.
+  // TODO(v8:7700): Update TryGetParentContext if this ever emits its own Node
+  // type.
   // CreateBlockContext <scope_info_idx>
   ValueNode* scope_info = GetConstant(GetRefOperand<ScopeInfo>(0));
   SetAccumulator(BuildCallRuntime(Runtime::kPushBlockContext, {scope_info}));
@@ -2521,6 +2785,8 @@ void MaglevGraphBuilder::VisitCreateBlockContext() {
 
 void MaglevGraphBuilder::VisitCreateCatchContext() {
   // TODO(v8:7700): Inline allocation when context is small.
+  // TODO(v8:7700): Update TryGetParentContext if this ever emits its own Node
+  // type.
   // CreateCatchContext <exception> <scope_info_idx>
   ValueNode* exception = LoadRegisterTagged(0);
   ValueNode* scope_info = GetConstant(GetRefOperand<ScopeInfo>(1));
@@ -2536,6 +2802,8 @@ void MaglevGraphBuilder::VisitCreateFunctionContext() {
 }
 
 void MaglevGraphBuilder::VisitCreateEvalContext() {
+  // TODO(v8:7700): Update TryGetParentContext if this ever emits its own Node
+  // type.
   compiler::ScopeInfoRef info = GetRefOperand<ScopeInfo>(0);
   uint32_t slot_count = iterator_.GetUnsignedImmediateOperand(1);
   if (slot_count <= static_cast<uint32_t>(
@@ -2593,10 +2861,7 @@ void MaglevGraphBuilder::VisitJumpLoop() {
                                BytecodeOffset(iterator_.current_offset()),
                                compilation_unit_);
   BasicBlock* block =
-      target == block_offset_
-          ? FinishBlock<JumpLoop>(next_offset(), {}, &jump_targets_[target])
-          : FinishBlock<JumpLoop>(next_offset(), {},
-                                  jump_targets_[target].block_ptr());
+      FinishBlock<JumpLoop>({}, jump_targets_[target].block_ptr());
 
   merge_states_[target]->MergeLoop(*compilation_unit_,
                                    current_interpreter_frame_, block, target);
@@ -2608,8 +2873,8 @@ void MaglevGraphBuilder::VisitJump() {
   if (relative_jump_bytecode_offset > 0) {
     AddNewNode<IncreaseInterruptBudget>({}, relative_jump_bytecode_offset);
   }
-  BasicBlock* block = FinishBlock<Jump>(
-      next_offset(), {}, &jump_targets_[iterator_.GetJumpTargetOffset()]);
+  BasicBlock* block =
+      FinishBlock<Jump>({}, &jump_targets_[iterator_.GetJumpTargetOffset()]);
   MergeIntoFrameState(block, iterator_.GetJumpTargetOffset());
   DCHECK_LT(next_offset(), bytecode().length());
 }
@@ -2663,7 +2928,7 @@ void MaglevGraphBuilder::MergeDeadIntoFrameState(int target) {
     // If this merge is the last one which kills a loop merge, remove that
     // merge state.
     if (merge_states_[target]->is_unreachable_loop()) {
-      if (FLAG_trace_maglev_graph_building) {
+      if (v8_flags.trace_maglev_graph_building) {
         std::cout << "! Killing loop merge state at @" << target << std::endl;
       }
       merge_states_[target] = nullptr;
@@ -2705,83 +2970,107 @@ void MaglevGraphBuilder::MergeIntoInlinedReturnFrameState(
 }
 
 void MaglevGraphBuilder::BuildBranchIfRootConstant(ValueNode* node,
-                                                   int true_target,
-                                                   int false_target,
+                                                   JumpType jump_type,
                                                    RootIndex root_index) {
+  int fallthrough_offset = next_offset();
+  int jump_offset = iterator_.GetJumpTargetOffset();
+  BasicBlockRef* true_target = jump_type == kJumpIfTrue
+                                   ? &jump_targets_[jump_offset]
+                                   : &jump_targets_[fallthrough_offset];
+  BasicBlockRef* false_target = jump_type == kJumpIfFalse
+                                    ? &jump_targets_[jump_offset]
+                                    : &jump_targets_[fallthrough_offset];
   BasicBlock* block = FinishBlock<BranchIfRootConstant>(
-      next_offset(), {node}, &jump_targets_[true_target],
-      &jump_targets_[false_target], root_index);
-  MergeIntoFrameState(block, iterator_.GetJumpTargetOffset());
+      {node}, true_target, false_target, root_index);
+  if (jump_type == kJumpIfTrue) {
+    block->control_node()
+        ->Cast<BranchControlNode>()
+        ->set_true_interrupt_correction(
+            iterator_.GetRelativeJumpTargetOffset());
+  } else {
+    block->control_node()
+        ->Cast<BranchControlNode>()
+        ->set_false_interrupt_correction(
+            iterator_.GetRelativeJumpTargetOffset());
+  }
+  MergeIntoFrameState(block, jump_offset);
+  StartFallthroughBlock(fallthrough_offset, block);
 }
-void MaglevGraphBuilder::BuildBranchIfTrue(ValueNode* node, int true_target,
-                                           int false_target) {
-  BuildBranchIfRootConstant(node, true_target, false_target,
-                            RootIndex::kTrueValue);
+void MaglevGraphBuilder::BuildBranchIfTrue(ValueNode* node,
+                                           JumpType jump_type) {
+  BuildBranchIfRootConstant(node, jump_type, RootIndex::kTrueValue);
 }
-void MaglevGraphBuilder::BuildBranchIfNull(ValueNode* node, int true_target,
-                                           int false_target) {
-  BuildBranchIfRootConstant(node, true_target, false_target,
-                            RootIndex::kNullValue);
+void MaglevGraphBuilder::BuildBranchIfNull(ValueNode* node,
+                                           JumpType jump_type) {
+  BuildBranchIfRootConstant(node, jump_type, RootIndex::kNullValue);
 }
 void MaglevGraphBuilder::BuildBranchIfUndefined(ValueNode* node,
-                                                int true_target,
-                                                int false_target) {
-  BuildBranchIfRootConstant(node, true_target, false_target,
-                            RootIndex::kUndefinedValue);
+                                                JumpType jump_type) {
+  BuildBranchIfRootConstant(node, jump_type, RootIndex::kUndefinedValue);
 }
 void MaglevGraphBuilder::BuildBranchIfToBooleanTrue(ValueNode* node,
-                                                    int true_target,
-                                                    int false_target) {
-  BasicBlock* block = FinishBlock<BranchIfToBooleanTrue>(
-      next_offset(), {node}, &jump_targets_[true_target],
-      &jump_targets_[false_target]);
-  MergeIntoFrameState(block, iterator_.GetJumpTargetOffset());
+                                                    JumpType jump_type) {
+  int fallthrough_offset = next_offset();
+  int jump_offset = iterator_.GetJumpTargetOffset();
+  BasicBlockRef* true_target = jump_type == kJumpIfTrue
+                                   ? &jump_targets_[jump_offset]
+                                   : &jump_targets_[fallthrough_offset];
+  BasicBlockRef* false_target = jump_type == kJumpIfFalse
+                                    ? &jump_targets_[jump_offset]
+                                    : &jump_targets_[fallthrough_offset];
+  BasicBlock* block =
+      FinishBlock<BranchIfToBooleanTrue>({node}, true_target, false_target);
+  if (jump_type == kJumpIfTrue) {
+    block->control_node()
+        ->Cast<BranchControlNode>()
+        ->set_true_interrupt_correction(
+            iterator_.GetRelativeJumpTargetOffset());
+  } else {
+    block->control_node()
+        ->Cast<BranchControlNode>()
+        ->set_false_interrupt_correction(
+            iterator_.GetRelativeJumpTargetOffset());
+  }
+  MergeIntoFrameState(block, jump_offset);
+  StartFallthroughBlock(fallthrough_offset, block);
 }
 void MaglevGraphBuilder::VisitJumpIfToBooleanTrue() {
-  BuildBranchIfToBooleanTrue(GetAccumulatorTagged(),
-                             iterator_.GetJumpTargetOffset(), next_offset());
+  BuildBranchIfToBooleanTrue(GetAccumulatorTagged(), kJumpIfTrue);
 }
 void MaglevGraphBuilder::VisitJumpIfToBooleanFalse() {
-  BuildBranchIfToBooleanTrue(GetAccumulatorTagged(), next_offset(),
-                             iterator_.GetJumpTargetOffset());
+  BuildBranchIfToBooleanTrue(GetAccumulatorTagged(), kJumpIfFalse);
 }
 void MaglevGraphBuilder::VisitJumpIfTrue() {
-  BuildBranchIfTrue(GetAccumulatorTagged(), iterator_.GetJumpTargetOffset(),
-                    next_offset());
+  BuildBranchIfTrue(GetAccumulatorTagged(), kJumpIfTrue);
 }
 void MaglevGraphBuilder::VisitJumpIfFalse() {
-  BuildBranchIfTrue(GetAccumulatorTagged(), next_offset(),
-                    iterator_.GetJumpTargetOffset());
+  BuildBranchIfTrue(GetAccumulatorTagged(), kJumpIfFalse);
 }
 void MaglevGraphBuilder::VisitJumpIfNull() {
-  BuildBranchIfNull(GetAccumulatorTagged(), iterator_.GetJumpTargetOffset(),
-                    next_offset());
+  BuildBranchIfNull(GetAccumulatorTagged(), kJumpIfTrue);
 }
 void MaglevGraphBuilder::VisitJumpIfNotNull() {
-  BuildBranchIfNull(GetAccumulatorTagged(), next_offset(),
-                    iterator_.GetJumpTargetOffset());
+  BuildBranchIfNull(GetAccumulatorTagged(), kJumpIfFalse);
 }
 void MaglevGraphBuilder::VisitJumpIfUndefined() {
-  BuildBranchIfUndefined(GetAccumulatorTagged(),
-                         iterator_.GetJumpTargetOffset(), next_offset());
+  BuildBranchIfUndefined(GetAccumulatorTagged(), kJumpIfTrue);
 }
 void MaglevGraphBuilder::VisitJumpIfNotUndefined() {
-  BuildBranchIfUndefined(GetAccumulatorTagged(), next_offset(),
-                         iterator_.GetJumpTargetOffset());
+  BuildBranchIfUndefined(GetAccumulatorTagged(), kJumpIfFalse);
 }
 void MaglevGraphBuilder::VisitJumpIfUndefinedOrNull() {
   BasicBlock* block = FinishBlock<BranchIfUndefinedOrNull>(
-      next_offset(), {GetAccumulatorTagged()},
-      &jump_targets_[iterator_.GetJumpTargetOffset()],
+      {GetAccumulatorTagged()}, &jump_targets_[iterator_.GetJumpTargetOffset()],
       &jump_targets_[next_offset()]);
   MergeIntoFrameState(block, iterator_.GetJumpTargetOffset());
+  StartFallthroughBlock(next_offset(), block);
 }
 void MaglevGraphBuilder::VisitJumpIfJSReceiver() {
   BasicBlock* block = FinishBlock<BranchIfJSReceiver>(
-      next_offset(), {GetAccumulatorTagged()},
-      &jump_targets_[iterator_.GetJumpTargetOffset()],
+      {GetAccumulatorTagged()}, &jump_targets_[iterator_.GetJumpTargetOffset()],
       &jump_targets_[next_offset()]);
   MergeIntoFrameState(block, iterator_.GetJumpTargetOffset());
+  StartFallthroughBlock(next_offset(), block);
 }
 
 void MaglevGraphBuilder::VisitSwitchOnSmiNoFeedback() {
@@ -2800,11 +3089,12 @@ void MaglevGraphBuilder::VisitSwitchOnSmiNoFeedback() {
 
   ValueNode* case_value = GetAccumulatorInt32();
   BasicBlock* block =
-      FinishBlock<Switch>(next_offset(), {case_value}, case_value_base, targets,
+      FinishBlock<Switch>({case_value}, case_value_base, targets,
                           offsets.size(), &jump_targets_[next_offset()]);
   for (interpreter::JumpTableTargetOffset offset : offsets) {
     MergeIntoFrameState(block, offset.target_offset);
   }
+  StartFallthroughBlock(next_offset(), block);
 }
 
 void MaglevGraphBuilder::VisitForInEnumerate() {
@@ -2889,7 +3179,7 @@ void MaglevGraphBuilder::VisitReturn() {
   }
 
   if (!is_inline()) {
-    FinishBlock<Return>(next_offset(), {GetAccumulatorTagged()});
+    FinishBlock<Return>({GetAccumulatorTagged()});
     return;
   }
 
@@ -2898,8 +3188,8 @@ void MaglevGraphBuilder::VisitReturn() {
   // execution of the caller.
   // TODO(leszeks): Consider shortcutting this Jump for cases where there is
   // only one return and no need to merge return states.
-  BasicBlock* block = FinishBlock<Jump>(next_offset(), {},
-                                        &jump_targets_[inline_exit_offset()]);
+  BasicBlock* block =
+      FinishBlock<Jump>({}, &jump_targets_[inline_exit_offset()]);
   MergeIntoInlinedReturnFrameState(block);
 }
 
@@ -2955,22 +3245,26 @@ void MaglevGraphBuilder::VisitThrowIfNotSuperConstructor() {
 void MaglevGraphBuilder::VisitSwitchOnGeneratorState() {
   // SwitchOnGeneratorState <generator> <table_start> <table_length>
   // It should be the first bytecode in the bytecode array.
-  DCHECK_EQ(block_offset_, 0);
-  int generator_prologue_block_offset = block_offset_ + 1;
+  DCHECK_EQ(iterator_.current_offset(), 0);
+  int generator_prologue_block_offset = 1;
   DCHECK_LT(generator_prologue_block_offset, next_offset());
 
+  interpreter::JumpTableTargetOffsets offsets =
+      iterator_.GetJumpTableTargetOffsets();
+  // If there are no jump offsets, then this generator is not resumable, which
+  // means we can skip checking for it and switching on its state.
+  if (offsets.size() == 0) return;
+
   // We create an initial block that checks if the generator is undefined.
   ValueNode* maybe_generator = LoadRegisterTagged(0);
-  BasicBlock* block_is_generator_undefined = CreateBlock<BranchIfRootConstant>(
+  BasicBlock* block_is_generator_undefined = FinishBlock<BranchIfRootConstant>(
       {maybe_generator}, &jump_targets_[next_offset()],
       &jump_targets_[generator_prologue_block_offset],
       RootIndex::kUndefinedValue);
   MergeIntoFrameState(block_is_generator_undefined, next_offset());
-  ResolveJumpsToBlockAtOffset(block_is_generator_undefined, block_offset_);
 
   // We create the generator prologue block.
   StartNewBlock(generator_prologue_block_offset);
-  DCHECK_EQ(generator_prologue_block_offset, block_offset_);
 
   // Generator prologue.
   ValueNode* generator = maybe_generator;
@@ -2988,9 +3282,6 @@ void MaglevGraphBuilder::VisitSwitchOnGeneratorState() {
                            interpreter::Register::virtual_accumulator());
 
   // Switch on generator state.
-  interpreter::JumpTableTargetOffsets offsets =
-      iterator_.GetJumpTableTargetOffsets();
-  DCHECK_NE(offsets.size(), 0);
   int case_value_base = (*offsets.begin()).case_value;
   BasicBlockRef* targets = zone()->NewArray<BasicBlockRef>(offsets.size());
   for (interpreter::JumpTableTargetOffset offset : offsets) {
@@ -2998,12 +3289,11 @@ void MaglevGraphBuilder::VisitSwitchOnGeneratorState() {
     new (ref) BasicBlockRef(&jump_targets_[offset.target_offset]);
   }
   ValueNode* case_value = AddNewNode<CheckedSmiUntag>({state});
-  BasicBlock* generator_prologue_block = CreateBlock<Switch>(
+  BasicBlock* generator_prologue_block = FinishBlock<Switch>(
       {case_value}, case_value_base, targets, offsets.size());
   for (interpreter::JumpTableTargetOffset offset : offsets) {
     MergeIntoFrameState(generator_prologue_block, offset.target_offset);
   }
-  ResolveJumpsToBlockAtOffset(generator_prologue_block, block_offset_);
 }
 
 void MaglevGraphBuilder::VisitSuspendGenerator() {
@@ -3035,7 +3325,7 @@ void MaglevGraphBuilder::VisitSuspendGenerator() {
   if (relative_jump_bytecode_offset > 0) {
     AddNewNode<ReduceInterruptBudget>({}, relative_jump_bytecode_offset);
   }
-  FinishBlock<Return>(next_offset(), {GetAccumulatorTagged()});
+  FinishBlock<Return>({GetAccumulatorTagged()});
 }
 
 void MaglevGraphBuilder::VisitResumeGenerator() {
@@ -3045,7 +3335,7 @@ void MaglevGraphBuilder::VisitResumeGenerator() {
       {generator}, JSGeneratorObject::kParametersAndRegistersOffset);
   interpreter::RegisterList registers = iterator_.GetRegisterListOperand(1);
 
-  if (FLAG_maglev_assert) {
+  if (v8_flags.maglev_assert) {
     // Check if register count is invalid, that is, larger than the
     // register file length.
     ValueNode* array_length_smi =
@@ -3104,6 +3394,4 @@ DEBUG_BREAK_BYTECODE_LIST(DEBUG_BREAK)
 #undef DEBUG_BREAK
 void MaglevGraphBuilder::VisitIllegal() { UNREACHABLE(); }
 
-}  // namespace maglev
-}  // namespace internal
-}  // namespace v8
+}  // namespace v8::internal::maglev
diff --git a/deps/v8/src/maglev/maglev-graph-builder.h b/deps/v8/src/maglev/maglev-graph-builder.h
index 93634d79c33104..621a23b015e1ad 100644
--- a/deps/v8/src/maglev/maglev-graph-builder.h
+++ b/deps/v8/src/maglev/maglev-graph-builder.h
@@ -16,7 +16,9 @@
 #include "src/compiler/bytecode-liveness-map.h"
 #include "src/compiler/heap-refs.h"
 #include "src/compiler/js-heap-broker.h"
+#include "src/compiler/processed-feedback.h"
 #include "src/deoptimizer/deoptimize-reason.h"
+#include "src/flags/flags.h"
 #include "src/interpreter/bytecode-array-iterator.h"
 #include "src/interpreter/bytecode-decoder.h"
 #include "src/interpreter/bytecode-register.h"
@@ -73,11 +75,14 @@ class MaglevGraphBuilder {
   Graph* graph() const { return graph_; }
 
  private:
-  BasicBlock* CreateEmptyBlock(int offset, BasicBlock* predecessor) {
+  BasicBlock* CreateEmptyBlock(int offset) {
+    if (v8_flags.trace_maglev_graph_building) {
+      std::cout << "== New empty block ==" << std::endl;
+    }
     DCHECK_NULL(current_block_);
     current_block_ = zone()->New<BasicBlock>(nullptr);
-    BasicBlock* result = CreateBlock<Jump>({}, &jump_targets_[offset]);
-    result->set_empty_block_predecessor(predecessor);
+    BasicBlock* result = FinishBlock<Jump>({}, &jump_targets_[offset]);
+    result->set_empty_block();
     return result;
   }
 
@@ -96,7 +101,7 @@ class MaglevGraphBuilder {
     if (has_graph_labeller()) {
       for (Phi* phi : *merge_states_[offset]->phis()) {
         graph_labeller()->RegisterNode(phi);
-        if (FLAG_trace_maglev_graph_building) {
+        if (v8_flags.trace_maglev_graph_building) {
           std::cout << "  " << phi << "  "
                     << PrintNodeLabel(graph_labeller(), phi) << ": "
                     << PrintNode(graph_labeller(), phi) << std::endl;
@@ -131,7 +136,7 @@ class MaglevGraphBuilder {
       ControlNode* control = predecessor->control_node();
       if (control->Is<ConditionalControlNode>()) {
         // CreateEmptyBlock automatically registers itself with the offset.
-        predecessor = CreateEmptyBlock(offset, predecessor);
+        predecessor = CreateEmptyBlock(offset);
         // Set the old predecessor's (the conditional block) reference to
         // point to the new empty predecessor block.
         old_jump_targets =
@@ -147,7 +152,7 @@ class MaglevGraphBuilder {
     if (has_graph_labeller()) {
       for (Phi* phi : *merge_states_[offset]->phis()) {
         graph_labeller()->RegisterNode(phi);
-        if (FLAG_trace_maglev_graph_building) {
+        if (v8_flags.trace_maglev_graph_building) {
           std::cout << "  " << phi << "  "
                     << PrintNodeLabel(graph_labeller(), phi) << ": "
                     << PrintNode(graph_labeller(), phi) << std::endl;
@@ -166,15 +171,13 @@ class MaglevGraphBuilder {
   void EmitUnconditionalDeopt(DeoptimizeReason reason) {
     // Create a block rather than calling finish, since we don't yet know the
     // next block's offset before the loop skipping the rest of the bytecodes.
-    BasicBlock* block = CreateBlock<Deopt>({}, reason);
-    ResolveJumpsToBlockAtOffset(block, block_offset_);
-
+    FinishBlock<Deopt>({}, reason);
     MarkBytecodeDead();
   }
 
   void MarkBytecodeDead() {
     DCHECK_NULL(current_block_);
-    if (FLAG_trace_maglev_graph_building) {
+    if (v8_flags.trace_maglev_graph_building) {
       std::cout << "== Dead ==\n"
                 << std::setw(4) << iterator_.current_offset() << " : ";
       interpreter::BytecodeDecoder::Decode(std::cout,
@@ -207,31 +210,6 @@ class MaglevGraphBuilder {
       // Any other bytecode that doesn't return or throw will merge into the
       // fallthrough.
       MergeDeadIntoFrameState(iterator_.next_offset());
-    } else if (bytecode == interpreter::Bytecode::kSuspendGenerator) {
-      // Extra special case for SuspendGenerator, if the suspend is dead then
-      // the resume has to be dead too. However, the resume already has a merge
-      // state, with exactly one predecessor (the generator switch), so it will
-      // be revived along the standard path. This can cause havoc if e.g. the
-      // suspend/resume are inside a dead loop, because the JumpLoop can become
-      // live again.
-      //
-      // So, manually advance the iterator to the resume, go through the motions
-      // of processing the merge state, but immediately emit an unconditional
-      // deopt (which also kills the resume).
-      iterator_.Advance();
-      DCHECK_EQ(iterator_.current_bytecode(),
-                interpreter::Bytecode::kResumeGenerator);
-      int resume_offset = iterator_.current_offset();
-      DCHECK_EQ(NumPredecessors(resume_offset), 1);
-      ProcessMergePoint(resume_offset);
-      StartNewBlock(resume_offset);
-      // TODO(v8:7700): This approach is not ideal. We can create a deopt-reopt
-      // loop: the interpreted code runs, creates a generator while feedback is
-      // still not yet allocated, then suspends the generator, tiers up to
-      // maglev, and reaches this deopt. We then deopt, but since the generator
-      // is never created again, we re-opt without the suspend part and we loop!
-      EmitUnconditionalDeopt(DeoptimizeReason::kSuspendGeneratorIsDead);
-      return;
     }
 
     // TODO(leszeks): We could now continue iterating the bytecode
@@ -245,12 +223,11 @@ class MaglevGraphBuilder {
         // TODO(leszeks): Re-evaluate this DCHECK, we might hit it if the only
         // bytecodes in this basic block were only register juggling.
         // DCHECK(!current_block_->nodes().is_empty());
-        FinishBlock<Jump>(offset, {}, &jump_targets_[offset]);
-
+        BasicBlock* predecessor = FinishBlock<Jump>({}, &jump_targets_[offset]);
         merge_state->Merge(*compilation_unit_, current_interpreter_frame_,
-                           graph()->last_block(), offset);
+                           predecessor, offset);
       }
-      if (FLAG_trace_maglev_graph_building) {
+      if (v8_flags.trace_maglev_graph_building) {
         auto detail = merge_state->is_exception_handler() ? "exception handler"
                       : merge_state->is_loop()            ? "loop header"
                                                           : "merge";
@@ -316,7 +293,7 @@ class MaglevGraphBuilder {
     }
 
     DCHECK_NOT_NULL(current_block_);
-    if (FLAG_trace_maglev_graph_building) {
+    if (v8_flags.trace_maglev_graph_building) {
       std::cout << std::setw(4) << iterator_.current_offset() << " : ";
       interpreter::BytecodeDecoder::Decode(std::cout,
                                            iterator_.current_address());
@@ -352,7 +329,7 @@ class MaglevGraphBuilder {
     }
     current_block_->nodes().Add(node);
     if (has_graph_labeller()) graph_labeller()->RegisterNode(node);
-    if (FLAG_trace_maglev_graph_building) {
+    if (v8_flags.trace_maglev_graph_building) {
       std::cout << "  " << node << "  "
                 << PrintNodeLabel(graph_labeller(), node) << ": "
                 << PrintNode(graph_labeller(), node) << std::endl;
@@ -408,6 +385,13 @@ class MaglevGraphBuilder {
     return node;
   }
 
+  enum ContextSlotMutability { kImmutable, kMutable };
+  bool TrySpecializeLoadContextSlotToFunctionContext(
+      ValueNode** context, size_t* depth, int slot_index,
+      ContextSlotMutability slot_mutability);
+  void BuildLoadContextSlot(ValueNode* context, size_t depth, int slot_index,
+                            ContextSlotMutability slot_mutability);
+
   template <Builtin kBuiltin>
   CallBuiltin* BuildCallBuiltin(std::initializer_list<ValueNode*> inputs) {
     using Descriptor = typename CallInterfaceDescriptorFor<kBuiltin>::type;
@@ -466,8 +450,7 @@ class MaglevGraphBuilder {
   void BuildAbort(AbortReason reason) {
     // Create a block rather than calling finish, since we don't yet know the
     // next block's offset before the loop skipping the rest of the bytecodes.
-    BasicBlock* block = CreateBlock<Abort>({}, reason);
-    ResolveJumpsToBlockAtOffset(block, block_offset_);
+    FinishBlock<Abort>({}, reason);
     MarkBytecodeDead();
   }
 
@@ -621,78 +604,52 @@ class MaglevGraphBuilder {
     current_interpreter_frame_.set(dst, current_interpreter_frame_.get(src));
   }
 
-  template <typename NodeT>
-  ValueNode* AddNewConversionNode(interpreter::Register reg, ValueNode* node) {
-    // TODO(v8:7700): Use a canonical conversion node. Maybe like in Phi nodes
-    // where we always add a the conversion immediately after the ValueNode.
-    DCHECK(NodeT::kProperties.is_conversion());
-    ValueNode* result = AddNewNode<NodeT>({node});
-    current_interpreter_frame_.set(reg, result);
-    return result;
-  }
-
-  ValueNode* GetTaggedValueHelper(interpreter::Register reg, ValueNode* value) {
-    // TODO(victorgomes): Consider adding the representation in the
-    // InterpreterFrameState, so that we don't need to derefence a node.
+  ValueNode* GetTaggedValue(interpreter::Register reg) {
+    ValueNode* value = current_interpreter_frame_.get(reg);
     switch (value->properties().value_representation()) {
       case ValueRepresentation::kTagged:
         return value;
       case ValueRepresentation::kInt32: {
-        if (value->Is<CheckedSmiUntag>()) {
-          return value->input(0).node();
+        NodeInfo* node_info = known_node_aspects().GetOrCreateInfoFor(value);
+        if (node_info->tagged_alternative == nullptr) {
+          node_info->tagged_alternative = AddNewNode<CheckedSmiTag>({value});
         }
-        return AddNewConversionNode<CheckedSmiTag>(reg, value);
+        return node_info->tagged_alternative;
       }
       case ValueRepresentation::kFloat64: {
-        if (value->Is<CheckedFloat64Unbox>()) {
-          return value->input(0).node();
+        NodeInfo* node_info = known_node_aspects().GetOrCreateInfoFor(value);
+        if (node_info->tagged_alternative == nullptr) {
+          node_info->tagged_alternative = AddNewNode<Float64Box>({value});
         }
-        if (value->Is<ChangeInt32ToFloat64>()) {
-          ValueNode* int32_value = value->input(0).node();
-          return GetTaggedValueHelper(reg, int32_value);
-        }
-        return AddNewConversionNode<Float64Box>(reg, value);
+        return node_info->tagged_alternative;
       }
     }
     UNREACHABLE();
   }
 
-  ValueNode* GetTaggedValue(interpreter::Register reg) {
-    ValueNode* value = current_interpreter_frame_.get(reg);
-    return GetTaggedValueHelper(reg, value);
-  }
-
-  template <typename ConversionNodeT>
-  ValueNode* GetValue(interpreter::Register reg) {
-    ValueNode* value = current_interpreter_frame_.get(reg);
-    return AddNewConversionNode<ConversionNodeT>(reg, value);
-  }
-
   ValueNode* GetInt32(interpreter::Register reg) {
     ValueNode* value = current_interpreter_frame_.get(reg);
     switch (value->properties().value_representation()) {
       case ValueRepresentation::kTagged: {
-        if (value->Is<CheckedSmiTag>()) {
-          return value->input(0).node();
-        } else if (SmiConstant* constant = value->TryCast<SmiConstant>()) {
+        if (SmiConstant* constant = value->TryCast<SmiConstant>()) {
           return GetInt32Constant(constant->value().value());
         }
-        return AddNewConversionNode<CheckedSmiUntag>(reg, value);
+        NodeInfo* node_info = known_node_aspects().GetOrCreateInfoFor(value);
+        if (node_info->int32_alternative == nullptr) {
+          node_info->int32_alternative = AddNewNode<CheckedSmiUntag>({value});
+        }
+        return node_info->int32_alternative;
       }
       case ValueRepresentation::kInt32:
         return value;
-      case ValueRepresentation::kFloat64:
-        // We should not be able to request an Int32 from a Float64 input,
-        // unless it's an unboxing of a tagged value or a conversion from int32.
-        if (value->Is<CheckedFloat64Unbox>()) {
-          // TODO(leszeks): Maybe convert the CheckedFloat64Unbox to
-          // ChangeInt32ToFloat64 with this CheckedSmiUntag as the input.
-          return AddNewConversionNode<CheckedSmiUntag>(reg,
-                                                       value->input(0).node());
-        } else if (value->Is<ChangeInt32ToFloat64>()) {
-          return value->input(0).node();
+      case ValueRepresentation::kFloat64: {
+        NodeInfo* node_info = known_node_aspects().GetOrCreateInfoFor(value);
+        if (node_info->int32_alternative == nullptr) {
+          node_info->int32_alternative =
+              AddNewNode<CheckedTruncateFloat64ToInt32>({value});
         }
-        UNREACHABLE();
+        return node_info->int32_alternative;
+      }
     }
     UNREACHABLE();
   }
@@ -701,25 +658,27 @@ class MaglevGraphBuilder {
     ValueNode* value = current_interpreter_frame_.get(reg);
     switch (value->properties().value_representation()) {
       case ValueRepresentation::kTagged: {
-        if (value->Is<Float64Box>()) {
-          return value->input(0).node();
+        NodeInfo* node_info = known_node_aspects().GetOrCreateInfoFor(value);
+        if (node_info->float64_alternative == nullptr) {
+          node_info->float64_alternative =
+              AddNewNode<CheckedFloat64Unbox>({value});
         }
-        return AddNewConversionNode<CheckedFloat64Unbox>(reg, value);
+        return node_info->float64_alternative;
+      }
+      case ValueRepresentation::kInt32: {
+        NodeInfo* node_info = known_node_aspects().GetOrCreateInfoFor(value);
+        if (node_info->float64_alternative == nullptr) {
+          node_info->float64_alternative =
+              AddNewNode<ChangeInt32ToFloat64>({value});
+        }
+        return node_info->float64_alternative;
       }
-      case ValueRepresentation::kInt32:
-        return AddNewConversionNode<ChangeInt32ToFloat64>(reg, value);
       case ValueRepresentation::kFloat64:
         return value;
     }
     UNREACHABLE();
   }
 
-  template <typename ConversionNodeT>
-  ValueNode* GetAccumulator() {
-    return GetValue<ConversionNodeT>(
-        interpreter::Register::virtual_accumulator());
-  }
-
   ValueNode* GetAccumulatorTagged() {
     return GetTaggedValue(interpreter::Register::virtual_accumulator());
   }
@@ -738,12 +697,6 @@ class MaglevGraphBuilder {
            current_interpreter_frame_.accumulator();
   }
 
-  template <typename ConversionNodeT>
-  ValueNode* LoadRegister(int operand_index) {
-    return GetValue<ConversionNodeT>(
-        iterator_.GetRegisterOperand(operand_index));
-  }
-
   ValueNode* LoadRegisterTagged(int operand_index) {
     return GetTaggedValue(iterator_.GetRegisterOperand(operand_index));
   }
@@ -776,6 +729,8 @@ class MaglevGraphBuilder {
     // would be emitted between these two nodes.
     if (result->opcode() == Opcode::kCallRuntime) {
       DCHECK_EQ(result->Cast<CallRuntime>()->ReturnCount(), 2);
+    } else if (result->opcode() == Opcode::kCallBuiltin) {
+      DCHECK_EQ(result->Cast<CallBuiltin>()->ReturnCount(), 2);
     } else {
       DCHECK_EQ(result->opcode(), Opcode::kForInPrepare);
     }
@@ -886,11 +841,11 @@ class MaglevGraphBuilder {
   void StartNewBlock(int offset) {
     DCHECK_NULL(current_block_);
     current_block_ = zone()->New<BasicBlock>(merge_states_[offset]);
-    block_offset_ = offset;
+    ResolveJumpsToBlockAtOffset(current_block_, offset);
   }
 
   template <typename ControlNodeT, typename... Args>
-  BasicBlock* CreateBlock(std::initializer_list<ValueNode*> control_inputs,
+  BasicBlock* FinishBlock(std::initializer_list<ValueNode*> control_inputs,
                           Args&&... args) {
     ControlNode* control_node = CreateNewNode<ControlNodeT>(
         control_inputs, std::forward<Args>(args)...);
@@ -902,7 +857,7 @@ class MaglevGraphBuilder {
     graph()->Add(block);
     if (has_graph_labeller()) {
       graph_labeller()->RegisterBasicBlock(block);
-      if (FLAG_trace_maglev_graph_building) {
+      if (v8_flags.trace_maglev_graph_building) {
         bool kSkipTargets = true;
         std::cout << "  " << control_node << "  "
                   << PrintNodeLabel(graph_labeller(), control_node) << ": "
@@ -915,40 +870,40 @@ class MaglevGraphBuilder {
 
   // Update all jumps which were targetting the not-yet-created block at the
   // given `block_offset`, to now point to the given `block`.
-  void ResolveJumpsToBlockAtOffset(BasicBlock* block, int block_offset) const {
+  void ResolveJumpsToBlockAtOffset(BasicBlock* block, int block_offset) {
+    int interrupt_budget_correction = 0;
     BasicBlockRef* jump_target_refs_head =
         jump_targets_[block_offset].SetToBlockAndReturnNext(block);
     while (jump_target_refs_head != nullptr) {
+      // Only one jump target should ever set the interrupt budget correction.
+      DCHECK_EQ(interrupt_budget_correction, 0);
+      interrupt_budget_correction =
+          jump_target_refs_head->interrupt_budget_correction();
       jump_target_refs_head =
           jump_target_refs_head->SetToBlockAndReturnNext(block);
     }
+    if (interrupt_budget_correction != 0) {
+      DCHECK_GT(interrupt_budget_correction, 0);
+      AddNewNode<IncreaseInterruptBudget>({}, interrupt_budget_correction);
+    }
     DCHECK_EQ(jump_targets_[block_offset].block_ptr(), block);
   }
 
-  template <typename ControlNodeT, typename... Args>
-  BasicBlock* FinishBlock(int next_block_offset,
-                          std::initializer_list<ValueNode*> control_inputs,
-                          Args&&... args) {
-    BasicBlock* block =
-        CreateBlock<ControlNodeT>(control_inputs, std::forward<Args>(args)...);
-    ResolveJumpsToBlockAtOffset(block, block_offset_);
-
+  void StartFallthroughBlock(int next_block_offset, BasicBlock* predecessor) {
     // Start a new block for the fallthrough path, unless it's a merge point, in
     // which case we merge our state into it. That merge-point could also be a
     // loop header, in which case the merge state might not exist yet (if the
     // only predecessors are this path and the JumpLoop).
     DCHECK_NULL(current_block_);
-    if (std::is_base_of<ConditionalControlNode, ControlNodeT>::value) {
-      if (NumPredecessors(next_block_offset) == 1) {
-        if (FLAG_trace_maglev_graph_building) {
-          std::cout << "== New block (single fallthrough) ==" << std::endl;
-        }
-        StartNewBlock(next_block_offset);
-      } else {
-        MergeIntoFrameState(block, next_block_offset);
+
+    if (NumPredecessors(next_block_offset) == 1) {
+      if (v8_flags.trace_maglev_graph_building) {
+        std::cout << "== New block (single fallthrough) ==" << std::endl;
       }
+      StartNewBlock(next_block_offset);
+    } else {
+      MergeIntoFrameState(predecessor, next_block_offset);
     }
-    return block;
   }
 
   void InlineCallFromRegisters(int argc_count,
@@ -968,32 +923,33 @@ class MaglevGraphBuilder {
   void BuildCheckSymbol(ValueNode* object);
   void BuildMapCheck(ValueNode* object, const compiler::MapRef& map);
 
-  bool TryBuildMonomorphicLoad(ValueNode* receiver,
-                               ValueNode* lookup_start_object,
-                               const compiler::MapRef& map,
-                               MaybeObjectHandle handler);
-  bool TryBuildMonomorphicLoadFromSmiHandler(ValueNode* receiver,
-                                             ValueNode* lookup_start_object,
-                                             const compiler::MapRef& map,
-                                             int32_t handler);
-  bool TryBuildMonomorphicLoadFromLoadHandler(ValueNode* receiver,
-                                              ValueNode* lookup_start_object,
-                                              const compiler::MapRef& map,
-                                              LoadHandler handler);
-
-  bool TryBuildMonomorphicElementLoad(ValueNode* object, ValueNode* index,
-                                      const compiler::MapRef& map,
-                                      MaybeObjectHandle handler);
-  bool TryBuildMonomorphicElementLoadFromSmiHandler(ValueNode* object,
-                                                    ValueNode* index,
-                                                    const compiler::MapRef& map,
-                                                    int32_t handler);
-
-  bool TryBuildMonomorphicStore(ValueNode* object, const compiler::MapRef& map,
-                                MaybeObjectHandle handler);
-  bool TryBuildMonomorphicStoreFromSmiHandler(ValueNode* object,
-                                              const compiler::MapRef& map,
-                                              int32_t handler);
+  bool TryFoldLoadDictPrototypeConstant(
+      compiler::PropertyAccessInfo access_info);
+  bool TryFoldLoadConstantDataField(compiler::PropertyAccessInfo access_info);
+
+  void BuildLoadField(compiler::PropertyAccessInfo access_info,
+                      ValueNode* lookup_start_object);
+  bool TryBuildStoreField(compiler::PropertyAccessInfo access_info,
+                          ValueNode* receiver);
+  bool TryBuildPropertyGetterCall(compiler::PropertyAccessInfo access_info,
+                                  ValueNode* receiver);
+  bool TryBuildPropertySetterCall(compiler::PropertyAccessInfo access_info,
+                                  ValueNode* receiver, ValueNode* value);
+
+  bool TryBuildPropertyLoad(ValueNode* receiver, ValueNode* lookup_start_object,
+                            compiler::PropertyAccessInfo const& access_info);
+  bool TryBuildPropertyStore(ValueNode* receiver,
+                             compiler::PropertyAccessInfo const& access_info);
+  bool TryBuildPropertyAccess(ValueNode* receiver,
+                              ValueNode* lookup_start_object,
+                              compiler::PropertyAccessInfo const& access_info,
+                              compiler::AccessMode access_mode);
+
+  bool TryBuildNamedAccess(ValueNode* receiver, ValueNode* lookup_start_object,
+                           compiler::NamedAccessFeedback const& feedback,
+                           compiler::AccessMode access_mode);
+  bool TryBuildElementAccess(ValueNode* object, ValueNode* index,
+                             compiler::ElementAccessFeedback const& feedback);
 
   template <Operation kOperation>
   void BuildGenericUnaryOperationNode();
@@ -1035,14 +991,14 @@ class MaglevGraphBuilder {
   void MergeDeadIntoFrameState(int target);
   void MergeDeadLoopIntoFrameState(int target);
   void MergeIntoInlinedReturnFrameState(BasicBlock* block);
-  void BuildBranchIfRootConstant(ValueNode* node, int true_target,
-                                 int false_target, RootIndex root_index);
-  void BuildBranchIfTrue(ValueNode* node, int true_target, int false_target);
-  void BuildBranchIfNull(ValueNode* node, int true_target, int false_target);
-  void BuildBranchIfUndefined(ValueNode* node, int true_target,
-                              int false_target);
-  void BuildBranchIfToBooleanTrue(ValueNode* node, int true_target,
-                                  int false_target);
+
+  enum JumpType { kJumpIfTrue, kJumpIfFalse };
+  void BuildBranchIfRootConstant(ValueNode* node, JumpType jump_type,
+                                 RootIndex root_index);
+  void BuildBranchIfTrue(ValueNode* node, JumpType jump_type);
+  void BuildBranchIfNull(ValueNode* node, JumpType jump_type);
+  void BuildBranchIfUndefined(ValueNode* node, JumpType jump_type);
+  void BuildBranchIfToBooleanTrue(ValueNode* node, JumpType jump_type);
 
   void BuildToNumberOrToNumeric(Object::Conversion mode);
 
@@ -1136,7 +1092,6 @@ class MaglevGraphBuilder {
 
   // Current block information.
   BasicBlock* current_block_ = nullptr;
-  int block_offset_ = 0;
   base::Optional<CheckpointedInterpreterState> latest_checkpointed_state_;
 
   BasicBlockRef* jump_targets_;
diff --git a/deps/v8/src/maglev/maglev-graph-printer.cc b/deps/v8/src/maglev/maglev-graph-printer.cc
index 3f4cec406c8326..02e809b73a018e 100644
--- a/deps/v8/src/maglev/maglev-graph-printer.cc
+++ b/deps/v8/src/maglev/maglev-graph-printer.cc
@@ -45,7 +45,7 @@ void PrintPaddedId(std::ostream& os, MaglevGraphLabeller* graph_labeller,
   for (int i = 0; i < padding_width; ++i) {
     os << padding;
   }
-  if (FLAG_log_colour) os << "\033[0m";
+  if (v8_flags.log_colour) os << "\033[0m";
   if (node->has_id()) {
     os << node->id() << "/";
   }
@@ -158,7 +158,7 @@ void PrintVerticalArrows(std::ostream& os,
       desired_color = (i % 6) + 1;
       c.AddVertical();
     }
-    if (FLAG_log_colour && desired_color != current_color &&
+    if (v8_flags.log_colour && desired_color != current_color &&
         desired_color != -1) {
       os << "\033[0;3" << desired_color << "m";
       current_color = desired_color;
@@ -167,7 +167,7 @@ void PrintVerticalArrows(std::ostream& os,
   }
   // If there are no arrows starting here, clear the color. Otherwise,
   // PrintPaddedId will clear it.
-  if (FLAG_log_colour && arrows_starting_here.empty() &&
+  if (v8_flags.log_colour && arrows_starting_here.empty() &&
       targets_starting_here.empty()) {
     os << "\033[0m";
   }
@@ -342,7 +342,7 @@ void MaglevPrintingVisitor::PreProcessBasicBlock(BasicBlock* block) {
         desired_color = (i % 6) + 1;
         c.AddVertical();
       }
-      if (FLAG_log_colour && current_color != desired_color &&
+      if (v8_flags.log_colour && current_color != desired_color &&
           desired_color != -1) {
         os_ << "\033[0;3" << desired_color << "m";
         current_color = desired_color;
@@ -350,7 +350,7 @@ void MaglevPrintingVisitor::PreProcessBasicBlock(BasicBlock* block) {
       os_ << c;
     }
     os_ << (saw_start ? "►" : " ");
-    if (FLAG_log_colour) os_ << "\033[0m";
+    if (v8_flags.log_colour) os_ << "\033[0m";
   }
 
   int block_id = graph_labeller_->BlockId(block);
@@ -429,8 +429,8 @@ void PrintLazyDeopt(std::ostream& os, std::vector<BasicBlock*> targets,
         } else {
           os << PrintNodeLabel(graph_labeller, node) << ":"
              << deopt_info->input_locations[index].operand();
+          index++;
         }
-        index++;
       });
   os << "}\n";
 }
diff --git a/deps/v8/src/maglev/maglev-graph-verifier.h b/deps/v8/src/maglev/maglev-graph-verifier.h
index af7c716c79fde5..5675d53be56175 100644
--- a/deps/v8/src/maglev/maglev-graph-verifier.h
+++ b/deps/v8/src/maglev/maglev-graph-verifier.h
@@ -86,6 +86,7 @@ class MaglevGraphVerifier {
       case Opcode::kCreateObjectLiteral:
       case Opcode::kCreateShallowObjectLiteral:
       case Opcode::kCreateRegExpLiteral:
+      case Opcode::kDebugBreak:
       case Opcode::kDeopt:
       case Opcode::kFloat64Constant:
       case Opcode::kGapMove:
@@ -122,6 +123,7 @@ class MaglevGraphVerifier {
       case Opcode::kCheckString:
       case Opcode::kCheckSymbol:
       case Opcode::kCheckedInternalizedString:
+      case Opcode::kCheckedObjectToIndex:
       // TODO(victorgomes): Can we check that the input is Boolean?
       case Opcode::kBranchIfToBooleanTrue:
       case Opcode::kBranchIfRootConstant:
@@ -135,6 +137,7 @@ class MaglevGraphVerifier {
       case Opcode::kGetTemplateObject:
       case Opcode::kLogicalNot:
       case Opcode::kSetPendingMessage:
+      case Opcode::kStringLength:
       case Opcode::kToBooleanLogicalNot:
       case Opcode::kTestUndetectable:
       case Opcode::kTestTypeOf:
@@ -147,11 +150,13 @@ class MaglevGraphVerifier {
         break;
       case Opcode::kSwitch:
       case Opcode::kCheckedSmiTag:
+      case Opcode::kUnsafeSmiTag:
       case Opcode::kChangeInt32ToFloat64:
         DCHECK_EQ(node->input_count(), 1);
         CheckValueInputIs(node, 0, ValueRepresentation::kInt32);
         break;
       case Opcode::kFloat64Box:
+      case Opcode::kCheckedTruncateFloat64ToInt32:
         DCHECK_EQ(node->input_count(), 1);
         CheckValueInputIs(node, 0, ValueRepresentation::kFloat64);
         break;
@@ -176,10 +181,6 @@ class MaglevGraphVerifier {
       case Opcode::kGenericLessThan:
       case Opcode::kGenericLessThanOrEqual:
       case Opcode::kGenericStrictEqual:
-      case Opcode::kCheckJSArrayBounds:
-      case Opcode::kCheckJSObjectElementsBounds:
-      case Opcode::kLoadTaggedElement:
-      case Opcode::kLoadDoubleElement:
       case Opcode::kGetIterator:
       case Opcode::kTaggedEqual:
       case Opcode::kTaggedNotEqual:
@@ -275,6 +276,14 @@ class MaglevGraphVerifier {
           CheckValueInputIs(node, i, ValueRepresentation::kTagged);
         }
         break;
+      case Opcode::kCheckJSArrayBounds:
+      case Opcode::kCheckJSObjectElementsBounds:
+      case Opcode::kLoadTaggedElement:
+      case Opcode::kLoadDoubleElement:
+        DCHECK_EQ(node->input_count(), 2);
+        CheckValueInputIs(node, 0, ValueRepresentation::kTagged);
+        CheckValueInputIs(node, 1, ValueRepresentation::kInt32);
+        break;
       case Opcode::kCallBuiltin: {
         CallBuiltin* call_builtin = node->Cast<CallBuiltin>();
         auto descriptor =
diff --git a/deps/v8/src/maglev/maglev-interpreter-frame-state.h b/deps/v8/src/maglev/maglev-interpreter-frame-state.h
index 8ddda35edd9b1b..2db6a4ee3e6c83 100644
--- a/deps/v8/src/maglev/maglev-interpreter-frame-state.h
+++ b/deps/v8/src/maglev/maglev-interpreter-frame-state.h
@@ -55,6 +55,11 @@ void DestructivelyIntersect(ZoneMap<ValueNode*, Value>& lhs_map,
       ++rhs_it;
     }
   }
+  // If we haven't reached the end of LHS by now, then we have reached the end
+  // of RHS, and the remaining items are therefore not in RHS. Remove them.
+  if (lhs_it != lhs_map.end()) {
+    lhs_map.erase(lhs_it, lhs_map.end());
+  }
 }
 
 // The intersection (using `&`) of any two NodeTypes must be a valid NodeType
@@ -72,34 +77,52 @@ enum class NodeType {
   kHeapObjectWithKnownMap = (1 << 5) | kAnyHeapObject,
 };
 
+inline bool NodeTypeIsSmi(NodeType type) { return type == NodeType::kSmi; }
+inline bool NodeTypeIsAnyHeapObject(NodeType type) {
+  return static_cast<int>(type) & static_cast<int>(NodeType::kAnyHeapObject);
+}
+inline bool NodeTypeIsString(NodeType type) {
+  return type == NodeType::kString;
+}
+inline bool NodeTypeIsSymbol(NodeType type) {
+  return type == NodeType::kSymbol;
+}
+
 struct NodeInfo {
-  NodeType type;
-  // TODO(leszeks): Consider adding more info for nodes here, e.g. alternative
-  // representations or previously loaded fields.
+  NodeType type = NodeType::kUnknown;
 
-  static bool IsSmi(const NodeInfo* info) {
-    if (!info) return false;
-    return info->type == NodeType::kSmi;
-  }
-  static bool IsAnyHeapObject(const NodeInfo* info) {
-    if (!info) return false;
-    return static_cast<int>(info->type) &
-           static_cast<int>(NodeType::kAnyHeapObject);
-  }
-  static bool IsString(const NodeInfo* info) {
-    if (!info) return false;
-    return info->type == NodeType::kString;
-  }
-  static bool IsSymbol(const NodeInfo* info) {
-    if (!info) return false;
-    return info->type == NodeType::kSymbol;
+  // Optional alternative nodes with the equivalent value but a different
+  // representation.
+  // TODO(leszeks): At least one of these is redundant for every node, consider
+  // a more compressed form or even linked list.
+  ValueNode* tagged_alternative = nullptr;
+  ValueNode* int32_alternative = nullptr;
+  ValueNode* float64_alternative = nullptr;
+
+  bool is_empty() {
+    return type == NodeType::kUnknown && tagged_alternative == nullptr &&
+           int32_alternative == nullptr && float64_alternative == nullptr;
   }
 
+  bool is_smi() const { return NodeTypeIsSmi(type); }
+  bool is_any_heap_object() const { return NodeTypeIsAnyHeapObject(type); }
+  bool is_string() const { return NodeTypeIsString(type); }
+  bool is_symbol() const { return NodeTypeIsSymbol(type); }
+
   // Mutate this node info by merging in another node info, with the result
   // being a node info that is the subset of information valid in both inputs.
   void MergeWith(const NodeInfo& other) {
     type = static_cast<NodeType>(static_cast<int>(type) &
                                  static_cast<int>(other.type));
+    tagged_alternative = tagged_alternative == other.tagged_alternative
+                             ? tagged_alternative
+                             : nullptr;
+    int32_alternative = int32_alternative == other.int32_alternative
+                            ? int32_alternative
+                            : nullptr;
+    float64_alternative = float64_alternative == other.float64_alternative
+                              ? float64_alternative
+                              : nullptr;
   }
 };
 
@@ -131,28 +154,13 @@ struct KnownNodeAspects {
     return clone;
   }
 
-  NodeInfo* GetInfoFor(ValueNode* node) {
-    auto it = node_infos.find(node);
-    if (it == node_infos.end()) return nullptr;
-    return &it->second;
-  }
-
-  void InsertOrUpdateNodeType(ValueNode* node, NodeInfo* existing_info,
-                              NodeType new_type) {
-    if (existing_info == nullptr) {
-      DCHECK_EQ(node_infos.find(node), node_infos.end());
-      node_infos.emplace(node, NodeInfo{new_type});
-    } else {
-      DCHECK_EQ(&node_infos.find(node)->second, existing_info);
-      existing_info->type = new_type;
-    }
-  }
+  NodeInfo* GetOrCreateInfoFor(ValueNode* node) { return &node_infos[node]; }
 
   void Merge(const KnownNodeAspects& other) {
     DestructivelyIntersect(node_infos, other.node_infos,
                            [](NodeInfo& lhs, const NodeInfo& rhs) {
                              lhs.MergeWith(rhs);
-                             return lhs.type != NodeType::kUnknown;
+                             return !lhs.is_empty();
                            });
     DestructivelyIntersect(stable_maps, other.stable_maps,
                            [](compiler::MapRef lhs, compiler::MapRef rhs) {
@@ -186,6 +194,8 @@ class InterpreterFrameState {
                        const MergePointInterpreterFrameState& state);
 
   void set_accumulator(ValueNode* value) {
+    // Conversions should be stored in known_node_aspects/NodeInfo.
+    DCHECK(!value->properties().is_conversion());
     frame_[interpreter::Register::virtual_accumulator()] = value;
   }
   ValueNode* accumulator() const {
@@ -198,6 +208,8 @@ class InterpreterFrameState {
                        reg == interpreter::Register::function_closure() ||
                        reg == interpreter::Register::virtual_accumulator() ||
                        reg.ToParameterIndex() >= 0);
+    // Conversions should be stored in known_node_aspects/NodeInfo.
+    DCHECK(!value->properties().is_conversion());
     frame_[reg] = value;
   }
   ValueNode* get(interpreter::Register reg) const {
@@ -444,11 +456,12 @@ class MergePointInterpreterFrameState {
         });
     merge_state->predecessors_[0] = predecessor;
     merge_state->known_node_aspects_ =
-        info.zone()->New<KnownNodeAspects>(info.zone());
+        state.known_node_aspects().Clone(info.zone());
     return merge_state;
   }
 
   static MergePointInterpreterFrameState* NewForLoop(
+      const InterpreterFrameState& start_state,
       const MaglevCompilationUnit& info, int merge_offset,
       int predecessor_count, const compiler::BytecodeLivenessState* liveness,
       const compiler::LoopInfo* loop_info) {
@@ -457,6 +470,11 @@ class MergePointInterpreterFrameState {
             info, predecessor_count, 0,
             info.zone()->NewArray<BasicBlock*>(predecessor_count),
             BasicBlockType::kLoopHeader, liveness);
+    if (loop_info->resumable()) {
+      state->known_node_aspects_ =
+          info.zone()->New<KnownNodeAspects>(info.zone());
+      state->is_resumable_loop_ = true;
+    }
     auto& assignments = loop_info->assignments();
     auto& frame_state = state->frame_state_;
     frame_state.ForEachParameter(
@@ -464,6 +482,10 @@ class MergePointInterpreterFrameState {
           entry = nullptr;
           if (assignments.ContainsParameter(reg.ToParameterIndex())) {
             entry = state->NewLoopPhi(info.zone(), reg, merge_offset);
+          } else if (state->is_resumable_loop()) {
+            // Copy initial values out of the start state.
+            entry = start_state.get(reg);
+            DCHECK(entry->Is<InitialValue>());
           }
         });
     // TODO(v8:7700): Add contexts into assignment analysis.
@@ -488,45 +510,46 @@ class MergePointInterpreterFrameState {
   // Merges an unmerged framestate with a possibly merged framestate into |this|
   // framestate.
   void Merge(MaglevCompilationUnit& compilation_unit,
-             const InterpreterFrameState& unmerged, BasicBlock* predecessor,
+             InterpreterFrameState& unmerged, BasicBlock* predecessor,
              int merge_offset) {
     DCHECK_GT(predecessor_count_, 1);
     DCHECK_LT(predecessors_so_far_, predecessor_count_);
     predecessors_[predecessors_so_far_] = predecessor;
 
-    if (known_node_aspects_ == nullptr) {
-      DCHECK(is_unmerged_loop());
-      DCHECK_EQ(predecessors_so_far_, 0);
-      known_node_aspects_ =
-          unmerged.known_node_aspects().CloneWithoutUnstableMaps(
-              compilation_unit.zone());
-    } else {
-      known_node_aspects_->Merge(unmerged.known_node_aspects());
-    }
-
-    if (FLAG_trace_maglev_graph_building) {
+    if (v8_flags.trace_maglev_graph_building) {
       std::cout << "Merging..." << std::endl;
     }
     frame_state_.ForEachValue(compilation_unit, [&](ValueNode*& value,
                                                     interpreter::Register reg) {
       CheckIsLoopPhiIfNeeded(compilation_unit, merge_offset, reg, value);
 
-      if (FLAG_trace_maglev_graph_building) {
+      if (v8_flags.trace_maglev_graph_building) {
         std::cout << "  " << reg.ToString() << ": "
                   << PrintNodeLabel(compilation_unit.graph_labeller(), value)
                   << " <- "
                   << PrintNodeLabel(compilation_unit.graph_labeller(),
                                     unmerged.get(reg));
       }
-      value = MergeValue(compilation_unit, reg, value, unmerged.get(reg),
-                         merge_offset);
-      if (FLAG_trace_maglev_graph_building) {
+      value = MergeValue(compilation_unit, reg, unmerged.known_node_aspects(),
+                         value, unmerged.get(reg), merge_offset);
+      if (v8_flags.trace_maglev_graph_building) {
         std::cout << " => "
                   << PrintNodeLabel(compilation_unit.graph_labeller(), value)
                   << ": " << PrintNode(compilation_unit.graph_labeller(), value)
                   << std::endl;
       }
     });
+
+    if (known_node_aspects_ == nullptr) {
+      DCHECK(is_unmerged_loop());
+      DCHECK_EQ(predecessors_so_far_, 0);
+      known_node_aspects_ =
+          unmerged.known_node_aspects().CloneWithoutUnstableMaps(
+              compilation_unit.zone());
+    } else {
+      known_node_aspects_->Merge(unmerged.known_node_aspects());
+    }
+
     predecessors_so_far_++;
     DCHECK_LE(predecessors_so_far_, predecessor_count_);
   }
@@ -534,30 +557,30 @@ class MergePointInterpreterFrameState {
   // Merges an unmerged framestate with a possibly merged framestate into |this|
   // framestate.
   void MergeLoop(MaglevCompilationUnit& compilation_unit,
-                 const InterpreterFrameState& loop_end_state,
+                 InterpreterFrameState& loop_end_state,
                  BasicBlock* loop_end_block, int merge_offset) {
     // This should be the last predecessor we try to merge.
     DCHECK_EQ(predecessors_so_far_, predecessor_count_ - 1);
     DCHECK(is_unmerged_loop());
     predecessors_[predecessor_count_ - 1] = loop_end_block;
 
-    if (FLAG_trace_maglev_graph_building) {
+    if (v8_flags.trace_maglev_graph_building) {
       std::cout << "Merging loop backedge..." << std::endl;
     }
     frame_state_.ForEachValue(compilation_unit, [&](ValueNode* value,
                                                     interpreter::Register reg) {
       CheckIsLoopPhiIfNeeded(compilation_unit, merge_offset, reg, value);
 
-      if (FLAG_trace_maglev_graph_building) {
+      if (v8_flags.trace_maglev_graph_building) {
         std::cout << "  " << reg.ToString() << ": "
                   << PrintNodeLabel(compilation_unit.graph_labeller(), value)
                   << " <- "
                   << PrintNodeLabel(compilation_unit.graph_labeller(),
                                     loop_end_state.get(reg));
       }
-      MergeLoopValue(compilation_unit, reg, value, loop_end_state.get(reg),
-                     merge_offset);
-      if (FLAG_trace_maglev_graph_building) {
+      MergeLoopValue(compilation_unit, reg, loop_end_state.known_node_aspects(),
+                     value, loop_end_state.get(reg), merge_offset);
+      if (v8_flags.trace_maglev_graph_building) {
         std::cout << " => "
                   << PrintNodeLabel(compilation_unit.graph_labeller(), value)
                   << ": " << PrintNode(compilation_unit.graph_labeller(), value)
@@ -572,7 +595,7 @@ class MergePointInterpreterFrameState {
   // deopt).
   void MergeDead(const MaglevCompilationUnit& compilation_unit,
                  int merge_offset) {
-    DCHECK_GT(predecessor_count_, 1);
+    DCHECK_GE(predecessor_count_, 1);
     DCHECK_LT(predecessors_so_far_, predecessor_count_);
     predecessor_count_--;
     DCHECK_LE(predecessors_so_far_, predecessor_count_);
@@ -636,9 +659,12 @@ class MergePointInterpreterFrameState {
   bool is_unreachable_loop() const {
     // If there is only one predecessor, and it's not set, then this is a loop
     // merge with no forward control flow entering it.
-    return is_loop() && predecessor_count_ == 1 && predecessors_so_far_ == 0;
+    return is_loop() && !is_resumable_loop() && predecessor_count_ == 1 &&
+           predecessors_so_far_ == 0;
   }
 
+  bool is_resumable_loop() const { return is_resumable_loop_; }
+
  private:
   friend void InterpreterFrameState::CopyFrom(
       const MaglevCompilationUnit& info,
@@ -658,44 +684,43 @@ class MergePointInterpreterFrameState {
         frame_state_(info, liveness) {}
 
   ValueNode* FromInt32ToTagged(MaglevCompilationUnit& compilation_unit,
+                               KnownNodeAspects& known_node_aspects,
                                ValueNode* value) {
     DCHECK_EQ(value->properties().value_representation(),
               ValueRepresentation::kInt32);
-    if (value->Is<CheckedSmiUntag>()) {
-      return value->input(0).node();
-    }
+    DCHECK(!value->properties().is_conversion());
 #define IS_INT32_OP_NODE(Name) || value->Is<Name>()
-    DCHECK(value->Is<Int32Constant>()
+    DCHECK(value->Is<Int32Constant>() ||
+           value->Is<StringLength>()
                INT32_OPERATIONS_NODE_LIST(IS_INT32_OP_NODE));
 #undef IS_INT32_OP_NODE
-    // Check if the next Node in the block after value is its CheckedSmiTag
-    // version and reuse it.
-    if (value->NextNode()) {
-      CheckedSmiTag* tagged = value->NextNode()->TryCast<CheckedSmiTag>();
-      if (tagged != nullptr && value == tagged->input().node()) {
-        return tagged;
-      }
-    }
-    // Otherwise create a tagged version.
-    ValueNode* tagged =
-        Node::New<CheckedSmiTag, std::initializer_list<ValueNode*>>(
+    NodeInfo* node_info = known_node_aspects.GetOrCreateInfoFor(value);
+    if (!node_info->tagged_alternative) {
+      // Create a tagged version.
+      ValueNode* tagged;
+      if (value->Is<StringLength>()) {
+        static_assert(String::kMaxLength <= kSmiMaxValue,
+                      "String length must fit into a Smi");
+        tagged = Node::New<UnsafeSmiTag>(compilation_unit.zone(), {value});
+      } else {
+        tagged = Node::New<CheckedSmiTag, std::initializer_list<ValueNode*>>(
             compilation_unit.zone(), compilation_unit,
             value->eager_deopt_info()->state, {value});
-    Node::List::AddAfter(value, tagged);
-    compilation_unit.RegisterNodeInGraphLabeller(tagged);
-    return tagged;
+      }
+
+      Node::List::AddAfter(value, tagged);
+      compilation_unit.RegisterNodeInGraphLabeller(tagged);
+      node_info->tagged_alternative = tagged;
+    }
+    return node_info->tagged_alternative;
   }
 
   ValueNode* FromFloat64ToTagged(MaglevCompilationUnit& compilation_unit,
+                                 KnownNodeAspects& known_node_aspects,
                                  ValueNode* value) {
     DCHECK_EQ(value->properties().value_representation(),
               ValueRepresentation::kFloat64);
-    if (value->Is<CheckedFloat64Unbox>()) {
-      return value->input(0).node();
-    }
-    if (value->Is<ChangeInt32ToFloat64>()) {
-      return FromInt32ToTagged(compilation_unit, value->input(0).node());
-    }
+    DCHECK(!value->properties().is_conversion());
     // Check if the next Node in the block after value is its Float64Box
     // version and reuse it.
     if (value->NextNode()) {
@@ -714,19 +739,21 @@ class MergePointInterpreterFrameState {
   // TODO(victorgomes): Consider refactor this function to share code with
   // MaglevGraphBuilder::GetTagged.
   ValueNode* EnsureTagged(MaglevCompilationUnit& compilation_unit,
+                          KnownNodeAspects& known_node_aspects,
                           ValueNode* value) {
     switch (value->properties().value_representation()) {
       case ValueRepresentation::kTagged:
         return value;
       case ValueRepresentation::kInt32:
-        return FromInt32ToTagged(compilation_unit, value);
+        return FromInt32ToTagged(compilation_unit, known_node_aspects, value);
       case ValueRepresentation::kFloat64:
-        return FromFloat64ToTagged(compilation_unit, value);
+        return FromFloat64ToTagged(compilation_unit, known_node_aspects, value);
     }
   }
 
   ValueNode* MergeValue(MaglevCompilationUnit& compilation_unit,
-                        interpreter::Register owner, ValueNode* merged,
+                        interpreter::Register owner,
+                        KnownNodeAspects& unmerged_aspects, ValueNode* merged,
                         ValueNode* unmerged, int merge_offset) {
     // If the merged node is null, this is a pre-created loop header merge
     // frame will null values for anything that isn't a loop Phi.
@@ -741,7 +768,7 @@ class MergePointInterpreterFrameState {
       // It's possible that merged == unmerged at this point since loop-phis are
       // not dropped if they are only assigned to themselves in the loop.
       DCHECK_EQ(result->owner(), owner);
-      unmerged = EnsureTagged(compilation_unit, unmerged);
+      unmerged = EnsureTagged(compilation_unit, unmerged_aspects, unmerged);
       result->set_input(predecessors_so_far_, unmerged);
       return result;
     }
@@ -750,8 +777,8 @@ class MergePointInterpreterFrameState {
 
     // We guarantee that the values are tagged.
     // TODO(victorgomes): Support Phi nodes of untagged values.
-    merged = EnsureTagged(compilation_unit, merged);
-    unmerged = EnsureTagged(compilation_unit, unmerged);
+    merged = EnsureTagged(compilation_unit, *known_node_aspects_, merged);
+    unmerged = EnsureTagged(compilation_unit, unmerged_aspects, unmerged);
 
     // Tagged versions could point to the same value, avoid Phi nodes in this
     // case.
@@ -770,7 +797,7 @@ class MergePointInterpreterFrameState {
 
     for (int i = 0; i < predecessors_so_far_; i++) result->set_input(i, merged);
     result->set_input(predecessors_so_far_, unmerged);
-    if (FLAG_trace_maglev_graph_building) {
+    if (v8_flags.trace_maglev_graph_building) {
       for (int i = predecessors_so_far_ + 1; i < predecessor_count_; i++) {
         result->set_input(i, nullptr);
       }
@@ -800,7 +827,8 @@ class MergePointInterpreterFrameState {
   }
 
   void MergeLoopValue(MaglevCompilationUnit& compilation_unit,
-                      interpreter::Register owner, ValueNode* merged,
+                      interpreter::Register owner,
+                      KnownNodeAspects& unmerged_aspects, ValueNode* merged,
                       ValueNode* unmerged, int merge_offset) {
     Phi* result = merged->TryCast<Phi>();
     if (result == nullptr || result->merge_offset() != merge_offset) {
@@ -814,7 +842,7 @@ class MergePointInterpreterFrameState {
       return;
     }
     DCHECK_EQ(result->owner(), owner);
-    unmerged = EnsureTagged(compilation_unit, unmerged);
+    unmerged = EnsureTagged(compilation_unit, unmerged_aspects, unmerged);
     result->set_input(predecessor_count_ - 1, unmerged);
   }
 
@@ -823,7 +851,7 @@ class MergePointInterpreterFrameState {
     DCHECK_EQ(predecessors_so_far_, 0);
     // Create a new loop phi, which for now is empty.
     Phi* result = Node::New<Phi>(zone, predecessor_count_, reg, merge_offset);
-    if (FLAG_trace_maglev_graph_building) {
+    if (v8_flags.trace_maglev_graph_building) {
       for (int i = 0; i < predecessor_count_; i++) {
         result->set_input(i, nullptr);
       }
@@ -844,6 +872,7 @@ class MergePointInterpreterFrameState {
 
   int predecessor_count_;
   int predecessors_so_far_;
+  bool is_resumable_loop_ = false;
   BasicBlock** predecessors_;
 
   BasicBlockType basic_block_type_;
diff --git a/deps/v8/src/maglev/maglev-ir-inl.h b/deps/v8/src/maglev/maglev-ir-inl.h
index 836f46f60548a7..e9fe230ee5440c 100644
--- a/deps/v8/src/maglev/maglev-ir-inl.h
+++ b/deps/v8/src/maglev/maglev-ir-inl.h
@@ -30,10 +30,28 @@ void DeepForEachInputImpl(const MaglevCompilationUnit& unit,
 }
 
 template <typename Function>
-void DeepForEachInput(const EagerDeoptInfo* node, Function&& f) {
+void DeepForEachInput(const EagerDeoptInfo* deopt_info, Function&& f) {
   int index = 0;
-  DeepForEachInputImpl(node->unit, &node->state, node->input_locations, index,
-                       f);
+  DeepForEachInputImpl(deopt_info->unit, &deopt_info->state,
+                       deopt_info->input_locations, index, f);
+}
+
+template <typename Function>
+void DeepForEachInput(const LazyDeoptInfo* deopt_info, Function&& f) {
+  int index = 0;
+  if (deopt_info->state.parent) {
+    DeepForEachInputImpl(*deopt_info->unit.caller(), deopt_info->state.parent,
+                         deopt_info->input_locations, index, f);
+  }
+  // Handle the top-of-frame info separately, since we have to skip the result
+  // location.
+  deopt_info->state.register_frame->ForEachValue(
+      deopt_info->unit, [&](ValueNode* node, interpreter::Register reg) {
+        // Skip over the result location since it is irrelevant for lazy deopts
+        // (unoptimized code will recreate the result).
+        if (deopt_info->IsResultRegister(reg)) return;
+        f(node, reg, &deopt_info->input_locations[index++]);
+      });
 }
 
 }  // namespace detail
diff --git a/deps/v8/src/maglev/maglev-ir.cc b/deps/v8/src/maglev/maglev-ir.cc
index 3c32641ac4f820..6a530708190ecf 100644
--- a/deps/v8/src/maglev/maglev-ir.cc
+++ b/deps/v8/src/maglev/maglev-ir.cc
@@ -140,6 +140,24 @@ class SaveRegisterStateForCall {
   RegisterSnapshot snapshot_;
 };
 
+#ifdef DEBUG
+RegList GetGeneralRegistersUsedAsInputs(const EagerDeoptInfo* deopt_info) {
+  RegList regs;
+  detail::DeepForEachInput(deopt_info,
+                           [&regs](ValueNode* value, interpreter::Register reg,
+                                   InputLocation* input) {
+                             if (input->IsGeneralRegister()) {
+                               regs.set(input->AssignedGeneralRegister());
+                             }
+                           });
+  return regs;
+}
+#endif  // DEBUG
+
+// Helper macro for checking that a reglist is empty which prints the contents
+// when non-empty.
+#define DCHECK_REGLIST_EMPTY(...) DCHECK_EQ((__VA_ARGS__), RegList{})
+
 // ---
 // Inlined computations.
 // ---
@@ -151,7 +169,8 @@ void AllocateRaw(MaglevAssembler* masm, RegisterSnapshot& register_snapshot,
   // TODO(victorgomes): Call the runtime for large object allocation.
   // TODO(victorgomes): Support double alignment.
   DCHECK_EQ(alignment, kTaggedAligned);
-  if (FLAG_single_generation) {
+  size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes);
+  if (v8_flags.single_generation) {
     alloc_type = AllocationType::kOld;
   }
   bool in_new_space = alloc_type == AllocationType::kYoung;
@@ -165,7 +184,7 @@ void AllocateRaw(MaglevAssembler* masm, RegisterSnapshot& register_snapshot,
           ? ExternalReference::new_space_allocation_limit_address(isolate)
           : ExternalReference::old_space_allocation_limit_address(isolate);
 
-  ZoneLabelRef done(masm->compilation_info()->zone());
+  ZoneLabelRef done(masm);
   Register new_top = kScratchRegister;
   // Check if there is enough space.
   __ Move(object, __ ExternalReferenceAsOperand(top));
@@ -174,12 +193,13 @@ void AllocateRaw(MaglevAssembler* masm, RegisterSnapshot& register_snapshot,
   // Otherwise call runtime.
   __ JumpToDeferredIf(
       greater_equal,
-      [](MaglevAssembler* masm, Label* return_label,
-         RegisterSnapshot register_snapshot, Register object, Builtin builtin,
-         int size_in_bytes, ZoneLabelRef done) {
+      [](MaglevAssembler* masm, RegisterSnapshot register_snapshot,
+         Register object, Builtin builtin, int size_in_bytes,
+         ZoneLabelRef done) {
         // Remove {object} from snapshot, since it is the returned allocated
         // HeapObject.
         register_snapshot.live_registers.clear(object);
+        register_snapshot.live_tagged_registers.clear(object);
         {
           SaveRegisterStateForCall save_register_state(masm, register_snapshot);
           using D = AllocateDescriptor;
@@ -208,8 +228,8 @@ void ToBoolean(MaglevAssembler* masm, Register value, ZoneLabelRef is_true,
   __ CheckSmi(value);
   __ JumpToDeferredIf(
       zero,
-      [](MaglevAssembler* masm, Label* return_label, Register value,
-         ZoneLabelRef is_true, ZoneLabelRef is_false) {
+      [](MaglevAssembler* masm, Register value, ZoneLabelRef is_true,
+         ZoneLabelRef is_false) {
         // Check if {value} is not zero.
         __ SmiCompare(value, Smi::FromInt(0));
         __ j(equal, *is_false);
@@ -235,8 +255,8 @@ void ToBoolean(MaglevAssembler* masm, Register value, ZoneLabelRef is_true,
   __ CompareRoot(map, RootIndex::kHeapNumberMap);
   __ JumpToDeferredIf(
       equal,
-      [](MaglevAssembler* masm, Label* return_label, Register value,
-         ZoneLabelRef is_true, ZoneLabelRef is_false) {
+      [](MaglevAssembler* masm, Register value, ZoneLabelRef is_true,
+         ZoneLabelRef is_false) {
         // Sets scratch register to 0.0.
         __ Xorpd(kScratchDoubleReg, kScratchDoubleReg);
         // Sets ZF if equal to 0.0, -0.0 or NaN.
@@ -251,8 +271,8 @@ void ToBoolean(MaglevAssembler* masm, Register value, ZoneLabelRef is_true,
   __ CompareRoot(map, RootIndex::kBigIntMap);
   __ JumpToDeferredIf(
       equal,
-      [](MaglevAssembler* masm, Label* return_label, Register value,
-         ZoneLabelRef is_true, ZoneLabelRef is_false) {
+      [](MaglevAssembler* masm, Register value, ZoneLabelRef is_true,
+         ZoneLabelRef is_false) {
         __ testl(FieldOperand(value, BigInt::kBitfieldOffset),
                  Immediate(BigInt::LengthBits::kMask));
         __ j(zero, *is_false);
@@ -576,8 +596,9 @@ void GeneratorStore::GenerateCode(MaglevAssembler* masm,
         __ FromAnyToRegister(parameters_and_registers(i),
                              WriteBarrierDescriptor::SlotAddressRegister());
 
+    ZoneLabelRef done(masm);
     DeferredCodeInfo* deferred_write_barrier = __ PushDeferredCode(
-        [](MaglevAssembler* masm, Label* return_label, Register value,
+        [](MaglevAssembler* masm, ZoneLabelRef done, Register value,
            Register array, GeneratorStore* node, int32_t offset) {
           ASM_CODE_COMMENT_STRING(masm, "Write barrier slow path");
           // Use WriteBarrierDescriptor::SlotAddressRegister() as the scratch
@@ -585,7 +606,7 @@ void GeneratorStore::GenerateCode(MaglevAssembler* masm,
           __ CheckPageFlag(
               value, WriteBarrierDescriptor::SlotAddressRegister(),
               MemoryChunk::kPointersToHereAreInterestingOrInSharedHeapMask,
-              zero, return_label);
+              zero, *done);
 
           Register slot_reg = WriteBarrierDescriptor::SlotAddressRegister();
 
@@ -600,13 +621,13 @@ void GeneratorStore::GenerateCode(MaglevAssembler* masm,
 
           __ CallRecordWriteStub(array, slot_reg, save_fp_mode);
 
-          __ jmp(return_label);
+          __ jmp(*done);
         },
-        value, array, this, FixedArray::OffsetOfElementAt(i));
+        done, value, array, this, FixedArray::OffsetOfElementAt(i));
 
     __ StoreTaggedField(FieldOperand(array, FixedArray::OffsetOfElementAt(i)),
                         value);
-    __ JumpIfSmi(value, &deferred_write_barrier->return_label, Label::kNear);
+    __ JumpIfSmi(value, *done, Label::kNear);
     // TODO(leszeks): This will stay either false or true throughout this loop.
     // Consider hoisting the check out of the loop and duplicating the loop into
     // with and without write barrier.
@@ -614,7 +635,7 @@ void GeneratorStore::GenerateCode(MaglevAssembler* masm,
                      MemoryChunk::kPointersFromHereAreInterestingMask, not_zero,
                      &deferred_write_barrier->deferred_code_label);
 
-    __ bind(&deferred_write_barrier->return_label);
+    __ bind(*done);
   }
 
   // Use WriteBarrierDescriptor::SlotAddressRegister() as the scratch
@@ -622,19 +643,20 @@ void GeneratorStore::GenerateCode(MaglevAssembler* masm,
   Register context = __ FromAnyToRegister(
       context_input(), WriteBarrierDescriptor::SlotAddressRegister());
 
+  ZoneLabelRef done(masm);
   DeferredCodeInfo* deferred_context_write_barrier = __ PushDeferredCode(
-      [](MaglevAssembler* masm, Label* return_label, Register context,
+      [](MaglevAssembler* masm, ZoneLabelRef done, Register context,
          Register generator, GeneratorStore* node) {
         ASM_CODE_COMMENT_STRING(masm, "Write barrier slow path");
         // Use WriteBarrierDescriptor::SlotAddressRegister() as the scratch
         // register, see comment above.
-        // TODO(leszeks): The context is almost always going to be in old-space,
-        // consider moving this check to the fast path, maybe even as the first
-        // bailout.
+        // TODO(leszeks): The context is almost always going to be in
+        // old-space, consider moving this check to the fast path, maybe even
+        // as the first bailout.
         __ CheckPageFlag(
             context, WriteBarrierDescriptor::SlotAddressRegister(),
             MemoryChunk::kPointersToHereAreInterestingOrInSharedHeapMask, zero,
-            return_label);
+            *done);
 
         __ Move(WriteBarrierDescriptor::ObjectRegister(), generator);
         generator = WriteBarrierDescriptor::ObjectRegister();
@@ -652,16 +674,16 @@ void GeneratorStore::GenerateCode(MaglevAssembler* masm,
 
         __ CallRecordWriteStub(generator, slot_reg, save_fp_mode);
 
-        __ jmp(return_label);
+        __ jmp(*done);
       },
-      context, generator, this);
+      done, context, generator, this);
   __ StoreTaggedField(
       FieldOperand(generator, JSGeneratorObject::kContextOffset), context);
   __ AssertNotSmi(context);
   __ CheckPageFlag(generator, kScratchRegister,
                    MemoryChunk::kPointersFromHereAreInterestingMask, not_zero,
                    &deferred_context_write_barrier->deferred_code_label);
-  __ bind(&deferred_context_write_barrier->return_label);
+  __ bind(*done);
 
   __ StoreTaggedSignedField(
       FieldOperand(generator, JSGeneratorObject::kContinuationOffset),
@@ -681,7 +703,7 @@ void GeneratorRestoreRegister::GenerateCode(MaglevAssembler* masm,
                                             const ProcessingState& state) {
   Register array = ToRegister(array_input());
   Register result_reg = ToRegister(result());
-  Register temp = temporaries().PopFirst();
+  Register temp = general_temporaries().PopFirst();
 
   // The input and the output can alias, if that happen we use a temporary
   // register and a move at the end.
@@ -931,6 +953,7 @@ void CreateArrayLiteral::GenerateCode(MaglevAssembler* masm,
   __ Push(constant_elements().object());
   __ Push(Smi::FromInt(flags()));
   __ CallRuntime(Runtime::kCreateArrayLiteral);
+  masm->DefineExceptionHandlerAndLazyDeoptPoint(this);
 }
 
 void CreateShallowArrayLiteral::AllocateVreg(
@@ -962,6 +985,7 @@ void CreateObjectLiteral::GenerateCode(MaglevAssembler* masm,
   __ Push(boilerplate_descriptor().object());
   __ Push(Smi::FromInt(flags()));
   __ CallRuntime(Runtime::kCreateObjectLiteral);
+  masm->DefineExceptionHandlerAndLazyDeoptPoint(this);
 }
 
 void CreateEmptyObjectLiteral::AllocateVreg(
@@ -1317,9 +1341,10 @@ void CheckMapsWithMigration::GenerateCode(MaglevAssembler* masm,
   }
   __ Cmp(FieldOperand(object, HeapObject::kMapOffset), map().object());
 
+  ZoneLabelRef migration_done(masm);
   __ JumpToDeferredIf(
       not_equal,
-      [](MaglevAssembler* masm, Label* return_label, Register object,
+      [](MaglevAssembler* masm, ZoneLabelRef migration_done, Register object,
          CheckMapsWithMigration* node, EagerDeoptInfo* deopt_info) {
         __ RegisterEagerDeopt(deopt_info, DeoptimizeReason::kWrongMap);
 
@@ -1365,10 +1390,11 @@ void CheckMapsWithMigration::GenerateCode(MaglevAssembler* masm,
         // Manually load the map pointer without uncompressing it.
         __ Cmp(FieldOperand(object, HeapObject::kMapOffset),
                node->map().object());
-        __ j(equal, return_label);
+        __ j(equal, *migration_done);
         __ jmp(&deopt_info->deopt_entry_label);
       },
-      object, this, eager_deopt_info());
+      migration_done, object, this, eager_deopt_info());
+  __ bind(*migration_done);
 }
 void CheckMapsWithMigration::PrintParams(
     std::ostream& os, MaglevGraphLabeller* graph_labeller) const {
@@ -1384,15 +1410,14 @@ void CheckJSArrayBounds::GenerateCode(MaglevAssembler* masm,
   Register object = ToRegister(receiver_input());
   Register index = ToRegister(index_input());
   __ AssertNotSmi(object);
-  __ AssertSmi(index);
 
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     __ CmpObjectType(object, JS_ARRAY_TYPE, kScratchRegister);
     __ Assert(equal, AbortReason::kUnexpectedValue);
   }
-  TaggedRegister length(kScratchRegister);
-  __ LoadAnyTaggedField(length, FieldOperand(object, JSArray::kLengthOffset));
-  __ cmp_tagged(index, length.reg());
+  __ SmiUntagField(kScratchRegister,
+                   FieldOperand(object, JSArray::kLengthOffset));
+  __ cmpl(index, kScratchRegister);
   __ EmitEagerDeoptIf(above_equal, DeoptimizeReason::kOutOfBounds, this);
 }
 
@@ -1406,24 +1431,28 @@ void CheckJSObjectElementsBounds::GenerateCode(MaglevAssembler* masm,
   Register object = ToRegister(receiver_input());
   Register index = ToRegister(index_input());
   __ AssertNotSmi(object);
-  __ AssertSmi(index);
 
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     __ CmpObjectType(object, FIRST_JS_OBJECT_TYPE, kScratchRegister);
     __ Assert(greater_equal, AbortReason::kUnexpectedValue);
   }
   __ LoadAnyTaggedField(kScratchRegister,
                         FieldOperand(object, JSObject::kElementsOffset));
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     __ AssertNotSmi(kScratchRegister);
   }
-  TaggedRegister length(kScratchRegister);
-  __ LoadAnyTaggedField(
-      length, FieldOperand(kScratchRegister, FixedArray::kLengthOffset));
-  __ cmp_tagged(index, length.reg());
+  __ SmiUntagField(kScratchRegister,
+                   FieldOperand(kScratchRegister, FixedArray::kLengthOffset));
+  __ cmpl(index, kScratchRegister);
   __ EmitEagerDeoptIf(above_equal, DeoptimizeReason::kOutOfBounds, this);
 }
 
+void DebugBreak::AllocateVreg(MaglevVregAllocationState* vreg_state) {}
+void DebugBreak::GenerateCode(MaglevAssembler* masm,
+                              const ProcessingState& state) {
+  __ int3();
+}
+
 void CheckedInternalizedString::AllocateVreg(
     MaglevVregAllocationState* vreg_state) {
   UseRegister(object_input());
@@ -1433,7 +1462,7 @@ void CheckedInternalizedString::AllocateVreg(
 void CheckedInternalizedString::GenerateCode(MaglevAssembler* masm,
                                              const ProcessingState& state) {
   Register object = ToRegister(object_input());
-  RegList temps = temporaries();
+  RegList temps = general_temporaries();
   Register map_tmp = temps.PopFirst();
 
   if (check_type_ == CheckType::kOmitHeapObjectCheck) {
@@ -1449,9 +1478,10 @@ void CheckedInternalizedString::GenerateCode(MaglevAssembler* masm,
   __ testw(FieldOperand(map_tmp, Map::kInstanceTypeOffset),
            Immediate(kIsNotStringMask | kIsNotInternalizedMask));
   static_assert((kStringTag | kInternalizedTag) == 0);
+  ZoneLabelRef done(masm);
   __ JumpToDeferredIf(
       not_zero,
-      [](MaglevAssembler* masm, Label* return_label, Register object,
+      [](MaglevAssembler* masm, ZoneLabelRef done, Register object,
          CheckedInternalizedString* node, EagerDeoptInfo* deopt_info,
          Register map_tmp) {
         __ RecordComment("Deferred Test IsThinString");
@@ -1465,7 +1495,7 @@ void CheckedInternalizedString::GenerateCode(MaglevAssembler* masm,
         __ j(zero, &deopt_info->deopt_entry_label);
         __ LoadTaggedPointerField(
             object, FieldOperand(object, ThinString::kActualOffset));
-        if (FLAG_debug_code) {
+        if (v8_flags.debug_code) {
           __ RecordComment("DCHECK IsInternalizedString");
           __ LoadMap(map_tmp, object);
           __ testw(FieldOperand(map_tmp, Map::kInstanceTypeOffset),
@@ -1473,9 +1503,85 @@ void CheckedInternalizedString::GenerateCode(MaglevAssembler* masm,
           static_assert((kStringTag | kInternalizedTag) == 0);
           __ Check(zero, AbortReason::kUnexpectedValue);
         }
-        __ jmp(return_label);
+        __ jmp(*done);
       },
-      object, this, eager_deopt_info(), map_tmp);
+      done, object, this, eager_deopt_info(), map_tmp);
+  __ bind(*done);
+}
+
+void CheckedObjectToIndex::AllocateVreg(MaglevVregAllocationState* vreg_state) {
+  UseRegister(object_input());
+  DefineAsRegister(vreg_state, this);
+  set_double_temporaries_needed(1);
+}
+void CheckedObjectToIndex::GenerateCode(MaglevAssembler* masm,
+                                        const ProcessingState& state) {
+  Register object = ToRegister(object_input());
+  Register result_reg = ToRegister(result());
+
+  ZoneLabelRef done(masm);
+  Condition is_smi = __ CheckSmi(object);
+  __ JumpToDeferredIf(
+      NegateCondition(is_smi),
+      [](MaglevAssembler* masm, Register object, Register result_reg,
+         ZoneLabelRef done, CheckedObjectToIndex* node) {
+        Label is_string;
+        __ LoadMap(kScratchRegister, object);
+        __ CmpInstanceTypeRange(kScratchRegister, kScratchRegister,
+                                FIRST_STRING_TYPE, LAST_STRING_TYPE);
+        __ j(below_equal, &is_string);
+
+        __ cmpl(kScratchRegister, Immediate(HEAP_NUMBER_TYPE));
+        // The IC will go generic if it encounters something other than a
+        // Number or String key.
+        __ EmitEagerDeoptIf(not_equal, DeoptimizeReason::kNotInt32, node);
+
+        // Heap Number.
+        {
+          DoubleRegister number_value = node->double_temporaries().first();
+          DoubleRegister converted_back = kScratchDoubleReg;
+          // Convert the input float64 value to int32.
+          __ Cvttsd2si(result_reg, number_value);
+          // Convert that int32 value back to float64.
+          __ Cvtlsi2sd(converted_back, result_reg);
+          // Check that the result of the float64->int32->float64 is equal to
+          // the input (i.e. that the conversion didn't truncate.
+          __ Ucomisd(number_value, converted_back);
+          __ j(equal, *done);
+          __ EmitEagerDeopt(node, DeoptimizeReason::kNotInt32);
+        }
+
+        // String.
+        __ bind(&is_string);
+        {
+          RegisterSnapshot snapshot = node->register_snapshot();
+          snapshot.live_registers.clear(result_reg);
+          DCHECK(!snapshot.live_tagged_registers.has(result_reg));
+          {
+            SaveRegisterStateForCall save_register_state(masm, snapshot);
+            AllowExternalCallThatCantCauseGC scope(masm);
+            __ PrepareCallCFunction(1);
+            __ Move(arg_reg_1, object);
+            __ CallCFunction(
+                ExternalReference::string_to_array_index_function(), 1);
+            // No need for safepoint since this is a fast C call.
+            __ Move(result_reg, kReturnRegister0);
+          }
+          __ cmpl(result_reg, Immediate(0));
+          __ j(greater_equal, *done);
+          __ EmitEagerDeopt(node, DeoptimizeReason::kNotInt32);
+        }
+      },
+      object, result_reg, done, this);
+
+  // If we didn't enter the deferred block, we're a Smi.
+  if (result_reg == object) {
+    __ SmiUntag(object);
+  } else {
+    __ SmiUntag(result_reg, object);
+  }
+
+  __ bind(*done);
 }
 
 void LoadTaggedField::AllocateVreg(MaglevVregAllocationState* vreg_state) {
@@ -1500,7 +1606,7 @@ void LoadDoubleField::AllocateVreg(MaglevVregAllocationState* vreg_state) {
 }
 void LoadDoubleField::GenerateCode(MaglevAssembler* masm,
                                    const ProcessingState& state) {
-  Register tmp = temporaries().PopFirst();
+  Register tmp = general_temporaries().PopFirst();
   Register object = ToRegister(object_input());
   __ AssertNotSmi(object);
   __ DecompressAnyTagged(tmp, FieldOperand(object, offset()));
@@ -1524,33 +1630,22 @@ void LoadTaggedElement::GenerateCode(MaglevAssembler* masm,
   Register index = ToRegister(index_input());
   Register result_reg = ToRegister(result());
   __ AssertNotSmi(object);
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     __ CmpObjectType(object, JS_OBJECT_TYPE, kScratchRegister);
     __ Assert(above_equal, AbortReason::kUnexpectedValue);
   }
   __ DecompressAnyTagged(kScratchRegister,
                          FieldOperand(object, JSObject::kElementsOffset));
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     __ CmpObjectType(kScratchRegister, FIXED_ARRAY_TYPE, kScratchRegister);
     __ Assert(equal, AbortReason::kUnexpectedValue);
     // Reload since CmpObjectType clobbered the scratch register.
     __ DecompressAnyTagged(kScratchRegister,
                            FieldOperand(object, JSObject::kElementsOffset));
   }
-  __ AssertSmi(index);
-  // Zero out top bits of index reg (these were previously either zero already,
-  // or the cage base). This technically mutates it, but since it's a Smi, that
-  // doesn't matter.
-  __ movl(index, index);
-  static_assert(kSmiTagSize + kSmiShiftSize < times_tagged_size,
-                "Folding the Smi shift into the FixedArray entry size shift "
-                "only works if the shift is small");
   __ DecompressAnyTagged(
-      result_reg,
-      FieldOperand(kScratchRegister, index,
-                   static_cast<ScaleFactor>(times_tagged_size -
-                                            (kSmiTagSize + kSmiShiftSize)),
-                   FixedArray::kHeaderSize));
+      result_reg, FieldOperand(kScratchRegister, index, times_tagged_size,
+                               FixedArray::kHeaderSize));
 }
 
 void LoadDoubleElement::AllocateVreg(MaglevVregAllocationState* vreg_state) {
@@ -1564,13 +1659,13 @@ void LoadDoubleElement::GenerateCode(MaglevAssembler* masm,
   Register index = ToRegister(index_input());
   DoubleRegister result_reg = ToDoubleRegister(result());
   __ AssertNotSmi(object);
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     __ CmpObjectType(object, JS_OBJECT_TYPE, kScratchRegister);
     __ Assert(above_equal, AbortReason::kUnexpectedValue);
   }
   __ DecompressAnyTagged(kScratchRegister,
                          FieldOperand(object, JSObject::kElementsOffset));
-  if (FLAG_debug_code) {
+  if (v8_flags.debug_code) {
     __ CmpObjectType(kScratchRegister, FIXED_DOUBLE_ARRAY_TYPE,
                      kScratchRegister);
     __ Assert(equal, AbortReason::kUnexpectedValue);
@@ -1578,19 +1673,8 @@ void LoadDoubleElement::GenerateCode(MaglevAssembler* masm,
     __ DecompressAnyTagged(kScratchRegister,
                            FieldOperand(object, JSObject::kElementsOffset));
   }
-  __ AssertSmi(index);
-  // Zero out top bits of index reg (these were previously either zero already,
-  // or the cage base). This technically mutates it, but since it's a Smi, that
-  // doesn't matter.
-  __ movl(index, index);
-  static_assert(kSmiTagSize + kSmiShiftSize < times_8,
-                "Folding the Smi shift into the FixedArray entry size shift "
-                "only works if the shift is small");
-  __ Movsd(result_reg,
-           FieldOperand(kScratchRegister, index,
-                        static_cast<ScaleFactor>(times_8 -
-                                                 (kSmiTagSize + kSmiShiftSize)),
-                        FixedDoubleArray::kHeaderSize));
+  __ Movsd(result_reg, FieldOperand(kScratchRegister, index, times_8,
+                                    FixedDoubleArray::kHeaderSize));
 }
 
 void StoreTaggedFieldNoWriteBarrier::AllocateVreg(
@@ -1628,14 +1712,15 @@ void StoreTaggedFieldWithWriteBarrier::GenerateCode(
   __ AssertNotSmi(object);
   __ StoreTaggedField(FieldOperand(object, offset()), value);
 
+  ZoneLabelRef done(masm);
   DeferredCodeInfo* deferred_write_barrier = __ PushDeferredCode(
-      [](MaglevAssembler* masm, Label* return_label, Register value,
+      [](MaglevAssembler* masm, ZoneLabelRef done, Register value,
          Register object, StoreTaggedFieldWithWriteBarrier* node) {
         ASM_CODE_COMMENT_STRING(masm, "Write barrier slow path");
         __ CheckPageFlag(
             value, kScratchRegister,
             MemoryChunk::kPointersToHereAreInterestingOrInSharedHeapMask, zero,
-            return_label);
+            *done);
 
         Register slot_reg = WriteBarrierDescriptor::SlotAddressRegister();
         RegList saved;
@@ -1654,15 +1739,15 @@ void StoreTaggedFieldWithWriteBarrier::GenerateCode(
         __ CallRecordWriteStub(object, slot_reg, save_fp_mode);
 
         __ PopAll(saved);
-        __ jmp(return_label);
+        __ jmp(*done);
       },
-      value, object, this);
+      done, value, object, this);
 
-  __ JumpIfSmi(value, &deferred_write_barrier->return_label);
+  __ JumpIfSmi(value, *done);
   __ CheckPageFlag(object, kScratchRegister,
                    MemoryChunk::kPointersFromHereAreInterestingMask, not_zero,
                    &deferred_write_barrier->deferred_code_label);
-  __ bind(&deferred_write_barrier->return_label);
+  __ bind(*done);
 }
 void StoreTaggedFieldWithWriteBarrier::PrintParams(
     std::ostream& os, MaglevGraphLabeller* graph_labeller) const {
@@ -1745,6 +1830,25 @@ void SetNamedGeneric::PrintParams(std::ostream& os,
   os << "(" << name_ << ")";
 }
 
+void StringLength::AllocateVreg(MaglevVregAllocationState* vreg_state) {
+  UseRegister(object_input());
+  DefineAsRegister(vreg_state, this);
+}
+void StringLength::GenerateCode(MaglevAssembler* masm,
+                                const ProcessingState& state) {
+  Register object = ToRegister(object_input());
+  if (v8_flags.debug_code) {
+    // Use return register as temporary.
+    Register tmp = ToRegister(result());
+    // Check if {object} is a string.
+    __ AssertNotSmi(object);
+    __ LoadMap(tmp, object);
+    __ CmpInstanceTypeRange(tmp, tmp, FIRST_STRING_TYPE, LAST_STRING_TYPE);
+    __ Check(below_equal, AbortReason::kUnexpectedValue);
+  }
+  __ movl(ToRegister(result()), FieldOperand(object, String::kLengthOffset));
+}
+
 void DefineNamedOwnGeneric::AllocateVreg(
     MaglevVregAllocationState* vreg_state) {
   using D = CallInterfaceDescriptorFor<Builtin::kDefineNamedOwnIC>::type;
@@ -2016,6 +2120,10 @@ void Int32AddWithOverflow::GenerateCode(MaglevAssembler* masm,
   Register left = ToRegister(left_input());
   Register right = ToRegister(right_input());
   __ addl(left, right);
+  // None of the mutated input registers should be a register input into the
+  // eager deopt info.
+  DCHECK_REGLIST_EMPTY(RegList{left} &
+                       GetGeneralRegistersUsedAsInputs(eager_deopt_info()));
   __ EmitEagerDeoptIf(overflow, DeoptimizeReason::kOverflow, this);
 }
 
@@ -2031,6 +2139,10 @@ void Int32SubtractWithOverflow::GenerateCode(MaglevAssembler* masm,
   Register left = ToRegister(left_input());
   Register right = ToRegister(right_input());
   __ subl(left, right);
+  // None of the mutated input registers should be a register input into the
+  // eager deopt info.
+  DCHECK_REGLIST_EMPTY(RegList{left} &
+                       GetGeneralRegistersUsedAsInputs(eager_deopt_info()));
   __ EmitEagerDeoptIf(overflow, DeoptimizeReason::kOverflow, this);
 }
 
@@ -2048,10 +2160,14 @@ void Int32MultiplyWithOverflow::GenerateCode(MaglevAssembler* masm,
   Register right = ToRegister(right_input());
   DCHECK_EQ(result, ToRegister(left_input()));
 
-  Register saved_left = temporaries().first();
+  Register saved_left = general_temporaries().first();
   __ movl(saved_left, result);
   // TODO(leszeks): peephole optimise multiplication by a constant.
   __ imull(result, right);
+  // None of the mutated input registers should be a register input into the
+  // eager deopt info.
+  DCHECK_REGLIST_EMPTY(RegList{saved_left, result} &
+                       GetGeneralRegistersUsedAsInputs(eager_deopt_info()));
   __ EmitEagerDeoptIf(overflow, DeoptimizeReason::kOverflow, this);
 
   // If the result is zero, check if either lhs or rhs is negative.
@@ -2082,8 +2198,8 @@ void Int32DivideWithOverflow::AllocateVreg(
 
 void Int32DivideWithOverflow::GenerateCode(MaglevAssembler* masm,
                                            const ProcessingState& state) {
-  DCHECK(temporaries().has(rax));
-  DCHECK(temporaries().has(rdx));
+  DCHECK(general_temporaries().has(rax));
+  DCHECK(general_temporaries().has(rdx));
   Register left = ToRegister(left_input());
   Register right = ToRegister(right_input());
   __ movl(rax, left);
@@ -2099,9 +2215,10 @@ void Int32DivideWithOverflow::GenerateCode(MaglevAssembler* masm,
 
   // Check if {right} is positive (and not zero).
   __ cmpl(right, Immediate(0));
+  ZoneLabelRef done(masm);
   __ JumpToDeferredIf(
       less_equal,
-      [](MaglevAssembler* masm, Label* return_label, Register right,
+      [](MaglevAssembler* masm, ZoneLabelRef done, Register right,
          Int32DivideWithOverflow* node) {
         // {right} is negative or zero.
 
@@ -2122,20 +2239,25 @@ void Int32DivideWithOverflow::GenerateCode(MaglevAssembler* masm,
         // Check if {left} is kMinInt and {right} is -1, in which case we'd have
         // to return -kMinInt, which is not representable as Int32.
         __ cmpl(rax, Immediate(kMinInt));
-        __ j(not_equal, return_label);
+        __ j(not_equal, *done);
         __ cmpl(right, Immediate(-1));
-        __ j(not_equal, return_label);
+        __ j(not_equal, *done);
         // TODO(leszeks): Better DeoptimizeReason = kOverflow, but
         // eager_deopt_info is already configured as kNotInt32.
         __ EmitEagerDeopt(node, DeoptimizeReason::kNotInt32);
       },
-      right, this);
+      done, right, this);
+  __ bind(*done);
 
   // Perform the actual integer division.
   __ idivl(right);
 
   // Check that the remainder is zero.
   __ cmpl(rdx, Immediate(0));
+  // None of the mutated input registers should be a register input into the
+  // eager deopt info.
+  DCHECK_REGLIST_EMPTY(RegList{rax, rdx} &
+                       GetGeneralRegistersUsedAsInputs(eager_deopt_info()));
   __ EmitEagerDeoptIf(not_equal, DeoptimizeReason::kNotInt32, this);
   DCHECK_EQ(ToRegister(result()), rax);
 }
@@ -2229,6 +2351,10 @@ void Int32ShiftRightLogical::GenerateCode(MaglevAssembler* masm,
   // TODO(jgruber): Properly track signed/unsigned representations and
   // allocated a heap number if the result is outside smi range.
   __ testl(left, Immediate((1 << 31) | (1 << 30)));
+  // None of the mutated input registers should be a register input into the
+  // eager deopt info.
+  DCHECK_REGLIST_EMPTY(RegList{left} &
+                       GetGeneralRegistersUsedAsInputs(eager_deopt_info()));
   __ EmitEagerDeoptIf(not_equal, DeoptimizeReason::kOverflow, this);
 }
 
@@ -2422,9 +2548,26 @@ void CheckedSmiTag::GenerateCode(MaglevAssembler* masm,
                                  const ProcessingState& state) {
   Register reg = ToRegister(input());
   __ addl(reg, reg);
+  // None of the mutated input registers should be a register input into the
+  // eager deopt info.
+  DCHECK_REGLIST_EMPTY(RegList{reg} &
+                       GetGeneralRegistersUsedAsInputs(eager_deopt_info()));
   __ EmitEagerDeoptIf(overflow, DeoptimizeReason::kOverflow, this);
 }
 
+void UnsafeSmiTag::AllocateVreg(MaglevVregAllocationState* vreg_state) {
+  UseRegister(input());
+  DefineSameAsFirst(vreg_state, this);
+}
+void UnsafeSmiTag::GenerateCode(MaglevAssembler* masm,
+                                const ProcessingState& state) {
+  Register reg = ToRegister(input());
+  __ addl(reg, reg);
+  if (v8_flags.debug_code) {
+    __ Check(no_overflow, AbortReason::kInputDoesNotFitSmi);
+  }
+}
+
 void Int32Constant::AllocateVreg(MaglevVregAllocationState* vreg_state) {
   DefineAsConstant(vreg_state, this);
 }
@@ -2499,41 +2642,53 @@ void LogicalNot::GenerateCode(MaglevAssembler* masm,
                               const ProcessingState& state) {
   Register object = ToRegister(value());
   Register return_value = ToRegister(result());
-  Label not_equal_true;
-  // We load the constant true to the return value and we return it if the
-  // object is not equal to it. Otherwise we load the constant false.
-  __ LoadRoot(return_value, RootIndex::kTrueValue);
-  __ cmp_tagged(return_value, object);
-  __ j(not_equal, &not_equal_true);
-  __ LoadRoot(return_value, RootIndex::kFalseValue);
-  if (FLAG_debug_code) {
-    Label is_equal_true;
-    __ jmp(&is_equal_true);
-    __ bind(&not_equal_true);
-    // LogicalNot expects either the constants true or false.
-    // We know it is not true, so it must be false!
+
+  if (v8_flags.debug_code) {
+    // LogicalNot expects either TrueValue or FalseValue.
+    Label next;
     __ CompareRoot(object, RootIndex::kFalseValue);
+    __ j(equal, &next);
+    __ CompareRoot(object, RootIndex::kTrueValue);
     __ Check(equal, AbortReason::kUnexpectedValue);
-    __ bind(&is_equal_true);
-  } else {
-    __ bind(&not_equal_true);
+    __ bind(&next);
   }
+
+  Label return_false, done;
+  __ CompareRoot(object, RootIndex::kTrueValue);
+  __ j(equal, &return_false, Label::kNear);
+  __ LoadRoot(return_value, RootIndex::kTrueValue);
+  __ jmp(&done, Label::kNear);
+
+  __ bind(&return_false);
+  __ LoadRoot(return_value, RootIndex::kFalseValue);
+
+  __ bind(&done);
 }
 
 void SetPendingMessage::AllocateVreg(MaglevVregAllocationState* vreg_state) {
   UseRegister(value());
+  set_temporaries_needed(1);
   DefineAsRegister(vreg_state, this);
 }
 
 void SetPendingMessage::GenerateCode(MaglevAssembler* masm,
                                      const ProcessingState& state) {
-  Register message = ToRegister(value());
+  Register new_message = ToRegister(value());
   Register return_value = ToRegister(result());
-  Isolate* isolate = masm->isolate();
-  MemOperand message_op = __ ExternalReferenceAsOperand(
-      ExternalReference::address_of_pending_message(isolate), kScratchRegister);
-  __ Move(return_value, message_op);
-  __ movq(message_op, message);
+
+  MemOperand pending_message_operand = __ ExternalReferenceAsOperand(
+      ExternalReference::address_of_pending_message(masm->isolate()),
+      kScratchRegister);
+
+  if (new_message != return_value) {
+    __ Move(return_value, pending_message_operand);
+    __ movq(pending_message_operand, new_message);
+  } else {
+    Register scratch = general_temporaries().PopFirst();
+    __ Move(scratch, pending_message_operand);
+    __ movq(pending_message_operand, new_message);
+    __ Move(return_value, scratch);
+  }
 }
 
 void ToBooleanLogicalNot::AllocateVreg(MaglevVregAllocationState* vreg_state) {
@@ -2550,7 +2705,7 @@ void ToBooleanLogicalNot::GenerateCode(MaglevAssembler* masm,
   ToBoolean(masm, object, object_is_true, object_is_false, true);
   __ bind(*object_is_true);
   __ LoadRoot(return_value, RootIndex::kFalseValue);
-  __ jmp(&done);
+  __ jmp(&done, Label::kNear);
   __ bind(*object_is_false);
   __ LoadRoot(return_value, RootIndex::kTrueValue);
   __ bind(&done);
@@ -2591,7 +2746,7 @@ void TaggedNotEqual::GenerateCode(MaglevAssembler* masm,
 }
 
 void TestInstanceOf::AllocateVreg(MaglevVregAllocationState* vreg_state) {
-  using D = CallInterfaceDescriptorFor<Builtin::kInstanceOf>::type;
+  using D = CallInterfaceDescriptorFor<Builtin::kInstanceOf_WithFeedback>::type;
   UseFixed(context(), kContextRegister);
   UseFixed(object(), D::GetRegisterParameter(D::kLeft));
   UseFixed(callable(), D::GetRegisterParameter(D::kRight));
@@ -2599,13 +2754,15 @@ void TestInstanceOf::AllocateVreg(MaglevVregAllocationState* vreg_state) {
 }
 void TestInstanceOf::GenerateCode(MaglevAssembler* masm,
                                   const ProcessingState& state) {
+  using D = CallInterfaceDescriptorFor<Builtin::kInstanceOf_WithFeedback>::type;
 #ifdef DEBUG
-  using D = CallInterfaceDescriptorFor<Builtin::kInstanceOf>::type;
   DCHECK_EQ(ToRegister(context()), kContextRegister);
   DCHECK_EQ(ToRegister(object()), D::GetRegisterParameter(D::kLeft));
   DCHECK_EQ(ToRegister(callable()), D::GetRegisterParameter(D::kRight));
 #endif
-  __ CallBuiltin(Builtin::kInstanceOf);
+  __ Move(D::GetRegisterParameter(D::kFeedbackVector), feedback().vector);
+  __ Move(D::GetRegisterParameter(D::kSlot), Immediate(feedback().index()));
+  __ CallBuiltin(Builtin::kInstanceOf_WithFeedback);
   masm->DefineExceptionHandlerAndLazyDeoptPoint(this);
 }
 
@@ -2618,18 +2775,22 @@ void TestUndetectable::GenerateCode(MaglevAssembler* masm,
                                     const ProcessingState& state) {
   Register object = ToRegister(value());
   Register return_value = ToRegister(result());
-  RegList temps = temporaries();
-  Register tmp = temps.PopFirst();
-  Label done;
-  __ LoadRoot(return_value, RootIndex::kFalseValue);
-  // If the object is an Smi, return false.
-  __ JumpIfSmi(object, &done);
-  // If it is a HeapObject, load the map and check for the undetectable bit.
-  __ LoadMap(tmp, object);
-  __ testl(FieldOperand(tmp, Map::kBitFieldOffset),
+  Register scratch = general_temporaries().PopFirst();
+
+  Label return_false, done;
+  __ JumpIfSmi(object, &return_false, Label::kNear);
+  // For heap objects, check the map's undetectable bit.
+  __ LoadMap(scratch, object);
+  __ testl(FieldOperand(scratch, Map::kBitFieldOffset),
            Immediate(Map::Bits1::IsUndetectableBit::kMask));
-  __ j(zero, &done);
+  __ j(zero, &return_false, Label::kNear);
+
   __ LoadRoot(return_value, RootIndex::kTrueValue);
+  __ jmp(&done, Label::kNear);
+
+  __ bind(&return_false);
+  __ LoadRoot(return_value, RootIndex::kFalseValue);
+
   __ bind(&done);
 }
 
@@ -2646,80 +2807,80 @@ void TestTypeOf::GenerateCode(MaglevAssembler* masm,
   Label is_true, is_false, done;
   switch (literal_) {
     case LiteralFlag::kNumber:
-      __ JumpIfSmi(object, &is_true);
+      __ JumpIfSmi(object, &is_true, Label::kNear);
       __ CompareRoot(FieldOperand(object, HeapObject::kMapOffset),
                      RootIndex::kHeapNumberMap);
-      __ j(not_equal, &is_false);
+      __ j(not_equal, &is_false, Label::kNear);
       break;
     case LiteralFlag::kString:
-      __ JumpIfSmi(object, &is_false);
+      __ JumpIfSmi(object, &is_false, Label::kNear);
       __ LoadMap(tmp, object);
       __ cmpw(FieldOperand(tmp, Map::kInstanceTypeOffset),
               Immediate(FIRST_NONSTRING_TYPE));
-      __ j(greater_equal, &is_false);
+      __ j(greater_equal, &is_false, Label::kNear);
       break;
     case LiteralFlag::kSymbol:
-      __ JumpIfSmi(object, &is_false);
+      __ JumpIfSmi(object, &is_false, Label::kNear);
       __ LoadMap(tmp, object);
       __ cmpw(FieldOperand(tmp, Map::kInstanceTypeOffset),
               Immediate(SYMBOL_TYPE));
-      __ j(not_equal, &is_false);
+      __ j(not_equal, &is_false, Label::kNear);
       break;
     case LiteralFlag::kBoolean:
       __ CompareRoot(object, RootIndex::kTrueValue);
-      __ j(equal, &is_true);
+      __ j(equal, &is_true, Label::kNear);
       __ CompareRoot(object, RootIndex::kFalseValue);
-      __ j(not_equal, &is_false);
+      __ j(not_equal, &is_false, Label::kNear);
       break;
     case LiteralFlag::kBigInt:
-      __ JumpIfSmi(object, &is_false);
+      __ JumpIfSmi(object, &is_false, Label::kNear);
       __ LoadMap(tmp, object);
       __ cmpw(FieldOperand(tmp, Map::kInstanceTypeOffset),
               Immediate(BIGINT_TYPE));
-      __ j(not_equal, &is_false);
+      __ j(not_equal, &is_false, Label::kNear);
       break;
     case LiteralFlag::kUndefined:
-      __ JumpIfSmi(object, &is_false);
+      __ JumpIfSmi(object, &is_false, Label::kNear);
       // Check it has the undetectable bit set and it is not null.
       __ LoadMap(tmp, object);
       __ testl(FieldOperand(tmp, Map::kBitFieldOffset),
                Immediate(Map::Bits1::IsUndetectableBit::kMask));
-      __ j(zero, &is_false);
+      __ j(zero, &is_false, Label::kNear);
       __ CompareRoot(object, RootIndex::kNullValue);
-      __ j(equal, &is_false);
+      __ j(equal, &is_false, Label::kNear);
       break;
     case LiteralFlag::kFunction:
-      __ JumpIfSmi(object, &is_false);
+      __ JumpIfSmi(object, &is_false, Label::kNear);
       // Check if callable bit is set and not undetectable.
       __ LoadMap(tmp, object);
       __ movl(tmp, FieldOperand(tmp, Map::kBitFieldOffset));
       __ andl(tmp, Immediate(Map::Bits1::IsUndetectableBit::kMask |
                              Map::Bits1::IsCallableBit::kMask));
       __ cmpl(tmp, Immediate(Map::Bits1::IsCallableBit::kMask));
-      __ j(not_equal, &is_false);
+      __ j(not_equal, &is_false, Label::kNear);
       break;
     case LiteralFlag::kObject:
-      __ JumpIfSmi(object, &is_false);
+      __ JumpIfSmi(object, &is_false, Label::kNear);
       // If the object is null then return true.
       __ CompareRoot(object, RootIndex::kNullValue);
-      __ j(equal, &is_true);
+      __ j(equal, &is_true, Label::kNear);
       // Check if the object is a receiver type,
       __ LoadMap(tmp, object);
       __ cmpw(FieldOperand(tmp, Map::kInstanceTypeOffset),
               Immediate(FIRST_JS_RECEIVER_TYPE));
-      __ j(less, &is_false);
+      __ j(less, &is_false, Label::kNear);
       // ... and is not undefined (undetectable) nor callable.
       __ testl(FieldOperand(tmp, Map::kBitFieldOffset),
                Immediate(Map::Bits1::IsUndetectableBit::kMask |
                          Map::Bits1::IsCallableBit::kMask));
-      __ j(not_zero, &is_false);
+      __ j(not_zero, &is_false, Label::kNear);
       break;
     case LiteralFlag::kOther:
       UNREACHABLE();
   }
   __ bind(&is_true);
   __ LoadRoot(ToRegister(result()), RootIndex::kTrueValue);
-  __ jmp(&done);
+  __ jmp(&done, Label::kNear);
   __ bind(&is_false);
   __ LoadRoot(ToRegister(result()), RootIndex::kFalseValue);
   __ bind(&done);
@@ -2823,6 +2984,40 @@ void ChangeInt32ToFloat64::GenerateCode(MaglevAssembler* masm,
   __ Cvtlsi2sd(ToDoubleRegister(result()), ToRegister(input()));
 }
 
+void CheckedTruncateFloat64ToInt32::AllocateVreg(
+    MaglevVregAllocationState* vreg_state) {
+  UseRegister(input());
+  DefineAsRegister(vreg_state, this);
+}
+void CheckedTruncateFloat64ToInt32::GenerateCode(MaglevAssembler* masm,
+                                                 const ProcessingState& state) {
+  DoubleRegister input_reg = ToDoubleRegister(input());
+  Register result_reg = ToRegister(result());
+  DoubleRegister converted_back = kScratchDoubleReg;
+
+  // Convert the input float64 value to int32.
+  __ Cvttsd2si(result_reg, input_reg);
+  // Convert that int32 value back to float64.
+  __ Cvtlsi2sd(converted_back, result_reg);
+  // Check that the result of the float64->int32->float64 is equal to the input
+  // (i.e. that the conversion didn't truncate.
+  __ Ucomisd(input_reg, converted_back);
+  __ EmitEagerDeoptIf(not_equal, DeoptimizeReason::kNotInt32, this);
+
+  // Check if {input} is -0.
+  Label check_done;
+  __ cmpl(result_reg, Immediate(0));
+  __ j(not_equal, &check_done);
+
+  // In case of 0, we need to check the high bits for the IEEE -0 pattern.
+  Register high_word32_of_input = kScratchRegister;
+  __ Pextrd(high_word32_of_input, input_reg, 1);
+  __ cmpl(high_word32_of_input, Immediate(0));
+  __ EmitEagerDeoptIf(less, DeoptimizeReason::kNotInt32, this);
+
+  __ bind(&check_done);
+}
+
 void Phi::AllocateVreg(MaglevVregAllocationState* vreg_state) {
   // Phi inputs are processed in the post-process, once loop phis' inputs'
   // v-regs are allocated.
@@ -2892,7 +3087,7 @@ void Call::GenerateCode(MaglevAssembler* masm, const ProcessingState& state) {
 }
 
 void Construct::AllocateVreg(MaglevVregAllocationState* vreg_state) {
-  using D = ConstructStubDescriptor;
+  using D = Construct_WithFeedbackDescriptor;
   UseFixed(function(), D::GetRegisterParameter(D::kTarget));
   UseFixed(new_target(), D::GetRegisterParameter(D::kNewTarget));
   UseFixed(context(), kContextRegister);
@@ -2903,7 +3098,7 @@ void Construct::AllocateVreg(MaglevVregAllocationState* vreg_state) {
 }
 void Construct::GenerateCode(MaglevAssembler* masm,
                              const ProcessingState& state) {
-  using D = ConstructStubDescriptor;
+  using D = Construct_WithFeedbackDescriptor;
   DCHECK_EQ(ToRegister(function()), D::GetRegisterParameter(D::kTarget));
   DCHECK_EQ(ToRegister(new_target()), D::GetRegisterParameter(D::kNewTarget));
   DCHECK_EQ(ToRegister(context()), kContextRegister);
@@ -2911,13 +3106,14 @@ void Construct::GenerateCode(MaglevAssembler* masm,
   for (int i = num_args() - 1; i >= 0; --i) {
     __ PushInput(arg(i));
   }
+  __ Push(feedback().vector);
 
   uint32_t arg_count = num_args();
   __ Move(D::GetRegisterParameter(D::kActualArgumentsCount),
           Immediate(arg_count));
+  __ Move(D::GetRegisterParameter(D::kSlot), Immediate(feedback().index()));
 
-  __ CallBuiltin(Builtin::kConstruct);
-
+  __ CallBuiltin(Builtin::kConstruct_WithFeedback);
   masm->DefineExceptionHandlerAndLazyDeoptPoint(this);
 }
 
@@ -2934,7 +3130,6 @@ void CallBuiltin::AllocateVreg(MaglevVregAllocationState* vreg_state) {
   if (has_context) {
     UseFixed(input(i), kContextRegister);
   }
-  DCHECK_EQ(descriptor.GetReturnCount(), 1);
   DefineAsFixed(vreg_state, this, kReturnRegister0);
 }
 
@@ -3110,7 +3305,7 @@ void IncreaseInterruptBudget::AllocateVreg(
 }
 void IncreaseInterruptBudget::GenerateCode(MaglevAssembler* masm,
                                            const ProcessingState& state) {
-  Register scratch = temporaries().first();
+  Register scratch = general_temporaries().first();
   __ movq(scratch, MemOperand(rbp, StandardFrameConstants::kFunctionOffset));
   __ LoadTaggedPointerField(
       scratch, FieldOperand(scratch, JSFunction::kFeedbackCellOffset));
@@ -3128,15 +3323,16 @@ void ReduceInterruptBudget::AllocateVreg(
 }
 void ReduceInterruptBudget::GenerateCode(MaglevAssembler* masm,
                                          const ProcessingState& state) {
-  Register scratch = temporaries().first();
+  Register scratch = general_temporaries().first();
   __ movq(scratch, MemOperand(rbp, StandardFrameConstants::kFunctionOffset));
   __ LoadTaggedPointerField(
       scratch, FieldOperand(scratch, JSFunction::kFeedbackCellOffset));
   __ subl(FieldOperand(scratch, FeedbackCell::kInterruptBudgetOffset),
           Immediate(amount()));
+  ZoneLabelRef done(masm);
   __ JumpToDeferredIf(
       less,
-      [](MaglevAssembler* masm, Label* return_label,
+      [](MaglevAssembler* masm, ZoneLabelRef done,
          ReduceInterruptBudget* node) {
         {
           SaveRegisterStateForCall save_register_state(
@@ -3148,9 +3344,10 @@ void ReduceInterruptBudget::GenerateCode(MaglevAssembler* masm,
           save_register_state.DefineSafepointWithLazyDeopt(
               node->lazy_deopt_info());
         }
-        __ jmp(return_label);
+        __ jmp(*done);
       },
-      this);
+      done, this);
+  __ bind(*done);
 }
 void ReduceInterruptBudget::PrintParams(
     std::ostream& os, MaglevGraphLabeller* graph_labeller) const {
@@ -3171,12 +3368,11 @@ void ThrowReferenceErrorIfHole::GenerateCode(MaglevAssembler* masm,
   }
   __ JumpToDeferredIf(
       equal,
-      [](MaglevAssembler* masm, Label* return_label,
-         ThrowReferenceErrorIfHole* node) {
+      [](MaglevAssembler* masm, ThrowReferenceErrorIfHole* node) {
         __ Move(kContextRegister, masm->native_context().object());
         __ Push(node->name().object());
         __ CallRuntime(Runtime::kThrowAccessedUninitializedVariable, 1);
-        masm->DefineLazyDeoptPoint(node->lazy_deopt_info());
+        masm->DefineExceptionHandlerAndLazyDeoptPoint(node);
         __ Abort(AbortReason::kUnexpectedReturnFromThrow);
       },
       this);
@@ -3196,11 +3392,10 @@ void ThrowSuperNotCalledIfHole::GenerateCode(MaglevAssembler* masm,
   }
   __ JumpToDeferredIf(
       equal,
-      [](MaglevAssembler* masm, Label* return_label,
-         ThrowSuperNotCalledIfHole* node) {
+      [](MaglevAssembler* masm, ThrowSuperNotCalledIfHole* node) {
         __ Move(kContextRegister, masm->native_context().object());
         __ CallRuntime(Runtime::kThrowSuperNotCalled, 0);
-        masm->DefineLazyDeoptPoint(node->lazy_deopt_info());
+        masm->DefineExceptionHandlerAndLazyDeoptPoint(node);
         __ Abort(AbortReason::kUnexpectedReturnFromThrow);
       },
       this);
@@ -3220,11 +3415,10 @@ void ThrowSuperAlreadyCalledIfNotHole::GenerateCode(
   }
   __ JumpToDeferredIf(
       not_equal,
-      [](MaglevAssembler* masm, Label* return_label,
-         ThrowSuperAlreadyCalledIfNotHole* node) {
+      [](MaglevAssembler* masm, ThrowSuperAlreadyCalledIfNotHole* node) {
         __ Move(kContextRegister, masm->native_context().object());
         __ CallRuntime(Runtime::kThrowSuperAlreadyCalledError, 0);
-        masm->DefineLazyDeoptPoint(node->lazy_deopt_info());
+        masm->DefineExceptionHandlerAndLazyDeoptPoint(node);
         __ Abort(AbortReason::kUnexpectedReturnFromThrow);
       },
       this);
@@ -3242,13 +3436,12 @@ void ThrowIfNotSuperConstructor::GenerateCode(MaglevAssembler* masm,
            Immediate(Map::Bits1::IsConstructorBit::kMask));
   __ JumpToDeferredIf(
       equal,
-      [](MaglevAssembler* masm, Label* return_label,
-         ThrowIfNotSuperConstructor* node) {
-        __ Move(kContextRegister, masm->native_context().object());
+      [](MaglevAssembler* masm, ThrowIfNotSuperConstructor* node) {
         __ Push(ToRegister(node->constructor()));
         __ Push(ToRegister(node->function()));
+        __ Move(kContextRegister, masm->native_context().object());
         __ CallRuntime(Runtime::kThrowNotSuperConstructor, 2);
-        masm->DefineLazyDeoptPoint(node->lazy_deopt_info());
+        masm->DefineExceptionHandlerAndLazyDeoptPoint(node);
         __ Abort(AbortReason::kUnexpectedReturnFromThrow);
       },
       this);
@@ -3356,7 +3549,8 @@ void JumpFromInlined::GenerateCode(MaglevAssembler* masm,
 
 namespace {
 
-void AttemptOnStackReplacement(MaglevAssembler* masm, Label* return_label,
+void AttemptOnStackReplacement(MaglevAssembler* masm,
+                               ZoneLabelRef no_code_for_osr,
                                JumpLoopPrologue* node, Register scratch0,
                                Register scratch1, int32_t loop_depth,
                                FeedbackSlot feedback_slot,
@@ -3370,6 +3564,7 @@ void AttemptOnStackReplacement(MaglevAssembler* masm, Label* return_label,
   // See also: InterpreterAssembler::OnStackReplacement.
 
   baseline::BaselineAssembler basm(masm);
+  __ AssertFeedbackVector(scratch0);
 
   // Case 1).
   Label deopt;
@@ -3381,11 +3576,10 @@ void AttemptOnStackReplacement(MaglevAssembler* masm, Label* return_label,
 
   // Case 2).
   {
-    __ AssertFeedbackVector(scratch0);
     __ movb(scratch0, FieldOperand(scratch0, FeedbackVector::kOsrStateOffset));
     __ DecodeField<FeedbackVector::OsrUrgencyBits>(scratch0);
     basm.JumpIfByte(baseline::Condition::kUnsignedLessThanEqual, scratch0,
-                    loop_depth, return_label, Label::kNear);
+                    loop_depth, *no_code_for_osr, Label::kNear);
 
     // The osr_urgency exceeds the current loop_depth, signaling an OSR
     // request. Call into runtime to compile.
@@ -3413,23 +3607,29 @@ void AttemptOnStackReplacement(MaglevAssembler* masm, Label* return_label,
               }
             }
           });
+      DCHECK(!snapshot.live_registers.has(maybe_target_code));
       SaveRegisterStateForCall save_register_state(masm, snapshot);
       __ Move(kContextRegister, masm->native_context().object());
       __ Push(Smi::FromInt(osr_offset.ToInt()));
       __ CallRuntime(Runtime::kCompileOptimizedOSRFromMaglev, 1);
       save_register_state.DefineSafepoint();
-      __ Move(scratch0, rax);
+      __ Move(maybe_target_code, kReturnRegister0);
     }
 
     // A `0` return value means there is no OSR code available yet. Fall
     // through for now, OSR code will be picked up once it exists and is
     // cached on the feedback vector.
-    __ testq(scratch0, scratch0);
-    __ j(equal, return_label, Label::kNear);
+    __ Cmp(maybe_target_code, 0);
+    __ j(equal, *no_code_for_osr, Label::kNear);
   }
 
   __ bind(&deopt);
-  if (V8_LIKELY(FLAG_turbofan)) {
+  if (V8_LIKELY(v8_flags.turbofan)) {
+    // None of the mutated input registers should be a register input into the
+    // eager deopt info.
+    DCHECK_REGLIST_EMPTY(
+        RegList{scratch0, scratch1} &
+        GetGeneralRegistersUsedAsInputs(node->eager_deopt_info()));
     __ EmitEagerDeopt(node, DeoptimizeReason::kPrepareForOnStackReplacement);
   } else {
     // Fall through. With TF disabled we cannot OSR and thus it doesn't make
@@ -3446,8 +3646,8 @@ void JumpLoopPrologue::AllocateVreg(MaglevVregAllocationState* vreg_state) {
 }
 void JumpLoopPrologue::GenerateCode(MaglevAssembler* masm,
                                     const ProcessingState& state) {
-  Register scratch0 = temporaries().PopFirst();
-  Register scratch1 = temporaries().PopFirst();
+  Register scratch0 = general_temporaries().PopFirst();
+  Register scratch1 = general_temporaries().PopFirst();
 
   const Register osr_state = scratch1;
   __ Move(scratch0, unit_->feedback().object());
@@ -3459,8 +3659,11 @@ void JumpLoopPrologue::GenerateCode(MaglevAssembler* masm,
   static_assert(FeedbackVector::MaybeHasOptimizedOsrCodeBit::encode(true) >
                 FeedbackVector::kMaxOsrUrgency);
   __ cmpl(osr_state, Immediate(loop_depth_));
-  __ JumpToDeferredIf(above, AttemptOnStackReplacement, this, scratch0,
-                      scratch1, loop_depth_, feedback_slot_, osr_offset_);
+  ZoneLabelRef no_code_for_osr(masm);
+  __ JumpToDeferredIf(above, AttemptOnStackReplacement, no_code_for_osr, this,
+                      scratch0, scratch1, loop_depth_, feedback_slot_,
+                      osr_offset_);
+  __ bind(*no_code_for_osr);
 }
 
 void JumpLoop::AllocateVreg(MaglevVregAllocationState* vreg_state) {}
diff --git a/deps/v8/src/maglev/maglev-ir.h b/deps/v8/src/maglev/maglev-ir.h
index a1766807f97352..7616941df1e04c 100644
--- a/deps/v8/src/maglev/maglev-ir.h
+++ b/deps/v8/src/maglev/maglev-ir.h
@@ -15,6 +15,7 @@
 #include "src/common/globals.h"
 #include "src/common/operation.h"
 #include "src/compiler/backend/instruction.h"
+#include "src/compiler/feedback-source.h"
 #include "src/compiler/heap-refs.h"
 #include "src/deoptimizer/deoptimize-reason.h"
 #include "src/interpreter/bytecode-flags.h"
@@ -117,68 +118,72 @@ class CompactInterpreterFrameState;
   V(RootConstant)                   \
   V(SmiConstant)
 
-#define VALUE_NODE_LIST(V)        \
-  V(Call)                         \
-  V(CallBuiltin)                  \
-  V(CallRuntime)                  \
-  V(CallWithSpread)               \
-  V(Construct)                    \
-  V(ConstructWithSpread)          \
-  V(CreateEmptyArrayLiteral)      \
-  V(CreateArrayLiteral)           \
-  V(CreateShallowArrayLiteral)    \
-  V(CreateObjectLiteral)          \
-  V(CreateEmptyObjectLiteral)     \
-  V(CreateShallowObjectLiteral)   \
-  V(CreateFunctionContext)        \
-  V(CreateClosure)                \
-  V(FastCreateClosure)            \
-  V(CreateRegExpLiteral)          \
-  V(DeleteProperty)               \
-  V(ForInPrepare)                 \
-  V(ForInNext)                    \
-  V(GeneratorRestoreRegister)     \
-  V(GetIterator)                  \
-  V(GetSecondReturnedValue)       \
-  V(GetTemplateObject)            \
-  V(InitialValue)                 \
-  V(LoadTaggedField)              \
-  V(LoadDoubleField)              \
-  V(LoadTaggedElement)            \
-  V(LoadDoubleElement)            \
-  V(LoadGlobal)                   \
-  V(LoadNamedGeneric)             \
-  V(LoadNamedFromSuperGeneric)    \
-  V(SetNamedGeneric)              \
-  V(DefineNamedOwnGeneric)        \
-  V(StoreInArrayLiteralGeneric)   \
-  V(StoreGlobal)                  \
-  V(GetKeyedGeneric)              \
-  V(SetKeyedGeneric)              \
-  V(DefineKeyedOwnGeneric)        \
-  V(Phi)                          \
-  V(RegisterInput)                \
-  V(CheckedSmiTag)                \
-  V(CheckedSmiUntag)              \
-  V(CheckedInternalizedString)    \
-  V(ChangeInt32ToFloat64)         \
-  V(Float64Box)                   \
-  V(CheckedFloat64Unbox)          \
-  V(LogicalNot)                   \
-  V(SetPendingMessage)            \
-  V(ToBooleanLogicalNot)          \
-  V(TaggedEqual)                  \
-  V(TaggedNotEqual)               \
-  V(TestInstanceOf)               \
-  V(TestUndetectable)             \
-  V(TestTypeOf)                   \
-  V(ToName)                       \
-  V(ToNumberOrNumeric)            \
-  V(ToObject)                     \
-  V(ToString)                     \
-  CONSTANT_VALUE_NODE_LIST(V)     \
-  INT32_OPERATIONS_NODE_LIST(V)   \
-  FLOAT64_OPERATIONS_NODE_LIST(V) \
+#define VALUE_NODE_LIST(V)         \
+  V(Call)                          \
+  V(CallBuiltin)                   \
+  V(CallRuntime)                   \
+  V(CallWithSpread)                \
+  V(Construct)                     \
+  V(ConstructWithSpread)           \
+  V(CreateEmptyArrayLiteral)       \
+  V(CreateArrayLiteral)            \
+  V(CreateShallowArrayLiteral)     \
+  V(CreateObjectLiteral)           \
+  V(CreateEmptyObjectLiteral)      \
+  V(CreateShallowObjectLiteral)    \
+  V(CreateFunctionContext)         \
+  V(CreateClosure)                 \
+  V(FastCreateClosure)             \
+  V(CreateRegExpLiteral)           \
+  V(DeleteProperty)                \
+  V(ForInPrepare)                  \
+  V(ForInNext)                     \
+  V(GeneratorRestoreRegister)      \
+  V(GetIterator)                   \
+  V(GetSecondReturnedValue)        \
+  V(GetTemplateObject)             \
+  V(InitialValue)                  \
+  V(LoadTaggedField)               \
+  V(LoadDoubleField)               \
+  V(LoadTaggedElement)             \
+  V(LoadDoubleElement)             \
+  V(LoadGlobal)                    \
+  V(LoadNamedGeneric)              \
+  V(LoadNamedFromSuperGeneric)     \
+  V(SetNamedGeneric)               \
+  V(DefineNamedOwnGeneric)         \
+  V(StoreInArrayLiteralGeneric)    \
+  V(StoreGlobal)                   \
+  V(GetKeyedGeneric)               \
+  V(SetKeyedGeneric)               \
+  V(DefineKeyedOwnGeneric)         \
+  V(Phi)                           \
+  V(RegisterInput)                 \
+  V(CheckedSmiTag)                 \
+  V(UnsafeSmiTag)                  \
+  V(CheckedSmiUntag)               \
+  V(CheckedInternalizedString)     \
+  V(CheckedObjectToIndex)          \
+  V(ChangeInt32ToFloat64)          \
+  V(CheckedTruncateFloat64ToInt32) \
+  V(Float64Box)                    \
+  V(CheckedFloat64Unbox)           \
+  V(LogicalNot)                    \
+  V(SetPendingMessage)             \
+  V(StringLength)                  \
+  V(ToBooleanLogicalNot)           \
+  V(TaggedEqual)                   \
+  V(TaggedNotEqual)                \
+  V(TestInstanceOf)                \
+  V(TestUndetectable)              \
+  V(TestTypeOf)                    \
+  V(ToName)                        \
+  V(ToNumberOrNumeric)             \
+  V(ToObject)                      \
+  V(ToString)                      \
+  CONSTANT_VALUE_NODE_LIST(V)      \
+  INT32_OPERATIONS_NODE_LIST(V)    \
+  FLOAT64_OPERATIONS_NODE_LIST(V)  \
   GENERIC_OPERATIONS_NODE_LIST(V)
 
 #define GAP_MOVE_NODE_LIST(V) \
@@ -196,6 +201,7 @@ class CompactInterpreterFrameState;
   V(CheckMapsWithMigration)           \
   V(CheckJSArrayBounds)               \
   V(CheckJSObjectElementsBounds)      \
+  V(DebugBreak)                       \
   V(GeneratorStore)                   \
   V(JumpLoopPrologue)                 \
   V(StoreTaggedFieldNoWriteBarrier)   \
@@ -442,11 +448,22 @@ class BasicBlockRef {
     return next_ref_ != nullptr;
   }
 
+  int interrupt_budget_correction() const {
+    DCHECK_EQ(state_, kRefList);
+    return interrupt_budget_correction_;
+  }
+
+  void set_interrupt_budget_correction(int interrupt_budget_correction) {
+    DCHECK_EQ(state_, kRefList);
+    interrupt_budget_correction_ = interrupt_budget_correction;
+  }
+
  private:
   union {
     BasicBlock* block_ptr_;
     BasicBlockRef* next_ref_;
   };
+  int interrupt_budget_correction_ = 0;
 #ifdef DEBUG
   enum { kBlockPointer, kRefList } state_;
 #endif  // DEBUG
@@ -616,6 +633,7 @@ class ValueLocation {
   }
 
   bool IsAnyRegister() const { return operand_.IsAnyRegister(); }
+  bool IsGeneralRegister() const { return operand_.IsRegister(); }
   bool IsDoubleRegister() const { return operand_.IsDoubleRegister(); }
 
   const compiler::InstructionOperand& operand() const { return operand_; }
@@ -761,8 +779,10 @@ class NodeBase : public ZoneObject {
   using OpPropertiesField =
       OpcodeField::Next<OpProperties, OpProperties::kSize>;
   using NumTemporariesNeededField = OpPropertiesField::Next<uint8_t, 2>;
+  using NumDoubleTemporariesNeededField =
+      NumTemporariesNeededField::Next<uint8_t, 1>;
   // Align input count to 32-bit.
-  using UnusedField = NumTemporariesNeededField::Next<uint8_t, 3>;
+  using UnusedField = NumDoubleTemporariesNeededField::Next<uint8_t, 2>;
   using InputCountField = UnusedField::Next<size_t, 17>;
   static_assert(InputCountField::kShift == 32);
 
@@ -874,13 +894,35 @@ class NodeBase : public ZoneObject {
     id_ = id;
   }
 
+  template <typename RegisterT>
   uint8_t num_temporaries_needed() const {
-    return NumTemporariesNeededField::decode(bitfield_);
+    if constexpr (std::is_same_v<RegisterT, Register>) {
+      return NumTemporariesNeededField::decode(bitfield_);
+    } else {
+      return NumDoubleTemporariesNeededField::decode(bitfield_);
+    }
+  }
+
+  template <typename RegisterT>
+  RegListBase<RegisterT>& temporaries() {
+    if constexpr (std::is_same_v<RegisterT, Register>) {
+      return temporaries_;
+    } else {
+      return double_temporaries_;
+    }
   }
 
-  RegList& temporaries() { return temporaries_; }
+  RegList& general_temporaries() { return temporaries_; }
+  DoubleRegList& double_temporaries() { return double_temporaries_; }
 
-  void assign_temporaries(RegList list) { temporaries_ = list; }
+  template <typename RegisterT>
+  void assign_temporaries(RegListBase<RegisterT> list) {
+    if constexpr (std::is_same_v<RegisterT, Register>) {
+      temporaries_ = list;
+    } else {
+      double_temporaries_ = list;
+    }
+  }
 
   void Print(std::ostream& os, MaglevGraphLabeller*,
              bool skip_targets = false) const;
@@ -949,14 +991,23 @@ class NodeBase : public ZoneObject {
   //
   // Does not include any registers requested by RequireSpecificTemporary.
   void set_temporaries_needed(uint8_t value) {
-    DCHECK_EQ(num_temporaries_needed(), 0);
+    DCHECK_EQ(num_temporaries_needed<Register>(), 0);
     bitfield_ = NumTemporariesNeededField::update(bitfield_, value);
   }
 
+  void set_double_temporaries_needed(uint8_t value) {
+    DCHECK_EQ(num_temporaries_needed<DoubleRegister>(), 0);
+    bitfield_ = NumDoubleTemporariesNeededField::update(bitfield_, value);
+  }
+
   // Require that a specific register is free (and therefore clobberable) by the
   // entry into this node.
   void RequireSpecificTemporary(Register reg) { temporaries_.set(reg); }
 
+  void RequireSpecificDoubleTemporary(DoubleRegister reg) {
+    double_temporaries_.set(reg);
+  }
+
  private:
   template <class Derived, typename... Args>
   static Derived* Allocate(Zone* zone, size_t input_count, Args&&... args) {
@@ -1021,6 +1072,7 @@ class NodeBase : public ZoneObject {
   uint64_t bitfield_;
   NodeIdT id_ = kInvalidNodeId;
   RegList temporaries_;
+  DoubleRegList double_temporaries_;
 
   NodeBase() = delete;
   NodeBase(const NodeBase&) = delete;
@@ -1147,7 +1199,7 @@ class ValueNode : public Node {
 
   struct LiveRange {
     NodeIdT start = kInvalidNodeId;
-    NodeIdT end = kInvalidNodeId;
+    NodeIdT end = kInvalidNodeId;  // Inclusive.
   };
 
   bool has_valid_live_range() const { return end_id_ != 0; }
@@ -1652,6 +1704,20 @@ class CheckedSmiTag : public FixedInputValueNodeT<1, CheckedSmiTag> {
   DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
 };
 
+// Input must guarantee to fit in a Smi.
+class UnsafeSmiTag : public FixedInputValueNodeT<1, UnsafeSmiTag> {
+  using Base = FixedInputValueNodeT<1, UnsafeSmiTag>;
+
+ public:
+  explicit UnsafeSmiTag(uint64_t bitfield) : Base(bitfield) {}
+
+  static constexpr OpProperties kProperties = OpProperties::ConversionNode();
+
+  Input& input() { return Node::input(0); }
+
+  DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
+};
+
 class CheckedSmiUntag : public FixedInputValueNodeT<1, CheckedSmiUntag> {
   using Base = FixedInputValueNodeT<1, CheckedSmiUntag>;
 
@@ -1746,6 +1812,22 @@ class ChangeInt32ToFloat64
   DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
 };
 
+class CheckedTruncateFloat64ToInt32
+    : public FixedInputValueNodeT<1, CheckedTruncateFloat64ToInt32> {
+  using Base = FixedInputValueNodeT<1, CheckedTruncateFloat64ToInt32>;
+
+ public:
+  explicit CheckedTruncateFloat64ToInt32(uint64_t bitfield) : Base(bitfield) {}
+
+  static constexpr OpProperties kProperties = OpProperties::EagerDeopt() |
+                                              OpProperties::Int32() |
+                                              OpProperties::ConversionNode();
+
+  Input& input() { return Node::input(0); }
+
+  DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
+};
+
 class CheckedFloat64Unbox
     : public FixedInputValueNodeT<1, CheckedFloat64Unbox> {
   using Base = FixedInputValueNodeT<1, CheckedFloat64Unbox>;
@@ -1824,7 +1906,8 @@ class TestInstanceOf : public FixedInputValueNodeT<3, TestInstanceOf> {
   using Base = FixedInputValueNodeT<3, TestInstanceOf>;
 
  public:
-  explicit TestInstanceOf(uint64_t bitfield) : Base(bitfield) {}
+  explicit TestInstanceOf(uint64_t bitfield, compiler::FeedbackSource feedback)
+      : Base(bitfield), feedback_(feedback) {}
 
   // The implementation currently calls runtime.
   static constexpr OpProperties kProperties = OpProperties::JSCall();
@@ -1832,8 +1915,12 @@ class TestInstanceOf : public FixedInputValueNodeT<3, TestInstanceOf> {
   Input& context() { return input(0); }
   Input& object() { return input(1); }
   Input& callable() { return input(2); }
+  compiler::FeedbackSource feedback() const { return feedback_; }
 
   DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
+
+ private:
+  const compiler::FeedbackSource feedback_;
 };
 
 class TestUndetectable : public FixedInputValueNodeT<1, TestUndetectable> {
@@ -2197,9 +2284,13 @@ class Constant : public FixedInputValueNodeT<0, Constant> {
 
   DECL_NODE_INTERFACE()
 
+  compiler::HeapObjectRef object() { return object_; }
+
   void DoLoadToRegister(MaglevAssembler*, OutputRegister);
   Handle<Object> DoReify(LocalIsolate* isolate);
 
+  const compiler::HeapObjectRef& ref() const { return object_; }
+
  private:
   const compiler::HeapObjectRef object_;
 };
@@ -2265,7 +2356,8 @@ class CreateArrayLiteral : public FixedInputValueNodeT<0, CreateArrayLiteral> {
   int flags() const { return flags_; }
 
   // The implementation currently calls runtime.
-  static constexpr OpProperties kProperties = OpProperties::Call();
+  static constexpr OpProperties kProperties =
+      OpProperties::Call() | OpProperties::Throw() | OpProperties::LazyDeopt();
 
   DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
 
@@ -2325,7 +2417,8 @@ class CreateObjectLiteral
   int flags() const { return flags_; }
 
   // The implementation currently calls runtime.
-  static constexpr OpProperties kProperties = OpProperties::Call();
+  static constexpr OpProperties kProperties =
+      OpProperties::Call() | OpProperties::Throw() | OpProperties::LazyDeopt();
 
   DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
 
@@ -2700,6 +2793,15 @@ class CheckJSObjectElementsBounds
   DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
 };
 
+class DebugBreak : public FixedInputNodeT<0, DebugBreak> {
+  using Base = FixedInputNodeT<0, DebugBreak>;
+
+ public:
+  explicit DebugBreak(uint64_t bitfield) : Base(bitfield) {}
+
+  DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
+};
+
 class CheckedInternalizedString
     : public FixedInputValueNodeT<1, CheckedInternalizedString> {
   using Base = FixedInputValueNodeT<1, CheckedInternalizedString>;
@@ -2711,9 +2813,8 @@ class CheckedInternalizedString
     CHECK_EQ(properties().value_representation(), ValueRepresentation::kTagged);
   }
 
-  static constexpr OpProperties kProperties = OpProperties::EagerDeopt() |
-                                              OpProperties::TaggedValue() |
-                                              OpProperties::ConversionNode();
+  static constexpr OpProperties kProperties =
+      OpProperties::EagerDeopt() | OpProperties::TaggedValue();
 
   static constexpr int kObjectIndex = 0;
   Input& object_input() { return Node::input(kObjectIndex); }
@@ -2724,6 +2825,23 @@ class CheckedInternalizedString
   const CheckType check_type_;
 };
 
+class CheckedObjectToIndex
+    : public FixedInputValueNodeT<1, CheckedObjectToIndex> {
+  using Base = FixedInputValueNodeT<1, CheckedObjectToIndex>;
+
+ public:
+  explicit CheckedObjectToIndex(uint64_t bitfield) : Base(bitfield) {}
+
+  static constexpr OpProperties kProperties =
+      OpProperties::EagerDeopt() | OpProperties::Int32() |
+      OpProperties::DeferredCall() | OpProperties::ConversionNode();
+
+  static constexpr int kObjectIndex = 0;
+  Input& object_input() { return Node::input(kObjectIndex); }
+
+  DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
+};
+
 class GetTemplateObject : public FixedInputValueNodeT<1, GetTemplateObject> {
   using Base = FixedInputValueNodeT<1, GetTemplateObject>;
 
@@ -3012,6 +3130,21 @@ class SetNamedGeneric : public FixedInputValueNodeT<3, SetNamedGeneric> {
   const compiler::FeedbackSource feedback_;
 };
 
+class StringLength : public FixedInputValueNodeT<1, StringLength> {
+  using Base = FixedInputValueNodeT<1, StringLength>;
+
+ public:
+  explicit StringLength(uint64_t bitfield) : Base(bitfield) {}
+
+  static constexpr OpProperties kProperties =
+      OpProperties::Reading() | OpProperties::Int32();
+
+  static constexpr int kObjectIndex = 0;
+  Input& object_input() { return input(kObjectIndex); }
+
+  DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
+};
+
 class DefineNamedOwnGeneric
     : public FixedInputValueNodeT<3, DefineNamedOwnGeneric> {
   using Base = FixedInputValueNodeT<3, DefineNamedOwnGeneric>;
@@ -3210,6 +3343,8 @@ class Phi : public ValueNodeT<Phi> {
   using Node::reduce_input_count;
   using Node::set_input;
 
+  bool is_exception_phi() const { return input_count() == 0; }
+
   DECL_NODE_INTERFACE()
   void AllocateVregInPostProcess(MaglevVregAllocationState*);
 
@@ -3279,9 +3414,9 @@ class Construct : public ValueNodeT<Construct> {
 
   // This ctor is used when for variable input counts.
   // Inputs must be initialized manually.
-  Construct(uint64_t bitfield, ValueNode* function, ValueNode* new_target,
-            ValueNode* context)
-      : Base(bitfield) {
+  Construct(uint64_t bitfield, const compiler::FeedbackSource& feedback,
+            ValueNode* function, ValueNode* new_target, ValueNode* context)
+      : Base(bitfield), feedback_(feedback) {
     set_input(kFunctionIndex, function);
     set_input(kNewTargetIndex, new_target);
     set_input(kContextIndex, context);
@@ -3300,8 +3435,12 @@ class Construct : public ValueNodeT<Construct> {
   void set_arg(int i, ValueNode* node) {
     set_input(i + kFixedInputCount, node);
   }
+  compiler::FeedbackSource feedback() const { return feedback_; }
 
   DECL_NODE_INTERFACE_WITH_EMPTY_PRINT_PARAMS()
+
+ private:
+  const compiler::FeedbackSource feedback_;
 };
 
 class CallBuiltin : public ValueNodeT<CallBuiltin> {
@@ -3377,6 +3516,10 @@ class CallBuiltin : public ValueNodeT<CallBuiltin> {
 
   void set_arg(int i, ValueNode* node) { set_input(i, node); }
 
+  int ReturnCount() const {
+    return Builtins::CallInterfaceDescriptorFor(builtin_).GetReturnCount();
+  }
+
   DECL_NODE_INTERFACE()
 
  private:
@@ -3556,7 +3699,7 @@ class ThrowReferenceErrorIfHole
       : Base(bitfield), name_(name) {}
 
   static constexpr OpProperties kProperties =
-      OpProperties::LazyDeopt() | OpProperties::DeferredCall();
+      OpProperties::Throw() | OpProperties::DeferredCall();
 
   const compiler::NameRef& name() const { return name_; }
 
@@ -3576,7 +3719,7 @@ class ThrowSuperNotCalledIfHole
   explicit ThrowSuperNotCalledIfHole(uint64_t bitfield) : Base(bitfield) {}
 
   static constexpr OpProperties kProperties =
-      OpProperties::LazyDeopt() | OpProperties::DeferredCall();
+      OpProperties::Throw() | OpProperties::DeferredCall();
 
   Input& value() { return Node::input(0); }
 
@@ -3592,7 +3735,7 @@ class ThrowSuperAlreadyCalledIfNotHole
       : Base(bitfield) {}
 
   static constexpr OpProperties kProperties =
-      OpProperties::LazyDeopt() | OpProperties::DeferredCall();
+      OpProperties::Throw() | OpProperties::DeferredCall();
 
   Input& value() { return Node::input(0); }
 
@@ -3607,7 +3750,7 @@ class ThrowIfNotSuperConstructor
   explicit ThrowIfNotSuperConstructor(uint64_t bitfield) : Base(bitfield) {}
 
   static constexpr OpProperties kProperties =
-      OpProperties::LazyDeopt() | OpProperties::DeferredCall();
+      OpProperties::Throw() | OpProperties::DeferredCall();
 
   Input& constructor() { return Node::input(0); }
   Input& function() { return Node::input(1); }
@@ -3701,6 +3844,12 @@ class BranchControlNode : public ConditionalControlNode {
 
   BasicBlock* if_true() const { return if_true_.block_ptr(); }
   BasicBlock* if_false() const { return if_false_.block_ptr(); }
+  void set_true_interrupt_correction(int interrupt_budget_correction) {
+    if_true_.set_interrupt_budget_correction(interrupt_budget_correction);
+  }
+  void set_false_interrupt_correction(int interrupt_budget_correction) {
+    if_false_.set_interrupt_budget_correction(interrupt_budget_correction);
+  }
 
  private:
   BasicBlockRef if_true_;
diff --git a/deps/v8/src/maglev/maglev-regalloc.cc b/deps/v8/src/maglev/maglev-regalloc.cc
index 9cc1d02636dfb8..b6189dc6ceabeb 100644
--- a/deps/v8/src/maglev/maglev-regalloc.cc
+++ b/deps/v8/src/maglev/maglev-regalloc.cc
@@ -283,7 +283,7 @@ void StraightForwardRegisterAllocator::PrintLiveRegs() const {
 }
 
 void StraightForwardRegisterAllocator::AllocateRegisters() {
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_.reset(new MaglevPrintingVisitor(
         compilation_info_->graph_labeller(), std::cout));
     printing_visitor_->PreProcessGraph(graph_);
@@ -319,6 +319,14 @@ void StraightForwardRegisterAllocator::AllocateRegisters() {
       if (block->state()->is_exception_handler()) {
         // Exceptions start from a blank state of register values.
         ClearRegisterValues();
+      } else if (block->state()->is_resumable_loop() &&
+                 block->state()->predecessor_count() <= 1) {
+        // Loops that are only reachable through JumpLoop start from a blank
+        // state of register values.
+        // This should actually only support predecessor_count == 1, but we
+        // currently don't eliminate resumable loop headers (and subsequent code
+        // until the next resume) that end up being unreachable from JumpLoop.
+        ClearRegisterValues();
       } else {
         InitializeRegisterValues(block->state()->register_state());
       }
@@ -326,7 +334,7 @@ void StraightForwardRegisterAllocator::AllocateRegisters() {
       InitializeRegisterValues(block->empty_block_register_state());
     }
 
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->PreProcessBasicBlock(block);
       printing_visitor_->os() << "live regs: ";
       PrintLiveRegs();
@@ -391,7 +399,7 @@ void StraightForwardRegisterAllocator::AllocateRegisters() {
         if (phi->owner() == interpreter::Register::virtual_accumulator() &&
             !phi->is_dead()) {
           phi->result().SetAllocated(ForceAllocate(kReturnRegister0, phi));
-          if (FLAG_trace_maglev_regalloc) {
+          if (v8_flags.trace_maglev_regalloc) {
             printing_visitor_->Process(phi, ProcessingState(block_it_));
             printing_visitor_->os() << "phi (exception message object) "
                                     << phi->result().operand() << std::endl;
@@ -411,7 +419,7 @@ void StraightForwardRegisterAllocator::AllocateRegisters() {
           compiler::AllocatedOperand allocation =
               general_registers_.AllocateRegister(phi);
           phi->result().SetAllocated(allocation);
-          if (FLAG_trace_maglev_regalloc) {
+          if (v8_flags.trace_maglev_regalloc) {
             printing_visitor_->Process(phi, ProcessingState(block_it_));
             printing_visitor_->os()
                 << "phi (new reg) " << phi->result().operand() << std::endl;
@@ -428,14 +436,14 @@ void StraightForwardRegisterAllocator::AllocateRegisters() {
         AllocateSpillSlot(phi);
         // TODO(verwaest): Will this be used at all?
         phi->result().SetAllocated(phi->spill_slot());
-        if (FLAG_trace_maglev_regalloc) {
+        if (v8_flags.trace_maglev_regalloc) {
           printing_visitor_->Process(phi, ProcessingState(block_it_));
           printing_visitor_->os()
               << "phi (stack) " << phi->result().operand() << std::endl;
         }
       }
 
-      if (FLAG_trace_maglev_regalloc) {
+      if (v8_flags.trace_maglev_regalloc) {
         printing_visitor_->os() << "live regs: ";
         PrintLiveRegs();
         printing_visitor_->os() << std::endl;
@@ -470,7 +478,7 @@ void StraightForwardRegisterAllocator::UpdateUse(
 
   if (!node->is_dead()) return;
 
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os()
         << "  freeing " << PrintNodeLabel(graph_labeller(), node) << "\n";
   }
@@ -498,7 +506,7 @@ void StraightForwardRegisterAllocator::UpdateUse(
   detail::DeepForEachInput(
       &deopt_info,
       [&](ValueNode* node, interpreter::Register reg, InputLocation* input) {
-        if (FLAG_trace_maglev_regalloc) {
+        if (v8_flags.trace_maglev_regalloc) {
           printing_visitor_->os()
               << "- using " << PrintNodeLabel(graph_labeller(), node) << "\n";
         }
@@ -513,26 +521,17 @@ void StraightForwardRegisterAllocator::UpdateUse(
 
 void StraightForwardRegisterAllocator::UpdateUse(
     const LazyDeoptInfo& deopt_info) {
-  const CompactInterpreterFrameState* checkpoint_state =
-      deopt_info.state.register_frame;
-  int index = 0;
-  // TODO(leszeks): This is missing parent recursion, fix it.
-  // See also: UpdateUse(EagerDeoptInfo&).
-  checkpoint_state->ForEachValue(
-      deopt_info.unit, [&](ValueNode* node, interpreter::Register reg) {
-        // Skip over the result location since it is irrelevant for lazy deopts
-        // (unoptimized code will recreate the result).
-        if (deopt_info.IsResultRegister(reg)) return;
-        if (FLAG_trace_maglev_regalloc) {
+  detail::DeepForEachInput(
+      &deopt_info,
+      [&](ValueNode* node, interpreter::Register reg, InputLocation* input) {
+        if (v8_flags.trace_maglev_regalloc) {
           printing_visitor_->os()
               << "- using " << PrintNodeLabel(graph_labeller(), node) << "\n";
         }
-        InputLocation* input = &deopt_info.input_locations[index++];
-        // We might have dropped this node without spilling it. Spill it now.
-        if (!node->has_register() && !node->is_loadable()) {
-          Spill(node);
-        }
-        input->InjectLocation(node->allocation());
+        // Lazy deopts always need spilling, and should always be loaded from
+        // their loadable slot.
+        Spill(node);
+        input->InjectLocation(node->loadable_slot());
         UpdateUse(node, input);
       });
 }
@@ -555,7 +554,7 @@ void StraightForwardRegisterAllocator::AllocateNode(Node* node) {
   DCHECK(!node->Is<ConstantGapMove>());
 
   current_node_ = node;
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os()
         << "Allocating " << PrintNodeLabel(graph_labeller(), node)
         << " inputs...\n";
@@ -567,26 +566,26 @@ void StraightForwardRegisterAllocator::AllocateNode(Node* node) {
 
   // Allocate node output.
   if (node->Is<ValueNode>()) {
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->os() << "Allocating result...\n";
     }
     AllocateNodeResult(node->Cast<ValueNode>());
   }
 
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os() << "Updating uses...\n";
   }
 
   // Update uses only after allocating the node result. This order is necessary
   // to avoid emitting input-clobbering gap moves during node result allocation.
   if (node->properties().can_eager_deopt()) {
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->os() << "Using eager deopt nodes...\n";
     }
     UpdateUse(*node->eager_deopt_info());
   }
   for (Input& input : *node) {
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->os()
           << "Using input " << PrintNodeLabel(graph_labeller(), input.node())
           << "...\n";
@@ -596,7 +595,7 @@ void StraightForwardRegisterAllocator::AllocateNode(Node* node) {
 
   // Lazy deopts are semantically after the node, so update them last.
   if (node->properties().can_lazy_deopt()) {
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->os() << "Using lazy deopt nodes...\n";
     }
     UpdateUse(*node->lazy_deopt_info());
@@ -604,7 +603,7 @@ void StraightForwardRegisterAllocator::AllocateNode(Node* node) {
 
   if (node->properties().needs_register_snapshot()) SaveRegisterSnapshot(node);
 
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->Process(node, ProcessingState(block_it_));
     printing_visitor_->os() << "live regs: ";
     PrintLiveRegs();
@@ -615,8 +614,10 @@ void StraightForwardRegisterAllocator::AllocateNode(Node* node) {
   // result, which could be written into a register that was previously
   // considered a temporary.
   DCHECK_EQ(general_registers_.free() |
-                (node->temporaries() - GetNodeResultRegister(node)),
+                (node->general_temporaries() - GetNodeResultRegister(node)),
             general_registers_.free());
+  DCHECK_EQ(double_registers_.free() | node->double_temporaries(),
+            double_registers_.free());
   general_registers_.clear_blocked();
   double_registers_.clear_blocked();
   VerifyRegisterState();
@@ -628,7 +629,8 @@ void StraightForwardRegisterAllocator::DropRegisterValueAtEnd(RegisterT reg) {
   list.unblock(reg);
   if (!list.free().has(reg)) {
     ValueNode* node = list.GetValue(reg);
-    // If the is not live after the current node, just remove its value.
+    // If the register is not live after the current node, just remove its
+    // value.
     if (node->live_range().end == current_node_->id()) {
       node->RemoveRegister(reg);
     } else {
@@ -716,7 +718,7 @@ void StraightForwardRegisterAllocator::DropRegisterValue(
 
   ValueNode* node = registers.GetValue(reg);
 
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os() << "  dropping " << reg << " value "
                             << PrintNodeLabel(graph_labeller(), node) << "\n";
   }
@@ -798,71 +800,6 @@ void StraightForwardRegisterAllocator::InitializeConditionalBranchTarget(
                                                 target);
 }
 
-#ifdef DEBUG
-namespace {
-
-bool IsReachable(BasicBlock* source_block, BasicBlock* target_block,
-                 std::set<BasicBlock*>& visited) {
-  if (source_block == target_block) return true;
-  if (!visited.insert(source_block).second) return false;
-
-  ControlNode* control_node = source_block->control_node();
-  if (UnconditionalControlNode* unconditional =
-          control_node->TryCast<UnconditionalControlNode>()) {
-    return IsReachable(unconditional->target(), target_block, visited);
-  }
-  if (BranchControlNode* branch = control_node->TryCast<BranchControlNode>()) {
-    return IsReachable(branch->if_true(), target_block, visited) ||
-           IsReachable(branch->if_true(), target_block, visited);
-  }
-  if (Switch* switch_node = control_node->TryCast<Switch>()) {
-    const BasicBlockRef* targets = switch_node->targets();
-    for (int i = 0; i < switch_node->size(); i++) {
-      if (IsReachable(source_block, targets[i].block_ptr(), visited)) {
-        return true;
-      }
-    }
-    if (switch_node->has_fallthrough()) {
-      if (IsReachable(source_block, switch_node->fallthrough(), visited)) {
-        return true;
-      }
-    }
-    return false;
-  }
-  return false;
-}
-
-// Complex predicate for a JumpLoop lifetime extension DCHECK, see comments
-// in AllocateControlNode.
-bool IsValueFromGeneratorResumeThatDoesNotReachJumpLoop(
-    Graph* graph, ValueNode* input_node, BasicBlock* jump_loop_block) {
-  // The given node _must_ be created in the generator resume block. This is
-  // always the third block -- the first is inital values, the second is the
-  // test for an undefined generator, and the third is the generator resume
-  // machinery.
-  DCHECK_GE(graph->num_blocks(), 3);
-  BasicBlock* generator_block = *(graph->begin() + 2);
-  DCHECK_EQ(generator_block->control_node()->opcode(), Opcode::kSwitch);
-
-  bool found_node = false;
-  for (Node* node : generator_block->nodes()) {
-    if (node == input_node) {
-      found_node = true;
-      break;
-    }
-  }
-  DCHECK(found_node);
-
-  std::set<BasicBlock*> visited;
-  bool jump_loop_block_is_reachable_from_generator_block =
-      IsReachable(generator_block, jump_loop_block, visited);
-  DCHECK(!jump_loop_block_is_reachable_from_generator_block);
-
-  return true;
-}
-}  // namespace
-#endif
-
 void StraightForwardRegisterAllocator::AllocateControlNode(ControlNode* node,
                                                            BasicBlock* block) {
   current_node_ = node;
@@ -872,30 +809,36 @@ void StraightForwardRegisterAllocator::AllocateControlNode(ControlNode* node,
 
   if (node->Is<JumpToInlined>() || node->Is<Abort>()) {
     // Do nothing.
-    DCHECK(node->temporaries().is_empty());
-    DCHECK_EQ(node->num_temporaries_needed(), 0);
+    DCHECK(node->general_temporaries().is_empty());
+    DCHECK(node->double_temporaries().is_empty());
+    DCHECK_EQ(node->num_temporaries_needed<Register>(), 0);
+    DCHECK_EQ(node->num_temporaries_needed<DoubleRegister>(), 0);
     DCHECK_EQ(node->input_count(), 0);
     DCHECK_EQ(node->properties(), OpProperties(0));
 
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->Process(node, ProcessingState(block_it_));
     }
   } else if (node->Is<Deopt>()) {
-    // No fixed temporaries.
-    DCHECK(node->temporaries().is_empty());
-    DCHECK_EQ(node->num_temporaries_needed(), 0);
+    // No temporaries.
+    DCHECK(node->general_temporaries().is_empty());
+    DCHECK(node->double_temporaries().is_empty());
+    DCHECK_EQ(node->num_temporaries_needed<Register>(), 0);
+    DCHECK_EQ(node->num_temporaries_needed<DoubleRegister>(), 0);
     DCHECK_EQ(node->input_count(), 0);
     DCHECK_EQ(node->properties(), OpProperties::EagerDeopt());
 
     UpdateUse(*node->eager_deopt_info());
 
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->Process(node, ProcessingState(block_it_));
     }
   } else if (auto unconditional = node->TryCast<UnconditionalControlNode>()) {
-    // No fixed temporaries.
-    DCHECK(node->temporaries().is_empty());
-    DCHECK_EQ(node->num_temporaries_needed(), 0);
+    // No temporaries.
+    DCHECK(node->general_temporaries().is_empty());
+    DCHECK(node->double_temporaries().is_empty());
+    DCHECK_EQ(node->num_temporaries_needed<Register>(), 0);
+    DCHECK_EQ(node->num_temporaries_needed<DoubleRegister>(), 0);
     DCHECK_EQ(node->input_count(), 0);
     DCHECK(!node->properties().can_eager_deopt());
     DCHECK(!node->properties().can_lazy_deopt());
@@ -915,19 +858,17 @@ void StraightForwardRegisterAllocator::AllocateControlNode(ControlNode* node,
     // extended lifetime nodes are dead.
     if (auto jump_loop = node->TryCast<JumpLoop>()) {
       for (Input& input : jump_loop->used_nodes()) {
-        // Since the value is used by the loop, it must be live somewhere (
-        // either in a register or loadable). The exception is when this value
-        // is created in a generator resume, and the use of it cannot reach the
-        // JumpLoop (e.g. because it returns or deopts on resume).
-        DCHECK_IMPLIES(
-            !input.node()->has_register() && !input.node()->is_loadable(),
-            IsValueFromGeneratorResumeThatDoesNotReachJumpLoop(
-                graph_, input.node(), block));
+        if (!input.node()->has_register() && !input.node()->is_loadable()) {
+          // If the value isn't loadable by the end of a loop (this can happen
+          // e.g. when a deferred throw doesn't spill it, and an exception
+          // handler drops the value)
+          Spill(input.node());
+        }
         UpdateUse(&input);
       }
     }
 
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->Process(node, ProcessingState(block_it_));
     }
   } else {
@@ -943,14 +884,16 @@ void StraightForwardRegisterAllocator::AllocateControlNode(ControlNode* node,
 
     DCHECK(!node->properties().needs_register_snapshot());
 
-    DCHECK_EQ(general_registers_.free() | node->temporaries(),
+    DCHECK_EQ(general_registers_.free() | node->general_temporaries(),
               general_registers_.free());
+    DCHECK_EQ(double_registers_.free() | node->double_temporaries(),
+              double_registers_.free());
 
     general_registers_.clear_blocked();
     double_registers_.clear_blocked();
     VerifyRegisterState();
 
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->Process(node, ProcessingState(block_it_));
     }
 
@@ -984,7 +927,7 @@ void StraightForwardRegisterAllocator::TryAllocateToInput(Phi* phi) {
       if (general_registers_.unblocked_free().has(reg)) {
         phi->result().SetAllocated(ForceAllocate(reg, phi));
         DCHECK_EQ(general_registers_.GetValue(reg), phi);
-        if (FLAG_trace_maglev_regalloc) {
+        if (v8_flags.trace_maglev_regalloc) {
           printing_visitor_->Process(phi, ProcessingState(block_it_));
           printing_visitor_->os()
               << "phi (reuse) " << input.operand() << std::endl;
@@ -1001,7 +944,7 @@ void StraightForwardRegisterAllocator::AddMoveBeforeCurrentNode(
   Node* gap_move;
   if (source.IsConstant()) {
     DCHECK(IsConstantNode(node->opcode()));
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->os()
           << "  constant gap move: " << target << " ← "
           << PrintNodeLabel(graph_labeller(), node) << std::endl;
@@ -1009,7 +952,7 @@ void StraightForwardRegisterAllocator::AddMoveBeforeCurrentNode(
     gap_move =
         Node::New<ConstantGapMove>(compilation_info_->zone(), {}, node, target);
   } else {
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->os() << "  gap move: " << target << " ← "
                               << PrintNodeLabel(graph_labeller(), node) << ":"
                               << source << std::endl;
@@ -1037,7 +980,7 @@ void StraightForwardRegisterAllocator::AddMoveBeforeCurrentNode(
 void StraightForwardRegisterAllocator::Spill(ValueNode* node) {
   if (node->is_loadable()) return;
   AllocateSpillSlot(node);
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os()
         << "  spill: " << node->spill_slot() << " ← "
         << PrintNodeLabel(graph_labeller(), node) << std::endl;
@@ -1053,7 +996,7 @@ void StraightForwardRegisterAllocator::AssignFixedInput(Input& input) {
   switch (operand.extended_policy()) {
     case compiler::UnallocatedOperand::MUST_HAVE_REGISTER:
       // Allocated in AssignArbitraryRegisterInput.
-      if (FLAG_trace_maglev_regalloc) {
+      if (v8_flags.trace_maglev_regalloc) {
         printing_visitor_->os()
             << "- " << PrintNodeLabel(graph_labeller(), input.node())
             << " has arbitrary register\n";
@@ -1062,7 +1005,7 @@ void StraightForwardRegisterAllocator::AssignFixedInput(Input& input) {
 
     case compiler::UnallocatedOperand::REGISTER_OR_SLOT_OR_CONSTANT:
       // Allocated in AssignAnyInput.
-      if (FLAG_trace_maglev_regalloc) {
+      if (v8_flags.trace_maglev_regalloc) {
         printing_visitor_->os()
             << "- " << PrintNodeLabel(graph_labeller(), input.node())
             << " has arbitrary location\n";
@@ -1088,7 +1031,7 @@ void StraightForwardRegisterAllocator::AssignFixedInput(Input& input) {
     case compiler::UnallocatedOperand::MUST_HAVE_SLOT:
       UNREACHABLE();
   }
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os()
         << "- " << PrintNodeLabel(graph_labeller(), input.node())
         << " in forced " << input.operand() << "\n";
@@ -1120,7 +1063,7 @@ void StraightForwardRegisterAllocator::AssignArbitraryRegisterInput(
   ValueNode* node = input.node();
   compiler::InstructionOperand location = node->allocation();
 
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os()
         << "- " << PrintNodeLabel(graph_labeller(), input.node()) << " in "
         << location << "\n";
@@ -1152,7 +1095,7 @@ void StraightForwardRegisterAllocator::AssignAnyInput(Input& input) {
   compiler::InstructionOperand location = node->allocation();
 
   input.InjectLocation(location);
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os()
         << "- " << PrintNodeLabel(graph_labeller(), input.node())
         << " in original " << location << "\n";
@@ -1291,7 +1234,7 @@ void StraightForwardRegisterAllocator::SpillAndClearRegisters(
   while (registers.used() != registers.empty()) {
     RegisterT reg = registers.used().first();
     ValueNode* node = registers.GetValue(reg);
-    if (FLAG_trace_maglev_regalloc) {
+    if (v8_flags.trace_maglev_regalloc) {
       printing_visitor_->os() << "  clearing registers with "
                               << PrintNodeLabel(graph_labeller(), node) << "\n";
     }
@@ -1328,7 +1271,7 @@ void StraightForwardRegisterAllocator::AllocateSpillSlot(ValueNode* node) {
   // architectures.
   SpillSlots& slots = is_tagged ? tagged_ : untagged_;
   MachineRepresentation representation = node->GetMachineRepresentation();
-  if (!FLAG_maglev_reuse_stack_slots || slots.free_slots.empty()) {
+  if (!v8_flags.maglev_reuse_stack_slots || slots.free_slots.empty()) {
     free_slot = slots.top++;
   } else {
     NodeIdT start = node->live_range().start;
@@ -1352,7 +1295,7 @@ template <typename RegisterT>
 RegisterT StraightForwardRegisterAllocator::PickRegisterToFree(
     RegListBase<RegisterT> reserved) {
   RegisterFrameState<RegisterT>& registers = GetRegisterFrameState<RegisterT>();
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os() << "  need to free a register... ";
   }
   int furthest_use = 0;
@@ -1373,7 +1316,7 @@ RegisterT StraightForwardRegisterAllocator::PickRegisterToFree(
       best = reg;
     }
   }
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os()
         << "  chose " << best << " with next use " << furthest_use << "\n";
   }
@@ -1448,7 +1391,7 @@ template <typename RegisterT>
 compiler::AllocatedOperand StraightForwardRegisterAllocator::ForceAllocate(
     RegisterFrameState<RegisterT>& registers, RegisterT reg, ValueNode* node) {
   DCHECK(!registers.is_blocked(reg));
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os()
         << "  forcing " << reg << " to "
         << PrintNodeLabel(graph_labeller(), node) << "...\n";
@@ -1533,57 +1476,81 @@ compiler::AllocatedOperand RegisterFrameState<RegisterT>::AllocateRegister(
                                     reg.code());
 }
 
-void StraightForwardRegisterAllocator::AssignFixedTemporaries(NodeBase* node) {
-  // TODO(victorgomes): Support double registers as temporaries.
-  RegList fixed_temporaries = node->temporaries();
+template <typename RegisterT>
+void StraightForwardRegisterAllocator::AssignFixedTemporaries(
+    RegisterFrameState<RegisterT>& registers, NodeBase* node) {
+  RegListBase<RegisterT> fixed_temporaries = node->temporaries<RegisterT>();
 
   // Make sure that any initially set temporaries are definitely free.
-  for (Register reg : fixed_temporaries) {
-    DCHECK(!general_registers_.is_blocked(reg));
-    if (!general_registers_.free().has(reg)) {
-      DropRegisterValue(general_registers_, reg);
-      general_registers_.AddToFree(reg);
+  for (RegisterT reg : fixed_temporaries) {
+    DCHECK(!registers.is_blocked(reg));
+    if (!registers.free().has(reg)) {
+      DropRegisterValue(registers, reg);
+      registers.AddToFree(reg);
     }
-    general_registers_.block(reg);
+    registers.block(reg);
   }
 
-  if (FLAG_trace_maglev_regalloc) {
-    printing_visitor_->os()
-        << "Fixed temporaries: " << fixed_temporaries << "\n";
+  if (v8_flags.trace_maglev_regalloc && !fixed_temporaries.is_empty()) {
+    if constexpr (std::is_same_v<RegisterT, Register>) {
+      printing_visitor_->os()
+          << "Fixed Temporaries: " << fixed_temporaries << "\n";
+    } else {
+      printing_visitor_->os()
+          << "Fixed Double Temporaries: " << fixed_temporaries << "\n";
+    }
   }
 }
 
+void StraightForwardRegisterAllocator::AssignFixedTemporaries(NodeBase* node) {
+  AssignFixedTemporaries(general_registers_, node);
+  AssignFixedTemporaries(double_registers_, node);
+}
+
+template <typename RegisterT>
 void StraightForwardRegisterAllocator::AssignArbitraryTemporaries(
-    NodeBase* node) {
-  int num_temporaries_needed = node->num_temporaries_needed();
+    RegisterFrameState<RegisterT>& registers, NodeBase* node) {
+  int num_temporaries_needed = node->num_temporaries_needed<RegisterT>();
   if (num_temporaries_needed == 0) return;
 
-  RegList temporaries = node->temporaries();
+  DCHECK_GT(num_temporaries_needed, 0);
+  RegListBase<RegisterT> temporaries = node->temporaries<RegisterT>();
+  int remaining_temporaries_needed = num_temporaries_needed;
 
-  // TODO(victorgomes): Support double registers as temporaries.
-  for (Register reg : general_registers_.unblocked_free()) {
-    general_registers_.block(reg);
+  for (RegisterT reg : registers.unblocked_free()) {
+    registers.block(reg);
     DCHECK(!temporaries.has(reg));
     temporaries.set(reg);
-    if (--num_temporaries_needed == 0) break;
+    if (--remaining_temporaries_needed == 0) break;
   }
 
   // Free extra registers if necessary.
-  for (int i = 0; i < num_temporaries_needed; ++i) {
-    DCHECK(general_registers_.UnblockedFreeIsEmpty());
-    Register reg = FreeUnblockedRegister<Register>();
-    general_registers_.block(reg);
+  for (int i = 0; i < remaining_temporaries_needed; ++i) {
+    DCHECK(registers.UnblockedFreeIsEmpty());
+    RegisterT reg = FreeUnblockedRegister<RegisterT>();
+    registers.block(reg);
     DCHECK(!temporaries.has(reg));
     temporaries.set(reg);
   }
 
-  DCHECK_GE(temporaries.Count(), node->num_temporaries_needed());
+  DCHECK_GE(temporaries.Count(), num_temporaries_needed);
+
   node->assign_temporaries(temporaries);
-  if (FLAG_trace_maglev_regalloc) {
-    printing_visitor_->os() << "Temporaries: " << temporaries << "\n";
+  if (v8_flags.trace_maglev_regalloc) {
+    if constexpr (std::is_same_v<RegisterT, Register>) {
+      printing_visitor_->os() << "Temporaries: " << temporaries << "\n";
+    } else {
+      printing_visitor_->os() << "Double Temporaries: " << temporaries << "\n";
+    }
   }
 }
 
+void StraightForwardRegisterAllocator::AssignArbitraryTemporaries(
+    NodeBase* node) {
+  AssignArbitraryTemporaries(general_registers_, node);
+  AssignArbitraryTemporaries(double_registers_, node);
+}
+
 namespace {
 template <typename RegisterT>
 void ClearRegisterState(RegisterFrameState<RegisterT>& registers) {
@@ -1711,7 +1678,7 @@ void StraightForwardRegisterAllocator::MergeRegisterValues(ControlNode* control,
     return InitializeBranchTargetRegisterValues(control, target);
   }
 
-  if (FLAG_trace_maglev_regalloc) {
+  if (v8_flags.trace_maglev_regalloc) {
     printing_visitor_->os() << "Merging registers...\n";
   }
 
@@ -1735,7 +1702,7 @@ void StraightForwardRegisterAllocator::MergeRegisterValues(ControlNode* control,
     if (!registers.free().has(reg)) {
       incoming = registers.GetValue(reg);
       if (!IsLiveAtTarget(incoming, control, target)) {
-        if (FLAG_trace_maglev_regalloc) {
+        if (v8_flags.trace_maglev_regalloc) {
           printing_visitor_->os() << "  " << reg << " - incoming node "
                                   << PrintNodeLabel(graph_labeller(), incoming)
                                   << " dead at target\n";
@@ -1747,7 +1714,7 @@ void StraightForwardRegisterAllocator::MergeRegisterValues(ControlNode* control,
     if (incoming == node) {
       // We're using the same register as the target already has. If registers
       // are merged, add input information.
-      if (FLAG_trace_maglev_regalloc) {
+      if (v8_flags.trace_maglev_regalloc) {
         if (node) {
           printing_visitor_->os()
               << "  " << reg << " - incoming node same as node: "
@@ -1762,7 +1729,7 @@ void StraightForwardRegisterAllocator::MergeRegisterValues(ControlNode* control,
       // The register is already occupied with a different node. Figure out
       // where that node is allocated on the incoming branch.
       merge->operand(predecessor_id) = node->allocation();
-      if (FLAG_trace_maglev_regalloc) {
+      if (v8_flags.trace_maglev_regalloc) {
         printing_visitor_->os() << "  " << reg << " - merge: loading "
                                 << PrintNodeLabel(graph_labeller(), node)
                                 << " from " << node->allocation() << " \n";
@@ -1787,7 +1754,7 @@ void StraightForwardRegisterAllocator::MergeRegisterValues(ControlNode* control,
       // containing conversion nodes.
       // DCHECK_IMPLIES(!IsInRegister(target_state, incoming),
       //                incoming->properties().is_conversion());
-      if (FLAG_trace_maglev_regalloc) {
+      if (v8_flags.trace_maglev_regalloc) {
         printing_visitor_->os()
             << "  " << reg << " - can't load incoming "
             << PrintNodeLabel(graph_labeller(), node) << ", bailing out\n";
@@ -1802,7 +1769,7 @@ void StraightForwardRegisterAllocator::MergeRegisterValues(ControlNode* control,
       // over the liveness of the node they are converting.
       // TODO(v8:7700): Overeager DCHECK.
       // DCHECK(node->properties().is_conversion());
-      if (FLAG_trace_maglev_regalloc) {
+      if (v8_flags.trace_maglev_regalloc) {
         printing_visitor_->os() << "  " << reg << " - can't load "
                                 << PrintNodeLabel(graph_labeller(), node)
                                 << ", dropping the merge\n";
@@ -1834,14 +1801,14 @@ void StraightForwardRegisterAllocator::MergeRegisterValues(ControlNode* control,
     // state.
     if (node == nullptr) {
       merge->operand(predecessor_id) = register_info;
-      if (FLAG_trace_maglev_regalloc) {
+      if (v8_flags.trace_maglev_regalloc) {
         printing_visitor_->os() << "  " << reg << " - new merge: loading new "
                                 << PrintNodeLabel(graph_labeller(), incoming)
                                 << " from " << register_info << " \n";
       }
     } else {
       merge->operand(predecessor_id) = node->allocation();
-      if (FLAG_trace_maglev_regalloc) {
+      if (v8_flags.trace_maglev_regalloc) {
         printing_visitor_->os() << "  " << reg << " - new merge: loading "
                                 << PrintNodeLabel(graph_labeller(), node)
                                 << " from " << node->allocation() << " \n";
diff --git a/deps/v8/src/maglev/maglev-regalloc.h b/deps/v8/src/maglev/maglev-regalloc.h
index 081383dd82602f..4d6d4cf5210606 100644
--- a/deps/v8/src/maglev/maglev-regalloc.h
+++ b/deps/v8/src/maglev/maglev-regalloc.h
@@ -142,7 +142,13 @@ class StraightForwardRegisterAllocator {
   void AssignArbitraryRegisterInput(Input& input);
   void AssignAnyInput(Input& input);
   void AssignInputs(NodeBase* node);
+  template <typename RegisterT>
+  void AssignFixedTemporaries(RegisterFrameState<RegisterT>& registers,
+                              NodeBase* node);
   void AssignFixedTemporaries(NodeBase* node);
+  template <typename RegisterT>
+  void AssignArbitraryTemporaries(RegisterFrameState<RegisterT>& registers,
+                                  NodeBase* node);
   void AssignArbitraryTemporaries(NodeBase* node);
   void TryAllocateToInput(Phi* phi);
 
diff --git a/deps/v8/src/maglev/maglev.cc b/deps/v8/src/maglev/maglev.cc
index f4e2275945af48..024175c8408808 100644
--- a/deps/v8/src/maglev/maglev.cc
+++ b/deps/v8/src/maglev/maglev.cc
@@ -13,12 +13,12 @@ namespace internal {
 
 MaybeHandle<CodeT> Maglev::Compile(Isolate* isolate,
                                    Handle<JSFunction> function) {
-  DCHECK(FLAG_maglev);
+  DCHECK(v8_flags.maglev);
   std::unique_ptr<maglev::MaglevCompilationInfo> info =
       maglev::MaglevCompilationInfo::New(isolate, function);
   maglev::MaglevCompiler::Compile(isolate->main_thread_local_isolate(),
                                   info.get());
-  return maglev::MaglevCompiler::GenerateCode(info.get());
+  return maglev::MaglevCompiler::GenerateCode(isolate, info.get());
 }
 
 }  // namespace internal
diff --git a/deps/v8/src/maglev/maglev.h b/deps/v8/src/maglev/maglev.h
index e55df23b156ed9..7207fdec5eabe7 100644
--- a/deps/v8/src/maglev/maglev.h
+++ b/deps/v8/src/maglev/maglev.h
@@ -17,6 +17,8 @@ class JSFunction;
 
 class Maglev : public AllStatic {
  public:
+  // TODO(v8:7700): This entry point is only used for testing. Consider
+  // removing it once BenchMaglev runtime functions are no longer useful.
   static MaybeHandle<CodeT> Compile(Isolate* isolate,
                                     Handle<JSFunction> function);
 };
diff --git a/deps/v8/src/numbers/conversions.cc b/deps/v8/src/numbers/conversions.cc
index 902fb53bdcdc5b..76f072e4f948c0 100644
--- a/deps/v8/src/numbers/conversions.cc
+++ b/deps/v8/src/numbers/conversions.cc
@@ -1516,6 +1516,11 @@ bool IsSpecialIndex(String string) {
   }
   return true;
 }
+
+float DoubleToFloat32_NoInline(double x) { return DoubleToFloat32(x); }
+
+int32_t DoubleToInt32_NoInline(double x) { return DoubleToInt32(x); }
+
 }  // namespace internal
 }  // namespace v8
 
diff --git a/deps/v8/src/numbers/conversions.h b/deps/v8/src/numbers/conversions.h
index b8d2f63adf5542..cf4ac196909d13 100644
--- a/deps/v8/src/numbers/conversions.h
+++ b/deps/v8/src/numbers/conversions.h
@@ -61,12 +61,14 @@ inline double FastUI2D(unsigned x) {
 
 // This function should match the exact semantics of ECMA-262 20.2.2.17.
 inline float DoubleToFloat32(double x);
+float DoubleToFloat32_NoInline(double x);
 
 // This function should match the exact semantics of ECMA-262 9.4.
 inline double DoubleToInteger(double x);
 
 // This function should match the exact semantics of ECMA-262 9.5.
 inline int32_t DoubleToInt32(double x);
+int32_t DoubleToInt32_NoInline(double x);
 
 // This function should match the exact semantics of ECMA-262 9.6.
 inline uint32_t DoubleToUint32(double x);
diff --git a/deps/v8/src/objects/all-objects-inl.h b/deps/v8/src/objects/all-objects-inl.h
index 568f731f0cf656..b400f843395ec4 100644
--- a/deps/v8/src/objects/all-objects-inl.h
+++ b/deps/v8/src/objects/all-objects-inl.h
@@ -46,6 +46,7 @@
 #include "src/objects/js-objects-inl.h"
 #include "src/objects/js-promise-inl.h"
 #include "src/objects/js-proxy-inl.h"
+#include "src/objects/js-raw-json-inl.h"
 #include "src/objects/js-regexp-inl.h"
 #include "src/objects/js-regexp-string-iterator-inl.h"
 #include "src/objects/js-shadow-realm-inl.h"
@@ -97,6 +98,7 @@
 #include "src/objects/js-collator-inl.h"
 #include "src/objects/js-date-time-format-inl.h"
 #include "src/objects/js-display-names-inl.h"
+#include "src/objects/js-duration-format-inl.h"
 #include "src/objects/js-list-format-inl.h"
 #include "src/objects/js-locale-inl.h"
 #include "src/objects/js-number-format-inl.h"
diff --git a/deps/v8/src/objects/backing-store.cc b/deps/v8/src/objects/backing-store.cc
index 7a9baa0f3662d6..1265accb248d78 100644
--- a/deps/v8/src/objects/backing-store.cc
+++ b/deps/v8/src/objects/backing-store.cc
@@ -135,6 +135,21 @@ void BackingStore::Clear() {
   type_specific_data_.v8_api_array_buffer_allocator = nullptr;
 }
 
+void BackingStore::FreeResizableMemory() {
+  DCHECK(free_on_destruct_);
+  DCHECK(!custom_deleter_);
+  DCHECK(is_resizable_by_js_ || is_wasm_memory_);
+  auto region =
+      GetReservedRegion(has_guard_regions_, buffer_start_, byte_capacity_);
+
+  PageAllocator* page_allocator = GetArrayBufferPageAllocator();
+  if (!region.is_empty()) {
+    FreePages(page_allocator, reinterpret_cast<void*>(region.begin()),
+              region.size());
+  }
+  Clear();
+}
+
 BackingStore::BackingStore(void* buffer_start, size_t byte_length,
                            size_t max_byte_length, size_t byte_capacity,
                            SharedFlag shared, ResizableFlag resizable,
@@ -147,7 +162,7 @@ BackingStore::BackingStore(void* buffer_start, size_t byte_length,
       byte_capacity_(byte_capacity),
       id_(next_backing_store_id_.fetch_add(1)),
       is_shared_(shared == SharedFlag::kShared),
-      is_resizable_(resizable == ResizableFlag::kResizable),
+      is_resizable_by_js_(resizable == ResizableFlag::kResizable),
       is_wasm_memory_(is_wasm_memory),
       holds_shared_ptr_to_allocator_(false),
       free_on_destruct_(free_on_destruct),
@@ -156,10 +171,10 @@ BackingStore::BackingStore(void* buffer_start, size_t byte_length,
       custom_deleter_(custom_deleter),
       empty_deleter_(empty_deleter) {
   // TODO(v8:11111): RAB / GSAB - Wasm integration.
-  DCHECK_IMPLIES(is_wasm_memory_, !is_resizable_);
-  DCHECK_IMPLIES(is_resizable_, !custom_deleter_);
-  DCHECK_IMPLIES(is_resizable_, free_on_destruct_);
-  DCHECK_IMPLIES(!is_wasm_memory && !is_resizable_,
+  DCHECK_IMPLIES(is_wasm_memory_, !is_resizable_by_js_);
+  DCHECK_IMPLIES(is_resizable_by_js_, !custom_deleter_);
+  DCHECK_IMPLIES(is_resizable_by_js_, free_on_destruct_);
+  DCHECK_IMPLIES(!is_wasm_memory && !is_resizable_by_js_,
                  byte_length_ == max_byte_length_);
   DCHECK_GE(max_byte_length_, byte_length_);
   DCHECK_GE(byte_capacity_, max_byte_length_);
@@ -173,14 +188,10 @@ BackingStore::~BackingStore() {
     return;
   }
 
-  PageAllocator* page_allocator = GetArrayBufferPageAllocator();
-
 #if V8_ENABLE_WEBASSEMBLY
   if (is_wasm_memory_) {
     // TODO(v8:11111): RAB / GSAB - Wasm integration.
-    DCHECK(!is_resizable_);
-    DCHECK(free_on_destruct_);
-    DCHECK(!custom_deleter_);
+    DCHECK(!is_resizable_by_js_);
     size_t reservation_size =
         GetReservationSize(has_guard_regions_, byte_capacity_);
     TRACE_BS(
@@ -192,31 +203,14 @@ BackingStore::~BackingStore() {
       delete shared_data;
       type_specific_data_.shared_wasm_memory_data = nullptr;
     }
-
     // Wasm memories are always allocated through the page allocator.
-    auto region =
-        GetReservedRegion(has_guard_regions_, buffer_start_, byte_capacity_);
-
-    if (!region.is_empty()) {
-      FreePages(page_allocator, reinterpret_cast<void*>(region.begin()),
-                region.size());
-    }
-    Clear();
+    FreeResizableMemory();
     return;
   }
 #endif  // V8_ENABLE_WEBASSEMBLY
 
-  if (is_resizable_) {
-    DCHECK(free_on_destruct_);
-    DCHECK(!custom_deleter_);
-    auto region =
-        GetReservedRegion(has_guard_regions_, buffer_start_, byte_capacity_);
-
-    if (!region.is_empty()) {
-      FreePages(page_allocator, reinterpret_cast<void*>(region.begin()),
-                region.size());
-    }
-    Clear();
+  if (is_resizable_by_js_) {
+    FreeResizableMemory();
     return;
   }
   if (custom_deleter_) {
@@ -280,6 +274,14 @@ std::unique_ptr<BackingStore> BackingStore::Allocate(
       counters->array_buffer_new_size_failures()->AddSample(mb_length);
       return {};
     }
+#ifdef V8_ENABLE_SANDBOX
+    // Check to catch use of a non-sandbox-compatible ArrayBufferAllocator.
+    CHECK_WITH_MSG(GetProcessWideSandbox()->Contains(buffer_start),
+                   "When the V8 Sandbox is enabled, ArrayBuffer backing stores "
+                   "must be allocated inside the sandbox address space. Please "
+                   "use an appropriate ArrayBuffer::Allocator to allocate "
+                   "these buffers, or disable the sandbox.");
+#endif
   }
 
   auto result = new BackingStore(buffer_start,                  // start
diff --git a/deps/v8/src/objects/backing-store.h b/deps/v8/src/objects/backing-store.h
index e91ef178bfbb0e..699e2c1f314857 100644
--- a/deps/v8/src/objects/backing-store.h
+++ b/deps/v8/src/objects/backing-store.h
@@ -95,7 +95,7 @@ class V8_EXPORT_PRIVATE BackingStore : public BackingStoreBase {
   size_t max_byte_length() const { return max_byte_length_; }
   size_t byte_capacity() const { return byte_capacity_; }
   bool is_shared() const { return is_shared_; }
-  bool is_resizable() const { return is_resizable_; }
+  bool is_resizable_by_js() const { return is_resizable_by_js_; }
   bool is_wasm_memory() const { return is_wasm_memory_; }
   bool has_guard_regions() const { return has_guard_regions_; }
   bool free_on_destruct() const { return free_on_destruct_; }
@@ -112,7 +112,8 @@ class V8_EXPORT_PRIVATE BackingStore : public BackingStoreBase {
 
   bool CanReallocate() const {
     return !is_wasm_memory_ && !custom_deleter_ && !globally_registered_ &&
-           free_on_destruct_ && !is_resizable_ && buffer_start_ != nullptr;
+           free_on_destruct_ && !is_resizable_by_js_ &&
+           buffer_start_ != nullptr;
   }
 
   // Wrapper around ArrayBuffer::Allocator::Reallocate.
@@ -223,7 +224,7 @@ class V8_EXPORT_PRIVATE BackingStore : public BackingStoreBase {
 
   bool is_shared_ : 1;
   // Backing stores for (Resizable|GrowableShared)ArrayBuffer
-  bool is_resizable_ : 1;
+  bool is_resizable_by_js_ : 1;
   bool is_wasm_memory_ : 1;
   bool holds_shared_ptr_to_allocator_ : 1;
   bool free_on_destruct_ : 1;
@@ -236,6 +237,7 @@ class V8_EXPORT_PRIVATE BackingStore : public BackingStoreBase {
   v8::ArrayBuffer::Allocator* get_v8_api_array_buffer_allocator();
   SharedWasmMemoryData* get_shared_wasm_memory_data();
 
+  void FreeResizableMemory();  // Free the reserved region for resizable memory
   void Clear();  // Internally clears fields after deallocation.
 };
 
diff --git a/deps/v8/src/objects/bigint.cc b/deps/v8/src/objects/bigint.cc
index 191603d08518ff..ffc4e2a6ee84ee 100644
--- a/deps/v8/src/objects/bigint.cc
+++ b/deps/v8/src/objects/bigint.cc
@@ -319,14 +319,19 @@ void MutableBigInt::Canonicalize(MutableBigInt result) {
   while (new_length > 0 && result.digit(new_length - 1) == 0) new_length--;
   int to_trim = old_length - new_length;
   if (to_trim != 0) {
-    int size_delta = to_trim * MutableBigInt::kDigitSize;
-    Address new_end = result.address() + BigInt::SizeFor(new_length);
     Heap* heap = result.GetHeap();
     if (!heap->IsLargeObject(result)) {
       // We do not create a filler for objects in large object space.
       // TODO(hpayer): We should shrink the large object page if the size
       // of the object changed significantly.
-      heap->CreateFillerObjectAt(new_end, size_delta);
+      int old_size = ALIGN_TO_ALLOCATION_ALIGNMENT(BigInt::SizeFor(old_length));
+      int new_size = ALIGN_TO_ALLOCATION_ALIGNMENT(BigInt::SizeFor(new_length));
+      if (!V8_COMPRESS_POINTERS_8GB_BOOL || new_size < old_size) {
+        // A non-zero to_trim already guarantees that the sizes are different,
+        // but their aligned values can be equal.
+        Address new_end = result.address() + new_size;
+        heap->CreateFillerObjectAt(new_end, old_size - new_size);
+      }
     }
     result.set_length(new_length, kReleaseStore);
 
@@ -996,8 +1001,10 @@ MaybeHandle<String> BigInt::ToString(Isolate* isolate, Handle<BigInt> bigint,
   // estimates).
   if (chars_written < chars_allocated) {
     result->set_length(chars_written, kReleaseStore);
-    int string_size = SeqOneByteString::SizeFor(chars_allocated);
-    int needed_size = SeqOneByteString::SizeFor(chars_written);
+    int string_size = ALIGN_TO_ALLOCATION_ALIGNMENT(
+        SeqOneByteString::SizeFor(chars_allocated));
+    int needed_size =
+        ALIGN_TO_ALLOCATION_ALIGNMENT(SeqOneByteString::SizeFor(chars_written));
     if (needed_size < string_size && !isolate->heap()->IsLargeObject(*result)) {
       Address new_end = result->address() + needed_size;
       isolate->heap()->CreateFillerObjectAt(new_end,
@@ -1626,10 +1633,11 @@ void MutableBigInt_AbsoluteSubAndCanonicalize(Address result_addr,
   MutableBigInt::Canonicalize(result);
 }
 
-// Returns true if it succeeded to obtain the result of multiplication.
-// Returns false if the computation is interrupted.
-bool MutableBigInt_AbsoluteMulAndCanonicalize(Address result_addr,
-                                              Address x_addr, Address y_addr) {
+// Returns 0 if it succeeded to obtain the result of multiplication.
+// Returns 1 if the computation is interrupted.
+int32_t MutableBigInt_AbsoluteMulAndCanonicalize(Address result_addr,
+                                                 Address x_addr,
+                                                 Address y_addr) {
   BigInt x = BigInt::cast(Object(x_addr));
   BigInt y = BigInt::cast(Object(y_addr));
   MutableBigInt result = MutableBigInt::cast(Object(result_addr));
@@ -1643,15 +1651,16 @@ bool MutableBigInt_AbsoluteMulAndCanonicalize(Address result_addr,
   bigint::Status status = isolate->bigint_processor()->Multiply(
       GetRWDigits(result), GetDigits(x), GetDigits(y));
   if (status == bigint::Status::kInterrupted) {
-    return false;
+    return 1;
   }
 
   MutableBigInt::Canonicalize(result);
-  return true;
+  return 0;
 }
 
-bool MutableBigInt_AbsoluteDivAndCanonicalize(Address result_addr,
-                                              Address x_addr, Address y_addr) {
+int32_t MutableBigInt_AbsoluteDivAndCanonicalize(Address result_addr,
+                                                 Address x_addr,
+                                                 Address y_addr) {
   BigInt x = BigInt::cast(Object(x_addr));
   BigInt y = BigInt::cast(Object(y_addr));
   MutableBigInt result = MutableBigInt::cast(Object(result_addr));
@@ -1667,11 +1676,11 @@ bool MutableBigInt_AbsoluteDivAndCanonicalize(Address result_addr,
   bigint::Status status = isolate->bigint_processor()->Divide(
       GetRWDigits(result), GetDigits(x), GetDigits(y));
   if (status == bigint::Status::kInterrupted) {
-    return false;
+    return 1;
   }
 
   MutableBigInt::Canonicalize(result);
-  return true;
+  return 0;
 }
 
 void MutableBigInt_BitwiseAndPosPosAndCanonicalize(Address result_addr,
diff --git a/deps/v8/src/objects/bigint.h b/deps/v8/src/objects/bigint.h
index 04de48fbf95f95..5ebd2a423a51d6 100644
--- a/deps/v8/src/objects/bigint.h
+++ b/deps/v8/src/objects/bigint.h
@@ -26,10 +26,12 @@ void MutableBigInt_AbsoluteAddAndCanonicalize(Address result_addr,
 int32_t MutableBigInt_AbsoluteCompare(Address x_addr, Address y_addr);
 void MutableBigInt_AbsoluteSubAndCanonicalize(Address result_addr,
                                               Address x_addr, Address y_addr);
-bool MutableBigInt_AbsoluteMulAndCanonicalize(Address result_addr,
-                                              Address x_addr, Address y_addr);
-bool MutableBigInt_AbsoluteDivAndCanonicalize(Address result_addr,
-                                              Address x_addr, Address y_addr);
+int32_t MutableBigInt_AbsoluteMulAndCanonicalize(Address result_addr,
+                                                 Address x_addr,
+                                                 Address y_addr);
+int32_t MutableBigInt_AbsoluteDivAndCanonicalize(Address result_addr,
+                                                 Address x_addr,
+                                                 Address y_addr);
 void MutableBigInt_BitwiseAndPosPosAndCanonicalize(Address result_addr,
                                                    Address x_addr,
                                                    Address y_addr);
diff --git a/deps/v8/src/objects/code-inl.h b/deps/v8/src/objects/code-inl.h
index 2677c203beda56..1c631363d4aba8 100644
--- a/deps/v8/src/objects/code-inl.h
+++ b/deps/v8/src/objects/code-inl.h
@@ -787,7 +787,7 @@ bool CodeDataContainer::has_handler_table() const {
 
 int Code::constant_pool_size() const {
   const int size = code_comments_offset() - constant_pool_offset();
-  if (!v8_flags.enable_embedded_constant_pool) {
+  if (!V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     DCHECK_EQ(size, 0);
     return 0;
   }
@@ -1232,7 +1232,7 @@ bool CodeDataContainer::is_wasm_code() const {
 #endif
 
 int Code::constant_pool_offset() const {
-  if (!v8_flags.enable_embedded_constant_pool) {
+  if (!V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     // Redirection needed since the field doesn't exist in this case.
     return code_comments_offset();
   }
@@ -1240,7 +1240,7 @@ int Code::constant_pool_offset() const {
 }
 
 void Code::set_constant_pool_offset(int value) {
-  if (!v8_flags.enable_embedded_constant_pool) {
+  if (!V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     // Redirection needed since the field doesn't exist in this case.
     return;
   }
@@ -1436,15 +1436,21 @@ Object CodeDataContainer::raw_code() const {
 }
 
 Object CodeDataContainer::raw_code(PtrComprCageBase cage_base) const {
-  CHECK(V8_EXTERNAL_CODE_SPACE_BOOL);
-  Object value = TaggedField<Object, kCodeOffset>::load(cage_base, *this);
+#ifdef V8_EXTERNAL_CODE_SPACE
+  Object value = ExternalCodeField::load(cage_base, *this);
   return value;
+#else
+  UNREACHABLE();
+#endif  // V8_EXTERNAL_CODE_SPACE
 }
 
 void CodeDataContainer::set_raw_code(Object value, WriteBarrierMode mode) {
-  CHECK(V8_EXTERNAL_CODE_SPACE_BOOL);
-  TaggedField<Object, kCodeOffset>::Release_Store(*this, value);
+#ifdef V8_EXTERNAL_CODE_SPACE
+  ExternalCodeField::Release_Store(*this, value);
   CONDITIONAL_WRITE_BARRIER(*this, kCodeOffset, value, mode);
+#else
+  UNREACHABLE();
+#endif  // V8_EXTERNAL_CODE_SPACE
 }
 
 Object CodeDataContainer::raw_code(RelaxedLoadTag tag) const {
@@ -1454,10 +1460,12 @@ Object CodeDataContainer::raw_code(RelaxedLoadTag tag) const {
 
 Object CodeDataContainer::raw_code(PtrComprCageBase cage_base,
                                    RelaxedLoadTag) const {
-  Object value =
-      TaggedField<Object, kCodeOffset>::Relaxed_Load(cage_base, *this);
-  CHECK(V8_EXTERNAL_CODE_SPACE_BOOL);
+#ifdef V8_EXTERNAL_CODE_SPACE
+  Object value = ExternalCodeField::Relaxed_Load(cage_base, *this);
   return value;
+#else
+  UNREACHABLE();
+#endif  // V8_EXTERNAL_CODE_SPACE
 }
 
 ACCESSORS(CodeDataContainer, next_code_link, Object, kNextCodeLinkOffset)
diff --git a/deps/v8/src/objects/code.cc b/deps/v8/src/objects/code.cc
index 37092fd10b2cbc..46d9edb47127b2 100644
--- a/deps/v8/src/objects/code.cc
+++ b/deps/v8/src/objects/code.cc
@@ -215,10 +215,6 @@ void Code::RelocateFromDesc(ByteArray reloc_info, Heap* heap,
       it.rinfo()->set_target_address(p, UPDATE_WRITE_BARRIER,
                                      SKIP_ICACHE_FLUSH);
       DCHECK_EQ(p, it.rinfo()->target_address());
-    } else if (RelocInfo::IsRuntimeEntry(mode)) {
-      Address p = it.rinfo()->target_runtime_entry(origin);
-      it.rinfo()->set_target_runtime_entry(p, UPDATE_WRITE_BARRIER,
-                                           SKIP_ICACHE_FLUSH);
     } else {
       intptr_t delta =
           raw_instruction_start() - reinterpret_cast<Address>(desc.buffer);
@@ -369,12 +365,10 @@ bool Code::IsIsolateIndependent(Isolate* isolate) {
                  RelocInfo::ModeMask(RelocInfo::RELATIVE_CODE_TARGET) |
                  RelocInfo::ModeMask(RelocInfo::COMPRESSED_EMBEDDED_OBJECT) |
                  RelocInfo::ModeMask(RelocInfo::FULL_EMBEDDED_OBJECT) |
-                 RelocInfo::ModeMask(RelocInfo::DATA_EMBEDDED_OBJECT) |
                  RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
                  RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
                  RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
                  RelocInfo::ModeMask(RelocInfo::NEAR_BUILTIN_ENTRY) |
-                 RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
                  RelocInfo::ModeMask(RelocInfo::WASM_CALL) |
                  RelocInfo::ModeMask(RelocInfo::WASM_STUB_CALL)));
 
diff --git a/deps/v8/src/objects/code.h b/deps/v8/src/objects/code.h
index 83fbf06369ddf3..65720ab7c68162 100644
--- a/deps/v8/src/objects/code.h
+++ b/deps/v8/src/objects/code.h
@@ -266,6 +266,11 @@ class CodeDataContainer : public HeapObject {
   DEFINE_FIELD_OFFSET_CONSTANTS(HeapObject::kHeaderSize, CODE_DATA_FIELDS)
 #undef CODE_DATA_FIELDS
 
+#ifdef V8_EXTERNAL_CODE_SPACE
+  using ExternalCodeField =
+      TaggedField<Object, kCodeOffset, ExternalCodeCompressionScheme>;
+#endif
+
   class BodyDescriptor;
 
   // Flags layout.
@@ -728,8 +733,7 @@ class Code : public HeapObject {
   V(kOsrOffsetOffset, kInt32Size)                                             \
   /* Offsets describing inline metadata tables, relative to MetadataStart. */ \
   V(kHandlerTableOffsetOffset, kIntSize)                                      \
-  V(kConstantPoolOffsetOffset,                                                \
-    v8_flags.enable_embedded_constant_pool.value() ? kIntSize : 0)            \
+  V(kConstantPoolOffsetOffset, V8_EMBEDDED_CONSTANT_POOL_BOOL ? kIntSize : 0) \
   V(kCodeCommentsOffsetOffset, kIntSize)                                      \
   V(kUnwindingInfoOffsetOffset, kInt32Size)                                   \
   V(kUnalignedHeaderSize, 0)                                                  \
@@ -761,9 +765,8 @@ class Code : public HeapObject {
   static constexpr int kHeaderPaddingSize = 8;
 #elif V8_TARGET_ARCH_PPC64
   static constexpr int kHeaderPaddingSize =
-      v8_flags.enable_embedded_constant_pool.value()
-          ? (COMPRESS_POINTERS_BOOL ? 4 : 48)
-          : (COMPRESS_POINTERS_BOOL ? 8 : 52);
+      V8_EMBEDDED_CONSTANT_POOL_BOOL ? (COMPRESS_POINTERS_BOOL ? 4 : 48)
+                                     : (COMPRESS_POINTERS_BOOL ? 8 : 52);
 #elif V8_TARGET_ARCH_S390X
   static constexpr int kHeaderPaddingSize = COMPRESS_POINTERS_BOOL ? 8 : 20;
 #elif V8_TARGET_ARCH_RISCV64
diff --git a/deps/v8/src/objects/compressed-slots-inl.h b/deps/v8/src/objects/compressed-slots-inl.h
index 0f99810219e0f9..1f1f0530bee9bf 100644
--- a/deps/v8/src/objects/compressed-slots-inl.h
+++ b/deps/v8/src/objects/compressed-slots-inl.h
@@ -11,8 +11,7 @@
 #include "src/objects/compressed-slots.h"
 #include "src/objects/maybe-object-inl.h"
 
-namespace v8 {
-namespace internal {
+namespace v8::internal {
 
 //
 // CompressedObjectSlot implementation.
@@ -36,16 +35,16 @@ bool CompressedObjectSlot::contains_map_value(Address raw_value) const {
 
 Object CompressedObjectSlot::operator*() const {
   Tagged_t value = *location();
-  return Object(DecompressTaggedAny(address(), value));
+  return Object(TCompressionScheme::DecompressTaggedAny(address(), value));
 }
 
 Object CompressedObjectSlot::load(PtrComprCageBase cage_base) const {
   Tagged_t value = *location();
-  return Object(DecompressTaggedAny(cage_base, value));
+  return Object(TCompressionScheme::DecompressTaggedAny(cage_base, value));
 }
 
 void CompressedObjectSlot::store(Object value) const {
-  *location() = CompressTagged(value.ptr());
+  *location() = TCompressionScheme::CompressTagged(value.ptr());
 }
 
 void CompressedObjectSlot::store_map(Map map) const {
@@ -64,36 +63,36 @@ Map CompressedObjectSlot::load_map() const {
 
 Object CompressedObjectSlot::Acquire_Load() const {
   AtomicTagged_t value = AsAtomicTagged::Acquire_Load(location());
-  return Object(DecompressTaggedAny(address(), value));
+  return Object(TCompressionScheme::DecompressTaggedAny(address(), value));
 }
 
 Object CompressedObjectSlot::Relaxed_Load() const {
   AtomicTagged_t value = AsAtomicTagged::Relaxed_Load(location());
-  return Object(DecompressTaggedAny(address(), value));
+  return Object(TCompressionScheme::DecompressTaggedAny(address(), value));
 }
 
 Object CompressedObjectSlot::Relaxed_Load(PtrComprCageBase cage_base) const {
   AtomicTagged_t value = AsAtomicTagged::Relaxed_Load(location());
-  return Object(DecompressTaggedAny(cage_base, value));
+  return Object(TCompressionScheme::DecompressTaggedAny(cage_base, value));
 }
 
 void CompressedObjectSlot::Relaxed_Store(Object value) const {
-  Tagged_t ptr = CompressTagged(value.ptr());
+  Tagged_t ptr = TCompressionScheme::CompressTagged(value.ptr());
   AsAtomicTagged::Relaxed_Store(location(), ptr);
 }
 
 void CompressedObjectSlot::Release_Store(Object value) const {
-  Tagged_t ptr = CompressTagged(value.ptr());
+  Tagged_t ptr = TCompressionScheme::CompressTagged(value.ptr());
   AsAtomicTagged::Release_Store(location(), ptr);
 }
 
 Object CompressedObjectSlot::Release_CompareAndSwap(Object old,
                                                     Object target) const {
-  Tagged_t old_ptr = CompressTagged(old.ptr());
-  Tagged_t target_ptr = CompressTagged(target.ptr());
+  Tagged_t old_ptr = TCompressionScheme::CompressTagged(old.ptr());
+  Tagged_t target_ptr = TCompressionScheme::CompressTagged(target.ptr());
   Tagged_t result =
       AsAtomicTagged::Release_CompareAndSwap(location(), old_ptr, target_ptr);
-  return Object(DecompressTaggedAny(address(), result));
+  return Object(TCompressionScheme::DecompressTaggedAny(address(), result));
 }
 
 //
@@ -102,38 +101,38 @@ Object CompressedObjectSlot::Release_CompareAndSwap(Object old,
 
 MaybeObject CompressedMaybeObjectSlot::operator*() const {
   Tagged_t value = *location();
-  return MaybeObject(DecompressTaggedAny(address(), value));
+  return MaybeObject(TCompressionScheme::DecompressTaggedAny(address(), value));
 }
 
 MaybeObject CompressedMaybeObjectSlot::load(PtrComprCageBase cage_base) const {
   Tagged_t value = *location();
-  return MaybeObject(DecompressTaggedAny(cage_base, value));
+  return MaybeObject(TCompressionScheme::DecompressTaggedAny(cage_base, value));
 }
 
 void CompressedMaybeObjectSlot::store(MaybeObject value) const {
-  *location() = CompressTagged(value.ptr());
+  *location() = TCompressionScheme::CompressTagged(value.ptr());
 }
 
 MaybeObject CompressedMaybeObjectSlot::Relaxed_Load() const {
   AtomicTagged_t value = AsAtomicTagged::Relaxed_Load(location());
-  return MaybeObject(DecompressTaggedAny(address(), value));
+  return MaybeObject(TCompressionScheme::DecompressTaggedAny(address(), value));
 }
 
 MaybeObject CompressedMaybeObjectSlot::Relaxed_Load(
     PtrComprCageBase cage_base) const {
   AtomicTagged_t value = AsAtomicTagged::Relaxed_Load(location());
-  return MaybeObject(DecompressTaggedAny(cage_base, value));
+  return MaybeObject(TCompressionScheme::DecompressTaggedAny(cage_base, value));
 }
 
 void CompressedMaybeObjectSlot::Relaxed_Store(MaybeObject value) const {
-  Tagged_t ptr = CompressTagged(value.ptr());
+  Tagged_t ptr = TCompressionScheme::CompressTagged(value.ptr());
   AsAtomicTagged::Relaxed_Store(location(), ptr);
 }
 
 void CompressedMaybeObjectSlot::Release_CompareAndSwap(
     MaybeObject old, MaybeObject target) const {
-  Tagged_t old_ptr = CompressTagged(old.ptr());
-  Tagged_t target_ptr = CompressTagged(target.ptr());
+  Tagged_t old_ptr = TCompressionScheme::CompressTagged(old.ptr());
+  Tagged_t target_ptr = TCompressionScheme::CompressTagged(target.ptr());
   AsAtomicTagged::Release_CompareAndSwap(location(), old_ptr, target_ptr);
 }
 
@@ -143,73 +142,86 @@ void CompressedMaybeObjectSlot::Release_CompareAndSwap(
 
 HeapObjectReference CompressedHeapObjectSlot::operator*() const {
   Tagged_t value = *location();
-  return HeapObjectReference(DecompressTaggedPointer(address(), value));
+  return HeapObjectReference(
+      TCompressionScheme::DecompressTaggedPointer(address(), value));
 }
 
 HeapObjectReference CompressedHeapObjectSlot::load(
     PtrComprCageBase cage_base) const {
   Tagged_t value = *location();
-  return HeapObjectReference(DecompressTaggedPointer(cage_base, value));
+  return HeapObjectReference(
+      TCompressionScheme::DecompressTaggedPointer(cage_base, value));
 }
 
 void CompressedHeapObjectSlot::store(HeapObjectReference value) const {
-  *location() = CompressTagged(value.ptr());
+  *location() = TCompressionScheme::CompressTagged(value.ptr());
 }
 
 HeapObject CompressedHeapObjectSlot::ToHeapObject() const {
   Tagged_t value = *location();
   DCHECK(HAS_STRONG_HEAP_OBJECT_TAG(value));
-  return HeapObject::cast(Object(DecompressTaggedPointer(address(), value)));
+  return HeapObject::cast(
+      Object(TCompressionScheme::DecompressTaggedPointer(address(), value)));
 }
 
 void CompressedHeapObjectSlot::StoreHeapObject(HeapObject value) const {
-  *location() = CompressTagged(value.ptr());
+  *location() = TCompressionScheme::CompressTagged(value.ptr());
 }
 
 //
 // OffHeapCompressedObjectSlot implementation.
 //
 
-Object OffHeapCompressedObjectSlot::load(PtrComprCageBase cage_base) const {
-  Tagged_t value = *location();
-  return Object(DecompressTaggedAny(cage_base, value));
+template <typename CompressionScheme>
+Object OffHeapCompressedObjectSlot<CompressionScheme>::load(
+    PtrComprCageBase cage_base) const {
+  Tagged_t value = *TSlotBase::location();
+  return Object(CompressionScheme::DecompressTaggedAny(cage_base, value));
 }
 
-void OffHeapCompressedObjectSlot::store(Object value) const {
-  *location() = CompressTagged(value.ptr());
+template <typename CompressionScheme>
+void OffHeapCompressedObjectSlot<CompressionScheme>::store(Object value) const {
+  *TSlotBase::location() = CompressionScheme::CompressTagged(value.ptr());
 }
 
-Object OffHeapCompressedObjectSlot::Relaxed_Load(
+template <typename CompressionScheme>
+Object OffHeapCompressedObjectSlot<CompressionScheme>::Relaxed_Load(
     PtrComprCageBase cage_base) const {
-  AtomicTagged_t value = AsAtomicTagged::Relaxed_Load(location());
-  return Object(DecompressTaggedAny(cage_base, value));
+  AtomicTagged_t value = AsAtomicTagged::Relaxed_Load(TSlotBase::location());
+  return Object(CompressionScheme::DecompressTaggedAny(cage_base, value));
 }
 
-Object OffHeapCompressedObjectSlot::Acquire_Load(
+template <typename CompressionScheme>
+Object OffHeapCompressedObjectSlot<CompressionScheme>::Acquire_Load(
     PtrComprCageBase cage_base) const {
-  AtomicTagged_t value = AsAtomicTagged::Acquire_Load(location());
-  return Object(DecompressTaggedAny(cage_base, value));
+  AtomicTagged_t value = AsAtomicTagged::Acquire_Load(TSlotBase::location());
+  return Object(CompressionScheme::DecompressTaggedAny(cage_base, value));
 }
 
-void OffHeapCompressedObjectSlot::Relaxed_Store(Object value) const {
-  Tagged_t ptr = CompressTagged(value.ptr());
-  AsAtomicTagged::Relaxed_Store(location(), ptr);
+template <typename CompressionScheme>
+void OffHeapCompressedObjectSlot<CompressionScheme>::Relaxed_Store(
+    Object value) const {
+  Tagged_t ptr = CompressionScheme::CompressTagged(value.ptr());
+  AsAtomicTagged::Relaxed_Store(TSlotBase::location(), ptr);
 }
 
-void OffHeapCompressedObjectSlot::Release_Store(Object value) const {
-  Tagged_t ptr = CompressTagged(value.ptr());
-  AsAtomicTagged::Release_Store(location(), ptr);
+template <typename CompressionScheme>
+void OffHeapCompressedObjectSlot<CompressionScheme>::Release_Store(
+    Object value) const {
+  Tagged_t ptr = CompressionScheme::CompressTagged(value.ptr());
+  AsAtomicTagged::Release_Store(TSlotBase::location(), ptr);
 }
 
-void OffHeapCompressedObjectSlot::Release_CompareAndSwap(Object old,
-                                                         Object target) const {
-  Tagged_t old_ptr = CompressTagged(old.ptr());
-  Tagged_t target_ptr = CompressTagged(target.ptr());
-  AsAtomicTagged::Release_CompareAndSwap(location(), old_ptr, target_ptr);
+template <typename CompressionScheme>
+void OffHeapCompressedObjectSlot<CompressionScheme>::Release_CompareAndSwap(
+    Object old, Object target) const {
+  Tagged_t old_ptr = CompressionScheme::CompressTagged(old.ptr());
+  Tagged_t target_ptr = CompressionScheme::CompressTagged(target.ptr());
+  AsAtomicTagged::Release_CompareAndSwap(TSlotBase::location(), old_ptr,
+                                         target_ptr);
 }
 
-}  // namespace internal
-}  // namespace v8
+}  // namespace v8::internal
 
 #endif  // V8_COMPRESS_POINTERS
 
diff --git a/deps/v8/src/objects/compressed-slots.h b/deps/v8/src/objects/compressed-slots.h
index c31856d0a571c6..fd6d9acf484633 100644
--- a/deps/v8/src/objects/compressed-slots.h
+++ b/deps/v8/src/objects/compressed-slots.h
@@ -8,16 +8,19 @@
 #include "include/v8config.h"
 #include "src/objects/slots.h"
 
-namespace v8 {
-namespace internal {
+namespace v8::internal {
 
 #ifdef V8_COMPRESS_POINTERS
+
+class V8HeapCompressionScheme;
+
 // A CompressedObjectSlot instance describes a kTaggedSize-sized field ("slot")
 // holding a compressed tagged pointer (smi or heap object).
 // Its address() is the address of the slot.
 // The slot's contents can be read and written using operator* and store().
 class CompressedObjectSlot : public SlotBase<CompressedObjectSlot, Tagged_t> {
  public:
+  using TCompressionScheme = V8HeapCompressionScheme;
   using TObject = Object;
   using THeapObjectSlot = CompressedHeapObjectSlot;
 
@@ -64,6 +67,7 @@ class CompressedObjectSlot : public SlotBase<CompressedObjectSlot, Tagged_t> {
 class CompressedMaybeObjectSlot
     : public SlotBase<CompressedMaybeObjectSlot, Tagged_t> {
  public:
+  using TCompressionScheme = V8HeapCompressionScheme;
   using TObject = MaybeObject;
   using THeapObjectSlot = CompressedHeapObjectSlot;
 
@@ -100,6 +104,8 @@ class CompressedMaybeObjectSlot
 class CompressedHeapObjectSlot
     : public SlotBase<CompressedHeapObjectSlot, Tagged_t> {
  public:
+  using TCompressionScheme = V8HeapCompressionScheme;
+
   CompressedHeapObjectSlot() : SlotBase(kNullAddress) {}
   explicit CompressedHeapObjectSlot(Address ptr) : SlotBase(ptr) {}
   explicit CompressedHeapObjectSlot(Object* ptr)
@@ -123,18 +129,23 @@ class CompressedHeapObjectSlot
 // and so does not provide an operator* with implicit Isolate* calculation.
 // Its address() is the address of the slot.
 // The slot's contents can be read and written using load() and store().
+template <typename CompressionScheme>
 class OffHeapCompressedObjectSlot
-    : public SlotBase<OffHeapCompressedObjectSlot, Tagged_t> {
+    : public SlotBase<OffHeapCompressedObjectSlot<CompressionScheme>,
+                      Tagged_t> {
  public:
+  using TSlotBase =
+      SlotBase<OffHeapCompressedObjectSlot<CompressionScheme>, Tagged_t>;
+  using TCompressionScheme = CompressionScheme;
   using TObject = Object;
-  using THeapObjectSlot = OffHeapCompressedObjectSlot;
+  using THeapObjectSlot = OffHeapCompressedObjectSlot<CompressionScheme>;
 
   static constexpr bool kCanBeWeak = false;
 
-  OffHeapCompressedObjectSlot() : SlotBase(kNullAddress) {}
-  explicit OffHeapCompressedObjectSlot(Address ptr) : SlotBase(ptr) {}
+  OffHeapCompressedObjectSlot() : TSlotBase(kNullAddress) {}
+  explicit OffHeapCompressedObjectSlot(Address ptr) : TSlotBase(ptr) {}
   explicit OffHeapCompressedObjectSlot(const uint32_t* ptr)
-      : SlotBase(reinterpret_cast<Address>(ptr)) {}
+      : TSlotBase(reinterpret_cast<Address>(ptr)) {}
 
   inline Object load(PtrComprCageBase cage_base) const;
   inline void store(Object value) const;
@@ -148,7 +159,6 @@ class OffHeapCompressedObjectSlot
 
 #endif  // V8_COMPRESS_POINTERS
 
-}  // namespace internal
-}  // namespace v8
+}  // namespace v8::internal
 
 #endif  // V8_OBJECTS_COMPRESSED_SLOTS_H_
diff --git a/deps/v8/src/objects/contexts.cc b/deps/v8/src/objects/contexts.cc
index 62c747d55a992e..e35e7ee7e40d7d 100644
--- a/deps/v8/src/objects/contexts.cc
+++ b/deps/v8/src/objects/contexts.cc
@@ -203,6 +203,7 @@ Handle<Object> Context::Lookup(Handle<Context> context, Handle<String> name,
   Isolate* isolate = context->GetIsolate();
 
   bool follow_context_chain = (flags & FOLLOW_CONTEXT_CHAIN) != 0;
+  bool has_seen_debug_evaluate_context = false;
   *index = kNotFound;
   *attributes = ABSENT;
   *init_flag = kCreatedInitialized;
@@ -223,6 +224,7 @@ Handle<Object> Context::Lookup(Handle<Context> context, Handle<String> name,
              reinterpret_cast<void*>(context->ptr()));
       if (context->IsScriptContext()) PrintF(" (script context)");
       if (context->IsNativeContext()) PrintF(" (native context)");
+      if (context->IsDebugEvaluateContext()) PrintF(" (debug context)");
       PrintF("\n");
     }
 
@@ -381,6 +383,8 @@ Handle<Object> Context::Lookup(Handle<Context> context, Handle<String> name,
         }
       }
     } else if (context->IsDebugEvaluateContext()) {
+      has_seen_debug_evaluate_context = true;
+
       // Check materialized locals.
       Object ext = context->get(EXTENSION_INDEX);
       if (ext.IsJSReceiver()) {
@@ -395,6 +399,8 @@ Handle<Object> Context::Lookup(Handle<Context> context, Handle<String> name,
 
       // Check blocklist. Names that are listed, cannot be resolved further.
       ScopeInfo scope_info = context->scope_info();
+      CHECK_IMPLIES(v8_flags.experimental_reuse_locals_blocklists,
+                    !scope_info.HasLocalsBlockList());
       if (scope_info.HasLocalsBlockList() &&
           scope_info.LocalsBlockList().Has(isolate, name)) {
         if (v8_flags.trace_contexts) {
@@ -417,6 +423,27 @@ Handle<Object> Context::Lookup(Handle<Context> context, Handle<String> name,
     // 3. Prepare to continue with the previous (next outermost) context.
     if (context->IsNativeContext()) break;
 
+    // In case we saw any DebugEvaluateContext, we'll need to check the block
+    // list before we can advance to properly "shadow" stack-allocated
+    // variables.
+    // Note that this implicitly skips the block list check for the
+    // "wrapped" context lookup for DebugEvaluateContexts. In that case
+    // `has_seen_debug_evaluate_context` will always be false.
+    if (v8_flags.experimental_reuse_locals_blocklists &&
+        has_seen_debug_evaluate_context &&
+        isolate->heap()->locals_block_list_cache().IsEphemeronHashTable()) {
+      Handle<ScopeInfo> scope_info = handle(context->scope_info(), isolate);
+      Object maybe_outer_block_list =
+          isolate->LocalsBlockListCacheGet(scope_info);
+      if (maybe_outer_block_list.IsStringSet() &&
+          StringSet::cast(maybe_outer_block_list).Has(isolate, name)) {
+        if (v8_flags.trace_contexts) {
+          PrintF(" - name is blocklisted. Aborting.\n");
+        }
+        break;
+      }
+    }
+
     context = Handle<Context>(context->previous(), isolate);
   } while (follow_context_chain);
 
@@ -426,6 +453,10 @@ Handle<Object> Context::Lookup(Handle<Context> context, Handle<String> name,
   return Handle<Object>::null();
 }
 
+bool NativeContext::HasTemplateLiteralObject(JSArray array) {
+  return array.map() == js_array_template_literal_object_map();
+}
+
 void NativeContext::AddOptimizedCode(CodeT code) {
   DCHECK(CodeKindCanDeoptimize(code.kind()));
   DCHECK(code.next_code_link().IsUndefined());
diff --git a/deps/v8/src/objects/contexts.h b/deps/v8/src/objects/contexts.h
index 5183f9063f95c5..7e1e715038ff6c 100644
--- a/deps/v8/src/objects/contexts.h
+++ b/deps/v8/src/objects/contexts.h
@@ -157,6 +157,8 @@ enum ContextLookupFlags {
     intl_date_time_format_function)                                            \
   V(INTL_DISPLAY_NAMES_FUNCTION_INDEX, JSFunction,                             \
     intl_display_names_function)                                               \
+  V(INTL_DURATION_FORMAT_FUNCTION_INDEX, JSFunction,                           \
+    intl_duration_format_function)                                             \
   V(INTL_NUMBER_FORMAT_FUNCTION_INDEX, JSFunction,                             \
     intl_number_format_function)                                               \
   V(INTL_LOCALE_FUNCTION_INDEX, JSFunction, intl_locale_function)              \
@@ -178,11 +180,14 @@ enum ContextLookupFlags {
     js_array_packed_double_elements_map)                                       \
   V(JS_ARRAY_HOLEY_DOUBLE_ELEMENTS_MAP_INDEX, Map,                             \
     js_array_holey_double_elements_map)                                        \
+  V(JS_ARRAY_TEMPLATE_LITERAL_OBJECT_MAP, Map,                                 \
+    js_array_template_literal_object_map)                                      \
   V(JS_ATOMICS_CONDITION_MAP, Map, js_atomics_condition_map)                   \
   V(JS_ATOMICS_MUTEX_MAP, Map, js_atomics_mutex_map)                           \
   V(JS_MAP_FUN_INDEX, JSFunction, js_map_fun)                                  \
   V(JS_MAP_MAP_INDEX, Map, js_map_map)                                         \
   V(JS_MODULE_NAMESPACE_MAP, Map, js_module_namespace_map)                     \
+  V(JS_RAW_JSON_MAP, Map, js_raw_json_map)                                     \
   V(JS_SET_FUN_INDEX, JSFunction, js_set_fun)                                  \
   V(JS_SET_MAP_INDEX, Map, js_set_map)                                         \
   V(JS_WEAK_MAP_FUN_INDEX, JSFunction, js_weak_map_fun)                        \
@@ -209,6 +214,7 @@ enum ContextLookupFlags {
     temporal_time_zone_function)                                               \
   V(JS_TEMPORAL_ZONED_DATE_TIME_FUNCTION_INDEX, JSFunction,                    \
     temporal_zoned_date_time_function)                                         \
+  V(JSON_OBJECT, JSObject, json_object)                                        \
   V(TEMPORAL_INSTANT_FIXED_ARRAY_FROM_ITERABLE_FUNCTION_INDEX, JSFunction,     \
     temporal_instant_fixed_array_from_iterable)                                \
   V(STRING_FIXED_ARRAY_FROM_ITERABLE_FUNCTION_INDEX, JSFunction,               \
@@ -746,6 +752,8 @@ class NativeContext : public Context {
   inline Map TypedArrayElementsKindToRabGsabCtorMap(
       ElementsKind element_kind) const;
 
+  bool HasTemplateLiteralObject(JSArray array);
+
   // Dispatched behavior.
   DECL_PRINTER(NativeContext)
   DECL_VERIFIER(NativeContext)
diff --git a/deps/v8/src/objects/dictionary.h b/deps/v8/src/objects/dictionary.h
index d0e6648e769aff..3744faa6396e42 100644
--- a/deps/v8/src/objects/dictionary.h
+++ b/deps/v8/src/objects/dictionary.h
@@ -172,6 +172,10 @@ class EXPORT_TEMPLATE_DECLARE(V8_EXPORT_PRIVATE) BaseNameDictionary
       Handle<Object> value, PropertyDetails details,
       InternalIndex* entry_out = nullptr);
 
+  // Exposed for NameDictionaryLookupForwardedString slow path for forwarded
+  // strings.
+  using Dictionary<Derived, Shape>::FindInsertionEntry;
+
   OBJECT_CONSTRUCTORS(BaseNameDictionary, Dictionary<Derived, Shape>);
 };
 
diff --git a/deps/v8/src/objects/elements.cc b/deps/v8/src/objects/elements.cc
index 16167bc19ff2b1..5c0e5e5ecf01e2 100644
--- a/deps/v8/src/objects/elements.cc
+++ b/deps/v8/src/objects/elements.cc
@@ -479,8 +479,8 @@ void SortIndices(Isolate* isolate, Handle<FixedArray> indices,
   AtomicSlot end(start + sort_size);
   std::sort(start, end, [isolate](Tagged_t elementA, Tagged_t elementB) {
 #ifdef V8_COMPRESS_POINTERS
-    Object a(DecompressTaggedAny(isolate, elementA));
-    Object b(DecompressTaggedAny(isolate, elementB));
+    Object a(V8HeapCompressionScheme::DecompressTaggedAny(isolate, elementA));
+    Object b(V8HeapCompressionScheme::DecompressTaggedAny(isolate, elementB));
 #else
     Object a(elementA);
     Object b(elementB);
diff --git a/deps/v8/src/objects/feedback-vector-inl.h b/deps/v8/src/objects/feedback-vector-inl.h
index d63260be7f0bc1..a8bbc3834130ed 100644
--- a/deps/v8/src/objects/feedback-vector-inl.h
+++ b/deps/v8/src/objects/feedback-vector-inl.h
@@ -70,7 +70,6 @@ int FeedbackMetadata::GetSlotSize(FeedbackSlotKind kind) {
     case FeedbackSlotKind::kCompareOp:
     case FeedbackSlotKind::kBinaryOp:
     case FeedbackSlotKind::kLiteral:
-    case FeedbackSlotKind::kTypeProfile:
     case FeedbackSlotKind::kJumpLoop:
       return 1;
 
@@ -321,6 +320,8 @@ BinaryOperationHint BinaryOperationHintFromFeedback(int type_feedback) {
       return BinaryOperationHint::kString;
     case BinaryOperationFeedback::kBigInt:
       return BinaryOperationHint::kBigInt;
+    case BinaryOperationFeedback::kBigInt64:
+      return BinaryOperationHint::kBigInt64;
     default:
       return BinaryOperationHint::kAny;
   }
diff --git a/deps/v8/src/objects/feedback-vector.cc b/deps/v8/src/objects/feedback-vector.cc
index 4e5c3d39e1df5e..1f8b1d333c8cbc 100644
--- a/deps/v8/src/objects/feedback-vector.cc
+++ b/deps/v8/src/objects/feedback-vector.cc
@@ -31,20 +31,6 @@ FeedbackSlot FeedbackVectorSpec::AddSlot(FeedbackSlotKind kind) {
   return FeedbackSlot(slot);
 }
 
-FeedbackSlot FeedbackVectorSpec::AddTypeProfileSlot() {
-  FeedbackSlot slot = AddSlot(FeedbackSlotKind::kTypeProfile);
-  CHECK_EQ(FeedbackVectorSpec::kTypeProfileSlotIndex,
-           FeedbackVector::GetIndex(slot));
-  return slot;
-}
-
-bool FeedbackVectorSpec::HasTypeProfileSlot() const {
-  FeedbackSlot slot =
-      FeedbackVector::ToSlot(FeedbackVectorSpec::kTypeProfileSlotIndex);
-  if (slot_count() <= slot.ToInt()) return false;
-  return GetKind(slot) == FeedbackSlotKind::kTypeProfile;
-}
-
 static bool IsPropertyNameFeedback(MaybeObject feedback) {
   HeapObject heap_object;
   if (!feedback->GetHeapObjectIfStrong(&heap_object)) return false;
@@ -184,8 +170,6 @@ const char* FeedbackMetadata::Kind2String(FeedbackSlotKind kind) {
       return "DefineKeyedOwnPropertyInLiteral";
     case FeedbackSlotKind::kLiteral:
       return "Literal";
-    case FeedbackSlotKind::kTypeProfile:
-      return "TypeProfile";
     case FeedbackSlotKind::kForIn:
       return "ForIn";
     case FeedbackSlotKind::kInstanceOf:
@@ -197,13 +181,6 @@ const char* FeedbackMetadata::Kind2String(FeedbackSlotKind kind) {
   }
 }
 
-bool FeedbackMetadata::HasTypeProfileSlot() const {
-  FeedbackSlot slot =
-      FeedbackVector::ToSlot(FeedbackVectorSpec::kTypeProfileSlotIndex);
-  return slot.ToInt() < slot_count() &&
-         GetKind(slot) == FeedbackSlotKind::kTypeProfile;
-}
-
 FeedbackSlotKind FeedbackVector::GetKind(FeedbackSlot slot) const {
   DCHECK(!is_empty());
   return metadata().GetKind(slot);
@@ -215,14 +192,6 @@ FeedbackSlotKind FeedbackVector::GetKind(FeedbackSlot slot,
   return metadata(tag).GetKind(slot);
 }
 
-FeedbackSlot FeedbackVector::GetTypeProfileSlot() const {
-  DCHECK(metadata().HasTypeProfileSlot());
-  FeedbackSlot slot =
-      FeedbackVector::ToSlot(FeedbackVectorSpec::kTypeProfileSlotIndex);
-  DCHECK_EQ(FeedbackSlotKind::kTypeProfile, GetKind(slot));
-  return slot;
-}
-
 // static
 Handle<ClosureFeedbackCellArray> ClosureFeedbackCellArray::New(
     Isolate* isolate, Handle<SharedFunctionInfo> shared) {
@@ -310,7 +279,6 @@ Handle<FeedbackVector> FeedbackVector::New(
       case FeedbackSlotKind::kSetKeyedStrict:
       case FeedbackSlotKind::kStoreInArrayLiteral:
       case FeedbackSlotKind::kDefineKeyedOwnPropertyInLiteral:
-      case FeedbackSlotKind::kTypeProfile:
       case FeedbackSlotKind::kInstanceOf:
         vector->Set(slot, *uninitialized_sentinel, SKIP_WRITE_BARRIER);
         break;
@@ -325,8 +293,7 @@ Handle<FeedbackVector> FeedbackVector::New(
   }
 
   Handle<FeedbackVector> result = Handle<FeedbackVector>::cast(vector);
-  if (!isolate->is_best_effort_code_coverage() ||
-      isolate->is_collecting_type_profile()) {
+  if (!isolate->is_best_effort_code_coverage()) {
     AddToVectorsForProfilingTools(isolate, result);
   }
   return result;
@@ -372,8 +339,7 @@ Handle<FeedbackVector> FeedbackVector::NewWithOneCompareSlotForTesting(
 // static
 void FeedbackVector::AddToVectorsForProfilingTools(
     Isolate* isolate, Handle<FeedbackVector> vector) {
-  DCHECK(!isolate->is_best_effort_code_coverage() ||
-         isolate->is_collecting_type_profile());
+  DCHECK(!isolate->is_best_effort_code_coverage());
   if (!vector->shared_function_info().IsSubjectToDebugging()) return;
   Handle<ArrayList> list = Handle<ArrayList>::cast(
       isolate->factory()->feedback_vectors_for_profiling_tools());
@@ -613,16 +579,6 @@ bool FeedbackNexus::Clear(ClearBehavior behavior) {
   bool feedback_updated = false;
 
   switch (kind()) {
-    case FeedbackSlotKind::kTypeProfile:
-      if (V8_LIKELY(behavior == ClearBehavior::kDefault)) {
-        // We don't clear these kinds ever.
-      } else if (!IsCleared()) {
-        DCHECK_EQ(behavior, ClearBehavior::kClearAll);
-        SetFeedback(UninitializedSentinel(), SKIP_WRITE_BARRIER);
-        feedback_updated = true;
-      }
-      break;
-
     case FeedbackSlotKind::kCompareOp:
     case FeedbackSlotKind::kForIn:
     case FeedbackSlotKind::kBinaryOp:
@@ -849,12 +805,6 @@ InlineCacheState FeedbackNexus::ic_state() const {
 
       return InlineCacheState::MEGAMORPHIC;
     }
-    case FeedbackSlotKind::kTypeProfile: {
-      if (feedback == UninitializedSentinel()) {
-        return InlineCacheState::UNINITIALIZED;
-      }
-      return InlineCacheState::MONOMORPHIC;
-    }
 
     case FeedbackSlotKind::kCloneObject: {
       if (feedback == UninitializedSentinel()) {
@@ -1355,120 +1305,6 @@ MaybeHandle<JSObject> FeedbackNexus::GetConstructorFeedback() const {
   return MaybeHandle<JSObject>();
 }
 
-namespace {
-
-bool InList(Handle<ArrayList> types, Handle<String> type) {
-  for (int i = 0; i < types->Length(); i++) {
-    Object obj = types->Get(i);
-    if (String::cast(obj).Equals(*type)) {
-      return true;
-    }
-  }
-  return false;
-}
-}  // anonymous namespace
-
-void FeedbackNexus::Collect(Handle<String> type, int position) {
-  DCHECK(IsTypeProfileKind(kind()));
-  DCHECK_GE(position, 0);
-  DCHECK(config()->can_write());
-  Isolate* isolate = GetIsolate();
-
-  MaybeObject const feedback = GetFeedback();
-
-  // Map source position to collection of types
-  Handle<SimpleNumberDictionary> types;
-
-  if (feedback == UninitializedSentinel()) {
-    types = SimpleNumberDictionary::New(isolate, 1);
-  } else {
-    types = handle(
-        SimpleNumberDictionary::cast(feedback->GetHeapObjectAssumeStrong()),
-        isolate);
-  }
-
-  Handle<ArrayList> position_specific_types;
-
-  InternalIndex entry = types->FindEntry(isolate, position);
-  if (entry.is_not_found()) {
-    position_specific_types = ArrayList::New(isolate, 1);
-    types = SimpleNumberDictionary::Set(
-        isolate, types, position,
-        ArrayList::Add(isolate, position_specific_types, type));
-  } else {
-    DCHECK(types->ValueAt(entry).IsArrayList());
-    position_specific_types =
-        handle(ArrayList::cast(types->ValueAt(entry)), isolate);
-    if (!InList(position_specific_types, type)) {  // Add type
-      types = SimpleNumberDictionary::Set(
-          isolate, types, position,
-          ArrayList::Add(isolate, position_specific_types, type));
-    }
-  }
-  SetFeedback(*types);
-}
-
-std::vector<int> FeedbackNexus::GetSourcePositions() const {
-  DCHECK(IsTypeProfileKind(kind()));
-  std::vector<int> source_positions;
-  Isolate* isolate = GetIsolate();
-
-  MaybeObject const feedback = GetFeedback();
-
-  if (feedback == UninitializedSentinel()) {
-    return source_positions;
-  }
-
-  Handle<SimpleNumberDictionary> types(
-      SimpleNumberDictionary::cast(feedback->GetHeapObjectAssumeStrong()),
-      isolate);
-
-  for (int index = SimpleNumberDictionary::kElementsStartIndex;
-       index < types->length(); index += SimpleNumberDictionary::kEntrySize) {
-    int key_index = index + SimpleNumberDictionary::kEntryKeyIndex;
-    Object key = types->get(key_index);
-    if (key.IsSmi()) {
-      int position = Smi::cast(key).value();
-      source_positions.push_back(position);
-    }
-  }
-  return source_positions;
-}
-
-std::vector<Handle<String>> FeedbackNexus::GetTypesForSourcePositions(
-    uint32_t position) const {
-  DCHECK(IsTypeProfileKind(kind()));
-  Isolate* isolate = GetIsolate();
-
-  MaybeObject const feedback = GetFeedback();
-  std::vector<Handle<String>> types_for_position;
-  if (feedback == UninitializedSentinel()) {
-    return types_for_position;
-  }
-
-  Handle<SimpleNumberDictionary> types(
-      SimpleNumberDictionary::cast(feedback->GetHeapObjectAssumeStrong()),
-      isolate);
-
-  InternalIndex entry = types->FindEntry(isolate, position);
-  if (entry.is_not_found()) return types_for_position;
-
-  DCHECK(types->ValueAt(entry).IsArrayList());
-  Handle<ArrayList> position_specific_types =
-      Handle<ArrayList>(ArrayList::cast(types->ValueAt(entry)), isolate);
-  for (int i = 0; i < position_specific_types->Length(); i++) {
-    Object t = position_specific_types->Get(i);
-    types_for_position.push_back(Handle<String>(String::cast(t), isolate));
-  }
-
-  return types_for_position;
-}
-
-void FeedbackNexus::ResetTypeProfile() {
-  DCHECK(IsTypeProfileKind(kind()));
-  SetFeedback(UninitializedSentinel());
-}
-
 FeedbackIterator::FeedbackIterator(const FeedbackNexus* nexus)
     : done_(false), index_(-1), state_(kOther) {
   DCHECK(
diff --git a/deps/v8/src/objects/feedback-vector.h b/deps/v8/src/objects/feedback-vector.h
index c410ed1e660b72..987505a99cfb5e 100644
--- a/deps/v8/src/objects/feedback-vector.h
+++ b/deps/v8/src/objects/feedback-vector.h
@@ -62,7 +62,6 @@ enum class FeedbackSlotKind : uint8_t {
   kBinaryOp,
   kCompareOp,
   kDefineKeyedOwnPropertyInLiteral,
-  kTypeProfile,
   kLiteral,
   kForIn,
   kInstanceOf,
@@ -134,10 +133,6 @@ inline bool IsGlobalICKind(FeedbackSlotKind kind) {
   return IsLoadGlobalICKind(kind) || IsStoreGlobalICKind(kind);
 }
 
-inline bool IsTypeProfileKind(FeedbackSlotKind kind) {
-  return kind == FeedbackSlotKind::kTypeProfile;
-}
-
 inline bool IsCloneObjectKind(FeedbackSlotKind kind) {
   return kind == FeedbackSlotKind::kCloneObject;
 }
@@ -321,8 +316,6 @@ class FeedbackVector
   V8_EXPORT_PRIVATE FeedbackSlotKind GetKind(FeedbackSlot slot,
                                              AcquireLoadTag tag) const;
 
-  FeedbackSlot GetTypeProfileSlot() const;
-
   V8_EXPORT_PRIVATE static Handle<FeedbackVector> New(
       Isolate* isolate, Handle<SharedFunctionInfo> shared,
       Handle<ClosureFeedbackCellArray> closure_feedback_cell_array,
@@ -345,7 +338,6 @@ class FeedbackVector
   DEFINE_SLOT_KIND_PREDICATE(IsDefineNamedOwnIC)
   DEFINE_SLOT_KIND_PREDICATE(IsStoreGlobalIC)
   DEFINE_SLOT_KIND_PREDICATE(IsKeyedStoreIC)
-  DEFINE_SLOT_KIND_PREDICATE(IsTypeProfile)
 #undef DEFINE_SLOT_KIND_PREDICATE
 
   // Returns typeof mode encoded into kind of given slot.
@@ -436,13 +428,6 @@ class V8_EXPORT_PRIVATE FeedbackVectorSpec {
     return slot_kinds_.at(slot.ToInt());
   }
 
-  bool HasTypeProfileSlot() const;
-
-  // If used, the TypeProfileSlot is always added as the first slot and its
-  // index is constant. If other slots are added before the TypeProfileSlot,
-  // this number changes.
-  static const int kTypeProfileSlotIndex = 0;
-
   FeedbackSlot AddCallICSlot() { return AddSlot(FeedbackSlotKind::kCall); }
 
   FeedbackSlot AddLoadICSlot() {
@@ -524,8 +509,6 @@ class V8_EXPORT_PRIVATE FeedbackVectorSpec {
     return AddSlot(FeedbackSlotKind::kDefineKeyedOwnPropertyInLiteral);
   }
 
-  FeedbackSlot AddTypeProfileSlot();
-
   FeedbackSlot AddCloneObjectSlot() {
     return AddSlot(FeedbackSlotKind::kCloneObject);
   }
@@ -611,7 +594,6 @@ class FeedbackMetadata : public HeapObject {
   DECL_VERIFIER(FeedbackMetadata)
 
   static const char* Kind2String(FeedbackSlotKind kind);
-  bool HasTypeProfileSlot() const;
 
   // Garbage collection support.
   // This includes any necessary padding at the end of the object for pointer
@@ -902,16 +884,6 @@ class V8_EXPORT_PRIVATE FeedbackNexus final {
   // Make sure we don't overflow the smi.
   static_assert(LEXICAL_MODE_BIT_FIELDS_Ranges::kBitsCount <= kSmiValueSize);
 
-  // For TypeProfile feedback vector slots.
-  // ResetTypeProfile will always reset type profile information.
-  void ResetTypeProfile();
-
-  // Add a type to the list of types for source position <position>.
-  void Collect(Handle<String> type, int position);
-
-  std::vector<int> GetSourcePositions() const;
-  std::vector<Handle<String>> GetTypesForSourcePositions(uint32_t pos) const;
-
  private:
   template <typename FeedbackType>
   inline void SetFeedback(FeedbackType feedback,
diff --git a/deps/v8/src/objects/hash-table.h b/deps/v8/src/objects/hash-table.h
index 2a7d5531bc3e99..a77d7e8aa4b272 100644
--- a/deps/v8/src/objects/hash-table.h
+++ b/deps/v8/src/objects/hash-table.h
@@ -470,6 +470,10 @@ class V8_EXPORT_PRIVATE NameToIndexHashTable
                                           Handle<NameToIndexHashTable> table,
                                           Handle<Name> key, int32_t value);
 
+  // Exposed for NameDictionaryLookupForwardedString slow path for forwarded
+  // strings.
+  using HashTable<NameToIndexHashTable, NameToIndexShape>::FindInsertionEntry;
+
   DECL_CAST(NameToIndexHashTable)
   DECL_PRINTER(NameToIndexHashTable)
 
diff --git a/deps/v8/src/objects/heap-number.tq b/deps/v8/src/objects/heap-number.tq
index af2545c1fb3e0b..b1c52a0b000c2d 100644
--- a/deps/v8/src/objects/heap-number.tq
+++ b/deps/v8/src/objects/heap-number.tq
@@ -5,6 +5,8 @@
 extern class HeapNumber extends PrimitiveHeapObject {
   // Marked as a relaxed store because of a race with reading on the
   // compiler thread.
+  // TODO(v8:13070): With 8GB+ pointer compression, the number in a HeapNumber
+  // is unaligned. Modify the HeapNumber layout so it remains aligned.
   @cppRelaxedStore value: float64;
 }
 
diff --git a/deps/v8/src/objects/intl-objects.cc b/deps/v8/src/objects/intl-objects.cc
index 0e73a546a9b814..881842fbdc76f1 100644
--- a/deps/v8/src/objects/intl-objects.cc
+++ b/deps/v8/src/objects/intl-objects.cc
@@ -2962,10 +2962,54 @@ const icu::BasicTimeZone* CreateBasicTimeZoneFromIndex(
           Intl::TimeZoneIdFromIndex(time_zone_index).c_str(), -1, US_INV)));
 }
 
+// ICU only support TimeZone information in millisecond but Temporal require
+// nanosecond. For most of the case, we find a approximate millisecond by
+// floor to the millisecond just past the nanosecond_epoch. For negative epoch
+// value, the BigInt Divide will floor closer to zero so we need to minus 1 if
+// the remainder is not zero. For the case of finding previous transition, we
+// need to ceil to the millisecond in the near future of the nanosecond_epoch.
+enum class Direction { kPast, kFuture };
+int64_t ApproximateMillisecondEpoch(Isolate* isolate,
+                                    Handle<BigInt> nanosecond_epoch,
+                                    Direction direction = Direction::kPast) {
+  Handle<BigInt> one_million = BigInt::FromUint64(isolate, 1000000);
+  int64_t ms = BigInt::Divide(isolate, nanosecond_epoch, one_million)
+                   .ToHandleChecked()
+                   ->AsInt64();
+  Handle<BigInt> remainder =
+      BigInt::Remainder(isolate, nanosecond_epoch, one_million)
+          .ToHandleChecked();
+  // If the nanosecond_epoch is not on the exact millisecond
+  if (remainder->ToBoolean()) {
+    if (direction == Direction::kPast) {
+      if (remainder->IsNegative()) {
+        // If the remaninder is negative, we know we have an negative epoch
+        // We need to decrease one millisecond.
+        // Move to the previous millisecond
+        ms -= 1;
+      }
+    } else {
+      if (!remainder->IsNegative()) {
+        // Move to the future millisecond
+        ms += 1;
+      }
+    }
+  }
+  return ms;
+}
+
+// Helper function to convert the milliseconds in int64_t
+// to a BigInt in nanoseconds.
+Handle<BigInt> MillisecondToNanosecond(Isolate* isolate, int64_t ms) {
+  return BigInt::Multiply(isolate, BigInt::FromInt64(isolate, ms),
+                          BigInt::FromUint64(isolate, 1000000))
+      .ToHandleChecked();
+}
+
 }  // namespace
 
-Maybe<int64_t> Intl::GetTimeZoneOffsetTransitionMilliseconds(
-    Isolate* isolate, int32_t time_zone_index, int64_t time_ms,
+Handle<Object> Intl::GetTimeZoneOffsetTransitionNanoseconds(
+    Isolate* isolate, int32_t time_zone_index, Handle<BigInt> nanosecond_epoch,
     Intl::Transition transition) {
   std::unique_ptr<const icu::BasicTimeZone> basic_time_zone(
       CreateBasicTimeZoneFromIndex(time_zone_index));
@@ -2974,56 +3018,77 @@ Maybe<int64_t> Intl::GetTimeZoneOffsetTransitionMilliseconds(
   UBool has_transition;
   switch (transition) {
     case Intl::Transition::kNext:
-      has_transition =
-          basic_time_zone->getNextTransition(time_ms, false, icu_transition);
+      has_transition = basic_time_zone->getNextTransition(
+          ApproximateMillisecondEpoch(isolate, nanosecond_epoch), false,
+          icu_transition);
       break;
     case Intl::Transition::kPrevious:
-      has_transition = basic_time_zone->getPreviousTransition(time_ms, false,
-                                                              icu_transition);
+      has_transition = basic_time_zone->getPreviousTransition(
+          ApproximateMillisecondEpoch(isolate, nanosecond_epoch,
+                                      Direction::kFuture),
+          false, icu_transition);
       break;
   }
 
   if (!has_transition) {
-    return Nothing<int64_t>();
+    return isolate->factory()->null_value();
   }
-  return Just(static_cast<int64_t>(icu_transition.getTime()));
-}
-
-std::vector<int64_t> Intl::GetTimeZonePossibleOffsetMilliseconds(
-    Isolate* isolate, int32_t time_zone_index, int64_t time_in_millisecond) {
+  // #sec-temporal-getianatimezonenexttransition and
+  // #sec-temporal-getianatimezoneprevioustransition states:
+  // "The operation returns null if no such transition exists for which t ≤
+  // ℤ(nsMaxInstant)." and "The operation returns null if no such transition
+  // exists for which t ≥ ℤ(nsMinInstant)."
+  //
+  // nsMinInstant = -nsMaxInstant = -8.64 × 10^21 => msMinInstant = -8.64 x
+  // 10^15
+  constexpr int64_t kMsMinInstant = -8.64e15;
+  // nsMaxInstant = 10^8 × nsPerDay = 8.64 × 10^21 => msMaxInstant = 8.64 x
+  // 10^15
+  constexpr int64_t kMsMaxInstant = 8.64e15;
+  int64_t time_ms = static_cast<int64_t>(icu_transition.getTime());
+  if (time_ms < kMsMinInstant || time_ms > kMsMaxInstant) {
+    return isolate->factory()->null_value();
+  }
+  return MillisecondToNanosecond(isolate, time_ms);
+}
+
+std::vector<Handle<BigInt>> Intl::GetTimeZonePossibleOffsetNanoseconds(
+    Isolate* isolate, int32_t time_zone_index,
+    Handle<BigInt> nanosecond_epoch) {
   std::unique_ptr<const icu::BasicTimeZone> basic_time_zone(
       CreateBasicTimeZoneFromIndex(time_zone_index));
+  int64_t time_ms = ApproximateMillisecondEpoch(isolate, nanosecond_epoch);
   int32_t raw_offset;
   int32_t dst_offset;
   UErrorCode status = U_ZERO_ERROR;
-  basic_time_zone->getOffsetFromLocal(time_in_millisecond, UCAL_TZ_LOCAL_FORMER,
+  basic_time_zone->getOffsetFromLocal(time_ms, UCAL_TZ_LOCAL_FORMER,
                                       UCAL_TZ_LOCAL_FORMER, raw_offset,
                                       dst_offset, status);
   DCHECK(U_SUCCESS(status));
-  // offset for time_in_milliseconds interpretted as before a time zone
+  // offset for time_ms interpretted as before a time zone
   // transition
-  int32_t offset_former = raw_offset + dst_offset;
+  int64_t offset_former = raw_offset + dst_offset;
 
-  basic_time_zone->getOffsetFromLocal(time_in_millisecond, UCAL_TZ_LOCAL_LATTER,
+  basic_time_zone->getOffsetFromLocal(time_ms, UCAL_TZ_LOCAL_LATTER,
                                       UCAL_TZ_LOCAL_LATTER, raw_offset,
                                       dst_offset, status);
   DCHECK(U_SUCCESS(status));
-  // offset for time_in_milliseconds interpretted as after a time zone
+  // offset for time_ms interpretted as after a time zone
   // transition
-  int32_t offset_latter = raw_offset + dst_offset;
+  int64_t offset_latter = raw_offset + dst_offset;
 
-  std::vector<int64_t> result;
+  std::vector<Handle<BigInt>> result;
   if (offset_former == offset_latter) {
     // For most of the time, when either interpretation are the same, we are not
     // in a moment of offset transition based on rule changing: Just return that
     // value.
-    result.push_back(offset_former);
+    result.push_back(MillisecondToNanosecond(isolate, offset_former));
   } else if (offset_former > offset_latter) {
     // When the input represents a local time repeating multiple times at a
     // negative time zone transition (e.g. when the daylight saving time ends
     // or the time zone offset is decreased due to a time zone rule change).
-    result.push_back(offset_former);
-    result.push_back(offset_latter);
+    result.push_back(MillisecondToNanosecond(isolate, offset_former));
+    result.push_back(MillisecondToNanosecond(isolate, offset_latter));
   } else {
     // If the offset after the transition is greater than the offset before the
     // transition, that mean it is in the moment the time "skip" an hour, or two
@@ -3033,18 +3098,19 @@ std::vector<int64_t> Intl::GetTimeZonePossibleOffsetMilliseconds(
   return result;
 }
 
-Maybe<int64_t> Intl::GetTimeZoneOffsetMilliseconds(
-    Isolate* isolate, int32_t time_zone_index, int64_t time_in_millisecond) {
+int64_t Intl::GetTimeZoneOffsetNanoseconds(Isolate* isolate,
+                                           int32_t time_zone_index,
+                                           Handle<BigInt> nanosecond_epoch) {
   std::unique_ptr<const icu::BasicTimeZone> basic_time_zone(
       CreateBasicTimeZoneFromIndex(time_zone_index));
+  int64_t time_ms = ApproximateMillisecondEpoch(isolate, nanosecond_epoch);
   int32_t raw_offset;
   int32_t dst_offset;
   UErrorCode status = U_ZERO_ERROR;
-  basic_time_zone->getOffsetFromLocal(time_in_millisecond, UCAL_TZ_LOCAL_FORMER,
-                                      UCAL_TZ_LOCAL_FORMER, raw_offset,
-                                      dst_offset, status);
+  basic_time_zone->getOffset(time_ms, false, raw_offset, dst_offset, status);
   DCHECK(U_SUCCESS(status));
-  return Just(static_cast<int64_t>(raw_offset + dst_offset));
+  // Turn ms into ns
+  return static_cast<int64_t>(raw_offset + dst_offset) * 1000000;
 }
 
 }  // namespace internal
diff --git a/deps/v8/src/objects/intl-objects.h b/deps/v8/src/objects/intl-objects.h
index 0ac4b14096c8a7..4339673d56693a 100644
--- a/deps/v8/src/objects/intl-objects.h
+++ b/deps/v8/src/objects/intl-objects.h
@@ -365,30 +365,35 @@ class Intl {
 
   // Functions to support Temporal
 
-  V8_WARN_UNUSED_RESULT static Maybe<int64_t>
-  GetTimeZoneOffsetTransitionMilliseconds(Isolate* isolate,
-                                          int32_t time_zone_index,
-                                          int64_t time_ms,
-                                          Transition transition);
-
-  static Handle<String> DefaultTimeZone(Isolate* isolate);
-
-  V8_WARN_UNUSED_RESULT static Maybe<int64_t> GetTimeZoneOffsetMilliseconds(
-      Isolate* isolate, int32_t time_zone_index, int64_t millisecond);
+  // Return the epoch of transition in BigInt or null if there are no
+  // transition.
+  static Handle<Object> GetTimeZoneOffsetTransitionNanoseconds(
+      Isolate* isolate, int32_t time_zone_index,
+      Handle<BigInt> nanosecond_epoch, Transition transition);
+
+  // Return the Time Zone offset, in the unit of nanosecond by int64_t, during
+  // the time of the nanosecond_epoch.
+  static int64_t GetTimeZoneOffsetNanoseconds(Isolate* isolate,
+                                              int32_t time_zone_index,
+                                              Handle<BigInt> nanosecond_epoch);
 
   // This function may return the result, the std::vector<int64_t> in one of
   // the following three condictions:
-  // 1. While time_in_millisecond fall into the daylight saving time change
+  // 1. While nanosecond_epoch fall into the daylight saving time change
   // moment that skipped one (or two or even six, in some Time Zone) hours
   // later in local time:
   //    [],
   // 2. In other moment not during daylight saving time change:
   //    [offset_former], and
-  // 3. when time_in_millisecond fall into they daylight saving time change hour
+  // 3. when nanosecond_epoch fall into they daylight saving time change hour
   // which the clock time roll back one (or two or six, in some Time Zone) hour:
   //    [offset_former, offset_later]
-  static std::vector<int64_t> GetTimeZonePossibleOffsetMilliseconds(
-      Isolate* isolate, int32_t time_zone_index, int64_t time_ms);
+  // The unit of the return values in BigInt is nanosecond.
+  static std::vector<Handle<BigInt>> GetTimeZonePossibleOffsetNanoseconds(
+      Isolate* isolate, int32_t time_zone_index,
+      Handle<BigInt> nanosecond_epoch);
+
+  static Handle<String> DefaultTimeZone(Isolate* isolate);
 
   V8_WARN_UNUSED_RESULT static MaybeHandle<String> CanonicalizeTimeZoneName(
       Isolate* isolate, Handle<String> identifier);
diff --git a/deps/v8/src/objects/js-array-buffer-inl.h b/deps/v8/src/objects/js-array-buffer-inl.h
index c1a142d1b55b1e..d30fd968400cc3 100644
--- a/deps/v8/src/objects/js-array-buffer-inl.h
+++ b/deps/v8/src/objects/js-array-buffer-inl.h
@@ -28,11 +28,19 @@ RELEASE_ACQUIRE_ACCESSORS(JSTypedArray, base_pointer, Object,
                           kBasePointerOffset)
 
 size_t JSArrayBuffer::byte_length() const {
-  return ReadField<size_t>(kByteLengthOffset);
+  return ReadBoundedSizeField(kRawByteLengthOffset);
 }
 
 void JSArrayBuffer::set_byte_length(size_t value) {
-  WriteField<size_t>(kByteLengthOffset, value);
+  WriteBoundedSizeField(kRawByteLengthOffset, value);
+}
+
+size_t JSArrayBuffer::max_byte_length() const {
+  return ReadBoundedSizeField(kRawMaxByteLengthOffset);
+}
+
+void JSArrayBuffer::set_max_byte_length(size_t value) {
+  WriteBoundedSizeField(kRawMaxByteLengthOffset, value);
 }
 
 DEF_GETTER(JSArrayBuffer, backing_store, void*) {
@@ -51,7 +59,7 @@ std::shared_ptr<BackingStore> JSArrayBuffer::GetBackingStore() const {
 }
 
 size_t JSArrayBuffer::GetByteLength() const {
-  if (V8_UNLIKELY(is_shared() && is_resizable())) {
+  if (V8_UNLIKELY(is_shared() && is_resizable_by_js())) {
     // Invariant: byte_length for GSAB is 0 (it needs to be read from the
     // BackingStore).
     DCHECK_EQ(0, byte_length());
@@ -158,8 +166,8 @@ BIT_FIELD_ACCESSORS(JSArrayBuffer, bit_field, is_asmjs_memory,
                     JSArrayBuffer::IsAsmJsMemoryBit)
 BIT_FIELD_ACCESSORS(JSArrayBuffer, bit_field, is_shared,
                     JSArrayBuffer::IsSharedBit)
-BIT_FIELD_ACCESSORS(JSArrayBuffer, bit_field, is_resizable,
-                    JSArrayBuffer::IsResizableBit)
+BIT_FIELD_ACCESSORS(JSArrayBuffer, bit_field, is_resizable_by_js,
+                    JSArrayBuffer::IsResizableByJsBit)
 
 bool JSArrayBuffer::IsEmpty() const {
   auto backing_store = GetBackingStore();
@@ -169,19 +177,19 @@ bool JSArrayBuffer::IsEmpty() const {
 }
 
 size_t JSArrayBufferView::byte_offset() const {
-  return ReadField<size_t>(kByteOffsetOffset);
+  return ReadBoundedSizeField(kRawByteOffsetOffset);
 }
 
 void JSArrayBufferView::set_byte_offset(size_t value) {
-  WriteField<size_t>(kByteOffsetOffset, value);
+  WriteBoundedSizeField(kRawByteOffsetOffset, value);
 }
 
 size_t JSArrayBufferView::byte_length() const {
-  return ReadField<size_t>(kByteLengthOffset);
+  return ReadBoundedSizeField(kRawByteLengthOffset);
 }
 
 void JSArrayBufferView::set_byte_length(size_t value) {
-  WriteField<size_t>(kByteLengthOffset, value);
+  WriteBoundedSizeField(kRawByteLengthOffset, value);
 }
 
 bool JSArrayBufferView::WasDetached() const {
@@ -250,15 +258,15 @@ inline void JSTypedArray::ForFixedTypedArray(ExternalArrayType array_type,
 size_t JSTypedArray::length() const {
   DCHECK(!is_length_tracking());
   DCHECK(!is_backed_by_rab());
-  return ReadField<size_t>(kLengthOffset);
+  return ReadBoundedSizeField(kRawLengthOffset);
 }
 
 size_t JSTypedArray::LengthUnchecked() const {
-  return ReadField<size_t>(kLengthOffset);
+  return ReadBoundedSizeField(kRawLengthOffset);
 }
 
 void JSTypedArray::set_length(size_t value) {
-  WriteField<size_t>(kLengthOffset, value);
+  WriteBoundedSizeField(kRawLengthOffset, value);
 }
 
 DEF_GETTER(JSTypedArray, external_pointer, Address) {
diff --git a/deps/v8/src/objects/js-array-buffer.cc b/deps/v8/src/objects/js-array-buffer.cc
index 3622a30f5d9d2c..a1aca2a9dfef5a 100644
--- a/deps/v8/src/objects/js-array-buffer.cc
+++ b/deps/v8/src/objects/js-array-buffer.cc
@@ -48,7 +48,7 @@ void JSArrayBuffer::Setup(SharedFlag shared, ResizableFlag resizable,
   clear_padding();
   set_bit_field(0);
   set_is_shared(shared == SharedFlag::kShared);
-  set_is_resizable(resizable == ResizableFlag::kResizable);
+  set_is_resizable_by_js(resizable == ResizableFlag::kResizable);
   set_is_detachable(shared != SharedFlag::kShared);
   for (int i = 0; i < v8::ArrayBuffer::kEmbedderFieldCount; i++) {
     SetEmbedderField(i, Smi::zero());
@@ -70,9 +70,9 @@ void JSArrayBuffer::Setup(SharedFlag shared, ResizableFlag resizable,
 void JSArrayBuffer::Attach(std::shared_ptr<BackingStore> backing_store) {
   DCHECK_NOT_NULL(backing_store);
   DCHECK_EQ(is_shared(), backing_store->is_shared());
-  DCHECK_EQ(is_resizable(), backing_store->is_resizable());
+  DCHECK_EQ(is_resizable_by_js(), backing_store->is_resizable_by_js());
   DCHECK_IMPLIES(
-      !backing_store->is_wasm_memory() && !backing_store->is_resizable(),
+      !backing_store->is_wasm_memory() && !backing_store->is_resizable_by_js(),
       backing_store->byte_length() == backing_store->max_byte_length());
   DCHECK(!was_detached());
   Isolate* isolate = GetIsolate();
@@ -84,7 +84,7 @@ void JSArrayBuffer::Attach(std::shared_ptr<BackingStore> backing_store) {
     set_backing_store(isolate, backing_store->buffer_start());
   }
 
-  if (is_shared() && is_resizable()) {
+  if (is_shared() && is_resizable_by_js()) {
     // GSABs need to read their byte_length from the BackingStore. Maintain the
     // invariant that their byte_length field is always 0.
     set_byte_length(0);
@@ -141,7 +141,7 @@ size_t JSArrayBuffer::GsabByteLength(Isolate* isolate,
   DisallowGarbageCollection no_gc;
   DisallowJavascriptExecution no_js(isolate);
   JSArrayBuffer buffer = JSArrayBuffer::cast(Object(raw_array_buffer));
-  CHECK(buffer.is_resizable());
+  CHECK(buffer.is_resizable_by_js());
   CHECK(buffer.is_shared());
   return buffer.GetBackingStore()->byte_length(std::memory_order_seq_cst);
 }
@@ -226,7 +226,7 @@ Handle<JSArrayBuffer> JSTypedArray::GetBuffer() {
     // Already is off heap, so return the existing buffer.
     return array_buffer;
   }
-  DCHECK(!array_buffer->is_resizable());
+  DCHECK(!array_buffer->is_resizable_by_js());
 
   // The existing array buffer should be empty.
   DCHECK(array_buffer->IsEmpty());
@@ -370,7 +370,7 @@ size_t JSTypedArray::LengthTrackingGsabBackedTypedArrayLength(
   JSTypedArray array = JSTypedArray::cast(Object(raw_array));
   CHECK(array.is_length_tracking());
   JSArrayBuffer buffer = array.buffer();
-  CHECK(buffer.is_resizable());
+  CHECK(buffer.is_resizable_by_js());
   CHECK(buffer.is_shared());
   size_t backing_byte_length =
       buffer.GetBackingStore()->byte_length(std::memory_order_seq_cst);
diff --git a/deps/v8/src/objects/js-array-buffer.h b/deps/v8/src/objects/js-array-buffer.h
index 01efac77412392..ad6bc4fbf66511 100644
--- a/deps/v8/src/objects/js-array-buffer.h
+++ b/deps/v8/src/objects/js-array-buffer.h
@@ -28,7 +28,9 @@ class JSArrayBuffer
 // On 32-bit architectures we limit this to 2GiB, so that
 // we can continue to use CheckBounds with the Unsigned31
 // restriction for the length.
-#if V8_HOST_ARCH_32_BIT
+#if V8_ENABLE_SANDBOX
+  static constexpr size_t kMaxByteLength = kMaxSafeBufferSizeForSandbox;
+#elif V8_HOST_ARCH_32_BIT
   static constexpr size_t kMaxByteLength = kMaxInt;
 #else
   static constexpr size_t kMaxByteLength = kMaxSafeInteger;
@@ -37,6 +39,9 @@ class JSArrayBuffer
   // [byte_length]: length in bytes
   DECL_PRIMITIVE_ACCESSORS(byte_length, size_t)
 
+  // [max_byte_length]: maximum length in bytes
+  DECL_PRIMITIVE_ACCESSORS(max_byte_length, size_t)
+
   // [backing_store]: backing memory for this array
   // It should not be assumed that this will be nullptr for empty ArrayBuffers.
   DECL_GETTER(backing_store, void*)
@@ -73,9 +78,9 @@ class JSArrayBuffer
   // GrowableSharedArrayBuffer.
   DECL_BOOLEAN_ACCESSORS(is_shared)
 
-  // [is_resizable]: true if this is a ResizableArrayBuffer or a
+  // [is_resizable_by_js]: true if this is a ResizableArrayBuffer or a
   // GrowableSharedArrayBuffer.
-  DECL_BOOLEAN_ACCESSORS(is_resizable)
+  DECL_BOOLEAN_ACCESSORS(is_resizable_by_js)
 
   // An ArrayBuffer is empty if its BackingStore is empty or if there is none.
   // An empty ArrayBuffer will have a byte_length of zero but not necessarily a
@@ -257,10 +262,10 @@ class JSArrayBufferView
   DECL_BOOLEAN_ACCESSORS(is_backed_by_rab)
   inline bool IsVariableLength() const;
 
-  static constexpr int kEndOfTaggedFieldsOffset = kByteOffsetOffset;
+  static constexpr int kEndOfTaggedFieldsOffset = kRawByteOffsetOffset;
 
-  static_assert(IsAligned(kByteOffsetOffset, kUIntptrSize));
-  static_assert(IsAligned(kByteLengthOffset, kUIntptrSize));
+  static_assert(IsAligned(kRawByteOffsetOffset, kUIntptrSize));
+  static_assert(IsAligned(kRawByteLengthOffset, kUIntptrSize));
 
   TQ_OBJECT_CONSTRUCTORS(JSArrayBufferView)
 };
@@ -271,6 +276,7 @@ class JSTypedArray
   // TODO(v8:4153): This should be equal to JSArrayBuffer::kMaxByteLength
   // eventually.
   static constexpr size_t kMaxLength = v8::TypedArray::kMaxLength;
+  static_assert(kMaxLength <= JSArrayBuffer::kMaxByteLength);
 
   // [length]: length of typed array in elements.
   DECL_PRIMITIVE_GETTER(length, size_t)
diff --git a/deps/v8/src/objects/js-array-buffer.tq b/deps/v8/src/objects/js-array-buffer.tq
index d00febb179f51f..415b15d5c56fbc 100644
--- a/deps/v8/src/objects/js-array-buffer.tq
+++ b/deps/v8/src/objects/js-array-buffer.tq
@@ -8,12 +8,14 @@ bitfield struct JSArrayBufferFlags extends uint32 {
   was_detached: bool: 1 bit;
   is_asm_js_memory: bool: 1 bit;
   is_shared: bool: 1 bit;
-  is_resizable: bool: 1 bit;
+  is_resizable_by_js: bool: 1 bit;
 }
 
 extern class JSArrayBuffer extends JSObjectWithEmbedderSlots {
-  byte_length: uintptr;
-  max_byte_length: uintptr;
+  // A BoundedSize if the sandbox is enabled
+  raw_byte_length: uintptr;
+  // A BoundedSize if the sandbox is enabled
+  raw_max_byte_length: uintptr;
   // A SandboxedPtr if the sandbox is enabled
   backing_store: RawPtr;
   extension: RawPtr;
@@ -23,6 +25,11 @@ extern class JSArrayBuffer extends JSObjectWithEmbedderSlots {
   @ifnot(TAGGED_SIZE_8_BYTES) optional_padding: void;
 }
 
+extern operator '.byte_length' macro LoadJSArrayBufferByteLength(JSArrayBuffer):
+    uintptr;
+extern operator '.max_byte_length' macro LoadJSArrayBufferMaxByteLength(
+    JSArrayBuffer): uintptr;
+
 extern operator '.backing_store_ptr' macro LoadJSArrayBufferBackingStorePtr(
     JSArrayBuffer): RawPtr;
 
@@ -38,7 +45,7 @@ macro IsSharedArrayBuffer(buffer: JSArrayBuffer): bool {
 
 @export
 macro IsResizableArrayBuffer(buffer: JSArrayBuffer): bool {
-  return buffer.bit_field.is_resizable;
+  return buffer.bit_field.is_resizable_by_js;
 }
 
 // We have 4 different DataViews & TypedArrays:
@@ -55,14 +62,25 @@ bitfield struct JSArrayBufferViewFlags extends uint32 {
 @abstract
 extern class JSArrayBufferView extends JSObjectWithEmbedderSlots {
   buffer: JSArrayBuffer;
-  byte_offset: uintptr;
-  byte_length: uintptr;
+  // A BoundedSize if the sandbox is enabled
+  raw_byte_offset: uintptr;
+  // A BoundedSize if the sandbox is enabled
+  raw_byte_length: uintptr;
   bit_field: JSArrayBufferViewFlags;
   // Pads header size to be a multiple of kTaggedSize.
   @if(TAGGED_SIZE_8_BYTES) optional_padding: uint32;
   @ifnot(TAGGED_SIZE_8_BYTES) optional_padding: void;
 }
 
+extern operator '.byte_offset' macro LoadJSArrayBufferViewByteOffset(
+    JSArrayBufferView): uintptr;
+extern operator '.byte_offset=' macro StoreJSArrayBufferViewByteOffset(
+    JSArrayBufferView, uintptr): void;
+extern operator '.byte_length' macro LoadJSArrayBufferViewByteLength(
+    JSArrayBufferView): uintptr;
+extern operator '.byte_length=' macro StoreJSArrayBufferViewByteLength(
+    JSArrayBufferView, uintptr): void;
+
 @export
 macro IsVariableLengthJSArrayBufferView(array: JSArrayBufferView): bool {
   return array.bit_field.is_length_tracking || array.bit_field.is_backed_by_rab;
@@ -88,12 +106,17 @@ macro LoadJSArrayBufferViewByteLength(
 }
 
 extern class JSTypedArray extends JSArrayBufferView {
-  length: uintptr;
+  // A BoundedSize if the sandbox is enabled
+  raw_length: uintptr;
   // A SandboxedPtr if the sandbox is enabled
   external_pointer: RawPtr;
   base_pointer: ByteArray|Smi;
 }
 
+extern operator '.length' macro LoadJSTypedArrayLength(JSTypedArray): uintptr;
+extern operator '.length=' macro StoreJSTypedArrayLength(
+    JSTypedArray, uintptr): void;
+
 @export
 macro IsOnHeapTypedArray(array: JSTypedArray): bool {
   // See JSTypedArray::is_on_heap()
diff --git a/deps/v8/src/objects/js-array-inl.h b/deps/v8/src/objects/js-array-inl.h
index 2e5b192c3b3a92..fe1973b0b76974 100644
--- a/deps/v8/src/objects/js-array-inl.h
+++ b/deps/v8/src/objects/js-array-inl.h
@@ -73,6 +73,14 @@ void JSArrayIterator::set_kind(IterationKind kind) {
   set_raw_kind(static_cast<int>(kind));
 }
 
+// static
+void TemplateLiteralObject::SetRaw(Handle<JSArray> template_object,
+                                   Handle<JSArray> raw_object) {
+  TaggedField<Object, kRawFieldOffset>::store(*template_object, *raw_object);
+  CONDITIONAL_WRITE_BARRIER(*template_object, kRawFieldOffset, *raw_object,
+                            UPDATE_WRITE_BARRIER);
+}
+
 }  // namespace internal
 }  // namespace v8
 
diff --git a/deps/v8/src/objects/js-array.h b/deps/v8/src/objects/js-array.h
index 2af61eea0c1e83..6bc2bb80cdaf6c 100644
--- a/deps/v8/src/objects/js-array.h
+++ b/deps/v8/src/objects/js-array.h
@@ -159,6 +159,14 @@ class JSArrayIterator
   TQ_OBJECT_CONSTRUCTORS(JSArrayIterator)
 };
 
+// Helper class for JSArrays that are template literal objects
+class TemplateLiteralObject {
+ public:
+  static const int kRawFieldOffset = JSArray::kLengthOffset + kTaggedSize;
+  static inline void SetRaw(Handle<JSArray> template_object,
+                            Handle<JSArray> raw_object);
+};
+
 }  // namespace internal
 }  // namespace v8
 
diff --git a/deps/v8/src/objects/js-duration-format-inl.h b/deps/v8/src/objects/js-duration-format-inl.h
new file mode 100644
index 00000000000000..024e1ed7b24faa
--- /dev/null
+++ b/deps/v8/src/objects/js-duration-format-inl.h
@@ -0,0 +1,104 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_INTL_SUPPORT
+#error Internationalization is expected to be enabled.
+#endif  // V8_INTL_SUPPORT
+
+#ifndef V8_OBJECTS_JS_DURATION_FORMAT_INL_H_
+#define V8_OBJECTS_JS_DURATION_FORMAT_INL_H_
+
+#include "src/objects/js-duration-format.h"
+#include "src/objects/objects-inl.h"
+
+// Has to be the last include (doesn't have include guards):
+#include "src/objects/object-macros.h"
+
+namespace v8 {
+namespace internal {
+
+#include "torque-generated/src/objects/js-duration-format-tq-inl.inc"
+
+TQ_OBJECT_CONSTRUCTORS_IMPL(JSDurationFormat)
+
+ACCESSORS(JSDurationFormat, icu_locale, Managed<icu::Locale>, kIcuLocaleOffset)
+
+#define IMPL_INLINE_SETTER_GETTER(T, n, B, f, M)           \
+  inline void JSDurationFormat::set_##n(T value) {         \
+    DCHECK_GE(B::kMax, value);                             \
+    DCHECK_GE(T::M, value);                                \
+    set_##f(B::update(f(), value));                        \
+  }                                                        \
+  inline JSDurationFormat::T JSDurationFormat::n() const { \
+    return B::decode(f());                                 \
+  }
+
+#define IMPL_INLINE_DISPLAY_SETTER_GETTER(f, R)                  \
+  IMPL_INLINE_SETTER_GETTER(Display, f##_display, R##DisplayBit, \
+                            display_flags, kAlways)
+
+#define IMPL_INLINE_FIELD_STYLE3_SETTER_GETTER(f, R)                          \
+  IMPL_INLINE_SETTER_GETTER(FieldStyle, f##_style, R##StyleBits, style_flags, \
+                            kNarrow)
+
+#define IMPL_INLINE_FIELD_STYLE4_SETTER_GETTER(f, R)                          \
+  IMPL_INLINE_SETTER_GETTER(FieldStyle, f##_style, R##StyleBits, style_flags, \
+                            kNumeric)
+
+#define IMPL_INLINE_FIELD_STYLE5_SETTER_GETTER(f, R)                          \
+  IMPL_INLINE_SETTER_GETTER(FieldStyle, f##_style, R##StyleBits, style_flags, \
+                            k2Digit)
+
+IMPL_INLINE_DISPLAY_SETTER_GETTER(years, Years)
+IMPL_INLINE_DISPLAY_SETTER_GETTER(months, Months)
+IMPL_INLINE_DISPLAY_SETTER_GETTER(weeks, Weeks)
+IMPL_INLINE_DISPLAY_SETTER_GETTER(days, Days)
+IMPL_INLINE_DISPLAY_SETTER_GETTER(hours, Hours)
+IMPL_INLINE_DISPLAY_SETTER_GETTER(minutes, Minutes)
+IMPL_INLINE_DISPLAY_SETTER_GETTER(seconds, Seconds)
+IMPL_INLINE_DISPLAY_SETTER_GETTER(milliseconds, Milliseconds)
+IMPL_INLINE_DISPLAY_SETTER_GETTER(microseconds, Microseconds)
+IMPL_INLINE_DISPLAY_SETTER_GETTER(nanoseconds, Nanoseconds)
+
+IMPL_INLINE_SETTER_GETTER(Style, style, StyleBits, style_flags, kDigital)
+
+IMPL_INLINE_FIELD_STYLE3_SETTER_GETTER(years, Years)
+IMPL_INLINE_FIELD_STYLE3_SETTER_GETTER(months, Months)
+IMPL_INLINE_FIELD_STYLE3_SETTER_GETTER(weeks, Weeks)
+IMPL_INLINE_FIELD_STYLE3_SETTER_GETTER(days, Days)
+IMPL_INLINE_FIELD_STYLE5_SETTER_GETTER(hours, Hours)
+IMPL_INLINE_FIELD_STYLE5_SETTER_GETTER(minutes, Minutes)
+IMPL_INLINE_FIELD_STYLE5_SETTER_GETTER(seconds, Seconds)
+IMPL_INLINE_FIELD_STYLE4_SETTER_GETTER(milliseconds, Milliseconds)
+IMPL_INLINE_FIELD_STYLE4_SETTER_GETTER(microseconds, Microseconds)
+IMPL_INLINE_FIELD_STYLE4_SETTER_GETTER(nanoseconds, Nanoseconds)
+
+#undef IMPL_INLINE_SETTER_GETTER
+#undef IMPL_INLINE_DISPLAY_SETTER_GETTER
+#undef IMPL_INLINE_FIELD_STYLE3_SETTER_GETTER
+#undef IMPL_INLINE_FIELD_STYLE5_SETTER_GETTER
+
+inline void JSDurationFormat::set_fractional_digits(int32_t digits) {
+  DCHECK_GE(9, digits);
+  DCHECK_LE(0, digits);
+  int hints = display_flags();
+  hints = FractionalDigitsBits::update(hints, digits);
+  set_display_flags(hints);
+}
+inline int32_t JSDurationFormat::fractional_digits() const {
+  int32_t v = FractionalDigitsBits::decode(display_flags());
+  DCHECK_GE(9, v);
+  DCHECK_LE(0, v);
+  return v;
+}
+
+ACCESSORS(JSDurationFormat, icu_number_formatter,
+          Managed<icu::number::LocalizedNumberFormatter>,
+          kIcuNumberFormatterOffset)
+}  // namespace internal
+}  // namespace v8
+
+#include "src/objects/object-macros-undef.h"
+
+#endif  // V8_OBJECTS_JS_DURATION_FORMAT_INL_H_
diff --git a/deps/v8/src/objects/js-duration-format.cc b/deps/v8/src/objects/js-duration-format.cc
new file mode 100644
index 00000000000000..fa7fcf3a91fb28
--- /dev/null
+++ b/deps/v8/src/objects/js-duration-format.cc
@@ -0,0 +1,774 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_INTL_SUPPORT
+#error Internationalization is expected to be enabled.
+#endif  // V8_INTL_SUPPORT
+
+#include "src/objects/js-duration-format.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <string_view>
+
+#include "src/execution/isolate.h"
+#include "src/heap/factory.h"
+#include "src/objects/intl-objects.h"
+#include "src/objects/js-duration-format-inl.h"
+#include "src/objects/js-number-format.h"
+#include "src/objects/js-temporal-objects.h"
+#include "src/objects/managed-inl.h"
+#include "src/objects/objects-inl.h"
+#include "src/objects/option-utils.h"
+#include "unicode/listformatter.h"
+#include "unicode/locid.h"
+#include "unicode/numberformatter.h"
+#include "unicode/ulistformatter.h"
+#include "unicode/unumberformatter.h"
+
+namespace v8 {
+namespace internal {
+
+using temporal::DurationRecord;
+
+namespace {
+
+// #sec-getdurationunitoptions
+enum class StylesList { k3Styles, k4Styles, k5Styles };
+enum class UnitKind { kMinutesOrSeconds, kOthers };
+struct DurationUnitOptions {
+  JSDurationFormat::FieldStyle style;
+  JSDurationFormat::Display display;
+};
+Maybe<DurationUnitOptions> GetDurationUnitOptions(
+    Isolate* isolate, const char* unit, const char* display_field,
+    Handle<JSReceiver> options, JSDurationFormat::Style base_style,
+    StylesList styles_list, JSDurationFormat::FieldStyle prev_style,
+    UnitKind unit_kind, const char* method_name) {
+  JSDurationFormat::FieldStyle style;
+  JSDurationFormat::FieldStyle digital_base;
+  // 1. Let style be ? GetOption(options, unit, "string", stylesList,
+  // undefined).
+  switch (styles_list) {
+    case StylesList::k3Styles:
+      // For years, months, weeks, days
+      MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+          isolate, style,
+          GetStringOption<JSDurationFormat::FieldStyle>(
+              isolate, options, unit, method_name, {"long", "short", "narrow"},
+              {JSDurationFormat::FieldStyle::kLong,
+               JSDurationFormat::FieldStyle::kShort,
+               JSDurationFormat::FieldStyle::kNarrow},
+              JSDurationFormat::FieldStyle::kUndefined),
+          Nothing<DurationUnitOptions>());
+      digital_base = JSDurationFormat::FieldStyle::kShort;
+      break;
+    case StylesList::k4Styles:
+      // For milliseconds, microseconds, nanoseconds
+      MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+          isolate, style,
+          GetStringOption<JSDurationFormat::FieldStyle>(
+              isolate, options, unit, method_name,
+              {"long", "short", "narrow", "numeric"},
+              {JSDurationFormat::FieldStyle::kLong,
+               JSDurationFormat::FieldStyle::kShort,
+               JSDurationFormat::FieldStyle::kNarrow,
+               JSDurationFormat::FieldStyle::kNumeric},
+              JSDurationFormat::FieldStyle::kUndefined),
+          Nothing<DurationUnitOptions>());
+      digital_base = JSDurationFormat::FieldStyle::kNumeric;
+      break;
+    case StylesList::k5Styles:
+      // For hours, minutes, seconds
+      MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+          isolate, style,
+          GetStringOption<JSDurationFormat::FieldStyle>(
+              isolate, options, unit, method_name,
+              {"long", "short", "narrow", "numeric", "2-digit"},
+              {JSDurationFormat::FieldStyle::kLong,
+               JSDurationFormat::FieldStyle::kShort,
+               JSDurationFormat::FieldStyle::kNarrow,
+               JSDurationFormat::FieldStyle::kNumeric,
+               JSDurationFormat::FieldStyle::k2Digit},
+              JSDurationFormat::FieldStyle::kUndefined),
+          Nothing<DurationUnitOptions>());
+      digital_base = JSDurationFormat::FieldStyle::kNumeric;
+      break;
+  }
+
+  // 2. Let displayDefault be "always".
+  JSDurationFormat::Display display_default =
+      JSDurationFormat::Display::kAlways;
+  // 3. If style is undefined, then
+  if (style == JSDurationFormat::FieldStyle::kUndefined) {
+    // a. If baseStyle is "digital", then
+    if (base_style == JSDurationFormat::Style::kDigital) {
+      // i. If unit is not one of "hours", "minutes", or "seconds", then
+      if (styles_list != StylesList::k5Styles) {
+        DCHECK_NE(0, strcmp(unit, "hours"));
+        DCHECK_NE(0, strcmp(unit, "minutes"));
+        DCHECK_NE(0, strcmp(unit, "seconds"));
+        // a. Set displayDefault to "auto".
+        display_default = JSDurationFormat::Display::kAuto;
+      }
+      // ii. Set style to digitalBase.
+      style = digital_base;
+      // b. Else
+    } else {
+      // i. Set displayDefault to "auto".
+      display_default = JSDurationFormat::Display::kAuto;
+      // ii. if prevStyle is "numeric" or "2-digit", then
+      if (prev_style == JSDurationFormat::FieldStyle::kNumeric ||
+          prev_style == JSDurationFormat::FieldStyle::k2Digit) {
+        // 1. Set style to "numeric".
+        style = JSDurationFormat::FieldStyle::kNumeric;
+        // iii. Else,
+      } else {
+        // 1. Set style to baseStyle.
+        switch (base_style) {
+          case JSDurationFormat::Style::kLong:
+            style = JSDurationFormat::FieldStyle::kLong;
+            break;
+          case JSDurationFormat::Style::kShort:
+            style = JSDurationFormat::FieldStyle::kShort;
+            break;
+          case JSDurationFormat::Style::kNarrow:
+            style = JSDurationFormat::FieldStyle::kNarrow;
+            break;
+          default:
+            UNREACHABLE();
+        }
+      }
+    }
+  }
+  // 4. Let displayField be the string-concatenation of unit and "Display".
+  // 5. Let display be ? GetOption(options, displayField, "string", « "auto",
+  // "always" », displayDefault).
+  JSDurationFormat::Display display;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, display,
+      GetStringOption<JSDurationFormat::Display>(
+          isolate, options, display_field, method_name, {"auto", "always"},
+          {JSDurationFormat::Display::kAuto,
+           JSDurationFormat::Display::kAlways},
+          display_default),
+      Nothing<DurationUnitOptions>());
+  // 6. If prevStyle is "numeric" or "2-digit", then
+  if (prev_style == JSDurationFormat::FieldStyle::kNumeric ||
+      prev_style == JSDurationFormat::FieldStyle::k2Digit) {
+    // a. If style is not "numeric" or "2-digit", then
+    if (style != JSDurationFormat::FieldStyle::kNumeric &&
+        style != JSDurationFormat::FieldStyle::k2Digit) {
+      // i. Throw a RangeError exception.
+      // b. Else if unit is "minutes" or "seconds", then
+    } else if (unit_kind == UnitKind::kMinutesOrSeconds) {
+      CHECK(strcmp(unit, "minutes") == 0 || strcmp(unit, "seconds") == 0);
+      // i. Set style to "2-digit".
+      style = JSDurationFormat::FieldStyle::k2Digit;
+    }
+  }
+  // 7. Return the Record { [[Style]]: style, [[Display]]: display }.
+  return Just(DurationUnitOptions({style, display}));
+}
+
+}  // namespace
+MaybeHandle<JSDurationFormat> JSDurationFormat::New(
+    Isolate* isolate, Handle<Map> map, Handle<Object> locales,
+    Handle<Object> input_options) {
+  Factory* factory = isolate->factory();
+  const char* method_name = "Intl.DurationFormat";
+
+  // 3. Let requestedLocales be ? CanonicalizeLocaleList(locales).
+  std::vector<std::string> requested_locales;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, requested_locales,
+      Intl::CanonicalizeLocaleList(isolate, locales),
+      Handle<JSDurationFormat>());
+
+  // 4. Let options be ? GetOptionsObject(options).
+  Handle<JSReceiver> options;
+  ASSIGN_RETURN_ON_EXCEPTION(
+      isolate, options, GetOptionsObject(isolate, input_options, method_name),
+      JSDurationFormat);
+
+  // 5. Let matcher be ? GetOption(options, "localeMatcher", "string", «
+  // "lookup", "best fit" », "best fit").
+  Intl::MatcherOption matcher;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, matcher, Intl::GetLocaleMatcher(isolate, options, method_name),
+      Handle<JSDurationFormat>());
+
+  // 6. Let numberingSystem be ? GetOption(options, "numberingSystem", "string",
+  // undefined, undefined).
+  //
+  // 7. If numberingSystem is not undefined, then
+  //
+  // a. If numberingSystem does not match the Unicode Locale Identifier type
+  // nonterminal, throw a RangeError exception.
+  // Note: The matching test and throw in Step 7-a is throw inside
+  // Intl::GetNumberingSystem.
+  std::unique_ptr<char[]> numbering_system_str = nullptr;
+  bool get;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, get,
+      Intl::GetNumberingSystem(isolate, options, method_name,
+                               &numbering_system_str),
+      Handle<JSDurationFormat>());
+
+  // 8. Let opt be the Record { [[localeMatcher]]: matcher, [[nu]]:
+  // numberingSystem }.
+  // 9. Let r be ResolveLocale(%DurationFormat%.[[AvailableLocales]],
+  // requestedLocales, opt, %DurationFormat%.[[RelevantExtensionKeys]],
+  // %DurationFormat%.[[LocaleData]]).
+  std::set<std::string> relevant_extension_keys{"nu"};
+  Intl::ResolvedLocale r;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, r,
+      Intl::ResolveLocale(isolate, JSDurationFormat::GetAvailableLocales(),
+                          requested_locales, matcher, relevant_extension_keys),
+      Handle<JSDurationFormat>());
+
+  // 10. Let locale be r.[[locale]].
+  icu::Locale r_locale = r.icu_locale;
+  UErrorCode status = U_ZERO_ERROR;
+  // 11. Set durationFormat.[[Locale]] to locale.
+  // 12. Set durationFormat.[[NumberingSystem]] to r.[[nu]].
+  if (numbering_system_str != nullptr) {
+    auto nu_extension_it = r.extensions.find("nu");
+    if (nu_extension_it != r.extensions.end() &&
+        nu_extension_it->second != numbering_system_str.get()) {
+      r_locale.setUnicodeKeywordValue("nu", nullptr, status);
+      DCHECK(U_SUCCESS(status));
+    }
+  }
+  icu::Locale icu_locale = r_locale;
+  if (numbering_system_str != nullptr &&
+      Intl::IsValidNumberingSystem(numbering_system_str.get())) {
+    r_locale.setUnicodeKeywordValue("nu", numbering_system_str.get(), status);
+    DCHECK(U_SUCCESS(status));
+  }
+  std::string numbering_system = Intl::GetNumberingSystem(r_locale);
+
+  // 13. Let style be ? GetOption(options, "style", "string", « "long", "short",
+  // "narrow", "digital" », "long").
+  Style style;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, style,
+      GetStringOption<Style>(
+          isolate, options, "style", method_name,
+          {"long", "short", "narrow", "digital"},
+          {Style::kLong, Style::kShort, Style::kNarrow, Style::kDigital},
+          Style::kShort),
+      Handle<JSDurationFormat>());
+
+  // 14. Set durationFormat.[[Style]] to style.
+  // 15. Set durationFormat.[[DataLocale]] to r.[[dataLocale]].
+  Handle<Managed<icu::Locale>> managed_locale =
+      Managed<icu::Locale>::FromRawPtr(isolate, 0, icu_locale.clone());
+  // 16. Let prevStyle be the empty String.
+  FieldStyle prev_style = FieldStyle::kUndefined;
+  // 17. For each row of Table 1, except the header row, in table order, do
+  //   a. Let styleSlot be the Style Slot value of the current row.
+  //   b. Let displaySlot be the Display Slot value of the current row.
+  //   c. Let unit be the Unit value.
+  //   d. Let valueList be the Values value.
+  //   e. Let digitalBase be the Digital Default value.
+  //   f. Let unitOptions be ? GetDurationUnitOptions(unit, options, style,
+  //      valueList, digitalBase, prevStyle).
+  //      of durationFormat to unitOptions.[[Style]].
+  //   h. Set the value of the
+  //      displaySlot slot of durationFormat to unitOptions.[[Display]].
+  //   i. If unit is one of "hours", "minutes", "seconds", "milliseconds",
+  //      or "microseconds", then
+  //      i. Set prevStyle to unitOptions.[[Style]].
+  //   g. Set the value of the styleSlot slot
+  DurationUnitOptions years_option;
+  DurationUnitOptions months_option;
+  DurationUnitOptions weeks_option;
+  DurationUnitOptions days_option;
+  DurationUnitOptions hours_option;
+  DurationUnitOptions minutes_option;
+  DurationUnitOptions seconds_option;
+  DurationUnitOptions milliseconds_option;
+  DurationUnitOptions microseconds_option;
+  DurationUnitOptions nanoseconds_option;
+
+#define CALL_GET_DURATION_UNIT_OPTIONS(u, sl, uk)                           \
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(                                   \
+      isolate, u##_option,                                                  \
+      GetDurationUnitOptions(isolate, #u, #u "Display", options, style, sl, \
+                             prev_style, uk, method_name),                  \
+      Handle<JSDurationFormat>());
+  CALL_GET_DURATION_UNIT_OPTIONS(years, StylesList::k3Styles, UnitKind::kOthers)
+  CALL_GET_DURATION_UNIT_OPTIONS(months, StylesList::k3Styles,
+                                 UnitKind::kOthers)
+  CALL_GET_DURATION_UNIT_OPTIONS(weeks, StylesList::k3Styles, UnitKind::kOthers)
+  CALL_GET_DURATION_UNIT_OPTIONS(days, StylesList::k3Styles, UnitKind::kOthers)
+  CALL_GET_DURATION_UNIT_OPTIONS(hours, StylesList::k5Styles, UnitKind::kOthers)
+  prev_style = hours_option.style;
+  CALL_GET_DURATION_UNIT_OPTIONS(minutes, StylesList::k5Styles,
+                                 UnitKind::kMinutesOrSeconds)
+  prev_style = minutes_option.style;
+  CALL_GET_DURATION_UNIT_OPTIONS(seconds, StylesList::k5Styles,
+                                 UnitKind::kMinutesOrSeconds)
+  prev_style = seconds_option.style;
+  CALL_GET_DURATION_UNIT_OPTIONS(milliseconds, StylesList::k4Styles,
+                                 UnitKind::kOthers)
+  prev_style = milliseconds_option.style;
+  CALL_GET_DURATION_UNIT_OPTIONS(microseconds, StylesList::k4Styles,
+                                 UnitKind::kOthers)
+  prev_style = microseconds_option.style;
+  CALL_GET_DURATION_UNIT_OPTIONS(nanoseconds, StylesList::k4Styles,
+                                 UnitKind::kOthers)
+#undef CALL_GET_DURATION_UNIT_OPTIONS
+  // 18. Set durationFormat.[[FractionalDigits]] to ? GetNumberOption(options,
+  // "fractionalDigits", 0, 9, undefined).
+  int fractional_digits;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, fractional_digits,
+      GetNumberOption(isolate, options, factory->fractionalDigits_string(), 0,
+                      9, 0),
+      Handle<JSDurationFormat>());
+
+  icu::number::LocalizedNumberFormatter fmt =
+      icu::number::UnlocalizedNumberFormatter()
+          .roundingMode(UNUM_ROUND_HALFUP)
+          .locale(icu_locale);
+  if (!numbering_system.empty() && numbering_system != "latn") {
+    fmt = fmt.adoptSymbols(icu::NumberingSystem::createInstanceByName(
+        numbering_system.c_str(), status));
+    DCHECK(U_SUCCESS(status));
+  }
+  Handle<Managed<icu::number::LocalizedNumberFormatter>>
+      managed_number_formatter =
+          Managed<icu::number::LocalizedNumberFormatter>::FromRawPtr(
+              isolate, 0, new icu::number::LocalizedNumberFormatter(fmt));
+
+  // 19. Return durationFormat.
+  Handle<JSDurationFormat> duration_format = Handle<JSDurationFormat>::cast(
+      factory->NewFastOrSlowJSObjectFromMap(map));
+  duration_format->set_style_flags(0);
+  duration_format->set_display_flags(0);
+  duration_format->set_style(style);
+  duration_format->set_years_style(years_option.style);
+  duration_format->set_months_style(months_option.style);
+  duration_format->set_weeks_style(weeks_option.style);
+  duration_format->set_days_style(days_option.style);
+  duration_format->set_hours_style(hours_option.style);
+  duration_format->set_minutes_style(minutes_option.style);
+  duration_format->set_seconds_style(seconds_option.style);
+  duration_format->set_milliseconds_style(milliseconds_option.style);
+  duration_format->set_microseconds_style(microseconds_option.style);
+  duration_format->set_nanoseconds_style(nanoseconds_option.style);
+
+  duration_format->set_years_display(years_option.display);
+  duration_format->set_months_display(months_option.display);
+  duration_format->set_weeks_display(weeks_option.display);
+  duration_format->set_days_display(days_option.display);
+  duration_format->set_hours_display(hours_option.display);
+  duration_format->set_minutes_display(minutes_option.display);
+  duration_format->set_seconds_display(seconds_option.display);
+  duration_format->set_milliseconds_display(milliseconds_option.display);
+  duration_format->set_microseconds_display(microseconds_option.display);
+  duration_format->set_nanoseconds_display(nanoseconds_option.display);
+
+  duration_format->set_fractional_digits(fractional_digits);
+
+  duration_format->set_icu_locale(*managed_locale);
+  duration_format->set_icu_number_formatter(*managed_number_formatter);
+
+  return duration_format;
+}
+
+namespace {
+
+Handle<String> StyleToString(Isolate* isolate, JSDurationFormat::Style style) {
+  switch (style) {
+    case JSDurationFormat::Style::kLong:
+      return ReadOnlyRoots(isolate).long_string_handle();
+    case JSDurationFormat::Style::kShort:
+      return ReadOnlyRoots(isolate).short_string_handle();
+    case JSDurationFormat::Style::kNarrow:
+      return ReadOnlyRoots(isolate).narrow_string_handle();
+    case JSDurationFormat::Style::kDigital:
+      return ReadOnlyRoots(isolate).digital_string_handle();
+  }
+}
+
+Handle<String> StyleToString(Isolate* isolate,
+                             JSDurationFormat::FieldStyle style) {
+  switch (style) {
+    case JSDurationFormat::FieldStyle::kLong:
+      return ReadOnlyRoots(isolate).long_string_handle();
+    case JSDurationFormat::FieldStyle::kShort:
+      return ReadOnlyRoots(isolate).short_string_handle();
+    case JSDurationFormat::FieldStyle::kNarrow:
+      return ReadOnlyRoots(isolate).narrow_string_handle();
+    case JSDurationFormat::FieldStyle::kNumeric:
+      return ReadOnlyRoots(isolate).numeric_string_handle();
+    case JSDurationFormat::FieldStyle::k2Digit:
+      return ReadOnlyRoots(isolate).two_digit_string_handle();
+    case JSDurationFormat::FieldStyle::kUndefined:
+      UNREACHABLE();
+  }
+}
+
+Handle<String> DisplayToString(Isolate* isolate,
+                               JSDurationFormat::Display display) {
+  switch (display) {
+    case JSDurationFormat::Display::kAuto:
+      return ReadOnlyRoots(isolate).auto_string_handle();
+    case JSDurationFormat::Display::kAlways:
+      return ReadOnlyRoots(isolate).always_string_handle();
+  }
+}
+
+}  // namespace
+
+Handle<JSObject> JSDurationFormat::ResolvedOptions(
+    Isolate* isolate, Handle<JSDurationFormat> format) {
+  Factory* factory = isolate->factory();
+  Handle<JSObject> options = factory->NewJSObject(isolate->object_function());
+
+  Handle<String> locale = factory->NewStringFromAsciiChecked(
+      Intl::ToLanguageTag(*format->icu_locale().raw()).FromJust().c_str());
+  UErrorCode status = U_ZERO_ERROR;
+  icu::UnicodeString skeleton =
+      format->icu_number_formatter().raw()->toSkeleton(status);
+  DCHECK(U_SUCCESS(status));
+
+  Handle<String> numbering_system;
+  CHECK(Intl::ToString(isolate,
+                       JSNumberFormat::NumberingSystemFromSkeleton(skeleton))
+            .ToHandle(&numbering_system));
+
+  Handle<Smi> fractional_digits =
+      handle(Smi::FromInt(format->fractional_digits()), isolate);
+
+  bool created;
+
+#define OUTPUT_PROPERTY(s, f)                                           \
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(                               \
+      isolate, created,                                                 \
+      JSReceiver::CreateDataProperty(isolate, options, factory->s(), f, \
+                                     Just(kDontThrow)),                 \
+      Handle<JSObject>());                                              \
+  CHECK(created);
+#define OUTPUT_STYLE_PROPERTY(p) \
+  OUTPUT_PROPERTY(p##_string, StyleToString(isolate, format->p##_style()))
+#define OUTPUT_DISPLAY_PROPERTY(p)   \
+  OUTPUT_PROPERTY(p##Display_string, \
+                  DisplayToString(isolate, format->p##_display()))
+#define OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(p) \
+  OUTPUT_STYLE_PROPERTY(p);                    \
+  OUTPUT_DISPLAY_PROPERTY(p);
+
+  OUTPUT_PROPERTY(locale_string, locale);
+  OUTPUT_PROPERTY(style_string, StyleToString(isolate, format->style()));
+
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(years);
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(months);
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(weeks);
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(days);
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(hours);
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(minutes);
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(seconds);
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(milliseconds);
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(microseconds);
+  OUTPUT_STYLE_AND_DISPLAY_PROPERTIES(nanoseconds);
+
+  OUTPUT_PROPERTY(fractionalDigits_string, fractional_digits);
+  OUTPUT_PROPERTY(numberingSystem_string, numbering_system);
+#undef OUTPUT_PROPERTY
+#undef OUTPUT_STYLE_PROPERTY
+#undef OUTPUT_DISPLAY_PROPERTY
+#undef OUTPUT_STYLE_AND_DISPLAY_PROPERTIES
+
+  return options;
+}
+
+namespace {
+
+UNumberUnitWidth ToUNumberUnitWidth(JSDurationFormat::FieldStyle style) {
+  switch (style) {
+    case JSDurationFormat::FieldStyle::kShort:
+      return UNumberUnitWidth::UNUM_UNIT_WIDTH_SHORT;
+    case JSDurationFormat::FieldStyle::kLong:
+      return UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME;
+    case JSDurationFormat::FieldStyle::kNarrow:
+      return UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW;
+    default:
+      UNREACHABLE();
+  }
+}
+
+void Output(std::vector<icu::UnicodeString>* out, double value,
+            const icu::number::LocalizedNumberFormatter& fmt) {
+  UErrorCode status = U_ZERO_ERROR;
+  out->push_back(fmt.formatDouble(value, status).toString(status));
+  CHECK(U_SUCCESS(status));
+}
+
+void Output3Styles(std::vector<icu::UnicodeString>* out,
+                   std::vector<std::string>* types, const char* type,
+                   double value, JSDurationFormat::Display display,
+                   const icu::number::LocalizedNumberFormatter& fmt) {
+  if (value == 0 && display == JSDurationFormat::Display::kAuto) return;
+  types->push_back(type);
+  Output(out, value, fmt);
+}
+
+void Output4Styles(std::vector<icu::UnicodeString>* out,
+                   std::vector<std::string>* types, const char* type,
+                   double value, JSDurationFormat::Display display,
+                   JSDurationFormat::FieldStyle style,
+                   const icu::number::LocalizedNumberFormatter& fmt,
+                   icu::MeasureUnit unit) {
+  if (value == 0 && display == JSDurationFormat::Display::kAuto) return;
+  if (style == JSDurationFormat::FieldStyle::kNumeric) {
+    types->push_back(type);
+    return Output(out, value, fmt);
+  }
+  Output3Styles(out, types, type, value, display,
+                fmt.unit(unit).unitWidth(ToUNumberUnitWidth(style)));
+}
+void Output5Styles(std::vector<icu::UnicodeString>* out,
+                   std::vector<std::string>* types, const char* type,
+                   double value, JSDurationFormat::Display display,
+                   JSDurationFormat::FieldStyle style,
+                   const icu::number::LocalizedNumberFormatter& fmt,
+                   icu::MeasureUnit unit) {
+  if (value == 0 && display == JSDurationFormat::Display::kAuto) return;
+  if (style == JSDurationFormat::FieldStyle::k2Digit) {
+    types->push_back(type);
+    return Output(out, value,
+                  fmt.integerWidth(icu::number::IntegerWidth::zeroFillTo(2)));
+  }
+  Output4Styles(out, types, type, value, display, style, fmt, unit);
+}
+
+void DurationRecordToListOfStrings(
+    std::vector<icu::UnicodeString>* out, std::vector<std::string>* types,
+    Handle<JSDurationFormat> df,
+    const icu::number::LocalizedNumberFormatter& fmt,
+    const DurationRecord& record) {
+  // The handling of "2-digit" or "numeric" style of
+  // step l.i.6.c.i-ii "Let separator be
+  // dataLocaleData.[[digitalFormat]].[[separator]]." and
+  // "Append the new Record { [[Type]]: "literal", [[Value]]: separator} to the
+  // end of result." are not implemented following the spec due to unresolved
+  // issues in
+  // https://github.com/tc39/proposal-intl-duration-format/issues/55
+  Output3Styles(out, types, "years", record.years, df->years_display(),
+                fmt.unit(icu::MeasureUnit::getYear())
+                    .unitWidth(ToUNumberUnitWidth(df->years_style())));
+  Output3Styles(out, types, "months", record.months, df->months_display(),
+                fmt.unit(icu::MeasureUnit::getMonth())
+                    .unitWidth(ToUNumberUnitWidth(df->months_style())));
+  Output3Styles(out, types, "weeks", record.weeks, df->weeks_display(),
+                fmt.unit(icu::MeasureUnit::getWeek())
+                    .unitWidth(ToUNumberUnitWidth(df->weeks_style())));
+  Output3Styles(out, types, "days", record.time_duration.days,
+                df->days_display(),
+                fmt.unit(icu::MeasureUnit::getDay())
+                    .unitWidth(ToUNumberUnitWidth(df->days_style())));
+  Output5Styles(out, types, "hours", record.time_duration.hours,
+                df->hours_display(), df->hours_style(), fmt,
+                icu::MeasureUnit::getHour());
+  Output5Styles(out, types, "minutes", record.time_duration.minutes,
+                df->minutes_display(), df->minutes_style(), fmt,
+                icu::MeasureUnit::getMinute());
+  int32_t fractional_digits = df->fractional_digits();
+  if (df->milliseconds_style() == JSDurationFormat::FieldStyle::kNumeric) {
+    // a. Set value to value + duration.[[Milliseconds]] / 10^3 +
+    // duration.[[Microseconds]] / 10^6 + duration.[[Nanoseconds]] / 10^9.
+    double value = record.time_duration.seconds +
+                   record.time_duration.milliseconds / 1e3 +
+                   record.time_duration.microseconds / 1e6 +
+                   record.time_duration.nanoseconds / 1e9;
+    Output5Styles(out, types, "seconds", value, df->seconds_display(),
+                  df->seconds_style(),
+                  fmt.precision(icu::number::Precision::minMaxFraction(
+                      fractional_digits, fractional_digits)),
+                  icu::MeasureUnit::getSecond());
+    return;
+  }
+  Output5Styles(out, types, "seconds", record.time_duration.seconds,
+                df->seconds_display(), df->seconds_style(), fmt,
+                icu::MeasureUnit::getSecond());
+
+  if (df->microseconds_style() == JSDurationFormat::FieldStyle::kNumeric) {
+    // a. Set value to value + duration.[[Microseconds]] / 10^3 +
+    // duration.[[Nanoseconds]] / 10^6.
+    double value = record.time_duration.milliseconds +
+                   record.time_duration.microseconds / 1e3 +
+                   record.time_duration.nanoseconds / 1e6;
+    Output4Styles(out, types, "milliseconds", value, df->milliseconds_display(),
+                  df->milliseconds_style(),
+                  fmt.precision(icu::number::Precision::minMaxFraction(
+                      fractional_digits, fractional_digits)),
+                  icu::MeasureUnit::getMillisecond());
+    return;
+  }
+  Output4Styles(out, types, "milliseconds", record.time_duration.milliseconds,
+                df->milliseconds_display(), df->milliseconds_style(), fmt,
+                icu::MeasureUnit::getMillisecond());
+
+  if (df->nanoseconds_style() == JSDurationFormat::FieldStyle::kNumeric) {
+    // a. Set value to value + duration.[[Nanoseconds]] / 10^3.
+    double value = record.time_duration.microseconds +
+                   record.time_duration.nanoseconds / 1e3;
+    Output4Styles(out, types, "microseconds", value, df->microseconds_display(),
+                  df->microseconds_style(),
+                  fmt.precision(icu::number::Precision::minMaxFraction(
+                      fractional_digits, fractional_digits)),
+                  icu::MeasureUnit::getMicrosecond());
+    return;
+  }
+  Output4Styles(out, types, "microseconds", record.time_duration.microseconds,
+                df->microseconds_display(), df->microseconds_style(), fmt,
+                icu::MeasureUnit::getMicrosecond());
+
+  Output4Styles(out, types, "nanoseconds", record.time_duration.nanoseconds,
+                df->nanoseconds_display(), df->nanoseconds_style(), fmt,
+                icu::MeasureUnit::getNanosecond());
+}
+
+UListFormatterWidth StyleToWidth(JSDurationFormat::Style style) {
+  switch (style) {
+    case JSDurationFormat::Style::kLong:
+      return ULISTFMT_WIDTH_WIDE;
+    case JSDurationFormat::Style::kShort:
+      return ULISTFMT_WIDTH_SHORT;
+    case JSDurationFormat::Style::kNarrow:
+    case JSDurationFormat::Style::kDigital:
+      return ULISTFMT_WIDTH_NARROW;
+  }
+  UNREACHABLE();
+}
+
+template <typename T,
+          MaybeHandle<T> (*Format)(Isolate*, const icu::FormattedValue&,
+                                   const std::vector<std::string>&)>
+MaybeHandle<T> PartitionDurationFormatPattern(Isolate* isolate,
+                                              Handle<JSDurationFormat> df,
+                                              const DurationRecord& record,
+                                              const char* method_name) {
+  // 4. Let lfOpts be ! OrdinaryObjectCreate(null).
+  // 5. Perform ! CreateDataPropertyOrThrow(lfOpts, "type", "unit").
+  UListFormatterType type = ULISTFMT_TYPE_UNITS;
+  // 6. Let listStyle be durationFormat.[[Style]].
+  // 7. If listStyle is "digital", then
+  // a. Set listStyle to "narrow".
+  // 8. Perform ! CreateDataPropertyOrThrow(lfOpts, "style", listStyle).
+  UListFormatterWidth list_style = StyleToWidth(df->style());
+  // 9. Let lf be ! Construct(%ListFormat%, « durationFormat.[[Locale]], lfOpts
+  // »).
+  UErrorCode status = U_ZERO_ERROR;
+  icu::Locale icu_locale = *df->icu_locale().raw();
+  std::unique_ptr<icu::ListFormatter> formatter(
+      icu::ListFormatter::createInstance(icu_locale, type, list_style, status));
+  CHECK(U_SUCCESS(status));
+
+  std::vector<icu::UnicodeString> list;
+  std::vector<std::string> types;
+
+  DurationRecordToListOfStrings(&list, &types, df,
+                                *(df->icu_number_formatter().raw()), record);
+
+  icu::FormattedList formatted = formatter->formatStringsToValue(
+      list.data(), static_cast<int32_t>(list.size()), status);
+  CHECK(U_SUCCESS(status));
+  return Format(isolate, formatted, types);
+}
+
+template <typename T,
+          MaybeHandle<T> (*Format)(Isolate*, const icu::FormattedValue&,
+                                   const std::vector<std::string>&)>
+MaybeHandle<T> FormatCommon(Isolate* isolate, Handle<JSDurationFormat> df,
+                            Handle<Object> duration, const char* method_name) {
+  // 1. Let df be this value.
+  // 2. Perform ? RequireInternalSlot(df, [[InitializedDurationFormat]]).
+  // 3. Let record be ? ToDurationRecord(duration).
+  DurationRecord record;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, record,
+      temporal::ToPartialDuration(isolate, duration,
+                                  {0, 0, 0, {0, 0, 0, 0, 0, 0, 0}}),
+      Handle<T>());
+  // 4. If IsValidDurationRecord(record) is false, throw a RangeError exception.
+  if (!temporal::IsValidDuration(isolate, record)) {
+    THROW_NEW_ERROR(
+        isolate,
+        NewRangeError(MessageTemplate::kInvalid,
+                      isolate->factory()->object_string(), duration),
+        T);
+  }
+  // 5. Let parts be ! PartitionDurationFormatPattern(df, record).
+  return PartitionDurationFormatPattern<T, Format>(isolate, df, record,
+                                                   method_name);
+}
+
+}  // namespace
+
+MaybeHandle<String> FormattedToString(Isolate* isolate,
+                                      const icu::FormattedValue& formatted,
+                                      const std::vector<std::string>&) {
+  return Intl::FormattedToString(isolate, formatted);
+}
+
+MaybeHandle<JSArray> FormattedListToJSArray(
+    Isolate* isolate, const icu::FormattedValue& formatted,
+    const std::vector<std::string>& types) {
+  Factory* factory = isolate->factory();
+  Handle<JSArray> array = factory->NewJSArray(0);
+  icu::ConstrainedFieldPosition cfpos;
+  cfpos.constrainCategory(UFIELD_CATEGORY_LIST);
+  int index = 0;
+  int type_index = 0;
+  UErrorCode status = U_ZERO_ERROR;
+  icu::UnicodeString string = formatted.toString(status);
+  Handle<String> substring;
+  while (formatted.nextPosition(cfpos, status) && U_SUCCESS(status)) {
+    ASSIGN_RETURN_ON_EXCEPTION(
+        isolate, substring,
+        Intl::ToString(isolate, string, cfpos.getStart(), cfpos.getLimit()),
+        JSArray);
+    Handle<String> type_string = factory->literal_string();
+    if (cfpos.getField() == ULISTFMT_ELEMENT_FIELD) {
+      type_string =
+          factory->NewStringFromAsciiChecked(types[type_index].c_str());
+      type_index++;
+    }
+    Intl::AddElement(isolate, array, index++, type_string, substring);
+  }
+  if (U_FAILURE(status)) {
+    THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kIcuError), JSArray);
+  }
+  JSObject::ValidateElements(*array);
+  return array;
+}
+
+MaybeHandle<String> JSDurationFormat::Format(Isolate* isolate,
+                                             Handle<JSDurationFormat> df,
+                                             Handle<Object> duration) {
+  const char* method_name = "Intl.DurationFormat.prototype.format";
+  return FormatCommon<String, FormattedToString>(isolate, df, duration,
+                                                 method_name);
+}
+
+MaybeHandle<JSArray> JSDurationFormat::FormatToParts(
+    Isolate* isolate, Handle<JSDurationFormat> df, Handle<Object> duration) {
+  const char* method_name = "Intl.DurationFormat.prototype.formatToParts";
+  return FormatCommon<JSArray, FormattedListToJSArray>(isolate, df, duration,
+                                                       method_name);
+}
+
+const std::set<std::string>& JSDurationFormat::GetAvailableLocales() {
+  return JSNumberFormat::GetAvailableLocales();
+}
+
+}  // namespace internal
+}  // namespace v8
diff --git a/deps/v8/src/objects/js-duration-format.h b/deps/v8/src/objects/js-duration-format.h
new file mode 100644
index 00000000000000..b91ee47e157bc2
--- /dev/null
+++ b/deps/v8/src/objects/js-duration-format.h
@@ -0,0 +1,166 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_INTL_SUPPORT
+#error Internationalization is expected to be enabled.
+#endif  // V8_INTL_SUPPORT
+
+#ifndef V8_OBJECTS_JS_DURATION_FORMAT_H_
+#define V8_OBJECTS_JS_DURATION_FORMAT_H_
+
+#include "src/execution/isolate.h"
+#include "src/heap/factory.h"
+#include "src/objects/managed.h"
+#include "src/objects/objects.h"
+
+// Has to be the last include (doesn't have include guards):
+#include "src/objects/object-macros.h"
+
+namespace U_ICU_NAMESPACE {
+class Locale;
+namespace number {
+class LocalizedNumberFormatter;
+}  // namespace number
+}  // namespace U_ICU_NAMESPACE
+
+namespace v8 {
+namespace internal {
+
+#include "torque-generated/src/objects/js-duration-format-tq.inc"
+
+class JSDurationFormat
+    : public TorqueGeneratedJSDurationFormat<JSDurationFormat, JSObject> {
+ public:
+  // Creates duration format object with properties derived from input
+  // locales and options.
+  V8_WARN_UNUSED_RESULT static MaybeHandle<JSDurationFormat> New(
+      Isolate* isolate, Handle<Map> map, Handle<Object> locales,
+      Handle<Object> options);
+
+  V8_WARN_UNUSED_RESULT static Handle<JSObject> ResolvedOptions(
+      Isolate* isolate, Handle<JSDurationFormat> format_holder);
+
+  V8_WARN_UNUSED_RESULT static MaybeHandle<String> Format(
+      Isolate* isolate, Handle<JSDurationFormat> df, Handle<Object> duration);
+
+  V8_WARN_UNUSED_RESULT static MaybeHandle<JSArray> FormatToParts(
+      Isolate* isolate, Handle<JSDurationFormat> df, Handle<Object> duration);
+
+  V8_EXPORT_PRIVATE static const std::set<std::string>& GetAvailableLocales();
+
+  enum class Display {
+    kAuto,
+    kAlways,
+
+    kMax = kAlways
+  };
+
+  enum class Style {
+    kLong,
+    kShort,
+    kNarrow,
+    kDigital,
+
+    kMax = kDigital
+  };
+
+  // The ordering of these values is significant, because sub-ranges are
+  // encoded using bitfields.
+  enum class FieldStyle {
+    kLong,
+    kShort,
+    kNarrow,
+    kNumeric,
+    k2Digit,
+    kUndefined,
+
+    kStyle3Max = kNarrow,
+    kStyle4Max = kNumeric,
+    kStyle5Max = k2Digit,
+  };
+
+#define DECLARE_INLINE_SETTER_GETTER(T, n) \
+  inline void set_##n(T display);          \
+  inline T n() const;
+
+#define DECLARE_INLINE_DISPLAY_SETTER_GETTER(f) \
+  DECLARE_INLINE_SETTER_GETTER(Display, f##_display)
+
+#define DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(f) \
+  DECLARE_INLINE_SETTER_GETTER(FieldStyle, f##_style)
+
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(years)
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(months)
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(weeks)
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(days)
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(hours)
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(minutes)
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(seconds)
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(milliseconds)
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(microseconds)
+  DECLARE_INLINE_DISPLAY_SETTER_GETTER(nanoseconds)
+
+  DECLARE_INLINE_SETTER_GETTER(Style, style)
+
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(years)
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(months)
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(weeks)
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(days)
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(hours)
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(minutes)
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(seconds)
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(milliseconds)
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(microseconds)
+  DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER(nanoseconds)
+
+#undef DECLARE_INLINE_SETTER_GETTER
+#undef DECLARE_INLINE_STYLE_SETTER_GETTER
+#undef DECLARE_INLINE_FIELD_STYLE_SETTER_GETTER
+
+  inline void set_fractional_digits(int32_t digits);
+  inline int32_t fractional_digits() const;
+
+  // Bit positions in |flags|.
+  DEFINE_TORQUE_GENERATED_JS_DURATION_FORMAT_DISPLAY_FLAGS()
+  DEFINE_TORQUE_GENERATED_JS_DURATION_FORMAT_STYLE_FLAGS()
+
+  static_assert(YearsDisplayBit::is_valid(Display::kMax));
+  static_assert(MonthsDisplayBit::is_valid(Display::kMax));
+  static_assert(WeeksDisplayBit::is_valid(Display::kMax));
+  static_assert(DaysDisplayBit::is_valid(Display::kMax));
+  static_assert(HoursDisplayBit::is_valid(Display::kMax));
+  static_assert(MinutesDisplayBit::is_valid(Display::kMax));
+  static_assert(SecondsDisplayBit::is_valid(Display::kMax));
+  static_assert(MillisecondsDisplayBit::is_valid(Display::kMax));
+  static_assert(MicrosecondsDisplayBit::is_valid(Display::kMax));
+  static_assert(NanosecondsDisplayBit::is_valid(Display::kMax));
+
+  static_assert(StyleBits::is_valid(Style::kMax));
+
+  static_assert(YearsStyleBits::is_valid(FieldStyle::kStyle3Max));
+  static_assert(MonthsStyleBits::is_valid(FieldStyle::kStyle3Max));
+  static_assert(WeeksStyleBits::is_valid(FieldStyle::kStyle3Max));
+  static_assert(DaysStyleBits::is_valid(FieldStyle::kStyle3Max));
+  static_assert(HoursStyleBits::is_valid(FieldStyle::kStyle5Max));
+  static_assert(MinutesStyleBits::is_valid(FieldStyle::kStyle5Max));
+  static_assert(SecondsStyleBits::is_valid(FieldStyle::kStyle5Max));
+  static_assert(MillisecondsStyleBits::is_valid(FieldStyle::kStyle4Max));
+  static_assert(MicrosecondsStyleBits::is_valid(FieldStyle::kStyle4Max));
+  static_assert(NanosecondsStyleBits::is_valid(FieldStyle::kStyle4Max));
+
+  DECL_ACCESSORS(icu_locale, Managed<icu::Locale>)
+  DECL_ACCESSORS(icu_number_formatter,
+                 Managed<icu::number::LocalizedNumberFormatter>)
+
+  DECL_PRINTER(JSDurationFormat)
+
+  TQ_OBJECT_CONSTRUCTORS(JSDurationFormat)
+};
+
+}  // namespace internal
+}  // namespace v8
+
+#include "src/objects/object-macros-undef.h"
+
+#endif  // V8_OBJECTS_JS_DURATION_FORMAT_H_
diff --git a/deps/v8/src/objects/js-duration-format.tq b/deps/v8/src/objects/js-duration-format.tq
new file mode 100644
index 00000000000000..55fe354105e3cd
--- /dev/null
+++ b/deps/v8/src/objects/js-duration-format.tq
@@ -0,0 +1,45 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include 'src/objects/js-duration-format.h'
+
+type JSDurationFormatStyle extends int32 constexpr 'JSDurationFormat::Style';
+type JSDurationFormatFieldStyle extends int32
+constexpr 'JSDurationFormat::FieldStyle';
+type JSDurationFormatDisplay extends int32
+constexpr 'JSDurationFormat::Display';
+bitfield struct JSDurationFormatStyleFlags extends uint31 {
+  style: JSDurationFormatStyle: 2 bit;
+  years_style: JSDurationFormatFieldStyle: 2 bit;
+  months_style: JSDurationFormatFieldStyle: 2 bit;
+  weeks_style: JSDurationFormatFieldStyle: 2 bit;
+  days_style: JSDurationFormatFieldStyle: 2 bit;
+  hours_style: JSDurationFormatFieldStyle: 3 bit;
+  minutes_style: JSDurationFormatFieldStyle: 3 bit;
+  seconds_style: JSDurationFormatFieldStyle: 3 bit;
+  milliseconds_style: JSDurationFormatFieldStyle: 2 bit;
+  microseconds_style: JSDurationFormatFieldStyle: 2 bit;
+  nanoseconds_style: JSDurationFormatFieldStyle: 2 bit;
+}
+bitfield struct JSDurationFormatDisplayFlags extends uint31 {
+  years_display: JSDurationFormatDisplay: 1 bit;
+  months_display: JSDurationFormatDisplay: 1 bit;
+  weeks_display: JSDurationFormatDisplay: 1 bit;
+  days_display: JSDurationFormatDisplay: 1 bit;
+  hours_display: JSDurationFormatDisplay: 1 bit;
+  minutes_display: JSDurationFormatDisplay: 1 bit;
+  seconds_display: JSDurationFormatDisplay: 1 bit;
+  milliseconds_display: JSDurationFormatDisplay: 1 bit;
+  microseconds_display: JSDurationFormatDisplay: 1 bit;
+  nanoseconds_display: JSDurationFormatDisplay: 1 bit;
+  fractional_digits: int32: 4 bit;
+}
+
+extern class JSDurationFormat extends JSObject {
+  style_flags: SmiTagged<JSDurationFormatStyleFlags>;
+  display_flags: SmiTagged<JSDurationFormatDisplayFlags>;
+  icu_locale: Foreign;  // Managed<icu::Locale>
+  icu_number_formatter:
+      Foreign;  // Managed<icu::number::LocalizedNumberFormatter>
+}
diff --git a/deps/v8/src/objects/js-function.cc b/deps/v8/src/objects/js-function.cc
index a7b71455964696..62fe309a471b32 100644
--- a/deps/v8/src/objects/js-function.cc
+++ b/deps/v8/src/objects/js-function.cc
@@ -628,7 +628,6 @@ void JSFunction::InitializeFeedbackCell(
       // profile and more precise code coverage.
       v8_flags.log_function_events ||
       !isolate->is_best_effort_code_coverage() ||
-      isolate->is_collecting_type_profile() ||
       function->shared().sparkplug_compiled();
 
   if (needs_feedback_vector) {
@@ -844,6 +843,7 @@ bool CanSubclassHaveInobjectProperties(InstanceType instance_type) {
     case JS_COLLATOR_TYPE:
     case JS_DATE_TIME_FORMAT_TYPE:
     case JS_DISPLAY_NAMES_TYPE:
+    case JS_DURATION_FORMAT_TYPE:
     case JS_LIST_FORMAT_TYPE:
     case JS_LOCALE_TYPE:
     case JS_NUMBER_FORMAT_TYPE:
diff --git a/deps/v8/src/objects/js-number-format.cc b/deps/v8/src/objects/js-number-format.cc
index af7bef632a557f..606fd3caf09dc4 100644
--- a/deps/v8/src/objects/js-number-format.cc
+++ b/deps/v8/src/objects/js-number-format.cc
@@ -458,7 +458,8 @@ const icu::UnicodeString CurrencyFromSkeleton(
   return skeleton.tempSubString(index, 3);
 }
 
-const icu::UnicodeString NumberingSystemFromSkeleton(
+}  // namespace
+const icu::UnicodeString JSNumberFormat::NumberingSystemFromSkeleton(
     const icu::UnicodeString& skeleton) {
   const char numbering_system[] = "numbering-system/";
   int32_t index = skeleton.indexOf(numbering_system);
@@ -470,6 +471,8 @@ const icu::UnicodeString NumberingSystemFromSkeleton(
   return res.tempSubString(0, index);
 }
 
+namespace {
+
 // Return CurrencySign as string based on skeleton.
 Handle<String> CurrencySignString(Isolate* isolate,
                                   const icu::UnicodeString& skeleton) {
@@ -949,7 +952,7 @@ Handle<JSObject> JSNumberFormat::ResolvedOptions(
 
   Handle<String> locale = Handle<String>(number_format->locale(), isolate);
   const icu::UnicodeString numberingSystem_ustr =
-      NumberingSystemFromSkeleton(skeleton);
+      JSNumberFormat::NumberingSystemFromSkeleton(skeleton);
   // 5. For each row of Table 4, except the header row, in table order, do
   // Table 4: Resolved Options of NumberFormat Instances
   //  Internal Slot                    Property
diff --git a/deps/v8/src/objects/js-number-format.h b/deps/v8/src/objects/js-number-format.h
index 9122fdaf432ab3..1b2a0041a9b3e7 100644
--- a/deps/v8/src/objects/js-number-format.h
+++ b/deps/v8/src/objects/js-number-format.h
@@ -96,6 +96,9 @@ class JSNumberFormat
       const Intl::NumberFormatDigitOptions& digit_options,
       int rounding_increment, ShowTrailingZeros show);
 
+  static const icu::UnicodeString NumberingSystemFromSkeleton(
+      const icu::UnicodeString& skeleton);
+
   V8_WARN_UNUSED_RESULT static Maybe<icu::number::LocalizedNumberRangeFormatter>
   GetRangeFormatter(
       Isolate* isolate, String locale,
diff --git a/deps/v8/src/objects/js-objects-inl.h b/deps/v8/src/objects/js-objects-inl.h
index ddb5e54c16611d..660f8c7a2ee737 100644
--- a/deps/v8/src/objects/js-objects-inl.h
+++ b/deps/v8/src/objects/js-objects-inl.h
@@ -99,6 +99,13 @@ MaybeHandle<HeapObject> JSReceiver::GetPrototype(Isolate* isolate,
                                                  Handle<JSReceiver> receiver) {
   // We don't expect access checks to be needed on JSProxy objects.
   DCHECK(!receiver->IsAccessCheckNeeded() || receiver->IsJSObject());
+
+  if (receiver->IsWasmObject()) {
+    THROW_NEW_ERROR(isolate,
+                    NewTypeError(MessageTemplate::kWasmObjectsAreOpaque),
+                    HeapObject);
+  }
+
   PrototypeIterator iter(isolate, receiver, kStartAtReceiver,
                          PrototypeIterator::END_AT_NON_HIDDEN);
   do {
diff --git a/deps/v8/src/objects/js-objects.cc b/deps/v8/src/objects/js-objects.cc
index 02c5128ea9c749..15356b6c58d2f7 100644
--- a/deps/v8/src/objects/js-objects.cc
+++ b/deps/v8/src/objects/js-objects.cc
@@ -16,6 +16,7 @@
 #include "src/heap/factory-inl.h"
 #include "src/heap/heap-inl.h"
 #include "src/heap/memory-chunk.h"
+#include "src/heap/pretenuring-handler-inl.h"
 #include "src/init/bootstrapper.h"
 #include "src/logging/counters.h"
 #include "src/logging/log.h"
@@ -42,6 +43,7 @@
 #ifdef V8_INTL_SUPPORT
 #include "src/objects/js-date-time-format.h"
 #include "src/objects/js-display-names.h"
+#include "src/objects/js-duration-format.h"
 #endif  // V8_INTL_SUPPORT
 #include "src/objects/js-generator-inl.h"
 #ifdef V8_INTL_SUPPORT
@@ -60,6 +62,7 @@
 #include "src/objects/js-segmenter.h"
 #include "src/objects/js-segments.h"
 #endif  // V8_INTL_SUPPORT
+#include "src/objects/js-raw-json-inl.h"
 #include "src/objects/js-shared-array-inl.h"
 #include "src/objects/js-struct-inl.h"
 #include "src/objects/js-temporal-objects-inl.h"
@@ -97,6 +100,8 @@ Maybe<bool> JSReceiver::HasProperty(LookupIterator* it) {
       case LookupIterator::JSPROXY:
         return JSProxy::HasProperty(it->isolate(), it->GetHolder<JSProxy>(),
                                     it->GetName());
+      case LookupIterator::WASM_OBJECT:
+        return Just(false);
       case LookupIterator::INTERCEPTOR: {
         Maybe<PropertyAttributes> result =
             JSObject::GetPropertyAttributesWithInterceptor(it);
@@ -157,6 +162,7 @@ Handle<Object> JSReceiver::GetDataProperty(LookupIterator* it,
         if (!it->isolate()->context().is_null() && it->HasAccess()) continue;
         V8_FALLTHROUGH;
       case LookupIterator::JSPROXY:
+      case LookupIterator::WASM_OBJECT:
         it->NotFound();
         return it->isolate()->factory()->undefined_value();
       case LookupIterator::ACCESSOR:
@@ -223,6 +229,9 @@ Maybe<bool> JSReceiver::CheckPrivateNameStore(LookupIterator* it,
                          NewTypeError(message, name_string, it->GetReceiver()));
         }
         return Just(true);
+      case LookupIterator::WASM_OBJECT:
+        RETURN_FAILURE(isolate, kThrowOnError,
+                       NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
     }
   }
   DCHECK(!it->IsFound());
@@ -734,6 +743,8 @@ Maybe<PropertyAttributes> JSReceiver::GetPropertyAttributes(
         UNREACHABLE();
       case LookupIterator::JSPROXY:
         return JSProxy::GetPropertyAttributes(it);
+      case LookupIterator::WASM_OBJECT:
+        return Just(ABSENT);
       case LookupIterator::INTERCEPTOR: {
         Maybe<PropertyAttributes> result =
             JSObject::GetPropertyAttributesWithInterceptor(it);
@@ -948,7 +959,6 @@ Maybe<bool> JSReceiver::DeleteProperty(LookupIterator* it,
     }
     return Just(true);
   }
-  Handle<JSObject> receiver = Handle<JSObject>::cast(it->GetReceiver());
 
   for (; it->IsFound(); it->Next()) {
     switch (it->state()) {
@@ -956,6 +966,9 @@ Maybe<bool> JSReceiver::DeleteProperty(LookupIterator* it,
       case LookupIterator::NOT_FOUND:
       case LookupIterator::TRANSITION:
         UNREACHABLE();
+      case LookupIterator::WASM_OBJECT:
+        RETURN_FAILURE(isolate, kThrowOnError,
+                       NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
       case LookupIterator::ACCESS_CHECK:
         if (it->HasAccess()) break;
         isolate->ReportFailedAccessCheck(it->GetHolder<JSObject>());
@@ -986,7 +999,7 @@ Maybe<bool> JSReceiver::DeleteProperty(LookupIterator* it,
           if (is_strict(language_mode)) {
             isolate->Throw(*isolate->factory()->NewTypeError(
                 MessageTemplate::kStrictDeleteProperty, it->GetName(),
-                receiver));
+                it->GetReceiver()));
             return Nothing<bool>();
           }
           return Just(false);
@@ -1158,6 +1171,10 @@ Maybe<bool> JSReceiver::DefineOwnProperty(Isolate* isolate,
         isolate, Handle<JSModuleNamespace>::cast(object), key, desc,
         should_throw);
   }
+  if (object->IsWasmObject()) {
+    RETURN_FAILURE(isolate, kThrowOnError,
+                   NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
+  }
 
   // OrdinaryDefineOwnProperty, by virtue of calling
   // DefineOwnPropertyIgnoreAttributes, can handle arguments
@@ -1745,6 +1762,9 @@ Maybe<bool> JSReceiver::AddPrivateField(LookupIterator* it,
       return JSProxy::SetPrivateSymbol(isolate, Handle<JSProxy>::cast(receiver),
                                        symbol, &new_desc, should_throw);
     }
+    case LookupIterator::WASM_OBJECT:
+      RETURN_FAILURE(isolate, kThrowOnError,
+                     NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
     case LookupIterator::DATA:
     case LookupIterator::INTERCEPTOR:
     case LookupIterator::ACCESSOR:
@@ -2033,6 +2053,10 @@ Maybe<bool> JSReceiver::PreventExtensions(Handle<JSReceiver> object,
     return JSProxy::PreventExtensions(Handle<JSProxy>::cast(object),
                                       should_throw);
   }
+  if (object->IsWasmObject()) {
+    RETURN_FAILURE(object->GetIsolate(), kThrowOnError,
+                   NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
+  }
   DCHECK(object->IsJSObject());
   return JSObject::PreventExtensions(Handle<JSObject>::cast(object),
                                      should_throw);
@@ -2042,6 +2066,9 @@ Maybe<bool> JSReceiver::IsExtensible(Handle<JSReceiver> object) {
   if (object->IsJSProxy()) {
     return JSProxy::IsExtensible(Handle<JSProxy>::cast(object));
   }
+  if (object->IsWasmObject()) {
+    return Just(false);
+  }
   return Just(JSObject::IsExtensible(Handle<JSObject>::cast(object)));
 }
 
@@ -2282,6 +2309,11 @@ Maybe<bool> JSReceiver::SetPrototype(Isolate* isolate,
                                      Handle<JSReceiver> object,
                                      Handle<Object> value, bool from_javascript,
                                      ShouldThrow should_throw) {
+  if (object->IsWasmObject()) {
+    RETURN_FAILURE(isolate, should_throw,
+                   NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
+  }
+
   if (object->IsJSProxy()) {
     return JSProxy::SetPrototype(isolate, Handle<JSProxy>::cast(object), value,
                                  from_javascript, should_throw);
@@ -2506,6 +2538,8 @@ int JSObject::GetHeaderSize(InstanceType type,
       return JSTemporalZonedDateTime::kHeaderSize;
     case JS_WRAPPED_FUNCTION_TYPE:
       return JSWrappedFunction::kHeaderSize;
+    case JS_RAW_JSON_TYPE:
+      return JSRawJson::kHeaderSize;
 #ifdef V8_INTL_SUPPORT
     case JS_V8_BREAK_ITERATOR_TYPE:
       return JSV8BreakIterator::kHeaderSize;
@@ -2515,6 +2549,8 @@ int JSObject::GetHeaderSize(InstanceType type,
       return JSDateTimeFormat::kHeaderSize;
     case JS_DISPLAY_NAMES_TYPE:
       return JSDisplayNames::kHeaderSize;
+    case JS_DURATION_FORMAT_TYPE:
+      return JSDurationFormat::kHeaderSize;
     case JS_LIST_FORMAT_TYPE:
       return JSListFormat::kHeaderSize;
     case JS_LOCALE_TYPE:
@@ -3561,6 +3597,7 @@ Maybe<bool> JSObject::DefineOwnPropertyIgnoreAttributes(
   for (; it->IsFound(); it->Next()) {
     switch (it->state()) {
       case LookupIterator::JSPROXY:
+      case LookupIterator::WASM_OBJECT:
       case LookupIterator::TRANSITION:
       case LookupIterator::NOT_FOUND:
         UNREACHABLE();
@@ -5296,8 +5333,11 @@ bool JSObject::UpdateAllocationSite(Handle<JSObject> object,
     DisallowGarbageCollection no_gc;
 
     Heap* heap = object->GetHeap();
+    PretenturingHandler* pretunring_handler = heap->pretenuring_handler();
     AllocationMemento memento =
-        heap->FindAllocationMemento<Heap::kForRuntime>(object->map(), *object);
+        pretunring_handler
+            ->FindAllocationMemento<PretenturingHandler::kForRuntime>(
+                object->map(), *object);
     if (memento.is_null()) return false;
 
     // Walk through to the Allocation Site
diff --git a/deps/v8/src/objects/js-raw-json-inl.h b/deps/v8/src/objects/js-raw-json-inl.h
new file mode 100644
index 00000000000000..b20a6ad1170b87
--- /dev/null
+++ b/deps/v8/src/objects/js-raw-json-inl.h
@@ -0,0 +1,26 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_OBJECTS_JS_RAW_JSON_INL_H_
+#define V8_OBJECTS_JS_RAW_JSON_INL_H_
+
+#include "src/objects/js-raw-json.h"
+#include "src/objects/objects-inl.h"
+
+// Has to be the last include (doesn't have include guards):
+#include "src/objects/object-macros.h"
+
+namespace v8 {
+namespace internal {
+
+#include "torque-generated/src/objects/js-raw-json-tq-inl.inc"
+
+TQ_OBJECT_CONSTRUCTORS_IMPL(JSRawJson)
+
+}  // namespace internal
+}  // namespace v8
+
+#include "src/objects/object-macros-undef.h"
+
+#endif  // V8_OBJECTS_JS_RAW_JSON_INL_H_
diff --git a/deps/v8/src/objects/js-raw-json.cc b/deps/v8/src/objects/js-raw-json.cc
new file mode 100644
index 00000000000000..1c820660760459
--- /dev/null
+++ b/deps/v8/src/objects/js-raw-json.cc
@@ -0,0 +1,42 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/objects/js-raw-json.h"
+
+#include "src/execution/isolate.h"
+#include "src/heap/factory.h"
+#include "src/json/json-parser.h"
+#include "src/objects/js-raw-json-inl.h"
+#include "src/objects/string-inl.h"
+
+namespace v8 {
+namespace internal {
+
+// https://tc39.es/proposal-json-parse-with-source/#sec-json.rawjson
+MaybeHandle<JSRawJson> JSRawJson::Create(Isolate* isolate,
+                                         Handle<Object> text) {
+  DCHECK(v8_flags.harmony_json_parse_with_source);
+  Handle<String> json_string;
+  ASSIGN_RETURN_ON_EXCEPTION(isolate, json_string,
+                             Object::ToString(isolate, text), JSRawJson);
+  if (String::IsOneByteRepresentationUnderneath(*json_string)) {
+    if (!JsonParser<uint8_t>::CheckRawJson(isolate, json_string)) {
+      DCHECK(isolate->has_pending_exception());
+      return MaybeHandle<JSRawJson>();
+    }
+  } else {
+    if (!JsonParser<uint16_t>::CheckRawJson(isolate, json_string)) {
+      DCHECK(isolate->has_pending_exception());
+      return MaybeHandle<JSRawJson>();
+    }
+  }
+  Handle<JSObject> result =
+      isolate->factory()->NewJSObjectFromMap(isolate->js_raw_json_map());
+  result->InObjectPropertyAtPut(JSRawJson::kRawJsonIndex, *json_string);
+  JSObject::SetIntegrityLevel(result, FROZEN, kThrowOnError).Check();
+  return Handle<JSRawJson>::cast(result);
+}
+
+}  // namespace internal
+}  // namespace v8
diff --git a/deps/v8/src/objects/js-raw-json.h b/deps/v8/src/objects/js-raw-json.h
new file mode 100644
index 00000000000000..bb9f90cbc54d9d
--- /dev/null
+++ b/deps/v8/src/objects/js-raw-json.h
@@ -0,0 +1,43 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_OBJECTS_JS_RAW_JSON_H_
+#define V8_OBJECTS_JS_RAW_JSON_H_
+
+#include "src/execution/isolate.h"
+
+// Has to be the last include (doesn't have include guards):
+#include "src/objects/object-macros.h"
+
+namespace v8 {
+namespace internal {
+
+#include "torque-generated/src/objects/js-raw-json-tq.inc"
+
+class JSRawJson : public TorqueGeneratedJSRawJson<JSRawJson, JSObject> {
+ public:
+  // Layout description.
+#define JS_RAW_JSON_FIELDS(V)    \
+  V(kRawJsonOffset, kTaggedSize) \
+  /* Total size. */              \
+  V(kSize, 0)
+  DEFINE_FIELD_OFFSET_CONSTANTS(JSObject::kHeaderSize, JS_RAW_JSON_FIELDS)
+#undef JS_RAW_JSON_FIELDS
+
+  static const int kRawJsonIndex = 0;
+
+  V8_WARN_UNUSED_RESULT static MaybeHandle<JSRawJson> Create(
+      Isolate* isolate, Handle<Object> text);
+
+  DECL_PRINTER(JSRawJson)
+
+  TQ_OBJECT_CONSTRUCTORS(JSRawJson)
+};
+
+}  // namespace internal
+}  // namespace v8
+
+#include "src/objects/object-macros-undef.h"
+
+#endif  // V8_OBJECTS_JS_RAW_JSON_H_
diff --git a/deps/v8/src/objects/js-raw-json.tq b/deps/v8/src/objects/js-raw-json.tq
new file mode 100644
index 00000000000000..03eb6af35307f3
--- /dev/null
+++ b/deps/v8/src/objects/js-raw-json.tq
@@ -0,0 +1,7 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include 'src/objects/js-raw-json.h'
+
+extern class JSRawJson extends JSObject {}
diff --git a/deps/v8/src/objects/js-regexp.cc b/deps/v8/src/objects/js-regexp.cc
index e76ee87b894b3e..d90e88dc1ec57e 100644
--- a/deps/v8/src/objects/js-regexp.cc
+++ b/deps/v8/src/objects/js-regexp.cc
@@ -258,7 +258,7 @@ int CountAdditionalEscapeChars(Handle<String> source, bool* needs_escapes_out) {
   DisallowGarbageCollection no_gc;
   int escapes = 0;
   bool needs_escapes = false;
-  bool in_char_class = false;
+  bool in_character_class = false;
   base::Vector<const Char> src = source->GetCharVector<Char>(no_gc);
   for (int i = 0; i < src.length(); i++) {
     const Char c = src[i];
@@ -270,14 +270,14 @@ int CountAdditionalEscapeChars(Handle<String> source, bool* needs_escapes_out) {
         // Escape. Skip next character, which will be copied verbatim;
         i++;
       }
-    } else if (c == '/' && !in_char_class) {
+    } else if (c == '/' && !in_character_class) {
       // Not escaped forward-slash needs escape.
       needs_escapes = true;
       escapes++;
     } else if (c == '[') {
-      in_char_class = true;
+      in_character_class = true;
     } else if (c == ']') {
-      in_char_class = false;
+      in_character_class = false;
     } else if (c == '\n') {
       needs_escapes = true;
       escapes++;
@@ -294,7 +294,7 @@ int CountAdditionalEscapeChars(Handle<String> source, bool* needs_escapes_out) {
       DCHECK(!IsLineTerminator(c));
     }
   }
-  DCHECK(!in_char_class);
+  DCHECK(!in_character_class);
   DCHECK_GE(escapes, 0);
   DCHECK_IMPLIES(escapes != 0, needs_escapes);
   *needs_escapes_out = needs_escapes;
@@ -315,7 +315,7 @@ Handle<StringType> WriteEscapedRegExpSource(Handle<String> source,
   base::Vector<Char> dst(result->GetChars(no_gc), result->length());
   int s = 0;
   int d = 0;
-  bool in_char_class = false;
+  bool in_character_class = false;
   while (s < src.length()) {
     const Char c = src[s];
     if (c == '\\') {
@@ -328,13 +328,13 @@ Handle<StringType> WriteEscapedRegExpSource(Handle<String> source,
         dst[d++] = src[s++];
       }
       if (s == src.length()) break;
-    } else if (c == '/' && !in_char_class) {
+    } else if (c == '/' && !in_character_class) {
       // Not escaped forward-slash needs escape.
       dst[d++] = '\\';
     } else if (c == '[') {
-      in_char_class = true;
+      in_character_class = true;
     } else if (c == ']') {
-      in_char_class = false;
+      in_character_class = false;
     } else if (c == '\n') {
       WriteStringToCharVector(dst, &d, "\\n");
       s++;
@@ -357,7 +357,7 @@ Handle<StringType> WriteEscapedRegExpSource(Handle<String> source,
     dst[d++] = src[s++];
   }
   DCHECK_EQ(result->length(), d);
-  DCHECK(!in_char_class);
+  DCHECK(!in_character_class);
   return result;
 }
 
diff --git a/deps/v8/src/objects/js-regexp.tq b/deps/v8/src/objects/js-regexp.tq
index d2aa4f9a3e7c59..3888767ecbb462 100644
--- a/deps/v8/src/objects/js-regexp.tq
+++ b/deps/v8/src/objects/js-regexp.tq
@@ -30,6 +30,8 @@ extern operator '.global' macro
 RegExpBuiltinsAssembler::FastFlagGetterGlobal(FastJSRegExp): bool;
 extern operator '.unicode' macro
 RegExpBuiltinsAssembler::FastFlagGetterUnicode(FastJSRegExp): bool;
+extern operator '.unicodeSets' macro
+RegExpBuiltinsAssembler::FastFlagGetterUnicodeSets(FastJSRegExp): bool;
 extern operator '.lastIndex' macro
 RegExpBuiltinsAssembler::FastLoadLastIndex(FastJSRegExp): Smi;
 extern operator '.lastIndex=' macro
diff --git a/deps/v8/src/objects/js-temporal-objects.cc b/deps/v8/src/objects/js-temporal-objects.cc
index 0251da5c7298ce..015b68f60013d2 100644
--- a/deps/v8/src/objects/js-temporal-objects.cc
+++ b/deps/v8/src/objects/js-temporal-objects.cc
@@ -61,7 +61,7 @@ enum class Unit {
 // Struct
 
 // only for BalanceTime
-struct UnbalancedTimeRecordCommon {
+struct UnbalancedTimeRecord {
   double hour;
   double minute;
   double second;
@@ -70,73 +70,48 @@ struct UnbalancedTimeRecordCommon {
   double nanosecond;
 };
 
-using temporal::DateRecordCommon;
-using temporal::DateTimeRecordCommon;
-using temporal::TimeRecordCommon;
+using temporal::DateRecord;
+using temporal::DateTimeRecord;
+using temporal::TimeRecord;
 
-struct DateRecord {
-  DateRecordCommon date;
+struct DateRecordWithCalendar {
+  DateRecord date;
   Handle<Object> calendar;  // String or Undefined
 };
 
-struct TimeRecord {
-  TimeRecordCommon time;
+struct TimeRecordWithCalendar {
+  TimeRecord time;
   Handle<Object> calendar;  // String or Undefined
 };
 
-struct DateTimeRecord {
-  DateRecordCommon date;
-  TimeRecordCommon time;
+struct TimeZoneRecord {
+  bool z;
+  Handle<Object> offset_string;  // String or Undefined
+  Handle<Object> name;           // String or Undefined
+};
+
+struct DateTimeRecordWithCalendar {
+  DateRecord date;
+  TimeRecord time;
+  TimeZoneRecord time_zone;
   Handle<Object> calendar;  // String or Undefined
 };
 
 struct InstantRecord {
-  DateRecordCommon date;
-  TimeRecordCommon time;
+  DateRecord date;
+  TimeRecord time;
   Handle<Object> offset_string;  // String or Undefined
 };
 
-// #sec-temporal-time-duration-records
-struct TimeDurationRecord {
-  double days;
-  double hours;
-  double minutes;
-  double seconds;
-  double milliseconds;
-  double microseconds;
-  double nanoseconds;
-
-  // #sec-temporal-createtimedurationrecord
-  static Maybe<TimeDurationRecord> Create(Isolate* isolate, double days,
-                                          double hours, double minutes,
-                                          double seconds, double milliseconds,
-                                          double microseconds,
-                                          double nanoseconds);
-};
-
-// #sec-temporal-duration-records
-// Cannot reuse DateDurationRecord here due to duplicate days.
-struct DurationRecord {
-  double years;
-  double months;
-  double weeks;
-  TimeDurationRecord time_duration;
-  // #sec-temporal-createdurationrecord
-  static Maybe<DurationRecord> Create(Isolate* isolate, double years,
-                                      double months, double weeks, double days,
-                                      double hours, double minutes,
-                                      double seconds, double milliseconds,
-                                      double microseconds, double nanoseconds);
-};
+using temporal::DurationRecord;
+using temporal::IsValidDuration;
+using temporal::TimeDurationRecord;
 
 struct DurationRecordWithRemainder {
   DurationRecord record;
   double remainder;
 };
 
-// #sec-temporal-isvalidduration
-bool IsValidDuration(Isolate* isolate, const DurationRecord& dur);
-
 // #sec-temporal-date-duration-records
 struct DateDurationRecord {
   double years;
@@ -149,16 +124,6 @@ struct DateDurationRecord {
                                           double days);
 };
 
-struct TimeZoneRecord {
-  bool z;
-  Handle<Object> offset_string;  // String or Undefined
-  Handle<Object> name;           // String or Undefined
-};
-
-struct ZonedDateTimeRecord {
-  DateTimeRecord date_time;
-  TimeZoneRecord time_zone;
-};
 // Options
 
 V8_WARN_UNUSED_RESULT Handle<String> UnitToString(Isolate* isolate, Unit unit);
@@ -264,16 +229,16 @@ V8_WARN_UNUSED_RESULT MaybeHandle<String> ParseTemporalCalendarString(
     Isolate* isolate, Handle<String> iso_string);
 
 // #sec-temporal-parsetemporaldatetimestring
-V8_WARN_UNUSED_RESULT Maybe<DateTimeRecord> ParseTemporalDateTimeString(
-    Isolate* isolate, Handle<String> iso_string);
+V8_WARN_UNUSED_RESULT Maybe<DateTimeRecordWithCalendar>
+ParseTemporalDateTimeString(Isolate* isolate, Handle<String> iso_string);
 
 // #sec-temporal-parsetemporaldatestring
-V8_WARN_UNUSED_RESULT Maybe<DateRecord> ParseTemporalDateString(
+V8_WARN_UNUSED_RESULT Maybe<DateRecordWithCalendar> ParseTemporalDateString(
     Isolate* isolate, Handle<String> iso_string);
 
 // #sec-temporal-parsetemporaltimestring
-Maybe<TimeRecord> ParseTemporalTimeString(Isolate* isolate,
-                                          Handle<String> iso_string);
+Maybe<TimeRecordWithCalendar> ParseTemporalTimeString(
+    Isolate* isolate, Handle<String> iso_string);
 
 // #sec-temporal-parsetemporaldurationstring
 V8_WARN_UNUSED_RESULT Maybe<DurationRecord> ParseTemporalDurationString(
@@ -293,7 +258,7 @@ V8_WARN_UNUSED_RESULT MaybeHandle<BigInt> ParseTemporalInstant(
 V8_WARN_UNUSED_RESULT MaybeHandle<BigInt> ParseTemporalInstant(
     Isolate* isolate, Handle<String> iso_string);
 
-DateRecordCommon BalanceISODate(Isolate* isolate, const DateRecordCommon& date);
+DateRecord BalanceISODate(Isolate* isolate, const DateRecord& date);
 
 // Math and Misc
 
@@ -350,13 +315,13 @@ BalancePossiblyInfiniteDuration(Isolate* isolate, Unit largest_unit,
 }
 
 V8_WARN_UNUSED_RESULT Maybe<DurationRecord> DifferenceISODateTime(
-    Isolate* isolate, const DateTimeRecordCommon& date_time1,
-    const DateTimeRecordCommon& date_time2, Handle<JSReceiver> calendar,
+    Isolate* isolate, const DateTimeRecord& date_time1,
+    const DateTimeRecord& date_time2, Handle<JSReceiver> calendar,
     Unit largest_unit, Handle<JSReceiver> relative_to, const char* method_name);
 
 // #sec-temporal-adddatetime
-V8_WARN_UNUSED_RESULT Maybe<DateTimeRecordCommon> AddDateTime(
-    Isolate* isolate, const DateTimeRecordCommon& date_time,
+V8_WARN_UNUSED_RESULT Maybe<DateTimeRecord> AddDateTime(
+    Isolate* isolate, const DateTimeRecord& date_time,
     Handle<JSReceiver> calendar, const DurationRecord& addend,
     Handle<Object> options);
 
@@ -395,17 +360,24 @@ Maybe<RoundingMode> ToTemporalRoundingMode(Isolate* isolate,
                                            Handle<JSReceiver> options,
                                            RoundingMode fallback,
                                            const char* method_name) {
+  // 1. Return ? GetOption(normalizedOptions, "roundingMode", "string", «
+  // "ceil", "floor", "expand", "trunc", "halfCeil", "halfFloor", "halfExpand",
+  // "halfTrunc", "halfEven" », fallback).
+
   return GetStringOption<RoundingMode>(
       isolate, options, "roundingMode", method_name,
-      {"ceil", "floor", "trunc", "halfExpand"},
-      {RoundingMode::kCeil, RoundingMode::kFloor, RoundingMode::kTrunc,
-       RoundingMode::kHalfExpand},
+      {"ceil", "floor", "expand", "trunc", "halfCeil", "halfFloor",
+       "halfExpand", "halfTrunc", "halfEven"},
+      {RoundingMode::kCeil, RoundingMode::kFloor, RoundingMode::kExpand,
+       RoundingMode::kTrunc, RoundingMode::kHalfCeil, RoundingMode::kHalfFloor,
+       RoundingMode::kHalfExpand, RoundingMode::kHalfTrunc,
+       RoundingMode::kHalfEven},
       fallback);
 }
 
 V8_WARN_UNUSED_RESULT
 Handle<BigInt> GetEpochFromISOParts(Isolate* isolate,
-                                    const DateTimeRecordCommon& date_time);
+                                    const DateTimeRecord& date_time);
 
 int32_t DurationSign(Isolate* isolaet, const DurationRecord& dur);
 
@@ -415,31 +387,29 @@ int32_t ISODaysInMonth(Isolate* isolate, int32_t year, int32_t month);
 // #sec-temporal-isodaysinyear
 int32_t ISODaysInYear(Isolate* isolate, int32_t year);
 
-bool IsValidTime(Isolate* isolate, const TimeRecordCommon& time);
+bool IsValidTime(Isolate* isolate, const TimeRecord& time);
 
 // #sec-temporal-isvalidisodate
-bool IsValidISODate(Isolate* isolate, const DateRecordCommon& date);
+bool IsValidISODate(Isolate* isolate, const DateRecord& date);
 
 // #sec-temporal-compareisodate
-int32_t CompareISODate(const DateRecordCommon& date1,
-                       const DateRecordCommon& date2);
+int32_t CompareISODate(const DateRecord& date1, const DateRecord& date2);
 
 // #sec-temporal-balanceisoyearmonth
 void BalanceISOYearMonth(Isolate* isolate, int32_t* year, int32_t* month);
 
 // #sec-temporal-balancetime
-V8_WARN_UNUSED_RESULT DateTimeRecordCommon
-BalanceTime(const UnbalancedTimeRecordCommon& time);
+V8_WARN_UNUSED_RESULT DateTimeRecord
+BalanceTime(const UnbalancedTimeRecord& time);
 
 // #sec-temporal-differencetime
 V8_WARN_UNUSED_RESULT Maybe<TimeDurationRecord> DifferenceTime(
-    Isolate* isolate, const TimeRecordCommon& time1,
-    const TimeRecordCommon& time2);
+    Isolate* isolate, const TimeRecord& time1, const TimeRecord& time2);
 
 // #sec-temporal-addtime
-V8_WARN_UNUSED_RESULT DateTimeRecordCommon
-AddTime(Isolate* isolate, const TimeRecordCommon& time,
-        const TimeDurationRecord& addend);
+V8_WARN_UNUSED_RESULT DateTimeRecord AddTime(Isolate* isolate,
+                                             const TimeRecord& time,
+                                             const TimeDurationRecord& addend);
 
 // #sec-temporal-totaldurationnanoseconds
 Handle<BigInt> TotalDurationNanoseconds(Isolate* isolate,
@@ -447,9 +417,9 @@ Handle<BigInt> TotalDurationNanoseconds(Isolate* isolate,
                                         double offset_shift);
 
 // #sec-temporal-totemporaltimerecord
-Maybe<TimeRecordCommon> ToTemporalTimeRecord(
-    Isolate* isolate, Handle<JSReceiver> temporal_time_like,
-    const char* method_name);
+Maybe<TimeRecord> ToTemporalTimeRecord(Isolate* isolate,
+                                       Handle<JSReceiver> temporal_time_like,
+                                       const char* method_name);
 // Calendar Operations
 
 // #sec-temporal-calendardateadd
@@ -548,7 +518,7 @@ Handle<String> DefaultTimeZone(Isolate* isolate) {
 
 // #sec-temporal-isodatetimewithinlimits
 bool ISODateTimeWithinLimits(Isolate* isolate,
-                             const DateTimeRecordCommon& date_time) {
+                             const DateTimeRecord& date_time) {
   TEMPORAL_ENTER_FUNC();
   /**
    * Note: It is really overkill to decide within the limit by following the
@@ -681,7 +651,7 @@ MaybeHandle<JSTemporalCalendar> CreateTemporalCalendar(
 // #sec-temporal-createtemporaldate
 MaybeHandle<JSTemporalPlainDate> CreateTemporalDate(
     Isolate* isolate, Handle<JSFunction> target, Handle<HeapObject> new_target,
-    const DateRecordCommon& date, Handle<JSReceiver> calendar) {
+    const DateRecord& date, Handle<JSReceiver> calendar) {
   TEMPORAL_ENTER_FUNC();
   // 1. Assert: isoYear is an integer.
   // 2. Assert: isoMonth is an integer.
@@ -718,8 +688,7 @@ MaybeHandle<JSTemporalPlainDate> CreateTemporalDate(
 }
 
 MaybeHandle<JSTemporalPlainDate> CreateTemporalDate(
-    Isolate* isolate, const DateRecordCommon& date,
-    Handle<JSReceiver> calendar) {
+    Isolate* isolate, const DateRecord& date, Handle<JSReceiver> calendar) {
   TEMPORAL_ENTER_FUNC();
   return CreateTemporalDate(isolate, CONSTRUCTOR(plain_date),
                             CONSTRUCTOR(plain_date), date, calendar);
@@ -728,7 +697,7 @@ MaybeHandle<JSTemporalPlainDate> CreateTemporalDate(
 // #sec-temporal-createtemporaldatetime
 MaybeHandle<JSTemporalPlainDateTime> CreateTemporalDateTime(
     Isolate* isolate, Handle<JSFunction> target, Handle<HeapObject> new_target,
-    const DateTimeRecordCommon& date_time, Handle<JSReceiver> calendar) {
+    const DateTimeRecord& date_time, Handle<JSReceiver> calendar) {
   TEMPORAL_ENTER_FUNC();
   // 1. Assert: isoYear, isoMonth, isoDay, hour, minute, second, millisecond,
   // microsecond, and nanosecond are integers.
@@ -786,7 +755,7 @@ MaybeHandle<JSTemporalPlainDateTime> CreateTemporalDateTime(
 }
 
 MaybeHandle<JSTemporalPlainDateTime> CreateTemporalDateTimeDefaultTarget(
-    Isolate* isolate, const DateTimeRecordCommon& date_time,
+    Isolate* isolate, const DateTimeRecord& date_time,
     Handle<JSReceiver> calendar) {
   TEMPORAL_ENTER_FUNC();
   return CreateTemporalDateTime(isolate, CONSTRUCTOR(plain_date_time),
@@ -799,7 +768,7 @@ MaybeHandle<JSTemporalPlainDateTime> CreateTemporalDateTimeDefaultTarget(
 namespace temporal {
 
 MaybeHandle<JSTemporalPlainDateTime> CreateTemporalDateTime(
-    Isolate* isolate, const DateTimeRecordCommon& date_time,
+    Isolate* isolate, const DateTimeRecord& date_time,
     Handle<JSReceiver> calendar) {
   return CreateTemporalDateTimeDefaultTarget(isolate, date_time, calendar);
 }
@@ -810,7 +779,7 @@ namespace {
 // #sec-temporal-createtemporaltime
 MaybeHandle<JSTemporalPlainTime> CreateTemporalTime(
     Isolate* isolate, Handle<JSFunction> target, Handle<HeapObject> new_target,
-    const TimeRecordCommon& time) {
+    const TimeRecord& time) {
   TEMPORAL_ENTER_FUNC();
   // 2. If ! IsValidTime(hour, minute, second, millisecond, microsecond,
   // nanosecond) is false, throw a RangeError exception.
@@ -847,8 +816,8 @@ MaybeHandle<JSTemporalPlainTime> CreateTemporalTime(
   return object;
 }
 
-MaybeHandle<JSTemporalPlainTime> CreateTemporalTime(
-    Isolate* isolate, const TimeRecordCommon& time) {
+MaybeHandle<JSTemporalPlainTime> CreateTemporalTime(Isolate* isolate,
+                                                    const TimeRecord& time) {
   TEMPORAL_ENTER_FUNC();
   return CreateTemporalTime(isolate, CONSTRUCTOR(plain_time),
                             CONSTRUCTOR(plain_time), time);
@@ -1004,6 +973,9 @@ Maybe<DateDurationRecord> DateDurationRecord::Create(
   return Just(record);
 }
 
+}  // namespace
+
+namespace temporal {
 // #sec-temporal-createtimedurationrecord
 Maybe<TimeDurationRecord> TimeDurationRecord::Create(
     Isolate* isolate, double days, double hours, double minutes, double seconds,
@@ -1050,7 +1022,9 @@ Maybe<DurationRecord> DurationRecord::Create(
   // ℝ(𝔽(nanoseconds)) }.
   return Just(record);
 }
+}  // namespace temporal
 
+namespace {
 // #sec-temporal-createtemporalduration
 MaybeHandle<JSTemporalDuration> CreateTemporalDuration(
     Isolate* isolate, Handle<JSFunction> target, Handle<HeapObject> new_target,
@@ -1272,14 +1246,14 @@ Handle<JSTemporalTimeZone> SystemTimeZone(Isolate* isolate) {
       .ToHandleChecked();
 }
 
-DateTimeRecordCommon GetISOPartsFromEpoch(Isolate* isolate,
-                                          Handle<BigInt> epoch_nanoseconds) {
+DateTimeRecord GetISOPartsFromEpoch(Isolate* isolate,
+                                    Handle<BigInt> epoch_nanoseconds) {
   TEMPORAL_ENTER_FUNC();
-  DateTimeRecordCommon result;
+  DateTimeRecord result;
   // 1. Assert: ! IsValidEpochNanoseconds(ℤ(epochNanoseconds)) is true.
   DCHECK(IsValidEpochNanoseconds(isolate, epoch_nanoseconds));
   // 2. Let remainderNs be epochNanoseconds modulo 10^6.
-  Handle<BigInt> million = BigInt::FromInt64(isolate, 1000000);
+  Handle<BigInt> million = BigInt::FromUint64(isolate, 1000000);
   Handle<BigInt> remainder_ns =
       BigInt::Remainder(isolate, epoch_nanoseconds, million).ToHandleChecked();
   // Need to do some remainder magic to negative remainder.
@@ -1350,14 +1324,14 @@ DateTimeRecordCommon GetISOPartsFromEpoch(Isolate* isolate,
 }
 
 // #sec-temporal-balanceisodatetime
-DateTimeRecordCommon BalanceISODateTime(Isolate* isolate,
-                                        const DateTimeRecordCommon& date_time) {
+DateTimeRecord BalanceISODateTime(Isolate* isolate,
+                                  const DateTimeRecord& date_time) {
   TEMPORAL_ENTER_FUNC();
   // 1. Assert: year, month, day, hour, minute, second, millisecond,
   // microsecond, and nanosecond are integers.
   // 2. Let balancedTime be ! BalanceTime(hour, minute, second, millisecond,
   // microsecond, nanosecond).
-  DateTimeRecordCommon balanced_time =
+  DateTimeRecord balanced_time =
       BalanceTime({static_cast<double>(date_time.time.hour),
                    static_cast<double>(date_time.time.minute),
                    static_cast<double>(date_time.time.second),
@@ -1366,9 +1340,9 @@ DateTimeRecordCommon BalanceISODateTime(Isolate* isolate,
                    static_cast<double>(date_time.time.nanosecond)});
   // 3. Let balancedDate be ! BalanceISODate(year, month, day +
   // balancedTime.[[Days]]).
-  DateRecordCommon added_date = date_time.date;
+  DateRecord added_date = date_time.date;
   added_date.day += balanced_time.date.day;
-  DateRecordCommon balanced_date = BalanceISODate(isolate, added_date);
+  DateRecord balanced_date = BalanceISODate(isolate, added_date);
   // 4. Return the Record { [[Year]]: balancedDate.[[Year]], [[Month]]:
   // balancedDate.[[Month]], [[Day]]: balancedDate.[[Day]], [[Hour]]:
   // balancedTime.[[Hour]], [[Minute]]: balancedTime.[[Minute]], [[Second]]:
@@ -1379,7 +1353,7 @@ DateTimeRecordCommon BalanceISODateTime(Isolate* isolate,
 }
 
 // #sec-temporal-roundtowardszero
-int64_t RoundTowardsZero(double x) {
+double RoundTowardsZero(double x) {
   // 1. Return the mathematical value that is the same sign as x and whose
   // magnitude is floor(abs(x)).
   if (x < 0) {
@@ -1399,26 +1373,32 @@ Handle<String> TemporalDurationToString(Isolate* isolate,
   // seconds, milliseconds, microseconds, nanoseconds).
   DurationRecord dur = duration;
   int32_t sign = DurationSign(isolate, dur);
-
+  // Note: for the operation below, to avoid microseconds .. seconds lost
+  // precision while the resulting value may exceed the precision limit, we use
+  // extra double xx_add to hold the additional temp value.
   // 2. Set microseconds to microseconds + RoundTowardsZero(nanoseconds / 1000).
-  dur.time_duration.microseconds +=
+  double microseconds_add =
       RoundTowardsZero(dur.time_duration.nanoseconds / 1000);
   // 3. Set nanoseconds to remainder(nanoseconds, 1000).
   dur.time_duration.nanoseconds =
-      static_cast<int64_t>(dur.time_duration.nanoseconds) % 1000;
+      std::fmod(dur.time_duration.nanoseconds, 1000);
   // 4. Set milliseconds to milliseconds + RoundTowardsZero(microseconds /
   // 1000).
-  dur.time_duration.milliseconds +=
-      RoundTowardsZero(dur.time_duration.microseconds / 1000);
+  double milliseconds_add = RoundTowardsZero(
+      dur.time_duration.microseconds / 1000 + microseconds_add / 1000);
   // 5. Set microseconds to remainder(microseconds, 1000).
   dur.time_duration.microseconds =
-      static_cast<int64_t>(dur.time_duration.microseconds) % 1000;
+      std::fmod(std::fmod(dur.time_duration.microseconds, 1000) +
+                    std::fmod(microseconds_add, 1000),
+                1000);
   // 6. Set seconds to seconds + RoundTowardsZero(milliseconds / 1000).
-  dur.time_duration.seconds +=
-      RoundTowardsZero(dur.time_duration.milliseconds / 1000);
+  double seconds_add = RoundTowardsZero(dur.time_duration.milliseconds / 1000 +
+                                        milliseconds_add / 1000);
   // 7. Set milliseconds to remainder(milliseconds, 1000).
   dur.time_duration.milliseconds =
-      static_cast<int64_t>(dur.time_duration.milliseconds) % 1000;
+      std::fmod(std::fmod(dur.time_duration.milliseconds, 1000) +
+                    std::fmod(milliseconds_add, 1000),
+                1000);
 
   // 8. Let datePart be "".
   IncrementalStringBuilder date_part(isolate);
@@ -1485,7 +1465,8 @@ Handle<String> TemporalDurationToString(Isolate* isolate,
   // 16. If any of seconds, milliseconds, microseconds, and nanoseconds are not
   // 0; or years, months, weeks, days, hours, and minutes are all 0, or
   // precision is not "auto" then
-  if ((dur.time_duration.seconds != 0 || dur.time_duration.milliseconds != 0 ||
+  if ((dur.time_duration.seconds != 0 || seconds_add != 0 ||
+       dur.time_duration.milliseconds != 0 ||
        dur.time_duration.microseconds != 0 ||
        dur.time_duration.nanoseconds != 0) ||
       (dur.years == 0 && dur.months == 0 && dur.weeks == 0 &&
@@ -1527,8 +1508,31 @@ Handle<String> TemporalDurationToString(Isolate* isolate,
       }
     }
     // f. Let secondsPart be abs(seconds) formatted as a decimal number.
-    SNPrintF(buf, "%.0f", std::abs(dur.time_duration.seconds));
-    seconds_part.AppendCString(buf.data());
+    if (std::abs(seconds_add + dur.time_duration.seconds) < kMaxSafeInteger) {
+      // Fast path: The seconds_add + dur.time_duration.seconds is in the range
+      // the double could keep the precision.
+      dur.time_duration.seconds += seconds_add;
+      SNPrintF(buf, "%.0f", std::abs(dur.time_duration.seconds));
+      seconds_part.AppendCString(buf.data());
+    } else {
+      // Slow path: The seconds_add + dur.time_duration.seconds is out of the
+      // range which the double could keep the precision. Format by math via
+      // BigInt.
+      seconds_part.AppendString(
+          BigInt::ToString(
+              isolate,
+              BigInt::Add(
+                  isolate,
+                  BigInt::FromNumber(isolate, isolate->factory()->NewNumber(
+                                                  std::abs(seconds_add)))
+                      .ToHandleChecked(),
+                  BigInt::FromNumber(isolate,
+                                     isolate->factory()->NewNumber(
+                                         std::abs(dur.time_duration.seconds)))
+                      .ToHandleChecked())
+                  .ToHandleChecked())
+              .ToHandleChecked());
+    }
 
     // g. If decimalPart is not "", then
     if (decimal_part.Length() != 0) {
@@ -1621,8 +1625,7 @@ void FormatSecondsStringPart(IncrementalStringBuilder* builder, int32_t second,
 }
 
 // #sec-temporal-temporaltimetostring
-Handle<String> TemporalTimeToString(Isolate* isolate,
-                                    const TimeRecordCommon& time,
+Handle<String> TemporalTimeToString(Isolate* isolate, const TimeRecord& time,
                                     Precision precision) {
   // 1. Assert: hour, minute, second, millisecond, microsecond and nanosecond
   // are integers.
@@ -1667,7 +1670,7 @@ MaybeHandle<JSTemporalPlainDateTime> BuiltinTimeZoneGetPlainDateTimeFor(
       GetOffsetNanosecondsFor(isolate, time_zone, instant, method_name),
       Handle<JSTemporalPlainDateTime>());
   // 2. Let result be ! GetISOPartsFromEpoch(instant.[[Nanoseconds]]).
-  DateTimeRecordCommon result =
+  DateTimeRecord result =
       GetISOPartsFromEpoch(isolate, handle(instant->nanoseconds(), isolate));
 
   // 3. Set result to ! BalanceISODateTime(result.[[Year]], result.[[Month]],
@@ -1860,7 +1863,7 @@ MaybeHandle<JSTemporalInstant> DisambiguatePossibleInstants(
     // dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]],
     // dateTime.[[Calendar]], 0, 0, 0, 0, 0, 0, 0, 0, 0, −nanoseconds,
     // undefined).
-    DateTimeRecordCommon earlier;
+    DateTimeRecord earlier;
     MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
         isolate, earlier,
         AddDateTime(
@@ -1911,7 +1914,7 @@ MaybeHandle<JSTemporalInstant> DisambiguatePossibleInstants(
   // dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]],
   // dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]],
   // dateTime.[[Calendar]], 0, 0, 0, 0, 0, 0, 0, 0, 0, nanoseconds, undefined).
-  DateTimeRecordCommon later;
+  DateTimeRecord later;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, later,
       AddDateTime(isolate,
@@ -2371,21 +2374,18 @@ MaybeHandle<JSReceiver> ToTemporalCalendar(
   ASSIGN_RETURN_ON_EXCEPTION(isolate, identifier,
                              Object::ToString(isolate, temporal_calendar_like),
                              JSReceiver);
-  // 3. If ! IsBuiltinCalendar(identifier) is false, then
+  // 3. Let identifier be ? ParseTemporalCalendarString(identifier).
+  ASSIGN_RETURN_ON_EXCEPTION(isolate, identifier,
+                             ParseTemporalCalendarString(isolate, identifier),
+                             JSReceiver);
+  // 4. If IsBuiltinCalendar(identifier) is false, throw a RangeError
+  // exception.
   if (!IsBuiltinCalendar(isolate, identifier)) {
-    // a. Let identifier be ? ParseTemporalCalendarString(identifier).
-    ASSIGN_RETURN_ON_EXCEPTION(isolate, identifier,
-                               ParseTemporalCalendarString(isolate, identifier),
-                               JSReceiver);
-    // b. If IsBuiltinCalendar(identifier) is false, throw a RangeError
-    // exception.
-    if (!IsBuiltinCalendar(isolate, identifier)) {
-      THROW_NEW_ERROR(
-          isolate, NewRangeError(MessageTemplate::kInvalidCalendar, identifier),
-          JSReceiver);
-    }
+    THROW_NEW_ERROR(
+        isolate, NewRangeError(MessageTemplate::kInvalidCalendar, identifier),
+        JSReceiver);
   }
-  // 4. Return ? CreateTemporalCalendar(identifier).
+  // 5. Return ? CreateTemporalCalendar(identifier).
   return CreateTemporalCalendar(isolate, identifier);
 }
 
@@ -2557,7 +2557,7 @@ MaybeHandle<JSTemporalPlainDate> ToTemporalDate(Isolate* isolate,
                              Object::ToString(isolate, item_obj),
                              JSTemporalPlainDate);
   // 6. Let result be ? ParseTemporalDateString(string).
-  DateRecord result;
+  DateRecordWithCalendar result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result, ParseTemporalDateString(isolate, string),
       Handle<JSTemporalPlainDate>());
@@ -2622,9 +2622,8 @@ Maybe<double> ToIntegerWithoutRounding(Isolate* isolate,
 namespace temporal {
 
 // #sec-temporal-regulatetime
-Maybe<TimeRecordCommon> RegulateTime(Isolate* isolate,
-                                     const TimeRecordCommon& time,
-                                     ShowOverflow overflow) {
+Maybe<TimeRecord> RegulateTime(Isolate* isolate, const TimeRecord& time,
+                               ShowOverflow overflow) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: hour, minute, second, millisecond, microsecond and nanosecond
@@ -2632,7 +2631,7 @@ Maybe<TimeRecordCommon> RegulateTime(Isolate* isolate,
   // 2. Assert: overflow is either "constrain" or "reject".
   switch (overflow) {
     case ShowOverflow::kConstrain: {
-      TimeRecordCommon result(time);
+      TimeRecord result(time);
       // 3. If overflow is "constrain", then
       // a. Return ! ConstrainTime(hour, minute, second, millisecond,
       // microsecond, nanosecond).
@@ -2651,7 +2650,7 @@ Maybe<TimeRecordCommon> RegulateTime(Isolate* isolate,
       if (!IsValidTime(isolate, time)) {
         THROW_NEW_ERROR_RETURN_VALUE(isolate,
                                      NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
-                                     Nothing<TimeRecordCommon>());
+                                     Nothing<TimeRecord>());
       }
       // b. Return the new Record { [[Hour]]: hour, [[Minute]]: minute,
       // [[Second]]: second, [[Millisecond]]: millisecond, [[Microsecond]]:
@@ -2665,7 +2664,7 @@ MaybeHandle<JSTemporalPlainTime> ToTemporalTime(
     Isolate* isolate, Handle<Object> item_obj, const char* method_name,
     ShowOverflow overflow = ShowOverflow::kConstrain) {
   Factory* factory = isolate->factory();
-  TimeRecord result;
+  TimeRecordWithCalendar result;
   // 2. Assert: overflow is either "constrain" or "reject".
   // 3. If Type(item) is Object, then
   if (item_obj->IsJSReceiver()) {
@@ -3406,88 +3405,170 @@ MaybeHandle<String> BuiltinTimeZoneGetOffsetStringFor(
 }
 
 // #sec-temporal-parseisodatetime
-Maybe<DateTimeRecord> ParseISODateTime(Isolate* isolate,
-                                       Handle<String> iso_string,
-                                       const ParsedISO8601Result& parsed) {
+Maybe<DateTimeRecordWithCalendar> ParseISODateTime(
+    Isolate* isolate, Handle<String> iso_string,
+    const ParsedISO8601Result& parsed);
+// Note: We split ParseISODateTime to two function because the spec text
+// repeates some parsing unnecessary. If a function is calling ParseISODateTime
+// from a AO which already call ParseText() for TemporalDateTimeString,
+// TemporalInstantString, TemporalMonthDayString, TemporalTimeString,
+// TemporalYearMonthString, TemporalZonedDateTimeString. But for the usage in
+// ParseTemporalTimeZoneString, we use the following version.
+Maybe<DateTimeRecordWithCalendar> ParseISODateTime(Isolate* isolate,
+                                                   Handle<String> iso_string) {
+  // 2. For each nonterminal goal of « TemporalDateTimeString,
+  // TemporalInstantString, TemporalMonthDayString, TemporalTimeString,
+  // TemporalYearMonthString, TemporalZonedDateTimeString », do
+
+  // a. If parseResult is not a Parse Node, set parseResult to
+  // ParseText(StringToCodePoints(isoString), goal).
+  base::Optional<ParsedISO8601Result> parsed;
+  if ((parsed =
+           TemporalParser::ParseTemporalDateTimeString(isolate, iso_string))
+          .has_value() ||
+      (parsed = TemporalParser::ParseTemporalInstantString(isolate, iso_string))
+          .has_value() ||
+      (parsed =
+           TemporalParser::ParseTemporalMonthDayString(isolate, iso_string))
+          .has_value() ||
+      (parsed = TemporalParser::ParseTemporalTimeString(isolate, iso_string))
+          .has_value() ||
+      (parsed =
+           TemporalParser::ParseTemporalYearMonthString(isolate, iso_string))
+          .has_value() ||
+      (parsed = TemporalParser::ParseTemporalZonedDateTimeString(isolate,
+                                                                 iso_string))
+          .has_value()) {
+    return ParseISODateTime(isolate, iso_string, *parsed);
+  }
+
+  // 3. If parseResult is not a Parse Node, throw a RangeError exception.
+  THROW_NEW_ERROR_RETURN_VALUE(isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
+                               Nothing<DateTimeRecordWithCalendar>());
+}
+
+Maybe<DateTimeRecordWithCalendar> ParseISODateTime(
+    Isolate* isolate, Handle<String> iso_string,
+    const ParsedISO8601Result& parsed) {
   TEMPORAL_ENTER_FUNC();
 
-  DateTimeRecord result;
-  // 5. Set year to ! ToIntegerOrInfinity(year).
+  DateTimeRecordWithCalendar result;
+  // 6. Set yearMV to ! ToIntegerOrInfinity(year).
   result.date.year = parsed.date_year;
-  // 6. If month is undefined, then
+  // 7. If month is undefined, then
   if (parsed.date_month_is_undefined()) {
-    // a. Set month to 1.
+    // a. Set monthMV to 1.
     result.date.month = 1;
-    // 7. Else,
+    // 8. Else,
   } else {
-    // a. Set month to ! ToIntegerOrInfinity(month).
+    // a. Set monthMV to ! ToIntegerOrInfinity(month).
     result.date.month = parsed.date_month;
   }
 
-  // 8. If day is undefined, then
+  // 9. If day is undefined, then
   if (parsed.date_day_is_undefined()) {
-    // a. Set day to 1.
+    // a. Set dayMV to 1.
     result.date.day = 1;
-    // 9. Else,
+    // 10. Else,
   } else {
-    // a. Set day to ! ToIntegerOrInfinity(day).
+    // a. Set dayMV to ! ToIntegerOrInfinity(day).
     result.date.day = parsed.date_day;
   }
-  // 10. Set hour to ! ToIntegerOrInfinity(hour).
+  // 11. Set hourMV to ! ToIntegerOrInfinity(hour).
   result.time.hour = parsed.time_hour_is_undefined() ? 0 : parsed.time_hour;
-  // 11. Set minute to ! ToIntegerOrInfinity(minute).
+  // 12. Set minuteMV to ! ToIntegerOrInfinity(minute).
   result.time.minute =
       parsed.time_minute_is_undefined() ? 0 : parsed.time_minute;
-  // 12. Set second to ! ToIntegerOrInfinity(second).
+  // 13. Set secondMV to ! ToIntegerOrInfinity(second).
   result.time.second =
       parsed.time_second_is_undefined() ? 0 : parsed.time_second;
-  // 13. If second is 60, then
+  // 14. If secondMV is 60, then
   if (result.time.second == 60) {
-    // a. Set second to 59.
+    // a. Set secondMV to 59.
     result.time.second = 59;
   }
-  // 14. If fraction is not undefined, then
+  // 15. If fSeconds is not empty, then
   if (!parsed.time_nanosecond_is_undefined()) {
-    // a. Set fraction to the string-concatenation of the previous value of
-    // fraction and the string "000000000".
-    // b. Let millisecond be the String value equal to the substring of fraction
-    // from 0 to 3. c. Set millisecond to ! ToIntegerOrInfinity(millisecond).
+    // a. Let fSecondsDigits be the substring of CodePointsToString(fSeconds)
+    // from 1.
+    //
+    // b. Let fSecondsDigitsExtended be the string-concatenation of
+    // fSecondsDigits and "000000000".
+    //
+    // c. Let millisecond be the substring of fSecondsDigitsExtended from 0 to
+    // 3.
+    //
+    // d. Let microsecond be the substring of fSecondsDigitsExtended from 3 to
+    // 6.
+    //
+    // e. Let nanosecond be the substring of fSecondsDigitsExtended from 6 to 9.
+    //
+    // f. Let millisecondMV be ! ToIntegerOrInfinity(millisecond).
     result.time.millisecond = parsed.time_nanosecond / 1000000;
-    // d. Let microsecond be the String value equal to the substring of fraction
-    // from 3 to 6. e. Set microsecond to ! ToIntegerOrInfinity(microsecond).
+    // g. Let microsecondMV be ! ToIntegerOrInfinity(microsecond).
     result.time.microsecond = (parsed.time_nanosecond / 1000) % 1000;
-    // f. Let nanosecond be the String value equal to the substring of fraction
-    // from 6 to 9. g. Set nanosecond to ! ToIntegerOrInfinity(nanosecond).
+    // h. Let nanosecondMV be ! ToIntegerOrInfinity(nanosecond).
     result.time.nanosecond = (parsed.time_nanosecond % 1000);
-    // 15. Else,
+    // 16. Else,
   } else {
-    // a. Let millisecond be 0.
+    // a. Let millisecondMV be 0.
     result.time.millisecond = 0;
-    // b. Let microsecond be 0.
+    // b. Let microsecondMV be 0.
     result.time.microsecond = 0;
-    // c. Let nanosecond be 0.
+    // c. Let nanosecondMV be 0.
     result.time.nanosecond = 0;
   }
-  // 16. If ! IsValidISODate(year, month, day) is false, throw a RangeError
-  // exception.
+  // 17. If ! IsValidISODate(yearMV, monthMV, dayMV) is false, throw a
+  // RangeError exception.
   if (!IsValidISODate(isolate, result.date)) {
     THROW_NEW_ERROR_RETURN_VALUE(isolate,
                                  NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
-                                 Nothing<DateTimeRecord>());
+                                 Nothing<DateTimeRecordWithCalendar>());
   }
-  // 17. If ! IsValidTime(hour, minute, second, millisecond, microsecond,
-  // nanosecond) is false, throw a RangeError exception.
+  // 18. If ! IsValidTime(hourMV, minuteMV, secondMV, millisecondMV,
+  // microsecondMV, nanosecond) is false, throw a RangeError exception.
   if (!IsValidTime(isolate, result.time)) {
     THROW_NEW_ERROR_RETURN_VALUE(isolate,
                                  NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
-                                 Nothing<DateTimeRecord>());
+                                 Nothing<DateTimeRecordWithCalendar>());
   }
 
-  // 22. If calendar is empty, then
+  // 19. Let timeZoneResult be the Record { [[Z]]: false, [[OffsetString]]:
+  // undefined, [[Name]]: undefined }.
+  result.time_zone = {false, isolate->factory()->undefined_value(),
+                      isolate->factory()->undefined_value()};
+  // 20. If parseResult contains a TimeZoneIdentifier Parse Node, then
+  if (parsed.tzi_name_length != 0) {
+    // a. Let name be the source text matched by the TimeZoneIdentifier Parse
+    // Node contained within parseResult.
+    //
+    // b. Set timeZoneResult.[[Name]] to CodePointsToString(name).
+    result.time_zone.name = isolate->factory()->NewSubString(
+        iso_string, parsed.tzi_name_start,
+        parsed.tzi_name_start + parsed.tzi_name_length);
+  }
+  // 21. If parseResult contains a UTCDesignator Parse Node, then
+  if (parsed.utc_designator) {
+    // a. Set timeZoneResult.[[Z]] to true.
+    result.time_zone.z = true;
+    // 22. Else,
+  } else {
+    // a. If parseResult contains a TimeZoneNumericUTCOffset Parse Node, then
+    if (parsed.offset_string_length != 0) {
+      // i. Let offset be the source text matched by the
+      // TimeZoneNumericUTCOffset Parse Node contained within parseResult.
+      // ii. Set timeZoneResult.[[OffsetString]] to CodePointsToString(offset).
+      result.time_zone.offset_string = isolate->factory()->NewSubString(
+          iso_string, parsed.offset_string_start,
+          parsed.offset_string_start + parsed.offset_string_length);
+    }
+  }
+
+  // 23. If calendar is empty, then
   if (parsed.calendar_name_length == 0) {
     // a. Let calendarVal be undefined.
     result.calendar = isolate->factory()->undefined_value();
-    // 23. Else,
+    // 24. Else,
   } else {
     // a. Let calendarVal be CodePointsToString(calendar).
     result.calendar = isolate->factory()->NewSubString(
@@ -3497,29 +3578,30 @@ Maybe<DateTimeRecord> ParseISODateTime(Isolate* isolate,
   // 24. Return the Record { [[Year]]: yearMV, [[Month]]: monthMV, [[Day]]:
   // dayMV, [[Hour]]: hourMV, [[Minute]]: minuteMV, [[Second]]: secondMV,
   // [[Millisecond]]: millisecondMV, [[Microsecond]]: microsecondMV,
-  // [[Nanosecond]]: nanosecondMV, [[Calendar]]: calendarVal, }.
+  // [[Nanosecond]]: nanosecondMV, [[TimeZone]]: timeZoneResult,
+  // [[Calendar]]: calendarVal, }.
   return Just(result);
 }
 
 // #sec-temporal-parsetemporaldatestring
-Maybe<DateRecord> ParseTemporalDateString(Isolate* isolate,
-                                          Handle<String> iso_string) {
+Maybe<DateRecordWithCalendar> ParseTemporalDateString(
+    Isolate* isolate, Handle<String> iso_string) {
   TEMPORAL_ENTER_FUNC();
   // 1. Let parts be ? ParseTemporalDateTimeString(isoString).
   // 2. Return the Record { [[Year]]: parts.[[Year]], [[Month]]:
   // parts.[[Month]], [[Day]]: parts.[[Day]], [[Calendar]]: parts.[[Calendar]]
   // }.
-  DateTimeRecord record;
+  DateTimeRecordWithCalendar record;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, record, ParseTemporalDateTimeString(isolate, iso_string),
-      Nothing<DateRecord>());
-  DateRecord result = {record.date, record.calendar};
+      Nothing<DateRecordWithCalendar>());
+  DateRecordWithCalendar result = {record.date, record.calendar};
   return Just(result);
 }
 
 // #sec-temporal-parsetemporaltimestring
-Maybe<TimeRecord> ParseTemporalTimeString(Isolate* isolate,
-                                          Handle<String> iso_string) {
+Maybe<TimeRecordWithCalendar> ParseTemporalTimeString(
+    Isolate* isolate, Handle<String> iso_string) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: Type(isoString) is String.
@@ -3529,27 +3611,29 @@ Maybe<TimeRecord> ParseTemporalTimeString(Isolate* isolate,
       TemporalParser::ParseTemporalTimeString(isolate, iso_string);
   if (!parsed.has_value()) {
     // a. Throw a *RangeError* exception.
-    THROW_NEW_ERROR_RETURN_VALUE(
-        isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(), Nothing<TimeRecord>());
+    THROW_NEW_ERROR_RETURN_VALUE(isolate,
+                                 NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
+                                 Nothing<TimeRecordWithCalendar>());
   }
 
   // 3. If _isoString_ contains a |UTCDesignator|, then
   if (parsed->utc_designator) {
     // a. Throw a *RangeError* exception.
-    THROW_NEW_ERROR_RETURN_VALUE(
-        isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(), Nothing<TimeRecord>());
+    THROW_NEW_ERROR_RETURN_VALUE(isolate,
+                                 NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
+                                 Nothing<TimeRecordWithCalendar>());
   }
 
   // 3. Let result be ? ParseISODateTime(isoString).
-  DateTimeRecord result;
+  DateTimeRecordWithCalendar result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result, ParseISODateTime(isolate, iso_string, *parsed),
-      Nothing<TimeRecord>());
+      Nothing<TimeRecordWithCalendar>());
   // 4. Return the Record { [[Hour]]: result.[[Hour]], [[Minute]]:
   // result.[[Minute]], [[Second]]: result.[[Second]], [[Millisecond]]:
   // result.[[Millisecond]], [[Microsecond]]: result.[[Microsecond]],
   // [[Nanosecond]]: result.[[Nanosecond]], [[Calendar]]: result.[[Calendar]] }.
-  TimeRecord ret = {result.time, result.calendar};
+  TimeRecordWithCalendar ret = {result.time, result.calendar};
   return Just(ret);
 }
 
@@ -3558,9 +3642,8 @@ Maybe<InstantRecord> ParseTemporalInstantString(Isolate* isolate,
                                                 Handle<String> iso_string) {
   TEMPORAL_ENTER_FUNC();
 
-  // 1. Assert: Type(isoString) is String.
-  // 2. If isoString does not satisfy the syntax of a TemporalInstantString
-  // (see 13.33), then
+  // 1. If ParseText(StringToCodePoints(isoString), TemporalInstantString) is a
+  // List of errors, throw a RangeError exception.
   base::Optional<ParsedISO8601Result> parsed =
       TemporalParser::ParseTemporalInstantString(isolate, iso_string);
   if (!parsed.has_value()) {
@@ -3569,26 +3652,21 @@ Maybe<InstantRecord> ParseTemporalInstantString(Isolate* isolate,
                                  Nothing<InstantRecord>());
   }
 
-  // 3. Let result be ! ParseISODateTime(isoString).
-  DateTimeRecord result;
+  // 2. Let result be ? ParseISODateTime(isoString).
+  DateTimeRecordWithCalendar result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result, ParseISODateTime(isolate, iso_string, *parsed),
       Nothing<InstantRecord>());
 
-  // 4. Let timeZoneResult be ? ParseTemporalTimeZoneString(isoString).
-  TimeZoneRecord time_zone_result;
-  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-      isolate, time_zone_result,
-      ParseTemporalTimeZoneString(isolate, iso_string),
-      Nothing<InstantRecord>());
-  // 5. Let offsetString be timeZoneResult.[[OffsetString]].
-  Handle<Object> offset_string = time_zone_result.offset_string;
-  // 6. If timeZoneResult.[[Z]] is true, then
-  if (time_zone_result.z) {
+  // 3. Let offsetString be result.[[TimeZone]].[[OffsetString]].
+  Handle<Object> offset_string = result.time_zone.offset_string;
+
+  // 4. If result.[[TimeZone]].[[Z]] is true, then
+  if (result.time_zone.z) {
     // a. Set offsetString to "+00:00".
     offset_string = isolate->factory()->NewStringFromStaticChars("+00:00");
   }
-  // 7. Assert: offsetString is not undefined.
+  // 5. Assert: offsetString is not undefined.
   DCHECK(!offset_string->IsUndefined());
 
   // 6. Return the new Record { [[Year]]: result.[[Year]],
@@ -3604,7 +3682,7 @@ Maybe<InstantRecord> ParseTemporalInstantString(Isolate* isolate,
 }
 
 // #sec-temporal-parsetemporalrelativetostring
-Maybe<ZonedDateTimeRecord> ParseTemporalRelativeToString(
+Maybe<DateTimeRecordWithCalendar> ParseTemporalRelativeToString(
     Isolate* isolate, Handle<String> iso_string) {
   TEMPORAL_ENTER_FUNC();
 
@@ -3616,41 +3694,10 @@ Maybe<ZonedDateTimeRecord> ParseTemporalRelativeToString(
     // a. Throw a *RangeError* exception.
     THROW_NEW_ERROR_RETURN_VALUE(isolate,
                                  NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
-                                 Nothing<ZonedDateTimeRecord>());
+                                 Nothing<DateTimeRecordWithCalendar>());
   }
-  // 2. Let result be ? ParseISODateTime(isoString).
-  ZonedDateTimeRecord result;
-  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-      isolate, result.date_time, ParseISODateTime(isolate, iso_string, *parsed),
-      Nothing<ZonedDateTimeRecord>());
-
-  // 3. If ParseText(StringToCodePoints(isoString), TemporalZonedDateTimeString)
-  // is a Parse Node, then
-  base::Optional<ParsedISO8601Result> parsed2 =
-      TemporalParser::ParseTemporalZonedDateTimeString(isolate, iso_string);
-  if (parsed2.has_value()) {
-    // a. Let timeZoneResult be ! ParseTemporalTimeZoneString(isoString).
-    result.time_zone =
-        ParseTemporalTimeZoneString(isolate, iso_string).ToChecked();
-    // b. Let z be timeZoneResult.[[Z]].
-    // c. Let offsetString be timeZoneResult.[[OffsetString]].
-    // d. Let timeZone be timeZoneResult.[[Name]].
-  } else {
-    // a. Let z be false.
-    result.time_zone.z = false;
-    // b. Let offsetString be undefined.
-    result.time_zone.offset_string = isolate->factory()->undefined_value();
-    // c. Let timeZone be undefined.
-    result.time_zone.name = isolate->factory()->undefined_value();
-  }
-  // 5. Return the Record { [[Year]]: result.[[Year]], [[Month]]:
-  // result.[[Month]], [[Day]]: result.[[Day]], [[Hour]]: result.[[Hour]],
-  // [[Minute]]: result.[[Minute]], [[Second]]: result.[[Second]],
-  // [[Millisecond]]: result.[[Millisecond]], [[Microsecond]]:
-  // result.[[Microsecond]], [[Nanosecond]]: result.[[Nanosecond]],
-  // [[Calendar]]: result.[[Calendar]], [[TimeZoneZ]]: z,
-  // [[TimeZoneOffsetString]]: offsetString, [[TimeZoneIANAName]]: timeZone }.
-  return Just(result);
+  // 2. Returns ? ParseISODateTime(isoString).
+  return ParseISODateTime(isolate, iso_string, *parsed);
 }
 
 // #sec-temporal-parsetemporalinstant
@@ -3699,7 +3746,7 @@ MaybeHandle<BigInt> ParseTemporalInstant(Isolate* isolate,
 }
 
 // #sec-temporal-parsetemporalzoneddatetimestring
-Maybe<ZonedDateTimeRecord> ParseTemporalZonedDateTimeString(
+Maybe<DateTimeRecordWithCalendar> ParseTemporalZonedDateTimeString(
     Isolate* isolate, Handle<String> iso_string) {
   TEMPORAL_ENTER_FUNC();
   // 1. If ParseText(StringToCodePoints(isoString), TemporalZonedDateTimeString)
@@ -3709,29 +3756,11 @@ Maybe<ZonedDateTimeRecord> ParseTemporalZonedDateTimeString(
   if (!parsed.has_value()) {
     THROW_NEW_ERROR_RETURN_VALUE(isolate,
                                  NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
-                                 Nothing<ZonedDateTimeRecord>());
+                                 Nothing<DateTimeRecordWithCalendar>());
   }
 
-  // 2. Let result be ? ParseISODateTime(isoString).
-  ZonedDateTimeRecord result;
-  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-      isolate, result.date_time, ParseISODateTime(isolate, iso_string, *parsed),
-      Nothing<ZonedDateTimeRecord>());
-
-  // 3. Let timeZoneResult be ? ParseTemporalTimeZoneString(isoString).
-  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-      isolate, result.time_zone,
-      ParseTemporalTimeZoneString(isolate, iso_string),
-      Nothing<ZonedDateTimeRecord>());
-  // 4. Return the Record { [[Year]]: result.[[Year]], [[Month]]:
-  // result.[[Month]], [[Day]]: result.[[Day]], [[Hour]]: result.[[Hour]],
-  // [[Minute]]: result.[[Minute]], [[Second]]: result.[[Second]],
-  // [[Millisecond]]: result.[[Millisecond]], [[Microsecond]]:
-  // result.[[Microsecond]], [[Nanosecond]]: result.[[Nanosecond]],
-  // [[Calendar]]: result.[[Calendar]], [[TimeZoneZ]]: timeZoneResult.[[Z]],
-  // [[TimeZoneOffsetString]]: timeZoneResult.[[OffsetString]],
-  // [[TimeZoneName]]: timeZoneResult.[[Name]] }.
-  return Just(result);
+  // 2. Return ? ParseISODateTime(isoString).
+  return ParseISODateTime(isolate, iso_string, *parsed);
 }
 
 // #sec-temporal-createdurationrecord
@@ -3899,57 +3928,40 @@ Maybe<DurationRecord> ParseTemporalDurationString(Isolate* isolate,
 }
 
 // #sec-temporal-parsetemporaltimezonestring
-Maybe<TimeZoneRecord> ParseTemporalTimeZoneString(Isolate* isolate,
-                                                  Handle<String> iso_string) {
+Maybe<TimeZoneRecord> ParseTemporalTimeZoneString(
+    Isolate* isolate, Handle<String> time_zone_string) {
   TEMPORAL_ENTER_FUNC();
 
-  // 1. Assert: Type(isoString) is String.
-  // 2. If isoString does not satisfy the syntax of a TemporalTimeZoneString
-  // (see 13.33), then
+  // 1. Let parseResult be ParseText(StringToCodePoints(timeZoneString),
+  // TimeZoneIdentifier).
   base::Optional<ParsedISO8601Result> parsed =
-      TemporalParser::ParseTemporalTimeZoneString(isolate, iso_string);
-  if (!parsed.has_value()) {
+      TemporalParser::ParseTimeZoneIdentifier(isolate, time_zone_string);
+  // 2. If parseResult is a Parse Node, then
+  if (parsed.has_value()) {
+    // a. Return the Record { [[Z]]: false, [[OffsetString]]: undefined,
+    // [[Name]]: timeZoneString }.
+    return Just(TimeZoneRecord(
+        {false, isolate->factory()->undefined_value(), time_zone_string}));
+  }
+
+  // 3. Let result be ? ParseISODateTime(timeZoneString).
+  DateTimeRecordWithCalendar result;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, result, ParseISODateTime(isolate, time_zone_string),
+      Nothing<TimeZoneRecord>());
+
+  // 4. Let timeZoneResult be result.[[TimeZone]].
+  // 5. If timeZoneResult.[[Z]] is false, timeZoneResult.[[OffsetString]] is
+  // undefined, and timeZoneResult.[[Name]] is undefined, throw a RangeError
+  // exception.
+  if (!result.time_zone.z && result.time_zone.offset_string->IsUndefined() &&
+      result.time_zone.name->IsUndefined()) {
     THROW_NEW_ERROR_RETURN_VALUE(isolate,
                                  NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
                                  Nothing<TimeZoneRecord>());
   }
-  // 3. Let z, sign, hours, minutes, seconds, fraction and name be the parts of
-  // isoString produced respectively by the UTCDesignator,
-  // TimeZoneUTCOffsetSign, TimeZoneUTCOffsetHour, TimeZoneUTCOffsetMinute,
-  // TimeZoneUTCOffsetSecond, TimeZoneUTCOffsetFraction, and TimeZoneIANAName
-  // productions, or undefined if not present.
-  // 4. If name is empty, then
-  // a. Set name to undefined.
-  Handle<Object> name = isolate->factory()->undefined_value();
-  // 5. Else,
-  // a. Set name to CodePointsToString(name).
-  if (parsed->tzi_name_length > 0) {
-    name = isolate->factory()->NewSubString(
-        iso_string, parsed->tzi_name_start,
-        parsed->tzi_name_start + parsed->tzi_name_length);
-  }
-  // 6. If z is not undefined, then
-  if (parsed->utc_designator) {
-    // a. Return the Record { [[Z]]: true, [[OffsetString]]: undefined,
-    // [[Name]]: name }.
-    return Just(
-        TimeZoneRecord({true, isolate->factory()->undefined_value(), name}));
-  }
-  Handle<Object> offset_string;
-  // 7. If offsetString is empty, then
-  if (parsed->offset_string_length == 0) {
-    // a. Set offsetString to undefined.
-    offset_string = isolate->factory()->undefined_value();
-    // 8. Else,
-  } else {
-    // a. Set offsetString to CodePointsToString(offsetString).
-    offset_string = isolate->factory()->NewSubString(
-        iso_string, parsed->offset_string_start,
-        parsed->offset_string_start + parsed->offset_string_length);
-  }
-  // 9. Return the Record { [[Z]]: false, [[OffsetString]]: offsetString,
-  // [[Name]]: name }.
-  return Just(TimeZoneRecord({false, offset_string, name}));
+  // 6. Return timeZoneResult.
+  return Just(result.time_zone);
 }
 
 Maybe<int64_t> ParseTimeZoneOffsetString(Isolate* isolate,
@@ -4023,25 +4035,38 @@ MaybeHandle<String> ParseTemporalCalendarString(Isolate* isolate,
                                                 Handle<String> iso_string) {
   TEMPORAL_ENTER_FUNC();
 
-  // 1. Assert: Type(isoString) is String.
-  // 2. If isoString does not satisfy the syntax of a TemporalCalendarString
-  // (see 13.33), then a. Throw a RangeError exception.
-  base::Optional<ParsedISO8601Result> parsed =
-      TemporalParser::ParseTemporalCalendarString(isolate, iso_string);
-  if (!parsed.has_value()) {
-    THROW_NEW_ERROR(isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(), String);
-  }
-  // 3. Let id be the part of isoString produced by the CalendarName production,
-  // or undefined if not present.
-  // 4. If id is empty, then
-  if (parsed->calendar_name_length == 0) {
-    // a. Return "iso8601".
-    return isolate->factory()->iso8601_string();
+  // 1. Let parseResult be Completion(ParseISODateTime(isoString)).
+  Maybe<DateTimeRecordWithCalendar> parse_result =
+      ParseISODateTime(isolate, iso_string);
+  // 2. If parseResult is a normal completion, then
+  if (parse_result.IsJust()) {
+    // a. Let calendar be parseResult.[[Value]].[[Calendar]].
+    Handle<Object> calendar = parse_result.FromJust().calendar;
+    // b. If calendar is undefined, return "iso8601".
+    if (calendar->IsUndefined()) {
+      return isolate->factory()->iso8601_string();
+      // c. Else, return calendar.
+    } else {
+      CHECK(calendar->IsString());
+      return Handle<String>::cast(calendar);
+    }
+    // 3. Else,
+  } else {
+    DCHECK(isolate->has_pending_exception());
+    isolate->clear_pending_exception();
+    // a. Set parseResult to ParseText(StringToCodePoints(isoString),
+    // CalendarName).
+    base::Optional<ParsedISO8601Result> parsed =
+        TemporalParser::ParseCalendarName(isolate, iso_string);
+    // b. If parseResult is a List of errors, throw a RangeError exception.
+    if (!parsed.has_value()) {
+      THROW_NEW_ERROR(
+          isolate, NewRangeError(MessageTemplate::kInvalidCalendar, iso_string),
+          String);
+    }
+    // c. Else, return isoString.
+    return iso_string;
   }
-  // 5. Return CodePointsToString(id).
-  return isolate->factory()->NewSubString(
-      iso_string, parsed->calendar_name_start,
-      parsed->calendar_name_start + parsed->calendar_name_length);
 }
 
 // #sec-temporal-calendarequals
@@ -4346,8 +4371,8 @@ Maybe<int64_t> GetOffsetNanosecondsFor(Isolate* isolate,
 
   // 6. Set offsetNanoseconds to ℝ(offsetNanoseconds).
   int64_t offset_nanoseconds_int = static_cast<int64_t>(offset_nanoseconds);
-  // 7. If abs(offsetNanoseconds) > 86400 × 10^9, throw a RangeError exception.
-  if (std::abs(offset_nanoseconds_int) > 86400e9) {
+  // 7. If abs(offsetNanoseconds) >= 86400 × 10^9, throw a RangeError exception.
+  if (std::abs(offset_nanoseconds_int) >= 86400e9) {
     THROW_NEW_ERROR_RETURN_VALUE(
         isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(), Nothing<int64_t>());
   }
@@ -4640,13 +4665,12 @@ Handle<String> CanonicalizeTimeZoneName(Isolate* isolate,
 // Common routine shared by ToTemporalTimeRecord and ToPartialTime
 // #sec-temporal-topartialtime
 // #sec-temporal-totemporaltimerecord
-Maybe<TimeRecordCommon> ToTemporalTimeRecordOrPartialTime(
+Maybe<TimeRecord> ToTemporalTimeRecordOrPartialTime(
     Isolate* isolate, Handle<JSReceiver> temporal_time_like,
-    const TimeRecordCommon& time, bool skip_undefined,
-    const char* method_name) {
+    const TimeRecord& time, bool skip_undefined, const char* method_name) {
   TEMPORAL_ENTER_FUNC();
 
-  TimeRecordCommon result(time);
+  TimeRecord result(time);
   Factory* factory = isolate->factory();
   // 1. Assert: Type(temporalTimeLike) is Object.
   // 2. Let result be the new Record { [[Hour]]: undefined, [[Minute]]:
@@ -4670,7 +4694,7 @@ Maybe<TimeRecordCommon> ToTemporalTimeRecordOrPartialTime(
     ASSIGN_RETURN_ON_EXCEPTION_VALUE(
         isolate, value,
         JSReceiver::GetProperty(isolate, temporal_time_like, row.first),
-        Nothing<TimeRecordCommon>());
+        Nothing<TimeRecord>());
     // c. If value is not undefined, then
     if (!value->IsUndefined()) {
       // i. Set _any_ to *true*.
@@ -4682,7 +4706,7 @@ Maybe<TimeRecordCommon> ToTemporalTimeRecordOrPartialTime(
     // d. / ii. Set value to ? ToIntegerThrowOnOInfinity(value).
     ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, value,
                                      ToIntegerThrowOnInfinity(isolate, value),
-                                     Nothing<TimeRecordCommon>());
+                                     Nothing<TimeRecord>());
     // e. / iii. Set result's internal slot whose name is the Internal Slot
     // value of the current row to value.
     *(row.second) = value->Number();
@@ -4692,25 +4716,25 @@ Maybe<TimeRecordCommon> ToTemporalTimeRecordOrPartialTime(
   if (!any) {
     // a. Throw a *TypeError* exception.
     THROW_NEW_ERROR_RETURN_VALUE(isolate, NEW_TEMPORAL_INVALID_ARG_TYPE_ERROR(),
-                                 Nothing<TimeRecordCommon>());
+                                 Nothing<TimeRecord>());
   }
   // 4. Return result.
   return Just(result);
 }
 
 // #sec-temporal-topartialtime
-Maybe<TimeRecordCommon> ToPartialTime(Isolate* isolate,
-                                      Handle<JSReceiver> temporal_time_like,
-                                      const TimeRecordCommon& time,
-                                      const char* method_name) {
+Maybe<TimeRecord> ToPartialTime(Isolate* isolate,
+                                Handle<JSReceiver> temporal_time_like,
+                                const TimeRecord& time,
+                                const char* method_name) {
   return ToTemporalTimeRecordOrPartialTime(isolate, temporal_time_like, time,
                                            true, method_name);
 }
 
 // #sec-temporal-totemporaltimerecord
-Maybe<TimeRecordCommon> ToTemporalTimeRecord(
-    Isolate* isolate, Handle<JSReceiver> temporal_time_like,
-    const char* method_name) {
+Maybe<TimeRecord> ToTemporalTimeRecord(Isolate* isolate,
+                                       Handle<JSReceiver> temporal_time_like,
+                                       const char* method_name) {
   return ToTemporalTimeRecordOrPartialTime(
       isolate, temporal_time_like,
       {kMinInt31, kMinInt31, kMinInt31, kMinInt31, kMinInt31, kMinInt31}, false,
@@ -4965,8 +4989,7 @@ Handle<String> UnitToString(Isolate* isolate, Unit unit) {
 }
 
 // #sec-temporal-create-iso-date-record
-DateRecordCommon CreateISODateRecord(Isolate* isolate,
-                                     const DateRecordCommon& date) {
+DateRecord CreateISODateRecord(Isolate* isolate, const DateRecord& date) {
   // 1. Assert: IsValidISODate(year, month, day) is true.
   DCHECK(IsValidISODate(isolate, date));
   // 2. Return the Record { [[Year]]: year, [[Month]]: month, [[Day]]: day }.
@@ -4974,8 +4997,7 @@ DateRecordCommon CreateISODateRecord(Isolate* isolate,
 }
 
 // #sec-temporal-balanceisodate
-DateRecordCommon BalanceISODate(Isolate* isolate,
-                                const DateRecordCommon& date) {
+DateRecord BalanceISODate(Isolate* isolate, const DateRecord& date) {
   TEMPORAL_ENTER_FUNC();
   // 1. Let epochDays be MakeDay(𝔽(year), 𝔽(month - 1), 𝔽(day)).
   double epoch_days = MakeDay(date.year, date.month - 1, date.day);
@@ -4983,8 +5005,8 @@ DateRecordCommon BalanceISODate(Isolate* isolate,
   DCHECK(std::isfinite(epoch_days));
   // 3. Let ms be MakeDate(epochDays, +0𝔽).
   double ms = MakeDate(epoch_days, 0);
-  // 4. Return CreateISODateRecord(ℝ(YearFromTime(ms)), ℝ(MonthFromTime(ms)) +
-  // 1, ℝ(DateFromTime(ms))).
+  // 4. Return CreateISODateRecordWithCalendar(ℝ(YearFromTime(ms)),
+  // ℝ(MonthFromTime(ms)) + 1, ℝ(DateFromTime(ms))).
   int year = 0;
   int month = 0;
   int day = 0;
@@ -5004,11 +5026,11 @@ DateRecordCommon BalanceISODate(Isolate* isolate,
 }
 
 // #sec-temporal-adddatetime
-Maybe<DateTimeRecordCommon> AddDateTime(Isolate* isolate,
-                                        const DateTimeRecordCommon& date_time,
-                                        Handle<JSReceiver> calendar,
-                                        const DurationRecord& dur,
-                                        Handle<Object> options) {
+Maybe<DateTimeRecord> AddDateTime(Isolate* isolate,
+                                  const DateTimeRecord& date_time,
+                                  Handle<JSReceiver> calendar,
+                                  const DurationRecord& dur,
+                                  Handle<Object> options) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: ISODateTimeWithinLimits(year, month, day, hour, minute, second,
@@ -5018,7 +5040,7 @@ Maybe<DateTimeRecordCommon> AddDateTime(Isolate* isolate,
   // microsecond, nanosecond, hours, minutes, seconds, milliseconds,
   // microseconds, nanoseconds).
   const TimeDurationRecord& time = dur.time_duration;
-  DateTimeRecordCommon time_result =
+  DateTimeRecord time_result =
       AddTime(isolate, date_time.time,
               {0, time.hours, time.minutes, time.seconds, time.milliseconds,
                time.microseconds, time.nanoseconds});
@@ -5027,7 +5049,7 @@ Maybe<DateTimeRecordCommon> AddDateTime(Isolate* isolate,
   Handle<JSTemporalPlainDate> date_part;
   ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, date_part, CreateTemporalDate(isolate, date_time.date, calendar),
-      Nothing<DateTimeRecordCommon>());
+      Nothing<DateTimeRecord>());
   // 4. Let dateDuration be ? CreateTemporalDuration(years, months, weeks, days
   // + timeResult.[[Days]], 0, 0, 0, 0, 0, 0).
   Handle<JSTemporalDuration> date_duration;
@@ -5039,14 +5061,14 @@ Maybe<DateTimeRecordCommon> AddDateTime(Isolate* isolate,
            dur.months,
            dur.weeks,
            {dur.time_duration.days + time_result.date.day, 0, 0, 0, 0, 0, 0}}),
-      Nothing<DateTimeRecordCommon>());
+      Nothing<DateTimeRecord>());
   // 5. Let addedDate be ? CalendarDateAdd(calendar, datePart, dateDuration,
   // options).
   Handle<JSTemporalPlainDate> added_date;
   ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, added_date,
       CalendarDateAdd(isolate, calendar, date_part, date_duration, options),
-      Nothing<DateTimeRecordCommon>());
+      Nothing<DateTimeRecord>());
   // 6. Return the new Record { [[Year]]: addedDate.[[ISOYear]], [[Month]]:
   // addedDate.[[ISOMonth]], [[Day]]: addedDate.[[ISODay]], [[Hour]]:
   // timeResult.[[Hour]], [[Minute]]: timeResult.[[Minute]], [[Second]]:
@@ -5708,8 +5730,8 @@ Maybe<NanosecondsToDaysResult> NanosecondsToDays(Isolate* isolate,
 
 // #sec-temporal-differenceisodatetime
 Maybe<DurationRecord> DifferenceISODateTime(
-    Isolate* isolate, const DateTimeRecordCommon& date_time1,
-    const DateTimeRecordCommon& date_time2, Handle<JSReceiver> calendar,
+    Isolate* isolate, const DateTimeRecord& date_time1,
+    const DateTimeRecord& date_time2, Handle<JSReceiver> calendar,
     Unit largest_unit, Handle<JSReceiver> options, const char* method_name) {
   TEMPORAL_ENTER_FUNC();
   // 1. Assert: ISODateTimeWithinLimits(y1, mon1, d1, h1, min1, s1, ms1, mus1,
@@ -5733,8 +5755,8 @@ Maybe<DurationRecord> DifferenceISODateTime(
   // 5. Let dateSign be ! CompareISODate(y2, mon2, d2, y1, mon1, d1).
   double date_sign = CompareISODate(date_time2.date, date_time1.date);
 
-  // 6. Let adjustedDate be CreateISODateRecord(y1, mon1, d1).
-  DateRecordCommon adjusted_date = date_time1.date;
+  // 6. Let adjustedDate be CreateISODateRecordWithCalendar(y1, mon1, d1).
+  DateRecord adjusted_date = date_time1.date;
   CHECK(IsValidISODate(isolate, adjusted_date));
 
   // 7. If timeSign is -dateSign, then
@@ -5904,7 +5926,7 @@ bool IsValidEpochNanoseconds(Isolate* isolate,
 }
 
 Handle<BigInt> GetEpochFromISOParts(Isolate* isolate,
-                                    const DateTimeRecordCommon& date_time) {
+                                    const DateTimeRecord& date_time) {
   TEMPORAL_ENTER_FUNC();
   // 1. Assert: year, month, day, hour, minute, second, millisecond,
   // microsecond, and nanosecond are integers.
@@ -5976,6 +5998,10 @@ int32_t DurationSign(Isolate* isolaet, const DurationRecord& dur) {
   return 0;
 }
 
+}  // namespace
+
+namespace temporal {
+
 // #sec-temporal-isvalidduration
 bool IsValidDuration(Isolate* isolate, const DurationRecord& dur) {
   TEMPORAL_ENTER_FUNC();
@@ -6006,6 +6032,10 @@ bool IsValidDuration(Isolate* isolate, const DurationRecord& dur) {
                          time.microseconds > 0 || time.nanoseconds > 0)));
 }
 
+}  // namespace temporal
+
+namespace {
+
 // #sec-temporal-isisoleapyear
 bool IsISOLeapYear(Isolate* isolate, int32_t year) {
   TEMPORAL_ENTER_FUNC();
@@ -6047,7 +6077,7 @@ int32_t ISODaysInYear(Isolate* isolate, int32_t year) {
   return IsISOLeapYear(isolate, year) ? 366 : 365;
 }
 
-bool IsValidTime(Isolate* isolate, const TimeRecordCommon& time) {
+bool IsValidTime(Isolate* isolate, const TimeRecord& time) {
   TEMPORAL_ENTER_FUNC();
 
   // 2. If hour < 0 or hour > 23, then
@@ -6073,7 +6103,7 @@ bool IsValidTime(Isolate* isolate, const TimeRecordCommon& time) {
 }
 
 // #sec-temporal-isvalidisodate
-bool IsValidISODate(Isolate* isolate, const DateRecordCommon& date) {
+bool IsValidISODate(Isolate* isolate, const DateRecord& date) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: year, month, and day are integers.
@@ -6092,8 +6122,7 @@ bool IsValidISODate(Isolate* isolate, const DateRecordCommon& date) {
 }
 
 // #sec-temporal-compareisodate
-int32_t CompareISODate(const DateRecordCommon& one,
-                       const DateRecordCommon& two) {
+int32_t CompareISODate(const DateRecord& one, const DateRecord& two) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: y1, m1, d1, y2, m2, and d2 are integers.
@@ -6113,12 +6142,11 @@ int32_t CompareISODate(const DateRecordCommon& one,
   return 0;
 }
 
-int32_t CompareTemporalTime(const TimeRecordCommon& time1,
-                            const TimeRecordCommon& time2);
+int32_t CompareTemporalTime(const TimeRecord& time1, const TimeRecord& time2);
 
 // #sec-temporal-compareisodatetime
-int32_t CompareISODateTime(const DateTimeRecordCommon& one,
-                           const DateTimeRecordCommon& two) {
+int32_t CompareISODateTime(const DateTimeRecord& one,
+                           const DateTimeRecord& two) {
   // 2. Let dateResult be ! CompareISODate(y1, mon1, d1, y2, mon2, d2).
   int32_t date_result = CompareISODate(one.date, two.date);
   // 3. If dateResult is not 0, then
@@ -6147,10 +6175,10 @@ void BalanceISOYearMonth(Isolate* isolate, int32_t* year, int32_t* month) {
   // 4. Return the new Record { [[Year]]: year, [[Month]]: month }.
 }
 // #sec-temporal-balancetime
-DateTimeRecordCommon BalanceTime(const UnbalancedTimeRecordCommon& input) {
+DateTimeRecord BalanceTime(const UnbalancedTimeRecord& input) {
   TEMPORAL_ENTER_FUNC();
-  UnbalancedTimeRecordCommon time(input);
-  TimeRecordCommon result;
+  UnbalancedTimeRecord time(input);
+  TimeRecord result;
 
   // 1. Assert: hour, minute, second, millisecond, microsecond, and nanosecond
   // are integers.
@@ -6186,8 +6214,8 @@ DateTimeRecordCommon BalanceTime(const UnbalancedTimeRecordCommon& input) {
 
 // #sec-temporal-differencetime
 Maybe<TimeDurationRecord> DifferenceTime(Isolate* isolate,
-                                         const TimeRecordCommon& time1,
-                                         const TimeRecordCommon& time2) {
+                                         const TimeRecord& time1,
+                                         const TimeRecord& time2) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: h1, min1, s1, ms1, mus1, ns1, h2, min2, s2, ms2, mus2, and ns2
@@ -6216,7 +6244,7 @@ Maybe<TimeDurationRecord> DifferenceTime(Isolate* isolate,
 
   // 9. Let bt be ! BalanceTime(hours × sign, minutes × sign, seconds × sign,
   // milliseconds × sign, microseconds × sign, nanoseconds × sign).
-  DateTimeRecordCommon bt =
+  DateTimeRecord bt =
       BalanceTime({dur.hours * sign, dur.minutes * sign, dur.seconds * sign,
                    dur.milliseconds * sign, dur.microseconds * sign,
                    dur.nanoseconds * sign});
@@ -6231,8 +6259,8 @@ Maybe<TimeDurationRecord> DifferenceTime(Isolate* isolate,
 }
 
 // #sec-temporal-addtime
-DateTimeRecordCommon AddTime(Isolate* isolate, const TimeRecordCommon& time,
-                             const TimeDurationRecord& addend) {
+DateTimeRecord AddTime(Isolate* isolate, const TimeRecord& time,
+                       const TimeDurationRecord& addend) {
   TEMPORAL_ENTER_FUNC();
 
   DCHECK_EQ(addend.days, 0);
@@ -6330,30 +6358,29 @@ Handle<BigInt> TotalDurationNanoseconds(Isolate* isolate,
   return x;
 }
 
-Maybe<DateRecordCommon> RegulateISODate(Isolate* isolate, ShowOverflow overflow,
-                                        const DateRecordCommon& date);
+Maybe<DateRecord> RegulateISODate(Isolate* isolate, ShowOverflow overflow,
+                                  const DateRecord& date);
 Maybe<int32_t> ResolveISOMonth(Isolate* isolate, Handle<JSReceiver> fields);
 
 // #sec-temporal-isomonthdayfromfields
-Maybe<DateRecordCommon> ISOMonthDayFromFields(Isolate* isolate,
-                                              Handle<JSReceiver> fields,
-                                              Handle<JSReceiver> options,
-                                              const char* method_name) {
+Maybe<DateRecord> ISOMonthDayFromFields(Isolate* isolate,
+                                        Handle<JSReceiver> fields,
+                                        Handle<JSReceiver> options,
+                                        const char* method_name) {
   Factory* factory = isolate->factory();
   // 1. Assert: Type(fields) is Object.
-  // 2. Let overflow be ? ToTemporalOverflow(options).
-  ShowOverflow overflow;
-  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-      isolate, overflow, ToTemporalOverflow(isolate, options, method_name),
-      Nothing<DateRecordCommon>());
-
-  // 3. Set fields to ? PrepareTemporalFields(fields, « "day", "month",
+  // 2. Set fields to ? PrepareTemporalFields(fields, « "day", "month",
   // "monthCode", "year" », «"day"»).
   Handle<FixedArray> field_names = DayMonthMonthCodeYearInFixedArray(isolate);
   ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, fields,
       PrepareTemporalFields(isolate, fields, field_names, RequiredFields::kDay),
-      Nothing<DateRecordCommon>());
+      Nothing<DateRecord>());
+  // 3. Let overflow be ? ToTemporalOverflow(options).
+  ShowOverflow overflow;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, overflow, ToTemporalOverflow(isolate, options, method_name),
+      Nothing<DateRecord>());
   // 4. Let month be ! Get(fields, "month").
   Handle<Object> month_obj =
       JSReceiver::GetProperty(isolate, fields, factory->month_string())
@@ -6372,13 +6399,13 @@ Maybe<DateRecordCommon> ISOMonthDayFromFields(Isolate* isolate,
       month_code_obj->IsUndefined(isolate) && year_obj->IsUndefined(isolate)) {
     // a. Throw a TypeError exception.
     THROW_NEW_ERROR_RETURN_VALUE(isolate, NEW_TEMPORAL_INVALID_ARG_TYPE_ERROR(),
-                                 Nothing<DateRecordCommon>());
+                                 Nothing<DateRecord>());
   }
   // 8. Set month to ? ResolveISOMonth(fields).
-  DateRecordCommon result;
+  DateRecord result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, result.month,
                                          ResolveISOMonth(isolate, fields),
-                                         Nothing<DateRecordCommon>());
+                                         Nothing<DateRecord>());
 
   // 9. Let day be ! Get(fields, "day").
   Handle<Object> day_obj =
@@ -6405,7 +6432,7 @@ Maybe<DateRecordCommon> ISOMonthDayFromFields(Isolate* isolate,
   }
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result, RegulateISODate(isolate, overflow, result),
-      Nothing<DateRecordCommon>());
+      Nothing<DateRecord>());
   // 14. Return the new Record { [[Month]]: result.[[Month]], [[Day]]:
   // result.[[Day]], [[ReferenceISOYear]]: referenceISOYear }.
   result.year = reference_iso_year;
@@ -6513,10 +6540,12 @@ Handle<BigInt> RoundTemporalInstant(Isolate* isolate, Handle<BigInt> ns,
                                     RoundingMode rounding_mode);
 
 // #sec-temporal-differenceinstant
-Handle<BigInt> DifferenceInstant(Isolate* isolate, Handle<BigInt> ns1,
-                                 Handle<BigInt> ns2, double rounding_increment,
-                                 Unit smallest_unit,
-                                 RoundingMode rounding_mode);
+TimeDurationRecord DifferenceInstant(Isolate* isolate, Handle<BigInt> ns1,
+                                     Handle<BigInt> ns2,
+                                     double rounding_increment,
+                                     Unit smallest_unit, Unit largest_unit,
+                                     RoundingMode rounding_mode,
+                                     const char* method_name);
 
 // #sec-temporal-differencezoneddatetime
 Maybe<DurationRecord> DifferenceZonedDateTime(
@@ -8003,14 +8032,14 @@ namespace {
 
 // #sec-temporal-interpretisodatetimeoffset
 MaybeHandle<BigInt> InterpretISODateTimeOffset(
-    Isolate* isolate, const DateTimeRecordCommon& data,
+    Isolate* isolate, const DateTimeRecord& data,
     OffsetBehaviour offset_behaviour, int64_t offset_nanoseconds,
     Handle<JSReceiver> time_zone, Disambiguation disambiguation,
     Offset offset_option, MatchBehaviour match_behaviour,
     const char* method_name);
 
 // #sec-temporal-interprettemporaldatetimefields
-Maybe<DateTimeRecord> InterpretTemporalDateTimeFields(
+Maybe<temporal::DateTimeRecord> InterpretTemporalDateTimeFields(
     Isolate* isolate, Handle<JSReceiver> calendar, Handle<JSReceiver> fields,
     Handle<Object> options, const char* method_name);
 
@@ -8041,7 +8070,7 @@ MaybeHandle<Object> ToRelativeTemporalObject(Isolate* isolate,
 
   Handle<Object> time_zone_obj = factory->undefined_value();
   Handle<Object> offset_string_obj;
-  ZonedDateTimeRecord result;
+  temporal::DateTimeRecord result;
   Handle<JSReceiver> calendar;
   // 6. If Type(value) is Object, then
   if (value_obj->IsJSReceiver()) {
@@ -8094,7 +8123,7 @@ MaybeHandle<Object> ToRelativeTemporalObject(Isolate* isolate,
     // h. Let result be ? InterpretTemporalDateTimeFields(calendar, fields,
     // dateOptions).
     MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-        isolate, result.date_time,
+        isolate, result,
         InterpretTemporalDateTimeFields(isolate, calendar, fields, date_options,
                                         method_name),
         Handle<Object>());
@@ -8130,26 +8159,32 @@ MaybeHandle<Object> ToRelativeTemporalObject(Isolate* isolate,
     Handle<String> string;
     ASSIGN_RETURN_ON_EXCEPTION(isolate, string,
                                Object::ToString(isolate, value_obj), Object);
+    DateTimeRecordWithCalendar parsed_result;
     // b. Let result be ? ParseTemporalRelativeToString(string).
     MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-        isolate, result, ParseTemporalRelativeToString(isolate, string),
+        isolate, parsed_result, ParseTemporalRelativeToString(isolate, string),
         Handle<Object>());
+    result = {parsed_result.date, parsed_result.time};
     // c. Let calendar be ?
     // ToTemporalCalendarWithISODefault(result.[[Calendar]]).
     ASSIGN_RETURN_ON_EXCEPTION(
         isolate, calendar,
-        ToTemporalCalendarWithISODefault(isolate, result.date_time.calendar,
+        ToTemporalCalendarWithISODefault(isolate, parsed_result.calendar,
                                          method_name),
         Object);
 
-    // d. Let offsetString be result.[[TimeZoneOffset]].
-    offset_string_obj = result.time_zone.offset_string;
+    // d. Let offsetString be result.[[TimeZone]].[[OffsetString]].
+    offset_string_obj = parsed_result.time_zone.offset_string;
 
-    // e. Let timeZoneName be result.[[TimeZoneIANAName]].
-    Handle<Object> time_zone_name_obj = result.time_zone.name;
+    // e. Let timeZoneName be result.[[TimeZone]].[[Name]].
+    Handle<Object> time_zone_name_obj = parsed_result.time_zone.name;
 
-    // f. If timeZoneName is not undefined, then
-    if (!time_zone_name_obj->IsUndefined()) {
+    // f. If timeZoneName is undefined, then
+    if (time_zone_name_obj->IsUndefined()) {
+      // i. Let timeZone be undefined.
+      time_zone_obj = factory->undefined_value();
+      // g. Else,
+    } else {
       // i. If ParseText(StringToCodePoints(timeZoneName),
       // TimeZoneNumericUTCOffset) is a List of errors, then
       DCHECK(time_zone_name_obj->IsString());
@@ -8173,68 +8208,62 @@ MaybeHandle<Object> ToRelativeTemporalObject(Isolate* isolate,
           temporal::CreateTemporalTimeZone(isolate, time_zone_name)
               .ToHandleChecked();
       time_zone_obj = time_zone;
-      // g. Else,
-    } else {
-      // i. Let timeZone be undefined.
-      time_zone_obj = factory->undefined_value();
-    }
 
-    // h. If result.[[TimeZoneZ]] is true, then
-    if (result.time_zone.z) {
-      // i. Set offsetBehaviour to exact.
-      offset_behaviour = OffsetBehaviour::kExact;
-      // g. Else if offsetString is undefined, then
-    } else if (offset_string_obj->IsUndefined()) {
-      // i. Set offsetBehaviour to wall.
-      offset_behaviour = OffsetBehaviour::kWall;
+      // iii. If result.[[TimeZone]].[[Z]] is true, then
+      if (parsed_result.time_zone.z) {
+        // 1. Set offsetBehaviour to exact.
+        offset_behaviour = OffsetBehaviour::kExact;
+        // iv. Else if offsetString is undefined, then
+      } else if (offset_string_obj->IsUndefined()) {
+        // 1. Set offsetBehaviour to wall.
+        offset_behaviour = OffsetBehaviour::kWall;
+      }
+      // v. Set matchBehaviour to match minutes.
+      match_behaviour = MatchBehaviour::kMatchMinutes;
     }
-    // h. Set matchBehaviour to match minutes.
-    match_behaviour = MatchBehaviour::kMatchMinutes;
   }
-  // 7. If timeZone is not undefined, then
-  if (!time_zone_obj->IsUndefined()) {
-    DCHECK(time_zone_obj->IsJSReceiver());
-    Handle<JSReceiver> time_zone = Handle<JSReceiver>::cast(time_zone_obj);
-    // a. If offsetBehaviour is option, then
-    int64_t offset_ns = 0;
-    if (offset_behaviour == OffsetBehaviour::kOption) {
-      // i. Set offsetString to ? ToString(offsetString).
-      Handle<String> offset_string;
-      ASSIGN_RETURN_ON_EXCEPTION(isolate, offset_string,
-                                 Object::ToString(isolate, offset_string_obj),
-                                 Object);
-      // ii. Let offsetNs be ? ParseTimeZoneOffsetString(offset_string).
-      MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-          isolate, offset_ns, ParseTimeZoneOffsetString(isolate, offset_string),
-          Handle<Object>());
-      // b. Else,
-    } else {
-      // i. Let offsetNs be 0.
-      offset_ns = 0;
-    }
-    // Let epochNanoseconds be ? InterpretISODateTimeOffset(result.[[Year]],
-    // result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]],
-    // result.[[Second]], result.[[Millisecond]], result.[[Microsecond]],
-    // result.[[Nanosecond]], offsetBehaviour, offsetNs, timeZone, "compatible",
-    // "reject", matchBehaviour).
-    Handle<BigInt> epoch_nanoseconds;
-    ASSIGN_RETURN_ON_EXCEPTION(
-        isolate, epoch_nanoseconds,
-        InterpretISODateTimeOffset(
-            isolate, {result.date_time.date, result.date_time.time},
-            offset_behaviour, offset_ns, time_zone, Disambiguation::kCompatible,
-            Offset::kReject, match_behaviour, method_name),
-        Object);
-
-    // e. Return ? CreateTemporalZonedDateTime(epochNanoseconds, timeZone,
-    // calendar).
-    return CreateTemporalZonedDateTime(isolate, epoch_nanoseconds, time_zone,
-                                       calendar);
+  // 8. If timeZone is undefined, then
+  if (time_zone_obj->IsUndefined()) {
+    // a. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]],
+    // result.[[Day]], calendar).
+    return CreateTemporalDate(isolate, result.date, calendar);
+  }
+  DCHECK(time_zone_obj->IsJSReceiver());
+  Handle<JSReceiver> time_zone = Handle<JSReceiver>::cast(time_zone_obj);
+  // 9. If offsetBehaviour is option, then
+  int64_t offset_ns = 0;
+  if (offset_behaviour == OffsetBehaviour::kOption) {
+    // a. Set offsetString to ? ToString(offsetString).
+    Handle<String> offset_string;
+    ASSIGN_RETURN_ON_EXCEPTION(isolate, offset_string,
+                               Object::ToString(isolate, offset_string_obj),
+                               Object);
+    // b. Let offsetNs be ? ParseTimeZoneOffsetString(offset_string).
+    MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+        isolate, offset_ns, ParseTimeZoneOffsetString(isolate, offset_string),
+        Handle<Object>());
+    // 10. Else,
+  } else {
+    // a. Let offsetNs be 0.
+    offset_ns = 0;
   }
-  // 7. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]],
-  // result.[[Day]],
+  // 11. Let epochNanoseconds be ? InterpretISODateTimeOffset(result.[[Year]],
+  // result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]],
+  // result.[[Second]], result.[[Millisecond]], result.[[Microsecond]],
+  // result.[[Nanosecond]], offsetBehaviour, offsetNs, timeZone, "compatible",
+  // "reject", matchBehaviour).
+  Handle<BigInt> epoch_nanoseconds;
+  ASSIGN_RETURN_ON_EXCEPTION(
+      isolate, epoch_nanoseconds,
+      InterpretISODateTimeOffset(isolate, result, offset_behaviour, offset_ns,
+                                 time_zone, Disambiguation::kCompatible,
+                                 Offset::kReject, match_behaviour, method_name),
+      Object);
+
+  // 12. Return ? CreateTemporalZonedDateTime(epochNanoseconds, timeZone,
   // calendar).
-  return CreateTemporalDate(isolate, result.date_time.date, calendar);
+  return CreateTemporalZonedDateTime(isolate, epoch_nanoseconds, time_zone,
+                                     calendar);
 }
 
 // #sec-temporal-defaulttemporallargestunit
@@ -8376,12 +8405,6 @@ Maybe<DurationRecord> DifferenceZonedDateTime(
                   .ToChecked());
 }
 
-// #sec-temporal-differenceinstant
-Handle<BigInt> DifferenceInstant(Isolate* isolate, Handle<BigInt> ns1,
-                                 Handle<BigInt> ns2, double rounding_increment,
-                                 Unit smallest_unit,
-                                 RoundingMode rounding_mode);
-
 Maybe<DurationRecord> AddDuration(Isolate* isolate, const DurationRecord& dur1,
                                   const DurationRecord& dur2,
                                   Handle<Object> relative_to_obj,
@@ -8548,17 +8571,13 @@ Maybe<DurationRecord> AddDuration(Isolate* isolate, const DurationRecord& dur1,
   // 11. If largestUnit is not one of "year", "month", "week", or "day", then
   if (!(largest_unit == Unit::kYear || largest_unit == Unit::kMonth ||
         largest_unit == Unit::kWeek || largest_unit == Unit::kDay)) {
-    // i. Let diffNs be ! DifferenceInstant(relativeTo.[[Nanoseconds]], endNs,
-    // 1, "nanosecond", "halfExpand").
-    Handle<BigInt> diff_ns = DifferenceInstant(
-        isolate, handle(relative_to->nanoseconds(), isolate), end_ns, 1,
-        Unit::kNanosecond, RoundingMode::kHalfExpand);
-    // ii. Let result be ! BalanceDuration(0, 0, 0, 0, 0, 0, diffNs,
-    // largestUnit).
+    // a. Let result be ! DifferenceInstant(relativeTo.[[Nanoseconds]], endNs,
+    // 1, *"nanosecond"*, largestUnit, *"halfExpand"*).
     result.time_duration =
-        BalanceDuration(isolate, largest_unit, diff_ns, method_name)
-            .ToChecked();
-    // d. Return ! CreateDurationRecord(0, 0, 0, 0, result.[[Hours]],
+        DifferenceInstant(isolate, handle(relative_to->nanoseconds(), isolate),
+                          end_ns, 1, Unit::kNanosecond, largest_unit,
+                          RoundingMode::kHalfExpand, method_name);
+    // b. Return ! CreateDurationRecord(0, 0, 0, 0, result.[[Hours]],
     // result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]],
     // result.[[Microseconds]], result.[[Nanoseconds]]).
     result.time_duration.days = 0;
@@ -9478,7 +9497,7 @@ MaybeHandle<JSTemporalCalendar> JSTemporalCalendar::Constructor(
 namespace {
 
 // #sec-temporal-toisodayofyear
-int32_t ToISODayOfYear(Isolate* isolate, const DateRecordCommon& date) {
+int32_t ToISODayOfYear(Isolate* isolate, const DateRecord& date) {
   TEMPORAL_ENTER_FUNC();
   // 1. Assert: IsValidISODate(year, month, day) is *true*.
   DCHECK(IsValidISODate(isolate, date));
@@ -9500,7 +9519,7 @@ bool IsPlainDatePlainDateTimeOrPlainYearMonth(
 }
 
 // #sec-temporal-toisodayofweek
-int32_t ToISODayOfWeek(Isolate* isolate, const DateRecordCommon& date) {
+int32_t ToISODayOfWeek(Isolate* isolate, const DateRecord& date) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: IsValidISODate(year, month, day) is *true*.
@@ -9529,8 +9548,8 @@ int32_t ToISODayOfWeek(Isolate* isolate, const DateRecordCommon& date) {
 }
 
 // #sec-temporal-regulateisodate
-Maybe<DateRecordCommon> RegulateISODate(Isolate* isolate, ShowOverflow overflow,
-                                        const DateRecordCommon& date) {
+Maybe<DateRecord> RegulateISODate(Isolate* isolate, ShowOverflow overflow,
+                                  const DateRecord& date) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: year, month, and day are integers.
@@ -9543,14 +9562,14 @@ Maybe<DateRecordCommon> RegulateISODate(Isolate* isolate, ShowOverflow overflow,
       if (!IsValidISODate(isolate, date)) {
         THROW_NEW_ERROR_RETURN_VALUE(isolate,
                                      NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
-                                     Nothing<DateRecordCommon>());
+                                     Nothing<DateRecord>());
       }
       // b. Return the Record { [[Year]]: year, [[Month]]: month, [[Day]]: day
       // }.
       return Just(date);
     // 4. If overflow is "constrain", then
     case ShowOverflow::kConstrain:
-      DateRecordCommon result(date);
+      DateRecord result(date);
       // a. Set month to ! ConstrainToRange(month, 1, 12).
       result.month = std::max(std::min(result.month, 12), 1);
       // b. Set day to ! ConstrainToRange(day, 1, ! ISODaysInMonth(year,
@@ -9667,26 +9686,25 @@ Maybe<int32_t> ResolveISOMonth(Isolate* isolate, Handle<JSReceiver> fields) {
 }
 
 // #sec-temporal-isodatefromfields
-Maybe<DateRecordCommon> ISODateFromFields(Isolate* isolate,
-                                          Handle<JSReceiver> fields,
-                                          Handle<JSReceiver> options,
-                                          const char* method_name) {
+Maybe<DateRecord> ISODateFromFields(Isolate* isolate, Handle<JSReceiver> fields,
+                                    Handle<JSReceiver> options,
+                                    const char* method_name) {
   Factory* factory = isolate->factory();
 
   // 1. Assert: Type(fields) is Object.
-  // 2. Let overflow be ? ToTemporalOverflow(options).
-  ShowOverflow overflow;
-  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-      isolate, overflow, ToTemporalOverflow(isolate, options, method_name),
-      Nothing<DateRecordCommon>());
-  // 3. Set fields to ? PrepareTemporalFields(fields, « "day", "month",
+  // 2. Set fields to ? PrepareTemporalFields(fields, « "day", "month",
   // "monthCode", "year" », «"year", "day"»).
   Handle<FixedArray> field_names = DayMonthMonthCodeYearInFixedArray(isolate);
   ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, fields,
       PrepareTemporalFields(isolate, fields, field_names,
                             RequiredFields::kYearAndDay),
-      Nothing<DateRecordCommon>());
+      Nothing<DateRecord>());
+  // 3. Let overflow be ? ToTemporalOverflow(options).
+  ShowOverflow overflow;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, overflow, ToTemporalOverflow(isolate, options, method_name),
+      Nothing<DateRecord>());
 
   // 4. Let year be ! Get(fields, "year").
   Handle<Object> year_obj =
@@ -9700,9 +9718,8 @@ Maybe<DateRecordCommon> ISODateFromFields(Isolate* isolate,
 
   // 6. Let month be ? ResolveISOMonth(fields).
   int32_t month;
-  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, month,
-                                         ResolveISOMonth(isolate, fields),
-                                         Nothing<DateRecordCommon>());
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, month, ResolveISOMonth(isolate, fields), Nothing<DateRecord>());
 
   // 7. Let day be ! Get(fields, "day").
   Handle<Object> day_obj =
@@ -9720,10 +9737,9 @@ Maybe<DateRecordCommon> ISODateFromFields(Isolate* isolate,
 }
 
 // #sec-temporal-addisodate
-Maybe<DateRecordCommon> AddISODate(Isolate* isolate,
-                                   const DateRecordCommon& date,
-                                   const DateDurationRecord& duration,
-                                   ShowOverflow overflow) {
+Maybe<DateRecord> AddISODate(Isolate* isolate, const DateRecord& date,
+                             const DateDurationRecord& duration,
+                             ShowOverflow overflow) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: year, month, day, years, months, weeks, and days are integers.
@@ -9731,7 +9747,7 @@ Maybe<DateRecordCommon> AddISODate(Isolate* isolate,
   DCHECK(overflow == ShowOverflow::kConstrain ||
          overflow == ShowOverflow::kReject);
   // 3. Let intermediate be ! BalanceISOYearMonth(year + years, month + months).
-  DateRecordCommon intermediate = date;
+  DateRecord intermediate = date;
   intermediate.year += static_cast<int32_t>(duration.years);
   intermediate.month += static_cast<int32_t>(duration.months);
   BalanceISOYearMonth(isolate, &intermediate.year, &intermediate.month);
@@ -9739,7 +9755,7 @@ Maybe<DateRecordCommon> AddISODate(Isolate* isolate,
   // intermediate.[[Month]], day, overflow).
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, intermediate, RegulateISODate(isolate, overflow, intermediate),
-      Nothing<DateRecordCommon>());
+      Nothing<DateRecord>());
 
   // 5. Set days to days + 7 × weeks.
   // 6. Let d be intermediate.[[Day]] + days.
@@ -9750,8 +9766,8 @@ Maybe<DateRecordCommon> AddISODate(Isolate* isolate,
 
 // #sec-temporal-differenceisodate
 Maybe<DateDurationRecord> DifferenceISODate(Isolate* isolate,
-                                            const DateRecordCommon& date1,
-                                            const DateRecordCommon& date2,
+                                            const DateRecord& date1,
+                                            const DateRecord& date2,
                                             Unit largest_unit,
                                             const char* method_name) {
   TEMPORAL_ENTER_FUNC();
@@ -9773,14 +9789,14 @@ Maybe<DateDurationRecord> DifferenceISODate(Isolate* isolate,
       // c. Let start be the new Record { [[Year]]: y1, [[Month]]: m1, [[Day]]:
       // d1
       // }.
-      DateRecordCommon start = date1;
+      DateRecord start = date1;
       // d. Let end be the new Record { [[Year]]: y2, [[Month]]: m2, [[Day]]:
       // d2 }.
-      DateRecordCommon end = date2;
+      DateRecord end = date2;
       // e. Let years be end.[[Year]] − start.[[Year]].
       double years = end.year - start.year;
       // f. Let mid be ! AddISODate(y1, m1, d1, years, 0, 0, 0, "constrain").
-      DateRecordCommon mid;
+      DateRecord mid;
       MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
           isolate, mid,
           AddISODate(isolate, date1, {years, 0, 0, 0},
@@ -9885,7 +9901,7 @@ Maybe<DateDurationRecord> DifferenceISODate(Isolate* isolate,
       // 3. If largestUnit is "day" or "week", then
     case Unit::kDay:
     case Unit::kWeek: {
-      DateRecordCommon smaller, greater;
+      DateRecord smaller, greater;
       // a. If ! CompareISODate(y1, m1, d1, y2, m2, d2) < 0, then
       int32_t sign;
       if (CompareISODate(date1, date2) < 0) {
@@ -9941,18 +9957,13 @@ Maybe<DateDurationRecord> DifferenceISODate(Isolate* isolate,
 }
 
 // #sec-temporal-isoyearmonthfromfields
-Maybe<DateRecordCommon> ISOYearMonthFromFields(Isolate* isolate,
-                                               Handle<JSReceiver> fields,
-                                               Handle<JSReceiver> options,
-                                               const char* method_name) {
+Maybe<DateRecord> ISOYearMonthFromFields(Isolate* isolate,
+                                         Handle<JSReceiver> fields,
+                                         Handle<JSReceiver> options,
+                                         const char* method_name) {
   Factory* factory = isolate->factory();
   // 1. Assert: Type(fields) is Object.
-  // 2. Let overflow be ? ToTemporalOverflow(options).
-  ShowOverflow overflow;
-  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-      isolate, overflow, ToTemporalOverflow(isolate, options, method_name),
-      Nothing<DateRecordCommon>());
-  // 3. Set fields to ? PrepareTemporalFields(fields, « "month", "monthCode",
+  // 2. Set fields to ? PrepareTemporalFields(fields, « "month", "monthCode",
   // "year" », «»).
   Handle<FixedArray> field_names = factory->NewFixedArray(3);
   field_names->set(0, ReadOnlyRoots(isolate).month_string());
@@ -9962,7 +9973,12 @@ Maybe<DateRecordCommon> ISOYearMonthFromFields(Isolate* isolate,
       isolate, fields,
       PrepareTemporalFields(isolate, fields, field_names,
                             RequiredFields::kNone),
-      Nothing<DateRecordCommon>());
+      Nothing<DateRecord>());
+  // 3. Let overflow be ? ToTemporalOverflow(options).
+  ShowOverflow overflow;
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, overflow, ToTemporalOverflow(isolate, options, method_name),
+      Nothing<DateRecord>());
 
   // 4. Let year be ! Get(fields, "year").
   Handle<Object> year_obj =
@@ -9971,26 +9987,25 @@ Maybe<DateRecordCommon> ISOYearMonthFromFields(Isolate* isolate,
   // 5. If year is undefined, throw a TypeError exception.
   if (year_obj->IsUndefined(isolate)) {
     THROW_NEW_ERROR_RETURN_VALUE(isolate, NEW_TEMPORAL_INVALID_ARG_TYPE_ERROR(),
-                                 Nothing<DateRecordCommon>());
+                                 Nothing<DateRecord>());
   }
-  DateRecordCommon result;
+  DateRecord result;
   result.year = FastD2I(floor(year_obj->Number()));
   // 6. Let month be ? ResolveISOMonth(fields).
   int32_t month;
-  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, month,
-                                         ResolveISOMonth(isolate, fields),
-                                         Nothing<DateRecordCommon>());
+  MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+      isolate, month, ResolveISOMonth(isolate, fields), Nothing<DateRecord>());
   // 7. Let result be ? RegulateISOYearMonth(year, month, overflow).
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result.month, RegulateISOYearMonth(isolate, overflow, month),
-      Nothing<DateRecordCommon>());
+      Nothing<DateRecord>());
   // 8. Return the new Record { [[Year]]: result.[[Year]], [[Month]]:
   // result.[[Month]], [[ReferenceISODay]]: 1 }.
   result.day = 1;
   return Just(result);
 }
 // #sec-temporal-toisoweekofyear
-int32_t ToISOWeekOfYear(Isolate* isolate, const DateRecordCommon& date) {
+int32_t ToISOWeekOfYear(Isolate* isolate, const DateRecord& date) {
   TEMPORAL_ENTER_FUNC();
   // 1. Assert: IsValidISODate(year, month, day) is *true*.
   DCHECK(IsValidISODate(isolate, date));
@@ -10105,7 +10120,7 @@ MaybeHandle<JSTemporalPlainDate> JSTemporalCalendar::DateAdd(
           method_name),
       Handle<JSTemporalPlainDate>());
 
-  DateRecordCommon result;
+  DateRecord result;
   // If calendar.[[Identifier]] is "iso8601", then
   if (calendar->calendar_index() == 0) {
     // 9. Let result be ? AddISODate(date.[[ISOYear]], date.[[ISOMonth]],
@@ -10401,7 +10416,7 @@ MaybeHandle<JSTemporalPlainDate> JSTemporalCalendar::DateFromFields(
       JSTemporalPlainDate);
   if (calendar->calendar_index() == 0) {
     // 6. Let result be ? ISODateFromFields(fields, options).
-    DateRecordCommon result;
+    DateRecord result;
     MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
         isolate, result,
         ISODateFromFields(isolate, fields, options, method_name),
@@ -10650,7 +10665,7 @@ MaybeHandle<JSTemporalPlainMonthDay> JSTemporalCalendar::MonthDayFromFields(
       JSTemporalPlainMonthDay);
   // 6. Let result be ? ISOMonthDayFromFields(fields, options).
   if (calendar->calendar_index() == 0) {
-    DateRecordCommon result;
+    DateRecord result;
     MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
         isolate, result,
         ISOMonthDayFromFields(isolate, fields, options, method_name),
@@ -10689,7 +10704,7 @@ MaybeHandle<JSTemporalPlainYearMonth> JSTemporalCalendar::YearMonthFromFields(
       JSTemporalPlainYearMonth);
   // 6. Let result be ? ISOYearMonthFromFields(fields, options).
   if (calendar->calendar_index() == 0) {
-    DateRecordCommon result;
+    DateRecord result;
     MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
         isolate, result,
         ISOYearMonthFromFields(isolate, fields, options, method_name),
@@ -10902,92 +10917,56 @@ MaybeHandle<JSTemporalInstant> JSTemporalTimeZone::GetInstantFor(
 namespace {
 
 #ifdef V8_INTL_SUPPORT
-MaybeHandle<Object> GetIANATimeZoneTransition(Isolate* isolate,
-                                              Handle<BigInt> nanoseconds,
-                                              int32_t time_zone_index,
-                                              Intl::Transition transition) {
+Handle<Object> GetIANATimeZoneTransition(Isolate* isolate,
+                                         Handle<BigInt> nanoseconds,
+                                         int32_t time_zone_index,
+                                         Intl::Transition transition) {
   if (time_zone_index == JSTemporalTimeZone::kUTCTimeZoneIndex) {
     return isolate->factory()->null_value();
   }
-
-  Handle<BigInt> one_million = BigInt::FromUint64(isolate, 1000000);
-  Maybe<int64_t> maybe_transition =
-      Intl::GetTimeZoneOffsetTransitionMilliseconds(
-          isolate, time_zone_index,
-          BigInt::Divide(isolate, nanoseconds, one_million)
-              .ToHandleChecked()
-              ->AsInt64(),
-          transition);
-  // If there are no transition in this timezone, return null.
-  if (maybe_transition.IsNothing()) {
-    return isolate->factory()->null_value();
-  }
-
-  // #sec-temporal-getianatimezonenexttransition and
-  // #sec-temporal-getianatimezoneprevioustransition states:
-  // "The operation returns null if no such transition exists for which t ≤
-  // ℤ(nsMaxInstant)." and "The operation returns null if no such transition
-  // exists for which t ≥ ℤ(nsMinInstant)."
-  //
-  // nsMinInstant = -nsMaxInstant = -8.64 × 10^21 => msMinInstant = -8.64 x
-  // 10^15
-  constexpr int64_t kMsMinInstant = -8.64e15;
-  // nsMaxInstant = 10^8 × nsPerDay = 8.64 × 10^21 => msMaxInstant = 8.64 x
-  // 10^15
-  constexpr int64_t kMsMaxInstant = 8.64e15;
-
-  int64_t ms = maybe_transition.FromJust();
-  if (ms < kMsMinInstant || ms > kMsMaxInstant) {
-    return isolate->factory()->null_value();
-  }
-
-  // Convert the transition from milliseconds to nanoseconds.
-  return BigInt::Multiply(isolate, BigInt::FromInt64(isolate, ms), one_million);
+  return Intl::GetTimeZoneOffsetTransitionNanoseconds(isolate, time_zone_index,
+                                                      nanoseconds, transition);
 }
 // #sec-temporal-getianatimezonenexttransition
-MaybeHandle<Object> GetIANATimeZoneNextTransition(Isolate* isolate,
-                                                  Handle<BigInt> nanoseconds,
-                                                  int32_t time_zone_index) {
+Handle<Object> GetIANATimeZoneNextTransition(Isolate* isolate,
+                                             Handle<BigInt> nanoseconds,
+                                             int32_t time_zone_index) {
   return GetIANATimeZoneTransition(isolate, nanoseconds, time_zone_index,
                                    Intl::Transition::kNext);
 }
 // #sec-temporal-getianatimezoneprevioustransition
-MaybeHandle<Object> GetIANATimeZonePreviousTransition(
-    Isolate* isolate, Handle<BigInt> nanoseconds, int32_t time_zone_index) {
+Handle<Object> GetIANATimeZonePreviousTransition(Isolate* isolate,
+                                                 Handle<BigInt> nanoseconds,
+                                                 int32_t time_zone_index) {
   return GetIANATimeZoneTransition(isolate, nanoseconds, time_zone_index,
                                    Intl::Transition::kPrevious);
 }
 
-MaybeHandle<Object> GetIANATimeZoneOffsetNanoseconds(Isolate* isolate,
-                                                     Handle<BigInt> nanoseconds,
-                                                     int32_t time_zone_index) {
+Handle<Object> GetIANATimeZoneOffsetNanoseconds(Isolate* isolate,
+                                                Handle<BigInt> nanoseconds,
+                                                int32_t time_zone_index) {
   if (time_zone_index == JSTemporalTimeZone::kUTCTimeZoneIndex) {
     return handle(Smi::zero(), isolate);
   }
 
   return isolate->factory()->NewNumberFromInt64(
-      1000000 * Intl::GetTimeZoneOffsetMilliseconds(
-                    isolate, time_zone_index,
-                    BigInt::Divide(isolate, nanoseconds,
-                                   BigInt::FromUint64(isolate, 1000000))
-                        .ToHandleChecked()
-                        ->AsInt64())
-                    .ToChecked());
+      Intl::GetTimeZoneOffsetNanoseconds(isolate, time_zone_index,
+                                         nanoseconds));
 }
 #else   // V8_INTL_SUPPORT
 // #sec-temporal-getianatimezonenexttransition
-MaybeHandle<Object> GetIANATimeZoneNextTransition(Isolate* isolate,
-                                                  Handle<BigInt>, int32_t) {
+Handle<Object> GetIANATimeZoneNextTransition(Isolate* isolate, Handle<BigInt>,
+                                             int32_t) {
   return isolate->factory()->null_value();
 }
 // #sec-temporal-getianatimezoneprevioustransition
-MaybeHandle<Object> GetIANATimeZonePreviousTransition(Isolate* isolate,
-                                                      Handle<BigInt>, int32_t) {
+Handle<Object> GetIANATimeZonePreviousTransition(Isolate* isolate,
+                                                 Handle<BigInt>, int32_t) {
   return isolate->factory()->null_value();
 }
-MaybeHandle<Object> GetIANATimeZoneOffsetNanoseconds(Isolate* isolate,
-                                                     Handle<BigInt>,
-                                                     int32_t time_zone_index) {
+Handle<Object> GetIANATimeZoneOffsetNanoseconds(Isolate* isolate,
+                                                Handle<BigInt>,
+                                                int32_t time_zone_index) {
   DCHECK_EQ(time_zone_index, JSTemporalTimeZone::kUTCTimeZoneIndex);
   return handle(Smi::zero(), isolate);
 }
@@ -11024,7 +11003,7 @@ MaybeHandle<JSTemporalPlainDateTime> JSTemporalTimeZone::GetPlainDateTimeFor(
 
 // template for shared code of Temporal.TimeZone.prototype.getNextTransition and
 // Temporal.TimeZone.prototype.getPreviousTransition
-template <MaybeHandle<Object> (*iana_func)(Isolate*, Handle<BigInt>, int32_t)>
+template <Handle<Object> (*iana_func)(Isolate*, Handle<BigInt>, int32_t)>
 MaybeHandle<Object> GetTransition(Isolate* isolate,
                                   Handle<JSTemporalTimeZone> time_zone,
                                   Handle<Object> starting_point_obj,
@@ -11045,12 +11024,9 @@ MaybeHandle<Object> GetTransition(Isolate* isolate,
   // 5. Let transition be ?
   // GetIANATimeZoneNextTransition(startingPoint.[[Nanoseconds]],
   // timeZone.[[Identifier]]).
-  Handle<Object> transition_obj;
-  ASSIGN_RETURN_ON_EXCEPTION(
-      isolate, transition_obj,
+  Handle<Object> transition_obj =
       iana_func(isolate, handle(starting_point->nanoseconds(), isolate),
-                time_zone->time_zone_index()),
-      Object);
+                time_zone->time_zone_index());
   // 6. If transition is null, return null.
   if (transition_obj->IsNull()) {
     return isolate->factory()->null_value();
@@ -11081,7 +11057,7 @@ MaybeHandle<Object> JSTemporalTimeZone::GetPreviousTransition(
 // #sec-temporal.timezone.prototype.getpossibleinstantsfor
 // #sec-temporal-getianatimezoneepochvalue
 MaybeHandle<JSArray> GetIANATimeZoneEpochValueAsArrayOfInstantForUTC(
-    Isolate* isolate, const DateTimeRecordCommon& date_time) {
+    Isolate* isolate, const DateTimeRecord& date_time) {
   Factory* factory = isolate->factory();
   // 6. Let possibleInstants be a new empty List.
   Handle<BigInt> epoch_nanoseconds = GetEpochFromISOParts(isolate, date_time);
@@ -11105,7 +11081,7 @@ MaybeHandle<JSArray> GetIANATimeZoneEpochValueAsArrayOfInstantForUTC(
 #ifdef V8_INTL_SUPPORT
 MaybeHandle<JSArray> GetIANATimeZoneEpochValueAsArrayOfInstant(
     Isolate* isolate, int32_t time_zone_index,
-    const DateTimeRecordCommon& date_time) {
+    const DateTimeRecord& date_time) {
   Factory* factory = isolate->factory();
   if (time_zone_index == JSTemporalTimeZone::kUTCTimeZoneIndex) {
     return GetIANATimeZoneEpochValueAsArrayOfInstantForUTC(isolate, date_time);
@@ -11115,24 +11091,16 @@ MaybeHandle<JSArray> GetIANATimeZoneEpochValueAsArrayOfInstant(
   Handle<BigInt> nanoseconds_in_local_time =
       GetEpochFromISOParts(isolate, date_time);
 
-  std::vector<int64_t> possible_offset_in_milliseconds =
-      Intl::GetTimeZonePossibleOffsetMilliseconds(
-          isolate, time_zone_index,
-          BigInt::Divide(isolate, nanoseconds_in_local_time,
-                         BigInt::FromUint64(isolate, 1000000))
-              .ToHandleChecked()
-              ->AsInt64());
+  std::vector<Handle<BigInt>> possible_offset =
+      Intl::GetTimeZonePossibleOffsetNanoseconds(isolate, time_zone_index,
+                                                 nanoseconds_in_local_time);
 
-  int32_t array_length =
-      static_cast<int32_t>(possible_offset_in_milliseconds.size());
+  int32_t array_length = static_cast<int32_t>(possible_offset.size());
   Handle<FixedArray> fixed_array = factory->NewFixedArray(array_length);
 
   for (int32_t i = 0; i < array_length; i++) {
-    int64_t offset_in_nanoseconds =
-        possible_offset_in_milliseconds[i] * 1000000;
     Handle<BigInt> epoch_nanoseconds =
-        BigInt::Subtract(isolate, nanoseconds_in_local_time,
-                         BigInt::FromInt64(isolate, offset_in_nanoseconds))
+        BigInt::Subtract(isolate, nanoseconds_in_local_time, possible_offset[i])
             .ToHandleChecked();
     // a. If ! IsValidEpochNanoseconds(epochNanoseconds) is false, throw a
     // RangeError exception.
@@ -11155,7 +11123,7 @@ MaybeHandle<JSArray> GetIANATimeZoneEpochValueAsArrayOfInstant(
 
 MaybeHandle<JSArray> GetIANATimeZoneEpochValueAsArrayOfInstant(
     Isolate* isolate, int32_t time_zone_index,
-    const DateTimeRecordCommon& date_time) {
+    const DateTimeRecord& date_time) {
   DCHECK_EQ(time_zone_index, JSTemporalTimeZone::kUTCTimeZoneIndex);
   return GetIANATimeZoneEpochValueAsArrayOfInstantForUTC(isolate, date_time);
 }
@@ -11176,7 +11144,7 @@ MaybeHandle<JSArray> JSTemporalTimeZone::GetPossibleInstantsFor(
       ToTemporalDateTime(isolate, date_time_obj,
                          "Temporal.TimeZone.prototype.getPossibleInstantsFor"),
       JSArray);
-  DateTimeRecordCommon date_time_record = {
+  DateTimeRecord date_time_record = {
       {date_time->iso_year(), date_time->iso_month(), date_time->iso_day()},
       {date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(),
        date_time->iso_millisecond(), date_time->iso_microsecond(),
@@ -12181,29 +12149,29 @@ MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainDateTime::Constructor(
 namespace {
 
 // #sec-temporal-interprettemporaldatetimefields
-Maybe<DateTimeRecord> InterpretTemporalDateTimeFields(
+Maybe<temporal::DateTimeRecord> InterpretTemporalDateTimeFields(
     Isolate* isolate, Handle<JSReceiver> calendar, Handle<JSReceiver> fields,
     Handle<Object> options, const char* method_name) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Let timeResult be ? ToTemporalTimeRecord(fields).
-  TimeRecordCommon time_result;
+  TimeRecord time_result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, time_result, ToTemporalTimeRecord(isolate, fields, method_name),
-      Nothing<DateTimeRecord>());
+      Nothing<temporal::DateTimeRecord>());
 
   // 2. Let temporalDate be ? DateFromFields(calendar, fields, options).
   Handle<JSTemporalPlainDate> temporal_date;
   ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, temporal_date,
       DateFromFields(isolate, calendar, fields, options),
-      Nothing<DateTimeRecord>());
+      Nothing<temporal::DateTimeRecord>());
 
   // 3. Let overflow be ? ToTemporalOverflow(options).
   ShowOverflow overflow;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, overflow, ToTemporalOverflow(isolate, options, method_name),
-      Nothing<DateTimeRecord>());
+      Nothing<temporal::DateTimeRecord>());
 
   // 4. Let timeResult be ? RegulateTime(timeResult.[[Hour]],
   // timeResult.[[Minute]], timeResult.[[Second]], timeResult.[[Millisecond]],
@@ -12211,7 +12179,7 @@ Maybe<DateTimeRecord> InterpretTemporalDateTimeFields(
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, time_result,
       temporal::RegulateTime(isolate, time_result, overflow),
-      Nothing<DateTimeRecord>());
+      Nothing<temporal::DateTimeRecord>());
   // 5. Return the new Record { [[Year]]: temporalDate.[[ISOYear]], [[Month]]:
   // temporalDate.[[ISOMonth]], [[Day]]: temporalDate.[[ISODay]], [[Hour]]:
   // timeResult.[[Hour]], [[Minute]]: timeResult.[[Minute]], [[Second]]:
@@ -12219,17 +12187,16 @@ Maybe<DateTimeRecord> InterpretTemporalDateTimeFields(
   // [[Microsecond]]: timeResult.[[Microsecond]], [[Nanosecond]]:
   // timeResult.[[Nanosecond]] }.
 
-  DateTimeRecord result = {
+  temporal::DateTimeRecord result = {
       {temporal_date->iso_year(), temporal_date->iso_month(),
        temporal_date->iso_day()},
-      time_result,
-      Handle<String>()};
+      time_result};
   return Just(result);
 }
 
 // #sec-temporal-parsetemporaldatetimestring
-Maybe<DateTimeRecord> ParseTemporalDateTimeString(Isolate* isolate,
-                                                  Handle<String> iso_string) {
+Maybe<DateTimeRecordWithCalendar> ParseTemporalDateTimeString(
+    Isolate* isolate, Handle<String> iso_string) {
   TEMPORAL_ENTER_FUNC();
   // 1. Assert: Type(isoString) is String.
   // 2. If isoString does not satisfy the syntax of a TemporalDateTimeString
@@ -12240,7 +12207,7 @@ Maybe<DateTimeRecord> ParseTemporalDateTimeString(Isolate* isolate,
     // a. Throw a *RangeError* exception.
     THROW_NEW_ERROR_RETURN_VALUE(isolate,
                                  NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
-                                 Nothing<DateTimeRecord>());
+                                 Nothing<DateTimeRecordWithCalendar>());
   }
 
   // 3. If _isoString_ contains a |UTCDesignator|, then
@@ -12248,7 +12215,7 @@ Maybe<DateTimeRecord> ParseTemporalDateTimeString(Isolate* isolate,
     // a. Throw a *RangeError* exception.
     THROW_NEW_ERROR_RETURN_VALUE(isolate,
                                  NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
-                                 Nothing<DateTimeRecord>());
+                                 Nothing<DateTimeRecordWithCalendar>());
   }
 
   // 3. Let result be ? ParseISODateTime(isoString).
@@ -12265,7 +12232,7 @@ MaybeHandle<JSTemporalPlainDateTime> ToTemporalDateTime(
   DCHECK(options->IsJSReceiver() || options->IsUndefined());
 
   Handle<JSReceiver> calendar;
-  DateTimeRecord result;
+  temporal::DateTimeRecord result;
   // 2. If Type(item) is Object, then
   if (item_obj->IsJSReceiver()) {
     Handle<JSReceiver> item = Handle<JSReceiver>::cast(item_obj);
@@ -12351,9 +12318,11 @@ MaybeHandle<JSTemporalPlainDateTime> ToTemporalDateTime(
                                Object::ToString(isolate, item_obj),
                                JSTemporalPlainDateTime);
     // c. Let result be ? ParseTemporalDateTimeString(string).
+    DateTimeRecordWithCalendar parsed_result;
     MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-        isolate, result, ParseTemporalDateTimeString(isolate, string),
+        isolate, parsed_result, ParseTemporalDateTimeString(isolate, string),
         Handle<JSTemporalPlainDateTime>());
+    result = {parsed_result.date, parsed_result.time};
     // d. Assert: ! IsValidISODate(result.[[Year]], result.[[Month]],
     // result.[[Day]]) is true.
     DCHECK(IsValidISODate(isolate, result.date));
@@ -12365,7 +12334,8 @@ MaybeHandle<JSTemporalPlainDateTime> ToTemporalDateTime(
     // be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]).
     ASSIGN_RETURN_ON_EXCEPTION(
         isolate, calendar,
-        ToTemporalCalendarWithISODefault(isolate, result.calendar, method_name),
+        ToTemporalCalendarWithISODefault(isolate, parsed_result.calendar,
+                                         method_name),
         JSTemporalPlainDateTime);
   }
   // 4. Return ? CreateTemporalDateTime(result.[[Year]], result.[[Month]],
@@ -12554,7 +12524,7 @@ MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainDateTime::With(
                              JSTemporalPlainDateTime);
   // 12. Let result be ? InterpretTemporalDateTimeFields(calendar, fields,
   // options).
-  DateTimeRecord result;
+  temporal::DateTimeRecord result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result,
       InterpretTemporalDateTimeFields(isolate, calendar, fields, options,
@@ -12778,10 +12748,11 @@ MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainDateTime::WithPlainDate(
 }
 
 namespace {
-MaybeHandle<String> TemporalDateTimeToString(
-    Isolate* isolate, const DateTimeRecordCommon& date_time,
-    Handle<JSReceiver> calendar, Precision precision,
-    ShowCalendar show_calendar) {
+MaybeHandle<String> TemporalDateTimeToString(Isolate* isolate,
+                                             const DateTimeRecord& date_time,
+                                             Handle<JSReceiver> calendar,
+                                             Precision precision,
+                                             ShowCalendar show_calendar) {
   IncrementalStringBuilder builder(isolate);
   // 1. Assert: isoYear, isoMonth, isoDay, hour, minute, second, millisecond,
   // microsecond, and nanosecond are integers.
@@ -12860,15 +12831,15 @@ namespace {
 
 constexpr double kNsPerDay = 8.64e13;
 
-DateTimeRecordCommon RoundTime(
-    Isolate* isolate, const TimeRecordCommon& time, double increment, Unit unit,
+DateTimeRecord RoundTime(
+    Isolate* isolate, const TimeRecord& time, double increment, Unit unit,
     RoundingMode rounding_mode,
     // 3.a a. If dayLengthNs is not present, set dayLengthNs to nsPerDay.
     double day_length_ns = kNsPerDay);
 
 // #sec-temporal-roundisodatetime
-DateTimeRecordCommon RoundISODateTime(
-    Isolate* isolate, const DateTimeRecordCommon& date_time, double increment,
+DateTimeRecord RoundISODateTime(
+    Isolate* isolate, const DateTimeRecord& date_time, double increment,
     Unit unit, RoundingMode rounding_mode,
     // 3. If dayLength is not present, set dayLength to nsPerDay.
     double day_length_ns = kNsPerDay) {
@@ -12881,14 +12852,14 @@ DateTimeRecordCommon RoundISODateTime(
 
   // 4. Let roundedTime be ! RoundTime(hour, minute, second, millisecond,
   // microsecond, nanosecond, increment, unit, roundingMode, dayLength).
-  DateTimeRecordCommon rounded_time = RoundTime(
-      isolate, date_time.time, increment, unit, rounding_mode, day_length_ns);
+  DateTimeRecord rounded_time = RoundTime(isolate, date_time.time, increment,
+                                          unit, rounding_mode, day_length_ns);
   // 5. Let balanceResult be ! BalanceISODate(year, month, day +
   // roundedTime.[[Days]]).
   rounded_time.date.year = date_time.date.year;
   rounded_time.date.month = date_time.date.month;
   rounded_time.date.day += date_time.date.day;
-  DateRecordCommon balance_result = BalanceISODate(isolate, rounded_time.date);
+  DateRecord balance_result = BalanceISODate(isolate, rounded_time.date);
 
   // 6. Return the Record { [[Year]]: balanceResult.[[Year]], [[Month]]:
   // balanceResult.[[Month]], [[Day]]: balanceResult.[[Day]], [[Hour]]:
@@ -12942,7 +12913,7 @@ MaybeHandle<String> JSTemporalPlainDateTime::ToString(
   // dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]],
   // dateTime.[[ISONanosecond]], precision.[[Increment]], precision.[[Unit]],
   // roundingMode).
-  DateTimeRecordCommon result = RoundISODateTime(
+  DateTimeRecord result = RoundISODateTime(
       isolate,
       {{date_time->iso_year(), date_time->iso_month(), date_time->iso_day()},
        {date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(),
@@ -13073,7 +13044,7 @@ MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainDateTime::Round(
   // dateTime.[[ISOMinute]], dateTime.[[ISOSecond]],
   // dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]],
   // dateTime.[[ISONanosecond]], roundingIncrement, smallestUnit, roundingMode).
-  DateTimeRecordCommon result = RoundISODateTime(
+  DateTimeRecord result = RoundISODateTime(
       isolate,
       {{date_time->iso_year(), date_time->iso_month(), date_time->iso_day()},
        {date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(),
@@ -13122,7 +13093,7 @@ AddDurationToOrSubtractDurationFromPlainDateTime(
   // duration.[[Weeks]], duration.[[Days]], duration.[[Hours]],
   // duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]],
   // duration.[[Microseconds]], duration.[[Nanoseconds]], options).
-  DateTimeRecordCommon result;
+  DateTimeRecord result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result,
       AddDateTime(isolate,
@@ -13435,8 +13406,8 @@ MaybeHandle<JSTemporalPlainMonthDay> JSTemporalPlainMonthDay::Constructor(
 namespace {
 
 // #sec-temporal-parsetemporalmonthdaystring
-Maybe<DateRecord> ParseTemporalMonthDayString(Isolate* isolate,
-                                              Handle<String> iso_string) {
+Maybe<DateRecordWithCalendar> ParseTemporalMonthDayString(
+    Isolate* isolate, Handle<String> iso_string) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: Type(isoString) is String.
@@ -13446,28 +13417,30 @@ Maybe<DateRecord> ParseTemporalMonthDayString(Isolate* isolate,
       TemporalParser::ParseTemporalMonthDayString(isolate, iso_string);
   if (!parsed.has_value()) {
     // a. Throw a *RangeError* exception.
-    THROW_NEW_ERROR_RETURN_VALUE(
-        isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(), Nothing<DateRecord>());
+    THROW_NEW_ERROR_RETURN_VALUE(isolate,
+                                 NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
+                                 Nothing<DateRecordWithCalendar>());
   }
   // 3. If isoString contains a UTCDesignator, then
   if (parsed->utc_designator) {
     // a. Throw a *RangeError* exception.
-    THROW_NEW_ERROR_RETURN_VALUE(
-        isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(), Nothing<DateRecord>());
+    THROW_NEW_ERROR_RETURN_VALUE(isolate,
+                                 NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
+                                 Nothing<DateRecordWithCalendar>());
   }
 
   // 3. Let result be ? ParseISODateTime(isoString).
-  DateTimeRecord result;
+  DateTimeRecordWithCalendar result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result, ParseISODateTime(isolate, iso_string, *parsed),
-      Nothing<DateRecord>());
+      Nothing<DateRecordWithCalendar>());
   // 5. Let year be result.[[Year]].
   // 6. If no part of isoString is produced by the DateYear production, then
   // a. Set year to undefined.
 
   // 7. Return the Record { [[Year]]: year, [[Month]]: result.[[Month]],
   // [[Day]]: result.[[Day]], [[Calendar]]: result.[[Calendar]] }.
-  DateRecord ret({result.date, result.calendar});
+  DateRecordWithCalendar ret({result.date, result.calendar});
   return Just(ret);
 }
 
@@ -13591,7 +13564,7 @@ MaybeHandle<JSTemporalPlainMonthDay> ToTemporalMonthDay(
                              JSTemporalPlainMonthDay);
 
   // 7. Let result be ? ParseTemporalMonthDayString(string).
-  DateRecord result;
+  DateRecordWithCalendar result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result, ParseTemporalMonthDayString(isolate, string),
       Handle<JSTemporalPlainMonthDay>());
@@ -13926,8 +13899,8 @@ MaybeHandle<JSTemporalPlainYearMonth> JSTemporalPlainYearMonth::Constructor(
 namespace {
 
 // #sec-temporal-parsetemporalyearmonthstring
-Maybe<DateRecord> ParseTemporalYearMonthString(Isolate* isolate,
-                                               Handle<String> iso_string) {
+Maybe<DateRecordWithCalendar> ParseTemporalYearMonthString(
+    Isolate* isolate, Handle<String> iso_string) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: Type(isoString) is String.
@@ -13936,28 +13909,30 @@ Maybe<DateRecord> ParseTemporalYearMonthString(Isolate* isolate,
   base::Optional<ParsedISO8601Result> parsed =
       TemporalParser::ParseTemporalYearMonthString(isolate, iso_string);
   if (!parsed.has_value()) {
-    THROW_NEW_ERROR_RETURN_VALUE(
-        isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(), Nothing<DateRecord>());
+    THROW_NEW_ERROR_RETURN_VALUE(isolate,
+                                 NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
+                                 Nothing<DateRecordWithCalendar>());
   }
 
   // 3. If _isoString_ contains a |UTCDesignator|, then
   if (parsed->utc_designator) {
     // a. Throw a *RangeError* exception.
-    THROW_NEW_ERROR_RETURN_VALUE(
-        isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(), Nothing<DateRecord>());
+    THROW_NEW_ERROR_RETURN_VALUE(isolate,
+                                 NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(),
+                                 Nothing<DateRecordWithCalendar>());
   }
 
   // 3. Let result be ? ParseISODateTime(isoString).
-  DateTimeRecord result;
+  DateTimeRecordWithCalendar result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result, ParseISODateTime(isolate, iso_string, *parsed),
-      Nothing<DateRecord>());
+      Nothing<DateRecordWithCalendar>());
 
   // 4. Return the Record { [[Year]]: result.[[Year]], [[Month]]:
   // result.[[Month]], [[Day]]: result.[[Day]], [[Calendar]]:
   // result.[[Calendar]] }.
-  DateRecord ret = {{result.date.year, result.date.month, result.date.day},
-                    result.calendar};
+  DateRecordWithCalendar ret = {
+      {result.date.year, result.date.month, result.date.day}, result.calendar};
   return Just(ret);
 }
 
@@ -14009,7 +13984,7 @@ MaybeHandle<JSTemporalPlainYearMonth> ToTemporalYearMonth(
                              Object::ToString(isolate, item_obj),
                              JSTemporalPlainYearMonth);
   // 6. Let result be ? ParseTemporalYearMonthString(string).
-  DateRecord result;
+  DateRecordWithCalendar result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result, ParseTemporalYearMonthString(isolate, string),
       Handle<JSTemporalPlainYearMonth>());
@@ -14644,8 +14619,7 @@ MaybeHandle<JSTemporalZonedDateTime> JSTemporalPlainTime::ToZonedDateTime(
 
 namespace {
 // #sec-temporal-comparetemporaltime
-int32_t CompareTemporalTime(const TimeRecordCommon& time1,
-                            const TimeRecordCommon& time2) {
+int32_t CompareTemporalTime(const TimeRecord& time1, const TimeRecord& time2) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: h1, min1, s1, ms1, mus1, ns1, h2, min2, s2, ms2, mus2, and ns2
@@ -14852,7 +14826,7 @@ MaybeHandle<JSTemporalPlainTime> JSTemporalPlainTime::Round(
   // temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]],
   // temporalTime.[[ISONanosecond]], roundingIncrement, smallestUnit,
   // roundingMode).
-  DateTimeRecordCommon result = RoundTime(
+  DateTimeRecord result = RoundTime(
       isolate,
       {temporal_time->iso_hour(), temporal_time->iso_minute(),
        temporal_time->iso_second(), temporal_time->iso_millisecond(),
@@ -14884,7 +14858,7 @@ MaybeHandle<JSTemporalPlainTime> JSTemporalPlainTime::With(
   MAYBE_RETURN(RejectObjectWithCalendarOrTimeZone(isolate, temporal_time_like),
                Handle<JSTemporalPlainTime>());
   // 5. Let partialTime be ? ToPartialTime(temporalTimeLike).
-  TimeRecordCommon result;
+  TimeRecord result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, result,
       ToPartialTime(
@@ -15027,7 +15001,7 @@ MaybeHandle<JSTemporalPlainTime> AddDurationToOrSubtractDurationFromPlainTime(
   // duration.[[Minutes]], sign x duration.[[Seconds]], sign x
   // duration.[[Milliseconds]], sign x duration.[[Microseconds]], sign x
   // duration.[[Nanoseconds]]).
-  DateTimeRecordCommon result = AddTime(
+  DateTimeRecord result = AddTime(
       isolate,
       {temporal_time->iso_hour(), temporal_time->iso_minute(),
        temporal_time->iso_second(), temporal_time->iso_millisecond(),
@@ -15338,11 +15312,13 @@ Handle<BigInt> ApplyUnsignedRoundingMode(
   // 7. Let d2 be r2 – x.
   Handle<BigInt> dd2 = BigInt::Subtract(isolate, rr2, num).ToHandleChecked();
   // 8. If d1 < d2, return r1.
-  if (BigInt::CompareToBigInt(dd1, dd2) == ComparisonResult::kLessThan)
+  if (BigInt::CompareToBigInt(dd1, dd2) == ComparisonResult::kLessThan) {
     return r1;
+  }
   // 9. If d2 < d1, return r2.
-  if (BigInt::CompareToBigInt(dd2, dd1) == ComparisonResult::kLessThan)
+  if (BigInt::CompareToBigInt(dd2, dd1) == ComparisonResult::kLessThan) {
     return r2;
+  }
   // 10. Assert: d1 is equal to d2.
   DCHECK_EQ(BigInt::CompareToBigInt(dd1, dd2), ComparisonResult::kEqual);
   // 11. If unsignedRoundingMode is half-zero, return r1.
@@ -15402,54 +15378,48 @@ double RoundNumberToIncrement(Isolate* isolate, double x, double increment,
   return rounded * increment;
 }
 
-// For the case that x and return are BigInt.
-Handle<BigInt> RoundNumberToIncrement(Isolate* isolate, Handle<BigInt> x,
-                                      double increment,
-                                      RoundingMode rounding_mode) {
+// #sec-temporal-roundnumbertoincrementasifpositive
+Handle<BigInt> RoundNumberToIncrementAsIfPositive(Isolate* isolate,
+                                                  Handle<BigInt> x,
+                                                  double increment,
+                                                  RoundingMode rounding_mode) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Let quotient be x / increment.
-  bool is_negative;
-  // 2. If quotient < 0, then
-  if (x->IsNegative() != (increment < 0)) {
-    // a. Let isNegative be true.
-    is_negative = true;
-    // b. Set quotient to -quotient.
-    x = BigInt::UnaryMinus(isolate, x);
-    // 3. Else,
-  } else {
-    // a. Let isNegative be false.
-    is_negative = false;
-  }
-  // 4. Let unsignedRoundingMode be GetUnsignedRoundingMode(roundingMode,
-  // isNegative).
+  // 2. Let unsignedRoundingMode be GetUnsignedRoundingMode(roundingMode,
+  // false).
   UnsignedRoundingMode unsigned_rounding_mode =
-      GetUnsignedRoundingMode(rounding_mode, is_negative);
+      GetUnsignedRoundingMode(rounding_mode, false);
 
-  // 5. Let r1 be the largest integer such that r1 ≤ quotient.
   Handle<BigInt> increment_bigint =
       BigInt::FromNumber(isolate, isolate->factory()->NewNumber(increment))
           .ToHandleChecked();
+  // 3. Let r1 be the largest integer such that r1 ≤ quotient.
   Handle<BigInt> r1 =
       BigInt::Divide(isolate, x, increment_bigint).ToHandleChecked();
-  // 6. Let r2 be the smallest integer such that r2 > quotient.
+
+  // Adjust for negative quotient.
+  if (r1->IsNegative() && BigInt::Remainder(isolate, x, increment_bigint)
+                              .ToHandleChecked()
+                              ->ToBoolean()) {
+    r1 = BigInt::Decrement(isolate, r1).ToHandleChecked();
+  }
+
+  // 4. Let r2 be the smallest integer such that r2 > quotient.
   Handle<BigInt> r2 = BigInt::Increment(isolate, r1).ToHandleChecked();
-  // 7. Let rounded be ApplyUnsignedRoundingMode(quotient, r1, r2,
+  // 5. Let rounded be ApplyUnsignedRoundingMode(quotient, r1, r2,
   // unsignedRoundingMode).
   Handle<BigInt> rounded = ApplyUnsignedRoundingMode(
       isolate, x, increment_bigint, r1, r2, unsigned_rounding_mode);
-  // 8. If isNegative is true, set rounded to -rounded.
-  if (is_negative) {
-    rounded = BigInt::UnaryMinus(isolate, rounded);
-  }
-  // 9. Return rounded × increment.
-  return BigInt::Multiply(isolate, rounded, increment_bigint).ToHandleChecked();
+  // 6. Return rounded × increment.
+  Handle<BigInt> result =
+      BigInt::Multiply(isolate, rounded, increment_bigint).ToHandleChecked();
+  return result;
 }
 
-DateTimeRecordCommon RoundTime(Isolate* isolate, const TimeRecordCommon& time,
-                               double increment, Unit unit,
-                               RoundingMode rounding_mode,
-                               double day_length_ns) {
+DateTimeRecord RoundTime(Isolate* isolate, const TimeRecord& time,
+                         double increment, Unit unit,
+                         RoundingMode rounding_mode, double day_length_ns) {
   TEMPORAL_ENTER_FUNC();
 
   // 1. Assert: hour, minute, second, millisecond, microsecond, nanosecond, and
@@ -15760,7 +15730,7 @@ MaybeHandle<String> JSTemporalPlainTime::ToString(
   // temporalTime.[[ISONanosecond]], precision.[[Increment]],
   // precision.[[Unit]], roundingMode).
 
-  DateTimeRecordCommon round_result = RoundTime(
+  DateTimeRecord round_result = RoundTime(
       isolate,
       {temporal_time->iso_hour(), temporal_time->iso_minute(),
        temporal_time->iso_second(), temporal_time->iso_millisecond(),
@@ -15821,7 +15791,7 @@ MaybeHandle<JSTemporalZonedDateTime> JSTemporalZonedDateTime::Constructor(
 }
 
 // #sec-get-temporal.zoneddatetime.prototype.hoursinday
-MaybeHandle<Smi> JSTemporalZonedDateTime::HoursInDay(
+MaybeHandle<Object> JSTemporalZonedDateTime::HoursInDay(
     Isolate* isolate, Handle<JSTemporalZonedDateTime> zoned_date_time) {
   TEMPORAL_ENTER_FUNC();
   const char* method_name = "Temporal.ZonedDateTime.prototype.hoursInDay";
@@ -15864,7 +15834,7 @@ MaybeHandle<Smi> JSTemporalZonedDateTime::HoursInDay(
           iso_calendar),
       Smi);
   // 11. Let tomorrowFields be BalanceISODate(year, month, day + 1).
-  DateRecordCommon tomorrow_fields = BalanceISODate(
+  DateRecord tomorrow_fields = BalanceISODate(
       isolate, {temporal_date_time->iso_year(), temporal_date_time->iso_month(),
                 temporal_date_time->iso_day() + 1});
 
@@ -15895,15 +15865,23 @@ MaybeHandle<Smi> JSTemporalZonedDateTime::HoursInDay(
       Smi);
   // 15. Let diffNs be tomorrowInstant.[[Nanoseconds]] −
   // todayInstant.[[Nanoseconds]].
-  // 16. Return 𝔽(diffNs / (3.6 × 10^12)).
-  int64_t diff_ns =
+  Handle<BigInt> diff_ns =
       BigInt::Subtract(isolate,
                        handle(tomorrow_instant->nanoseconds(), isolate),
                        handle(today_instant->nanoseconds(), isolate))
+          .ToHandleChecked();
+  // 16. Return 𝔽(diffNs / (3.6 × 10^12)).
+  //
+  // Note: The result of the division may be non integer for TimeZone which
+  // change fractional hours. Perform this division in two steps:
+  // First convert it to seconds in BigInt, then perform floating point
+  // division (seconds / 3600) to convert to hours.
+  int64_t diff_seconds =
+      BigInt::Divide(isolate, diff_ns, BigInt::FromUint64(isolate, 1000000000))
           .ToHandleChecked()
           ->AsInt64();
-  return handle(Smi::FromInt(static_cast<int32_t>(diff_ns / 3600000000000LL)),
-                isolate);
+  double hours_in_that_day = static_cast<double>(diff_seconds) / 3600.0;
+  return isolate->factory()->NewNumber(hours_in_that_day);
 }
 
 namespace {
@@ -15926,7 +15904,7 @@ MaybeHandle<JSTemporalZonedDateTime> ToTemporalZonedDateTime(
   Handle<JSReceiver> time_zone;
   Handle<JSReceiver> calendar;
 
-  ZonedDateTimeRecord result;
+  temporal::DateTimeRecord result;
 
   // 5. If Type(item) is Object, then
   if (item_obj->IsJSReceiver()) {
@@ -16001,7 +15979,7 @@ MaybeHandle<JSTemporalZonedDateTime> ToTemporalZonedDateTime(
     // l. Let result be ? InterpretTemporalDateTimeFields(calendar, fields,
     // options).
     MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-        isolate, result.date_time,
+        isolate, result,
         InterpretTemporalDateTimeFields(isolate, calendar, fields, options,
                                         method_name),
         Handle<JSTemporalZonedDateTime>());
@@ -16017,13 +15995,18 @@ MaybeHandle<JSTemporalZonedDateTime> ToTemporalZonedDateTime(
                                Object::ToString(isolate, item_obj),
                                JSTemporalZonedDateTime);
     // c. Let result be ? ParseTemporalZonedDateTimeString(string).
+    DateTimeRecordWithCalendar parsed_result;
     MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-        isolate, result, ParseTemporalZonedDateTimeString(isolate, string),
+        isolate, parsed_result,
+        ParseTemporalZonedDateTimeString(isolate, string),
         Handle<JSTemporalZonedDateTime>());
+    result = {parsed_result.date, parsed_result.time};
 
+    // d. Let timeZoneName be result.[[TimeZone]].[[Name]].
     // e. Assert: timeZoneName is not undefined.
-    DCHECK(!result.time_zone.name->IsUndefined());
-    Handle<String> time_zone_name = Handle<String>::cast(result.time_zone.name);
+    DCHECK(!parsed_result.time_zone.name->IsUndefined());
+    Handle<String> time_zone_name =
+        Handle<String>::cast(parsed_result.time_zone.name);
 
     // f. If ParseText(StringToCodePoints(timeZoneName),
     // TimeZoneNumericUTCOffset) is a List of errors, then
@@ -16040,11 +16023,11 @@ MaybeHandle<JSTemporalZonedDateTime> ToTemporalZonedDateTime(
       // ii. Set timeZoneName to ! CanonicalizeTimeZoneName(timeZoneName).
       time_zone_name = CanonicalizeTimeZoneName(isolate, time_zone_name);
     }
-    // g. Let offsetString be result.[[TimeZoneOffsetString]].
-    offset_string = result.time_zone.offset_string;
+    // g. Let offsetString be result.[[TimeZone]].[[OffsetString]].
+    offset_string = parsed_result.time_zone.offset_string;
 
-    // h. If result.[[TimeZoneZ]] is true, then
-    if (result.time_zone.z) {
+    // h. If result.[[TimeZone]].[[Z]] is true, then
+    if (parsed_result.time_zone.z) {
       // i. Set offsetBehaviour to exact.
       offset_behaviour = OffsetBehaviour::kExact;
       // i. Else if offsetString is undefined, then
@@ -16059,7 +16042,7 @@ MaybeHandle<JSTemporalZonedDateTime> ToTemporalZonedDateTime(
     // ToTemporalCalendarWithISODefault(result.[[Calendar]]).
     ASSIGN_RETURN_ON_EXCEPTION(
         isolate, calendar,
-        ToTemporalCalendarWithISODefault(isolate, result.date_time.calendar,
+        ToTemporalCalendarWithISODefault(isolate, parsed_result.calendar,
                                          method_name),
         JSTemporalZonedDateTime);
     // j. Set matchBehaviour to match minutes.
@@ -16101,10 +16084,9 @@ MaybeHandle<JSTemporalZonedDateTime> ToTemporalZonedDateTime(
   Handle<BigInt> epoch_nanoseconds;
   ASSIGN_RETURN_ON_EXCEPTION(
       isolate, epoch_nanoseconds,
-      InterpretISODateTimeOffset(
-          isolate, {result.date_time.date, result.date_time.time},
-          offset_behaviour, offset_nanoseconds, time_zone, disambiguation,
-          offset, match_behaviour, method_name),
+      InterpretISODateTimeOffset(isolate, result, offset_behaviour,
+                                 offset_nanoseconds, time_zone, disambiguation,
+                                 offset, match_behaviour, method_name),
       JSTemporalZonedDateTime);
 
   // 8. Return ? CreateTemporalZonedDateTime(epochNanoseconds, timeZone,
@@ -16263,7 +16245,7 @@ namespace {
 
 // #sec-temporal-interpretisodatetimeoffset
 MaybeHandle<BigInt> InterpretISODateTimeOffset(
-    Isolate* isolate, const DateTimeRecordCommon& data,
+    Isolate* isolate, const DateTimeRecord& data,
     OffsetBehaviour offset_behaviour, int64_t offset_nanoseconds,
     Handle<JSReceiver> time_zone, Disambiguation disambiguation,
     Offset offset_option, MatchBehaviour match_behaviour,
@@ -16489,7 +16471,7 @@ MaybeHandle<JSTemporalZonedDateTime> JSTemporalZonedDateTime::With(
 
   // 19. Let dateTimeResult be ? InterpretTemporalDateTimeFields(calendar,
   // fields, options).
-  DateTimeRecord date_time_result;
+  temporal::DateTimeRecord date_time_result;
   MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, date_time_result,
       InterpretTemporalDateTimeFields(isolate, calendar, fields, options,
@@ -17147,7 +17129,7 @@ MaybeHandle<JSTemporalZonedDateTime> JSTemporalZonedDateTime::Round(
   // temporalDateTime.[[ISOSecond]], temporalDateTime.[[ISOMillisecond]],
   // temporalDateTime.[[ISOMicrosecond]], temporalDateTime.[[ISONanosecond]],
   // roundingIncrement, smallestUnit, roundingMode, dayLengthNs).
-  DateTimeRecordCommon round_result = RoundISODateTime(
+  DateTimeRecord round_result = RoundISODateTime(
       isolate,
       {{temporal_date_time->iso_year(), temporal_date_time->iso_month(),
         temporal_date_time->iso_day()},
@@ -17271,11 +17253,6 @@ MaybeHandle<JSTemporalZonedDateTime> JSTemporalZonedDateTime::Subtract(
 
 namespace {
 
-Handle<BigInt> DifferenceInstant(Isolate* isolate, Handle<BigInt> ns1,
-                                 Handle<BigInt> ns2, double rounding_increment,
-                                 Unit smallest_unit,
-                                 RoundingMode rounding_mode);
-
 // #sec-temporal-differencetemporalzoneddatetime
 MaybeHandle<JSTemporalDuration> DifferenceTemporalZonedDateTime(
     Isolate* isolate, TimePreposition operation,
@@ -17318,21 +17295,15 @@ MaybeHandle<JSTemporalDuration> DifferenceTemporalZonedDateTime(
       settings.largest_unit != Unit::kMonth &&
       settings.largest_unit != Unit::kWeek &&
       settings.largest_unit != Unit::kDay) {
-    // a. Let differenceNs be ! DifferenceInstant(zonedDateTime.[[Nanoseconds]],
+    // 1. Let result be ! DifferenceInstant(zonedDateTime.[[Nanoseconds]],
     // other.[[Nanoseconds]], settings.[[RoundingIncrement]],
-    // settings.[[SmallestUnit]], settings.[[RoundingMode]]).
-    Handle<BigInt> difference_ns = DifferenceInstant(
+    // settings.[[SmallestUnit]], settings.[[LargestUnit]],
+    // settings.[[RoundingMode]]).
+    TimeDurationRecord balance_result = DifferenceInstant(
         isolate, handle(zoned_date_time->nanoseconds(), isolate),
         handle(other->nanoseconds(), isolate), settings.rounding_increment,
-        settings.smallest_unit, settings.rounding_mode);
-    // b. Assert: The following steps cannot fail due to overflow in the Number
-    // domain because abs(differenceNs) ≤ 2 × nsMaxInstant. c. Let balanceResult
-    // be ! BalanceDuration(0, 0, 0, 0, 0, 0, differenceNs,
-    // settings.[[LargestUnit]]).
-    TimeDurationRecord balance_result =
-        BalanceDuration(isolate, settings.largest_unit, difference_ns,
-                        method_name)
-            .ToChecked();
+        settings.smallest_unit, settings.largest_unit, settings.rounding_mode,
+        method_name);
     // d. Return ! CreateTemporalDuration(0, 0, 0, 0, sign ×
     // balanceResult.[[Hours]], sign × balanceResult.[[Minutes]], sign ×
     // balanceResult.[[Seconds]], sign × balanceResult.[[Milliseconds]], sign ×
@@ -17985,8 +17956,10 @@ Handle<BigInt> RoundTemporalInstant(Isolate* isolate, Handle<BigInt> ns,
     default:
       UNREACHABLE();
   }
-  // 8. Return ! RoundNumberToIncrement(ℝ(ns), incrementNs, roundingMode).
-  return RoundNumberToIncrement(isolate, ns, increment_ns, rounding_mode);
+  // 8. Return ! RoundNumberToIncrementAsIfPositive(ℝ(ns), incrementNs,
+  // roundingMode).
+  return RoundNumberToIncrementAsIfPositive(isolate, ns, increment_ns,
+                                            rounding_mode);
 }
 
 }  // namespace
@@ -18429,7 +18402,13 @@ RoundingMode NegateTemporalRoundingMode(RoundingMode rounding_mode) {
     // 2. If roundingMode is "floor", return "ceil".
     case RoundingMode::kFloor:
       return RoundingMode::kCeil;
-    // 3. Return roundingMode.
+    // 3. If roundingMode is "halfCeil", return "halfFloor".
+    case RoundingMode::kHalfCeil:
+      return RoundingMode::kHalfFloor;
+    // 4. If roundingMode is "halfFloor", return "halfCeil".
+    case RoundingMode::kHalfFloor:
+      return RoundingMode::kHalfCeil;
+    // 5. Return roundingMode.
     default:
       return rounding_mode;
   }
@@ -18546,17 +18525,50 @@ Maybe<DifferenceSettings> GetDifferenceSettings(
 }
 
 // #sec-temporal-differenceinstant
-Handle<BigInt> DifferenceInstant(Isolate* isolate, Handle<BigInt> ns1,
-                                 Handle<BigInt> ns2, double rounding_increment,
-                                 Unit smallest_unit,
-                                 RoundingMode rounding_mode) {
+TimeDurationRecord DifferenceInstant(Isolate* isolate, Handle<BigInt> ns1,
+                                     Handle<BigInt> ns2,
+                                     double rounding_increment,
+                                     Unit smallest_unit, Unit largest_unit,
+                                     RoundingMode rounding_mode,
+                                     const char* method_name) {
   // 1. Assert: Type(ns1) is BigInt.
   // 2. Assert: Type(ns2) is BigInt.
-  // 3. Return ! RoundTemporalInstant(ns2 - ns1, roundingIncrement,
-  // smallestUnit, roundingMode).
-  return RoundTemporalInstant(
-      isolate, BigInt::Subtract(isolate, ns2, ns1).ToHandleChecked(),
-      rounding_increment, smallest_unit, rounding_mode);
+  // 3. Assert: The following step cannot fail due to overflow in the Number
+  // domain because abs(ns2 - ns1) <= 2 x nsMaxInstant.
+
+  // 4. Let roundResult be ! RoundDuration(0, 0, 0, 0, 0, 0, 0, 0, 0, ns2 - ns1,
+  // roundingIncrement, smallestUnit, roundingMode).[[DurationRecord]].
+  Handle<BigInt> diff = BigInt::Subtract(isolate, ns2, ns1).ToHandleChecked();
+  // Note: Since diff could be very big and over the precision of double can
+  // hold, break diff into diff_hours and diff_nanoseconds before pass into
+  // RoundDuration.
+  Handle<BigInt> nanoseconds_in_a_hour =
+      BigInt::FromUint64(isolate, 3600000000000);
+  double diff_hours =
+      BigInt::ToNumber(isolate,
+                       BigInt::Divide(isolate, diff, nanoseconds_in_a_hour)
+                           .ToHandleChecked())
+          ->Number();
+  double diff_nanoseconds =
+      BigInt::ToNumber(isolate,
+                       BigInt::Remainder(isolate, diff, nanoseconds_in_a_hour)
+                           .ToHandleChecked())
+          ->Number();
+  DurationRecordWithRemainder round_record =
+      RoundDuration(
+          isolate, {0, 0, 0, {0, diff_hours, 0, 0, 0, 0, diff_nanoseconds}},
+          rounding_increment, smallest_unit, rounding_mode, method_name)
+          .ToChecked();
+  // 5. Assert: roundResult.[[Days]] is 0.
+  DCHECK_EQ(0, round_record.record.time_duration.days);
+  // 6. Return ! BalanceDuration(0, roundResult.[[Hours]],
+  // roundResult.[[Minutes]], roundResult.[[Seconds]],
+  // roundResult.[[Milliseconds]], roundResult.[[Microseconds]],
+  // roundResult.[[Nanoseconds]], largestUnit).
+  return BalanceDuration(isolate, largest_unit,
+                         isolate->factory()->undefined_value(),
+                         round_record.record.time_duration, method_name)
+      .ToChecked();
 }
 
 // #sec-temporal-differencetemporalinstant
@@ -18581,22 +18593,16 @@ MaybeHandle<JSTemporalDuration> DifferenceTemporalInstant(
                             DisallowedUnitsInDifferenceSettings::kNone,
                             Unit::kNanosecond, Unit::kSecond, method_name),
       Handle<JSTemporalDuration>());
-  // 4. Let roundedNs be ! DifferenceInstant(instant.[[Nanoseconds]],
+  // 4. Let result be ! DifferenceInstant(instant.[[Nanoseconds]],
   // other.[[Nanoseconds]], settings.[[RoundingIncrement]],
-  // settings.[[SmallestUnit]], settings.[[RoundingMode]]).
-  Handle<BigInt> rounded_ns = DifferenceInstant(
+  // settings.[[SmallestUnit]], settings.[[LargestUnit]],
+  // settings.[[RoundingMode]]).
+  TimeDurationRecord result = DifferenceInstant(
       isolate, handle(instant->nanoseconds(), isolate),
       handle(other->nanoseconds(), isolate), settings.rounding_increment,
-      settings.smallest_unit, settings.rounding_mode);
-  // 5. Assert: The following steps cannot fail due to overflow in the Number
-  // domain because abs(roundedNs) ≤ 2 × nsMaxInstant.
-  // 6. Let result be ! BalanceDuration(0, 0, 0, 0, 0, 0, roundedNs,
-  // settings.[[LargestUnit]]).
-  TimeDurationRecord result =
-      BalanceDuration(isolate, settings.largest_unit, rounded_ns, method_name)
-          .ToChecked();
-
-  // 7. Return ! CreateTemporalDuration(0, 0, 0, 0, sign × result.[[Hours]],
+      settings.smallest_unit, settings.largest_unit, settings.rounding_mode,
+      method_name);
+  // 5. Return ! CreateTemporalDuration(0, 0, 0, 0, sign × result.[[Hours]],
   // sign × result.[[Minutes]], sign × result.[[Seconds]], sign ×
   // result.[[Milliseconds]], sign × result.[[Microseconds]], sign ×
   // result.[[Nanoseconds]]).
diff --git a/deps/v8/src/objects/js-temporal-objects.h b/deps/v8/src/objects/js-temporal-objects.h
index cebe2b2ffa1ac3..c387433e43c6d4 100644
--- a/deps/v8/src/objects/js-temporal-objects.h
+++ b/deps/v8/src/objects/js-temporal-objects.h
@@ -950,7 +950,7 @@ class JSTemporalZonedDateTime
                Handle<Object> time_zone_like);
 
   // #sec-get-temporal.zoneddatetime.prototype.hoursinday
-  V8_WARN_UNUSED_RESULT static MaybeHandle<Smi> HoursInDay(
+  V8_WARN_UNUSED_RESULT static MaybeHandle<Object> HoursInDay(
       Isolate* isolate, Handle<JSTemporalZonedDateTime> zoned_date_time);
 
   // #sec-temporal.zoneddatetime.prototype.round
@@ -1051,13 +1051,13 @@ class JSTemporalZonedDateTime
 
 namespace temporal {
 
-struct DateRecordCommon {
+struct DateRecord {
   int32_t year;
   int32_t month;
   int32_t day;
 };
 
-struct TimeRecordCommon {
+struct TimeRecord {
   int32_t hour;
   int32_t minute;
   int32_t second;
@@ -1066,14 +1066,14 @@ struct TimeRecordCommon {
   int32_t nanosecond;
 };
 
-struct DateTimeRecordCommon {
-  DateRecordCommon date;
-  TimeRecordCommon time;
+struct DateTimeRecord {
+  DateRecord date;
+  TimeRecord time;
 };
 
 // #sec-temporal-createtemporaldatetime
 V8_WARN_UNUSED_RESULT MaybeHandle<JSTemporalPlainDateTime>
-CreateTemporalDateTime(Isolate* isolate, const DateTimeRecordCommon& date_time,
+CreateTemporalDateTime(Isolate* isolate, const DateTimeRecord& date_time,
                        Handle<JSReceiver> calendar);
 
 // #sec-temporal-createtemporaltimezone
@@ -1146,6 +1146,49 @@ MaybeHandle<JSTemporalInstant> BuiltinTimeZoneGetInstantForCompatible(
     Isolate* isolate, Handle<JSReceiver> time_zone,
     Handle<JSTemporalPlainDateTime> date_time, const char* method_name);
 
+// For Intl.DurationFormat
+
+// #sec-temporal-time-duration-records
+struct TimeDurationRecord {
+  double days;
+  double hours;
+  double minutes;
+  double seconds;
+  double milliseconds;
+  double microseconds;
+  double nanoseconds;
+
+  // #sec-temporal-createtimedurationrecord
+  static Maybe<TimeDurationRecord> Create(Isolate* isolate, double days,
+                                          double hours, double minutes,
+                                          double seconds, double milliseconds,
+                                          double microseconds,
+                                          double nanoseconds);
+};
+
+// #sec-temporal-duration-records
+// Cannot reuse DateDurationRecord here due to duplicate days.
+struct DurationRecord {
+  double years;
+  double months;
+  double weeks;
+  TimeDurationRecord time_duration;
+  // #sec-temporal-createdurationrecord
+  static Maybe<DurationRecord> Create(Isolate* isolate, double years,
+                                      double months, double weeks, double days,
+                                      double hours, double minutes,
+                                      double seconds, double milliseconds,
+                                      double microseconds, double nanoseconds);
+};
+
+// #sec-temporal-topartialduration
+Maybe<DurationRecord> ToPartialDuration(
+    Isolate* isolate, Handle<Object> temporal_duration_like_obj,
+    const DurationRecord& input);
+
+// #sec-temporal-isvalidduration
+bool IsValidDuration(Isolate* isolate, const DurationRecord& dur);
+
 }  // namespace temporal
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/objects/js-weak-refs-inl.h b/deps/v8/src/objects/js-weak-refs-inl.h
index 76e6e075e5ded6..0385d59efb7e56 100644
--- a/deps/v8/src/objects/js-weak-refs-inl.h
+++ b/deps/v8/src/objects/js-weak-refs-inl.h
@@ -5,10 +5,9 @@
 #ifndef V8_OBJECTS_JS_WEAK_REFS_INL_H_
 #define V8_OBJECTS_JS_WEAK_REFS_INL_H_
 
-#include "src/objects/js-weak-refs.h"
-
 #include "src/api/api-inl.h"
 #include "src/heap/heap-write-barrier-inl.h"
+#include "src/objects/js-weak-refs.h"
 #include "src/objects/smi-inl.h"
 
 // Has to be the last include (doesn't have include guards):
@@ -55,7 +54,7 @@ void JSFinalizationRegistry::RegisterWeakCellWithUnregisterToken(
 
 bool JSFinalizationRegistry::Unregister(
     Handle<JSFinalizationRegistry> finalization_registry,
-    Handle<JSReceiver> unregister_token, Isolate* isolate) {
+    Handle<HeapObject> unregister_token, Isolate* isolate) {
   // Iterate through the doubly linked list of WeakCells associated with the
   // key. Each WeakCell will be in the "active_cells" or "cleared_cells" list of
   // its FinalizationRegistry; remove it from there.
@@ -66,7 +65,7 @@ bool JSFinalizationRegistry::Unregister(
 
 template <typename GCNotifyUpdatedSlotCallback>
 bool JSFinalizationRegistry::RemoveUnregisterToken(
-    JSReceiver unregister_token, Isolate* isolate,
+    HeapObject unregister_token, Isolate* isolate,
     RemoveUnregisterTokenMode removal_mode,
     GCNotifyUpdatedSlotCallback gc_notify_updated_slot) {
   // This method is called from both FinalizationRegistry#unregister and for
@@ -171,7 +170,7 @@ void WeakCell::Nullify(Isolate* isolate,
   // only called for WeakCells which haven't been unregistered yet, so they will
   // be in the active_cells list. (The caller must guard against calling this
   // for unregistered WeakCells by checking that the target is not undefined.)
-  DCHECK(target().IsJSReceiver());
+  DCHECK(target().CanBeHeldWeakly());
   set_target(ReadOnlyRoots(isolate).undefined_value());
 
   JSFinalizationRegistry fr =
@@ -217,7 +216,7 @@ void WeakCell::RemoveFromFinalizationRegistryCells(Isolate* isolate) {
 
   // It's important to set_target to undefined here. This guards that we won't
   // call Nullify (which assumes that the WeakCell is in active_cells).
-  DCHECK(target().IsUndefined() || target().IsJSReceiver());
+  DCHECK(target().IsUndefined() || target().CanBeHeldWeakly());
   set_target(ReadOnlyRoots(isolate).undefined_value());
 
   JSFinalizationRegistry fr =
diff --git a/deps/v8/src/objects/js-weak-refs.h b/deps/v8/src/objects/js-weak-refs.h
index f678234ff81afc..64ff9573f6b2df 100644
--- a/deps/v8/src/objects/js-weak-refs.h
+++ b/deps/v8/src/objects/js-weak-refs.h
@@ -37,7 +37,7 @@ class JSFinalizationRegistry
       Handle<WeakCell> weak_cell, Isolate* isolate);
   inline static bool Unregister(
       Handle<JSFinalizationRegistry> finalization_registry,
-      Handle<JSReceiver> unregister_token, Isolate* isolate);
+      Handle<HeapObject> unregister_token, Isolate* isolate);
 
   // RemoveUnregisterToken is called from both Unregister and during GC. Since
   // it modifies slots in key_map and WeakCells and the normal write barrier is
@@ -49,7 +49,7 @@ class JSFinalizationRegistry
   };
   template <typename GCNotifyUpdatedSlotCallback>
   inline bool RemoveUnregisterToken(
-      JSReceiver unregister_token, Isolate* isolate,
+      HeapObject unregister_token, Isolate* isolate,
       RemoveUnregisterTokenMode removal_mode,
       GCNotifyUpdatedSlotCallback gc_notify_updated_slot);
 
diff --git a/deps/v8/src/objects/js-weak-refs.tq b/deps/v8/src/objects/js-weak-refs.tq
index 760cacf45cbe51..a2fb7193d02bdd 100644
--- a/deps/v8/src/objects/js-weak-refs.tq
+++ b/deps/v8/src/objects/js-weak-refs.tq
@@ -20,8 +20,8 @@ extern class JSFinalizationRegistry extends JSObject {
 
 extern class WeakCell extends HeapObject {
   finalization_registry: Undefined|JSFinalizationRegistry;
-  target: Undefined|JSReceiver;
-  unregister_token: Undefined|JSReceiver;
+  target: Undefined|JSReceiver|Symbol;
+  unregister_token: Undefined|JSReceiver|Symbol;
   holdings: JSAny;
 
   // For storing doubly linked lists of WeakCells in JSFinalizationRegistry's
@@ -40,5 +40,5 @@ extern class WeakCell extends HeapObject {
 }
 
 extern class JSWeakRef extends JSObject {
-  target: Undefined|JSReceiver;
+  target: Undefined|JSReceiver|Symbol;
 }
diff --git a/deps/v8/src/objects/keys.cc b/deps/v8/src/objects/keys.cc
index a7d7f27ed92ea9..ac21fbf9c3d2d2 100644
--- a/deps/v8/src/objects/keys.cc
+++ b/deps/v8/src/objects/keys.cc
@@ -253,6 +253,14 @@ Maybe<bool> KeyAccumulator::CollectKeys(Handle<JSReceiver> receiver,
     Maybe<bool> result = Just(false);  // Dummy initialization.
     if (current->IsJSProxy()) {
       result = CollectOwnJSProxyKeys(receiver, Handle<JSProxy>::cast(current));
+    } else if (current->IsWasmObject()) {
+      if (mode_ == KeyCollectionMode::kIncludePrototypes) {
+        RETURN_FAILURE(isolate_, kThrowOnError,
+                       NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
+      } else {
+        DCHECK_EQ(KeyCollectionMode::kOwnOnly, mode_);
+        DCHECK_EQ(result, Just(false));  // Stop iterating.
+      }
     } else {
       DCHECK(current->IsJSObject());
       result = CollectOwnKeys(receiver, Handle<JSObject>::cast(current));
diff --git a/deps/v8/src/objects/lookup.cc b/deps/v8/src/objects/lookup.cc
index 3fa41c0f57c6e3..e08ebaff089f8a 100644
--- a/deps/v8/src/objects/lookup.cc
+++ b/deps/v8/src/objects/lookup.cc
@@ -22,10 +22,6 @@
 #include "src/objects/property-details.h"
 #include "src/objects/struct-inl.h"
 
-#if V8_ENABLE_WEBASSEMBLY
-#include "src/wasm/wasm-objects-inl.h"
-#endif  // V8_ENABLE_WEBASSEMBLY
-
 namespace v8 {
 namespace internal {
 
@@ -334,9 +330,7 @@ void LookupIterator::InternalUpdateProtector(Isolate* isolate,
 void LookupIterator::PrepareForDataProperty(Handle<Object> value) {
   DCHECK(state_ == DATA || state_ == ACCESSOR);
   DCHECK(HolderIsReceiverOrHiddenPrototype());
-#if V8_ENABLE_WEBASSEMBLY
   DCHECK(!receiver_->IsWasmObject(isolate_));
-#endif  // V8_ENABLE_WEBASSEMBLY
 
   Handle<JSReceiver> holder = GetHolder<JSReceiver>();
   // We are not interested in tracking constness of a JSProxy's direct
@@ -464,9 +458,7 @@ void LookupIterator::ReconfigureDataProperty(Handle<Object> value,
   DCHECK(HolderIsReceiverOrHiddenPrototype());
 
   Handle<JSReceiver> holder = GetHolder<JSReceiver>();
-#if V8_ENABLE_WEBASSEMBLY
   if (V8_UNLIKELY(holder->IsWasmObject())) UNREACHABLE();
-#endif  // V8_ENABLE_WEBASSEMBLY
 
   // Property details can never change for private properties.
   if (holder->IsJSProxy(isolate_)) {
@@ -874,18 +866,8 @@ bool LookupIterator::HolderIsReceiverOrHiddenPrototype() const {
 Handle<Object> LookupIterator::FetchValue(
     AllocationPolicy allocation_policy) const {
   Object result;
+  DCHECK(!holder_->IsWasmObject());
   if (IsElement(*holder_)) {
-#if V8_ENABLE_WEBASSEMBLY
-    if (V8_UNLIKELY(holder_->IsWasmObject(isolate_))) {
-      if (holder_->IsWasmStruct()) {
-        // WasmStructs don't have elements.
-        return isolate_->factory()->undefined_value();
-      }
-      Handle<WasmArray> holder = GetHolder<WasmArray>();
-      return WasmArray::GetElement(isolate_, holder, number_.as_uint32());
-    }
-#endif  // V8_ENABLE_WEBASSEMBLY
-    DCHECK(holder_->IsJSObject(isolate_));
     Handle<JSObject> holder = GetHolder<JSObject>();
     ElementsAccessor* accessor = holder->GetElementsAccessor(isolate_);
     return accessor->Get(isolate_, holder, number_);
@@ -903,27 +885,6 @@ Handle<Object> LookupIterator::FetchValue(
     }
   } else if (property_details_.location() == PropertyLocation::kField) {
     DCHECK_EQ(PropertyKind::kData, property_details_.kind());
-#if V8_ENABLE_WEBASSEMBLY
-    if (V8_UNLIKELY(holder_->IsWasmObject(isolate_))) {
-      if (allocation_policy == AllocationPolicy::kAllocationDisallowed) {
-        // TODO(ishell): consider taking field type into account and relaxing
-        // this a bit.
-        return isolate_->factory()->undefined_value();
-      }
-      if (holder_->IsWasmArray(isolate_)) {
-        // WasmArrays don't have other named properties besides "length".
-        DCHECK_EQ(*name_, ReadOnlyRoots(isolate_).length_string());
-        Handle<WasmArray> holder = GetHolder<WasmArray>();
-        uint32_t length = holder->length();
-        return isolate_->factory()->NewNumberFromUint(length);
-      }
-      Handle<WasmStruct> holder = GetHolder<WasmStruct>();
-      return WasmStruct::GetField(isolate_, holder,
-                                  property_details_.field_index());
-    }
-#endif  // V8_ENABLE_WEBASSEMBLY
-
-    DCHECK(holder_->IsJSObject(isolate_));
     Handle<JSObject> holder = GetHolder<JSObject>();
     FieldIndex field_index =
         FieldIndex::ForDescriptor(holder->map(isolate_), descriptor_number());
@@ -1081,11 +1042,9 @@ Handle<Object> LookupIterator::GetDataValue(SeqCstAccessTag tag) const {
 void LookupIterator::WriteDataValue(Handle<Object> value,
                                     bool initializing_store) {
   DCHECK_EQ(DATA, state_);
-#if V8_ENABLE_WEBASSEMBLY
   // WriteDataValueToWasmObject() must be used instead for writing to
   // WasmObjects.
   DCHECK(!holder_->IsWasmObject(isolate_));
-#endif  // V8_ENABLE_WEBASSEMBLY
   DCHECK_IMPLIES(holder_->IsJSSharedStruct(), value->IsShared());
 
   Handle<JSReceiver> holder = GetHolder<JSReceiver>();
@@ -1179,42 +1138,6 @@ Handle<Object> LookupIterator::SwapDataValue(Handle<Object> value,
   return accessor->SwapAtomic(isolate_, holder, number_, *value, kSeqCstAccess);
 }
 
-#if V8_ENABLE_WEBASSEMBLY
-
-wasm::ValueType LookupIterator::wasm_value_type() const {
-  DCHECK(has_property_);
-  DCHECK(holder_->IsWasmObject(isolate_));
-  if (holder_->IsWasmStruct(isolate_)) {
-    wasm::StructType* wasm_struct_type = WasmStruct::cast(*holder_).type();
-    return wasm_struct_type->field(property_details_.field_index());
-
-  } else {
-    DCHECK(holder_->IsWasmArray(isolate_));
-    wasm::ArrayType* wasm_array_type = WasmArray::cast(*holder_).type();
-    return wasm_array_type->element_type();
-  }
-}
-
-void LookupIterator::WriteDataValueToWasmObject(Handle<Object> value) {
-  DCHECK_EQ(DATA, state_);
-  DCHECK(holder_->IsWasmObject(isolate_));
-  Handle<JSReceiver> holder = GetHolder<JSReceiver>();
-
-  if (IsElement(*holder)) {
-    // TODO(ishell): consider supporting indexed access to WasmStruct fields.
-    // TODO(v8:11804): implement stores to WasmArrays.
-    UNIMPLEMENTED();
-  } else {
-    // WasmArrays don't have writable properties.
-    DCHECK(holder->IsWasmStruct());
-    Handle<WasmStruct> wasm_holder = GetHolder<WasmStruct>();
-    WasmStruct::SetField(isolate_, wasm_holder, property_details_.field_index(),
-                         value);
-  }
-}
-
-#endif  // V8_ENABLE_WEBASSEMBLY
-
 template <bool is_element>
 bool LookupIterator::SkipInterceptor(JSObject holder) {
   InterceptorInfo info = GetInterceptor<is_element>(holder);
@@ -1284,9 +1207,7 @@ LookupIterator::State LookupIterator::LookupInSpecialHolder(
         if (is_element || !name_->IsPrivate(isolate_)) return JSPROXY;
       }
 #if V8_ENABLE_WEBASSEMBLY
-      if (map.IsWasmObjectMap()) {
-        return LookupInRegularHolder<is_element>(map, holder);
-      }
+      if (map.IsWasmObjectMap()) return WASM_OBJECT;
 #endif  // V8_ENABLE_WEBASSEMBLY
       if (map.is_access_check_needed()) {
         if (is_element || !name_->IsPrivate(isolate_) ||
@@ -1325,6 +1246,7 @@ LookupIterator::State LookupIterator::LookupInSpecialHolder(
       return NOT_FOUND;
     case INTEGER_INDEXED_EXOTIC:
     case JSPROXY:
+    case WASM_OBJECT:
     case TRANSITION:
       UNREACHABLE();
   }
@@ -1338,43 +1260,22 @@ LookupIterator::State LookupIterator::LookupInRegularHolder(
   if (interceptor_state_ == InterceptorState::kProcessNonMasking) {
     return NOT_FOUND;
   }
-
+  DCHECK(!holder.IsWasmObject(isolate_));
   if (is_element && IsElement(holder)) {
-#if V8_ENABLE_WEBASSEMBLY
-    if (V8_UNLIKELY(holder.IsWasmObject(isolate_))) {
-      // TODO(ishell): consider supporting indexed access to WasmStruct fields.
-      if (holder.IsWasmArray(isolate_)) {
-        WasmArray wasm_array = WasmArray::cast(holder);
-        number_ = index_ < wasm_array.length() ? InternalIndex(index_)
-                                               : InternalIndex::NotFound();
-        wasm::ArrayType* wasm_array_type = wasm_array.type();
-        property_details_ =
-            PropertyDetails(PropertyKind::kData,
-                            wasm_array_type->mutability() ? SEALED : FROZEN,
-                            PropertyCellType::kNoCell);
-
-      } else {
-        DCHECK(holder.IsWasmStruct(isolate_));
-        DCHECK(number_.is_not_found());
-      }
-    } else  // NOLINT(readability/braces)
-#endif      // V8_ENABLE_WEBASSEMBLY
-    {
-      JSObject js_object = JSObject::cast(holder);
-      ElementsAccessor* accessor = js_object.GetElementsAccessor(isolate_);
-      FixedArrayBase backing_store = js_object.elements(isolate_);
-      number_ = accessor->GetEntryForIndex(isolate_, js_object, backing_store,
-                                           index_);
-      if (number_.is_not_found()) {
-        return holder.IsJSTypedArray(isolate_) ? INTEGER_INDEXED_EXOTIC
-                                               : NOT_FOUND;
-      }
-      property_details_ = accessor->GetDetails(js_object, number_);
-      if (map.has_frozen_elements()) {
-        property_details_ = property_details_.CopyAddAttributes(FROZEN);
-      } else if (map.has_sealed_elements()) {
-        property_details_ = property_details_.CopyAddAttributes(SEALED);
-      }
+    JSObject js_object = JSObject::cast(holder);
+    ElementsAccessor* accessor = js_object.GetElementsAccessor(isolate_);
+    FixedArrayBase backing_store = js_object.elements(isolate_);
+    number_ =
+        accessor->GetEntryForIndex(isolate_, js_object, backing_store, index_);
+    if (number_.is_not_found()) {
+      return holder.IsJSTypedArray(isolate_) ? INTEGER_INDEXED_EXOTIC
+                                             : NOT_FOUND;
+    }
+    property_details_ = accessor->GetDetails(js_object, number_);
+    if (map.has_frozen_elements()) {
+      property_details_ = property_details_.CopyAddAttributes(FROZEN);
+    } else if (map.has_sealed_elements()) {
+      property_details_ = property_details_.CopyAddAttributes(SEALED);
     }
   } else if (!map.is_dictionary_map()) {
     DescriptorArray descriptors = map.instance_descriptors(isolate_);
diff --git a/deps/v8/src/objects/lookup.h b/deps/v8/src/objects/lookup.h
index 8526639ea407d0..782a09225c17a9 100644
--- a/deps/v8/src/objects/lookup.h
+++ b/deps/v8/src/objects/lookup.h
@@ -60,6 +60,7 @@ class V8_EXPORT_PRIVATE LookupIterator final {
     INTEGER_INDEXED_EXOTIC,
     INTERCEPTOR,
     JSPROXY,
+    WASM_OBJECT,
     NOT_FOUND,
     ACCESSOR,
     DATA,
@@ -197,13 +198,6 @@ class V8_EXPORT_PRIVATE LookupIterator final {
   static inline void UpdateProtector(Isolate* isolate, Handle<Object> receiver,
                                      Handle<Name> name);
 
-#if V8_ENABLE_WEBASSEMBLY
-  // Fetches type of WasmStruct's field or WasmArray's elements, it
-  // is used for preparing the value for storing into WasmObjects.
-  wasm::ValueType wasm_value_type() const;
-  void WriteDataValueToWasmObject(Handle<Object> value);
-#endif  // V8_ENABLE_WEBASSEMBLY
-
   // Lookup a 'cached' private property for an accessor.
   // If not found returns false and leaves the LookupIterator unmodified.
   bool TryLookupCachedProperty(Handle<AccessorPair> accessor);
diff --git a/deps/v8/src/objects/map-inl.h b/deps/v8/src/objects/map-inl.h
index 6421ef1449f533..04cdb99e103c5a 100644
--- a/deps/v8/src/objects/map-inl.h
+++ b/deps/v8/src/objects/map-inl.h
@@ -53,6 +53,7 @@ RELEASE_ACQUIRE_WEAK_ACCESSORS(Map, raw_transitions,
 
 ACCESSORS_CHECKED2(Map, prototype, HeapObject, kPrototypeOffset, true,
                    value.IsNull() || value.IsJSProxy() ||
+                       value.IsWasmObject() ||
                        (value.IsJSObject() && value.map().is_prototype_map()))
 
 DEF_GETTER(Map, prototype_info, Object) {
diff --git a/deps/v8/src/objects/map.cc b/deps/v8/src/objects/map.cc
index ca86b4b5fed681..c065533248a7c6 100644
--- a/deps/v8/src/objects/map.cc
+++ b/deps/v8/src/objects/map.cc
@@ -299,11 +299,13 @@ VisitorId Map::GetVisitorId(Map map) {
     case JS_TEMPORAL_TIME_ZONE_TYPE:
     case JS_TEMPORAL_ZONED_DATE_TIME_TYPE:
     case JS_TYPED_ARRAY_PROTOTYPE_TYPE:
+    case JS_RAW_JSON_TYPE:
 #ifdef V8_INTL_SUPPORT
     case JS_V8_BREAK_ITERATOR_TYPE:
     case JS_COLLATOR_TYPE:
     case JS_DATE_TIME_FORMAT_TYPE:
     case JS_DISPLAY_NAMES_TYPE:
+    case JS_DURATION_FORMAT_TYPE:
     case JS_LIST_FORMAT_TYPE:
     case JS_LOCALE_TYPE:
     case JS_NUMBER_FORMAT_TYPE:
@@ -2296,7 +2298,8 @@ void Map::SetPrototype(Isolate* isolate, Handle<Map> map,
     Handle<JSObject> prototype_jsobj = Handle<JSObject>::cast(prototype);
     JSObject::OptimizeAsPrototype(prototype_jsobj, enable_prototype_setup_mode);
   } else {
-    DCHECK(prototype->IsNull(isolate) || prototype->IsJSProxy());
+    DCHECK(prototype->IsNull(isolate) || prototype->IsJSProxy() ||
+           prototype->IsWasmObject());
   }
 
   WriteBarrierMode wb_mode =
diff --git a/deps/v8/src/objects/maybe-object-inl.h b/deps/v8/src/objects/maybe-object-inl.h
index 4b06fec5cb7d31..f5dd961487015f 100644
--- a/deps/v8/src/objects/maybe-object-inl.h
+++ b/deps/v8/src/objects/maybe-object-inl.h
@@ -84,8 +84,8 @@ HeapObjectReference HeapObjectReference::ClearedValue(
 #ifdef V8_COMPRESS_POINTERS
   // This is necessary to make pointer decompression computation also
   // suitable for cleared weak references.
-  Address raw_value =
-      DecompressTaggedPointer(cage_base, kClearedWeakHeapObjectLower32);
+  Address raw_value = V8HeapCompressionScheme::DecompressTaggedPointer(
+      cage_base, kClearedWeakHeapObjectLower32);
 #else
   Address raw_value = kClearedWeakHeapObjectLower32;
 #endif
diff --git a/deps/v8/src/objects/maybe-object.h b/deps/v8/src/objects/maybe-object.h
index 0393ef6497b393..1005693ae1d8bc 100644
--- a/deps/v8/src/objects/maybe-object.h
+++ b/deps/v8/src/objects/maybe-object.h
@@ -36,7 +36,7 @@ class MaybeObject : public TaggedImpl<HeapObjectReferenceType::WEAK, Address> {
 #endif
 
  private:
-  template <typename TFieldType, int kFieldOffset>
+  template <typename TFieldType, int kFieldOffset, typename CompressionScheme>
   friend class TaggedField;
 };
 
diff --git a/deps/v8/src/objects/name-inl.h b/deps/v8/src/objects/name-inl.h
index 570ac0a5082021..ee3585eb6a031d 100644
--- a/deps/v8/src/objects/name-inl.h
+++ b/deps/v8/src/objects/name-inl.h
@@ -190,6 +190,14 @@ uint32_t Name::EnsureRawHash(
   return String::cast(*this).ComputeAndSetRawHash(access_guard);
 }
 
+uint32_t Name::RawHash() {
+  uint32_t field = raw_hash_field(kAcquireLoad);
+  if (V8_UNLIKELY(IsForwardingIndex(field))) {
+    return GetRawHashFromForwardingTable(field);
+  }
+  return field;
+}
+
 uint32_t Name::EnsureHash() { return HashBits::decode(EnsureRawHash()); }
 
 uint32_t Name::EnsureHash(const SharedStringAccessGuardIfNeeded& access_guard) {
diff --git a/deps/v8/src/objects/name.h b/deps/v8/src/objects/name.h
index dcd1b9652d869b..c2816d04c20f85 100644
--- a/deps/v8/src/objects/name.h
+++ b/deps/v8/src/objects/name.h
@@ -190,6 +190,7 @@ class Name : public TorqueGeneratedName<Name, PrimitiveHeapObject> {
   // a forwarding index.
   inline uint32_t EnsureRawHash();
   inline uint32_t EnsureRawHash(const SharedStringAccessGuardIfNeeded&);
+  inline uint32_t RawHash();
 
   static inline bool IsHashFieldComputed(uint32_t raw_hash_field);
   static inline bool IsHash(uint32_t raw_hash_field);
diff --git a/deps/v8/src/objects/object-list-macros.h b/deps/v8/src/objects/object-list-macros.h
index 183c414f2e1e42..368dd5400921a5 100644
--- a/deps/v8/src/objects/object-list-macros.h
+++ b/deps/v8/src/objects/object-list-macros.h
@@ -158,6 +158,7 @@ class ZoneForwardList;
   V(JSPrimitiveWrapper)                         \
   V(JSPromise)                                  \
   V(JSProxy)                                    \
+  V(JSRawJson)                                  \
   V(JSReceiver)                                 \
   V(JSRegExp)                                   \
   V(JSRegExpStringIterator)                     \
@@ -279,6 +280,7 @@ class ZoneForwardList;
   V(JSCollator)                           \
   V(JSDateTimeFormat)                     \
   V(JSDisplayNames)                       \
+  V(JSDurationFormat)                     \
   V(JSListFormat)                         \
   V(JSLocale)                             \
   V(JSNumberFormat)                       \
diff --git a/deps/v8/src/objects/object-macros.h b/deps/v8/src/objects/object-macros.h
index 7b9cf484061794..f5de0bb96072b4 100644
--- a/deps/v8/src/objects/object-macros.h
+++ b/deps/v8/src/objects/object-macros.h
@@ -18,14 +18,14 @@
 
 // Since this changes visibility, it should always be last in a class
 // definition.
-#define OBJECT_CONSTRUCTORS(Type, ...)             \
- public:                                           \
-  constexpr Type() : __VA_ARGS__() {}              \
-                                                   \
- protected:                                        \
-  template <typename TFieldType, int kFieldOffset> \
-  friend class TaggedField;                        \
-                                                   \
+#define OBJECT_CONSTRUCTORS(Type, ...)                                         \
+ public:                                                                       \
+  constexpr Type() : __VA_ARGS__() {}                                          \
+                                                                               \
+ protected:                                                                    \
+  template <typename TFieldType, int kFieldOffset, typename CompressionScheme> \
+  friend class TaggedField;                                                    \
+                                                                               \
   explicit inline Type(Address ptr)
 
 #define OBJECT_CONSTRUCTORS_IMPL(Type, Super) \
@@ -698,15 +698,15 @@ static_assert(sizeof(unsigned) == sizeof(uint32_t),
     set(IndexForEntry(i) + k##name##Offset, value);             \
   }
 
-#define TQ_OBJECT_CONSTRUCTORS(Type)               \
- public:                                           \
-  constexpr Type() = default;                      \
-                                                   \
- protected:                                        \
-  template <typename TFieldType, int kFieldOffset> \
-  friend class TaggedField;                        \
-                                                   \
-  inline explicit Type(Address ptr);               \
+#define TQ_OBJECT_CONSTRUCTORS(Type)                                           \
+ public:                                                                       \
+  constexpr Type() = default;                                                  \
+                                                                               \
+ protected:                                                                    \
+  template <typename TFieldType, int kFieldOffset, typename CompressionScheme> \
+  friend class TaggedField;                                                    \
+                                                                               \
+  inline explicit Type(Address ptr);                                           \
   friend class TorqueGenerated##Type<Type, Super>;
 
 #define TQ_OBJECT_CONSTRUCTORS_IMPL(Type) \
diff --git a/deps/v8/src/objects/objects-body-descriptors-inl.h b/deps/v8/src/objects/objects-body-descriptors-inl.h
index e6994bb87ca15b..4496fdedcf20c7 100644
--- a/deps/v8/src/objects/objects-body-descriptors-inl.h
+++ b/deps/v8/src/objects/objects-body-descriptors-inl.h
@@ -953,12 +953,10 @@ class Code::BodyDescriptor final : public BodyDescriptorBase {
       RelocInfo::ModeMask(RelocInfo::RELATIVE_CODE_TARGET) |
       RelocInfo::ModeMask(RelocInfo::FULL_EMBEDDED_OBJECT) |
       RelocInfo::ModeMask(RelocInfo::COMPRESSED_EMBEDDED_OBJECT) |
-      RelocInfo::ModeMask(RelocInfo::DATA_EMBEDDED_OBJECT) |
       RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
       RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
       RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
-      RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET) |
-      RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY);
+      RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET);
 
   template <typename ObjectVisitor>
   static inline void IterateBody(Map map, HeapObject obj, ObjectVisitor* v) {
@@ -1282,11 +1280,13 @@ auto BodyDescriptorApply(InstanceType type, Args&&... args) {
   case TYPE##_TYPED_ARRAY_CONSTRUCTOR_TYPE:
       TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTORS_SWITCH)
 #undef TYPED_ARRAY_CONSTRUCTORS_SWITCH
+    case JS_RAW_JSON_TYPE:
 #ifdef V8_INTL_SUPPORT
     case JS_V8_BREAK_ITERATOR_TYPE:
     case JS_COLLATOR_TYPE:
     case JS_DATE_TIME_FORMAT_TYPE:
     case JS_DISPLAY_NAMES_TYPE:
+    case JS_DURATION_FORMAT_TYPE:
     case JS_LIST_FORMAT_TYPE:
     case JS_LOCALE_TYPE:
     case JS_NUMBER_FORMAT_TYPE:
diff --git a/deps/v8/src/objects/objects-inl.h b/deps/v8/src/objects/objects-inl.h
index 4ba77c3009a757..025c87dbf313cc 100644
--- a/deps/v8/src/objects/objects-inl.h
+++ b/deps/v8/src/objects/objects-inl.h
@@ -43,6 +43,7 @@
 #include "src/objects/tagged-impl-inl.h"
 #include "src/objects/tagged-index.h"
 #include "src/objects/templates.h"
+#include "src/sandbox/bounded-size-inl.h"
 #include "src/sandbox/external-pointer-inl.h"
 #include "src/sandbox/sandboxed-pointer-inl.h"
 
@@ -663,6 +664,14 @@ void Object::WriteSandboxedPointerField(size_t offset, Isolate* isolate,
                                 PtrComprCageBase(isolate), value);
 }
 
+size_t Object::ReadBoundedSizeField(size_t offset) const {
+  return i::ReadBoundedSizeField(field_address(offset));
+}
+
+void Object::WriteBoundedSizeField(size_t offset, size_t value) {
+  i::WriteBoundedSizeField(field_address(offset), value);
+}
+
 template <ExternalPointerTag tag>
 void Object::InitExternalPointerField(size_t offset, Isolate* isolate,
                                       Address value) {
@@ -733,14 +742,19 @@ HeapObject MapWord::ToForwardingAddress() {
 
 HeapObject MapWord::ToForwardingAddress(PtrComprCageBase host_cage_base) {
   DCHECK(IsForwardingAddress());
-  if (V8_EXTERNAL_CODE_SPACE_BOOL) {
-    // Recompress value_ using proper host_cage_base since the map word
-    // has the upper 32 bits that correspond to the main cage base value.
-    Address value =
-        DecompressTaggedPointer(host_cage_base, CompressTagged(value_));
-    return HeapObject::FromAddress(value);
-  }
+#ifdef V8_EXTERNAL_CODE_SPACE
+  // Recompress value_ using proper host_cage_base and compression scheme
+  // since the map word is decompressed using the default compression scheme
+  // in an assumption it'll contain Map pointer.
+  // TODO(v8:11880): this code must be updated once a different scheme is used
+  // for external code fields.
+  Tagged_t compressed = V8HeapCompressionScheme::CompressTagged(value_);
+  Address value = V8HeapCompressionScheme::DecompressTaggedPointer(
+      host_cage_base, compressed);
+  return HeapObject::FromAddress(value);
+#else
   return HeapObject::FromAddress(value_);
+#endif  // V8_EXTERNAL_CODE_SPACE
 }
 
 #ifdef VERIFY_HEAP
@@ -1135,6 +1149,9 @@ Object Object::GetSimpleHash(Object object) {
   } else if (InstanceTypeChecker::IsSharedFunctionInfo(instance_type)) {
     uint32_t hash = SharedFunctionInfo::cast(object).Hash();
     return Smi::FromInt(hash & Smi::kMaxValue);
+  } else if (InstanceTypeChecker::IsScopeInfo(instance_type)) {
+    uint32_t hash = ScopeInfo::cast(object).Hash();
+    return Smi::FromInt(hash & Smi::kMaxValue);
   }
   DCHECK(object.IsJSReceiver());
   return object;
@@ -1198,6 +1215,23 @@ MaybeHandle<Object> Object::Share(Isolate* isolate, Handle<Object> value,
                    throw_if_cannot_be_shared);
 }
 
+// https://tc39.es/proposal-symbols-as-weakmap-keys/#sec-canbeheldweakly-abstract-operation
+bool Object::CanBeHeldWeakly() const {
+  if (IsJSReceiver()) {
+    // TODO(v8:12547) Shared structs and arrays should only be able to point
+    // to shared values in weak collections. For now, disallow them as weak
+    // collection keys.
+    if (v8_flags.harmony_struct) {
+      return !IsJSSharedStruct() && !IsJSSharedArray();
+    }
+    return true;
+  }
+  if (v8_flags.harmony_symbol_as_weakmap_key) {
+    return IsSymbol() && !Symbol::cast(*this).is_in_public_symbol_table();
+  }
+  return false;
+}
+
 Handle<Object> ObjectHashTableShape::AsHandle(Handle<Object> key) {
   return key;
 }
diff --git a/deps/v8/src/objects/objects.cc b/deps/v8/src/objects/objects.cc
index 75da04a3329735..c15ac8656adeaf 100644
--- a/deps/v8/src/objects/objects.cc
+++ b/deps/v8/src/objects/objects.cc
@@ -1167,6 +1167,10 @@ MaybeHandle<Object> Object::GetProperty(LookupIterator* it,
         if (!was_found && !is_global_reference) it->NotFound();
         return result;
       }
+      case LookupIterator::WASM_OBJECT:
+        THROW_NEW_ERROR(it->isolate(),
+                        NewTypeError(MessageTemplate::kWasmObjectsAreOpaque),
+                        Object);
       case LookupIterator::INTERCEPTOR: {
         bool done;
         Handle<Object> result;
@@ -2505,6 +2509,10 @@ Maybe<bool> Object::SetPropertyInternal(LookupIterator* it,
                                     value, receiver, should_throw);
       }
 
+      case LookupIterator::WASM_OBJECT:
+        RETURN_FAILURE(it->isolate(), kThrowOnError,
+                       NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
+
       case LookupIterator::INTERCEPTOR: {
         if (it->HolderIsReceiverOrHiddenPrototype()) {
           Maybe<bool> result =
@@ -2722,6 +2730,7 @@ Maybe<bool> Object::SetSuperProperty(LookupIterator* it, Handle<Object> value,
 
       case LookupIterator::NOT_FOUND:
       case LookupIterator::TRANSITION:
+      case LookupIterator::WASM_OBJECT:
         UNREACHABLE();
     }
   }
@@ -2811,38 +2820,22 @@ Maybe<bool> Object::SetDataProperty(LookupIterator* it, Handle<Object> value) {
     }
   }
 
-#if V8_ENABLE_WEBASSEMBLY
-  if (receiver->IsWasmObject(isolate)) {
-    // Prepares given value for being stored into a field of given Wasm type
-    // or throw if the value can't be stored into the field.
-    ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-        isolate, to_assign,
-        WasmObject::ToWasmValue(isolate, it->wasm_value_type(), to_assign),
-        Nothing<bool>());
-
-    // Store prepared value.
-    it->WriteDataValueToWasmObject(to_assign);
-
-  } else  // NOLINT(readability/braces)
-#endif    // V8_ENABLE_WEBASSEMBLY
-          // clang-format off
+  DCHECK(!receiver->IsWasmObject(isolate));
   if (V8_UNLIKELY(receiver->IsJSSharedStruct(isolate) ||
                   receiver->IsJSSharedArray(isolate))) {
-      // clang-format on
-
-      // Shared structs can only point to primitives or shared values.
-      ASSIGN_RETURN_ON_EXCEPTION_VALUE(
-          isolate, to_assign, Object::Share(isolate, to_assign, kThrowOnError),
-          Nothing<bool>());
-      it->WriteDataValue(to_assign, false);
-    } else {
-      // Possibly migrate to the most up-to-date map that will be able to store
-      // |value| under it->name().
-      it->PrepareForDataProperty(to_assign);
+    // Shared structs can only point to primitives or shared values.
+    ASSIGN_RETURN_ON_EXCEPTION_VALUE(
+        isolate, to_assign, Object::Share(isolate, to_assign, kThrowOnError),
+        Nothing<bool>());
+    it->WriteDataValue(to_assign, false);
+  } else {
+    // Possibly migrate to the most up-to-date map that will be able to store
+    // |value| under it->name().
+    it->PrepareForDataProperty(to_assign);
 
-      // Write the property value.
-      it->WriteDataValue(to_assign, false);
-    }
+    // Write the property value.
+    it->WriteDataValue(to_assign, false);
+  }
 
 #if VERIFY_HEAP
   if (v8_flags.verify_heap) {
diff --git a/deps/v8/src/objects/objects.h b/deps/v8/src/objects/objects.h
index f85f1a907999f7..e1df081a5c72c5 100644
--- a/deps/v8/src/objects/objects.h
+++ b/deps/v8/src/objects/objects.h
@@ -86,6 +86,7 @@
 //         - JSCollator            // If V8_INTL_SUPPORT enabled.
 //         - JSDateTimeFormat      // If V8_INTL_SUPPORT enabled.
 //         - JSDisplayNames        // If V8_INTL_SUPPORT enabled.
+//         - JSDurationFormat      // If V8_INTL_SUPPORT enabled.
 //         - JSListFormat          // If V8_INTL_SUPPORT enabled.
 //         - JSLocale              // If V8_INTL_SUPPORT enabled.
 //         - JSNumberFormat        // If V8_INTL_SUPPORT enabled.
@@ -335,6 +336,11 @@ class Object : public TaggedImpl<HeapObjectReferenceType::STRONG, Address> {
   V8_INLINE bool IsPrivateSymbol() const;
   V8_INLINE bool IsPublicSymbol() const;
 
+#if !V8_ENABLE_WEBASSEMBLY
+  // Dummy implementation on builds without WebAssembly.
+  bool IsWasmObject(Isolate* = nullptr) const { return false; }
+#endif
+
   enum class Conversion { kToNumber, kToNumeric };
 
 #define DECL_STRUCT_PREDICATE(NAME, Name, name) \
@@ -737,6 +743,12 @@ class Object : public TaggedImpl<HeapObjectReferenceType::STRONG, Address> {
   inline void WriteSandboxedPointerField(size_t offset, Isolate* isolate,
                                          Address value);
 
+  //
+  // BoundedSize field accessors.
+  //
+  inline size_t ReadBoundedSizeField(size_t offset) const;
+  inline void WriteBoundedSizeField(size_t offset, size_t value);
+
   //
   // ExternalPointer_t field accessors.
   //
@@ -779,6 +791,11 @@ class Object : public TaggedImpl<HeapObjectReferenceType::STRONG, Address> {
                                        Handle<HeapObject> value,
                                        ShouldThrow throw_if_cannot_be_shared);
 
+  // Whether this Object can be held weakly, i.e. whether it can be used as a
+  // key in WeakMap, as a key in WeakSet, as the target of a WeakRef, or as a
+  // target or unregister token of a FinalizationRegistry.
+  inline bool CanBeHeldWeakly() const;
+
  protected:
   inline Address field_address(size_t offset) const {
     return ptr() + offset - kHeapObjectTag;
@@ -904,7 +921,7 @@ class MapWord {
  private:
   // HeapObject calls the private constructor and directly reads the value.
   friend class HeapObject;
-  template <typename TFieldType, int kFieldOffset>
+  template <typename TFieldType, int kFieldOffset, typename CompressionScheme>
   friend class TaggedField;
 
   explicit MapWord(Address value) : value_(value) {}
diff --git a/deps/v8/src/objects/option-utils.h b/deps/v8/src/objects/option-utils.h
index 3075dbf1f5d7ed..1b7d81704f61bb 100644
--- a/deps/v8/src/objects/option-utils.h
+++ b/deps/v8/src/objects/option-utils.h
@@ -76,8 +76,8 @@ V8_WARN_UNUSED_RESULT static Maybe<T> GetStringOrBooleanOption(
     const std::vector<T>& enum_values, T true_value, T false_value,
     T fallback_value) {
   DCHECK_EQ(str_values.size(), enum_values.size());
-  Handle<String> property_str =
-      isolate->factory()->NewStringFromAsciiChecked(property);
+  Factory* factory = isolate->factory();
+  Handle<String> property_str = factory->NewStringFromAsciiChecked(property);
 
   // 1. Let value be ? Get(options, property).
   Handle<Object> value;
@@ -104,8 +104,14 @@ V8_WARN_UNUSED_RESULT static Maybe<T> GetStringOrBooleanOption(
   // 6. Let value be ? ToString(value).
   ASSIGN_RETURN_ON_EXCEPTION_VALUE(
       isolate, value_str, Object::ToString(isolate, value), Nothing<T>());
-  // If values does not contain an element equal to value, return fallback.
-  // 8. Return value.
+  // 7. If value is *"true"* or *"false"*, return _fallback_.
+  if (String::Equals(isolate, value_str, factory->true_string()) ||
+      String::Equals(isolate, value_str, factory->false_string())) {
+    return Just(fallback_value);
+  }
+  // 8. If values does not contain an element equal to _value_, throw a
+  // *RangeError* exception.
+  // 9. Return value.
   value_str = String::Flatten(isolate, value_str);
   {
     DisallowGarbageCollection no_gc;
@@ -127,7 +133,11 @@ V8_WARN_UNUSED_RESULT static Maybe<T> GetStringOrBooleanOption(
       }
     }
   }  // end of no_gc
-  return Just(fallback_value);
+  THROW_NEW_ERROR_RETURN_VALUE(
+      isolate,
+      NewRangeError(MessageTemplate::kValueOutOfRange, value,
+                    factory->NewStringFromAsciiChecked(method), property_str),
+      Nothing<T>());
 }
 
 // ECMA402 9.2.10. GetOption( options, property, type, values, fallback)
diff --git a/deps/v8/src/objects/scope-info.cc b/deps/v8/src/objects/scope-info.cc
index 94fc55c583f582..045f6c1cecea38 100644
--- a/deps/v8/src/objects/scope-info.cc
+++ b/deps/v8/src/objects/scope-info.cc
@@ -22,9 +22,14 @@ namespace v8 {
 namespace internal {
 
 #ifdef DEBUG
-bool ScopeInfo::Equals(ScopeInfo other) const {
+bool ScopeInfo::Equals(ScopeInfo other,
+                       bool ignore_position_and_module_info) const {
   if (length() != other.length()) return false;
   for (int index = 0; index < length(); ++index) {
+    if (ignore_position_and_module_info && HasPositionInfo() &&
+        index >= PositionInfoIndex() && index <= PositionInfoIndex() + 1) {
+      continue;
+    }
     Object entry = get(index);
     Object other_entry = other.get(index);
     if (entry.IsSmi()) {
@@ -39,14 +44,20 @@ bool ScopeInfo::Equals(ScopeInfo other) const {
           return false;
         }
       } else if (entry.IsScopeInfo()) {
-        if (!ScopeInfo::cast(entry).Equals(ScopeInfo::cast(other_entry))) {
+        if (!ScopeInfo::cast(entry).Equals(ScopeInfo::cast(other_entry),
+                                           ignore_position_and_module_info)) {
           return false;
         }
       } else if (entry.IsSourceTextModuleInfo()) {
-        if (!SourceTextModuleInfo::cast(entry).Equals(
+        if (!ignore_position_and_module_info &&
+            !SourceTextModuleInfo::cast(entry).Equals(
                 SourceTextModuleInfo::cast(other_entry))) {
           return false;
         }
+      } else if (entry.IsOddball()) {
+        if (Oddball::cast(entry).kind() != Oddball::cast(other_entry).kind()) {
+          return false;
+        }
       } else {
         UNREACHABLE();
       }
@@ -1100,6 +1111,19 @@ void ScopeInfo::ModuleVariable(int i, String* name, int* index,
   }
 }
 
+uint32_t ScopeInfo::Hash() {
+  // Hash ScopeInfo based on its start and end position.
+  // Note: Ideally we'd also have the script ID. But since we only use the
+  // hash in a debug-evaluate cache, we don't worry too much about collisions.
+  if (HasPositionInfo()) {
+    return static_cast<uint32_t>(
+        base::hash_combine(flags(), StartPosition(), EndPosition()));
+  }
+
+  return static_cast<uint32_t>(
+      base::hash_combine(flags(), context_local_count()));
+}
+
 std::ostream& operator<<(std::ostream& os, VariableAllocationInfo var_info) {
   switch (var_info) {
     case VariableAllocationInfo::NONE:
diff --git a/deps/v8/src/objects/scope-info.h b/deps/v8/src/objects/scope-info.h
index 3d266606f62440..89001da93b5655 100644
--- a/deps/v8/src/objects/scope-info.h
+++ b/deps/v8/src/objects/scope-info.h
@@ -253,7 +253,8 @@ class ScopeInfo : public TorqueGeneratedScopeInfo<ScopeInfo, HeapObject> {
   bool IsReplModeScope() const;
 
 #ifdef DEBUG
-  bool Equals(ScopeInfo other) const;
+  bool Equals(ScopeInfo other,
+              bool ignore_position_and_module_info = false) const;
 #endif
 
   template <typename IsolateT>
@@ -304,6 +305,9 @@ class ScopeInfo : public TorqueGeneratedScopeInfo<ScopeInfo, HeapObject> {
   // Gives access to raw memory which stores the ScopeInfo's data.
   inline ObjectSlot data_start();
 
+  // Hash based on position info and flags. Falls back to flags + local count.
+  V8_EXPORT_PRIVATE uint32_t Hash();
+
  private:
   friend class WebSnapshotDeserializer;
 
diff --git a/deps/v8/src/objects/shared-function-info.cc b/deps/v8/src/objects/shared-function-info.cc
index c5dabb0d33ca1d..9e442c5c5ccff1 100644
--- a/deps/v8/src/objects/shared-function-info.cc
+++ b/deps/v8/src/objects/shared-function-info.cc
@@ -716,24 +716,35 @@ int SharedFunctionInfo::EndPosition() const {
   return kNoSourcePosition;
 }
 
-void SharedFunctionInfo::SetPosition(int start_position, int end_position) {
+void SharedFunctionInfo::UpdateFromFunctionLiteralForLiveEdit(
+    FunctionLiteral* lit) {
   Object maybe_scope_info = name_or_scope_info(kAcquireLoad);
   if (maybe_scope_info.IsScopeInfo()) {
-    ScopeInfo info = ScopeInfo::cast(maybe_scope_info);
-    if (info.HasPositionInfo()) {
-      info.SetPositionInfo(start_position, end_position);
-    }
-  } else if (HasUncompiledData()) {
+    // Updating the ScopeInfo is safe since they are identical modulo
+    // source positions.
+    ScopeInfo new_scope_info = *lit->scope()->scope_info();
+    DCHECK(new_scope_info.Equals(ScopeInfo::cast(maybe_scope_info), true));
+    SetScopeInfo(new_scope_info);
+  } else if (!is_compiled()) {
+    CHECK(HasUncompiledData());
     if (HasUncompiledDataWithPreparseData()) {
-      // Clear out preparsed scope data, since the position setter invalidates
-      // any scope data.
       ClearPreparseData();
     }
-    uncompiled_data().set_start_position(start_position);
-    uncompiled_data().set_end_position(end_position);
-  } else {
-    UNREACHABLE();
+    uncompiled_data().set_start_position(lit->start_position());
+    uncompiled_data().set_end_position(lit->end_position());
+
+    if (!is_toplevel()) {
+      Scope* outer_scope = lit->scope()->GetOuterScopeWithContext();
+      if (outer_scope) {
+        // Use the raw accessor since we have to replace the existing outer
+        // scope.
+        set_raw_outer_scope_info_or_feedback_metadata(
+            *outer_scope->scope_info());
+      }
+    }
   }
+  SetFunctionTokenPosition(lit->function_token_position(),
+                           lit->start_position());
 }
 
 // static
diff --git a/deps/v8/src/objects/shared-function-info.h b/deps/v8/src/objects/shared-function-info.h
index 15038faa5461f9..b0a73066559abd 100644
--- a/deps/v8/src/objects/shared-function-info.h
+++ b/deps/v8/src/objects/shared-function-info.h
@@ -253,9 +253,8 @@ class SharedFunctionInfo
   // Start position of this function in the script source.
   V8_EXPORT_PRIVATE int StartPosition() const;
 
-  // Set the start and end position of this function in the script source.
-  // Updates the scope info if available.
-  V8_EXPORT_PRIVATE void SetPosition(int start_position, int end_position);
+  V8_EXPORT_PRIVATE void UpdateFromFunctionLiteralForLiveEdit(
+      FunctionLiteral* lit);
 
   // [outer scope info | feedback metadata] Shared storage for outer scope info
   // (on uncompiled functions) and feedback metadata (on compiled functions).
diff --git a/deps/v8/src/objects/simd.cc b/deps/v8/src/objects/simd.cc
index 54dd3a0809bbf9..4fa55e4cc76597 100644
--- a/deps/v8/src/objects/simd.cc
+++ b/deps/v8/src/objects/simd.cc
@@ -94,7 +94,7 @@ inline uintptr_t slow_search(T* array, uintptr_t array_len, uintptr_t index,
 // is uint64_t[2], and not uint32_t[4].
 // C++ standard dictates that a union can only be initialized through its first
 // member, which forces us to have uint64_t[2] for definition.
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) && !defined(__clang__)
 #define PACK32x4(w, x, y, z) \
   { ((w) + (uint64_t(x) << 32)), ((y) + (uint64_t(z) << 32)) }
 #else
diff --git a/deps/v8/src/objects/slots-inl.h b/deps/v8/src/objects/slots-inl.h
index 989a553f81e03f..9f97aba2b34e41 100644
--- a/deps/v8/src/objects/slots-inl.h
+++ b/deps/v8/src/objects/slots-inl.h
@@ -272,7 +272,7 @@ inline void CopyTagged(Address dst, const Address src, size_t num_tagged) {
 // Sets |counter| number of kTaggedSize-sized values starting at |start| slot.
 inline void MemsetTagged(Tagged_t* start, Object value, size_t counter) {
 #ifdef V8_COMPRESS_POINTERS
-  Tagged_t raw_value = CompressTagged(value.ptr());
+  Tagged_t raw_value = V8HeapCompressionScheme::CompressTagged(value.ptr());
   MemsetUint32(start, raw_value, counter);
 #else
   Address raw_value = value.ptr();
diff --git a/deps/v8/src/objects/string-forwarding-table.cc b/deps/v8/src/objects/string-forwarding-table.cc
index 0a6462b6135b8d..53366ed2bbc3b3 100644
--- a/deps/v8/src/objects/string-forwarding-table.cc
+++ b/deps/v8/src/objects/string-forwarding-table.cc
@@ -261,6 +261,11 @@ uint32_t StringForwardingTable::GetRawHash(PtrComprCageBase cage_base,
   return block->record(index_in_block)->raw_hash(cage_base);
 }
 
+// static
+uint32_t StringForwardingTable::GetRawHashStatic(Isolate* isolate, int index) {
+  return isolate->string_forwarding_table()->GetRawHash(isolate, index);
+}
+
 v8::String::ExternalStringResourceBase*
 StringForwardingTable::GetExternalResource(int index, bool* is_one_byte) const {
   CHECK_LT(index, size());
diff --git a/deps/v8/src/objects/string-forwarding-table.h b/deps/v8/src/objects/string-forwarding-table.h
index 72e4d73c0ba536..3cf7d3280b258f 100644
--- a/deps/v8/src/objects/string-forwarding-table.h
+++ b/deps/v8/src/objects/string-forwarding-table.h
@@ -56,6 +56,7 @@ class StringForwardingTable {
   static Address GetForwardStringAddress(Isolate* isolate, int index);
   V8_EXPORT_PRIVATE uint32_t GetRawHash(PtrComprCageBase cage_base,
                                         int index) const;
+  static uint32_t GetRawHashStatic(Isolate* isolate, int index);
   v8::String::ExternalStringResourceBase* GetExternalResource(
       int index, bool* is_one_byte) const;
 
diff --git a/deps/v8/src/objects/string.cc b/deps/v8/src/objects/string.cc
index 7060047d8eb55c..cf7b0afd927432 100644
--- a/deps/v8/src/objects/string.cc
+++ b/deps/v8/src/objects/string.cc
@@ -198,7 +198,9 @@ void InitExternalPointerFieldsDuringExternalization(String string, Map new_map,
 }  // namespace
 
 template <typename IsolateT>
-void String::MakeThin(IsolateT* isolate, String internalized) {
+void String::MakeThin(
+    IsolateT* isolate, String internalized,
+    UpdateInvalidatedObjectSize update_invalidated_object_size) {
   DisallowGarbageCollection no_gc;
   DCHECK_NE(*this, internalized);
   DCHECK(internalized.IsInternalizedString());
@@ -218,7 +220,7 @@ void String::MakeThin(IsolateT* isolate, String internalized) {
   }
 #endif
 
-  bool has_pointers = initial_shape.IsIndirect();
+  bool may_contain_recorded_slots = initial_shape.IsIndirect();
   int old_size = SizeFromMap(initial_map);
   Map target_map = ComputeThinStringMap(isolate, initial_shape,
                                         internalized.IsOneByteRepresentation());
@@ -232,6 +234,12 @@ void String::MakeThin(IsolateT* isolate, String internalized) {
     isolate->AsIsolate()->heap()->NotifyObjectLayoutChange(
         *this, no_gc, InvalidateRecordedSlots::kYes, ThinString::kSize);
     MigrateExternalString(isolate->AsIsolate(), *this, internalized);
+
+    // Conservatively assume ExternalStrings may have recorded slots, because
+    // they could have been transitioned from ConsStrings without having had the
+    // recorded slots cleared.
+    // TODO(v8:13374): Fix this more uniformly.
+    may_contain_recorded_slots = true;
   }
 
   // Update actual first and then do release store on the map word. This ensures
@@ -249,21 +257,26 @@ void String::MakeThin(IsolateT* isolate, String internalized) {
   int size_delta = old_size - ThinString::kSize;
   if (size_delta != 0) {
     if (!Heap::IsLargeObject(thin)) {
-      isolate->heap()->NotifyObjectSizeChange(
-          thin, old_size, ThinString::kSize,
-          has_pointers ? ClearRecordedSlots::kYes : ClearRecordedSlots::kNo);
+      isolate->heap()->NotifyObjectSizeChange(thin, old_size, ThinString::kSize,
+                                              may_contain_recorded_slots
+                                                  ? ClearRecordedSlots::kYes
+                                                  : ClearRecordedSlots::kNo,
+                                              update_invalidated_object_size);
     } else {
       // We don't need special handling for the combination IsLargeObject &&
-      // has_pointers, because indirect strings never get that large.
-      DCHECK(!has_pointers);
+      // may_contain_recorded_slots, because indirect strings never get that
+      // large.
+      DCHECK(!may_contain_recorded_slots);
     }
   }
 }
 
 template EXPORT_TEMPLATE_DEFINE(V8_EXPORT_PRIVATE) void String::MakeThin(
-    Isolate* isolate, String internalized);
+    Isolate* isolate, String internalized,
+    UpdateInvalidatedObjectSize update_invalidated_object_size);
 template EXPORT_TEMPLATE_DEFINE(V8_EXPORT_PRIVATE) void String::MakeThin(
-    LocalIsolate* isolate, String internalized);
+    LocalIsolate* isolate, String internalized,
+    UpdateInvalidatedObjectSize update_invalidated_object_size);
 
 template <typename T>
 bool String::MarkForExternalizationDuringGC(Isolate* isolate, T* resource) {
@@ -1687,7 +1700,7 @@ uint32_t String::ComputeAndSetRawHash(
     string = ThinString::cast(string).actual(cage_base);
     shape = StringShape(string, cage_base);
     if (length() == string.length()) {
-      uint32_t raw_hash = string.raw_hash_field();
+      uint32_t raw_hash = string.RawHash();
       DCHECK(IsHashFieldComputed(raw_hash));
       set_raw_hash_field(raw_hash);
       return raw_hash;
diff --git a/deps/v8/src/objects/string.h b/deps/v8/src/objects/string.h
index 7e86f0929c912e..ac56001bd14256 100644
--- a/deps/v8/src/objects/string.h
+++ b/deps/v8/src/objects/string.h
@@ -11,6 +11,7 @@
 #include "src/base/export-template.h"
 #include "src/base/strings.h"
 #include "src/common/globals.h"
+#include "src/heap/heap.h"
 #include "src/objects/instance-type.h"
 #include "src/objects/map.h"
 #include "src/objects/name.h"
@@ -194,7 +195,9 @@ class String : public TorqueGeneratedString<String, Name> {
 
   template <typename IsolateT>
   EXPORT_TEMPLATE_DECLARE(V8_EXPORT_PRIVATE)
-  void MakeThin(IsolateT* isolate, String canonical);
+  void MakeThin(IsolateT* isolate, String canonical,
+                UpdateInvalidatedObjectSize update_invalidated_object_size =
+                    UpdateInvalidatedObjectSize::kYes);
 
   template <typename Char>
   V8_INLINE base::Vector<const Char> GetCharVector(
diff --git a/deps/v8/src/objects/tagged-field-inl.h b/deps/v8/src/objects/tagged-field-inl.h
index 3ed08a95c95144..1c8e9a8f0c6f6b 100644
--- a/deps/v8/src/objects/tagged-field-inl.h
+++ b/deps/v8/src/objects/tagged-field-inl.h
@@ -13,29 +13,32 @@ namespace v8 {
 namespace internal {
 
 // static
-template <typename T, int kFieldOffset>
-Address TaggedField<T, kFieldOffset>::address(HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+Address TaggedField<T, kFieldOffset, CompressionScheme>::address(
+    HeapObject host, int offset) {
   return host.address() + kFieldOffset + offset;
 }
 
 // static
-template <typename T, int kFieldOffset>
-Tagged_t* TaggedField<T, kFieldOffset>::location(HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+Tagged_t* TaggedField<T, kFieldOffset, CompressionScheme>::location(
+    HeapObject host, int offset) {
   return reinterpret_cast<Tagged_t*>(address(host, offset));
 }
 
 // static
-template <typename T, int kFieldOffset>
+template <typename T, int kFieldOffset, typename CompressionScheme>
 template <typename TOnHeapAddress>
-Address TaggedField<T, kFieldOffset>::tagged_to_full(
+Address TaggedField<T, kFieldOffset, CompressionScheme>::tagged_to_full(
     TOnHeapAddress on_heap_addr, Tagged_t tagged_value) {
 #ifdef V8_COMPRESS_POINTERS
   if (kIsSmi) {
-    return DecompressTaggedSigned(tagged_value);
+    return CompressionScheme::DecompressTaggedSigned(tagged_value);
   } else if (kIsHeapObject) {
-    return DecompressTaggedPointer(on_heap_addr, tagged_value);
+    return CompressionScheme::DecompressTaggedPointer(on_heap_addr,
+                                                      tagged_value);
   } else {
-    return DecompressTaggedAny(on_heap_addr, tagged_value);
+    return CompressionScheme::DecompressTaggedAny(on_heap_addr, tagged_value);
   }
 #else
   return tagged_value;
@@ -43,35 +46,38 @@ Address TaggedField<T, kFieldOffset>::tagged_to_full(
 }
 
 // static
-template <typename T, int kFieldOffset>
-Tagged_t TaggedField<T, kFieldOffset>::full_to_tagged(Address value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+Tagged_t TaggedField<T, kFieldOffset, CompressionScheme>::full_to_tagged(
+    Address value) {
 #ifdef V8_COMPRESS_POINTERS
-  return CompressTagged(value);
+  return CompressionScheme::CompressTagged(value);
 #else
   return value;
 #endif
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::load(HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::load(HeapObject host,
+                                                        int offset) {
   Tagged_t value = *location(host, offset);
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   return T(tagged_to_full(host.ptr(), value));
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::load(PtrComprCageBase cage_base,
-                                     HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::load(
+    PtrComprCageBase cage_base, HeapObject host, int offset) {
   Tagged_t value = *location(host, offset);
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   return T(tagged_to_full(cage_base, value));
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::store(HeapObject host, T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::store(HeapObject host,
+                                                            T value) {
 #ifdef V8_ATOMIC_OBJECT_FIELD_WRITES
   Relaxed_Store(host, value);
 #else
@@ -82,8 +88,10 @@ void TaggedField<T, kFieldOffset>::store(HeapObject host, T value) {
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::store(HeapObject host, int offset, T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::store(HeapObject host,
+                                                            int offset,
+                                                            T value) {
 #ifdef V8_ATOMIC_OBJECT_FIELD_WRITES
   Relaxed_Store(host, offset, value);
 #else
@@ -94,107 +102,113 @@ void TaggedField<T, kFieldOffset>::store(HeapObject host, int offset, T value) {
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::Relaxed_Load(HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::Relaxed_Load(HeapObject host,
+                                                                int offset) {
   AtomicTagged_t value = AsAtomicTagged::Relaxed_Load(location(host, offset));
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   return T(tagged_to_full(host.ptr(), value));
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::Relaxed_Load(PtrComprCageBase cage_base,
-                                             HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::Relaxed_Load(
+    PtrComprCageBase cage_base, HeapObject host, int offset) {
   AtomicTagged_t value = AsAtomicTagged::Relaxed_Load(location(host, offset));
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   return T(tagged_to_full(cage_base, value));
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::Relaxed_Load_Map_Word(
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::Relaxed_Load_Map_Word(
     PtrComprCageBase cage_base, HeapObject host) {
   AtomicTagged_t value = AsAtomicTagged::Relaxed_Load(location(host, 0));
   return T(tagged_to_full(cage_base, value));
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::Relaxed_Store_Map_Word(HeapObject host,
-                                                          T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::Relaxed_Store_Map_Word(
+    HeapObject host, T value) {
   AsAtomicTagged::Relaxed_Store(location(host), full_to_tagged(value.ptr()));
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::Relaxed_Store(HeapObject host, T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::Relaxed_Store(
+    HeapObject host, T value) {
   Address ptr = value.ptr();
   DCHECK_NE(kFieldOffset, HeapObject::kMapOffset);
   AsAtomicTagged::Relaxed_Store(location(host), full_to_tagged(ptr));
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::Relaxed_Store(HeapObject host, int offset,
-                                                 T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::Relaxed_Store(
+    HeapObject host, int offset, T value) {
   Address ptr = value.ptr();
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   AsAtomicTagged::Relaxed_Store(location(host, offset), full_to_tagged(ptr));
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::Acquire_Load(HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::Acquire_Load(HeapObject host,
+                                                                int offset) {
   AtomicTagged_t value = AsAtomicTagged::Acquire_Load(location(host, offset));
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   return T(tagged_to_full(host.ptr(), value));
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::Acquire_Load_No_Unpack(
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::Acquire_Load_No_Unpack(
     PtrComprCageBase cage_base, HeapObject host, int offset) {
   AtomicTagged_t value = AsAtomicTagged::Acquire_Load(location(host, offset));
   return T(tagged_to_full(cage_base, value));
 }
 
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::Acquire_Load(PtrComprCageBase cage_base,
-                                             HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::Acquire_Load(
+    PtrComprCageBase cage_base, HeapObject host, int offset) {
   AtomicTagged_t value = AsAtomicTagged::Acquire_Load(location(host, offset));
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   return T(tagged_to_full(cage_base, value));
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::Release_Store(HeapObject host, T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::Release_Store(
+    HeapObject host, T value) {
   Address ptr = value.ptr();
   DCHECK_NE(kFieldOffset, HeapObject::kMapOffset);
   AsAtomicTagged::Release_Store(location(host), full_to_tagged(ptr));
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::Release_Store_Map_Word(HeapObject host,
-                                                          T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::Release_Store_Map_Word(
+    HeapObject host, T value) {
   Address ptr = value.ptr();
   AsAtomicTagged::Release_Store(location(host), full_to_tagged(ptr));
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::Release_Store(HeapObject host, int offset,
-                                                 T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::Release_Store(
+    HeapObject host, int offset, T value) {
   Address ptr = value.ptr();
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   AsAtomicTagged::Release_Store(location(host, offset), full_to_tagged(ptr));
 }
 
 // static
-template <typename T, int kFieldOffset>
-Tagged_t TaggedField<T, kFieldOffset>::Release_CompareAndSwap(HeapObject host,
-                                                              T old, T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+Tagged_t TaggedField<T, kFieldOffset,
+                     CompressionScheme>::Release_CompareAndSwap(HeapObject host,
+                                                                T old,
+                                                                T value) {
   Tagged_t old_value = full_to_tagged(old.ptr());
   Tagged_t new_value = full_to_tagged(value.ptr());
   Tagged_t result = AsAtomicTagged::Release_CompareAndSwap(
@@ -203,43 +217,46 @@ Tagged_t TaggedField<T, kFieldOffset>::Release_CompareAndSwap(HeapObject host,
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::SeqCst_Load(HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::SeqCst_Load(HeapObject host,
+                                                               int offset) {
   AtomicTagged_t value = AsAtomicTagged::SeqCst_Load(location(host, offset));
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   return T(tagged_to_full(host.ptr(), value));
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::SeqCst_Load(PtrComprCageBase cage_base,
-                                            HeapObject host, int offset) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::SeqCst_Load(
+    PtrComprCageBase cage_base, HeapObject host, int offset) {
   AtomicTagged_t value = AsAtomicTagged::SeqCst_Load(location(host, offset));
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   return T(tagged_to_full(cage_base, value));
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::SeqCst_Store(HeapObject host, T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::SeqCst_Store(
+    HeapObject host, T value) {
   Address ptr = value.ptr();
   DCHECK_NE(kFieldOffset, HeapObject::kMapOffset);
   AsAtomicTagged::SeqCst_Store(location(host), full_to_tagged(ptr));
 }
 
 // static
-template <typename T, int kFieldOffset>
-void TaggedField<T, kFieldOffset>::SeqCst_Store(HeapObject host, int offset,
-                                                T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+void TaggedField<T, kFieldOffset, CompressionScheme>::SeqCst_Store(
+    HeapObject host, int offset, T value) {
   Address ptr = value.ptr();
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   AsAtomicTagged::SeqCst_Store(location(host, offset), full_to_tagged(ptr));
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::SeqCst_Swap(HeapObject host, int offset,
-                                            T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::SeqCst_Swap(HeapObject host,
+                                                               int offset,
+                                                               T value) {
   Address ptr = value.ptr();
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   AtomicTagged_t old_value =
@@ -248,10 +265,9 @@ T TaggedField<T, kFieldOffset>::SeqCst_Swap(HeapObject host, int offset,
 }
 
 // static
-template <typename T, int kFieldOffset>
-T TaggedField<T, kFieldOffset>::SeqCst_Swap(PtrComprCageBase cage_base,
-                                            HeapObject host, int offset,
-                                            T value) {
+template <typename T, int kFieldOffset, typename CompressionScheme>
+T TaggedField<T, kFieldOffset, CompressionScheme>::SeqCst_Swap(
+    PtrComprCageBase cage_base, HeapObject host, int offset, T value) {
   Address ptr = value.ptr();
   DCHECK_NE(kFieldOffset + offset, HeapObject::kMapOffset);
   AtomicTagged_t old_value =
diff --git a/deps/v8/src/objects/tagged-field.h b/deps/v8/src/objects/tagged-field.h
index 9410878c5ee652..a585a66a7a86d4 100644
--- a/deps/v8/src/objects/tagged-field.h
+++ b/deps/v8/src/objects/tagged-field.h
@@ -6,19 +6,19 @@
 #define V8_OBJECTS_TAGGED_FIELD_H_
 
 #include "src/common/globals.h"
-
+#include "src/common/ptr-compr.h"
 #include "src/objects/objects.h"
 #include "src/objects/tagged-value.h"
 
-namespace v8 {
-namespace internal {
+namespace v8::internal {
 
 // This helper static class represents a tagged field of type T at offset
 // kFieldOffset inside some host HeapObject.
 // For full-pointer mode this type adds no overhead but when pointer
 // compression is enabled such class allows us to use proper decompression
 // function depending on the field type.
-template <typename T, int kFieldOffset = 0>
+template <typename T, int kFieldOffset = 0,
+          typename CompressionScheme = V8HeapCompressionScheme>
 class TaggedField : public AllStatic {
  public:
   static_assert(std::is_base_of<Object, T>::value ||
@@ -91,7 +91,6 @@ class TaggedField : public AllStatic {
   static inline Tagged_t full_to_tagged(Address value);
 };
 
-}  // namespace internal
-}  // namespace v8
+}  // namespace v8::internal
 
 #endif  // V8_OBJECTS_TAGGED_FIELD_H_
diff --git a/deps/v8/src/objects/tagged-impl-inl.h b/deps/v8/src/objects/tagged-impl-inl.h
index 909f65a959ef4b..4ce915730d0752 100644
--- a/deps/v8/src/objects/tagged-impl-inl.h
+++ b/deps/v8/src/objects/tagged-impl-inl.h
@@ -34,7 +34,8 @@ Smi TaggedImpl<kRefType, StorageType>::ToSmi() const {
     return Smi(ptr_);
   }
   // Implementation for compressed pointers.
-  return Smi(DecompressTaggedSigned(static_cast<Tagged_t>(ptr_)));
+  return Smi(
+      CompressionScheme::DecompressTaggedSigned(static_cast<Tagged_t>(ptr_)));
 }
 
 //
@@ -111,8 +112,9 @@ bool TaggedImpl<kRefType, StorageType>::GetHeapObjectIfStrong(
   if (kIsFull) return GetHeapObjectIfStrong(result);
   // Implementation for compressed pointers.
   if (IsStrong()) {
-    *result = HeapObject::cast(
-        Object(DecompressTaggedPointer(isolate, static_cast<Tagged_t>(ptr_))));
+    *result =
+        HeapObject::cast(Object(CompressionScheme::DecompressTaggedPointer(
+            isolate, static_cast<Tagged_t>(ptr_))));
     return true;
   }
   return false;
@@ -136,8 +138,8 @@ HeapObject TaggedImpl<kRefType, StorageType>::GetHeapObjectAssumeStrong(
   if (kIsFull) return GetHeapObjectAssumeStrong();
   // Implementation for compressed pointers.
   DCHECK(IsStrong());
-  return HeapObject::cast(
-      Object(DecompressTaggedPointer(isolate, static_cast<Tagged_t>(ptr_))));
+  return HeapObject::cast(Object(CompressionScheme::DecompressTaggedPointer(
+      isolate, static_cast<Tagged_t>(ptr_))));
 }
 
 //
@@ -222,12 +224,12 @@ HeapObject TaggedImpl<kRefType, StorageType>::GetHeapObject(
   DCHECK(!IsSmi());
   if (kCanBeWeak) {
     DCHECK(!IsCleared());
-    return HeapObject::cast(Object(DecompressTaggedPointer(
+    return HeapObject::cast(Object(CompressionScheme::DecompressTaggedPointer(
         isolate, static_cast<Tagged_t>(ptr_) & ~kWeakHeapObjectMask)));
   } else {
     DCHECK(!HAS_WEAK_HEAP_OBJECT_TAG(ptr_));
-    return HeapObject::cast(
-        Object(DecompressTaggedPointer(isolate, static_cast<Tagged_t>(ptr_))));
+    return HeapObject::cast(Object(CompressionScheme::DecompressTaggedPointer(
+        isolate, static_cast<Tagged_t>(ptr_))));
   }
 }
 
@@ -250,7 +252,8 @@ Object TaggedImpl<kRefType, StorageType>::GetHeapObjectOrSmi(
   if (kIsFull) return GetHeapObjectOrSmi();
   // Implementation for compressed pointers.
   if (IsSmi()) {
-    return Object(DecompressTaggedSigned(static_cast<Tagged_t>(ptr_)));
+    return Object(
+        CompressionScheme::DecompressTaggedSigned(static_cast<Tagged_t>(ptr_)));
   }
   return GetHeapObject(isolate);
 }
diff --git a/deps/v8/src/objects/tagged-impl.h b/deps/v8/src/objects/tagged-impl.h
index 7840a087e21f5b..f4445b4ecf3340 100644
--- a/deps/v8/src/objects/tagged-impl.h
+++ b/deps/v8/src/objects/tagged-impl.h
@@ -30,6 +30,10 @@ bool V8_EXPORT_PRIVATE CheckObjectComparisonAllowed(Address a, Address b);
 template <HeapObjectReferenceType kRefType, typename StorageType>
 class TaggedImpl {
  public:
+  // Compressed TaggedImpl are never used for external Code pointers, so
+  // we can use this shorter alias for calling decompression functions.
+  using CompressionScheme = V8HeapCompressionScheme;
+
   static_assert(std::is_same<StorageType, Address>::value ||
                     std::is_same<StorageType, Tagged_t>::value,
                 "StorageType must be either Address or Tagged_t");
diff --git a/deps/v8/src/objects/tagged-value-inl.h b/deps/v8/src/objects/tagged-value-inl.h
index f409a4006bc529..4ca8739367dcdf 100644
--- a/deps/v8/src/objects/tagged-value-inl.h
+++ b/deps/v8/src/objects/tagged-value-inl.h
@@ -21,7 +21,7 @@ namespace internal {
 inline StrongTaggedValue::StrongTaggedValue(Object o)
     :
 #ifdef V8_COMPRESS_POINTERS
-      TaggedImpl(CompressTagged(o.ptr()))
+      TaggedImpl(CompressionScheme::CompressTagged(o.ptr()))
 #else
       TaggedImpl(o.ptr())
 #endif
@@ -30,7 +30,7 @@ inline StrongTaggedValue::StrongTaggedValue(Object o)
 
 Object StrongTaggedValue::ToObject(Isolate* isolate, StrongTaggedValue object) {
 #ifdef V8_COMPRESS_POINTERS
-  return Object(DecompressTaggedAny(isolate, object.ptr()));
+  return Object(CompressionScheme::DecompressTaggedAny(isolate, object.ptr()));
 #else
   return Object(object.ptr());
 #endif
@@ -39,7 +39,7 @@ Object StrongTaggedValue::ToObject(Isolate* isolate, StrongTaggedValue object) {
 inline TaggedValue::TaggedValue(MaybeObject o)
     :
 #ifdef V8_COMPRESS_POINTERS
-      TaggedImpl(CompressTagged(o.ptr()))
+      TaggedImpl(CompressionScheme::CompressTagged(o.ptr()))
 #else
       TaggedImpl(o.ptr())
 #endif
@@ -48,7 +48,8 @@ inline TaggedValue::TaggedValue(MaybeObject o)
 
 MaybeObject TaggedValue::ToMaybeObject(Isolate* isolate, TaggedValue object) {
 #ifdef V8_COMPRESS_POINTERS
-  return MaybeObject(DecompressTaggedAny(isolate, object.ptr()));
+  return MaybeObject(
+      CompressionScheme::DecompressTaggedAny(isolate, object.ptr()));
 #else
   return MaybeObject(object.ptr());
 #endif
diff --git a/deps/v8/src/objects/template-objects.cc b/deps/v8/src/objects/template-objects.cc
index 0bcca301d970e7..12eb1d18ee4675 100644
--- a/deps/v8/src/objects/template-objects.cc
+++ b/deps/v8/src/objects/template-objects.cc
@@ -44,33 +44,10 @@ Handle<JSArray> TemplateObjectDescription::GetTemplateObject(
 
   // Create the raw object from the {raw_strings}.
   Handle<FixedArray> raw_strings(description->raw_strings(), isolate);
-  Handle<JSArray> raw_object = isolate->factory()->NewJSArrayWithElements(
-      raw_strings, PACKED_ELEMENTS, raw_strings->length(),
-      AllocationType::kOld);
-
-  // Create the template object from the {cooked_strings}.
   Handle<FixedArray> cooked_strings(description->cooked_strings(), isolate);
-  Handle<JSArray> template_object = isolate->factory()->NewJSArrayWithElements(
-      cooked_strings, PACKED_ELEMENTS, cooked_strings->length(),
-      AllocationType::kOld);
-
-  // Freeze the {raw_object}.
-  JSObject::SetIntegrityLevel(raw_object, FROZEN, kThrowOnError).ToChecked();
-
-  // Install a "raw" data property for {raw_object} on {template_object}.
-  PropertyDescriptor raw_desc;
-  raw_desc.set_value(raw_object);
-  raw_desc.set_configurable(false);
-  raw_desc.set_enumerable(false);
-  raw_desc.set_writable(false);
-  JSArray::DefineOwnProperty(isolate, template_object,
-                             isolate->factory()->raw_string(), &raw_desc,
-                             Just(kThrowOnError))
-      .ToChecked();
-
-  // Freeze the {template_object} as well.
-  JSObject::SetIntegrityLevel(template_object, FROZEN, kThrowOnError)
-      .ToChecked();
+  Handle<JSArray> template_object =
+      isolate->factory()->NewJSArrayForTemplateLiteralArray(cooked_strings,
+                                                            raw_strings);
 
   // Insert the template object into the template weakmap.
   Handle<HeapObject> previous_cached_templates = handle(
diff --git a/deps/v8/src/objects/type-hints.cc b/deps/v8/src/objects/type-hints.cc
index 93924a1b951ace..a099ea12cca0b6 100644
--- a/deps/v8/src/objects/type-hints.cc
+++ b/deps/v8/src/objects/type-hints.cc
@@ -23,6 +23,8 @@ std::ostream& operator<<(std::ostream& os, BinaryOperationHint hint) {
       return os << "String";
     case BinaryOperationHint::kBigInt:
       return os << "BigInt";
+    case BinaryOperationHint::kBigInt64:
+      return os << "BigInt64";
     case BinaryOperationHint::kAny:
       return os << "Any";
   }
diff --git a/deps/v8/src/objects/type-hints.h b/deps/v8/src/objects/type-hints.h
index 2638c128bd7aea..d9ed88057760f9 100644
--- a/deps/v8/src/objects/type-hints.h
+++ b/deps/v8/src/objects/type-hints.h
@@ -20,6 +20,7 @@ enum class BinaryOperationHint : uint8_t {
   kNumberOrOddball,
   kString,
   kBigInt,
+  kBigInt64,
   kAny
 };
 
diff --git a/deps/v8/src/objects/value-serializer.cc b/deps/v8/src/objects/value-serializer.cc
index 3745f66da5975b..61a7cae8e8a900 100644
--- a/deps/v8/src/objects/value-serializer.cc
+++ b/deps/v8/src/objects/value-serializer.cc
@@ -1096,7 +1096,7 @@ Maybe<bool> ValueSerializer::WriteWasmMemory(Handle<WasmMemoryObject> object) {
 #endif  // V8_ENABLE_WEBASSEMBLY
 
 Maybe<bool> ValueSerializer::WriteSharedObject(Handle<HeapObject> object) {
-  if (!delegate_ || isolate_->shared_isolate() == nullptr) {
+  if (!delegate_ || !isolate_->has_shared_heap()) {
     return ThrowDataCloneError(MessageTemplate::kDataCloneError, object);
   }
 
@@ -1340,6 +1340,9 @@ Maybe<T> ValueDeserializer::ReadVarintLoop() {
       // Since {value} is not modified in this branch we can safely skip the
       // DCHECK when fuzzing.
       DCHECK_IMPLIES(!v8_flags.fuzzing, !has_another_byte);
+      // For consistency with the fast unrolled loop in ReadVarint we return
+      // after we have read size(T) + 1 bytes.
+      return Just(value);
     }
     position_++;
   } while (has_another_byte);
@@ -1476,6 +1479,12 @@ MaybeHandle<Object> ValueDeserializer::ReadObject() {
     isolate_->Throw(*isolate_->factory()->NewError(
         MessageTemplate::kDataCloneDeserializationError));
   }
+#if defined(DEBUG) && defined(VERIFY_HEAP)
+  if (!result.is_null() && v8_flags.enable_slow_asserts &&
+      v8_flags.verify_heap) {
+    object->ObjectVerify(isolate_);
+  }
+#endif
 
   return result;
 }
@@ -2100,7 +2109,7 @@ bool ValueDeserializer::ValidateAndSetJSArrayBufferViewFlags(
     if (!v8_flags.harmony_rab_gsab) {
       return false;
     }
-    if (!buffer.is_resizable()) {
+    if (!buffer.is_resizable_by_js()) {
       return false;
     }
     if (is_backed_by_rab && buffer.is_shared()) {
diff --git a/deps/v8/src/objects/visitors.h b/deps/v8/src/objects/visitors.h
index 49ec0bfb2bb297..742188fd8f91c2 100644
--- a/deps/v8/src/objects/visitors.h
+++ b/deps/v8/src/objects/visitors.h
@@ -161,9 +161,6 @@ class ObjectVisitor {
   // Visit pointer embedded into a code object.
   virtual void VisitEmbeddedPointer(Code host, RelocInfo* rinfo) = 0;
 
-  // Visits a runtime entry in the instruction stream.
-  virtual void VisitRuntimeEntry(Code host, RelocInfo* rinfo) {}
-
   // Visits an external reference embedded into a code object.
   virtual void VisitExternalReference(Code host, RelocInfo* rinfo) {}
 
diff --git a/deps/v8/src/parsing/parse-info.cc b/deps/v8/src/parsing/parse-info.cc
index f773cd5d41bb45..9c0eee6d00bd0e 100644
--- a/deps/v8/src/parsing/parse-info.cc
+++ b/deps/v8/src/parsing/parse-info.cc
@@ -28,19 +28,18 @@ UnoptimizedCompileFlags::UnoptimizedCompileFlags(Isolate* isolate,
       function_kind_(FunctionKind::kNormalFunction),
       function_syntax_kind_(FunctionSyntaxKind::kDeclaration),
       parsing_while_debugging_(ParsingWhileDebugging::kNo) {
-  set_collect_type_profile(isolate->is_collecting_type_profile());
   set_coverage_enabled(!isolate->is_best_effort_code_coverage());
   set_block_coverage_enabled(isolate->is_block_code_coverage());
-  set_might_always_turbofan(FLAG_always_turbofan ||
-                            FLAG_prepare_always_turbofan);
-  set_allow_natives_syntax(FLAG_allow_natives_syntax);
+  set_might_always_turbofan(v8_flags.always_turbofan ||
+                            v8_flags.prepare_always_turbofan);
+  set_allow_natives_syntax(v8_flags.allow_natives_syntax);
   set_allow_lazy_compile(true);
-  set_collect_source_positions(!FLAG_enable_lazy_source_positions ||
+  set_collect_source_positions(!v8_flags.enable_lazy_source_positions ||
                                isolate->NeedsDetailedOptimizedCodeLineInfo());
   set_post_parallel_compile_tasks_for_eager_toplevel(
-      FLAG_parallel_compile_tasks_for_eager_toplevel);
+      v8_flags.parallel_compile_tasks_for_eager_toplevel);
   set_post_parallel_compile_tasks_for_lazy(
-      FLAG_parallel_compile_tasks_for_lazy);
+      v8_flags.parallel_compile_tasks_for_lazy);
 }
 
 // static
@@ -60,15 +59,6 @@ UnoptimizedCompileFlags UnoptimizedCompileFlags::ForFunctionCompile(
 #endif  // V8_ENABLE_WEBASSEMBLY
   flags.set_is_repl_mode(shared.is_repl_mode());
 
-  // CollectTypeProfile uses its own feedback slots. If we have existing
-  // FeedbackMetadata, we can only collect type profile if the feedback vector
-  // has the appropriate slots.
-  flags.set_collect_type_profile(
-      isolate->is_collecting_type_profile() &&
-      (shared.HasFeedbackMetadata()
-           ? shared.feedback_metadata().HasTypeProfileSlot()
-           : script.IsUserJavaScript()));
-
   // Do not support re-parsing top-level function of a wrapped script.
   DCHECK_IMPLIES(flags.is_toplevel(), !script.is_wrapped());
 
@@ -82,11 +72,11 @@ UnoptimizedCompileFlags UnoptimizedCompileFlags::ForScriptCompile(
 
   flags.SetFlagsForFunctionFromScript(script);
   flags.SetFlagsForToplevelCompile(
-      isolate->is_collecting_type_profile(), script.IsUserJavaScript(),
-      flags.outer_language_mode(), construct_repl_mode(script.is_repl_mode()),
+      script.IsUserJavaScript(), flags.outer_language_mode(),
+      construct_repl_mode(script.is_repl_mode()),
       script.origin_options().IsModule() ? ScriptType::kModule
                                          : ScriptType::kClassic,
-      FLAG_lazy);
+      v8_flags.lazy);
   if (script.is_wrapped()) {
     flags.set_function_syntax_kind(FunctionSyntaxKind::kWrapped);
   }
@@ -99,8 +89,7 @@ UnoptimizedCompileFlags UnoptimizedCompileFlags::ForToplevelCompile(
     Isolate* isolate, bool is_user_javascript, LanguageMode language_mode,
     REPLMode repl_mode, ScriptType type, bool lazy) {
   UnoptimizedCompileFlags flags(isolate, isolate->GetNextScriptId());
-  flags.SetFlagsForToplevelCompile(isolate->is_collecting_type_profile(),
-                                   is_user_javascript, language_mode, repl_mode,
+  flags.SetFlagsForToplevelCompile(is_user_javascript, language_mode, repl_mode,
                                    type, lazy);
 
   LOG(isolate, ScriptEvent(V8FileLogger::ScriptEventType::kReserveId,
@@ -143,13 +132,11 @@ void UnoptimizedCompileFlags::SetFlagsFromFunction(T function) {
 }
 
 void UnoptimizedCompileFlags::SetFlagsForToplevelCompile(
-    bool is_collecting_type_profile, bool is_user_javascript,
-    LanguageMode language_mode, REPLMode repl_mode, ScriptType type,
-    bool lazy) {
+    bool is_user_javascript, LanguageMode language_mode, REPLMode repl_mode,
+    ScriptType type, bool lazy) {
   set_is_toplevel(true);
   set_allow_lazy_parsing(lazy);
   set_allow_lazy_compile(lazy);
-  set_collect_type_profile(is_user_javascript && is_collecting_type_profile);
   set_outer_language_mode(
       stricter_language_mode(outer_language_mode(), language_mode));
   set_is_repl_mode((repl_mode == REPLMode::kYes));
@@ -278,8 +265,7 @@ Handle<Script> ParseInfo::CreateScript(
   } else if (flags().is_eval()) {
     raw_script.set_compilation_type(Script::COMPILATION_TYPE_EVAL);
   }
-  CheckFlagsForToplevelCompileFromScript(raw_script,
-                                         isolate->is_collecting_type_profile());
+  CheckFlagsForToplevelCompileFromScript(raw_script);
 
   return script;
 }
@@ -309,12 +295,9 @@ void ParseInfo::set_character_stream(
   character_stream_.swap(character_stream);
 }
 
-void ParseInfo::CheckFlagsForToplevelCompileFromScript(
-    Script script, bool is_collecting_type_profile) {
+void ParseInfo::CheckFlagsForToplevelCompileFromScript(Script script) {
   CheckFlagsForFunctionFromScript(script);
   DCHECK(flags().is_toplevel());
-  DCHECK_EQ(flags().collect_type_profile(),
-            is_collecting_type_profile && script.IsUserJavaScript());
   DCHECK_EQ(flags().is_repl_mode(), script.is_repl_mode());
 
   if (script.is_wrapped()) {
diff --git a/deps/v8/src/parsing/parse-info.h b/deps/v8/src/parsing/parse-info.h
index ebf567b1c1fb0a..e2e3bdf9d1847d 100644
--- a/deps/v8/src/parsing/parse-info.h
+++ b/deps/v8/src/parsing/parse-info.h
@@ -48,7 +48,6 @@ class Zone;
   V(is_module, bool, 1, _)                                      \
   V(allow_lazy_parsing, bool, 1, _)                             \
   V(is_lazy_compile, bool, 1, _)                                \
-  V(collect_type_profile, bool, 1, _)                           \
   V(coverage_enabled, bool, 1, _)                               \
   V(block_coverage_enabled, bool, 1, _)                         \
   V(is_asm_wasm_broken, bool, 1, _)                             \
@@ -140,8 +139,7 @@ class V8_EXPORT_PRIVATE UnoptimizedCompileFlags {
   // SharedFunctionInfo |function|
   template <typename T>
   void SetFlagsFromFunction(T function);
-  void SetFlagsForToplevelCompile(bool is_collecting_type_profile,
-                                  bool is_user_javascript,
+  void SetFlagsForToplevelCompile(bool is_user_javascript,
                                   LanguageMode language_mode,
                                   REPLMode repl_mode, ScriptType type,
                                   bool lazy);
@@ -345,8 +343,7 @@ class V8_EXPORT_PRIVATE ParseInfo {
             ReusableUnoptimizedCompileState* reusable_state,
             uintptr_t stack_limit, RuntimeCallStats* runtime_call_stats);
 
-  void CheckFlagsForToplevelCompileFromScript(Script script,
-                                              bool is_collecting_type_profile);
+  void CheckFlagsForToplevelCompileFromScript(Script script);
 
   //------------- Inputs to parsing and scope analysis -----------------------
   const UnoptimizedCompileFlags flags_;
diff --git a/deps/v8/src/parsing/parser-base.h b/deps/v8/src/parsing/parser-base.h
index 786d502ff86263..aff9c5f481fdce 100644
--- a/deps/v8/src/parsing/parser-base.h
+++ b/deps/v8/src/parsing/parser-base.h
@@ -459,7 +459,7 @@ class ParserBase {
     }
 
     void set_next_function_is_likely_called() {
-      next_function_is_likely_called_ = !FLAG_max_lazy;
+      next_function_is_likely_called_ = !v8_flags.max_lazy;
     }
 
     void RecordFunctionOrEvalCall() { contains_function_or_eval_ = true; }
@@ -3735,7 +3735,7 @@ ParserBase<Impl>::ParseImportExpressions() {
   AcceptINScope scope(this, true);
   ExpressionT specifier = ParseAssignmentExpressionCoverGrammar();
 
-  if (FLAG_harmony_import_assertions && Check(Token::COMMA)) {
+  if (v8_flags.harmony_import_assertions && Check(Token::COMMA)) {
     if (Check(Token::RPAREN)) {
       // A trailing comma allowed after the specifier.
       return factory()->NewImportCallExpression(specifier, pos);
@@ -4737,7 +4737,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseClassLiteral(
     if (Check(Token::SEMICOLON)) continue;
 
     // Either we're parsing a `static { }` initialization block or a property.
-    if (FLAG_harmony_class_static_blocks && peek() == Token::STATIC &&
+    if (v8_flags.harmony_class_static_blocks && peek() == Token::STATIC &&
         PeekAhead() == Token::LBRACE) {
       BlockT static_block = ParseClassStaticBlock(&class_info);
       impl()->AddClassStaticBlock(static_block, &class_info);
diff --git a/deps/v8/src/parsing/parser.cc b/deps/v8/src/parsing/parser.cc
index bb5e65ec5240a4..aba8ca6271d9da 100644
--- a/deps/v8/src/parsing/parser.cc
+++ b/deps/v8/src/parsing/parser.cc
@@ -379,7 +379,7 @@ Expression* Parser::NewV8Intrinsic(const AstRawString* name,
       Runtime::FunctionForName(name->raw_data(), name->length());
 
   // Be more permissive when fuzzing. Intrinsics are not supported.
-  if (FLAG_fuzzing) {
+  if (v8_flags.fuzzing) {
     return NewV8RuntimeFunctionForFuzzing(function, args, pos);
   }
 
@@ -413,7 +413,7 @@ Expression* Parser::NewV8Intrinsic(const AstRawString* name,
 Expression* Parser::NewV8RuntimeFunctionForFuzzing(
     const Runtime::Function* function, const ScopedPtrList<Expression>& args,
     int pos) {
-  CHECK(FLAG_fuzzing);
+  CHECK(v8_flags.fuzzing);
 
   // Intrinsics are not supported for fuzzing. Only allow allowlisted runtime
   // functions. Also prevent later errors due to too few arguments and just
@@ -1363,7 +1363,7 @@ ImportAssertions* Parser::ParseImportAssertClause() {
 
   auto import_assertions = zone()->New<ImportAssertions>(zone());
 
-  if (!FLAG_harmony_import_assertions) {
+  if (!v8_flags.harmony_import_assertions) {
     return import_assertions;
   }
 
diff --git a/deps/v8/src/profiler/cpu-profiler.cc b/deps/v8/src/profiler/cpu-profiler.cc
index 154edae60a7456..f8641063a8857e 100644
--- a/deps/v8/src/profiler/cpu-profiler.cc
+++ b/deps/v8/src/profiler/cpu-profiler.cc
@@ -90,7 +90,7 @@ ProfilingScope::ProfilingScope(Isolate* isolate, ProfilerListener* listener)
   // callbacks on the heap.
   DCHECK(isolate_->heap()->HasBeenSetUp());
 
-  if (!FLAG_prof_browser_mode) {
+  if (!v8_flags.prof_browser_mode) {
     logger->LogCodeObjects();
   }
   logger->LogCompiledFunctions();
@@ -511,7 +511,7 @@ CpuProfiler::CpuProfiler(Isolate* isolate, CpuProfilingNamingMode naming_mode,
       naming_mode_(naming_mode),
       logging_mode_(logging_mode),
       base_sampling_interval_(base::TimeDelta::FromMicroseconds(
-          FLAG_cpu_profiler_sampling_interval)),
+          v8_flags.cpu_profiler_sampling_interval)),
       code_observer_(test_code_observer),
       profiles_(test_profiles),
       symbolizer_(test_symbolizer),
diff --git a/deps/v8/src/profiler/heap-snapshot-generator.cc b/deps/v8/src/profiler/heap-snapshot-generator.cc
index 3921dc7647938f..edbdb4c91a0e15 100644
--- a/deps/v8/src/profiler/heap-snapshot-generator.cc
+++ b/deps/v8/src/profiler/heap-snapshot-generator.cc
@@ -547,7 +547,7 @@ bool HeapObjectsMap::MoveObject(Address from, Address to, int object_size) {
     // Size of an object can change during its life, so to keep information
     // about the object in entries_ consistent, we have to adjust size when the
     // object is migrated.
-    if (FLAG_heap_profiler_trace_objects) {
+    if (v8_flags.heap_profiler_trace_objects) {
       PrintF("Move object from %p to %p old size %6d new size %6d\n",
              reinterpret_cast<void*>(from), reinterpret_cast<void*>(to),
              entries_.at(from_entry_info_index).size, object_size);
@@ -586,7 +586,7 @@ SnapshotObjectId HeapObjectsMap::FindOrAddEntry(Address addr,
         static_cast<int>(reinterpret_cast<intptr_t>(entry->value));
     EntryInfo& entry_info = entries_.at(entry_index);
     entry_info.accessed = accessed;
-    if (FLAG_heap_profiler_trace_objects) {
+    if (v8_flags.heap_profiler_trace_objects) {
       PrintF("Update object size : %p with old size %d and new size %d\n",
              reinterpret_cast<void*>(addr), entry_info.size, size);
     }
@@ -622,7 +622,7 @@ void HeapObjectsMap::AddMergedNativeEntry(NativeObject addr,
 void HeapObjectsMap::StopHeapObjectsTracking() { time_intervals_.clear(); }
 
 void HeapObjectsMap::UpdateHeapObjectsMap() {
-  if (FLAG_heap_profiler_trace_objects) {
+  if (v8_flags.heap_profiler_trace_objects) {
     PrintF("Begin HeapObjectsMap::UpdateHeapObjectsMap. map has %d entries.\n",
            entries_map_.occupancy());
   }
@@ -634,14 +634,14 @@ void HeapObjectsMap::UpdateHeapObjectsMap() {
        obj = iterator.Next()) {
     int object_size = obj.Size(cage_base);
     FindOrAddEntry(obj.address(), object_size);
-    if (FLAG_heap_profiler_trace_objects) {
+    if (v8_flags.heap_profiler_trace_objects) {
       PrintF("Update object      : %p %6d. Next address is %p\n",
              reinterpret_cast<void*>(obj.address()), object_size,
              reinterpret_cast<void*>(obj.address() + object_size));
     }
   }
   RemoveDeadEntries();
-  if (FLAG_heap_profiler_trace_objects) {
+  if (v8_flags.heap_profiler_trace_objects) {
     PrintF("End HeapObjectsMap::UpdateHeapObjectsMap. map has %d entries.\n",
            entries_map_.occupancy());
   }
@@ -877,7 +877,8 @@ HeapEntry* V8HeapExplorer::AddEntry(HeapObject object) {
 
 HeapEntry* V8HeapExplorer::AddEntry(HeapObject object, HeapEntry::Type type,
                                     const char* name) {
-  if (FLAG_heap_profiler_show_hidden_objects && type == HeapEntry::kHidden) {
+  if (v8_flags.heap_profiler_show_hidden_objects &&
+      type == HeapEntry::kHidden) {
     type = HeapEntry::kNative;
   }
   PtrComprCageBase cage_base(isolate());
@@ -2094,7 +2095,7 @@ bool V8HeapExplorer::IterateAndExtractReferences(
     // objects, and fails DCHECKs if we attempt to. Read-only objects can
     // never retain read-write objects, so there is no risk in skipping
     // verification for them.
-    if (FLAG_heap_snapshot_verify &&
+    if (v8_flags.heap_snapshot_verify &&
         !BasicMemoryChunk::FromHeapObject(obj)->InReadOnlySpace()) {
       verifier = std::make_unique<HeapEntryVerifier>(generator, obj);
     }
@@ -2643,7 +2644,7 @@ bool NativeObjectsExplorer::IterateAndExtractReferences(
     HeapSnapshotGenerator* generator) {
   generator_ = generator;
 
-  if (FLAG_heap_profiler_use_embedder_graph &&
+  if (v8_flags.heap_profiler_use_embedder_graph &&
       snapshot_->profiler()->HasBuildEmbedderGraphCallback()) {
     v8::HandleScope scope(reinterpret_cast<v8::Isolate*>(isolate_));
     DisallowGarbageCollection no_gc;
@@ -2726,7 +2727,7 @@ bool HeapSnapshotGenerator::GenerateSnapshot() {
 
 #ifdef VERIFY_HEAP
   Heap* debug_heap = heap_;
-  if (FLAG_verify_heap) {
+  if (v8_flags.verify_heap) {
     HeapVerifier::VerifyHeap(debug_heap);
   }
 #endif
@@ -2734,7 +2735,7 @@ bool HeapSnapshotGenerator::GenerateSnapshot() {
   InitProgressCounter();
 
 #ifdef VERIFY_HEAP
-  if (FLAG_verify_heap) {
+  if (v8_flags.verify_heap) {
     HeapVerifier::VerifyHeap(debug_heap);
   }
 #endif
diff --git a/deps/v8/src/profiler/heap-snapshot-generator.h b/deps/v8/src/profiler/heap-snapshot-generator.h
index 50d97de2986659..7750c2b5c24e82 100644
--- a/deps/v8/src/profiler/heap-snapshot-generator.h
+++ b/deps/v8/src/profiler/heap-snapshot-generator.h
@@ -591,7 +591,7 @@ class HeapSnapshotGenerator : public SnapshottingProgressReportingInterface {
     HeapEntry* result =
         entries_map_.emplace(ptr, allocator->AllocateEntry(ptr)).first->second;
 #ifdef V8_ENABLE_HEAP_SNAPSHOT_VERIFY
-    if (FLAG_heap_snapshot_verify) {
+    if (v8_flags.heap_snapshot_verify) {
       reverse_entries_map_.emplace(result, ptr);
     }
 #endif
@@ -602,7 +602,7 @@ class HeapSnapshotGenerator : public SnapshottingProgressReportingInterface {
   HeapThing FindHeapThingForHeapEntry(HeapEntry* entry) {
     // The reverse lookup map is only populated if the verification flag is
     // enabled.
-    DCHECK(FLAG_heap_snapshot_verify);
+    DCHECK(v8_flags.heap_snapshot_verify);
 
     auto it = reverse_entries_map_.find(entry);
     return it == reverse_entries_map_.end() ? nullptr : it->second;
diff --git a/deps/v8/src/profiler/sampling-heap-profiler.cc b/deps/v8/src/profiler/sampling-heap-profiler.cc
index b38d235e988e61..50a32dd4d51a5c 100644
--- a/deps/v8/src/profiler/sampling-heap-profiler.cc
+++ b/deps/v8/src/profiler/sampling-heap-profiler.cc
@@ -25,7 +25,7 @@ namespace internal {
 // Let u be a uniformly distributed random number between 0 and 1, then
 // next_sample = (- ln u) / λ
 intptr_t SamplingHeapProfiler::Observer::GetNextSampleInterval(uint64_t rate) {
-  if (FLAG_sampling_heap_profiler_suppress_randomness)
+  if (v8_flags.sampling_heap_profiler_suppress_randomness)
     return static_cast<intptr_t>(rate);
   double u = random_->NextDouble();
   double next = (-base::ieee754::log(u)) * rate;
@@ -96,8 +96,8 @@ void SamplingHeapProfiler::OnWeakCallback(
     const WeakCallbackInfo<Sample>& data) {
   Sample* sample = data.GetParameter();
   Heap* heap = reinterpret_cast<Isolate*>(data.GetIsolate())->heap();
-  bool is_minor_gc =
-      heap->current_or_last_garbage_collector() == GarbageCollector::SCAVENGER;
+  bool is_minor_gc = Heap::IsYoungGenerationCollector(
+      heap->current_or_last_garbage_collector());
   bool should_keep_sample =
       is_minor_gc
           ? (sample->profiler->flags_ &
diff --git a/deps/v8/src/profiler/strings-storage.cc b/deps/v8/src/profiler/strings-storage.cc
index 592d101e6831d9..a1bae849bcb878 100644
--- a/deps/v8/src/profiler/strings-storage.cc
+++ b/deps/v8/src/profiler/strings-storage.cc
@@ -81,8 +81,8 @@ const char* StringsStorage::GetSymbol(Symbol sym) {
     return "<symbol>";
   }
   String description = String::cast(sym.description());
-  int length =
-      std::min(FLAG_heap_snapshot_string_limit.value(), description.length());
+  int length = std::min(v8_flags.heap_snapshot_string_limit.value(),
+                        description.length());
   auto data = description.ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL, 0,
                                     length, &length);
   if (sym.is_private_name()) {
@@ -98,7 +98,7 @@ const char* StringsStorage::GetName(Name name) {
   if (name.IsString()) {
     String str = String::cast(name);
     int length =
-        std::min(FLAG_heap_snapshot_string_limit.value(), str.length());
+        std::min(v8_flags.heap_snapshot_string_limit.value(), str.length());
     int actual_length = 0;
     std::unique_ptr<char[]> data = str.ToCString(
         DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL, 0, length, &actual_length);
@@ -117,7 +117,7 @@ const char* StringsStorage::GetConsName(const char* prefix, Name name) {
   if (name.IsString()) {
     String str = String::cast(name);
     int length =
-        std::min(FLAG_heap_snapshot_string_limit.value(), str.length());
+        std::min(v8_flags.heap_snapshot_string_limit.value(), str.length());
     int actual_length = 0;
     std::unique_ptr<char[]> data = str.ToCString(
         DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL, 0, length, &actual_length);
diff --git a/deps/v8/src/profiler/symbolizer.cc b/deps/v8/src/profiler/symbolizer.cc
index 6c9d92b2c19376..8528b62693af8d 100644
--- a/deps/v8/src/profiler/symbolizer.cc
+++ b/deps/v8/src/profiler/symbolizer.cc
@@ -161,7 +161,7 @@ Symbolizer::SymbolizedSample Symbolizer::SymbolizeTickSample(
     }
   }
 
-  if (FLAG_prof_browser_mode) {
+  if (v8_flags.prof_browser_mode) {
     bool no_symbolized_entries = true;
     for (auto e : stack_trace) {
       if (e.code_entry != nullptr) {
diff --git a/deps/v8/src/regexp/arm/regexp-macro-assembler-arm.cc b/deps/v8/src/regexp/arm/regexp-macro-assembler-arm.cc
index 1988a1759db29c..2658068b6f94b9 100644
--- a/deps/v8/src/regexp/arm/regexp-macro-assembler-arm.cc
+++ b/deps/v8/src/regexp/arm/regexp-macro-assembler-arm.cc
@@ -529,8 +529,8 @@ void RegExpMacroAssemblerARM::CheckBitInTable(
   BranchOrBacktrack(ne, on_bit_set);
 }
 
-bool RegExpMacroAssemblerARM::CheckSpecialCharacterClass(
-    StandardCharacterSet type, Label* on_no_match) {
+bool RegExpMacroAssemblerARM::CheckSpecialClassRanges(StandardCharacterSet type,
+                                                      Label* on_no_match) {
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check
   // TODO(jgruber): No custom implementation (yet): s(UC16), S(UC16).
diff --git a/deps/v8/src/regexp/arm/regexp-macro-assembler-arm.h b/deps/v8/src/regexp/arm/regexp-macro-assembler-arm.h
index ab550d53768ea2..edf7650bd527ef 100644
--- a/deps/v8/src/regexp/arm/regexp-macro-assembler-arm.h
+++ b/deps/v8/src/regexp/arm/regexp-macro-assembler-arm.h
@@ -57,8 +57,8 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerARM
   // Checks whether the given offset from the current position is before
   // the end of the string.
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
   void GoTo(Label* label) override;
diff --git a/deps/v8/src/regexp/arm64/regexp-macro-assembler-arm64.cc b/deps/v8/src/regexp/arm64/regexp-macro-assembler-arm64.cc
index ec7808d44ef241..2e462ba7485736 100644
--- a/deps/v8/src/regexp/arm64/regexp-macro-assembler-arm64.cc
+++ b/deps/v8/src/regexp/arm64/regexp-macro-assembler-arm64.cc
@@ -640,7 +640,7 @@ void RegExpMacroAssemblerARM64::CheckBitInTable(
   CompareAndBranchOrBacktrack(w11, 0, ne, on_bit_set);
 }
 
-bool RegExpMacroAssemblerARM64::CheckSpecialCharacterClass(
+bool RegExpMacroAssemblerARM64::CheckSpecialClassRanges(
     StandardCharacterSet type, Label* on_no_match) {
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check
diff --git a/deps/v8/src/regexp/arm64/regexp-macro-assembler-arm64.h b/deps/v8/src/regexp/arm64/regexp-macro-assembler-arm64.h
index bda529c7a61861..3801591b64ce8e 100644
--- a/deps/v8/src/regexp/arm64/regexp-macro-assembler-arm64.h
+++ b/deps/v8/src/regexp/arm64/regexp-macro-assembler-arm64.h
@@ -61,8 +61,8 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerARM64
   // Checks whether the given offset from the current position is before
   // the end of the string.
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void BindJumpTarget(Label* label = nullptr) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
diff --git a/deps/v8/src/regexp/experimental/experimental-compiler.cc b/deps/v8/src/regexp/experimental/experimental-compiler.cc
index 86bcf183f18569..ce6e0c75cacfe0 100644
--- a/deps/v8/src/regexp/experimental/experimental-compiler.cc
+++ b/deps/v8/src/regexp/experimental/experimental-compiler.cc
@@ -65,7 +65,13 @@ class CanBeHandledVisitor final : private RegExpVisitor {
     return nullptr;
   }
 
-  void* VisitCharacterClass(RegExpCharacterClass* node, void*) override {
+  void* VisitClassRanges(RegExpClassRanges* node, void*) override {
+    return nullptr;
+  }
+
+  void* VisitClassSetExpression(RegExpClassSetExpression* node,
+                                void*) override {
+    result_ = false;
     return nullptr;
   }
 
@@ -385,7 +391,7 @@ class CompileVisitor : private RegExpVisitor {
     return nullptr;
   }
 
-  void* VisitCharacterClass(RegExpCharacterClass* node, void*) override {
+  void* VisitClassRanges(RegExpClassRanges* node, void*) override {
     // A character class is compiled as Disjunction over its `CharacterRange`s.
     ZoneList<CharacterRange>* ranges = node->ranges(zone_);
     CharacterRange::Canonicalize(ranges);
@@ -419,6 +425,12 @@ class CompileVisitor : private RegExpVisitor {
     return nullptr;
   }
 
+  void* VisitClassSetExpression(RegExpClassSetExpression* node,
+                                void*) override {
+    // TODO(v8:11935): Add support.
+    UNREACHABLE();
+  }
+
   void* VisitAtom(RegExpAtom* node, void*) override {
     for (base::uc16 c : node->data()) {
       assembler_.ConsumeRange(c, c);
diff --git a/deps/v8/src/regexp/ia32/regexp-macro-assembler-ia32.cc b/deps/v8/src/regexp/ia32/regexp-macro-assembler-ia32.cc
index 093931fa9dc3a4..600234542042ce 100644
--- a/deps/v8/src/regexp/ia32/regexp-macro-assembler-ia32.cc
+++ b/deps/v8/src/regexp/ia32/regexp-macro-assembler-ia32.cc
@@ -567,7 +567,7 @@ void RegExpMacroAssemblerIA32::CheckBitInTable(
   BranchOrBacktrack(not_equal, on_bit_set);
 }
 
-bool RegExpMacroAssemblerIA32::CheckSpecialCharacterClass(
+bool RegExpMacroAssemblerIA32::CheckSpecialClassRanges(
     StandardCharacterSet type, Label* on_no_match) {
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check
diff --git a/deps/v8/src/regexp/ia32/regexp-macro-assembler-ia32.h b/deps/v8/src/regexp/ia32/regexp-macro-assembler-ia32.h
index 3933a68b1ff5e6..96d31634298309 100644
--- a/deps/v8/src/regexp/ia32/regexp-macro-assembler-ia32.h
+++ b/deps/v8/src/regexp/ia32/regexp-macro-assembler-ia32.h
@@ -58,8 +58,8 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerIA32
   // Checks whether the given offset from the current position is before
   // the end of the string.
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
   void GoTo(Label* label) override;
diff --git a/deps/v8/src/regexp/loong64/regexp-macro-assembler-loong64.cc b/deps/v8/src/regexp/loong64/regexp-macro-assembler-loong64.cc
index a55ea6557a39ae..35fd95bd0f2d21 100644
--- a/deps/v8/src/regexp/loong64/regexp-macro-assembler-loong64.cc
+++ b/deps/v8/src/regexp/loong64/regexp-macro-assembler-loong64.cc
@@ -496,7 +496,7 @@ void RegExpMacroAssemblerLOONG64::CheckBitInTable(Handle<ByteArray> table,
   BranchOrBacktrack(on_bit_set, ne, a0, Operand(zero_reg));
 }
 
-bool RegExpMacroAssemblerLOONG64::CheckSpecialCharacterClass(
+bool RegExpMacroAssemblerLOONG64::CheckSpecialClassRanges(
     StandardCharacterSet type, Label* on_no_match) {
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check.
diff --git a/deps/v8/src/regexp/loong64/regexp-macro-assembler-loong64.h b/deps/v8/src/regexp/loong64/regexp-macro-assembler-loong64.h
index a141936613aaa3..fe40a4e74fb8b8 100644
--- a/deps/v8/src/regexp/loong64/regexp-macro-assembler-loong64.h
+++ b/deps/v8/src/regexp/loong64/regexp-macro-assembler-loong64.h
@@ -56,8 +56,8 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerLOONG64
   // Checks whether the given offset from the current position is before
   // the end of the string.
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
   void GoTo(Label* label) override;
diff --git a/deps/v8/src/regexp/mips64/regexp-macro-assembler-mips64.cc b/deps/v8/src/regexp/mips64/regexp-macro-assembler-mips64.cc
index 598083dcbb2394..456e166adefc72 100644
--- a/deps/v8/src/regexp/mips64/regexp-macro-assembler-mips64.cc
+++ b/deps/v8/src/regexp/mips64/regexp-macro-assembler-mips64.cc
@@ -545,7 +545,7 @@ void RegExpMacroAssemblerMIPS::CheckBitInTable(
   BranchOrBacktrack(on_bit_set, ne, a0, Operand(zero_reg));
 }
 
-bool RegExpMacroAssemblerMIPS::CheckSpecialCharacterClass(
+bool RegExpMacroAssemblerMIPS::CheckSpecialClassRanges(
     StandardCharacterSet type, Label* on_no_match) {
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check.
diff --git a/deps/v8/src/regexp/mips64/regexp-macro-assembler-mips64.h b/deps/v8/src/regexp/mips64/regexp-macro-assembler-mips64.h
index 9b8c7c26d8d5ab..449084b0dab139 100644
--- a/deps/v8/src/regexp/mips64/regexp-macro-assembler-mips64.h
+++ b/deps/v8/src/regexp/mips64/regexp-macro-assembler-mips64.h
@@ -56,8 +56,8 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerMIPS
   // Checks whether the given offset from the current position is before
   // the end of the string.
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
   void GoTo(Label* label) override;
diff --git a/deps/v8/src/regexp/ppc/regexp-macro-assembler-ppc.cc b/deps/v8/src/regexp/ppc/regexp-macro-assembler-ppc.cc
index 483c4f395a4dd7..4fdad878947d4a 100644
--- a/deps/v8/src/regexp/ppc/regexp-macro-assembler-ppc.cc
+++ b/deps/v8/src/regexp/ppc/regexp-macro-assembler-ppc.cc
@@ -562,8 +562,8 @@ void RegExpMacroAssemblerPPC::CheckBitInTable(Handle<ByteArray> table,
   BranchOrBacktrack(ne, on_bit_set);
 }
 
-bool RegExpMacroAssemblerPPC::CheckSpecialCharacterClass(
-    StandardCharacterSet type, Label* on_no_match) {
+bool RegExpMacroAssemblerPPC::CheckSpecialClassRanges(StandardCharacterSet type,
+                                                      Label* on_no_match) {
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check
   // TODO(jgruber): No custom implementation (yet): s(UC16), S(UC16).
diff --git a/deps/v8/src/regexp/ppc/regexp-macro-assembler-ppc.h b/deps/v8/src/regexp/ppc/regexp-macro-assembler-ppc.h
index 5760809d96215d..db2783ff7217bb 100644
--- a/deps/v8/src/regexp/ppc/regexp-macro-assembler-ppc.h
+++ b/deps/v8/src/regexp/ppc/regexp-macro-assembler-ppc.h
@@ -57,8 +57,8 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerPPC
   // Checks whether the given offset from the current position is before
   // the end of the string.
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
   void GoTo(Label* label) override;
diff --git a/deps/v8/src/regexp/property-sequences.cc b/deps/v8/src/regexp/property-sequences.cc
deleted file mode 100644
index 643bde954b6a17..00000000000000
--- a/deps/v8/src/regexp/property-sequences.cc
+++ /dev/null
@@ -1,1246 +0,0 @@
-// Copyright 2018 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef V8_INTL_SUPPORT
-
-#include "src/regexp/property-sequences.h"
-
-namespace v8 {
-namespace internal {
-
-/*
-Generated from following Node.js source:
-
-package.json
-
-```
-{
-  "private": true,
-  "dependencies": {
-    "unicode-12.0.0": "^0.7.9"
-  }
-}
-```
-
-generate-unicode-sequence-property-data.js
-
-```
-const toHex = (symbol) => {
-  return '0x' + symbol.codePointAt(0).toString(16)
-                      .toUpperCase().padStart(6, '0');
-};
-
-const generateData = (property) => {
-  const sequences =
-      require(`unicode-12.0.0/Sequence_Property/${ property }/index.js`);
-  const id = property.replace(/_/g, '') + 's';
-  const buffer = [];
-  for (const sequence of sequences) {
-    const symbols = [...sequence];
-    const codePoints = symbols.map(symbol => toHex(symbol));
-    buffer.push('    ' + codePoints.join(', ') + ', 0,');
-  }
-  const output =
-      `const base::uc32 UnicodePropertySequences::k${ id }[] = {\n` +
-      `${ buffer.join('\n') }\n    0  // null-terminating the list\n};\n`;
-  return output;
-};
-
-const properties = [
-  'Emoji_Flag_Sequence',
-  'Emoji_Tag_Sequence',
-  'Emoji_ZWJ_Sequence',
-];
-
-for (const property of properties) {
-  console.log(generateData(property));
-}
-```
-*/
-
-// clang-format off
-const base::uc32 UnicodePropertySequences::kEmojiFlagSequences[] = {
-    0x01F1E6, 0x01F1E8, 0,
-    0x01F1FF, 0x01F1FC, 0,
-    0x01F1E6, 0x01F1EA, 0,
-    0x01F1E6, 0x01F1EB, 0,
-    0x01F1E6, 0x01F1EC, 0,
-    0x01F1E6, 0x01F1EE, 0,
-    0x01F1E6, 0x01F1F1, 0,
-    0x01F1E6, 0x01F1F2, 0,
-    0x01F1E6, 0x01F1F4, 0,
-    0x01F1E6, 0x01F1F6, 0,
-    0x01F1E6, 0x01F1F7, 0,
-    0x01F1E6, 0x01F1F8, 0,
-    0x01F1E6, 0x01F1F9, 0,
-    0x01F1E6, 0x01F1FA, 0,
-    0x01F1E6, 0x01F1FC, 0,
-    0x01F1E6, 0x01F1FD, 0,
-    0x01F1E6, 0x01F1FF, 0,
-    0x01F1E7, 0x01F1E6, 0,
-    0x01F1E7, 0x01F1E7, 0,
-    0x01F1E7, 0x01F1E9, 0,
-    0x01F1E7, 0x01F1EA, 0,
-    0x01F1E7, 0x01F1EB, 0,
-    0x01F1E7, 0x01F1EC, 0,
-    0x01F1E7, 0x01F1ED, 0,
-    0x01F1E7, 0x01F1EE, 0,
-    0x01F1E7, 0x01F1EF, 0,
-    0x01F1E7, 0x01F1F1, 0,
-    0x01F1E7, 0x01F1F2, 0,
-    0x01F1E7, 0x01F1F3, 0,
-    0x01F1E7, 0x01F1F4, 0,
-    0x01F1E7, 0x01F1F6, 0,
-    0x01F1E7, 0x01F1F7, 0,
-    0x01F1E7, 0x01F1F8, 0,
-    0x01F1E7, 0x01F1F9, 0,
-    0x01F1E7, 0x01F1FB, 0,
-    0x01F1E7, 0x01F1FC, 0,
-    0x01F1E7, 0x01F1FE, 0,
-    0x01F1E7, 0x01F1FF, 0,
-    0x01F1E8, 0x01F1E6, 0,
-    0x01F1E8, 0x01F1E8, 0,
-    0x01F1E8, 0x01F1E9, 0,
-    0x01F1E8, 0x01F1EB, 0,
-    0x01F1E8, 0x01F1EC, 0,
-    0x01F1E8, 0x01F1ED, 0,
-    0x01F1E8, 0x01F1EE, 0,
-    0x01F1E8, 0x01F1F0, 0,
-    0x01F1E8, 0x01F1F1, 0,
-    0x01F1E8, 0x01F1F2, 0,
-    0x01F1E8, 0x01F1F3, 0,
-    0x01F1E8, 0x01F1F4, 0,
-    0x01F1E8, 0x01F1F5, 0,
-    0x01F1E8, 0x01F1F7, 0,
-    0x01F1E8, 0x01F1FA, 0,
-    0x01F1E8, 0x01F1FB, 0,
-    0x01F1E8, 0x01F1FC, 0,
-    0x01F1E8, 0x01F1FD, 0,
-    0x01F1E8, 0x01F1FE, 0,
-    0x01F1E8, 0x01F1FF, 0,
-    0x01F1E9, 0x01F1EA, 0,
-    0x01F1E9, 0x01F1EC, 0,
-    0x01F1E9, 0x01F1EF, 0,
-    0x01F1E9, 0x01F1F0, 0,
-    0x01F1E9, 0x01F1F2, 0,
-    0x01F1E9, 0x01F1F4, 0,
-    0x01F1E9, 0x01F1FF, 0,
-    0x01F1EA, 0x01F1E6, 0,
-    0x01F1EA, 0x01F1E8, 0,
-    0x01F1EA, 0x01F1EA, 0,
-    0x01F1EA, 0x01F1EC, 0,
-    0x01F1EA, 0x01F1ED, 0,
-    0x01F1EA, 0x01F1F7, 0,
-    0x01F1EA, 0x01F1F8, 0,
-    0x01F1EA, 0x01F1F9, 0,
-    0x01F1EA, 0x01F1FA, 0,
-    0x01F1EB, 0x01F1EE, 0,
-    0x01F1EB, 0x01F1EF, 0,
-    0x01F1EB, 0x01F1F0, 0,
-    0x01F1EB, 0x01F1F2, 0,
-    0x01F1EB, 0x01F1F4, 0,
-    0x01F1EB, 0x01F1F7, 0,
-    0x01F1EC, 0x01F1E6, 0,
-    0x01F1EC, 0x01F1E7, 0,
-    0x01F1EC, 0x01F1E9, 0,
-    0x01F1EC, 0x01F1EA, 0,
-    0x01F1EC, 0x01F1EB, 0,
-    0x01F1EC, 0x01F1EC, 0,
-    0x01F1EC, 0x01F1ED, 0,
-    0x01F1EC, 0x01F1EE, 0,
-    0x01F1EC, 0x01F1F1, 0,
-    0x01F1EC, 0x01F1F2, 0,
-    0x01F1EC, 0x01F1F3, 0,
-    0x01F1EC, 0x01F1F5, 0,
-    0x01F1EC, 0x01F1F6, 0,
-    0x01F1EC, 0x01F1F7, 0,
-    0x01F1EC, 0x01F1F8, 0,
-    0x01F1EC, 0x01F1F9, 0,
-    0x01F1EC, 0x01F1FA, 0,
-    0x01F1EC, 0x01F1FC, 0,
-    0x01F1EC, 0x01F1FE, 0,
-    0x01F1ED, 0x01F1F0, 0,
-    0x01F1ED, 0x01F1F2, 0,
-    0x01F1ED, 0x01F1F3, 0,
-    0x01F1ED, 0x01F1F7, 0,
-    0x01F1ED, 0x01F1F9, 0,
-    0x01F1ED, 0x01F1FA, 0,
-    0x01F1EE, 0x01F1E8, 0,
-    0x01F1EE, 0x01F1E9, 0,
-    0x01F1EE, 0x01F1EA, 0,
-    0x01F1EE, 0x01F1F1, 0,
-    0x01F1EE, 0x01F1F2, 0,
-    0x01F1EE, 0x01F1F3, 0,
-    0x01F1EE, 0x01F1F4, 0,
-    0x01F1EE, 0x01F1F6, 0,
-    0x01F1EE, 0x01F1F7, 0,
-    0x01F1EE, 0x01F1F8, 0,
-    0x01F1EE, 0x01F1F9, 0,
-    0x01F1EF, 0x01F1EA, 0,
-    0x01F1EF, 0x01F1F2, 0,
-    0x01F1EF, 0x01F1F4, 0,
-    0x01F1EF, 0x01F1F5, 0,
-    0x01F1F0, 0x01F1EA, 0,
-    0x01F1F0, 0x01F1EC, 0,
-    0x01F1F0, 0x01F1ED, 0,
-    0x01F1F0, 0x01F1EE, 0,
-    0x01F1F0, 0x01F1F2, 0,
-    0x01F1F0, 0x01F1F3, 0,
-    0x01F1F0, 0x01F1F5, 0,
-    0x01F1F0, 0x01F1F7, 0,
-    0x01F1F0, 0x01F1FC, 0,
-    0x01F1E6, 0x01F1E9, 0,
-    0x01F1F0, 0x01F1FF, 0,
-    0x01F1F1, 0x01F1E6, 0,
-    0x01F1F1, 0x01F1E7, 0,
-    0x01F1F1, 0x01F1E8, 0,
-    0x01F1F1, 0x01F1EE, 0,
-    0x01F1F1, 0x01F1F0, 0,
-    0x01F1F1, 0x01F1F7, 0,
-    0x01F1F1, 0x01F1F8, 0,
-    0x01F1F1, 0x01F1F9, 0,
-    0x01F1F1, 0x01F1FA, 0,
-    0x01F1F1, 0x01F1FB, 0,
-    0x01F1F1, 0x01F1FE, 0,
-    0x01F1F2, 0x01F1E6, 0,
-    0x01F1F2, 0x01F1E8, 0,
-    0x01F1F2, 0x01F1E9, 0,
-    0x01F1F2, 0x01F1EA, 0,
-    0x01F1F2, 0x01F1EB, 0,
-    0x01F1F2, 0x01F1EC, 0,
-    0x01F1F2, 0x01F1ED, 0,
-    0x01F1F2, 0x01F1F0, 0,
-    0x01F1F2, 0x01F1F1, 0,
-    0x01F1F2, 0x01F1F2, 0,
-    0x01F1F2, 0x01F1F3, 0,
-    0x01F1F2, 0x01F1F4, 0,
-    0x01F1F2, 0x01F1F5, 0,
-    0x01F1F2, 0x01F1F6, 0,
-    0x01F1F2, 0x01F1F7, 0,
-    0x01F1F2, 0x01F1F8, 0,
-    0x01F1F2, 0x01F1F9, 0,
-    0x01F1F2, 0x01F1FA, 0,
-    0x01F1F2, 0x01F1FB, 0,
-    0x01F1F2, 0x01F1FC, 0,
-    0x01F1F2, 0x01F1FD, 0,
-    0x01F1F2, 0x01F1FE, 0,
-    0x01F1F2, 0x01F1FF, 0,
-    0x01F1F3, 0x01F1E6, 0,
-    0x01F1F3, 0x01F1E8, 0,
-    0x01F1F3, 0x01F1EA, 0,
-    0x01F1F3, 0x01F1EB, 0,
-    0x01F1F3, 0x01F1EC, 0,
-    0x01F1F3, 0x01F1EE, 0,
-    0x01F1F3, 0x01F1F1, 0,
-    0x01F1F3, 0x01F1F4, 0,
-    0x01F1F3, 0x01F1F5, 0,
-    0x01F1F3, 0x01F1F7, 0,
-    0x01F1F3, 0x01F1FA, 0,
-    0x01F1F3, 0x01F1FF, 0,
-    0x01F1F4, 0x01F1F2, 0,
-    0x01F1F5, 0x01F1E6, 0,
-    0x01F1F5, 0x01F1EA, 0,
-    0x01F1F5, 0x01F1EB, 0,
-    0x01F1F5, 0x01F1EC, 0,
-    0x01F1F5, 0x01F1ED, 0,
-    0x01F1F5, 0x01F1F0, 0,
-    0x01F1F5, 0x01F1F1, 0,
-    0x01F1F5, 0x01F1F2, 0,
-    0x01F1F5, 0x01F1F3, 0,
-    0x01F1F5, 0x01F1F7, 0,
-    0x01F1F5, 0x01F1F8, 0,
-    0x01F1F5, 0x01F1F9, 0,
-    0x01F1F5, 0x01F1FC, 0,
-    0x01F1F5, 0x01F1FE, 0,
-    0x01F1F6, 0x01F1E6, 0,
-    0x01F1F7, 0x01F1EA, 0,
-    0x01F1F7, 0x01F1F4, 0,
-    0x01F1F7, 0x01F1F8, 0,
-    0x01F1F7, 0x01F1FA, 0,
-    0x01F1F7, 0x01F1FC, 0,
-    0x01F1F8, 0x01F1E6, 0,
-    0x01F1F8, 0x01F1E7, 0,
-    0x01F1F8, 0x01F1E8, 0,
-    0x01F1F8, 0x01F1E9, 0,
-    0x01F1F8, 0x01F1EA, 0,
-    0x01F1F8, 0x01F1EC, 0,
-    0x01F1F8, 0x01F1ED, 0,
-    0x01F1F8, 0x01F1EE, 0,
-    0x01F1F8, 0x01F1EF, 0,
-    0x01F1F8, 0x01F1F0, 0,
-    0x01F1F8, 0x01F1F1, 0,
-    0x01F1F8, 0x01F1F2, 0,
-    0x01F1F8, 0x01F1F3, 0,
-    0x01F1F8, 0x01F1F4, 0,
-    0x01F1F8, 0x01F1F7, 0,
-    0x01F1F8, 0x01F1F8, 0,
-    0x01F1F8, 0x01F1F9, 0,
-    0x01F1F8, 0x01F1FB, 0,
-    0x01F1F8, 0x01F1FD, 0,
-    0x01F1F8, 0x01F1FE, 0,
-    0x01F1F8, 0x01F1FF, 0,
-    0x01F1F9, 0x01F1E6, 0,
-    0x01F1F9, 0x01F1E8, 0,
-    0x01F1F9, 0x01F1E9, 0,
-    0x01F1F9, 0x01F1EB, 0,
-    0x01F1F9, 0x01F1EC, 0,
-    0x01F1F9, 0x01F1ED, 0,
-    0x01F1F9, 0x01F1EF, 0,
-    0x01F1F9, 0x01F1F0, 0,
-    0x01F1F9, 0x01F1F1, 0,
-    0x01F1F9, 0x01F1F2, 0,
-    0x01F1F9, 0x01F1F3, 0,
-    0x01F1F9, 0x01F1F4, 0,
-    0x01F1F9, 0x01F1F7, 0,
-    0x01F1F9, 0x01F1F9, 0,
-    0x01F1F9, 0x01F1FB, 0,
-    0x01F1F9, 0x01F1FC, 0,
-    0x01F1F9, 0x01F1FF, 0,
-    0x01F1FA, 0x01F1E6, 0,
-    0x01F1FA, 0x01F1EC, 0,
-    0x01F1FA, 0x01F1F2, 0,
-    0x01F1FA, 0x01F1F3, 0,
-    0x01F1FA, 0x01F1F8, 0,
-    0x01F1FA, 0x01F1FE, 0,
-    0x01F1FA, 0x01F1FF, 0,
-    0x01F1FB, 0x01F1E6, 0,
-    0x01F1FB, 0x01F1E8, 0,
-    0x01F1FB, 0x01F1EA, 0,
-    0x01F1FB, 0x01F1EC, 0,
-    0x01F1FB, 0x01F1EE, 0,
-    0x01F1FB, 0x01F1F3, 0,
-    0x01F1FB, 0x01F1FA, 0,
-    0x01F1FC, 0x01F1EB, 0,
-    0x01F1FC, 0x01F1F8, 0,
-    0x01F1FD, 0x01F1F0, 0,
-    0x01F1FE, 0x01F1EA, 0,
-    0x01F1FE, 0x01F1F9, 0,
-    0x01F1FF, 0x01F1E6, 0,
-    0x01F1FF, 0x01F1F2, 0,
-    0x01F1F0, 0x01F1FE, 0,
-    0  // null-terminating the list
-};
-
-const base::uc32 UnicodePropertySequences::kEmojiTagSequences[] = {
-    0x01F3F4, 0x0E0067, 0x0E0062, 0x0E0065, 0x0E006E, 0x0E0067, 0x0E007F, 0,
-    0x01F3F4, 0x0E0067, 0x0E0062, 0x0E0073, 0x0E0063, 0x0E0074, 0x0E007F, 0,
-    0x01F3F4, 0x0E0067, 0x0E0062, 0x0E0077, 0x0E006C, 0x0E0073, 0x0E007F, 0,
-    0  // null-terminating the list
-};
-
-const base::uc32 UnicodePropertySequences::kEmojiZWJSequences[] = {
-    0x01F468, 0x00200D, 0x002764, 0x00FE0F, 0x00200D, 0x01F468, 0,
-    0x01F441, 0x00FE0F, 0x00200D, 0x01F5E8, 0x00FE0F, 0,
-    0x01F468, 0x00200D, 0x01F466, 0,
-    0x01F468, 0x00200D, 0x01F466, 0x00200D, 0x01F466, 0,
-    0x01F468, 0x00200D, 0x01F467, 0,
-    0x01F468, 0x00200D, 0x01F467, 0x00200D, 0x01F466, 0,
-    0x01F468, 0x00200D, 0x01F467, 0x00200D, 0x01F467, 0,
-    0x01F468, 0x00200D, 0x01F468, 0x00200D, 0x01F466, 0,
-    0x01F468, 0x00200D, 0x01F468, 0x00200D, 0x01F466, 0x00200D, 0x01F466, 0,
-    0x01F468, 0x00200D, 0x01F468, 0x00200D, 0x01F467, 0,
-    0x01F468, 0x00200D, 0x01F468, 0x00200D, 0x01F467, 0x00200D, 0x01F466, 0,
-    0x01F468, 0x00200D, 0x01F468, 0x00200D, 0x01F467, 0x00200D, 0x01F467, 0,
-    0x01F468, 0x00200D, 0x01F469, 0x00200D, 0x01F466, 0,
-    0x01F468, 0x00200D, 0x01F469, 0x00200D, 0x01F466, 0x00200D, 0x01F466, 0,
-    0x01F468, 0x00200D, 0x01F469, 0x00200D, 0x01F467, 0,
-    0x01F468, 0x00200D, 0x01F469, 0x00200D, 0x01F467, 0x00200D, 0x01F466, 0,
-    0x01F468, 0x00200D, 0x01F469, 0x00200D, 0x01F467, 0x00200D, 0x01F467, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FB, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FB, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FC, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FB, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FC, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FD, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FB, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FC, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FD, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FE, 0,
-    0x01F469, 0x00200D, 0x002764, 0x00FE0F, 0x00200D, 0x01F468, 0,
-    0x01F469, 0x00200D, 0x002764, 0x00FE0F, 0x00200D, 0x01F469, 0,
-    0x01F469, 0x00200D, 0x002764, 0x00FE0F, 0x00200D, 0x01F48B, 0x00200D,
-        0x01F468, 0,
-    0x01F469, 0x00200D, 0x002764, 0x00FE0F, 0x00200D, 0x01F48B, 0x00200D,
-        0x01F469, 0,
-    0x01F469, 0x00200D, 0x01F466, 0,
-    0x01F469, 0x00200D, 0x01F466, 0x00200D, 0x01F466, 0,
-    0x01F469, 0x00200D, 0x01F467, 0,
-    0x01F469, 0x00200D, 0x01F467, 0x00200D, 0x01F466, 0,
-    0x01F469, 0x00200D, 0x01F467, 0x00200D, 0x01F467, 0,
-    0x01F469, 0x00200D, 0x01F469, 0x00200D, 0x01F466, 0,
-    0x01F469, 0x00200D, 0x01F469, 0x00200D, 0x01F466, 0x00200D, 0x01F466, 0,
-    0x01F469, 0x00200D, 0x01F469, 0x00200D, 0x01F467, 0,
-    0x01F469, 0x00200D, 0x01F469, 0x00200D, 0x01F467, 0x00200D, 0x01F466, 0,
-    0x01F469, 0x00200D, 0x01F469, 0x00200D, 0x01F467, 0x00200D, 0x01F467, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FC, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FD, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FE, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FF, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FB, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FD, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FE, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FF, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FB, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FB, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FC, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FE, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FF, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FB, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FC, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FB, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FC, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FD, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FF, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FB, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FC, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FD, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FB, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FC, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FD, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F468, 0x01F3FE, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FB, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FC, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FD, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F469, 0x01F3FE, 0,
-    0x01F9D1, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0,
-    0x01F9D1, 0x01F3FB, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FB, 0,
-    0x01F9D1, 0x01F3FC, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FB, 0,
-    0x01F9D1, 0x01F3FC, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FC, 0,
-    0x01F9D1, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FB, 0,
-    0x01F9D1, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FC, 0,
-    0x01F9D1, 0x01F3FD, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FD, 0,
-    0x01F9D1, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FB, 0,
-    0x01F9D1, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FC, 0,
-    0x01F9D1, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FD, 0,
-    0x01F9D1, 0x01F3FE, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FE, 0,
-    0x01F9D1, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FB, 0,
-    0x01F9D1, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FC, 0,
-    0x01F9D1, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FD, 0,
-    0x01F9D1, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FE, 0,
-    0x01F9D1, 0x01F3FF, 0x00200D, 0x01F91D, 0x00200D, 0x01F9D1, 0x01F3FF, 0,
-    0x01F468, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F468, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F468, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F468, 0x00200D, 0x01F33E, 0,
-    0x01F468, 0x00200D, 0x01F373, 0,
-    0x01F468, 0x00200D, 0x01F393, 0,
-    0x01F468, 0x00200D, 0x01F3A4, 0,
-    0x01F468, 0x00200D, 0x01F3A8, 0,
-    0x01F468, 0x00200D, 0x01F3EB, 0,
-    0x01F468, 0x00200D, 0x01F3ED, 0,
-    0x01F468, 0x00200D, 0x01F4BB, 0,
-    0x01F468, 0x00200D, 0x01F4BC, 0,
-    0x01F468, 0x00200D, 0x01F527, 0,
-    0x01F468, 0x00200D, 0x01F52C, 0,
-    0x01F468, 0x00200D, 0x01F680, 0,
-    0x01F468, 0x00200D, 0x01F692, 0,
-    0x01F468, 0x00200D, 0x01F9AF, 0,
-    0x01F468, 0x00200D, 0x01F9BC, 0,
-    0x01F468, 0x00200D, 0x01F9BD, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F33E, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F373, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F393, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F3A4, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F3A8, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F3EB, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F3ED, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F4BB, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F4BC, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F527, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F52C, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F680, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F692, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F9AF, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F9BC, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F9BD, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F33E, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F373, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F393, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F3A4, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F3A8, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F3EB, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F3ED, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F4BB, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F4BC, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F527, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F52C, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F680, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F692, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F9AF, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F9BC, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F9BD, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F33E, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F373, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F393, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F3A4, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F3A8, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F3EB, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F3ED, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F4BB, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F4BC, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F527, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F52C, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F680, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F692, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F9AF, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F9BC, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F9BD, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F33E, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F373, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F393, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F3A4, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F3A8, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F3EB, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F3ED, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F4BB, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F4BC, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F527, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F52C, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F680, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F692, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F9AF, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F9BC, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F9BD, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F33E, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F373, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F393, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F3A4, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F3A8, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F3EB, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F3ED, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F4BB, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F4BC, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F527, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F52C, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F680, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F692, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F9AF, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F9BC, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F9BD, 0,
-    0x01F469, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F469, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F469, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F469, 0x00200D, 0x01F33E, 0,
-    0x01F469, 0x00200D, 0x01F373, 0,
-    0x01F469, 0x00200D, 0x01F393, 0,
-    0x01F469, 0x00200D, 0x01F3A4, 0,
-    0x01F469, 0x00200D, 0x01F3A8, 0,
-    0x01F469, 0x00200D, 0x01F3EB, 0,
-    0x01F469, 0x00200D, 0x01F3ED, 0,
-    0x01F469, 0x00200D, 0x01F4BB, 0,
-    0x01F469, 0x00200D, 0x01F4BC, 0,
-    0x01F469, 0x00200D, 0x01F527, 0,
-    0x01F469, 0x00200D, 0x01F52C, 0,
-    0x01F469, 0x00200D, 0x01F680, 0,
-    0x01F469, 0x00200D, 0x01F692, 0,
-    0x01F469, 0x00200D, 0x01F9AF, 0,
-    0x01F469, 0x00200D, 0x01F9BC, 0,
-    0x01F469, 0x00200D, 0x01F9BD, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F33E, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F373, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F393, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F3A4, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F3A8, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F3EB, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F3ED, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F4BB, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F4BC, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F527, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F52C, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F680, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F692, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F9AF, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F9BC, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F9BD, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F33E, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F373, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F393, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F3A4, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F3A8, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F3EB, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F3ED, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F4BB, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F4BC, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F527, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F52C, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F680, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F692, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F9AF, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F9BC, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F9BD, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F33E, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F373, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F393, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F3A4, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F3A8, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F3EB, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F3ED, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F4BB, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F4BC, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F527, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F52C, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F680, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F692, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F9AF, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F9BC, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F9BD, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F33E, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F373, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F393, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F3A4, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F3A8, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F3EB, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F3ED, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F4BB, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F4BC, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F527, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F52C, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F680, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F692, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F9AF, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F9BC, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F9BD, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x002695, 0x00FE0F, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x002696, 0x00FE0F, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x002708, 0x00FE0F, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F33E, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F373, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F393, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F3A4, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F3A8, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F3EB, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F3ED, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F4BB, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F4BC, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F527, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F52C, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F680, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F692, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F9AF, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F9BC, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F9BD, 0,
-    0x0026F9, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x0026F9, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x0026F9, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x0026F9, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x0026F9, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x0026F9, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x0026F9, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x0026F9, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x0026F9, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x0026F9, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x0026F9, 0x00FE0F, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x0026F9, 0x00FE0F, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C3, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C3, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C3, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C4, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C4, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3C4, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CA, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CA, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CA, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CB, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CB, 0x00FE0F, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CB, 0x00FE0F, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CC, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F3CC, 0x00FE0F, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F3CC, 0x00FE0F, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F46E, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F46E, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F46E, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F46F, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F46F, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F471, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F471, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F471, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F471, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F471, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F471, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F471, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F471, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F471, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F471, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F471, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F471, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F473, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F473, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F473, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F473, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F473, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F473, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F473, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F473, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F473, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F473, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F473, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F473, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F477, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F477, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F477, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F477, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F477, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F477, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F477, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F477, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F477, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F477, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F477, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F477, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F481, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F481, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F481, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F481, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F481, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F481, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F481, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F481, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F481, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F481, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F481, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F481, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F482, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F482, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F468, 0x00200D, 0x002764, 0x00FE0F, 0x00200D, 0x01F48B, 0x00200D,
-        0x01F468, 0,
-    0x01F482, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F482, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F482, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F482, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F482, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F482, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F482, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F482, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F482, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F486, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F486, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F486, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F486, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F486, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F486, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F486, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F486, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F486, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F486, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F486, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F486, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F487, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F487, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F487, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F487, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F487, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F487, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F487, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F487, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F487, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F487, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F487, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F487, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F575, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F575, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F575, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F575, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F575, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F575, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F575, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F575, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F575, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F575, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F575, 0x00FE0F, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F575, 0x00FE0F, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F645, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F645, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F645, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F645, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F645, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F645, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F645, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F645, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F645, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F645, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F645, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F645, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F646, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F646, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F646, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F646, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F646, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F646, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F646, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F646, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F646, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F646, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F646, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F646, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F647, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F647, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F647, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F647, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F647, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F647, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F647, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F647, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F647, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F647, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F647, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F647, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64B, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64B, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64B, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64D, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64D, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64D, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64E, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64E, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F64E, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6A3, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6A3, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6A3, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B4, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B4, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B4, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B5, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B5, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B5, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B6, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B6, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F6B6, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F926, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F926, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F926, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F926, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F926, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F926, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F926, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F926, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F926, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F926, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F926, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F926, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F937, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F937, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F937, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F937, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F937, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F937, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F937, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F937, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F937, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F937, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F937, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F937, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F938, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F938, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F938, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F938, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F938, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F938, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F938, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F938, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F938, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F938, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F938, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F938, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F939, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F939, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F939, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F939, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F939, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F939, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F939, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F939, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F939, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F939, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F939, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F939, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93C, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93C, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93D, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93D, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93D, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93E, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93E, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F93E, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B8, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B8, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B8, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B9, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B9, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9B9, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CD, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CE, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9CF, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D6, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D6, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D6, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D7, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D7, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D7, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D8, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D8, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D8, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D9, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D9, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9D9, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DA, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DA, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DA, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DB, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DC, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FB, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FC, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FC, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FD, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FD, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DD, 0x01F3FF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DE, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DE, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F9DF, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0x01F9DF, 0x00200D, 0x002642, 0x00FE0F, 0,
-    0x01F468, 0x00200D, 0x01F9B0, 0,
-    0x01F468, 0x00200D, 0x01F9B1, 0,
-    0x01F468, 0x00200D, 0x01F9B2, 0,
-    0x01F468, 0x00200D, 0x01F9B3, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F9B0, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F9B1, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F9B2, 0,
-    0x01F468, 0x01F3FB, 0x00200D, 0x01F9B3, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F9B0, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F9B1, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F9B2, 0,
-    0x01F468, 0x01F3FC, 0x00200D, 0x01F9B3, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F9B0, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F9B1, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F9B2, 0,
-    0x01F468, 0x01F3FD, 0x00200D, 0x01F9B3, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F9B0, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F9B1, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F9B2, 0,
-    0x01F468, 0x01F3FE, 0x00200D, 0x01F9B3, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F9B0, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F9B1, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F9B2, 0,
-    0x01F468, 0x01F3FF, 0x00200D, 0x01F9B3, 0,
-    0x01F469, 0x00200D, 0x01F9B0, 0,
-    0x01F469, 0x00200D, 0x01F9B1, 0,
-    0x01F469, 0x00200D, 0x01F9B2, 0,
-    0x01F469, 0x00200D, 0x01F9B3, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F9B0, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F9B1, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F9B2, 0,
-    0x01F469, 0x01F3FB, 0x00200D, 0x01F9B3, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F9B0, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F9B1, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F9B2, 0,
-    0x01F469, 0x01F3FC, 0x00200D, 0x01F9B3, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F9B0, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F9B1, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F9B2, 0,
-    0x01F469, 0x01F3FD, 0x00200D, 0x01F9B3, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F9B0, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F9B1, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F9B2, 0,
-    0x01F469, 0x01F3FE, 0x00200D, 0x01F9B3, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F9B0, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F9B1, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F9B2, 0,
-    0x01F469, 0x01F3FF, 0x00200D, 0x01F9B3, 0,
-    0x01F3F3, 0x00FE0F, 0x00200D, 0x01F308, 0,
-    0x01F3F4, 0x00200D, 0x002620, 0x00FE0F, 0,
-    0x01F415, 0x00200D, 0x01F9BA, 0,
-    0x01F482, 0x01F3FB, 0x00200D, 0x002640, 0x00FE0F, 0,
-    0  // null-terminating the list
-};
-// clang-format on
-
-}  // namespace internal
-}  // namespace v8
-
-#endif  // V8_INTL_SUPPORT
diff --git a/deps/v8/src/regexp/property-sequences.h b/deps/v8/src/regexp/property-sequences.h
deleted file mode 100644
index 26470974991376..00000000000000
--- a/deps/v8/src/regexp/property-sequences.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef V8_REGEXP_PROPERTY_SEQUENCES_H_
-#define V8_REGEXP_PROPERTY_SEQUENCES_H_
-
-#ifdef V8_INTL_SUPPORT
-
-#include "src/base/strings.h"
-#include "src/common/globals.h"
-
-namespace v8 {
-namespace internal {
-
-class UnicodePropertySequences : public AllStatic {
- public:
-  static const base::uc32 kEmojiFlagSequences[];
-  static const base::uc32 kEmojiTagSequences[];
-  static const base::uc32 kEmojiZWJSequences[];
-};
-
-}  // namespace internal
-}  // namespace v8
-
-#endif  // V8_INTL_SUPPORT
-
-#endif  // V8_REGEXP_PROPERTY_SEQUENCES_H_
diff --git a/deps/v8/src/regexp/regexp-ast.cc b/deps/v8/src/regexp/regexp-ast.cc
index 6315057f029c1a..ef0f153c689bed 100644
--- a/deps/v8/src/regexp/regexp-ast.cc
+++ b/deps/v8/src/regexp/regexp-ast.cc
@@ -182,9 +182,7 @@ void RegExpUnparser::VisitCharacterRange(CharacterRange that) {
   }
 }
 
-
-void* RegExpUnparser::VisitCharacterClass(RegExpCharacterClass* that,
-                                          void* data) {
+void* RegExpUnparser::VisitClassRanges(RegExpClassRanges* that, void* data) {
   if (that->is_negated()) os_ << "^";
   os_ << "[";
   for (int i = 0; i < that->ranges(zone_)->length(); i++) {
@@ -195,6 +193,28 @@ void* RegExpUnparser::VisitCharacterClass(RegExpCharacterClass* that,
   return nullptr;
 }
 
+void* RegExpUnparser::VisitClassSetExpression(RegExpClassSetExpression* that,
+                                              void* data) {
+  switch (that->operation()) {
+    case RegExpClassSetExpression::OperationType::kUnion:
+      os_ << "++";
+      break;
+    case RegExpClassSetExpression::OperationType::kIntersection:
+      os_ << "&&";
+      break;
+    case RegExpClassSetExpression::OperationType::kSubtraction:
+      os_ << "--";
+      break;
+  }
+  if (that->is_negated()) os_ << "^";
+  os_ << "[";
+  for (int i = 0; i < that->operands()->length(); i++) {
+    if (i > 0) os_ << " ";
+    that->operands()->at(i)->Accept(this, data);
+  }
+  os_ << "]";
+  return nullptr;
+}
 
 void* RegExpUnparser::VisitAssertion(RegExpAssertion* that, void* data) {
   switch (that->assertion_type()) {
diff --git a/deps/v8/src/regexp/regexp-ast.h b/deps/v8/src/regexp/regexp-ast.h
index 9716920d726b52..718ecb2b5040af 100644
--- a/deps/v8/src/regexp/regexp-ast.h
+++ b/deps/v8/src/regexp/regexp-ast.h
@@ -18,7 +18,8 @@ namespace internal {
   VISIT(Disjunction)                      \
   VISIT(Alternative)                      \
   VISIT(Assertion)                        \
-  VISIT(CharacterClass)                   \
+  VISIT(ClassRanges)                      \
+  VISIT(ClassSetExpression)               \
   VISIT(Atom)                             \
   VISIT(Quantifier)                       \
   VISIT(Capture)                          \
@@ -117,29 +118,49 @@ class CharacterRange {
       StandardCharacterSet standard_character_set,
       ZoneList<CharacterRange>* ranges, bool add_unicode_case_equivalents,
       Zone* zone);
+  // Add case equivalents to ranges. Only used for /i, not for /ui or /vi, as
+  // the semantics for unicode mode are slightly different.
+  // See https://tc39.es/ecma262/#sec-runtime-semantics-canonicalize-ch Note 4.
   V8_EXPORT_PRIVATE static void AddCaseEquivalents(
       Isolate* isolate, Zone* zone, ZoneList<CharacterRange>* ranges,
       bool is_one_byte);
+  // Add case equivalent code points to ranges. Only used for /ui and /vi, not
+  // for /i, as the semantics for non-unicode mode are slightly different.
+  // See https://tc39.es/ecma262/#sec-runtime-semantics-canonicalize-ch Note 4.
+  static void AddUnicodeCaseEquivalents(ZoneList<CharacterRange>* ranges,
+                                        Zone* zone);
 
   bool Contains(base::uc32 i) const { return from_ <= i && i <= to_; }
   base::uc32 from() const { return from_; }
   base::uc32 to() const { return to_; }
   bool IsEverything(base::uc32 max) const { return from_ == 0 && to_ >= max; }
   bool IsSingleton() const { return from_ == to_; }
+
   // Whether a range list is in canonical form: Ranges ordered by from value,
   // and ranges non-overlapping and non-adjacent.
-  V8_EXPORT_PRIVATE static bool IsCanonical(ZoneList<CharacterRange>* ranges);
+  V8_EXPORT_PRIVATE static bool IsCanonical(
+      const ZoneList<CharacterRange>* ranges);
   // Convert range list to canonical form. The characters covered by the ranges
   // will still be the same, but no character is in more than one range, and
   // adjacent ranges are merged. The resulting list may be shorter than the
   // original, but cannot be longer.
   static void Canonicalize(ZoneList<CharacterRange>* ranges);
   // Negate the contents of a character range in canonical form.
-  static void Negate(ZoneList<CharacterRange>* src,
+  static void Negate(const ZoneList<CharacterRange>* src,
                      ZoneList<CharacterRange>* dst, Zone* zone);
-
+  // Intersect the contents of two character ranges in canonical form.
+  static void Intersect(const ZoneList<CharacterRange>* lhs,
+                        const ZoneList<CharacterRange>* rhs,
+                        ZoneList<CharacterRange>* dst, Zone* zone);
+  // Subtract the contents of |to_remove| from the contents of |src|.
+  static void Subtract(const ZoneList<CharacterRange>* src,
+                       const ZoneList<CharacterRange>* to_remove,
+                       ZoneList<CharacterRange>* dst, Zone* zone);
   // Remove all ranges outside the one-byte range.
   static void ClampToOneByte(ZoneList<CharacterRange>* ranges);
+  // Checks if two ranges (both need to be canonical) are equal.
+  static bool Equals(const ZoneList<CharacterRange>* lhs,
+                     const ZoneList<CharacterRange>* rhs);
 
  private:
   CharacterRange(base::uc32 from, base::uc32 to) : from_(from), to_(to) {}
@@ -150,6 +171,13 @@ class CharacterRange {
   base::uc32 to_ = 0;
 };
 
+inline bool operator==(const CharacterRange& lhs, const CharacterRange& rhs) {
+  return lhs.from() == rhs.from() && lhs.to() == rhs.to();
+}
+inline bool operator!=(const CharacterRange& lhs, const CharacterRange& rhs) {
+  return !operator==(lhs, rhs);
+}
+
 #define DECL_BOILERPLATE(Name)                                         \
   void* Accept(RegExpVisitor* visitor, void* data) override;           \
   RegExpNode* ToNode(RegExpCompiler* compiler, RegExpNode* on_success) \
@@ -271,7 +299,7 @@ class CharacterSet final {
   base::Optional<StandardCharacterSet> standard_set_type_;
 };
 
-class RegExpCharacterClass final : public RegExpTree {
+class RegExpClassRanges final : public RegExpTree {
  public:
   // NEGATED: The character class is negated and should match everything but
   //     the specified ranges.
@@ -281,22 +309,21 @@ class RegExpCharacterClass final : public RegExpTree {
     NEGATED = 1 << 0,
     CONTAINS_SPLIT_SURROGATE = 1 << 1,
   };
-  using CharacterClassFlags = base::Flags<Flag>;
+  using ClassRangesFlags = base::Flags<Flag>;
 
-  RegExpCharacterClass(
-      Zone* zone, ZoneList<CharacterRange>* ranges,
-      CharacterClassFlags character_class_flags = CharacterClassFlags())
-      : set_(ranges), character_class_flags_(character_class_flags) {
+  RegExpClassRanges(Zone* zone, ZoneList<CharacterRange>* ranges,
+                    ClassRangesFlags class_ranges_flags = ClassRangesFlags())
+      : set_(ranges), class_ranges_flags_(class_ranges_flags) {
     // Convert the empty set of ranges to the negated Everything() range.
     if (ranges->is_empty()) {
       ranges->Add(CharacterRange::Everything(), zone);
-      character_class_flags_ ^= NEGATED;
+      class_ranges_flags_ ^= NEGATED;
     }
   }
-  explicit RegExpCharacterClass(StandardCharacterSet standard_set_type)
-      : set_(standard_set_type), character_class_flags_() {}
+  explicit RegExpClassRanges(StandardCharacterSet standard_set_type)
+      : set_(standard_set_type), class_ranges_flags_() {}
 
-  DECL_BOILERPLATE(CharacterClass);
+  DECL_BOILERPLATE(ClassRanges);
 
   bool IsTextElement() override { return true; }
   int min_match() override { return 1; }
@@ -319,14 +346,55 @@ class RegExpCharacterClass final : public RegExpTree {
   CharacterSet character_set() const { return set_; }
   ZoneList<CharacterRange>* ranges(Zone* zone) { return set_.ranges(zone); }
 
-  bool is_negated() const { return (character_class_flags_ & NEGATED) != 0; }
+  bool is_negated() const { return (class_ranges_flags_ & NEGATED) != 0; }
   bool contains_split_surrogate() const {
-    return (character_class_flags_ & CONTAINS_SPLIT_SURROGATE) != 0;
+    return (class_ranges_flags_ & CONTAINS_SPLIT_SURROGATE) != 0;
   }
 
  private:
   CharacterSet set_;
-  CharacterClassFlags character_class_flags_;
+  ClassRangesFlags class_ranges_flags_;
+};
+
+class RegExpClassSetExpression final : public RegExpTree {
+ public:
+  enum class OperationType { kUnion, kIntersection, kSubtraction };
+
+  RegExpClassSetExpression(OperationType op, bool is_negated,
+                           ZoneList<RegExpTree*>* operands)
+      : operation_(op), is_negated_(is_negated), operands_(operands) {}
+
+  DECL_BOILERPLATE(ClassSetExpression);
+
+  bool IsTextElement() override { return true; }
+  // At least 1 character is consumed.
+  int min_match() override { return 1; }
+  // Up to two code points might be consumed.
+  int max_match() override { return 2; }
+
+  OperationType operation() const { return operation_; }
+  bool is_negated() const { return is_negated_; }
+  const ZoneList<RegExpTree*>* operands() const { return operands_; }
+
+ private:
+  RegExpClassRanges* ToCharacterClass(Zone* zone);
+
+  // Recursively evaluates the tree rooted at |root|, computing the valid
+  // CharacterRanges after applying all set operations and storing the result in
+  // |result_ranges|. |temp_ranges| is list used for intermediate results,
+  // passed as parameter to avoid allocating new lists all the time.
+  static void ComputeCharacterRanges(RegExpTree* root,
+                                     ZoneList<CharacterRange>* result_ranges,
+                                     ZoneList<CharacterRange>* temp_ranges,
+                                     Zone* zone);
+
+  const OperationType operation_;
+  const bool is_negated_;
+  ZoneList<RegExpTree*>* operands_ = nullptr;
+#ifdef ENABLE_SLOW_DCHECKS
+  // Cache ranges for each node during computation for (slow) DCHECKs.
+  ZoneList<CharacterRange>* ranges_ = nullptr;
+#endif
 };
 
 class RegExpAtom final : public RegExpTree {
@@ -349,10 +417,10 @@ class RegExpAtom final : public RegExpTree {
 
 class TextElement final {
  public:
-  enum TextType { ATOM, CHAR_CLASS };
+  enum TextType { ATOM, CLASS_RANGES };
 
   static TextElement Atom(RegExpAtom* atom);
-  static TextElement CharClass(RegExpCharacterClass* char_class);
+  static TextElement ClassRanges(RegExpClassRanges* class_ranges);
 
   int cp_offset() const { return cp_offset_; }
   void set_cp_offset(int cp_offset) { cp_offset_ = cp_offset; }
@@ -367,9 +435,9 @@ class TextElement final {
     return reinterpret_cast<RegExpAtom*>(tree());
   }
 
-  RegExpCharacterClass* char_class() const {
-    DCHECK(text_type() == CHAR_CLASS);
-    return reinterpret_cast<RegExpCharacterClass*>(tree());
+  RegExpClassRanges* class_ranges() const {
+    DCHECK(text_type() == CLASS_RANGES);
+    return reinterpret_cast<RegExpClassRanges*>(tree());
   }
 
  private:
diff --git a/deps/v8/src/regexp/regexp-compiler-tonode.cc b/deps/v8/src/regexp/regexp-compiler-tonode.cc
index da01f246d97296..22f53831cda2bf 100644
--- a/deps/v8/src/regexp/regexp-compiler-tonode.cc
+++ b/deps/v8/src/regexp/regexp-compiler-tonode.cc
@@ -93,7 +93,7 @@ bool CompareRanges(ZoneList<CharacterRange>* ranges, const int* special_class,
 
 }  // namespace
 
-bool RegExpCharacterClass::is_standard(Zone* zone) {
+bool RegExpClassRanges::is_standard(Zone* zone) {
   // TODO(lrn): Remove need for this function, by not throwing away information
   // along the way.
   if (is_negated()) {
@@ -419,9 +419,23 @@ RegExpNode* UnanchoredAdvance(RegExpCompiler* compiler,
   return TextNode::CreateForCharacterRanges(zone, range, false, on_success);
 }
 
-void AddUnicodeCaseEquivalents(ZoneList<CharacterRange>* ranges, Zone* zone) {
+}  // namespace
+
+// TODO(pthier, v8:11935): We use this method to implement
+// MaybeSimpleCaseFolding
+// TODO(v8:11935): Change to permalink once proposal is in stage 4.
+// https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#sec-maybesimplecasefolding
+// which is slightly different. The main difference is that we retain original
+// characters and add case equivalents, whereas according to the spec original
+// characters should be replaced with their case equivalent.
+// This shouldn't make a difference for correctness, but we could potentially
+// create smaller character classes for unicode sets.
+
+// static
+void CharacterRange::AddUnicodeCaseEquivalents(ZoneList<CharacterRange>* ranges,
+                                               Zone* zone) {
 #ifdef V8_INTL_SUPPORT
-  DCHECK(CharacterRange::IsCanonical(ranges));
+  DCHECK(IsCanonical(ranges));
 
   // Micro-optimization to avoid passing large ranges to UnicodeSet::closeOver.
   // See also https://crbug.com/v8/6727.
@@ -444,32 +458,40 @@ void AddUnicodeCaseEquivalents(ZoneList<CharacterRange>* ranges, Zone* zone) {
   // we end up with only simple and common case mappings.
   set.removeAllStrings();
   for (int i = 0; i < set.getRangeCount(); i++) {
-    ranges->Add(CharacterRange::Range(set.getRangeStart(i), set.getRangeEnd(i)),
-                zone);
+    ranges->Add(Range(set.getRangeStart(i), set.getRangeEnd(i)), zone);
   }
   // No errors and everything we collected have been ranges.
-  CharacterRange::Canonicalize(ranges);
+  Canonicalize(ranges);
 #endif  // V8_INTL_SUPPORT
 }
 
-}  // namespace
-
-RegExpNode* RegExpCharacterClass::ToNode(RegExpCompiler* compiler,
-                                         RegExpNode* on_success) {
+RegExpNode* RegExpClassRanges::ToNode(RegExpCompiler* compiler,
+                                      RegExpNode* on_success) {
   set_.Canonicalize();
   Zone* const zone = compiler->zone();
   ZoneList<CharacterRange>* ranges = this->ranges(zone);
 
   if (NeedsUnicodeCaseEquivalents(compiler->flags())) {
-    AddUnicodeCaseEquivalents(ranges, zone);
+    CharacterRange::AddUnicodeCaseEquivalents(ranges, zone);
   }
 
-  if (!IsUnicode(compiler->flags()) || compiler->one_byte() ||
+  if (!IsEitherUnicode(compiler->flags()) || compiler->one_byte() ||
       contains_split_surrogate()) {
     return zone->New<TextNode>(this, compiler->read_backward(), on_success);
   }
 
   if (is_negated()) {
+    // With /v, character classes are never negated.
+    // TODO(v8:11935): Change permalink once proposal is in stage 4.
+    // https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#sec-compileatom
+    // Atom :: CharacterClass
+    //   4. Assert: cc.[[Invert]] is false.
+    // Instead the complement is created when evaluating the class set.
+    // The only exception is the "nothing range" (negated everything), which is
+    // internally created for an empty set.
+    DCHECK_IMPLIES(
+        IsUnicodeSets(compiler->flags()),
+        ranges->length() == 1 && ranges->first().IsEverything(kMaxCodePoint));
     ZoneList<CharacterRange>* negated =
         zone->New<ZoneList<CharacterRange>>(2, zone);
     CharacterRange::Negate(ranges, negated, zone);
@@ -478,7 +500,7 @@ RegExpNode* RegExpCharacterClass::ToNode(RegExpCompiler* compiler,
 
   if (ranges->length() == 0) {
     // The empty character class is used as a 'fail' node.
-    RegExpCharacterClass* fail = zone->New<RegExpCharacterClass>(zone, ranges);
+    RegExpClassRanges* fail = zone->New<RegExpClassRanges>(zone, ranges);
     return zone->New<TextNode>(fail, compiler->read_backward(), on_success);
   }
 
@@ -505,6 +527,11 @@ RegExpNode* RegExpCharacterClass::ToNode(RegExpCompiler* compiler,
   return result;
 }
 
+RegExpNode* RegExpClassSetExpression::ToNode(RegExpCompiler* compiler,
+                                             RegExpNode* on_success) {
+  return ToCharacterClass(compiler->zone())->ToNode(compiler, on_success);
+}
+
 namespace {
 
 int CompareFirstChar(RegExpTree* const* a, RegExpTree* const* b) {
@@ -770,7 +797,7 @@ void RegExpDisjunction::FixSingleCharacterDisjunctions(
       continue;
     }
     const RegExpFlags flags = compiler->flags();
-    DCHECK_IMPLIES(IsUnicode(flags),
+    DCHECK_IMPLIES(IsEitherUnicode(flags),
                    !unibrow::Utf16::IsLeadSurrogate(atom->data().at(0)));
     bool contains_trail_surrogate =
         unibrow::Utf16::IsTrailSurrogate(atom->data().at(0));
@@ -783,7 +810,7 @@ void RegExpDisjunction::FixSingleCharacterDisjunctions(
       if (!alternative->IsAtom()) break;
       RegExpAtom* const alt_atom = alternative->AsAtom();
       if (alt_atom->length() != 1) break;
-      DCHECK_IMPLIES(IsUnicode(flags),
+      DCHECK_IMPLIES(IsEitherUnicode(flags),
                      !unibrow::Utf16::IsLeadSurrogate(alt_atom->data().at(0)));
       contains_trail_surrogate |=
           unibrow::Utf16::IsTrailSurrogate(alt_atom->data().at(0));
@@ -799,12 +826,12 @@ void RegExpDisjunction::FixSingleCharacterDisjunctions(
         DCHECK_EQ(old_atom->length(), 1);
         ranges->Add(CharacterRange::Singleton(old_atom->data().at(0)), zone);
       }
-      RegExpCharacterClass::CharacterClassFlags character_class_flags;
-      if (IsUnicode(flags) && contains_trail_surrogate) {
-        character_class_flags = RegExpCharacterClass::CONTAINS_SPLIT_SURROGATE;
+      RegExpClassRanges::ClassRangesFlags class_ranges_flags;
+      if (IsEitherUnicode(flags) && contains_trail_surrogate) {
+        class_ranges_flags = RegExpClassRanges::CONTAINS_SPLIT_SURROGATE;
       }
       alternatives->at(write_posn++) =
-          zone->New<RegExpCharacterClass>(zone, ranges, character_class_flags);
+          zone->New<RegExpClassRanges>(zone, ranges, class_ranges_flags);
     } else {
       // Just copy any trivial alternatives.
       for (int j = first_in_run; j < i; j++) {
@@ -922,8 +949,8 @@ RegExpNode* RegExpAssertion::ToNode(RegExpCompiler* compiler,
           zone->New<ZoneList<CharacterRange>>(3, zone);
       CharacterRange::AddClassEscape(StandardCharacterSet::kLineTerminator,
                                      newline_ranges, false, zone);
-      RegExpCharacterClass* newline_atom = zone->New<RegExpCharacterClass>(
-          StandardCharacterSet::kLineTerminator);
+      RegExpClassRanges* newline_atom =
+          zone->New<RegExpClassRanges>(StandardCharacterSet::kLineTerminator);
       TextNode* newline_matcher =
           zone->New<TextNode>(newline_atom, false,
                               ActionNode::PositiveSubmatchSuccess(
@@ -1110,7 +1137,7 @@ class AssertionSequenceRewriter final {
     // negated '*' (everything) range serves the purpose.
     ZoneList<CharacterRange>* ranges =
         zone_->New<ZoneList<CharacterRange>>(0, zone_);
-    RegExpCharacterClass* cc = zone_->New<RegExpCharacterClass>(zone_, ranges);
+    RegExpClassRanges* cc = zone_->New<RegExpClassRanges>(zone_, ranges);
     terms_->Set(from, cc);
 
     // Zero out the rest.
@@ -1359,7 +1386,7 @@ void CharacterRange::AddCaseEquivalents(Isolate* isolate, Zone* zone,
 #endif  // V8_INTL_SUPPORT
 }
 
-bool CharacterRange::IsCanonical(ZoneList<CharacterRange>* ranges) {
+bool CharacterRange::IsCanonical(const ZoneList<CharacterRange>* ranges) {
   DCHECK_NOT_NULL(ranges);
   int n = ranges->length();
   if (n <= 1) return true;
@@ -1463,6 +1490,128 @@ void CharacterSet::Canonicalize() {
   CharacterRange::Canonicalize(ranges_);
 }
 
+RegExpClassRanges* RegExpClassSetExpression::ToCharacterClass(Zone* zone) {
+  ZoneList<CharacterRange>* result_ranges =
+      zone->template New<ZoneList<CharacterRange>>(2, zone);
+  ZoneList<CharacterRange>* temp_ranges =
+      zone->template New<ZoneList<CharacterRange>>(2, zone);
+  ComputeCharacterRanges(this, result_ranges, temp_ranges, zone);
+  return zone->template New<RegExpClassRanges>(zone, result_ranges);
+}
+
+// static
+void RegExpClassSetExpression::ComputeCharacterRanges(
+    RegExpTree* root, ZoneList<CharacterRange>* result_ranges,
+    ZoneList<CharacterRange>* temp_ranges, Zone* zone) {
+  DCHECK_EQ(temp_ranges->length(), 0);
+  DCHECK(root->IsClassRanges() || root->IsClassSetExpression());
+  if (root->IsClassRanges()) {
+    DCHECK(!root->AsClassRanges()->is_negated());
+    ZoneList<CharacterRange>* ranges = root->AsClassRanges()->ranges(zone);
+    CharacterRange::Canonicalize(ranges);
+    result_ranges->AddAll(*ranges, zone);
+    return;
+  }
+  RegExpClassSetExpression* node = root->AsClassSetExpression();
+  switch (node->operation()) {
+    case OperationType::kUnion: {
+      ZoneList<CharacterRange>* op_ranges =
+          zone->template New<ZoneList<CharacterRange>>(2, zone);
+      for (int i = 0; i < node->operands()->length(); i++) {
+        RegExpTree* op = node->operands()->at(i);
+        ComputeCharacterRanges(op, op_ranges, temp_ranges, zone);
+        result_ranges->AddAll(*op_ranges, zone);
+        op_ranges->Rewind(0);
+      }
+      CharacterRange::Canonicalize(result_ranges);
+      break;
+    }
+    case OperationType::kIntersection: {
+      ZoneList<CharacterRange>* op_ranges =
+          zone->template New<ZoneList<CharacterRange>>(2, zone);
+      ComputeCharacterRanges(node->operands()->at(0), op_ranges, temp_ranges,
+                             zone);
+      result_ranges->AddAll(*op_ranges, zone);
+      op_ranges->Rewind(0);
+      for (int i = 1; i < node->operands()->length(); i++) {
+        ComputeCharacterRanges(node->operands()->at(i), op_ranges, temp_ranges,
+                               zone);
+        CharacterRange::Intersect(result_ranges, op_ranges, temp_ranges, zone);
+        std::swap(*result_ranges, *temp_ranges);
+        temp_ranges->Rewind(0);
+        op_ranges->Rewind(0);
+      }
+      break;
+    }
+    case OperationType::kSubtraction: {
+      ZoneList<CharacterRange>* op_ranges =
+          zone->template New<ZoneList<CharacterRange>>(2, zone);
+      ComputeCharacterRanges(node->operands()->at(0), op_ranges, temp_ranges,
+                             zone);
+      result_ranges->AddAll(*op_ranges, zone);
+      op_ranges->Rewind(0);
+      for (int i = 1; i < node->operands()->length(); i++) {
+        ComputeCharacterRanges(node->operands()->at(i), op_ranges, temp_ranges,
+                               zone);
+        CharacterRange::Subtract(result_ranges, op_ranges, temp_ranges, zone);
+        std::swap(*result_ranges, *temp_ranges);
+        temp_ranges->Rewind(0);
+        op_ranges->Rewind(0);
+      }
+#ifdef ENABLE_SLOW_DCHECKS
+      // Check that the result is equal to subtracting the union of all RHS
+      // operands from the LHS operand.
+      // TODO(pthier): It is unclear whether this variant is faster or slower
+      // than subtracting multiple ranges in practice.
+      ZoneList<CharacterRange>* lhs_range =
+          node->operands()->at(0)->IsClassRanges()
+              ? node->operands()->at(0)->AsClassRanges()->ranges(zone)
+              : node->operands()->at(0)->AsClassSetExpression()->ranges_;
+      ZoneList<CharacterRange>* rhs_union =
+          zone->template New<ZoneList<CharacterRange>>(2, zone);
+      for (int i = 1; i < node->operands()->length(); i++) {
+        ZoneList<CharacterRange>* op_range =
+            node->operands()->at(i)->IsClassRanges()
+                ? node->operands()->at(i)->AsClassRanges()->ranges(zone)
+                : node->operands()->at(i)->AsClassSetExpression()->ranges_;
+        rhs_union->AddAll(*op_range, zone);
+      }
+      CharacterRange::Canonicalize(rhs_union);
+      ZoneList<CharacterRange>* ranges_check =
+          zone->template New<ZoneList<CharacterRange>>(2, zone);
+      CharacterRange::Subtract(lhs_range, rhs_union, ranges_check, zone);
+      DCHECK(CharacterRange::Equals(result_ranges, ranges_check));
+
+      // Check that the result is equal to intersecting the LHS operand with the
+      // complemented union of all RHS operands
+      ZoneList<CharacterRange>* rhs_union_negated =
+          zone->template New<ZoneList<CharacterRange>>(rhs_union->length(),
+                                                       zone);
+      CharacterRange::Negate(rhs_union, rhs_union_negated, zone);
+      ranges_check->Rewind(0);
+      CharacterRange::Intersect(lhs_range, rhs_union_negated, ranges_check,
+                                zone);
+      DCHECK(CharacterRange::Equals(result_ranges, ranges_check));
+#endif
+      break;
+    }
+  }
+
+  if (node->is_negated()) {
+    CharacterRange::Negate(result_ranges, temp_ranges, zone);
+    std::swap(*result_ranges, *temp_ranges);
+    temp_ranges->Rewind(0);
+  }
+
+  DCHECK_EQ(temp_ranges->length(), 0);
+
+#ifdef ENABLE_SLOW_DCHECKS
+  // Cache results for DCHECKs.
+  node->ranges_ =
+      zone->template New<ZoneList<CharacterRange>>(*result_ranges, zone);
+#endif
+}
+
 // static
 void CharacterRange::Canonicalize(ZoneList<CharacterRange>* character_ranges) {
   if (character_ranges->length() <= 1) return;
@@ -1500,7 +1649,7 @@ void CharacterRange::Canonicalize(ZoneList<CharacterRange>* character_ranges) {
 }
 
 // static
-void CharacterRange::Negate(ZoneList<CharacterRange>* ranges,
+void CharacterRange::Negate(const ZoneList<CharacterRange>* ranges,
                             ZoneList<CharacterRange>* negated_ranges,
                             Zone* zone) {
   DCHECK(CharacterRange::IsCanonical(ranges));
@@ -1523,6 +1672,128 @@ void CharacterRange::Negate(ZoneList<CharacterRange>* ranges,
   }
 }
 
+// static
+void CharacterRange::Intersect(const ZoneList<CharacterRange>* lhs,
+                               const ZoneList<CharacterRange>* rhs,
+                               ZoneList<CharacterRange>* intersection,
+                               Zone* zone) {
+  DCHECK(CharacterRange::IsCanonical(lhs));
+  DCHECK(CharacterRange::IsCanonical(rhs));
+  DCHECK_EQ(0, intersection->length());
+  int lhs_index = 0;
+  int rhs_index = 0;
+  while (lhs_index < lhs->length() && rhs_index < rhs->length()) {
+    // Skip non-overlapping ranges.
+    if (lhs->at(lhs_index).to() < rhs->at(rhs_index).from()) {
+      lhs_index++;
+      continue;
+    }
+    if (rhs->at(rhs_index).to() < lhs->at(lhs_index).from()) {
+      rhs_index++;
+      continue;
+    }
+
+    base::uc32 from =
+        std::max(lhs->at(lhs_index).from(), rhs->at(rhs_index).from());
+    base::uc32 to = std::min(lhs->at(lhs_index).to(), rhs->at(rhs_index).to());
+    intersection->Add(CharacterRange::Range(from, to), zone);
+    if (to == lhs->at(lhs_index).to()) {
+      lhs_index++;
+    } else {
+      rhs_index++;
+    }
+  }
+
+  DCHECK(IsCanonical(intersection));
+}
+
+namespace {
+
+// Advance |index| and set |from| and |to| to the new range, if not out of
+// bounds of |range|, otherwise |from| is set to a code point beyond the legal
+// unicode character range.
+void SafeAdvanceRange(const ZoneList<CharacterRange>* range, int* index,
+                      base::uc32* from, base::uc32* to) {
+  ++(*index);
+  if (*index < range->length()) {
+    *from = range->at(*index).from();
+    *to = range->at(*index).to();
+  } else {
+    *from = kMaxCodePoint + 1;
+  }
+}
+
+}  // namespace
+
+// static
+void CharacterRange::Subtract(const ZoneList<CharacterRange>* src,
+                              const ZoneList<CharacterRange>* to_remove,
+                              ZoneList<CharacterRange>* result, Zone* zone) {
+  DCHECK(CharacterRange::IsCanonical(src));
+  DCHECK(CharacterRange::IsCanonical(to_remove));
+  DCHECK_EQ(0, result->length());
+  int src_index = 0;
+  int to_remove_index = 0;
+  base::uc32 from = src->at(src_index).from();
+  base::uc32 to = src->at(src_index).to();
+  while (src_index < src->length() && to_remove_index < to_remove->length()) {
+    CharacterRange remove_range = to_remove->at(to_remove_index);
+    if (remove_range.to() < from) {
+      // (a) Non-overlapping case, ignore current to_remove range.
+      //            |-------|
+      // |-------|
+      to_remove_index++;
+    } else if (to < remove_range.from()) {
+      // (b) Non-overlapping case, add full current range to result.
+      // |-------|
+      //            |-------|
+      result->Add(CharacterRange::Range(from, to), zone);
+      SafeAdvanceRange(src, &src_index, &from, &to);
+    } else if (from >= remove_range.from() && to <= remove_range.to()) {
+      // (c) Current to_remove range fully covers current range.
+      //   |---|
+      // |-------|
+      SafeAdvanceRange(src, &src_index, &from, &to);
+    } else if (from < remove_range.from() && to > remove_range.to()) {
+      // (d) Split current range.
+      // |-------|
+      //   |---|
+      result->Add(CharacterRange::Range(from, remove_range.from() - 1), zone);
+      from = remove_range.to() + 1;
+      to_remove_index++;
+    } else if (from < remove_range.from()) {
+      // (e) End current range.
+      // |-------|
+      //    |-------|
+      to = remove_range.from() - 1;
+      result->Add(CharacterRange::Range(from, to), zone);
+      SafeAdvanceRange(src, &src_index, &from, &to);
+    } else if (to > remove_range.to()) {
+      // (f) Modify start of current range.
+      //    |-------|
+      // |-------|
+      from = remove_range.to() + 1;
+      to_remove_index++;
+    } else {
+      UNREACHABLE();
+    }
+  }
+  // The last range needs special treatment after |to_remove| is exhausted, as
+  // |from| might have been modified by the last |to_remove| range and |to| was
+  // not yet known (i.e. cases d and f).
+  if (from <= to) {
+    result->Add(CharacterRange::Range(from, to), zone);
+  }
+  src_index++;
+
+  // Add remaining ranges after |to_remove| is exhausted.
+  for (; src_index < src->length(); src_index++) {
+    result->Add(src->at(src_index), zone);
+  }
+
+  DCHECK(IsCanonical(result));
+}
+
 // static
 void CharacterRange::ClampToOneByte(ZoneList<CharacterRange>* ranges) {
   DCHECK(IsCanonical(ranges));
@@ -1544,6 +1815,20 @@ void CharacterRange::ClampToOneByte(ZoneList<CharacterRange>* ranges) {
   ranges->Rewind(n);
 }
 
+// static
+bool CharacterRange::Equals(const ZoneList<CharacterRange>* lhs,
+                            const ZoneList<CharacterRange>* rhs) {
+  DCHECK(IsCanonical(lhs));
+  DCHECK(IsCanonical(rhs));
+  if (lhs->length() != rhs->length()) return false;
+
+  for (int i = 0; i < lhs->length(); i++) {
+    if (lhs->at(i) != rhs->at(i)) return false;
+  }
+
+  return true;
+}
+
 namespace {
 
 // Scoped object to keep track of how much we unroll quantifier loops in the
diff --git a/deps/v8/src/regexp/regexp-compiler.cc b/deps/v8/src/regexp/regexp-compiler.cc
index 93cbd9620a0f61..6b76c8ab1ad969 100644
--- a/deps/v8/src/regexp/regexp-compiler.cc
+++ b/deps/v8/src/regexp/regexp-compiler.cc
@@ -196,8 +196,8 @@ void RegExpAtom::AppendToText(RegExpText* text, Zone* zone) {
   text->AddElement(TextElement::Atom(this), zone);
 }
 
-void RegExpCharacterClass::AppendToText(RegExpText* text, Zone* zone) {
-  text->AddElement(TextElement::CharClass(this), zone);
+void RegExpClassRanges::AppendToText(RegExpText* text, Zone* zone) {
+  text->AddElement(TextElement::ClassRanges(this), zone);
 }
 
 void RegExpText::AppendToText(RegExpText* text, Zone* zone) {
@@ -209,8 +209,8 @@ TextElement TextElement::Atom(RegExpAtom* atom) {
   return TextElement(ATOM, atom);
 }
 
-TextElement TextElement::CharClass(RegExpCharacterClass* char_class) {
-  return TextElement(CHAR_CLASS, char_class);
+TextElement TextElement::ClassRanges(RegExpClassRanges* class_ranges) {
+  return TextElement(CLASS_RANGES, class_ranges);
 }
 
 int TextElement::length() const {
@@ -218,7 +218,7 @@ int TextElement::length() const {
     case ATOM:
       return atom()->length();
 
-    case CHAR_CLASS:
+    case CLASS_RANGES:
       return 1;
   }
   UNREACHABLE();
@@ -1215,11 +1215,11 @@ void GenerateBranches(RegExpMacroAssembler* masm, ZoneList<base::uc32>* ranges,
   }
 }
 
-void EmitCharClass(RegExpMacroAssembler* macro_assembler,
-                   RegExpCharacterClass* cc, bool one_byte, Label* on_failure,
-                   int cp_offset, bool check_offset, bool preloaded,
-                   Zone* zone) {
-  ZoneList<CharacterRange>* ranges = cc->ranges(zone);
+void EmitClassRanges(RegExpMacroAssembler* macro_assembler,
+                     RegExpClassRanges* cr, bool one_byte, Label* on_failure,
+                     int cp_offset, bool check_offset, bool preloaded,
+                     Zone* zone) {
+  ZoneList<CharacterRange>* ranges = cr->ranges(zone);
   CharacterRange::Canonicalize(ranges);
 
   // Now that all processing (like case-insensitivity) is done, clamp the
@@ -1228,7 +1228,7 @@ void EmitCharClass(RegExpMacroAssembler* macro_assembler,
 
   const int ranges_length = ranges->length();
   if (ranges_length == 0) {
-    if (!cc->is_negated()) {
+    if (!cr->is_negated()) {
       macro_assembler->GoTo(on_failure);
     }
     if (check_offset) {
@@ -1239,7 +1239,7 @@ void EmitCharClass(RegExpMacroAssembler* macro_assembler,
 
   const base::uc32 max_char = MaxCodeUnit(one_byte);
   if (ranges_length == 1 && ranges->at(0).IsEverything(max_char)) {
-    if (cc->is_negated()) {
+    if (cr->is_negated()) {
       macro_assembler->GoTo(on_failure);
     } else {
       // This is a common case hit by non-anchored expressions.
@@ -1254,8 +1254,8 @@ void EmitCharClass(RegExpMacroAssembler* macro_assembler,
     macro_assembler->LoadCurrentCharacter(cp_offset, on_failure, check_offset);
   }
 
-  if (cc->is_standard(zone) && macro_assembler->CheckSpecialCharacterClass(
-                                   cc->standard_type(), on_failure)) {
+  if (cr->is_standard(zone) && macro_assembler->CheckSpecialClassRanges(
+                                   cr->standard_type(), on_failure)) {
     return;
   }
 
@@ -1266,7 +1266,7 @@ void EmitCharClass(RegExpMacroAssembler* macro_assembler,
     // Note the flipped logic below (we check InRange if negated, NotInRange if
     // not negated); this is necessary since the method falls through on
     // failure whereas we want to fall through on success.
-    if (cc->is_negated()) {
+    if (cr->is_negated()) {
       if (macro_assembler->CheckCharacterInRangeArray(ranges, on_failure)) {
         return;
       }
@@ -1283,7 +1283,7 @@ void EmitCharClass(RegExpMacroAssembler* macro_assembler,
   ZoneList<base::uc32>* range_boundaries =
       zone->New<ZoneList<base::uc32>>(ranges_length * 2, zone);
 
-  bool zeroth_entry_is_failure = !cc->is_negated();
+  bool zeroth_entry_is_failure = !cr->is_negated();
 
   for (int i = 0; i < ranges_length; i++) {
     CharacterRange& range = ranges->at(i);
@@ -1659,7 +1659,7 @@ void TextNode::GetQuickCheckDetails(QuickCheckDetails* details,
     } else {
       QuickCheckDetails::Position* pos =
           details->positions(characters_filled_in);
-      RegExpCharacterClass* tree = elm.char_class();
+      RegExpClassRanges* tree = elm.class_ranges();
       ZoneList<CharacterRange>* ranges = tree->ranges(zone());
       if (tree->is_negated() || ranges->is_empty()) {
         // A quick check uses multi-character mask and compare.  There is no
@@ -1887,13 +1887,13 @@ RegExpNode* TextNode::FilterOneByte(int depth, RegExpFlags flags) {
         writable_quarks[j] = c;
       }
     } else {
-      DCHECK(elm.text_type() == TextElement::CHAR_CLASS);
-      RegExpCharacterClass* cc = elm.char_class();
-      ZoneList<CharacterRange>* ranges = cc->ranges(zone());
+      DCHECK(elm.text_type() == TextElement::CLASS_RANGES);
+      RegExpClassRanges* cr = elm.class_ranges();
+      ZoneList<CharacterRange>* ranges = cr->ranges(zone());
       CharacterRange::Canonicalize(ranges);
       // Now they are in order so we only need to look at the first.
       int range_count = ranges->length();
-      if (cc->is_negated()) {
+      if (cr->is_negated()) {
         if (range_count != 0 && ranges->at(0).from() == 0 &&
             ranges->at(0).to() >= String::kMaxOneByteCharCode) {
           // This will be handled in a later filter.
@@ -2091,7 +2091,7 @@ namespace {
 // Check for [0-9A-Z_a-z].
 void EmitWordCheck(RegExpMacroAssembler* assembler, Label* word,
                    Label* non_word, bool fall_through_on_word) {
-  if (assembler->CheckSpecialCharacterClass(
+  if (assembler->CheckSpecialClassRanges(
           fall_through_on_word ? StandardCharacterSet::kWord
                                : StandardCharacterSet::kNotWord,
           fall_through_on_word ? non_word : word)) {
@@ -2139,8 +2139,8 @@ void EmitHat(RegExpCompiler* compiler, RegExpNode* on_success, Trace* trace) {
   const bool can_skip_bounds_check = !may_be_at_or_before_subject_string_start;
   assembler->LoadCurrentCharacter(new_trace.cp_offset() - 1,
                                   new_trace.backtrack(), can_skip_bounds_check);
-  if (!assembler->CheckSpecialCharacterClass(
-          StandardCharacterSet::kLineTerminator, new_trace.backtrack())) {
+  if (!assembler->CheckSpecialClassRanges(StandardCharacterSet::kLineTerminator,
+                                          new_trace.backtrack())) {
     // Newline means \n, \r, 0x2028 or 0x2029.
     if (!compiler->one_byte()) {
       assembler->CheckCharacterAfterAnd(0x2028, 0xFFFE, &ok);
@@ -2388,14 +2388,14 @@ void TextNode::TextEmitPass(RegExpCompiler* compiler, TextEmitPassType pass,
         if (bounds_checked) UpdateBoundsCheck(cp_offset + j, checked_up_to);
       }
     } else {
-      DCHECK_EQ(TextElement::CHAR_CLASS, elm.text_type());
+      DCHECK_EQ(TextElement::CLASS_RANGES, elm.text_type());
       if (pass == CHARACTER_CLASS_MATCH) {
         if (first_element_checked && i == 0) continue;
         if (DeterminedAlready(quick_check, elm.cp_offset())) continue;
-        RegExpCharacterClass* cc = elm.char_class();
+        RegExpClassRanges* cr = elm.class_ranges();
         bool bounds_check = *checked_up_to < cp_offset || read_backward();
-        EmitCharClass(assembler, cc, one_byte, backtrack, cp_offset,
-                      bounds_check, preloaded, zone());
+        EmitClassRanges(assembler, cr, one_byte, backtrack, cp_offset,
+                        bounds_check, preloaded, zone());
         UpdateBoundsCheck(cp_offset, checked_up_to);
       }
     }
@@ -2422,8 +2422,8 @@ TextNode* TextNode::CreateForCharacterRanges(Zone* zone,
                                              RegExpNode* on_success) {
   DCHECK_NOT_NULL(ranges);
   // TODO(jgruber): There's no fundamental need to create this
-  // RegExpCharacterClass; we could refactor to avoid the allocation.
-  return zone->New<TextNode>(zone->New<RegExpCharacterClass>(zone, ranges),
+  // RegExpClassRanges; we could refactor to avoid the allocation.
+  return zone->New<TextNode>(zone->New<RegExpClassRanges>(zone, ranges),
                              read_backward, on_success);
 }
 
@@ -2432,11 +2432,11 @@ TextNode* TextNode::CreateForSurrogatePair(
     bool read_backward, RegExpNode* on_success) {
   ZoneList<CharacterRange>* lead_ranges = CharacterRange::List(zone, lead);
   ZoneList<TextElement>* elms = zone->New<ZoneList<TextElement>>(2, zone);
-  elms->Add(TextElement::CharClass(
-                zone->New<RegExpCharacterClass>(zone, lead_ranges)),
-            zone);
-  elms->Add(TextElement::CharClass(
-                zone->New<RegExpCharacterClass>(zone, trail_ranges)),
+  elms->Add(
+      TextElement::ClassRanges(zone->New<RegExpClassRanges>(zone, lead_ranges)),
+      zone);
+  elms->Add(TextElement::ClassRanges(
+                zone->New<RegExpClassRanges>(zone, trail_ranges)),
             zone);
   return zone->New<TextNode>(elms, read_backward, on_success);
 }
@@ -2446,11 +2446,11 @@ TextNode* TextNode::CreateForSurrogatePair(
     bool read_backward, RegExpNode* on_success) {
   ZoneList<CharacterRange>* trail_ranges = CharacterRange::List(zone, trail);
   ZoneList<TextElement>* elms = zone->New<ZoneList<TextElement>>(2, zone);
-  elms->Add(TextElement::CharClass(
-                zone->New<RegExpCharacterClass>(zone, lead_ranges)),
-            zone);
-  elms->Add(TextElement::CharClass(
-                zone->New<RegExpCharacterClass>(zone, trail_ranges)),
+  elms->Add(
+      TextElement::ClassRanges(zone->New<RegExpClassRanges>(zone, lead_ranges)),
+      zone);
+  elms->Add(TextElement::ClassRanges(
+                zone->New<RegExpClassRanges>(zone, trail_ranges)),
             zone);
   return zone->New<TextNode>(elms, read_backward, on_success);
 }
@@ -2534,12 +2534,12 @@ void TextNode::MakeCaseIndependent(Isolate* isolate, bool is_one_byte,
   int element_count = elements()->length();
   for (int i = 0; i < element_count; i++) {
     TextElement elm = elements()->at(i);
-    if (elm.text_type() == TextElement::CHAR_CLASS) {
-      RegExpCharacterClass* cc = elm.char_class();
+    if (elm.text_type() == TextElement::CLASS_RANGES) {
+      RegExpClassRanges* cr = elm.class_ranges();
       // None of the standard character classes is different in the case
       // independent case and it slows us down if we don't know that.
-      if (cc->is_standard(zone())) continue;
-      ZoneList<CharacterRange>* ranges = cc->ranges(zone());
+      if (cr->is_standard(zone())) continue;
+      ZoneList<CharacterRange>* ranges = cr->ranges(zone());
       CharacterRange::AddCaseEquivalents(isolate, zone(), ranges, is_one_byte);
     }
   }
@@ -2552,8 +2552,8 @@ RegExpNode* TextNode::GetSuccessorOfOmnivorousTextNode(
   if (read_backward()) return nullptr;
   if (elements()->length() != 1) return nullptr;
   TextElement elm = elements()->at(0);
-  if (elm.text_type() != TextElement::CHAR_CLASS) return nullptr;
-  RegExpCharacterClass* node = elm.char_class();
+  if (elm.text_type() != TextElement::CLASS_RANGES) return nullptr;
+  RegExpClassRanges* node = elm.class_ranges();
   ZoneList<CharacterRange>* ranges = node->ranges(zone());
   CharacterRange::Canonicalize(ranges);
   if (node->is_negated()) {
@@ -3479,7 +3479,7 @@ void BackReferenceNode::Emit(RegExpCompiler* compiler, Trace* trace) {
 
   DCHECK_EQ(start_reg_ + 1, end_reg_);
   if (IsIgnoreCase(flags_)) {
-    bool unicode = IsUnicode(flags_);
+    bool unicode = IsEitherUnicode(flags_);
     assembler->CheckNotBackReferenceIgnoreCase(start_reg_, read_backward(),
                                                unicode, trace->backtrack());
   } else {
@@ -3490,7 +3490,7 @@ void BackReferenceNode::Emit(RegExpCompiler* compiler, Trace* trace) {
   if (read_backward()) trace->set_at_start(Trace::UNKNOWN);
 
   // Check that the back reference does not end inside a surrogate pair.
-  if (IsUnicode(flags_) && !compiler->one_byte()) {
+  if (IsEitherUnicode(flags_) && !compiler->one_byte()) {
     assembler->CheckNotInSurrogatePair(trace->cp_offset(), trace->backtrack());
   }
   on_success()->Emit(compiler, trace);
@@ -3856,10 +3856,10 @@ void TextNode::FillInBMInfo(Isolate* isolate, int initial_offset, int budget,
         }
       }
     } else {
-      DCHECK_EQ(TextElement::CHAR_CLASS, text.text_type());
-      RegExpCharacterClass* char_class = text.char_class();
-      ZoneList<CharacterRange>* ranges = char_class->ranges(zone());
-      if (char_class->is_negated()) {
+      DCHECK_EQ(TextElement::CLASS_RANGES, text.text_type());
+      RegExpClassRanges* class_ranges = text.class_ranges();
+      ZoneList<CharacterRange>* ranges = class_ranges->ranges(zone());
+      if (class_ranges->is_negated()) {
         bm->SetAll(offset);
       } else {
         for (int k = 0; k < ranges->length(); k++) {
@@ -3919,8 +3919,8 @@ RegExpNode* RegExpCompiler::PreprocessRegExp(RegExpCompileData* data,
     // this expression is anchored at the beginning or sticky.
     RegExpNode* loop_node = RegExpQuantifier::ToNode(
         0, RegExpTree::kInfinity, false,
-        zone()->New<RegExpCharacterClass>(StandardCharacterSet::kEverything),
-        this, captured_body, data->contains_anchor);
+        zone()->New<RegExpClassRanges>(StandardCharacterSet::kEverything), this,
+        captured_body, data->contains_anchor);
 
     if (data->contains_anchor) {
       // Unroll loop once, to take care of the case that might start
@@ -3928,7 +3928,7 @@ RegExpNode* RegExpCompiler::PreprocessRegExp(RegExpCompileData* data,
       ChoiceNode* first_step_node = zone()->New<ChoiceNode>(2, zone());
       first_step_node->AddAlternative(GuardedAlternative(captured_body));
       first_step_node->AddAlternative(GuardedAlternative(zone()->New<TextNode>(
-          zone()->New<RegExpCharacterClass>(StandardCharacterSet::kEverything),
+          zone()->New<RegExpClassRanges>(StandardCharacterSet::kEverything),
           false, loop_node)));
       node = first_step_node;
     } else {
@@ -3942,7 +3942,7 @@ RegExpNode* RegExpCompiler::PreprocessRegExp(RegExpCompileData* data,
     if (node != nullptr) {
       node = node->FilterOneByte(RegExpCompiler::kMaxRecursion, flags);
     }
-  } else if (IsUnicode(flags) && (IsGlobal(flags) || IsSticky(flags))) {
+  } else if (IsEitherUnicode(flags) && (IsGlobal(flags) || IsSticky(flags))) {
     node = OptionallyStepBackToLeadSurrogate(node);
   }
 
diff --git a/deps/v8/src/regexp/regexp-compiler.h b/deps/v8/src/regexp/regexp-compiler.h
index 421fc9457c047d..39b1c946fb5b91 100644
--- a/deps/v8/src/regexp/regexp-compiler.h
+++ b/deps/v8/src/regexp/regexp-compiler.h
@@ -51,9 +51,9 @@ constexpr int kPatternTooShortForBoyerMoore = 2;
 }  // namespace regexp_compiler_constants
 
 inline bool NeedsUnicodeCaseEquivalents(RegExpFlags flags) {
-  // Both unicode and ignore_case flags are set. We need to use ICU to find
-  // the closure over case equivalents.
-  return IsUnicode(flags) && IsIgnoreCase(flags);
+  // Both unicode (or unicode sets) and ignore_case flags are set. We need to
+  // use ICU to find the closure over case equivalents.
+  return IsEitherUnicode(flags) && IsIgnoreCase(flags);
 }
 
 // Details of a quick mask-compare check that can look ahead in the
diff --git a/deps/v8/src/regexp/regexp-dotprinter.cc b/deps/v8/src/regexp/regexp-dotprinter.cc
index bf651963af8d34..3ce86cd619e829 100644
--- a/deps/v8/src/regexp/regexp-dotprinter.cc
+++ b/deps/v8/src/regexp/regexp-dotprinter.cc
@@ -135,8 +135,8 @@ void DotPrinterImpl::VisitText(TextNode* that) {
         }
         break;
       }
-      case TextElement::CHAR_CLASS: {
-        RegExpCharacterClass* node = elm.char_class();
+      case TextElement::CLASS_RANGES: {
+        RegExpClassRanges* node = elm.class_ranges();
         os_ << "[";
         if (node->is_negated()) os_ << "^";
         for (int j = 0; j < node->ranges(zone)->length(); j++) {
diff --git a/deps/v8/src/regexp/regexp-error.h b/deps/v8/src/regexp/regexp-error.h
index 6485e74bb65204..5c4ea28d7da13c 100644
--- a/deps/v8/src/regexp/regexp-error.h
+++ b/deps/v8/src/regexp/regexp-error.h
@@ -42,7 +42,9 @@ namespace internal {
   T(InvalidClassPropertyName, "Invalid property name in character class") \
   T(InvalidCharacterClass, "Invalid character class")                     \
   T(UnterminatedCharacterClass, "Unterminated character class")           \
-  T(OutOfOrderCharacterClass, "Range out of order in character class")
+  T(OutOfOrderCharacterClass, "Range out of order in character class")    \
+  T(InvalidClassSetOperation, "Invalid set operation in character class") \
+  T(InvalidCharacterInClass, "Invalid character in character class")
 
 enum class RegExpError : uint32_t {
 #define TEMPLATE(NAME, STRING) k##NAME,
diff --git a/deps/v8/src/regexp/regexp-flags.h b/deps/v8/src/regexp/regexp-flags.h
index 4f9bff2d25afb6..5eddfec6baa384 100644
--- a/deps/v8/src/regexp/regexp-flags.h
+++ b/deps/v8/src/regexp/regexp-flags.h
@@ -57,6 +57,10 @@ DEFINE_OPERATORS_FOR_FLAGS(RegExpFlags)
 REGEXP_FLAG_LIST(V)
 #undef V
 
+constexpr bool IsEitherUnicode(RegExpFlags f) {
+  return IsUnicode(f) || IsUnicodeSets(f);
+}
+
 // clang-format off
 #define V(Lower, Camel, LowerCamel, Char, Bit) \
   c == Char ? RegExpFlag::k##Camel :
diff --git a/deps/v8/src/regexp/regexp-macro-assembler-tracer.cc b/deps/v8/src/regexp/regexp-macro-assembler-tracer.cc
index 916cedb640d369..50a467a9801083 100644
--- a/deps/v8/src/regexp/regexp-macro-assembler-tracer.cc
+++ b/deps/v8/src/regexp/regexp-macro-assembler-tracer.cc
@@ -392,11 +392,10 @@ void RegExpMacroAssemblerTracer::CheckPosition(int cp_offset,
   assembler_->CheckPosition(cp_offset, on_outside_input);
 }
 
-bool RegExpMacroAssemblerTracer::CheckSpecialCharacterClass(
+bool RegExpMacroAssemblerTracer::CheckSpecialClassRanges(
     StandardCharacterSet type, Label* on_no_match) {
-  bool supported = assembler_->CheckSpecialCharacterClass(type,
-                                                          on_no_match);
-  PrintF(" CheckSpecialCharacterClass(type='%c', label[%08x]): %s;\n",
+  bool supported = assembler_->CheckSpecialClassRanges(type, on_no_match);
+  PrintF(" CheckSpecialClassRanges(type='%c', label[%08x]): %s;\n",
          static_cast<char>(type), LabelToInt(on_no_match),
          supported ? "true" : "false");
   return supported;
diff --git a/deps/v8/src/regexp/regexp-macro-assembler-tracer.h b/deps/v8/src/regexp/regexp-macro-assembler-tracer.h
index 82e6b9e89e963a..5f9da291448add 100644
--- a/deps/v8/src/regexp/regexp-macro-assembler-tracer.h
+++ b/deps/v8/src/regexp/regexp-macro-assembler-tracer.h
@@ -54,8 +54,8 @@ class RegExpMacroAssemblerTracer: public RegExpMacroAssembler {
                                      Label* on_not_in_range) override;
   void CheckBitInTable(Handle<ByteArray> table, Label* on_bit_set) override;
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
   void GoTo(Label* label) override;
diff --git a/deps/v8/src/regexp/regexp-macro-assembler.h b/deps/v8/src/regexp/regexp-macro-assembler.h
index e27e90b8d0d342..e75489398fe87e 100644
--- a/deps/v8/src/regexp/regexp-macro-assembler.h
+++ b/deps/v8/src/regexp/regexp-macro-assembler.h
@@ -114,8 +114,8 @@ class RegExpMacroAssembler {
   // character. Returns false if the type of special character class does
   // not have custom support.
   // May clobber the current loaded character.
-  virtual bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                          Label* on_no_match) {
+  virtual bool CheckSpecialClassRanges(StandardCharacterSet type,
+                                       Label* on_no_match) {
     return false;
   }
 
diff --git a/deps/v8/src/regexp/regexp-nodes.h b/deps/v8/src/regexp/regexp-nodes.h
index 121980b41108be..b3d6e1aa80f885 100644
--- a/deps/v8/src/regexp/regexp-nodes.h
+++ b/deps/v8/src/regexp/regexp-nodes.h
@@ -397,12 +397,11 @@ class TextNode : public SeqRegExpNode {
   TextNode(ZoneList<TextElement>* elms, bool read_backward,
            RegExpNode* on_success)
       : SeqRegExpNode(on_success), elms_(elms), read_backward_(read_backward) {}
-  TextNode(RegExpCharacterClass* that, bool read_backward,
-           RegExpNode* on_success)
+  TextNode(RegExpClassRanges* that, bool read_backward, RegExpNode* on_success)
       : SeqRegExpNode(on_success),
         elms_(zone()->New<ZoneList<TextElement>>(1, zone())),
         read_backward_(read_backward) {
-    elms_->Add(TextElement::CharClass(that), zone());
+    elms_->Add(TextElement::ClassRanges(that), zone());
   }
   // Create TextNode for a single character class for the given ranges.
   static TextNode* CreateForCharacterRanges(Zone* zone,
diff --git a/deps/v8/src/regexp/regexp-parser.cc b/deps/v8/src/regexp/regexp-parser.cc
index 44652f6767d898..9bc0df663aea19 100644
--- a/deps/v8/src/regexp/regexp-parser.cc
+++ b/deps/v8/src/regexp/regexp-parser.cc
@@ -7,7 +7,6 @@
 #include "src/base/small-vector.h"
 #include "src/execution/isolate.h"
 #include "src/objects/string-inl.h"
-#include "src/regexp/property-sequences.h"
 #include "src/regexp/regexp-ast.h"
 #include "src/regexp/regexp-macro-assembler.h"
 #include "src/regexp/regexp.h"
@@ -33,6 +32,16 @@ enum class InClassEscapeState {
   kNotInClass,
 };
 
+// The production used to derive ClassSetOperand.
+enum class ClassSetOperandType {
+  kClassSetCharacter,
+  kClassStringDisjunction,
+  kNestedClass,
+  kCharacterClassEscape,  // \ CharacterClassEscape is a special nested class,
+                          // as we can fold it directly into another range.
+  kClassSetRange
+};
+
 // Accumulates RegExp atoms and assertions into lists of terms and alternatives.
 class RegExpBuilder {
  public:
@@ -48,8 +57,8 @@ class RegExpBuilder {
   // "Adds" an empty expression. Does nothing except consume a
   // following quantifier
   void AddEmpty();
-  void AddCharacterClass(RegExpCharacterClass* cc);
-  void AddCharacterClassForDesugaring(base::uc32 c);
+  void AddClassRanges(RegExpClassRanges* cc);
+  void AddClassRangesForDesugaring(base::uc32 c);
   void AddAtom(RegExpTree* tree);
   void AddTerm(RegExpTree* tree);
   void AddAssertion(RegExpTree* tree);
@@ -71,10 +80,15 @@ class RegExpBuilder {
   void FlushPendingSurrogate();
   void FlushCharacters();
   void FlushTerms();
-  bool NeedsDesugaringForUnicode(RegExpCharacterClass* cc);
+  bool NeedsDesugaringForUnicode(RegExpClassRanges* cc);
   bool NeedsDesugaringForIgnoreCase(base::uc32 c);
+  bool IsUnicodeMode() const {
+    // Either /v or /u enable UnicodeMode
+    // TODO(v8:11935): Change permalink once proposal is in stage 4.
+    // https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#sec-parsepattern
+    return IsUnicode(flags_) || IsUnicodeSets(flags_);
+  }
   Zone* zone() const { return zone_; }
-  bool unicode() const { return IsUnicode(flags_); }
 
   Zone* const zone_;
   bool pending_empty_ = false;
@@ -211,16 +225,8 @@ class RegExpParserImpl final {
                              const ZoneVector<char>& name_1,
                              const ZoneVector<char>& name_2);
 
-  RegExpTree* ParseCharacterClass(const RegExpBuilder* state);
-
-  base::uc32 ParseOctalLiteral();
-
-  // Tries to parse the input as a back reference.  If successful it
-  // stores the result in the output parameter and returns true.  If
-  // it fails it will push back the characters read so the same characters
-  // can be reparsed.
-  bool ParseBackReferenceIndex(int* index_out);
-
+  RegExpTree* ParseClassRanges(ZoneList<CharacterRange>* ranges,
+                               bool add_unicode_case_equivalents);
   // Parse inside a class. Either add escaped class to the range, or return
   // false and pass parsed single character through |char_out|.
   void ParseClassEscape(ZoneList<CharacterRange>* ranges, Zone* zone,
@@ -232,10 +238,35 @@ class RegExpParserImpl final {
                                     ZoneList<CharacterRange>* ranges,
                                     Zone* zone,
                                     bool add_unicode_case_equivalents);
+  RegExpTree* ParseClassStringDisjunction();
+  RegExpTree* ParseClassSetOperand(const RegExpBuilder* builder,
+                                   ClassSetOperandType* type_out);
+  RegExpTree* ParseClassSetOperand(const RegExpBuilder* builder,
+                                   ClassSetOperandType* type_out,
+                                   ZoneList<CharacterRange>* ranges);
   // Parses and returns a single escaped character.
   base::uc32 ParseCharacterEscape(InClassEscapeState in_class_escape_state,
                                   bool* is_escaped_unicode_character);
 
+  RegExpTree* ParseClassUnion(const RegExpBuilder* builder, bool is_negated,
+                              RegExpTree* first_operand,
+                              ClassSetOperandType first_operand_type,
+                              ZoneList<CharacterRange>* ranges);
+  RegExpTree* ParseClassIntersection(const RegExpBuilder* builder,
+                                     bool is_negated,
+                                     RegExpTree* first_operand);
+  RegExpTree* ParseClassSubtraction(const RegExpBuilder* builder,
+                                    bool is_negated, RegExpTree* first_operand);
+  RegExpTree* ParseCharacterClass(const RegExpBuilder* state);
+
+  base::uc32 ParseOctalLiteral();
+
+  // Tries to parse the input as a back reference.  If successful it
+  // stores the result in the output parameter and returns true.  If
+  // it fails it will push back the characters read so the same characters
+  // can be reparsed.
+  bool ParseBackReferenceIndex(int* index_out);
+
   RegExpTree* ReportError(RegExpError error);
   void Advance();
   void Advance(int dist);
@@ -250,9 +281,20 @@ class RegExpParserImpl final {
   int captures_started() const { return captures_started_; }
   int position() const { return next_pos_ - 1; }
   bool failed() const { return failed_; }
-  bool unicode() const { return IsUnicode(top_level_flags_) || force_unicode_; }
+  bool IsUnicodeMode() const {
+    // Either /v or /u enable UnicodeMode
+    // TODO(v8:11935): Change permalink once proposal is in stage 4.
+    // https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#sec-parsepattern
+    return IsUnicode(top_level_flags_) || IsUnicodeSets(top_level_flags_) ||
+           force_unicode_;
+  }
+  bool unicode_sets() const { return IsUnicodeSets(top_level_flags_); }
+  bool ignore_case() const { return IsIgnoreCase(top_level_flags_); }
 
   static bool IsSyntaxCharacterOrSlash(base::uc32 c);
+  static bool IsClassSetSyntaxCharacter(base::uc32 c);
+  static bool IsClassSetReservedPunctuator(base::uc32 c);
+  bool IsClassSetReservedDoublePunctuator(base::uc32 c);
 
   static const base::uc32 kEndMarker = (1 << 21);
 
@@ -346,13 +388,7 @@ class RegExpParserImpl final {
   bool failed_;
   const uintptr_t stack_limit_;
 
-  friend bool RegExpParser::ParseRegExpFromHeapString(Isolate*, Zone*,
-                                                      Handle<String>,
-                                                      RegExpFlags,
-                                                      RegExpCompileData*);
-  friend bool RegExpParser::VerifyRegExpSyntax<CharT>(
-      Zone*, uintptr_t, const CharT*, int, RegExpFlags, RegExpCompileData*,
-      const DisallowGarbageCollection&);
+  friend class v8::internal::RegExpParser;
 };
 
 template <class CharT>
@@ -398,8 +434,8 @@ inline base::uc32 RegExpParserImpl<base::uc16>::ReadNext() {
   base::uc16 c0 = InputAt(position);
   base::uc32 result = c0;
   position++;
-  // Read the whole surrogate pair in case of unicode flag, if possible.
-  if (unicode() && position < input_length() &&
+  // Read the whole surrogate pair in case of unicode mode, if possible.
+  if (IsUnicodeMode() && position < input_length() &&
       unibrow::Utf16::IsLeadSurrogate(c0)) {
     base::uc16 c1 = InputAt(position);
     if (unibrow::Utf16::IsTrailSurrogate(c1)) {
@@ -442,7 +478,7 @@ void RegExpParserImpl<CharT>::Advance() {
 
 template <class CharT>
 void RegExpParserImpl<CharT>::RewindByOneCodepoint() {
-  if (current() == kEndMarker) return;
+  if (!has_more()) return;
   // Rewinds by one code point, i.e.: two code units if `current` is outside
   // the basic multilingual plane (= composed of a lead and trail surrogate),
   // or one code unit otherwise.
@@ -464,6 +500,7 @@ void RegExpParserImpl<CharT>::Advance(int dist) {
   Advance();
 }
 
+// static
 template <class CharT>
 bool RegExpParserImpl<CharT>::IsSyntaxCharacterOrSlash(base::uc32 c) {
   switch (c) {
@@ -489,6 +526,86 @@ bool RegExpParserImpl<CharT>::IsSyntaxCharacterOrSlash(base::uc32 c) {
   return false;
 }
 
+// static
+template <class CharT>
+bool RegExpParserImpl<CharT>::IsClassSetSyntaxCharacter(base::uc32 c) {
+  switch (c) {
+    case '(':
+    case ')':
+    case '[':
+    case ']':
+    case '{':
+    case '}':
+    case '/':
+    case '-':
+    case '\\':
+    case '|':
+      return true;
+    default:
+      break;
+  }
+  return false;
+}
+
+// static
+template <class CharT>
+bool RegExpParserImpl<CharT>::IsClassSetReservedPunctuator(base::uc32 c) {
+  switch (c) {
+    case '&':
+    case '-':
+    case '!':
+    case '#':
+    case '%':
+    case ',':
+    case ':':
+    case ';':
+    case '<':
+    case '=':
+    case '>':
+    case '@':
+    case '`':
+    case '~':
+      return true;
+    default:
+      break;
+  }
+  return false;
+}
+
+template <class CharT>
+bool RegExpParserImpl<CharT>::IsClassSetReservedDoublePunctuator(base::uc32 c) {
+#define DOUBLE_PUNCTUATOR_CASE(Char) \
+  case Char:                         \
+    return Next() == Char
+
+  switch (c) {
+    DOUBLE_PUNCTUATOR_CASE('&');
+    DOUBLE_PUNCTUATOR_CASE('!');
+    DOUBLE_PUNCTUATOR_CASE('#');
+    DOUBLE_PUNCTUATOR_CASE('$');
+    DOUBLE_PUNCTUATOR_CASE('%');
+    DOUBLE_PUNCTUATOR_CASE('*');
+    DOUBLE_PUNCTUATOR_CASE('+');
+    DOUBLE_PUNCTUATOR_CASE(',');
+    DOUBLE_PUNCTUATOR_CASE('.');
+    DOUBLE_PUNCTUATOR_CASE(':');
+    DOUBLE_PUNCTUATOR_CASE(';');
+    DOUBLE_PUNCTUATOR_CASE('<');
+    DOUBLE_PUNCTUATOR_CASE('=');
+    DOUBLE_PUNCTUATOR_CASE('>');
+    DOUBLE_PUNCTUATOR_CASE('?');
+    DOUBLE_PUNCTUATOR_CASE('@');
+    DOUBLE_PUNCTUATOR_CASE('^');
+    DOUBLE_PUNCTUATOR_CASE('`');
+    DOUBLE_PUNCTUATOR_CASE('~');
+    default:
+      break;
+  }
+#undef DOUBLE_PUNCTUATOR_CASE
+
+  return false;
+}
+
 template <class CharT>
 RegExpTree* RegExpParserImpl<CharT>::ReportError(RegExpError error) {
   if (failed_) return nullptr;  // Do not overwrite any existing error.
@@ -635,9 +752,9 @@ RegExpTree* RegExpParserImpl<CharT>::ParseDisjunction() {
               StandardCharacterSet::kNotLineTerminator, ranges, false, zone());
         }
 
-        RegExpCharacterClass* cc =
-            zone()->template New<RegExpCharacterClass>(zone(), ranges);
-        builder->AddCharacterClass(cc);
+        RegExpClassRanges* cc =
+            zone()->template New<RegExpClassRanges>(zone(), ranges);
+        builder->AddClassRanges(cc);
         break;
       }
       case '(': {
@@ -647,7 +764,12 @@ RegExpTree* RegExpParserImpl<CharT>::ParseDisjunction() {
       }
       case '[': {
         RegExpTree* cc = ParseCharacterClass(builder CHECK_FAILED);
-        builder->AddCharacterClass(cc->AsCharacterClass());
+        if (cc->IsClassRanges()) {
+          builder->AddClassRanges(cc->AsClassRanges());
+        } else {
+          DCHECK(cc->IsClassSetExpression());
+          builder->AddTerm(cc);
+        }
         break;
       }
       // Atom ::
@@ -697,9 +819,9 @@ RegExpTree* RegExpParserImpl<CharT>::ParseDisjunction() {
               }
               break;
             }
-            // With /u, no identity escapes except for syntax characters
+            // With /u and /v, no identity escapes except for syntax characters
             // are allowed. Otherwise, all identity escapes are allowed.
-            if (unicode()) {
+            if (IsUnicodeMode()) {
               return ReportError(RegExpError::kInvalidEscape);
             }
             base::uc32 first_digit = Next();
@@ -712,8 +834,8 @@ RegExpTree* RegExpParserImpl<CharT>::ParseDisjunction() {
           }
           case '0': {
             Advance();
-            if (unicode() && Next() >= '0' && Next() <= '9') {
-              // With /u, decimal escape with leading 0 are not parsed as octal.
+            if (IsUnicodeMode() && Next() >= '0' && Next() <= '9') {
+              // Decimal escape with leading 0 are not parsed as octal.
               return ReportError(RegExpError::kInvalidDecimalEscape);
             }
             base::uc32 octal = ParseOctalLiteral();
@@ -744,17 +866,17 @@ RegExpTree* RegExpParserImpl<CharT>::ParseDisjunction() {
             ZoneList<CharacterRange>* ranges =
                 zone()->template New<ZoneList<CharacterRange>>(2, zone());
             bool add_unicode_case_equivalents =
-                unicode() && builder->ignore_case();
+                IsUnicodeMode() && ignore_case();
             bool parsed_character_class_escape = TryParseCharacterClassEscape(
                 next, InClassEscapeState::kNotInClass, ranges, zone(),
                 add_unicode_case_equivalents CHECK_FAILED);
 
             if (parsed_character_class_escape) {
-              RegExpCharacterClass* cc =
-                  zone()->template New<RegExpCharacterClass>(zone(), ranges);
-              builder->AddCharacterClass(cc);
+              RegExpClassRanges* cc =
+                  zone()->template New<RegExpClassRanges>(zone(), ranges);
+              builder->AddClassRanges(cc);
             } else {
-              CHECK(!unicode());
+              CHECK(!IsUnicodeMode());
               Advance(2);
               builder->AddCharacter(next);  // IdentityEscape.
             }
@@ -770,7 +892,7 @@ RegExpTree* RegExpParserImpl<CharT>::ParseDisjunction() {
             // in all other cases.
             const bool has_named_captures =
                 HasNamedCaptures(InClassEscapeState::kNotInClass CHECK_FAILED);
-            if (unicode() || has_named_captures) {
+            if (IsUnicodeMode() || has_named_captures) {
               Advance(2);
               ParseNamedBackReference(builder, state CHECK_FAILED);
               break;
@@ -801,7 +923,7 @@ RegExpTree* RegExpParserImpl<CharT>::ParseDisjunction() {
       }
       case '}':
       case ']':
-        if (unicode()) {
+        if (IsUnicodeMode()) {
           return ReportError(RegExpError::kLoneQuantifierBrackets);
         }
         V8_FALLTHROUGH;
@@ -840,8 +962,8 @@ RegExpTree* RegExpParserImpl<CharT>::ParseDisjunction() {
             return ReportError(RegExpError::kRangeOutOfOrder);
           }
           break;
-        } else if (unicode()) {
-          // With /u, incomplete quantifiers are not allowed.
+        } else if (IsUnicodeMode()) {
+          // Incomplete quantifiers are not allowed.
           return ReportError(RegExpError::kIncompleteQuantifier);
         }
         continue;
@@ -954,7 +1076,8 @@ bool IsSpecialClassEscape(base::uc32 c) {
 // characters.
 //
 // Important: The scanner has to be in a consistent state when calling
-// ScanForCaptures, e.g. not in the middle of an escape sequence '\['.
+// ScanForCaptures, e.g. not in the middle of an escape sequence '\[' or while
+// parsing a nested class.
 template <class CharT>
 void RegExpParserImpl<CharT>::ScanForCaptures(
     InClassEscapeState in_class_escape_state) {
@@ -964,6 +1087,9 @@ void RegExpParserImpl<CharT>::ScanForCaptures(
   int capture_count = captures_started();
   // When we start inside a character class, skip everything inside the class.
   if (in_class_escape_state == InClassEscapeState::kInClass) {
+    // \k is always invalid within a class in unicode mode, thus we should never
+    // call ScanForCaptures within a class.
+    DCHECK(!IsUnicodeMode());
     int c;
     while ((c = current()) != kEndMarker) {
       Advance();
@@ -983,13 +1109,19 @@ void RegExpParserImpl<CharT>::ScanForCaptures(
         Advance();
         break;
       case '[': {
+        int class_nest_level = 0;
         int c;
         while ((c = current()) != kEndMarker) {
           Advance();
           if (c == '\\') {
             Advance();
-          } else {
-            if (c == ']') break;
+          } else if (c == '[') {
+            // With /v, '[' inside a class is treated as a nested class.
+            // Without /v, '[' is a normal character.
+            if (unicode_sets()) class_nest_level++;
+          } else if (c == ']') {
+            if (class_nest_level == 0) break;
+            class_nest_level--;
           }
         }
         break;
@@ -1046,8 +1178,9 @@ bool RegExpParserImpl<CharT>::ParseBackReferenceIndex(int* index_out) {
     }
   }
   if (value > captures_started()) {
-    if (!is_scanned_for_captures_)
+    if (!is_scanned_for_captures_) {
       ScanForCaptures(InClassEscapeState::kNotInClass);
+    }
     if (value > capture_count_) {
       Reset(start);
       return false;
@@ -1351,7 +1484,7 @@ bool RegExpParserImpl<CharT>::ParseIntervalQuantifier(int* min_out,
 
 template <class CharT>
 base::uc32 RegExpParserImpl<CharT>::ParseOctalLiteral() {
-  DCHECK(('0' <= current() && current() <= '7') || current() == kEndMarker);
+  DCHECK(('0' <= current() && current() <= '7') || !has_more());
   // For compatibility with some other browsers (not all), we parse
   // up to three octal digits with a value below 256.
   // ES#prod-annexB-LegacyOctalEscapeSequence
@@ -1392,7 +1525,7 @@ bool RegExpParserImpl<CharT>::ParseUnicodeEscape(base::uc32* value) {
   // Accept both \uxxxx and \u{xxxxxx} (if harmony unicode escapes are
   // allowed). In the latter case, the number of hex digits between { } is
   // arbitrary. \ and u have already been read.
-  if (current() == '{' && unicode()) {
+  if (current() == '{' && IsUnicodeMode()) {
     int start = position();
     Advance();
     if (ParseUnlimitedLengthHexNumber(0x10FFFF, value)) {
@@ -1406,7 +1539,7 @@ bool RegExpParserImpl<CharT>::ParseUnicodeEscape(base::uc32* value) {
   }
   // \u but no {, or \u{...} escapes not allowed.
   bool result = ParseHexEscape(4, value);
-  if (result && unicode() && unibrow::Utf16::IsLeadSurrogate(*value) &&
+  if (result && IsUnicodeMode() && unibrow::Utf16::IsLeadSurrogate(*value) &&
       current() == '\\') {
     // Attempt to read trail surrogate.
     int start = position();
@@ -1461,6 +1594,7 @@ bool IsExactPropertyValueAlias(const char* property_value_name,
 
 bool LookupPropertyValueName(UProperty property,
                              const char* property_value_name, bool negate,
+                             bool needs_case_folding,
                              ZoneList<CharacterRange>* result, Zone* zone) {
   UProperty property_for_lookup = property;
   if (property_for_lookup == UCHAR_SCRIPT_EXTENSIONS) {
@@ -1485,6 +1619,7 @@ bool LookupPropertyValueName(UProperty property,
   bool success = ec == U_ZERO_ERROR && !set.isEmpty();
 
   if (success) {
+    if (needs_case_folding) set.closeOver(USET_CASE_INSENSITIVE);
     set.removeAllStrings();
     if (negate) set.complement();
     for (int i = 0; i < set.getRangeCount(); i++) {
@@ -1503,7 +1638,8 @@ inline bool NameEquals(const char* name, const char (&literal)[N]) {
 
 bool LookupSpecialPropertyValueName(const char* name,
                                     ZoneList<CharacterRange>* result,
-                                    bool negate, Zone* zone) {
+                                    bool negate, bool needs_case_folding,
+                                    Zone* zone) {
   if (NameEquals(name, "Any")) {
     if (negate) {
       // Leave the list of character ranges empty, since the negation of 'Any'
@@ -1517,7 +1653,7 @@ bool LookupSpecialPropertyValueName(const char* name,
                 zone);
   } else if (NameEquals(name, "Assigned")) {
     return LookupPropertyValueName(UCHAR_GENERAL_CATEGORY, "Unassigned",
-                                   !negate, result, zone);
+                                   !negate, needs_case_folding, result, zone);
   } else {
     return false;
   }
@@ -1646,23 +1782,29 @@ template <class CharT>
 bool RegExpParserImpl<CharT>::AddPropertyClassRange(
     ZoneList<CharacterRange>* add_to, bool negate,
     const ZoneVector<char>& name_1, const ZoneVector<char>& name_2) {
+  // With /vi, we need to apply case folding to property values.
+  // TODO(v8:11935): Change permalink once proposal is in stage 4.
+  // See
+  // https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-maybesimplecasefolding
+  const bool needs_case_folding = unicode_sets() && ignore_case();
   if (name_2.empty()) {
     // First attempt to interpret as general category property value name.
     const char* name = name_1.data();
     if (LookupPropertyValueName(UCHAR_GENERAL_CATEGORY_MASK, name, negate,
-                                add_to, zone())) {
+                                needs_case_folding, add_to, zone())) {
       return true;
     }
     // Interpret "Any", "ASCII", and "Assigned".
-    if (LookupSpecialPropertyValueName(name, add_to, negate, zone())) {
+    if (LookupSpecialPropertyValueName(name, add_to, negate, needs_case_folding,
+                                       zone())) {
       return true;
     }
     // Then attempt to interpret as binary property name with value name 'Y'.
     UProperty property = u_getPropertyEnum(name);
     if (!IsSupportedBinaryProperty(property)) return false;
     if (!IsExactPropertyAlias(name, property)) return false;
-    return LookupPropertyValueName(property, negate ? "N" : "Y", false, add_to,
-                                   zone());
+    return LookupPropertyValueName(property, negate ? "N" : "Y", false,
+                                   needs_case_folding, add_to, zone());
   } else {
     // Both property name and value name are specified. Attempt to interpret
     // the property name as enumerated property.
@@ -1677,8 +1819,8 @@ bool RegExpParserImpl<CharT>::AddPropertyClassRange(
                property != UCHAR_SCRIPT_EXTENSIONS) {
       return false;
     }
-    return LookupPropertyValueName(property, value_name, negate, add_to,
-                                   zone());
+    return LookupPropertyValueName(property, value_name, negate,
+                                   needs_case_folding, add_to, zone());
   }
 }
 
@@ -1760,14 +1902,14 @@ base::uc32 RegExpParserImpl<CharT>::ParseCharacterEscape(
         // 0x00-0x1F.
         return controlLetter & 0x1F;
       }
-      if (unicode()) {
-        // With /u, invalid escapes are not treated as identity escapes.
+      if (IsUnicodeMode()) {
+        // With /u and /v, invalid escapes are not treated as identity escapes.
         ReportError(RegExpError::kInvalidUnicodeEscape);
         return 0;
       }
       if (in_class_escape_state == InClassEscapeState::kInClass) {
         // Inside a character class, we also accept digits and underscore as
-        // control characters, unless with /u. See Annex B:
+        // control characters, unless with /u or /v. See Annex B:
         // ES#prod-annexB-ClassControlLetter
         if ((controlLetter >= '0' && controlLetter <= '9') ||
             controlLetter == '_') {
@@ -1800,8 +1942,9 @@ base::uc32 RegExpParserImpl<CharT>::ParseCharacterEscape(
       // a back reference (and therefore either \0 or not valid according
       // to the specification) as a 1..3 digit octal character code.
       // ES#prod-annexB-LegacyOctalEscapeSequence
-      if (unicode()) {
-        // With /u, decimal escape is not interpreted as octal character code.
+      if (IsUnicodeMode()) {
+        // With /u or /v, decimal escape is not interpreted as octal character
+        // code.
         ReportError(RegExpError::kInvalidClassEscape);
         return 0;
       }
@@ -1812,8 +1955,8 @@ base::uc32 RegExpParserImpl<CharT>::ParseCharacterEscape(
       Advance();
       base::uc32 value;
       if (ParseHexEscape(2, &value)) return value;
-      if (unicode()) {
-        // With /u, invalid escapes are not treated as identity escapes.
+      if (IsUnicodeMode()) {
+        // With /u or /v, invalid escapes are not treated as identity escapes.
         ReportError(RegExpError::kInvalidEscape);
         return 0;
       }
@@ -1830,8 +1973,8 @@ base::uc32 RegExpParserImpl<CharT>::ParseCharacterEscape(
         *is_escaped_unicode_character = true;
         return value;
       }
-      if (unicode()) {
-        // With /u, invalid escapes are not treated as identity escapes.
+      if (IsUnicodeMode()) {
+        // With /u or /v, invalid escapes are not treated as identity escapes.
         ReportError(RegExpError::kInvalidUnicodeEscape);
         return 0;
       }
@@ -1848,11 +1991,19 @@ base::uc32 RegExpParserImpl<CharT>::ParseCharacterEscape(
   //
   // * With /u, no identity escapes except for syntax characters are
   //   allowed.
-  // * Without /u:
+  // * With /v, no identity escapes except for syntax characters and
+  //   ClassSetReservedPunctuators (if within a class) are allowed.
+  // * Without /u or /v:
   //   * '\c' is not an IdentityEscape.
   //   * '\k' is not an IdentityEscape when named captures exist.
   //   * Otherwise, all identity escapes are allowed.
-  if (unicode()) {
+  if (unicode_sets() && in_class_escape_state == InClassEscapeState::kInClass) {
+    if (IsClassSetReservedPunctuator(c)) {
+      Advance();
+      return c;
+    }
+  }
+  if (IsUnicodeMode()) {
     if (!IsSyntaxCharacterOrSlash(c)) {
       ReportError(RegExpError::kInvalidEscape);
       return 0;
@@ -1860,7 +2011,7 @@ base::uc32 RegExpParserImpl<CharT>::ParseCharacterEscape(
     Advance();
     return c;
   }
-  DCHECK(!unicode());
+  DCHECK(!IsUnicodeMode());
   if (c == 'c') {
     ReportError(RegExpError::kInvalidEscape);
     return 0;
@@ -1875,6 +2026,53 @@ base::uc32 RegExpParserImpl<CharT>::ParseCharacterEscape(
   return c;
 }
 
+// TODO(v8:11935): Change permalink once proposal is in stage 4.
+// https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-ClassRanges
+template <class CharT>
+RegExpTree* RegExpParserImpl<CharT>::ParseClassRanges(
+    ZoneList<CharacterRange>* ranges, bool add_unicode_case_equivalents) {
+  base::uc32 char_1, char_2;
+  bool is_class_1, is_class_2;
+  while (has_more() && current() != ']') {
+    ParseClassEscape(ranges, zone(), add_unicode_case_equivalents, &char_1,
+                     &is_class_1 CHECK_FAILED);
+    // ClassAtom
+    if (current() == '-') {
+      Advance();
+      if (!has_more()) {
+        // If we reach the end we break out of the loop and let the
+        // following code report an error.
+        break;
+      } else if (current() == ']') {
+        if (!is_class_1) ranges->Add(CharacterRange::Singleton(char_1), zone());
+        ranges->Add(CharacterRange::Singleton('-'), zone());
+        break;
+      }
+      ParseClassEscape(ranges, zone(), add_unicode_case_equivalents, &char_2,
+                       &is_class_2 CHECK_FAILED);
+      if (is_class_1 || is_class_2) {
+        // Either end is an escaped character class. Treat the '-' verbatim.
+        if (IsUnicodeMode()) {
+          // ES2015 21.2.2.15.1 step 1.
+          return ReportError(RegExpError::kInvalidCharacterClass);
+        }
+        if (!is_class_1) ranges->Add(CharacterRange::Singleton(char_1), zone());
+        ranges->Add(CharacterRange::Singleton('-'), zone());
+        if (!is_class_2) ranges->Add(CharacterRange::Singleton(char_2), zone());
+        continue;
+      }
+      // ES2015 21.2.2.15.1 step 6.
+      if (char_1 > char_2) {
+        return ReportError(RegExpError::kOutOfOrderCharacterClass);
+      }
+      ranges->Add(CharacterRange::Range(char_1, char_2), zone());
+    } else {
+      if (!is_class_1) ranges->Add(CharacterRange::Singleton(char_1), zone());
+    }
+  }
+  return nullptr;
+}
+
 // https://tc39.es/ecma262/#prod-ClassEscape
 template <class CharT>
 void RegExpParserImpl<CharT>::ParseClassEscape(
@@ -1897,7 +2095,7 @@ void RegExpParserImpl<CharT>::ParseClassEscape(
       Advance(2);
       return;
     case '-':
-      if (unicode()) {
+      if (IsUnicodeMode()) {
         *char_out = next;
         Advance(2);
         return;
@@ -1943,7 +2141,7 @@ bool RegExpParserImpl<CharT>::TryParseCharacterClassEscape(
       return true;
     case 'p':
     case 'P': {
-      if (!unicode()) return false;
+      if (!IsUnicodeMode()) return false;
       bool negate = next == 'P';
       Advance(2);
       ZoneVector<char> name_1(zone);
@@ -1961,65 +2159,335 @@ bool RegExpParserImpl<CharT>::TryParseCharacterClassEscape(
   }
 }
 
+// TODO(v8:11935): Change permalink once proposal is in stage 4.
+// https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-ClassStringDisjunction
 template <class CharT>
-RegExpTree* RegExpParserImpl<CharT>::ParseCharacterClass(
-    const RegExpBuilder* builder) {
-  DCHECK_EQ(current(), '[');
-  Advance();
-  bool is_negated = false;
-  if (current() == '^') {
-    is_negated = true;
-    Advance();
+RegExpTree* RegExpParserImpl<CharT>::ParseClassStringDisjunction() {
+  DCHECK(unicode_sets());
+  DCHECK_EQ(current(), '\\');
+  DCHECK_EQ(Next(), 'q');
+  Advance(2);
+  if (current() != '{') {
+    // Identity escape of 'q' is not allowed in unicode mode.
+    return ReportError(RegExpError::kInvalidEscape);
   }
+  Advance();
+
+  // TODO(pthier, v8:11935): Implement.
+  return ReportError(RegExpError::kInvalidCharacterClass);
+}
+
+// TODO(v8:11935): Change permalink once proposal is in stage 4.
+// https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-ClassSetOperand
+// Tree returned based on type_out:
+//  * kClassStringDisjunction: RegExpAlternative | RegExpAtom
+//  * kNestedClass: RegExpClassSetExpression
+//  * For all other types: RegExpClassRanges
+template <class CharT>
+RegExpTree* RegExpParserImpl<CharT>::ParseClassSetOperand(
+    const RegExpBuilder* builder, ClassSetOperandType* type_out) {
   ZoneList<CharacterRange>* ranges =
-      zone()->template New<ZoneList<CharacterRange>>(2, zone());
-  bool add_unicode_case_equivalents = unicode() && builder->ignore_case();
+      zone()->template New<ZoneList<CharacterRange>>(1, zone());
+  RegExpTree* tree =
+      ParseClassSetOperand(builder, type_out, ranges CHECK_FAILED);
+  DCHECK_IMPLIES(*type_out == ClassSetOperandType::kClassSetCharacter,
+                 ranges->length() == 1);
+  DCHECK_IMPLIES(*type_out == ClassSetOperandType::kClassSetCharacter,
+                 tree == nullptr);
+  DCHECK_IMPLIES(*type_out == ClassSetOperandType::kCharacterClassEscape,
+                 !ranges->is_empty());
+  DCHECK_IMPLIES(*type_out == ClassSetOperandType::kCharacterClassEscape,
+                 tree == nullptr);
+  DCHECK_IMPLIES(*type_out == ClassSetOperandType::kClassStringDisjunction,
+                 ranges->is_empty());
+  DCHECK_IMPLIES(*type_out == ClassSetOperandType::kClassStringDisjunction,
+                 tree->IsAtom() || tree->IsAlternative());
+  DCHECK_IMPLIES(*type_out == ClassSetOperandType::kNestedClass,
+                 ranges->is_empty());
+  DCHECK_IMPLIES(*type_out == ClassSetOperandType::kNestedClass,
+                 tree->IsClassSetExpression());
+  // ClassSetRange is only used within ClassSetUnion().
+  DCHECK_NE(*type_out, ClassSetOperandType::kClassSetRange);
+  if (tree == nullptr) {
+    tree = zone()->template New<RegExpClassRanges>(zone(), ranges);
+  }
+  return tree;
+}
+
+// TODO(v8:11935): Change permalink once proposal is in stage 4.
+// https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-ClassSetOperand
+// Based on |type_out| either a tree is returned or ranges modifed (never both).
+// Tree returned based on type_out:
+//  * kClassStringDisjunction: RegExpAlternative | RegExpAtom
+//  * kNestedClass: RegExpClassSetExpression
+// For all other types, ranges is modified and nullptr is returned.
+template <class CharT>
+RegExpTree* RegExpParserImpl<CharT>::ParseClassSetOperand(
+    const RegExpBuilder* builder, ClassSetOperandType* type_out,
+    ZoneList<CharacterRange>* ranges) {
+  DCHECK(unicode_sets());
+  const base::uc32 c = current();
+  if (c == '\\') {
+    base::uc32 next = Next();
+    switch (next) {
+      case 'b':
+        *type_out = ClassSetOperandType::kClassSetCharacter;
+        ranges->Add(CharacterRange::Singleton('\b'), zone());
+        Advance(2);
+        return nullptr;
+      case 'q':
+        *type_out = ClassSetOperandType::kClassStringDisjunction;
+        return ParseClassStringDisjunction();
+      case kEndMarker:
+        return ReportError(RegExpError::kEscapeAtEndOfPattern);
+    }
+    static constexpr InClassEscapeState kInClassEscape =
+        InClassEscapeState::kInClass;
+    const bool add_unicode_case_equivalents = ignore_case();
+    if (TryParseCharacterClassEscape(next, kInClassEscape, ranges, zone(),
+                                     add_unicode_case_equivalents)) {
+      *type_out = ClassSetOperandType::kCharacterClassEscape;
+      return nullptr;
+    }
+
+    bool dummy = false;  // Unused.
+    base::uc32 escaped_char = ParseCharacterEscape(kInClassEscape, &dummy);
+    *type_out = ClassSetOperandType::kClassSetCharacter;
+    ranges->Add(CharacterRange::Singleton(escaped_char), zone());
+    return nullptr;
+  }
+  if (c == '[') {
+    *type_out = ClassSetOperandType::kNestedClass;
+    return ParseCharacterClass(builder);
+  }
+  if (IsClassSetSyntaxCharacter(c)) {
+    return ReportError(RegExpError::kInvalidCharacterInClass);
+  }
+  if (IsClassSetReservedDoublePunctuator(c)) {
+    return ReportError(RegExpError::kInvalidClassSetOperation);
+  }
+  *type_out = ClassSetOperandType::kClassSetCharacter;
+  ranges->Add(CharacterRange::Singleton(c), zone());
+  Advance();
+  return nullptr;
+}
+
+// TODO(v8:11935): Change permalink once proposal is in stage 4.
+// https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-ClassUnion
+template <class CharT>
+RegExpTree* RegExpParserImpl<CharT>::ParseClassUnion(
+    const RegExpBuilder* builder, bool is_negated, RegExpTree* first_operand,
+    ClassSetOperandType first_operand_type, ZoneList<CharacterRange>* ranges) {
+  DCHECK(unicode_sets());
+  ZoneList<RegExpTree*>* operands =
+      zone()->template New<ZoneList<RegExpTree*>>(2, zone());
+  // Add the lhs to operands if necessary.
+  // Either the lhs values were added to |ranges| (in which case |first_operand|
+  // is null), or the lhs was evaluated to a tree and passed as |first_operand|
+  // (in which case |ranges| are empty).
+  DCHECK_EQ(first_operand != nullptr, ranges->is_empty());
+  if (first_operand != nullptr) {
+    operands->Add(first_operand, zone());
+  }
+  ClassSetOperandType last_type = first_operand_type;
+  const bool needs_case_folding = ignore_case();
   while (has_more() && current() != ']') {
-    base::uc32 char_1, char_2;
-    bool is_class_1, is_class_2;
-    ParseClassEscape(ranges, zone(), add_unicode_case_equivalents, &char_1,
-                     &is_class_1 CHECK_FAILED);
     if (current() == '-') {
+      // Mix of ClassSetRange and ClassSubtraction is not allowed.
+      if (Next() == '-') {
+        return ReportError(RegExpError::kInvalidClassSetOperation);
+      }
       Advance();
-      if (current() == kEndMarker) {
+      if (!has_more()) {
         // If we reach the end we break out of the loop and let the
         // following code report an error.
         break;
-      } else if (current() == ']') {
-        if (!is_class_1) ranges->Add(CharacterRange::Singleton(char_1), zone());
-        ranges->Add(CharacterRange::Singleton('-'), zone());
-        break;
       }
-      ParseClassEscape(ranges, zone(), add_unicode_case_equivalents, &char_2,
-                       &is_class_2 CHECK_FAILED);
-      if (is_class_1 || is_class_2) {
-        // Either end is an escaped character class. Treat the '-' verbatim.
-        if (unicode()) {
-          // ES2015 21.2.2.15.1 step 1.
-          return ReportError(RegExpError::kInvalidCharacterClass);
-        }
-        if (!is_class_1) ranges->Add(CharacterRange::Singleton(char_1), zone());
-        ranges->Add(CharacterRange::Singleton('-'), zone());
-        if (!is_class_2) ranges->Add(CharacterRange::Singleton(char_2), zone());
-        continue;
+      // If the lhs and rhs around '-' are both ClassSetCharacters, they
+      // represent a character range.
+      // In case one of them is not a ClassSetCharacter, it is a syntax error,
+      // as '-' can not be used unescaped within a class with /v.
+      // TODO(v8:11935): Change permalink once proposal is in stage 4.
+      // See
+      // https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-ClassSetRange
+      if (last_type != ClassSetOperandType::kClassSetCharacter) {
+        return ReportError(RegExpError::kInvalidCharacterClass);
       }
-      // ES2015 21.2.2.15.1 step 6.
-      if (char_1 > char_2) {
+      ParseClassSetOperand(builder, &last_type, ranges CHECK_FAILED);
+      if (last_type != ClassSetOperandType::kClassSetCharacter) {
+        return ReportError(RegExpError::kInvalidCharacterClass);
+      }
+      // Remove the last two singleton characters added to ranges, and combine
+      // them into a range.
+      auto rhs_ranges = ranges->RemoveLast();
+      auto lhs_ranges = ranges->RemoveLast();
+      DCHECK(lhs_ranges.IsSingleton());
+      DCHECK(rhs_ranges.IsSingleton());
+      base::uc32 from = lhs_ranges.from();
+      base::uc32 to = rhs_ranges.from();
+      if (from > to) {
         return ReportError(RegExpError::kOutOfOrderCharacterClass);
       }
-      ranges->Add(CharacterRange::Range(char_1, char_2), zone());
+      ranges->Add(CharacterRange::Range(from, to), zone());
+      last_type = ClassSetOperandType::kClassSetRange;
     } else {
-      if (!is_class_1) ranges->Add(CharacterRange::Singleton(char_1), zone());
+      DCHECK_NE(current(), '-');
+      RegExpTree* operand =
+          ParseClassSetOperand(builder, &last_type, ranges CHECK_FAILED);
+      if (operand != nullptr) {
+        // Add the range we started building as operand and reset the current
+        // range.
+        if (!ranges->is_empty()) {
+          if (needs_case_folding) {
+            CharacterRange::AddUnicodeCaseEquivalents(ranges, zone());
+          }
+          operands->Add(zone()->template New<RegExpClassRanges>(zone(), ranges),
+                        zone());
+          ranges = zone()->template New<ZoneList<CharacterRange>>(2, zone());
+        }
+        operands->Add(operand, zone());
+      }
+    }
+  }
+
+  if (!has_more()) {
+    return ReportError(RegExpError::kUnterminatedCharacterClass);
+  }
+
+  // Add the range we started building as operand.
+  if (!ranges->is_empty()) {
+    if (needs_case_folding) {
+      CharacterRange::AddUnicodeCaseEquivalents(ranges, zone());
+    }
+    operands->Add(zone()->template New<RegExpClassRanges>(zone(), ranges),
+                  zone());
+  }
+  DCHECK_EQ(current(), ']');
+  Advance();
+  return zone()->template New<RegExpClassSetExpression>(
+      RegExpClassSetExpression::OperationType::kUnion, is_negated, operands);
+}
+
+// TODO(v8:11935): Change permalink once proposal is in stage 4.
+// https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-ClassIntersection
+template <class CharT>
+RegExpTree* RegExpParserImpl<CharT>::ParseClassIntersection(
+    const RegExpBuilder* builder, bool is_negated, RegExpTree* first_operand) {
+  DCHECK(unicode_sets());
+  DCHECK(current() == '&' && Next() == '&');
+  ZoneList<RegExpTree*>* operands =
+      zone()->template New<ZoneList<RegExpTree*>>(2, zone());
+  operands->Add(first_operand, zone());
+  while (has_more() && current() != ']') {
+    if (current() != '&' || Next() != '&') {
+      return ReportError(RegExpError::kInvalidClassSetOperation);
+    }
+    Advance(2);
+    // [lookahead ≠ &]
+    if (current() == '&') {
+      return ReportError(RegExpError::kInvalidCharacterInClass);
+    }
+
+    ClassSetOperandType dummy;  // unused
+    RegExpTree* operand = ParseClassSetOperand(builder, &dummy CHECK_FAILED);
+    operands->Add(operand, zone());
+  }
+  if (!has_more()) {
+    return ReportError(RegExpError::kUnterminatedCharacterClass);
+  }
+  DCHECK_EQ(current(), ']');
+  Advance();
+  return zone()->template New<RegExpClassSetExpression>(
+      RegExpClassSetExpression::OperationType::kIntersection, is_negated,
+      operands);
+}
+
+// TODO(v8:11935): Change permalink once proposal is in stage 4.
+// https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-ClassSubtraction
+template <class CharT>
+RegExpTree* RegExpParserImpl<CharT>::ParseClassSubtraction(
+    const RegExpBuilder* builder, bool is_negated, RegExpTree* first_operand) {
+  DCHECK(unicode_sets());
+  DCHECK(current() == '-' && Next() == '-');
+  ZoneList<RegExpTree*>* operands =
+      zone()->template New<ZoneList<RegExpTree*>>(2, zone());
+  operands->Add(first_operand, zone());
+  while (has_more() && current() != ']') {
+    if (current() != '-' || Next() != '-') {
+      return ReportError(RegExpError::kInvalidClassSetOperation);
     }
+    Advance(2);
+    ClassSetOperandType dummy;  // unused
+    RegExpTree* operand = ParseClassSetOperand(builder, &dummy CHECK_FAILED);
+    operands->Add(operand, zone());
   }
   if (!has_more()) {
     return ReportError(RegExpError::kUnterminatedCharacterClass);
   }
+  DCHECK_EQ(current(), ']');
   Advance();
-  RegExpCharacterClass::CharacterClassFlags character_class_flags;
-  if (is_negated) character_class_flags = RegExpCharacterClass::NEGATED;
-  return zone()->template New<RegExpCharacterClass>(zone(), ranges,
-                                                    character_class_flags);
+  return zone()->template New<RegExpClassSetExpression>(
+      RegExpClassSetExpression::OperationType::kSubtraction, is_negated,
+      operands);
+}
+
+// https://tc39.es/ecma262/#prod-CharacterClass
+template <class CharT>
+RegExpTree* RegExpParserImpl<CharT>::ParseCharacterClass(
+    const RegExpBuilder* builder) {
+  DCHECK_EQ(current(), '[');
+  Advance();
+  bool is_negated = false;
+  if (current() == '^') {
+    is_negated = true;
+    Advance();
+  }
+  ZoneList<CharacterRange>* ranges =
+      zone()->template New<ZoneList<CharacterRange>>(2, zone());
+  if (current() == ']') {
+    Advance();
+    RegExpClassRanges::ClassRangesFlags class_ranges_flags;
+    if (is_negated) class_ranges_flags = RegExpClassRanges::NEGATED;
+    return zone()->template New<RegExpClassRanges>(zone(), ranges,
+                                                   class_ranges_flags);
+  }
+
+  if (!unicode_sets()) {
+    bool add_unicode_case_equivalents = IsUnicodeMode() && ignore_case();
+    ParseClassRanges(ranges, add_unicode_case_equivalents CHECK_FAILED);
+    if (!has_more()) {
+      return ReportError(RegExpError::kUnterminatedCharacterClass);
+    }
+    DCHECK_EQ(current(), ']');
+    Advance();
+    RegExpClassRanges::ClassRangesFlags character_class_flags;
+    if (is_negated) character_class_flags = RegExpClassRanges::NEGATED;
+    return zone()->template New<RegExpClassRanges>(zone(), ranges,
+                                                   character_class_flags);
+  } else {
+    ClassSetOperandType operand_type;
+    RegExpTree* operand =
+        ParseClassSetOperand(builder, &operand_type, ranges CHECK_FAILED);
+    switch (current()) {
+      case '-':
+        if (Next() == '-') {
+          if (operand == nullptr) {
+            operand = zone()->template New<RegExpClassRanges>(zone(), ranges);
+          }
+          return ParseClassSubtraction(builder, is_negated, operand);
+        }
+        // ClassSetRange is handled in ParseClassUnion().
+        break;
+      case '&':
+        if (Next() == '&') {
+          if (operand == nullptr) {
+            operand = zone()->template New<RegExpClassRanges>(zone(), ranges);
+          }
+          return ParseClassIntersection(builder, is_negated, operand);
+        }
+    }
+    return ParseClassUnion(builder, is_negated, operand, operand_type, ranges);
+  }
 }
 
 #undef CHECK_FAILED
@@ -2070,7 +2538,7 @@ void RegExpBuilder::AddTrailSurrogate(base::uc16 trail_surrogate) {
     base::uc32 combined =
         unibrow::Utf16::CombineSurrogatePair(lead_surrogate, trail_surrogate);
     if (NeedsDesugaringForIgnoreCase(combined)) {
-      AddCharacterClassForDesugaring(combined);
+      AddClassRangesForDesugaring(combined);
     } else {
       ZoneList<base::uc16> surrogate_pair(2, zone());
       surrogate_pair.Add(lead_surrogate, zone());
@@ -2087,10 +2555,10 @@ void RegExpBuilder::AddTrailSurrogate(base::uc16 trail_surrogate) {
 
 void RegExpBuilder::FlushPendingSurrogate() {
   if (pending_surrogate_ != kNoPendingSurrogate) {
-    DCHECK(unicode());
+    DCHECK(IsUnicodeMode());
     base::uc32 c = pending_surrogate_;
     pending_surrogate_ = kNoPendingSurrogate;
-    AddCharacterClassForDesugaring(c);
+    AddClassRangesForDesugaring(c);
   }
 }
 
@@ -2126,7 +2594,7 @@ void RegExpBuilder::AddCharacter(base::uc16 c) {
   FlushPendingSurrogate();
   pending_empty_ = false;
   if (NeedsDesugaringForIgnoreCase(c)) {
-    AddCharacterClassForDesugaring(c);
+    AddClassRangesForDesugaring(c);
   } else {
     if (characters_ == nullptr) {
       characters_ = zone()->New<ZoneList<base::uc16>>(4, zone());
@@ -2138,12 +2606,12 @@ void RegExpBuilder::AddCharacter(base::uc16 c) {
 
 void RegExpBuilder::AddUnicodeCharacter(base::uc32 c) {
   if (c > static_cast<base::uc32>(unibrow::Utf16::kMaxNonSurrogateCharCode)) {
-    DCHECK(unicode());
+    DCHECK(IsUnicodeMode());
     AddLeadSurrogate(unibrow::Utf16::LeadSurrogate(c));
     AddTrailSurrogate(unibrow::Utf16::TrailSurrogate(c));
-  } else if (unicode() && unibrow::Utf16::IsLeadSurrogate(c)) {
+  } else if (IsUnicodeMode() && unibrow::Utf16::IsLeadSurrogate(c)) {
     AddLeadSurrogate(c);
-  } else if (unicode() && unibrow::Utf16::IsTrailSurrogate(c)) {
+  } else if (IsUnicodeMode() && unibrow::Utf16::IsTrailSurrogate(c)) {
     AddTrailSurrogate(c);
   } else {
     AddCharacter(static_cast<base::uc16>(c));
@@ -2160,7 +2628,7 @@ void RegExpBuilder::AddEscapedUnicodeCharacter(base::uc32 character) {
 
 void RegExpBuilder::AddEmpty() { pending_empty_ = true; }
 
-void RegExpBuilder::AddCharacterClass(RegExpCharacterClass* cc) {
+void RegExpBuilder::AddClassRanges(RegExpClassRanges* cc) {
   if (NeedsDesugaringForUnicode(cc)) {
     // With /u, character class needs to be desugared, so it
     // must be a standalone term instead of being part of a RegExpText.
@@ -2170,8 +2638,8 @@ void RegExpBuilder::AddCharacterClass(RegExpCharacterClass* cc) {
   }
 }
 
-void RegExpBuilder::AddCharacterClassForDesugaring(base::uc32 c) {
-  AddTerm(zone()->New<RegExpCharacterClass>(
+void RegExpBuilder::AddClassRangesForDesugaring(base::uc32 c) {
+  AddTerm(zone()->New<RegExpClassRanges>(
       zone(), CharacterRange::List(zone(), CharacterRange::Singleton(c))));
 }
 
@@ -2222,8 +2690,8 @@ void RegExpBuilder::FlushTerms() {
   LAST(ADD_NONE);
 }
 
-bool RegExpBuilder::NeedsDesugaringForUnicode(RegExpCharacterClass* cc) {
-  if (!unicode()) return false;
+bool RegExpBuilder::NeedsDesugaringForUnicode(RegExpClassRanges* cc) {
+  if (!IsUnicodeMode()) return false;
   // TODO(yangguo): we could be smarter than this. Case-insensitivity does not
   // necessarily mean that we need to desugar. It's probably nicer to have a
   // separate pass to figure out unicode desugarings.
@@ -2251,7 +2719,7 @@ bool RegExpBuilder::NeedsDesugaringForUnicode(RegExpCharacterClass* cc) {
 
 bool RegExpBuilder::NeedsDesugaringForIgnoreCase(base::uc32 c) {
 #ifdef V8_INTL_SUPPORT
-  if (unicode() && ignore_case()) {
+  if (IsUnicodeMode() && ignore_case()) {
     icu::UnicodeSet set(c, c);
     set.closeOver(USET_CASE_INSENSITIVE);
     set.removeAllStrings();
@@ -2304,8 +2772,8 @@ bool RegExpBuilder::AddQuantifierToAtom(
     atom = terms_.back();
     terms_.pop_back();
     if (atom->IsLookaround()) {
-      // With /u, lookarounds are not quantifiable.
-      if (unicode()) return false;
+      // With /u or /v, lookarounds are not quantifiable.
+      if (IsUnicodeMode()) return false;
       // Lookbehinds are not quantifiable.
       if (atom->AsLookaround()->type() == RegExpLookaround::LOOKBEHIND) {
         return false;
diff --git a/deps/v8/src/regexp/regexp.cc b/deps/v8/src/regexp/regexp.cc
index 71301ab965caa9..ce323df96cdf1c 100644
--- a/deps/v8/src/regexp/regexp.cc
+++ b/deps/v8/src/regexp/regexp.cc
@@ -99,7 +99,7 @@ class RegExpImpl final : public AllStatic {
   static void SetIrregexpMaxRegisterCount(FixedArray re, int value);
   static int IrregexpNumberOfCaptures(FixedArray re);
   static ByteArray IrregexpByteCode(FixedArray re, bool is_one_byte);
-  static Code IrregexpNativeCode(FixedArray re, bool is_one_byte);
+  static CodeT IrregexpNativeCode(FixedArray re, bool is_one_byte);
 };
 
 // static
@@ -629,8 +629,8 @@ ByteArray RegExpImpl::IrregexpByteCode(FixedArray re, bool is_one_byte) {
   return ByteArray::cast(re.get(JSRegExp::bytecode_index(is_one_byte)));
 }
 
-Code RegExpImpl::IrregexpNativeCode(FixedArray re, bool is_one_byte) {
-  return Code::cast(re.get(JSRegExp::code_index(is_one_byte)));
+CodeT RegExpImpl::IrregexpNativeCode(FixedArray re, bool is_one_byte) {
+  return CodeT::cast(re.get(JSRegExp::code_index(is_one_byte)));
 }
 
 void RegExpImpl::IrregexpInitialize(Isolate* isolate, Handle<JSRegExp> re,
@@ -993,7 +993,7 @@ bool RegExpImpl::Compile(Isolate* isolate, Zone* zone, RegExpCompileData* data,
     RegExpMacroAssembler::GlobalMode mode = RegExpMacroAssembler::GLOBAL;
     if (data->tree->min_match() > 0) {
       mode = RegExpMacroAssembler::GLOBAL_NO_ZERO_LENGTH_CHECK;
-    } else if (IsUnicode(flags)) {
+    } else if (IsEitherUnicode(flags)) {
       mode = RegExpMacroAssembler::GLOBAL_UNICODE;
     }
     macro_assembler->set_global_mode(mode);
@@ -1129,7 +1129,7 @@ RegExpGlobalCache::~RegExpGlobalCache() {
 }
 
 int RegExpGlobalCache::AdvanceZeroLength(int last_index) {
-  if (IsUnicode(JSRegExp::AsRegExpFlags(regexp_->flags())) &&
+  if (IsEitherUnicode(JSRegExp::AsRegExpFlags(regexp_->flags())) &&
       last_index + 1 < subject_->length() &&
       unibrow::Utf16::IsLeadSurrogate(subject_->Get(last_index)) &&
       unibrow::Utf16::IsTrailSurrogate(subject_->Get(last_index + 1))) {
diff --git a/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc b/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc
index 93da768d86cc59..c8f3eb551e0580 100644
--- a/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc
+++ b/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc
@@ -499,7 +499,7 @@ void RegExpMacroAssemblerRISCV::CheckBitInTable(Handle<ByteArray> table,
   BranchOrBacktrack(on_bit_set, ne, a0, Operand(zero_reg));
 }
 
-bool RegExpMacroAssemblerRISCV::CheckSpecialCharacterClass(
+bool RegExpMacroAssemblerRISCV::CheckSpecialClassRanges(
     StandardCharacterSet type, Label* on_no_match) {
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check.
diff --git a/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.h b/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.h
index 2352af8a17ca6a..1080e72a7ec73a 100644
--- a/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.h
+++ b/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.h
@@ -58,8 +58,8 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerRISCV
   // Checks whether the given offset from the current position is before
   // the end of the string.
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
   void GoTo(Label* label) override;
diff --git a/deps/v8/src/regexp/s390/regexp-macro-assembler-s390.cc b/deps/v8/src/regexp/s390/regexp-macro-assembler-s390.cc
index ab9528dbc4c1cd..a61bc379ba6c26 100644
--- a/deps/v8/src/regexp/s390/regexp-macro-assembler-s390.cc
+++ b/deps/v8/src/regexp/s390/regexp-macro-assembler-s390.cc
@@ -539,7 +539,7 @@ void RegExpMacroAssemblerS390::CheckBitInTable(Handle<ByteArray> table,
   BranchOrBacktrack(ne, on_bit_set);
 }
 
-bool RegExpMacroAssemblerS390::CheckSpecialCharacterClass(
+bool RegExpMacroAssemblerS390::CheckSpecialClassRanges(
     StandardCharacterSet type, Label* on_no_match) {
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check
diff --git a/deps/v8/src/regexp/s390/regexp-macro-assembler-s390.h b/deps/v8/src/regexp/s390/regexp-macro-assembler-s390.h
index 645b01faa56e34..f0b4833eb8ac7c 100644
--- a/deps/v8/src/regexp/s390/regexp-macro-assembler-s390.h
+++ b/deps/v8/src/regexp/s390/regexp-macro-assembler-s390.h
@@ -57,8 +57,8 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerS390
   // Checks whether the given offset from the current position is before
   // the end of the string.
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
   void GoTo(Label* label) override;
diff --git a/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.cc b/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.cc
index 1b4aa566f8f4e2..89fd2e34f12961 100644
--- a/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.cc
+++ b/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.cc
@@ -578,8 +578,8 @@ void RegExpMacroAssemblerX64::CheckBitInTable(
   BranchOrBacktrack(not_equal, on_bit_set);
 }
 
-bool RegExpMacroAssemblerX64::CheckSpecialCharacterClass(
-    StandardCharacterSet type, Label* on_no_match) {
+bool RegExpMacroAssemblerX64::CheckSpecialClassRanges(StandardCharacterSet type,
+                                                      Label* on_no_match) {
   // Range checks (c in min..max) are generally implemented by an unsigned
   // (c - min) <= (max - min) check, using the sequence:
   //   leal(rax, Operand(current_character(), -min)) or sub(rax, Immediate(min))
diff --git a/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.h b/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.h
index c0a743afc639fd..683d3bc42803c4 100644
--- a/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.h
+++ b/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.h
@@ -57,8 +57,8 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerX64
   // Checks whether the given offset from the current position is before
   // the end of the string.
   void CheckPosition(int cp_offset, Label* on_outside_input) override;
-  bool CheckSpecialCharacterClass(StandardCharacterSet type,
-                                  Label* on_no_match) override;
+  bool CheckSpecialClassRanges(StandardCharacterSet type,
+                               Label* on_no_match) override;
   void Fail() override;
   Handle<HeapObject> GetCode(Handle<String> source) override;
   void GoTo(Label* label) override;
diff --git a/deps/v8/src/roots/roots.cc b/deps/v8/src/roots/roots.cc
index 54755d899bd8b9..1f798c94b565b1 100644
--- a/deps/v8/src/roots/roots.cc
+++ b/deps/v8/src/roots/roots.cc
@@ -39,7 +39,8 @@ void ReadOnlyRoots::VerifyNameForProtectors() {
     if (root_index != RootIndex::kFirstNameForProtector) {
       // Make sure the objects are adjacent in memory.
       CHECK_LT(prev.address(), current.address());
-      Address computed_address = prev.address() + prev.Size();
+      Address computed_address =
+          prev.address() + ALIGN_TO_ALLOCATION_ALIGNMENT(prev.Size());
       CHECK_EQ(computed_address, current.address());
     }
     prev = current;
diff --git a/deps/v8/src/roots/roots.h b/deps/v8/src/roots/roots.h
index 16d022d6e5f641..a65e41e3da4195 100644
--- a/deps/v8/src/roots/roots.h
+++ b/deps/v8/src/roots/roots.h
@@ -268,8 +268,8 @@ class Symbol;
     AsyncGeneratorAwaitRejectSharedFun)                                        \
   V(SharedFunctionInfo, async_generator_await_resolve_shared_fun,              \
     AsyncGeneratorAwaitResolveSharedFun)                                       \
-  V(SharedFunctionInfo, async_generator_yield_resolve_shared_fun,              \
-    AsyncGeneratorYieldResolveSharedFun)                                       \
+  V(SharedFunctionInfo, async_generator_yield_with_await_resolve_shared_fun,   \
+    AsyncGeneratorYieldWithAwaitResolveSharedFun)                              \
   V(SharedFunctionInfo, async_generator_return_resolve_shared_fun,             \
     AsyncGeneratorReturnResolveSharedFun)                                      \
   V(SharedFunctionInfo, async_generator_return_closed_reject_shared_fun,       \
@@ -334,8 +334,11 @@ class Symbol;
     PendingOptimizeForTestBytecode)                                         \
   V(ArrayList, basic_block_profiling_data, BasicBlockProfilingData)         \
   V(WeakArrayList, shared_wasm_memories, SharedWasmMemories)                \
+  /* EphemeronHashTable for debug scopes (local debug evaluate) */          \
+  V(HeapObject, locals_block_list_cache, DebugLocalsBlockListCache)         \
   IF_WASM(V, HeapObject, active_continuation, ActiveContinuation)           \
   IF_WASM(V, HeapObject, active_suspender, ActiveSuspender)                 \
+  IF_WASM(V, WeakArrayList, js_to_wasm_wrappers, JSToWasmWrappers)          \
   IF_WASM(V, WeakArrayList, wasm_canonical_rtts, WasmCanonicalRtts)
 
 // Entries in this list are limited to Smis and are not visited during GC.
diff --git a/deps/v8/src/runtime/runtime-array.cc b/deps/v8/src/runtime/runtime-array.cc
index 7d8ba833e3e9d3..11cb61eeefbda7 100644
--- a/deps/v8/src/runtime/runtime-array.cc
+++ b/deps/v8/src/runtime/runtime-array.cc
@@ -155,13 +155,18 @@ RUNTIME_FUNCTION(Runtime_NormalizeElements) {
   return *array;
 }
 
-// GrowArrayElements returns a sentinel Smi if the object was normalized or if
-// the key is negative.
+// GrowArrayElements grows fast kind elements and returns a sentinel Smi if the
+// object was normalized or if the key is negative.
 RUNTIME_FUNCTION(Runtime_GrowArrayElements) {
   HandleScope scope(isolate);
   DCHECK_EQ(2, args.length());
   Handle<JSObject> object = args.at<JSObject>(0);
   Handle<Object> key = args.at(1);
+  ElementsKind kind = object->GetElementsKind();
+  CHECK(IsFastElementsKind(kind));
+  const intptr_t kMaxLength = IsDoubleElementsKind(kind)
+                                  ? FixedDoubleArray::kMaxLength
+                                  : FixedArray::kMaxLength;
   uint32_t index;
   if (key->IsSmi()) {
     int value = Smi::ToInt(*key);
@@ -170,7 +175,7 @@ RUNTIME_FUNCTION(Runtime_GrowArrayElements) {
   } else {
     CHECK(key->IsHeapNumber());
     double value = HeapNumber::cast(*key).value();
-    if (value < 0 || value > std::numeric_limits<uint32_t>::max()) {
+    if (value < 0 || value > kMaxLength) {
       return Smi::zero();
     }
     index = static_cast<uint32_t>(value);
diff --git a/deps/v8/src/runtime/runtime-classes.cc b/deps/v8/src/runtime/runtime-classes.cc
index 79dd4cbe41a89f..2c3037e1353e90 100644
--- a/deps/v8/src/runtime/runtime-classes.cc
+++ b/deps/v8/src/runtime/runtime-classes.cc
@@ -638,7 +638,7 @@ MaybeHandle<Object> DefineClass(Isolate* isolate,
     DCHECK(isolate->has_pending_exception());
     return MaybeHandle<Object>();
   }
-  if (FLAG_log_maps) {
+  if (v8_flags.log_maps) {
     Handle<Map> empty_map;
     LOG(isolate,
         MapEvent("InitialMap", empty_map, handle(constructor->map(), isolate),
diff --git a/deps/v8/src/runtime/runtime-collections.cc b/deps/v8/src/runtime/runtime-collections.cc
index cdf822c0c0e769..a326efaa5e7505 100644
--- a/deps/v8/src/runtime/runtime-collections.cc
+++ b/deps/v8/src/runtime/runtime-collections.cc
@@ -79,7 +79,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) {
   int hash = args.smi_value_at(2);
 
 #ifdef DEBUG
-  DCHECK(key->IsJSReceiver());
+  DCHECK(key->CanBeHeldWeakly());
   DCHECK(EphemeronHashTable::IsKey(ReadOnlyRoots(isolate), *key));
   Handle<EphemeronHashTable> table(
       EphemeronHashTable::cast(weak_collection->table()), isolate);
@@ -102,7 +102,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionSet) {
   int hash = args.smi_value_at(3);
 
 #ifdef DEBUG
-  DCHECK(key->IsJSReceiver());
+  DCHECK(key->CanBeHeldWeakly());
   DCHECK(EphemeronHashTable::IsKey(ReadOnlyRoots(isolate), *key));
   Handle<EphemeronHashTable> table(
       EphemeronHashTable::cast(weak_collection->table()), isolate);
diff --git a/deps/v8/src/runtime/runtime-compiler.cc b/deps/v8/src/runtime/runtime-compiler.cc
index d7288130ed3727..3676f7814d0b60 100644
--- a/deps/v8/src/runtime/runtime-compiler.cc
+++ b/deps/v8/src/runtime/runtime-compiler.cc
@@ -56,7 +56,7 @@ RUNTIME_FUNCTION(Runtime_CompileLazy) {
 
   DCHECK(!function->is_compiled());
 #ifdef DEBUG
-  if (FLAG_trace_lazy && sfi->is_compiled()) {
+  if (v8_flags.trace_lazy && sfi->is_compiled()) {
     PrintF("[unoptimized: %s]\n", function->DebugNameCStr().get());
   }
 #endif
@@ -276,7 +276,7 @@ void DeoptAllOsrLoopsContainingDeoptExit(Isolate* isolate, JSFunction function,
   DisallowGarbageCollection no_gc;
   DCHECK(!deopt_exit_offset.IsNone());
 
-  if (!FLAG_use_ic ||
+  if (!v8_flags.use_ic ||
       !function.feedback_vector().maybe_has_optimized_osr_code()) {
     return;
   }
@@ -467,7 +467,7 @@ Object CompileOptimizedOSR(Isolate* isolate, Handle<JSFunction> function,
                            BytecodeOffset osr_offset) {
   const ConcurrencyMode mode =
       V8_LIKELY(isolate->concurrent_recompilation_enabled() &&
-                FLAG_concurrent_osr)
+                v8_flags.concurrent_osr)
           ? ConcurrencyMode::kConcurrent
           : ConcurrencyMode::kSynchronous;
 
@@ -519,7 +519,7 @@ Object CompileOptimizedOSR(Isolate* isolate, Handle<JSFunction> function,
 RUNTIME_FUNCTION(Runtime_CompileOptimizedOSR) {
   HandleScope handle_scope(isolate);
   DCHECK_EQ(0, args.length());
-  DCHECK(FLAG_use_osr);
+  DCHECK(v8_flags.use_osr);
 
   BytecodeOffset osr_offset = BytecodeOffset::None();
   Handle<JSFunction> function;
@@ -531,7 +531,7 @@ RUNTIME_FUNCTION(Runtime_CompileOptimizedOSR) {
 RUNTIME_FUNCTION(Runtime_CompileOptimizedOSRFromMaglev) {
   HandleScope handle_scope(isolate);
   DCHECK_EQ(1, args.length());
-  DCHECK(FLAG_use_osr);
+  DCHECK(v8_flags.use_osr);
 
   const BytecodeOffset osr_offset(args.positive_smi_value_at(0));
 
@@ -546,13 +546,13 @@ RUNTIME_FUNCTION(Runtime_CompileOptimizedOSRFromMaglev) {
 RUNTIME_FUNCTION(Runtime_LogOrTraceOptimizedOSREntry) {
   HandleScope handle_scope(isolate);
   DCHECK_EQ(0, args.length());
-  CHECK(FLAG_trace_osr || v8_flags.log_function_events);
+  CHECK(v8_flags.trace_osr || v8_flags.log_function_events);
 
   BytecodeOffset osr_offset = BytecodeOffset::None();
   Handle<JSFunction> function;
   GetOsrOffsetAndFunctionForOSR(isolate, &osr_offset, &function);
 
-  if (FLAG_trace_osr) {
+  if (v8_flags.trace_osr) {
     PrintF(CodeTracer::Scope{isolate->GetCodeTracer()}.file(),
            "[OSR - entry. function: %s, osr offset: %d]\n",
            function->DebugNameCStr().get(), osr_offset.ToInt());
diff --git a/deps/v8/src/runtime/runtime-debug.cc b/deps/v8/src/runtime/runtime-debug.cc
index 347329604acba8..2167a425485940 100644
--- a/deps/v8/src/runtime/runtime-debug.cc
+++ b/deps/v8/src/runtime/runtime-debug.cc
@@ -910,7 +910,7 @@ RUNTIME_FUNCTION(Runtime_ProfileCreateSnapshotDataBlob) {
   // Used only by the test/memory/Memory.json benchmark. This creates a snapshot
   // blob and outputs various statistics around it.
 
-  DCHECK(FLAG_profile_deserialization && FLAG_serialization_statistics);
+  DCHECK(v8_flags.profile_deserialization && v8_flags.serialization_statistics);
 
   DisableEmbeddedBlobRefcounting();
 
diff --git a/deps/v8/src/runtime/runtime-forin.cc b/deps/v8/src/runtime/runtime-forin.cc
index 031ad03baf8f65..8ae6898555b094 100644
--- a/deps/v8/src/runtime/runtime-forin.cc
+++ b/deps/v8/src/runtime/runtime-forin.cc
@@ -77,6 +77,10 @@ MaybeHandle<Object> HasEnumerableProperty(Isolate* isolate,
           return it.GetName();
         }
       }
+      case LookupIterator::WASM_OBJECT:
+        THROW_NEW_ERROR(isolate,
+                        NewTypeError(MessageTemplate::kWasmObjectsAreOpaque),
+                        Object);
       case LookupIterator::INTERCEPTOR: {
         result = JSObject::GetPropertyAttributesWithInterceptor(&it);
         if (result.IsNothing()) return MaybeHandle<Object>();
diff --git a/deps/v8/src/runtime/runtime-generator.cc b/deps/v8/src/runtime/runtime-generator.cc
index 362249c55df88e..555367c47baafd 100644
--- a/deps/v8/src/runtime/runtime-generator.cc
+++ b/deps/v8/src/runtime/runtime-generator.cc
@@ -110,7 +110,7 @@ RUNTIME_FUNCTION(Runtime_AsyncGeneratorReject) {
   UNREACHABLE();
 }
 
-RUNTIME_FUNCTION(Runtime_AsyncGeneratorYield) {
+RUNTIME_FUNCTION(Runtime_AsyncGeneratorYieldWithAwait) {
   // Runtime call is implemented in InterpreterIntrinsics and lowered in
   // JSIntrinsicLowering
   UNREACHABLE();
diff --git a/deps/v8/src/runtime/runtime-internal.cc b/deps/v8/src/runtime/runtime-internal.cc
index a4178ef983bf1d..aafb9fe18f42b0 100644
--- a/deps/v8/src/runtime/runtime-internal.cc
+++ b/deps/v8/src/runtime/runtime-internal.cc
@@ -19,8 +19,8 @@
 #include "src/utils/ostreams.h"
 
 #if V8_ENABLE_WEBASSEMBLY
-// TODO(jkummerow): Drop this when the "SaveAndClearThreadInWasmFlag"
-// short-term mitigation is no longer needed.
+// TODO(chromium:1236668): Drop this when the "SaveAndClearThreadInWasmFlag"
+// approach is no longer needed.
 #include "src/trap-handler/trap-handler.h"
 #endif  // V8_ENABLE_WEBASSEMBLY
 
@@ -104,7 +104,7 @@ RUNTIME_FUNCTION(Runtime_TerminateExecution) {
   THROW_NEW_ERROR_RETURN_FAILURE(isolate, call(message_id, arg0, arg1, arg2));
 
 RUNTIME_FUNCTION(Runtime_ThrowRangeError) {
-  if (FLAG_correctness_fuzzer_suppressions) {
+  if (v8_flags.correctness_fuzzer_suppressions) {
     DCHECK_LE(1, args.length());
     int message_id_smi = args.smi_value_at(0);
 
@@ -418,7 +418,7 @@ RUNTIME_FUNCTION(Runtime_BytecodeBudgetInterruptWithStackCheck_Maglev) {
 namespace {
 
 #if V8_ENABLE_WEBASSEMBLY
-class SaveAndClearThreadInWasmFlag {
+class V8_NODISCARD SaveAndClearThreadInWasmFlag {
  public:
   SaveAndClearThreadInWasmFlag() {
     if (trap_handler::IsTrapHandlerEnabled()) {
@@ -446,7 +446,8 @@ class SaveAndClearThreadInWasmFlag {};
 RUNTIME_FUNCTION(Runtime_AllocateInYoungGeneration) {
   HandleScope scope(isolate);
   DCHECK_EQ(2, args.length());
-  int size = args.smi_value_at(0);
+  // TODO(v8:13070): Align allocations in the builtins that call this.
+  int size = ALIGN_TO_ALLOCATION_ALIGNMENT(args.smi_value_at(0));
   int flags = args.smi_value_at(1);
   AllocationAlignment alignment =
       AllocateDoubleAlignFlag::decode(flags) ? kDoubleAligned : kTaggedAligned;
@@ -459,10 +460,10 @@ RUNTIME_FUNCTION(Runtime_AllocateInYoungGeneration) {
   }
 
 #if V8_ENABLE_WEBASSEMBLY
-  // Short-term mitigation for crbug.com/1236668. When this is called from
-  // WasmGC code, clear the "thread in wasm" flag, which is important in case
-  // any GC needs to happen.
-  // TODO(jkummerow): Find a better fix, likely by replacing the global flag.
+  // When this is called from WasmGC code, clear the "thread in wasm" flag,
+  // which is important in case any GC needs to happen.
+  // TODO(chromium:1236668): Find a better fix, likely by replacing the global
+  // flag.
   SaveAndClearThreadInWasmFlag clear_wasm_flag;
 #endif  // V8_ENABLE_WEBASSEMBLY
 
@@ -478,7 +479,8 @@ RUNTIME_FUNCTION(Runtime_AllocateInYoungGeneration) {
 RUNTIME_FUNCTION(Runtime_AllocateInOldGeneration) {
   HandleScope scope(isolate);
   DCHECK_EQ(2, args.length());
-  int size = args.smi_value_at(0);
+  // TODO(v8:13070): Align allocations in the builtins that call this.
+  int size = ALIGN_TO_ALLOCATION_ALIGNMENT(args.smi_value_at(0));
   int flags = args.smi_value_at(1);
   AllocationAlignment alignment =
       AllocateDoubleAlignFlag::decode(flags) ? kDoubleAligned : kTaggedAligned;
@@ -614,7 +616,7 @@ RUNTIME_FUNCTION(Runtime_GetAndResetRuntimeCallStats) {
   HandleScope scope(isolate);
   DCHECK_LE(args.length(), 2);
 #ifdef V8_RUNTIME_CALL_STATS
-  if (!FLAG_runtime_call_stats) {
+  if (!v8_flags.runtime_call_stats) {
     THROW_NEW_ERROR_RETURN_FAILURE(
         isolate, NewTypeError(MessageTemplate::kInvalid,
                               isolate->factory()->NewStringFromAsciiChecked(
diff --git a/deps/v8/src/runtime/runtime-literals.cc b/deps/v8/src/runtime/runtime-literals.cc
index fcfb9563703507..bb698867c88f20 100644
--- a/deps/v8/src/runtime/runtime-literals.cc
+++ b/deps/v8/src/runtime/runtime-literals.cc
@@ -263,14 +263,14 @@ class AllocationSiteCreationContext : public AllocationSiteContext {
       // AllocationSite.
       InitializeTraversal(isolate()->factory()->NewAllocationSite(true));
       scope_site = Handle<AllocationSite>(*top(), isolate());
-      if (FLAG_trace_creation_allocation_sites) {
+      if (v8_flags.trace_creation_allocation_sites) {
         PrintF("*** Creating top level %s AllocationSite %p\n", "Fat",
                reinterpret_cast<void*>(scope_site->ptr()));
       }
     } else {
       DCHECK(!current().is_null());
       scope_site = isolate()->factory()->NewAllocationSite(false);
-      if (FLAG_trace_creation_allocation_sites) {
+      if (v8_flags.trace_creation_allocation_sites) {
         PrintF(
             "*** Creating nested %s AllocationSite (top, current, new) (%p, "
             "%p, "
@@ -288,7 +288,7 @@ class AllocationSiteCreationContext : public AllocationSiteContext {
   void ExitScope(Handle<AllocationSite> scope_site, Handle<JSObject> object) {
     if (object.is_null()) return;
     scope_site->set_boilerplate(*object, kReleaseStore);
-    if (FLAG_trace_creation_allocation_sites) {
+    if (v8_flags.trace_creation_allocation_sites) {
       bool top_level =
           !scope_site.is_null() && top().is_identical_to(scope_site);
       if (top_level) {
diff --git a/deps/v8/src/runtime/runtime-object.cc b/deps/v8/src/runtime/runtime-object.cc
index e369e7720f6f15..56e58bea3e1c7a 100644
--- a/deps/v8/src/runtime/runtime-object.cc
+++ b/deps/v8/src/runtime/runtime-object.cc
@@ -517,6 +517,7 @@ RUNTIME_FUNCTION(Runtime_ObjectCreate) {
     THROW_NEW_ERROR_RETURN_FAILURE(
         isolate, NewTypeError(MessageTemplate::kProtoObjectOrNull, prototype));
   }
+
   // 2. Let obj be ObjectCreate(O).
   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
       isolate, obj, JSObject::ObjectCreate(isolate, prototype));
@@ -1174,35 +1175,6 @@ RUNTIME_FUNCTION(Runtime_DefineKeyedOwnPropertyInLiteral) {
   return *value;
 }
 
-RUNTIME_FUNCTION(Runtime_CollectTypeProfile) {
-  HandleScope scope(isolate);
-  DCHECK_EQ(3, args.length());
-  int position = args.smi_value_at(0);
-  Handle<Object> value = args.at(1);
-  Handle<HeapObject> maybe_vector = args.at<HeapObject>(2);
-
-  if (maybe_vector->IsUndefined()) {
-    return ReadOnlyRoots(isolate).undefined_value();
-  }
-  Handle<FeedbackVector> vector = args.at<FeedbackVector>(2);
-
-  Handle<String> type = Object::TypeOf(isolate, value);
-  if (value->IsJSReceiver()) {
-    Handle<JSReceiver> object = Handle<JSReceiver>::cast(value);
-    type = JSReceiver::GetConstructorName(isolate, object);
-  } else if (value->IsNull(isolate)) {
-    // typeof(null) is object. But it's more user-friendly to annotate
-    // null as type "null".
-    type = Handle<String>(ReadOnlyRoots(isolate).null_string(), isolate);
-  }
-
-  DCHECK(vector->metadata().HasTypeProfileSlot());
-  FeedbackNexus nexus(vector, vector->GetTypeProfileSlot());
-  nexus.Collect(type, position);
-
-  return ReadOnlyRoots(isolate).undefined_value();
-}
-
 RUNTIME_FUNCTION(Runtime_HasFastPackedElements) {
   SealHandleScope shs(isolate);
   DCHECK_EQ(1, args.length());
diff --git a/deps/v8/src/runtime/runtime-regexp.cc b/deps/v8/src/runtime/runtime-regexp.cc
index d9ec9c598a4894..2fb47682a8130b 100644
--- a/deps/v8/src/runtime/runtime-regexp.cc
+++ b/deps/v8/src/runtime/runtime-regexp.cc
@@ -1177,9 +1177,9 @@ static Object SearchRegExpMultiple(Isolate* isolate, Handle<String> subject,
   // native code expects an array to store all the matches, and the bytecode
   // matches one at a time, so it's easier to tier-up to native code from the
   // start.
-  if (FLAG_regexp_tier_up && regexp->type_tag() == JSRegExp::IRREGEXP) {
+  if (v8_flags.regexp_tier_up && regexp->type_tag() == JSRegExp::IRREGEXP) {
     regexp->MarkTierUpForNextExec();
-    if (FLAG_trace_regexp_tier_up) {
+    if (v8_flags.trace_regexp_tier_up) {
       PrintF("Forcing tier-up of JSRegExp object %p in SearchRegExpMultiple\n",
              reinterpret_cast<void*>(regexp->ptr()));
     }
@@ -1426,9 +1426,9 @@ V8_WARN_UNUSED_RESULT MaybeHandle<String> RegExpReplace(
     // native code expects an array to store all the matches, and the bytecode
     // matches one at a time, so it's easier to tier-up to native code from the
     // start.
-    if (FLAG_regexp_tier_up && regexp->type_tag() == JSRegExp::IRREGEXP) {
+    if (v8_flags.regexp_tier_up && regexp->type_tag() == JSRegExp::IRREGEXP) {
       regexp->MarkTierUpForNextExec();
-      if (FLAG_trace_regexp_tier_up) {
+      if (v8_flags.trace_regexp_tier_up) {
         PrintF("Forcing tier-up of JSRegExp object %p in RegExpReplace\n",
                reinterpret_cast<void*>(regexp->ptr()));
       }
diff --git a/deps/v8/src/runtime/runtime-strings.cc b/deps/v8/src/runtime/runtime-strings.cc
index 621788f98c574e..1f2da1cd19d8b2 100644
--- a/deps/v8/src/runtime/runtime-strings.cc
+++ b/deps/v8/src/runtime/runtime-strings.cc
@@ -11,9 +11,46 @@
 #include "src/objects/smi.h"
 #include "src/strings/string-builder-inl.h"
 
+#if V8_ENABLE_WEBASSEMBLY
+// TODO(chromium:1236668): Drop this when the "SaveAndClearThreadInWasmFlag"
+// approach is no longer needed.
+#include "src/trap-handler/trap-handler.h"
+#endif  // V8_ENABLE_WEBASSEMBLY
+
 namespace v8 {
 namespace internal {
 
+namespace {
+
+#if V8_ENABLE_WEBASSEMBLY
+class V8_NODISCARD SaveAndClearThreadInWasmFlag {
+ public:
+  explicit SaveAndClearThreadInWasmFlag(Isolate* isolate) : isolate_(isolate) {
+    if (trap_handler::IsTrapHandlerEnabled()) {
+      if (trap_handler::IsThreadInWasm()) {
+        thread_was_in_wasm_ = true;
+        trap_handler::ClearThreadInWasm();
+      }
+    }
+  }
+  ~SaveAndClearThreadInWasmFlag() {
+    if (thread_was_in_wasm_ && !isolate_->has_pending_exception()) {
+      trap_handler::SetThreadInWasm();
+    }
+  }
+
+ private:
+  bool thread_was_in_wasm_{false};
+  Isolate* isolate_;
+};
+#define CLEAR_THREAD_IN_WASM_SCOPE \
+  SaveAndClearThreadInWasmFlag non_wasm_scope(isolate)
+#else
+#define CLEAR_THREAD_IN_WASM_SCOPE (void)0
+#endif  // V8_ENABLE_WEBASSEMBLY
+
+}  // namespace
+
 RUNTIME_FUNCTION(Runtime_GetSubstitution) {
   HandleScope scope(isolate);
   DCHECK_EQ(5, args.length());
@@ -154,6 +191,8 @@ RUNTIME_FUNCTION(Runtime_StringSubstring) {
 }
 
 RUNTIME_FUNCTION(Runtime_StringAdd) {
+  // This is used by Wasm stringrefs.
+  CLEAR_THREAD_IN_WASM_SCOPE;
   HandleScope scope(isolate);
   DCHECK_EQ(2, args.length());
   Handle<String> str1 = args.at<String>(0);
diff --git a/deps/v8/src/runtime/runtime-test.cc b/deps/v8/src/runtime/runtime-test.cc
index 5e39cffc4f70a4..793b0d8776299b 100644
--- a/deps/v8/src/runtime/runtime-test.cc
+++ b/deps/v8/src/runtime/runtime-test.cc
@@ -20,9 +20,10 @@
 #include "src/execution/isolate-inl.h"
 #include "src/execution/protectors-inl.h"
 #include "src/execution/tiering-manager.h"
-#include "src/heap/heap-inl.h"  // For ToBoolean. TODO(jkummerow): Drop.
 #include "src/heap/heap-write-barrier-inl.h"
+#include "src/heap/pretenuring-handler-inl.h"
 #include "src/ic/stub-cache.h"
+#include "src/objects/js-collection-inl.h"
 #ifdef V8_ENABLE_MAGLEV
 #include "src/maglev/maglev-concurrent-dispatcher.h"
 #endif  // V8_ENABLE_MAGLEV
@@ -48,19 +49,19 @@ namespace internal {
 
 namespace {
 V8_WARN_UNUSED_RESULT Object CrashUnlessFuzzing(Isolate* isolate) {
-  CHECK(FLAG_fuzzing);
+  CHECK(v8_flags.fuzzing);
   return ReadOnlyRoots(isolate).undefined_value();
 }
 
 V8_WARN_UNUSED_RESULT bool CrashUnlessFuzzingReturnFalse(Isolate* isolate) {
-  CHECK(FLAG_fuzzing);
+  CHECK(v8_flags.fuzzing);
   return false;
 }
 
 // Returns |value| unless correctness-fuzzer-supressions is enabled,
 // otherwise returns undefined_value.
 V8_WARN_UNUSED_RESULT Object ReturnFuzzSafe(Object value, Isolate* isolate) {
-  return FLAG_correctness_fuzzer_suppressions
+  return v8_flags.correctness_fuzzer_suppressions
              ? ReadOnlyRoots(isolate).undefined_value()
              : value;
 }
@@ -228,7 +229,7 @@ RUNTIME_FUNCTION(Runtime_RuntimeEvaluateREPL) {
 RUNTIME_FUNCTION(Runtime_ICsAreEnabled) {
   SealHandleScope shs(isolate);
   DCHECK_EQ(0, args.length());
-  return isolate->heap()->ToBoolean(FLAG_use_ic);
+  return isolate->heap()->ToBoolean(v8_flags.use_ic);
 }
 
 RUNTIME_FUNCTION(Runtime_IsConcurrentRecompilationSupported) {
@@ -268,7 +269,7 @@ bool CanOptimizeFunction<CodeKind::TURBOFAN>(
     return CrashUnlessFuzzingReturnFalse(isolate);
   }
 
-  if (!FLAG_turbofan) return false;
+  if (!v8_flags.turbofan) return false;
 
   if (function->shared().optimization_disabled() &&
       function->shared().disabled_optimization_reason() ==
@@ -280,7 +281,7 @@ bool CanOptimizeFunction<CodeKind::TURBOFAN>(
     return CrashUnlessFuzzingReturnFalse(isolate);
   }
 
-  if (FLAG_testing_d8_test_runner) {
+  if (v8_flags.testing_d8_test_runner) {
     PendingOptimizationTable::MarkedForOptimization(isolate, function);
   }
 
@@ -289,7 +290,7 @@ bool CanOptimizeFunction<CodeKind::TURBOFAN>(
       function->HasAvailableCodeKind(kind)) {
     DCHECK(function->HasAttachedOptimizedCode() ||
            function->ChecksTieringState());
-    if (FLAG_testing_d8_test_runner) {
+    if (v8_flags.testing_d8_test_runner) {
       PendingOptimizationTable::FunctionWasOptimized(isolate, function);
     }
     return false;
@@ -303,7 +304,7 @@ template <>
 bool CanOptimizeFunction<CodeKind::MAGLEV>(Handle<JSFunction> function,
                                            Isolate* isolate,
                                            IsCompiledScope* is_compiled_scope) {
-  if (!FLAG_maglev) return false;
+  if (!v8_flags.maglev) return false;
 
   CHECK(!IsAsmWasmFunction(isolate, *function));
 
@@ -372,7 +373,7 @@ bool EnsureFeedbackVector(Isolate* isolate, Handle<JSFunction> function) {
   // If the JSFunction isn't compiled but it has a initialized feedback cell
   // then no need to compile. CompileLazy builtin would handle these cases by
   // installing the code from SFI. Calling compile here may cause another
-  // optimization if FLAG_always_turbofan is set.
+  // optimization if v8_flags.always_turbofan is set.
   bool needs_compilation =
       !function->is_compiled() && !function->has_closure_feedback_cell_array();
   if (needs_compilation &&
@@ -482,17 +483,17 @@ RUNTIME_FUNCTION(Runtime_ActiveTierIsTurbofan) {
 
 RUNTIME_FUNCTION(Runtime_IsSparkplugEnabled) {
   DCHECK_EQ(args.length(), 0);
-  return isolate->heap()->ToBoolean(FLAG_sparkplug);
+  return isolate->heap()->ToBoolean(v8_flags.sparkplug);
 }
 
 RUNTIME_FUNCTION(Runtime_IsMaglevEnabled) {
   DCHECK_EQ(args.length(), 0);
-  return isolate->heap()->ToBoolean(FLAG_maglev);
+  return isolate->heap()->ToBoolean(v8_flags.maglev);
 }
 
 RUNTIME_FUNCTION(Runtime_IsTurbofanEnabled) {
   DCHECK_EQ(args.length(), 0);
-  return isolate->heap()->ToBoolean(FLAG_turbofan);
+  return isolate->heap()->ToBoolean(v8_flags.turbofan);
 }
 
 RUNTIME_FUNCTION(Runtime_CurrentFrameIsTurbofan) {
@@ -582,7 +583,7 @@ RUNTIME_FUNCTION(Runtime_PrepareFunctionForOptimization) {
 
   // Hold onto the bytecode array between marking and optimization to ensure
   // it's not flushed.
-  if (FLAG_testing_d8_test_runner) {
+  if (v8_flags.testing_d8_test_runner) {
     PendingOptimizationTable::PreparedForOptimization(
         isolate, function, allow_heuristic_optimization);
   }
@@ -657,7 +658,7 @@ RUNTIME_FUNCTION(Runtime_OptimizeOsr) {
   if (!it.done()) function = handle(it.frame()->function(), isolate);
   if (function.is_null()) return CrashUnlessFuzzing(isolate);
 
-  if (V8_UNLIKELY(!FLAG_turbofan) || V8_UNLIKELY(!FLAG_use_osr)) {
+  if (V8_UNLIKELY(!v8_flags.turbofan) || V8_UNLIKELY(!v8_flags.use_osr)) {
     return ReadOnlyRoots(isolate).undefined_value();
   }
 
@@ -671,7 +672,7 @@ RUNTIME_FUNCTION(Runtime_OptimizeOsr) {
     return CrashUnlessFuzzing(isolate);
   }
 
-  if (FLAG_testing_d8_test_runner) {
+  if (v8_flags.testing_d8_test_runner) {
     PendingOptimizationTable::MarkedForOptimization(isolate, function);
   }
 
@@ -680,7 +681,7 @@ RUNTIME_FUNCTION(Runtime_OptimizeOsr) {
            function->ChecksTieringState());
     // If function is already optimized, remove the bytecode array from the
     // pending optimize for test table and return.
-    if (FLAG_testing_d8_test_runner) {
+    if (v8_flags.testing_d8_test_runner) {
       PendingOptimizationTable::FunctionWasOptimized(isolate, function);
     }
     return ReadOnlyRoots(isolate).undefined_value();
@@ -706,7 +707,7 @@ RUNTIME_FUNCTION(Runtime_OptimizeOsr) {
   // If not (e.g. because we enter a nested loop first), the next JumpLoop will
   // see the cached OSR code with a mismatched offset, and trigger
   // non-concurrent OSR compilation and installation.
-  if (isolate->concurrent_recompilation_enabled() && FLAG_concurrent_osr) {
+  if (isolate->concurrent_recompilation_enabled() && v8_flags.concurrent_osr) {
     const BytecodeOffset osr_offset =
         OffsetOfNextJumpLoop(isolate, UnoptimizedFrame::cast(it.frame()));
     if (osr_offset.IsNone()) {
@@ -740,7 +741,7 @@ RUNTIME_FUNCTION(Runtime_BaselineOsr) {
   JavaScriptFrameIterator it(isolate);
   Handle<JSFunction> function = handle(it.frame()->function(), isolate);
   if (function.is_null()) return CrashUnlessFuzzing(isolate);
-  if (!FLAG_sparkplug || !FLAG_use_osr) {
+  if (!v8_flags.sparkplug || !v8_flags.use_osr) {
     return ReadOnlyRoots(isolate).undefined_value();
   }
   if (!it.frame()->is_unoptimized()) {
@@ -787,7 +788,7 @@ RUNTIME_FUNCTION(Runtime_GetOptimizationStatus) {
   DCHECK_EQ(args.length(), 1);
 
   int status = 0;
-  if (FLAG_lite_mode || FLAG_jitless) {
+  if (v8_flags.lite_mode || v8_flags.jitless) {
     // Both jitless and lite modes cannot optimize. Unit tests should handle
     // these the same way. In the future, the two flags may become synonyms.
     status |= static_cast<int>(OptimizationStatus::kLiteMode);
@@ -795,10 +796,10 @@ RUNTIME_FUNCTION(Runtime_GetOptimizationStatus) {
   if (!isolate->use_optimizer()) {
     status |= static_cast<int>(OptimizationStatus::kNeverOptimize);
   }
-  if (FLAG_always_turbofan || FLAG_prepare_always_turbofan) {
+  if (v8_flags.always_turbofan || v8_flags.prepare_always_turbofan) {
     status |= static_cast<int>(OptimizationStatus::kAlwaysOptimize);
   }
-  if (FLAG_deopt_every_n_times) {
+  if (v8_flags.deopt_every_n_times) {
     status |= static_cast<int>(OptimizationStatus::kMaybeDeopted);
   }
 
@@ -1004,7 +1005,7 @@ int GetSpaceRemainingOnCurrentPage(v8::internal::NewSpace* space) {
 }
 
 void FillUpOneNewSpacePage(Isolate* isolate, Heap* heap) {
-  DCHECK(!FLAG_single_generation);
+  DCHECK(!v8_flags.single_generation);
   PauseAllocationObserversScope pause_observers(heap);
   NewSpace* space = heap->new_space();
   // We cannot rely on `space->limit()` to point to the end of the current page
@@ -1072,7 +1073,7 @@ class FileOutputStream : public v8::OutputStream {
 };
 
 RUNTIME_FUNCTION(Runtime_TakeHeapSnapshot) {
-  if (FLAG_fuzzing) {
+  if (v8_flags.fuzzing) {
     // We don't want to create snapshots in fuzzers.
     return ReadOnlyRoots(isolate).undefined_value();
   }
@@ -1180,7 +1181,7 @@ RUNTIME_FUNCTION(Runtime_DebugTrackRetainingPath) {
   HandleScope scope(isolate);
   DCHECK_LE(1, args.length());
   DCHECK_GE(2, args.length());
-  CHECK(FLAG_track_retaining_path);
+  CHECK(v8_flags.track_retaining_path);
   Handle<HeapObject> object = args.at<HeapObject>(0);
   RetainingPathOption option = RetainingPathOption::kDefault;
   if (args.length() == 2) {
@@ -1248,7 +1249,7 @@ RUNTIME_FUNCTION(Runtime_AbortJS) {
   HandleScope scope(isolate);
   DCHECK_EQ(1, args.length());
   Handle<String> message = args.at<String>(0);
-  if (FLAG_disable_abortjs) {
+  if (v8_flags.disable_abortjs) {
     base::OS::PrintError("[disabled] abort: %s\n", message->ToCString().get());
     return Object();
   }
@@ -1378,12 +1379,15 @@ RUNTIME_FUNCTION(Runtime_PretenureAllocationSite) {
     return ReturnFuzzSafe(ReadOnlyRoots(isolate).false_value(), isolate);
   }
 
+  PretenturingHandler* pretenuring_handler = heap->pretenuring_handler();
   AllocationMemento memento =
-      heap->FindAllocationMemento<Heap::kForRuntime>(object.map(), object);
+      pretenuring_handler
+          ->FindAllocationMemento<PretenturingHandler::kForRuntime>(
+              object.map(), object);
   if (memento.is_null())
     return ReturnFuzzSafe(ReadOnlyRoots(isolate).false_value(), isolate);
   AllocationSite site = memento.GetAllocationSite();
-  heap->PretenureAllocationSiteOnNextCollection(site);
+  pretenuring_handler->PretenureAllocationSiteOnNextCollection(site);
   return ReturnFuzzSafe(ReadOnlyRoots(isolate).true_value(), isolate);
 }
 
@@ -1735,7 +1739,8 @@ RUNTIME_FUNCTION(Runtime_IsInternalizedString) {
 
 RUNTIME_FUNCTION(Runtime_SharedGC) {
   SealHandleScope scope(isolate);
-  isolate->heap()->CollectSharedGarbage(GarbageCollectionReason::kTesting);
+  isolate->heap()->CollectGarbageShared(isolate->main_thread_local_heap(),
+                                        GarbageCollectionReason::kTesting);
   return ReadOnlyRoots(isolate).undefined_value();
 }
 
@@ -1746,5 +1751,14 @@ RUNTIME_FUNCTION(Runtime_AtomicsConditionNumWaitersForTesting) {
   return cv->NumWaitersForTesting(isolate);
 }
 
+RUNTIME_FUNCTION(Runtime_GetWeakCollectionSize) {
+  HandleScope scope(isolate);
+  DCHECK_EQ(1, args.length());
+  Handle<JSWeakCollection> collection = args.at<JSWeakCollection>(0);
+
+  return Smi::FromInt(
+      EphemeronHashTable::cast(collection->table()).NumberOfElements());
+}
+
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/runtime/runtime-trace.cc b/deps/v8/src/runtime/runtime-trace.cc
index 536d0eed11c7af..7d82f9d5386374 100644
--- a/deps/v8/src/runtime/runtime-trace.cc
+++ b/deps/v8/src/runtime/runtime-trace.cc
@@ -61,7 +61,7 @@ void PrintRegisters(UnoptimizedFrame* frame, std::ostream& os, bool is_input,
   static const char* kOutputColourCode = "\033[0;35m";
   static const char* kNormalColourCode = "\033[0;m";
   const char* kArrowDirection = is_input ? " -> " : " <- ";
-  if (FLAG_log_colour) {
+  if (v8_flags.log_colour) {
     os << (is_input ? kInputColourCode : kOutputColourCode);
   }
 
@@ -97,7 +97,7 @@ void PrintRegisters(UnoptimizedFrame* frame, std::ostream& os, bool is_input,
                        kArrowDirection,
                        interpreter::Register::FromShortStar(bytecode), 1);
   }
-  if (FLAG_log_colour) {
+  if (v8_flags.log_colour) {
     os << kNormalColourCode;
   }
 }
@@ -105,7 +105,7 @@ void PrintRegisters(UnoptimizedFrame* frame, std::ostream& os, bool is_input,
 }  // namespace
 
 RUNTIME_FUNCTION(Runtime_TraceUnoptimizedBytecodeEntry) {
-  if (!FLAG_trace_ignition && !FLAG_trace_baseline_exec) {
+  if (!v8_flags.trace_ignition && !v8_flags.trace_baseline_exec) {
     return ReadOnlyRoots(isolate).undefined_value();
   }
 
@@ -113,10 +113,10 @@ RUNTIME_FUNCTION(Runtime_TraceUnoptimizedBytecodeEntry) {
   UnoptimizedFrame* frame =
       reinterpret_cast<UnoptimizedFrame*>(frame_iterator.frame());
 
-  if (frame->is_interpreted() && !FLAG_trace_ignition) {
+  if (frame->is_interpreted() && !v8_flags.trace_ignition) {
     return ReadOnlyRoots(isolate).undefined_value();
   }
-  if (frame->is_baseline() && !FLAG_trace_baseline_exec) {
+  if (frame->is_baseline() && !v8_flags.trace_baseline_exec) {
     return ReadOnlyRoots(isolate).undefined_value();
   }
 
@@ -155,7 +155,7 @@ RUNTIME_FUNCTION(Runtime_TraceUnoptimizedBytecodeEntry) {
 }
 
 RUNTIME_FUNCTION(Runtime_TraceUnoptimizedBytecodeExit) {
-  if (!FLAG_trace_ignition && !FLAG_trace_baseline_exec) {
+  if (!v8_flags.trace_ignition && !v8_flags.trace_baseline_exec) {
     return ReadOnlyRoots(isolate).undefined_value();
   }
 
@@ -163,10 +163,10 @@ RUNTIME_FUNCTION(Runtime_TraceUnoptimizedBytecodeExit) {
   UnoptimizedFrame* frame =
       reinterpret_cast<UnoptimizedFrame*>(frame_iterator.frame());
 
-  if (frame->is_interpreted() && !FLAG_trace_ignition) {
+  if (frame->is_interpreted() && !v8_flags.trace_ignition) {
     return ReadOnlyRoots(isolate).undefined_value();
   }
-  if (frame->is_baseline() && !FLAG_trace_baseline_exec) {
+  if (frame->is_baseline() && !v8_flags.trace_baseline_exec) {
     return ReadOnlyRoots(isolate).undefined_value();
   }
 
@@ -199,7 +199,7 @@ RUNTIME_FUNCTION(Runtime_TraceUnoptimizedBytecodeExit) {
 #ifdef V8_TRACE_FEEDBACK_UPDATES
 
 RUNTIME_FUNCTION(Runtime_TraceUpdateFeedback) {
-  if (!FLAG_trace_feedback_updates) {
+  if (!v8_flags.trace_feedback_updates) {
     return ReadOnlyRoots(isolate).undefined_value();
   }
 
diff --git a/deps/v8/src/runtime/runtime-typedarray.cc b/deps/v8/src/runtime/runtime-typedarray.cc
index 399df74228ab66..71b31f5633a503 100644
--- a/deps/v8/src/runtime/runtime-typedarray.cc
+++ b/deps/v8/src/runtime/runtime-typedarray.cc
@@ -90,7 +90,7 @@ RUNTIME_FUNCTION(Runtime_TypedArraySortFast) {
   DCHECK(!array->IsOutOfBounds());
 
 #if MULTI_MAPPED_ALLOCATOR_AVAILABLE
-  if (FLAG_multi_mapped_mock_allocator) {
+  if (v8_flags.multi_mapped_mock_allocator) {
     // Sorting is meaningless with the mock allocator, and std::sort
     // might crash (because aliasing elements violate its assumptions).
     return *array;
diff --git a/deps/v8/src/runtime/runtime-wasm.cc b/deps/v8/src/runtime/runtime-wasm.cc
index d6c9bd33c6bb80..a574e037bb14f2 100644
--- a/deps/v8/src/runtime/runtime-wasm.cc
+++ b/deps/v8/src/runtime/runtime-wasm.cc
@@ -243,19 +243,19 @@ RUNTIME_FUNCTION(Runtime_WasmCompileLazy) {
   Handle<WasmInstanceObject> instance(WasmInstanceObject::cast(args[0]),
                                       isolate);
   int func_index = args.smi_value_at(1);
+
+  // Save the native_module on the stack, where the GC will use it to scan
+  // WasmCompileLazy stack frames.
   wasm::NativeModule** native_module_stack_slot =
       reinterpret_cast<wasm::NativeModule**>(args.address_of_arg_at(2));
-  *native_module_stack_slot = nullptr;
+  *native_module_stack_slot = instance->module_object().native_module();
 
   DCHECK(isolate->context().is_null());
   isolate->set_context(instance->native_context());
-  bool success = wasm::CompileLazy(isolate, instance, func_index,
-                                   native_module_stack_slot);
+  bool success = wasm::CompileLazy(isolate, instance, func_index);
   if (!success) {
-    {
-      wasm::ThrowLazyCompilationError(
-          isolate, instance->module_object().native_module(), func_index);
-    }
+    wasm::ThrowLazyCompilationError(
+        isolate, instance->module_object().native_module(), func_index);
     DCHECK(isolate->has_pending_exception());
     return ReadOnlyRoots{isolate}.exception();
   }
@@ -293,6 +293,8 @@ RUNTIME_FUNCTION(Runtime_WasmCompileWrapper) {
   const int function_index = function_data->function_index();
   const wasm::WasmFunction& function = module->functions[function_index];
   const wasm::FunctionSig* sig = function.sig;
+  const uint32_t canonical_sig_index =
+      module->isorecursive_canonical_type_ids[function.sig_index];
 
   // The start function is not guaranteed to be registered as
   // an exported function (although it is called as one).
@@ -307,7 +309,7 @@ RUNTIME_FUNCTION(Runtime_WasmCompileWrapper) {
 
   Handle<CodeT> wrapper_code =
       wasm::JSToWasmWrapperCompilationUnit::CompileSpecificJSToWasmWrapper(
-          isolate, sig, module);
+          isolate, sig, canonical_sig_index, module);
 
   // Replace the wrapper for the function that triggered the tier-up.
   // This is to verify that the wrapper is replaced, even if the function
@@ -868,6 +870,27 @@ RUNTIME_FUNCTION(Runtime_WasmCreateResumePromise) {
   return *result;
 }
 
+#define RETURN_RESULT_OR_TRAP(call)                                            \
+  do {                                                                         \
+    Handle<Object> result;                                                     \
+    if (!(call).ToHandle(&result)) {                                           \
+      DCHECK(isolate->has_pending_exception());                                \
+      /* Mark any exception as uncatchable by Wasm. */                         \
+      Handle<JSObject> exception(JSObject::cast(isolate->pending_exception()), \
+                                 isolate);                                     \
+      Handle<Name> uncatchable =                                               \
+          isolate->factory()->wasm_uncatchable_symbol();                       \
+      LookupIterator it(isolate, exception, uncatchable, LookupIterator::OWN); \
+      if (!JSReceiver::HasProperty(&it).FromJust()) {                          \
+        JSObject::AddProperty(isolate, exception, uncatchable,                 \
+                              isolate->factory()->true_value(), NONE);         \
+      }                                                                        \
+      return ReadOnlyRoots(isolate).exception();                               \
+    }                                                                          \
+    DCHECK(!isolate->has_pending_exception());                                 \
+    return *result;                                                            \
+  } while (false)
+
 // Returns the new string if the operation succeeds.  Otherwise throws an
 // exception and returns an empty result.
 RUNTIME_FUNCTION(Runtime_WasmStringNewWtf8) {
@@ -894,8 +917,8 @@ RUNTIME_FUNCTION(Runtime_WasmStringNewWtf8) {
 
   const base::Vector<const uint8_t> bytes{instance.memory_start() + offset,
                                           size};
-  RETURN_RESULT_OR_FAILURE(
-      isolate, isolate->factory()->NewStringFromUtf8(bytes, utf8_variant));
+  RETURN_RESULT_OR_TRAP(
+      isolate->factory()->NewStringFromUtf8(bytes, utf8_variant));
 }
 
 RUNTIME_FUNCTION(Runtime_WasmStringNewWtf8Array) {
@@ -911,8 +934,8 @@ RUNTIME_FUNCTION(Runtime_WasmStringNewWtf8Array) {
          static_cast<uint32_t>(unibrow::Utf8Variant::kLastUtf8Variant));
   auto utf8_variant = static_cast<unibrow::Utf8Variant>(utf8_variant_value);
 
-  RETURN_RESULT_OR_FAILURE(isolate, isolate->factory()->NewStringFromUtf8(
-                                        array, start, end, utf8_variant));
+  RETURN_RESULT_OR_TRAP(
+      isolate->factory()->NewStringFromUtf8(array, start, end, utf8_variant));
 }
 
 RUNTIME_FUNCTION(Runtime_WasmStringNewWtf16) {
@@ -938,10 +961,8 @@ RUNTIME_FUNCTION(Runtime_WasmStringNewWtf16) {
 
   const byte* bytes = instance.memory_start() + offset;
   const base::uc16* codeunits = reinterpret_cast<const base::uc16*>(bytes);
-  // TODO(12868): Override any exception with an uncatchable-by-wasm trap.
-  RETURN_RESULT_OR_FAILURE(isolate,
-                           isolate->factory()->NewStringFromTwoByteLittleEndian(
-                               {codeunits, size_in_codeunits}));
+  RETURN_RESULT_OR_TRAP(isolate->factory()->NewStringFromTwoByteLittleEndian(
+      {codeunits, size_in_codeunits}));
 }
 
 RUNTIME_FUNCTION(Runtime_WasmStringNewWtf16Array) {
@@ -952,9 +973,8 @@ RUNTIME_FUNCTION(Runtime_WasmStringNewWtf16Array) {
   uint32_t start = NumberToUint32(args[1]);
   uint32_t end = NumberToUint32(args[2]);
 
-  // TODO(12868): Override any exception with an uncatchable-by-wasm trap.
-  RETURN_RESULT_OR_FAILURE(
-      isolate, isolate->factory()->NewStringFromUtf16(array, start, end));
+  RETURN_RESULT_OR_TRAP(
+      isolate->factory()->NewStringFromUtf16(array, start, end));
 }
 
 // Returns the new string if the operation succeeds.  Otherwise traps.
@@ -1289,9 +1309,12 @@ RUNTIME_FUNCTION(Runtime_WasmStringViewWtf8Slice) {
   DCHECK_LT(start, end);
   DCHECK(base::IsInBounds<size_t>(start, end - start, array->length()));
 
-  RETURN_RESULT_OR_FAILURE(isolate,
-                           isolate->factory()->NewStringFromUtf8(
-                               array, start, end, unibrow::Utf8Variant::kWtf8));
+  // This can't throw because the result can't be too long if the input wasn't,
+  // and encoding failures are ruled out too because {start}/{end} are aligned.
+  return *isolate->factory()
+              ->NewStringFromUtf8(array, start, end,
+                                  unibrow::Utf8Variant::kWtf8)
+              .ToHandleChecked();
 }
 
 }  // namespace internal
diff --git a/deps/v8/src/runtime/runtime-weak-refs.cc b/deps/v8/src/runtime/runtime-weak-refs.cc
index f3c6f63ebcb6d7..ff60813b434bef 100644
--- a/deps/v8/src/runtime/runtime-weak-refs.cc
+++ b/deps/v8/src/runtime/runtime-weak-refs.cc
@@ -2,10 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "src/runtime/runtime-utils.h"
-
 #include "src/execution/arguments-inl.h"
 #include "src/objects/js-weak-refs-inl.h"
+#include "src/runtime/runtime-utils.h"
 
 namespace v8 {
 namespace internal {
@@ -44,7 +43,8 @@ RUNTIME_FUNCTION(
 RUNTIME_FUNCTION(Runtime_JSWeakRefAddToKeptObjects) {
   HandleScope scope(isolate);
   DCHECK_EQ(1, args.length());
-  Handle<JSReceiver> object = args.at<JSReceiver>(0);
+  Handle<HeapObject> object = args.at<HeapObject>(0);
+  DCHECK(object->CanBeHeldWeakly());
 
   isolate->heap()->KeepDuringJob(object);
 
diff --git a/deps/v8/src/runtime/runtime.cc b/deps/v8/src/runtime/runtime.cc
index 8f6ff8ec45f725..b878193eee3c65 100644
--- a/deps/v8/src/runtime/runtime.cc
+++ b/deps/v8/src/runtime/runtime.cc
@@ -193,7 +193,7 @@ bool Runtime::MayAllocate(FunctionId id) {
 }
 
 bool Runtime::IsAllowListedForFuzzing(FunctionId id) {
-  CHECK(FLAG_fuzzing);
+  CHECK(v8_flags.fuzzing);
   switch (id) {
     // Runtime functions allowlisted for all fuzzers. Only add functions that
     // help increase coverage.
@@ -219,10 +219,10 @@ bool Runtime::IsAllowListedForFuzzing(FunctionId id) {
     case Runtime::kGetOptimizationStatus:
     case Runtime::kHeapObjectVerify:
     case Runtime::kIsBeingInterpreted:
-      return !FLAG_allow_natives_for_differential_fuzzing;
+      return !v8_flags.allow_natives_for_differential_fuzzing;
     case Runtime::kVerifyType:
-      return !FLAG_allow_natives_for_differential_fuzzing &&
-             !FLAG_concurrent_recompilation;
+      return !v8_flags.allow_natives_for_differential_fuzzing &&
+             !v8_flags.concurrent_recompilation;
     case Runtime::kBaselineOsr:
     case Runtime::kCompileBaseline:
       return ENABLE_SPARKPLUG;
diff --git a/deps/v8/src/runtime/runtime.h b/deps/v8/src/runtime/runtime.h
index 61f3d2a41d2c15..b15ed40d20bfa3 100644
--- a/deps/v8/src/runtime/runtime.h
+++ b/deps/v8/src/runtime/runtime.h
@@ -191,7 +191,7 @@ namespace internal {
   F(AsyncGeneratorHasCatchHandlerForPC, 1, 1) \
   I(AsyncGeneratorReject, 2, 1)               \
   I(AsyncGeneratorResolve, 3, 1)              \
-  I(AsyncGeneratorYield, 3, 1)                \
+  I(AsyncGeneratorYieldWithAwait, 3, 1)       \
   I(CreateJSGeneratorObject, 2, 1)            \
   I(GeneratorClose, 1, 1)                     \
   F(GeneratorGetFunction, 1, 1)               \
@@ -299,7 +299,6 @@ namespace internal {
   F(AddDictionaryProperty, 3, 1)                                       \
   F(AddPrivateBrand, 4, 1)                                             \
   F(AllocateHeapNumber, 0, 1)                                          \
-  F(CollectTypeProfile, 3, 1)                                          \
   F(CompleteInobjectSlackTrackingForMap, 1, 1)                         \
   I(CopyDataProperties, 2, 1)                                          \
   I(CopyDataPropertiesWithExcludedPropertiesOnStack, -1 /* >= 1 */, 1) \
@@ -512,6 +511,7 @@ namespace internal {
   F(GetInitializerFunction, 1, 1)             \
   F(GetOptimizationStatus, 1, 1)              \
   F(GetUndetectable, 0, 1)                    \
+  F(GetWeakCollectionSize, 1, 1)              \
   F(GlobalPrint, 1, 1)                        \
   F(HasDictionaryElements, 1, 1)              \
   F(HasDoubleElements, 1, 1)                  \
diff --git a/deps/v8/src/sandbox/bounded-size-inl.h b/deps/v8/src/sandbox/bounded-size-inl.h
new file mode 100644
index 00000000000000..49525ed403dd4d
--- /dev/null
+++ b/deps/v8/src/sandbox/bounded-size-inl.h
@@ -0,0 +1,36 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_SANDBOX_BOUNDED_SIZE_INL_H_
+#define V8_SANDBOX_BOUNDED_SIZE_INL_H_
+
+#include "include/v8-internal.h"
+#include "src/common/ptr-compr-inl.h"
+#include "src/sandbox/sandbox.h"
+#include "src/sandbox/sandboxed-pointer.h"
+
+namespace v8::internal {
+
+V8_INLINE size_t ReadBoundedSizeField(Address field_address) {
+#ifdef V8_ENABLE_SANDBOX
+  size_t raw_value = base::ReadUnalignedValue<size_t>(field_address);
+  return raw_value >> kBoundedSizeShift;
+#else
+  return ReadMaybeUnalignedValue<size_t>(field_address);
+#endif
+}
+
+V8_INLINE void WriteBoundedSizeField(Address field_address, size_t value) {
+#ifdef V8_ENABLE_SANDBOX
+  DCHECK_LE(value, kMaxSafeBufferSizeForSandbox);
+  size_t raw_value = value << kBoundedSizeShift;
+  base::WriteUnalignedValue<size_t>(field_address, raw_value);
+#else
+  WriteMaybeUnalignedValue<size_t>(field_address, value);
+#endif
+}
+
+}  // namespace v8::internal
+
+#endif  // V8_SANDBOX_BOUNDED_SIZE_INL_H_
diff --git a/deps/v8/src/sandbox/bounded-size.h b/deps/v8/src/sandbox/bounded-size.h
new file mode 100644
index 00000000000000..06e98b0489fb58
--- /dev/null
+++ b/deps/v8/src/sandbox/bounded-size.h
@@ -0,0 +1,28 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_SANDBOX_BOUNDED_SIZE_H_
+#define V8_SANDBOX_BOUNDED_SIZE_H_
+
+#include "src/common/globals.h"
+
+namespace v8::internal {
+
+//
+// BoundedSize accessors.
+//
+// A BoundedSize is just a regular size_t when the sandbox is disabled.
+// However, when the sandbox is enabled, a BoundedLength is guaranteed to be in
+// the range [0, kMaxSafeBufferSizeForSandbox]. This property is required to
+// ensure safe access to variable-sized buffers, in particular ArrayBuffers and
+// their views, located inside the sandbox.
+//
+
+V8_INLINE size_t ReadBoundedLengthField(Address field_address);
+
+V8_INLINE void WriteBoundedLengthField(Address field_address, size_t value);
+
+}  // namespace v8::internal
+
+#endif  // V8_SANDBOX_BOUNDED_SIZE_H_
diff --git a/deps/v8/src/sandbox/sandbox.cc b/deps/v8/src/sandbox/sandbox.cc
index 33d7046b066714..8738690f9c87bb 100644
--- a/deps/v8/src/sandbox/sandbox.cc
+++ b/deps/v8/src/sandbox/sandbox.cc
@@ -215,8 +215,8 @@ bool Sandbox::InitializeAsPartiallyReservedSandbox(v8::VirtualAddressSpace* vas,
   // ourselves, and so are potentially better positioned to determine a good
   // base address for the sandbox than the embedder.
   base::RandomNumberGenerator rng;
-  if (FLAG_random_seed != 0) {
-    rng.SetSeed(FLAG_random_seed);
+  if (v8_flags.random_seed != 0) {
+    rng.SetSeed(v8_flags.random_seed);
   }
 
   // We try to ensure that base + size is still (mostly) within the process'
diff --git a/deps/v8/src/snapshot/deserializer.cc b/deps/v8/src/snapshot/deserializer.cc
index b01a197b605728..d6592a5eeb0503 100644
--- a/deps/v8/src/snapshot/deserializer.cc
+++ b/deps/v8/src/snapshot/deserializer.cc
@@ -403,8 +403,9 @@ void Deserializer<IsolateT>::PostProcessNewJSReceiver(
       auto bs = backing_store(store_index);
       SharedFlag shared =
           bs && bs->is_shared() ? SharedFlag::kShared : SharedFlag::kNotShared;
-      DCHECK_IMPLIES(bs, buffer.is_resizable() == bs->is_resizable());
-      ResizableFlag resizable = bs && bs->is_resizable()
+      DCHECK_IMPLIES(bs,
+                     buffer.is_resizable_by_js() == bs->is_resizable_by_js());
+      ResizableFlag resizable = bs && bs->is_resizable_by_js()
                                     ? ResizableFlag::kResizable
                                     : ResizableFlag::kNotResizable;
       buffer.Setup(shared, resizable, bs);
@@ -452,7 +453,11 @@ void Deserializer<IsolateT>::PostProcessNewObject(Handle<Map> map,
         String result = *isolate()->string_table()->LookupKey(isolate(), &key);
 
         if (result != raw_obj) {
-          String::cast(raw_obj).MakeThin(isolate(), result);
+          // Updating invalidated object size from a background thread would
+          // race. We are allowed to skip this here since this string hasn't
+          // transitioned so far.
+          String::cast(raw_obj).MakeThin(isolate(), result,
+                                         UpdateInvalidatedObjectSize::kNo);
           // Mutate the given object handle so that the backreference entry is
           // also updated.
           obj.PatchValue(result);
@@ -732,7 +737,6 @@ class DeserializerRelocInfoVisitor {
 
   void VisitCodeTarget(Code host, RelocInfo* rinfo);
   void VisitEmbeddedPointer(Code host, RelocInfo* rinfo);
-  void VisitRuntimeEntry(Code host, RelocInfo* rinfo);
   void VisitExternalReference(Code host, RelocInfo* rinfo);
   void VisitInternalReference(Code host, RelocInfo* rinfo);
   void VisitOffHeapTarget(Code host, RelocInfo* rinfo);
@@ -759,12 +763,6 @@ void DeserializerRelocInfoVisitor::VisitEmbeddedPointer(Code host,
   rinfo->set_target_object(isolate()->heap(), object);
 }
 
-void DeserializerRelocInfoVisitor::VisitRuntimeEntry(Code host,
-                                                     RelocInfo* rinfo) {
-  // We no longer serialize code that contains runtime entries.
-  UNREACHABLE();
-}
-
 void DeserializerRelocInfoVisitor::VisitExternalReference(Code host,
                                                           RelocInfo* rinfo) {
   byte data = source().Get();
diff --git a/deps/v8/src/snapshot/deserializer.h b/deps/v8/src/snapshot/deserializer.h
index 130125a2319b9d..b19f88130802df 100644
--- a/deps/v8/src/snapshot/deserializer.h
+++ b/deps/v8/src/snapshot/deserializer.h
@@ -32,7 +32,7 @@ class Object;
 #if defined(V8_TARGET_ARCH_MIPS64) || defined(V8_TARGET_ARCH_PPC) ||      \
     defined(V8_TARGET_ARCH_S390) || defined(V8_TARGET_ARCH_PPC64) ||      \
     defined(V8_TARGET_ARCH_RISCV32) || defined(V8_TARGET_ARCH_RISCV64) || \
-    V8_EMBEDDED_CONSTANT_POOL
+    V8_EMBEDDED_CONSTANT_POOL_BOOL
 #define V8_CODE_EMBEDS_OBJECT_POINTER 1
 #else
 #define V8_CODE_EMBEDS_OBJECT_POINTER 0
@@ -245,7 +245,7 @@ class Deserializer : public SerializerDeserializer {
   // be in an invalid state
   class V8_NODISCARD DisableGCStats {
    public:
-    explicit DisableGCStats() {
+    DisableGCStats() {
       original_gc_stats_ = TracingFlags::gc_stats;
       TracingFlags::gc_stats = 0;
     }
diff --git a/deps/v8/src/snapshot/embedded/embedded-data-inl.h b/deps/v8/src/snapshot/embedded/embedded-data-inl.h
index e2ebb85263e36b..028bdd0713476f 100644
--- a/deps/v8/src/snapshot/embedded/embedded-data-inl.h
+++ b/deps/v8/src/snapshot/embedded/embedded-data-inl.h
@@ -69,7 +69,7 @@ Address EmbeddedData::SafepointTableStartOf(Builtin builtin) const {
 uint32_t EmbeddedData::SafepointTableSizeOf(Builtin builtin) const {
   DCHECK(Builtins::IsBuiltinId(builtin));
   const struct LayoutDescription& desc = LayoutDescription(builtin);
-#if V8_EMBEDDED_CONSTANT_POOL
+#if V8_EMBEDDED_CONSTANT_POOL_BOOL
   DCHECK_LE(desc.handler_table_offset, desc.constant_pool_offset);
 #else
   DCHECK_LE(desc.handler_table_offset, desc.code_comments_offset_offset);
@@ -88,7 +88,7 @@ Address EmbeddedData::HandlerTableStartOf(Builtin builtin) const {
 uint32_t EmbeddedData::HandlerTableSizeOf(Builtin builtin) const {
   DCHECK(Builtins::IsBuiltinId(builtin));
   const struct LayoutDescription& desc = LayoutDescription(builtin);
-#if V8_EMBEDDED_CONSTANT_POOL
+#if V8_EMBEDDED_CONSTANT_POOL_BOOL
   DCHECK_LE(desc.handler_table_offset, desc.constant_pool_offset);
   return desc.constant_pool_offset - desc.handler_table_offset;
 #else
@@ -99,7 +99,7 @@ uint32_t EmbeddedData::HandlerTableSizeOf(Builtin builtin) const {
 
 Address EmbeddedData::ConstantPoolStartOf(Builtin builtin) const {
   DCHECK(Builtins::IsBuiltinId(builtin));
-#if V8_EMBEDDED_CONSTANT_POOL
+#if V8_EMBEDDED_CONSTANT_POOL_BOOL
   const struct LayoutDescription& desc = LayoutDescription(builtin);
   const uint8_t* result = RawMetadata() + desc.constant_pool_offset;
   DCHECK_LE(desc.constant_pool_offset, data_size_);
@@ -111,7 +111,7 @@ Address EmbeddedData::ConstantPoolStartOf(Builtin builtin) const {
 
 uint32_t EmbeddedData::ConstantPoolSizeOf(Builtin builtin) const {
   DCHECK(Builtins::IsBuiltinId(builtin));
-#if V8_EMBEDDED_CONSTANT_POOL
+#if V8_EMBEDDED_CONSTANT_POOL_BOOL
   const struct LayoutDescription& desc = LayoutDescription(builtin);
   DCHECK_LE(desc.constant_pool_offset, desc.code_comments_offset_offset);
   return desc.code_comments_offset_offset - desc.constant_pool_offset;
diff --git a/deps/v8/src/snapshot/embedded/embedded-data.cc b/deps/v8/src/snapshot/embedded/embedded-data.cc
index 118eb8b581ae89..1260f1a6427858 100644
--- a/deps/v8/src/snapshot/embedded/embedded-data.cc
+++ b/deps/v8/src/snapshot/embedded/embedded-data.cc
@@ -317,7 +317,7 @@ EmbeddedData EmbeddedData::FromIsolate(Isolate* isolate) {
 
       layout_desc.handler_table_offset =
           raw_data_size + static_cast<uint32_t>(code.handler_table_offset());
-#if V8_EMBEDDED_CONSTANT_POOL
+#if V8_EMBEDDED_CONSTANT_POOL_BOOL
       layout_desc.constant_pool_offset =
           raw_data_size + static_cast<uint32_t>(code.constant_pool_offset());
 #endif
diff --git a/deps/v8/src/snapshot/embedded/embedded-data.h b/deps/v8/src/snapshot/embedded/embedded-data.h
index a78c030ba88233..4c5a1f998ac744 100644
--- a/deps/v8/src/snapshot/embedded/embedded-data.h
+++ b/deps/v8/src/snapshot/embedded/embedded-data.h
@@ -197,7 +197,7 @@ class EmbeddedData final {
     // The offsets describing inline metadata tables, relative to the start
     // of the embedded data section.
     uint32_t handler_table_offset;
-#if V8_EMBEDDED_CONSTANT_POOL
+#if V8_EMBEDDED_CONSTANT_POOL_BOOL
     uint32_t constant_pool_offset;
 #endif
     uint32_t code_comments_offset_offset;
@@ -215,7 +215,7 @@ class EmbeddedData final {
                 3 * kUInt32Size);
   static_assert(offsetof(LayoutDescription, handler_table_offset) ==
                 4 * kUInt32Size);
-#if V8_EMBEDDED_CONSTANT_POOL
+#if V8_EMBEDDED_CONSTANT_POOL_BOOL
   static_assert(offsetof(LayoutDescription, constant_pool_offset) ==
                 5 * kUInt32Size);
   static_assert(offsetof(LayoutDescription, code_comments_offset_offset) ==
diff --git a/deps/v8/src/snapshot/serializer.cc b/deps/v8/src/snapshot/serializer.cc
index 4410790f1925a8..13dcfdcc82ea18 100644
--- a/deps/v8/src/snapshot/serializer.cc
+++ b/deps/v8/src/snapshot/serializer.cc
@@ -522,7 +522,7 @@ void Serializer::ObjectSerializer::SerializeJSTypedArray() {
         CHECK_LE(byte_length_size, size_t{std::numeric_limits<int32_t>::max()});
         int32_t byte_length = static_cast<int32_t>(byte_length_size);
         Maybe<int32_t> max_byte_length = Nothing<int32_t>();
-        if (buffer.is_resizable()) {
+        if (buffer.is_resizable_by_js()) {
           CHECK_LE(buffer.max_byte_length(),
                    std::numeric_limits<int32_t>::max());
           max_byte_length =
@@ -558,7 +558,7 @@ void Serializer::ObjectSerializer::SerializeJSArrayBuffer() {
     CHECK_LE(buffer.byte_length(), std::numeric_limits<int32_t>::max());
     int32_t byte_length = static_cast<int32_t>(buffer.byte_length());
     Maybe<int32_t> max_byte_length = Nothing<int32_t>();
-    if (buffer.is_resizable()) {
+    if (buffer.is_resizable_by_js()) {
       CHECK_LE(buffer.max_byte_length(), std::numeric_limits<int32_t>::max());
       max_byte_length = Just(static_cast<int32_t>(buffer.max_byte_length()));
     }
@@ -788,6 +788,8 @@ SnapshotSpace GetSnapshotSpace(HeapObject object) {
         return SnapshotSpace::kCode;
       case MAP_SPACE:
         return SnapshotSpace::kMap;
+      case SHARED_SPACE:
+      case SHARED_LO_SPACE:
       case CODE_LO_SPACE:
       case RO_SPACE:
         UNREACHABLE();
@@ -1037,7 +1039,6 @@ class Serializer::ObjectSerializer::RelocInfoObjectPreSerializer {
 
   void VisitExternalReference(Code host, RelocInfo* rinfo) {}
   void VisitInternalReference(Code host, RelocInfo* rinfo) {}
-  void VisitRuntimeEntry(Code host, RelocInfo* reloc) { UNREACHABLE(); }
   void VisitOffHeapTarget(Code host, RelocInfo* target) {}
 
   int num_serialized_objects() const { return num_serialized_objects_; }
@@ -1124,12 +1125,6 @@ void Serializer::ObjectSerializer::VisitExternalPointer(
   }
 }
 
-void Serializer::ObjectSerializer::VisitRuntimeEntry(Code host,
-                                                     RelocInfo* rinfo) {
-  // We no longer serialize code that contains runtime entries.
-  UNREACHABLE();
-}
-
 void Serializer::ObjectSerializer::VisitOffHeapTarget(Code host,
                                                       RelocInfo* rinfo) {
   static_assert(EmbeddedData::kTableSize == Builtins::kBuiltinCount);
@@ -1268,8 +1263,7 @@ void Serializer::ObjectSerializer::SerializeCode(Map map, int size) {
       RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
       RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
       RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
-      RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET) |
-      RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY);
+      RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET);
 
   DCHECK_EQ(HeapObject::kHeaderSize, bytes_processed_so_far_);
   Handle<Code> on_heap_code = Handle<Code>::cast(object_);
diff --git a/deps/v8/src/snapshot/serializer.h b/deps/v8/src/snapshot/serializer.h
index 9fdd059e479e58..edd3dfea3103f9 100644
--- a/deps/v8/src/snapshot/serializer.h
+++ b/deps/v8/src/snapshot/serializer.h
@@ -447,7 +447,6 @@ class Serializer::ObjectSerializer : public ObjectVisitor {
   void VisitExternalReference(Code host, RelocInfo* rinfo) override;
   void VisitInternalReference(Code host, RelocInfo* rinfo) override;
   void VisitCodeTarget(Code host, RelocInfo* target) override;
-  void VisitRuntimeEntry(Code host, RelocInfo* reloc) override;
   void VisitOffHeapTarget(Code host, RelocInfo* target) override;
 
   void VisitExternalPointer(HeapObject host, ExternalPointerSlot slot,
diff --git a/deps/v8/src/snapshot/shared-heap-deserializer.cc b/deps/v8/src/snapshot/shared-heap-deserializer.cc
index 3514aa09733faf..d71220be73a614 100644
--- a/deps/v8/src/snapshot/shared-heap-deserializer.cc
+++ b/deps/v8/src/snapshot/shared-heap-deserializer.cc
@@ -12,9 +12,10 @@ namespace internal {
 void SharedHeapDeserializer::DeserializeIntoIsolate() {
   // Don't deserialize into client Isolates. If there are client Isolates, the
   // shared heap object cache should already be populated.
-  DCHECK_IMPLIES(isolate()->shared_isolate() != nullptr,
-                 !isolate()->shared_heap_object_cache()->empty());
-  if (isolate()->shared_isolate() != nullptr) return;
+  if (isolate()->has_shared_heap() && !isolate()->is_shared_space_isolate()) {
+    DCHECK(!isolate()->shared_heap_object_cache()->empty());
+    return;
+  }
   DCHECK(isolate()->shared_heap_object_cache()->empty());
   HandleScope scope(isolate());
 
diff --git a/deps/v8/src/snapshot/shared-heap-serializer.cc b/deps/v8/src/snapshot/shared-heap-serializer.cc
index 90b2ae07cb2c77..e8768f4ce17d55 100644
--- a/deps/v8/src/snapshot/shared-heap-serializer.cc
+++ b/deps/v8/src/snapshot/shared-heap-serializer.cc
@@ -95,7 +95,7 @@ bool SharedHeapSerializer::SerializeUsingSharedHeapObjectCache(
   // not present in the startup snapshot to be serialized.
   if (ShouldReconstructSharedHeapObjectCacheForTesting()) {
     std::vector<Object>* existing_cache =
-        isolate()->shared_isolate()->shared_heap_object_cache();
+        isolate()->shared_heap_isolate()->shared_heap_object_cache();
     const size_t existing_cache_size = existing_cache->size();
     // This is strictly < because the existing cache contains the terminating
     // undefined value, which the reconstructed cache does not.
@@ -201,12 +201,12 @@ bool SharedHeapSerializer::ShouldReconstructSharedHeapObjectCacheForTesting()
   // need to reconstruct the shared heap object cache because it is not actually
   // shared.
   return reconstruct_read_only_and_shared_object_caches_for_testing() &&
-         isolate()->shared_isolate() != nullptr;
+         isolate()->has_shared_heap();
 }
 
 void SharedHeapSerializer::ReconstructSharedHeapObjectCacheForTesting() {
   std::vector<Object>* cache =
-      isolate()->shared_isolate()->shared_heap_object_cache();
+      isolate()->shared_heap_isolate()->shared_heap_object_cache();
   // Don't reconstruct the final element, which is always undefined and marks
   // the end of the cache, since serializing the live Isolate may extend the
   // shared object cache.
diff --git a/deps/v8/src/snapshot/snapshot.cc b/deps/v8/src/snapshot/snapshot.cc
index 8cdaa55e62032a..aa6e34a7e51184 100644
--- a/deps/v8/src/snapshot/snapshot.cc
+++ b/deps/v8/src/snapshot/snapshot.cc
@@ -321,7 +321,7 @@ void Snapshot::SerializeDeserializeAndVerifyForTesting(
     Snapshot::SerializerFlags flags(
         Snapshot::kAllowUnknownExternalReferencesForTesting |
         Snapshot::kAllowActiveIsolateForTesting |
-        ((isolate->shared_isolate() || ReadOnlyHeap::IsReadOnlySpaceShared())
+        ((isolate->has_shared_heap() || ReadOnlyHeap::IsReadOnlySpaceShared())
              ? Snapshot::kReconstructReadOnlyAndSharedObjectCachesForTesting
              : 0));
     serialized_data = Snapshot::Create(isolate, *default_context,
diff --git a/deps/v8/src/temporal/temporal-parser.cc b/deps/v8/src/temporal/temporal-parser.cc
index 450502aa06969d..229144e3d58784 100644
--- a/deps/v8/src/temporal/temporal-parser.cc
+++ b/deps/v8/src/temporal/temporal-parser.cc
@@ -707,6 +707,10 @@ int32_t ScanTimeZoneBracketedAnnotation(base::Vector<Char> str, int32_t s,
   int32_t len = ScanTimeZoneIdentifier(str, cur, r);
   cur += len;
   if (len == 0 || str.length() < (cur + 1) || (str[cur] != ']')) {
+    // Only ScanTimeZoneBracketedAnnotation know the post condition of
+    // TimeZoneIdentifier is not matched so we need to reset here.
+    r->tzi_name_start = 0;
+    r->tzi_name_length = 0;
     return 0;
   }
   cur++;
@@ -878,6 +882,10 @@ int32_t ScanCalendar(base::Vector<Char> str, int32_t s,
   int32_t len = ScanCalendarName(str, cur, r);
   if (len == 0) return 0;
   if ((str.length() < (cur + len + 1)) || (str[cur + len] != ']')) {
+    // Only ScanCalendar know the post condition of CalendarName is not met and
+    // need to reset here.
+    r->calendar_name_start = 0;
+    r->calendar_name_length = 0;
     return 0;
   }
   return 6 + len + 1;
@@ -1047,31 +1055,6 @@ int32_t ScanTemporalZonedDateTimeString(base::Vector<Char> str, int32_t s,
 
 SCAN_FORWARD(TemporalDateTimeString, CalendarDateTime, ParsedISO8601Result)
 
-//   Date [TimeSpecSeparator] TimeZone [Calendar]
-template <typename Char>
-int32_t ScanDate_TimeSpecSeparator_TimeZone_Calendar(base::Vector<Char> str,
-                                                     int32_t s,
-                                                     ParsedISO8601Result* r) {
-  int32_t cur = s;
-  int32_t len = ScanDate(str, cur, r);
-  if (len == 0) return 0;
-  cur = len;
-  cur += ScanTimeSpecSeparator(str, cur, r);
-  len = ScanTimeZone(str, cur, r);
-  if (len == 0) return 0;
-  cur += len;
-  cur += ScanCalendar(str, cur, r);
-  return cur - s;
-}
-
-// TemporalTimeZoneString:
-//   TimeZoneIdentifier
-//   Date [TimeSpecSeparator] TimeZone [Calendar]
-// The lookahead is at most 8 chars.
-SCAN_EITHER_FORWARD(TemporalTimeZoneString, TimeZoneIdentifier,
-                    Date_TimeSpecSeparator_TimeZone_Calendar,
-                    ParsedISO8601Result)
-
 // TemporalMonthDayString
 //   DateSpecMonthDay
 //   CalendarDateTime
@@ -1132,7 +1115,6 @@ SATISIFY(TemporalDateTimeString, ParsedISO8601Result)
 SATISIFY(DateTime, ParsedISO8601Result)
 SATISIFY(DateSpecYearMonth, ParsedISO8601Result)
 SATISIFY(DateSpecMonthDay, ParsedISO8601Result)
-SATISIFY(Date_TimeSpecSeparator_TimeZone_Calendar, ParsedISO8601Result)
 SATISIFY(CalendarDateTime, ParsedISO8601Result)
 SATISIFY(CalendarTime_L1, ParsedISO8601Result)
 SATISIFY(CalendarTime_L2, ParsedISO8601Result)
@@ -1152,32 +1134,11 @@ SATISIFY_EITHER(TemporalMonthDayString, DateSpecMonthDay, CalendarDateTime,
                 ParsedISO8601Result)
 SATISIFY(TimeZoneNumericUTCOffset, ParsedISO8601Result)
 SATISIFY(TimeZoneIdentifier, ParsedISO8601Result)
-SATISIFY_EITHER(TemporalTimeZoneString, TimeZoneIdentifier,
-                Date_TimeSpecSeparator_TimeZone_Calendar, ParsedISO8601Result)
 SATISIFY(TemporalInstantString, ParsedISO8601Result)
 SATISIFY(TemporalZonedDateTimeString, ParsedISO8601Result)
 
 SATISIFY(CalendarName, ParsedISO8601Result)
 
-// TemporalCalendarString :
-//   CalendarName
-//   TemporalInstantString
-//   CalendarDateTime
-//   CalendarTime
-//   DateSpecYearMonth
-//   DateSpecMonthDay
-template <typename Char>
-bool SatisfyTemporalCalendarString(base::Vector<Char> str,
-                                   ParsedISO8601Result* r) {
-  IF_SATISFY_RETURN(CalendarName)
-  IF_SATISFY_RETURN(TemporalInstantString)
-  IF_SATISFY_RETURN(CalendarDateTime)
-  IF_SATISFY_RETURN(CalendarTime)
-  IF_SATISFY_RETURN(DateSpecYearMonth)
-  IF_SATISFY_RETURN(DateSpecMonthDay)
-  return false;
-}
-
 // Duration
 
 // Digits : Digit [Digits]
@@ -1437,8 +1398,8 @@ IMPL_PARSE_METHOD(ParsedISO8601Result, TemporalMonthDayString)
 IMPL_PARSE_METHOD(ParsedISO8601Result, TemporalTimeString)
 IMPL_PARSE_METHOD(ParsedISO8601Result, TemporalInstantString)
 IMPL_PARSE_METHOD(ParsedISO8601Result, TemporalZonedDateTimeString)
-IMPL_PARSE_METHOD(ParsedISO8601Result, TemporalTimeZoneString)
-IMPL_PARSE_METHOD(ParsedISO8601Result, TemporalCalendarString)
+IMPL_PARSE_METHOD(ParsedISO8601Result, TimeZoneIdentifier)
+IMPL_PARSE_METHOD(ParsedISO8601Result, CalendarName)
 IMPL_PARSE_METHOD(ParsedISO8601Result, TimeZoneNumericUTCOffset)
 IMPL_PARSE_METHOD(ParsedISO8601Duration, TemporalDurationString)
 
diff --git a/deps/v8/src/temporal/temporal-parser.h b/deps/v8/src/temporal/temporal-parser.h
index 593741bfcfcd11..bfcd90aef0e644 100644
--- a/deps/v8/src/temporal/temporal-parser.h
+++ b/deps/v8/src/temporal/temporal-parser.h
@@ -15,9 +15,9 @@ namespace internal {
  * ParsedISO8601Result contains the parsed result of ISO 8601 grammar
  * documented in #sec-temporal-iso8601grammar
  * for TemporalInstantString, TemporalZonedDateTimeString,
- * TemporalCalendarString, TemporalDateString, TemporalDateTimeString,
+ * CalendarName, TemporalDateString, TemporalDateTimeString,
  * TemporalMonthDayString, TemporalRelativeToString, TemporalTimeString,
- * TemporalTimeZoneString, and TemporalYearMonthString. For all the fields
+ * TimeZoneIdentifier, and TemporalYearMonthString. For all the fields
  * represented by int32_t, a special value kMinInt31 is used to represent the
  * field is "undefined" after parsing.
  */
@@ -143,9 +143,9 @@ class V8_EXPORT_PRIVATE TemporalParser {
   DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalMonthDayString);
   DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalInstantString);
   DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalZonedDateTimeString);
-  DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalTimeZoneString);
+  DEFINE_PARSE_METHOD(ParsedISO8601Result, TimeZoneIdentifier);
   DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalRelativeToString);
-  DEFINE_PARSE_METHOD(ParsedISO8601Result, TemporalCalendarString);
+  DEFINE_PARSE_METHOD(ParsedISO8601Result, CalendarName);
   DEFINE_PARSE_METHOD(ParsedISO8601Duration, TemporalDurationString);
   DEFINE_PARSE_METHOD(ParsedISO8601Result, TimeZoneNumericUTCOffset);
 };
diff --git a/deps/v8/src/torque/implementation-visitor.cc b/deps/v8/src/torque/implementation-visitor.cc
index fd964253a82ee5..1bfa898a1e3d24 100644
--- a/deps/v8/src/torque/implementation-visitor.cc
+++ b/deps/v8/src/torque/implementation-visitor.cc
@@ -1536,7 +1536,7 @@ VisitResult ImplementationVisitor::GenerateArrayLength(VisitResult object,
         {f.name_and_type.name,
          f.const_qualified
              ? (before_current
-                    ? LocalValue{[=]() {
+                    ? LocalValue{[this, object, f, class_type]() {
                         return GenerateFieldReference(object, f, class_type);
                       }}
                     : LocalValue("Array lengths may only refer to fields "
diff --git a/deps/v8/src/wasm/baseline/liftoff-assembler.cc b/deps/v8/src/wasm/baseline/liftoff-assembler.cc
index 5d88d60039da31..efcd583f4f2692 100644
--- a/deps/v8/src/wasm/baseline/liftoff-assembler.cc
+++ b/deps/v8/src/wasm/baseline/liftoff-assembler.cc
@@ -14,7 +14,6 @@
 #include "src/compiler/wasm-compiler.h"
 #include "src/utils/ostreams.h"
 #include "src/wasm/baseline/liftoff-register.h"
-#include "src/wasm/function-body-decoder-impl.h"
 #include "src/wasm/object-access.h"
 #include "src/wasm/wasm-linkage.h"
 #include "src/wasm/wasm-opcodes.h"
diff --git a/deps/v8/src/wasm/baseline/liftoff-compiler.cc b/deps/v8/src/wasm/baseline/liftoff-compiler.cc
index 09ae03ba21830b..88e2da86cdb6e0 100644
--- a/deps/v8/src/wasm/baseline/liftoff-compiler.cc
+++ b/deps/v8/src/wasm/baseline/liftoff-compiler.cc
@@ -556,12 +556,6 @@ class LiftoffCompiler {
     return __ GetTotalFrameSlotCountForGC();
   }
 
-  int GetFeedbackVectorSlots() const {
-    // The number of call instructions is capped by max function size.
-    static_assert(kV8MaxWasmFunctionSize < std::numeric_limits<int>::max() / 2);
-    return static_cast<int>(encountered_call_instructions_.size()) * 2;
-  }
-
   void unsupported(FullDecoder* decoder, LiftoffBailoutReason reason,
                    const char* detail) {
     DCHECK_NE(kSuccess, reason);
@@ -5919,6 +5913,20 @@ class LiftoffCompiler {
     }
     Register tmp1 = scratch_null;  // Done with null checks.
 
+    // Add Smi check if the source type may store a Smi (i31ref or JS Smi).
+    ValueType i31ref = ValueType::Ref(HeapType::kI31);
+    // Ref.extern can also contain Smis, however there isn't any type that
+    // could downcast to ref.extern.
+    DCHECK(!rtt_type.is_reference_to(HeapType::kExtern));
+    // Ref.i31 check has its own implementation.
+    DCHECK(!rtt_type.is_reference_to(HeapType::kI31));
+    if (IsSubtypeOf(i31ref, obj_type, module)) {
+      Label* i31_target =
+          IsSubtypeOf(i31ref, rtt_type, module) ? &match : no_match;
+      __ emit_smi_check(obj_reg, i31_target, LiftoffAssembler::kJumpOnSmi,
+                        frozen);
+    }
+
     __ LoadMap(tmp1, obj_reg);
     // {tmp1} now holds the object's map.
 
@@ -5955,7 +5963,7 @@ class LiftoffCompiler {
   }
 
   void RefTest(FullDecoder* decoder, const Value& obj, const Value& rtt,
-               Value* /* result_val */) {
+               Value* /* result_val */, bool null_succeeds) {
     Label return_false, done;
     LiftoffRegList pinned;
     LiftoffRegister rtt_reg = pinned.set(__ PopToRegister(pinned));
@@ -5969,7 +5977,7 @@ class LiftoffCompiler {
       FREEZE_STATE(frozen);
       SubtypeCheck(decoder->module_, obj_reg.gp(), obj.type, rtt_reg.gp(),
                    rtt.type, scratch_null, result.gp(), &return_false,
-                   kNullFails, frozen);
+                   null_succeeds ? kNullSucceeds : kNullFails, frozen);
 
       __ LoadConstant(result, WasmValue(1));
       // TODO(jkummerow): Emit near jumps on platforms that have them.
@@ -5982,6 +5990,25 @@ class LiftoffCompiler {
     __ PushRegister(kI32, result);
   }
 
+  void RefTestAbstract(FullDecoder* decoder, const Value& obj, HeapType type,
+                       Value* result_val, bool null_succeeds) {
+    switch (type.representation()) {
+      case HeapType::kEq:
+        return RefIsEq(decoder, obj, result_val, null_succeeds);
+      case HeapType::kI31:
+        return RefIsI31(decoder, obj, result_val, null_succeeds);
+      case HeapType::kData:
+        return RefIsData(decoder, obj, result_val, null_succeeds);
+      case HeapType::kArray:
+        return RefIsArray(decoder, obj, result_val, null_succeeds);
+      case HeapType::kAny:
+        // Any may never need a cast as it is either implicitly convertible or
+        // never convertible for any given type.
+      default:
+        UNREACHABLE();
+    }
+  }
+
   void RefCast(FullDecoder* decoder, const Value& obj, const Value& rtt,
                Value* result) {
     if (v8_flags.experimental_wasm_assume_ref_cast_succeeds) {
@@ -6068,9 +6095,12 @@ class LiftoffCompiler {
     Register tmp1 = no_reg;
     Register tmp2 = no_reg;
     Label* no_match;
+    bool null_succeeds;
 
-    TypeCheck(ValueType obj_type, Label* no_match)
-        : obj_type(obj_type), no_match(no_match) {}
+    TypeCheck(ValueType obj_type, Label* no_match, bool null_succeeds)
+        : obj_type(obj_type),
+          no_match(no_match),
+          null_succeeds(null_succeeds) {}
 
     Register null_reg() { return tmp1; }       // After {Initialize}.
     Register instance_type() { return tmp1; }  // After {LoadInstanceType}.
@@ -6091,13 +6121,17 @@ class LiftoffCompiler {
       LoadNullValue(check.null_reg(), pinned);
     }
   }
-  void LoadInstanceType(TypeCheck& check, const FreezeCacheState& frozen) {
-    if (check.obj_type.is_nullable()) {
+  void LoadInstanceType(TypeCheck& check, const FreezeCacheState& frozen,
+                        Label* on_smi) {
+    // The check for null_succeeds == true has to be handled by the caller!
+    // TODO(mliedtke): Reiterate the null_succeeds case once all generic cast
+    // instructions are implemented.
+    if (!check.null_succeeds && check.obj_type.is_nullable()) {
       __ emit_cond_jump(kEqual, check.no_match, kRefNull, check.obj_reg,
                         check.null_reg(), frozen);
     }
-    __ emit_smi_check(check.obj_reg, check.no_match,
-                      LiftoffAssembler::kJumpOnSmi, frozen);
+    __ emit_smi_check(check.obj_reg, on_smi, LiftoffAssembler::kJumpOnSmi,
+                      frozen);
     __ LoadMap(check.instance_type(), check.obj_reg);
     __ Load(LiftoffRegister(check.instance_type()), check.instance_type(),
             no_reg, wasm::ObjectAccess::ToTagged(Map::kInstanceTypeOffset),
@@ -6106,7 +6140,7 @@ class LiftoffCompiler {
 
   // Abstract type checkers. They all fall through on match.
   void DataCheck(TypeCheck& check, const FreezeCacheState& frozen) {
-    LoadInstanceType(check, frozen);
+    LoadInstanceType(check, frozen, check.no_match);
     // We're going to test a range of WasmObject instance types with a single
     // unsigned comparison.
     Register tmp = check.instance_type();
@@ -6117,7 +6151,7 @@ class LiftoffCompiler {
   }
 
   void ArrayCheck(TypeCheck& check, const FreezeCacheState& frozen) {
-    LoadInstanceType(check, frozen);
+    LoadInstanceType(check, frozen, check.no_match);
     LiftoffRegister instance_type(check.instance_type());
     __ emit_i32_cond_jumpi(kUnequal, check.no_match, check.instance_type(),
                            WASM_ARRAY_TYPE, frozen);
@@ -6128,18 +6162,36 @@ class LiftoffCompiler {
                       LiftoffAssembler::kJumpOnNotSmi, frozen);
   }
 
+  void EqCheck(TypeCheck& check, const FreezeCacheState& frozen) {
+    Label match;
+    LoadInstanceType(check, frozen, &match);
+    // We're going to test a range of WasmObject instance types with a single
+    // unsigned comparison.
+    Register tmp = check.instance_type();
+    __ emit_i32_subi(tmp, tmp, FIRST_WASM_OBJECT_TYPE);
+    __ emit_i32_cond_jumpi(kUnsignedGreaterThan, check.no_match, tmp,
+                           LAST_WASM_OBJECT_TYPE - FIRST_WASM_OBJECT_TYPE,
+                           frozen);
+    __ bind(&match);
+  }
+
   using TypeChecker = void (LiftoffCompiler::*)(TypeCheck& check,
                                                 const FreezeCacheState& frozen);
 
   template <TypeChecker type_checker>
-  void AbstractTypeCheck(const Value& object) {
+  void AbstractTypeCheck(const Value& object, bool null_succeeds) {
     Label match, no_match, done;
-    TypeCheck check(object.type, &no_match);
+    TypeCheck check(object.type, &no_match, null_succeeds);
     Initialize(check, kPop);
     LiftoffRegister result(check.tmp1);
     {
       FREEZE_STATE(frozen);
 
+      if (null_succeeds && check.obj_type.is_nullable()) {
+        __ emit_cond_jump(kEqual, &match, kRefNull, check.obj_reg,
+                          check.null_reg(), frozen);
+      }
+
       (this->*type_checker)(check, frozen);
 
       __ bind(&match);
@@ -6155,26 +6207,32 @@ class LiftoffCompiler {
   }
 
   void RefIsData(FullDecoder* /* decoder */, const Value& object,
-                 Value* /* result_val */) {
-    AbstractTypeCheck<&LiftoffCompiler::DataCheck>(object);
+                 Value* /* result_val */, bool null_succeeds = false) {
+    AbstractTypeCheck<&LiftoffCompiler::DataCheck>(object, null_succeeds);
+  }
+
+  void RefIsEq(FullDecoder* /* decoder */, const Value& object,
+               Value* /* result_val */, bool null_succeeds) {
+    AbstractTypeCheck<&LiftoffCompiler::EqCheck>(object, null_succeeds);
   }
 
   void RefIsArray(FullDecoder* /* decoder */, const Value& object,
-                  Value* /* result_val */) {
-    AbstractTypeCheck<&LiftoffCompiler::ArrayCheck>(object);
+                  Value* /* result_val */, bool null_succeeds = false) {
+    AbstractTypeCheck<&LiftoffCompiler::ArrayCheck>(object, null_succeeds);
   }
 
-  void RefIsI31(FullDecoder* decoder, const Value& object,
-                Value* /* result */) {
-    AbstractTypeCheck<&LiftoffCompiler::I31Check>(object);
+  void RefIsI31(FullDecoder* decoder, const Value& object, Value* /* result */,
+                bool null_succeeds = false) {
+    AbstractTypeCheck<&LiftoffCompiler::I31Check>(object, null_succeeds);
   }
 
   template <TypeChecker type_checker>
   void AbstractTypeCast(const Value& object, FullDecoder* decoder,
                         ValueKind result_kind) {
+    bool null_succeeds = false;  // TODO(mliedtke): Use parameter.
     Label* trap_label =
         AddOutOfLineTrap(decoder, WasmCode::kThrowWasmTrapIllegalCast);
-    TypeCheck check(object.type, trap_label);
+    TypeCheck check(object.type, trap_label, null_succeeds);
     Initialize(check, kPeek);
     FREEZE_STATE(frozen);
     (this->*type_checker)(check, frozen);
@@ -6196,13 +6254,14 @@ class LiftoffCompiler {
   template <TypeChecker type_checker>
   void BrOnAbstractType(const Value& object, FullDecoder* decoder,
                         uint32_t br_depth) {
+    bool null_succeeds = false;  // TODO(mliedtke): Use parameter.
     // Avoid having sequences of branches do duplicate work.
     if (br_depth != decoder->control_depth() - 1) {
       __ PrepareForBranch(decoder->control_at(br_depth)->br_merge()->arity, {});
     }
 
     Label no_match;
-    TypeCheck check(object.type, &no_match);
+    TypeCheck check(object.type, &no_match, null_succeeds);
     Initialize(check, kPeek);
     FREEZE_STATE(frozen);
 
@@ -6215,13 +6274,14 @@ class LiftoffCompiler {
   template <TypeChecker type_checker>
   void BrOnNonAbstractType(const Value& object, FullDecoder* decoder,
                            uint32_t br_depth) {
+    bool null_succeeds = false;  // TODO(mliedtke): Use parameter.
     // Avoid having sequences of branches do duplicate work.
     if (br_depth != decoder->control_depth() - 1) {
       __ PrepareForBranch(decoder->control_at(br_depth)->br_merge()->arity, {});
     }
 
     Label no_match, end;
-    TypeCheck check(object.type, &no_match);
+    TypeCheck check(object.type, &no_match, null_succeeds);
     Initialize(check, kPeek);
     FREEZE_STATE(frozen);
 
@@ -7188,18 +7248,10 @@ class LiftoffCompiler {
             nullptr, false, false, true);
 
     // Compare against expected signature.
-    if (v8_flags.wasm_type_canonicalization) {
-      LOAD_INSTANCE_FIELD(tmp_const, IsorecursiveCanonicalTypes,
-                          kSystemPointerSize, pinned);
-      __ Load(LiftoffRegister(tmp_const), tmp_const, no_reg,
-              imm.sig_imm.index * kInt32Size, LoadType::kI32Load);
-    } else {
-      uint32_t canonical_sig_num =
-          env_->module->per_module_canonical_type_ids[imm.sig_imm.index];
-      DCHECK_GE(canonical_sig_num, 0);
-      DCHECK_GE(kMaxInt, canonical_sig_num);
-      __ LoadConstant(LiftoffRegister(tmp_const), WasmValue(canonical_sig_num));
-    }
+    LOAD_INSTANCE_FIELD(tmp_const, IsorecursiveCanonicalTypes,
+                        kSystemPointerSize, pinned);
+    __ Load(LiftoffRegister(tmp_const), tmp_const, no_reg,
+            imm.sig_imm.index * kInt32Size, LoadType::kI32Load);
 
     Label* sig_mismatch_label =
         AddOutOfLineTrap(decoder, WasmCode::kThrowWasmTrapFuncSigMismatch);
@@ -7279,10 +7331,11 @@ class LiftoffCompiler {
       ValueKind kIntPtrKind = kPointerKind;
 
       LiftoffRegList pinned;
+      LiftoffRegister func_ref = pinned.set(__ PopToRegister(pinned));
       LiftoffRegister vector = pinned.set(__ GetUnusedRegister(kGpReg, pinned));
-      LiftoffAssembler::VarState funcref =
-          __ cache_state()->stack_state.end()[-1];
-      if (funcref.is_reg()) pinned.set(funcref.reg());
+      MaybeEmitNullCheck(decoder, func_ref.gp(), pinned, func_ref_type);
+      LiftoffAssembler::VarState func_ref_var(kRef, func_ref, 0);
+
       __ Fill(vector, liftoff::kFeedbackVectorOffset, kPointerKind);
       LiftoffAssembler::VarState vector_var(kPointerKind, vector, 0);
       LiftoffRegister index = pinned.set(__ GetUnusedRegister(kGpReg, pinned));
@@ -7297,9 +7350,9 @@ class LiftoffCompiler {
       CallRuntimeStub(WasmCode::kCallRefIC,
                       MakeSig::Returns(kPointerKind, kPointerKind)
                           .Params(kPointerKind, kIntPtrKind, kPointerKind),
-                      {vector_var, index_var, funcref}, decoder->position());
+                      {vector_var, index_var, func_ref_var},
+                      decoder->position());
 
-      __ cache_state()->stack_state.pop_back(1);  // Drop funcref.
       target_reg = LiftoffRegister(kReturnRegister0).gp();
       instance_reg = LiftoffRegister(kReturnRegister1).gp();
 
@@ -7721,7 +7774,6 @@ WasmCompilationResult ExecuteLiftoffCompilation(
   if (auto* debug_sidetable = compiler_options.debug_sidetable) {
     *debug_sidetable = debug_sidetable_builder->GenerateDebugSideTable();
   }
-  result.feedback_vector_slots = compiler->GetFeedbackVectorSlots();
 
   if (V8_UNLIKELY(v8_flags.trace_wasm_compilation_times)) {
     base::TimeDelta time = base::TimeTicks::Now() - start_time;
diff --git a/deps/v8/src/wasm/baseline/ppc/liftoff-assembler-ppc.h b/deps/v8/src/wasm/baseline/ppc/liftoff-assembler-ppc.h
index feec970bf58e0d..a24575ee3d3c08 100644
--- a/deps/v8/src/wasm/baseline/ppc/liftoff-assembler-ppc.h
+++ b/deps/v8/src/wasm/baseline/ppc/liftoff-assembler-ppc.h
@@ -46,11 +46,9 @@ namespace liftoff {
 //
 
 constexpr int32_t kInstanceOffset =
-    (v8_flags.enable_embedded_constant_pool.value() ? 3 : 2) *
-    kSystemPointerSize;
+    (V8_EMBEDDED_CONSTANT_POOL_BOOL ? 3 : 2) * kSystemPointerSize;
 constexpr int kFeedbackVectorOffset =
-    (v8_flags.enable_embedded_constant_pool.value() ? 4 : 3) *
-    kSystemPointerSize;
+    (V8_EMBEDDED_CONSTANT_POOL_BOOL ? 4 : 3) * kSystemPointerSize;
 
 inline MemOperand GetHalfStackSlot(int offset, RegPairHalf half) {
   int32_t half_offset =
@@ -143,7 +141,7 @@ void LiftoffAssembler::PatchPrepareStackFrame(
     int offset, SafepointTableBuilder* safepoint_table_builder) {
   int frame_size =
       GetTotalFrameSize() -
-      (v8_flags.enable_embedded_constant_pool ? 3 : 2) * kSystemPointerSize;
+      (V8_EMBEDDED_CONSTANT_POOL_BOOL ? 3 : 2) * kSystemPointerSize;
 
   Assembler patching_assembler(
       AssemblerOptions{},
@@ -1769,56 +1767,64 @@ bool LiftoffAssembler::emit_select(LiftoffRegister dst, Register condition,
   return false;
 }
 
-#define SIMD_BINOP_LIST(V)  \
-  V(f64x2_add, F64x2Add)    \
-  V(f64x2_sub, F64x2Sub)    \
-  V(f64x2_mul, F64x2Mul)    \
-  V(f64x2_div, F64x2Div)    \
-  V(f64x2_eq, F64x2Eq)      \
-  V(f64x2_lt, F64x2Lt)      \
-  V(f64x2_le, F64x2Le)      \
-  V(f32x4_add, F32x4Add)    \
-  V(f32x4_sub, F32x4Sub)    \
-  V(f32x4_mul, F32x4Mul)    \
-  V(f32x4_div, F32x4Div)    \
-  V(f32x4_min, F32x4Min)    \
-  V(f32x4_max, F32x4Max)    \
-  V(f32x4_eq, F32x4Eq)      \
-  V(f32x4_lt, F32x4Lt)      \
-  V(f32x4_le, F32x4Le)      \
-  V(i64x2_add, I64x2Add)    \
-  V(i64x2_sub, I64x2Sub)    \
-  V(i64x2_eq, I64x2Eq)      \
-  V(i64x2_gt_s, I64x2GtS)   \
-  V(i32x4_add, I32x4Add)    \
-  V(i32x4_sub, I32x4Sub)    \
-  V(i32x4_mul, I32x4Mul)    \
-  V(i32x4_min_s, I32x4MinS) \
-  V(i32x4_min_u, I32x4MinU) \
-  V(i32x4_max_s, I32x4MaxS) \
-  V(i32x4_max_u, I32x4MaxU) \
-  V(i32x4_eq, I32x4Eq)      \
-  V(i32x4_gt_s, I32x4GtS)   \
-  V(i32x4_gt_u, I32x4GtU)   \
-  V(i16x8_add, I16x8Add)    \
-  V(i16x8_sub, I16x8Sub)    \
-  V(i16x8_mul, I16x8Mul)    \
-  V(i16x8_min_s, I16x8MinS) \
-  V(i16x8_min_u, I16x8MinU) \
-  V(i16x8_max_s, I16x8MaxS) \
-  V(i16x8_max_u, I16x8MaxU) \
-  V(i16x8_eq, I16x8Eq)      \
-  V(i16x8_gt_s, I16x8GtS)   \
-  V(i16x8_gt_u, I16x8GtU)   \
-  V(i8x16_add, I8x16Add)    \
-  V(i8x16_sub, I8x16Sub)    \
-  V(i8x16_min_s, I8x16MinS) \
-  V(i8x16_min_u, I8x16MinU) \
-  V(i8x16_max_s, I8x16MaxS) \
-  V(i8x16_max_u, I8x16MaxU) \
-  V(i8x16_eq, I8x16Eq)      \
-  V(i8x16_gt_s, I8x16GtS)   \
-  V(i8x16_gt_u, I8x16GtU)
+#define SIMD_BINOP_LIST(V)         \
+  V(f64x2_add, F64x2Add)           \
+  V(f64x2_sub, F64x2Sub)           \
+  V(f64x2_mul, F64x2Mul)           \
+  V(f64x2_div, F64x2Div)           \
+  V(f64x2_eq, F64x2Eq)             \
+  V(f64x2_lt, F64x2Lt)             \
+  V(f64x2_le, F64x2Le)             \
+  V(f32x4_add, F32x4Add)           \
+  V(f32x4_sub, F32x4Sub)           \
+  V(f32x4_mul, F32x4Mul)           \
+  V(f32x4_div, F32x4Div)           \
+  V(f32x4_min, F32x4Min)           \
+  V(f32x4_max, F32x4Max)           \
+  V(f32x4_eq, F32x4Eq)             \
+  V(f32x4_lt, F32x4Lt)             \
+  V(f32x4_le, F32x4Le)             \
+  V(i64x2_add, I64x2Add)           \
+  V(i64x2_sub, I64x2Sub)           \
+  V(i64x2_eq, I64x2Eq)             \
+  V(i64x2_gt_s, I64x2GtS)          \
+  V(i32x4_add, I32x4Add)           \
+  V(i32x4_sub, I32x4Sub)           \
+  V(i32x4_mul, I32x4Mul)           \
+  V(i32x4_min_s, I32x4MinS)        \
+  V(i32x4_min_u, I32x4MinU)        \
+  V(i32x4_max_s, I32x4MaxS)        \
+  V(i32x4_max_u, I32x4MaxU)        \
+  V(i32x4_eq, I32x4Eq)             \
+  V(i32x4_gt_s, I32x4GtS)          \
+  V(i32x4_gt_u, I32x4GtU)          \
+  V(i16x8_add, I16x8Add)           \
+  V(i16x8_sub, I16x8Sub)           \
+  V(i16x8_mul, I16x8Mul)           \
+  V(i16x8_min_s, I16x8MinS)        \
+  V(i16x8_min_u, I16x8MinU)        \
+  V(i16x8_max_s, I16x8MaxS)        \
+  V(i16x8_max_u, I16x8MaxU)        \
+  V(i16x8_eq, I16x8Eq)             \
+  V(i16x8_gt_s, I16x8GtS)          \
+  V(i16x8_gt_u, I16x8GtU)          \
+  V(i16x8_add_sat_s, I16x8AddSatS) \
+  V(i16x8_sub_sat_s, I16x8SubSatS) \
+  V(i16x8_add_sat_u, I16x8AddSatU) \
+  V(i16x8_sub_sat_u, I16x8SubSatU) \
+  V(i8x16_add, I8x16Add)           \
+  V(i8x16_sub, I8x16Sub)           \
+  V(i8x16_min_s, I8x16MinS)        \
+  V(i8x16_min_u, I8x16MinU)        \
+  V(i8x16_max_s, I8x16MaxS)        \
+  V(i8x16_max_u, I8x16MaxU)        \
+  V(i8x16_eq, I8x16Eq)             \
+  V(i8x16_gt_s, I8x16GtS)          \
+  V(i8x16_gt_u, I8x16GtU)          \
+  V(i8x16_add_sat_s, I8x16AddSatS) \
+  V(i8x16_sub_sat_s, I8x16SubSatS) \
+  V(i8x16_add_sat_u, I8x16AddSatU) \
+  V(i8x16_sub_sat_u, I8x16SubSatU)
 
 #define EMIT_SIMD_BINOP(name, op)                                              \
   void LiftoffAssembler::emit_##name(LiftoffRegister dst, LiftoffRegister lhs, \
@@ -1829,6 +1835,105 @@ SIMD_BINOP_LIST(EMIT_SIMD_BINOP)
 #undef EMIT_SIMD_BINOP
 #undef SIMD_BINOP_LIST
 
+#define SIMD_BINOP_WITH_SCRATCH_LIST(V) \
+  V(f64x2_ne, F64x2Ne)                  \
+  V(f32x4_ne, F32x4Ne)                  \
+  V(i64x2_ne, I64x2Ne)                  \
+  V(i64x2_ge_s, I64x2GeS)               \
+  V(i32x4_ne, I32x4Ne)                  \
+  V(i32x4_ge_s, I32x4GeS)               \
+  V(i32x4_ge_u, I32x4GeU)               \
+  V(i16x8_ne, I16x8Ne)                  \
+  V(i16x8_ge_s, I16x8GeS)               \
+  V(i16x8_ge_u, I16x8GeU)               \
+  V(i8x16_ne, I8x16Ne)                  \
+  V(i8x16_ge_s, I8x16GeS)               \
+  V(i8x16_ge_u, I8x16GeU)
+
+#define EMIT_SIMD_BINOP_WITH_SCRATCH(name, op)                                 \
+  void LiftoffAssembler::emit_##name(LiftoffRegister dst, LiftoffRegister lhs, \
+                                     LiftoffRegister rhs) {                    \
+    op(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),                \
+       kScratchSimd128Reg);                                                    \
+  }
+SIMD_BINOP_WITH_SCRATCH_LIST(EMIT_SIMD_BINOP_WITH_SCRATCH)
+#undef EMIT_SIMD_BINOP_WITH_SCRATCH
+#undef SIMD_BINOP_WITH_SCRATCH_LIST
+
+#define SIMD_SHIFT_RR_LIST(V) \
+  V(i64x2_shl, I64x2Shl)      \
+  V(i64x2_shr_s, I64x2ShrS)   \
+  V(i64x2_shr_u, I64x2ShrU)   \
+  V(i32x4_shl, I32x4Shl)      \
+  V(i32x4_shr_s, I32x4ShrS)   \
+  V(i32x4_shr_u, I32x4ShrU)   \
+  V(i16x8_shl, I16x8Shl)      \
+  V(i16x8_shr_s, I16x8ShrS)   \
+  V(i16x8_shr_u, I16x8ShrU)   \
+  V(i8x16_shl, I8x16Shl)      \
+  V(i8x16_shr_s, I8x16ShrS)   \
+  V(i8x16_shr_u, I8x16ShrU)
+
+#define EMIT_SIMD_SHIFT_RR(name, op)                                           \
+  void LiftoffAssembler::emit_##name(LiftoffRegister dst, LiftoffRegister lhs, \
+                                     LiftoffRegister rhs) {                    \
+    op(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.gp(), kScratchSimd128Reg);    \
+  }
+SIMD_SHIFT_RR_LIST(EMIT_SIMD_SHIFT_RR)
+#undef EMIT_SIMD_SHIFT_RR
+#undef SIMD_SHIFT_RR_LIST
+
+#define SIMD_SHIFT_RI_LIST(V) \
+  V(i64x2_shli, I64x2Shl)     \
+  V(i64x2_shri_s, I64x2ShrS)  \
+  V(i64x2_shri_u, I64x2ShrU)  \
+  V(i32x4_shli, I32x4Shl)     \
+  V(i32x4_shri_s, I32x4ShrS)  \
+  V(i32x4_shri_u, I32x4ShrU)  \
+  V(i16x8_shli, I16x8Shl)     \
+  V(i16x8_shri_s, I16x8ShrS)  \
+  V(i16x8_shri_u, I16x8ShrU)  \
+  V(i8x16_shli, I8x16Shl)     \
+  V(i8x16_shri_s, I8x16ShrS)  \
+  V(i8x16_shri_u, I8x16ShrU)
+
+#define EMIT_SIMD_SHIFT_RI(name, op)                                           \
+  void LiftoffAssembler::emit_##name(LiftoffRegister dst, LiftoffRegister lhs, \
+                                     int32_t rhs) {                            \
+    op(dst.fp().toSimd(), lhs.fp().toSimd(), Operand(rhs), r0,                 \
+       kScratchSimd128Reg);                                                    \
+  }
+SIMD_SHIFT_RI_LIST(EMIT_SIMD_SHIFT_RI)
+#undef EMIT_SIMD_SHIFT_RI
+#undef SIMD_SHIFT_RI_LIST
+
+#define SIMD_UNOP_LIST(V)                \
+  V(f64x2_abs, F64x2Abs, , void)         \
+  V(f64x2_neg, F64x2Neg, , void)         \
+  V(f64x2_sqrt, F64x2Sqrt, , void)       \
+  V(f64x2_ceil, F64x2Ceil, true, bool)   \
+  V(f64x2_floor, F64x2Floor, true, bool) \
+  V(f64x2_trunc, F64x2Trunc, true, bool) \
+  V(f32x4_abs, F32x4Abs, , void)         \
+  V(f32x4_neg, F32x4Neg, , void)         \
+  V(i64x2_neg, I64x2Neg, , void)         \
+  V(i32x4_neg, I32x4Neg, , void)         \
+  V(f32x4_sqrt, F32x4Sqrt, , void)       \
+  V(f32x4_ceil, F32x4Ceil, true, bool)   \
+  V(f32x4_floor, F32x4Floor, true, bool) \
+  V(f32x4_trunc, F32x4Trunc, true, bool) \
+  V(i8x16_popcnt, I8x16Popcnt, , void)
+
+#define EMIT_SIMD_UNOP(name, op, return_val, return_type)          \
+  return_type LiftoffAssembler::emit_##name(LiftoffRegister dst,   \
+                                            LiftoffRegister src) { \
+    op(dst.fp().toSimd(), src.fp().toSimd());                      \
+    return return_val;                                             \
+  }
+SIMD_UNOP_LIST(EMIT_SIMD_UNOP)
+#undef EMIT_SIMD_UNOP
+#undef SIMD_UNOP_LIST
+
 void LiftoffAssembler::emit_f64x2_splat(LiftoffRegister dst,
                                         LiftoffRegister src) {
   F64x2Splat(dst.fp().toSimd(), src.fp(), r0);
@@ -1963,6 +2068,36 @@ void LiftoffAssembler::emit_i8x16_replace_lane(LiftoffRegister dst,
                    imm_lane_idx, kScratchSimd128Reg);
 }
 
+void LiftoffAssembler::emit_i64x2_abs(LiftoffRegister dst,
+                                      LiftoffRegister src) {
+  I64x2Abs(dst.fp().toSimd(), src.fp().toSimd(), kScratchSimd128Reg);
+}
+
+void LiftoffAssembler::emit_i32x4_abs(LiftoffRegister dst,
+                                      LiftoffRegister src) {
+  I32x4Abs(dst.fp().toSimd(), src.fp().toSimd(), kScratchSimd128Reg);
+}
+
+void LiftoffAssembler::emit_i16x8_abs(LiftoffRegister dst,
+                                      LiftoffRegister src) {
+  I16x8Abs(dst.fp().toSimd(), src.fp().toSimd(), kScratchSimd128Reg);
+}
+
+void LiftoffAssembler::emit_i16x8_neg(LiftoffRegister dst,
+                                      LiftoffRegister src) {
+  I16x8Neg(dst.fp().toSimd(), src.fp().toSimd(), kScratchSimd128Reg);
+}
+
+void LiftoffAssembler::emit_i8x16_abs(LiftoffRegister dst,
+                                      LiftoffRegister src) {
+  I8x16Abs(dst.fp().toSimd(), src.fp().toSimd(), kScratchSimd128Reg);
+}
+
+void LiftoffAssembler::emit_i8x16_neg(LiftoffRegister dst,
+                                      LiftoffRegister src) {
+  I8x16Neg(dst.fp().toSimd(), src.fp().toSimd(), kScratchSimd128Reg);
+}
+
 void LiftoffAssembler::emit_i64x2_mul(LiftoffRegister dst, LiftoffRegister lhs,
                                       LiftoffRegister rhs) {
   // TODO(miladfarca): Make use of UseScratchRegisterScope.
@@ -1985,82 +2120,14 @@ void LiftoffAssembler::emit_f64x2_max(LiftoffRegister dst, LiftoffRegister lhs,
            kScratchSimd128Reg, kScratchSimd128Reg2);
 }
 
-void LiftoffAssembler::emit_f64x2_ne(LiftoffRegister dst, LiftoffRegister lhs,
-                                     LiftoffRegister rhs) {
-  F64x2Ne(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-          kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_f32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
-                                     LiftoffRegister rhs) {
-  F32x4Ne(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-          kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i64x2_ne(LiftoffRegister dst, LiftoffRegister lhs,
-                                     LiftoffRegister rhs) {
-  I64x2Ne(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-          kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i64x2_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
-                                       LiftoffRegister rhs) {
-  I64x2GeS(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-           kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i32x4_ne(LiftoffRegister dst, LiftoffRegister lhs,
-                                     LiftoffRegister rhs) {
-  I32x4Ne(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-          kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i32x4_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
-                                       LiftoffRegister rhs) {
-  I32x4GeS(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-           kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i32x4_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
-                                       LiftoffRegister rhs) {
-  I32x4GeU(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-           kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i16x8_ne(LiftoffRegister dst, LiftoffRegister lhs,
-                                     LiftoffRegister rhs) {
-  I16x8Ne(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-          kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i16x8_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
-                                       LiftoffRegister rhs) {
-  I16x8GeS(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-           kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i16x8_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
-                                       LiftoffRegister rhs) {
-  I16x8GeU(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-           kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i8x16_ne(LiftoffRegister dst, LiftoffRegister lhs,
-                                     LiftoffRegister rhs) {
-  I8x16Ne(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-          kScratchSimd128Reg);
-}
-
-void LiftoffAssembler::emit_i8x16_ge_s(LiftoffRegister dst, LiftoffRegister lhs,
-                                       LiftoffRegister rhs) {
-  I8x16GeS(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-           kScratchSimd128Reg);
+bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
+                                              LiftoffRegister src) {
+  return false;
 }
 
-void LiftoffAssembler::emit_i8x16_ge_u(LiftoffRegister dst, LiftoffRegister lhs,
-                                       LiftoffRegister rhs) {
-  I8x16GeU(dst.fp().toSimd(), lhs.fp().toSimd(), rhs.fp().toSimd(),
-           kScratchSimd128Reg);
+bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
+                                              LiftoffRegister src) {
+  return false;
 }
 
 void LiftoffAssembler::LoadTransform(LiftoffRegister dst, Register src_addr,
@@ -2132,45 +2199,6 @@ void LiftoffAssembler::emit_s128_relaxed_laneselect(LiftoffRegister dst,
   bailout(kRelaxedSimd, "emit_s128_relaxed_laneselect");
 }
 
-void LiftoffAssembler::emit_f64x2_abs(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_f64x2_abs");
-}
-
-void LiftoffAssembler::emit_f64x2_neg(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_f64x2neg");
-}
-
-void LiftoffAssembler::emit_f64x2_sqrt(LiftoffRegister dst,
-                                       LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_f64x2sqrt");
-}
-
-bool LiftoffAssembler::emit_f64x2_ceil(LiftoffRegister dst,
-                                       LiftoffRegister src) {
-  bailout(kSimd, "f64x2.ceil");
-  return true;
-}
-
-bool LiftoffAssembler::emit_f64x2_floor(LiftoffRegister dst,
-                                        LiftoffRegister src) {
-  bailout(kSimd, "f64x2.floor");
-  return true;
-}
-
-bool LiftoffAssembler::emit_f64x2_trunc(LiftoffRegister dst,
-                                        LiftoffRegister src) {
-  bailout(kSimd, "f64x2.trunc");
-  return true;
-}
-
-bool LiftoffAssembler::emit_f64x2_nearest_int(LiftoffRegister dst,
-                                              LiftoffRegister src) {
-  bailout(kSimd, "f64x2.nearest_int");
-  return true;
-}
-
 void LiftoffAssembler::emit_f64x2_pmin(LiftoffRegister dst, LiftoffRegister lhs,
                                        LiftoffRegister rhs) {
   bailout(kSimd, "pmin unimplemented");
@@ -2208,45 +2236,6 @@ void LiftoffAssembler::emit_f64x2_promote_low_f32x4(LiftoffRegister dst,
   bailout(kSimd, "f64x2.promote_low_f32x4");
 }
 
-void LiftoffAssembler::emit_f32x4_abs(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_f32x4_abs");
-}
-
-void LiftoffAssembler::emit_f32x4_neg(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_f32x4neg");
-}
-
-void LiftoffAssembler::emit_f32x4_sqrt(LiftoffRegister dst,
-                                       LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_f32x4sqrt");
-}
-
-bool LiftoffAssembler::emit_f32x4_ceil(LiftoffRegister dst,
-                                       LiftoffRegister src) {
-  bailout(kSimd, "f32x4.ceil");
-  return true;
-}
-
-bool LiftoffAssembler::emit_f32x4_floor(LiftoffRegister dst,
-                                        LiftoffRegister src) {
-  bailout(kSimd, "f32x4.floor");
-  return true;
-}
-
-bool LiftoffAssembler::emit_f32x4_trunc(LiftoffRegister dst,
-                                        LiftoffRegister src) {
-  bailout(kSimd, "f32x4.trunc");
-  return true;
-}
-
-bool LiftoffAssembler::emit_f32x4_nearest_int(LiftoffRegister dst,
-                                              LiftoffRegister src) {
-  bailout(kSimd, "f32x4.nearest_int");
-  return true;
-}
-
 void LiftoffAssembler::emit_f32x4_relaxed_min(LiftoffRegister dst,
                                               LiftoffRegister lhs,
                                               LiftoffRegister rhs) {
@@ -2269,48 +2258,11 @@ void LiftoffAssembler::emit_f32x4_pmax(LiftoffRegister dst, LiftoffRegister lhs,
   bailout(kSimd, "pmax unimplemented");
 }
 
-void LiftoffAssembler::emit_i64x2_neg(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_i64x2neg");
-}
-
 void LiftoffAssembler::emit_i64x2_alltrue(LiftoffRegister dst,
                                           LiftoffRegister src) {
   bailout(kSimd, "i64x2_alltrue");
 }
 
-void LiftoffAssembler::emit_i64x2_shl(LiftoffRegister dst, LiftoffRegister lhs,
-                                      LiftoffRegister rhs) {
-  bailout(kSimd, "i64x2_shl");
-}
-
-void LiftoffAssembler::emit_i64x2_shli(LiftoffRegister dst, LiftoffRegister lhs,
-                                       int32_t rhs) {
-  bailout(kSimd, "i64x2_shli");
-}
-
-void LiftoffAssembler::emit_i64x2_shr_s(LiftoffRegister dst,
-                                        LiftoffRegister lhs,
-                                        LiftoffRegister rhs) {
-  bailout(kSimd, "i64x2_shr_s");
-}
-
-void LiftoffAssembler::emit_i64x2_shri_s(LiftoffRegister dst,
-                                         LiftoffRegister lhs, int32_t rhs) {
-  bailout(kSimd, "i64x2_shri_s");
-}
-
-void LiftoffAssembler::emit_i64x2_shr_u(LiftoffRegister dst,
-                                        LiftoffRegister lhs,
-                                        LiftoffRegister rhs) {
-  bailout(kSimd, "i64x2_shr_u");
-}
-
-void LiftoffAssembler::emit_i64x2_shri_u(LiftoffRegister dst,
-                                         LiftoffRegister lhs, int32_t rhs) {
-  bailout(kSimd, "i64x2_shri_u");
-}
-
 void LiftoffAssembler::emit_i64x2_extmul_low_i32x4_s(LiftoffRegister dst,
                                                      LiftoffRegister src1,
                                                      LiftoffRegister src2) {
@@ -2360,11 +2312,6 @@ void LiftoffAssembler::emit_i64x2_extmul_high_i32x4_u(LiftoffRegister dst,
   bailout(kSimd, "i64x2_extmul_high_i32x4_u unsupported");
 }
 
-void LiftoffAssembler::emit_i32x4_neg(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_i32x4neg");
-}
-
 void LiftoffAssembler::emit_i32x4_alltrue(LiftoffRegister dst,
                                           LiftoffRegister src) {
   bailout(kSimd, "i32x4_alltrue");
@@ -2375,38 +2322,6 @@ void LiftoffAssembler::emit_i32x4_bitmask(LiftoffRegister dst,
   bailout(kSimd, "i32x4_bitmask");
 }
 
-void LiftoffAssembler::emit_i32x4_shl(LiftoffRegister dst, LiftoffRegister lhs,
-                                      LiftoffRegister rhs) {
-  bailout(kSimd, "i32x4_shl");
-}
-
-void LiftoffAssembler::emit_i32x4_shli(LiftoffRegister dst, LiftoffRegister lhs,
-                                       int32_t rhs) {
-  bailout(kSimd, "i32x4_shli");
-}
-
-void LiftoffAssembler::emit_i32x4_shr_s(LiftoffRegister dst,
-                                        LiftoffRegister lhs,
-                                        LiftoffRegister rhs) {
-  bailout(kSimd, "i32x4_shr_s");
-}
-
-void LiftoffAssembler::emit_i32x4_shri_s(LiftoffRegister dst,
-                                         LiftoffRegister lhs, int32_t rhs) {
-  bailout(kSimd, "i32x4_shri_s");
-}
-
-void LiftoffAssembler::emit_i32x4_shr_u(LiftoffRegister dst,
-                                        LiftoffRegister lhs,
-                                        LiftoffRegister rhs) {
-  bailout(kSimd, "i32x4_shr_u");
-}
-
-void LiftoffAssembler::emit_i32x4_shri_u(LiftoffRegister dst,
-                                         LiftoffRegister lhs, int32_t rhs) {
-  bailout(kSimd, "i32x4_shri_u");
-}
-
 void LiftoffAssembler::emit_i32x4_dot_i16x8_s(LiftoffRegister dst,
                                               LiftoffRegister lhs,
                                               LiftoffRegister rhs) {
@@ -2447,11 +2362,6 @@ void LiftoffAssembler::emit_i32x4_extmul_high_i16x8_u(LiftoffRegister dst,
   bailout(kSimd, "i32x4_extmul_high_i16x8_u unsupported");
 }
 
-void LiftoffAssembler::emit_i16x8_neg(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_i16x8neg");
-}
-
 void LiftoffAssembler::emit_i16x8_alltrue(LiftoffRegister dst,
                                           LiftoffRegister src) {
   bailout(kSimd, "i16x8_alltrue");
@@ -2462,62 +2372,6 @@ void LiftoffAssembler::emit_i16x8_bitmask(LiftoffRegister dst,
   bailout(kSimd, "i16x8_bitmask");
 }
 
-void LiftoffAssembler::emit_i16x8_shl(LiftoffRegister dst, LiftoffRegister lhs,
-                                      LiftoffRegister rhs) {
-  bailout(kSimd, "i16x8_shl");
-}
-
-void LiftoffAssembler::emit_i16x8_shli(LiftoffRegister dst, LiftoffRegister lhs,
-                                       int32_t rhs) {
-  bailout(kSimd, "i16x8_shli");
-}
-
-void LiftoffAssembler::emit_i16x8_shr_s(LiftoffRegister dst,
-                                        LiftoffRegister lhs,
-                                        LiftoffRegister rhs) {
-  bailout(kSimd, "i16x8_shr_s");
-}
-
-void LiftoffAssembler::emit_i16x8_shri_s(LiftoffRegister dst,
-                                         LiftoffRegister lhs, int32_t rhs) {
-  bailout(kSimd, "i16x8_shri_s");
-}
-
-void LiftoffAssembler::emit_i16x8_shr_u(LiftoffRegister dst,
-                                        LiftoffRegister lhs,
-                                        LiftoffRegister rhs) {
-  bailout(kSimd, "i16x8_shr_u");
-}
-
-void LiftoffAssembler::emit_i16x8_shri_u(LiftoffRegister dst,
-                                         LiftoffRegister lhs, int32_t rhs) {
-  bailout(kSimd, "i16x8_shri_u");
-}
-
-void LiftoffAssembler::emit_i16x8_add_sat_s(LiftoffRegister dst,
-                                            LiftoffRegister lhs,
-                                            LiftoffRegister rhs) {
-  bailout(kUnsupportedArchitecture, "emit_i16x8addsaturate_s");
-}
-
-void LiftoffAssembler::emit_i16x8_sub_sat_s(LiftoffRegister dst,
-                                            LiftoffRegister lhs,
-                                            LiftoffRegister rhs) {
-  bailout(kUnsupportedArchitecture, "emit_i16x8subsaturate_s");
-}
-
-void LiftoffAssembler::emit_i16x8_sub_sat_u(LiftoffRegister dst,
-                                            LiftoffRegister lhs,
-                                            LiftoffRegister rhs) {
-  bailout(kUnsupportedArchitecture, "emit_i16x8subsaturate_u");
-}
-
-void LiftoffAssembler::emit_i16x8_add_sat_u(LiftoffRegister dst,
-                                            LiftoffRegister lhs,
-                                            LiftoffRegister rhs) {
-  bailout(kUnsupportedArchitecture, "emit_i16x8addsaturate_u");
-}
-
 void LiftoffAssembler::emit_i16x8_extadd_pairwise_i8x16_s(LiftoffRegister dst,
                                                           LiftoffRegister src) {
   bailout(kSimd, "i16x8.extadd_pairwise_i8x16_s");
@@ -2585,16 +2439,6 @@ void LiftoffAssembler::emit_i8x16_shuffle(LiftoffRegister dst,
   bailout(kSimd, "i8x16_shuffle");
 }
 
-void LiftoffAssembler::emit_i8x16_popcnt(LiftoffRegister dst,
-                                         LiftoffRegister src) {
-  bailout(kSimd, "i8x16.popcnt");
-}
-
-void LiftoffAssembler::emit_i8x16_neg(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_i8x16neg");
-}
-
 void LiftoffAssembler::emit_v128_anytrue(LiftoffRegister dst,
                                          LiftoffRegister src) {
   bailout(kSimd, "v8x16_anytrue");
@@ -2610,44 +2454,6 @@ void LiftoffAssembler::emit_i8x16_bitmask(LiftoffRegister dst,
   bailout(kSimd, "i8x16_bitmask");
 }
 
-void LiftoffAssembler::emit_i8x16_shl(LiftoffRegister dst, LiftoffRegister lhs,
-                                      LiftoffRegister rhs) {
-  bailout(kSimd, "i8x16_shl");
-}
-
-void LiftoffAssembler::emit_i8x16_shli(LiftoffRegister dst, LiftoffRegister lhs,
-                                       int32_t rhs) {
-  bailout(kSimd, "i8x16_shli");
-}
-
-void LiftoffAssembler::emit_i8x16_shr_s(LiftoffRegister dst,
-                                        LiftoffRegister lhs,
-                                        LiftoffRegister rhs) {
-  bailout(kSimd, "i8x16_shr_s");
-}
-
-void LiftoffAssembler::emit_i8x16_shri_s(LiftoffRegister dst,
-                                         LiftoffRegister lhs, int32_t rhs) {
-  bailout(kSimd, "i8x16_shri_s");
-}
-
-void LiftoffAssembler::emit_i8x16_shr_u(LiftoffRegister dst,
-                                        LiftoffRegister lhs,
-                                        LiftoffRegister rhs) {
-  bailout(kSimd, "i8x16_shr_u");
-}
-
-void LiftoffAssembler::emit_i8x16_shri_u(LiftoffRegister dst,
-                                         LiftoffRegister lhs, int32_t rhs) {
-  bailout(kSimd, "i8x16_shri_u");
-}
-
-void LiftoffAssembler::emit_i8x16_add_sat_s(LiftoffRegister dst,
-                                            LiftoffRegister lhs,
-                                            LiftoffRegister rhs) {
-  bailout(kUnsupportedArchitecture, "emit_i8x16addsaturate_s");
-}
-
 void LiftoffAssembler::emit_s128_const(LiftoffRegister dst,
                                        const uint8_t imms[16]) {
   bailout(kUnsupportedArchitecture, "emit_s128_const");
@@ -2796,44 +2602,6 @@ void LiftoffAssembler::emit_i16x8_rounding_average_u(LiftoffRegister dst,
   bailout(kUnsupportedArchitecture, "emit_i16x8_rounding_average_u");
 }
 
-void LiftoffAssembler::emit_i8x16_abs(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_i8x16_abs");
-}
-
-void LiftoffAssembler::emit_i16x8_abs(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_i16x8_abs");
-}
-
-void LiftoffAssembler::emit_i32x4_abs(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kUnsupportedArchitecture, "emit_i32x4_abs");
-}
-
-void LiftoffAssembler::emit_i64x2_abs(LiftoffRegister dst,
-                                      LiftoffRegister src) {
-  bailout(kSimd, "i64x2.abs");
-}
-
-void LiftoffAssembler::emit_i8x16_sub_sat_s(LiftoffRegister dst,
-                                            LiftoffRegister lhs,
-                                            LiftoffRegister rhs) {
-  bailout(kUnsupportedArchitecture, "emit_i8x16subsaturate_s");
-}
-
-void LiftoffAssembler::emit_i8x16_sub_sat_u(LiftoffRegister dst,
-                                            LiftoffRegister lhs,
-                                            LiftoffRegister rhs) {
-  bailout(kUnsupportedArchitecture, "emit_i8x16subsaturate_u");
-}
-
-void LiftoffAssembler::emit_i8x16_add_sat_u(LiftoffRegister dst,
-                                            LiftoffRegister lhs,
-                                            LiftoffRegister rhs) {
-  bailout(kUnsupportedArchitecture, "emit_i8x16addsaturate_u");
-}
-
 void LiftoffAssembler::emit_f32x4_qfma(LiftoffRegister dst,
                                        LiftoffRegister src1,
                                        LiftoffRegister src2,
@@ -2946,6 +2714,9 @@ void LiftoffAssembler::CallC(const ValueKindSig* sig,
       case kF64:
         StoreF64(args->fp(), MemOperand(sp, arg_bytes), r0);
         break;
+      case kS128:
+        StoreSimd128(args->fp().toSimd(), MemOperand(sp, arg_bytes), r0);
+        break;
       default:
         UNREACHABLE();
     }
@@ -2992,6 +2763,9 @@ void LiftoffAssembler::CallC(const ValueKindSig* sig,
       case kF64:
         LoadF64(result_reg->fp(), MemOperand(sp));
         break;
+      case kS128:
+        LoadSimd128(result_reg->fp().toSimd(), MemOperand(sp), r0);
+        break;
       default:
         UNREACHABLE();
     }
diff --git a/deps/v8/src/wasm/baseline/s390/liftoff-assembler-s390.h b/deps/v8/src/wasm/baseline/s390/liftoff-assembler-s390.h
index 8a45f09bf6fd54..f3e7f90b998929 100644
--- a/deps/v8/src/wasm/baseline/s390/liftoff-assembler-s390.h
+++ b/deps/v8/src/wasm/baseline/s390/liftoff-assembler-s390.h
@@ -3110,6 +3110,9 @@ void LiftoffAssembler::CallC(const ValueKindSig* sig,
       case kF64:
         StoreF64(args->fp(), MemOperand(sp, arg_bytes));
         break;
+      case kS128:
+        StoreV128(args->fp(), MemOperand(sp, arg_bytes), r0);
+        break;
       default:
         UNREACHABLE();
     }
@@ -3156,6 +3159,9 @@ void LiftoffAssembler::CallC(const ValueKindSig* sig,
       case kF64:
         LoadF64(result_reg->fp(), MemOperand(sp));
         break;
+      case kS128:
+        LoadV128(result_reg->fp(), MemOperand(sp), r0);
+        break;
       default:
         UNREACHABLE();
     }
diff --git a/deps/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h b/deps/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
index 3d3c16b1872e88..ace71919e5abf4 100644
--- a/deps/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
+++ b/deps/v8/src/wasm/baseline/x64/liftoff-assembler-x64.h
@@ -95,8 +95,8 @@ inline Operand GetMemOp(LiftoffAssembler* assm, Register addr,
   return Operand(addr, scratch, scale_factor, 0);
 }
 
-inline void Load(LiftoffAssembler* assm, LiftoffRegister dst, Operand src,
-                 ValueKind kind) {
+inline void LoadFromStack(LiftoffAssembler* assm, LiftoffRegister dst,
+                          Operand src, ValueKind kind) {
   switch (kind) {
     case kI32:
       assm->movl(dst.gp(), src);
@@ -105,6 +105,7 @@ inline void Load(LiftoffAssembler* assm, LiftoffRegister dst, Operand src,
     case kRefNull:
     case kRef:
     case kRtt:
+      // Stack slots are uncompressed even when heap pointers are compressed.
       assm->movq(dst.gp(), src);
       break;
     case kF32:
@@ -121,19 +122,18 @@ inline void Load(LiftoffAssembler* assm, LiftoffRegister dst, Operand src,
   }
 }
 
-inline void Store(LiftoffAssembler* assm, Operand dst, LiftoffRegister src,
-                  ValueKind kind) {
+inline void StoreToStack(LiftoffAssembler* assm, Operand dst,
+                         LiftoffRegister src, ValueKind kind) {
   switch (kind) {
     case kI32:
       assm->movl(dst, src.gp());
       break;
     case kI64:
-      assm->movq(dst, src.gp());
-      break;
     case kRefNull:
     case kRef:
     case kRtt:
-      assm->StoreTaggedField(dst, src.gp());
+      // Stack slots are uncompressed even when heap pointers are compressed.
+      assm->movq(dst, src.gp());
       break;
     case kF32:
       assm->Movss(dst, src.fp());
@@ -860,20 +860,20 @@ void LiftoffAssembler::LoadCallerFrameSlot(LiftoffRegister dst,
                                            uint32_t caller_slot_idx,
                                            ValueKind kind) {
   Operand src(rbp, kSystemPointerSize * (caller_slot_idx + 1));
-  liftoff::Load(this, dst, src, kind);
+  liftoff::LoadFromStack(this, dst, src, kind);
 }
 
 void LiftoffAssembler::StoreCallerFrameSlot(LiftoffRegister src,
                                             uint32_t caller_slot_idx,
                                             ValueKind kind) {
   Operand dst(rbp, kSystemPointerSize * (caller_slot_idx + 1));
-  liftoff::Store(this, dst, src, kind);
+  liftoff::StoreToStack(this, dst, src, kind);
 }
 
 void LiftoffAssembler::LoadReturnStackSlot(LiftoffRegister reg, int offset,
                                            ValueKind kind) {
   Operand src(rsp, offset);
-  liftoff::Load(this, reg, src, kind);
+  liftoff::LoadFromStack(this, reg, src, kind);
 }
 
 void LiftoffAssembler::MoveStackValue(uint32_t dst_offset, uint32_t src_offset,
@@ -977,7 +977,7 @@ void LiftoffAssembler::Spill(int offset, WasmValue value) {
 }
 
 void LiftoffAssembler::Fill(LiftoffRegister reg, int offset, ValueKind kind) {
-  liftoff::Load(this, reg, liftoff::GetStackSlot(offset), kind);
+  liftoff::LoadFromStack(this, reg, liftoff::GetStackSlot(offset), kind);
 }
 
 void LiftoffAssembler::FillI64Half(Register, int offset, RegPairHalf) {
@@ -4224,7 +4224,7 @@ void LiftoffAssembler::CallC(const ValueKindSig* sig,
 
   int arg_bytes = 0;
   for (ValueKind param_kind : sig->parameters()) {
-    liftoff::Store(this, Operand(rsp, arg_bytes), *args++, param_kind);
+    liftoff::StoreToStack(this, Operand(rsp, arg_bytes), *args++, param_kind);
     arg_bytes += value_kind_size(param_kind);
   }
   DCHECK_LE(arg_bytes, stack_bytes);
@@ -4251,7 +4251,8 @@ void LiftoffAssembler::CallC(const ValueKindSig* sig,
 
   // Load potential output value from the buffer on the stack.
   if (out_argument_kind != kVoid) {
-    liftoff::Load(this, *next_result_reg, Operand(rsp, 0), out_argument_kind);
+    liftoff::LoadFromStack(this, *next_result_reg, Operand(rsp, 0),
+                           out_argument_kind);
   }
 
   addq(rsp, Immediate(stack_bytes));
diff --git a/deps/v8/src/wasm/c-api.cc b/deps/v8/src/wasm/c-api.cc
index 4473e205c032ed..df97940aa48649 100644
--- a/deps/v8/src/wasm/c-api.cc
+++ b/deps/v8/src/wasm/c-api.cc
@@ -1562,10 +1562,10 @@ void PushArgs(const i::wasm::FunctionSig* sig, const Val args[],
         // TODO(7748): Make sure this works for all heap types.
         packer->Push(WasmRefToV8(store->i_isolate(), args[i].ref())->ptr());
         break;
-      case i::wasm::kRtt:
       case i::wasm::kS128:
         // TODO(7748): Implement.
         UNIMPLEMENTED();
+      case i::wasm::kRtt:
       case i::wasm::kI8:
       case i::wasm::kI16:
       case i::wasm::kVoid:
@@ -1601,10 +1601,10 @@ void PopArgs(const i::wasm::FunctionSig* sig, Val results[],
         results[i] = Val(V8RefValueToWasm(store, obj));
         break;
       }
-      case i::wasm::kRtt:
       case i::wasm::kS128:
         // TODO(7748): Implement.
         UNIMPLEMENTED();
+      case i::wasm::kRtt:
       case i::wasm::kI8:
       case i::wasm::kI16:
       case i::wasm::kVoid:
@@ -1869,10 +1869,10 @@ auto Global::get() const -> Val {
       }
       return Val(V8RefValueToWasm(store, result));
     }
-    case i::wasm::kRtt:
     case i::wasm::kS128:
       // TODO(7748): Implement these.
       UNIMPLEMENTED();
+    case i::wasm::kRtt:
     case i::wasm::kI8:
     case i::wasm::kI16:
     case i::wasm::kVoid:
diff --git a/deps/v8/src/wasm/canonical-types.cc b/deps/v8/src/wasm/canonical-types.cc
index 43cac1758973de..c5cb34b54c77ca 100644
--- a/deps/v8/src/wasm/canonical-types.cc
+++ b/deps/v8/src/wasm/canonical-types.cc
@@ -10,7 +10,7 @@ namespace v8 {
 namespace internal {
 namespace wasm {
 
-V8_EXPORT_PRIVATE TypeCanonicalizer* GetTypeCanonicalizer() {
+TypeCanonicalizer* GetTypeCanonicalizer() {
   return GetWasmEngine()->type_canonicalizer();
 }
 
@@ -55,8 +55,34 @@ void TypeCanonicalizer::AddRecursiveGroup(WasmModule* module, uint32_t size) {
   }
 }
 
-// An index in a type gets mapped to a relative index if it is inside the new
-// canonical group, or the canonical representative if it is not.
+uint32_t TypeCanonicalizer::AddRecursiveGroup(const FunctionSig* sig) {
+  base::MutexGuard mutex_guard(&mutex_);
+// Types in the signature must be module-independent.
+#if DEBUG
+  for (ValueType type : sig->all()) DCHECK(!type.has_index());
+#endif
+  CanonicalGroup group;
+  group.types.resize(1);
+  group.types[0].type_def = TypeDefinition(sig, kNoSuperType);
+  group.types[0].is_relative_supertype = false;
+  int canonical_index = FindCanonicalGroup(group);
+  if (canonical_index < 0) {
+    canonical_index = static_cast<int>(canonical_supertypes_.size());
+    // We need to copy the signature in the local zone, or else we risk
+    // storing a dangling pointer in the future.
+    auto builder = FunctionSig::Builder(&zone_, sig->return_count(),
+                                        sig->parameter_count());
+    for (auto type : sig->returns()) builder.AddReturn(type);
+    for (auto type : sig->parameters()) builder.AddParam(type);
+    const FunctionSig* allocated_sig = builder.Build();
+    group.types[0].type_def = TypeDefinition(allocated_sig, kNoSuperType);
+    group.types[0].is_relative_supertype = false;
+    canonical_groups_.emplace(group, canonical_index);
+    canonical_supertypes_.emplace_back(kNoSuperType);
+  }
+  return canonical_index;
+}
+
 ValueType TypeCanonicalizer::CanonicalizeValueType(
     const WasmModule* module, ValueType type,
     uint32_t recursive_group_start) const {
@@ -88,8 +114,6 @@ bool TypeCanonicalizer::IsCanonicalSubtype(uint32_t sub_index,
   return false;
 }
 
-// Map all type indices (including supertype) inside {type} to indices relative
-// to {recursive_group_start}.
 TypeCanonicalizer::CanonicalType TypeCanonicalizer::CanonicalizeTypeDef(
     const WasmModule* module, TypeDefinition type,
     uint32_t recursive_group_start) {
diff --git a/deps/v8/src/wasm/canonical-types.h b/deps/v8/src/wasm/canonical-types.h
index 47ad69108383e6..91f0576cedcdf6 100644
--- a/deps/v8/src/wasm/canonical-types.h
+++ b/deps/v8/src/wasm/canonical-types.h
@@ -21,8 +21,8 @@ namespace wasm {
 // types.
 // A recursive group is a subsequence of types explicitly marked in the type
 // section of a wasm module. Identical recursive groups have to be canonicalized
-// to a single canonical group and are considered identical. Respective
-// types in two identical groups are considered identical for all purposes.
+// to a single canonical group. Respective types in two identical groups are
+// considered identical for all purposes.
 // Two groups are considered identical if they have the same shape, and all
 // type indices referenced in the same position in both groups reference:
 // - identical types, if those do not belong to the rec. group,
@@ -43,6 +43,11 @@ class TypeCanonicalizer {
   // Modifies {module->isorecursive_canonical_type_ids}.
   V8_EXPORT_PRIVATE void AddRecursiveGroup(WasmModule* module, uint32_t size);
 
+  // Adds a module-independent signature as a recursive group, and canonicalizes
+  // it if an identical is found. Returns the canonical index of the added
+  // signature.
+  V8_EXPORT_PRIVATE uint32_t AddRecursiveGroup(const FunctionSig* sig);
+
   // Returns if the type at {sub_index} in {sub_module} is a subtype of the
   // type at {super_index} in {super_module} after canonicalization.
   V8_EXPORT_PRIVATE bool IsCanonicalSubtype(uint32_t sub_index,
@@ -100,9 +105,15 @@ class TypeCanonicalizer {
 
   int FindCanonicalGroup(CanonicalGroup&) const;
 
+  // Canonicalize all types present in {type} (including supertype) according to
+  // {CanonicalizeValueType}.
   CanonicalType CanonicalizeTypeDef(const WasmModule* module,
                                     TypeDefinition type,
                                     uint32_t recursive_group_start);
+
+  // An indexed type gets mapped to a {ValueType::CanonicalWithRelativeIndex}
+  // if its index points inside the new canonical group; otherwise, the index
+  // gets mapped to its canonical representative.
   ValueType CanonicalizeValueType(const WasmModule* module, ValueType type,
                                   uint32_t recursive_group_start) const;
 
diff --git a/deps/v8/src/wasm/constant-expression-interface.cc b/deps/v8/src/wasm/constant-expression-interface.cc
index f32783a0194c43..aa7a2809f38822 100644
--- a/deps/v8/src/wasm/constant-expression-interface.cc
+++ b/deps/v8/src/wasm/constant-expression-interface.cc
@@ -9,7 +9,6 @@
 #include "src/objects/fixed-array-inl.h"
 #include "src/objects/oddball.h"
 #include "src/wasm/decoder.h"
-#include "src/wasm/function-body-decoder-impl.h"
 #include "src/wasm/wasm-objects.h"
 
 namespace v8 {
diff --git a/deps/v8/src/wasm/constant-expression-interface.h b/deps/v8/src/wasm/constant-expression-interface.h
index 94501b71a1cdab..6dc225e7b7e201 100644
--- a/deps/v8/src/wasm/constant-expression-interface.h
+++ b/deps/v8/src/wasm/constant-expression-interface.h
@@ -21,12 +21,13 @@ class JSArrayBuffer;
 
 namespace wasm {
 
-// An interface for WasmFullDecoder used to decode constant expressions. This
-// interface has two modes: only validation (when {isolate_ == nullptr}), which
-// is used in module-decoder, and code-generation (when {isolate_ != nullptr}),
-// which is used in module-instantiate. We merge two distinct functionalities
-// in one class to reduce the number of WasmFullDecoder instantiations, and thus
-// V8 binary code size.
+// An interface for WasmFullDecoder used to decode constant expressions.
+// This interface has two modes: only validation (when {isolate_ == nullptr}),
+// and code-generation (when {isolate_ != nullptr}). We merge two distinct
+// functionalities in one class to reduce the number of WasmFullDecoder
+// instantiations, and thus V8 binary code size.
+// In code-generation mode, the result can be retrieved with {computed_value()}
+// if {!has_error()}, or with {error()} otherwise.
 class V8_EXPORT_PRIVATE ConstantExpressionInterface {
  public:
   static constexpr Decoder::ValidateFlag validate = Decoder::kFullValidation;
diff --git a/deps/v8/src/wasm/function-body-decoder-impl.h b/deps/v8/src/wasm/function-body-decoder-impl.h
index 5ef0eed5aeda16..a8a173e0a53745 100644
--- a/deps/v8/src/wasm/function-body-decoder-impl.h
+++ b/deps/v8/src/wasm/function-body-decoder-impl.h
@@ -14,6 +14,8 @@
 
 #include <inttypes.h>
 
+#include <optional>
+
 #include "src/base/small-vector.h"
 #include "src/base/strings.h"
 #include "src/base/v8-fallthrough.h"
@@ -924,8 +926,7 @@ struct ControlBase : public PcForErrors<validate> {
   F(StartFunctionBody, Control* block) \
   F(FinishFunction)                    \
   F(OnFirstError)                      \
-  F(NextInstruction, WasmOpcode)       \
-  F(Forward, const Value& from, Value* to)
+  F(NextInstruction, WasmOpcode)
 
 #define INTERFACE_CONSTANT_FUNCTIONS(F) /*       force 80 columns           */ \
   F(I32Const, Value* result, int32_t value)                                    \
@@ -979,6 +980,7 @@ struct ControlBase : public PcForErrors<validate> {
     const IndexImmediate<validate>& imm)                                       \
   F(Trap, TrapReason reason)                                                   \
   F(NopForTestingUnsupportedInLiftoff)                                         \
+  F(Forward, const Value& from, Value* to)                                     \
   F(Select, const Value& cond, const Value& fval, const Value& tval,           \
     Value* result)                                                             \
   F(BrOrRet, uint32_t depth, uint32_t drop_values)                             \
@@ -1064,7 +1066,10 @@ struct ControlBase : public PcForErrors<validate> {
     const Value& dst_index, const Value& length)                               \
   F(I31GetS, const Value& input, Value* result)                                \
   F(I31GetU, const Value& input, Value* result)                                \
-  F(RefTest, const Value& obj, const Value& rtt, Value* result)                \
+  F(RefTest, const Value& obj, const Value& rtt, Value* result,                \
+    bool null_succeeds)                                                        \
+  F(RefTestAbstract, const Value& obj, HeapType type, Value* result,           \
+    bool null_succeeds)                                                        \
   F(RefCast, const Value& obj, const Value& rtt, Value* result)                \
   F(AssertNull, const Value& obj, Value* result)                               \
   F(BrOnCast, const Value& obj, const Value& rtt, Value* result_on_branch,     \
@@ -1072,6 +1077,7 @@ struct ControlBase : public PcForErrors<validate> {
   F(BrOnCastFail, const Value& obj, const Value& rtt,                          \
     Value* result_on_fallthrough, uint32_t depth)                              \
   F(RefIsData, const Value& object, Value* result)                             \
+  F(RefIsEq, const Value& object, Value* result)                               \
   F(RefIsI31, const Value& object, Value* result)                              \
   F(RefIsArray, const Value& object, Value* result)                            \
   F(RefAsData, const Value& object, Value* result)                             \
@@ -1149,7 +1155,7 @@ class WasmDecoder : public Decoder {
               WasmFeatures* detected, const FunctionSig* sig, const byte* start,
               const byte* end, uint32_t buffer_offset = 0)
       : Decoder(start, end, buffer_offset),
-        local_types_(zone),
+        compilation_zone_(zone),
         module_(module),
         enabled_(enabled),
         detected_(detected),
@@ -1170,20 +1176,13 @@ class WasmDecoder : public Decoder {
     }
   }
 
-  Zone* zone() const { return local_types_.get_allocator().zone(); }
-
-  uint32_t num_locals() const {
-    DCHECK_EQ(num_locals_, local_types_.size());
-    return num_locals_;
-  }
+  Zone* zone() const { return compilation_zone_; }
 
-  ValueType local_type(uint32_t index) const { return local_types_[index]; }
+  uint32_t num_locals() const { return num_locals_; }
 
-  void InitializeLocalsFromSig() {
-    DCHECK_NOT_NULL(sig_);
-    DCHECK_EQ(0, this->local_types_.size());
-    local_types_.assign(sig_->parameters().begin(), sig_->parameters().end());
-    num_locals_ = static_cast<uint32_t>(sig_->parameters().size());
+  ValueType local_type(uint32_t index) const {
+    DCHECK_GE(num_locals_, index);
+    return local_types_[index];
   }
 
   // Decodes local definitions in the current decoder.
@@ -1191,6 +1190,12 @@ class WasmDecoder : public Decoder {
   // The decoded locals will be appended to {this->local_types_}.
   // The decoder's pc is not advanced.
   void DecodeLocals(const byte* pc, uint32_t* total_length) {
+    DCHECK_NULL(local_types_);
+    DCHECK_EQ(0, num_locals_);
+
+    // In a first step, count the number of locals and store the decoded
+    // entries.
+    num_locals_ = static_cast<uint32_t>(this->sig_->parameter_count());
     uint32_t length;
     *total_length = 0;
 
@@ -1202,7 +1207,12 @@ class WasmDecoder : public Decoder {
     *total_length += length;
     TRACE("local decls count: %u\n", entries);
 
-    while (entries-- > 0) {
+    struct DecodedLocalEntry {
+      uint32_t count;
+      ValueType type;
+    };
+    base::SmallVector<DecodedLocalEntry, 8> decoded_locals(entries);
+    for (uint32_t entry = 0; entry < entries; ++entry) {
       if (!VALIDATE(more())) {
         return DecodeError(
             end(), "expected more local decls but reached end of input");
@@ -1213,21 +1223,39 @@ class WasmDecoder : public Decoder {
       if (!VALIDATE(ok())) {
         return DecodeError(pc + *total_length, "invalid local count");
       }
-      DCHECK_LE(local_types_.size(), kV8MaxWasmFunctionLocals);
-      if (!VALIDATE(count <= kV8MaxWasmFunctionLocals - local_types_.size())) {
+      DCHECK_LE(num_locals_, kV8MaxWasmFunctionLocals);
+      if (!VALIDATE(count <= kV8MaxWasmFunctionLocals - num_locals_)) {
         return DecodeError(pc + *total_length, "local count too large");
       }
       *total_length += length;
 
       ValueType type = value_type_reader::read_value_type<validate>(
           this, pc + *total_length, &length, this->module_, enabled_);
-      if (!VALIDATE(type != kWasmBottom)) return;
+      if (!VALIDATE(ok())) return;
       *total_length += length;
 
-      local_types_.insert(local_types_.end(), count, type);
       num_locals_ += count;
+      decoded_locals[entry] = DecodedLocalEntry{count, type};
     }
     DCHECK(ok());
+
+    if (num_locals_ == 0) return;
+
+    // Now build the array of local types from the parsed entries.
+    local_types_ = compilation_zone_->NewArray<ValueType>(num_locals_);
+    ValueType* locals_ptr = local_types_;
+
+    if (sig_->parameter_count() > 0) {
+      std::copy(sig_->parameters().begin(), sig_->parameters().end(),
+                locals_ptr);
+      locals_ptr += sig_->parameter_count();
+    }
+
+    for (auto& entry : decoded_locals) {
+      std::fill_n(locals_ptr, entry.count, entry.type);
+      locals_ptr += entry.count;
+    }
+    DCHECK_EQ(locals_ptr, local_types_ + num_locals_);
   }
 
   // Shorthand that forwards to the {DecodeError} functions above, passing our
@@ -2027,6 +2055,13 @@ class WasmDecoder : public Decoder {
             return length + imm.length;
           }
           case kExprRefTest:
+          case kExprRefTestNull: {
+            HeapTypeImmediate<validate> imm(WasmFeatures::All(), decoder,
+                                            pc + length, nullptr);
+            if (io) io->HeapType(imm);
+            return length + imm.length;
+          }
+          case kExprRefTestDeprecated:
           case kExprRefCast:
           case kExprRefCastNop: {
             IndexImmediate<validate> imm(decoder, pc + length, "type index");
@@ -2255,6 +2290,8 @@ class WasmDecoder : public Decoder {
           case kExprArrayLenDeprecated:
           case kExprArrayLen:
           case kExprRefTest:
+          case kExprRefTestNull:
+          case kExprRefTestDeprecated:
           case kExprRefCast:
           case kExprRefCastNop:
           case kExprBrOnCast:
@@ -2344,13 +2381,9 @@ class WasmDecoder : public Decoder {
     // clang-format on
   }
 
-  // The {Zone} is implicitly stored in the {ZoneAllocator} which is part of
-  // this {ZoneVector}. Hence save one field and just get it from there if
-  // needed (see {zone()} accessor below).
-  ZoneVector<ValueType> local_types_;
+  Zone* const compilation_zone_;
 
-  // Cached value, for speed (yes, it's measurably faster to load this value
-  // than to load the start and end pointer from a vector, subtract and shift).
+  ValueType* local_types_ = nullptr;
   uint32_t num_locals_ = 0;
 
   const WasmModule* module_;
@@ -2422,13 +2455,13 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
     DCHECK_EQ(this->num_locals(), 0);
 
     locals_offset_ = this->pc_offset();
-    this->InitializeLocalsFromSig();
-    uint32_t params_count = this->num_locals();
     uint32_t locals_length;
     this->DecodeLocals(this->pc(), &locals_length);
     if (this->failed()) return TraceFailed();
     this->consume_bytes(locals_length);
     int non_defaultable = 0;
+    uint32_t params_count =
+        static_cast<uint32_t>(this->sig_->parameter_count());
     for (uint32_t index = params_count; index < this->num_locals(); index++) {
       if (!this->local_type(index).is_defaultable()) non_defaultable++;
     }
@@ -4241,20 +4274,37 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
     }
   }
 
-  // Checks if types are unrelated, thus type checking will always fail. Does
-  // not account for nullability.
+  // Returns true if type checking will always fail, either because the types
+  // are unrelated or because the target_type is one of the null sentinels and
+  // conversion to null does not succeed.
+  bool TypeCheckAlwaysFails(Value obj, HeapType expected_type,
+                            bool null_succeeds) {
+    bool types_unrelated =
+        !IsSubtypeOf(ValueType::Ref(expected_type), obj.type, this->module_) &&
+        !IsSubtypeOf(obj.type, ValueType::RefNull(expected_type),
+                     this->module_);
+    // For "unrelated" types the check can still succeed for the null value on
+    // instructions treating null as a successful check.
+    return (types_unrelated && (!null_succeeds || !obj.type.is_nullable())) ||
+           (!null_succeeds &&
+            (expected_type.representation() == HeapType::kNone ||
+             expected_type.representation() == HeapType::kNoFunc ||
+             expected_type.representation() == HeapType::kNoExtern));
+  }
   bool TypeCheckAlwaysFails(Value obj, Value rtt) {
-    return !IsSubtypeOf(ValueType::Ref(rtt.type.ref_index()), obj.type,
-                        this->module_) &&
-           !IsSubtypeOf(obj.type, ValueType::RefNull(rtt.type.ref_index()),
-                        this->module_);
+    // All old casts / checks treat null as failure.
+    const bool kNullSucceeds = false;
+    return TypeCheckAlwaysFails(obj, HeapType(rtt.type.ref_index()),
+                                kNullSucceeds);
   }
 
-  // Checks it {obj} is a subtype of {rtt}'s type, thus checking will always
-  // succeed. Does not account for nullability.
+  // Checks if {obj} is a subtype of type, thus checking will always
+  // succeed.
+  bool TypeCheckAlwaysSucceeds(Value obj, HeapType type) {
+    return IsSubtypeOf(obj.type, ValueType::RefNull(type), this->module_);
+  }
   bool TypeCheckAlwaysSucceeds(Value obj, Value rtt) {
-    return IsSubtypeOf(obj.type, ValueType::RefNull(rtt.type.ref_index()),
-                       this->module_);
+    return TypeCheckAlwaysSucceeds(obj, HeapType(rtt.type.ref_index()));
   }
 
 #define NON_CONST_ONLY                                                    \
@@ -4681,7 +4731,80 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
         Push(value);
         return opcode_length;
       }
+      case kExprRefTestNull:
       case kExprRefTest: {
+        NON_CONST_ONLY
+        HeapTypeImmediate<validate> imm(
+            this->enabled_, this, this->pc_ + opcode_length, this->module_);
+        if (!VALIDATE(this->ok())) return 0;
+        opcode_length += imm.length;
+
+        std::optional<Value> rtt;
+        HeapType target_type = imm.type;
+        if (imm.type.is_index()) {
+          rtt = CreateValue(ValueType::Rtt(imm.type.ref_index()));
+          CALL_INTERFACE_IF_OK_AND_REACHABLE(RttCanon, imm.type.ref_index(),
+                                             &rtt.value());
+          Push(rtt.value());
+        }
+
+        Value obj = Peek(rtt.has_value() ? 1 : 0);
+        Value value = CreateValue(kWasmI32);
+
+        if (!VALIDATE((obj.type.is_object_reference() &&
+                       IsSameTypeHierarchy(obj.type.heap_type(), target_type,
+                                           this->module_)) ||
+                      obj.type.is_bottom())) {
+          this->DecodeError(
+              obj.pc(),
+              "Invalid types for ref.test: %s of type %s has to "
+              "be in the same reference type hierarchy as (ref %s)",
+              SafeOpcodeNameAt(obj.pc()), obj.type.name().c_str(),
+              target_type.name().c_str());
+          return 0;
+        }
+        bool null_succeeds = opcode == kExprRefTestNull;
+        if (V8_LIKELY(current_code_reachable_and_ok_)) {
+          // This logic ensures that code generation can assume that functions
+          // can only be cast to function types, and data objects to data types.
+          if (V8_UNLIKELY(TypeCheckAlwaysSucceeds(obj, target_type))) {
+            if (rtt.has_value()) {
+              // Drop rtt.
+              CALL_INTERFACE(Drop);
+            }
+            // Type checking can still fail for null.
+            if (obj.type.is_nullable() && !null_succeeds) {
+              // We abuse ref.as_non_null, which isn't otherwise used as a unary
+              // operator, as a sentinel for the negation of ref.is_null.
+              CALL_INTERFACE(UnOp, kExprRefAsNonNull, obj, &value);
+            } else {
+              CALL_INTERFACE(Drop);
+              CALL_INTERFACE(I32Const, &value, 1);
+            }
+          } else if (V8_UNLIKELY(TypeCheckAlwaysFails(obj, target_type,
+                                                      null_succeeds))) {
+            if (rtt.has_value()) {
+              // Drop rtt.
+              CALL_INTERFACE(Drop);
+            }
+            CALL_INTERFACE(Drop);
+            CALL_INTERFACE(I32Const, &value, 0);
+          } else {
+            if (rtt.has_value()) {
+              // RTT => Cast to concrete (index) type.
+              CALL_INTERFACE(RefTest, obj, rtt.value(), &value, null_succeeds);
+            } else {
+              // No RTT => Cast to abstract (non-index) types.
+              CALL_INTERFACE(RefTestAbstract, obj, target_type, &value,
+                             null_succeeds);
+            }
+          }
+        }
+        Drop(1 + rtt.has_value());
+        Push(value);
+        return opcode_length;
+      }
+      case kExprRefTestDeprecated: {
         NON_CONST_ONLY
         IndexImmediate<validate> imm(this, this->pc_ + opcode_length,
                                      "type index");
@@ -4718,7 +4841,7 @@ class WasmFullDecoder : public WasmDecoder<validate, decoding_mode> {
             CALL_INTERFACE(Drop);
             CALL_INTERFACE(I32Const, &value, 0);
           } else {
-            CALL_INTERFACE(RefTest, obj, rtt, &value);
+            CALL_INTERFACE(RefTest, obj, rtt, &value, /*null_succeeds*/ false);
           }
         }
         Drop(2);
diff --git a/deps/v8/src/wasm/function-body-decoder.cc b/deps/v8/src/wasm/function-body-decoder.cc
index 86e8b793c0a274..2d25af7e275e66 100644
--- a/deps/v8/src/wasm/function-body-decoder.cc
+++ b/deps/v8/src/wasm/function-body-decoder.cc
@@ -18,11 +18,11 @@ namespace wasm {
 
 bool DecodeLocalDecls(const WasmFeatures& enabled, BodyLocalDecls* decls,
                       const WasmModule* module, const byte* start,
-                      const byte* end) {
+                      const byte* end, Zone* zone) {
   WasmFeatures no_features = WasmFeatures::None();
-  Zone* zone = decls->type_list.get_allocator().zone();
+  constexpr FixedSizeSignature<ValueType, 0, 0> kNoSig;
   WasmDecoder<Decoder::kFullValidation> decoder(
-      zone, module, enabled, &no_features, nullptr, start, end, 0);
+      zone, module, enabled, &no_features, &kNoSig, start, end, 0);
   uint32_t length;
   decoder.DecodeLocals(decoder.pc(), &length);
   if (decoder.failed()) {
@@ -31,27 +31,32 @@ bool DecodeLocalDecls(const WasmFeatures& enabled, BodyLocalDecls* decls,
   }
   DCHECK(decoder.ok());
   decls->encoded_size = length;
-  // Copy the decoded locals types into {decls->type_list}.
-  DCHECK(decls->type_list.empty());
-  decls->type_list = std::move(decoder.local_types_);
+  // Copy the decoded locals types into {decls->local_types}.
+  DCHECK_NULL(decls->local_types);
+  decls->num_locals = decoder.num_locals_;
+  decls->local_types = decoder.local_types_;
   return true;
 }
 
+BytecodeIterator::BytecodeIterator(const byte* start, const byte* end)
+    : Decoder(start, end) {}
+
 BytecodeIterator::BytecodeIterator(const byte* start, const byte* end,
-                                   BodyLocalDecls* decls)
+                                   BodyLocalDecls* decls, Zone* zone)
     : Decoder(start, end) {
-  if (decls != nullptr) {
-    if (DecodeLocalDecls(WasmFeatures::All(), decls, nullptr, start, end)) {
-      pc_ += decls->encoded_size;
-      if (pc_ > end_) pc_ = end_;
-    }
+  DCHECK_NOT_NULL(decls);
+  DCHECK_NOT_NULL(zone);
+  if (DecodeLocalDecls(WasmFeatures::All(), decls, nullptr, start, end, zone)) {
+    pc_ += decls->encoded_size;
+    if (pc_ > end_) pc_ = end_;
   }
 }
 
-DecodeResult VerifyWasmCode(AccountingAllocator* allocator,
-                            const WasmFeatures& enabled,
-                            const WasmModule* module, WasmFeatures* detected,
-                            const FunctionBody& body) {
+DecodeResult ValidateFunctionBody(AccountingAllocator* allocator,
+                                  const WasmFeatures& enabled,
+                                  const WasmModule* module,
+                                  WasmFeatures* detected,
+                                  const FunctionBody& body) {
   Zone zone(allocator, ZONE_NAME);
   WasmFullDecoder<Decoder::kFullValidation, EmptyInterface> decoder(
       &zone, module, enabled, detected, body);
@@ -140,19 +145,19 @@ bool PrintRawWasmCode(AccountingAllocator* allocator, const FunctionBody& body,
   }
 
   // Print the local declarations.
-  BodyLocalDecls decls(&zone);
-  BytecodeIterator i(body.start, body.end, &decls);
+  BodyLocalDecls decls;
+  BytecodeIterator i(body.start, body.end, &decls, &zone);
   if (body.start != i.pc() && print_locals == kPrintLocals) {
     os << "// locals:";
-    if (!decls.type_list.empty()) {
-      ValueType type = decls.type_list[0];
+    if (decls.num_locals > 0) {
+      ValueType type = decls.local_types[0];
       uint32_t count = 0;
-      for (size_t pos = 0; pos < decls.type_list.size(); ++pos) {
-        if (decls.type_list[pos] == type) {
+      for (size_t pos = 0; pos < decls.num_locals; ++pos) {
+        if (decls.local_types[pos] == type) {
           ++count;
         } else {
           os << " " << count << " " << type.name();
-          type = decls.type_list[pos];
+          type = decls.local_types[pos];
           count = 1;
         }
       }
diff --git a/deps/v8/src/wasm/function-body-decoder.h b/deps/v8/src/wasm/function-body-decoder.h
index 0c36f1ddce0541..d6fb2cfd99a757 100644
--- a/deps/v8/src/wasm/function-body-decoder.h
+++ b/deps/v8/src/wasm/function-body-decoder.h
@@ -42,11 +42,9 @@ struct FunctionBody {
 
 enum class LoadTransformationKind : uint8_t { kSplat, kExtend, kZeroExtend };
 
-V8_EXPORT_PRIVATE DecodeResult VerifyWasmCode(AccountingAllocator* allocator,
-                                              const WasmFeatures& enabled,
-                                              const WasmModule* module,
-                                              WasmFeatures* detected,
-                                              const FunctionBody& body);
+V8_EXPORT_PRIVATE DecodeResult ValidateFunctionBody(
+    AccountingAllocator* allocator, const WasmFeatures& enabled,
+    const WasmModule* module, WasmFeatures* detected, const FunctionBody& body);
 
 enum PrintLocals { kPrintLocals, kOmitLocals };
 V8_EXPORT_PRIVATE
@@ -66,15 +64,15 @@ struct BodyLocalDecls {
   // The size of the encoded declarations.
   uint32_t encoded_size = 0;  // size of encoded declarations
 
-  ZoneVector<ValueType> type_list;
-
-  explicit BodyLocalDecls(Zone* zone) : type_list(zone) {}
+  uint32_t num_locals = 0;
+  ValueType* local_types = nullptr;
 };
 
 V8_EXPORT_PRIVATE bool DecodeLocalDecls(const WasmFeatures& enabled,
                                         BodyLocalDecls* decls,
                                         const WasmModule* module,
-                                        const byte* start, const byte* end);
+                                        const byte* start, const byte* end,
+                                        Zone* zone);
 
 V8_EXPORT_PRIVATE BitVector* AnalyzeLoopAssignmentForTesting(
     Zone* zone, uint32_t num_locals, const byte* start, const byte* end);
@@ -152,11 +150,12 @@ class V8_EXPORT_PRIVATE BytecodeIterator : public NON_EXPORTED_BASE(Decoder) {
         : iterator_base(ptr, end), start_(start) {}
   };
 
-  // Create a new {BytecodeIterator}. If the {decls} pointer is non-null,
-  // assume the bytecode starts with local declarations and decode them.
-  // Otherwise, do not decode local decls.
-  BytecodeIterator(const byte* start, const byte* end,
-                   BodyLocalDecls* decls = nullptr);
+  // Create a new {BytecodeIterator}, starting after the locals declarations.
+  BytecodeIterator(const byte* start, const byte* end);
+
+  // Create a new {BytecodeIterator}, starting with locals declarations.
+  BytecodeIterator(const byte* start, const byte* end, BodyLocalDecls* decls,
+                   Zone* zone);
 
   base::iterator_range<opcode_iterator> opcodes() {
     return base::iterator_range<opcode_iterator>(opcode_iterator(pc_, end_),
diff --git a/deps/v8/src/wasm/function-compiler.cc b/deps/v8/src/wasm/function-compiler.cc
index d4230e3b46047a..46a4f545b37dfb 100644
--- a/deps/v8/src/wasm/function-compiler.cc
+++ b/deps/v8/src/wasm/function-compiler.cc
@@ -66,7 +66,7 @@ WasmCompilationResult WasmCompilationUnit::ExecuteFunctionCompilation(
 
   base::Optional<TimedHistogramScope> wasm_compile_function_time_scope;
   base::Optional<TimedHistogramScope> wasm_compile_huge_function_time_scope;
-  if (counters) {
+  if (counters && base::TimeTicks::IsHighResolution()) {
     if (func_body.end - func_body.start >= 100 * KB) {
       auto huge_size_histogram = SELECT_WASM_COUNTER(
           counters, env->module->origin, wasm, huge_function_size_bytes);
@@ -204,12 +204,13 @@ bool UseGenericWrapper(const FunctionSig* sig) {
 }  // namespace
 
 JSToWasmWrapperCompilationUnit::JSToWasmWrapperCompilationUnit(
-    Isolate* isolate, const FunctionSig* sig, const WasmModule* module,
-    bool is_import, const WasmFeatures& enabled_features,
-    AllowGeneric allow_generic)
+    Isolate* isolate, const FunctionSig* sig, uint32_t canonical_sig_index,
+    const WasmModule* module, bool is_import,
+    const WasmFeatures& enabled_features, AllowGeneric allow_generic)
     : isolate_(isolate),
       is_import_(is_import),
       sig_(sig),
+      canonical_sig_index_(canonical_sig_index),
       use_generic_wrapper_(allow_generic && UseGenericWrapper(sig) &&
                            !is_import),
       job_(use_generic_wrapper_
@@ -248,24 +249,27 @@ Handle<CodeT> JSToWasmWrapperCompilationUnit::Finalize() {
 
 // static
 Handle<CodeT> JSToWasmWrapperCompilationUnit::CompileJSToWasmWrapper(
-    Isolate* isolate, const FunctionSig* sig, const WasmModule* module,
-    bool is_import) {
+    Isolate* isolate, const FunctionSig* sig, uint32_t canonical_sig_index,
+    const WasmModule* module, bool is_import) {
   // Run the compilation unit synchronously.
   WasmFeatures enabled_features = WasmFeatures::FromIsolate(isolate);
-  JSToWasmWrapperCompilationUnit unit(isolate, sig, module, is_import,
-                                      enabled_features, kAllowGeneric);
+  JSToWasmWrapperCompilationUnit unit(isolate, sig, canonical_sig_index, module,
+                                      is_import, enabled_features,
+                                      kAllowGeneric);
   unit.Execute();
   return unit.Finalize();
 }
 
 // static
 Handle<CodeT> JSToWasmWrapperCompilationUnit::CompileSpecificJSToWasmWrapper(
-    Isolate* isolate, const FunctionSig* sig, const WasmModule* module) {
+    Isolate* isolate, const FunctionSig* sig, uint32_t canonical_sig_index,
+    const WasmModule* module) {
   // Run the compilation unit synchronously.
   const bool is_import = false;
   WasmFeatures enabled_features = WasmFeatures::FromIsolate(isolate);
-  JSToWasmWrapperCompilationUnit unit(isolate, sig, module, is_import,
-                                      enabled_features, kDontAllowGeneric);
+  JSToWasmWrapperCompilationUnit unit(isolate, sig, canonical_sig_index, module,
+                                      is_import, enabled_features,
+                                      kDontAllowGeneric);
   unit.Execute();
   return unit.Finalize();
 }
diff --git a/deps/v8/src/wasm/function-compiler.h b/deps/v8/src/wasm/function-compiler.h
index 71744db8ee854c..fa70073291b630 100644
--- a/deps/v8/src/wasm/function-compiler.h
+++ b/deps/v8/src/wasm/function-compiler.h
@@ -44,7 +44,7 @@ struct WasmCompilationResult {
 
   bool succeeded() const { return code_desc.buffer != nullptr; }
   bool failed() const { return !succeeded(); }
-  operator bool() const { return succeeded(); }
+  explicit operator bool() const { return succeeded(); }
 
   CodeDesc code_desc;
   std::unique_ptr<AssemblerBuffer> instr_buffer;
@@ -57,7 +57,6 @@ struct WasmCompilationResult {
   ExecutionTier result_tier;
   Kind kind = kFunction;
   ForDebugging for_debugging = kNoDebugging;
-  int feedback_vector_slots = 0;
 };
 
 class V8_EXPORT_PRIVATE WasmCompilationUnit final {
@@ -104,6 +103,7 @@ class V8_EXPORT_PRIVATE JSToWasmWrapperCompilationUnit final {
   enum AllowGeneric : bool { kAllowGeneric = true, kDontAllowGeneric = false };
 
   JSToWasmWrapperCompilationUnit(Isolate* isolate, const FunctionSig* sig,
+                                 uint32_t canonical_sig_index,
                                  const wasm::WasmModule* module, bool is_import,
                                  const WasmFeatures& enabled_features,
                                  AllowGeneric allow_generic);
@@ -116,18 +116,20 @@ class V8_EXPORT_PRIVATE JSToWasmWrapperCompilationUnit final {
 
   bool is_import() const { return is_import_; }
   const FunctionSig* sig() const { return sig_; }
+  uint32_t canonical_sig_index() const { return canonical_sig_index_; }
 
   // Run a compilation unit synchronously.
   static Handle<CodeT> CompileJSToWasmWrapper(Isolate* isolate,
                                               const FunctionSig* sig,
+                                              uint32_t canonical_sig_index,
                                               const WasmModule* module,
                                               bool is_import);
 
   // Run a compilation unit synchronously, but ask for the specific
   // wrapper.
-  static Handle<CodeT> CompileSpecificJSToWasmWrapper(Isolate* isolate,
-                                                      const FunctionSig* sig,
-                                                      const WasmModule* module);
+  static Handle<CodeT> CompileSpecificJSToWasmWrapper(
+      Isolate* isolate, const FunctionSig* sig, uint32_t canonical_sig_index,
+      const WasmModule* module);
 
  private:
   // Wrapper compilation is bound to an isolate. Concurrent accesses to the
@@ -137,6 +139,7 @@ class V8_EXPORT_PRIVATE JSToWasmWrapperCompilationUnit final {
   Isolate* isolate_;
   bool is_import_;
   const FunctionSig* sig_;
+  uint32_t canonical_sig_index_;
   bool use_generic_wrapper_;
   std::unique_ptr<TurbofanCompilationJob> job_;
 };
diff --git a/deps/v8/src/wasm/graph-builder-interface.cc b/deps/v8/src/wasm/graph-builder-interface.cc
index 1279b426b15002..fb1f19c2b13604 100644
--- a/deps/v8/src/wasm/graph-builder-interface.cc
+++ b/deps/v8/src/wasm/graph-builder-interface.cc
@@ -1234,10 +1234,12 @@ class WasmGraphBuildingInterface {
 
   WasmTypeCheckConfig ComputeWasmTypeCheckConfig(ValueType object_type,
                                                  ValueType rtt_type,
-                                                 const WasmModule* module) {
+                                                 const WasmModule* module,
+                                                 bool null_succeeds) {
     WasmTypeCheckConfig result;
     result.object_can_be_null = object_type.is_nullable();
     DCHECK(object_type.is_object_reference());  // Checked by validation.
+    result.null_succeeds = null_succeeds;
     // In the bottom case, the result is irrelevant.
     result.rtt_depth = rtt_type.is_bottom()
                            ? 0 /* unused */
@@ -1247,16 +1249,24 @@ class WasmGraphBuildingInterface {
   }
 
   void RefTest(FullDecoder* decoder, const Value& object, const Value& rtt,
-               Value* result) {
-    WasmTypeCheckConfig config =
-        ComputeWasmTypeCheckConfig(object.type, rtt.type, decoder->module_);
+               Value* result, bool null_succeeds) {
+    WasmTypeCheckConfig config = ComputeWasmTypeCheckConfig(
+        object.type, rtt.type, decoder->module_, null_succeeds);
     SetAndTypeNode(result, builder_->RefTest(object.node, rtt.node, config));
   }
 
+  void RefTestAbstract(FullDecoder* decoder, const Value& object,
+                       wasm::HeapType type, Value* result, bool null_succeeds) {
+    SetAndTypeNode(result,
+                   builder_->RefTestAbstract(object.node, type, null_succeeds));
+  }
+
   void RefCast(FullDecoder* decoder, const Value& object, const Value& rtt,
                Value* result) {
-    WasmTypeCheckConfig config =
-        ComputeWasmTypeCheckConfig(object.type, rtt.type, decoder->module_);
+    // TODO(mliedtke): Should be a parameter for generic ref.cast instructions.
+    const bool null_succeeds = false;
+    WasmTypeCheckConfig config = ComputeWasmTypeCheckConfig(
+        object.type, rtt.type, decoder->module_, null_succeeds);
     TFNode* cast_node = v8_flags.experimental_wasm_assume_ref_cast_succeeds
                             ? builder_->TypeGuard(object.node, result->type)
                             : builder_->RefCast(object.node, rtt.node, config,
@@ -1270,8 +1280,11 @@ class WasmGraphBuildingInterface {
   void BrOnCastAbs(FullDecoder* decoder, const Value& object, const Value& rtt,
                    Value* forwarding_value, uint32_t br_depth,
                    bool branch_on_match) {
-    WasmTypeCheckConfig config =
-        ComputeWasmTypeCheckConfig(object.type, rtt.type, decoder->module_);
+    // TODO(mliedtke): Should be a parameter for generic br_on_cast
+    // instructions.
+    const bool null_succeeds = false;
+    WasmTypeCheckConfig config = ComputeWasmTypeCheckConfig(
+        object.type, rtt.type, decoder->module_, null_succeeds);
     SsaEnv* branch_env = Split(decoder->zone(), ssa_env_);
     SsaEnv* no_branch_env = Steal(decoder->zone(), ssa_env_);
     no_branch_env->SetNotMerged();
@@ -1302,9 +1315,18 @@ class WasmGraphBuildingInterface {
         decoder, object, rtt, value_on_fallthrough, br_depth, false);
   }
 
+  void RefIsEq(FullDecoder* decoder, const Value& object, Value* result) {
+    bool null_succeeds = false;
+    SetAndTypeNode(result,
+                   builder_->RefIsEq(object.node, object.type.is_nullable(),
+                                     null_succeeds));
+  }
+
   void RefIsData(FullDecoder* decoder, const Value& object, Value* result) {
+    bool null_succeeds = false;
     SetAndTypeNode(result,
-                   builder_->RefIsData(object.node, object.type.is_nullable()));
+                   builder_->RefIsData(object.node, object.type.is_nullable(),
+                                       null_succeeds));
   }
 
   void RefAsData(FullDecoder* decoder, const Value& object, Value* result) {
@@ -1329,8 +1351,10 @@ class WasmGraphBuildingInterface {
   }
 
   void RefIsArray(FullDecoder* decoder, const Value& object, Value* result) {
-    SetAndTypeNode(
-        result, builder_->RefIsArray(object.node, object.type.is_nullable()));
+    bool null_succeeds = false;
+    SetAndTypeNode(result,
+                   builder_->RefIsArray(object.node, object.type.is_nullable(),
+                                        null_succeeds));
   }
 
   void RefAsArray(FullDecoder* decoder, const Value& object, Value* result) {
@@ -1355,7 +1379,8 @@ class WasmGraphBuildingInterface {
   }
 
   void RefIsI31(FullDecoder* decoder, const Value& object, Value* result) {
-    SetAndTypeNode(result, builder_->RefIsI31(object.node));
+    bool null_succeeds = false;
+    SetAndTypeNode(result, builder_->RefIsI31(object.node, null_succeeds));
   }
 
   void RefAsI31(FullDecoder* decoder, const Value& object, Value* result) {
@@ -1693,7 +1718,6 @@ class WasmGraphBuildingInterface {
 
     TFNode* if_success = nullptr;
     TFNode* if_exception = nullptr;
-    // TODO(manoskouk): Can we assign a wasm type to the exception value?
     if (!builder_->ThrowsException(node, &if_success, &if_exception)) {
       return node;
     }
@@ -2081,7 +2105,6 @@ class WasmGraphBuildingInterface {
         }
       }
       if (exception_value != nullptr) {
-        // TODO(manoskouk): Can we assign a wasm type to the exception value?
         *exception_value = builder_->LoopExitValue(
             *exception_value, MachineRepresentation::kWord32);
       }
diff --git a/deps/v8/src/wasm/module-compiler.cc b/deps/v8/src/wasm/module-compiler.cc
index f81e6ebdc68735..10575a7e3160ce 100644
--- a/deps/v8/src/wasm/module-compiler.cc
+++ b/deps/v8/src/wasm/module-compiler.cc
@@ -616,8 +616,7 @@ class CompilationStateImpl {
 
   std::shared_ptr<JSToWasmWrapperCompilationUnit>
   GetNextJSToWasmWrapperCompilationUnit();
-  void FinalizeJSToWasmWrappers(Isolate* isolate, const WasmModule* module,
-                                Handle<FixedArray>* export_wrappers_out);
+  void FinalizeJSToWasmWrappers(Isolate* isolate, const WasmModule* module);
 
   void OnFinishedUnits(base::Vector<WasmCode*>);
   void OnFinishedJSToWasmWrapperUnits(int num);
@@ -1098,10 +1097,9 @@ DecodeResult ValidateSingleFunction(const WasmModule* module, int func_index,
                                     WasmFeatures enabled_features) {
   const WasmFunction* func = &module->functions[func_index];
   FunctionBody body{func->sig, func->code.offset(), code.begin(), code.end()};
-  DecodeResult result;
-
-  WasmFeatures detected;
-  return VerifyWasmCode(allocator, enabled_features, module, &detected, body);
+  WasmFeatures detected_features;
+  return ValidateFunctionBody(allocator, enabled_features, module,
+                              &detected_features, body);
 }
 
 enum OnlyLazyFunctions : bool {
@@ -1166,7 +1164,7 @@ class CompileLazyTimingScope {
 }  // namespace
 
 bool CompileLazy(Isolate* isolate, Handle<WasmInstanceObject> instance,
-                 int func_index, NativeModule** out_native_module) {
+                 int func_index) {
   Handle<WasmModuleObject> module_object(instance->module_object(), isolate);
   NativeModule* native_module = module_object->native_module();
   Counters* counters = isolate->counters();
@@ -1247,13 +1245,11 @@ bool CompileLazy(Isolate* isolate, Handle<WasmInstanceObject> instance,
   }
 
   // Allocate feedback vector if needed.
-  if (result.feedback_vector_slots > 0) {
+  int feedback_vector_slots = NumFeedbackSlots(module, func_index);
+  if (feedback_vector_slots > 0) {
     DCHECK(v8_flags.wasm_speculative_inlining);
-    // We have to save the native_module on the stack, in case the allocation
-    // triggers a GC and we need the module to scan WasmCompileLazy stack frame.
-    *out_native_module = native_module;
-    Handle<FixedArray> vector = isolate->factory()->NewFixedArrayWithZeroes(
-        result.feedback_vector_slots);
+    Handle<FixedArray> vector =
+        isolate->factory()->NewFixedArrayWithZeroes(feedback_vector_slots);
     instance->feedback_vectors().set(
         declared_function_index(module, func_index), *vector);
   }
@@ -1714,7 +1710,8 @@ CompilationExecutionResult ExecuteCompilationUnits(
   UNREACHABLE();
 }
 
-using JSToWasmWrapperKey = std::pair<bool, FunctionSig>;
+// (function is imported, canonical type index)
+using JSToWasmWrapperKey = std::pair<bool, uint32_t>;
 
 // Returns the number of units added.
 int AddExportWrapperUnits(Isolate* isolate, NativeModule* native_module,
@@ -1723,11 +1720,14 @@ int AddExportWrapperUnits(Isolate* isolate, NativeModule* native_module,
   for (auto exp : native_module->module()->export_table) {
     if (exp.kind != kExternalFunction) continue;
     auto& function = native_module->module()->functions[exp.index];
-    JSToWasmWrapperKey key(function.imported, *function.sig);
+    uint32_t canonical_type_index =
+        native_module->module()
+            ->isorecursive_canonical_type_ids[function.sig_index];
+    JSToWasmWrapperKey key(function.imported, canonical_type_index);
     if (keys.insert(key).second) {
       auto unit = std::make_shared<JSToWasmWrapperCompilationUnit>(
-          isolate, function.sig, native_module->module(), function.imported,
-          native_module->enabled_features(),
+          isolate, function.sig, canonical_type_index, native_module->module(),
+          function.imported, native_module->enabled_features(),
           JSToWasmWrapperCompilationUnit::kAllowGeneric);
       builder->AddJSToWasmWrapperUnit(std::move(unit));
     }
@@ -1744,14 +1744,18 @@ int AddImportWrapperUnits(NativeModule* native_module,
       keys;
   int num_imported_functions = native_module->num_imported_functions();
   for (int func_index = 0; func_index < num_imported_functions; func_index++) {
-    const FunctionSig* sig = native_module->module()->functions[func_index].sig;
-    if (!IsJSCompatibleSignature(sig, native_module->module(),
+    const WasmFunction& function =
+        native_module->module()->functions[func_index];
+    if (!IsJSCompatibleSignature(function.sig, native_module->module(),
                                  native_module->enabled_features())) {
       continue;
     }
+    uint32_t canonical_type_index =
+        native_module->module()
+            ->isorecursive_canonical_type_ids[function.sig_index];
     WasmImportWrapperCache::CacheKey key(
-        compiler::kDefaultImportCallKind, sig,
-        static_cast<int>(sig->parameter_count()), kNoSuspend);
+        compiler::kDefaultImportCallKind, canonical_type_index,
+        static_cast<int>(function.sig->parameter_count()), kNoSuspend);
     auto it = keys.insert(key);
     if (it.second) {
       // Ensure that all keys exist in the cache, so that we can populate the
@@ -1889,8 +1893,7 @@ class CompilationTimeCallback : public CompilationEventCallback {
 void CompileNativeModule(Isolate* isolate,
                          v8::metrics::Recorder::ContextId context_id,
                          ErrorThrower* thrower, const WasmModule* wasm_module,
-                         std::shared_ptr<NativeModule> native_module,
-                         Handle<FixedArray>* export_wrappers_out) {
+                         std::shared_ptr<NativeModule> native_module) {
   CHECK(!v8_flags.jitless);
   ModuleWireBytes wire_bytes(native_module->wire_bytes());
   const bool lazy_module = IsLazyModule(wasm_module);
@@ -1933,8 +1936,7 @@ void CompileNativeModule(Isolate* isolate,
     return;
   }
 
-  compilation_state->FinalizeJSToWasmWrappers(isolate, native_module->module(),
-                                              export_wrappers_out);
+  compilation_state->FinalizeJSToWasmWrappers(isolate, native_module->module());
 
   compilation_state->WaitForCompilationEvent(
       CompilationEvent::kFinishedBaselineCompilation);
@@ -1986,8 +1988,7 @@ class BackgroundCompileJob final : public JobTask {
 std::shared_ptr<NativeModule> CompileToNativeModule(
     Isolate* isolate, const WasmFeatures& enabled, ErrorThrower* thrower,
     std::shared_ptr<const WasmModule> module, const ModuleWireBytes& wire_bytes,
-    Handle<FixedArray>* export_wrappers_out, int compilation_id,
-    v8::metrics::Recorder::ContextId context_id) {
+    int compilation_id, v8::metrics::Recorder::ContextId context_id) {
   const WasmModule* wasm_module = module.get();
   WasmEngine* engine = GetWasmEngine();
   base::OwnedVector<uint8_t> wire_bytes_copy =
@@ -1999,13 +2000,15 @@ std::shared_ptr<NativeModule> CompileToNativeModule(
   std::shared_ptr<NativeModule> native_module = engine->MaybeGetNativeModule(
       wasm_module->origin, wire_bytes_copy.as_vector(), isolate);
   if (native_module) {
-    // TODO(thibaudm): Look into sharing export wrappers.
-    CompileJsToWasmWrappers(isolate, wasm_module, export_wrappers_out);
+    CompileJsToWasmWrappers(isolate, wasm_module);
     return native_module;
   }
 
-  TimedHistogramScope wasm_compile_module_time_scope(SELECT_WASM_COUNTER(
-      isolate->counters(), wasm_module->origin, wasm_compile, module_time));
+  base::Optional<TimedHistogramScope> wasm_compile_module_time_scope;
+  if (base::TimeTicks::IsHighResolution()) {
+    wasm_compile_module_time_scope.emplace(SELECT_WASM_COUNTER(
+        isolate->counters(), wasm_module->origin, wasm_compile, module_time));
+  }
 
   // Embedder usage count for declared shared memories.
   if (wasm_module->has_shared_memory) {
@@ -2026,14 +2029,13 @@ std::shared_ptr<NativeModule> CompileToNativeModule(
   // Sync compilation is user blocking, so we increase the priority.
   native_module->compilation_state()->SetHighPriority();
 
-  CompileNativeModule(isolate, context_id, thrower, wasm_module, native_module,
-                      export_wrappers_out);
+  CompileNativeModule(isolate, context_id, thrower, wasm_module, native_module);
   bool cache_hit = !engine->UpdateNativeModuleCache(thrower->error(),
                                                     &native_module, isolate);
   if (thrower->error()) return {};
 
   if (cache_hit) {
-    CompileJsToWasmWrappers(isolate, wasm_module, export_wrappers_out);
+    CompileJsToWasmWrappers(isolate, wasm_module);
     return native_module;
   }
 
@@ -2243,7 +2245,8 @@ void AsyncCompileJob::PrepareRuntimeObjects() {
   // Create heap objects for script and module bytes to be stored in the
   // module object. Asm.js is not compiled asynchronously.
   DCHECK(module_object_.is_null());
-  auto source_url = stream_ ? stream_->url() : base::Vector<const char>();
+  auto source_url =
+      stream_ ? base::VectorOf(stream_->url()) : base::Vector<const char>();
   auto script =
       GetWasmEngine()->GetOrCreateScript(isolate_, native_module_, source_url);
   Handle<WasmModuleObject> module_object =
@@ -2312,16 +2315,14 @@ void AsyncCompileJob::FinishCompile(bool is_after_cache_hit) {
   // TODO(bbudge) Allow deserialization without wrapper compilation, so we can
   // just compile wrappers here.
   if (!is_after_deserialization) {
-    Handle<FixedArray> export_wrappers;
     if (is_after_cache_hit) {
       // TODO(thibaudm): Look into sharing wrappers.
-      CompileJsToWasmWrappers(isolate_, module, &export_wrappers);
+      CompileJsToWasmWrappers(isolate_, module);
     } else {
-      compilation_state->FinalizeJSToWasmWrappers(isolate_, module,
-                                                  &export_wrappers);
+      compilation_state->FinalizeJSToWasmWrappers(isolate_, module);
     }
-    module_object_->set_export_wrappers(*export_wrappers);
   }
+
   // We can only update the feature counts once the entire compile is done.
   compilation_state->PublishDetectedFeatures(isolate_);
 
@@ -2823,7 +2824,7 @@ bool AsyncStreamingProcessor::ProcessModuleHeader(
                          job_->context_id(), GetWasmEngine()->allocator());
   decoder_.DecodeModuleHeader(bytes, offset);
   if (!decoder_.ok()) {
-    FinishAsyncCompileJobWithError(decoder_.FinishDecoding(false).error());
+    FinishAsyncCompileJobWithError(decoder_.FinishDecoding().error());
     return false;
   }
   prefix_hash_ = GetWireBytesHash(bytes);
@@ -2849,7 +2850,7 @@ bool AsyncStreamingProcessor::ProcessSection(SectionCode section_code,
     size_t bytes_consumed = ModuleDecoder::IdentifyUnknownSection(
         &decoder_, bytes, offset, &section_code);
     if (!decoder_.ok()) {
-      FinishAsyncCompileJobWithError(decoder_.FinishDecoding(false).error());
+      FinishAsyncCompileJobWithError(decoder_.FinishDecoding().error());
       return false;
     }
     if (section_code == SectionCode::kUnknownSectionCode) {
@@ -2860,10 +2861,9 @@ bool AsyncStreamingProcessor::ProcessSection(SectionCode section_code,
     offset += bytes_consumed;
     bytes = bytes.SubVector(bytes_consumed, bytes.size());
   }
-  constexpr bool verify_functions = false;
-  decoder_.DecodeSection(section_code, bytes, offset, verify_functions);
+  decoder_.DecodeSection(section_code, bytes, offset);
   if (!decoder_.ok()) {
-    FinishAsyncCompileJobWithError(decoder_.FinishDecoding(false).error());
+    FinishAsyncCompileJobWithError(decoder_.FinishDecoding().error());
     return false;
   }
   return true;
@@ -2882,7 +2882,7 @@ bool AsyncStreamingProcessor::ProcessCodeSectionHeader(
                                     static_cast<uint32_t>(code_section_length));
   if (!decoder_.CheckFunctionsCount(static_cast<uint32_t>(num_functions),
                                     functions_mismatch_error_offset)) {
-    FinishAsyncCompileJobWithError(decoder_.FinishDecoding(false).error());
+    FinishAsyncCompileJobWithError(decoder_.FinishDecoding().error());
     return false;
   }
 
@@ -2987,7 +2987,7 @@ void AsyncStreamingProcessor::OnFinishedStream(
     base::OwnedVector<uint8_t> bytes) {
   TRACE_STREAMING("Finish stream...\n");
   DCHECK_EQ(NativeModuleCache::PrefixHash(bytes.as_vector()), prefix_hash_);
-  ModuleResult result = decoder_.FinishDecoding(false);
+  ModuleResult result = decoder_.FinishDecoding();
   if (result.failed()) {
     FinishAsyncCompileJobWithError(result.error());
     return;
@@ -3074,16 +3074,19 @@ bool AsyncStreamingProcessor::Deserialize(
     base::Vector<const uint8_t> module_bytes,
     base::Vector<const uint8_t> wire_bytes) {
   TRACE_EVENT0("v8.wasm", "wasm.Deserialize");
-  TimedHistogramScope time_scope(
-      job_->isolate()->counters()->wasm_deserialization_time(),
-      job_->isolate());
+  base::Optional<TimedHistogramScope> time_scope;
+  if (base::TimeTicks::IsHighResolution()) {
+    time_scope.emplace(job_->isolate()->counters()->wasm_deserialization_time(),
+                       job_->isolate());
+  }
   // DeserializeNativeModule and FinishCompile assume that they are executed in
   // a HandleScope, and that a context is set on the isolate.
   HandleScope scope(job_->isolate_);
   SaveAndSwitchContext saved_context(job_->isolate_, *job_->native_context_);
 
-  MaybeHandle<WasmModuleObject> result = DeserializeNativeModule(
-      job_->isolate_, module_bytes, wire_bytes, job_->stream_->url());
+  MaybeHandle<WasmModuleObject> result =
+      DeserializeNativeModule(job_->isolate_, module_bytes, wire_bytes,
+                              base::VectorOf(job_->stream_->url()));
 
   if (result.is_null()) return false;
 
@@ -3319,8 +3322,11 @@ void CompilationStateImpl::InitializeCompilationProgressAfterDeserialization(
   TRACE_EVENT2("v8.wasm", "wasm.CompilationAfterDeserialization",
                "num_lazy_functions", lazy_functions.size(),
                "num_eager_functions", eager_functions.size());
-  TimedHistogramScope lazy_compile_time_scope(
-      counters()->wasm_compile_after_deserialize());
+  base::Optional<TimedHistogramScope> lazy_compile_time_scope;
+  if (base::TimeTicks::IsHighResolution()) {
+    lazy_compile_time_scope.emplace(
+        counters()->wasm_compile_after_deserialize());
+  }
 
   auto* module = native_module_->module();
   base::Optional<CodeSpaceWriteScope> lazy_code_space_write_scope;
@@ -3538,11 +3544,8 @@ CompilationStateImpl::GetNextJSToWasmWrapperCompilationUnit() {
   return js_to_wasm_wrapper_units_[outstanding_units - 1];
 }
 
-void CompilationStateImpl::FinalizeJSToWasmWrappers(
-    Isolate* isolate, const WasmModule* module,
-    Handle<FixedArray>* export_wrappers_out) {
-  *export_wrappers_out = isolate->factory()->NewFixedArray(
-      MaxNumExportWrappers(module), AllocationType::kOld);
+void CompilationStateImpl::FinalizeJSToWasmWrappers(Isolate* isolate,
+                                                    const WasmModule* module) {
   // TODO(6792): Wrappers below are allocated with {Factory::NewCode}. As an
   // optimization we create a code memory modification scope that avoids
   // changing the page permissions back-and-forth between RWX and RX, because
@@ -3550,13 +3553,17 @@ void CompilationStateImpl::FinalizeJSToWasmWrappers(
   TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("v8.wasm.detailed"),
                "wasm.FinalizeJSToWasmWrappers", "wrappers",
                js_to_wasm_wrapper_units_.size());
+
+  isolate->heap()->EnsureWasmCanonicalRttsSize(module->MaxCanonicalTypeIndex() +
+                                               1);
   CodePageCollectionMemoryModificationScope modification_scope(isolate->heap());
   for (auto& unit : js_to_wasm_wrapper_units_) {
     DCHECK_EQ(isolate, unit->isolate());
     Handle<CodeT> code = unit->Finalize();
-    int wrapper_index =
-        GetExportWrapperIndex(module, unit->sig(), unit->is_import());
-    (*export_wrappers_out)->set(wrapper_index, *code);
+    uint32_t index =
+        GetExportWrapperIndex(unit->canonical_sig_index(), unit->is_import());
+    isolate->heap()->js_to_wasm_wrappers().Set(index,
+                                               MaybeObject::FromObject(*code));
     RecordStats(*code, isolate->counters());
   }
 }
@@ -3753,11 +3760,14 @@ void CompilationStateImpl::PublishCompilationResults(
     DCHECK_LE(0, func_index);
     DCHECK_LT(func_index, native_module_->num_functions());
     if (func_index < num_imported_functions) {
-      const FunctionSig* sig =
-          native_module_->module()->functions[func_index].sig;
+      const WasmFunction& function =
+          native_module_->module()->functions[func_index];
+      uint32_t canonical_type_index =
+          native_module_->module()
+              ->isorecursive_canonical_type_ids[function.sig_index];
       WasmImportWrapperCache::CacheKey key(
-          compiler::kDefaultImportCallKind, sig,
-          static_cast<int>(sig->parameter_count()), kNoSuspend);
+          compiler::kDefaultImportCallKind, canonical_type_index,
+          static_cast<int>(function.sig->parameter_count()), kNoSuspend);
       // If two imported functions have the same key, only one of them should
       // have been added as a compilation unit. So it is always the first time
       // we compile a wrapper for this key here.
@@ -3890,8 +3900,8 @@ void CompilationStateImpl::WaitForCompilationEvent(
 }
 
 namespace {
-using JSToWasmWrapperQueue =
-    WrapperQueue<JSToWasmWrapperKey, base::hash<JSToWasmWrapperKey>>;
+using JSToWasmWrapperQueue = WrapperQueue<JSToWasmWrapperKey, std::nullptr_t,
+                                          base::hash<JSToWasmWrapperKey>>;
 using JSToWasmWrapperUnitMap =
     std::unordered_map<JSToWasmWrapperKey,
                        std::unique_ptr<JSToWasmWrapperCompilationUnit>,
@@ -3906,8 +3916,10 @@ class CompileJSToWasmWrapperJob final : public JobTask {
         outstanding_units_(queue->size()) {}
 
   void Run(JobDelegate* delegate) override {
-    while (base::Optional<JSToWasmWrapperKey> key = queue_->pop()) {
-      JSToWasmWrapperCompilationUnit* unit = (*compilation_units_)[*key].get();
+    while (base::Optional<std::pair<JSToWasmWrapperKey, std::nullptr_t>> key =
+               queue_->pop()) {
+      JSToWasmWrapperCompilationUnit* unit =
+          (*compilation_units_)[key->first].get();
       unit->Execute();
       outstanding_units_.fetch_sub(1, std::memory_order_relaxed);
       if (delegate && delegate->ShouldYield()) return;
@@ -3930,11 +3942,11 @@ class CompileJSToWasmWrapperJob final : public JobTask {
 };
 }  // namespace
 
-void CompileJsToWasmWrappers(Isolate* isolate, const WasmModule* module,
-                             Handle<FixedArray>* export_wrappers_out) {
+void CompileJsToWasmWrappers(Isolate* isolate, const WasmModule* module) {
   TRACE_EVENT0("v8.wasm", "wasm.CompileJsToWasmWrappers");
-  *export_wrappers_out = isolate->factory()->NewFixedArray(
-      MaxNumExportWrappers(module), AllocationType::kOld);
+
+  isolate->heap()->EnsureWasmCanonicalRttsSize(module->MaxCanonicalTypeIndex() +
+                                               1);
 
   JSToWasmWrapperQueue queue;
   JSToWasmWrapperUnitMap compilation_units;
@@ -3943,11 +3955,24 @@ void CompileJsToWasmWrappers(Isolate* isolate, const WasmModule* module,
   // Prepare compilation units in the main thread.
   for (auto exp : module->export_table) {
     if (exp.kind != kExternalFunction) continue;
+
     auto& function = module->functions[exp.index];
-    JSToWasmWrapperKey key(function.imported, *function.sig);
-    if (queue.insert(key)) {
+    uint32_t canonical_type_index =
+        module->isorecursive_canonical_type_ids[function.sig_index];
+    int wrapper_index =
+        GetExportWrapperIndex(canonical_type_index, function.imported);
+    auto existing_wrapper =
+        isolate->heap()->js_to_wasm_wrappers().Get(wrapper_index);
+    if (existing_wrapper.IsStrongOrWeak() &&
+        !existing_wrapper.GetHeapObject().IsUndefined()) {
+      continue;
+    }
+
+    JSToWasmWrapperKey key(function.imported, canonical_type_index);
+    if (queue.insert(key, nullptr)) {
       auto unit = std::make_unique<JSToWasmWrapperCompilationUnit>(
-          isolate, function.sig, module, function.imported, enabled_features,
+          isolate, function.sig, canonical_type_index, module,
+          function.imported, enabled_features,
           JSToWasmWrapperCompilationUnit::kAllowGeneric);
       compilation_units.emplace(key, std::move(unit));
     }
@@ -3982,8 +4007,9 @@ void CompileJsToWasmWrappers(Isolate* isolate, const WasmModule* module,
     JSToWasmWrapperCompilationUnit* unit = pair.second.get();
     DCHECK_EQ(isolate, unit->isolate());
     Handle<CodeT> code = unit->Finalize();
-    int wrapper_index = GetExportWrapperIndex(module, &key.second, key.first);
-    (*export_wrappers_out)->set(wrapper_index, *code);
+    int wrapper_index = GetExportWrapperIndex(key.second, key.first);
+    isolate->heap()->js_to_wasm_wrappers().Set(
+        wrapper_index, HeapObjectReference::Strong(*code));
     RecordStats(*code, isolate->counters());
   }
 }
@@ -3991,12 +4017,13 @@ void CompileJsToWasmWrappers(Isolate* isolate, const WasmModule* module,
 WasmCode* CompileImportWrapper(
     NativeModule* native_module, Counters* counters,
     compiler::WasmImportCallKind kind, const FunctionSig* sig,
-    int expected_arity, Suspend suspend,
+    uint32_t canonical_type_index, int expected_arity, Suspend suspend,
     WasmImportWrapperCache::ModificationScope* cache_scope) {
   // Entry should exist, so that we don't insert a new one and invalidate
   // other threads' iterators/references, but it should not have been compiled
   // yet.
-  WasmImportWrapperCache::CacheKey key(kind, sig, expected_arity, suspend);
+  WasmImportWrapperCache::CacheKey key(kind, canonical_type_index,
+                                       expected_arity, suspend);
   DCHECK_NULL((*cache_scope)[key]);
   bool source_positions = is_asmjs_module(native_module->module());
   // Keep the {WasmCode} alive until we explicitly call {IncRef}.
diff --git a/deps/v8/src/wasm/module-compiler.h b/deps/v8/src/wasm/module-compiler.h
index 20320899eb5073..4c3b3500460a82 100644
--- a/deps/v8/src/wasm/module-compiler.h
+++ b/deps/v8/src/wasm/module-compiler.h
@@ -57,15 +57,13 @@ V8_EXPORT_PRIVATE
 std::shared_ptr<NativeModule> CompileToNativeModule(
     Isolate* isolate, const WasmFeatures& enabled, ErrorThrower* thrower,
     std::shared_ptr<const WasmModule> module, const ModuleWireBytes& wire_bytes,
-    Handle<FixedArray>* export_wrappers_out, int compilation_id,
-    v8::metrics::Recorder::ContextId context_id);
+    int compilation_id, v8::metrics::Recorder::ContextId context_id);
 
 void RecompileNativeModule(NativeModule* native_module,
                            TieringState new_tiering_state);
 
 V8_EXPORT_PRIVATE
-void CompileJsToWasmWrappers(Isolate* isolate, const WasmModule* module,
-                             Handle<FixedArray>* export_wrappers_out);
+void CompileJsToWasmWrappers(Isolate* isolate, const WasmModule* module);
 
 // Compiles the wrapper for this (kind, sig) pair and sets the corresponding
 // cache entry. Assumes the key already exists in the cache but has not been
@@ -74,14 +72,13 @@ V8_EXPORT_PRIVATE
 WasmCode* CompileImportWrapper(
     NativeModule* native_module, Counters* counters,
     compiler::WasmImportCallKind kind, const FunctionSig* sig,
-    int expected_arity, Suspend suspend,
+    uint32_t canonical_type_index, int expected_arity, Suspend suspend,
     WasmImportWrapperCache::ModificationScope* cache_scope);
 
 // Triggered by the WasmCompileLazy builtin. The return value indicates whether
 // compilation was successful. Lazy compilation can fail only if validation is
 // also lazy.
-bool CompileLazy(Isolate*, Handle<WasmInstanceObject>, int func_index,
-                 NativeModule** out_native_module);
+bool CompileLazy(Isolate*, Handle<WasmInstanceObject>, int func_index);
 
 // Throws the compilation error after failed lazy compilation.
 void ThrowLazyCompilationError(Isolate* isolate,
@@ -96,14 +93,14 @@ V8_EXPORT_PRIVATE void TriggerTierUp(WasmInstanceObject instance,
 void TierUpNowForTesting(Isolate* isolate, WasmInstanceObject instance,
                          int func_index);
 
-template <typename Key, typename Hash>
+template <typename Key, typename KeyInfo, typename Hash>
 class WrapperQueue {
  public:
   // Removes an arbitrary key from the queue and returns it.
   // If the queue is empty, returns nullopt.
   // Thread-safe.
-  base::Optional<Key> pop() {
-    base::Optional<Key> key = base::nullopt;
+  base::Optional<std::pair<Key, KeyInfo>> pop() {
+    base::Optional<std::pair<Key, KeyInfo>> key = base::nullopt;
     base::MutexGuard lock(&mutex_);
     auto it = queue_.begin();
     if (it != queue_.end()) {
@@ -116,7 +113,9 @@ class WrapperQueue {
   // Add the given key to the queue and returns true iff the insert was
   // successful.
   // Not thread-safe.
-  bool insert(const Key& key) { return queue_.insert(key).second; }
+  bool insert(const Key& key, KeyInfo key_info) {
+    return queue_.insert({key, key_info}).second;
+  }
 
   size_t size() {
     base::MutexGuard lock(&mutex_);
@@ -125,7 +124,7 @@ class WrapperQueue {
 
  private:
   base::Mutex mutex_;
-  std::unordered_set<Key, Hash> queue_;
+  std::unordered_map<Key, KeyInfo, Hash> queue_;
 };
 
 // Encapsulates all the state and steps of an asynchronous compilation.
diff --git a/deps/v8/src/wasm/module-decoder-impl.h b/deps/v8/src/wasm/module-decoder-impl.h
index 227fc327c2b235..aeebf2633e1703 100644
--- a/deps/v8/src/wasm/module-decoder-impl.h
+++ b/deps/v8/src/wasm/module-decoder-impl.h
@@ -471,7 +471,7 @@ class ModuleDecoderTemplate : public Decoder {
 
   void DecodeSection(SectionCode section_code,
                      base::Vector<const uint8_t> bytes, uint32_t offset,
-                     bool verify_functions = true) {
+                     bool validate_functions = true) {
     if (failed()) return;
     Reset(bytes, offset);
     TRACE("Section: %s\n", SectionName(section_code));
@@ -507,7 +507,7 @@ class ModuleDecoderTemplate : public Decoder {
         DecodeStartSection();
         break;
       case kCodeSectionCode:
-        DecodeCodeSection(verify_functions);
+        DecodeCodeSection(validate_functions);
         break;
       case kElementSectionCode:
         DecodeElementSection();
@@ -684,9 +684,7 @@ class ModuleDecoderTemplate : public Decoder {
             const FunctionSig* sig = consume_sig(module_->signature_zone.get());
             if (!ok()) break;
             module_->add_signature(sig, kNoSuperType);
-            if (v8_flags.wasm_type_canonicalization) {
-              type_canon->AddRecursiveGroup(module_.get(), 1);
-            }
+            type_canon->AddRecursiveGroup(module_.get(), 1);
             break;
           }
           case kWasmArrayTypeCode:
@@ -727,17 +725,13 @@ class ModuleDecoderTemplate : public Decoder {
           TypeDefinition type = consume_subtype_definition();
           if (ok()) module_->add_type(type);
         }
-        if (ok() && v8_flags.wasm_type_canonicalization) {
-          type_canon->AddRecursiveGroup(module_.get(), group_size);
-        }
+        if (ok()) type_canon->AddRecursiveGroup(module_.get(), group_size);
       } else {
         tracer_.TypeOffset(pc_offset());
         TypeDefinition type = consume_subtype_definition();
         if (ok()) {
           module_->add_type(type);
-          if (v8_flags.wasm_type_canonicalization) {
-            type_canon->AddRecursiveGroup(module_.get(), 1);
-          }
+          type_canon->AddRecursiveGroup(module_.get(), 1);
         }
       }
     }
@@ -760,7 +754,6 @@ class ModuleDecoderTemplate : public Decoder {
         continue;
       }
     }
-    module_->signature_map.Freeze();
   }
 
   void DecodeImportSection() {
@@ -794,7 +787,6 @@ class ModuleDecoderTemplate : public Decoder {
                                         import->index,  // func_index
                                         0,              // sig_index
                                         {0, 0},         // code
-                                        0,              // feedback slots
                                         true,           // imported
                                         false,          // exported
                                         false});        // declared
@@ -891,7 +883,6 @@ class ModuleDecoderTemplate : public Decoder {
                                     func_index,  // func_index
                                     0,           // sig_index
                                     {0, 0},      // code
-                                    0,           // feedback slots
                                     false,       // imported
                                     false,       // exported
                                     false});     // declared
@@ -1127,7 +1118,7 @@ class ModuleDecoderTemplate : public Decoder {
     }
   }
 
-  void DecodeCodeSection(bool verify_functions) {
+  void DecodeCodeSection(bool validate_functions) {
     // Make sure global offset were calculated before they get accessed during
     // function compilation.
     CalculateGlobalOffsets(module_.get());
@@ -1157,7 +1148,7 @@ class ModuleDecoderTemplate : public Decoder {
       uint32_t offset = pc_offset();
       consume_bytes(size, "function body");
       if (failed()) break;
-      DecodeFunctionBody(function_index, size, offset, verify_functions);
+      DecodeFunctionBody(function_index, size, offset, validate_functions);
 
       // Now that the function has been decoded, we can compute module offsets.
       for (; inst_traces_it != this->inst_traces_.end() &&
@@ -1201,15 +1192,15 @@ class ModuleDecoderTemplate : public Decoder {
   }
 
   void DecodeFunctionBody(uint32_t index, uint32_t length, uint32_t offset,
-                          bool verify_functions) {
+                          bool validate_functions) {
     WasmFunction* function = &module_->functions[index];
     function->code = {offset, length};
     tracer_.FunctionBody(function, pc_ - (pc_offset() - offset));
-    if (verify_functions) {
+    if (validate_functions) {
       ModuleWireBytes bytes(module_start_, module_end_);
-      VerifyFunctionBody(module_->signature_zone->allocator(),
-                         index + module_->num_imported_functions, bytes,
-                         module_.get(), function);
+      ValidateFunctionBody(module_->signature_zone->allocator(),
+                           index + module_->num_imported_functions, bytes,
+                           module_.get(), function);
     }
   }
 
@@ -1354,7 +1345,7 @@ class ModuleDecoderTemplate : public Decoder {
       int64_t last_func_idx = -1;
       for (uint32_t i = 0; i < func_count; i++) {
         uint32_t func_idx = inner.consume_u32v("function index");
-        if (int64_t(func_idx) <= last_func_idx) {
+        if (int64_t{func_idx} <= last_func_idx) {
           inner.errorf("Invalid function index: %d", func_idx);
           break;
         }
@@ -1374,7 +1365,7 @@ class ModuleDecoderTemplate : public Decoder {
           for (uint32_t k = 0; k < mark_size; k++) {
             trace_mark_id |= inner.consume_u8("trace mark id") << k * 8;
           }
-          if (int64_t(func_off) <= last_func_off) {
+          if (int64_t{func_off} <= last_func_off) {
             inner.errorf("Invalid branch offset: %d", func_off);
             break;
           }
@@ -1513,7 +1504,7 @@ class ModuleDecoderTemplate : public Decoder {
       int64_t last_func_idx = -1;
       for (uint32_t i = 0; i < func_count; i++) {
         uint32_t func_idx = inner.consume_u32v("function index");
-        if (int64_t(func_idx) <= last_func_idx) {
+        if (int64_t{func_idx} <= last_func_idx) {
           inner.errorf("Invalid function index: %d", func_idx);
           break;
         }
@@ -1526,7 +1517,7 @@ class ModuleDecoderTemplate : public Decoder {
         int64_t last_br_off = -1;
         for (uint32_t j = 0; j < num_hints; ++j) {
           uint32_t br_off = inner.consume_u32v("branch instruction offset");
-          if (int64_t(br_off) <= last_br_off) {
+          if (int64_t{br_off} <= last_br_off) {
             inner.errorf("Invalid branch offset: %d", br_off);
             break;
           }
@@ -1636,7 +1627,7 @@ class ModuleDecoderTemplate : public Decoder {
     return true;
   }
 
-  ModuleResult FinishDecoding(bool verify_functions = true) {
+  ModuleResult FinishDecoding() {
     if (ok() && CheckMismatchedCounts()) {
       // We calculate the global offsets here, because there may not be a
       // global section and code section that would have triggered the
@@ -1645,23 +1636,18 @@ class ModuleDecoderTemplate : public Decoder {
       CalculateGlobalOffsets(module_.get());
     }
 
-    ModuleResult result = toResult(std::move(module_));
-    if (verify_functions && result.ok() && intermediate_error_.has_error()) {
-      // Copy error message and location.
-      return ModuleResult{std::move(intermediate_error_)};
-    }
-    return result;
+    return toResult(std::move(module_));
   }
 
   // Decodes an entire module.
   ModuleResult DecodeModule(Counters* counters, AccountingAllocator* allocator,
-                            bool verify_functions = true) {
+                            bool validate_functions = true) {
     StartDecoding(counters, allocator);
     uint32_t offset = 0;
     base::Vector<const byte> orig_bytes(start(), end() - start());
     DecodeModuleHeader(base::VectorOf(start(), end() - start()), offset);
     if (failed()) {
-      return FinishDecoding(verify_functions);
+      return FinishDecoding();
     }
     // Size of the module header.
     offset += 8;
@@ -1674,7 +1660,7 @@ class ModuleDecoderTemplate : public Decoder {
       offset += section_iter.payload_start() - section_iter.section_start();
       if (section_iter.section_code() != SectionCode::kUnknownSectionCode) {
         DecodeSection(section_iter.section_code(), section_iter.payload(),
-                      offset, verify_functions);
+                      offset, validate_functions);
       }
       // Shift the offset by the remaining section payload
       offset += section_iter.payload_length();
@@ -1688,26 +1674,21 @@ class ModuleDecoderTemplate : public Decoder {
       return decoder.toResult<std::shared_ptr<WasmModule>>(nullptr);
     }
 
-    return FinishDecoding(verify_functions);
+    return FinishDecoding();
   }
 
   // Decodes a single anonymous function starting at {start_}.
-  FunctionResult DecodeSingleFunction(Zone* zone,
-                                      const ModuleWireBytes& wire_bytes,
-                                      const WasmModule* module) {
+  FunctionResult DecodeSingleFunctionForTesting(
+      Zone* zone, const ModuleWireBytes& wire_bytes, const WasmModule* module) {
     pc_ = start_;
     expect_u8("type form", kWasmFunctionTypeCode);
-    if (!ok()) return FunctionResult{std::move(intermediate_error_)};
     WasmFunction function;
     function.sig = consume_sig(zone);
     function.code = {off(pc_), static_cast<uint32_t>(end_ - pc_)};
+    if (!ok()) return FunctionResult{std::move(error_)};
 
-    if (ok())
-      VerifyFunctionBody(zone->allocator(), 0, wire_bytes, module, &function);
-
-    if (intermediate_error_.has_error()) {
-      return FunctionResult{std::move(intermediate_error_)};
-    }
+    ValidateFunctionBody(zone->allocator(), 0, wire_bytes, module, &function);
+    if (!ok()) return FunctionResult{std::move(error_)};
 
     return FunctionResult{std::make_unique<WasmFunction>(function)};
   }
@@ -1756,7 +1737,6 @@ class ModuleDecoderTemplate : public Decoder {
       kBitsPerByte * sizeof(ModuleDecoderTemplate::seen_unordered_sections_) >
           kLastKnownModuleSection,
       "not enough bits");
-  WasmError intermediate_error_;
   ModuleOrigin origin_;
   AccountingAllocator allocator_;
   Zone init_expr_zone_{&allocator_, "constant expr. zone"};
@@ -1824,9 +1804,9 @@ class ModuleDecoderTemplate : public Decoder {
   }
 
   // Verifies the body (code) of a given function.
-  void VerifyFunctionBody(AccountingAllocator* allocator, uint32_t func_num,
-                          const ModuleWireBytes& wire_bytes,
-                          const WasmModule* module, WasmFunction* function) {
+  void ValidateFunctionBody(AccountingAllocator* allocator, uint32_t func_num,
+                            const ModuleWireBytes& wire_bytes,
+                            const WasmModule* module, WasmFunction* function) {
     if (v8_flags.trace_wasm_decoder) {
       WasmFunctionName func_name(function,
                                  wire_bytes.GetNameOrNull(function, module));
@@ -1838,19 +1818,19 @@ class ModuleDecoderTemplate : public Decoder {
         start_ + GetBufferRelativeOffset(function->code.end_offset())};
 
     WasmFeatures unused_detected_features = WasmFeatures::None();
-    DecodeResult result = VerifyWasmCode(allocator, enabled_features_, module,
-                                         &unused_detected_features, body);
+    DecodeResult result = wasm::ValidateFunctionBody(
+        allocator, enabled_features_, module, &unused_detected_features, body);
 
     // If the decode failed and this is the first error, set error code and
     // location.
-    if (result.failed() && intermediate_error_.empty()) {
+    if (result.failed() && error_.empty()) {
       // Wrap the error message from the function decoder.
       WasmFunctionName func_name(function,
                                  wire_bytes.GetNameOrNull(function, module));
       std::ostringstream error_msg;
       error_msg << "in function " << func_name << ": "
                 << result.error().message();
-      intermediate_error_ = WasmError{result.error().offset(), error_msg.str()};
+      error_ = WasmError{result.error().offset(), error_msg.str()};
     }
   }
 
@@ -2366,7 +2346,9 @@ class ModuleDecoderTemplate : public Decoder {
       } else {
         type = table_type;
         // Active segments with function indices must reference a function
-        // table. TODO(7748): Add support for anyref tables when we have them.
+        // table. (Using struct / array indices doesn't provide any value
+        // as such an index doesn't refer to a unique object instance unlike
+        // functions.)
         if (V8_UNLIKELY(
                 !IsSubtypeOf(table_type, kWasmFuncRef, this->module_.get()))) {
           errorf(pos,
diff --git a/deps/v8/src/wasm/module-decoder.cc b/deps/v8/src/wasm/module-decoder.cc
index 6cf86cd6096772..2c70e2068dc217 100644
--- a/deps/v8/src/wasm/module-decoder.cc
+++ b/deps/v8/src/wasm/module-decoder.cc
@@ -88,7 +88,7 @@ class ModuleDecoderImpl : public ModuleDecoderTemplate<NoTracer> {
 
 ModuleResult DecodeWasmModule(
     const WasmFeatures& enabled, const byte* module_start,
-    const byte* module_end, bool verify_functions, ModuleOrigin origin,
+    const byte* module_end, bool validate_functions, ModuleOrigin origin,
     Counters* counters, std::shared_ptr<metrics::Recorder> metrics_recorder,
     v8::metrics::Recorder::ContextId context_id, DecodingMethod decoding_method,
     AccountingAllocator* allocator) {
@@ -113,7 +113,7 @@ ModuleResult DecodeWasmModule(
                                        ? base::ThreadTicks::Now()
                                        : base::ThreadTicks();
   ModuleResult result =
-      decoder.DecodeModule(counters, allocator, verify_functions);
+      decoder.DecodeModule(counters, allocator, validate_functions);
 
   // Record event metrics.
   metrics_event.wall_clock_duration_in_us = timer.Elapsed().InMicroseconds();
@@ -141,10 +141,10 @@ ModuleResult DecodeWasmModule(
 ModuleResult DecodeWasmModuleForDisassembler(const byte* module_start,
                                              const byte* module_end,
                                              AccountingAllocator* allocator) {
-  constexpr bool verify_functions = false;
+  constexpr bool validate_functions = false;
   ModuleDecoderImpl decoder(WasmFeatures::All(), module_start, module_end,
                             kWasmOrigin);
-  return decoder.DecodeModule(nullptr, allocator, verify_functions);
+  return decoder.DecodeModule(nullptr, allocator, validate_functions);
 }
 
 ModuleDecoder::ModuleDecoder(const WasmFeatures& enabled)
@@ -172,13 +172,14 @@ void ModuleDecoder::DecodeModuleHeader(base::Vector<const uint8_t> bytes,
 
 void ModuleDecoder::DecodeSection(SectionCode section_code,
                                   base::Vector<const uint8_t> bytes,
-                                  uint32_t offset, bool verify_functions) {
-  impl_->DecodeSection(section_code, bytes, offset, verify_functions);
+                                  uint32_t offset) {
+  impl_->DecodeSection(section_code, bytes, offset);
 }
 
 void ModuleDecoder::DecodeFunctionBody(uint32_t index, uint32_t length,
-                                       uint32_t offset, bool verify_functions) {
-  impl_->DecodeFunctionBody(index, length, offset, verify_functions);
+                                       uint32_t offset,
+                                       bool validate_functions) {
+  impl_->DecodeFunctionBody(index, length, offset, validate_functions);
 }
 
 void ModuleDecoder::StartCodeSection(WireBytesRef section_bytes) {
@@ -190,9 +191,7 @@ bool ModuleDecoder::CheckFunctionsCount(uint32_t functions_count,
   return impl_->CheckFunctionsCount(functions_count, error_offset);
 }
 
-ModuleResult ModuleDecoder::FinishDecoding(bool verify_functions) {
-  return impl_->FinishDecoding(verify_functions);
-}
+ModuleResult ModuleDecoder::FinishDecoding() { return impl_->FinishDecoding(); }
 
 size_t ModuleDecoder::IdentifyUnknownSection(ModuleDecoder* decoder,
                                              base::Vector<const uint8_t> bytes,
@@ -237,7 +236,7 @@ FunctionResult DecodeWasmFunctionForTesting(
   }
   ModuleDecoderImpl decoder(enabled, function_start, function_end, kWasmOrigin);
   decoder.SetCounters(counters);
-  return decoder.DecodeSingleFunction(zone, wire_bytes, module);
+  return decoder.DecodeSingleFunctionForTesting(zone, wire_bytes, module);
 }
 
 AsmJsOffsetsResult DecodeAsmJsOffsets(
diff --git a/deps/v8/src/wasm/module-decoder.h b/deps/v8/src/wasm/module-decoder.h
index cbfca92886c4d1..c32fafa301000d 100644
--- a/deps/v8/src/wasm/module-decoder.h
+++ b/deps/v8/src/wasm/module-decoder.h
@@ -149,8 +149,7 @@ class ModuleDecoder {
   void DecodeModuleHeader(base::Vector<const uint8_t> bytes, uint32_t offset);
 
   void DecodeSection(SectionCode section_code,
-                     base::Vector<const uint8_t> bytes, uint32_t offset,
-                     bool verify_functions = true);
+                     base::Vector<const uint8_t> bytes, uint32_t offset);
 
   void StartCodeSection(WireBytesRef section_bytes);
 
@@ -159,7 +158,7 @@ class ModuleDecoder {
   void DecodeFunctionBody(uint32_t index, uint32_t size, uint32_t offset,
                           bool verify_functions = true);
 
-  ModuleResult FinishDecoding(bool verify_functions = true);
+  ModuleResult FinishDecoding();
 
   const std::shared_ptr<WasmModule>& shared_module() const;
 
diff --git a/deps/v8/src/wasm/module-instantiate.cc b/deps/v8/src/wasm/module-instantiate.cc
index a12cc954e1619c..2b6cd36ebb64a8 100644
--- a/deps/v8/src/wasm/module-instantiate.cc
+++ b/deps/v8/src/wasm/module-instantiate.cc
@@ -42,8 +42,9 @@ byte* raw_buffer_ptr(MaybeHandle<JSArrayBuffer> buffer, int offset) {
   return static_cast<byte*>(buffer.ToHandleChecked()->backing_store()) + offset;
 }
 
-using ImportWrapperQueue = WrapperQueue<WasmImportWrapperCache::CacheKey,
-                                        WasmImportWrapperCache::CacheKeyHash>;
+using ImportWrapperQueue =
+    WrapperQueue<WasmImportWrapperCache::CacheKey, const FunctionSig*,
+                 WasmImportWrapperCache::CacheKeyHash>;
 
 class CompileImportWrapperJob final : public JobTask {
  public:
@@ -66,12 +67,15 @@ class CompileImportWrapperJob final : public JobTask {
 
   void Run(JobDelegate* delegate) override {
     TRACE_EVENT0("v8.wasm", "wasm.CompileImportWrapperJob.Run");
-    while (base::Optional<WasmImportWrapperCache::CacheKey> key =
-               queue_->pop()) {
+    while (base::Optional<std::pair<const WasmImportWrapperCache::CacheKey,
+                                    const FunctionSig*>>
+               key = queue_->pop()) {
       // TODO(wasm): Batch code publishing, to avoid repeated locking and
       // permission switching.
-      CompileImportWrapper(native_module_, counters_, key->kind, key->signature,
-                           key->expected_arity, key->suspend, cache_scope_);
+      CompileImportWrapper(native_module_, counters_, key->first.kind,
+                           key->second, key->first.canonical_type_index,
+                           key->first.expected_arity, key->first.suspend,
+                           cache_scope_);
       if (delegate->ShouldYield()) return;
     }
   }
@@ -184,17 +188,15 @@ void CreateMapForType(Isolate* isolate, const WasmModule* module,
   uint32_t canonical_type_index =
       module->isorecursive_canonical_type_ids[type_index];
 
-  if (v8_flags.wasm_type_canonicalization) {
-    // Try to find the canonical map for this type in the isolate store.
-    canonical_rtts = handle(isolate->heap()->wasm_canonical_rtts(), isolate);
-    DCHECK_GT(static_cast<uint32_t>(canonical_rtts->length()),
-              canonical_type_index);
-    MaybeObject maybe_canonical_map = canonical_rtts->Get(canonical_type_index);
-    if (maybe_canonical_map.IsStrongOrWeak() &&
-        maybe_canonical_map.GetHeapObject().IsMap()) {
-      maps->set(type_index, maybe_canonical_map.GetHeapObject());
-      return;
-    }
+  // Try to find the canonical map for this type in the isolate store.
+  canonical_rtts = handle(isolate->heap()->wasm_canonical_rtts(), isolate);
+  DCHECK_GT(static_cast<uint32_t>(canonical_rtts->length()),
+            canonical_type_index);
+  MaybeObject maybe_canonical_map = canonical_rtts->Get(canonical_type_index);
+  if (maybe_canonical_map.IsStrongOrWeak() &&
+      maybe_canonical_map.GetHeapObject().IsMap()) {
+    maps->set(type_index, maybe_canonical_map.GetHeapObject());
+    return;
   }
 
   Handle<Map> rtt_parent;
@@ -220,9 +222,7 @@ void CreateMapForType(Isolate* isolate, const WasmModule* module,
       map = CreateFuncRefMap(isolate, module, rtt_parent, instance);
       break;
   }
-  if (v8_flags.wasm_type_canonicalization) {
-    canonical_rtts->Set(canonical_type_index, HeapObjectReference::Weak(*map));
-  }
+  canonical_rtts->Set(canonical_type_index, HeapObjectReference::Weak(*map));
   maps->set(type_index, *map);
 }
 
@@ -521,12 +521,12 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
 
   // From here on, we expect the build pipeline to run without exiting to JS.
   DisallowJavascriptExecution no_js(isolate_);
-  // Record build time into correct bucket, then build instance.
-  TimedHistogramScope wasm_instantiate_module_time_scope(SELECT_WASM_COUNTER(
-      isolate_->counters(), module_->origin, wasm_instantiate, module_time));
-  v8::metrics::WasmModuleInstantiated wasm_module_instantiated;
+  // Start a timer for instantiation time, if we have a high resolution timer.
   base::ElapsedTimer timer;
-  timer.Start();
+  if (base::TimeTicks::IsHighResolution()) {
+    timer.Start();
+  }
+  v8::metrics::WasmModuleInstantiated wasm_module_instantiated;
   NativeModule* native_module = module_object_->native_module();
 
   //--------------------------------------------------------------------------
@@ -657,10 +657,8 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
   //--------------------------------------------------------------------------
   // Set up table storage space.
   //--------------------------------------------------------------------------
-  if (v8_flags.wasm_type_canonicalization) {
-    instance->set_isorecursive_canonical_types(
-        module_->isorecursive_canonical_type_ids.data());
-  }
+  instance->set_isorecursive_canonical_types(
+      module_->isorecursive_canonical_type_ids.data());
   int table_count = static_cast<int>(module_->tables.size());
   {
     for (int i = 0; i < table_count; i++) {
@@ -719,15 +717,11 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
   // list.
   //--------------------------------------------------------------------------
   if (enabled_.has_gc()) {
-    if (v8_flags.wasm_type_canonicalization &&
-        module_->isorecursive_canonical_type_ids.size() > 0) {
-      uint32_t maximum_canonical_type_index =
-          *std::max_element(module_->isorecursive_canonical_type_ids.begin(),
-                            module_->isorecursive_canonical_type_ids.end());
+    if (module_->isorecursive_canonical_type_ids.size() > 0) {
       // Make sure all canonical indices have been set.
-      DCHECK_NE(maximum_canonical_type_index, kNoSuperType);
+      DCHECK_NE(module_->MaxCanonicalTypeIndex(), kNoSuperType);
       isolate_->heap()->EnsureWasmCanonicalRttsSize(
-          maximum_canonical_type_index + 1);
+          module_->MaxCanonicalTypeIndex() + 1);
     }
     Handle<FixedArray> maps = isolate_->factory()->NewFixedArray(
         static_cast<int>(module_->types.size()));
@@ -747,8 +741,7 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
     instance->set_feedback_vectors(*vectors);
     for (int i = 0; i < num_functions; i++) {
       int func_index = module_->num_imported_functions + i;
-      int slots =
-          base::Relaxed_Load(&module_->functions[func_index].feedback_slots);
+      int slots = NumFeedbackSlots(module_, func_index);
       if (slots == 0) continue;
       if (v8_flags.trace_wasm_speculative_inlining) {
         PrintF("[Function %d (declared %d): allocating %d feedback slots]\n",
@@ -828,9 +821,13 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
   if (module_->start_function_index >= 0) {
     int start_index = module_->start_function_index;
     auto& function = module_->functions[start_index];
+    uint32_t canonical_sig_index =
+        module_->isorecursive_canonical_type_ids[module_->functions[start_index]
+                                                     .sig_index];
     Handle<CodeT> wrapper_code =
         JSToWasmWrapperCompilationUnit::CompileJSToWasmWrapper(
-            isolate_, function.sig, module_, function.imported);
+            isolate_, function.sig, canonical_sig_index, module_,
+            function.imported);
     // TODO(clemensb): Don't generate an exported function for the start
     // function. Use CWasmEntry instead.
     start_function_ = WasmExportedFunction::New(
@@ -858,11 +855,16 @@ MaybeHandle<WasmInstanceObject> InstanceBuilder::Build() {
   TRACE("Successfully built instance for module %p\n",
         module_object_->native_module());
   wasm_module_instantiated.success = true;
-  wasm_module_instantiated.wall_clock_duration_in_us =
-      timer.Elapsed().InMicroseconds();
-  timer.Stop();
-  isolate_->metrics_recorder()->DelayMainThreadEvent(wasm_module_instantiated,
-                                                     context_id_);
+  if (timer.IsStarted()) {
+    base::TimeDelta instantiation_time = timer.Elapsed();
+    wasm_module_instantiated.wall_clock_duration_in_us =
+        instantiation_time.InMicroseconds();
+    SELECT_WASM_COUNTER(isolate_->counters(), module_->origin, wasm_instantiate,
+                        module_time)
+        ->AddTimedSample(instantiation_time);
+    isolate_->metrics_recorder()->DelayMainThreadEvent(wasm_module_instantiated,
+                                                       context_id_);
+  }
   return instance;
 }
 
@@ -986,6 +988,7 @@ MaybeHandle<Object> InstanceBuilder::LookupImportAsm(
     case LookupIterator::INTEGER_INDEXED_EXOTIC:
     case LookupIterator::INTERCEPTOR:
     case LookupIterator::JSPROXY:
+    case LookupIterator::WASM_OBJECT:
     case LookupIterator::ACCESSOR:
     case LookupIterator::TRANSITION:
       return ReportLinkError("not a data property", index, import_name);
@@ -1158,15 +1161,18 @@ bool InstanceBuilder::ProcessImportedFunction(
       WasmImportWrapperCache* cache = native_module->import_wrapper_cache();
       // TODO(jkummerow): Consider precompiling CapiCallWrappers in parallel,
       // just like other import wrappers.
-      WasmCode* wasm_code =
-          cache->MaybeGet(kind, expected_sig, expected_arity, kNoSuspend);
+      uint32_t canonical_type_index =
+          module_->isorecursive_canonical_type_ids
+              [module_->functions[func_index].sig_index];
+      WasmCode* wasm_code = cache->MaybeGet(kind, canonical_type_index,
+                                            expected_arity, kNoSuspend);
       if (wasm_code == nullptr) {
         WasmCodeRefScope code_ref_scope;
         WasmImportWrapperCache::ModificationScope cache_scope(cache);
         wasm_code =
             compiler::CompileWasmCapiCallWrapper(native_module, expected_sig);
-        WasmImportWrapperCache::CacheKey key(kind, expected_sig, expected_arity,
-                                             kNoSuspend);
+        WasmImportWrapperCache::CacheKey key(kind, canonical_type_index,
+                                             expected_arity, kNoSuspend);
         cache_scope[key] = wasm_code;
         wasm_code->IncRef();
         isolate_->counters()->wasm_generated_code_size()->Increment(
@@ -1203,8 +1209,11 @@ bool InstanceBuilder::ProcessImportedFunction(
       }
 
       NativeModule* native_module = instance->module_object().native_module();
+      uint32_t canonical_type_index =
+          module_->isorecursive_canonical_type_ids
+              [module_->functions[func_index].sig_index];
       WasmCode* wasm_code = native_module->import_wrapper_cache()->Get(
-          kind, expected_sig, expected_arity, resolved.suspend);
+          kind, canonical_type_index, expected_arity, resolved.suspend);
       DCHECK_NOT_NULL(wasm_code);
       ImportedFunctionEntry entry(instance, func_index);
       if (wasm_code->kind() == WasmCode::kWasmToJsWrapper) {
@@ -1258,15 +1267,9 @@ bool InstanceBuilder::InitializeImportedIndirectFunctionTable(
     const WasmModule* target_module = target_instance->module_object().module();
     const WasmFunction& function = target_module->functions[function_index];
 
-    // Look up the signature's canonical id. In the case of
-    // !v8_flags.wasm_type_canonicalization, if there is no canonical id, then
-    // the signature does not appear at all in this module, so putting {-1} in
-    // the table will cause checks to always fail.
     FunctionTargetAndRef entry(target_instance, function_index);
     uint32_t canonicalized_sig_index =
-        v8_flags.wasm_type_canonicalization
-            ? target_module->isorecursive_canonical_type_ids[function.sig_index]
-            : module_->signature_map.Find(*function.sig);
+        target_module->isorecursive_canonical_type_ids[function.sig_index];
     instance->GetIndirectFunctionTable(isolate_, table_index)
         ->Set(i, canonicalized_sig_index, entry.call_target(), *entry.ref());
   }
@@ -1614,14 +1617,16 @@ void InstanceBuilder::CompileImportWrappers(
       expected_arity =
           shared.internal_formal_parameter_count_without_receiver();
     }
-
-    WasmImportWrapperCache::CacheKey key(kind, sig, expected_arity,
-                                         resolved.suspend);
+    uint32_t canonical_type_index =
+        module_->isorecursive_canonical_type_ids[module_->functions[func_index]
+                                                     .sig_index];
+    WasmImportWrapperCache::CacheKey key(kind, canonical_type_index,
+                                         expected_arity, resolved.suspend);
     if (cache_scope[key] != nullptr) {
       // Cache entry already exists, no need to compile it again.
       continue;
     }
-    import_wrapper_queue.insert(key);
+    import_wrapper_queue.insert(key, sig);
   }
 
   auto compile_job_task = std::make_unique<CompileImportWrapperJob>(
diff --git a/deps/v8/src/wasm/pgo.cc b/deps/v8/src/wasm/pgo.cc
new file mode 100644
index 00000000000000..8d9069bee25bd2
--- /dev/null
+++ b/deps/v8/src/wasm/pgo.cc
@@ -0,0 +1,186 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/wasm/pgo.h"
+
+#include "src/wasm/decoder.h"
+#include "src/wasm/wasm-module-builder.h"  // For {ZoneBuffer}.
+
+namespace v8::internal::wasm {
+
+class ProfileGenerator {
+ public:
+  ProfileGenerator(const WasmModule* module)
+      : module_(module),
+        type_feedback_mutex_guard_(&module->type_feedback.mutex) {}
+
+  base::OwnedVector<uint8_t> GetProfileData() {
+    ZoneBuffer buffer{&zone_};
+
+    SerializeTypeFeedback(buffer);
+    // TODO(13209): Serialize tiering information.
+
+    return base::OwnedVector<uint8_t>::Of(buffer);
+  }
+
+ private:
+  void SerializeTypeFeedback(ZoneBuffer& buffer) {
+    std::unordered_map<uint32_t, FunctionTypeFeedback>& feedback_for_function =
+        module_->type_feedback.feedback_for_function;
+
+    // Get an ordered list of function indexes, so we generate deterministic
+    // data.
+    std::vector<uint32_t> ordered_function_indexes;
+    ordered_function_indexes.reserve(feedback_for_function.size());
+    for (const auto& entry : feedback_for_function) {
+      // Skip functions for which we have to feedback.
+      if (entry.second.feedback_vector.empty()) continue;
+      ordered_function_indexes.push_back(entry.first);
+    }
+    std::sort(ordered_function_indexes.begin(), ordered_function_indexes.end());
+
+    buffer.write_u32v(static_cast<uint32_t>(ordered_function_indexes.size()));
+    for (const uint32_t func_index : ordered_function_indexes) {
+      buffer.write_u32v(func_index);
+      // Serialize {feedback_vector}.
+      const FunctionTypeFeedback& feedback =
+          feedback_for_function.at(func_index);
+      buffer.write_u32v(static_cast<uint32_t>(feedback.feedback_vector.size()));
+      for (const CallSiteFeedback& call_site_feedback :
+           feedback.feedback_vector) {
+        int cases = call_site_feedback.num_cases();
+        buffer.write_i32v(cases);
+        for (int i = 0; i < cases; ++i) {
+          buffer.write_i32v(call_site_feedback.function_index(i));
+          buffer.write_i32v(call_site_feedback.call_count(i));
+        }
+      }
+      // Serialize {call_targets}.
+      buffer.write_u32v(static_cast<uint32_t>(feedback.call_targets.size()));
+      for (uint32_t call_target : feedback.call_targets) {
+        buffer.write_u32v(call_target);
+      }
+    }
+  }
+
+ private:
+  const WasmModule* module_;
+  AccountingAllocator allocator_;
+  Zone zone_{&allocator_, "wasm::ProfileGenerator"};
+  base::MutexGuard type_feedback_mutex_guard_;
+};
+
+void DeserializeTypeFeedback(Decoder& decoder, WasmModule* module) {
+  std::unordered_map<uint32_t, FunctionTypeFeedback>& feedback_for_function =
+      module->type_feedback.feedback_for_function;
+  uint32_t num_entries = decoder.consume_u32v("num function entries");
+  CHECK_LE(num_entries, module->num_declared_functions);
+  for (uint32_t missing_entries = num_entries; missing_entries > 0;
+       --missing_entries) {
+    uint32_t function_index = decoder.consume_u32v("function index");
+    CHECK(!feedback_for_function.count(function_index));
+    FunctionTypeFeedback& feedback = feedback_for_function[function_index];
+    // Deserialize {feedback_vector}.
+    uint32_t feedback_vector_size =
+        decoder.consume_u32v("feedback vector size");
+    feedback.feedback_vector.resize(feedback_vector_size);
+    for (CallSiteFeedback& feedback : feedback.feedback_vector) {
+      int num_cases = decoder.consume_i32v("num cases");
+      if (num_cases == 0) continue;  // no feedback
+      if (num_cases == 1) {          // monomorphic
+        int called_function_index = decoder.consume_i32v("function index");
+        int call_count = decoder.consume_i32v("call count");
+        feedback = CallSiteFeedback{called_function_index, call_count};
+      } else {  // polymorphic
+        auto* polymorphic = new CallSiteFeedback::PolymorphicCase[num_cases];
+        for (int i = 0; i < num_cases; ++i) {
+          polymorphic[i].function_index =
+              decoder.consume_i32v("function index");
+          polymorphic[i].absolute_call_frequency =
+              decoder.consume_i32v("call count");
+        }
+        feedback = CallSiteFeedback{polymorphic, num_cases};
+      }
+    }
+    // Deserialize {call_targets}.
+    uint32_t num_call_targets = decoder.consume_u32v("num call targets");
+    feedback.call_targets =
+        base::OwnedVector<uint32_t>::NewForOverwrite(num_call_targets);
+    for (uint32_t& call_target : feedback.call_targets) {
+      call_target = decoder.consume_u32v("call target");
+    }
+  }
+}
+
+void RestoreProfileData(WasmModule* module,
+                        base::Vector<uint8_t> profile_data) {
+  Decoder decoder{profile_data.begin(), profile_data.end()};
+
+  DeserializeTypeFeedback(decoder, module);
+
+  CHECK(decoder.ok());
+  CHECK_EQ(decoder.pc(), decoder.end());
+}
+
+void DumpProfileToFile(const WasmModule* module,
+                       base::Vector<const uint8_t> wire_bytes) {
+  CHECK(!wire_bytes.empty());
+  // File are named `profile-wasm-<hash>`.
+  // We use the same hash as for reported scripts, to make it easier to
+  // correlate files to wasm modules (see {CreateWasmScript}).
+  uint32_t hash = static_cast<uint32_t>(GetWireBytesHash(wire_bytes));
+  base::EmbeddedVector<char, 32> filename;
+  SNPrintF(filename, "profile-wasm-%08x", hash);
+
+  ProfileGenerator profile_generator{module};
+  base::OwnedVector<uint8_t> profile_data = profile_generator.GetProfileData();
+
+  PrintF("Dumping Wasm PGO data to file '%s' (%zu bytes)\n", filename.begin(),
+         profile_data.size());
+  if (FILE* file = base::OS::FOpen(filename.begin(), "wb")) {
+    size_t written = fwrite(profile_data.begin(), 1, profile_data.size(), file);
+    CHECK_EQ(profile_data.size(), written);
+    base::Fclose(file);
+  }
+}
+
+void LoadProfileFromFile(WasmModule* module,
+                         base::Vector<const uint8_t> wire_bytes) {
+  CHECK(!wire_bytes.empty());
+  // File are named `profile-wasm-<hash>`.
+  // We use the same hash as for reported scripts, to make it easier to
+  // correlate files to wasm modules (see {CreateWasmScript}).
+  uint32_t hash = static_cast<uint32_t>(GetWireBytesHash(wire_bytes));
+  base::EmbeddedVector<char, 32> filename;
+  SNPrintF(filename, "profile-wasm-%08x", hash);
+
+  FILE* file = base::OS::FOpen(filename.begin(), "rb");
+  if (!file) {
+    PrintF("No Wasm PGO data found: Cannot open file '%s'\n", filename.begin());
+    return;
+  }
+
+  fseek(file, 0, SEEK_END);
+  size_t size = ftell(file);
+  rewind(file);
+
+  PrintF("Loading Wasm PGO data from file '%s' (%zu bytes)\n", filename.begin(),
+         size);
+  base::OwnedVector<uint8_t> profile_data =
+      base::OwnedVector<uint8_t>::NewForOverwrite(size);
+  for (size_t read = 0; read < size;) {
+    read += fread(profile_data.begin() + read, 1, size - read, file);
+    CHECK(!ferror(file));
+  }
+
+  base::Fclose(file);
+
+  RestoreProfileData(module, profile_data.as_vector());
+
+  // Check that the generated profile is deterministic.
+  DCHECK_EQ(profile_data.as_vector(),
+            ProfileGenerator{module}.GetProfileData().as_vector());
+}
+
+}  // namespace v8::internal::wasm
diff --git a/deps/v8/src/wasm/pgo.h b/deps/v8/src/wasm/pgo.h
new file mode 100644
index 00000000000000..31a2269896e834
--- /dev/null
+++ b/deps/v8/src/wasm/pgo.h
@@ -0,0 +1,26 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#if !V8_ENABLE_WEBASSEMBLY
+#error This header should only be included if WebAssembly is enabled.
+#endif  // !V8_ENABLE_WEBASSEMBLY
+
+#ifndef V8_WASM_PGO_H_
+#define V8_WASM_PGO_H_
+
+#include "src/base/vector.h"
+
+namespace v8::internal::wasm {
+
+struct WasmModule;
+
+void DumpProfileToFile(const WasmModule* module,
+                       base::Vector<const uint8_t> wire_bytes);
+
+void LoadProfileFromFile(WasmModule* module,
+                         base::Vector<const uint8_t> wire_bytes);
+
+}  // namespace v8::internal::wasm
+
+#endif  // V8_WASM_PGO_H_
diff --git a/deps/v8/src/wasm/signature-map.cc b/deps/v8/src/wasm/signature-map.cc
deleted file mode 100644
index 5d449a9ee70c2b..00000000000000
--- a/deps/v8/src/wasm/signature-map.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/wasm/signature-map.h"
-
-#include "src/codegen/signature.h"
-
-namespace v8 {
-namespace internal {
-namespace wasm {
-
-uint32_t SignatureMap::FindOrInsert(const FunctionSig& sig) {
-  CHECK(!frozen_);
-  auto pos = map_.find(sig);
-  if (pos != map_.end()) return pos->second;
-  // Indexes are returned as int32_t, thus check against their limit.
-  CHECK_GE(kMaxInt, map_.size());
-  uint32_t index = static_cast<uint32_t>(map_.size());
-  map_.insert(std::make_pair(sig, index));
-  return index;
-}
-
-int32_t SignatureMap::Find(const FunctionSig& sig) const {
-  auto pos = map_.find(sig);
-  if (pos == map_.end()) return -1;
-  return static_cast<int32_t>(pos->second);
-}
-
-}  // namespace wasm
-}  // namespace internal
-}  // namespace v8
diff --git a/deps/v8/src/wasm/signature-map.h b/deps/v8/src/wasm/signature-map.h
deleted file mode 100644
index 3b4b7c96202fc9..00000000000000
--- a/deps/v8/src/wasm/signature-map.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2016 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#if !V8_ENABLE_WEBASSEMBLY
-#error This header should only be included if WebAssembly is enabled.
-#endif  // !V8_ENABLE_WEBASSEMBLY
-
-#ifndef V8_WASM_SIGNATURE_MAP_H_
-#define V8_WASM_SIGNATURE_MAP_H_
-
-#include <unordered_map>
-
-#include "src/base/functional.h"
-#include "src/codegen/signature.h"
-#include "src/wasm/value-type.h"
-
-namespace v8 {
-namespace internal {
-
-namespace wasm {
-
-// A signature map canonicalizes signatures into a range of indices so that
-// two different {FunctionSig} instances with the same contents map to the
-// same index.
-class V8_EXPORT_PRIVATE SignatureMap {
- public:
-  // Allow default construction and move construction (because we have vectors
-  // of objects containing SignatureMaps), but disallow copy or assign. It's
-  // too easy to get security bugs by accidentally updating a copy of the map.
-  MOVE_ONLY_WITH_DEFAULT_CONSTRUCTORS(SignatureMap);
-
-  // Gets the index for a signature, assigning a new index if necessary.
-  uint32_t FindOrInsert(const FunctionSig& sig);
-
-  // Gets the index for a signature, returning {-1} if not found.
-  int32_t Find(const FunctionSig& sig) const;
-
-  // Disallows further insertions to this signature map.
-  void Freeze() { frozen_ = true; }
-
-  size_t size() const { return map_.size(); }
-
-  bool is_frozen() const { return frozen_; }
-
- private:
-  bool frozen_ = false;
-  std::unordered_map<FunctionSig, uint32_t, base::hash<FunctionSig>> map_;
-};
-
-}  // namespace wasm
-}  // namespace internal
-}  // namespace v8
-
-#endif  // V8_WASM_SIGNATURE_MAP_H_
diff --git a/deps/v8/src/wasm/streaming-decoder.h b/deps/v8/src/wasm/streaming-decoder.h
index 15a05024a2adec..229219ec226b67 100644
--- a/deps/v8/src/wasm/streaming-decoder.h
+++ b/deps/v8/src/wasm/streaming-decoder.h
@@ -104,10 +104,11 @@ class V8_EXPORT_PRIVATE StreamingDecoder {
   virtual void NotifyNativeModuleCreated(
       const std::shared_ptr<NativeModule>& native_module) = 0;
 
-  base::Vector<const char> url() { return base::VectorOf(url_); }
+  const std::string& url() const { return *url_; }
+  std::shared_ptr<const std::string> shared_url() const { return url_; }
 
   void SetUrl(base::Vector<const char> url) {
-    url_.assign(url.begin(), url.length());
+    url_->assign(url.begin(), url.size());
   }
 
   static std::unique_ptr<StreamingDecoder> CreateAsyncStreamingDecoder(
@@ -121,7 +122,7 @@ class V8_EXPORT_PRIVATE StreamingDecoder {
  protected:
   bool deserializing() const { return !compiled_module_bytes_.empty(); }
 
-  std::string url_;
+  const std::shared_ptr<std::string> url_ = std::make_shared<std::string>();
   MoreFunctionsCanBeSerializedCallback
       more_functions_can_be_serialized_callback_;
   // The content of `compiled_module_bytes_` shouldn't be used until
diff --git a/deps/v8/src/wasm/sync-streaming-decoder.cc b/deps/v8/src/wasm/sync-streaming-decoder.cc
index ffed424c1a6332..ad0ecbdd7ddf78 100644
--- a/deps/v8/src/wasm/sync-streaming-decoder.cc
+++ b/deps/v8/src/wasm/sync-streaming-decoder.cc
@@ -49,7 +49,8 @@ class V8_EXPORT_PRIVATE SyncStreamingDecoder : public StreamingDecoder {
 
       MaybeHandle<WasmModuleObject> module_object = DeserializeNativeModule(
           isolate_, compiled_module_bytes_,
-          base::Vector<const uint8_t>(bytes.get(), buffer_size_), url());
+          base::Vector<const uint8_t>(bytes.get(), buffer_size_),
+          base::VectorOf(url()));
 
       if (!module_object.is_null()) {
         Handle<WasmModuleObject> module = module_object.ToHandleChecked();
diff --git a/deps/v8/src/wasm/value-type.h b/deps/v8/src/wasm/value-type.h
index fed87cfb99da49..da001f037a6c1d 100644
--- a/deps/v8/src/wasm/value-type.h
+++ b/deps/v8/src/wasm/value-type.h
@@ -666,6 +666,7 @@ class ValueType {
 
   uint32_t bit_field_;
 };
+ASSERT_TRIVIALLY_COPYABLE(ValueType);
 
 inline constexpr intptr_t ValueType::kBitFieldOffset =
     offsetof(ValueType, bit_field_);
diff --git a/deps/v8/src/wasm/wasm-code-manager.cc b/deps/v8/src/wasm/wasm-code-manager.cc
index 51874973e1dab4..6f9bd745a93d81 100644
--- a/deps/v8/src/wasm/wasm-code-manager.cc
+++ b/deps/v8/src/wasm/wasm-code-manager.cc
@@ -34,6 +34,7 @@
 #include "src/wasm/jump-table-assembler.h"
 #include "src/wasm/module-compiler.h"
 #include "src/wasm/names-provider.h"
+#include "src/wasm/pgo.h"
 #include "src/wasm/wasm-debug.h"
 #include "src/wasm/wasm-engine.h"
 #include "src/wasm/wasm-import-wrapper-cache.h"
@@ -151,7 +152,7 @@ base::AddressRegion DisjointAllocationPool::AllocateInRegion(
 }
 
 Address WasmCode::constant_pool() const {
-  if (v8_flags.enable_embedded_constant_pool) {
+  if (V8_EMBEDDED_CONSTANT_POOL_BOOL) {
     if (constant_pool_offset_ < code_comments_offset_) {
       return instruction_start() + constant_pool_offset_;
     }
@@ -2335,16 +2336,6 @@ std::vector<std::unique_ptr<WasmCode>> NativeModule::AddCompiledCode(
   for (auto& result : results) {
     DCHECK(result.succeeded());
     total_code_space += RoundUp<kCodeAlignment>(result.code_desc.instr_size);
-    if (result.result_tier == ExecutionTier::kLiftoff) {
-      int index = result.func_index;
-      int* slots = &module()->functions[index].feedback_slots;
-#if DEBUG
-      int current_value = base::Relaxed_Load(slots);
-      DCHECK(current_value == 0 ||
-             current_value == result.feedback_vector_slots);
-#endif
-      base::Relaxed_Store(slots, result.feedback_vector_slots);
-    }
   }
   base::Vector<byte> code_space;
   NativeModule::JumpTablesRef jump_tables;
diff --git a/deps/v8/src/wasm/wasm-debug.cc b/deps/v8/src/wasm/wasm-debug.cc
index 802c7fa9402c0c..d64a9c7032647b 100644
--- a/deps/v8/src/wasm/wasm-debug.cc
+++ b/deps/v8/src/wasm/wasm-debug.cc
@@ -783,13 +783,13 @@ int FindNextBreakablePosition(wasm::NativeModule* native_module, int func_index,
                               int offset_in_func) {
   AccountingAllocator alloc;
   Zone tmp(&alloc, ZONE_NAME);
-  wasm::BodyLocalDecls locals(&tmp);
+  wasm::BodyLocalDecls locals;
   const byte* module_start = native_module->wire_bytes().begin();
   const wasm::WasmFunction& func =
       native_module->module()->functions[func_index];
   wasm::BytecodeIterator iterator(module_start + func.code.offset(),
                                   module_start + func.code.end_offset(),
-                                  &locals);
+                                  &locals, &tmp);
   DCHECK_LT(0, locals.encoded_size);
   if (offset_in_func < 0) return 0;
   for (; iterator.has_next(); iterator.next()) {
@@ -1099,10 +1099,10 @@ bool WasmScript::GetPossibleBreakpoints(
     const wasm::WasmFunction& func = functions[func_idx];
     if (func.code.length() == 0) continue;
 
-    wasm::BodyLocalDecls locals(&tmp);
+    wasm::BodyLocalDecls locals;
     wasm::BytecodeIterator iterator(module_start + func.code.offset(),
                                     module_start + func.code.end_offset(),
-                                    &locals);
+                                    &locals, &tmp);
     DCHECK_LT(0u, locals.encoded_size);
     for (; iterator.has_next(); iterator.next()) {
       uint32_t total_offset = func.code.offset() + iterator.pc_offset();
diff --git a/deps/v8/src/wasm/wasm-disassembler.cc b/deps/v8/src/wasm/wasm-disassembler.cc
index d43b911e48b96d..3504b6d998e37d 100644
--- a/deps/v8/src/wasm/wasm-disassembler.cc
+++ b/deps/v8/src/wasm/wasm-disassembler.cc
@@ -168,7 +168,6 @@ void FunctionBodyDisassembler::DecodeAsWat(MultiLineStringBuilder& out,
 
   // Decode and print locals.
   uint32_t locals_length;
-  InitializeLocalsFromSig();
   DecodeLocals(pc_, &locals_length);
   if (failed()) {
     // TODO(jkummerow): Improve error handling.
diff --git a/deps/v8/src/wasm/wasm-engine.cc b/deps/v8/src/wasm/wasm-engine.cc
index ddb45653511c08..7fc49ed058b77b 100644
--- a/deps/v8/src/wasm/wasm-engine.cc
+++ b/deps/v8/src/wasm/wasm-engine.cc
@@ -23,6 +23,7 @@
 #include "src/wasm/module-compiler.h"
 #include "src/wasm/module-decoder.h"
 #include "src/wasm/module-instantiate.h"
+#include "src/wasm/pgo.h"
 #include "src/wasm/stacks.h"
 #include "src/wasm/streaming-decoder.h"
 #include "src/wasm/wasm-debug.h"
@@ -510,14 +511,12 @@ MaybeHandle<AsmWasmData> WasmEngine::SyncCompileTranslatedAsmJs(
 
   // Transfer ownership of the WasmModule to the {Managed<WasmModule>} generated
   // in {CompileToNativeModule}.
-  Handle<FixedArray> export_wrappers;
   std::shared_ptr<NativeModule> native_module = CompileToNativeModule(
       isolate, WasmFeatures::ForAsmjs(), thrower, std::move(result).value(),
-      bytes, &export_wrappers, compilation_id, context_id);
+      bytes, compilation_id, context_id);
   if (!native_module) return {};
 
-  return AsmWasmData::New(isolate, std::move(native_module), export_wrappers,
-                          uses_bitset);
+  return AsmWasmData::New(isolate, std::move(native_module), uses_bitset);
 }
 
 Handle<WasmModuleObject> WasmEngine::FinalizeTranslatedAsmJs(
@@ -525,10 +524,8 @@ Handle<WasmModuleObject> WasmEngine::FinalizeTranslatedAsmJs(
     Handle<Script> script) {
   std::shared_ptr<NativeModule> native_module =
       asm_wasm_data->managed_native_module().get();
-  Handle<FixedArray> export_wrappers =
-      handle(asm_wasm_data->export_wrappers(), isolate);
-  Handle<WasmModuleObject> module_object = WasmModuleObject::New(
-      isolate, std::move(native_module), script, export_wrappers);
+  Handle<WasmModuleObject> module_object =
+      WasmModuleObject::New(isolate, std::move(native_module), script);
   return module_object;
 }
 
@@ -559,10 +556,9 @@ MaybeHandle<WasmModuleObject> WasmEngine::SyncCompile(
 
   // Transfer ownership of the WasmModule to the {Managed<WasmModule>} generated
   // in {CompileToNativeModule}.
-  Handle<FixedArray> export_wrappers;
   std::shared_ptr<NativeModule> native_module =
       CompileToNativeModule(isolate, enabled, thrower, std::move(module), bytes,
-                            &export_wrappers, compilation_id, context_id);
+                            compilation_id, context_id);
   if (!native_module) return {};
 
 #ifdef DEBUG
@@ -586,8 +582,8 @@ MaybeHandle<WasmModuleObject> WasmEngine::SyncCompile(
   // and information needed at instantiation time. This object needs to be
   // serializable. Instantiation may occur off a deserialized version of this
   // object.
-  Handle<WasmModuleObject> module_object = WasmModuleObject::New(
-      isolate, std::move(native_module), script, export_wrappers);
+  Handle<WasmModuleObject> module_object =
+      WasmModuleObject::New(isolate, std::move(native_module), script);
 
   // Finish the Wasm script now and make it public to the debugger.
   isolate->debug()->OnAfterCompile(script);
@@ -870,10 +866,8 @@ Handle<WasmModuleObject> WasmEngine::ImportNativeModule(
   ModuleWireBytes wire_bytes(native_module->wire_bytes());
   Handle<Script> script =
       GetOrCreateScript(isolate, shared_native_module, source_url);
-  Handle<FixedArray> export_wrappers;
-  CompileJsToWasmWrappers(isolate, native_module->module(), &export_wrappers);
-  Handle<WasmModuleObject> module_object = WasmModuleObject::New(
-      isolate, std::move(shared_native_module), script, export_wrappers);
+  Handle<WasmModuleObject> module_object =
+      WasmModuleObject::New(isolate, std::move(shared_native_module), script);
   {
     base::MutexGuard lock(&mutex_);
     DCHECK_EQ(1, isolates_.count(isolate));
diff --git a/deps/v8/src/wasm/wasm-import-wrapper-cache.cc b/deps/v8/src/wasm/wasm-import-wrapper-cache.cc
index 7c6ca19f08f8d8..bbe3a480e17fb8 100644
--- a/deps/v8/src/wasm/wasm-import-wrapper-cache.cc
+++ b/deps/v8/src/wasm/wasm-import-wrapper-cache.cc
@@ -23,23 +23,25 @@ WasmCode*& WasmImportWrapperCache::operator[](
 }
 
 WasmCode* WasmImportWrapperCache::Get(compiler::WasmImportCallKind kind,
-                                      const FunctionSig* sig,
+                                      uint32_t canonical_type_index,
                                       int expected_arity,
                                       Suspend suspend) const {
   base::MutexGuard lock(&mutex_);
 
-  auto it = entry_map_.find({kind, sig, expected_arity, suspend});
+  auto it =
+      entry_map_.find({kind, canonical_type_index, expected_arity, suspend});
   DCHECK(it != entry_map_.end());
   return it->second;
 }
 
 WasmCode* WasmImportWrapperCache::MaybeGet(compiler::WasmImportCallKind kind,
-                                           const FunctionSig* sig,
+                                           uint32_t canonical_type_index,
                                            int expected_arity,
                                            Suspend suspend) const {
   base::MutexGuard lock(&mutex_);
 
-  auto it = entry_map_.find({kind, sig, expected_arity, suspend});
+  auto it =
+      entry_map_.find({kind, canonical_type_index, expected_arity, suspend});
   if (it == entry_map_.end()) return nullptr;
   return it->second;
 }
diff --git a/deps/v8/src/wasm/wasm-import-wrapper-cache.h b/deps/v8/src/wasm/wasm-import-wrapper-cache.h
index f12b07477fe16f..e07431dd94fa7f 100644
--- a/deps/v8/src/wasm/wasm-import-wrapper-cache.h
+++ b/deps/v8/src/wasm/wasm-import-wrapper-cache.h
@@ -28,22 +28,23 @@ using FunctionSig = Signature<ValueType>;
 class WasmImportWrapperCache {
  public:
   struct CacheKey {
-    CacheKey(const compiler::WasmImportCallKind& _kind, const FunctionSig* _sig,
-             int _expected_arity, Suspend _suspend)
-        : kind(_kind),
-          signature(_sig),
-          expected_arity(_expected_arity == kDontAdaptArgumentsSentinel
+    CacheKey(const compiler::WasmImportCallKind& kind,
+             uint32_t canonical_type_index, int expected_arity, Suspend suspend)
+        : kind(kind),
+          canonical_type_index(canonical_type_index),
+          expected_arity(expected_arity == kDontAdaptArgumentsSentinel
                              ? 0
-                             : _expected_arity),
-          suspend(_suspend) {}
+                             : expected_arity),
+          suspend(suspend) {}
 
     bool operator==(const CacheKey& rhs) const {
-      return kind == rhs.kind && signature == rhs.signature &&
+      return kind == rhs.kind &&
+             canonical_type_index == rhs.canonical_type_index &&
              expected_arity == rhs.expected_arity && suspend == rhs.suspend;
     }
 
     compiler::WasmImportCallKind kind;
-    const FunctionSig* signature;
+    uint32_t canonical_type_index;
     int expected_arity;
     Suspend suspend;
   };
@@ -51,8 +52,8 @@ class WasmImportWrapperCache {
   class CacheKeyHash {
    public:
     size_t operator()(const CacheKey& key) const {
-      return base::hash_combine(static_cast<uint8_t>(key.kind), key.signature,
-                                key.expected_arity);
+      return base::hash_combine(static_cast<uint8_t>(key.kind),
+                                key.canonical_type_index, key.expected_arity);
     }
   };
 
@@ -75,11 +76,12 @@ class WasmImportWrapperCache {
 
   // Thread-safe. Assumes the key exists in the map.
   V8_EXPORT_PRIVATE WasmCode* Get(compiler::WasmImportCallKind kind,
-                                  const FunctionSig* sig, int expected_arity,
-                                  Suspend suspend) const;
+                                  uint32_t canonical_type_index,
+                                  int expected_arity, Suspend suspend) const;
   // Thread-safe. Returns nullptr if the key doesn't exist in the map.
-  WasmCode* MaybeGet(compiler::WasmImportCallKind kind, const FunctionSig* sig,
-                     int expected_arity, Suspend suspend) const;
+  WasmCode* MaybeGet(compiler::WasmImportCallKind kind,
+                     uint32_t canonical_type_index, int expected_arity,
+                     Suspend suspend) const;
 
   ~WasmImportWrapperCache();
 
diff --git a/deps/v8/src/wasm/wasm-init-expr.h b/deps/v8/src/wasm/wasm-init-expr.h
index c08aa7dece417b..8d5be635a2a17f 100644
--- a/deps/v8/src/wasm/wasm-init-expr.h
+++ b/deps/v8/src/wasm/wasm-init-expr.h
@@ -24,6 +24,7 @@ class WasmFeatures;
 // Representation of an constant expression. Unlike {ConstantExpression}, this
 // does not use {WireBytesRef}, i.e., it does not depend on a wasm module's
 // bytecode representation.
+// TODO(manoskouk): Add missing kinds of expressions.
 class WasmInitExpr : public ZoneObject {
  public:
   enum Operator {
diff --git a/deps/v8/src/wasm/wasm-js.cc b/deps/v8/src/wasm/wasm-js.cc
index 3e8931f378b034..7806d885676bca 100644
--- a/deps/v8/src/wasm/wasm-js.cc
+++ b/deps/v8/src/wasm/wasm-js.cc
@@ -17,6 +17,7 @@
 #include "src/execution/execution.h"
 #include "src/execution/isolate.h"
 #include "src/execution/messages.h"
+#include "src/flags/flags.h"
 #include "src/handles/handles.h"
 #include "src/heap/factory.h"
 #include "src/objects/fixed-array.h"
@@ -84,10 +85,9 @@ class WasmStreaming::WasmStreamingImpl {
       std::function<void(CompiledWasmModule)> callback) {
     streaming_decoder_->SetMoreFunctionsCanBeSerializedCallback(
         [callback = std::move(callback),
-         streaming_decoder = streaming_decoder_](
+         url = streaming_decoder_->shared_url()](
             const std::shared_ptr<i::wasm::NativeModule>& native_module) {
-          base::Vector<const char> url = streaming_decoder->url();
-          callback(CompiledWasmModule{native_module, url.begin(), url.size()});
+          callback(CompiledWasmModule{native_module, url->data(), url->size()});
         });
   }
 
@@ -1565,8 +1565,6 @@ void WebAssemblyGlobal(const v8::FunctionCallbackInfo<v8::Value>& args) {
       break;
     }
     case i::wasm::kRtt:
-      // TODO(7748): Implement.
-      UNIMPLEMENTED();
     case i::wasm::kI8:
     case i::wasm::kI16:
     case i::wasm::kVoid:
@@ -2725,7 +2723,6 @@ void WebAssemblyGlobalGetValueCommon(
       break;
     }
     case i::wasm::kRtt:
-      UNIMPLEMENTED();  // TODO(7748): Implement.
     case i::wasm::kI8:
     case i::wasm::kI16:
     case i::wasm::kBottom:
@@ -2992,9 +2989,10 @@ void WasmJs::Install(Isolate* isolate, bool exposed_on_global_object) {
   InstallFunc(isolate, webassembly, "validate", WebAssemblyValidate, 1);
   InstallFunc(isolate, webassembly, "instantiate", WebAssemblyInstantiate, 1);
 
-  // TODO(tebbi): Put this behind its own flag once --wasm-gc-js-interop gets
-  // closer to shipping.
-  if (v8_flags.wasm_gc_js_interop) {
+  // TODO(7748): These built-ins should not be shipped with wasm GC.
+  // Either a new flag will be needed or the built-ins have to be deleted prior
+  // to shipping.
+  if (v8_flags.experimental_wasm_gc) {
     SimpleInstallFunction(
         isolate, webassembly, "experimentalConvertArrayToString",
         Builtin::kExperimentalWasmConvertArrayToString, 0, true);
diff --git a/deps/v8/src/wasm/wasm-module.cc b/deps/v8/src/wasm/wasm-module.cc
index 85a415c2ef09e1..5ad67a18174a16 100644
--- a/deps/v8/src/wasm/wasm-module.cc
+++ b/deps/v8/src/wasm/wasm-module.cc
@@ -64,31 +64,8 @@ bool LazilyGeneratedNames::Has(uint32_t function_index) {
   return function_names_.Get(function_index) != nullptr;
 }
 
-// static
-int MaxNumExportWrappers(const WasmModule* module) {
-  // For each signature there may exist a wrapper, both for imported and
-  // internal functions.
-  return static_cast<int>(module->signature_map.size()) * 2;
-}
-
-int GetExportWrapperIndexInternal(const WasmModule* module,
-                                  int canonical_sig_index, bool is_import) {
-  if (is_import) canonical_sig_index += module->signature_map.size();
-  return canonical_sig_index;
-}
-
-int GetExportWrapperIndex(const WasmModule* module, const FunctionSig* sig,
-                          bool is_import) {
-  int canonical_sig_index = module->signature_map.Find(*sig);
-  CHECK_GE(canonical_sig_index, 0);
-  return GetExportWrapperIndexInternal(module, canonical_sig_index, is_import);
-}
-
-int GetExportWrapperIndex(const WasmModule* module, uint32_t sig_index,
-                          bool is_import) {
-  uint32_t canonical_sig_index =
-      module->per_module_canonical_type_ids[sig_index];
-  return GetExportWrapperIndexInternal(module, canonical_sig_index, is_import);
+int GetExportWrapperIndex(uint32_t canonical_sig_index, bool is_import) {
+  return 2 * canonical_sig_index + (is_import ? 1 : 0);
 }
 
 // static
@@ -650,7 +627,6 @@ size_t EstimateStoredSize(const WasmModule* module) {
          (module->signature_zone ? module->signature_zone->allocation_size()
                                  : 0) +
          VectorSize(module->types) +
-         VectorSize(module->per_module_canonical_type_ids) +
          VectorSize(module->isorecursive_canonical_type_ids) +
          VectorSize(module->functions) + VectorSize(module->data_segments) +
          VectorSize(module->tables) + VectorSize(module->import_table) +
@@ -689,146 +665,16 @@ size_t GetWireBytesHash(base::Vector<const uint8_t> wire_bytes) {
       kZeroHashSeed);
 }
 
-base::OwnedVector<uint8_t> GetProfileData(const WasmModule* module) {
-  const TypeFeedbackStorage& type_feedback = module->type_feedback;
-  AccountingAllocator allocator;
-  Zone zone{&allocator, "wasm::GetProfileData"};
-  ZoneBuffer buffer{&zone};
-  base::MutexGuard mutex_guard{&type_feedback.mutex};
-
-  // Get an ordered list of function indexes, so we generate deterministic data.
-  std::vector<uint32_t> ordered_func_indexes;
-  ordered_func_indexes.reserve(type_feedback.feedback_for_function.size());
-  for (const auto& entry : type_feedback.feedback_for_function) {
-    ordered_func_indexes.push_back(entry.first);
-  }
-  std::sort(ordered_func_indexes.begin(), ordered_func_indexes.end());
-
-  buffer.write_u32v(static_cast<uint32_t>(ordered_func_indexes.size()));
-  for (const uint32_t func_index : ordered_func_indexes) {
-    buffer.write_u32v(func_index);
-    // Serialize {feedback_vector}.
-    const FunctionTypeFeedback& feedback =
-        type_feedback.feedback_for_function.at(func_index);
-    buffer.write_u32v(static_cast<uint32_t>(feedback.feedback_vector.size()));
-    for (const CallSiteFeedback& call_site_feedback :
-         feedback.feedback_vector) {
-      int cases = call_site_feedback.num_cases();
-      buffer.write_i32v(cases);
-      for (int i = 0; i < cases; ++i) {
-        buffer.write_i32v(call_site_feedback.function_index(i));
-        buffer.write_i32v(call_site_feedback.call_count(i));
-      }
-    }
-    // Serialize {call_targets}.
-    buffer.write_u32v(static_cast<uint32_t>(feedback.call_targets.size()));
-    for (uint32_t call_target : feedback.call_targets) {
-      buffer.write_u32v(call_target);
-    }
-  }
-  return base::OwnedVector<uint8_t>::Of(buffer);
-}
-
-void RestoreProfileData(WasmModule* module,
-                        base::Vector<uint8_t> profile_data) {
-  TypeFeedbackStorage& type_feedback = module->type_feedback;
-  Decoder decoder{profile_data.begin(), profile_data.end()};
-  uint32_t num_entries = decoder.consume_u32v("num function entries");
-  CHECK_LE(num_entries, module->num_declared_functions);
-  for (uint32_t missing_entries = num_entries; missing_entries > 0;
-       --missing_entries) {
-    uint32_t function_index = decoder.consume_u32v("function index");
-    CHECK(!type_feedback.feedback_for_function.count(function_index));
-    FunctionTypeFeedback& feedback =
-        type_feedback.feedback_for_function[function_index];
-    // Deserialize {feedback_vector}.
-    uint32_t feedback_vector_size =
-        decoder.consume_u32v("feedback vector size");
-    feedback.feedback_vector.resize(feedback_vector_size);
-    for (CallSiteFeedback& feedback : feedback.feedback_vector) {
-      int num_cases = decoder.consume_i32v("num cases");
-      if (num_cases == 0) continue;  // no feedback
-      if (num_cases == 1) {          // monomorphic
-        int called_function_index = decoder.consume_i32v("function index");
-        int call_count = decoder.consume_i32v("call count");
-        feedback = CallSiteFeedback{called_function_index, call_count};
-      } else {  // polymorphic
-        auto* polymorphic = new CallSiteFeedback::PolymorphicCase[num_cases];
-        for (int i = 0; i < num_cases; ++i) {
-          polymorphic[i].function_index =
-              decoder.consume_i32v("function index");
-          polymorphic[i].absolute_call_frequency =
-              decoder.consume_i32v("call count");
-        }
-        feedback = CallSiteFeedback{polymorphic, num_cases};
-      }
-    }
-    // Deserialize {call_targets}.
-    uint32_t num_call_targets = decoder.consume_u32v("num call targets");
-    feedback.call_targets =
-        base::OwnedVector<uint32_t>::NewForOverwrite(num_call_targets);
-    for (uint32_t& call_target : feedback.call_targets) {
-      call_target = decoder.consume_u32v("call target");
-    }
-  }
-  CHECK(decoder.ok());
-  CHECK_EQ(decoder.pc(), decoder.end());
-}
-
-void DumpProfileToFile(const WasmModule* module,
-                       base::Vector<const uint8_t> wire_bytes) {
-  CHECK(!wire_bytes.empty());
-  // File are named `profile-wasm-<hash>`.
-  // We use the same hash as for reported scripts, to make it easier to
-  // correlate files to wasm modules (see {CreateWasmScript}).
-  uint32_t hash = static_cast<uint32_t>(GetWireBytesHash(wire_bytes));
-  base::EmbeddedVector<char, 32> filename;
-  SNPrintF(filename, "profile-wasm-%08x", hash);
-  base::OwnedVector<uint8_t> profile_data = GetProfileData(module);
-  PrintF("Dumping Wasm PGO data to file '%s' (%zu bytes)\n", filename.begin(),
-         profile_data.size());
-  if (FILE* file = base::OS::FOpen(filename.begin(), "wb")) {
-    CHECK_EQ(profile_data.size(),
-             fwrite(profile_data.begin(), 1, profile_data.size(), file));
-    base::Fclose(file);
-  }
-}
-
-void LoadProfileFromFile(WasmModule* module,
-                         base::Vector<const uint8_t> wire_bytes) {
-  CHECK(!wire_bytes.empty());
-  // File are named `profile-wasm-<hash>`.
-  // We use the same hash as for reported scripts, to make it easier to
-  // correlate files to wasm modules (see {CreateWasmScript}).
-  uint32_t hash = static_cast<uint32_t>(GetWireBytesHash(wire_bytes));
-  base::EmbeddedVector<char, 32> filename;
-  SNPrintF(filename, "profile-wasm-%08x", hash);
-
-  FILE* file = base::OS::FOpen(filename.begin(), "rb");
-  if (!file) {
-    PrintF("No Wasm PGO data found: Cannot open file '%s'\n", filename.begin());
-    return;
-  }
-
-  fseek(file, 0, SEEK_END);
-  size_t size = ftell(file);
-  rewind(file);
-
-  PrintF("Loading Wasm PGO data from file '%s' (%zu bytes)\n", filename.begin(),
-         size);
-  base::OwnedVector<uint8_t> profile_data =
-      base::OwnedVector<uint8_t>::NewForOverwrite(size);
-  for (size_t read = 0; read < size;) {
-    read += fread(profile_data.begin() + read, 1, size - read, file);
-    CHECK(!ferror(file));
-  }
-
-  base::Fclose(file);
-
-  RestoreProfileData(module, profile_data.as_vector());
-
-  // Check that the generated profile is deterministic.
-  DCHECK_EQ(profile_data.as_vector(), GetProfileData(module).as_vector());
+int NumFeedbackSlots(const WasmModule* module, int func_index) {
+  if (!v8_flags.wasm_speculative_inlining) return 0;
+  // TODO(clemensb): Avoid the mutex once this ships, or at least switch to a
+  // shared mutex.
+  base::MutexGuard type_feedback_guard{&module->type_feedback.mutex};
+  auto it = module->type_feedback.feedback_for_function.find(func_index);
+  if (it == module->type_feedback.feedback_for_function.end()) return 0;
+  // The number of call instructions is capped by max function size.
+  static_assert(kV8MaxWasmFunctionSize < std::numeric_limits<int>::max() / 2);
+  return static_cast<int>(2 * it->second.call_targets.size());
 }
 
 }  // namespace v8::internal::wasm
diff --git a/deps/v8/src/wasm/wasm-module.h b/deps/v8/src/wasm/wasm-module.h
index 14a667759a65bb..ac90527ff9bb7f 100644
--- a/deps/v8/src/wasm/wasm-module.h
+++ b/deps/v8/src/wasm/wasm-module.h
@@ -20,7 +20,6 @@
 #include "src/handles/handles.h"
 #include "src/wasm/branch-hint-map.h"
 #include "src/wasm/constant-expression.h"
-#include "src/wasm/signature-map.h"
 #include "src/wasm/struct-types.h"
 #include "src/wasm/wasm-constants.h"
 #include "src/wasm/wasm-init-expr.h"
@@ -64,10 +63,6 @@ struct WasmFunction {
   uint32_t func_index;     // index into the function table.
   uint32_t sig_index;      // index into the signature table.
   WireBytesRef code;       // code of this function.
-  // Required number of slots in a feedback vector. Marked {mutable} because
-  // this is computed late (by Liftoff compilation), when the rest of the
-  // {WasmFunction} is typically considered {const}.
-  mutable int feedback_slots;
   bool imported;
   bool exported;
   bool declared;
@@ -515,10 +510,6 @@ struct V8_EXPORT_PRIVATE WasmModule {
 
   void add_type(TypeDefinition type) {
     types.push_back(type);
-    uint32_t canonical_id = type.kind == TypeDefinition::kFunction
-                                ? signature_map.FindOrInsert(*type.function_sig)
-                                : 0;
-    per_module_canonical_type_ids.push_back(canonical_id);
     // Isorecursive canonical type will be computed later.
     isorecursive_canonical_type_ids.push_back(kNoSuperType);
   }
@@ -570,15 +561,17 @@ struct V8_EXPORT_PRIVATE WasmModule {
     return supertype(index) != kNoSuperType;
   }
 
+  // Linear search. Returns -1 if types are empty.
+  int MaxCanonicalTypeIndex() const {
+    if (isorecursive_canonical_type_ids.empty()) return -1;
+    return *std::max_element(isorecursive_canonical_type_ids.begin(),
+                             isorecursive_canonical_type_ids.end());
+  }
+
   std::vector<TypeDefinition> types;  // by type index
-  // TODO(7748): Unify the following two arrays.
-  // Maps each type index to a canonical index for purposes of call_indirect.
-  std::vector<uint32_t> per_module_canonical_type_ids;
   // Maps each type index to its global (cross-module) canonical index as per
   // isorecursive type canonicalization.
   std::vector<uint32_t> isorecursive_canonical_type_ids;
-  // Canonicalizing map for signature indexes.
-  SignatureMap signature_map;
   std::vector<WasmFunction> functions;
   std::vector<WasmGlobal> globals;
   std::vector<WasmDataSegment> data_segments;
@@ -626,16 +619,9 @@ inline bool is_asmjs_module(const WasmModule* module) {
 
 size_t EstimateStoredSize(const WasmModule* module);
 
-// Returns the number of possible export wrappers for a given module.
-V8_EXPORT_PRIVATE int MaxNumExportWrappers(const WasmModule* module);
-
-// Returns the wrapper index for a function in {module} with signature {sig}
-// or {sig_index} and origin defined by {is_import}.
-// Prefer to use the {sig_index} consuming version, as it is much faster.
-int GetExportWrapperIndex(const WasmModule* module, const FunctionSig* sig,
-                          bool is_import);
-int GetExportWrapperIndex(const WasmModule* module, uint32_t sig_index,
-                          bool is_import);
+// Returns the wrapper index for a function with isorecursive canonical
+// signature index {canonical_sig_index}, and origin defined by {is_import}.
+int GetExportWrapperIndex(uint32_t canonical_sig_index, bool is_import);
 
 // Return the byte offset of the function identified by the given index.
 // The offset will be relative to the start of the module bytes.
@@ -795,11 +781,8 @@ size_t PrintSignature(base::Vector<char> buffer, const wasm::FunctionSig*,
 V8_EXPORT_PRIVATE size_t
 GetWireBytesHash(base::Vector<const uint8_t> wire_bytes);
 
-void DumpProfileToFile(const WasmModule* module,
-                       base::Vector<const uint8_t> wire_bytes);
-
-void LoadProfileFromFile(WasmModule* module,
-                         base::Vector<const uint8_t> wire_bytes);
+// Get the required number of feedback slots for a function.
+int NumFeedbackSlots(const WasmModule* module, int func_index);
 
 }  // namespace v8::internal::wasm
 
diff --git a/deps/v8/src/wasm/wasm-objects.cc b/deps/v8/src/wasm/wasm-objects.cc
index d28597c8844ddd..caa2440104b152 100644
--- a/deps/v8/src/wasm/wasm-objects.cc
+++ b/deps/v8/src/wasm/wasm-objects.cc
@@ -56,14 +56,6 @@ enum DispatchTableElements : int {
 Handle<WasmModuleObject> WasmModuleObject::New(
     Isolate* isolate, std::shared_ptr<wasm::NativeModule> native_module,
     Handle<Script> script) {
-  Handle<FixedArray> export_wrappers = isolate->factory()->NewFixedArray(0);
-  return New(isolate, std::move(native_module), script, export_wrappers);
-}
-
-// static
-Handle<WasmModuleObject> WasmModuleObject::New(
-    Isolate* isolate, std::shared_ptr<wasm::NativeModule> native_module,
-    Handle<Script> script, Handle<FixedArray> export_wrappers) {
   Handle<Managed<wasm::NativeModule>> managed_native_module;
   if (script->type() == Script::TYPE_WASM) {
     managed_native_module = handle(
@@ -79,7 +71,6 @@ Handle<WasmModuleObject> WasmModuleObject::New(
   }
   Handle<WasmModuleObject> module_object = Handle<WasmModuleObject>::cast(
       isolate->factory()->NewJSObject(isolate->wasm_module_constructor()));
-  module_object->set_export_wrappers(*export_wrappers);
   module_object->set_managed_native_module(*managed_native_module);
   module_object->set_script(*script);
   return module_object;
@@ -462,24 +453,8 @@ void WasmTableObject::UpdateDispatchTables(Isolate* isolate,
         Smi::cast(dispatch_tables.get(i + kDispatchTableIndexOffset)).value();
     WasmInstanceObject instance = WasmInstanceObject::cast(
         dispatch_tables.get(i + kDispatchTableInstanceOffset));
-    const WasmModule* module = instance.module();
-    int sig_id;
-    if (v8_flags.wasm_type_canonicalization) {
-      sig_id = target_instance.module()
-                   ->isorecursive_canonical_type_ids[original_sig_id];
-    } else {
-      // Try to avoid the signature map lookup by checking if the signature in
-      // {module} at {original_sig_id} matches {func->sig}.
-      if (module->has_signature(original_sig_id) &&
-          *module->signature(original_sig_id) == *func->sig) {
-        sig_id = module->per_module_canonical_type_ids[original_sig_id];
-        DCHECK_EQ(sig_id, module->signature_map.Find(*func->sig));
-      } else {
-        // Note that {SignatureMap::Find} may return {-1} if the signature is
-        // not found; it will simply never match any check.
-        sig_id = module->signature_map.Find(*func->sig);
-      }
-    }
+    int sig_id = target_instance.module()
+                     ->isorecursive_canonical_type_ids[original_sig_id];
     WasmIndirectFunctionTable ift = WasmIndirectFunctionTable::cast(
         instance.indirect_function_tables().get(table_index));
     ift.Set(entry_index, sig_id, call_target, call_ref);
@@ -548,14 +523,16 @@ void WasmTableObject::UpdateDispatchTables(
         instance->module_object().native_module();
     wasm::WasmImportWrapperCache* cache = native_module->import_wrapper_cache();
     auto kind = compiler::WasmImportCallKind::kWasmToCapi;
-    wasm::WasmCode* wasm_code =
-        cache->MaybeGet(kind, &sig, param_count, wasm::kNoSuspend);
+    uint32_t canonical_type_index =
+        wasm::GetTypeCanonicalizer()->AddRecursiveGroup(&sig);
+    wasm::WasmCode* wasm_code = cache->MaybeGet(kind, canonical_type_index,
+                                                param_count, wasm::kNoSuspend);
     if (wasm_code == nullptr) {
       wasm::WasmCodeRefScope code_ref_scope;
       wasm::WasmImportWrapperCache::ModificationScope cache_scope(cache);
       wasm_code = compiler::CompileWasmCapiCallWrapper(native_module, &sig);
-      wasm::WasmImportWrapperCache::CacheKey key(kind, &sig, param_count,
-                                                 wasm::kNoSuspend);
+      wasm::WasmImportWrapperCache::CacheKey key(kind, canonical_type_index,
+                                                 param_count, wasm::kNoSuspend);
       cache_scope[key] = wasm_code;
       wasm_code->IncRef();
       isolate->counters()->wasm_generated_code_size()->Increment(
@@ -563,13 +540,8 @@ void WasmTableObject::UpdateDispatchTables(
       isolate->counters()->wasm_reloc_size()->Increment(
           wasm_code->reloc_info().length());
     }
-    // Note that {SignatureMap::Find} may return {-1} if the signature is
-    // not found; it will simply never match any check.
-    // It is safe to use this even when v8_flags.wasm_type_canonicalization, as
-    // the C API cannot refer to user-defined types.
-    auto sig_id = instance->module()->signature_map.Find(sig);
     instance->GetIndirectFunctionTable(isolate, table_index)
-        ->Set(entry_index, sig_id, wasm_code->instruction_start(),
+        ->Set(entry_index, canonical_type_index, wasm_code->instruction_start(),
               WasmCapiFunctionData::cast(
                   capi_function->shared().function_data(kAcquireLoad))
                   .internal()
@@ -1379,25 +1351,30 @@ WasmInstanceObject::GetOrCreateWasmInternalFunction(
   Handle<WasmModuleObject> module_object(instance->module_object(), isolate);
   const WasmModule* module = module_object->module();
   const WasmFunction& function = module->functions[function_index];
+  uint32_t canonical_sig_index =
+      module->isorecursive_canonical_type_ids[function.sig_index];
+  isolate->heap()->EnsureWasmCanonicalRttsSize(canonical_sig_index + 1);
   int wrapper_index =
-      GetExportWrapperIndex(module, function.sig_index, function.imported);
-  DCHECK_EQ(wrapper_index,
-            GetExportWrapperIndex(module, function.sig, function.imported));
+      wasm::GetExportWrapperIndex(canonical_sig_index, function.imported);
 
-  Handle<Object> entry =
-      FixedArray::get(module_object->export_wrappers(), wrapper_index, isolate);
+  MaybeObject entry = isolate->heap()->js_to_wasm_wrappers().Get(wrapper_index);
 
   Handle<CodeT> wrapper;
-  if (entry->IsCodeT()) {
-    wrapper = Handle<CodeT>::cast(entry);
+  // {entry} can be cleared, {undefined}, or a ready {CodeT}.
+  if (entry.IsStrongOrWeak() && entry.GetHeapObject().IsCodeT()) {
+    wrapper = handle(CodeT::cast(entry.GetHeapObject()), isolate);
   } else {
     // The wrapper may not exist yet if no function in the exports section has
     // this signature. We compile it and store the wrapper in the module for
     // later use.
     wrapper = wasm::JSToWasmWrapperCompilationUnit::CompileJSToWasmWrapper(
-        isolate, function.sig, instance->module(), function.imported);
-    module_object->export_wrappers().set(wrapper_index, *wrapper);
+        isolate, function.sig, canonical_sig_index, instance->module(),
+        function.imported);
   }
+  // Store the wrapper in the isolate, or make its reference weak now that we
+  // have a function referencing it.
+  isolate->heap()->js_to_wasm_wrappers().Set(
+      wrapper_index, HeapObjectReference::Weak(*wrapper));
   auto external = Handle<WasmExternalFunction>::cast(WasmExportedFunction::New(
       isolate, instance, function_index,
       static_cast<int>(function.sig->parameter_count()), wrapper));
@@ -1434,16 +1411,26 @@ void WasmInstanceObject::ImportWasmJSFunctionIntoTable(
   // not found; it will simply never match any check.
   Zone zone(isolate->allocator(), ZONE_NAME);
   const wasm::FunctionSig* sig = js_function->GetSignature(&zone);
-  // It is safe to look up the signature this way even if
-  // v8_flags.wasm_type_canonicalization: Signatures created in the JS API
-  // cannot contain user-defined (module-dependent) types.
-  auto sig_id = instance->module()->signature_map.Find(*sig);
+  // Get the function's canonical signature index. Note that the function's
+  // signature may not be present in the importing module.
+  uint32_t canonical_sig_index =
+      wasm::GetTypeCanonicalizer()->AddRecursiveGroup(sig);
 
   // Compile a wrapper for the target callable.
   Handle<JSReceiver> callable(js_function->GetCallable(), isolate);
+  wasm::Suspend suspend = js_function->GetSuspend();
   wasm::WasmCodeRefScope code_ref_scope;
   Address call_target = kNullAddress;
-  if (sig_id >= 0) {
+
+  auto module_canonical_ids =
+      instance->module()->isorecursive_canonical_type_ids;
+  // TODO(manoskouk): Consider adding a set of canonical indices to the module
+  // to avoid this linear search.
+  auto sig_in_module =
+      std::find(module_canonical_ids.begin(), module_canonical_ids.end(),
+                canonical_sig_index);
+
+  if (sig_in_module != module_canonical_ids.end()) {
     wasm::NativeModule* native_module =
         instance->module_object().native_module();
     // TODO(wasm): Cache and reuse wrapper code, to avoid repeated compilation
@@ -1464,7 +1451,7 @@ void WasmInstanceObject::ImportWasmJSFunctionIntoTable(
     }
     // TODO(manoskouk): Reuse js_function->wasm_to_js_wrapper_code().
     wasm::WasmCompilationResult result = compiler::CompileWasmImportCallWrapper(
-        &env, kind, sig, false, expected_arity, resolved.suspend);
+        &env, kind, sig, false, expected_arity, suspend);
     wasm::CodeSpaceWriteScope write_scope(native_module);
     std::unique_ptr<wasm::WasmCode> wasm_code = native_module->AddCode(
         result.func_index, result.code_desc, result.frame_slot_count,
@@ -1482,17 +1469,12 @@ void WasmInstanceObject::ImportWasmJSFunctionIntoTable(
   }
 
   // Update the dispatch table.
-  wasm::Suspend suspend = js_function->GetSuspend();
   Handle<WasmApiFunctionRef> ref =
       isolate->factory()->NewWasmApiFunctionRef(callable, suspend, instance);
-  uint32_t canonicalized_sig_id =
-      v8_flags.wasm_type_canonicalization && sig_id >= 0
-          ? instance->module()->isorecursive_canonical_type_ids[sig_id]
-          : sig_id;
 
   WasmIndirectFunctionTable::cast(
       instance->indirect_function_tables().get(table_index))
-      .Set(entry_index, canonicalized_sig_id, call_target, *ref);
+      .Set(entry_index, canonical_sig_index, call_target, *ref);
 }
 
 // static
@@ -1572,8 +1554,6 @@ wasm::WasmValue WasmStruct::GetFieldValue(uint32_t index) {
       return wasm::WasmValue(ref, field_type);
     }
     case wasm::kRtt:
-      // TODO(7748): Expose RTTs to DevTools.
-      UNIMPLEMENTED();
     case wasm::kVoid:
     case wasm::kBottom:
       UNREACHABLE();
@@ -1601,8 +1581,6 @@ wasm::WasmValue WasmArray::GetElement(uint32_t index) {
       return wasm::WasmValue(ref, element_type);
     }
     case wasm::kRtt:
-      // TODO(7748): Expose RTTs to DevTools.
-      UNIMPLEMENTED();
     case wasm::kVoid:
     case wasm::kBottom:
       UNREACHABLE();
@@ -2219,7 +2197,7 @@ Handle<WasmExceptionTag> WasmExceptionTag::New(Isolate* isolate, int index) {
 
 Handle<AsmWasmData> AsmWasmData::New(
     Isolate* isolate, std::shared_ptr<wasm::NativeModule> native_module,
-    Handle<FixedArray> export_wrappers, Handle<HeapNumber> uses_bitset) {
+    Handle<HeapNumber> uses_bitset) {
   const WasmModule* module = native_module->module();
   const bool kUsesLiftoff = false;
   size_t memory_estimate =
@@ -2232,7 +2210,6 @@ Handle<AsmWasmData> AsmWasmData::New(
   Handle<AsmWasmData> result = Handle<AsmWasmData>::cast(
       isolate->factory()->NewStruct(ASM_WASM_DATA_TYPE, AllocationType::kOld));
   result->set_managed_native_module(*managed_native_module);
-  result->set_export_wrappers(*export_wrappers);
   result->set_uses_bitset(*uses_bitset);
   return result;
 }
diff --git a/deps/v8/src/wasm/wasm-objects.h b/deps/v8/src/wasm/wasm-objects.h
index 18f5ec09d8ff8b..a81a23fe2fcb18 100644
--- a/deps/v8/src/wasm/wasm-objects.h
+++ b/deps/v8/src/wasm/wasm-objects.h
@@ -2,7 +2,6 @@
 // this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "src/base/bit-field.h"
 #if !V8_ENABLE_WEBASSEMBLY
 #error This header should only be included if WebAssembly is enabled.
 #endif  // !V8_ENABLE_WEBASSEMBLY
@@ -12,6 +11,7 @@
 
 #include <memory>
 
+#include "src/base/bit-field.h"
 #include "src/debug/interface-types.h"
 #include "src/objects/foreign.h"
 #include "src/objects/js-function.h"
@@ -133,9 +133,6 @@ class WasmModuleObject
   V8_EXPORT_PRIVATE static Handle<WasmModuleObject> New(
       Isolate* isolate, std::shared_ptr<wasm::NativeModule> native_module,
       Handle<Script> script);
-  V8_EXPORT_PRIVATE static Handle<WasmModuleObject> New(
-      Isolate* isolate, std::shared_ptr<wasm::NativeModule> native_module,
-      Handle<Script> script, Handle<FixedArray> export_wrappers);
 
   // Check whether this module was generated from asm.js source.
   inline bool is_asm_js();
@@ -899,7 +896,7 @@ class AsmWasmData : public TorqueGeneratedAsmWasmData<AsmWasmData, Struct> {
  public:
   static Handle<AsmWasmData> New(
       Isolate* isolate, std::shared_ptr<wasm::NativeModule> native_module,
-      Handle<FixedArray> export_wrappers, Handle<HeapNumber> uses_bitset);
+      Handle<HeapNumber> uses_bitset);
 
   DECL_PRINTER(AsmWasmData)
 
@@ -1003,7 +1000,7 @@ class WasmArray : public TorqueGeneratedWasmArray<WasmArray, WasmObject> {
   inline uint32_t element_offset(uint32_t index);
   inline Address ElementAddress(uint32_t index);
 
-  static int MaxLength(uint32_t element_size_bytes) {
+  static constexpr int MaxLength(uint32_t element_size_bytes) {
     // The total object size must fit into a Smi, for filler objects. To make
     // the behavior of Wasm programs independent from the Smi configuration,
     // we hard-code the smaller of the two supported ranges.
diff --git a/deps/v8/src/wasm/wasm-objects.tq b/deps/v8/src/wasm/wasm-objects.tq
index 55a7e7458da740..3607621bbfd334 100644
--- a/deps/v8/src/wasm/wasm-objects.tq
+++ b/deps/v8/src/wasm/wasm-objects.tq
@@ -77,11 +77,13 @@ extern class WasmExportedFunctionData extends WasmFunctionData {
 extern class WasmJSFunctionData extends WasmFunctionData {
   serialized_return_count: Smi;
   serialized_parameter_count: Smi;
+  // TODO(7748): Maybe store the canonical type index of the signature instead.
   serialized_signature: PodArrayOfWasmValueType;
 }
 
 extern class WasmCapiFunctionData extends WasmFunctionData {
   embedder_data: Foreign;  // Managed<wasm::FuncData>
+  // TODO(7748): Maybe store the canonical type index of the signature instead.
   serialized_signature: PodArrayOfWasmValueType;
 }
 
@@ -125,7 +127,6 @@ extern class WasmExceptionPackage extends JSObject;
 
 extern class WasmModuleObject extends JSObject {
   managed_native_module: ManagedWasmNativeModule;
-  export_wrappers: FixedArray;
   script: Script;
 }
 
@@ -175,7 +176,6 @@ type WasmExportedFunction extends JSFunction;
 
 extern class AsmWasmData extends Struct {
   managed_native_module: ManagedWasmNativeModule;
-  export_wrappers: FixedArray;
   uses_bitset: HeapNumber;
 }
 
diff --git a/deps/v8/src/wasm/wasm-opcodes.cc b/deps/v8/src/wasm/wasm-opcodes.cc
index 2e8f36ce313200..cda2c11721f8bf 100644
--- a/deps/v8/src/wasm/wasm-opcodes.cc
+++ b/deps/v8/src/wasm/wasm-opcodes.cc
@@ -36,8 +36,8 @@ std::ostream& operator<<(std::ostream& os, const FunctionSig& sig) {
 bool IsJSCompatibleSignature(const FunctionSig* sig, const WasmModule* module,
                              const WasmFeatures& enabled_features) {
   for (auto type : sig->all()) {
-    // TODO(7748): Allow structs, arrays, and rtts when their JS-interaction is
-    // decided on.
+    // Structs and arrays may only be passed via externref.
+    // Rtts are implicit and can not be used explicitly.
     if (type == kWasmS128 || type.is_rtt() ||
         (type.has_index() && !module->has_signature(type.ref_index()))) {
       return false;
diff --git a/deps/v8/src/wasm/wasm-opcodes.h b/deps/v8/src/wasm/wasm-opcodes.h
index 0140dead2fac53..7d4c80d0b86642 100644
--- a/deps/v8/src/wasm/wasm-opcodes.h
+++ b/deps/v8/src/wasm/wasm-opcodes.h
@@ -707,11 +707,13 @@ bool V8_EXPORT_PRIVATE IsJSCompatibleSignature(const FunctionSig* sig,
   V(I31New, 0xfb20, _, "i31.new")                                              \
   V(I31GetS, 0xfb21, _, "i31.get_s")                                           \
   V(I31GetU, 0xfb22, _, "i31.get_u")                                           \
-  V(RefTest, 0xfb44, _, "ref.test")                                            \
+  V(RefTest, 0xfb40, _, "ref.test")                                            \
+  V(RefTestNull, 0xfb48, _, "ref.test null")                                   \
+  V(RefTestDeprecated, 0xfb44, _, "ref.test")                                  \
   V(RefCast, 0xfb45, _, "ref.cast")                                            \
   V(BrOnCast, 0xfb46, _, "br_on_cast")                                         \
   V(BrOnCastFail, 0xfb47, _, "br_on_cast_fail")                                \
-  V(RefCastNop, 0xfb48, _, "ref.cast_nop")                                     \
+  V(RefCastNop, 0xfb4c, _, "ref.cast_nop")                                     \
   V(RefIsData, 0xfb51, _, "ref.is_data")                                       \
   V(RefIsI31, 0xfb52, _, "ref.is_i31")                                         \
   V(RefIsArray, 0xfb53, _, "ref.is_array")                                     \
diff --git a/deps/v8/src/wasm/wasm-serialization.cc b/deps/v8/src/wasm/wasm-serialization.cc
index 1b8064da1fffa6..8d6adeec0096d6 100644
--- a/deps/v8/src/wasm/wasm-serialization.cc
+++ b/deps/v8/src/wasm/wasm-serialization.cc
@@ -900,14 +900,10 @@ MaybeHandle<WasmModuleObject> DeserializeNativeModule(
     wasm_engine->UpdateNativeModuleCache(error, &shared_native_module, isolate);
   }
 
-  Handle<FixedArray> export_wrappers;
-  CompileJsToWasmWrappers(isolate, shared_native_module->module(),
-                          &export_wrappers);
-
   Handle<Script> script =
       wasm_engine->GetOrCreateScript(isolate, shared_native_module, source_url);
-  Handle<WasmModuleObject> module_object = WasmModuleObject::New(
-      isolate, shared_native_module, script, export_wrappers);
+  Handle<WasmModuleObject> module_object =
+      WasmModuleObject::New(isolate, shared_native_module, script);
 
   // Finish the Wasm script now and make it public to the debugger.
   isolate->debug()->OnAfterCompile(script);
diff --git a/deps/v8/src/wasm/wasm-subtyping.cc b/deps/v8/src/wasm/wasm-subtyping.cc
index 2e9a8f7043fb3e..8cc6ba872ff883 100644
--- a/deps/v8/src/wasm/wasm-subtyping.cc
+++ b/deps/v8/src/wasm/wasm-subtyping.cc
@@ -17,7 +17,6 @@ V8_INLINE bool EquivalentIndices(uint32_t index1, uint32_t index2,
                                  const WasmModule* module1,
                                  const WasmModule* module2) {
   DCHECK(index1 != index2 || module1 != module2);
-  if (!v8_flags.wasm_type_canonicalization) return false;
   return module1->isorecursive_canonical_type_ids[index1] ==
          module2->isorecursive_canonical_type_ids[index2];
 }
@@ -99,8 +98,9 @@ bool ValidFunctionSubtypeDefinition(uint32_t subtype_index,
   return true;
 }
 
-HeapType::Representation NullSentinelImpl(TypeInModule type) {
-  switch (type.type.heap_type().representation()) {
+HeapType::Representation NullSentinelImpl(HeapType type,
+                                          const WasmModule* module) {
+  switch (type.representation()) {
     case HeapType::kI31:
     case HeapType::kNone:
     case HeapType::kEq:
@@ -119,9 +119,8 @@ HeapType::Representation NullSentinelImpl(TypeInModule type) {
     case HeapType::kNoFunc:
       return HeapType::kNoFunc;
     default:
-      return type.module->has_signature(type.type.ref_index())
-                 ? HeapType::kNoFunc
-                 : HeapType::kNone;
+      return module->has_signature(type.ref_index()) ? HeapType::kNoFunc
+                                                     : HeapType::kNone;
   }
 }
 
@@ -289,19 +288,8 @@ V8_NOINLINE V8_EXPORT_PRIVATE bool IsHeapSubtypeOfImpl(
   // The {IsSubtypeOf} entry point already has a fast path checking ValueType
   // equality; here we catch (ref $x) being a subtype of (ref null $x).
   if (sub_module == super_module && sub_index == super_index) return true;
-
-  if (v8_flags.wasm_type_canonicalization) {
-    return GetTypeCanonicalizer()->IsCanonicalSubtype(sub_index, super_index,
-                                                      sub_module, super_module);
-  } else {
-    uint32_t explicit_super = sub_module->supertype(sub_index);
-    while (true) {
-      if (explicit_super == super_index) return true;
-      // Reached the end of the explicitly defined inheritance chain.
-      if (explicit_super == kNoSuperType) return false;
-      explicit_super = sub_module->supertype(explicit_super);
-    }
-  }
+  return GetTypeCanonicalizer()->IsCanonicalSubtype(sub_index, super_index,
+                                                    sub_module, super_module);
 }
 
 V8_NOINLINE bool EquivalentTypes(ValueType type1, ValueType type2,
@@ -555,12 +543,18 @@ TypeInModule Intersection(ValueType type1, ValueType type2,
 }
 
 ValueType ToNullSentinel(TypeInModule type) {
-  HeapType::Representation null_heap = NullSentinelImpl(type);
+  HeapType::Representation null_heap =
+      NullSentinelImpl(type.type.heap_type(), type.module);
   DCHECK(
       IsHeapSubtypeOf(HeapType(null_heap), type.type.heap_type(), type.module));
   return ValueType::RefNull(null_heap);
 }
 
+bool IsSameTypeHierarchy(HeapType type1, HeapType type2,
+                         const WasmModule* module) {
+  return NullSentinelImpl(type1, module) == NullSentinelImpl(type2, module);
+}
+
 }  // namespace wasm
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/wasm/wasm-subtyping.h b/deps/v8/src/wasm/wasm-subtyping.h
index 670fc00916a183..07630118c2f5c0 100644
--- a/deps/v8/src/wasm/wasm-subtyping.h
+++ b/deps/v8/src/wasm/wasm-subtyping.h
@@ -47,19 +47,26 @@ V8_NOINLINE V8_EXPORT_PRIVATE bool EquivalentTypes(ValueType type1,
 // - (ref ht1) <: (ref null? ht2) iff ht1 <: ht2.
 // - rtt1 <: rtt2 iff rtt1 ~ rtt2.
 // For heap types, the following subtyping rules hold:
-// - The abstract heap types form the following type hierarchy:
-//      any (a.k.a. extern)
-//            /   \
-//           eq   func
+// - The abstract heap types form the following type hierarchies:
+//   TODO(7748): abstract ref.data should become ref.struct.
+//
+//           any              func         extern
+//            |                |             |
+//           eq              nofunc       noextern
 //          /  \
 //        i31   data
-//               |
-//             array
+//         |     |
+//         |   array
+//          \   /
+//          none
+//
 // - All functions are subtypes of func.
 // - All structs are subtypes of data.
 // - All arrays are subtypes of array.
 // - An indexed heap type h1 is a subtype of indexed heap type h2 if h2 is
 //   transitively an explicit canonical supertype of h1.
+// Note that {any} includes references introduced by the host which belong to
+// none of any's subtypes (e.g. JS objects).
 V8_INLINE bool IsSubtypeOf(ValueType subtype, ValueType supertype,
                            const WasmModule* sub_module,
                            const WasmModule* super_module) {
@@ -156,6 +163,10 @@ V8_INLINE V8_EXPORT_PRIVATE TypeInModule Intersection(TypeInModule type1,
 // Returns the matching abstract null type (none, nofunc, noextern).
 ValueType ToNullSentinel(TypeInModule type);
 
+// Returns if two types share the same type hierarchy (any, extern, funcref).
+bool IsSameTypeHierarchy(HeapType type1, HeapType type2,
+                         const WasmModule* module);
+
 }  // namespace wasm
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/src/web-snapshot/web-snapshot.cc b/deps/v8/src/web-snapshot/web-snapshot.cc
index f2f91ee47cde00..3a8a97a8c5388f 100644
--- a/deps/v8/src/web-snapshot/web-snapshot.cc
+++ b/deps/v8/src/web-snapshot/web-snapshot.cc
@@ -1592,7 +1592,28 @@ void WebSnapshotSerializer::SerializeObject(Handle<JSObject> object) {
   }
 
   // Elements.
-  SerializeElements(object, object_serializer_);
+  ElementsKind kind = object->GetElementsKind();
+  // We only serialize the actual elements excluding the slack part.
+  DCHECK(!IsDoubleElementsKind(kind));
+  if (!IsDictionaryElementsKind(kind)) {
+    uint32_t elements_length = object->elements().length();
+    if (IsHoleyElementsKindForRead(kind)) {
+      uint32_t max_element_index = 0;
+      FixedArray elements = FixedArray::cast(object->elements());
+      for (int i = elements_length - 1; i >= 0; i--) {
+        if (!elements.is_the_hole(isolate_, i)) {
+          max_element_index = i + 1;
+          break;
+        }
+      }
+      return SerializeElements(object, object_serializer_,
+                               Just(max_element_index));
+    } else {
+      return SerializeElements(object, object_serializer_,
+                               Just(elements_length));
+    }
+  }
+  SerializeElements(object, object_serializer_, Nothing<uint32_t>());
 }
 
 // Format (serialized array):
@@ -1606,11 +1627,17 @@ void WebSnapshotSerializer::SerializeObject(Handle<JSObject> object) {
 //     - Element index
 //     - Serialized value
 void WebSnapshotSerializer::SerializeArray(Handle<JSArray> array) {
-  SerializeElements(array, array_serializer_);
+  uint32_t length;
+  if (!array->length().ToUint32(&length)) {
+    Throw("Invalid array length");
+    return;
+  }
+  SerializeElements(array, array_serializer_, Just(length));
 }
 
 void WebSnapshotSerializer::SerializeElements(Handle<JSObject> object,
-                                              ValueSerializer& serializer) {
+                                              ValueSerializer& serializer,
+                                              Maybe<uint32_t> length) {
   // TODO(v8:11525): Handle sealed & frozen elements correctly. (Also: handle
   // sealed & frozen objects.)
 
@@ -1634,9 +1661,8 @@ void WebSnapshotSerializer::SerializeElements(Handle<JSObject> object,
       serializer.WriteUint32(ElementsType::kDense);
       Handle<FixedArray> elements =
           handle(FixedArray::cast(object->elements()), isolate_);
-      uint32_t length = static_cast<uint32_t>(elements->length());
-      serializer.WriteUint32(length);
-      for (uint32_t i = 0; i < length; ++i) {
+      serializer.WriteUint32(length.ToChecked());
+      for (uint32_t i = 0; i < length.ToChecked(); ++i) {
         WriteValue(handle(elements->get(i), isolate_), serializer);
       }
       break;
@@ -1646,9 +1672,8 @@ void WebSnapshotSerializer::SerializeElements(Handle<JSObject> object,
       serializer.WriteUint32(ElementsType::kDense);
       Handle<FixedDoubleArray> elements =
           handle(FixedDoubleArray::cast(object->elements()), isolate_);
-      uint32_t length = static_cast<uint32_t>(elements->length());
-      serializer.WriteUint32(length);
-      for (uint32_t i = 0; i < length; ++i) {
+      serializer.WriteUint32(length.ToChecked());
+      for (uint32_t i = 0; i < length.ToChecked(); ++i) {
         if (!elements->is_the_hole(i)) {
           double double_value = elements->get_scalar(i);
           Handle<Object> element_value =
@@ -1692,7 +1717,7 @@ uint8_t WebSnapshotSerializerDeserializer::ArrayBufferKindToFlags(
     Handle<JSArrayBuffer> array_buffer) {
   return DetachedBitField::encode(array_buffer->was_detached()) |
          SharedBitField::encode(array_buffer->is_shared()) |
-         ResizableBitField::encode(array_buffer->is_resizable());
+         ResizableBitField::encode(array_buffer->is_resizable_by_js());
 }
 
 uint32_t WebSnapshotSerializerDeserializer::BigIntSignAndLengthToFlags(
@@ -1714,9 +1739,9 @@ uint32_t WebSnapshotSerializerDeserializer::BigIntFlagsToBitField(
 }
 
 // Format (serialized array buffer):
-// - ArrayBufferFlags, including was_detached, is_shared and is_resizable.
+// - ArrayBufferFlags, including was_detached, is_shared and is_resizable_by_js.
 // - Byte length
-// - if is_resizable
+// - if is_resizable_by_js
 //   - Max byte length
 // - Raw bytes
 void WebSnapshotSerializer::SerializeArrayBuffer(
@@ -1729,7 +1754,7 @@ void WebSnapshotSerializer::SerializeArrayBuffer(
   array_buffer_serializer_.WriteByte(ArrayBufferKindToFlags(array_buffer));
 
   array_buffer_serializer_.WriteUint32(static_cast<uint32_t>(byte_length));
-  if (array_buffer->is_resizable()) {
+  if (array_buffer->is_resizable_by_js()) {
     size_t max_byte_length = array_buffer->max_byte_length();
     if (max_byte_length > std::numeric_limits<uint32_t>::max()) {
       Throw("Too large resizable array buffer");
@@ -2269,7 +2294,7 @@ bool WebSnapshotDeserializer::Deserialize(
   auto buffer_size = deserializer_->end_ - deserializer_->position_;
 
   base::ElapsedTimer timer;
-  if (FLAG_trace_web_snapshot) {
+  if (v8_flags.trace_web_snapshot) {
     timer.Start();
   }
   if (!DeserializeSnapshot(skip_exports)) {
@@ -2279,7 +2304,7 @@ bool WebSnapshotDeserializer::Deserialize(
     return false;
   }
 
-  if (FLAG_trace_web_snapshot) {
+  if (v8_flags.trace_web_snapshot) {
     double ms = timer.Elapsed().InMillisecondsF();
     PrintF("[Deserializing snapshot (%zu bytes) took %0.3f ms]\n", buffer_size,
            ms);
@@ -2359,7 +2384,7 @@ bool WebSnapshotDeserializer::DeserializeSnapshot(bool skip_exports) {
 
 #ifdef VERIFY_HEAP
   // Verify the objects we produced during deserializing snapshot.
-  if (FLAG_verify_heap && !has_error()) {
+  if (v8_flags.verify_heap && !has_error()) {
     VerifyObjects();
   }
 #endif
@@ -3614,7 +3639,7 @@ void WebSnapshotDeserializer::DeserializeDataViews() {
     bool is_length_tracking = LengthTrackingBitField::decode(flags);
 
     if (is_length_tracking) {
-      CHECK(array_buffer->is_resizable());
+      CHECK(array_buffer->is_resizable_by_js());
     } else {
       if (!deserializer_->ReadUint32(&byte_length)) {
         Throw("Malformed data view");
@@ -3636,7 +3661,7 @@ void WebSnapshotDeserializer::DeserializeDataViews() {
                         byte_offset);
       raw_data_view.set_is_length_tracking(is_length_tracking);
       raw_data_view.set_is_backed_by_rab(!raw_array_buffer.is_shared() &&
-                                         raw_array_buffer.is_resizable());
+                                         raw_array_buffer.is_resizable_by_js());
     }
 
     data_views_.set(static_cast<int>(current_data_view_count_), *data_view);
@@ -3700,7 +3725,7 @@ void WebSnapshotDeserializer::DeserializeTypedArrays() {
     bool is_length_tracking = LengthTrackingBitField::decode(flags);
 
     if (is_length_tracking) {
-      CHECK(array_buffer->is_resizable());
+      CHECK(array_buffer->is_resizable_by_js());
     } else {
       if (!deserializer_->ReadUint32(&byte_length)) {
         Throw("Malformed typed array");
@@ -3717,7 +3742,7 @@ void WebSnapshotDeserializer::DeserializeTypedArrays() {
       }
     }
 
-    bool rabGsab = array_buffer->is_resizable() &&
+    bool rabGsab = array_buffer->is_resizable_by_js() &&
                    (!array_buffer->is_shared() || is_length_tracking);
     if (rabGsab) {
       map = handle(
@@ -3738,7 +3763,7 @@ void WebSnapshotDeserializer::DeserializeTypedArrays() {
       raw.SetOffHeapDataPtr(isolate_, array_buffer->backing_store(),
                             byte_offset);
       raw.set_is_length_tracking(is_length_tracking);
-      raw.set_is_backed_by_rab(array_buffer->is_resizable() &&
+      raw.set_is_backed_by_rab(array_buffer->is_resizable_by_js() &&
                                !array_buffer->is_shared());
     }
 
@@ -3766,7 +3791,7 @@ void WebSnapshotDeserializer::DeserializeExports(bool skip_exports) {
       // have been deserialized.
       Object export_value = std::get<0>(ReadValue());
 #ifdef VERIFY_HEAP
-      if (FLAG_verify_heap) {
+      if (v8_flags.verify_heap) {
         export_value.ObjectVerify(isolate_);
       }
 #endif
@@ -3797,7 +3822,7 @@ void WebSnapshotDeserializer::DeserializeExports(bool skip_exports) {
     // been deserialized.
     Object export_value = std::get<0>(ReadValue());
 #ifdef VERIFY_HEAP
-    if (FLAG_verify_heap) {
+    if (v8_flags.verify_heap) {
       export_value.ObjectVerify(isolate_);
     }
 #endif
diff --git a/deps/v8/src/web-snapshot/web-snapshot.h b/deps/v8/src/web-snapshot/web-snapshot.h
index b96efeb0f07f93..1de4efa46b3844 100644
--- a/deps/v8/src/web-snapshot/web-snapshot.h
+++ b/deps/v8/src/web-snapshot/web-snapshot.h
@@ -314,7 +314,8 @@ class V8_EXPORT WebSnapshotSerializer
   void SerializeClass(Handle<JSFunction> function);
   void SerializeContext(Handle<Context> context, uint32_t id);
   void SerializeArray(Handle<JSArray> array);
-  void SerializeElements(Handle<JSObject> object, ValueSerializer& serializer);
+  void SerializeElements(Handle<JSObject> object, ValueSerializer& serializer,
+                         Maybe<uint32_t> length);
   void SerializeObject(Handle<JSObject> object);
   void SerializeArrayBufferView(Handle<JSArrayBufferView> array_buffer_view,
                                 ValueSerializer& serializer);
diff --git a/deps/v8/test/cctest/BUILD.gn b/deps/v8/test/cctest/BUILD.gn
index 0ab437883cff65..22d660104b1c72 100644
--- a/deps/v8/test/cctest/BUILD.gn
+++ b/deps/v8/test/cctest/BUILD.gn
@@ -116,7 +116,6 @@ v8_source_set("cctest_sources") {
     "compiler/test-node.cc",
     "compiler/test-operator.cc",
     "compiler/test-representation-change.cc",
-    "compiler/test-run-bytecode-graph-builder.cc",
     "compiler/test-run-calls-to-external-references.cc",
     "compiler/test-run-load-store.cc",
     "compiler/test-run-machops.cc",
diff --git a/deps/v8/test/cctest/assembler-helper-arm.cc b/deps/v8/test/cctest/assembler-helper-arm.cc
index ca4041dc7235a4..698005fd9eba74 100644
--- a/deps/v8/test/cctest/assembler-helper-arm.cc
+++ b/deps/v8/test/cctest/assembler-helper-arm.cc
@@ -21,7 +21,7 @@ Handle<Code> AssembleCodeImpl(Isolate* isolate,
   assm.GetCode(isolate, &desc);
   Handle<Code> code =
       Factory::CodeBuilder(isolate, desc, CodeKind::FOR_TESTING).Build();
-  if (FLAG_print_code) {
+  if (v8_flags.print_code) {
     code->Print();
   }
   return code;
diff --git a/deps/v8/test/cctest/cctest.cc b/deps/v8/test/cctest/cctest.cc
index b5d15c53a0e9da..fddcdd3df313f2 100644
--- a/deps/v8/test/cctest/cctest.cc
+++ b/deps/v8/test/cctest/cctest.cc
@@ -122,7 +122,7 @@ void CcTest::Run(const char* snapshot_directory) {
 
   // Allow changing flags in cctests.
   // TODO(12887): Fix tests to avoid changing flag values after initialization.
-  i::FLAG_freeze_flags_after_init = false;
+  i::v8_flags.freeze_flags_after_init = false;
 
   v8::V8::Initialize();
   v8::V8::InitializeExternalStartupData(snapshot_directory);
@@ -221,7 +221,8 @@ void CcTest::PreciseCollectAllGarbage(i::Isolate* isolate) {
 
 void CcTest::CollectSharedGarbage(i::Isolate* isolate) {
   i::Isolate* iso = isolate ? isolate : i_isolate();
-  iso->heap()->CollectSharedGarbage(i::GarbageCollectionReason::kTesting);
+  iso->heap()->CollectGarbageShared(iso->main_thread_local_heap(),
+                                    i::GarbageCollectionReason::kTesting);
 }
 
 i::Handle<i::String> CcTest::MakeString(const char* str) {
@@ -435,13 +436,18 @@ bool IsValidUnwrapObject(v8::Object* object) {
 }
 
 ManualGCScope::ManualGCScope(i::Isolate* isolate)
-    : flag_concurrent_marking_(i::FLAG_concurrent_marking),
-      flag_concurrent_sweeping_(i::FLAG_concurrent_sweeping),
-      flag_stress_concurrent_allocation_(i::FLAG_stress_concurrent_allocation),
-      flag_stress_incremental_marking_(i::FLAG_stress_incremental_marking),
-      flag_parallel_marking_(i::FLAG_parallel_marking),
+    : flag_concurrent_marking_(i::v8_flags.concurrent_marking),
+      flag_concurrent_sweeping_(i::v8_flags.concurrent_sweeping),
+      flag_concurrent_minor_mc_marking_(
+          i::v8_flags.concurrent_minor_mc_marking),
+      flag_concurrent_minor_mc_sweeping_(
+          i::v8_flags.concurrent_minor_mc_sweeping),
+      flag_stress_concurrent_allocation_(
+          i::v8_flags.stress_concurrent_allocation),
+      flag_stress_incremental_marking_(i::v8_flags.stress_incremental_marking),
+      flag_parallel_marking_(i::v8_flags.parallel_marking),
       flag_detect_ineffective_gcs_near_heap_limit_(
-          i::FLAG_detect_ineffective_gcs_near_heap_limit) {
+          i::v8_flags.detect_ineffective_gcs_near_heap_limit) {
   // Some tests run threaded (back-to-back) and thus the GC may already be
   // running by the time a ManualGCScope is created. Finalizing existing marking
   // prevents any undefined/unexpected behavior.
@@ -449,22 +455,26 @@ ManualGCScope::ManualGCScope(i::Isolate* isolate)
     CcTest::CollectGarbage(i::OLD_SPACE, isolate);
   }
 
-  i::FLAG_concurrent_marking = false;
-  i::FLAG_concurrent_sweeping = false;
-  i::FLAG_stress_incremental_marking = false;
-  i::FLAG_stress_concurrent_allocation = false;
+  i::v8_flags.concurrent_marking = false;
+  i::v8_flags.concurrent_sweeping = false;
+  i::v8_flags.concurrent_minor_mc_marking = false;
+  i::v8_flags.concurrent_minor_mc_sweeping = false;
+  i::v8_flags.stress_incremental_marking = false;
+  i::v8_flags.stress_concurrent_allocation = false;
   // Parallel marking has a dependency on concurrent marking.
-  i::FLAG_parallel_marking = false;
-  i::FLAG_detect_ineffective_gcs_near_heap_limit = false;
+  i::v8_flags.parallel_marking = false;
+  i::v8_flags.detect_ineffective_gcs_near_heap_limit = false;
 }
 
 ManualGCScope::~ManualGCScope() {
-  i::FLAG_concurrent_marking = flag_concurrent_marking_;
-  i::FLAG_concurrent_sweeping = flag_concurrent_sweeping_;
-  i::FLAG_stress_concurrent_allocation = flag_stress_concurrent_allocation_;
-  i::FLAG_stress_incremental_marking = flag_stress_incremental_marking_;
-  i::FLAG_parallel_marking = flag_parallel_marking_;
-  i::FLAG_detect_ineffective_gcs_near_heap_limit =
+  i::v8_flags.concurrent_marking = flag_concurrent_marking_;
+  i::v8_flags.concurrent_sweeping = flag_concurrent_sweeping_;
+  i::v8_flags.concurrent_minor_mc_marking = flag_concurrent_minor_mc_marking_;
+  i::v8_flags.concurrent_minor_mc_sweeping = flag_concurrent_minor_mc_sweeping_;
+  i::v8_flags.stress_concurrent_allocation = flag_stress_concurrent_allocation_;
+  i::v8_flags.stress_incremental_marking = flag_stress_incremental_marking_;
+  i::v8_flags.parallel_marking = flag_parallel_marking_;
+  i::v8_flags.detect_ineffective_gcs_near_heap_limit =
       flag_detect_ineffective_gcs_near_heap_limit_;
 }
 
diff --git a/deps/v8/test/cctest/cctest.h b/deps/v8/test/cctest/cctest.h
index dedfc479f33406..ceb2db40e28f49 100644
--- a/deps/v8/test/cctest/cctest.h
+++ b/deps/v8/test/cctest/cctest.h
@@ -705,6 +705,8 @@ class V8_NODISCARD ManualGCScope {
  private:
   const bool flag_concurrent_marking_;
   const bool flag_concurrent_sweeping_;
+  const bool flag_concurrent_minor_mc_marking_;
+  const bool flag_concurrent_minor_mc_sweeping_;
   const bool flag_stress_concurrent_allocation_;
   const bool flag_stress_incremental_marking_;
   const bool flag_parallel_marking_;
diff --git a/deps/v8/test/cctest/cctest.status b/deps/v8/test/cctest/cctest.status
index 7bfa3867d63dc1..fabc7e75441db9 100644
--- a/deps/v8/test/cctest/cctest.status
+++ b/deps/v8/test/cctest/cctest.status
@@ -280,9 +280,6 @@
   # BUG(v8:4642).
   'test-lockers/LockAndUnlockDifferentIsolates': [PASS, NO_VARIANTS],
 
-  # BUG(v8:8744).
-  'test-cpu-profiler/FunctionCallSample': [SKIP],
-
   # BUG(10107): Failing flakily
   'test-cpu-profiler/Inlining2': ['arch == ia32 and mode == debug', SKIP],
   'test-cpu-profiler/CrossScriptInliningCallerLineNumbers': ['arch == ia32 and mode == debug', SKIP],
@@ -516,6 +513,7 @@
   'test-api/WasmI32AtomicWaitCallback': [SKIP],
   'test-api/WasmI64AtomicWaitCallback': [SKIP],
   'test-api/WasmSetJitCodeEventHandler': [SKIP],
+  'test-api-array-buffer/ArrayBuffer_NonDetachableWasDetached': [SKIP],
   'test-backing-store/Run_WasmModule_Buffer_Externalized_Regression_UseAfterFree': [SKIP],
   'test-c-wasm-entry/*': [SKIP],
   'test-compilation-cache/*': [SKIP],
@@ -557,7 +555,6 @@
   'test-debug-helper/GetObjectProperties': [SKIP],
   'test-js-context-specialization/*': [SKIP],
   'test-multiple-return/*': [SKIP],
-  'test-run-bytecode-graph-builder/*': [SKIP],
   'test-run-calls-to-external-references/*': [SKIP],
   'test-run-intrinsics/*': [SKIP],
 
diff --git a/deps/v8/test/cctest/compiler/function-tester.cc b/deps/v8/test/cctest/compiler/function-tester.cc
index 220b4b6d434566..5d104467c005c5 100644
--- a/deps/v8/test/cctest/compiler/function-tester.cc
+++ b/deps/v8/test/cctest/compiler/function-tester.cc
@@ -23,7 +23,7 @@ namespace compiler {
 FunctionTester::FunctionTester(const char* source, uint32_t flags)
     : isolate(main_isolate()),
       canonical(isolate),
-      function((FLAG_allow_natives_syntax = true, NewFunction(source))),
+      function((v8_flags.allow_natives_syntax = true, NewFunction(source))),
       flags_(flags) {
   Compile(function);
   const uint32_t supported_flags = OptimizedCompilationInfo::kInlining;
@@ -41,7 +41,7 @@ FunctionTester::FunctionTester(Graph* graph, int param_count)
 FunctionTester::FunctionTester(Handle<Code> code, int param_count)
     : isolate(main_isolate()),
       canonical(isolate),
-      function((FLAG_allow_natives_syntax = true,
+      function((v8_flags.allow_natives_syntax = true,
                 NewFunction(BuildFunction(param_count).c_str()))),
       flags_(0) {
   CHECK(!code.is_null());
diff --git a/deps/v8/test/cctest/compiler/test-basic-block-profiler.cc b/deps/v8/test/cctest/compiler/test-basic-block-profiler.cc
index 011bc1f11e1e1f..218944bbd10720 100644
--- a/deps/v8/test/cctest/compiler/test-basic-block-profiler.cc
+++ b/deps/v8/test/cctest/compiler/test-basic-block-profiler.cc
@@ -15,7 +15,7 @@ class BasicBlockProfilerTest : public RawMachineAssemblerTester<int32_t> {
  public:
   BasicBlockProfilerTest()
       : RawMachineAssemblerTester<int32_t>(MachineType::Int32()) {
-    FLAG_turbo_profiling = true;
+    v8_flags.turbo_profiling = true;
   }
 
   void ResetCounts() {
diff --git a/deps/v8/test/cctest/compiler/test-calls-with-arraylike-or-spread.cc b/deps/v8/test/cctest/compiler/test-calls-with-arraylike-or-spread.cc
index 7e056f4e6c1b26..dc9767865e5ae0 100644
--- a/deps/v8/test/cctest/compiler/test-calls-with-arraylike-or-spread.cc
+++ b/deps/v8/test/cctest/compiler/test-calls-with-arraylike-or-spread.cc
@@ -20,8 +20,8 @@ void CompileRunWithNodeObserver(const std::string& js_code,
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope handle_scope(isolate);
 
-  FLAG_allow_natives_syntax = true;
-  FLAG_turbo_optimize_apply = true;
+  v8_flags.allow_natives_syntax = true;
+  v8_flags.turbo_optimize_apply = true;
 
   // Note: Make sure to not capture stack locations (e.g. `this`) here since
   // these lambdas are executed on another thread.
@@ -146,8 +146,8 @@ TEST(ReduceCAPICallWithArrayLike) {
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
 
-  FLAG_allow_natives_syntax = true;
-  FLAG_turbo_optimize_apply = true;
+  v8_flags.allow_natives_syntax = true;
+  v8_flags.turbo_optimize_apply = true;
 
   Local<v8::FunctionTemplate> sum = v8::FunctionTemplate::New(isolate, SumF);
   CHECK(env->Global()
diff --git a/deps/v8/test/cctest/compiler/test-code-assembler.cc b/deps/v8/test/cctest/compiler/test-code-assembler.cc
index 780851a0ecb914..d37ec78c34e1d7 100644
--- a/deps/v8/test/cctest/compiler/test-code-assembler.cc
+++ b/deps/v8/test/cctest/compiler/test-code-assembler.cc
@@ -468,7 +468,7 @@ TEST(ExceptionHandler) {
 
 TEST(TestCodeAssemblerCodeComment) {
 #ifdef V8_CODE_COMMENTS
-  i::FLAG_code_comments = true;
+  i::v8_flags.code_comments = true;
   Isolate* isolate(CcTest::InitIsolateOnce());
   const int kNumParams = 0;
   CodeAssemblerTester asm_tester(isolate, kNumParams);
diff --git a/deps/v8/test/cctest/compiler/test-code-generator.cc b/deps/v8/test/cctest/compiler/test-code-generator.cc
index e686d2a1a58759..26ca83a475c4ef 100644
--- a/deps/v8/test/cctest/compiler/test-code-generator.cc
+++ b/deps/v8/test/cctest/compiler/test-code-generator.cc
@@ -693,13 +693,13 @@ class TestEnvironment : public HandleAndZoneScope {
       // The "setup" and "teardown" functions are relatively big, and with
       // runtime assertions enabled they get so big that memory during register
       // allocation becomes a problem. Temporarily disable such assertions.
-      bool old_enable_slow_asserts = FLAG_enable_slow_asserts;
-      FLAG_enable_slow_asserts = false;
+      bool old_enable_slow_asserts = v8_flags.enable_slow_asserts;
+      v8_flags.enable_slow_asserts = false;
 #endif
       Handle<Code> setup =
           BuildSetupFunction(main_isolate(), test_descriptor_, layout_);
 #ifdef ENABLE_SLOW_DCHECKS
-      FLAG_enable_slow_asserts = old_enable_slow_asserts;
+      v8_flags.enable_slow_asserts = old_enable_slow_asserts;
 #endif
       // FunctionTester maintains its own HandleScope which means that its
       // return value will be freed along with it. Copy the result into
@@ -1270,7 +1270,7 @@ TEST(FuzzAssembleMove) {
     }
 
     Handle<Code> test = c.FinalizeForExecuting();
-    if (FLAG_print_code) {
+    if (v8_flags.print_code) {
       test->Print();
     }
 
@@ -1309,7 +1309,7 @@ TEST(FuzzAssembleParallelMove) {
     }
 
     Handle<Code> test = c.FinalizeForExecuting();
-    if (FLAG_print_code) {
+    if (v8_flags.print_code) {
       test->Print();
     }
 
@@ -1335,7 +1335,7 @@ TEST(FuzzAssembleSwap) {
     }
 
     Handle<Code> test = c.FinalizeForExecuting();
-    if (FLAG_print_code) {
+    if (v8_flags.print_code) {
       test->Print();
     }
 
@@ -1373,7 +1373,7 @@ TEST(FuzzAssembleMoveAndSwap) {
     }
 
     Handle<Code> test = c.FinalizeForExecuting();
-    if (FLAG_print_code) {
+    if (v8_flags.print_code) {
       test->Print();
     }
 
@@ -1454,7 +1454,7 @@ TEST(AssembleTailCallGap) {
     c.CheckAssembleTailCallGaps(instr, first_slot + 4,
                                 CodeGeneratorTester::kRegisterPush);
     Handle<Code> code = c.Finalize();
-    if (FLAG_print_code) {
+    if (v8_flags.print_code) {
       code->Print();
     }
   }
@@ -1483,7 +1483,7 @@ TEST(AssembleTailCallGap) {
     c.CheckAssembleTailCallGaps(instr, first_slot + 4,
                                 CodeGeneratorTester::kStackSlotPush);
     Handle<Code> code = c.Finalize();
-    if (FLAG_print_code) {
+    if (v8_flags.print_code) {
       code->Print();
     }
   }
@@ -1512,7 +1512,7 @@ TEST(AssembleTailCallGap) {
     c.CheckAssembleTailCallGaps(instr, first_slot + 4,
                                 CodeGeneratorTester::kScalarPush);
     Handle<Code> code = c.Finalize();
-    if (FLAG_print_code) {
+    if (v8_flags.print_code) {
       code->Print();
     }
   }
diff --git a/deps/v8/test/cctest/compiler/test-concurrent-shared-function-info.cc b/deps/v8/test/cctest/compiler/test-concurrent-shared-function-info.cc
index 1dfa2dbab758aa..d9aabbe0c96a11 100644
--- a/deps/v8/test/cctest/compiler/test-concurrent-shared-function-info.cc
+++ b/deps/v8/test/cctest/compiler/test-concurrent-shared-function-info.cc
@@ -91,7 +91,7 @@ class BackgroundCompilationThread final : public v8::base::Thread {
 };
 
 TEST(TestConcurrentSharedFunctionInfo) {
-  FlagScope<bool> allow_natives_syntax(&i::FLAG_allow_natives_syntax, true);
+  FlagScope<bool> allow_natives_syntax(&i::v8_flags.allow_natives_syntax, true);
 
   HandleAndZoneScope scope;
   Isolate* isolate = scope.main_isolate();
diff --git a/deps/v8/test/cctest/compiler/test-jump-threading.cc b/deps/v8/test/cctest/compiler/test-jump-threading.cc
index 64c8db7d0b2cbf..6ca5985a6413b1 100644
--- a/deps/v8/test/cctest/compiler/test-jump-threading.cc
+++ b/deps/v8/test/cctest/compiler/test-jump-threading.cc
@@ -82,6 +82,21 @@ class TestCode : public HandleAndZoneScope {
                AllocatedOperand(LocationOperand::REGISTER,
                                 MachineRepresentation::kWord32, 11));
   }
+  int JumpWithGapMove(int target, int id = 10) {
+    Start();
+    InstructionOperand ops[] = {UseRpo(target)};
+    sequence_.AddInstruction(Instruction::New(main_zone(), kArchJmp, 0, nullptr,
+                                              1, ops, 0, nullptr));
+    int index = static_cast<int>(sequence_.instructions().size()) - 1;
+    InstructionOperand from = AllocatedOperand(
+        LocationOperand::REGISTER, MachineRepresentation::kWord32, id);
+    InstructionOperand to = AllocatedOperand(
+        LocationOperand::REGISTER, MachineRepresentation::kWord32, id + 1);
+    AddGapMove(index, from, to);
+    End();
+    return index;
+  }
+
   void Other() {
     Start();
     sequence_.AddInstruction(Instruction::New(main_zone(), 155));
@@ -228,6 +243,45 @@ TEST(FwMoves2b) {
   VerifyForwarding(&code, kBlockCount, expected);
 }
 
+TEST(FwMoves3a) {
+  constexpr size_t kBlockCount = 4;
+  TestCode code(kBlockCount);
+
+  // B0
+  code.JumpWithGapMove(3, 10);
+  // B1 (merge B1 into B0, because they have the same gap moves.)
+  code.JumpWithGapMove(3, 10);
+  // B2 (can not merge B2 into B0, because they have different gap moves.)
+  code.JumpWithGapMove(3, 11);
+  // B3
+  code.End();
+
+  static int expected[] = {0, 0, 2, 3};
+  VerifyForwarding(&code, kBlockCount, expected);
+}
+
+TEST(FwMoves3b) {
+  constexpr size_t kBlockCount = 7;
+  TestCode code(kBlockCount);
+
+  // B0
+  code.JumpWithGapMove(6);
+  // B1
+  code.Jump(2);
+  // B2
+  code.Jump(3);
+  // B3
+  code.JumpWithGapMove(6);
+  // B4
+  code.Jump(3);
+  // B5
+  code.Jump(2);
+  // B6
+  code.End();
+
+  static int expected[] = {0, 0, 0, 0, 0, 0, 6};
+  VerifyForwarding(&code, kBlockCount, expected);
+}
 
 TEST(FwOther2) {
   constexpr size_t kBlockCount = 2;
@@ -463,6 +517,35 @@ TEST(FwLoop3_1a) {
   VerifyForwarding(&code, kBlockCount, expected);
 }
 
+TEST(FwLoop4a) {
+  constexpr size_t kBlockCount = 2;
+  TestCode code(kBlockCount);
+
+  // B0
+  code.JumpWithGapMove(1);
+  // B1
+  code.JumpWithGapMove(0);
+
+  static int expected[] = {0, 1};
+  VerifyForwarding(&code, kBlockCount, expected);
+}
+
+TEST(FwLoop4b) {
+  constexpr size_t kBlockCount = 4;
+  TestCode code(kBlockCount);
+
+  // B0
+  code.Jump(3);
+  // B1
+  code.JumpWithGapMove(2);
+  // B2
+  code.Jump(0);
+  // B3
+  code.JumpWithGapMove(2);
+
+  static int expected[] = {3, 3, 3, 3};
+  VerifyForwarding(&code, kBlockCount, expected);
+}
 
 TEST(FwDiamonds) {
   constexpr size_t kBlockCount = 4;
@@ -925,6 +1008,61 @@ TEST(DifferentSizeRet) {
   CheckRet(&code, j2);
 }
 
+TEST(RewireGapJump1) {
+  constexpr size_t kBlockCount = 4;
+  TestCode code(kBlockCount);
+
+  // B0
+  int j1 = code.JumpWithGapMove(3);
+  // B1
+  int j2 = code.JumpWithGapMove(3);
+  // B2
+  int j3 = code.JumpWithGapMove(3);
+  // B3
+  code.End();
+
+  int forward[] = {0, 0, 0, 3};
+  VerifyForwarding(&code, kBlockCount, forward);
+  ApplyForwarding(&code, kBlockCount, forward);
+  CheckJump(&code, j1, 3);
+  CheckNop(&code, j2);
+  CheckNop(&code, j3);
+
+  static int assembly[] = {0, 1, 1, 1};
+  CheckAssemblyOrder(&code, kBlockCount, assembly);
+}
+
+TEST(RewireGapJump2) {
+  constexpr size_t kBlockCount = 6;
+  TestCode code(kBlockCount);
+
+  // B0
+  int j1 = code.JumpWithGapMove(4);
+  // B1
+  int j2 = code.JumpWithGapMove(4);
+  // B2
+  code.Other();
+  int j3 = code.Jump(3);
+  // B3
+  int j4 = code.Jump(1);
+  // B4
+  int j5 = code.Jump(5);
+  // B5
+  code.End();
+
+  int forward[] = {0, 0, 2, 0, 5, 5};
+  VerifyForwarding(&code, kBlockCount, forward);
+  ApplyForwarding(&code, kBlockCount, forward);
+  CheckJump(&code, j1, 5);
+  CheckNop(&code, j2);
+  CheckJump(&code, j3, 0);
+  CheckNop(&code, j4);
+  CheckNop(&code, j5);
+
+  static int assembly[] = {0, 1, 1, 2, 2, 2};
+  CheckAssemblyOrder(&code, kBlockCount, assembly);
+}
+
 }  // namespace compiler
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/test/cctest/compiler/test-loop-analysis.cc b/deps/v8/test/cctest/compiler/test-loop-analysis.cc
index fe5009f231cc08..ede4da40c0f4bd 100644
--- a/deps/v8/test/cctest/compiler/test-loop-analysis.cc
+++ b/deps/v8/test/cctest/compiler/test-loop-analysis.cc
@@ -126,7 +126,7 @@ class LoopFinderTester : HandleAndZoneScope {
 
   LoopTree* GetLoopTree() {
     if (loop_tree == nullptr) {
-      if (FLAG_trace_turbo_graph) {
+      if (v8_flags.trace_turbo_graph) {
         StdoutStream{} << AsRPO(graph);
       }
       Zone zone(main_isolate()->allocator(), ZONE_NAME);
diff --git a/deps/v8/test/cctest/compiler/test-multiple-return.cc b/deps/v8/test/cctest/compiler/test-multiple-return.cc
index c9884226835477..c21ddff33f59a1 100644
--- a/deps/v8/test/cctest/compiler/test-multiple-return.cc
+++ b/deps/v8/test/cctest/compiler/test-multiple-return.cc
@@ -169,7 +169,7 @@ void TestReturnMultipleValues(MachineType type, int min_count, int max_count) {
                               m.ExportForTest())
                               .ToHandleChecked();
 #ifdef ENABLE_DISASSEMBLER
-      if (FLAG_print_code) {
+      if (v8_flags.print_code) {
         StdoutStream os;
         code->Disassemble("multi_value", os, handles.main_isolate());
       }
@@ -217,7 +217,7 @@ void TestReturnMultipleValues(MachineType type, int min_count, int max_count) {
       mt.Return(ToInt32(&mt, type, ret));
 #ifdef ENABLE_DISASSEMBLER
       Handle<Code> code2 = mt.GetCode();
-      if (FLAG_print_code) {
+      if (v8_flags.print_code) {
         StdoutStream os;
         code2->Disassemble("multi_value_call", os, handles.main_isolate());
       }
diff --git a/deps/v8/test/cctest/compiler/test-run-native-calls.cc b/deps/v8/test/cctest/compiler/test-run-native-calls.cc
index 126bdc4c1fee89..cf55b622e9877c 100644
--- a/deps/v8/test/cctest/compiler/test-run-native-calls.cc
+++ b/deps/v8/test/cctest/compiler/test-run-native-calls.cc
@@ -251,7 +251,7 @@ Handle<CodeT> CompileGraph(const char* name, CallDescriptor* call_descriptor,
                           AssemblerOptions::Default(isolate), schedule)
                           .ToHandleChecked();
 #ifdef ENABLE_DISASSEMBLER
-  if (FLAG_print_opt_code) {
+  if (v8_flags.print_opt_code) {
     StdoutStream os;
     code->Disassemble(name, os, isolate);
   }
diff --git a/deps/v8/test/cctest/compiler/test-run-unwinding-info.cc b/deps/v8/test/cctest/compiler/test-run-unwinding-info.cc
index c4f65b4a4bcb4e..b5bc43db436847 100644
--- a/deps/v8/test/cctest/compiler/test-run-unwinding-info.cc
+++ b/deps/v8/test/cctest/compiler/test-run-unwinding-info.cc
@@ -17,8 +17,8 @@ namespace internal {
 namespace compiler {
 
 TEST(RunUnwindingInfo) {
-  FLAG_always_turbofan = true;
-  FLAG_perf_prof_unwinding_info = true;
+  v8_flags.always_turbofan = true;
+  v8_flags.perf_prof_unwinding_info = true;
 
   FunctionTester tester(
       "(function (x) {\n"
diff --git a/deps/v8/test/cctest/compiler/test-verify-type.cc b/deps/v8/test/cctest/compiler/test-verify-type.cc
index 8a3ea077ddfbe9..ffc69d5514083c 100644
--- a/deps/v8/test/cctest/compiler/test-verify-type.cc
+++ b/deps/v8/test/cctest/compiler/test-verify-type.cc
@@ -12,7 +12,7 @@ namespace internal {
 namespace compiler {
 
 TEST(TestVerifyType) {
-  FlagScope<bool> allow_natives_syntax(&i::FLAG_allow_natives_syntax, true);
+  FlagScope<bool> allow_natives_syntax(&i::v8_flags.allow_natives_syntax, true);
   HandleAndZoneScope handle_scope;
   Isolate* isolate = handle_scope.main_isolate();
   Zone* zone = handle_scope.main_zone();
diff --git a/deps/v8/test/cctest/heap/heap-utils.cc b/deps/v8/test/cctest/heap/heap-utils.cc
index 13f8daf5e9eae3..b390552c42b90b 100644
--- a/deps/v8/test/cctest/heap/heap-utils.cc
+++ b/deps/v8/test/cctest/heap/heap-utils.cc
@@ -37,8 +37,7 @@ void SealCurrentObjects(Heap* heap) {
   CHECK(!v8_flags.stress_concurrent_allocation);
   CcTest::CollectAllGarbage();
   CcTest::CollectAllGarbage();
-  heap->mark_compact_collector()->EnsureSweepingCompleted(
-      MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  heap->EnsureSweepingCompleted(Heap::SweepingForcedFinalizationMode::kV8Only);
   heap->old_space()->FreeLinearAllocationArea();
   for (Page* page : *heap->old_space()) {
     page->MarkNeverAllocateForTesting();
@@ -260,12 +259,11 @@ void SimulateIncrementalMarking(i::Heap* heap, bool force_completion) {
   const double kStepSizeInMs = 100;
   CHECK(v8_flags.incremental_marking);
   i::IncrementalMarking* marking = heap->incremental_marking();
-  i::MarkCompactCollector* collector = heap->mark_compact_collector();
 
-  if (collector->sweeping_in_progress()) {
+  if (heap->sweeping_in_progress()) {
     SafepointScope scope(heap);
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
 
   if (marking->IsMinorMarking()) {
@@ -297,10 +295,9 @@ void SimulateFullSpace(v8::internal::PagedSpace* space) {
   // Background thread allocating concurrently interferes with this function.
   CHECK(!v8_flags.stress_concurrent_allocation);
   CodePageCollectionMemoryModificationScopeForTesting code_scope(space->heap());
-  i::MarkCompactCollector* collector = space->heap()->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (space->heap()->sweeping_in_progress()) {
+    space->heap()->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   space->FreeLinearAllocationArea();
   space->ResetFreeList();
@@ -315,10 +312,10 @@ void AbandonCurrentlyFreeMemory(PagedSpace* space) {
 
 void GcAndSweep(Heap* heap, AllocationSpace space) {
   heap->CollectGarbage(space, GarbageCollectionReason::kTesting);
-  if (heap->mark_compact_collector()->sweeping_in_progress()) {
+  if (heap->sweeping_in_progress()) {
     SafepointScope scope(heap);
-    heap->mark_compact_collector()->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
 }
 
diff --git a/deps/v8/test/cctest/heap/test-compaction.cc b/deps/v8/test/cctest/heap/test-compaction.cc
index 18d32ba6d91394..a0bdbe9f716f05 100644
--- a/deps/v8/test/cctest/heap/test-compaction.cc
+++ b/deps/v8/test/cctest/heap/test-compaction.cc
@@ -6,6 +6,7 @@
 #include "src/heap/factory.h"
 #include "src/heap/heap-inl.h"
 #include "src/heap/mark-compact.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/memory-chunk.h"
 #include "src/heap/remembered-set-inl.h"
 #include "src/objects/objects-inl.h"
@@ -24,11 +25,7 @@ void CheckInvariantsOfAbortedPage(Page* page) {
   // 1) Markbits are cleared
   // 2) The page is not marked as evacuation candidate anymore
   // 3) The page is not marked as aborted compaction anymore.
-  CHECK(page->heap()
-            ->mark_compact_collector()
-            ->non_atomic_marking_state()
-            ->bitmap(page)
-            ->IsClean());
+  CHECK(page->heap()->non_atomic_marking_state()->bitmap(page)->IsClean());
   CHECK(!page->IsEvacuationCandidate());
   CHECK(!page->IsFlagSet(Page::COMPACTION_WAS_ABORTED));
 }
@@ -79,8 +76,8 @@ HEAP_TEST(CompactionFullAbortedPage) {
 
       heap->set_force_oom(true);
       CcTest::CollectAllGarbage();
-      heap->mark_compact_collector()->EnsureSweepingCompleted(
-          MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+      heap->EnsureSweepingCompleted(
+          Heap::SweepingForcedFinalizationMode::kV8Only);
 
       // Check that all handles still point to the same page, i.e., compaction
       // has been aborted on the page.
@@ -161,8 +158,8 @@ HEAP_TEST(CompactionPartiallyAbortedPage) {
 
         heap->set_force_oom(true);
         CcTest::CollectAllGarbage();
-        heap->mark_compact_collector()->EnsureSweepingCompleted(
-            MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+        heap->EnsureSweepingCompleted(
+            Heap::SweepingForcedFinalizationMode::kV8Only);
 
         bool migration_aborted = false;
         for (Handle<FixedArray> object : compaction_page_handles) {
@@ -260,8 +257,8 @@ HEAP_TEST(CompactionPartiallyAbortedPageWithInvalidatedSlots) {
 
         heap->set_force_oom(true);
         CcTest::CollectAllGarbage();
-        heap->mark_compact_collector()->EnsureSweepingCompleted(
-            MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+        heap->EnsureSweepingCompleted(
+            Heap::SweepingForcedFinalizationMode::kV8Only);
 
         CHECK_EQ(Page::FromHeapObject(*compaction_page_handles.front()),
                  page_to_fill);
@@ -339,8 +336,8 @@ HEAP_TEST(CompactionPartiallyAbortedPageIntraAbortedPointers) {
 
       heap->set_force_oom(true);
       CcTest::CollectAllGarbage();
-      heap->mark_compact_collector()->EnsureSweepingCompleted(
-          MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+      heap->EnsureSweepingCompleted(
+          Heap::SweepingForcedFinalizationMode::kV8Only);
 
       // The following check makes sure that we compacted "some" objects, while
       // leaving others in place.
@@ -441,8 +438,8 @@ HEAP_TEST(CompactionPartiallyAbortedPageWithRememberedSetEntries) {
 
       heap->set_force_oom(true);
       CcTest::CollectAllGarbage();
-      heap->mark_compact_collector()->EnsureSweepingCompleted(
-          MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+      heap->EnsureSweepingCompleted(
+          Heap::SweepingForcedFinalizationMode::kV8Only);
 
       // The following check makes sure that we compacted "some" objects, while
       // leaving others in place.
diff --git a/deps/v8/test/cctest/heap/test-concurrent-allocation.cc b/deps/v8/test/cctest/heap/test-concurrent-allocation.cc
index 007b92a9dbae5b..313309e73c6bed 100644
--- a/deps/v8/test/cctest/heap/test-concurrent-allocation.cc
+++ b/deps/v8/test/cctest/heap/test-concurrent-allocation.cc
@@ -20,6 +20,7 @@
 #include "src/heap/concurrent-allocator-inl.h"
 #include "src/heap/heap.h"
 #include "src/heap/local-heap-inl.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/parked-scope.h"
 #include "src/heap/safepoint.h"
 #include "src/objects/heap-number.h"
@@ -250,7 +251,7 @@ class LargeObjectConcurrentAllocationThread final : public v8::base::Thread {
           kLargeObjectSize, AllocationType::kOld, AllocationOrigin::kRuntime,
           AllocationAlignment::kTaggedAligned);
       if (result.IsFailure()) {
-        local_heap.TryPerformCollection();
+        heap_->CollectGarbageFromAnyThread(&local_heap);
       } else {
         Address address = result.ToAddress();
         CreateFixedArray(heap_, address, kLargeObjectSize);
@@ -371,9 +372,9 @@ UNINITIALIZED_TEST(ConcurrentBlackAllocation) {
     HeapObject object = HeapObject::FromAddress(address);
 
     if (i < kWhiteIterations * kObjectsAllocatedPerIteration) {
-      CHECK(heap->incremental_marking()->marking_state()->IsWhite(object));
+      CHECK(heap->marking_state()->IsWhite(object));
     } else {
-      CHECK(heap->incremental_marking()->marking_state()->IsBlack(object));
+      CHECK(heap->marking_state()->IsBlack(object));
     }
   }
 
@@ -427,7 +428,7 @@ UNINITIALIZED_TEST(ConcurrentWriteBarrier) {
   }
   heap->StartIncrementalMarking(i::Heap::kNoGCFlags,
                                 i::GarbageCollectionReason::kTesting);
-  CHECK(heap->incremental_marking()->marking_state()->IsWhite(value));
+  CHECK(heap->marking_state()->IsWhite(value));
 
   auto thread =
       std::make_unique<ConcurrentWriteBarrierThread>(heap, fixed_array, value);
@@ -435,7 +436,7 @@ UNINITIALIZED_TEST(ConcurrentWriteBarrier) {
 
   thread->Join();
 
-  CHECK(heap->incremental_marking()->marking_state()->IsBlackOrGrey(value));
+  CHECK(heap->marking_state()->IsBlackOrGrey(value));
   heap::InvokeMarkSweep(i_isolate);
 
   isolate->Dispose();
@@ -513,7 +514,7 @@ UNINITIALIZED_TEST(ConcurrentRecordRelocSlot) {
     }
     heap->StartIncrementalMarking(i::Heap::kNoGCFlags,
                                   i::GarbageCollectionReason::kTesting);
-    CHECK(heap->incremental_marking()->marking_state()->IsWhite(value));
+    CHECK(heap->marking_state()->IsWhite(value));
 
     {
       // TODO(v8:13023): remove ResetPKUPermissionsForThreadSpawning in the
@@ -527,7 +528,7 @@ UNINITIALIZED_TEST(ConcurrentRecordRelocSlot) {
       thread->Join();
     }
 
-    CHECK(heap->incremental_marking()->marking_state()->IsBlackOrGrey(value));
+    CHECK(heap->marking_state()->IsBlackOrGrey(value));
     heap::InvokeMarkSweep(i_isolate);
   }
   isolate->Dispose();
diff --git a/deps/v8/test/cctest/heap/test-concurrent-marking.cc b/deps/v8/test/cctest/heap/test-concurrent-marking.cc
index 2ad4d4a696bc99..e57fa68f37e6a1 100644
--- a/deps/v8/test/cctest/heap/test-concurrent-marking.cc
+++ b/deps/v8/test/cctest/heap/test-concurrent-marking.cc
@@ -32,15 +32,15 @@ TEST(ConcurrentMarking) {
   Heap* heap = CcTest::heap();
   CcTest::CollectAllGarbage();
   if (!heap->incremental_marking()->IsStopped()) return;
-  MarkCompactCollector* collector = CcTest::heap()->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
 
   WeakObjects weak_objects;
   ConcurrentMarking* concurrent_marking =
       new ConcurrentMarking(heap, &weak_objects);
+  MarkCompactCollector* collector = CcTest::heap()->mark_compact_collector();
   PublishSegment(*collector->marking_worklists()->shared(),
                  ReadOnlyRoots(heap).undefined_value());
   concurrent_marking->ScheduleJob(GarbageCollector::MARK_COMPACTOR);
@@ -54,15 +54,15 @@ TEST(ConcurrentMarkingReschedule) {
   Heap* heap = CcTest::heap();
   CcTest::CollectAllGarbage();
   if (!heap->incremental_marking()->IsStopped()) return;
-  MarkCompactCollector* collector = CcTest::heap()->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
 
   WeakObjects weak_objects;
   ConcurrentMarking* concurrent_marking =
       new ConcurrentMarking(heap, &weak_objects);
+  MarkCompactCollector* collector = CcTest::heap()->mark_compact_collector();
   PublishSegment(*collector->marking_worklists()->shared(),
                  ReadOnlyRoots(heap).undefined_value());
   concurrent_marking->ScheduleJob(GarbageCollector::MARK_COMPACTOR);
@@ -80,15 +80,15 @@ TEST(ConcurrentMarkingPreemptAndReschedule) {
   Heap* heap = CcTest::heap();
   CcTest::CollectAllGarbage();
   if (!heap->incremental_marking()->IsStopped()) return;
-  MarkCompactCollector* collector = CcTest::heap()->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
 
   WeakObjects weak_objects;
   ConcurrentMarking* concurrent_marking =
       new ConcurrentMarking(heap, &weak_objects);
+  MarkCompactCollector* collector = CcTest::heap()->mark_compact_collector();
   for (int i = 0; i < 5000; i++)
     PublishSegment(*collector->marking_worklists()->shared(),
                    ReadOnlyRoots(heap).undefined_value());
diff --git a/deps/v8/test/cctest/heap/test-heap.cc b/deps/v8/test/cctest/heap/test-heap.cc
index 90b655fdc79c26..a4535b2abf56a3 100644
--- a/deps/v8/test/cctest/heap/test-heap.cc
+++ b/deps/v8/test/cctest/heap/test-heap.cc
@@ -40,6 +40,7 @@
 #include "src/debug/debug.h"
 #include "src/deoptimizer/deoptimizer.h"
 #include "src/execution/execution.h"
+#include "src/flags/flags.h"
 #include "src/handles/global-handles-inl.h"
 #include "src/heap/combined-heap.h"
 #include "src/heap/factory.h"
@@ -50,6 +51,7 @@
 #include "src/heap/large-spaces.h"
 #include "src/heap/mark-compact.h"
 #include "src/heap/marking-barrier.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/memory-chunk.h"
 #include "src/heap/memory-reducer.h"
 #include "src/heap/parked-scope.h"
@@ -1874,6 +1876,7 @@ TEST(TestSizeOfRegExpCode) {
   v8_flags.stress_concurrent_allocation = false;
 
   Isolate* isolate = CcTest::i_isolate();
+  Heap* heap = CcTest::heap();
   HandleScope scope(isolate);
 
   LocalContext context;
@@ -1896,21 +1899,19 @@ TEST(TestSizeOfRegExpCode) {
   // Get initial heap size after several full GCs, which will stabilize
   // the heap size and return with sweeping finished completely.
   CcTest::CollectAllAvailableGarbage();
-  MarkCompactCollector* collector = CcTest::heap()->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
-  int initial_size = static_cast<int>(CcTest::heap()->SizeOfObjects());
+  int initial_size = static_cast<int>(heap->SizeOfObjects());
 
   CompileRun("'foo'.match(reg_exp_source);");
   CcTest::CollectAllAvailableGarbage();
-  int size_with_regexp = static_cast<int>(CcTest::heap()->SizeOfObjects());
+  int size_with_regexp = static_cast<int>(heap->SizeOfObjects());
 
   CompileRun("'foo'.match(half_size_reg_exp);");
   CcTest::CollectAllAvailableGarbage();
-  int size_with_optimized_regexp =
-      static_cast<int>(CcTest::heap()->SizeOfObjects());
+  int size_with_optimized_regexp = static_cast<int>(heap->SizeOfObjects());
 
   int size_of_regexp_code = size_with_regexp - initial_size;
 
@@ -1934,14 +1935,13 @@ HEAP_TEST(TestSizeOfObjects) {
   // Disable LAB, such that calculations with SizeOfObjects() and object size
   // are correct.
   heap->DisableInlineAllocation();
-  MarkCompactCollector* collector = heap->mark_compact_collector();
 
   // Get initial heap size after several full GCs, which will stabilize
   // the heap size and return with sweeping finished completely.
   CcTest::CollectAllAvailableGarbage();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   int initial_size = static_cast<int>(heap->SizeOfObjects());
 
@@ -1965,9 +1965,9 @@ HEAP_TEST(TestSizeOfObjects) {
   // Normally sweeping would not be complete here, but no guarantees.
   CHECK_EQ(initial_size, static_cast<int>(heap->SizeOfObjects()));
   // Waiting for sweeper threads should not change heap size.
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   CHECK_EQ(initial_size, static_cast<int>(heap->SizeOfObjects()));
 }
@@ -2481,7 +2481,7 @@ TEST(InstanceOfStubWriteBarrier) {
 
   CHECK(f->HasAttachedOptimizedCode());
 
-  MarkingState* marking_state = marking->marking_state();
+  MarkingState* marking_state = CcTest::heap()->marking_state();
 
   const double kStepSizeInMs = 100;
   while (!marking_state->IsBlack(f->code())) {
@@ -2517,10 +2517,9 @@ HEAP_TEST(GCFlags) {
                                     GarbageCollectionReason::kTesting);
   CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_);
 
-  MarkCompactCollector* collector = heap->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
 
   IncrementalMarking* marking = heap->incremental_marking();
@@ -5576,8 +5575,7 @@ HEAP_TEST(Regress587004) {
   CcTest::CollectGarbage(OLD_SPACE);
   heap::SimulateFullSpace(heap->old_space());
   heap->RightTrimFixedArray(*array, N - 1);
-  heap->mark_compact_collector()->EnsureSweepingCompleted(
-      MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  heap->EnsureSweepingCompleted(Heap::SweepingForcedFinalizationMode::kV8Only);
   ByteArray byte_array;
   const int M = 256;
   // Don't allow old space expansion. The test works without this flag too,
@@ -5748,15 +5746,14 @@ TEST(Regress598319) {
 
   // GC to cleanup state
   CcTest::CollectGarbage(OLD_SPACE);
-  MarkCompactCollector* collector = heap->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
 
   CHECK(heap->lo_space()->Contains(arr.get()));
   IncrementalMarking* marking = heap->incremental_marking();
-  MarkingState* marking_state = marking->marking_state();
+  MarkingState* marking_state = heap->marking_state();
   CHECK(marking_state->IsWhite(arr.get()));
   for (int i = 0; i < arr.get().length(); i++) {
     HeapObject arr_value = HeapObject::cast(arr.get().get(i));
@@ -5820,8 +5817,7 @@ Handle<FixedArray> ShrinkArrayAndCheckSize(Heap* heap, int length) {
   for (int i = 0; i < 5; i++) {
     CcTest::CollectAllGarbage();
   }
-  heap->mark_compact_collector()->EnsureSweepingCompleted(
-      MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  heap->EnsureSweepingCompleted(Heap::SweepingForcedFinalizationMode::kV8Only);
   // Disable LAB, such that calculations with SizeOfObjects() and object size
   // are correct.
   heap->DisableInlineAllocation();
@@ -5836,8 +5832,7 @@ Handle<FixedArray> ShrinkArrayAndCheckSize(Heap* heap, int length) {
   CHECK_EQ(size_after_allocation, size_after_shrinking);
   // GC and sweeping updates the size to acccount for shrinking.
   CcTest::CollectAllGarbage();
-  heap->mark_compact_collector()->EnsureSweepingCompleted(
-      MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  heap->EnsureSweepingCompleted(Heap::SweepingForcedFinalizationMode::kV8Only);
   intptr_t size_after_gc = heap->SizeOfObjects();
   CHECK_EQ(size_after_gc, size_before_allocation + array->Size());
   return array;
@@ -5871,11 +5866,10 @@ TEST(Regress615489) {
   Isolate* isolate = heap->isolate();
   CcTest::CollectAllGarbage();
 
-  i::MarkCompactCollector* collector = heap->mark_compact_collector();
   i::IncrementalMarking* marking = heap->incremental_marking();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   CHECK(marking->IsMarking() || marking->IsStopped());
   if (marking->IsStopped()) {
@@ -5971,11 +5965,10 @@ TEST(LeftTrimFixedArrayInBlackArea) {
   Isolate* isolate = heap->isolate();
   CcTest::CollectAllGarbage();
 
-  i::MarkCompactCollector* collector = heap->mark_compact_collector();
   i::IncrementalMarking* marking = heap->incremental_marking();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   CHECK(marking->IsMarking() || marking->IsStopped());
   if (marking->IsStopped()) {
@@ -5992,7 +5985,7 @@ TEST(LeftTrimFixedArrayInBlackArea) {
   Handle<FixedArray> array =
       isolate->factory()->NewFixedArray(50, AllocationType::kOld);
   CHECK(heap->old_space()->Contains(*array));
-  MarkingState* marking_state = marking->marking_state();
+  MarkingState* marking_state = heap->marking_state();
   CHECK(marking_state->IsBlack(*array));
 
   // Now left trim the allocated black area. A filler has to be installed
@@ -6013,11 +6006,10 @@ TEST(ContinuousLeftTrimFixedArrayInBlackArea) {
   Isolate* isolate = heap->isolate();
   CcTest::CollectAllGarbage();
 
-  i::MarkCompactCollector* collector = heap->mark_compact_collector();
   i::IncrementalMarking* marking = heap->incremental_marking();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   CHECK(marking->IsMarking() || marking->IsStopped());
   if (marking->IsStopped()) {
@@ -6038,7 +6030,7 @@ TEST(ContinuousLeftTrimFixedArrayInBlackArea) {
   Address start_address = array->address();
   Address end_address = start_address + array->Size();
   Page* page = Page::FromAddress(start_address);
-  NonAtomicMarkingState* marking_state = marking->non_atomic_marking_state();
+  NonAtomicMarkingState* marking_state = heap->non_atomic_marking_state();
   CHECK(marking_state->IsBlack(*array));
   CHECK(marking_state->bitmap(page)->AllBitsSetInRange(
       page->AddressToMarkbitIndex(start_address),
@@ -6082,11 +6074,10 @@ TEST(ContinuousRightTrimFixedArrayInBlackArea) {
   Isolate* isolate = CcTest::i_isolate();
   CcTest::CollectAllGarbage();
 
-  i::MarkCompactCollector* collector = heap->mark_compact_collector();
   i::IncrementalMarking* marking = heap->incremental_marking();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   CHECK(marking->IsMarking() || marking->IsStopped());
   if (marking->IsStopped()) {
@@ -6103,13 +6094,12 @@ TEST(ContinuousRightTrimFixedArrayInBlackArea) {
 
   // Allocate the fixed array that will be trimmed later.
   Handle<FixedArray> array =
-      CcTest::i_isolate()->factory()->NewFixedArray(100, AllocationType::kOld);
+      isolate->factory()->NewFixedArray(100, AllocationType::kOld);
   Address start_address = array->address();
   Address end_address = start_address + array->Size();
   Page* page = Page::FromAddress(start_address);
-  NonAtomicMarkingState* marking_state = marking->non_atomic_marking_state();
+  NonAtomicMarkingState* marking_state = heap->non_atomic_marking_state();
   CHECK(marking_state->IsBlack(*array));
-
   CHECK(marking_state->bitmap(page)->AllBitsSetInRange(
       page->AddressToMarkbitIndex(start_address),
       page->AddressToMarkbitIndex(end_address)));
@@ -6501,12 +6491,11 @@ HEAP_TEST(Regress670675) {
   v8::HandleScope scope(CcTest::isolate());
   Heap* heap = CcTest::heap();
   Isolate* isolate = heap->isolate();
-  i::MarkCompactCollector* collector = heap->mark_compact_collector();
   CcTest::CollectAllGarbage();
 
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   heap->tracer()->StopFullCycleIfNeeded();
   i::IncrementalMarking* marking = CcTest::heap()->incremental_marking();
@@ -6558,10 +6547,9 @@ HEAP_TEST(RegressMissingWriteBarrierInAllocate) {
   // then the map is white and will be freed prematurely.
   heap::SimulateIncrementalMarking(heap, true);
   CcTest::CollectAllGarbage();
-  MarkCompactCollector* collector = heap->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   CHECK(object->map().IsMap());
 }
@@ -6906,7 +6894,7 @@ UNINITIALIZED_TEST(RestoreHeapLimit) {
 }
 
 void HeapTester::UncommitUnusedMemory(Heap* heap) {
-  heap->new_space()->Shrink();
+  if (!v8_flags.minor_mc) heap->new_space()->Shrink();
   heap->memory_allocator()->unmapper()->EnsureUnmappingCompleted();
 }
 
diff --git a/deps/v8/test/cctest/heap/test-mark-compact.cc b/deps/v8/test/cctest/heap/test-mark-compact.cc
index 93ef52c45f5ad2..6047eae158e5ae 100644
--- a/deps/v8/test/cctest/heap/test-mark-compact.cc
+++ b/deps/v8/test/cctest/heap/test-mark-compact.cc
@@ -205,8 +205,7 @@ HEAP_TEST(DoNotEvacuatePinnedPages) {
   page->SetFlag(MemoryChunk::PINNED);
 
   CcTest::CollectAllGarbage();
-  heap->mark_compact_collector()->EnsureSweepingCompleted(
-      MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  heap->EnsureSweepingCompleted(Heap::SweepingForcedFinalizationMode::kV8Only);
 
   // The pinned flag should prevent the page from moving.
   for (Handle<FixedArray> object : handles) {
@@ -216,8 +215,7 @@ HEAP_TEST(DoNotEvacuatePinnedPages) {
   page->ClearFlag(MemoryChunk::PINNED);
 
   CcTest::CollectAllGarbage();
-  heap->mark_compact_collector()->EnsureSweepingCompleted(
-      MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  heap->EnsureSweepingCompleted(Heap::SweepingForcedFinalizationMode::kV8Only);
 
   // `compact_on_every_full_gc` ensures that this page is an evacuation
   // candidate, so with the pin flag cleared compaction should now move it.
@@ -450,11 +448,10 @@ TEST(Regress5829) {
   v8::HandleScope sc(CcTest::isolate());
   Heap* heap = isolate->heap();
   heap::SealCurrentObjects(heap);
-  i::MarkCompactCollector* collector = heap->mark_compact_collector();
   i::IncrementalMarking* marking = heap->incremental_marking();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   CHECK(marking->IsMarking() || marking->IsStopped());
   if (marking->IsStopped()) {
@@ -471,7 +468,7 @@ TEST(Regress5829) {
   heap->CreateFillerObjectAt(old_end - kTaggedSize, kTaggedSize);
   heap->old_space()->FreeLinearAllocationArea();
   Page* page = Page::FromAddress(array->address());
-  MarkingState* marking_state = marking->marking_state();
+  MarkingState* marking_state = heap->marking_state();
   for (auto object_and_size :
        LiveObjectRange<kGreyObjects>(page, marking_state->bitmap(page))) {
     CHECK(!object_and_size.first.IsFreeSpaceOrFiller());
diff --git a/deps/v8/test/cctest/heap/test-spaces.cc b/deps/v8/test/cctest/heap/test-spaces.cc
index d70d1787f9c0dd..bfa96eee84399d 100644
--- a/deps/v8/test/cctest/heap/test-spaces.cc
+++ b/deps/v8/test/cctest/heap/test-spaces.cc
@@ -448,8 +448,7 @@ TEST(SizeOfInitialHeap) {
   Heap* heap = isolate->heap();
   for (int i = FIRST_GROWABLE_PAGED_SPACE; i <= LAST_GROWABLE_PAGED_SPACE;
        i++) {
-    // Map space might be disabled.
-    if (i == MAP_SPACE && !heap->paged_space(i)) continue;
+    if (!heap->paged_space(i)) continue;
 
     // Debug code can be very large, so skip CODE_SPACE if we are generating it.
     if (i == CODE_SPACE && i::v8_flags.debug_code) continue;
diff --git a/deps/v8/test/cctest/heap/test-write-barrier.cc b/deps/v8/test/cctest/heap/test-write-barrier.cc
index 1a467ceee573f6..1608a5f716feec 100644
--- a/deps/v8/test/cctest/heap/test-write-barrier.cc
+++ b/deps/v8/test/cctest/heap/test-write-barrier.cc
@@ -4,6 +4,7 @@
 
 #include "src/heap/incremental-marking.h"
 #include "src/heap/mark-compact.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/spaces.h"
 #include "src/objects/js-array-buffer-inl.h"
 #include "src/objects/objects-inl.h"
@@ -21,7 +22,7 @@ HEAP_TEST(WriteBarrier_Marking) {
   CcTest::InitializeVM();
   Isolate* isolate = CcTest::i_isolate();
   Factory* factory = isolate->factory();
-  MarkCompactCollector* collector = isolate->heap()->mark_compact_collector();
+  Heap* heap = isolate->heap();
   HandleScope outer(isolate);
   Handle<FixedArray> objects = factory->NewFixedArray(3);
   v8::Global<Value> global_objects(CcTest::isolate(), Utils::ToLocal(objects));
@@ -40,20 +41,19 @@ HEAP_TEST(WriteBarrier_Marking) {
   FixedArray host = FixedArray::cast(objects->get(0));
   HeapObject value1 = HeapObject::cast(objects->get(1));
   HeapObject value2 = HeapObject::cast(objects->get(2));
-  CHECK(collector->marking_state()->IsWhite(host));
-  CHECK(collector->marking_state()->IsWhite(value1));
+  CHECK(heap->marking_state()->IsWhite(host));
+  CHECK(heap->marking_state()->IsWhite(value1));
   WriteBarrier::Marking(host, host.RawFieldOfElementAt(0), value1);
-  CHECK_EQ(V8_CONCURRENT_MARKING_BOOL,
-           collector->marking_state()->IsGrey(value1));
-  collector->marking_state()->WhiteToGrey(host);
-  collector->marking_state()->GreyToBlack(host);
-  CHECK(collector->marking_state()->IsWhite(value2));
+  CHECK_EQ(V8_CONCURRENT_MARKING_BOOL, heap->marking_state()->IsGrey(value1));
+  heap->marking_state()->WhiteToGrey(host);
+  heap->marking_state()->GreyToBlack(host);
+  CHECK(heap->marking_state()->IsWhite(value2));
   WriteBarrier::Marking(host, host.RawFieldOfElementAt(0), value2);
-  CHECK(collector->marking_state()->IsGrey(value2));
+  CHECK(heap->marking_state()->IsGrey(value2));
   heap::SimulateIncrementalMarking(CcTest::heap(), true);
-  CHECK(collector->marking_state()->IsBlack(host));
-  CHECK(collector->marking_state()->IsBlack(value1));
-  CHECK(collector->marking_state()->IsBlack(value2));
+  CHECK(heap->marking_state()->IsBlack(host));
+  CHECK(heap->marking_state()->IsBlack(value1));
+  CHECK(heap->marking_state()->IsBlack(value2));
 }
 
 HEAP_TEST(WriteBarrier_MarkingExtension) {
@@ -62,7 +62,7 @@ HEAP_TEST(WriteBarrier_MarkingExtension) {
   CcTest::InitializeVM();
   Isolate* isolate = CcTest::i_isolate();
   Factory* factory = isolate->factory();
-  MarkCompactCollector* collector = isolate->heap()->mark_compact_collector();
+  Heap* heap = isolate->heap();
   HandleScope outer(isolate);
   Handle<FixedArray> objects = factory->NewFixedArray(1);
   ArrayBufferExtension* extension;
@@ -75,7 +75,7 @@ HEAP_TEST(WriteBarrier_MarkingExtension) {
   }
   heap::SimulateIncrementalMarking(CcTest::heap(), false);
   JSArrayBuffer host = JSArrayBuffer::cast(objects->get(0));
-  CHECK(collector->marking_state()->IsWhite(host));
+  CHECK(heap->marking_state()->IsWhite(host));
   CHECK(!extension->IsMarked());
   WriteBarrier::Marking(host, extension);
   // Concurrent marking barrier should mark this object.
@@ -84,7 +84,7 @@ HEAP_TEST(WriteBarrier_MarkingExtension) {
   v8::Global<ArrayBuffer> global_host(CcTest::isolate(),
                                       Utils::ToLocal(handle(host, isolate)));
   heap::SimulateIncrementalMarking(CcTest::heap(), true);
-  CHECK(collector->marking_state()->IsBlack(host));
+  CHECK(heap->marking_state()->IsBlack(host));
   CHECK(extension->IsMarked());
 }
 
diff --git a/deps/v8/test/cctest/test-accessor-assembler.cc b/deps/v8/test/cctest/test-accessor-assembler.cc
index 19893ac5fc9420..5c45090370d33e 100644
--- a/deps/v8/test/cctest/test-accessor-assembler.cc
+++ b/deps/v8/test/cctest/test-accessor-assembler.cc
@@ -159,7 +159,7 @@ TEST(TryProbeStubCache) {
   std::vector<Handle<JSObject>> receivers;
   std::vector<Handle<Code>> handlers;
 
-  base::RandomNumberGenerator rand_gen(FLAG_random_seed);
+  base::RandomNumberGenerator rand_gen(v8_flags.random_seed);
 
   Factory* factory = isolate->factory();
 
diff --git a/deps/v8/test/cctest/test-accessors.cc b/deps/v8/test/cctest/test-accessors.cc
index ae68ae6bed20d1..08a445981769ba 100644
--- a/deps/v8/test/cctest/test-accessors.cc
+++ b/deps/v8/test/cctest/test-accessors.cc
@@ -738,7 +738,7 @@ static bool SecurityTestCallback(Local<v8::Context> accessing_context,
 
 
 TEST(PrototypeGetterAccessCheck) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -905,7 +905,7 @@ TEST(ObjectSetLazyDataPropertyForIndex) {
 }
 
 TEST(ObjectTemplateSetLazyPropertySurvivesIC) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
diff --git a/deps/v8/test/cctest/test-api-array-buffer.cc b/deps/v8/test/cctest/test-api-array-buffer.cc
index b087274b31137d..29169560f1fe67 100644
--- a/deps/v8/test/cctest/test-api-array-buffer.cc
+++ b/deps/v8/test/cctest/test-api-array-buffer.cc
@@ -245,6 +245,37 @@ THREADED_TEST(ArrayBuffer_DetachingScript) {
   CheckDataViewIsDetached(dv);
 }
 
+THREADED_TEST(ArrayBuffer_WasDetached) {
+  LocalContext env;
+  v8::Isolate* isolate = env->GetIsolate();
+  v8::HandleScope handle_scope(isolate);
+
+  Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, 0);
+  CHECK(!ab->WasDetached());
+
+  ab->Detach();
+  CHECK(ab->WasDetached());
+}
+
+THREADED_TEST(ArrayBuffer_NonDetachableWasDetached) {
+  LocalContext env;
+  v8::Isolate* isolate = env->GetIsolate();
+  v8::HandleScope handle_scope(isolate);
+
+  CompileRun(R"JS(
+    var wasmMemory = new WebAssembly.Memory({initial: 1, maximum: 2});
+  )JS");
+
+  Local<v8::ArrayBuffer> non_detachable =
+      CompileRun("wasmMemory.buffer").As<v8::ArrayBuffer>();
+  CHECK(!non_detachable->IsDetachable());
+  CHECK(!non_detachable->WasDetached());
+
+  CompileRun("wasmMemory.grow(1)");
+  CHECK(!non_detachable->IsDetachable());
+  CHECK(non_detachable->WasDetached());
+}
+
 THREADED_TEST(ArrayBuffer_ExternalizeEmpty) {
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
@@ -267,7 +298,7 @@ THREADED_TEST(ArrayBuffer_ExternalizeEmpty) {
 }
 
 THREADED_TEST(SharedArrayBuffer_ApiInternalToExternal) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope handle_scope(isolate);
@@ -302,7 +333,7 @@ THREADED_TEST(SharedArrayBuffer_ApiInternalToExternal) {
 }
 
 THREADED_TEST(SharedArrayBuffer_JSInternalToExternal) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope handle_scope(isolate);
diff --git a/deps/v8/test/cctest/test-api-interceptors.cc b/deps/v8/test/cctest/test-api-interceptors.cc
index 2a7f2528dc1a36..4fcffa21928690 100644
--- a/deps/v8/test/cctest/test-api-interceptors.cc
+++ b/deps/v8/test/cctest/test-api-interceptors.cc
@@ -1424,7 +1424,7 @@ THREADED_TEST(InterceptorLoadGlobalICGlobalWithInterceptor) {
 // Test load of a non-existing global through prototype chain when a global
 // object has an interceptor.
 THREADED_TEST(InterceptorLoadICGlobalWithInterceptor) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate* isolate = CcTest::isolate();
   v8::HandleScope scope(isolate);
   v8::Local<v8::ObjectTemplate> templ_global = v8::ObjectTemplate::New(isolate);
@@ -2571,7 +2571,7 @@ THREADED_TEST(PropertyDefinerCallbackInDefineNamedOwnIC) {
   }
 
   {
-    i::FLAG_lazy_feedback_allocation = false;
+    i::v8_flags.lazy_feedback_allocation = false;
     i::FlagList::EnforceFlagImplications();
     LocalContext env;
     v8::HandleScope scope(env->GetIsolate());
@@ -2579,7 +2579,7 @@ THREADED_TEST(PropertyDefinerCallbackInDefineNamedOwnIC) {
   }
 
   {
-    i::FLAG_lazy_feedback_allocation = false;
+    i::v8_flags.lazy_feedback_allocation = false;
     i::FlagList::EnforceFlagImplications();
     LocalContext env;
     v8::HandleScope scope(env->GetIsolate());
@@ -4408,7 +4408,7 @@ static void InterceptorCallICGetter6(
 // Same test as above, except the code is wrapped in a function
 // to test the optimized compiler.
 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate* isolate = CcTest::isolate();
   v8::HandleScope scope(isolate);
   v8::Local<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
@@ -4952,8 +4952,8 @@ THREADED_TEST(NamedPropertyHandlerGetterAttributes) {
 
 
 THREADED_TEST(Regress256330) {
-  if (!i::FLAG_turbofan) return;
-  i::FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.turbofan) return;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext context;
   v8::HandleScope scope(context->GetIsolate());
   Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate());
@@ -4976,7 +4976,7 @@ THREADED_TEST(Regress256330) {
 }
 
 THREADED_TEST(OptimizedInterceptorSetter) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   Local<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate());
   AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
@@ -5006,7 +5006,7 @@ THREADED_TEST(OptimizedInterceptorSetter) {
 }
 
 THREADED_TEST(OptimizedInterceptorGetter) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   Local<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate());
   AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
@@ -5033,7 +5033,7 @@ THREADED_TEST(OptimizedInterceptorGetter) {
 }
 
 THREADED_TEST(OptimizedInterceptorFieldRead) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   Local<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate());
   AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
@@ -5057,7 +5057,7 @@ THREADED_TEST(OptimizedInterceptorFieldRead) {
 }
 
 THREADED_TEST(OptimizedInterceptorFieldWrite) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   Local<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate());
   AddInterceptor(templ, InterceptorGetter, InterceptorSetter);
diff --git a/deps/v8/test/cctest/test-api-stack-traces.cc b/deps/v8/test/cctest/test-api-stack-traces.cc
index 5f83acda3c0fcb..96a19018b8bf19 100644
--- a/deps/v8/test/cctest/test-api-stack-traces.cc
+++ b/deps/v8/test/cctest/test-api-stack-traces.cc
@@ -867,8 +867,8 @@ TEST(DynamicWithSourceURLInStackTraceString) {
 }
 
 UNINITIALIZED_TEST(CaptureStackTraceForStackOverflow) {
-  // We must set FLAG_stack_size before initializing the isolate.
-  v8::internal::FLAG_stack_size = 150;
+  // We must set v8_flags.stack_size before initializing the isolate.
+  v8::internal::v8_flags.stack_size = 150;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   v8::Isolate* isolate = v8::Isolate::New(create_params);
diff --git a/deps/v8/test/cctest/test-api-typed-array.cc b/deps/v8/test/cctest/test-api-typed-array.cc
index eaac22b47a4242..42402d5d86447e 100644
--- a/deps/v8/test/cctest/test-api-typed-array.cc
+++ b/deps/v8/test/cctest/test-api-typed-array.cc
@@ -271,8 +271,8 @@ void ObjectWithExternalArrayTestHelper(Local<Context> context,
     }
   }
 
-  bool old_natives_flag_sentry = i::FLAG_allow_natives_syntax;
-  i::FLAG_allow_natives_syntax = true;
+  bool old_natives_flag_sentry = i::v8_flags.allow_natives_syntax;
+  i::v8_flags.allow_natives_syntax = true;
 
   // Test complex assignments
   result = CompileRun(
@@ -310,7 +310,7 @@ void ObjectWithExternalArrayTestHelper(Local<Context> context,
       "sum;");
   CHECK_EQ(4800, result->Int32Value(context).FromJust());
 
-  i::FLAG_allow_natives_syntax = old_natives_flag_sentry;
+  i::v8_flags.allow_natives_syntax = old_natives_flag_sentry;
 
   result = CompileRun(
       "ext_array[3] = 33;"
@@ -460,61 +460,61 @@ THREADED_TEST(DataView) {
 }
 
 THREADED_TEST(SharedUint8Array) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   TypedArrayTestHelper<uint8_t, v8::Uint8Array, v8::SharedArrayBuffer>(
       i::kExternalUint8Array, 0, 0xFF);
 }
 
 THREADED_TEST(SharedInt8Array) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   TypedArrayTestHelper<int8_t, v8::Int8Array, v8::SharedArrayBuffer>(
       i::kExternalInt8Array, -0x80, 0x7F);
 }
 
 THREADED_TEST(SharedUint16Array) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   TypedArrayTestHelper<uint16_t, v8::Uint16Array, v8::SharedArrayBuffer>(
       i::kExternalUint16Array, 0, 0xFFFF);
 }
 
 THREADED_TEST(SharedInt16Array) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   TypedArrayTestHelper<int16_t, v8::Int16Array, v8::SharedArrayBuffer>(
       i::kExternalInt16Array, -0x8000, 0x7FFF);
 }
 
 THREADED_TEST(SharedUint32Array) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   TypedArrayTestHelper<uint32_t, v8::Uint32Array, v8::SharedArrayBuffer>(
       i::kExternalUint32Array, 0, UINT_MAX);
 }
 
 THREADED_TEST(SharedInt32Array) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   TypedArrayTestHelper<int32_t, v8::Int32Array, v8::SharedArrayBuffer>(
       i::kExternalInt32Array, INT_MIN, INT_MAX);
 }
 
 THREADED_TEST(SharedFloat32Array) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   TypedArrayTestHelper<float, v8::Float32Array, v8::SharedArrayBuffer>(
       i::kExternalFloat32Array, -500, 500);
 }
 
 THREADED_TEST(SharedFloat64Array) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   TypedArrayTestHelper<double, v8::Float64Array, v8::SharedArrayBuffer>(
       i::kExternalFloat64Array, -500, 500);
 }
 
 THREADED_TEST(SharedUint8ClampedArray) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   TypedArrayTestHelper<uint8_t, v8::Uint8ClampedArray, v8::SharedArrayBuffer>(
       i::kExternalUint8ClampedArray, 0, 0xFF);
 }
 
 THREADED_TEST(SharedDataView) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   const int kSize = 50;
 
   LocalContext env;
diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc
index 51294fccc8d888..5e13f3b4bae67f 100644
--- a/deps/v8/test/cctest/test-api.cc
+++ b/deps/v8/test/cctest/test-api.cc
@@ -266,7 +266,7 @@ static void TestSignature(const char* operation, Local<Value> receiver,
 }
 
 THREADED_TEST(ReceiverSignature) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -375,7 +375,7 @@ static void DoNothingCallback(const v8::FunctionCallbackInfo<v8::Value>&) {}
 
 // Regression test for issue chromium:1188563.
 THREADED_TEST(Regress1188563) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -659,7 +659,7 @@ TEST(MakingExternalStringConditions) {
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
-  if (!v8::internal::FLAG_single_generation) {
+  if (!i::v8_flags.single_generation) {
     // Free some space in the new space so that we can check freshness.
     CcTest::CollectGarbage(i::NEW_SPACE);
     CcTest::CollectGarbage(i::NEW_SPACE);
@@ -677,7 +677,7 @@ TEST(MakingExternalStringConditions) {
           .ToLocalChecked();
   i::DeleteArray(two_byte_string);
 
-  if (!v8::internal::FLAG_single_generation) {
+  if (!i::v8_flags.single_generation) {
     // We should refuse to externalize new space strings.
     CHECK(!local_string->CanMakeExternal());
     // Trigger full GC so that the newly allocated string moves to old gen.
@@ -697,7 +697,7 @@ TEST(MakingExternalOneByteStringConditions) {
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
-  if (!v8::internal::FLAG_single_generation) {
+  if (!i::v8_flags.single_generation) {
     // Free some space in the new space so that we can check freshness.
     CcTest::CollectGarbage(i::NEW_SPACE);
     CcTest::CollectGarbage(i::NEW_SPACE);
@@ -709,7 +709,7 @@ TEST(MakingExternalOneByteStringConditions) {
   // Single-character strings should not be externalized because they
   // are always in the RO-space.
   CHECK(!tiny_local_string->CanMakeExternal());
-  if (!v8::internal::FLAG_single_generation) {
+  if (!i::v8_flags.single_generation) {
     // We should refuse to externalize new space strings.
     CHECK(!local_string->CanMakeExternal());
     // Trigger full GC so that the newly allocated string moves to old gen.
@@ -722,7 +722,7 @@ TEST(MakingExternalOneByteStringConditions) {
 
 
 TEST(MakingExternalUnalignedOneByteString) {
-  i::FLAG_stress_concurrent_allocation = false;  // For SimulateFullSpace.
+  i::v8_flags.stress_concurrent_allocation = false;  // For SimulateFullSpace.
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -851,8 +851,8 @@ THREADED_TEST(NewExternalForVeryLongString) {
 
 TEST(ScavengeExternalString) {
   ManualGCScope manual_gc_scope;
-  i::FLAG_stress_compaction = false;
-  i::FLAG_gc_global = false;
+  i::v8_flags.stress_compaction = false;
+  i::v8_flags.gc_global = false;
   int dispose_count = 0;
   bool in_young_generation = false;
   {
@@ -876,8 +876,8 @@ TEST(ScavengeExternalString) {
 
 TEST(ScavengeExternalOneByteString) {
   ManualGCScope manual_gc_scope;
-  i::FLAG_stress_compaction = false;
-  i::FLAG_gc_global = false;
+  i::v8_flags.stress_compaction = false;
+  i::v8_flags.gc_global = false;
   int dispose_count = 0;
   bool in_young_generation = false;
   {
@@ -3747,7 +3747,7 @@ THREADED_TEST(WellKnownSymbols) {
 
 
 THREADED_TEST(GlobalPrivates) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -3962,8 +3962,8 @@ THREADED_TEST(ResettingGlobalHandle) {
     v8::HandleScope scope(isolate);
     global.Reset(isolate, v8_str("str"));
   }
-  v8::internal::GlobalHandles* global_handles =
-      reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
+  i::GlobalHandles* global_handles =
+      reinterpret_cast<i::Isolate*>(isolate)->global_handles();
   size_t initial_handle_count = global_handles->handles_count();
   {
     v8::HandleScope scope(isolate);
@@ -3990,8 +3990,8 @@ THREADED_TEST(ResettingGlobalHandleToEmpty) {
     v8::HandleScope scope(isolate);
     global.Reset(isolate, v8_str("str"));
   }
-  v8::internal::GlobalHandles* global_handles =
-      reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
+  i::GlobalHandles* global_handles =
+      reinterpret_cast<i::Isolate*>(isolate)->global_handles();
   size_t initial_handle_count = global_handles->handles_count();
   {
     v8::HandleScope scope(isolate);
@@ -4028,8 +4028,8 @@ THREADED_TEST(Global) {
     v8::HandleScope scope(isolate);
     global.Reset(isolate, v8_str("str"));
   }
-  v8::internal::GlobalHandles* global_handles =
-      reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
+  i::GlobalHandles* global_handles =
+      reinterpret_cast<i::Isolate*>(isolate)->global_handles();
   size_t initial_handle_count = global_handles->handles_count();
   {
     v8::Global<String> unique(isolate, global);
@@ -4315,8 +4315,8 @@ void TestGlobalValueMap() {
     templ.Reset(isolate, t);
   }
   Map map(isolate);
-  v8::internal::GlobalHandles* global_handles =
-      reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
+  i::GlobalHandles* global_handles =
+      reinterpret_cast<i::Isolate*>(isolate)->global_handles();
   size_t initial_handle_count = global_handles->handles_count();
   CHECK_EQ(0, static_cast<int>(map.Size()));
   {
@@ -4384,8 +4384,8 @@ TEST(GlobalValueMap) {
 TEST(VectorOfGlobals) {
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
-  v8::internal::GlobalHandles* global_handles =
-      reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
+  i::GlobalHandles* global_handles =
+      reinterpret_cast<i::Isolate*>(isolate)->global_handles();
   size_t handle_count = global_handles->handles_count();
   HandleScope scope(isolate);
 
@@ -7599,7 +7599,7 @@ static void SetFlag(const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
 static void IndependentWeakHandle(bool global_gc, bool interlinked) {
   ManualGCScope manual_gc_scope;
   // Parallel scavenge introduces too much fragmentation.
-  i::FLAG_parallel_scavenge = false;
+  i::v8_flags.parallel_scavenge = false;
   v8::Isolate* iso = CcTest::isolate();
   v8::HandleScope scope(iso);
   v8::Local<Context> context = Context::New(iso);
@@ -7620,7 +7620,7 @@ static void IndependentWeakHandle(bool global_gc, bool interlinked) {
       a->Set(context, v8_str("x"), b).FromJust();
       b->Set(context, v8_str("x"), a).FromJust();
     }
-    if (v8::internal::FLAG_single_generation || global_gc) {
+    if (i::v8_flags.single_generation || global_gc) {
       CcTest::CollectAllGarbage();
     } else {
       CcTest::CollectGarbage(i::NEW_SPACE);
@@ -7628,9 +7628,7 @@ static void IndependentWeakHandle(bool global_gc, bool interlinked) {
     v8::Local<Value> big_array = v8::Array::New(CcTest::isolate(), 5000);
     // Verify that we created an array where the space was reserved up front.
     big_array_size =
-        v8::internal::JSArray::cast(*v8::Utils::OpenHandle(*big_array))
-            .elements()
-            .Size();
+        i::JSArray::cast(*v8::Utils::OpenHandle(*big_array)).elements().Size();
     CHECK_LE(20000, big_array_size);
     a->Set(context, v8_str("y"), big_array).FromJust();
     big_heap_size = CcTest::heap()->SizeOfObjects();
@@ -7642,7 +7640,7 @@ static void IndependentWeakHandle(bool global_gc, bool interlinked) {
                           v8::WeakCallbackType::kParameter);
   object_b.handle.SetWeak(&object_b, &SetFlag,
                           v8::WeakCallbackType::kParameter);
-  if (v8::internal::FLAG_single_generation || global_gc) {
+  if (i::v8_flags.single_generation || global_gc) {
     CcTest::CollectAllGarbage();
   } else {
     CcTest::CollectGarbage(i::NEW_SPACE);
@@ -7741,7 +7739,7 @@ void InternalFieldCallback(bool global_gc) {
     handle.SetWeak<v8::Persistent<v8::Object>>(
         &handle, CheckInternalFields, v8::WeakCallbackType::kInternalFields);
   }
-  if (v8::internal::FLAG_single_generation || global_gc) {
+  if (i::v8_flags.single_generation || global_gc) {
     CcTest::CollectAllGarbage();
   } else {
     CcTest::CollectGarbage(i::NEW_SPACE);
@@ -7767,8 +7765,8 @@ static void ResetUseValueAndSetFlag(
   data.GetParameter()->flag = true;
 }
 
-void v8::internal::heap::HeapTester::ResetWeakHandle(bool global_gc) {
-  if (FLAG_stress_incremental_marking) return;
+void i::heap::HeapTester::ResetWeakHandle(bool global_gc) {
+  if (v8_flags.stress_incremental_marking) return;
   using v8::Context;
   using v8::Local;
   using v8::Object;
@@ -7786,7 +7784,7 @@ void v8::internal::heap::HeapTester::ResetWeakHandle(bool global_gc) {
     Local<Object> b(v8::Object::New(iso));
     object_a.handle.Reset(iso, a);
     object_b.handle.Reset(iso, b);
-    if (global_gc || FLAG_single_generation) {
+    if (global_gc || v8_flags.single_generation) {
       CcTest::PreciseCollectAllGarbage();
     } else {
       CcTest::CollectGarbage(i::NEW_SPACE);
@@ -7799,7 +7797,7 @@ void v8::internal::heap::HeapTester::ResetWeakHandle(bool global_gc) {
                           v8::WeakCallbackType::kParameter);
   object_b.handle.SetWeak(&object_b, &ResetUseValueAndSetFlag,
                           v8::WeakCallbackType::kParameter);
-  if (global_gc || FLAG_single_generation) {
+  if (global_gc || v8_flags.single_generation) {
     CcTest::PreciseCollectAllGarbage();
   } else {
     CcTest::CollectGarbage(i::NEW_SPACE);
@@ -7809,8 +7807,8 @@ void v8::internal::heap::HeapTester::ResetWeakHandle(bool global_gc) {
 }
 
 THREADED_HEAP_TEST(ResetWeakHandle) {
-  v8::internal::heap::HeapTester::ResetWeakHandle(false);
-  v8::internal::heap::HeapTester::ResetWeakHandle(true);
+  i::heap::HeapTester::ResetWeakHandle(false);
+  i::heap::HeapTester::ResetWeakHandle(true);
 }
 
 static void InvokeScavenge() { CcTest::CollectGarbage(i::NEW_SPACE); }
@@ -7848,7 +7846,7 @@ THREADED_TEST(GCFromWeakCallbacks) {
   v8::Local<Context> context = Context::New(isolate);
   Context::Scope context_scope(context);
 
-  if (v8::internal::FLAG_single_generation) {
+  if (i::v8_flags.single_generation) {
     FlagAndPersistent object;
     {
       v8::HandleScope handle_scope(isolate);
@@ -10543,7 +10541,7 @@ THREADED_TEST(ShadowObject) {
 THREADED_TEST(ShadowObjectAndDataProperty) {
   // Lite mode doesn't make use of feedback vectors, which is what we
   // want to ensure has the correct form.
-  if (i::FLAG_lite_mode) return;
+  if (i::v8_flags.lite_mode) return;
   // This test mimics the kind of shadow property the Chromium embedder
   // uses for undeclared globals. The IC subsystem has special handling
   // for this case, using a PREMONOMORPHIC state to delay entering
@@ -10551,7 +10549,7 @@ THREADED_TEST(ShadowObjectAndDataProperty) {
   // efficient access and good feedback for optimization.
   v8::Isolate* isolate = CcTest::isolate();
   v8::HandleScope handle_scope(isolate);
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
   Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate);
   LocalContext context(nullptr, global_template);
@@ -10597,9 +10595,9 @@ THREADED_TEST(ShadowObjectAndDataProperty) {
 THREADED_TEST(ShadowObjectAndDataPropertyTurbo) {
   // This test is the same as the previous one except that it triggers
   // optimization of {foo} after its first invocation.
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
-  if (i::FLAG_lite_mode) return;
+  if (i::v8_flags.lite_mode) return;
   v8::Isolate* isolate = CcTest::isolate();
   v8::HandleScope handle_scope(isolate);
 
@@ -10736,7 +10734,7 @@ THREADED_TEST(SetPrototype) {
 // triggers dictionary elements in GetOwnPropertyNames() shouldn't
 // crash the runtime.
 THREADED_TEST(Regress91517) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext context;
   v8::Isolate* isolate = context->GetIsolate();
   v8::HandleScope handle_scope(isolate);
@@ -12939,8 +12937,8 @@ THREADED_TEST(SubclassGetConstructorName) {
 UNINITIALIZED_TEST(SharedObjectGetConstructorName) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  i::FLAG_shared_string_table = true;
-  i::FLAG_harmony_struct = true;
+  i::v8_flags.shared_string_table = true;
+  i::v8_flags.harmony_struct = true;
 
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
@@ -13037,7 +13035,7 @@ static unsigned linear_congruential_generator;
 
 
 void ApiTestFuzzer::SetUp(PartOfTest part) {
-  linear_congruential_generator = i::FLAG_testing_prng_seed;
+  linear_congruential_generator = i::v8_flags.testing_prng_seed;
   fuzzing_ = true;
   int count = RegisterThreadedTest::count();
   int start =  count * part / (LAST_PART + 1);
@@ -13310,7 +13308,7 @@ static void CheckSurvivingGlobalObjectsCount(int expected) {
 
 TEST(DontLeakGlobalObjects) {
   // Regression test for issues 1139850 and 1174891.
-  i::FLAG_expose_gc = true;
+  i::v8_flags.expose_gc = true;
 
   for (int i = 0; i < 5; i++) {
     { v8::HandleScope scope(CcTest::isolate());
@@ -13661,14 +13659,14 @@ static void event_handler(const v8::JitCodeEvent* event) {
 }
 
 UNINITIALIZED_TEST(SetJitCodeEventHandler) {
-  i::FLAG_stress_compaction = true;
-  i::FLAG_incremental_marking = false;
-  i::FLAG_stress_concurrent_allocation = false;  // For SimulateFullSpace.
+  i::v8_flags.stress_compaction = true;
+  i::v8_flags.incremental_marking = false;
+  i::v8_flags.stress_concurrent_allocation = false;  // For SimulateFullSpace.
   // Batch compilation can cause different owning spaces for foo and bar.
 #if ENABLE_SPARKPLUG
-  i::FLAG_baseline_batch_compilation = false;
+  i::v8_flags.baseline_batch_compilation = false;
 #endif
-  if (!i::FLAG_compact) return;
+  if (!i::v8_flags.compact) return;
   const char* script =
       "function bar() {"
       "  var sum = 0;"
@@ -13875,7 +13873,7 @@ TEST(ExternalAllocatedMemory) {
 
 
 TEST(Regress51719) {
-  i::FLAG_incremental_marking = false;
+  i::v8_flags.incremental_marking = false;
   CcTest::InitializeVM();
 
   const int64_t kTriggerGCSize =
@@ -15399,8 +15397,8 @@ static void AsmJsWarningListener(v8::Local<v8::Message> message,
 }
 
 TEST(AsmJsWarning) {
-  i::FLAG_validate_asm = true;
-  if (i::FLAG_suppress_asm_messages) return;
+  i::v8_flags.validate_asm = true;
+  if (i::v8_flags.suppress_asm_messages) return;
 
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
@@ -16031,7 +16029,7 @@ void PromiseRejectCallbackConstructError(
 }
 
 TEST(PromiseRejectCallbackConstructError) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -16493,7 +16491,7 @@ static void CreateGarbageInOldSpace() {
 
 // Test that idle notification can be handled and eventually collects garbage.
 TEST(TestIdleNotification) {
-  if (!i::FLAG_incremental_marking) return;
+  if (!i::v8_flags.incremental_marking) return;
   ManualGCScope manual_gc_scope;
   const intptr_t MB = 1024 * 1024;
   const double IdlePauseInSeconds = 1.0;
@@ -16513,10 +16511,9 @@ TEST(TestIdleNotification) {
         (v8::base::TimeTicks::Now().ToInternalValue() /
          static_cast<double>(v8::base::Time::kMicrosecondsPerSecond)) +
         IdlePauseInSeconds);
-    if (CcTest::heap()->mark_compact_collector()->sweeping_in_progress()) {
-      CcTest::heap()->mark_compact_collector()->EnsureSweepingCompleted(
-          v8::internal::MarkCompactCollector::SweepingForcedFinalizationMode::
-              kV8Only);
+    if (CcTest::heap()->sweeping_in_progress()) {
+      CcTest::heap()->EnsureSweepingCompleted(
+          i::Heap::SweepingForcedFinalizationMode::kV8Only);
     }
   }
   intptr_t final_size = CcTest::heap()->SizeOfObjects();
@@ -16527,8 +16524,7 @@ TEST(TestIdleNotification) {
 TEST(TestMemorySavingsMode) {
   LocalContext context;
   v8::Isolate* isolate = context->GetIsolate();
-  v8::internal::Isolate* i_isolate =
-      reinterpret_cast<v8::internal::Isolate*>(isolate);
+  i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
   CHECK(!i_isolate->IsMemorySavingsModeActive());
   isolate->EnableMemorySavingsMode();
   CHECK(i_isolate->IsMemorySavingsModeActive());
@@ -16636,7 +16632,7 @@ THREADED_TEST(GetHeapStatistics) {
   CHECK_EQ(0u, heap_statistics.used_heap_size());
   c1->GetIsolate()->GetHeapStatistics(&heap_statistics);
   CHECK_NE(static_cast<int>(heap_statistics.total_heap_size()), 0);
-  if (!v8::internal::FLAG_enable_third_party_heap) {
+  if (!i::v8_flags.enable_third_party_heap) {
     // TODO(wenyuzhao): Get used size from third_party_heap interface
     CHECK_NE(static_cast<int>(heap_statistics.used_heap_size()), 0);
   }
@@ -16649,8 +16645,7 @@ TEST(GetHeapSpaceStatistics) {
   v8::HeapStatistics heap_statistics;
 
   // Force allocation in LO_SPACE so that every space has non-zero size.
-  v8::internal::Isolate* i_isolate =
-      reinterpret_cast<v8::internal::Isolate*>(isolate);
+  i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
   auto unused = i_isolate->factory()->TryNewFixedArray(512 * 1024,
                                                        i::AllocationType::kOld);
   USE(unused);
@@ -17121,7 +17116,7 @@ THREADED_TEST(SpaghettiStackReThrow) {
 TEST(Regress528) {
   ManualGCScope manual_gc_scope;
   v8::Isolate* isolate = CcTest::isolate();
-  i::FLAG_retain_maps_for_n_gc = 0;
+  i::v8_flags.retain_maps_for_n_gc = 0;
   v8::HandleScope scope(isolate);
   v8::Local<Context> other_context;
   int gc_count;
@@ -18234,12 +18229,11 @@ static void BreakArrayGuarantees(const char* script) {
     v8::Local<v8::Context> context =
         v8::Local<v8::Context>::New(isolate1, context1);
     v8::Context::Scope context_scope(context);
-    v8::internal::Isolate* i_isolate =
-        reinterpret_cast<v8::internal::Isolate*>(isolate1);
-    CHECK(v8::internal::Protectors::IsNoElementsIntact(i_isolate));
+    i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate1);
+    CHECK(i::Protectors::IsNoElementsIntact(i_isolate));
     // Run something in new isolate.
     CompileRun(script);
-    CHECK(!v8::internal::Protectors::IsNoElementsIntact(i_isolate));
+    CHECK(!i::Protectors::IsNoElementsIntact(i_isolate));
   }
   isolate1->Exit();
   isolate1->Dispose();
@@ -20490,8 +20484,8 @@ static void Helper137002(bool do_store,
 
 
 THREADED_TEST(Regress137002a) {
-  i::FLAG_allow_natives_syntax = true;
-  i::FLAG_compilation_cache = false;
+  i::v8_flags.allow_natives_syntax = true;
+  i::v8_flags.compilation_cache = false;
   v8::HandleScope scope(CcTest::isolate());
   for (int i = 0; i < 16; i++) {
     Helper137002(i & 8, i & 4, i & 2, i & 1);
@@ -20500,7 +20494,7 @@ THREADED_TEST(Regress137002a) {
 
 
 THREADED_TEST(Regress137002b) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext context;
   v8::Isolate* isolate = context->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -20590,7 +20584,7 @@ THREADED_TEST(Regress137002b) {
 
 
 THREADED_TEST(Regress142088) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext context;
   v8::Isolate* isolate = context->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -20611,7 +20605,7 @@ THREADED_TEST(Regress142088) {
 
 
 THREADED_TEST(Regress137496) {
-  i::FLAG_expose_gc = true;
+  i::v8_flags.expose_gc = true;
   LocalContext context;
   v8::HandleScope scope(context->GetIsolate());
 
@@ -20923,7 +20917,7 @@ void CheckCorrectThrow(const char* script) {
 
 
 TEST(AccessCheckThrows) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate* isolate = CcTest::isolate();
   isolate->SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows);
   v8::HandleScope scope(isolate);
@@ -21154,12 +21148,12 @@ class RegExpInterruptTest {
 
 TEST(RegExpInterruptAndCollectAllGarbage) {
   // Move all movable objects on GC.
-  i::FLAG_compact_on_every_full_gc = true;
+  i::v8_flags.compact_on_every_full_gc = true;
   // We want to be stuck regexp execution, so no fallback to linear-time
   // engine.
   // TODO(mbid,v8:10765): Find a way to test interrupt support of the
   // experimental engine.
-  i::FLAG_enable_experimental_regexp_engine_on_excessive_backtracks = false;
+  i::v8_flags.enable_experimental_regexp_engine_on_excessive_backtracks = false;
   RegExpInterruptTest test;
   test.RunTest(RegExpInterruptTest::CollectAllGarbage);
 }
@@ -21169,7 +21163,7 @@ TEST(RegExpInterruptAndMakeSubjectOneByteExternal) {
   // engine.
   // TODO(mbid,v8:10765): Find a way to test interrupt support of the
   // experimental engine.
-  i::FLAG_enable_experimental_regexp_engine_on_excessive_backtracks = false;
+  i::v8_flags.enable_experimental_regexp_engine_on_excessive_backtracks = false;
   RegExpInterruptTest test;
   test.RunTest(RegExpInterruptTest::MakeSubjectOneByteExternal);
 }
@@ -21179,7 +21173,7 @@ TEST(RegExpInterruptAndMakeSubjectTwoByteExternal) {
   // engine.
   // TODO(mbid,v8:10765): Find a way to test interrupt support of the
   // experimental engine.
-  i::FLAG_enable_experimental_regexp_engine_on_excessive_backtracks = false;
+  i::v8_flags.enable_experimental_regexp_engine_on_excessive_backtracks = false;
   RegExpInterruptTest test;
   test.RunTest(RegExpInterruptTest::MakeSubjectTwoByteExternal);
 }
@@ -21401,7 +21395,7 @@ class RequestInterruptTestWithMathAbs
                   .ToLocalChecked())
         .FromJust();
 
-    i::FLAG_allow_natives_syntax = true;
+    i::v8_flags.allow_natives_syntax = true;
     CompileRun(
         "function loopish(o) {"
         "  var pre = 10;"
@@ -21420,7 +21414,7 @@ class RequestInterruptTestWithMathAbs
         "%OptimizeFunctionOnNextCall(loopish);"
         "loopish(Math);");
 
-    i::FLAG_allow_natives_syntax = false;
+    i::v8_flags.allow_natives_syntax = false;
   }
 
  private:
@@ -21961,14 +21955,14 @@ int ApiCallOptimizationChecker::count = 0;
 
 
 TEST(FunctionCallOptimization) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   ApiCallOptimizationChecker checker;
   checker.RunAll();
 }
 
 
 TEST(FunctionCallOptimizationMultipleArgs) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext context;
   v8::Isolate* isolate = context->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -21996,7 +21990,7 @@ static void ReturnsSymbolCallback(
 
 
 TEST(ApiCallbackCanReturnSymbols) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext context;
   v8::Isolate* isolate = context->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -22154,16 +22148,16 @@ void StoringEventLoggerCallback(const char* message, int status) {
 TEST(EventLogging) {
   v8::Isolate* isolate = CcTest::isolate();
   isolate->SetEventLogger(StoringEventLoggerCallback);
-  v8::internal::NestedTimedHistogram histogram(
-      "V8.Test", 0, 10000, v8::internal::TimedHistogramResolution::MILLISECOND,
-      50, reinterpret_cast<v8::internal::Isolate*>(isolate)->counters());
+  i::NestedTimedHistogram histogram(
+      "V8.Test", 0, 10000, i::TimedHistogramResolution::MILLISECOND, 50,
+      reinterpret_cast<i::Isolate*>(isolate)->counters());
   event_count = 0;
   int count = 0;
   {
     CHECK_EQ(0, event_count);
     {
       CHECK_EQ(0, event_count);
-      v8::internal::NestedTimedHistogramScope scope0(&histogram);
+      i::NestedTimedHistogramScope scope0(&histogram);
       CHECK_EQ(0, strcmp("V8.Test", last_event_message));
       CHECK_EQ(v8::LogEventStatus::kStart, last_event_status);
       CHECK_EQ(++count, event_count);
@@ -22171,27 +22165,27 @@ TEST(EventLogging) {
     CHECK_EQ(v8::LogEventStatus::kEnd, last_event_status);
     CHECK_EQ(++count, event_count);
 
-    v8::internal::NestedTimedHistogramScope scope1(&histogram);
+    i::NestedTimedHistogramScope scope1(&histogram);
     CHECK_EQ(0, strcmp("V8.Test", last_event_message));
     CHECK_EQ(v8::LogEventStatus::kStart, last_event_status);
     CHECK_EQ(++count, event_count);
     {
       CHECK_EQ(count, event_count);
-      v8::internal::NestedTimedHistogramScope scope2(&histogram);
+      i::NestedTimedHistogramScope scope2(&histogram);
       CHECK_EQ(0, strcmp("V8.Test", last_event_message));
       CHECK_EQ(v8::LogEventStatus::kStart, last_event_status);
       CHECK_EQ(++count, event_count);
       {
         CHECK_EQ(count, event_count);
-        v8::internal::NestedTimedHistogramScope scope3(&histogram);
+        i::NestedTimedHistogramScope scope3(&histogram);
         CHECK_EQ(++count, event_count);
-        v8::internal::PauseNestedTimedHistogramScope scope4(&histogram);
+        i::PauseNestedTimedHistogramScope scope4(&histogram);
         // The outer timer scope is just paused, no event is emited yet.
         CHECK_EQ(count, event_count);
         {
           CHECK_EQ(count, event_count);
-          v8::internal::NestedTimedHistogramScope scope5(&histogram);
-          v8::internal::NestedTimedHistogramScope scope5_1(&histogram);
+          i::NestedTimedHistogramScope scope5(&histogram);
+          i::NestedTimedHistogramScope scope5_1(&histogram);
           CHECK_EQ(0, strcmp("V8.Test", last_event_message));
           CHECK_EQ(v8::LogEventStatus::kStart, last_event_status);
           count++;
@@ -22205,11 +22199,11 @@ TEST(EventLogging) {
       CHECK_EQ(0, strcmp("V8.Test", last_event_message));
       CHECK_EQ(v8::LogEventStatus::kEnd, last_event_status);
       CHECK_EQ(++count, event_count);
-      v8::internal::PauseNestedTimedHistogramScope scope6(&histogram);
+      i::PauseNestedTimedHistogramScope scope6(&histogram);
       // The outer timer scope is just paused, no event is emited yet.
       CHECK_EQ(count, event_count);
       {
-        v8::internal::PauseNestedTimedHistogramScope scope7(&histogram);
+        i::PauseNestedTimedHistogramScope scope7(&histogram);
         CHECK_EQ(count, event_count);
       }
       CHECK_EQ(count, event_count);
@@ -22853,7 +22847,7 @@ TEST(ScriptPositionInfo) {
 
   i::Handle<i::Script> script1(i::Script::cast(obj->script()), i_isolate);
 
-  v8::internal::Script::PositionInfo info;
+  i::Script::PositionInfo info;
 
   for (int i = 0; i < 2; ++i) {
     // With offset.
@@ -23712,7 +23706,7 @@ TEST(StreamingWithHarmonyScopes) {
 
 namespace {
 void StreamingWithIsolateScriptCache(bool run_gc) {
-  i::FLAG_expose_gc = true;
+  i::v8_flags.expose_gc = true;
   const char* chunks[] = {"'use strict'; (function test() { return 13; })",
                           nullptr};
   const char* full_source = chunks[0];
@@ -23802,7 +23796,7 @@ TEST(StreamingWithIsolateScriptCache) {
 TEST(StreamingWithIsolateScriptCacheClearingRootSFI) {
   // TODO(v8:12808): Remove this check once background compilation is capable of
   // reusing an existing Script.
-  if (v8::internal::FLAG_stress_background_compile) {
+  if (i::v8_flags.stress_background_compile) {
     return;
   }
 
@@ -24017,7 +24011,7 @@ TEST(ModuleCodeCache) {
   {
     // Disable --always_turbofan, otherwise we try to optimize during module
     // instantiation, violating the DisallowCompilation scope.
-    i::FLAG_always_turbofan = false;
+    i::v8_flags.always_turbofan = false;
     v8::Isolate* isolate = v8::Isolate::New(create_params);
     {
       v8::Isolate::Scope iscope(isolate);
@@ -24088,7 +24082,7 @@ TEST(CreateSyntheticModuleGC) {
   // happening during its execution.
   i::HeapAllocator::SetAllocationGcInterval(10);
 #endif
-  i::FLAG_inline_new = false;
+  i::v8_flags.inline_new = false;
 
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
@@ -24674,8 +24668,8 @@ TEST(StringConcatOverflow) {
 
 TEST(TurboAsmDisablesDetach) {
 #ifndef V8_LITE_MODE
-  i::FLAG_turbofan = true;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.turbofan = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   LocalContext context;
   const char* load =
@@ -24751,7 +24745,7 @@ TEST(StreamingScriptWithSourceMappingURLInTheMiddle) {
 TEST(NewStringRangeError) {
   // This test uses a lot of memory and fails with flaky OOM when run
   // with --stress-incremental-marking on TSAN.
-  i::FLAG_stress_incremental_marking = false;
+  i::v8_flags.stress_incremental_marking = false;
   v8::Isolate* isolate = CcTest::isolate();
   v8::HandleScope handle_scope(isolate);
   const int length = i::String::kMaxLength + 1;
@@ -25084,7 +25078,7 @@ class TerminateExecutionThread : public v8::base::Thread {
 };
 
 TEST(FutexInterruption) {
-  i::FLAG_harmony_sharedarraybuffer = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
   v8::Isolate* isolate = CcTest::isolate();
   v8::HandleScope scope(isolate);
   LocalContext env;
@@ -25140,7 +25134,7 @@ TEST(AbortOnUncaughtExceptionNoAbort) {
       v8::ObjectTemplate::New(isolate);
   LocalContext env(nullptr, global_template);
 
-  i::FLAG_abort_on_uncaught_exception = true;
+  i::v8_flags.abort_on_uncaught_exception = true;
   isolate->SetAbortOnUncaughtExceptionCallback(NoAbortOnUncaughtException);
 
   CompileRun("function boom() { throw new Error(\"boom\") }");
@@ -25593,7 +25587,7 @@ class MemoryPressureThread : public v8::base::Thread {
 };
 
 TEST(MemoryPressure) {
-  if (v8::internal::FLAG_optimize_for_size) return;
+  if (i::v8_flags.optimize_for_size) return;
   v8::Isolate* isolate = CcTest::isolate();
   WeakCallCounter counter(1234);
 
@@ -25897,8 +25891,8 @@ THREADED_TEST(GlobalAccessorInfo) {
 TEST(DeterministicRandomNumberGeneration) {
   v8::HandleScope scope(CcTest::isolate());
 
-  int previous_seed = v8::internal::FLAG_random_seed;
-  v8::internal::FLAG_random_seed = 1234;
+  int previous_seed = i::v8_flags.random_seed;
+  i::v8_flags.random_seed = 1234;
 
   double first_value;
   double second_value;
@@ -25916,7 +25910,7 @@ TEST(DeterministicRandomNumberGeneration) {
   }
   CHECK_EQ(first_value, second_value);
 
-  v8::internal::FLAG_random_seed = previous_seed;
+  i::v8_flags.random_seed = previous_seed;
 }
 
 UNINITIALIZED_TEST(AllowAtomicsWait) {
@@ -26278,7 +26272,7 @@ v8::MaybeLocal<v8::Context> HostCreateShadowRealmContextCallbackStatic(
 }
 
 TEST(CreateShadowRealmContextHostNotSupported) {
-  i::FLAG_harmony_shadow_realm = true;
+  i::v8_flags.harmony_shadow_realm = true;
   LocalContext context;
   v8::Isolate* isolate = context->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -26304,7 +26298,7 @@ TEST(CreateShadowRealmContextHostNotSupported) {
 }
 
 TEST(CreateShadowRealmContext) {
-  i::FLAG_harmony_shadow_realm = true;
+  i::v8_flags.harmony_shadow_realm = true;
   LocalContext context;
   v8::Isolate* isolate = context->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -26333,7 +26327,7 @@ v8::MaybeLocal<v8::Context> HostCreateShadowRealmContextCallbackThrow(
 }
 
 TEST(CreateShadowRealmContextThrow) {
-  i::FLAG_harmony_shadow_realm = true;
+  i::v8_flags.harmony_shadow_realm = true;
   LocalContext context;
   v8::Isolate* isolate = context->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -26754,7 +26748,8 @@ namespace v8 {
 namespace internal {
 namespace wasm {
 TEST(WasmI32AtomicWaitCallback) {
-  FlagScope<bool> wasm_threads_flag(&i::FLAG_experimental_wasm_threads, true);
+  FlagScope<bool> wasm_threads_flag(&i::v8_flags.experimental_wasm_threads,
+                                    true);
   WasmRunner<int32_t, int32_t, int32_t, double> r(TestExecutionTier::kTurbofan);
   r.builder().AddMemory(kWasmPageSize, SharedFlag::kShared);
   r.builder().SetHasSharedMemory();
@@ -26790,7 +26785,8 @@ TEST(WasmI32AtomicWaitCallback) {
 }
 
 TEST(WasmI64AtomicWaitCallback) {
-  FlagScope<bool> wasm_threads_flag(&i::FLAG_experimental_wasm_threads, true);
+  FlagScope<bool> wasm_threads_flag(&i::v8_flags.experimental_wasm_threads,
+                                    true);
   WasmRunner<int32_t, int32_t, double, double> r(TestExecutionTier::kTurbofan);
   r.builder().AddMemory(kWasmPageSize, SharedFlag::kShared);
   r.builder().SetHasSharedMemory();
@@ -27470,14 +27466,14 @@ static void CallIsolate2(const v8::FunctionCallbackInfo<v8::Value>& args) {
 
 UNINITIALIZED_TEST(NestedIsolates) {
 #ifdef VERIFY_HEAP
-  i::FLAG_verify_heap = true;
+  i::v8_flags.verify_heap = true;
 #endif  // VERIFY_HEAP
   // Create two isolates and set up C++ functions via function templates that
   // call into the other isolate. Recurse a few times, trigger GC along the way,
   // and finally capture a stack trace. Check that the stack trace only includes
   // frames from its own isolate.
-  i::FLAG_stack_trace_limit = 20;
-  i::FLAG_experimental_stack_trace_frames = true;
+  i::v8_flags.stack_trace_limit = 20;
+  i::v8_flags.experimental_stack_trace_frames = true;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   isolate_1 = v8::Isolate::New(create_params);
@@ -28283,15 +28279,15 @@ void CheckDynamicTypeInfo() {
 
 TEST(FastApiStackSlot) {
 #ifndef V8_LITE_MODE
-  if (i::FLAG_jitless) return;
+  if (i::v8_flags.jitless) return;
 
-  v8::internal::FLAG_turbofan = true;
-  v8::internal::FLAG_turbo_fast_api_calls = true;
-  v8::internal::FLAG_allow_natives_syntax = true;
+  i::v8_flags.turbofan = true;
+  i::v8_flags.turbo_fast_api_calls = true;
+  i::v8_flags.allow_natives_syntax = true;
   // Disable --always_turbofan, otherwise we haven't generated the necessary
   // feedback to go down the "best optimization" path for the fast call.
-  v8::internal::FLAG_always_turbofan = false;
-  v8::internal::FlagList::EnforceFlagImplications();
+  i::v8_flags.always_turbofan = false;
+  i::FlagList::EnforceFlagImplications();
 
   v8::Isolate* isolate = CcTest::isolate();
   i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
@@ -28335,15 +28331,15 @@ TEST(FastApiStackSlot) {
 
 TEST(FastApiCalls) {
 #ifndef V8_LITE_MODE
-  if (i::FLAG_jitless) return;
+  if (i::v8_flags.jitless) return;
 
-  v8::internal::FLAG_turbofan = true;
-  v8::internal::FLAG_turbo_fast_api_calls = true;
-  v8::internal::FLAG_allow_natives_syntax = true;
+  i::v8_flags.turbofan = true;
+  i::v8_flags.turbo_fast_api_calls = true;
+  i::v8_flags.allow_natives_syntax = true;
   // Disable --always_turbofan, otherwise we haven't generated the necessary
   // feedback to go down the "best optimization" path for the fast call.
-  v8::internal::FLAG_always_turbofan = false;
-  v8::internal::FlagList::EnforceFlagImplications();
+  i::v8_flags.always_turbofan = false;
+  i::FlagList::EnforceFlagImplications();
 
   CcTest::InitializeVM();
   v8::Isolate* isolate = CcTest::isolate();
@@ -28885,15 +28881,15 @@ void SequenceSlowCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
 
 TEST(FastApiSequenceOverloads) {
 #ifndef V8_LITE_MODE
-  if (i::FLAG_jitless) return;
+  if (i::v8_flags.jitless) return;
 
-  v8::internal::FLAG_turbofan = true;
-  v8::internal::FLAG_turbo_fast_api_calls = true;
-  v8::internal::FLAG_allow_natives_syntax = true;
+  i::v8_flags.turbofan = true;
+  i::v8_flags.turbo_fast_api_calls = true;
+  i::v8_flags.allow_natives_syntax = true;
   // Disable --always_turbofan, otherwise we haven't generated the necessary
   // feedback to go down the "best optimization" path for the fast call.
-  v8::internal::FLAG_always_turbofan = false;
-  v8::internal::FlagList::EnforceFlagImplications();
+  i::v8_flags.always_turbofan = false;
+  i::FlagList::EnforceFlagImplications();
 
   v8::Isolate* isolate = CcTest::isolate();
   HandleScope handle_scope(isolate);
@@ -28943,15 +28939,15 @@ TEST(FastApiSequenceOverloads) {
 
 TEST(FastApiOverloadResolution) {
 #ifndef V8_LITE_MODE
-  if (i::FLAG_jitless) return;
+  if (i::v8_flags.jitless) return;
 
-  v8::internal::FLAG_turbofan = true;
-  v8::internal::FLAG_turbo_fast_api_calls = true;
-  v8::internal::FLAG_allow_natives_syntax = true;
+  i::v8_flags.turbofan = true;
+  i::v8_flags.turbo_fast_api_calls = true;
+  i::v8_flags.allow_natives_syntax = true;
   // Disable --always_turbofan, otherwise we haven't generated the necessary
   // feedback to go down the "best optimization" path for the fast call.
-  v8::internal::FLAG_always_turbofan = false;
-  v8::internal::FlagList::EnforceFlagImplications();
+  i::v8_flags.always_turbofan = false;
+  i::FlagList::EnforceFlagImplications();
 
   v8::CFunction typed_array_callback =
       v8::CFunctionBuilder().Fn(FastCallback1TypedArray).Build();
@@ -29116,7 +29112,7 @@ TEST(TriggerDelayedMainThreadMetricsEvent) {
   using v8::Context;
   using v8::Local;
   using v8::MaybeLocal;
-  i::FLAG_stress_concurrent_allocation = false;
+  i::v8_flags.stress_concurrent_allocation = false;
 
   // Set up isolate and context.
   v8::Isolate* iso = CcTest::isolate();
@@ -29142,8 +29138,7 @@ TEST(TriggerDelayedMainThreadMetricsEvent) {
     CHECK_EQ(recorder->count_, 0);        // Unchanged.
     CHECK_EQ(recorder->time_in_us_, -1);  // Unchanged.
     v8::base::OS::Sleep(v8::base::TimeDelta::FromMilliseconds(1100));
-    while (v8::platform::PumpMessageLoop(v8::internal::V8::GetCurrentPlatform(),
-                                         iso)) {
+    while (v8::platform::PumpMessageLoop(i::V8::GetCurrentPlatform(), iso)) {
     }
     CHECK_EQ(recorder->count_, 1);  // Increased.
     CHECK_GT(recorder->time_in_us_, 100);
@@ -29155,8 +29150,7 @@ TEST(TriggerDelayedMainThreadMetricsEvent) {
   // invalid.
   i_iso->metrics_recorder()->DelayMainThreadEvent(event, context_id);
   v8::base::OS::Sleep(v8::base::TimeDelta::FromMilliseconds(1100));
-  while (v8::platform::PumpMessageLoop(v8::internal::V8::GetCurrentPlatform(),
-                                       iso)) {
+  while (v8::platform::PumpMessageLoop(i::V8::GetCurrentPlatform(), iso)) {
   }
   CHECK_EQ(recorder->count_, 1);  // Unchanged.
 }
@@ -29342,24 +29336,24 @@ TEST(TestSetSabConstructorEnabledCallback) {
 
   // {Isolate::IsSharedArrayBufferConstructorEnabled} calls the callback set by
   // the embedder if such a callback exists. Otherwise it returns
-  // {FLAG_harmony_sharedarraybuffer}. First we test that the flag is returned
-  // correctly if no callback is set. Then we test that the flag is ignored if
-  // the callback is set.
+  // {v8_flags.harmony_sharedarraybuffer}. First we test that the flag is
+  // returned correctly if no callback is set. Then we test that the flag is
+  // ignored if the callback is set.
 
-  i::FLAG_harmony_sharedarraybuffer = false;
-  i::FLAG_enable_sharedarraybuffer_per_context = false;
+  i::v8_flags.harmony_sharedarraybuffer = false;
+  i::v8_flags.enable_sharedarraybuffer_per_context = false;
   CHECK(!i_isolate->IsSharedArrayBufferConstructorEnabled(i_context));
 
-  i::FLAG_harmony_sharedarraybuffer = false;
-  i::FLAG_enable_sharedarraybuffer_per_context = false;
+  i::v8_flags.harmony_sharedarraybuffer = false;
+  i::v8_flags.enable_sharedarraybuffer_per_context = false;
   CHECK(!i_isolate->IsSharedArrayBufferConstructorEnabled(i_context));
 
-  i::FLAG_harmony_sharedarraybuffer = true;
-  i::FLAG_enable_sharedarraybuffer_per_context = false;
+  i::v8_flags.harmony_sharedarraybuffer = true;
+  i::v8_flags.enable_sharedarraybuffer_per_context = false;
   CHECK(i_isolate->IsSharedArrayBufferConstructorEnabled(i_context));
 
-  i::FLAG_harmony_sharedarraybuffer = true;
-  i::FLAG_enable_sharedarraybuffer_per_context = true;
+  i::v8_flags.harmony_sharedarraybuffer = true;
+  i::v8_flags.enable_sharedarraybuffer_per_context = true;
   CHECK(!i_isolate->IsSharedArrayBufferConstructorEnabled(i_context));
 
   isolate->SetSharedArrayBufferConstructorEnabledCallback(
@@ -29382,7 +29376,7 @@ TEST(EmbedderInstanceTypes) {
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
-  i::FLAG_embedder_instance_types = true;
+  i::v8_flags.embedder_instance_types = true;
   Local<FunctionTemplate> node = FunctionTemplate::New(isolate);
   Local<ObjectTemplate> proto_template = node->PrototypeTemplate();
   Local<FunctionTemplate> nodeType = v8::FunctionTemplate::New(
diff --git a/deps/v8/test/cctest/test-assembler-arm64.cc b/deps/v8/test/cctest/test-assembler-arm64.cc
index 5653da74927d46..efcc5ebad1a121 100644
--- a/deps/v8/test/cctest/test-assembler-arm64.cc
+++ b/deps/v8/test/cctest/test-assembler-arm64.cc
@@ -132,7 +132,7 @@ static void InitializeVM() {
   RegisterDump core;                                                          \
   HandleScope handle_scope(isolate);                                          \
   Handle<Code> code;                                                          \
-  if (i::FLAG_trace_sim) {                                                    \
+  if (i::v8_flags.trace_sim) {                                                \
     pdis.reset(new PrintDisassembler(stdout));                                \
     decoder->PrependVisitor(pdis.get());                                      \
   }
@@ -167,7 +167,7 @@ static void InitializeVM() {
     CodeDesc desc;                                                             \
     __ GetCode(masm.isolate(), &desc);                                         \
     code = Factory::CodeBuilder(isolate, desc, CodeKind::FOR_TESTING).Build(); \
-    if (FLAG_print_code) code->Print();                                        \
+    if (v8_flags.print_code) code->Print();                                    \
   }
 
 #else  // ifdef USE_SIMULATOR.
@@ -215,7 +215,7 @@ static void InitializeVM() {
     CodeDesc desc;                                                             \
     __ GetCode(masm.isolate(), &desc);                                         \
     code = Factory::CodeBuilder(isolate, desc, CodeKind::FOR_TESTING).Build(); \
-    if (FLAG_print_code) code->Print();                                        \
+    if (v8_flags.print_code) code->Print();                                    \
   }
 
 #endif  // ifdef USE_SIMULATOR.
@@ -11842,7 +11842,7 @@ TEST(system_msr) {
 }
 
 TEST(system_pauth_b) {
-  i::FLAG_sim_abort_on_bad_auth = false;
+  i::v8_flags.sim_abort_on_bad_auth = false;
   SETUP();
   START();
 
diff --git a/deps/v8/test/cctest/test-assembler-ia32.cc b/deps/v8/test/cctest/test-assembler-ia32.cc
index 962fd142b4f6bf..644b2f51d63e2d 100644
--- a/deps/v8/test/cctest/test-assembler-ia32.cc
+++ b/deps/v8/test/cctest/test-assembler-ia32.cc
@@ -138,7 +138,6 @@ TEST(AssemblerIa322) {
 
   // some relocated stuff here, not executed
   __ mov(eax, isolate->factory()->true_value());
-  __ jmp(kNullAddress, RelocInfo::RUNTIME_ENTRY);
 
   CodeDesc desc;
   assm.GetCode(isolate, &desc);
diff --git a/deps/v8/test/cctest/test-assembler-mips64.cc b/deps/v8/test/cctest/test-assembler-mips64.cc
index b2b1d7145b9e41..6e57ca33084ad9 100644
--- a/deps/v8/test/cctest/test-assembler-mips64.cc
+++ b/deps/v8/test/cctest/test-assembler-mips64.cc
@@ -6216,7 +6216,7 @@ TEST(Call_with_trampoline) {
   HandleScope scope(isolate);
   MacroAssembler assm(isolate, v8::internal::CodeObjectRequired::kYes);
 
-  int next_buffer_check_ = FLAG_force_long_branches
+  int next_buffer_check_ = v8_flags.force_long_branches
                                ? kMaxInt
                                : TurboAssembler::kMaxBranchOffset -
                                      TurboAssembler::kTrampolineSlotsSize * 16;
@@ -6233,7 +6233,7 @@ TEST(Call_with_trampoline) {
   int pc_offset_before = __ pc_offset();
   {
     // There should be a trampoline after this Call
-    __ Call(FUNCTION_ADDR(DummyFunction), RelocInfo::RUNTIME_ENTRY);
+    __ Call(FUNCTION_ADDR(DummyFunction), RelocInfo::EXTERNAL_REFERENCE);
   }
   int pc_offset_after = __ pc_offset();
   int safepoint_pc_offset = __ pc_offset_for_safepoint();
@@ -9616,7 +9616,7 @@ void run_msa_mi10(InstFunc GenerateVectorInstructionFunc) {
   T* in_array_middle = in_test_vector + arraysize(in_test_vector) / 2;
   T* out_array_middle = out_test_vector + arraysize(out_test_vector) / 2;
 
-  v8::base::RandomNumberGenerator rand_gen(FLAG_random_seed);
+  v8::base::RandomNumberGenerator rand_gen(v8_flags.random_seed);
   for (unsigned int i = 0; i < arraysize(in_test_vector); i++) {
     in_test_vector[i] = static_cast<T>(rand_gen.NextInt());
     out_test_vector[i] = 0;
diff --git a/deps/v8/test/cctest/test-assembler-riscv32.cc b/deps/v8/test/cctest/test-assembler-riscv32.cc
index 29f157055f877f..a72834e578f4c5 100644
--- a/deps/v8/test/cctest/test-assembler-riscv32.cc
+++ b/deps/v8/test/cctest/test-assembler-riscv32.cc
@@ -77,7 +77,7 @@ using F5 = void*(void* p0, void* p1, int p2, int p3, int p4);
 #define UTEST_R1_FORM_WITH_RES_C(instr_name, in_type, out_type, rs1_val, \
                                  expected_res)                           \
   TEST(RISCV_UTEST_##instr_name) {                                       \
-    i::FLAG_riscv_c_extension = true;                                    \
+    i::v8_flags.riscv_c_extension = true;                                \
     CcTest::InitializeVM();                                              \
     auto fn = [](MacroAssembler& assm) { __ instr_name(a0, a0); };       \
     auto res = GenAndRunTest<out_type, in_type>(rs1_val, fn);            \
@@ -1070,7 +1070,7 @@ TEST(NAN_BOX) {
 
 TEST(RVC_CI) {
   // Test RV64C extension CI type instructions.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.addi
@@ -1116,7 +1116,7 @@ TEST(RVC_CI) {
 }
 
 TEST(RVC_CIW) {
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.addi4spn
@@ -1134,7 +1134,7 @@ TEST(RVC_CIW) {
 
 TEST(RVC_CR) {
   // Test RV64C extension CR type instructions.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.add
@@ -1150,7 +1150,7 @@ TEST(RVC_CR) {
 
 TEST(RVC_CA) {
   // Test RV64C extension CA type instructions.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.sub
@@ -1196,7 +1196,7 @@ TEST(RVC_CA) {
 
 TEST(RVC_LOAD_STORE_SP) {
   // Test RV32C extension flwsp/fswsp, lwsp/swsp.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   {
@@ -1220,7 +1220,7 @@ TEST(RVC_LOAD_STORE_SP) {
 
 TEST(RVC_LOAD_STORE_COMPRESSED) {
   // Test RV64C extension fld,  lw, ld.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
 
   CcTest::InitializeVM();
   Isolate* isolate = CcTest::i_isolate();
@@ -1252,7 +1252,7 @@ TEST(RVC_LOAD_STORE_COMPRESSED) {
 }
 
 TEST(RVC_JUMP) {
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   Label L, C;
@@ -1278,7 +1278,7 @@ TEST(RVC_JUMP) {
 
 TEST(RVC_CB) {
   // Test RV64C extension CI type instructions.
-  FLAG_riscv_c_extension = true;
+  v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.srai
@@ -1304,7 +1304,7 @@ TEST(RVC_CB) {
 }
 
 TEST(RVC_CB_BRANCH) {
-  FLAG_riscv_c_extension = true;
+  v8_flags.riscv_c_extension = true;
   // Test floating point compare and
   // branch instructions.
   CcTest::InitializeVM();
@@ -2145,6 +2145,11 @@ UTEST_RVV_VFW_VF_FORM_WITH_OP(vfwmul_vf, *, false, is_invalid_fmul)
     for (float rs1_fval : array) {                                            \
       for (float rs2_fval : array) {                                          \
         for (float rs3_fval : array) {                                        \
+          double rs1_dval = base::bit_cast<double>(                           \
+              (uint64_t)base::bit_cast<uint32_t>(rs1_fval) << 32 |            \
+              base::bit_cast<uint32_t>(rs1_fval));                            \
+          double rs2_dval = static_cast<double>(rs2_fval);                    \
+          double rs3_dval = static_cast<double>(rs3_fval);                    \
           double res =                                                        \
               GenAndRunTest<double, float>(rs1_fval, rs2_fval, rs3_fval, fn); \
           CHECK_DOUBLE_EQ((expect_res), res);                                 \
@@ -2170,6 +2175,11 @@ UTEST_RVV_VFW_VF_FORM_WITH_OP(vfwmul_vf, *, false, is_invalid_fmul)
     for (float rs1_fval : array) {                                            \
       for (float rs2_fval : array) {                                          \
         for (float rs3_fval : array) {                                        \
+          double rs1_dval = base::bit_cast<double>(                           \
+              (uint64_t)base::bit_cast<uint32_t>(rs1_fval) << 32 |            \
+              base::bit_cast<uint32_t>(rs1_fval));                            \
+          double rs2_dval = static_cast<double>(rs2_fval);                    \
+          double rs3_dval = static_cast<double>(rs3_fval);                    \
           double res =                                                        \
               GenAndRunTest<double, float>(rs1_fval, rs2_fval, rs3_fval, fn); \
           CHECK_DOUBLE_EQ((expect_res), res);                                 \
@@ -2180,21 +2190,21 @@ UTEST_RVV_VFW_VF_FORM_WITH_OP(vfwmul_vf, *, false, is_invalid_fmul)
 
 #define ARRAY_FLOAT compiler::ValueHelper::GetVector<float>()
 UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES(vfwmacc_vv, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, rs3_fval, rs1_fval))
+                                   std::fma(rs2_dval, rs3_dval, rs1_dval))
 UTEST_RVV_VFW_FMA_VF_FORM_WITH_RES(vfwmacc_vf, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, rs3_fval, rs1_fval))
+                                   std::fma(rs2_dval, rs3_dval, rs1_dval))
 UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES(vfwnmacc_vv, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, -rs3_fval, -rs1_fval))
+                                   std::fma(rs2_dval, -rs3_dval, -rs1_dval))
 UTEST_RVV_VFW_FMA_VF_FORM_WITH_RES(vfwnmacc_vf, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, -rs3_fval, -rs1_fval))
+                                   std::fma(rs2_dval, -rs3_dval, -rs1_dval))
 UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES(vfwmsac_vv, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, rs3_fval, -rs1_fval))
+                                   std::fma(rs2_dval, rs3_dval, -rs1_dval))
 UTEST_RVV_VFW_FMA_VF_FORM_WITH_RES(vfwmsac_vf, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, rs3_fval, -rs1_fval))
+                                   std::fma(rs2_dval, rs3_dval, -rs1_dval))
 UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES(vfwnmsac_vv, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, -rs3_fval, rs1_fval))
+                                   std::fma(rs2_dval, -rs3_dval, rs1_dval))
 UTEST_RVV_VFW_FMA_VF_FORM_WITH_RES(vfwnmsac_vf, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, -rs3_fval, rs1_fval))
+                                   std::fma(rs2_dval, -rs3_dval, rs1_dval))
 
 #undef ARRAY_FLOAT
 #undef UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES
@@ -2304,7 +2314,9 @@ UTEST_RVV_FMA_VF_FORM_WITH_RES(vfnmsac_vf, ARRAY_FLOAT,
     for (float rs1_fval : compiler::ValueHelper::GetVector<float>()) { \
       std::vector<double> temp_arr(kRvvVLEN / 32,                      \
                                    static_cast<double>(rs1_fval));     \
-      double expect_res = rs1_fval;                                    \
+      double expect_res = base::bit_cast<double>(                      \
+          (uint64_t)base::bit_cast<uint32_t>(rs1_fval) << 32 |         \
+          base::bit_cast<uint32_t>(rs1_fval));                         \
       for (double val : temp_arr) {                                    \
         expect_res += val;                                             \
         if (std::isnan(expect_res)) {                                  \
diff --git a/deps/v8/test/cctest/test-assembler-riscv64.cc b/deps/v8/test/cctest/test-assembler-riscv64.cc
index 804ca05824650e..898929b16d760d 100644
--- a/deps/v8/test/cctest/test-assembler-riscv64.cc
+++ b/deps/v8/test/cctest/test-assembler-riscv64.cc
@@ -79,7 +79,7 @@ using F5 = void*(void* p0, void* p1, int p2, int p3, int p4);
 #define UTEST_R1_FORM_WITH_RES_C(instr_name, in_type, out_type, rs1_val, \
                                  expected_res)                           \
   TEST(RISCV_UTEST_##instr_name) {                                       \
-    i::FLAG_riscv_c_extension = true;                                    \
+    i::v8_flags.riscv_c_extension = true;                                \
     CcTest::InitializeVM();                                              \
     auto fn = [](MacroAssembler& assm) { __ instr_name(a0, a0); };       \
     auto res = GenAndRunTest<out_type, in_type>(rs1_val, fn);            \
@@ -1211,7 +1211,7 @@ TEST(NAN_BOX) {
 
 TEST(RVC_CI) {
   // Test RV64C extension CI type instructions.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.addi
@@ -1264,7 +1264,7 @@ TEST(RVC_CI) {
 }
 
 TEST(RVC_CIW) {
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.addi4spn
@@ -1282,7 +1282,7 @@ TEST(RVC_CIW) {
 
 TEST(RVC_CR) {
   // Test RV64C extension CR type instructions.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.add
@@ -1298,7 +1298,7 @@ TEST(RVC_CR) {
 
 TEST(RVC_CA) {
   // Test RV64C extension CA type instructions.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.sub
@@ -1364,7 +1364,7 @@ TEST(RVC_CA) {
 
 TEST(RVC_LOAD_STORE_SP) {
   // Test RV64C extension fldsp/fsdsp, lwsp/swsp, ldsp/sdsp.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   {
@@ -1397,7 +1397,7 @@ TEST(RVC_LOAD_STORE_SP) {
 
 TEST(RVC_LOAD_STORE_COMPRESSED) {
   // Test RV64C extension fld,  lw, ld.
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
 
   CcTest::InitializeVM();
   Isolate* isolate = CcTest::i_isolate();
@@ -1479,7 +1479,7 @@ TEST(RVC_LOAD_STORE_COMPRESSED) {
 }
 
 TEST(RVC_JUMP) {
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   Label L, C;
@@ -1505,7 +1505,7 @@ TEST(RVC_JUMP) {
 
 TEST(RVC_CB) {
   // Test RV64C extension CI type instructions.
-  FLAG_riscv_c_extension = true;
+  v8_flags.riscv_c_extension = true;
   CcTest::InitializeVM();
 
   // Test c.srai
@@ -1531,7 +1531,7 @@ TEST(RVC_CB) {
 }
 
 TEST(RVC_CB_BRANCH) {
-  FLAG_riscv_c_extension = true;
+  v8_flags.riscv_c_extension = true;
   // Test floating point compare and
   // branch instructions.
   CcTest::InitializeVM();
@@ -2409,6 +2409,11 @@ UTEST_RVV_VFW_VF_FORM_WITH_OP(vfwmul_vf, *, false, is_invalid_fmul)
     for (float rs1_fval : array) {                                            \
       for (float rs2_fval : array) {                                          \
         for (float rs3_fval : array) {                                        \
+          double rs1_dval = base::bit_cast<double>(                           \
+              (uint64_t)base::bit_cast<uint32_t>(rs1_fval) << 32 |            \
+              base::bit_cast<uint32_t>(rs1_fval));                            \
+          double rs2_dval = static_cast<double>(rs2_fval);                    \
+          double rs3_dval = static_cast<double>(rs3_fval);                    \
           double res =                                                        \
               GenAndRunTest<double, float>(rs1_fval, rs2_fval, rs3_fval, fn); \
           CHECK_DOUBLE_EQ((expect_res), res);                                 \
@@ -2434,6 +2439,11 @@ UTEST_RVV_VFW_VF_FORM_WITH_OP(vfwmul_vf, *, false, is_invalid_fmul)
     for (float rs1_fval : array) {                                            \
       for (float rs2_fval : array) {                                          \
         for (float rs3_fval : array) {                                        \
+          double rs1_dval = base::bit_cast<double>(                           \
+              (uint64_t)base::bit_cast<uint32_t>(rs1_fval) << 32 |            \
+              base::bit_cast<uint32_t>(rs1_fval));                            \
+          double rs2_dval = static_cast<double>(rs2_fval);                    \
+          double rs3_dval = static_cast<double>(rs3_fval);                    \
           double res =                                                        \
               GenAndRunTest<double, float>(rs1_fval, rs2_fval, rs3_fval, fn); \
           CHECK_DOUBLE_EQ((expect_res), res);                                 \
@@ -2444,21 +2454,21 @@ UTEST_RVV_VFW_VF_FORM_WITH_OP(vfwmul_vf, *, false, is_invalid_fmul)
 
 #define ARRAY_FLOAT compiler::ValueHelper::GetVector<float>()
 UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES(vfwmacc_vv, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, rs3_fval, rs1_fval))
+                                   std::fma(rs2_dval, rs3_dval, rs1_dval))
 UTEST_RVV_VFW_FMA_VF_FORM_WITH_RES(vfwmacc_vf, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, rs3_fval, rs1_fval))
+                                   std::fma(rs2_dval, rs3_dval, rs1_dval))
 UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES(vfwnmacc_vv, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, -rs3_fval, -rs1_fval))
+                                   std::fma(rs2_dval, -rs3_dval, -rs1_dval))
 UTEST_RVV_VFW_FMA_VF_FORM_WITH_RES(vfwnmacc_vf, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, -rs3_fval, -rs1_fval))
+                                   std::fma(rs2_dval, -rs3_dval, -rs1_dval))
 UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES(vfwmsac_vv, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, rs3_fval, -rs1_fval))
+                                   std::fma(rs2_dval, rs3_dval, -rs1_dval))
 UTEST_RVV_VFW_FMA_VF_FORM_WITH_RES(vfwmsac_vf, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, rs3_fval, -rs1_fval))
+                                   std::fma(rs2_dval, rs3_dval, -rs1_dval))
 UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES(vfwnmsac_vv, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, -rs3_fval, rs1_fval))
+                                   std::fma(rs2_dval, -rs3_dval, rs1_dval))
 UTEST_RVV_VFW_FMA_VF_FORM_WITH_RES(vfwnmsac_vf, ARRAY_FLOAT,
-                                   std::fma(rs2_fval, -rs3_fval, rs1_fval))
+                                   std::fma(rs2_dval, -rs3_dval, rs1_dval))
 
 #undef ARRAY_FLOAT
 #undef UTEST_RVV_VFW_FMA_VV_FORM_WITH_RES
@@ -2568,7 +2578,9 @@ UTEST_RVV_FMA_VF_FORM_WITH_RES(vfnmsac_vf, ARRAY_FLOAT,
     for (float rs1_fval : compiler::ValueHelper::GetVector<float>()) { \
       std::vector<double> temp_arr(kRvvVLEN / 32,                      \
                                    static_cast<double>(rs1_fval));     \
-      double expect_res = rs1_fval;                                    \
+      double expect_res = base::bit_cast<double>(                      \
+          (uint64_t)base::bit_cast<uint32_t>(rs1_fval) << 32 |         \
+          base::bit_cast<uint32_t>(rs1_fval));                         \
       for (double val : temp_arr) {                                    \
         expect_res += val;                                             \
         if (std::isnan(expect_res)) {                                  \
diff --git a/deps/v8/test/cctest/test-code-stub-assembler.cc b/deps/v8/test/cctest/test-code-stub-assembler.cc
index e2f26c98092496..53ad0a95e2e63f 100644
--- a/deps/v8/test/cctest/test-code-stub-assembler.cc
+++ b/deps/v8/test/cctest/test-code-stub-assembler.cc
@@ -493,7 +493,7 @@ TEST(ComputeIntegerHash) {
 
   FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
 
-  base::RandomNumberGenerator rand_gen(FLAG_random_seed);
+  base::RandomNumberGenerator rand_gen(v8_flags.random_seed);
 
   for (int i = 0; i < 1024; i++) {
     int k = rand_gen.NextInt(Smi::kMaxValue);
@@ -976,7 +976,7 @@ TEST(NumberDictionaryLookup) {
   Handle<Object> fake_value(Smi::FromInt(42), isolate);
   PropertyDetails fake_details = PropertyDetails::Empty();
 
-  base::RandomNumberGenerator rand_gen(FLAG_random_seed);
+  base::RandomNumberGenerator rand_gen(v8_flags.random_seed);
 
   for (int i = 0; i < kKeysCount; i++) {
     int random_key = rand_gen.NextInt(Smi::kMaxValue);
@@ -1065,7 +1065,7 @@ TEST(TransitionLookup) {
   Handle<Map> root_map = Map::Create(isolate, 0);
   Handle<Name> keys[kKeysCount];
 
-  base::RandomNumberGenerator rand_gen(FLAG_random_seed);
+  base::RandomNumberGenerator rand_gen(v8_flags.random_seed);
 
   Factory* factory = isolate->factory();
   Handle<FieldType> any = FieldType::Any(isolate);
@@ -1457,7 +1457,7 @@ TEST(TryGetOwnProperty) {
   };
   static_assert(arraysize(values) < arraysize(names));
 
-  base::RandomNumberGenerator rand_gen(FLAG_random_seed);
+  base::RandomNumberGenerator rand_gen(v8_flags.random_seed);
 
   std::vector<Handle<JSObject>> objects;
 
@@ -4029,8 +4029,8 @@ TEST(InstructionSchedulingCallerSavedRegisters) {
   // This is a regression test for v8:9775, where TF's instruction scheduler
   // incorrectly moved pure operations in between a ArchSaveCallerRegisters and
   // a ArchRestoreCallerRegisters instruction.
-  bool old_turbo_instruction_scheduling = FLAG_turbo_instruction_scheduling;
-  FLAG_turbo_instruction_scheduling = true;
+  bool old_turbo_instruction_scheduling = v8_flags.turbo_instruction_scheduling;
+  v8_flags.turbo_instruction_scheduling = true;
 
   Isolate* isolate(CcTest::InitIsolateOnce());
   const int kNumParams = 1;
@@ -4059,7 +4059,7 @@ TEST(InstructionSchedulingCallerSavedRegisters) {
   CHECK(result.ToHandleChecked()->IsSmi());
   CHECK_EQ(result.ToHandleChecked()->Number(), 13);
 
-  FLAG_turbo_instruction_scheduling = old_turbo_instruction_scheduling;
+  v8_flags.turbo_instruction_scheduling = old_turbo_instruction_scheduling;
 }
 
 #if V8_ENABLE_WEBASSEMBLY
@@ -4417,6 +4417,143 @@ TEST(CountTrailingZeros) {
   ft.Call();
 }
 
+TEST(IntPtrMulHigh) {
+  Isolate* isolate(CcTest::InitIsolateOnce());
+
+  const int kNumParams = 1;
+  CodeAssemblerTester asm_tester(isolate, kNumParams + 1);  // Include receiver.
+  CodeStubAssembler m(asm_tester.state());
+
+  TNode<IntPtrT> a = m.IntPtrConstant(std::numeric_limits<intptr_t>::min());
+  TNode<IntPtrT> b = m.SmiUntag(m.Parameter<Smi>(1));
+  TNode<IntPtrT> res = m.IntPtrMulHigh(a, b);
+  m.Return(m.SmiTag(res));
+
+  FunctionTester ft(asm_tester.GenerateCode());
+  CHECK_EQ(-147694,
+           ft.CallChecked<Smi>(handle(Smi::FromInt(295387), isolate))->value());
+  CHECK_EQ(-147694, base::bits::SignedMulHigh32(
+                        std::numeric_limits<int32_t>::min(), 295387));
+  CHECK_EQ(-147694, base::bits::SignedMulHigh64(
+                        std::numeric_limits<int64_t>::min(), 295387));
+}
+
+TEST(IntPtrMulHighConstantFoldable) {
+  Isolate* isolate(CcTest::InitIsolateOnce());
+  CodeAssemblerTester asm_tester(isolate);
+  CodeStubAssembler m(asm_tester.state());
+
+  TNode<IntPtrT> a = m.IntPtrConstant(std::numeric_limits<intptr_t>::min());
+  TNode<IntPtrT> b = m.IntPtrConstant(295387);
+  TNode<IntPtrT> res = m.IntPtrMulHigh(a, b);
+  m.Return(m.SmiTag(res));
+
+  FunctionTester ft(asm_tester.GenerateCode());
+  CHECK_EQ(-147694, ft.CallChecked<Smi>()->value());
+  CHECK_EQ(-147694, base::bits::SignedMulHigh32(
+                        std::numeric_limits<int32_t>::min(), 295387));
+  CHECK_EQ(-147694, base::bits::SignedMulHigh64(
+                        std::numeric_limits<int64_t>::min(), 295387));
+}
+
+TEST(UintPtrMulHigh) {
+  Isolate* isolate(CcTest::InitIsolateOnce());
+
+  const int kNumParams = 1;
+  CodeAssemblerTester asm_tester(isolate, kNumParams + 1);  // Include receiver.
+  CodeStubAssembler m(asm_tester.state());
+
+  TNode<IntPtrT> a = m.IntPtrConstant(std::numeric_limits<intptr_t>::min());
+  TNode<IntPtrT> b = m.SmiUntag(m.Parameter<Smi>(1));
+  TNode<IntPtrT> res = m.Signed(m.UintPtrMulHigh(m.Unsigned(a), m.Unsigned(b)));
+  m.Return(m.SmiTag(res));
+
+  FunctionTester ft(asm_tester.GenerateCode());
+  CHECK_EQ(147693,
+           ft.CallChecked<Smi>(handle(Smi::FromInt(295387), isolate))->value());
+  CHECK_EQ(147693, base::bits::UnsignedMulHigh32(
+                       std::numeric_limits<int32_t>::min(), 295387));
+  CHECK_EQ(147693, base::bits::UnsignedMulHigh64(
+                       std::numeric_limits<int64_t>::min(), 295387));
+}
+
+TEST(UintPtrMulHighConstantFoldable) {
+  Isolate* isolate(CcTest::InitIsolateOnce());
+  CodeAssemblerTester asm_tester(isolate);
+  CodeStubAssembler m(asm_tester.state());
+
+  TNode<IntPtrT> a = m.IntPtrConstant(std::numeric_limits<intptr_t>::min());
+  TNode<IntPtrT> b = m.IntPtrConstant(295387);
+  TNode<IntPtrT> res = m.Signed(m.UintPtrMulHigh(m.Unsigned(a), m.Unsigned(b)));
+  m.Return(m.SmiTag(res));
+
+  FunctionTester ft(asm_tester.GenerateCode());
+  CHECK_EQ(147693, ft.CallChecked<Smi>()->value());
+  CHECK_EQ(
+      147693,
+      base::bits::UnsignedMulHigh32(
+          static_cast<uint32_t>(std::numeric_limits<int32_t>::min()), 295387));
+  CHECK_EQ(
+      147693,
+      base::bits::UnsignedMulHigh64(
+          static_cast<uint64_t>(std::numeric_limits<int64_t>::min()), 295387));
+}
+
+TEST(IntPtrMulWithOverflow) {
+  Isolate* isolate(CcTest::InitIsolateOnce());
+
+  const int kNumParams = 1;
+
+  {
+    CodeAssemblerTester asm_tester(isolate,
+                                   kNumParams + 1);  // Include receiver.
+    CodeStubAssembler m(asm_tester.state());
+
+    TNode<IntPtrT> a = m.IntPtrConstant(std::numeric_limits<intptr_t>::min());
+    TNode<IntPtrT> b = m.SmiUntag(m.Parameter<Smi>(1));
+    TNode<PairT<IntPtrT, BoolT>> pair = m.IntPtrMulWithOverflow(a, b);
+    TNode<BoolT> overflow = m.Projection<1>(pair);
+    m.Return(m.SelectBooleanConstant(overflow));
+
+    FunctionTester ft(asm_tester.GenerateCode());
+    CHECK(ft.Call(handle(Smi::FromInt(-1), isolate))
+              .ToHandleChecked()
+              ->IsTrue(isolate));
+    CHECK(ft.Call(handle(Smi::FromInt(1), isolate))
+              .ToHandleChecked()
+              ->IsFalse(isolate));
+    CHECK(ft.Call(handle(Smi::FromInt(2), isolate))
+              .ToHandleChecked()
+              ->IsTrue(isolate));
+    CHECK(ft.Call(handle(Smi::FromInt(0), isolate))
+              .ToHandleChecked()
+              ->IsFalse(isolate));
+  }
+
+  {
+    CodeAssemblerTester asm_tester(isolate,
+                                   kNumParams + 1);  // Include receiver.
+    CodeStubAssembler m(asm_tester.state());
+
+    TNode<IntPtrT> a = m.IntPtrConstant(std::numeric_limits<intptr_t>::max());
+    TNode<IntPtrT> b = m.SmiUntag(m.Parameter<Smi>(1));
+    TNode<PairT<IntPtrT, BoolT>> pair = m.IntPtrMulWithOverflow(a, b);
+    TNode<BoolT> overflow = m.Projection<1>(pair);
+    m.Return(m.SelectBooleanConstant(overflow));
+
+    FunctionTester ft(asm_tester.GenerateCode());
+    CHECK(ft.Call(handle(Smi::FromInt(-1), isolate))
+              .ToHandleChecked()
+              ->IsFalse(isolate));
+    CHECK(ft.Call(handle(Smi::FromInt(1), isolate))
+              .ToHandleChecked()
+              ->IsFalse(isolate));
+    CHECK(ft.Call(handle(Smi::FromInt(2), isolate))
+              .ToHandleChecked()
+              ->IsTrue(isolate));
+  }
+}
+
 }  // namespace compiler
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/test/cctest/test-cpu-profiler.cc b/deps/v8/test/cctest/test-cpu-profiler.cc
index cf13e487355425..b1e7fb830e3a08 100644
--- a/deps/v8/test/cctest/test-cpu-profiler.cc
+++ b/deps/v8/test/cctest/test-cpu-profiler.cc
@@ -125,11 +125,11 @@ namespace {
 
 class TestSetup {
  public:
-  TestSetup() : old_flag_prof_browser_mode_(i::FLAG_prof_browser_mode) {
-    i::FLAG_prof_browser_mode = false;
+  TestSetup() : old_flag_prof_browser_mode_(v8_flags.prof_browser_mode) {
+    v8_flags.prof_browser_mode = false;
   }
 
-  ~TestSetup() { i::FLAG_prof_browser_mode = old_flag_prof_browser_mode_; }
+  ~TestSetup() { v8_flags.prof_browser_mode = old_flag_prof_browser_mode_; }
 
  private:
   bool old_flag_prof_browser_mode_;
@@ -762,9 +762,9 @@ static const char* cpu_profiler_test_source =
 TEST(CollectCpuProfile) {
   // Skip test if concurrent sparkplug is enabled. The test becomes flaky,
   // since it requires a precise trace.
-  if (i::FLAG_concurrent_sparkplug) return;
+  if (v8_flags.concurrent_sparkplug) return;
 
-  i::FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -795,9 +795,9 @@ TEST(CollectCpuProfile) {
 TEST(CollectCpuProfileCallerLineNumbers) {
   // Skip test if concurrent sparkplug is enabled. The test becomes flaky,
   // since it requires a precise trace.
-  if (i::FLAG_concurrent_sparkplug) return;
+  if (v8_flags.concurrent_sparkplug) return;
 
-  i::FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -859,7 +859,7 @@ static const char* hot_deopt_no_frame_entry_test_source =
 // If 'foo' has no ranges the samples falling into the prologue will miss the
 // 'start' function on the stack, so 'foo' will be attached to the (root).
 TEST(HotDeoptNoFrameEntry) {
-  i::FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -882,7 +882,7 @@ TEST(HotDeoptNoFrameEntry) {
 }
 
 TEST(CollectCpuProfileSamples) {
-  i::FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -936,7 +936,7 @@ static const char* cpu_profiler_test_source2 =
 //    16    16        loop [-1] #5
 //    14    14    (program) [-1] #2
 TEST(SampleWhenFrameIsNotSetup) {
-  i::FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -1235,15 +1235,15 @@ TEST(BoundFunctionCall) {
 // This tests checks distribution of the samples through the source lines.
 static void TickLines(bool optimize) {
 #ifndef V8_LITE_MODE
-  FLAG_turbofan = optimize;
+  v8_flags.turbofan = optimize;
 #ifdef V8_ENABLE_MAGLEV
   // TODO(v8:7700): Also test maglev here.
-  FLAG_maglev = false;
+  v8_flags.maglev = false;
 #endif  // V8_ENABLE_MAGLEV
 #endif  // V8_LITE_MODE
   CcTest::InitializeVM();
   LocalContext env;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   i::Isolate* isolate = CcTest::i_isolate();
   i::Factory* factory = isolate->factory();
   i::HandleScope scope(isolate);
@@ -1399,9 +1399,9 @@ static const char* call_function_test_source =
 TEST(FunctionCallSample) {
   // Skip test if concurrent sparkplug is enabled. The test becomes flaky,
   // since it requires a precise trace.
-  if (i::FLAG_concurrent_sparkplug) return;
+  if (i::v8_flags.concurrent_sparkplug) return;
 
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -1460,9 +1460,9 @@ static const char* function_apply_test_source =
 TEST(FunctionApplySample) {
   // Skip test if concurrent sparkplug is enabled. The test becomes flaky,
   // since it requires a precise trace.
-  if (i::FLAG_concurrent_sparkplug) return;
+  if (i::v8_flags.concurrent_sparkplug) return;
 
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -1569,7 +1569,7 @@ static void CallJsFunction(const v8::FunctionCallbackInfo<v8::Value>& info) {
 //    55     1        bar #16 5
 //    54    54          foo #16 6
 TEST(JsNativeJsSample) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -1622,7 +1622,7 @@ static const char* js_native_js_runtime_js_test_source =
 //    51    51          foo #16 6
 //     2     2    (program) #0 2
 TEST(JsNativeJsRuntimeJsSample) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -1679,7 +1679,7 @@ static const char* js_native1_js_native2_js_test_source =
 //    54    54            foo #16 7
 //     2     2    (program) #0 2
 TEST(JsNative1JsNative2JsSample) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -1779,7 +1779,7 @@ static const char* js_native_js_runtime_multiple_test_source =
 //            foo #16 6
 //      (program) #0 2
 TEST(JsNativeJsRuntimeJsSampleMultiple) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -1847,7 +1847,7 @@ static const char* inlining_test_source =
 //              action #16 7
 //      (program) #0 2
 TEST(Inlining) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -1945,9 +1945,9 @@ static const char* inlining_test_source2 = R"(
 TEST(Inlining2) {
   // Skip test if concurrent sparkplug is enabled. The test becomes flaky,
   // since it requires a precise trace.
-  if (FLAG_concurrent_sparkplug) return;
+  if (v8_flags.concurrent_sparkplug) return;
 
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   v8::Isolate* isolate = CcTest::isolate();
   LocalContext env;
   v8::CpuProfiler::UseDetailedSourcePositionsForProfiling(isolate);
@@ -2037,9 +2037,9 @@ static const char* cross_script_source_b = R"(
 TEST(CrossScriptInliningCallerLineNumbers) {
   // Skip test if concurrent sparkplug is enabled. The test becomes flaky,
   // since it requires a precise trace.
-  if (i::FLAG_concurrent_sparkplug) return;
+  if (i::v8_flags.concurrent_sparkplug) return;
 
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate* isolate = CcTest::isolate();
   LocalContext env;
   v8::CpuProfiler::UseDetailedSourcePositionsForProfiling(isolate);
@@ -2132,9 +2132,9 @@ static const char* cross_script_source_f = R"(
 TEST(CrossScriptInliningCallerLineNumbers2) {
   // Skip test if concurrent sparkplug is enabled. The test becomes flaky,
   // since it requires a precise trace.
-  if (i::FLAG_concurrent_sparkplug) return;
+  if (i::v8_flags.concurrent_sparkplug) return;
 
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(CcTest::isolate());
   ProfilerHelper helper(env.local());
@@ -2251,7 +2251,7 @@ static void CheckFunctionDetails(v8::Isolate* isolate,
 }
 
 TEST(FunctionDetails) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -2302,8 +2302,9 @@ TEST(FunctionDetails) {
 }
 
 TEST(FunctionDetailsInlining) {
-  if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_turbofan) return;
-  i::FLAG_allow_natives_syntax = true;
+  if (!CcTest::i_isolate()->use_optimizer() || i::v8_flags.always_turbofan)
+    return;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -2434,7 +2435,7 @@ static const char* pre_profiling_osr_script = R"(
 //     0        startProfiling:0 2 0 #4
 
 TEST(StartProfilingAfterOsr) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -2510,8 +2511,9 @@ const char* GetBranchDeoptReason(v8::Local<v8::Context> context,
 
 // deopt at top function
 TEST(CollectDeoptEvents) {
-  if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_turbofan) return;
-  i::FLAG_allow_natives_syntax = true;
+  if (!CcTest::i_isolate()->use_optimizer() || i::v8_flags.always_turbofan)
+    return;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -2625,7 +2627,7 @@ TEST(CollectDeoptEvents) {
 }
 
 TEST(SourceLocation) {
-  i::FLAG_always_turbofan = true;
+  i::v8_flags.always_turbofan = true;
   LocalContext env;
   v8::HandleScope scope(CcTest::isolate());
 
@@ -2648,8 +2650,9 @@ static const char* inlined_source =
 
 // deopt at the first level inlined function
 TEST(DeoptAtFirstLevelInlinedSource) {
-  if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_turbofan) return;
-  i::FLAG_allow_natives_syntax = true;
+  if (!CcTest::i_isolate()->use_optimizer() || i::v8_flags.always_turbofan)
+    return;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -2720,8 +2723,9 @@ TEST(DeoptAtFirstLevelInlinedSource) {
 
 // deopt at the second level inlined function
 TEST(DeoptAtSecondLevelInlinedSource) {
-  if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_turbofan) return;
-  i::FLAG_allow_natives_syntax = true;
+  if (!CcTest::i_isolate()->use_optimizer() || i::v8_flags.always_turbofan)
+    return;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -2798,8 +2802,9 @@ TEST(DeoptAtSecondLevelInlinedSource) {
 
 // deopt in untracked function
 TEST(DeoptUntrackedFunction) {
-  if (!CcTest::i_isolate()->use_optimizer() || i::FLAG_always_turbofan) return;
-  i::FLAG_allow_natives_syntax = true;
+  if (!CcTest::i_isolate()->use_optimizer() || i::v8_flags.always_turbofan)
+    return;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
@@ -3017,15 +3022,15 @@ TEST(Issue763073) {
   class AllowNativesSyntax {
    public:
     AllowNativesSyntax()
-        : allow_natives_syntax_(i::FLAG_allow_natives_syntax),
-          trace_deopt_(i::FLAG_trace_deopt) {
-      i::FLAG_allow_natives_syntax = true;
-      i::FLAG_trace_deopt = true;
+        : allow_natives_syntax_(i::v8_flags.allow_natives_syntax),
+          trace_deopt_(i::v8_flags.trace_deopt) {
+      i::v8_flags.allow_natives_syntax = true;
+      i::v8_flags.trace_deopt = true;
     }
 
     ~AllowNativesSyntax() {
-      i::FLAG_allow_natives_syntax = allow_natives_syntax_;
-      i::FLAG_trace_deopt = trace_deopt_;
+      i::v8_flags.allow_natives_syntax = allow_natives_syntax_;
+      i::v8_flags.trace_deopt = trace_deopt_;
     }
 
    private:
@@ -3079,7 +3084,7 @@ static void CallStaticCollectSample(
 }
 
 TEST(StaticCollectSampleAPI) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -3431,7 +3436,7 @@ class UnlockingThread : public v8::base::Thread {
 
 // Checking for crashes with multiple thread/single Isolate profiling.
 TEST(MultipleThreadsSingleIsolate) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate* isolate = CcTest::isolate();
   v8::Locker locker(isolate);
   v8::HandleScope scope(isolate);
@@ -3891,7 +3896,7 @@ TEST(Bug9151StaleCodeEntries) {
 // Tests that functions from other contexts aren't recorded when filtering for
 // another context.
 TEST(ContextIsolation) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext execution_env;
   i::HandleScope scope(CcTest::i_isolate());
 
@@ -3984,7 +3989,7 @@ void ValidateEmbedderState(v8::CpuProfile* profile,
 
 // Tests that embedder states from other contexts aren't recorded
 TEST(EmbedderContextIsolation) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext execution_env;
   i::HandleScope scope(CcTest::i_isolate());
 
@@ -4047,7 +4052,7 @@ TEST(EmbedderContextIsolation) {
 
 // Tests that embedder states from same context are recorded
 TEST(EmbedderStatePropagate) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext execution_env;
   i::HandleScope scope(CcTest::i_isolate());
 
@@ -4110,12 +4115,13 @@ TEST(EmbedderStatePropagate) {
 // even after native context move
 TEST(EmbedderStatePropagateNativeContextMove) {
   // Reusing context addresses will cause this test to fail.
-  if (i::FLAG_gc_global || i::FLAG_stress_compaction ||
-      i::FLAG_stress_incremental_marking || i::FLAG_enable_third_party_heap) {
+  if (i::v8_flags.gc_global || i::v8_flags.stress_compaction ||
+      i::v8_flags.stress_incremental_marking ||
+      i::v8_flags.enable_third_party_heap) {
     return;
   }
-  i::FLAG_allow_natives_syntax = true;
-  i::FLAG_manual_evacuation_candidates_selection = true;
+  i::v8_flags.allow_natives_syntax = true;
+  i::v8_flags.manual_evacuation_candidates_selection = true;
   LocalContext execution_env;
   i::HandleScope scope(CcTest::i_isolate());
 
@@ -4184,9 +4190,9 @@ TEST(EmbedderStatePropagateNativeContextMove) {
 // Tests that when a native context that's being filtered is moved, we continue
 // to track its execution.
 TEST(ContextFilterMovedNativeContext) {
-  if (i::FLAG_enable_third_party_heap) return;
-  i::FLAG_allow_natives_syntax = true;
-  i::FLAG_manual_evacuation_candidates_selection = true;
+  if (i::v8_flags.enable_third_party_heap) return;
+  i::v8_flags.allow_natives_syntax = true;
+  i::v8_flags.manual_evacuation_candidates_selection = true;
   LocalContext env;
   i::HandleScope scope(CcTest::i_isolate());
 
@@ -4267,8 +4273,8 @@ int GetSourcePositionEntryCount(i::Isolate* isolate, const char* source,
 }
 
 UNINITIALIZED_TEST(DetailedSourcePositionAPI) {
-  i::FLAG_detailed_line_info = false;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.detailed_line_info = false;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   v8::Isolate* isolate = v8::Isolate::New(create_params);
@@ -4308,11 +4314,11 @@ UNINITIALIZED_TEST(DetailedSourcePositionAPI) {
 }
 
 UNINITIALIZED_TEST(DetailedSourcePositionAPI_Inlining) {
-  i::FLAG_detailed_line_info = false;
-  i::FLAG_turbo_inlining = true;
-  i::FLAG_stress_inline = true;
-  i::FLAG_always_turbofan = false;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.detailed_line_info = false;
+  i::v8_flags.turbo_inlining = true;
+  i::v8_flags.stress_inline = true;
+  i::v8_flags.always_turbofan = false;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   v8::Isolate* isolate = v8::Isolate::New(create_params);
@@ -4457,7 +4463,7 @@ TEST(CanStartStopProfilerWithTitlesAndIds) {
 TEST(FastApiCPUProfiler) {
 #if !defined(V8_LITE_MODE) && !defined(USE_SIMULATOR)
   // None of the following configurations include JSCallReducer.
-  if (i::FLAG_jitless) return;
+  if (i::v8_flags.jitless) return;
 
   FLAG_SCOPE(turbofan);
   FLAG_SCOPE(turbo_fast_api_calls);
@@ -4556,15 +4562,15 @@ TEST(FastApiCPUProfiler) {
 
 TEST(BytecodeFlushEventsEagerLogging) {
 #ifndef V8_LITE_MODE
-  FLAG_turbofan = false;
-  FLAG_always_turbofan = false;
-  i::FLAG_optimize_for_size = false;
+  v8_flags.turbofan = false;
+  v8_flags.always_turbofan = false;
+  v8_flags.optimize_for_size = false;
 #endif  // V8_LITE_MODE
 #if ENABLE_SPARKPLUG
-  FLAG_always_sparkplug = false;
+  v8_flags.always_sparkplug = false;
 #endif  // ENABLE_SPARKPLUG
-  i::FLAG_flush_bytecode = true;
-  i::FLAG_allow_natives_syntax = true;
+  v8_flags.flush_bytecode = true;
+  v8_flags.allow_natives_syntax = true;
 
   TestSetup test_setup;
   ManualGCScope manual_gc_scope;
diff --git a/deps/v8/test/cctest/test-debug.cc b/deps/v8/test/cctest/test-debug.cc
index 21cece6ef3b3af..c3c8cef4659c65 100644
--- a/deps/v8/test/cctest/test-debug.cc
+++ b/deps/v8/test/cctest/test-debug.cc
@@ -803,7 +803,7 @@ TEST(BreakPointConstructorBuiltin) {
 }
 
 TEST(BreakPointInlinedBuiltin) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -847,7 +847,7 @@ TEST(BreakPointInlinedBuiltin) {
 }
 
 TEST(BreakPointInlineBoundBuiltin) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -895,7 +895,7 @@ TEST(BreakPointInlineBoundBuiltin) {
 }
 
 TEST(BreakPointInlinedConstructorBuiltin) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -939,7 +939,7 @@ TEST(BreakPointInlinedConstructorBuiltin) {
 }
 
 TEST(BreakPointBuiltinConcurrentOpt) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -980,7 +980,7 @@ TEST(BreakPointBuiltinConcurrentOpt) {
 }
 
 TEST(BreakPointBuiltinTFOperator) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -1401,7 +1401,7 @@ TEST(Regress1163547) {
 }
 
 TEST(BreakPointInlineApiFunction) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -1447,7 +1447,7 @@ TEST(BreakPointInlineApiFunction) {
 
 // Test that a break point can be set at a return store location.
 TEST(BreakPointConditionBuiltin) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
@@ -1576,7 +1576,7 @@ TEST(BreakPointConditionBuiltin) {
 }
 
 TEST(BreakPointInlining) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   break_point_hit_count = 0;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
@@ -2922,9 +2922,9 @@ TEST(PauseInScript) {
 int message_callback_count = 0;
 
 TEST(DebugBreak) {
-  i::FLAG_stress_compaction = false;
+  i::v8_flags.stress_compaction = false;
 #ifdef VERIFY_HEAP
-  i::FLAG_verify_heap = true;
+  i::v8_flags.verify_heap = true;
 #endif
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
@@ -3012,9 +3012,9 @@ class DebugScopingListener : public v8::debug::DebugDelegate {
 };
 
 TEST(DebugBreakInWrappedScript) {
-  i::FLAG_stress_compaction = false;
+  i::v8_flags.stress_compaction = false;
 #ifdef VERIFY_HEAP
-  i::FLAG_verify_heap = true;
+  i::v8_flags.verify_heap = true;
 #endif
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
@@ -3067,9 +3067,9 @@ TEST(DebugScopeIteratorWithFunctionTemplate) {
 }
 
 TEST(DebugBreakWithoutJS) {
-  i::FLAG_stress_compaction = false;
+  i::v8_flags.stress_compaction = false;
 #ifdef VERIFY_HEAP
-  i::FLAG_verify_heap = true;
+  i::v8_flags.verify_heap = true;
 #endif
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
@@ -3543,8 +3543,8 @@ class ExceptionEventCounter : public v8::debug::DebugDelegate {
 };
 
 UNINITIALIZED_TEST(NoBreakOnStackOverflow) {
-  // We must set FLAG_stack_size before initializing the isolate.
-  i::FLAG_stack_size = 100;
+  // We must set v8_flags.stack_size before initializing the isolate.
+  i::v8_flags.stack_size = 100;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   v8::Isolate* isolate = v8::Isolate::New(create_params);
@@ -3840,7 +3840,7 @@ class DebugBreakInlineListener : public v8::debug::DebugDelegate {
 };
 
 TEST(DebugBreakInline) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
   v8::Local<v8::Context> context = env.local();
@@ -4289,7 +4289,7 @@ class DebugStepOverFunctionWithCaughtExceptionListener
 };
 
 TEST(DebugStepOverFunctionWithCaughtException) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
@@ -4317,7 +4317,7 @@ size_t NearHeapLimitCallback(void* data, size_t current_heap_limit,
 }
 
 UNINITIALIZED_TEST(DebugSetOutOfMemoryListener) {
-  i::FLAG_stress_concurrent_allocation = false;
+  i::v8_flags.stress_concurrent_allocation = false;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   create_params.constraints.set_max_old_generation_size_in_bytes(10 * i::MB);
@@ -4340,7 +4340,7 @@ UNINITIALIZED_TEST(DebugSetOutOfMemoryListener) {
 }
 
 TEST(DebugCoverage) {
-  i::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -4395,7 +4395,7 @@ v8::debug::Coverage::ScriptData GetScriptDataAndDeleteCoverage(
 }  // namespace
 
 TEST(DebugCoverageWithCoverageOutOfScope) {
-  i::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -4466,7 +4466,7 @@ v8::debug::Coverage::FunctionData GetFunctionDataAndDeleteCoverage(
 }  // namespace
 
 TEST(DebugCoverageWithScriptDataOutOfScope) {
-  i::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
@@ -4619,7 +4619,7 @@ i::MaybeHandle<i::Script> FindScript(
 }  // anonymous namespace
 
 UNINITIALIZED_TEST(LoadedAtStartupScripts) {
-  i::FLAG_expose_gc = true;
+  i::v8_flags.expose_gc = true;
 
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
diff --git a/deps/v8/test/cctest/test-descriptor-array.cc b/deps/v8/test/cctest/test-descriptor-array.cc
index 7bd2640cf626f6..8642174d182d96 100644
--- a/deps/v8/test/cctest/test-descriptor-array.cc
+++ b/deps/v8/test/cctest/test-descriptor-array.cc
@@ -64,7 +64,7 @@ void CheckDescriptorArrayLookups(Isolate* isolate, Handle<Map> map,
   }
 
   // Test CSA implementation.
-  if (!FLAG_jitless) {
+  if (!v8_flags.jitless) {
     for (size_t i = 0; i < names.size(); ++i) {
       Handle<Object> name_index =
           Call(isolate, csa_lookup, map, names[i]).ToHandleChecked();
@@ -97,7 +97,7 @@ void CheckTransitionArrayLookups(Isolate* isolate,
   }
 
   // Test CSA implementation.
-  if (!FLAG_jitless) {
+  if (!v8_flags.jitless) {
     for (size_t i = 0; i < maps.size(); ++i) {
       Handle<Map> expected_map = maps[i];
       Handle<Name> name(expected_map->instance_descriptors(isolate).GetKey(
@@ -117,7 +117,7 @@ void CheckTransitionArrayLookups(Isolate* isolate,
 // or null otherwise.
 Handle<JSFunction> CreateCsaDescriptorArrayLookup(Isolate* isolate) {
   // We are not allowed to generate code in jitless mode.
-  if (FLAG_jitless) return Handle<JSFunction>();
+  if (v8_flags.jitless) return Handle<JSFunction>();
 
   // Preallocate handle for the result in the current handle scope.
   Handle<JSFunction> result_function(JSFunction{}, isolate);
@@ -163,7 +163,7 @@ Handle<JSFunction> CreateCsaDescriptorArrayLookup(Isolate* isolate) {
 // map if transition is found or null otherwise.
 Handle<JSFunction> CreateCsaTransitionArrayLookup(Isolate* isolate) {
   // We are not allowed to generate code in jitless mode.
-  if (FLAG_jitless) return Handle<JSFunction>();
+  if (v8_flags.jitless) return Handle<JSFunction>();
 
   // Preallocate handle for the result in the current handle scope.
   Handle<JSFunction> result_function(JSFunction{}, isolate);
diff --git a/deps/v8/test/cctest/test-field-type-tracking.cc b/deps/v8/test/cctest/test-field-type-tracking.cc
index e5c8102c448449..b87e67d884e2b9 100644
--- a/deps/v8/test/cctest/test-field-type-tracking.cc
+++ b/deps/v8/test/cctest/test-field-type-tracking.cc
@@ -2276,14 +2276,15 @@ TEST(ElementsKindTransitionFromMapOwningDescriptor) {
   Factory* factory = isolate->factory();
   TestConfig configs[] = {
       {FROZEN, factory->frozen_symbol(),
-       FLAG_enable_sealed_frozen_elements_kind ? HOLEY_FROZEN_ELEMENTS
-                                               : DICTIONARY_ELEMENTS},
+       v8_flags.enable_sealed_frozen_elements_kind ? HOLEY_FROZEN_ELEMENTS
+                                                   : DICTIONARY_ELEMENTS},
       {SEALED, factory->sealed_symbol(),
-       FLAG_enable_sealed_frozen_elements_kind ? HOLEY_SEALED_ELEMENTS
-                                               : DICTIONARY_ELEMENTS},
+       v8_flags.enable_sealed_frozen_elements_kind ? HOLEY_SEALED_ELEMENTS
+                                                   : DICTIONARY_ELEMENTS},
       {NONE, factory->nonextensible_symbol(),
-       FLAG_enable_sealed_frozen_elements_kind ? HOLEY_NONEXTENSIBLE_ELEMENTS
-                                               : DICTIONARY_ELEMENTS}};
+       v8_flags.enable_sealed_frozen_elements_kind
+           ? HOLEY_NONEXTENSIBLE_ELEMENTS
+           : DICTIONARY_ELEMENTS}};
   for (size_t i = 0; i < arraysize(configs); i++) {
     TestGeneralizeFieldWithSpecialTransition(
         &configs[i],
@@ -2344,14 +2345,15 @@ TEST(ElementsKindTransitionFromMapNotOwningDescriptor) {
   Factory* factory = isolate->factory();
   TestConfig configs[] = {
       {FROZEN, factory->frozen_symbol(),
-       FLAG_enable_sealed_frozen_elements_kind ? HOLEY_FROZEN_ELEMENTS
-                                               : DICTIONARY_ELEMENTS},
+       v8_flags.enable_sealed_frozen_elements_kind ? HOLEY_FROZEN_ELEMENTS
+                                                   : DICTIONARY_ELEMENTS},
       {SEALED, factory->sealed_symbol(),
-       FLAG_enable_sealed_frozen_elements_kind ? HOLEY_SEALED_ELEMENTS
-                                               : DICTIONARY_ELEMENTS},
+       v8_flags.enable_sealed_frozen_elements_kind ? HOLEY_SEALED_ELEMENTS
+                                                   : DICTIONARY_ELEMENTS},
       {NONE, factory->nonextensible_symbol(),
-       FLAG_enable_sealed_frozen_elements_kind ? HOLEY_NONEXTENSIBLE_ELEMENTS
-                                               : DICTIONARY_ELEMENTS}};
+       v8_flags.enable_sealed_frozen_elements_kind
+           ? HOLEY_NONEXTENSIBLE_ELEMENTS
+           : DICTIONARY_ELEMENTS}};
   for (size_t i = 0; i < arraysize(configs); i++) {
     TestGeneralizeFieldWithSpecialTransition(
         &configs[i],
@@ -2914,7 +2916,7 @@ void TestStoreToConstantField_NaN(const char* store_func_source,
 }  // namespace
 
 TEST(StoreToConstantField_PlusMinusZero) {
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
diff --git a/deps/v8/test/cctest/test-heap-profiler.cc b/deps/v8/test/cctest/test-heap-profiler.cc
index 5fbea256c320f3..188c9ef867dd10 100644
--- a/deps/v8/test/cctest/test-heap-profiler.cc
+++ b/deps/v8/test/cctest/test-heap-profiler.cc
@@ -53,10 +53,10 @@ using i::AllocationTraceNode;
 using i::AllocationTraceTree;
 using i::AllocationTracker;
 using i::SourceLocation;
+using i::heap::GrowNewSpaceToMaximumCapacity;
 using v8::base::ArrayVector;
 using v8::base::Optional;
 using v8::base::Vector;
-using v8::internal::heap::GrowNewSpaceToMaximumCapacity;
 
 namespace {
 
@@ -1297,7 +1297,7 @@ static TestStatsStream GetHeapStatsUpdate(
 
 TEST(HeapSnapshotObjectsStats) {
   // Concurrent allocation might break results
-  v8::internal::v8_flags.stress_concurrent_allocation = false;
+  i::v8_flags.stress_concurrent_allocation = false;
 
   LocalContext env;
   v8::HandleScope scope(env->GetIsolate());
@@ -2639,7 +2639,7 @@ TEST(ManyLocalsInSharedContext) {
       env->GetIsolate(), ok_object, v8::HeapGraphEdge::kInternal, "context");
   CHECK(context_object);
   // Check the objects are not duplicated in the context.
-  CHECK_EQ(v8::internal::Context::MIN_CONTEXT_EXTENDED_SLOTS + num_objects - 1,
+  CHECK_EQ(i::Context::MIN_CONTEXT_EXTENDED_SLOTS + num_objects - 1,
            context_object->GetChildrenCount());
   // Check all the objects have got their names.
   // ... well check just every 15th because otherwise it's too slow in debug.
@@ -2695,7 +2695,7 @@ TEST(AllocationSitesAreVisible) {
                   v8::HeapGraphEdge::kInternal, "elements");
   CHECK(elements);
   CHECK_EQ(v8::HeapGraphNode::kCode, elements->GetType());
-  CHECK_EQ(v8::internal::FixedArray::SizeFor(3),
+  CHECK_EQ(i::FixedArray::SizeFor(3),
            static_cast<int>(elements->GetShallowSize()));
 
   v8::Local<v8::Value> array_val =
@@ -3704,10 +3704,10 @@ TEST(SamplingHeapProfiler) {
 
   // Turn off always_turbofan. Inlining can cause stack traces to be shorter
   // than what we expect in this test.
-  v8::internal::v8_flags.always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
 
   // Suppress randomness to avoid flakiness in tests.
-  v8::internal::v8_flags.sampling_heap_profiler_suppress_randomness = true;
+  i::v8_flags.sampling_heap_profiler_suppress_randomness = true;
 
   // Sample should be empty if requested before sampling has started.
   {
@@ -3788,16 +3788,16 @@ TEST(SamplingHeapProfilerRateAgnosticEstimates) {
 
   // Turn off always_turbofan. Inlining can cause stack traces to be shorter
   // than what we expect in this test.
-  v8::internal::v8_flags.always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
 
   // Disable compilation cache to force compilation in both cases
-  v8::internal::v8_flags.compilation_cache = false;
+  i::v8_flags.compilation_cache = false;
 
   // Suppress randomness to avoid flakiness in tests.
-  v8::internal::v8_flags.sampling_heap_profiler_suppress_randomness = true;
+  i::v8_flags.sampling_heap_profiler_suppress_randomness = true;
 
   // stress_incremental_marking adds randomness to the test.
-  v8::internal::v8_flags.stress_incremental_marking = false;
+  i::v8_flags.stress_incremental_marking = false;
 
   // warmup compilation
   CompileRun(simple_sampling_heap_profiler_script);
@@ -3869,7 +3869,7 @@ TEST(SamplingHeapProfilerApiAllocation) {
   v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
 
   // Suppress randomness to avoid flakiness in tests.
-  v8::internal::v8_flags.sampling_heap_profiler_suppress_randomness = true;
+  i::v8_flags.sampling_heap_profiler_suppress_randomness = true;
 
   heap_profiler->StartSamplingHeapProfiler(256);
 
@@ -3892,7 +3892,7 @@ TEST(SamplingHeapProfilerApiSamples) {
   v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
 
   // Suppress randomness to avoid flakiness in tests.
-  v8::internal::v8_flags.sampling_heap_profiler_suppress_randomness = true;
+  i::v8_flags.sampling_heap_profiler_suppress_randomness = true;
 
   heap_profiler->StartSamplingHeapProfiler(1024);
 
@@ -3937,7 +3937,7 @@ TEST(SamplingHeapProfilerLeftTrimming) {
   v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
 
   // Suppress randomness to avoid flakiness in tests.
-  v8::internal::v8_flags.sampling_heap_profiler_suppress_randomness = true;
+  i::v8_flags.sampling_heap_profiler_suppress_randomness = true;
 
   heap_profiler->StartSamplingHeapProfiler(64);
 
@@ -3950,7 +3950,7 @@ TEST(SamplingHeapProfilerLeftTrimming) {
       "      a.shift();\n"
       "}\n");
 
-  CcTest::CollectGarbage(v8::internal::NEW_SPACE);
+  CcTest::CollectGarbage(i::NEW_SPACE);
   // Should not crash.
 
   heap_profiler->StopSamplingHeapProfiler();
@@ -3975,7 +3975,7 @@ TEST(SamplingHeapProfilerPretenuredInlineAllocations) {
   v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
 
   // Suppress randomness to avoid flakiness in tests.
-  v8::internal::v8_flags.sampling_heap_profiler_suppress_randomness = true;
+  i::v8_flags.sampling_heap_profiler_suppress_randomness = true;
 
   GrowNewSpaceToMaximumCapacity(CcTest::heap());
 
@@ -4037,7 +4037,7 @@ TEST(SamplingHeapProfilerLargeInterval) {
   v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
 
   // Suppress randomness to avoid flakiness in tests.
-  v8::internal::v8_flags.sampling_heap_profiler_suppress_randomness = true;
+  i::v8_flags.sampling_heap_profiler_suppress_randomness = true;
 
   heap_profiler->StartSamplingHeapProfiler(512 * 1024);
 
@@ -4075,7 +4075,7 @@ TEST(SamplingHeapProfilerSampleDuringDeopt) {
   v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler();
 
   // Suppress randomness to avoid flakiness in tests.
-  v8::internal::v8_flags.sampling_heap_profiler_suppress_randomness = true;
+  i::v8_flags.sampling_heap_profiler_suppress_randomness = true;
 
   // Small sample interval to force each object to be sampled.
   heap_profiler->StartSamplingHeapProfiler(i::kTaggedSize);
diff --git a/deps/v8/test/cctest/test-helper-riscv32.cc b/deps/v8/test/cctest/test-helper-riscv32.cc
index b46aebceaa51e9..0e9738a7b78a57 100644
--- a/deps/v8/test/cctest/test-helper-riscv32.cc
+++ b/deps/v8/test/cctest/test-helper-riscv32.cc
@@ -39,7 +39,7 @@ Handle<Code> AssembleCodeImpl(Func assemble) {
   assm.GetCode(isolate, &desc);
   Handle<Code> code =
       Factory::CodeBuilder(isolate, desc, CodeKind::FOR_TESTING).Build();
-  if (FLAG_print_code) {
+  if (v8_flags.print_code) {
     code->Print();
   }
   return code;
diff --git a/deps/v8/test/cctest/test-helper-riscv64.cc b/deps/v8/test/cctest/test-helper-riscv64.cc
index 388e0ca0194acc..75263d35f5f9e1 100644
--- a/deps/v8/test/cctest/test-helper-riscv64.cc
+++ b/deps/v8/test/cctest/test-helper-riscv64.cc
@@ -38,7 +38,7 @@ Handle<Code> AssembleCodeImpl(Func assemble) {
   assm.GetCode(isolate, &desc);
   Handle<Code> code =
       Factory::CodeBuilder(isolate, desc, CodeKind::FOR_TESTING).Build();
-  if (FLAG_print_code) {
+  if (v8_flags.print_code) {
     code->Print();
   }
   return code;
diff --git a/deps/v8/test/cctest/test-ignition-statistics-extension.cc b/deps/v8/test/cctest/test-ignition-statistics-extension.cc
index 9a0b1336456ceb..f79ae21f8fbf0c 100644
--- a/deps/v8/test/cctest/test-ignition-statistics-extension.cc
+++ b/deps/v8/test/cctest/test-ignition-statistics-extension.cc
@@ -43,7 +43,7 @@ class IgnitionStatisticsTester {
 };
 
 TEST(IgnitionStatisticsExtension) {
-  FLAG_expose_ignition_statistics = true;
+  v8_flags.expose_ignition_statistics = true;
   CcTest::InitializeVM();
   v8::Isolate* isolate = CcTest::isolate();
   v8::HandleScope scope(isolate);
diff --git a/deps/v8/test/cctest/test-inobject-slack-tracking.cc b/deps/v8/test/cctest/test-inobject-slack-tracking.cc
index 1ecec21ac34cdc..f7a3a9115f9c05 100644
--- a/deps/v8/test/cctest/test-inobject-slack-tracking.cc
+++ b/deps/v8/test/cctest/test-inobject-slack-tracking.cc
@@ -110,7 +110,7 @@ bool IsObjectShrinkable(JSObject obj) {
 
 TEST(JSObjectBasic) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
   const char* source =
@@ -161,14 +161,14 @@ TEST(JSObjectBasic) {
 
 
 TEST(JSObjectBasicNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestJSObjectBasic();
 }
 
 
 TEST(JSObjectComplex) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
   const char* source =
@@ -241,14 +241,14 @@ TEST(JSObjectComplex) {
 
 
 TEST(JSObjectComplexNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestJSObjectComplex();
 }
 
 
 TEST(JSGeneratorObjectBasic) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
   const char* source =
@@ -307,14 +307,14 @@ TEST(JSGeneratorObjectBasic) {
 
 
 TEST(JSGeneratorObjectBasicNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestJSGeneratorObjectBasic();
 }
 
 
 TEST(SubclassBasicNoBaseClassInstances) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -399,14 +399,14 @@ TEST(SubclassBasicNoBaseClassInstances) {
 
 
 TEST(SubclassBasicNoBaseClassInstancesNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassBasicNoBaseClassInstances();
 }
 
 
 TEST(SubclassBasic) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -502,7 +502,7 @@ TEST(SubclassBasic) {
 
 
 TEST(SubclassBasicNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassBasic();
 }
 
@@ -608,7 +608,7 @@ static void TestClassHierarchy(const std::vector<int>& hierarchy_desc, int n) {
 
 static void TestSubclassChain(const std::vector<int>& hierarchy_desc) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -654,7 +654,7 @@ TEST(LongSubclassChain3) {
 
 TEST(InobjectPropetiesCountOverflowInSubclass) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -837,10 +837,10 @@ TEST(ObjectLiteralPropertyBackingStoreSize) {
 }
 
 TEST(SlowModeSubclass) {
-  if (FLAG_stress_concurrent_allocation) return;
+  if (v8_flags.stress_concurrent_allocation) return;
 
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -977,7 +977,7 @@ static void TestSubclassBuiltin(const char* subclass_name,
 
 TEST(SubclassObjectBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -988,14 +988,14 @@ TEST(SubclassObjectBuiltin) {
 
 
 TEST(SubclassObjectBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassObjectBuiltin();
 }
 
 
 TEST(SubclassFunctionBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1005,14 +1005,14 @@ TEST(SubclassFunctionBuiltin) {
 
 
 TEST(SubclassFunctionBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassFunctionBuiltin();
 }
 
 
 TEST(SubclassBooleanBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1022,14 +1022,14 @@ TEST(SubclassBooleanBuiltin) {
 
 
 TEST(SubclassBooleanBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassBooleanBuiltin();
 }
 
 
 TEST(SubclassErrorBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1046,14 +1046,14 @@ TEST(SubclassErrorBuiltin) {
 
 
 TEST(SubclassErrorBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassErrorBuiltin();
 }
 
 
 TEST(SubclassNumberBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1063,14 +1063,14 @@ TEST(SubclassNumberBuiltin) {
 
 
 TEST(SubclassNumberBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassNumberBuiltin();
 }
 
 
 TEST(SubclassDateBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1079,14 +1079,14 @@ TEST(SubclassDateBuiltin) {
 
 
 TEST(SubclassDateBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassDateBuiltin();
 }
 
 
 TEST(SubclassStringBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1097,14 +1097,14 @@ TEST(SubclassStringBuiltin) {
 
 
 TEST(SubclassStringBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassStringBuiltin();
 }
 
 
 TEST(SubclassRegExpBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1115,14 +1115,14 @@ TEST(SubclassRegExpBuiltin) {
 
 
 TEST(SubclassRegExpBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassRegExpBuiltin();
 }
 
 
 TEST(SubclassArrayBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1131,14 +1131,14 @@ TEST(SubclassArrayBuiltin) {
 
 
 TEST(SubclassArrayBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassArrayBuiltin();
 }
 
 
 TEST(SubclassTypedArrayBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1152,14 +1152,14 @@ TEST(SubclassTypedArrayBuiltin) {
 
 
 TEST(SubclassTypedArrayBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassTypedArrayBuiltin();
 }
 
 
 TEST(SubclassCollectionBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1171,14 +1171,14 @@ TEST(SubclassCollectionBuiltin) {
 
 
 TEST(SubclassCollectionBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassCollectionBuiltin();
 }
 
 
 TEST(SubclassArrayBufferBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1189,14 +1189,14 @@ TEST(SubclassArrayBufferBuiltin) {
 
 
 TEST(SubclassArrayBufferBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassArrayBufferBuiltin();
 }
 
 
 TEST(SubclassPromiseBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1206,7 +1206,7 @@ TEST(SubclassPromiseBuiltin) {
 
 
 TEST(SubclassPromiseBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassPromiseBuiltin();
 }
 
@@ -1413,7 +1413,7 @@ TEST(InstanceFieldsArePropertiesFieldsAndConstructorLazy) {
 }
 
 TEST(InstanceFieldsArePropertiesDefaultConstructorEager) {
-  i::FLAG_lazy = false;
+  i::v8_flags.lazy = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1435,7 +1435,7 @@ TEST(InstanceFieldsArePropertiesDefaultConstructorEager) {
 }
 
 TEST(InstanceFieldsArePropertiesFieldsAndConstructorEager) {
-  i::FLAG_lazy = false;
+  i::v8_flags.lazy = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
diff --git a/deps/v8/test/cctest/test-js-weak-refs.cc b/deps/v8/test/cctest/test-js-weak-refs.cc
index 1632d4e48ee7e5..2ac7a1dcf9392d 100644
--- a/deps/v8/test/cctest/test-js-weak-refs.cc
+++ b/deps/v8/test/cctest/test-js-weak-refs.cc
@@ -711,7 +711,7 @@ TEST(TestJSWeakRef) {
 }
 
 TEST(TestJSWeakRefIncrementalMarking) {
-  if (!FLAG_incremental_marking) {
+  if (!v8_flags.incremental_marking) {
     return;
   }
   ManualGCScope manual_gc_scope;
@@ -783,7 +783,7 @@ TEST(TestJSWeakRefKeepDuringJob) {
 }
 
 TEST(TestJSWeakRefKeepDuringJobIncrementalMarking) {
-  if (!FLAG_incremental_marking) {
+  if (!v8_flags.incremental_marking) {
     return;
   }
   ManualGCScope manual_gc_scope;
@@ -872,7 +872,7 @@ TEST(TestRemoveUnregisterToken) {
 }
 
 TEST(JSWeakRefScavengedInWorklist) {
-  if (!FLAG_incremental_marking || FLAG_single_generation) {
+  if (!v8_flags.incremental_marking || v8_flags.single_generation) {
     return;
   }
 
@@ -922,8 +922,8 @@ TEST(JSWeakRefScavengedInWorklist) {
 }
 
 TEST(JSWeakRefTenuredInWorklist) {
-  if (!FLAG_incremental_marking || FLAG_single_generation ||
-      FLAG_separate_gc_phases) {
+  if (!v8_flags.incremental_marking || v8_flags.single_generation ||
+      v8_flags.separate_gc_phases) {
     return;
   }
 
@@ -975,10 +975,10 @@ TEST(JSWeakRefTenuredInWorklist) {
 }
 
 TEST(UnregisterTokenHeapVerifier) {
-  if (!FLAG_incremental_marking) return;
+  if (!v8_flags.incremental_marking) return;
   ManualGCScope manual_gc_scope;
 #ifdef VERIFY_HEAP
-  FLAG_verify_heap = true;
+  v8_flags.verify_heap = true;
 #endif
 
   CcTest::InitializeVM();
@@ -1023,10 +1023,10 @@ TEST(UnregisterTokenHeapVerifier) {
 }
 
 TEST(UnregisteredAndUnclearedCellHeapVerifier) {
-  if (!FLAG_incremental_marking) return;
+  if (!v8_flags.incremental_marking) return;
   ManualGCScope manual_gc_scope;
 #ifdef VERIFY_HEAP
-  FLAG_verify_heap = true;
+  v8_flags.verify_heap = true;
 #endif
 
   CcTest::InitializeVM();
diff --git a/deps/v8/test/cctest/test-liveedit.cc b/deps/v8/test/cctest/test-liveedit.cc
index ec8a874a30e4f8..67775c74aaffc6 100644
--- a/deps/v8/test/cctest/test-liveedit.cc
+++ b/deps/v8/test/cctest/test-liveedit.cc
@@ -234,10 +234,10 @@ TEST(LiveEditPatchFunctions) {
   v8::HandleScope scope(env->GetIsolate());
   v8::Local<v8::Context> context = env.local();
   // Check that function is removed from compilation cache.
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   PatchFunctions(context, "42;", "%AbortJS('')");
   PatchFunctions(context, "42;", "239;");
-  i::FLAG_allow_natives_syntax = false;
+  i::v8_flags.allow_natives_syntax = false;
 
   // Basic test cases.
   PatchFunctions(context, "42;", "2;");
@@ -349,7 +349,7 @@ TEST(LiveEditPatchFunctions) {
                ->Value(),
            6);
 
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   PatchFunctions(context,
                  "function foo(a, b) { return a + b; }; "
                  "%PrepareFunctionForOptimization(foo);"
@@ -360,7 +360,7 @@ TEST(LiveEditPatchFunctions) {
                .ToLocalChecked()
                ->Value(),
            35);
-  i::FLAG_allow_natives_syntax = false;
+  i::v8_flags.allow_natives_syntax = false;
 
   // Check inner function.
   PatchFunctions(
diff --git a/deps/v8/test/cctest/test-lockers.cc b/deps/v8/test/cctest/test-lockers.cc
index 3bcfcd3d83de51..c33c94a8180b66 100644
--- a/deps/v8/test/cctest/test-lockers.cc
+++ b/deps/v8/test/cctest/test-lockers.cc
@@ -122,7 +122,7 @@ namespace internal {
 namespace test_lockers {
 
 TEST(LazyDeoptimizationMultithread) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   v8::Isolate* isolate = v8::Isolate::New(create_params);
@@ -175,7 +175,7 @@ TEST(LazyDeoptimizationMultithread) {
 }
 
 TEST(LazyDeoptimizationMultithreadWithNatives) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   v8::Isolate* isolate = v8::Isolate::New(create_params);
@@ -231,7 +231,7 @@ TEST(LazyDeoptimizationMultithreadWithNatives) {
 }
 
 TEST(EagerDeoptimizationMultithread) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   v8::Isolate* isolate = v8::Isolate::New(create_params);
@@ -432,7 +432,7 @@ static void StartJoinAndDeleteThreads(
 
 // Run many threads all locking on the same isolate
 TEST(IsolateLockingStress) {
-  i::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
 #if V8_TARGET_ARCH_MIPS
   const int kNThreads = 50;
 #else
@@ -477,7 +477,7 @@ class IsolateNestedLockingThread : public JoinableThread {
 
 // Run  many threads with nested locks
 TEST(IsolateNestedLocking) {
-  i::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
 #if V8_TARGET_ARCH_MIPS
   const int kNThreads = 50;
 #else
@@ -523,7 +523,7 @@ class SeparateIsolatesLocksNonexclusiveThread : public JoinableThread {
 
 // Run parallel threads that lock and access different isolates in parallel
 TEST(SeparateIsolatesLocksNonexclusive) {
-  i::FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_S390
   const int kNThreads = 50;
 #else
@@ -608,7 +608,7 @@ class LockerUnlockerThread : public JoinableThread {
 
 // Use unlocker inside of a Locker, multiple threads.
 TEST(LockerUnlocker) {
-  i::FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_S390
   const int kNThreads = 50;
 #else
@@ -666,7 +666,7 @@ class LockTwiceAndUnlockThread : public JoinableThread {
 
 // Use Unlocker inside two Lockers.
 TEST(LockTwiceAndUnlock) {
-  i::FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_S390
   const int kNThreads = 50;
 #else
diff --git a/deps/v8/test/cctest/test-log-stack-tracer.cc b/deps/v8/test/cctest/test-log-stack-tracer.cc
index 445df286f5dd47..b04f57f7c1066d 100644
--- a/deps/v8/test/cctest/test-log-stack-tracer.cc
+++ b/deps/v8/test/cctest/test-log-stack-tracer.cc
@@ -142,7 +142,7 @@ static void CreateTraceCallerFunction(v8::Local<v8::Context> context,
 // walking.
 TEST(CFromJSStackTrace) {
   // BUG(1303) Inlining of JSFuncDoTrace() in JSTrace below breaks this test.
-  i::FLAG_turbo_inlining = false;
+  i::v8_flags.turbo_inlining = false;
 
   TickSample sample;
   i::TraceExtension::InitTraceEnv(&sample);
@@ -192,7 +192,7 @@ TEST(CFromJSStackTrace) {
 TEST(PureJSStackTrace) {
   // This test does not pass with inlining enabled since inlined functions
   // don't appear in the stack trace.
-  i::FLAG_turbo_inlining = false;
+  i::v8_flags.turbo_inlining = false;
 
   TickSample sample;
   i::TraceExtension::InitTraceEnv(&sample);
diff --git a/deps/v8/test/cctest/test-mementos.cc b/deps/v8/test/cctest/test-mementos.cc
index 7bb19545626317..ccaa1c733f682a 100644
--- a/deps/v8/test/cctest/test-mementos.cc
+++ b/deps/v8/test/cctest/test-mementos.cc
@@ -61,7 +61,8 @@ static void SetUpNewSpaceWithPoisonedMementoAtTop() {
 
 TEST(Regress340063) {
   CcTest::InitializeVM();
-  if (!i::FLAG_allocation_site_pretenuring || FLAG_single_generation) return;
+  if (!i::v8_flags.allocation_site_pretenuring || v8_flags.single_generation)
+    return;
   v8::HandleScope scope(CcTest::isolate());
 
   SetUpNewSpaceWithPoisonedMementoAtTop();
@@ -77,11 +78,12 @@ TEST(Regress470390) {
   // With MinorMC, we may have object allocated after `new_space->top()`. If the
   // next object after `new_space->top()` is an invalid memento, heap
   // verification should fail.
-  if (FLAG_minor_mc) return;
+  if (v8_flags.minor_mc) return;
 #endif  // VERIFY_HEAP
 
   CcTest::InitializeVM();
-  if (!i::FLAG_allocation_site_pretenuring || FLAG_single_generation) return;
+  if (!i::v8_flags.allocation_site_pretenuring || v8_flags.single_generation)
+    return;
   v8::HandleScope scope(CcTest::isolate());
 
   SetUpNewSpaceWithPoisonedMementoAtTop();
@@ -98,7 +100,8 @@ TEST(Regress470390) {
 
 TEST(BadMementoAfterTopForceScavenge) {
   CcTest::InitializeVM();
-  if (!i::FLAG_allocation_site_pretenuring || FLAG_single_generation) return;
+  if (!i::v8_flags.allocation_site_pretenuring || v8_flags.single_generation)
+    return;
   v8::HandleScope scope(CcTest::isolate());
 
   SetUpNewSpaceWithPoisonedMementoAtTop();
diff --git a/deps/v8/test/cctest/test-profile-generator.cc b/deps/v8/test/cctest/test-profile-generator.cc
index 6cfb0cd3bb9810..e0164a7d8e005f 100644
--- a/deps/v8/test/cctest/test-profile-generator.cc
+++ b/deps/v8/test/cctest/test-profile-generator.cc
@@ -383,14 +383,11 @@ namespace {
 
 class TestSetup {
  public:
-  TestSetup()
-      : old_flag_prof_browser_mode_(i::FLAG_prof_browser_mode) {
-    i::FLAG_prof_browser_mode = false;
+  TestSetup() : old_flag_prof_browser_mode_(i::v8_flags.prof_browser_mode) {
+    i::v8_flags.prof_browser_mode = false;
   }
 
-  ~TestSetup() {
-    i::FLAG_prof_browser_mode = old_flag_prof_browser_mode_;
-  }
+  ~TestSetup() { i::v8_flags.prof_browser_mode = old_flag_prof_browser_mode_; }
 
  private:
   bool old_flag_prof_browser_mode_;
@@ -725,7 +722,7 @@ static const ProfileNode* PickChild(const ProfileNode* parent,
 TEST(RecordStackTraceAtStartProfiling) {
   // This test does not pass with inlining enabled since inlined functions
   // don't appear in the stack trace.
-  i::FLAG_turbo_inlining = false;
+  i::v8_flags.turbo_inlining = false;
 
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
@@ -804,7 +801,7 @@ static const v8::CpuProfileNode* PickChild(const v8::CpuProfileNode* parent,
 TEST(ProfileNodeScriptId) {
   // This test does not pass with inlining enabled since inlined functions
   // don't appear in the stack trace.
-  i::FLAG_turbo_inlining = false;
+  i::v8_flags.turbo_inlining = false;
 
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
@@ -889,7 +886,7 @@ TEST(LineNumber) {
 
   profiler.processor()->StopSynchronously();
 
-  bool is_lazy = i::FLAG_lazy;
+  bool is_lazy = i::v8_flags.lazy;
   CHECK_EQ(1, GetFunctionLineNumber(&profiler, &env, isolate,
                                     "foo_at_the_first_line"));
   CHECK_EQ(is_lazy ? 0 : 4, GetFunctionLineNumber(&profiler, &env, isolate,
@@ -904,9 +901,9 @@ TEST(LineNumber) {
 
 TEST(BailoutReason) {
 #ifndef V8_LITE_MODE
-  i::FLAG_allow_natives_syntax = true;
-  i::FLAG_always_turbofan = false;
-  i::FLAG_turbofan = true;
+  i::v8_flags.allow_natives_syntax = true;
+  i::v8_flags.always_turbofan = false;
+  i::v8_flags.turbofan = true;
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Context> env = CcTest::NewContext({PROFILER_EXTENSION_ID});
   v8::Context::Scope context_scope(env);
diff --git a/deps/v8/test/cctest/test-random-number-generator.cc b/deps/v8/test/cctest/test-random-number-generator.cc
index c05c83db1fad11..4217a5f5936a80 100644
--- a/deps/v8/test/cctest/test-random-number-generator.cc
+++ b/deps/v8/test/cctest/test-random-number-generator.cc
@@ -38,7 +38,7 @@ static const int64_t kRandomSeeds[] = {-1, 1, 42, 100, 1234567890, 987654321};
 
 TEST(RandomSeedFlagIsUsed) {
   for (unsigned n = 0; n < arraysize(kRandomSeeds); ++n) {
-    FLAG_random_seed = static_cast<int>(kRandomSeeds[n]);
+    v8_flags.random_seed = static_cast<int>(kRandomSeeds[n]);
     v8::Isolate::CreateParams create_params;
     create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
     v8::Isolate* i = v8::Isolate::New(create_params);
@@ -63,7 +63,7 @@ double ChiSquared(int m, int n) {
 // Test for correlations between recent bits from the PRNG, or bits that are
 // biased.
 void RandomBitCorrelation(int random_bit) {
-  FLAG_random_seed = 31415926;
+  v8_flags.random_seed = 31415926;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   v8::Isolate* isolate = v8::Isolate::New(create_params);
diff --git a/deps/v8/test/cctest/test-sampler-api.cc b/deps/v8/test/cctest/test-sampler-api.cc
index 530da7faa9b54c..9ecb7e2e671933 100644
--- a/deps/v8/test/cctest/test-sampler-api.cc
+++ b/deps/v8/test/cctest/test-sampler-api.cc
@@ -201,7 +201,7 @@ TEST(BuiltinsInSamples) {
 //                              ^      ^       ^
 // sample.stack indices         2      1       0
 TEST(StackFramesConsistent) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   const char* test_script =
       "function test_sampler_api_inner() {"
       "  CollectSample();"
diff --git a/deps/v8/test/cctest/test-serialize.cc b/deps/v8/test/cctest/test-serialize.cc
index 9b417b5d698f77..d9df36b85bfc0c 100644
--- a/deps/v8/test/cctest/test-serialize.cc
+++ b/deps/v8/test/cctest/test-serialize.cc
@@ -69,7 +69,7 @@ enum CodeCacheType { kLazy, kEager, kAfterExecute };
 void DisableAlwaysOpt() {
   // Isolates prepared for serialization do not optimize. The only exception is
   // with the flag --always-turbofan.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 }
 
 // A convenience struct to simplify management of the blobs required to
@@ -962,7 +962,7 @@ void TypedArrayTestHelper(
     const Int32Expectations& after_restore_expectations = Int32Expectations(),
     v8::ArrayBuffer::Allocator* allocator = nullptr) {
   DisableAlwaysOpt();
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -1133,7 +1133,7 @@ UNINITIALIZED_TEST(CustomSnapshotDataBlobDetachedArrayBuffer) {
                                     std::make_tuple("x.length", 0)};
 
   DisableAlwaysOpt();
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -1203,7 +1203,7 @@ UNINITIALIZED_TEST(CustomSnapshotDataBlobOnOrOffHeapTypedArray) {
       std::make_tuple("y[2]", 48), std::make_tuple("z[0]", 96)};
 
   DisableAlwaysOpt();
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -1263,7 +1263,7 @@ UNINITIALIZED_TEST(CustomSnapshotDataBlobOnOrOffHeapTypedArray) {
 UNINITIALIZED_TEST(CustomSnapshotDataBlobTypedArrayNoEmbedderFieldCallback) {
   const char* code = "var x = new Uint8Array(8);";
   DisableAlwaysOpt();
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -1671,8 +1671,8 @@ static Handle<SharedFunctionInfo> CompileScriptAndProduceCache(
 }
 
 TEST(CodeSerializerWithProfiler) {
-  FLAG_enable_lazy_source_positions = true;
-  FLAG_stress_lazy_source_positions = false;
+  v8_flags.enable_lazy_source_positions = true;
+  v8_flags.stress_lazy_source_positions = false;
 
   LocalContext context;
   Isolate* isolate = CcTest::i_isolate();
@@ -1773,7 +1773,7 @@ TEST(CodeSerializerOnePlusOne) { TestCodeSerializerOnePlusOneImpl(); }
 
 // See bug v8:9122
 TEST(CodeSerializerOnePlusOneWithInterpretedFramesNativeStack) {
-  FLAG_interpreted_frames_native_stack = true;
+  v8_flags.interpreted_frames_native_stack = true;
   // We pass false because this test will create IET copies (which are
   // builtins).
   TestCodeSerializerOnePlusOneImpl(false);
@@ -2019,7 +2019,7 @@ TEST(CodeSerializerLargeCodeObject) {
 
   // The serializer only tests the shared code, which is always the unoptimized
   // code. Don't even bother generating optimized code to avoid timeouts.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   base::Vector<const char> source = ConstructSource(
       base::StaticCharVector("var j=1; if (j == 0) {"),
@@ -2064,13 +2064,13 @@ TEST(CodeSerializerLargeCodeObject) {
 }
 
 TEST(CodeSerializerLargeCodeObjectWithIncrementalMarking) {
-  if (!FLAG_incremental_marking) return;
-  if (!FLAG_compact) return;
+  if (!v8_flags.incremental_marking) return;
+  if (!v8_flags.compact) return;
   ManualGCScope manual_gc_scope;
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   const char* filter_flag = "--turbo-filter=NOTHING";
   FlagList::SetFlagsFromString(filter_flag, strlen(filter_flag));
-  FLAG_manual_evacuation_candidates_selection = true;
+  v8_flags.manual_evacuation_candidates_selection = true;
 
   LocalContext context;
   Isolate* isolate = CcTest::i_isolate();
@@ -2665,8 +2665,8 @@ TEST(CodeSerializerIsolatesEager) {
 TEST(CodeSerializerAfterExecute) {
   // We test that no compilations happen when running this code. Forcing
   // to always optimize breaks this test.
-  bool prev_always_turbofan_value = FLAG_always_turbofan;
-  FLAG_always_turbofan = false;
+  bool prev_always_turbofan_value = v8_flags.always_turbofan;
+  v8_flags.always_turbofan = false;
   const char* js_source = "function f() { return 'abc'; }; f() + 'def'";
   v8::ScriptCompiler::CachedData* cache =
       CompileRunAndProduceCache(js_source, CodeCacheType::kAfterExecute);
@@ -2712,7 +2712,7 @@ TEST(CodeSerializerAfterExecute) {
   isolate2->Dispose();
 
   // Restore the flags.
-  FLAG_always_turbofan = prev_always_turbofan_value;
+  v8_flags.always_turbofan = prev_always_turbofan_value;
 }
 
 TEST(CodeSerializerFlagChange) {
@@ -2723,7 +2723,8 @@ TEST(CodeSerializerFlagChange) {
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   v8::Isolate* isolate2 = v8::Isolate::New(create_params);
 
-  FLAG_allow_natives_syntax = true;  // Flag change should trigger cache reject.
+  v8_flags.allow_natives_syntax =
+      true;  // Flag change should trigger cache reject.
   FlagList::EnforceFlagImplications();
   {
     v8::Isolate::Scope iscope(isolate2);
@@ -2743,7 +2744,7 @@ TEST(CodeSerializerFlagChange) {
 }
 
 TEST(CodeSerializerBitFlip) {
-  i::FLAG_verify_snapshot_checksum = true;
+  i::v8_flags.verify_snapshot_checksum = true;
   const char* js_source = "function f() { return 'abc'; }; f() + 'def'";
   v8::ScriptCompiler::CachedData* cache = CompileRunAndProduceCache(js_source);
 
@@ -2844,7 +2845,7 @@ TEST(CodeSerializerWithHarmonyScoping) {
 }
 
 TEST(Regress503552) {
-  if (!FLAG_incremental_marking) return;
+  if (!v8_flags.incremental_marking) return;
   // Test that the code serializer can deal with weak cells that form a linked
   // list during incremental marking.
   CcTest::InitializeVM();
@@ -4111,9 +4112,9 @@ UNINITIALIZED_TEST(SnapshotCreatorIncludeGlobalProxy) {
 
 UNINITIALIZED_TEST(ReinitializeHashSeedJSCollectionRehashable) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4141,7 +4142,7 @@ UNINITIALIZED_TEST(ReinitializeHashSeedJSCollectionRehashable) {
     CHECK(blob.CanBeRehashed());
   }
 
-  i::FLAG_hash_seed = 1337;
+  i::v8_flags.hash_seed = 1337;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   create_params.snapshot_blob = &blob;
@@ -4166,9 +4167,9 @@ UNINITIALIZED_TEST(ReinitializeHashSeedJSCollectionRehashable) {
 
 UNINITIALIZED_TEST(ReinitializeHashSeedRehashable) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4209,7 +4210,7 @@ UNINITIALIZED_TEST(ReinitializeHashSeedRehashable) {
     CHECK(blob.CanBeRehashed());
   }
 
-  i::FLAG_hash_seed = 1337;
+  i::v8_flags.hash_seed = 1337;
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
   create_params.snapshot_blob = &blob;
@@ -4239,9 +4240,9 @@ UNINITIALIZED_TEST(ReinitializeHashSeedRehashable) {
 
 UNINITIALIZED_TEST(ClassFields) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4320,9 +4321,9 @@ UNINITIALIZED_TEST(ClassFields) {
 
 UNINITIALIZED_TEST(ClassFieldsReferencePrivateInInitializer) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4375,9 +4376,9 @@ UNINITIALIZED_TEST(ClassFieldsReferencePrivateInInitializer) {
 
 UNINITIALIZED_TEST(ClassFieldsReferenceClassVariable) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4426,9 +4427,9 @@ UNINITIALIZED_TEST(ClassFieldsReferenceClassVariable) {
 
 UNINITIALIZED_TEST(ClassFieldsNested) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4487,9 +4488,9 @@ UNINITIALIZED_TEST(ClassFieldsNested) {
 
 UNINITIALIZED_TEST(ClassPrivateMethods) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4561,9 +4562,9 @@ UNINITIALIZED_TEST(ClassPrivateMethods) {
 
 UNINITIALIZED_TEST(ClassFieldsWithInheritance) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4656,9 +4657,9 @@ UNINITIALIZED_TEST(ClassFieldsWithInheritance) {
 
 UNINITIALIZED_TEST(ClassFieldsRecalcPrivateNames) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4718,9 +4719,9 @@ UNINITIALIZED_TEST(ClassFieldsRecalcPrivateNames) {
 
 UNINITIALIZED_TEST(ClassFieldsWithBindings) {
   DisableAlwaysOpt();
-  i::FLAG_rehash_snapshot = true;
-  i::FLAG_hash_seed = 42;
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.rehash_snapshot = true;
+  i::v8_flags.hash_seed = 42;
+  i::v8_flags.allow_natives_syntax = true;
   DisableEmbeddedBlobRefcounting();
   v8::StartupData blob;
   {
@@ -4842,7 +4843,7 @@ UNINITIALIZED_TEST(WeakArraySerializationInSnapshot) {
 
   DisableAlwaysOpt();
   DisableEmbeddedBlobRefcounting();
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::StartupData blob;
   {
     v8::SnapshotCreator creator;
@@ -5023,11 +5024,11 @@ UNINITIALIZED_TEST(SnapshotCreatorDontDeferByteArrayForTypedArray) {
 class V8_NODISCARD DisableLazySourcePositionScope {
  public:
   DisableLazySourcePositionScope()
-      : backup_value_(FLAG_enable_lazy_source_positions) {
-    FLAG_enable_lazy_source_positions = false;
+      : backup_value_(v8_flags.enable_lazy_source_positions) {
+    v8_flags.enable_lazy_source_positions = false;
   }
   ~DisableLazySourcePositionScope() {
-    FLAG_enable_lazy_source_positions = backup_value_;
+    v8_flags.enable_lazy_source_positions = backup_value_;
   }
 
  private:
@@ -5093,16 +5094,19 @@ UNINITIALIZED_TEST(SharedStrings) {
 
   // Make all the flags that require a shared heap false before creating the
   // isolate to serialize.
-  FLAG_shared_string_table = false;
-  FLAG_harmony_struct = false;
+  v8_flags.shared_string_table = false;
+  v8_flags.harmony_struct = false;
 
   v8::Isolate* isolate_to_serialize = TestSerializer::NewIsolateInitialized();
   StartupBlobs blobs = Serialize(isolate_to_serialize);
   isolate_to_serialize->Dispose();
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
+
+  if (!v8_flags.shared_space) {
+    TestSerializer::InitializeProcessWideSharedIsolateFromBlob(blobs);
+  }
 
-  TestSerializer::InitializeProcessWideSharedIsolateFromBlob(blobs);
   v8::Isolate* isolate1 = TestSerializer::NewIsolateFromBlob(blobs);
   v8::Isolate* isolate2 = TestSerializer::NewIsolateFromBlob(blobs);
   Isolate* i_isolate1 = reinterpret_cast<Isolate*>(isolate1);
@@ -5116,11 +5120,14 @@ UNINITIALIZED_TEST(SharedStrings) {
     // Because both isolate1 and isolate2 are considered running on the main
     // thread, one must be parked to avoid deadlock in the shared heap
     // verification that may happen on client heap disposal.
-    ParkedScope parked(i_isolate2->main_thread_local_isolate());
-    isolate1->Dispose();
+    ParkedScope parked(i_isolate1->main_thread_local_isolate());
+    isolate2->Dispose();
+  }
+  isolate1->Dispose();
+
+  if (!v8_flags.shared_space) {
+    TestSerializer::DeleteProcessWideSharedIsolate();
   }
-  isolate2->Dispose();
-  TestSerializer::DeleteProcessWideSharedIsolate();
 
   blobs.Dispose();
   FreeCurrentEmbeddedBlob();
diff --git a/deps/v8/test/cctest/test-shared-strings.cc b/deps/v8/test/cctest/test-shared-strings.cc
index 29a9818fa4a5fa..41ff4ef054226c 100644
--- a/deps/v8/test/cctest/test-shared-strings.cc
+++ b/deps/v8/test/cctest/test-shared-strings.cc
@@ -81,10 +81,10 @@ class MultiClientIsolateTest {
 };
 
 UNINITIALIZED_TEST(InPlaceInternalizableStringsAreShared) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   MultiClientIsolateTest test;
   Isolate* i_isolate1 = test.i_main_isolate();
@@ -130,7 +130,7 @@ UNINITIALIZED_TEST(InPlaceInternalizableStringsAreShared) {
 UNINITIALIZED_TEST(InPlaceInternalization) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   MultiClientIsolateTest test;
   IsolateParkOnDisposeWrapper isolate_wrapper(test.NewClientIsolate(),
@@ -192,10 +192,10 @@ UNINITIALIZED_TEST(InPlaceInternalization) {
 }
 
 UNINITIALIZED_TEST(YoungInternalization) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   MultiClientIsolateTest test;
   IsolateParkOnDisposeWrapper isolate_wrapper(test.NewClientIsolate(),
@@ -378,7 +378,7 @@ Handle<FixedArray> CreateSharedOneByteStrings(Isolate* isolate,
 void TestConcurrentInternalization(TestHitOrMiss hit_or_miss) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   constexpr int kThreads = 4;
   constexpr int kStrings = 4096;
@@ -460,7 +460,7 @@ class ConcurrentStringTableLookupThread final
 UNINITIALIZED_TEST(ConcurrentStringTableLookup) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   constexpr int kTotalThreads = 4;
   constexpr int kInternalizationThreads = 1;
@@ -610,7 +610,7 @@ class ExternalResourceFactory {
 UNINITIALIZED_TEST(StringShare) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -674,8 +674,9 @@ UNINITIALIZED_TEST(StringShare) {
     TwoByteResource* two_byte_res = resource_factory.CreateTwoByte(two_byte);
     CHECK(one_byte_ext->MakeExternal(one_byte_res));
     CHECK(two_byte_ext->MakeExternal(two_byte_res));
-    if (FLAG_always_use_string_forwarding_table) {
-      i_isolate->heap()->CollectSharedGarbage(
+    if (v8_flags.always_use_string_forwarding_table) {
+      i_isolate->heap()->CollectGarbageShared(
+          i_isolate->main_thread_local_heap(),
           GarbageCollectionReason::kTesting);
     }
     CHECK(one_byte_ext->IsExternalString());
@@ -691,7 +692,7 @@ UNINITIALIZED_TEST(StringShare) {
   // All other strings are flattened then copied if the flatten didn't already
   // create a new copy.
 
-  if (!FLAG_single_generation) {
+  if (!v8_flags.single_generation) {
     // Young strings
     Handle<String> young_one_byte_seq = factory->NewStringFromAsciiChecked(
         raw_one_byte, AllocationType::kYoung);
@@ -710,7 +711,7 @@ UNINITIALIZED_TEST(StringShare) {
     CheckSharedStringIsEqualCopy(shared_two_byte, young_two_byte_seq);
   }
 
-  if (!FLAG_always_use_string_forwarding_table) {
+  if (!v8_flags.always_use_string_forwarding_table) {
     // Thin strings
     Handle<String> one_byte_seq1 =
         factory->NewStringFromAsciiChecked(raw_one_byte);
@@ -756,12 +757,12 @@ UNINITIALIZED_TEST(StringShare) {
 }
 
 UNINITIALIZED_TEST(PromotionMarkCompact) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_stress_concurrent_allocation = false;  // For SealCurrentObjects.
-  FLAG_shared_string_table = true;
-  FLAG_manual_evacuation_candidates_selection = true;
+  v8_flags.stress_concurrent_allocation = false;  // For SealCurrentObjects.
+  v8_flags.shared_string_table = true;
+  v8_flags.manual_evacuation_candidates_selection = true;
 
   MultiClientIsolateTest test;
   Isolate* i_isolate = test.i_main_isolate();
@@ -791,18 +792,18 @@ UNINITIALIZED_TEST(PromotionMarkCompact) {
 
     // In-place-internalizable strings are promoted into the shared heap when
     // sharing.
-    CHECK(!heap->Contains(*one_byte_seq));
+    CHECK_IMPLIES(!v8_flags.shared_space, !heap->Contains(*one_byte_seq));
     CHECK(heap->SharedHeapContains(*one_byte_seq));
   }
 }
 
 UNINITIALIZED_TEST(PromotionScavenge) {
-  if (FLAG_minor_mc) return;
-  if (FLAG_single_generation) return;
+  if (v8_flags.minor_mc) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_stress_concurrent_allocation = false;  // For SealCurrentObjects.
-  FLAG_shared_string_table = true;
+  v8_flags.stress_concurrent_allocation = false;  // For SealCurrentObjects.
+  v8_flags.shared_string_table = true;
 
   MultiClientIsolateTest test;
   Isolate* i_isolate = test.i_main_isolate();
@@ -830,22 +831,21 @@ UNINITIALIZED_TEST(PromotionScavenge) {
 
     // In-place-internalizable strings are promoted into the shared heap when
     // sharing.
-    CHECK(!heap->Contains(*one_byte_seq));
     CHECK(heap->SharedHeapContains(*one_byte_seq));
   }
 }
 
 UNINITIALIZED_TEST(PromotionScavengeOldToShared) {
-  if (FLAG_minor_mc) {
+  if (v8_flags.minor_mc) {
     // Promoting from new space directly to shared heap is not implemented in
     // MinorMC.
     return;
   }
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
-  if (FLAG_stress_concurrent_allocation) return;
+  if (v8_flags.stress_concurrent_allocation) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   MultiClientIsolateTest test;
   Isolate* i_isolate = test.i_main_isolate();
@@ -879,7 +879,6 @@ UNINITIALIZED_TEST(PromotionScavengeOldToShared) {
 
     // In-place-internalizable strings are promoted into the shared heap when
     // sharing.
-    CHECK(!heap->Contains(*one_byte_seq));
     CHECK(heap->SharedHeapContains(*one_byte_seq));
 
     // Since the GC promoted that string into shared heap, it also needs to
@@ -890,13 +889,13 @@ UNINITIALIZED_TEST(PromotionScavengeOldToShared) {
 }
 
 UNINITIALIZED_TEST(PromotionMarkCompactNewToShared) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
-  if (FLAG_stress_concurrent_allocation) return;
+  if (v8_flags.stress_concurrent_allocation) return;
 
-  FLAG_shared_string_table = true;
-  FLAG_manual_evacuation_candidates_selection = true;
-  FLAG_page_promotion = false;
+  v8_flags.shared_string_table = true;
+  v8_flags.manual_evacuation_candidates_selection = true;
+  v8_flags.page_promotion = false;
 
   MultiClientIsolateTest test;
   Isolate* i_isolate = test.i_main_isolate();
@@ -928,7 +927,6 @@ UNINITIALIZED_TEST(PromotionMarkCompactNewToShared) {
 
     // In-place-internalizable strings are promoted into the shared heap when
     // sharing.
-    CHECK(!heap->Contains(*one_byte_seq));
     CHECK(heap->SharedHeapContains(*one_byte_seq));
 
     // Since the GC promoted that string into shared heap, it also needs to
@@ -940,11 +938,15 @@ UNINITIALIZED_TEST(PromotionMarkCompactNewToShared) {
 
 UNINITIALIZED_TEST(PromotionMarkCompactOldToShared) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
-  if (FLAG_stress_concurrent_allocation) return;
-  if (!FLAG_page_promotion) return;
+  if (v8_flags.stress_concurrent_allocation) return;
+  if (!v8_flags.page_promotion) return;
+  if (v8_flags.single_generation) {
+    // String allocated in old space may be "pretenured" to the shared heap.
+    return;
+  }
 
-  FLAG_shared_string_table = true;
-  FLAG_manual_evacuation_candidates_selection = true;
+  v8_flags.shared_string_table = true;
+  v8_flags.manual_evacuation_candidates_selection = true;
 
   MultiClientIsolateTest test;
   Isolate* i_isolate = test.i_main_isolate();
@@ -986,7 +988,6 @@ UNINITIALIZED_TEST(PromotionMarkCompactOldToShared) {
 
     // In-place-internalizable strings are promoted into the shared heap when
     // sharing.
-    CHECK(!heap->Contains(*one_byte_seq));
     CHECK(heap->SharedHeapContains(*one_byte_seq));
 
     // Since the GC promoted that string into shared heap, it also needs to
@@ -997,12 +998,12 @@ UNINITIALIZED_TEST(PromotionMarkCompactOldToShared) {
 }
 
 UNINITIALIZED_TEST(PagePromotionRecordingOldToShared) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
-  if (FLAG_stress_concurrent_allocation) return;
+  if (v8_flags.stress_concurrent_allocation) return;
 
-  FLAG_shared_string_table = true;
-  FLAG_manual_evacuation_candidates_selection = true;
+  v8_flags.shared_string_table = true;
+  v8_flags.manual_evacuation_candidates_selection = true;
 
   MultiClientIsolateTest test;
   Isolate* i_isolate = test.i_main_isolate();
@@ -1050,7 +1051,7 @@ UNINITIALIZED_TEST(PagePromotionRecordingOldToShared) {
 UNINITIALIZED_TEST(InternalizedSharedStringsTransitionDuringGC) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   constexpr int kStrings = 4096;
 
@@ -1092,10 +1093,10 @@ UNINITIALIZED_TEST(InternalizedSharedStringsTransitionDuringGC) {
 }
 
 UNINITIALIZED_TEST(ShareExternalString) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1113,8 +1114,10 @@ UNINITIALIZED_TEST(ShareExternalString) {
 
   OneByteResource* resource = resource_factory.CreateOneByte(raw_one_byte);
   one_byte->MakeExternal(resource);
-  if (FLAG_always_use_string_forwarding_table) {
-    i_isolate1->heap()->CollectSharedGarbage(GarbageCollectionReason::kTesting);
+  if (v8_flags.always_use_string_forwarding_table) {
+    i_isolate1->heap()->CollectGarbageShared(
+        i_isolate1->main_thread_local_heap(),
+        GarbageCollectionReason::kTesting);
   }
   CHECK(one_byte->IsExternalString());
   Handle<ExternalOneByteString> one_byte_external =
@@ -1145,10 +1148,10 @@ void CheckExternalStringResource(
 }  // namespace
 
 UNINITIALIZED_TEST(ExternalizeSharedString) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1191,7 +1194,7 @@ UNINITIALIZED_TEST(ExternalizeSharedString) {
 UNINITIALIZED_TEST(ExternalizedSharedStringsTransitionDuringGC) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1225,7 +1228,8 @@ UNINITIALIZED_TEST(ExternalizedSharedStringsTransitionDuringGC) {
     }
 
     // Trigger garbage collection on the shared isolate.
-    i_isolate->heap()->CollectSharedGarbage(GarbageCollectionReason::kTesting);
+    i_isolate->heap()->CollectGarbageShared(i_isolate->main_thread_local_heap(),
+                                            GarbageCollectionReason::kTesting);
 
     // Check that GC cleared the forwarding table.
     CHECK_EQ(i_isolate->string_forwarding_table()->size(), 0);
@@ -1240,10 +1244,10 @@ UNINITIALIZED_TEST(ExternalizedSharedStringsTransitionDuringGC) {
 }
 
 UNINITIALIZED_TEST(ExternalizeInternalizedString) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1269,8 +1273,10 @@ UNINITIALIZED_TEST(ExternalizeInternalizedString) {
       factory1->NewStringFromTwoByte(two_byte_vec).ToHandleChecked());
   Handle<String> one_byte_intern = factory1->InternalizeString(one_byte);
   Handle<String> two_byte_intern = factory1->InternalizeString(two_byte);
-  if (FLAG_always_use_string_forwarding_table) {
-    i_isolate1->heap()->CollectSharedGarbage(GarbageCollectionReason::kTesting);
+  if (v8_flags.always_use_string_forwarding_table) {
+    i_isolate1->heap()->CollectGarbageShared(
+        i_isolate1->main_thread_local_heap(),
+        GarbageCollectionReason::kTesting);
   }
   CHECK(one_byte->IsThinString());
   CHECK(two_byte->IsThinString());
@@ -1304,10 +1310,10 @@ UNINITIALIZED_TEST(ExternalizeInternalizedString) {
 }
 
 UNINITIALIZED_TEST(InternalizeSharedExternalString) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1337,7 +1343,8 @@ UNINITIALIZED_TEST(InternalizeSharedExternalString) {
   CHECK(shared_two_byte->HasExternalForwardingIndex(kAcquireLoad));
 
   // Trigger GC to externalize the shared string.
-  i_isolate1->heap()->CollectSharedGarbage(GarbageCollectionReason::kTesting);
+  i_isolate1->heap()->CollectGarbageShared(i_isolate1->main_thread_local_heap(),
+                                           GarbageCollectionReason::kTesting);
   CHECK(shared_one_byte->IsShared());
   CHECK(shared_one_byte->IsExternalString());
   CHECK(shared_two_byte->IsShared());
@@ -1372,7 +1379,8 @@ UNINITIALIZED_TEST(InternalizeSharedExternalString) {
   // Another GC should create an externalized internalized string of the cached
   // (one byte) string and turn the uncached (two byte) string into a
   // ThinString, disposing the external resource.
-  i_isolate1->heap()->CollectSharedGarbage(GarbageCollectionReason::kTesting);
+  i_isolate1->heap()->CollectGarbageShared(i_isolate1->main_thread_local_heap(),
+                                           GarbageCollectionReason::kTesting);
   CHECK_EQ(shared_one_byte->map().instance_type(),
            InstanceType::EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE);
   if (is_uncached) {
@@ -1385,10 +1393,10 @@ UNINITIALIZED_TEST(InternalizeSharedExternalString) {
 }
 
 UNINITIALIZED_TEST(ExternalizeAndInternalizeMissSharedString) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1420,10 +1428,10 @@ UNINITIALIZED_TEST(ExternalizeAndInternalizeMissSharedString) {
 }
 
 UNINITIALIZED_TEST(InternalizeHitAndExternalizeSharedString) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1473,10 +1481,10 @@ UNINITIALIZED_TEST(InternalizeHitAndExternalizeSharedString) {
 }
 
 UNINITIALIZED_TEST(InternalizeMissAndExternalizeSharedString) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1571,7 +1579,7 @@ void CreateExternalResources(Isolate* i_isolate, Handle<FixedArray> strings,
 void TestConcurrentExternalization(bool share_resources) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1624,7 +1632,8 @@ void TestConcurrentExternalization(bool share_resources) {
     sema_execute_complete.ParkedWait(local_isolate);
   }
 
-  i_isolate->heap()->CollectSharedGarbage(GarbageCollectionReason::kTesting);
+  i_isolate->heap()->CollectGarbageShared(i_isolate->main_thread_local_heap(),
+                                          GarbageCollectionReason::kTesting);
 
   for (int i = 0; i < shared_strings->length(); i++) {
     Handle<String> input_string(String::cast(shared_strings->get(i)),
@@ -1667,7 +1676,7 @@ void TestConcurrentExternalizationAndInternalization(
     TestHitOrMiss hit_or_miss) {
   if (!V8_CAN_CREATE_SHARED_HEAP_BOOL) return;
 
-  FLAG_shared_string_table = true;
+  v8_flags.shared_string_table = true;
 
   ExternalResourceFactory resource_factory;
   MultiClientIsolateTest test;
@@ -1720,7 +1729,8 @@ void TestConcurrentExternalizationAndInternalization(
     sema_execute_complete.ParkedWait(local_isolate);
   }
 
-  i_isolate->heap()->CollectSharedGarbage(GarbageCollectionReason::kTesting);
+  i_isolate->heap()->CollectGarbageShared(i_isolate->main_thread_local_heap(),
+                                          GarbageCollectionReason::kTesting);
 
   for (int i = 0; i < shared_strings->length(); i++) {
     Handle<String> input_string(String::cast(shared_strings->get(i)),
diff --git a/deps/v8/test/cctest/test-stack-unwinding-win64.cc b/deps/v8/test/cctest/test-stack-unwinding-win64.cc
index a7b19af6c0cd42..61c9dc1bf11c22 100644
--- a/deps/v8/test/cctest/test-stack-unwinding-win64.cc
+++ b/deps/v8/test/cctest/test-stack-unwinding-win64.cc
@@ -79,8 +79,8 @@ UNINITIALIZED_TEST(StackUnwindingWin64) {
     return;
   }
 
-  i::FLAG_allow_natives_syntax = true;
-  i::FLAG_win64_unwinding_info = true;
+  i::v8_flags.allow_natives_syntax = true;
+  i::v8_flags.win64_unwinding_info = true;
 
   v8::Isolate::CreateParams create_params;
   create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
diff --git a/deps/v8/test/cctest/test-strings.cc b/deps/v8/test/cctest/test-strings.cc
index bfabd3ae386d4b..837d42669a3bf3 100644
--- a/deps/v8/test/cctest/test-strings.cc
+++ b/deps/v8/test/cctest/test-strings.cc
@@ -649,7 +649,7 @@ static inline void PrintStats(const ConsStringGenerationData& data) {
 
 template <typename BuildString>
 void TestStringCharacterStream(BuildString build, int test_cases) {
-  FLAG_gc_global = true;
+  v8_flags.gc_global = true;
   CcTest::InitializeVM();
   Isolate* isolate = CcTest::i_isolate();
   HandleScope outer_scope(isolate);
@@ -1154,7 +1154,7 @@ TEST(ReplaceInvalidUtf8) {
 }
 
 TEST(JSONStringifySliceMadeExternal) {
-  if (!FLAG_string_slices) return;
+  if (!v8_flags.string_slices) return;
   CcTest::InitializeVM();
   // Create a sliced string from a one-byte string.  The latter is turned
   // into a two-byte external string.  Check that JSON.stringify works.
@@ -1330,7 +1330,7 @@ TEST(CachedHashOverflow) {
 }
 
 TEST(SliceFromCons) {
-  if (!FLAG_string_slices) return;
+  if (!v8_flags.string_slices) return;
   CcTest::InitializeVM();
   Factory* factory = CcTest::i_isolate()->factory();
   v8::HandleScope scope(CcTest::isolate());
@@ -1365,7 +1365,7 @@ class OneByteVectorResource : public v8::String::ExternalOneByteStringResource {
 };
 
 TEST(InternalizeExternal) {
-  FLAG_stress_incremental_marking = false;
+  v8_flags.stress_incremental_marking = false;
   CcTest::InitializeVM();
   i::Isolate* isolate = CcTest::i_isolate();
   Factory* factory = isolate->factory();
@@ -1394,7 +1394,7 @@ TEST(InternalizeExternal) {
 }
 
 TEST(SliceFromExternal) {
-  if (!FLAG_string_slices) return;
+  if (!v8_flags.string_slices) return;
   CcTest::InitializeVM();
   Factory* factory = CcTest::i_isolate()->factory();
   v8::HandleScope scope(CcTest::isolate());
@@ -1417,7 +1417,7 @@ TEST(SliceFromExternal) {
 TEST(TrivialSlice) {
   // This tests whether a slice that contains the entire parent string
   // actually creates a new string (it should not).
-  if (!FLAG_string_slices) return;
+  if (!v8_flags.string_slices) return;
   CcTest::InitializeVM();
   Factory* factory = CcTest::i_isolate()->factory();
   v8::HandleScope scope(CcTest::isolate());
@@ -1446,7 +1446,7 @@ TEST(TrivialSlice) {
 TEST(SliceFromSlice) {
   // This tests whether a slice that contains the entire parent string
   // actually creates a new string (it should not).
-  if (!FLAG_string_slices) return;
+  if (!v8_flags.string_slices) return;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
   v8::Local<v8::Value> result;
@@ -1854,9 +1854,9 @@ class OneByteStringResource : public v8::String::ExternalOneByteStringResource {
 
 TEST(Regress876759) {
   // Thin strings are used in conjunction with young gen
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   // We don't create ThinStrings immediately when using the forwarding table.
-  if (FLAG_always_use_string_forwarding_table) return;
+  if (v8_flags.always_use_string_forwarding_table) return;
   Isolate* isolate = CcTest::i_isolate();
   Factory* factory = isolate->factory();
 
diff --git a/deps/v8/test/cctest/test-unwinder-code-pages.cc b/deps/v8/test/cctest/test-unwinder-code-pages.cc
index 16573ae6b3fc06..86479697a6d01e 100644
--- a/deps/v8/test/cctest/test-unwinder-code-pages.cc
+++ b/deps/v8/test/cctest/test-unwinder-code-pages.cc
@@ -265,7 +265,7 @@ bool PagesContainsAddress(size_t length, MemoryRange* pages,
 // Check that we can unwind when the pc is within an optimized code object on
 // the V8 heap.
 TEST(Unwind_CodeObjectPCInMiddle_Success_CodePagesAPI) {
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
@@ -653,7 +653,7 @@ TEST(PCIsInV8_InJSEntryRange_CodePagesAPI) {
 // Large code objects can be allocated in large object space. Check that this is
 // inside the CodeRange.
 TEST(PCIsInV8_LargeCodeObject_CodePagesAPI) {
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   LocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   Isolate* i_isolate = reinterpret_cast<Isolate*>(isolate);
@@ -746,7 +746,7 @@ class UnwinderTestHelper {
 UnwinderTestHelper* UnwinderTestHelper::instance_;
 
 TEST(Unwind_TwoNestedFunctions_CodePagesAPI) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   const char* test_script =
       "function test_unwinder_api_inner() {"
       "  TryUnwind();"
diff --git a/deps/v8/test/cctest/wasm/test-gc.cc b/deps/v8/test/cctest/wasm/test-gc.cc
index 4a579dbf31ac81..945f100dab31a1 100644
--- a/deps/v8/test/cctest/wasm/test-gc.cc
+++ b/deps/v8/test/cctest/wasm/test-gc.cc
@@ -40,10 +40,6 @@ class WasmGCTester {
                           execution_tier == TestExecutionTier::kLiftoff),
         flag_wasm_dynamic_tiering(&v8::internal::v8_flags.wasm_dynamic_tiering,
                                   v8::internal::v8_flags.liftoff_only != true),
-        // Test both setups with canonicalization and without.
-        flag_canonicalization(
-            &v8::internal::v8_flags.wasm_type_canonicalization,
-            execution_tier == TestExecutionTier::kTurbofan),
         flag_tierup(&v8::internal::v8_flags.wasm_tier_up, false),
         zone_(&allocator, ZONE_NAME),
         builder_(&zone_),
@@ -200,7 +196,6 @@ class WasmGCTester {
   const FlagScope<bool> flag_liftoff;
   const FlagScope<bool> flag_liftoff_only;
   const FlagScope<bool> flag_wasm_dynamic_tiering;
-  const FlagScope<bool> flag_canonicalization;
   const FlagScope<bool> flag_tierup;
 
   byte DefineFunctionImpl(WasmFunctionBuilder* fun,
@@ -1190,27 +1185,31 @@ WASM_COMPILED_EXEC_TEST(RefTrivialCastsStatic) {
   FunctionSig sig(1, 2, sig_types);
   byte sig_index = tester.DefineSignature(&sig);
 
-  const byte kRefTestNull = tester.DefineFunction(
+  const byte kRefTestNullDeprecated = tester.DefineFunction(
       tester.sigs.i_v(), {},
-      {WASM_REF_TEST(WASM_REF_NULL(type_index), subtype_index), kExprEnd});
+      {WASM_REF_TEST_DEPRECATED(WASM_REF_NULL(type_index), subtype_index),
+       kExprEnd});
   // Upcasts should be optimized away for nominal types.
-  const byte kRefTestUpcast = tester.DefineFunction(
+  const byte kRefTestUpcastDeprecated = tester.DefineFunction(
       tester.sigs.i_v(), {},
-      {WASM_REF_TEST(WASM_STRUCT_NEW_DEFAULT(subtype_index), type_index),
+      {WASM_REF_TEST_DEPRECATED(WASM_STRUCT_NEW_DEFAULT(subtype_index),
+                                type_index),
        kExprEnd});
-  const byte kRefTestUpcastNull = tester.DefineFunction(
+  const byte kRefTestUpcastNullDeprecated = tester.DefineFunction(
       tester.sigs.i_v(), {},
-      {WASM_REF_TEST(WASM_REF_NULL(subtype_index), type_index), kExprEnd});
-  const byte kRefTestUnrelatedNullable = tester.DefineFunction(
+      {WASM_REF_TEST_DEPRECATED(WASM_REF_NULL(subtype_index), type_index),
+       kExprEnd});
+  const byte kRefTestUnrelatedNullableDeprecated = tester.DefineFunction(
       tester.sigs.i_v(), {refNull(subtype_index)},
       {WASM_LOCAL_SET(0, WASM_STRUCT_NEW_DEFAULT(subtype_index)),
-       WASM_REF_TEST(WASM_LOCAL_GET(0), sig_index), kExprEnd});
-  const byte kRefTestUnrelatedNull = tester.DefineFunction(
+       WASM_REF_TEST_DEPRECATED(WASM_LOCAL_GET(0), sig_index), kExprEnd});
+  const byte kRefTestUnrelatedNullDeprecated = tester.DefineFunction(
       tester.sigs.i_v(), {},
-      {WASM_REF_TEST(WASM_REF_NULL(subtype_index), sig_index), kExprEnd});
-  const byte kRefTestUnrelatedNonNullable = tester.DefineFunction(
+      {WASM_REF_TEST_DEPRECATED(WASM_REF_NULL(subtype_index), sig_index),
+       kExprEnd});
+  const byte kRefTestUnrelatedNonNullableDeprecated = tester.DefineFunction(
       tester.sigs.i_v(), {},
-      {WASM_REF_TEST(WASM_STRUCT_NEW_DEFAULT(type_index), sig_index),
+      {WASM_REF_TEST_DEPRECATED(WASM_STRUCT_NEW_DEFAULT(type_index), sig_index),
        kExprEnd});
 
   const byte kRefCastNull =
@@ -1333,12 +1332,12 @@ WASM_COMPILED_EXEC_TEST(RefTrivialCastsStatic) {
 
   tester.CompileModule();
 
-  tester.CheckResult(kRefTestNull, 0);
-  tester.CheckResult(kRefTestUpcast, 1);
-  tester.CheckResult(kRefTestUpcastNull, 0);
-  tester.CheckResult(kRefTestUnrelatedNullable, 0);
-  tester.CheckResult(kRefTestUnrelatedNull, 0);
-  tester.CheckResult(kRefTestUnrelatedNonNullable, 0);
+  tester.CheckResult(kRefTestNullDeprecated, 0);
+  tester.CheckResult(kRefTestUpcastDeprecated, 1);
+  tester.CheckResult(kRefTestUpcastNullDeprecated, 0);
+  tester.CheckResult(kRefTestUnrelatedNullableDeprecated, 0);
+  tester.CheckResult(kRefTestUnrelatedNullDeprecated, 0);
+  tester.CheckResult(kRefTestUnrelatedNonNullableDeprecated, 0);
 
   tester.CheckResult(kRefCastNull, 1);
   tester.CheckResult(kRefCastUpcast, 0);
@@ -1485,6 +1484,16 @@ WASM_COMPILED_EXEC_TEST(FunctionRefs) {
   const byte cast_reference = tester.DefineFunction(
       &sig_func, {}, {WASM_REF_FUNC(sig_index), kExprEnd});
 
+  const byte test_deprecated = tester.DefineFunction(
+      tester.sigs.i_v(), {kWasmFuncRef},
+      {WASM_LOCAL_SET(0, WASM_REF_FUNC(func_index)),
+       WASM_REF_TEST_DEPRECATED(WASM_LOCAL_GET(0), sig_index), kExprEnd});
+
+  const byte test_fail_deprecated = tester.DefineFunction(
+      tester.sigs.i_v(), {kWasmFuncRef},
+      {WASM_LOCAL_SET(0, WASM_REF_FUNC(func_index)),
+       WASM_REF_TEST_DEPRECATED(WASM_LOCAL_GET(0), other_sig_index), kExprEnd});
+
   const byte test = tester.DefineFunction(
       tester.sigs.i_v(), {kWasmFuncRef},
       {WASM_LOCAL_SET(0, WASM_REF_FUNC(func_index)),
@@ -1513,6 +1522,8 @@ WASM_COMPILED_EXEC_TEST(FunctionRefs) {
   CHECK_EQ(cast_function->code().raw_instruction_start(),
            cast_function_reference->code().raw_instruction_start());
 
+  tester.CheckResult(test_deprecated, 1);
+  tester.CheckResult(test_fail_deprecated, 0);
   tester.CheckResult(test, 1);
   tester.CheckResult(test_fail, 0);
 }
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm-bulk-memory.cc b/deps/v8/test/cctest/wasm/test-run-wasm-bulk-memory.cc
index c38d81a049eb17..f8523b114ce47e 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm-bulk-memory.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm-bulk-memory.cc
@@ -565,7 +565,7 @@ void TestTableCopyElems(TestExecutionTier execution_tier, int table_dst,
                         WASM_LOCAL_GET(1), WASM_LOCAL_GET(2)),
         kExprI32Const, 0);
 
-  r.builder().FreezeSignatureMapAndInitializeWrapperCache();
+  r.builder().InitializeWrapperCache();
 
   auto table =
       handle(WasmTableObject::cast(
@@ -714,7 +714,7 @@ void TestTableCopyOobWrites(TestExecutionTier execution_tier, int table_dst,
                         WASM_LOCAL_GET(1), WASM_LOCAL_GET(2)),
         kExprI32Const, 0);
 
-  r.builder().FreezeSignatureMapAndInitializeWrapperCache();
+  r.builder().InitializeWrapperCache();
 
   auto table =
       handle(WasmTableObject::cast(
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm-exceptions.cc b/deps/v8/test/cctest/wasm/test-run-wasm-exceptions.cc
index 282d5832398254..c125a427f82351 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm-exceptions.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm-exceptions.cc
@@ -598,7 +598,7 @@ UNINITIALIZED_WASM_EXEC_TEST(TestStackOverflowNotCaught) {
   TestSignatures sigs;
   EXPERIMENTAL_FLAG_SCOPE(eh);
   // v8_flags.stack_size must be set before isolate initialization.
-  FlagScope<int32_t> stack_size(&v8::internal::v8_flags.stack_size, 8);
+  FlagScope<int32_t> stack_size(&v8_flags.stack_size, 8);
 
   IsolateScope isolate_scope;
   LocalContext context(isolate_scope.isolate());
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm-interpreter.cc b/deps/v8/test/cctest/wasm/test-run-wasm-interpreter.cc
index 4023f94b07267b..d1526ac2457676 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm-interpreter.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm-interpreter.cc
@@ -157,7 +157,7 @@ static T factorial(T v) {
 TEST(Run_Wasm_returnCallFactorial) {
   EXPERIMENTAL_FLAG_SCOPE(return_call);
   // Run in bounded amount of stack - 8kb.
-  FlagScope<int32_t> stack_size(&v8::internal::v8_flags.stack_size, 8);
+  FlagScope<int32_t> stack_size(&v8_flags.stack_size, 8);
 
   WasmRunner<uint32_t, int32_t> r(TestExecutionTier::kInterpreter);
 
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm-js.cc b/deps/v8/test/cctest/wasm/test-run-wasm-js.cc
index 253dc56397d906..2d51f0fe9dd87c 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm-js.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm-js.cc
@@ -116,42 +116,6 @@ WASM_COMPILED_EXEC_TEST(Run_CallJS_Add_jswrapped) {
   r.CheckCallViaJS(-666666801, -666666900);
 }
 
-WASM_COMPILED_EXEC_TEST(Run_IndirectCallJSFunction) {
-  Isolate* isolate = CcTest::InitIsolateOnce();
-  HandleScope scope(isolate);
-  TestSignatures sigs;
-
-  const char* source = "(function(a, b, c) { if(c) return a; return b; })";
-  Handle<JSFunction> js_function =
-      Handle<JSFunction>::cast(v8::Utils::OpenHandle(
-          *v8::Local<v8::Function>::Cast(CompileRun(source))));
-
-  ManuallyImportedJSFunction import = {sigs.i_iii(), js_function};
-
-  WasmRunner<int32_t, int32_t> r(execution_tier, &import);
-
-  const uint32_t js_index = 0;
-  const int32_t left = -2;
-  const int32_t right = 3;
-
-  WasmFunctionCompiler& rc_fn = r.NewFunction(sigs.i_i(), "rc");
-
-  byte sig_index = r.builder().AddSignature(sigs.i_iii());
-  uint16_t indirect_function_table[] = {static_cast<uint16_t>(js_index)};
-
-  r.builder().AddIndirectFunctionTable(indirect_function_table,
-                                       arraysize(indirect_function_table));
-
-  BUILD(rc_fn, WASM_CALL_INDIRECT(sig_index, WASM_I32V(left), WASM_I32V(right),
-                                  WASM_LOCAL_GET(0), WASM_I32V(js_index)));
-
-  Handle<Object> args_left[] = {isolate->factory()->NewNumber(1)};
-  r.CheckCallApplyViaJS(left, rc_fn.function_index(), args_left, 1);
-
-  Handle<Object> args_right[] = {isolate->factory()->NewNumber(0)};
-  r.CheckCallApplyViaJS(right, rc_fn.function_index(), args_right, 1);
-}
-
 void RunJSSelectTest(TestExecutionTier tier, int which) {
   const int kMaxParams = 8;
   PredictableInputValues inputs(0x100);
@@ -561,10 +525,6 @@ WASM_COMPILED_EXEC_TEST(Run_ReturnCallImportedFunction) {
   RunPickerTest(execution_tier, false);
 }
 
-WASM_COMPILED_EXEC_TEST(Run_ReturnCallIndirectImportedFunction) {
-  RunPickerTest(execution_tier, true);
-}
-
 }  // namespace wasm
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/test/cctest/wasm/test-run-wasm.cc b/deps/v8/test/cctest/wasm/test-run-wasm.cc
index 4173532584b4b6..9b967e239f1070 100644
--- a/deps/v8/test/cctest/wasm/test-run-wasm.cc
+++ b/deps/v8/test/cctest/wasm/test-run-wasm.cc
@@ -2514,7 +2514,7 @@ class IsolateScope {
 UNINITIALIZED_WASM_EXEC_TEST(ReturnCall_Factorial) {
   EXPERIMENTAL_FLAG_SCOPE(return_call);
   // Run in bounded amount of stack - 8kb.
-  FlagScope<int32_t> stack_size(&v8::internal::v8_flags.stack_size, 8);
+  FlagScope<int32_t> stack_size(&v8_flags.stack_size, 8);
 
   IsolateScope isolate_scope;
   LocalContext current(isolate_scope.isolate());
@@ -2552,7 +2552,7 @@ UNINITIALIZED_WASM_EXEC_TEST(ReturnCall_Factorial) {
 UNINITIALIZED_WASM_EXEC_TEST(ReturnCall_MutualFactorial) {
   EXPERIMENTAL_FLAG_SCOPE(return_call);
   // Run in bounded amount of stack - 8kb.
-  FlagScope<int32_t> stack_size(&v8::internal::v8_flags.stack_size, 8);
+  FlagScope<int32_t> stack_size(&v8_flags.stack_size, 8);
 
   IsolateScope isolate_scope;
   LocalContext current(isolate_scope.isolate());
@@ -2599,7 +2599,7 @@ UNINITIALIZED_WASM_EXEC_TEST(ReturnCall_MutualFactorial) {
 UNINITIALIZED_WASM_EXEC_TEST(ReturnCall_IndirectFactorial) {
   EXPERIMENTAL_FLAG_SCOPE(return_call);
   // Run in bounded amount of stack - 8kb.
-  FlagScope<int32_t> stack_size(&v8::internal::v8_flags.stack_size, 8);
+  FlagScope<int32_t> stack_size(&v8_flags.stack_size, 8);
 
   IsolateScope isolate_scope;
   LocalContext current(isolate_scope.isolate());
@@ -2648,7 +2648,7 @@ UNINITIALIZED_WASM_EXEC_TEST(ReturnCall_IndirectFactorial) {
 UNINITIALIZED_WASM_EXEC_TEST(ReturnCall_Sum) {
   EXPERIMENTAL_FLAG_SCOPE(return_call);
   // Run in bounded amount of stack - 8kb.
-  FlagScope<int32_t> stack_size(&v8::internal::v8_flags.stack_size, 8);
+  FlagScope<int32_t> stack_size(&v8_flags.stack_size, 8);
 
   IsolateScope isolate_scope;
   LocalContext current(isolate_scope.isolate());
@@ -2690,7 +2690,7 @@ UNINITIALIZED_WASM_EXEC_TEST(ReturnCall_Sum) {
 UNINITIALIZED_WASM_EXEC_TEST(ReturnCall_Bounce_Sum) {
   EXPERIMENTAL_FLAG_SCOPE(return_call);
   // Run in bounded amount of stack - 8kb.
-  FlagScope<int32_t> stack_size(&v8::internal::v8_flags.stack_size, 8);
+  FlagScope<int32_t> stack_size(&v8_flags.stack_size, 8);
 
   IsolateScope isolate_scope;
   LocalContext current(isolate_scope.isolate());
@@ -2755,7 +2755,7 @@ static void Run_WasmMixedCall_N(TestExecutionTier execution_tier, int start) {
 
   int num_params = static_cast<int>(arraysize(mixed)) - start;
   for (int which = 0; which < num_params; ++which) {
-    v8::internal::AccountingAllocator allocator;
+    AccountingAllocator allocator;
     Zone zone(&allocator, ZONE_NAME);
     WasmRunner<int32_t> r(execution_tier);
     r.builder().AddMemory(kWasmPageSize);
diff --git a/deps/v8/test/cctest/wasm/test-streaming-compilation.cc b/deps/v8/test/cctest/wasm/test-streaming-compilation.cc
index 32566c7fca580a..393a088adffcae 100644
--- a/deps/v8/test/cctest/wasm/test-streaming-compilation.cc
+++ b/deps/v8/test/cctest/wasm/test-streaming-compilation.cc
@@ -1253,9 +1253,8 @@ STREAM_TEST(TestIncrementalCaching) {
   Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
   Handle<Script> script = GetWasmEngine()->GetOrCreateScript(
       i_isolate, tester.shared_native_module(), kNoSourceUrl);
-  Handle<FixedArray> export_wrappers = i_isolate->factory()->NewFixedArray(3);
-  Handle<WasmModuleObject> module_object = WasmModuleObject::New(
-      i_isolate, tester.shared_native_module(), script, export_wrappers);
+  Handle<WasmModuleObject> module_object =
+      WasmModuleObject::New(i_isolate, tester.shared_native_module(), script);
   ErrorThrower thrower(i_isolate, "Instantiation");
   // We instantiated before, so the second instantiation must also succeed:
   Handle<WasmInstanceObject> instance =
diff --git a/deps/v8/test/cctest/wasm/test-wasm-import-wrapper-cache.cc b/deps/v8/test/cctest/wasm/test-wasm-import-wrapper-cache.cc
index b8a22392a8468a..9e11ab13e02ef7 100644
--- a/deps/v8/test/cctest/wasm/test-wasm-import-wrapper-cache.cc
+++ b/deps/v8/test/cctest/wasm/test-wasm-import-wrapper-cache.cc
@@ -37,16 +37,19 @@ TEST(CacheHit) {
 
   auto kind = compiler::WasmImportCallKind::kJSFunctionArityMatch;
   auto sig = sigs.i_i();
+  uint32_t canonical_type_index =
+      GetTypeCanonicalizer()->AddRecursiveGroup(sig);
   int expected_arity = static_cast<int>(sig->parameter_count());
 
-  WasmCode* c1 =
-      CompileImportWrapper(module.get(), isolate->counters(), kind, sig,
-                           expected_arity, kNoSuspend, &cache_scope);
+  WasmCode* c1 = CompileImportWrapper(module.get(), isolate->counters(), kind,
+                                      sig, canonical_type_index, expected_arity,
+                                      kNoSuspend, &cache_scope);
 
   CHECK_NOT_NULL(c1);
   CHECK_EQ(WasmCode::Kind::kWasmToJsWrapper, c1->kind());
 
-  WasmCode* c2 = cache_scope[{kind, sig, expected_arity, kNoSuspend}];
+  WasmCode* c2 =
+      cache_scope[{kind, canonical_type_index, expected_arity, kNoSuspend}];
 
   CHECK_NOT_NULL(c2);
   CHECK_EQ(c1, c2);
@@ -63,17 +66,22 @@ TEST(CacheMissSig) {
   auto kind = compiler::WasmImportCallKind::kJSFunctionArityMatch;
   auto sig1 = sigs.i_i();
   int expected_arity1 = static_cast<int>(sig1->parameter_count());
+  uint32_t canonical_type_index1 =
+      GetTypeCanonicalizer()->AddRecursiveGroup(sig1);
   auto sig2 = sigs.i_ii();
   int expected_arity2 = static_cast<int>(sig2->parameter_count());
+  uint32_t canonical_type_index2 =
+      GetTypeCanonicalizer()->AddRecursiveGroup(sig2);
 
-  WasmCode* c1 =
-      CompileImportWrapper(module.get(), isolate->counters(), kind, sig1,
-                           expected_arity1, kNoSuspend, &cache_scope);
+  WasmCode* c1 = CompileImportWrapper(
+      module.get(), isolate->counters(), kind, sig1, canonical_type_index1,
+      expected_arity1, kNoSuspend, &cache_scope);
 
   CHECK_NOT_NULL(c1);
   CHECK_EQ(WasmCode::Kind::kWasmToJsWrapper, c1->kind());
 
-  WasmCode* c2 = cache_scope[{kind, sig2, expected_arity2, kNoSuspend}];
+  WasmCode* c2 =
+      cache_scope[{kind, canonical_type_index2, expected_arity2, kNoSuspend}];
 
   CHECK_NULL(c2);
 }
@@ -90,15 +98,18 @@ TEST(CacheMissKind) {
   auto kind2 = compiler::WasmImportCallKind::kJSFunctionArityMismatch;
   auto sig = sigs.i_i();
   int expected_arity = static_cast<int>(sig->parameter_count());
+  uint32_t canonical_type_index =
+      GetTypeCanonicalizer()->AddRecursiveGroup(sig);
 
-  WasmCode* c1 =
-      CompileImportWrapper(module.get(), isolate->counters(), kind1, sig,
-                           expected_arity, kNoSuspend, &cache_scope);
+  WasmCode* c1 = CompileImportWrapper(module.get(), isolate->counters(), kind1,
+                                      sig, canonical_type_index, expected_arity,
+                                      kNoSuspend, &cache_scope);
 
   CHECK_NOT_NULL(c1);
   CHECK_EQ(WasmCode::Kind::kWasmToJsWrapper, c1->kind());
 
-  WasmCode* c2 = cache_scope[{kind2, sig, expected_arity, kNoSuspend}];
+  WasmCode* c2 =
+      cache_scope[{kind2, canonical_type_index, expected_arity, kNoSuspend}];
 
   CHECK_NULL(c2);
 }
@@ -114,31 +125,39 @@ TEST(CacheHitMissSig) {
   auto kind = compiler::WasmImportCallKind::kJSFunctionArityMatch;
   auto sig1 = sigs.i_i();
   int expected_arity1 = static_cast<int>(sig1->parameter_count());
+  uint32_t canonical_type_index1 =
+      GetTypeCanonicalizer()->AddRecursiveGroup(sig1);
   auto sig2 = sigs.i_ii();
   int expected_arity2 = static_cast<int>(sig2->parameter_count());
+  uint32_t canonical_type_index2 =
+      GetTypeCanonicalizer()->AddRecursiveGroup(sig2);
 
-  WasmCode* c1 =
-      CompileImportWrapper(module.get(), isolate->counters(), kind, sig1,
-                           expected_arity1, kNoSuspend, &cache_scope);
+  WasmCode* c1 = CompileImportWrapper(
+      module.get(), isolate->counters(), kind, sig1, canonical_type_index1,
+      expected_arity1, kNoSuspend, &cache_scope);
 
   CHECK_NOT_NULL(c1);
   CHECK_EQ(WasmCode::Kind::kWasmToJsWrapper, c1->kind());
 
-  WasmCode* c2 = cache_scope[{kind, sig2, expected_arity2, kNoSuspend}];
+  WasmCode* c2 =
+      cache_scope[{kind, canonical_type_index2, expected_arity2, kNoSuspend}];
 
   CHECK_NULL(c2);
 
   c2 = CompileImportWrapper(module.get(), isolate->counters(), kind, sig2,
-                            expected_arity2, kNoSuspend, &cache_scope);
+                            canonical_type_index2, expected_arity2, kNoSuspend,
+                            &cache_scope);
 
   CHECK_NE(c1, c2);
 
-  WasmCode* c3 = cache_scope[{kind, sig1, expected_arity1, kNoSuspend}];
+  WasmCode* c3 =
+      cache_scope[{kind, canonical_type_index1, expected_arity1, kNoSuspend}];
 
   CHECK_NOT_NULL(c3);
   CHECK_EQ(c1, c3);
 
-  WasmCode* c4 = cache_scope[{kind, sig2, expected_arity2, kNoSuspend}];
+  WasmCode* c4 =
+      cache_scope[{kind, canonical_type_index2, expected_arity2, kNoSuspend}];
 
   CHECK_NOT_NULL(c4);
   CHECK_EQ(c2, c4);
diff --git a/deps/v8/test/cctest/wasm/wasm-run-utils.cc b/deps/v8/test/cctest/wasm/wasm-run-utils.cc
index d7e05141b1fe65..a2044abbe7a12c 100644
--- a/deps/v8/test/cctest/wasm/wasm-run-utils.cc
+++ b/deps/v8/test/cctest/wasm/wasm-run-utils.cc
@@ -82,14 +82,17 @@ TestingModuleBuilder::TestingModuleBuilder(
     Handle<JSReceiver> callable = resolved.callable;
     WasmImportWrapperCache::ModificationScope cache_scope(
         native_module_->import_wrapper_cache());
+    uint32_t canonical_type_index =
+        GetTypeCanonicalizer()->AddRecursiveGroup(maybe_import->sig);
     WasmImportWrapperCache::CacheKey key(
-        kind, maybe_import->sig,
+        kind, canonical_type_index,
         static_cast<int>(maybe_import->sig->parameter_count()), kNoSuspend);
     auto import_wrapper = cache_scope[key];
     if (import_wrapper == nullptr) {
       CodeSpaceWriteScope write_scope(native_module_);
       import_wrapper = CompileImportWrapper(
           native_module_, isolate_->counters(), kind, maybe_import->sig,
+          canonical_type_index,
           static_cast<int>(maybe_import->sig->parameter_count()), kNoSuspend,
           &cache_scope);
     }
@@ -155,7 +158,6 @@ uint32_t TestingModuleBuilder::AddFunction(const FunctionSig* sig,
                                      index,    // func_index
                                      0,        // sig_index
                                      {0, 0},   // code
-                                     0,        // feedback slots
                                      false,    // imported
                                      false,    // exported
                                      false});  // declared
@@ -182,18 +184,14 @@ uint32_t TestingModuleBuilder::AddFunction(const FunctionSig* sig,
   return index;
 }
 
-void TestingModuleBuilder::FreezeSignatureMapAndInitializeWrapperCache() {
-  if (test_module_->signature_map.is_frozen()) return;
-  test_module_->signature_map.Freeze();
-  size_t max_num_sigs = MaxNumExportWrappers(test_module_.get());
-  Handle<FixedArray> export_wrappers =
-      isolate_->factory()->NewFixedArray(static_cast<int>(max_num_sigs));
-  instance_object_->module_object().set_export_wrappers(*export_wrappers);
+void TestingModuleBuilder::InitializeWrapperCache() {
+  isolate_->heap()->EnsureWasmCanonicalRttsSize(
+      test_module_->MaxCanonicalTypeIndex() + 1);
 }
 
 Handle<JSFunction> TestingModuleBuilder::WrapCode(uint32_t index) {
   CHECK(!interpreter_);
-  FreezeSignatureMapAndInitializeWrapperCache();
+  InitializeWrapperCache();
   return handle(
       JSFunction::cast(WasmInstanceObject::GetOrCreateWasmInternalFunction(
                            isolate_, instance_object(), index)
@@ -241,10 +239,7 @@ void TestingModuleBuilder::AddIndirectFunctionTable(
     for (uint32_t i = 0; i < table_size; ++i) {
       WasmFunction& function = test_module_->functions[function_indexes[i]];
       int sig_id =
-          v8_flags.wasm_type_canonicalization
-              ? test_module_
-                    ->isorecursive_canonical_type_ids[function.sig_index]
-              : test_module_->signature_map.Find(*function.sig);
+          test_module_->isorecursive_canonical_type_ids[function.sig_index];
       FunctionTargetAndRef entry(instance, function.func_index);
       instance->GetIndirectFunctionTable(isolate_, table_index)
           ->Set(i, sig_id, entry.call_target(), *entry.ref());
diff --git a/deps/v8/test/cctest/wasm/wasm-run-utils.h b/deps/v8/test/cctest/wasm/wasm-run-utils.h
index 0ce398339c6b1b..fc968701578b7b 100644
--- a/deps/v8/test/cctest/wasm/wasm-run-utils.h
+++ b/deps/v8/test/cctest/wasm/wasm-run-utils.h
@@ -135,14 +135,10 @@ class TestingModuleBuilder {
   }
 
   byte AddSignature(const FunctionSig* sig) {
-    DCHECK_EQ(test_module_->types.size(),
-              test_module_->per_module_canonical_type_ids.size());
     test_module_->add_signature(sig, kNoSuperType);
-    if (v8_flags.wasm_type_canonicalization) {
-      GetTypeCanonicalizer()->AddRecursiveGroup(test_module_.get(), 1);
-      instance_object_->set_isorecursive_canonical_types(
-          test_module_->isorecursive_canonical_type_ids.data());
-    }
+    GetTypeCanonicalizer()->AddRecursiveGroup(test_module_.get(), 1);
+    instance_object_->set_isorecursive_canonical_types(
+        test_module_->isorecursive_canonical_type_ids.data());
     size_t size = test_module_->types.size();
     CHECK_GT(127, size);
     return static_cast<byte>(size - 1);
@@ -213,7 +209,7 @@ class TestingModuleBuilder {
 
   // Freezes the signature map of the module and allocates the storage for
   // export wrappers.
-  void FreezeSignatureMapAndInitializeWrapperCache();
+  void InitializeWrapperCache();
 
   // Wrap the code so it can be called as a JS function.
   Handle<JSFunction> WrapCode(uint32_t index);
diff --git a/deps/v8/test/common/wasm/wasm-interpreter.cc b/deps/v8/test/common/wasm/wasm-interpreter.cc
index 468bfe1e4f1cf1..bb34b53b43d3f5 100644
--- a/deps/v8/test/common/wasm/wasm-interpreter.cc
+++ b/deps/v8/test/common/wasm/wasm-interpreter.cc
@@ -20,7 +20,6 @@
 #include "src/utils/utils.h"
 #include "src/wasm/decoder.h"
 #include "src/wasm/function-body-decoder-impl.h"
-#include "src/wasm/function-body-decoder.h"
 #include "src/wasm/memory-tracing.h"
 #include "src/wasm/module-compiler.h"
 #include "src/wasm/wasm-arguments.h"
@@ -750,7 +749,7 @@ class SideTable : public ZoneObject {
             max_exception_arity, static_cast<int>(tag.sig->parameter_count()));
       }
     }
-    for (BytecodeIterator i(code->start, code->end, &code->locals);
+    for (BytecodeIterator i(code->start, code->end, &code->locals, zone);
          i.has_next(); i.next()) {
       WasmOpcode opcode = i.current();
       int32_t exceptional_stack_height = 0;
@@ -1120,8 +1119,8 @@ class CodeMap {
 
   void AddFunction(const WasmFunction* function, const byte* code_start,
                    const byte* code_end) {
-    InterpreterCode code = {function, BodyLocalDecls(zone_), code_start,
-                            code_end, nullptr};
+    InterpreterCode code = {function, BodyLocalDecls{}, code_start, code_end,
+                            nullptr};
 
     DCHECK_EQ(interpreter_code_.size(), function->func_index);
     interpreter_code_.push_back(code);
@@ -1335,7 +1334,7 @@ class WasmInterpreterInternals {
     // Limit of parameters.
     sp_t plimit() { return sp + code->function->sig->parameter_count(); }
     // Limit of locals.
-    sp_t llimit() { return plimit() + code->locals.type_list.size(); }
+    sp_t llimit() { return plimit() + code->locals.num_locals; }
 
     Handle<FixedArray> caught_exception_stack;
   };
@@ -1408,7 +1407,7 @@ class WasmInterpreterInternals {
   // Check if there is room for a function's activation.
   void EnsureStackSpaceForCall(InterpreterCode* code) {
     EnsureStackSpace(code->side_table->max_stack_height_ +
-                     code->locals.type_list.size());
+                     code->locals.num_locals);
     DCHECK_GE(StackHeight(), code->function->sig->parameter_count());
   }
 
@@ -1431,7 +1430,8 @@ class WasmInterpreterInternals {
   }
 
   pc_t InitLocals(InterpreterCode* code) {
-    for (ValueType p : code->locals.type_list) {
+    for (ValueType p :
+         base::VectorOf(code->locals.local_types, code->locals.num_locals)) {
       WasmValue val;
       switch (p.kind()) {
 #define CASE_TYPE(valuetype, ctype) \
@@ -3314,8 +3314,7 @@ class WasmInterpreterInternals {
     DCHECK(!frames_.empty());
     // There must be enough space on the stack to hold the arguments, locals,
     // and the value stack.
-    DCHECK_LE(code->function->sig->parameter_count() +
-                  code->locals.type_list.size() +
+    DCHECK_LE(code->function->sig->parameter_count() + code->locals.num_locals +
                   code->side_table->max_stack_height_,
               stack_limit_ - stack_.get() - frames_.back().sp);
     // Seal the surrounding {HandleScope} to ensure that all cases within the
@@ -3668,8 +3667,7 @@ class WasmInterpreterInternals {
             FOREACH_WASMVALUE_CTYPES(CASE_TYPE)
 #undef CASE_TYPE
             case kRef:
-            case kRefNull:
-            case kRtt: {
+            case kRefNull: {
               // TODO(7748): Type checks or DCHECKs for ref types?
               HandleScope handle_scope(isolate_);  // Avoid leaking handles.
               Handle<FixedArray> global_buffer;    // The buffer of the global.
@@ -3681,6 +3679,7 @@ class WasmInterpreterInternals {
               global_buffer->set(global_index, *ref);
               break;
             }
+            case kRtt:
             case kI8:
             case kI16:
             case kVoid:
@@ -4103,13 +4102,7 @@ class WasmInterpreterInternals {
                                   uint32_t sig_index) {
     HandleScope handle_scope(isolate_);  // Avoid leaking handles.
     uint32_t expected_sig_id;
-    if (v8_flags.wasm_type_canonicalization) {
-      expected_sig_id = module()->isorecursive_canonical_type_ids[sig_index];
-    } else {
-      expected_sig_id = module()->per_module_canonical_type_ids[sig_index];
-      DCHECK_EQ(static_cast<int>(expected_sig_id),
-                module()->signature_map.Find(*module()->signature(sig_index)));
-    }
+    expected_sig_id = module()->isorecursive_canonical_type_ids[sig_index];
 
     Handle<WasmIndirectFunctionTable> table =
         instance_object_->GetIndirectFunctionTable(isolate_, table_index);
@@ -4246,11 +4239,10 @@ ControlTransferMap WasmInterpreter::ComputeControlTransfersForTesting(
                         0,       // func_index
                         0,       // sig_index
                         {0, 0},  // code
-                        0,       // feedback slots
                         false,   // imported
                         false,   // exported
                         false};  // declared
-  InterpreterCode code{&function, BodyLocalDecls(zone), start, end, nullptr};
+  InterpreterCode code{&function, BodyLocalDecls{}, start, end, nullptr};
 
   // Now compute and return the control transfers.
   SideTable side_table(zone, module, &code);
diff --git a/deps/v8/test/common/wasm/wasm-macro-gen.h b/deps/v8/test/common/wasm/wasm-macro-gen.h
index f2ed1fd4f9030b..d7f825d11e5760 100644
--- a/deps/v8/test/common/wasm/wasm-macro-gen.h
+++ b/deps/v8/test/common/wasm/wasm-macro-gen.h
@@ -521,6 +521,8 @@ inline uint16_t ExtractPrefixedOpcodeBytes(WasmOpcode opcode) {
 #define WASM_REF_IS_NULL(val) val, kExprRefIsNull
 #define WASM_REF_AS_NON_NULL(val) val, kExprRefAsNonNull
 #define WASM_REF_EQ(lhs, rhs) lhs, rhs, kExprRefEq
+#define WASM_REF_TEST_DEPRECATED(ref, typeidx) \
+  ref, WASM_GC_OP(kExprRefTestDeprecated), static_cast<byte>(typeidx)
 #define WASM_REF_TEST(ref, typeidx) \
   ref, WASM_GC_OP(kExprRefTest), static_cast<byte>(typeidx)
 #define WASM_REF_CAST(ref, typeidx) \
diff --git a/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-2.js b/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-2.js
deleted file mode 100644
index 5edd03ca582eeb..00000000000000
--- a/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-2.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-// Test that debug-evaluate correctly collects free outer variables
-// and does not get confused by variables in nested scopes.
-
-Debug = debug.Debug
-
-var exception = null;
-function listener(event, exec_state, event_data, data) {
-  if (event != Debug.DebugEvent.Break) return;
-  try {
-    assertThrows(() => exec_state.frame(0).evaluate("x").value());
-  } catch (e) {
-    exception = e;
-    print(e + e.stack);
-  }
-}
-
-Debug.setListener(listener);
-
-(function() {
-  var x = 1;     // context allocate x
-  (() => x);
-  (function() {
-    var x = 2;   // stack allocate shadowing x
-    (function() {
-      {          // context allocate x in a nested scope
-        let x = 3;
-        (() => x);
-      }
-      debugger;
-    })();
-  })();
-})();
-
-Debug.setListener(null);
-assertNull(exception);
diff --git a/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-3.js b/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-3.js
deleted file mode 100644
index 2a41109565cae7..00000000000000
--- a/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-3.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2019 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Test that debug-evaluate properly shadows stack-allocated variables.
-
-Debug = debug.Debug
-
-let exception = null;
-function listener(event, exec_state, event_data, data) {
-  if (event != Debug.DebugEvent.Break) return;
-  try {
-    assertEquals(2, exec_state.frame(0).evaluate("b").value());
-    assertEquals(3, exec_state.frame(0).evaluate("c").value())
-    assertThrows(() => exec_state.frame(0).evaluate("a").value());
-  } catch (e) {
-    exception = e;
-    print(e + e.stack);
-  }
-}
-
-Debug.setListener(listener);
-
-(function f() {
-  let a = 1;
-  let b = 2;
-  let c = 3;
-  () => a + c;  // a and c are context-allocated
-  return function g() {
-    let a = 2;  // a is stack-allocated
-    return function h() {
-      b;  // b is allocated onto f's context.
-      debugger;
-    }
-  }
-})()()();
-
-Debug.setListener(null);
-assertNull(exception);
diff --git a/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-4.js b/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-4.js
deleted file mode 100644
index 52f0ac5c456ef5..00000000000000
--- a/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-4.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2022 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Test that debug-evaluate properly shadows stack-allocated variables.
-
-Debug = debug.Debug
-
-let exception = null;
-function listener(event, exec_state, event_data, data) {
-  if (event != Debug.DebugEvent.Break) return;
-  try {
-    assertThrows(() => exec_state.frame(0).evaluate("a").value());
-  } catch (e) {
-    exception = e;
-    print(e + e.stack);
-  }
-}
-
-Debug.setListener(listener);
-
-(function f() {
-  let a = 1;
-  () => a;  // a is context-allocated
-  return function g() {
-    let a = 2;  // a is stack-allocated
-    {
-      let b = 3;
-      return function h() {
-        debugger;
-      }
-    }
-  }
-})()()();
-
-Debug.setListener(null);
-assertNull(exception);
diff --git a/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-reuse.js b/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-reuse.js
new file mode 100644
index 00000000000000..afd74a520e0070
--- /dev/null
+++ b/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context-reuse.js
@@ -0,0 +1,248 @@
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --no-analyze-environment-liveness --experimental-reuse-locals-blocklists
+
+// Test that debug-evaluate only resolves variables that are used by
+// the function inside which we debug-evaluate. This is to avoid
+// incorrect variable resolution when a context-allocated variable is
+// shadowed by a stack-allocated variable.
+//
+// This test is an exact copy of `debug-evaluate-shadowed-context` modulo an
+// experimental flag. While the feature is in developement, we want to test both
+// configurations without having to introduce a separate bot.
+
+Debug = debug.Debug
+
+let test_name;
+let listener_delegate;
+let listener_called;
+let exception;
+let begin_test_count = 0;
+let end_test_count = 0;
+let break_count = 0;
+
+// Debug event listener which delegates.
+function listener(event, exec_state, event_data, data) {
+  try {
+    if (event == Debug.DebugEvent.Break) {
+      break_count++;
+      listener_called = true;
+      listener_delegate(exec_state);
+    }
+  } catch (e) {
+    exception = e;
+    print(e, e.stack);
+  }
+}
+Debug.setListener(listener);
+
+function BeginTest(name) {
+  test_name = name;
+  listener_called = false;
+  exception = null;
+  begin_test_count++;
+}
+
+function EndTest() {
+  assertTrue(listener_called, "listener not called for " + test_name);
+  assertNull(exception, test_name + " / " + exception);
+  end_test_count++;
+}
+
+BeginTest("Check that 'x' resolves correctly and 'a' is written correctly");
+var a = "a";
+function f1() {
+  var x = 1;     // context allocate x
+  (() => x);
+  var y = "y";
+  var z = "z";
+  (function () {
+    var x = 2;   // stack allocate shadowing x
+    (function () {
+      y;         // access y
+      debugger;  // ReferenceError
+    })();        // 2
+  })();          // 1
+  return y;
+}
+
+listener_delegate = function(exec_state) {
+  for (var i = 0; i < exec_state.frameCount() - 1; i++) {
+    var frame = exec_state.frame(i);
+    var value;
+    try {
+      value = frame.evaluate("x").value();
+    } catch (e) {
+      value = e.name;
+    }
+    print(frame.sourceLineText());
+    var expected = frame.sourceLineText().match(/\/\/ (.*$)/)[1];
+    assertEquals(String(expected), String(value));
+  }
+  assertEquals("[object global]",
+                String(exec_state.frame(0).evaluate("this").value()));
+  assertEquals("y", exec_state.frame(0).evaluate("y").value());
+  assertEquals("a", exec_state.frame(0).evaluate("a").value());
+  exec_state.frame(0).evaluate("a = 'A'");
+  assertThrows(() => exec_state.frame(0).evaluate("z"), ReferenceError);
+}
+f1();
+assertEquals("A", a);
+a = "a";
+EndTest();
+
+BeginTest("Check that a context-allocated 'this' works")
+function f2() {
+  var x = 1;     // context allocate x
+  (() => x);
+  var y = "y";
+  var z = "z";
+  (function() {
+    var x = 2;   // stack allocate shadowing x
+    (() => {
+      y;
+      a;
+      this;      // context allocate receiver
+      debugger;  // ReferenceError
+    })();        // 2
+  })();          // 1
+  return y;
+};
+
+// Uses the same listener delgate as for `f1`.
+f2();
+assertEquals("A", a);
+EndTest();
+
+BeginTest("Check that we don't get confused with nested scopes");
+function f3() {
+  var x = 1;     // context allocate x
+  (() => x);
+  (function() {
+    var x = 2;   // stack allocate shadowing x
+    (function() {
+      {          // context allocate x in a nested scope
+        let x = 3;
+        (() => x);
+      }
+      debugger;
+    })();
+  })();
+}
+
+listener_delegate = function(exec_state) {
+  assertThrows(() => exec_state.frame(0).evaluate("x").value());
+}
+f3();
+EndTest();
+
+BeginTest("Check that stack-allocated variable is unavailable");
+function f4() {
+  let a = 1;
+  let b = 2;
+  let c = 3;
+  () => a + c;  // a and c are context-allocated
+  return function g() {
+    let a = 2;  // a is stack-allocated
+    return function h() {
+      b;  // b is allocated onto f's context.
+      debugger;
+    }
+  }
+}
+
+listener_delegate = function(exec_state) {
+  assertEquals(2, exec_state.frame(0).evaluate("b").value());
+  assertEquals(3, exec_state.frame(0).evaluate("c").value())
+  assertThrows(() => exec_state.frame(0).evaluate("a").value());
+};
+(f4())()();
+EndTest();
+
+BeginTest("Check that block lists on the closure boundary work as expected");
+function f5() {
+  let a = 1;
+  () => a;  // a is context-allocated
+  return function g() {
+    let a = 2;  // a is stack-allocated
+    {
+      let b = 3;
+      return function h() {
+        debugger;
+      }
+    }
+  }
+}
+
+listener_delegate = function(exec_state) {
+  assertThrows(() => exec_state.frame(0).evaluate("a").value());
+};
+(f5())()();
+EndTest();
+
+BeginTest("Check that outer functions also get the correct block list calculated");
+// This test is important once we re-use block list info. The block list for `g`
+// needs to be correctly calculated already when we stop on break_position 1.
+
+let break_position;
+function f6() {
+  let a = 1;                             // stack-allocated
+  return function g() {                  // g itself doesn't require a context.
+    if (break_position === 2) debugger;
+    let a = 2; (() => a);                // context-allocated
+    return function h() {
+      if (break_position === 1) debugger;
+    }
+  }
+}
+
+listener_delegate = function (exec_state) {
+  assertEquals(2, exec_state.frame(0).evaluate("a").value());
+}
+break_position = 1;
+(f6())()();
+EndTest();
+
+BeginTest("Check that outer functions also get the correct block list calculated (continued)");
+listener_delegate = function (exec_state) {
+  assertThrows(() => exec_state.frame(0).evaluate("a").value());
+}
+break_position = 2;
+(f6())()();
+EndTest();
+
+BeginTest("Check that 'inner' block lists, calculated on a previous pause, don't block the lookup");
+
+function f7(o) {
+  let a = 1;  // stack-allocated.
+  with (o) {  // create a with-scope whos block-list has 'a' in it.
+    if (break_position === 2) debugger;
+    (function g() {
+      if (break_position === 1) debugger; // Trigger block-list calculation for the with-scope.
+    })();
+  }
+}
+
+listener_delegate = function (exec_state) {
+  assertThrows(() => exec_state.frame(0).evaluate("a").value());
+}
+break_position = 1;
+f7({});
+EndTest();
+
+BeginTest("Check that 'inner' block lists, calculated on a previous pause, don't block the lookup (continued)");
+// The second time we pause the with-scope already has a block-list, but 'a' should be accessible as a
+// materialized stack-local.
+listener_delegate = function (exec_state) {
+  assertEquals(1, exec_state.frame(0).evaluate("a").value());
+}
+break_position = 2;
+f7({});
+EndTest();
+
+assertEquals(begin_test_count, break_count,
+  'one or more tests did not enter the debugger');
+assertEquals(begin_test_count, end_test_count,
+  'one or more tests did not have its result checked');
diff --git a/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context.js b/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context.js
index 564bdc6fc34a0a..b91174b0688eb5 100644
--- a/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context.js
+++ b/deps/v8/test/debugger/debug/debug-evaluate-shadowed-context.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Flags: --no-analyze-environment-liveness
+// Flags: --no-analyze-environment-liveness --no-experimental-reuse-locals-blocklists
 
 // Test that debug-evaluate only resolves variables that are used by
 // the function inside which we debug-evaluate. This is to avoid
@@ -11,56 +11,86 @@
 
 Debug = debug.Debug
 
-var exception = null;
+let test_name;
+let listener_delegate;
+let listener_called;
+let exception;
+let begin_test_count = 0;
+let end_test_count = 0;
+let break_count = 0;
+
+// Debug event listener which delegates.
 function listener(event, exec_state, event_data, data) {
-  if (event != Debug.DebugEvent.Break) return;
   try {
-    for (var i = 0; i < exec_state.frameCount() - 1; i++) {
-      var frame = exec_state.frame(i);
-      var value;
-      try {
-        value = frame.evaluate("x").value();
-      } catch (e) {
-        value = e.name;
-      }
-      print(frame.sourceLineText());
-      var expected = frame.sourceLineText().match(/\/\/ (.*$)/)[1];
-      assertEquals(String(expected), String(value));
+    if (event == Debug.DebugEvent.Break) {
+      break_count++;
+      listener_called = true;
+      listener_delegate(exec_state);
     }
-    assertEquals("[object global]",
-                 String(exec_state.frame(0).evaluate("this").value()));
-    assertEquals("y", exec_state.frame(0).evaluate("y").value());
-    assertEquals("a", exec_state.frame(0).evaluate("a").value());
-    exec_state.frame(0).evaluate("a = 'A'");
-    assertThrows(() => exec_state.frame(0).evaluate("z"), ReferenceError);
   } catch (e) {
     exception = e;
-    print(e + e.stack);
+    print(e, e.stack);
   }
 }
-
 Debug.setListener(listener);
 
+function BeginTest(name) {
+  test_name = name;
+  listener_called = false;
+  exception = null;
+  begin_test_count++;
+}
+
+function EndTest() {
+  assertTrue(listener_called, "listener not called for " + test_name);
+  assertNull(exception, test_name + " / " + exception);
+  end_test_count++;
+}
+
+BeginTest("Check that 'x' resolves correctly and 'a' is written correctly");
 var a = "a";
-(function() {
+function f1() {
   var x = 1;     // context allocate x
   (() => x);
   var y = "y";
   var z = "z";
-  (function() {
+  (function () {
     var x = 2;   // stack allocate shadowing x
-    (function() {
+    (function () {
       y;         // access y
       debugger;  // ReferenceError
     })();        // 2
   })();          // 1
   return y;
-})();
+}
 
+listener_delegate = function(exec_state) {
+  for (var i = 0; i < exec_state.frameCount() - 1; i++) {
+    var frame = exec_state.frame(i);
+    var value;
+    try {
+      value = frame.evaluate("x").value();
+    } catch (e) {
+      value = e.name;
+    }
+    print(frame.sourceLineText());
+    var expected = frame.sourceLineText().match(/\/\/ (.*$)/)[1];
+    assertEquals(String(expected), String(value));
+  }
+  assertEquals("[object global]",
+                String(exec_state.frame(0).evaluate("this").value()));
+  assertEquals("y", exec_state.frame(0).evaluate("y").value());
+  assertEquals("a", exec_state.frame(0).evaluate("a").value());
+  exec_state.frame(0).evaluate("a = 'A'");
+  assertThrows(() => exec_state.frame(0).evaluate("z"), ReferenceError);
+}
+f1();
 assertEquals("A", a);
 a = "a";
+EndTest();
 
-(function() {
+BeginTest("Check that a context-allocated 'this' works")
+function f2() {
   var x = 1;     // context allocate x
   (() => x);
   var y = "y";
@@ -75,9 +105,111 @@ a = "a";
     })();        // 2
   })();          // 1
   return y;
-})();
+};
 
+// Uses the same listener delgate as for `f1`.
+f2();
 assertEquals("A", a);
+EndTest();
+
+BeginTest("Check that we don't get confused with nested scopes");
+function f3() {
+  var x = 1;     // context allocate x
+  (() => x);
+  (function() {
+    var x = 2;   // stack allocate shadowing x
+    (function() {
+      {          // context allocate x in a nested scope
+        let x = 3;
+        (() => x);
+      }
+      debugger;
+    })();
+  })();
+}
+
+listener_delegate = function(exec_state) {
+  assertThrows(() => exec_state.frame(0).evaluate("x").value());
+}
+f3();
+EndTest();
+
+BeginTest("Check that stack-allocated variable is unavailable");
+function f4() {
+  let a = 1;
+  let b = 2;
+  let c = 3;
+  () => a + c;  // a and c are context-allocated
+  return function g() {
+    let a = 2;  // a is stack-allocated
+    return function h() {
+      b;  // b is allocated onto f's context.
+      debugger;
+    }
+  }
+}
+
+listener_delegate = function(exec_state) {
+  assertEquals(2, exec_state.frame(0).evaluate("b").value());
+  assertEquals(3, exec_state.frame(0).evaluate("c").value())
+  assertThrows(() => exec_state.frame(0).evaluate("a").value());
+};
+(f4())()();
+EndTest();
+
+BeginTest("Check that block lists on the closure boundary work as expected");
+function f5() {
+  let a = 1;
+  () => a;  // a is context-allocated
+  return function g() {
+    let a = 2;  // a is stack-allocated
+    {
+      let b = 3;
+      return function h() {
+        debugger;
+      }
+    }
+  }
+}
+
+listener_delegate = function(exec_state) {
+  assertThrows(() => exec_state.frame(0).evaluate("a").value());
+};
+(f5())()();
+EndTest();
+
+BeginTest("Check that outer functions also get the correct block list calculated");
+// This test is important once we re-use block list info. The block list for `g`
+// needs to be correctly calculated already when we stop on break_position 1.
+
+let break_position;
+function f6() {
+  let a = 1;                             // stack-allocated
+  return function g() {                  // g itself doesn't require a context.
+    if (break_position === 2) debugger;
+    let a = 2; (() => a);                // context-allocated
+    return function h() {
+      if (break_position === 1) debugger;
+    }
+  }
+}
+
+listener_delegate = function (exec_state) {
+  assertEquals(2, exec_state.frame(0).evaluate("a").value());
+}
+break_position = 1;
+(f6())()();
+EndTest();
+
+BeginTest("Check that outer functions also get the correct block list calculated (continued)");
+listener_delegate = function (exec_state) {
+  assertThrows(() => exec_state.frame(0).evaluate("a").value());
+}
+break_position = 2;
+(f6())()();
+EndTest();
 
-Debug.setListener(null);
-assertNull(exception);
+assertEquals(begin_test_count, break_count,
+  'one or more tests did not enter the debugger');
+assertEquals(begin_test_count, end_test_count,
+  'one or more tests did not have its result checked');
diff --git a/deps/v8/test/debugger/debug/es6/debug-step-destructuring-assignment.js b/deps/v8/test/debugger/debug/es6/debug-step-destructuring-assignment.js
deleted file mode 100644
index e6412abbf7303c..00000000000000
--- a/deps/v8/test/debugger/debug/es6/debug-step-destructuring-assignment.js
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2015 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-var exception = null;
-var Debug = debug.Debug;
-var break_count = 0;
-
-function listener(event, exec_state, event_data, data) {
-  if (event != Debug.DebugEvent.Break) return;
-  try {
-    var source = exec_state.frame(0).sourceLineText();
-    print(source);
-    assertTrue(source.indexOf(`// B${break_count++}`) > 0);
-    if (source.indexOf("assertEquals") > 0) {
-      exec_state.prepareStep(Debug.StepAction.StepOver);
-    } else {
-      exec_state.prepareStep(Debug.StepAction.StepInto);
-    }
-  } catch (e) {
-    exception = e;
-    print(e);
-  }
-};
-
-Debug.setListener(listener);
-
-function f() {
-  var a, b, c, d;
-  debugger;                                       // B0
-  [                                               // B1
-    a,                                            // B2
-    b,                                            // B3
-    c = 3                                         // B4
-  ] = [1, 2];
-  assertEquals({a:1,b:2,c:3}, {a, b, c});         // B5
-
-  [                                               // B6
-    a,                                            // B7
-    [
-      b,                                          // B8
-      c                                           // B9
-    ],
-    d                                             // B10
-  ] = [5, [6, 7], 8];
-  assertEquals({a:5,b:6,c:7,d:8}, {a, b, c, d});  // B11
-
-  [                                               // B12
-    a,                                            // B13
-    b,                                            // B14
-    ...c                                          // B15
-  ] = [1, 2, 3, 4];
-  assertEquals({a:1,b:2,c:[3,4]}, {a, b, c});     // B16
-
-  ({                                              // B17
-    a,                                            // B18
-    b,                                            // B19
-    c = 7                                         // B20
-  } = {a: 5, b: 6});
-  assertEquals({a:5,b:6,c:7}, {a, b, c});         // B21
-
-  ({                                              // B22
-    a,                                            // B23
-    b = return1(),                                // B24
-    c = return1()                                 // B25
-  } = {a: 5, b: 6});
-  assertEquals({a:5,b:6,c:1}, {a, b, c});         // B28
-
-  ({                                              // B29
-    x : a,                                        // B30
-    y : b,                                        // B31
-    z : c = 3                                     // B32
-  } = {x: 1, y: 2});
-  assertEquals({a:1,b:2,c:3}, {a, b, c});         // B33
-}                                                 // B34
-
-function return1() {
-  return 1                                        // B26
-  ;                                               // B27
-}
-
-f();
-Debug.setListener(null);                          // B35
-assertNull(exception);
diff --git a/deps/v8/test/debugger/debug/es6/debug-step-destructuring-bind.js b/deps/v8/test/debugger/debug/es6/debug-step-destructuring-bind.js
deleted file mode 100644
index a610eef60426ab..00000000000000
--- a/deps/v8/test/debugger/debug/es6/debug-step-destructuring-bind.js
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2015 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-var exception = null;
-var Debug = debug.Debug;
-var break_count = 0;
-
-function listener(event, exec_state, event_data, data) {
-  if (event != Debug.DebugEvent.Break) return;
-  try {
-    var source = exec_state.frame(0).sourceLineText();
-    print(source, break_count);
-    assertTrue(source.indexOf(`B${break_count++}`) > 0);
-    if (source.indexOf("assertEquals") > 0) {
-      exec_state.prepareStep(Debug.StepAction.StepOver);
-    } else {
-      exec_state.prepareStep(Debug.StepAction.StepInto);
-    }
-  } catch (e) {
-    exception = e;
-    print(e);
-  }                                               // B34
-};
-
-Debug.setListener(listener);
-
-var id = x => x;                                  // B9 B10 B36 B37
-
-function test() {
-  debugger;                                       // B0
-  function fx1([
-                a,                                // B2
-                b                                 // B3
-              ]) {
-    assertEquals([1, 2], [a, b]);                 // B4
-  }                                               // B5
-  fx1([1, 2, 3]);                                 // B1
-
-  function f2([
-                a,                                // B7
-                b = id(3)                         // B8
-             ]) {
-    assertEquals([4, 3], [a, b]);                 // B11
-  }                                               // B12
-  f2([4]);                                        // B6
-
-  function f3({
-                x: a,                             // B14
-                y: b                              // B15
-             }) {
-    assertEquals([5, 6], [a, b]);                 // B16
-  }                                               // B17
-  f3({y: 6, x: 5});                               // B13
-
-  function f4([
-                a,                                // B19
-                {
-                  b,                              // B20
-                  c,                              // B21
-                }
-              ]) {                                // B19
-    assertEquals([2, 4, 6], [a, b, c]);           // B22
-  }                                               // B23
-  f4([2, {c: 6, b: 4}]);                          // B18
-
-  function f5([
-                {
-                  a,                              // B25
-                  b = 7                           // B26
-                },
-                c = 3                             // B27
-              ] = [{a:1}]) {
-    assertEquals([1, 7, 3], [a, b, c]);           // B28
-  }                                               // B29
-  f5();                                           // B24
-
-  var name = "x";                                 // B30
-  function f6({
-                [id(name)]: a,                    // B34 B35
-                b = a                             // B38
-              }) {
-    assertEquals([9, 9], [a, b]);                 // B39
-  }                                               // B40
-  var o6 = {};                                    // B31
-  o6[name] = 9;                                   // B32
-  f6(o6);                                         // B33
-
-  try {
-    throw [3, 4];                                 // B41
-  } catch ([
-             a,                                   // B42
-             b,                                   // B43
-             c = 6                                // B44
-           ]) {
-    assertEquals([3, 4, 6], [a, b, c]);           // B45
-  }
-
-  var {
-    x: a,                                         // B47
-    y: b = 9                                      // B48
-  } = { x: 4 };                                   // B46
-  assertEquals([4, 9], [a, b]);                   // B49
-}                                                 // B50
-
-test();
-Debug.setListener(null);                          // B51
-assertNull(exception);
diff --git a/deps/v8/test/debugger/debug/es6/debug-stepnext-for.js b/deps/v8/test/debugger/debug/es6/debug-stepnext-for.js
index c3c68423cd5084..b6c93fc974af01 100644
--- a/deps/v8/test/debugger/debug/es6/debug-stepnext-for.js
+++ b/deps/v8/test/debugger/debug/es6/debug-stepnext-for.js
@@ -98,35 +98,109 @@ print("log:\n"+ JSON.stringify(log));
 // based on other values.
 var expected = [
   // Entry
-  "a2",
+  'a2',
   // Empty for-in-var: get enumerable
-  "c16",
+  'c16',
   // Empty for-in: get enumerable
-  "d12",
+  'd12',
   // For-in-var: get enumerable, assign, body, assign, body, ...
-  "e16","e11","E4","e11","E4","e11","E4","e11",
+  'e16',
+  'e11',
+  'E4',
+  'e11',
+  'E4',
+  'e11',
+  'E4',
+  'e11',
   // For-in: get enumerable, assign, body, assign, body, ...
-  "f12","f7","F4","f7","F4","f7","F4","f7",
+  'f12',
+  'f7',
+  'F4',
+  'f7',
+  'F4',
+  'f7',
+  'F4',
+  'f7',
   // For-in-let: get enumerable, next, body, next,  ...
-  "g16","g11","G4","g11","G4","g11","G4","g11",
+  'g16',
+  'g11',
+  'G4',
+  'g11',
+  'G4',
+  'g11',
+  'G4',
+  'g11',
   // For-of-var: [Symbol.iterator](), next(), body, next(), body, ...
-  "h16","h11","H4","h11","H4","h11","H4","h11",
+  'h16',
+  'h11',
+  'H4',
+  'h11',
+  'H4',
+  'h11',
+  'H4',
+  'h11',
   // For-of: [Symbol.iterator](), next(), body, next(), body, ...
-  "i12","i7","I4","i7","I4","i7","I4","i7",
+  'i12',
+  'i7',
+  'I4',
+  'i7',
+  'I4',
+  'i7',
+  'I4',
+  'i7',
   // For-of-let: [Symbol.iterator](), next(), body, next(), ...
-  "j18","j11","J4","j11","J4","j11","J4","j11",
+  'j18',
+  'j11',
+  'J4',
+  'j11',
+  'J4',
+  'j11',
+  'J4',
+  'j11',
   // For-var: init, condition, body, next, condition, body, ...
-  "k15","k20","K4","k26","k20","K4","k26","k20","K4","k26","k20",
+  'k15',
+  'k20',
+  'K4',
+  'k26',
+  'k20',
+  'K4',
+  'k26',
+  'k20',
+  'K4',
+  'k26',
+  'k20',
   // For: init, condition, body, next, condition, body, ...
-  "l7","l16","L4","l22","l16","L4","l22","l16","L4","l22","l16",
+  'l7',
+  'l16',
+  'L4',
+  'l22',
+  'l16',
+  'L4',
+  'l22',
+  'l16',
+  'L4',
+  'l22',
+  'l16',
   // For-let: init, condition, body, next, condition, body, ...
-  "m15","m20","M4","m26","m20","M4","m26","m20","M4","m26","m20",
+  'm15',
+  'm20',
+  'M4',
+  'm26',
+  'm20',
+  'M4',
+  'm26',
+  'm20',
+  'M4',
+  'm26',
+  'm20',
   // For-of, empty: [Symbol.iterator](), next() once
-  "n16", "n11",
-  // Spread: expression statement, spread
-  "o2", "o9",
+  'n16',
+  'n11',
+  // Spread: expression statement
+  'o2',
   // Exit.
-  "y0","z0",
+  'y0',
+  'z0',
 ]
 print("expected:\n"+ JSON.stringify(expected));
 
diff --git a/deps/v8/test/debugger/debug/side-effect/debug-evaluate-no-side-effect-builtins.js b/deps/v8/test/debugger/debug/side-effect/debug-evaluate-no-side-effect-builtins.js
index e9c996aff68410..138b3e7b9268c2 100644
--- a/deps/v8/test/debugger/debug/side-effect/debug-evaluate-no-side-effect-builtins.js
+++ b/deps/v8/test/debugger/debug/side-effect/debug-evaluate-no-side-effect-builtins.js
@@ -77,7 +77,8 @@ function listener(event, exec_state, event_data, data) {
     fail(`Array.of(1, 2, 3)`);
     var function_param = [
       "flatMap", "forEach", "every", "some", "reduce", "reduceRight", "find",
-      "filter", "map", "findIndex", "findLast", "findLastIndex"
+      "filter", "map", "findIndex", "findLast", "findLastIndex", "group",
+      "groupToMap"
     ];
     var fails = ["pop", "push", "reverse", "shift", "unshift", "splice",
       "sort", "copyWithin", "fill"];
diff --git a/deps/v8/test/fuzzer/fuzzer-support.cc b/deps/v8/test/fuzzer/fuzzer-support.cc
index 7f80d83c937d2d..2116039a381cd3 100644
--- a/deps/v8/test/fuzzer/fuzzer-support.cc
+++ b/deps/v8/test/fuzzer/fuzzer-support.cc
@@ -17,12 +17,25 @@
 namespace v8_fuzzer {
 
 FuzzerSupport::FuzzerSupport(int* argc, char*** argv) {
+  // Disable hard abort, which generates a trap instead of a proper abortion.
+  // Traps by default do not cause libfuzzer to generate a crash file.
+  i::FLAG_hard_abort = false;
+
   i::FLAG_expose_gc = true;
 
   // Allow changing flags in fuzzers.
   // TODO(12887): Refactor fuzzers to not change flags after initialization.
   i::FLAG_freeze_flags_after_init = false;
 
+#if V8_ENABLE_WEBASSEMBLY
+  if (V8_TRAP_HANDLER_SUPPORTED) {
+    constexpr bool kUseDefaultTrapHandler = true;
+    if (!v8::V8::EnableWebAssemblyTrapHandler(kUseDefaultTrapHandler)) {
+      FATAL("Could not register trap handler");
+    }
+  }
+#endif  // V8_ENABLE_WEBASSEMBLY
+
   v8::V8::SetFlagsFromCommandLine(argc, *argv, true);
   v8::V8::InitializeICUDefaultLocation((*argv)[0]);
   v8::V8::InitializeExternalStartupData((*argv)[0]);
@@ -69,14 +82,6 @@ std::unique_ptr<FuzzerSupport> FuzzerSupport::fuzzer_support_;
 
 // static
 void FuzzerSupport::InitializeFuzzerSupport(int* argc, char*** argv) {
-#if V8_ENABLE_WEBASSEMBLY
-  if (V8_TRAP_HANDLER_SUPPORTED) {
-    constexpr bool kUseDefaultTrapHandler = true;
-    if (!v8::V8::EnableWebAssemblyTrapHandler(kUseDefaultTrapHandler)) {
-      FATAL("Could not register trap handler");
-    }
-  }
-#endif  // V8_ENABLE_WEBASSEMBLY
   DCHECK_NULL(FuzzerSupport::fuzzer_support_);
   FuzzerSupport::fuzzer_support_ =
       std::make_unique<v8_fuzzer::FuzzerSupport>(argc, argv);
diff --git a/deps/v8/test/fuzzer/wasm-compile.cc b/deps/v8/test/fuzzer/wasm-compile.cc
index a10e16235d48dd..0a8adf24cfa963 100644
--- a/deps/v8/test/fuzzer/wasm-compile.cc
+++ b/deps/v8/test/fuzzer/wasm-compile.cc
@@ -842,7 +842,7 @@ class WasmGenerator {
     Var local = GetRandomLocal(data);
     // TODO(manoskouk): Ideally we would check for subtyping here over type
     // equality, but we don't have a module.
-    // TODO(7748): Remove this condition if non-nullable locals are allowed.
+    // TODO(7748): Allow initialized non-nullable locals.
     if (nullable == kNullable && local.is_valid() &&
         local.type.is_object_reference() && type == local.type.heap_type()) {
       builder_->EmitWithU32V(kExprLocalGet, local.index);
@@ -2522,8 +2522,8 @@ class WasmCompileFuzzer : public WasmExecutionFuzzer {
       // performed by adding a function by {FunctionSig}, because we emit
       // everything in one recursive group which blocks signature
       // canonicalization.
-      // TODO(7748): Relax this when we implement type canonicalization and
-      // proper recursive-group support.
+      // TODO(7748): Relax this when we implement proper recursive-group
+      // support.
       functions.push_back(liftoff_as_reference
                               ? builder.AddFunction(function_signatures[i])
                               : builder.AddFunction(sig));
diff --git a/deps/v8/test/fuzzer/wasm-fuzzer-common.cc b/deps/v8/test/fuzzer/wasm-fuzzer-common.cc
index c9756947c89891..7193ffc3ef595f 100644
--- a/deps/v8/test/fuzzer/wasm-fuzzer-common.cc
+++ b/deps/v8/test/fuzzer/wasm-fuzzer-common.cc
@@ -81,10 +81,9 @@ Handle<WasmModuleObject> CompileReferenceModule(Zone* zone, Isolate* isolate,
   constexpr base::Vector<const char> kNoSourceUrl;
   Handle<Script> script =
       GetWasmEngine()->GetOrCreateScript(isolate, native_module, kNoSourceUrl);
-  Handle<FixedArray> export_wrappers = isolate->factory()->NewFixedArray(
-      static_cast<int>(module->functions.size()));
-  return WasmModuleObject::New(isolate, std::move(native_module), script,
-                               export_wrappers);
+  isolate->heap()->EnsureWasmCanonicalRttsSize(module->MaxCanonicalTypeIndex() +
+                                               1);
+  return WasmModuleObject::New(isolate, std::move(native_module), script);
 }
 
 void InterpretAndExecuteModule(i::Isolate* isolate,
@@ -682,15 +681,15 @@ void GenerateTestCase(Isolate* isolate, ModuleWireBytes wire_bytes,
        << " /* sig */)\n";
 
     // Add locals.
-    BodyLocalDecls decls(&tmp_zone);
+    BodyLocalDecls decls;
     DecodeLocalDecls(enabled_features, &decls, module, func_code.begin(),
-                     func_code.end());
-    if (!decls.type_list.empty()) {
+                     func_code.end(), &tmp_zone);
+    if (decls.num_locals) {
       os << "  ";
-      for (size_t pos = 0, count = 1, locals = decls.type_list.size();
-           pos < locals; pos += count, count = 1) {
-        ValueType type = decls.type_list[pos];
-        while (pos + count < locals && decls.type_list[pos + count] == type) {
+      for (size_t pos = 0, count = 1, locals = decls.num_locals; pos < locals;
+           pos += count, count = 1) {
+        ValueType type = decls.local_types[pos];
+        while (pos + count < locals && decls.local_types[pos + count] == type) {
           ++count;
         }
         os << ".addLocals(" << ValueTypeToConstantName(type) << ", " << count
diff --git a/deps/v8/test/inspector/debugger/array-destructuring-expected.txt b/deps/v8/test/inspector/debugger/array-destructuring-expected.txt
new file mode 100644
index 00000000000000..f33e2d5c9d86db
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/array-destructuring-expected.txt
@@ -0,0 +1,172 @@
+Tests breakable locations in array destructuring.
+
+Running test: testBreakLocations
+
+function testFunction() {
+  var [a, b, c = 4] = |C|generator1();
+  |_|[[a, b], c] = |C|generator2();
+  |_|[a, ...b] = |C|generator1();
+|R|}
+
+function generator1() {
+  |_|return {
+    [Symbol.iterator]() {
+      const it = |_|[1, 2].|C|values();
+      |_|return {next() { |_|return it.|C|next();|R| }};|R|
+    }
+  };|R|
+}
+
+function generator2() {
+  |_|return {
+    [Symbol.iterator]() {
+      const it = |_|[|C|generator1(), 3].|C|values();
+      |_|return {next() { |_|return it.|C|next();|R| }};|R|
+    }
+  };|R|
+}
+|R|
+
+
+Running test: testStepping
+Execution paused in testFunction:
+function testFunction() {
+  var [a, b, c = 4] = #generator1();
+  [[a, b], c] = generator2();
+
+Execution paused in generator1:
+function generator1() {
+  #return {
+    [Symbol.iterator]() {
+
+Called from testFunction:
+function testFunction() {
+  var [a, b, c = 4] = #generator1();
+  [[a, b], c] = generator2();
+
+Execution paused in [Symbol.iterator]:
+    [Symbol.iterator]() {
+      const it = #[1, 2].values();
+      return {next() { return it.next(); }};
+
+Called from testFunction:
+function testFunction() {
+  var [a, b, c = 4] = #generator1();
+  [[a, b], c] = generator2();
+
+Execution paused in next:
+      const it = [1, 2].values();
+      return {next() { #return it.next(); }};
+    }
+
+Called from testFunction:
+function testFunction() {
+  var [#a, b, c = 4] = generator1();
+  [[a, b], c] = generator2();
+
+Execution paused in testFunction:
+  var [a, b, c = 4] = generator1();
+  #[[a, b], c] = generator2();
+  [a, ...b] = generator1();
+
+Execution paused in generator2:
+function generator2() {
+  #return {
+    [Symbol.iterator]() {
+
+Called from testFunction:
+  var [a, b, c = 4] = generator1();
+  [[a, b], c] = #generator2();
+  [a, ...b] = generator1();
+
+Execution paused in [Symbol.iterator]:
+    [Symbol.iterator]() {
+      const it = #[generator1(), 3].values();
+      return {next() { return it.next(); }};
+
+Called from testFunction:
+  var [a, b, c = 4] = generator1();
+  [[a, b], c] #= generator2();
+  [a, ...b] = generator1();
+
+Execution paused in next:
+      const it = [generator1(), 3].values();
+      return {next() { #return it.next(); }};
+    }
+
+Called from testFunction:
+  var [a, b, c = 4] = generator1();
+  [#[a, b], c] = generator2();
+  [a, ...b] = generator1();
+
+Execution paused in [Symbol.iterator]:
+    [Symbol.iterator]() {
+      const it = #[1, 2].values();
+      return {next() { return it.next(); }};
+
+Called from testFunction:
+  var [a, b, c = 4] = generator1();
+  [#[a, b], c] = generator2();
+  [a, ...b] = generator1();
+
+Execution paused in next:
+      const it = [1, 2].values();
+      return {next() { #return it.next(); }};
+    }
+
+Called from testFunction:
+  var [a, b, c = 4] = generator1();
+  [[#a, b], c] = generator2();
+  [a, ...b] = generator1();
+
+Execution paused in next:
+      const it = [generator1(), 3].values();
+      return {next() { #return it.next(); }};
+    }
+
+Called from testFunction:
+  var [a, b, c = 4] = generator1();
+  [[a, b], #c] = generator2();
+  [a, ...b] = generator1();
+
+Execution paused in testFunction:
+  [[a, b], c] = generator2();
+  #[a, ...b] = generator1();
+}
+
+Execution paused in generator1:
+function generator1() {
+  #return {
+    [Symbol.iterator]() {
+
+Called from testFunction:
+  [[a, b], c] = generator2();
+  [a, ...b] = #generator1();
+}
+
+Execution paused in [Symbol.iterator]:
+    [Symbol.iterator]() {
+      const it = #[1, 2].values();
+      return {next() { return it.next(); }};
+
+Called from testFunction:
+  [[a, b], c] = generator2();
+  [a, ...b] #= generator1();
+}
+
+Execution paused in next:
+      const it = [1, 2].values();
+      return {next() { #return it.next(); }};
+    }
+
+Called from testFunction:
+  [[a, b], c] = generator2();
+  [#a, ...b] = generator1();
+}
+
+Execution paused in testFunction:
+  [a, ...b] = generator1();
+#}
+
+
+Resuming and finishing...
diff --git a/deps/v8/test/inspector/debugger/array-destructuring.js b/deps/v8/test/inspector/debugger/array-destructuring.js
new file mode 100644
index 00000000000000..6997c755b22c74
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/array-destructuring.js
@@ -0,0 +1,102 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {session, contextGroup, Protocol} =
+    InspectorTest.start('Tests breakable locations in array destructuring.');
+
+const source = `
+function testFunction() {
+  var [a, b, c = 4] = generator1();
+  [[a, b], c] = generator2();
+  [a, ...b] = generator1();
+}
+
+function generator1() {
+  return {
+    [Symbol.iterator]() {
+      const it = [1, 2].values();
+      return {next() { return it.next(); }};
+    }
+  };
+}
+
+function generator2() {
+  return {
+    [Symbol.iterator]() {
+      const it = [generator1(), 3].values();
+      return {next() { return it.next(); }};
+    }
+  };
+}
+`;
+
+const url = 'test.js';
+contextGroup.addScript(source, 0, 0, url);
+session.setupScriptMap();
+
+InspectorTest.runAsyncTestSuite([
+  async function testBreakLocations() {
+    let [, , {params: {scriptId}}] = await Promise.all([
+      Protocol.Runtime.enable(),
+      Protocol.Debugger.enable(),
+      Protocol.Debugger.onceScriptParsed(),
+    ]);
+    let {result: {locations}} = await Protocol.Debugger.getPossibleBreakpoints(
+        {start: {lineNumber: 0, columnNumber: 0, scriptId}});
+    await session.logBreakLocations(locations);
+    await Promise.all([
+      Protocol.Debugger.disable(),
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testStepping() {
+    let [, , {params: {scriptId}}] = await Promise.all([
+      Protocol.Runtime.enable(),
+      Protocol.Debugger.enable(),
+      Protocol.Debugger.onceScriptParsed(),
+    ]);
+    const {breakpointId} = await Protocol.Debugger.setBreakpoint({
+      location: {
+        scriptId,
+        lineNumber: 2,
+      }
+    });
+    const evalPromise =
+        Protocol.Runtime.evaluate({expression: 'testFunction()'});
+    for (;;) {
+      const {method, params} = await Promise.race([
+        evalPromise,
+        Protocol.Debugger.oncePaused(),
+      ]);
+      if (method !== 'Debugger.paused') {
+        break;
+      }
+      const callFrames = params.callFrames.filter(
+          callFrame => callFrame.location.scriptId === scriptId);
+      if (callFrames.length === 0) {
+        InspectorTest.log('Resuming and finishing...');
+        await Protocol.Debugger.resume();
+      } else {
+        const [{functionName, location}, ...callerFrames] = callFrames;
+        InspectorTest.log(`Execution paused in ${functionName}:`);
+        await session.logSourceLocation(location);
+        for (const {location, functionName} of callerFrames) {
+          InspectorTest.log(`Called from ${functionName}:`);
+          await session.logSourceLocation(location);
+        }
+        if (functionName === 'testFunction') {
+          await Protocol.Debugger.stepInto();
+        } else {
+          await Protocol.Debugger.stepOut();
+        }
+      }
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      Protocol.Runtime.disable(),
+    ]);
+  }
+]);
diff --git a/deps/v8/test/inspector/debugger/array-spread-expected.txt b/deps/v8/test/inspector/debugger/array-spread-expected.txt
new file mode 100644
index 00000000000000..948974885c9602
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/array-spread-expected.txt
@@ -0,0 +1,75 @@
+Tests breakable locations in array spread.
+
+Running test: testBreakLocations
+
+function testFunction() {
+  var a = |_|[...iterable];
+  var b = [...|_|a, ...iterable, ...a];
+|R|}
+
+const iterable = |_|{
+  [Symbol.iterator]() {
+    const it = |_|[1, 2].|C|values();
+    |_|return {next() { |_|return it.|C|next();|R| }};|R|
+  }
+};
+|R|
+
+
+Running test: testStepping
+Execution paused in testFunction:
+function testFunction() {
+  var a = #[...iterable];
+  var b = [...a, ...iterable, ...a];
+
+Execution paused in [Symbol.iterator]:
+  [Symbol.iterator]() {
+    const it = #[1, 2].values();
+    return {next() { return it.next(); }};
+
+Called from testFunction:
+function testFunction() {
+  var a = [...#iterable];
+  var b = [...a, ...iterable, ...a];
+
+Execution paused in next:
+    const it = [1, 2].values();
+    return {next() { #return it.next(); }};
+  }
+
+Called from testFunction:
+function testFunction() {
+  var a = [...#iterable];
+  var b = [...a, ...iterable, ...a];
+
+Execution paused in testFunction:
+  var a = [...iterable];
+  var b = [...#a, ...iterable, ...a];
+}
+
+Execution paused in [Symbol.iterator]:
+  [Symbol.iterator]() {
+    const it = #[1, 2].values();
+    return {next() { return it.next(); }};
+
+Called from testFunction:
+  var a = [...iterable];
+  var b = [...a, ...#iterable, ...a];
+}
+
+Execution paused in next:
+    const it = [1, 2].values();
+    return {next() { #return it.next(); }};
+  }
+
+Called from testFunction:
+  var a = [...iterable];
+  var b = [...a, ...#iterable, ...a];
+}
+
+Execution paused in testFunction:
+  var b = [...a, ...iterable, ...a];
+#}
+
+
+Resuming and finishing...
diff --git a/deps/v8/test/inspector/debugger/array-spread.js b/deps/v8/test/inspector/debugger/array-spread.js
new file mode 100644
index 00000000000000..ce4d5d35892635
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/array-spread.js
@@ -0,0 +1,90 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {session, contextGroup, Protocol} =
+    InspectorTest.start('Tests breakable locations in array spread.');
+
+const source = `
+function testFunction() {
+  var a = [...iterable];
+  var b = [...a, ...iterable, ...a];
+}
+
+const iterable = {
+  [Symbol.iterator]() {
+    const it = [1, 2].values();
+    return {next() { return it.next(); }};
+  }
+};
+`;
+
+const url = 'test.js';
+contextGroup.addScript(source, 0, 0, url);
+session.setupScriptMap();
+
+InspectorTest.runAsyncTestSuite([
+  async function testBreakLocations() {
+    let [, , {params: {scriptId}}] = await Promise.all([
+      Protocol.Runtime.enable(),
+      Protocol.Debugger.enable(),
+      Protocol.Debugger.onceScriptParsed(),
+    ]);
+    let {result: {locations}} = await Protocol.Debugger.getPossibleBreakpoints(
+        {start: {lineNumber: 0, columnNumber: 0, scriptId}});
+    await session.logBreakLocations(locations);
+    await Promise.all([
+      Protocol.Debugger.disable(),
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testStepping() {
+    let [, , {params: {scriptId}}] = await Promise.all([
+      Protocol.Runtime.enable(),
+      Protocol.Debugger.enable(),
+      Protocol.Debugger.onceScriptParsed(),
+    ]);
+    const {breakpointId} = await Protocol.Debugger.setBreakpoint({
+      location: {
+        scriptId,
+        lineNumber: 2,
+      }
+    });
+    const evalPromise =
+        Protocol.Runtime.evaluate({expression: 'testFunction()'});
+    for (;;) {
+      const {method, params} = await Promise.race([
+        evalPromise,
+        Protocol.Debugger.oncePaused(),
+      ]);
+      if (method !== 'Debugger.paused') {
+        break;
+      }
+      const callFrames = params.callFrames.filter(
+          callFrame => callFrame.location.scriptId === scriptId);
+      if (callFrames.length === 0) {
+        InspectorTest.log('Resuming and finishing...');
+        await Protocol.Debugger.resume();
+      } else {
+        const [{functionName, location}, ...callerFrames] = callFrames;
+        InspectorTest.log(`Execution paused in ${functionName}:`);
+        await session.logSourceLocation(location);
+        for (const {location, functionName} of callerFrames) {
+          InspectorTest.log(`Called from ${functionName}:`);
+          await session.logSourceLocation(location);
+        }
+        if (functionName === 'testFunction') {
+          await Protocol.Debugger.stepInto();
+        } else {
+          await Protocol.Debugger.stepOut();
+        }
+      }
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      Protocol.Runtime.disable(),
+    ]);
+  }
+]);
diff --git a/deps/v8/test/inspector/debugger/break-locations-await-expected.txt b/deps/v8/test/inspector/debugger/break-locations-await-expected.txt
index ac194fdd1062fb..4f9c1ad008450c 100644
--- a/deps/v8/test/inspector/debugger/break-locations-await-expected.txt
+++ b/deps/v8/test/inspector/debugger/break-locations-await-expected.txt
@@ -5,11 +5,11 @@ Running test: testBreakLocations
 function testFunction() {
   async function f1() {
     for (let x = |_|0; x |_|< 1; ++|_|x) |_|await x;
-    |_|return |_|await Promise.|C|resolve(2);|R|
+    |_|return await Promise.|C|resolve(2);|R|
   }
 
   async function f2() {
-    let r = |_|await |C|f1() + |_|await |C|f1();
+    let r = |_|await |C|f1() + await |C|f1();
     |_|await |C|f1();
     |_|await |C|f1().|C|then(x => x |_|* 2|R|);
     |_|await [1].|C|map(x => Promise.|C|resolve(x)|R|)[0];
diff --git a/deps/v8/test/inspector/debugger/break-locations-var-init-expected.txt b/deps/v8/test/inspector/debugger/break-locations-var-init-expected.txt
index 4af1b05d66160f..46089a2a56832b 100644
--- a/deps/v8/test/inspector/debugger/break-locations-var-init-expected.txt
+++ b/deps/v8/test/inspector/debugger/break-locations-var-init-expected.txt
@@ -15,7 +15,7 @@ function testFunction() {
   var y = |_|(a = 100);
   var z = |_|x + (a = 1) + (a = 2) + (a = 3) + |C|f();
   function f() {
-    for (let { |_|x, |_|y } = |_|{ x: 0, y: 1 }; y |_|> 0; --|_|y) { let z = |_|x + y; }
+    for (let { x, y } = |_|{ x: 0, y: 1 }; y |_|> 0; --|_|y) { let z = |_|x + y; }
   |R|}
   var b = obj1.|_|a;
   |_|(async function asyncF() {
@@ -89,20 +89,6 @@ testFunction (test.js:10:44)
     for (let { x, y } = #{ x: 0, y: 1 }; y > 0; --y) { let z = x + y; }
   }
 
-f (test.js:12:15)
-testFunction (test.js:10:44)
-(anonymous) (expr.js:0:0)
-  function f() {
-    for (let { #x, y } = { x: 0, y: 1 }; y > 0; --y) { let z = x + y; }
-  }
-
-f (test.js:12:18)
-testFunction (test.js:10:44)
-(anonymous) (expr.js:0:0)
-  function f() {
-    for (let { x, #y } = { x: 0, y: 1 }; y > 0; --y) { let z = x + y; }
-  }
-
 f (test.js:12:42)
 testFunction (test.js:10:44)
 (anonymous) (expr.js:0:0)
diff --git a/deps/v8/test/inspector/debugger/comma-expression-expected.txt b/deps/v8/test/inspector/debugger/comma-expression-expected.txt
new file mode 100644
index 00000000000000..eabf6f681dbdd9
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/comma-expression-expected.txt
@@ -0,0 +1,225 @@
+Tests breakable locations in comma expressions.
+
+Running test: testBreakLocations
+
+function testFunction() {
+  |C|foo(), |C|foo(), |C|foo();
+  |_|return |C|bar(), |C|bar();|R|
+}
+
+function foo() {
+  |_|return |C|baz(), |C|baz();|R|
+}
+
+function bar() {
+  |_|return |C|foo(),
+         1 |_|+ |C|foo(),
+         2 |_|+ |C|foo();|R|
+}
+
+const baz = |_|() => |_|0|R|;
+|R|
+
+
+Running test: testStepping
+Execution paused in testFunction:
+function testFunction() {
+  #foo(), foo(), foo();
+  return bar(), bar();
+
+Execution paused in foo:
+function foo() {
+  #return baz(), baz();
+}
+
+Called from testFunction:
+function testFunction() {
+  #foo(), foo(), foo();
+  return bar(), bar();
+
+Execution paused in foo:
+function foo() {
+  return baz(), #baz();
+}
+
+Called from testFunction:
+function testFunction() {
+  #foo(), foo(), foo();
+  return bar(), bar();
+
+Execution paused in foo:
+function foo() {
+  return baz(), baz();#
+}
+
+Called from testFunction:
+function testFunction() {
+  #foo(), foo(), foo();
+  return bar(), bar();
+
+Execution paused in testFunction:
+function testFunction() {
+  foo(), #foo(), foo();
+  return bar(), bar();
+
+Execution paused in foo:
+function foo() {
+  #return baz(), baz();
+}
+
+Called from testFunction:
+function testFunction() {
+  foo(), #foo(), foo();
+  return bar(), bar();
+
+Execution paused in foo:
+function foo() {
+  return baz(), #baz();
+}
+
+Called from testFunction:
+function testFunction() {
+  foo(), #foo(), foo();
+  return bar(), bar();
+
+Execution paused in foo:
+function foo() {
+  return baz(), baz();#
+}
+
+Called from testFunction:
+function testFunction() {
+  foo(), #foo(), foo();
+  return bar(), bar();
+
+Execution paused in testFunction:
+function testFunction() {
+  foo(), foo(), #foo();
+  return bar(), bar();
+
+Execution paused in foo:
+function foo() {
+  #return baz(), baz();
+}
+
+Called from testFunction:
+function testFunction() {
+  foo(), foo(), #foo();
+  return bar(), bar();
+
+Execution paused in foo:
+function foo() {
+  return baz(), #baz();
+}
+
+Called from testFunction:
+function testFunction() {
+  foo(), foo(), #foo();
+  return bar(), bar();
+
+Execution paused in foo:
+function foo() {
+  return baz(), baz();#
+}
+
+Called from testFunction:
+function testFunction() {
+  foo(), foo(), #foo();
+  return bar(), bar();
+
+Execution paused in testFunction:
+  foo(), foo(), foo();
+  #return bar(), bar();
+}
+
+Execution paused in bar:
+function bar() {
+  #return foo(),
+         1 + foo(),
+
+Called from testFunction:
+  foo(), foo(), foo();
+  return #bar(), bar();
+}
+
+Execution paused in bar:
+  return foo(),
+         1 #+ foo(),
+         2 + foo();
+
+Called from testFunction:
+  foo(), foo(), foo();
+  return #bar(), bar();
+}
+
+Execution paused in bar:
+         1 + foo(),
+         2 #+ foo();
+}
+
+Called from testFunction:
+  foo(), foo(), foo();
+  return #bar(), bar();
+}
+
+Execution paused in bar:
+         1 + foo(),
+         2 + foo();#
+}
+
+Called from testFunction:
+  foo(), foo(), foo();
+  return #bar(), bar();
+}
+
+Execution paused in testFunction:
+  foo(), foo(), foo();
+  return bar(), #bar();
+}
+
+Execution paused in bar:
+function bar() {
+  #return foo(),
+         1 + foo(),
+
+Called from testFunction:
+  foo(), foo(), foo();
+  return bar(), #bar();
+}
+
+Execution paused in bar:
+  return foo(),
+         1 #+ foo(),
+         2 + foo();
+
+Called from testFunction:
+  foo(), foo(), foo();
+  return bar(), #bar();
+}
+
+Execution paused in bar:
+         1 + foo(),
+         2 #+ foo();
+}
+
+Called from testFunction:
+  foo(), foo(), foo();
+  return bar(), #bar();
+}
+
+Execution paused in bar:
+         1 + foo(),
+         2 + foo();#
+}
+
+Called from testFunction:
+  foo(), foo(), foo();
+  return bar(), #bar();
+}
+
+Execution paused in testFunction:
+  foo(), foo(), foo();
+  return bar(), bar();#
+}
+
+Resuming and finishing...
diff --git a/deps/v8/test/inspector/debugger/comma-expression.js b/deps/v8/test/inspector/debugger/comma-expression.js
new file mode 100644
index 00000000000000..4e3b26fcf6af4f
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/comma-expression.js
@@ -0,0 +1,96 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {session, contextGroup, Protocol} =
+    InspectorTest.start('Tests breakable locations in comma expressions.');
+
+const source = `
+function testFunction() {
+  foo(), foo(), foo();
+  return bar(), bar();
+}
+
+function foo() {
+  return baz(), baz();
+}
+
+function bar() {
+  return foo(),
+         1 + foo(),
+         2 + foo();
+}
+
+const baz = () => 0;
+`;
+
+const url = 'test.js';
+contextGroup.addScript(source, 0, 0, url);
+session.setupScriptMap();
+
+InspectorTest.runAsyncTestSuite([
+  async function testBreakLocations() {
+    const [, , {params: {scriptId}}] = await Promise.all([
+      Protocol.Runtime.enable(),
+      Protocol.Debugger.enable(),
+      Protocol.Debugger.onceScriptParsed(),
+    ]);
+    const {result: {locations}} =
+        await Protocol.Debugger.getPossibleBreakpoints(
+            {start: {lineNumber: 0, columnNumber: 0, scriptId}});
+    await session.logBreakLocations(locations);
+    await Promise.all([
+      Protocol.Debugger.disable(),
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testStepping() {
+    const [, , {params: {scriptId}}] = await Promise.all([
+      Protocol.Runtime.enable(),
+      Protocol.Debugger.enable(),
+      Protocol.Debugger.onceScriptParsed(),
+    ]);
+    const {breakpointId} = await Protocol.Debugger.setBreakpoint({
+      location: {
+        scriptId,
+        lineNumber: 2,
+      }
+    });
+    const evalPromise =
+        Protocol.Runtime.evaluate({expression: 'testFunction()'});
+    for (;;) {
+      const {method, params} = await Promise.race([
+        evalPromise,
+        Protocol.Debugger.oncePaused(),
+      ]);
+      if (method !== 'Debugger.paused') {
+        break;
+      }
+      const callFrames = params.callFrames.filter(
+          callFrame => callFrame.location.scriptId === scriptId);
+      if (callFrames.length === 0) {
+        InspectorTest.log('Resuming and finishing...');
+        await Protocol.Debugger.resume();
+      } else {
+        const [{functionName, location}, ...callerFrames] = callFrames;
+        InspectorTest.log(`Execution paused in ${functionName}:`);
+        await session.logSourceLocation(location);
+        for (const {location, functionName} of callerFrames) {
+          InspectorTest.log(`Called from ${functionName}:`);
+          await session.logSourceLocation(location);
+        }
+        if (functionName === 'testFunction') {
+          await Protocol.Debugger.stepInto();
+        } else {
+          await Protocol.Debugger.stepOver();
+        }
+      }
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      Protocol.Runtime.disable(),
+    ]);
+  }
+]);
diff --git a/deps/v8/test/inspector/debugger/destructuring-expected.txt b/deps/v8/test/inspector/debugger/destructuring-expected.txt
deleted file mode 100644
index 47673aefe7512b..00000000000000
--- a/deps/v8/test/inspector/debugger/destructuring-expected.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-Tests breakable locations in destructuring.
-
-Running test: testBreakLocations
-
-function testFunction() {
-  function func() {
-    |_|return [1, 2];|R|
-  }
-
-  var [|_|a, |_|b] = |C|func();
-|R|}
-
-
-Running test: testSetBreakpoint
-Setting breakpoint at test.js:6:0
-
-  var [a, b] = #func();
-}
-
-Setting breakpoint at test.js:6:7
-
-  var [#a, b] = func();
-}
-
-Setting breakpoint at test.js:6:10
-
-  var [a, #b] = func();
-}
-
-Setting breakpoint at test.js:6:15
-
-  var [a, b] = #func();
-}
-
diff --git a/deps/v8/test/inspector/debugger/destructuring.js b/deps/v8/test/inspector/debugger/destructuring.js
deleted file mode 100644
index e46e0e499823a1..00000000000000
--- a/deps/v8/test/inspector/debugger/destructuring.js
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2021 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-let {session, contextGroup, Protocol} =
-  InspectorTest.start('Tests breakable locations in destructuring.');
-
-let source = `
-function testFunction() {
-  function func() {
-    return [1, 2];
-  }
-
-  var [a, b] = func();
-}
-//# sourceURL=test.js`;
-
-contextGroup.addScript(source);
-session.setupScriptMap();
-
-InspectorTest.runAsyncTestSuite([
-  async function testBreakLocations() {
-    Protocol.Debugger.enable();
-    let {params:{scriptId}} = await Protocol.Debugger.onceScriptParsed();
-    let {result:{locations}} = await Protocol.Debugger.getPossibleBreakpoints({
-      start: {lineNumber: 0, columnNumber : 0, scriptId}});
-    await session.logBreakLocations(locations);
-  },
-
-  async function testSetBreakpoint() {
-    const SOURCE_LOCATIONS = [
-      {lineNumber: 6, columnNumber: 0},
-      {lineNumber: 6, columnNumber: 7},
-      {lineNumber: 6, columnNumber: 10},
-      {lineNumber: 6, columnNumber: 15},
-    ];
-    for (const {lineNumber, columnNumber} of SOURCE_LOCATIONS) {
-      const url = 'test.js';
-      InspectorTest.log(`Setting breakpoint at ${url}:${lineNumber}:${columnNumber}`);
-      const {result: {breakpointId, locations}} = await Protocol.Debugger.setBreakpointByUrl({
-        lineNumber, columnNumber, url
-      });
-      locations.forEach(location => session.logSourceLocation(location));
-      await Protocol.Debugger.removeBreakpoint({breakpointId});
-    }
-  }
-]);
diff --git a/deps/v8/test/inspector/debugger/get-possible-breakpoints-class-fields-expected.txt b/deps/v8/test/inspector/debugger/get-possible-breakpoints-class-fields-expected.txt
index d244261ba08c3f..b1fc379d92dfcf 100644
--- a/deps/v8/test/inspector/debugger/get-possible-breakpoints-class-fields-expected.txt
+++ b/deps/v8/test/inspector/debugger/get-possible-breakpoints-class-fields-expected.txt
@@ -99,7 +99,7 @@ let x = |R|class {}
 }|R|
 
 |_|x = |R|class {
-  x = |_|function*|_|() {
+  x = |_|function*() {
     |_|yield 1;
   |R|};
 }|R|
@@ -190,7 +190,7 @@ let x = |R|class {}
 }
 
 |_|x = |R|class {
-  static x = |_|function*|_|() {
+  static x = |_|function*() {
     |_|yield 1;
   |R|}|R|;
 }
@@ -204,3 +204,4 @@ let x = |R|class {}
   [|C|bar()] = |_|6;
 }|R|
 |R|
+
diff --git a/deps/v8/test/inspector/debugger/get-possible-breakpoints-main-expected.txt b/deps/v8/test/inspector/debugger/get-possible-breakpoints-main-expected.txt
index f7f9b7ca25469a..428685253c92dc 100644
--- a/deps/v8/test/inspector/debugger/get-possible-breakpoints-main-expected.txt
+++ b/deps/v8/test/inspector/debugger/get-possible-breakpoints-main-expected.txt
@@ -152,7 +152,7 @@ function testSwitch() {
   }
 |R|}
 
-function* idMaker|_|() {
+function* idMaker() {
   |_|yield 1;
   |_|yield 2;
   |_|yield 3;
@@ -230,8 +230,8 @@ async function testPromiseAsyncWithCode() {
       |_|await p;
     |R|}
     |C|setTimeout(returnCall, 0);
-    |_|await |C|foo();
-    |_|await |C|foo();
+    await |C|foo();
+    await |C|foo();
     |C|nextTest();
   |R|}
   |C|main();
@@ -252,7 +252,7 @@ async function testPromiseComplex() {
     }
     var x = |_|1;
     var y = |_|2;
-    |C|returnFunction(|C|emptyFunction(), x++, --y, x => 2 |_|* x|R|, |C|returnCall())|C|().a = |_|await |C|foo((a => 2 |_|*a|R|)|C|(5));
+    |C|returnFunction(|C|emptyFunction(), x++, --y, x => 2 |_|* x|R|, |C|returnCall())|C|().a = await |C|foo((a => 2 |_|*a|R|)|C|(5));
     |C|nextTest();
   |R|}
   |C|main();
diff --git a/deps/v8/test/inspector/debugger/line-breakpoint-await-expected.txt b/deps/v8/test/inspector/debugger/line-breakpoint-await-expected.txt
new file mode 100644
index 00000000000000..a648308d970f54
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/line-breakpoint-await-expected.txt
@@ -0,0 +1,26 @@
+Line breakpoints for await
+
+Running test: testAwaitInAsyncFunctionWithLeadingWhitespace
+Setting breakpoint on `await this.foo()` in `obj.bar`
+Calling `obj.bar()`
+Hit breakpoint before calling into `this.foo`
+
+Running test: testAwaitInAsyncFunctionWithoutLeadingWhitespace
+Setting breakpoint on `await this.foo()` in `obj.baz`
+Calling `obj.baz()`
+Hit breakpoint before calling into `this.foo`
+
+Running test: testAwaitInAsyncGeneratorWithLeadingWhitespace
+Setting breakpoint on `await this.foo()` in `obj.barGenerator`
+Calling `obj.barGenerator().next()`
+Hit breakpoint before calling into `this.foo`
+
+Running test: testAwaitInAsyncGeneratorWithoutLeadingWhitespace
+Setting breakpoint on `await this.foo()` in `obj.bazGenerator`
+Calling `obj.bazGenerator().next()`
+Hit breakpoint before calling into `this.foo`
+
+Running test: testAwaitInAsyncFunctionMinified
+Setting breakpoint on `await this.foo()` in `obj.minified`
+Calling `obj.minified()`
+Hit breakpoint before calling into `this.foo`
diff --git a/deps/v8/test/inspector/debugger/line-breakpoint-await.js b/deps/v8/test/inspector/debugger/line-breakpoint-await.js
new file mode 100644
index 00000000000000..c6f207533f8467
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/line-breakpoint-await.js
@@ -0,0 +1,201 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use  of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {session, contextGroup, Protocol} =
+    InspectorTest.start('Line breakpoints for await');
+
+// clang-format off
+const url = 'line-breakpoint-await.js';
+contextGroup.addScript(`
+var obj = {
+  foo() {
+    debugger;
+  },
+
+  async bar() {
+    await this.foo();
+  },
+
+  async baz() {
+await this.foo();
+  },
+
+  async* barGenerator() {
+    await this.foo();
+  },
+
+  async* bazGenerator() {
+await this.foo();
+  },
+
+  async minified(){await this.foo();}
+};
+`, 0, 0, url);
+// clang-format on
+
+session.setupScriptMap();
+InspectorTest.runAsyncTestSuite([
+  async function testAwaitInAsyncFunctionWithLeadingWhitespace() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log('Setting breakpoint on `await this.foo()` in `obj.bar`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 7,
+          columnNumber: 0,
+        });
+    InspectorTest.log('Calling `obj.bar()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.bar()',
+      awaitPromise: true,
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testAwaitInAsyncFunctionWithoutLeadingWhitespace() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log('Setting breakpoint on `await this.foo()` in `obj.baz`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 11,
+          columnNumber: 0,
+        });
+    InspectorTest.log('Calling `obj.baz()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.baz()',
+      awaitPromise: true,
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testAwaitInAsyncGeneratorWithLeadingWhitespace() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log(
+        'Setting breakpoint on `await this.foo()` in `obj.barGenerator`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 15,
+          columnNumber: 0,
+        });
+    InspectorTest.log('Calling `obj.barGenerator().next()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.barGenerator().next()',
+      awaitPromise: true,
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testAwaitInAsyncGeneratorWithoutLeadingWhitespace() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log(
+        'Setting breakpoint on `await this.foo()` in `obj.bazGenerator`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 19,
+          columnNumber: 0,
+        });
+    InspectorTest.log('Calling `obj.bazGenerator().next()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.bazGenerator().next()',
+      awaitPromise: true,
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testAwaitInAsyncFunctionMinified() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log(
+        'Setting breakpoint on `await this.foo()` in `obj.minified`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 22,
+          columnNumber: 19,
+        });
+    InspectorTest.log('Calling `obj.minified()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.minified()',
+      awaitPromise: true,
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+]);
diff --git a/deps/v8/test/inspector/debugger/line-breakpoint-yield-expected.txt b/deps/v8/test/inspector/debugger/line-breakpoint-yield-expected.txt
new file mode 100644
index 00000000000000..948d381e5f767d
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/line-breakpoint-yield-expected.txt
@@ -0,0 +1,26 @@
+Line breakpoints for yield
+
+Running test: testYieldInGeneratorWithLeadingWhitespace
+Setting breakpoint on `yield this.foo()` in `obj.barGenerator`
+Calling `obj.barGenerator().next()`
+Hit breakpoint before calling into `this.foo`
+
+Running test: testYieldInGeneratorWithoutLeadingWhitespace
+Setting breakpoint on `await this.foo()` in `obj.bazGenerator`
+Calling `obj.bazGenerator().next()`
+Hit breakpoint before calling into `this.foo`
+
+Running test: testYieldInAsyncGeneratorWithLeadingWhitespace
+Setting breakpoint on `yield this.foo()` in `obj.barAsyncGenerator`
+Calling `obj.barAsyncGenerator().next()`
+Hit breakpoint before calling into `this.foo`
+
+Running test: testYieldInAsyncGeneratorWithoutLeadingWhitespace
+Setting breakpoint on `yield this.foo()` in `obj.bazAsyncGenerator`
+Calling `obj.bazAsyncGenerator().next()`
+Hit breakpoint before calling into `this.foo`
+
+Running test: testYieldInMinifiedGenerator
+Setting breakpoint on `yield this.foo()` in `obj.minifiedGenerator`
+Calling `obj.minifiedGenerator().next()`
+Hit breakpoint before calling into `this.foo`
diff --git a/deps/v8/test/inspector/debugger/line-breakpoint-yield.js b/deps/v8/test/inspector/debugger/line-breakpoint-yield.js
new file mode 100644
index 00000000000000..d9cb36075da778
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/line-breakpoint-yield.js
@@ -0,0 +1,200 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use  of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {session, contextGroup, Protocol} =
+    InspectorTest.start('Line breakpoints for yield');
+
+// clang-format off
+const url = 'line-breakpoint-yield.js';
+contextGroup.addScript(`
+var obj = {
+  foo() {
+    debugger;
+  },
+
+  *barGenerator() {
+    yield this.foo();
+  },
+
+  *bazGenerator() {
+yield this.foo();
+  },
+
+  async* barAsyncGenerator() {
+    yield this.foo();
+  },
+
+  async* bazAsyncGenerator() {
+yield this.foo();
+  },
+
+  *minifiedGenerator(){yield this.foo();}
+};
+`, 0, 0, url);
+// clang-format on
+
+session.setupScriptMap();
+InspectorTest.runAsyncTestSuite([
+  async function testYieldInGeneratorWithLeadingWhitespace() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log(
+        'Setting breakpoint on `yield this.foo()` in `obj.barGenerator`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 7,
+          columnNumber: 0,
+        });
+    InspectorTest.log('Calling `obj.barGenerator().next()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.barGenerator().next()',
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testYieldInGeneratorWithoutLeadingWhitespace() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log(
+        'Setting breakpoint on `await this.foo()` in `obj.bazGenerator`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 11,
+          columnNumber: 0,
+        });
+    InspectorTest.log('Calling `obj.bazGenerator().next()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.bazGenerator().next()',
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testYieldInAsyncGeneratorWithLeadingWhitespace() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log(
+        'Setting breakpoint on `yield this.foo()` in `obj.barAsyncGenerator`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 15,
+          columnNumber: 0,
+        });
+    InspectorTest.log('Calling `obj.barAsyncGenerator().next()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.barAsyncGenerator().next()',
+      awaitPromise: true,
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testYieldInAsyncGeneratorWithoutLeadingWhitespace() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log(
+        'Setting breakpoint on `yield this.foo()` in `obj.bazAsyncGenerator`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 19,
+          columnNumber: 0,
+        });
+    InspectorTest.log('Calling `obj.bazAsyncGenerator().next()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.bazAsyncGenerator().next()',
+      awaitPromise: true,
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testYieldInMinifiedGenerator() {
+    await Promise.all([
+      Protocol.Debugger.enable(),
+      Protocol.Runtime.enable(),
+    ]);
+    InspectorTest.log(
+        'Setting breakpoint on `yield this.foo()` in `obj.minifiedGenerator`');
+    const {result: {breakpointId}} =
+        await Protocol.Debugger.setBreakpointByUrl({
+          url,
+          lineNumber: 22,
+          columnNumber: 23,
+        });
+    InspectorTest.log('Calling `obj.minifiedGenerator().next()`');
+    const pausedPromise = Protocol.Debugger.oncePaused();
+    const evalPromise = Protocol.Runtime.evaluate({
+      expression: 'obj.minifiedGenerator().next()',
+    });
+    const {params: {hitBreakpoints}} = await pausedPromise;
+    if (hitBreakpoints?.length === 1 && hitBreakpoints[0] === breakpointId) {
+      InspectorTest.log('Hit breakpoint before calling into `this.foo`');
+    } else {
+      InspectorTest.log('Missed breakpoint before calling into `this.foo`');
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      evalPromise,
+      Protocol.Runtime.disable(),
+    ]);
+  },
+]);
diff --git a/deps/v8/test/inspector/debugger/object-destructuring-expected.txt b/deps/v8/test/inspector/debugger/object-destructuring-expected.txt
new file mode 100644
index 00000000000000..353df73c674955
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/object-destructuring-expected.txt
@@ -0,0 +1,124 @@
+Tests breakable locations in object destructuring.
+
+Running test: testBreakLocations
+
+function testFunction() {
+  var {a, b, c = 4} = |_|obj1;
+  |_|({d: {a, b}, c} = obj2);
+  |_|({a, ...b} = obj1);
+|R|}
+
+var obj1 = |_|{
+  get a() { |_|return 1;|R| },
+  get b() { |_|return 2;|R| },
+};
+
+var obj2 = |_|{
+  get c() { |_|return 3;|R| },
+  get d() { |_|return obj1;|R| },
+};
+|R|
+
+
+Running test: testStepping
+Execution paused in testFunction:
+function testFunction() {
+  var {a, b, c = 4} = #obj1;
+  ({d: {a, b}, c} = obj2);
+
+Execution paused in get a:
+var obj1 = {
+  get a() { #return 1; },
+  get b() { return 2; },
+
+Called from testFunction:
+function testFunction() {
+  var {#a, b, c = 4} = obj1;
+  ({d: {a, b}, c} = obj2);
+
+Execution paused in get b:
+  get a() { return 1; },
+  get b() { #return 2; },
+};
+
+Called from testFunction:
+function testFunction() {
+  var {a, #b, c = 4} = obj1;
+  ({d: {a, b}, c} = obj2);
+
+Execution paused in testFunction:
+  var {a, b, c = 4} = obj1;
+  #({d: {a, b}, c} = obj2);
+  ({a, ...b} = obj1);
+
+Execution paused in get d:
+  get c() { return 3; },
+  get d() { #return obj1; },
+};
+
+Called from testFunction:
+  var {a, b, c = 4} = obj1;
+  ({d: #{a, b}, c} = obj2);
+  ({a, ...b} = obj1);
+
+Execution paused in get a:
+var obj1 = {
+  get a() { #return 1; },
+  get b() { return 2; },
+
+Called from testFunction:
+  var {a, b, c = 4} = obj1;
+  ({d: {#a, b}, c} = obj2);
+  ({a, ...b} = obj1);
+
+Execution paused in get b:
+  get a() { return 1; },
+  get b() { #return 2; },
+};
+
+Called from testFunction:
+  var {a, b, c = 4} = obj1;
+  ({d: {a, #b}, c} = obj2);
+  ({a, ...b} = obj1);
+
+Execution paused in get c:
+var obj2 = {
+  get c() { #return 3; },
+  get d() { return obj1; },
+
+Called from testFunction:
+  var {a, b, c = 4} = obj1;
+  ({d: {a, b}, #c} = obj2);
+  ({a, ...b} = obj1);
+
+Execution paused in testFunction:
+  ({d: {a, b}, c} = obj2);
+  #({a, ...b} = obj1);
+}
+
+Execution paused in get a:
+var obj1 = {
+  get a() { #return 1; },
+  get b() { return 2; },
+
+Called from testFunction:
+  ({d: {a, b}, c} = obj2);
+  ({#a, ...b} = obj1);
+}
+
+Execution paused in get b:
+  get a() { return 1; },
+  get b() { #return 2; },
+};
+
+Called from testFunction:
+  ({d: {a, b}, c} = obj2);
+  ({a, ...#b} = obj1);
+}
+
+Execution paused in testFunction:
+  ({a, ...b} = obj1);
+#}
+
+
+Resuming and finishing...
diff --git a/deps/v8/test/inspector/debugger/object-destructuring.js b/deps/v8/test/inspector/debugger/object-destructuring.js
new file mode 100644
index 00000000000000..5703ab9712e5bd
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/object-destructuring.js
@@ -0,0 +1,94 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {session, contextGroup, Protocol} =
+    InspectorTest.start('Tests breakable locations in object destructuring.');
+
+const source = `
+function testFunction() {
+  var {a, b, c = 4} = obj1;
+  ({d: {a, b}, c} = obj2);
+  ({a, ...b} = obj1);
+}
+
+var obj1 = {
+  get a() { return 1; },
+  get b() { return 2; },
+};
+
+var obj2 = {
+  get c() { return 3; },
+  get d() { return obj1; },
+};
+`;
+
+const url = 'test.js';
+contextGroup.addScript(source, 0, 0, url);
+session.setupScriptMap();
+
+InspectorTest.runAsyncTestSuite([
+  async function testBreakLocations() {
+    let [, , {params: {scriptId}}] = await Promise.all([
+      Protocol.Runtime.enable(),
+      Protocol.Debugger.enable(),
+      Protocol.Debugger.onceScriptParsed(),
+    ]);
+    let {result: {locations}} = await Protocol.Debugger.getPossibleBreakpoints(
+        {start: {lineNumber: 0, columnNumber: 0, scriptId}});
+    await session.logBreakLocations(locations);
+    await Promise.all([
+      Protocol.Debugger.disable(),
+      Protocol.Runtime.disable(),
+    ]);
+  },
+
+  async function testStepping() {
+    let [, , {params: {scriptId}}] = await Promise.all([
+      Protocol.Runtime.enable(),
+      Protocol.Debugger.enable(),
+      Protocol.Debugger.onceScriptParsed(),
+    ]);
+    const {breakpointId} = await Protocol.Debugger.setBreakpoint({
+      location: {
+        scriptId,
+        lineNumber: 2,
+      }
+    });
+    const evalPromise =
+        Protocol.Runtime.evaluate({expression: 'testFunction()'});
+    for (;;) {
+      const {method, params} = await Promise.race([
+        evalPromise,
+        Protocol.Debugger.oncePaused(),
+      ]);
+      if (method !== 'Debugger.paused') {
+        break;
+      }
+      const callFrames = params.callFrames.filter(
+          callFrame => callFrame.location.scriptId === scriptId);
+      if (callFrames.length === 0) {
+        InspectorTest.log('Resuming and finishing...');
+        await Protocol.Debugger.resume();
+      } else {
+        const [{functionName, location}, ...callerFrames] = callFrames;
+        InspectorTest.log(`Execution paused in ${functionName}:`);
+        await session.logSourceLocation(location);
+        for (const {location, functionName} of callerFrames) {
+          InspectorTest.log(`Called from ${functionName}:`);
+          await session.logSourceLocation(location);
+        }
+        if (functionName === 'testFunction') {
+          await Protocol.Debugger.stepInto();
+        } else {
+          await Protocol.Debugger.stepOut();
+        }
+      }
+    }
+    await Promise.all([
+      Protocol.Debugger.removeBreakpoint({breakpointId}),
+      Protocol.Debugger.disable(),
+      Protocol.Runtime.disable(),
+    ]);
+  }
+]);
diff --git a/deps/v8/test/inspector/debugger/object-preview-internal-properties-expected.txt b/deps/v8/test/inspector/debugger/object-preview-internal-properties-expected.txt
index 56f992237a2ebd..1bdef8231b2523 100644
--- a/deps/v8/test/inspector/debugger/object-preview-internal-properties-expected.txt
+++ b/deps/v8/test/inspector/debugger/object-preview-internal-properties-expected.txt
@@ -159,6 +159,88 @@ expression: new WeakSet([{}])
 ]
 
 
+Running test: symbolsAsKeysInEntries
+expression: new Map([[Symbol('key1'), 1]])
+{
+    name : size
+    type : number
+    value : 1
+}
+[[Entries]]:
+[
+    [0] : {
+        key : {
+            description : Symbol(key1)
+            overflow : false
+            properties : [
+            ]
+            type : symbol
+        }
+        value : {
+            description : 1
+            overflow : false
+            properties : [
+            ]
+            type : number
+        }
+    }
+]
+
+expression: new Set([Symbol('key2')])
+{
+    name : size
+    type : number
+    value : 1
+}
+[[Entries]]:
+[
+    [0] : {
+        value : {
+            description : Symbol(key2)
+            overflow : false
+            properties : [
+            ]
+            type : symbol
+        }
+    }
+]
+
+expression: new WeakMap([[Symbol('key3'), 2]])
+[[Entries]]:
+[
+    [0] : {
+        key : {
+            description : Symbol(key3)
+            overflow : false
+            properties : [
+            ]
+            type : symbol
+        }
+        value : {
+            description : 2
+            overflow : false
+            properties : [
+            ]
+            type : number
+        }
+    }
+]
+
+expression: new WeakSet([Symbol('key4')])
+[[Entries]]:
+[
+    [0] : {
+        value : {
+            description : Symbol(key4)
+            overflow : false
+            properties : [
+            ]
+            type : symbol
+        }
+    }
+]
+
+
 Running test: iteratorObject
 expression: (new Map([[1,2]])).entries()
 [[Entries]]:
diff --git a/deps/v8/test/inspector/debugger/object-preview-internal-properties.js b/deps/v8/test/inspector/debugger/object-preview-internal-properties.js
index f542683aa49159..d2b3a7816339e9 100644
--- a/deps/v8/test/inspector/debugger/object-preview-internal-properties.js
+++ b/deps/v8/test/inspector/debugger/object-preview-internal-properties.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Flags: --harmony-class-fields
+// Flags: --harmony-symbol-as-weakmap-key
 
 let {session, contextGroup, Protocol} = InspectorTest.start("Check internal properties reported in object preview.");
 
@@ -45,6 +45,15 @@ InspectorTest.runTestSuite([
       .then(next);
   },
 
+  function symbolsAsKeysInEntries(next)
+  {
+    checkExpression("new Map([[Symbol('key1'), 1]])")
+      .then(() => checkExpression("new Set([Symbol('key2')])"))
+      .then(() => checkExpression("new WeakMap([[Symbol('key3'), 2]])"))
+      .then(() => checkExpression("new WeakSet([Symbol('key4')])"))
+      .then(next);
+  },
+
   function iteratorObject(next)
   {
     checkExpression("(new Map([[1,2]])).entries()")
diff --git a/deps/v8/test/inspector/debugger/set-script-source-debug-evaluate-closure-expected.txt b/deps/v8/test/inspector/debugger/set-script-source-debug-evaluate-closure-expected.txt
new file mode 100644
index 00000000000000..c230516c66221f
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/set-script-source-debug-evaluate-closure-expected.txt
@@ -0,0 +1,16 @@
+Check that setScriptSource doesn't affect debug-evaluate block listing
+{
+    className : ReferenceError
+    description : ReferenceError: a is not defined     at globalThis.foo (eval at i (:1:1), <anonymous>:1:27)     at <anonymous>:1:12
+    objectId : <objectId>
+    subtype : error
+    type : object
+}
+Debugger.setScriptSource: Ok
+{
+    className : ReferenceError
+    description : ReferenceError: a is not defined     at globalThis.foo (eval at i (:1:1), <anonymous>:1:27)     at <anonymous>:1:12
+    objectId : <objectId>
+    subtype : error
+    type : object
+}
diff --git a/deps/v8/test/inspector/debugger/set-script-source-debug-evaluate-closure.js b/deps/v8/test/inspector/debugger/set-script-source-debug-evaluate-closure.js
new file mode 100644
index 00000000000000..59b5fe1719f34d
--- /dev/null
+++ b/deps/v8/test/inspector/debugger/set-script-source-debug-evaluate-closure.js
@@ -0,0 +1,64 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const {session, contextGroup, Protocol} =
+    InspectorTest.start('Check that setScriptSource doesn\'t affect debug-evaluate block listing');
+
+const script = `
+// INSERT NEWLINES HERE
+function f() {
+  let a = 3; () => a; // context allocated.
+  return function g() {
+    let a = 42;       // stack-allocated. Shadowing context-allocated from f.
+    return function h() {
+      // Give h a context.
+      let x = 5; () => x;
+      return function i() {
+        debugger;
+      };
+    };
+  };
+}
+(((f())())())();
+`;
+
+const updatedScript = script.replace('// INSERT NEWLINES HERE', '\n\n\n');
+
+(async function test() {
+  await Protocol.Debugger.enable();
+  await Protocol.Runtime.enable();
+  const promise = Protocol.Debugger.oncePaused();
+
+  contextGroup.addScript(script);
+
+  const { params: { callFrames: [{ callFrameId, functionLocation: { scriptId } }] } } = await promise;
+
+  // Create a closure that returns `a` and stash it on the global.
+  await Protocol.Debugger.evaluateOnCallFrame({
+    callFrameId,
+    expression: `globalThis['foo'] = () => a;`
+  });
+  await Protocol.Debugger.resume();
+
+  // Expect a ReferenceError.
+  const { result: { result: result1 } } = await Protocol.Runtime.evaluate({
+    expression: 'globalThis.foo();'
+  });
+  InspectorTest.logMessage(result1);
+
+  // Move function 'h' but don't change it.
+  const { result: { status } } = await Protocol.Debugger.setScriptSource({
+    scriptId,
+    scriptSource: updatedScript,
+  });
+  InspectorTest.log(`Debugger.setScriptSource: ${status}`);
+
+  // Still expect a ReferenceError.
+  const { result: { result: result2 } } = await Protocol.Runtime.evaluate({
+    expression: 'globalThis.foo();'
+  });
+  InspectorTest.logMessage(result2);
+
+  InspectorTest.completeTest();
+})();
diff --git a/deps/v8/test/inspector/debugger/step-into-expected.txt b/deps/v8/test/inspector/debugger/step-into-expected.txt
index 351c0f4437a195..a2e274f9a51d7e 100644
--- a/deps/v8/test/inspector/debugger/step-into-expected.txt
+++ b/deps/v8/test/inspector/debugger/step-into-expected.txt
@@ -682,11 +682,6 @@ function testGenerator() {
   var gen = #idMaker();
   return42();
 
-break at:
-
-function* idMaker#() {
-  yield 1;
-
 break at:
   var gen = idMaker();
   #return42();
diff --git a/deps/v8/test/inspector/debugger/stepping-async-generator-expected.txt b/deps/v8/test/inspector/debugger/stepping-async-generator-expected.txt
index f46d0fd2f90a8b..031e1e61f6791d 100644
--- a/deps/v8/test/inspector/debugger/stepping-async-generator-expected.txt
+++ b/deps/v8/test/inspector/debugger/stepping-async-generator-expected.txt
@@ -1,18 +1,5 @@
 Async generator stepping
 
-Running test: testStepOverFromInitialYield
-Setting breakpoint on implicit initial yield
-Calling callGenerator()
-
-async function* generator#() {
-  var a = 42;
-
-Stepping over while paused on the initial yield
-function callGenerator() {
-  return generator();#
-}
-
-
 Running test: testStepIntoInitialYield
 Setting breakpoint on call to generator()
 Calling callGenerator()
@@ -21,11 +8,6 @@ function callGenerator() {
 }
 
 Stepping into the generator()
-
-async function* generator#() {
-  var a = 42;
-
-Stepping into while paused on the initial yield
 function callGenerator() {
   return generator();#
 }
diff --git a/deps/v8/test/inspector/debugger/stepping-async-generator.js b/deps/v8/test/inspector/debugger/stepping-async-generator.js
index 37d3bbd577aaf4..55d370d950ea67 100644
--- a/deps/v8/test/inspector/debugger/stepping-async-generator.js
+++ b/deps/v8/test/inspector/debugger/stepping-async-generator.js
@@ -18,36 +18,6 @@ function callGenerator() {
 session.setupScriptMap();
 
 InspectorTest.runAsyncTestSuite([
-  async function testStepOverFromInitialYield() {
-    await Promise.all([Protocol.Debugger.enable(), Protocol.Runtime.enable()]);
-    InspectorTest.log(`Setting breakpoint on implicit initial yield`);
-    const {result: {breakpointId}} = await Protocol.Debugger.setBreakpointByUrl({
-      url,
-      lineNumber: 1,
-      columnNumber: 0,
-    })
-    InspectorTest.log(`Calling callGenerator()`);
-    const pausedPromise = Protocol.Debugger.oncePaused();
-    const evalPromise = Protocol.Runtime.evaluate({expression: 'callGenerator()'});
-    const {method, params} = await Promise.race([pausedPromise, evalPromise]);
-    if (method === 'Debugger.paused') {
-      await session.logSourceLocation(params.callFrames[0].location);
-
-      InspectorTest.log('Stepping over while paused on the initial yield');
-      const [{params: {callFrames:[{location}]}}] = await Promise.all([
-        Protocol.Debugger.oncePaused(),
-        Protocol.Debugger.stepOver(),
-      ]);
-      await session.logSourceLocation(location);
-
-      await Promise.all([Protocol.Debugger.resume(), evalPromise]);
-    } else {
-      InspectorTest.log('Did not pause');
-    }
-    await Protocol.Debugger.removeBreakpoint({breakpointId});
-    await Promise.all([Protocol.Debugger.disable(), Protocol.Runtime.disable()]);
-  },
-
   async function testStepIntoInitialYield() {
     await Promise.all([Protocol.Debugger.enable(), Protocol.Runtime.enable()]);
     InspectorTest.log(`Setting breakpoint on call to generator()`);
@@ -70,13 +40,6 @@ InspectorTest.runAsyncTestSuite([
       ]);
       await session.logSourceLocation(location);
 
-      InspectorTest.log('Stepping into while paused on the initial yield');
-      ([{params: {callFrames:[{location}]}}] = await Promise.all([
-        Protocol.Debugger.oncePaused(),
-        Protocol.Debugger.stepInto(),
-      ]));
-      await session.logSourceLocation(location);
-
       await Promise.all([Protocol.Debugger.resume(), evalPromise]);
     } else {
       InspectorTest.log('Did not pause');
diff --git a/deps/v8/test/inspector/debugger/stepping-generator-expected.txt b/deps/v8/test/inspector/debugger/stepping-generator-expected.txt
index 851668360a01b2..5fe4c51ff2ddbf 100644
--- a/deps/v8/test/inspector/debugger/stepping-generator-expected.txt
+++ b/deps/v8/test/inspector/debugger/stepping-generator-expected.txt
@@ -1,18 +1,5 @@
 Generator stepping
 
-Running test: testStepOverFromInitialYield
-Setting breakpoint on implicit initial yield
-Calling callGenerator()
-
-function* generator#() {
-  var a = 42;
-
-Stepping over while paused on the initial yield
-function callGenerator() {
-  return generator();#
-}
-
-
 Running test: testStepIntoInitialYield
 Setting breakpoint on call to generator()
 Calling callGenerator()
@@ -21,11 +8,6 @@ function callGenerator() {
 }
 
 Stepping into the generator()
-
-function* generator#() {
-  var a = 42;
-
-Stepping into while paused on the initial yield
 function callGenerator() {
   return generator();#
 }
diff --git a/deps/v8/test/inspector/debugger/stepping-generator-parameters-expected.txt b/deps/v8/test/inspector/debugger/stepping-generator-parameters-expected.txt
index dfeed7ea2c889e..bc438215c1b2f4 100644
--- a/deps/v8/test/inspector/debugger/stepping-generator-parameters-expected.txt
+++ b/deps/v8/test/inspector/debugger/stepping-generator-parameters-expected.txt
@@ -1,18 +1,5 @@
 Generator stepping with non-simple parameters
 
-Running test: testStepOverFromInitialYield
-Setting breakpoint on implicit initial yield
-Calling callGenerator()
-
-function* generator(a = (x => x)(42)) #{
-  yield a;
-
-Stepping over while paused on the initial yield
-function callGenerator() {
-  return generator(1);#
-}
-
-
 Running test: testStepIntoInitialYield
 Setting breakpoint on call to generator()
 Calling callGenerator()
@@ -21,11 +8,6 @@ function callGenerator() {
 }
 
 Stepping into the generator()
-
-function* generator(a = (x => x)(42)) #{
-  yield a;
-
-Stepping into while paused on the initial yield
 function callGenerator() {
   return generator(1);#
 }
diff --git a/deps/v8/test/inspector/debugger/stepping-generator-parameters.js b/deps/v8/test/inspector/debugger/stepping-generator-parameters.js
index 6cc49ce167940f..e79903a3aa0585 100644
--- a/deps/v8/test/inspector/debugger/stepping-generator-parameters.js
+++ b/deps/v8/test/inspector/debugger/stepping-generator-parameters.js
@@ -17,36 +17,6 @@ function callGenerator() {
 session.setupScriptMap();
 
 InspectorTest.runAsyncTestSuite([
-  async function testStepOverFromInitialYield() {
-    await Promise.all([Protocol.Debugger.enable(), Protocol.Runtime.enable()]);
-    InspectorTest.log(`Setting breakpoint on implicit initial yield`);
-    const {result: {breakpointId}} = await Protocol.Debugger.setBreakpointByUrl({
-      url,
-      lineNumber: 1,
-      columnNumber: 38,
-    })
-    InspectorTest.log(`Calling callGenerator()`);
-    const pausedPromise = Protocol.Debugger.oncePaused();
-    const evalPromise = Protocol.Runtime.evaluate({expression: 'callGenerator()'});
-    const {method, params} = await Promise.race([pausedPromise, evalPromise]);
-    if (method === 'Debugger.paused') {
-      await session.logSourceLocation(params.callFrames[0].location);
-
-      InspectorTest.log('Stepping over while paused on the initial yield');
-      const [{params: {callFrames:[{location}]}}] = await Promise.all([
-        Protocol.Debugger.oncePaused(),
-        Protocol.Debugger.stepOver(),
-      ]);
-      await session.logSourceLocation(location);
-
-      await Promise.all([Protocol.Debugger.resume(), evalPromise]);
-    } else {
-      InspectorTest.log('Did not pause');
-    }
-    await Protocol.Debugger.removeBreakpoint({breakpointId});
-    await Promise.all([Protocol.Debugger.disable(), Protocol.Runtime.disable()]);
-  },
-
   async function testStepIntoInitialYield() {
     await Promise.all([Protocol.Debugger.enable(), Protocol.Runtime.enable()]);
     InspectorTest.log(`Setting breakpoint on call to generator()`);
@@ -69,13 +39,6 @@ InspectorTest.runAsyncTestSuite([
       ]);
       await session.logSourceLocation(location);
 
-      InspectorTest.log('Stepping into while paused on the initial yield');
-      ([{params: {callFrames:[{location}]}}] = await Promise.all([
-        Protocol.Debugger.oncePaused(),
-        Protocol.Debugger.stepInto(),
-      ]));
-      await session.logSourceLocation(location);
-
       await Promise.all([Protocol.Debugger.resume(), evalPromise]);
     } else {
       InspectorTest.log('Did not pause');
diff --git a/deps/v8/test/inspector/debugger/stepping-generator.js b/deps/v8/test/inspector/debugger/stepping-generator.js
index 63134c01e25f74..b7cb9158f3442c 100644
--- a/deps/v8/test/inspector/debugger/stepping-generator.js
+++ b/deps/v8/test/inspector/debugger/stepping-generator.js
@@ -18,36 +18,6 @@ function callGenerator() {
 session.setupScriptMap();
 
 InspectorTest.runAsyncTestSuite([
-  async function testStepOverFromInitialYield() {
-    await Promise.all([Protocol.Debugger.enable(), Protocol.Runtime.enable()]);
-    InspectorTest.log(`Setting breakpoint on implicit initial yield`);
-    const {result: {breakpointId}} = await Protocol.Debugger.setBreakpointByUrl({
-      url,
-      lineNumber: 1,
-      columnNumber: 0,
-    })
-    InspectorTest.log(`Calling callGenerator()`);
-    const pausedPromise = Protocol.Debugger.oncePaused();
-    const evalPromise = Protocol.Runtime.evaluate({expression: 'callGenerator()'});
-    const {method, params} = await Promise.race([pausedPromise, evalPromise]);
-    if (method === 'Debugger.paused') {
-      await session.logSourceLocation(params.callFrames[0].location);
-
-      InspectorTest.log('Stepping over while paused on the initial yield');
-      const [{params: {callFrames:[{location}]}}] = await Promise.all([
-        Protocol.Debugger.oncePaused(),
-        Protocol.Debugger.stepOver(),
-      ]);
-      await session.logSourceLocation(location);
-
-      await Promise.all([Protocol.Debugger.resume(), evalPromise]);
-    } else {
-      InspectorTest.log('Did not pause');
-    }
-    await Protocol.Debugger.removeBreakpoint({breakpointId});
-    await Promise.all([Protocol.Debugger.disable(), Protocol.Runtime.disable()]);
-  },
-
   async function testStepIntoInitialYield() {
     await Promise.all([Protocol.Debugger.enable(), Protocol.Runtime.enable()]);
     InspectorTest.log(`Setting breakpoint on call to generator()`);
@@ -70,13 +40,6 @@ InspectorTest.runAsyncTestSuite([
       ]);
       await session.logSourceLocation(location);
 
-      InspectorTest.log('Stepping into while paused on the initial yield');
-      ([{params: {callFrames:[{location}]}}] = await Promise.all([
-        Protocol.Debugger.oncePaused(),
-        Protocol.Debugger.stepInto(),
-      ]));
-      await session.logSourceLocation(location);
-
       await Promise.all([Protocol.Debugger.resume(), evalPromise]);
     } else {
       InspectorTest.log('Did not pause');
diff --git a/deps/v8/test/inspector/debugger/suspended-generator-scopes.js b/deps/v8/test/inspector/debugger/suspended-generator-scopes.js
index 55a1fd57ca9886..4ed47965832dd4 100644
--- a/deps/v8/test/inspector/debugger/suspended-generator-scopes.js
+++ b/deps/v8/test/inspector/debugger/suspended-generator-scopes.js
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// Flags: --no-experimental-remove-internal-scopes-property
+
 let {session, contextGroup, Protocol} = InspectorTest.start('Tests that suspended generators produce scopes');
 
 contextGroup.addScript(`
diff --git a/deps/v8/test/inspector/debugger/wasm-gc-anyref-expected.txt b/deps/v8/test/inspector/debugger/wasm-gc-anyref-expected.txt
index 2c4d3f6c429340..4b627d5372dbf6 100644
--- a/deps/v8/test/inspector/debugger/wasm-gc-anyref-expected.txt
+++ b/deps/v8/test/inspector/debugger/wasm-gc-anyref-expected.txt
@@ -4,18 +4,18 @@ Running test: test
 Calling instantiate function.
 Waiting for wasm script to be parsed.
 Got wasm script!
-Setting breakpoint
 Module instantiated.
+Tables populated.
+Setting breakpoint
 {
-    columnNumber : 138
+    columnNumber : 246
     lineNumber : 0
     scriptId : <scriptId>
 }
-Table populated.
 Paused:
-Script wasm://wasm/0e116a66 byte offset 138: Wasm opcode 0x01 (kExprNop)
+Script wasm://wasm/739f5f0a byte offset 246: Wasm opcode 0x01 (kExprNop)
 Scope:
-at $main (0:138):
+at $main (0:246):
  - scope (wasm-expression-stack):
    stack: 
  - scope (local):
@@ -24,11 +24,15 @@ at $main (0:138):
    $anyref_local_i31: null (anyref)
    $anyref_local_null: null (anyref)
  - scope (module):
-   instance: exports: "exported_ref_table" (Table), "fill_ref_table" (Function), "main" (Function)
+   instance: exports: "exported_ref_table" (Table), "exported_func_table" (Table), "fill_tables" (Function), "main" (Function)
    module: Module
-   functions: "$fill_ref_table": (Function), "$main": (Function)
+   functions: "$my_func": (Function), "$fill_tables": (Function), "$main": (Function)
+   globals: "$global0": function $my_func() { [native code] } (funcref)
    tables: 
+      $import.any_table: 0: Array(2) (anyref), 1: Struct ((ref $type0)), 2: undefined (anyref)
+      $import.func_table: 0: function () { [native code] } (funcref), 1: function $my_func() { [native code] } (funcref), 2: undefined (funcref)
       $exported_ref_table: 0: Struct ((ref $type0)), 1: Array ((ref $type1)), 2: undefined (anyref), 3: undefined (anyref)
+      $exported_func_table: 0: function external_fct() { [native code] } (funcref), 1: function $my_func() { [native code] } (funcref), 2: undefined (funcref)
 at (anonymous) (0:17):
  - scope (global):
    -- skipped globals
diff --git a/deps/v8/test/inspector/debugger/wasm-gc-anyref.js b/deps/v8/test/inspector/debugger/wasm-gc-anyref.js
index 0a1eee880cb8e2..04750908cfa743 100644
--- a/deps/v8/test/inspector/debugger/wasm-gc-anyref.js
+++ b/deps/v8/test/inspector/debugger/wasm-gc-anyref.js
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Flags: --experimental-wasm-gc
+// Flags: --experimental-wasm-gc --experimental-wasm-typed-funcref
+// Flags: --experimental-wasm-type-reflection
 
 utils.load('test/inspector/wasm-inspector-test.js');
 
@@ -17,8 +18,9 @@ let breakpointLocation = -1;
 
 InspectorTest.runAsyncTestSuite([
   async function test() {
-    instantiateWasm();
+    let wasm_promise = instantiateWasm();
     let scriptIds = await waitForWasmScripts();
+    await wasm_promise;  // Make sure the instantiation is finished.
 
     // Set a breakpoint.
     InspectorTest.log('Setting breakpoint');
@@ -66,10 +68,20 @@ async function instantiateWasm() {
   var builder = new WasmModuleBuilder();
   let struct_type = builder.addStruct([makeField(kWasmI32, false)]);
   let array_type = builder.addArray(kWasmI32);
+  let imported_ref_table =
+      builder.addImportedTable('import', 'any_table', 3, 3, kWasmAnyRef);
+  let imported_func_table =
+      builder.addImportedTable('import', 'func_table', 3, 3, kWasmFuncRef);
   let ref_table = builder.addTable(kWasmAnyRef, 4)
                          .exportAs('exported_ref_table');
+  let func_table = builder.addTable(kWasmFuncRef, 3)
+                         .exportAs('exported_func_table');
 
-  builder.addFunction('fill_ref_table', kSig_v_v)
+  let func = builder.addFunction('my_func', kSig_v_v).addBody([kExprNop]);
+  // Make the function "declared".
+  builder.addGlobal(kWasmFuncRef, false, [kExprRefFunc, func.index]);
+
+  builder.addFunction('fill_tables', kSig_v_v)
     .addBody([
       ...wasmI32Const(0), ...wasmI32Const(123),
       kGCPrefix, kExprStructNew, struct_type, kExprTableSet, ref_table.index,
@@ -83,6 +95,21 @@ async function instantiateWasm() {
       // apart.
       // ...wasmI32Const(2), ...wasmI32Const(30),
       // kGCPrefix, kExprI31New, kExprTableSet, ref_table.index,
+
+      // Fill imported any table.
+      ...wasmI32Const(1),
+      ...wasmI32Const(123), kGCPrefix, kExprStructNew, struct_type,
+      kExprTableSet, imported_ref_table,
+
+      // Fill imported func table.
+      ...wasmI32Const(1),
+      kExprRefFunc, func.index,
+      kExprTableSet, imported_func_table,
+
+      // Fill func table.
+      ...wasmI32Const(1),
+      kExprRefFunc, func.index,
+      kExprTableSet, func_table.index,
     ]).exportFunc();
 
   let body = [
@@ -114,11 +141,32 @@ async function instantiateWasm() {
   breakpointLocation = main.body_offset + body.length - 1;
 
   InspectorTest.log('Calling instantiate function.');
-  await WasmInspectorTest.instantiate(module_bytes);
+  let imports = `{'import' : {
+      'any_table': (() => {
+        let js_table =
+            new WebAssembly.Table({element: 'anyref', initial: 3, maximum: 3});
+        js_table.set(0, ['JavaScript', 'value']);
+        return js_table;
+      })(),
+      'func_table': (() => {
+        let func_table =
+            new WebAssembly.Table({element: 'anyfunc', initial: 3, maximum: 3});
+        func_table.set(0, new WebAssembly.Function(
+          {parameters:['i32', 'i32'], results: ['i32']},
+          function /*anonymous*/ (a, b) { return a * b; }));
+        return func_table;
+      })(),
+    }}`;
+  await WasmInspectorTest.instantiate(module_bytes, 'instance', imports);
   InspectorTest.log('Module instantiated.');
   await WasmInspectorTest.evalWithUrl(
-      'instance.exports.fill_ref_table()', 'fill_ref_table');
-  InspectorTest.log('Table populated.');
+    'instance.exports.fill_tables();', 'fill_tables');
+  await WasmInspectorTest.evalWithUrl(
+      `instance.exports.exported_func_table.set(0, new WebAssembly.Function(
+          {parameters:['i32', 'i32'], results: ['i32']},
+          function external_fct(a, b) { return a * b; }))`,
+      'add_func_to_table');
+  InspectorTest.log('Tables populated.');
 }
 
 async function waitForWasmScripts() {
diff --git a/deps/v8/test/inspector/inspector-test.cc b/deps/v8/test/inspector/inspector-test.cc
index 1784e48666b8b7..87c0066cf22784 100644
--- a/deps/v8/test/inspector/inspector-test.cc
+++ b/deps/v8/test/inspector/inspector-test.cc
@@ -512,6 +512,9 @@ class InspectorExtension : public InspectorIsolateData::SetupGlobalTask {
     inspector->Set(isolate, "callbackForTests",
                    v8::FunctionTemplate::New(
                        isolate, &InspectorExtension::CallbackForTests));
+    inspector->Set(isolate, "runNestedMessageLoop",
+                   v8::FunctionTemplate::New(
+                       isolate, &InspectorExtension::RunNestedMessageLoop));
     global->Set(isolate, "inspector", inspector);
   }
 
@@ -788,6 +791,15 @@ class InspectorExtension : public InspectorIsolateData::SetupGlobalTask {
         callback->Call(context, v8::Undefined(isolate), 0, nullptr);
     args.GetReturnValue().Set(result.ToLocalChecked());
   }
+
+  static void RunNestedMessageLoop(
+      const v8::FunctionCallbackInfo<v8::Value>& args) {
+    v8::Isolate* isolate = args.GetIsolate();
+    v8::Local<v8::Context> context = isolate->GetCurrentContext();
+    InspectorIsolateData* data = InspectorIsolateData::FromContext(context);
+
+    data->task_runner()->RunMessageLoop(true);
+  }
 };
 
 int InspectorTestMain(int argc, char* argv[]) {
diff --git a/deps/v8/test/inspector/inspector.status b/deps/v8/test/inspector/inspector.status
index a00bc3f450b944..b8bc9e2600e610 100644
--- a/deps/v8/test/inspector/inspector.status
+++ b/deps/v8/test/inspector/inspector.status
@@ -60,16 +60,6 @@
   'runtime/get-properties': [SKIP],
 }],  # not has_webassembly or variant == jitless
 
-##############################################################################
-['lite_mode or variant == jitless', {
-  # Lite mode does not allocate feedback vector.
-  'type-profiler/type-profile-start-stop': [SKIP],
-  'type-profiler/type-profile': [SKIP],
-  'type-profiler/type-profile-with-to-string-tag': [SKIP],
-  'type-profiler/type-profile-with-classes': [SKIP],
-  'type-profiler/type-profile-disable': [SKIP],
-}],  # 'lite_mode or variant == jitless'
-
 ##############################################################################
 ['variant == jitless', {
   # https://crbug.com/v8/7777
@@ -176,7 +166,6 @@
   'runtime/context-destroyed-on-context-collected': [SKIP],
   'runtime/evaluate-async': [SKIP],
   'runtime/internal-properties-entries': [SKIP],
-  'type-profiler/type-profile-start-stop': [SKIP],
 }], # gc_stress
 
 ##############################################################################
@@ -281,7 +270,8 @@
   'debugger/continue-to-location-target-call-frames': [SKIP],
   'debugger/destroy-in-break-program': [SKIP],
   'debugger/destroy-in-break-program2': [SKIP],
-  'debugger/destructuring': [SKIP],
+  'debugger/array-destructuring': [SKIP],
+  'debugger/object-destructuring': [SKIP],
   'debugger/disable-agent-on-pause': [SKIP],
   'debugger/doesnt-step-into-injected-script': [SKIP],
   'debugger/es6-module-liveedit': [SKIP],
@@ -528,11 +518,6 @@
   'sessions/runtime-evaluate': [SKIP],
   'sessions/runtime-evaluate-exception': [SKIP],
   'sessions/runtime-remote-object': [SKIP],
-  'type-profiler/type-profile': [SKIP],
-  'type-profiler/type-profile-disable': [SKIP],
-  'type-profiler/type-profile-start-stop': [SKIP],
-  'type-profiler/type-profile-with-classes': [SKIP],
-  'type-profiler/type-profile-with-to-string-tag': [SKIP],
   'regress/regress-crbug-1195927': [SKIP],
 }], # third_party_heap
 
@@ -553,4 +538,9 @@
   'debugger/value-unavailable-scopes': [SKIP],
 }], # lite_mode or variant in (nooptimization, jitless, assert_types)
 
+##############################################################################
+['single_generation', {
+  'heap-profiler/sampling-heap-profiler-flags': [SKIP],
+}], # single_generation
+
 ]
diff --git a/deps/v8/test/inspector/regress/regress-crbug-1246896.js b/deps/v8/test/inspector/regress/regress-crbug-1246896.js
index 6c70d44362ae51..822a194ce1852a 100644
--- a/deps/v8/test/inspector/regress/regress-crbug-1246896.js
+++ b/deps/v8/test/inspector/regress/regress-crbug-1246896.js
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// Flags: --no-experimental-remove-internal-scopes-property
+
 const {Protocol} = InspectorTest.start('Don\'t crash when getting the properties of a native function');
 
 (async () => {
diff --git a/deps/v8/test/inspector/regress/regress-crbug-1366843-expected.txt b/deps/v8/test/inspector/regress/regress-crbug-1366843-expected.txt
new file mode 100644
index 00000000000000..9e3f2ec0294db9
--- /dev/null
+++ b/deps/v8/test/inspector/regress/regress-crbug-1366843-expected.txt
@@ -0,0 +1 @@
+Don't crash when injected script dies during Promise.then
diff --git a/deps/v8/test/inspector/regress/regress-crbug-1366843.js b/deps/v8/test/inspector/regress/regress-crbug-1366843.js
new file mode 100644
index 00000000000000..0327a43e6172eb
--- /dev/null
+++ b/deps/v8/test/inspector/regress/regress-crbug-1366843.js
@@ -0,0 +1,26 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const { Protocol, contextGroup } = InspectorTest.start('Don\'t crash when injected script dies during Promise.then');
+
+(async () => {
+  // Overwrite 'Promise#then' to block.
+  contextGroup.addScript(`
+    Object.prototype.__defineGetter__('then', function () {
+      inspector.runNestedMessageLoop(); // Doesn't return.
+    });
+  `);
+
+  // Trigger an evaluation that installs the inspector promise handler. Note
+  // that the expression is somewhat carefully crafted so we stop in the right
+  // micro task.
+  Protocol.Runtime.evaluate({
+    expression: `(() => ({ foo: 42 }))()`,
+    awaitPromise: true,
+  });
+
+  contextGroup.reset();
+
+  InspectorTest.completeTest();
+})();
diff --git a/deps/v8/test/inspector/runtime/evaluate-repl-mode-broken-thenable-expected.txt b/deps/v8/test/inspector/runtime/evaluate-repl-mode-broken-thenable-expected.txt
new file mode 100644
index 00000000000000..c64abf7b04d899
--- /dev/null
+++ b/deps/v8/test/inspector/runtime/evaluate-repl-mode-broken-thenable-expected.txt
@@ -0,0 +1,6 @@
+Tests that REPL mode still works even with a broken Promise.prototype.then
+{
+    description : 42
+    type : number
+    value : 42
+}
diff --git a/deps/v8/test/inspector/runtime/evaluate-repl-mode-broken-thenable.js b/deps/v8/test/inspector/runtime/evaluate-repl-mode-broken-thenable.js
new file mode 100644
index 00000000000000..27393922d3e13a
--- /dev/null
+++ b/deps/v8/test/inspector/runtime/evaluate-repl-mode-broken-thenable.js
@@ -0,0 +1,20 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const {contextGroup, Protocol} = InspectorTest.start(
+  "Tests that REPL mode still works even with a broken Promise.prototype.then");
+
+(async function() {
+  contextGroup.addScript(`
+    Promise.prototype.then = () => {throw Error('you shall not evaluate')};
+  `);
+
+  const { result: { result }} = await Protocol.Runtime.evaluate({
+    expression: '42',
+    replMode: true,
+  });
+  InspectorTest.logMessage(result);
+
+  InspectorTest.completeTest();
+})();
diff --git a/deps/v8/test/inspector/runtime/evaluate-repl-mode-side-effecting-array-join-expected.txt b/deps/v8/test/inspector/runtime/evaluate-repl-mode-side-effecting-array-join-expected.txt
new file mode 100644
index 00000000000000..19ad7f863eeba9
--- /dev/null
+++ b/deps/v8/test/inspector/runtime/evaluate-repl-mode-side-effecting-array-join-expected.txt
@@ -0,0 +1,48 @@
+Tests that Runtime.evaluate with REPL mode correctly handles Array.prototype.join.
+{
+    id : <messageId>
+    result : {
+        result : {
+            className : Array
+            description : Array(1)
+            objectId : <objectId>
+            subtype : array
+            type : object
+        }
+    }
+}
+{
+    id : <messageId>
+    result : {
+        exceptionDetails : {
+            columnNumber : -1
+            exception : {
+                className : EvalError
+                description : EvalError: Possible side-effect in debug-evaluate
+                objectId : <objectId>
+                subtype : error
+                type : object
+            }
+            exceptionId : <exceptionId>
+            lineNumber : -1
+            scriptId : <scriptId>
+            text : Uncaught
+        }
+        result : {
+            className : EvalError
+            description : EvalError: Possible side-effect in debug-evaluate
+            objectId : <objectId>
+            subtype : error
+            type : object
+        }
+    }
+}
+{
+    id : <messageId>
+    result : {
+        result : {
+            type : string
+            value : /a/
+        }
+    }
+}
diff --git a/deps/v8/test/inspector/runtime/evaluate-repl-mode-side-effecting-array-join.js b/deps/v8/test/inspector/runtime/evaluate-repl-mode-side-effecting-array-join.js
new file mode 100644
index 00000000000000..05259ff24f4d95
--- /dev/null
+++ b/deps/v8/test/inspector/runtime/evaluate-repl-mode-side-effecting-array-join.js
@@ -0,0 +1,32 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let {Protocol} = InspectorTest.start(
+  'Tests that Runtime.evaluate with REPL mode correctly handles \
+Array.prototype.join.');
+
+Protocol.Runtime.enable();
+(async function () {
+  await evaluateReplWithSideEffects('a=[/a/]')
+  await evaluateRepl('a.toString()');
+  await evaluateReplWithSideEffects('a.toString()');
+
+  InspectorTest.completeTest();
+})();
+
+async function evaluateRepl(expression) {
+  InspectorTest.logMessage(await Protocol.Runtime.evaluate({
+    expression: expression,
+    replMode: true,
+    throwOnSideEffect: true
+  }));
+}
+
+async function evaluateReplWithSideEffects(expression) {
+  InspectorTest.logMessage(await Protocol.Runtime.evaluate({
+    expression: expression,
+    replMode: true,
+    throwOnSideEffect: false
+  }));
+}
diff --git a/deps/v8/test/inspector/runtime/function-scopes.js b/deps/v8/test/inspector/runtime/function-scopes.js
index bda069bd9aca2a..c382ccda472c9f 100644
--- a/deps/v8/test/inspector/runtime/function-scopes.js
+++ b/deps/v8/test/inspector/runtime/function-scopes.js
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// Flags: --no-experimental-remove-internal-scopes-property
+
 let {session, contextGroup, Protocol} = InspectorTest.start('Checks [[Scopes]] for functions');
 
 contextGroup.addScript(`
diff --git a/deps/v8/test/inspector/runtime/internal-properties.js b/deps/v8/test/inspector/runtime/internal-properties.js
index b4b0bc47fbed91..3e3ce4a197aec9 100644
--- a/deps/v8/test/inspector/runtime/internal-properties.js
+++ b/deps/v8/test/inspector/runtime/internal-properties.js
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// Flags: --no-experimental-remove-internal-scopes-property
+
 let {session, contextGroup, Protocol} = InspectorTest.start('Checks internal properties in Runtime.getProperties output');
 
 contextGroup.addScript(`
diff --git a/deps/v8/test/inspector/type-profiler/type-profile-disable-expected.txt b/deps/v8/test/inspector/type-profiler/type-profile-disable-expected.txt
deleted file mode 100644
index b70acbac0ecfd8..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile-disable-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Turn Profiler.startTypeProfile on and off.
-
-function g(/*Object*/a, /*Array*/b, /*null*/c) {
-  return 'bye';
-/*string*/};
-g({}, [], null);
-
-[
-]
\ No newline at end of file
diff --git a/deps/v8/test/inspector/type-profiler/type-profile-disable.js b/deps/v8/test/inspector/type-profiler/type-profile-disable.js
deleted file mode 100644
index e378c54e58602c..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile-disable.js
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-const source =
-  `
-function g(a, b, c) {
-  return 'bye';
-};
-g({}, [], null);
-`;
-
-let {session, contextGroup, Protocol} = InspectorTest.start("Turn " +
-  "Profiler.startTypeProfile on and off.");
-
-(async function testTypeProfile() {
-  Protocol.Runtime.enable();
-   let {result: {scriptId}} = await Protocol.Runtime.compileScript({
-    expression: source,
-    sourceURL: arguments.callee.name, persistScript: true
-  });
-  await Protocol.Profiler.enable();
-  // Start, run, take.
-  await Protocol.Profiler.startTypeProfile();
-  Protocol.Runtime.runScript({scriptId});
-
-  let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-  session.logTypeProfile(typeProfiles.result.result[0],
-    source);
-
-  // This should delete all data.
-  Protocol.Profiler.stopTypeProfile();
-
-  await Protocol.Profiler.startTypeProfile();
-  typeProfiles = await Protocol.Profiler.takeTypeProfile();
-
-  // Should be empty because no code was run since start.
-  InspectorTest.logMessage(typeProfiles.result.result);
-
-  Protocol.Profiler.stopTypeProfile();
-
-  Protocol.Profiler.disable();
-  await Protocol.Runtime.disable();
-  InspectorTest.completeTest();
-})();
diff --git a/deps/v8/test/inspector/type-profiler/type-profile-expected.txt b/deps/v8/test/inspector/type-profiler/type-profile-expected.txt
deleted file mode 100644
index 04fa128e8ee0d1..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Test collecting type profile data with Profiler.takeTypeProfile.
-
-function f(/*Object, number, undefined*/a, /*Array, number, null*/b, /*boolean, Object, symbol*/c) {
-  return 'bye';
-/*string*/};
-f({}, [], true);
-f(3, 2.3, {a: 42});
-f(undefined, null, Symbol('hello'));
-/*string*/
diff --git a/deps/v8/test/inspector/type-profiler/type-profile-start-stop-expected.txt b/deps/v8/test/inspector/type-profiler/type-profile-start-stop-expected.txt
deleted file mode 100644
index e04a4ec3df0681..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile-start-stop-expected.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-Turn Profiler.startTypeProfile on and off.
-
-Running test: testTypeProfile
-
-function g(/*Object*/a, /*Array*/b, /*null*/c) {
-  return 'first';
-/*string*/};
-g({}, [], null);
-
-
-Running test: testTypeProfileFromDifferentSource
-
-function f(/*null*/a) {
-  return 'second';
-/*string*/};
-f(null);
-
-
-Running test: testStopTypeProfileDeletesFeedback
-[
-]
-
-Running test: testTypeProfileWithoutStartingItFirst
-Type profile has not been started.
-
-Running test: testTypeProfileAfterStoppingIt
-Type profile has not been started.
-
-Running test: testStartTypeProfileAfterRunning
-{
-    id : <messageId>
-    result : {
-        result : [
-        ]
-    }
-}
-
-Running test: testTypeProfileForTwoSources
-
-function g(/*Object*/a, /*Array*/b, /*null*/c) {
-  return 'first';
-/*string*/};
-g({}, [], null);
-
-
-function f(/*null*/a) {
-  return 'second';
-/*string*/};
-f(null);
-
-Running test: testStopTwice
diff --git a/deps/v8/test/inspector/type-profiler/type-profile-start-stop.js b/deps/v8/test/inspector/type-profiler/type-profile-start-stop.js
deleted file mode 100644
index 88a2ad13bf995d..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile-start-stop.js
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2017 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-const source1 =
-  `
-function g(a, b, c) {
-  return 'first';
-};
-g({}, [], null);
-`;
-
-const source2 =
-  `
-function f(a) {
-  return 'second';
-};
-f(null);
-`;
-
-let {session, contextGroup, Protocol} = InspectorTest.start("Turn " +
-  "Profiler.startTypeProfile on and off.");
-
-InspectorTest.runAsyncTestSuite([
-  async function testTypeProfile() {
-    Protocol.Runtime.enable();
-    let {result: {scriptId}} = await Protocol.Runtime.compileScript({
-      expression: source1,
-      sourceURL: arguments.callee.name, persistScript: true
-    });
-    await Protocol.Profiler.enable();
-
-    // Start, run, take.
-    await Protocol.Profiler.startTypeProfile();
-    Protocol.Runtime.runScript({scriptId});
-
-    let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-    await session.logTypeProfile(typeProfiles.result.result[0],
-      source1);
-
-    Protocol.Profiler.stopTypeProfile();
-    Protocol.Profiler.disable();
-    await Protocol.Runtime.disable();
-  },
-  async function testTypeProfileFromDifferentSource() {
-    Protocol.Runtime.enable();
-    let {result: {scriptId}} = await Protocol.Runtime.compileScript({
-      expression: source2,
-      sourceURL: arguments.callee.name, persistScript: true
-    });
-    await Protocol.Profiler.enable();
-
-    // Start, run different script, take.
-    await Protocol.Profiler.startTypeProfile();
-    Protocol.Runtime.runScript({scriptId});
-
-    let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-    await session.logTypeProfile(typeProfiles.result.result[0],
-      source2);
-
-    Protocol.Profiler.stopTypeProfile();
-    Protocol.Profiler.disable();
-    await Protocol.Runtime.disable();
-  },
-  async function testStopTypeProfileDeletesFeedback() {
-    Protocol.Runtime.enable();
-    let {result: {scriptId}} = await Protocol.Runtime.compileScript({
-      expression: source1,
-      sourceURL: arguments.callee.name, persistScript: true
-    });
-    await Protocol.Profiler.enable();
-
-    // Start, run, stop.
-    await Protocol.Profiler.startTypeProfile();
-    Protocol.Runtime.runScript({scriptId});
-    await Protocol.Profiler.stopTypeProfile();
-
-    // Start, take. Should be empty, because no code was run.
-    await Protocol.Profiler.startTypeProfile();
-    let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-    InspectorTest.logMessage(typeProfiles.result.result);
-    await Protocol.Profiler.stopTypeProfile();
-
-    Protocol.Profiler.disable();
-    await Protocol.Runtime.disable();
-  },
-  async function testTypeProfileWithoutStartingItFirst() {
-    Protocol.Runtime.enable();
-    let {result: {scriptId}} = await Protocol.Runtime.compileScript({ expression: source1,
-      sourceURL: arguments.callee.name, persistScript: true });
-    Protocol.Runtime.runScript({ scriptId });
-    await Protocol.Profiler.enable();
-
-    // This should return an error because type profile was never started.
-    let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-    InspectorTest.logObject(typeProfiles.error.message);
-
-    Protocol.Profiler.disable();
-    await Protocol.Runtime.disable();
-  },
-  async function testTypeProfileAfterStoppingIt() {
-    Protocol.Runtime.enable();
-    let {result: {scriptId}} = await Protocol.Runtime.compileScript({ expression: source1,
-      sourceURL: arguments.callee.name, persistScript: true });
-    Protocol.Runtime.runScript({ scriptId });
-    await Protocol.Profiler.enable();
-    await Protocol.Profiler.startTypeProfile();
-
-    // Make sure that this turns off type profile.
-    await Protocol.Profiler.stopTypeProfile();
-
-    // This should return an error because type profile was stopped.
-    let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-    InspectorTest.logObject(typeProfiles.error.message);
-
-    Protocol.Profiler.disable();
-    await Protocol.Runtime.disable();
-  },
-  async function testStartTypeProfileAfterRunning() {
-    Protocol.Runtime.enable();
-    let {result: {scriptId}} = await Protocol.Runtime.compileScript({
-      expression: source1,
-      sourceURL: arguments.callee.name, persistScript: true
-    });
-    Protocol.Runtime.runScript({scriptId});
-
-    await Protocol.Profiler.enable();
-    await Protocol.Profiler.startTypeProfile();
-
-    let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-
-    // This should be empty because type profile was started after compilation.
-    // Only the outer script is annotated with return value "string" because
-    // that does not depend on runScript().
-    InspectorTest.logMessage(typeProfiles);
-
-    Protocol.Profiler.stopTypeProfile();
-    Protocol.Profiler.disable();
-    await Protocol.Runtime.disable();
-  },
-  async function testTypeProfileForTwoSources() {
-    Protocol.Runtime.enable();
-    let {result: {scriptId: scriptId1}} = await Protocol.Runtime.compileScript({
-      expression: source1,
-      sourceURL: arguments.callee.name, persistScript: true
-    });
-    let {result: {scriptId: scriptId2}} = await Protocol.Runtime.compileScript({
-      expression: source2,
-      sourceURL: arguments.callee.name, persistScript: true
-    });
-    await Protocol.Profiler.enable();
-
-    // Start, run different script, take.
-    await Protocol.Profiler.startTypeProfile();
-    Protocol.Runtime.runScript({scriptId: scriptId1});
-    Protocol.Runtime.runScript({scriptId: scriptId2});
-
-    let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-    await session.logTypeProfile(typeProfiles.result.result[0],
-      source1);
-    await session.logTypeProfile(typeProfiles.result.result[1],
-      source2);
-
-    Protocol.Profiler.stopTypeProfile();
-    Protocol.Profiler.disable();
-    await Protocol.Runtime.disable();
-  },
-  async function testStopTwice() {
-    Protocol.Runtime.enable();
-    await Protocol.Profiler.enable();
-    await Protocol.Profiler.stopTypeProfile();
-    await Protocol.Profiler.stopTypeProfile();
-    Protocol.Profiler.disable();
-    await Protocol.Runtime.disable();
-  },
-]);
diff --git a/deps/v8/test/inspector/type-profiler/type-profile-with-classes-expected.txt b/deps/v8/test/inspector/type-profiler/type-profile-with-classes-expected.txt
deleted file mode 100644
index 8c540617f1df69..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile-with-classes-expected.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-Test collecting type profile data with Profiler.takeTypeProfile.
-
-function f(/*number*/n) {
-/*undefined*/};
-f(5);
-function g(/*Object, number*/a, /*Array, number*/b, /*Flower, Object*/c) {
-  return 'bye';
-/*string*/};
-/*undefined*/class Tree {};
-/*Flower*/class Flower extends Tree{};
-var f = new Flower();
-f.constructor = {};
-f.constructor.name = "Not a flower.";
-g({}, [], f);
-g(3, 2.3, {a: 42});
-/*string*/
diff --git a/deps/v8/test/inspector/type-profiler/type-profile-with-classes.js b/deps/v8/test/inspector/type-profiler/type-profile-with-classes.js
deleted file mode 100644
index 0e75b7db09ed3d..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile-with-classes.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-const source =
-  `
-function f(n) {
-};
-f(5);
-function g(a, b, c) {
-  return 'bye';
-};
-class Tree {};
-class Flower extends Tree{};
-var f = new Flower();
-f.constructor = {};
-f.constructor.name = "Not a flower.";
-g({}, [], f);
-g(3, 2.3, {a: 42});
-`;
-
-let {session, contextGroup, Protocol} = InspectorTest.start("Test collecting type profile data with Profiler.takeTypeProfile.");
-
-(async function testTypeProfile(next) {
-  await Protocol.Profiler.enable();
-  await Protocol.Profiler.startTypeProfile();
-
-  Protocol.Runtime.enable();
-  let {result: {scriptId}} = await Protocol.Runtime.compileScript({ expression: source,
-    sourceURL: arguments.callee.name, persistScript: true });
-
-  Protocol.Runtime.runScript({ scriptId });
-
-  let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-  await session.logTypeProfile(typeProfiles.result.result[0],
-    source);
-
-  Protocol.Profiler.disable();
-  await Protocol.Runtime.disable();
-  InspectorTest.completeTest();
-})();
diff --git a/deps/v8/test/inspector/type-profiler/type-profile-with-to-string-tag-expected.txt b/deps/v8/test/inspector/type-profiler/type-profile-with-to-string-tag-expected.txt
deleted file mode 100644
index 16999557266e31..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile-with-to-string-tag-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-Test collecting type profile data with Profiler.takeTypeProfile.
-
-function g(/*Object, number*/a, /*Array, number*/b, /*Dog, Object*/c) {
-  return 'bye';
-/*string*/};
-/*undefined*/class Tree {};
-/*Flower*/class Flower extends Tree{};
-var f = new Flower();
-// We store the type when a variable is used. If a toStringTag is
-// changes the type, we want to collect that changed feedback.
-// This tests ensures that we collect that information rather than
-// for example infer the types from the internal map, which wouldn't
-// know about a toStringTag.
-f[Symbol.toStringTag] = 'Dog';
-g({}, [], f);
-g(3, 2.3, {a: 42});
-/*string*/
diff --git a/deps/v8/test/inspector/type-profiler/type-profile-with-to-string-tag.js b/deps/v8/test/inspector/type-profiler/type-profile-with-to-string-tag.js
deleted file mode 100644
index d6d5b6d53819b2..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile-with-to-string-tag.js
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-const source =
-  `
-function g(a, b, c) {
-  return 'bye';
-};
-class Tree {};
-class Flower extends Tree{};
-var f = new Flower();
-// We store the type when a variable is used. If a toStringTag is
-// changes the type, we want to collect that changed feedback.
-// This tests ensures that we collect that information rather than
-// for example infer the types from the internal map, which wouldn't
-// know about a toStringTag.
-f[Symbol.toStringTag] = 'Dog';
-g({}, [], f);
-g(3, 2.3, {a: 42});
-`;
-
-let {session, contextGroup, Protocol} = InspectorTest.start("Test collecting " +
-  "type profile data with Profiler.takeTypeProfile.");
-
-(async function testTypeProfile() {
-  await Protocol.Profiler.enable();
-  await Protocol.Profiler.startTypeProfile();
-
-  Protocol.Runtime.enable();
-  let {result: {scriptId}} = await Protocol.Runtime.compileScript({ expression: source,
-    sourceURL: arguments.callee.name, persistScript: true });
-  Protocol.Runtime.runScript({ scriptId });
-  await Protocol.Profiler.startTypeProfile();
-
-  let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-  await session.logTypeProfile(typeProfiles.result.result[0],
-    source);
-
-  Protocol.Profiler.stopTypeProfile();
-  Protocol.Profiler.disable();
-  await Protocol.Runtime.disable();
-  InspectorTest.completeTest();
-})();
diff --git a/deps/v8/test/inspector/type-profiler/type-profile.js b/deps/v8/test/inspector/type-profiler/type-profile.js
deleted file mode 100644
index c8ae080b1b40a0..00000000000000
--- a/deps/v8/test/inspector/type-profiler/type-profile.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2017 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-const source =
-  `
-function f(a, b, c) {
-  return 'bye';
-};
-f({}, [], true);
-f(3, 2.3, {a: 42});
-f(undefined, null, Symbol('hello'));
-`;
-
-let {session, contextGroup, Protocol} = InspectorTest.start("Test collecting type profile data with Profiler.takeTypeProfile.");
-
-(async function testTypeProfile() {
-  await Protocol.Profiler.enable();
-  await Protocol.Profiler.startTypeProfile();
-
-  Protocol.Runtime.enable();
-  let {result: {scriptId}} = await Protocol.Runtime.compileScript({
-    expression: source,
-    sourceURL: arguments.callee.name,
-    persistScript: true
-  });
-  Protocol.Runtime.runScript({ scriptId });
-
-  let typeProfiles = await Protocol.Profiler.takeTypeProfile();
-  await session.logTypeProfile(typeProfiles.result.result[0],
-    source);
-
-  Protocol.Profiler.stopTypeProfile();
-  Protocol.Profiler.disable();
-  await Protocol.Runtime.disable();
-  InspectorTest.completeTest();
-})();
diff --git a/deps/v8/test/intl/number-format/use-grouping-v3.js b/deps/v8/test/intl/number-format/use-grouping-v3.js
index 83b0062031c9f5..0b1f7686d5ac66 100644
--- a/deps/v8/test/intl/number-format/use-grouping-v3.js
+++ b/deps/v8/test/intl/number-format/use-grouping-v3.js
@@ -11,21 +11,32 @@ let validUseGrouping = [
     false,
 ];
 
+let fallbackUseGrouping = [
+    "true",
+    "false",
+];
+
 let invalidUseGrouping = [
     "min-2",
-    "true",
 ];
 
+
 validUseGrouping.forEach(function(useGrouping) {
   let nf = new Intl.NumberFormat(undefined, {useGrouping});
   assertEquals(useGrouping, nf.resolvedOptions().useGrouping);
 });
 
-invalidUseGrouping.forEach(function(useGrouping) {
+fallbackUseGrouping.forEach(function(useGrouping) {
   let nf = new Intl.NumberFormat(undefined, {useGrouping});
   assertEquals("auto", nf.resolvedOptions().useGrouping);
 });
 
+invalidUseGrouping.forEach(function(useGrouping) {
+  assertThrows(
+      () => new Intl.NumberFormat(undefined, {useGrouping}),
+      RangeError);
+});
+
 // useGrouping: undefined get "auto"
 assertEquals("auto",
     (new Intl.NumberFormat()).resolvedOptions().useGrouping);
diff --git a/deps/v8/test/intl/regress-13494.js b/deps/v8/test/intl/regress-13494.js
new file mode 100644
index 00000000000000..d1446aff073a15
--- /dev/null
+++ b/deps/v8/test/intl/regress-13494.js
@@ -0,0 +1,47 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Test the new Date( date.toLocaleString("en-US")) is not invalid.
+// This is not guaranteed by the standard but many code use that to set the
+// timezone as suggested in
+// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone
+
+let d = new Date();
+
+// https://tc39.es/ecma262/#sec-todatestring
+// 21.4.4.41.4 ToDateString ( tv )
+// 1. If tv is NaN, return "Invalid Date".
+let invalid = "Invalid Date";
+let largestDiff = 25*60*60*1000;
+
+let garbage = new Date("garbage");
+assertTrue(invalid == garbage);
+assertEquals(NaN, garbage.getTime());
+
+let d1 = new Date(d.toLocaleString("en-US"));
+assertTrue(d1 != invalid);
+assertTrue(d1.getTime() != NaN);
+// The milliseconds are different between d1 and d.
+assertTrue(Math.abs(d1-d) < 1000);
+
+// Force a version of date string which have  U+202f before AM
+let nnbsp_am = new Date("11/16/2022, 9:04:55\u202fAM");
+assertTrue(nnbsp_am  != invalid);
+assertTrue(nnbsp_am.getTime() != NaN);
+// Force a version of date string which have  U+202f before PM
+let nnbsp_pm = new Date("11/16/2022, 9:04:55\u202fPM");
+assertTrue(nnbsp_pm  != invalid);
+assertTrue(nnbsp_pm.getTime() != NaN);
+
+let d2 = new Date(d.toLocaleString("en-US", {timeZone: "Asia/Taipei"}));
+assertTrue(d2 != invalid);
+assertTrue(d2.getTime() != NaN);
+// The differences should be within 25 hours.
+assertTrue(Math.abs(d2-d) < largestDiff);
+
+let d3 = new Date(d.toLocaleString("en-US", {timeZone: "Africa/Lusaka"}));
+assertTrue(d3 != invalid);
+assertTrue(d3.getTime() != NaN);
+// The differences should be within 25 hours.
+assertTrue(Math.abs(d3-d) < largestDiff);
diff --git a/deps/v8/test/js-perf-test/BigInt/add-no-opt.js b/deps/v8/test/js-perf-test/BigInt/add-no-opt.js
new file mode 100644
index 00000000000000..2c0fddda45d0a1
--- /dev/null
+++ b/deps/v8/test/js-perf-test/BigInt/add-no-opt.js
@@ -0,0 +1,75 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+"use strict";
+
+d8.file.execute('bigint-util.js');
+
+let random_bigints = [];
+
+// This dummy ensures that the feedback for benchmark.run() in the Measure
+// function from base.js is not monomorphic, thereby preventing the benchmarks
+// below from being inlined. This ensures consistent behavior and comparable
+// results.
+new BenchmarkSuite('Prevent-Inline-Dummy', [10000], [
+  new Benchmark('Prevent-Inline-Dummy', true, false, 0, () => {})
+]);
+
+
+new BenchmarkSuite(`Add-Small`, [1000], [
+  new Benchmark(`Add-Small`, true, false, 0, TestAdd,
+    () => SetUpRandomBigInts(32))
+]);
+
+
+new BenchmarkSuite(`Add-Large`, [1000], [
+  new Benchmark(`Add-Large`, true, false, 0, TestAdd,
+    () => SetUpRandomBigInts(8192))
+]);
+
+
+new BenchmarkSuite(`Add-LargerThanSmall`, [1000], [
+  new Benchmark(`Add-LargerThanSmall`, true, false, 0, TestAdd,
+    () => SetUpRandomBigInts(68))
+]);
+
+
+new BenchmarkSuite(`Add-Random`, [1000], [
+  new Benchmark(`Add-Random`, true, false, 0, TestAdd,
+    SetUpTestAddRandom)
+]);
+
+
+function SetUpRandomBigInts(bits) {
+  random_bigints = [];
+  // RandomBigIntWithBits needs multiples of 4 bits.
+  bits = Math.floor(bits / 4) * 4;
+  for (let i = 0; i < TEST_ITERATIONS; ++i) {
+    const bigint = RandomBigIntWithBits(bits);
+    random_bigints.push(Math.random() < 0.5 ? -bigint : bigint);
+  }
+}
+
+
+function SetUpTestAddRandom() {
+  random_bigints = [];
+  // RandomBigIntWithBits needs multiples of 4 bits.
+  const max_in_4bits = RANDOM_BIGINTS_MAX_BITS / 4;
+  for (let i = 0; i < TEST_ITERATIONS; ++i) {
+    const bits = Math.floor(Math.random() * max_in_4bits) * 4;
+    const bigint = RandomBigIntWithBits(bits);
+    random_bigints.push(Math.random() < 0.5 ? -bigint : bigint);
+  }
+}
+
+
+function TestAdd() {
+  let sum = 0n;
+
+  for (let i = 0; i < TEST_ITERATIONS - 1; ++i) {
+    sum += random_bigints[i] + random_bigints[i + 1];
+  }
+
+  return sum;
+}
diff --git a/deps/v8/test/js-perf-test/BigInt/bitwise-and.js b/deps/v8/test/js-perf-test/BigInt/bitwise-and.js
index aa5fb400cdd33c..d945b6e32bc2f1 100644
--- a/deps/v8/test/js-perf-test/BigInt/bitwise-and.js
+++ b/deps/v8/test/js-perf-test/BigInt/bitwise-and.js
@@ -54,7 +54,7 @@ function TestBitwiseAndZero() {
 function SetUpTestBitwiseAndSmall() {
   random_bigints = [];
   for (let i = 0; i < TEST_ITERATIONS; ++i) {
-    const bigint = RandomBigIntWithBits(64);
+    const bigint = RandomBigIntWithBits(60);
     random_bigints.push(Math.random() < 0.5 ? -bigint : bigint);
   }
 }
diff --git a/deps/v8/test/js-perf-test/BigInt/divide.js b/deps/v8/test/js-perf-test/BigInt/divide.js
index 2fcf18b9de862a..aaa89a6a4de71b 100644
--- a/deps/v8/test/js-perf-test/BigInt/divide.js
+++ b/deps/v8/test/js-perf-test/BigInt/divide.js
@@ -6,7 +6,7 @@
 
 d8.file.execute('bigint-util.js');
 
-let random_dividends = []
+let random_dividends = [];
 let random_divisors = [];
 
 // This dummy ensures that the feedback for benchmark.run() in the Measure
@@ -30,7 +30,8 @@ new BenchmarkSuite('Divide-Small', [1000], [
 
 
 new BenchmarkSuite('Divide-Small-Truncated', [1000], [
-  new Benchmark('Divide-Small-Truncated', true, false, 0, TestDivideSmallTruncated)
+  new Benchmark('Divide-Small-Truncated', true, false, 0,
+    TestDivideSmallTruncated, SetUpTestDivideSmall)
 ]);
 
 
@@ -54,7 +55,7 @@ function TestDivideOne() {
 function SetUpTestDivideSmall() {
   random_dividends = [];
   for (let i = 0; i < TEST_ITERATIONS; ++i) {
-    const bigint = RandomBigIntWithBits(64);
+    const bigint = RandomBigIntWithBits(60);
     random_dividends.push(Math.random() < 0.5 ? -bigint : bigint);
   }
 
diff --git a/deps/v8/test/js-perf-test/JSTests1.json b/deps/v8/test/js-perf-test/JSTests1.json
index f35a6e5c6af108..e9d90ba4676e29 100644
--- a/deps/v8/test/js-perf-test/JSTests1.json
+++ b/deps/v8/test/js-perf-test/JSTests1.json
@@ -128,6 +128,20 @@
             { "name": "Add-Random" }
           ]
         },
+        {
+          "name": "Add-No-Opt",
+          "main": "run.js",
+          "flags": ["--allow-natives-syntax", "--no-turbofan"],
+          "resources": ["add-no-opt.js", "bigint-util.js"],
+          "test_flags": ["add-no-opt"],
+          "results_regexp": "^BigInt\\-%s\\(Score\\): (.+)$",
+          "tests": [
+            { "name": "Add-Small" },
+            { "name": "Add-Large" },
+            { "name": "Add-LargerThanSmall" },
+            { "name": "Add-Random" }
+          ]
+        },
         {
           "name": "Subtract",
           "main": "run.js",
diff --git a/deps/v8/test/message/fail/weak-refs-register1.out b/deps/v8/test/message/fail/weak-refs-register1.out
index aa4cbc2fa22e1e..7e7bf12791be2d 100644
--- a/deps/v8/test/message/fail/weak-refs-register1.out
+++ b/deps/v8/test/message/fail/weak-refs-register1.out
@@ -1,6 +1,6 @@
-*%(basename)s:*: TypeError: FinalizationRegistry.prototype.register: target must be an object
+*%(basename)s:*: TypeError: FinalizationRegistry.prototype.register: invalid target
 fg.register(1);
    ^
-TypeError: FinalizationRegistry.prototype.register: target must be an object
+TypeError: FinalizationRegistry.prototype.register: invalid target
     at FinalizationRegistry.register (<anonymous>)
     at *%(basename)s:*:4
diff --git a/deps/v8/test/message/fail/weak-refs-unregister.out b/deps/v8/test/message/fail/weak-refs-unregister.out
index 52945869838778..a6a66ea709d747 100644
--- a/deps/v8/test/message/fail/weak-refs-unregister.out
+++ b/deps/v8/test/message/fail/weak-refs-unregister.out
@@ -1,6 +1,6 @@
-*%(basename)s:*: TypeError: unregisterToken ('1') must be an object
+*%(basename)s:*: TypeError: Invalid unregisterToken ('1')
 fg.unregister(1);
    ^
-TypeError: unregisterToken ('1') must be an object
+TypeError: Invalid unregisterToken ('1')
     at FinalizationRegistry.unregister (<anonymous>)
     at *%(basename)s:*:4
diff --git a/deps/v8/test/mjsunit/collect-type-profile-undefined-feedback-vector.js b/deps/v8/test/mjsunit/collect-type-profile-undefined-feedback-vector.js
deleted file mode 100644
index f78f241c74ed0f..00000000000000
--- a/deps/v8/test/mjsunit/collect-type-profile-undefined-feedback-vector.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2020 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Flags: --allow-natives-syntax
-
-function f(a, b, c) {
-  return 'bye';
-};
-
-%CollectTypeProfile(0, f, undefined);
diff --git a/deps/v8/test/mjsunit/compiler/bigint-multiply-truncate.js b/deps/v8/test/mjsunit/compiler/bigint-multiply-truncate.js
index 6f25571591db0c..0d100e399b60b1 100644
--- a/deps/v8/test/mjsunit/compiler/bigint-multiply-truncate.js
+++ b/deps/v8/test/mjsunit/compiler/bigint-multiply-truncate.js
@@ -10,8 +10,6 @@ function TestMultiplyAndTruncate(a, b) {
 
 function OptimizeAndTest(fn) {
   let bi = 2n ** (2n ** 29n);
-  // Before optimization, a BigIntTooBig exception is expected
-  assertThrows(() => fn(bi + 3n, bi + 4n), RangeError);
   if (%Is64Bit()) {
     %PrepareFunctionForOptimization(fn);
     assertEquals(-4n, fn(3n, 4n));
diff --git a/deps/v8/test/mjsunit/compiler/bigint-rematerialize.js b/deps/v8/test/mjsunit/compiler/bigint-rematerialize.js
new file mode 100644
index 00000000000000..08b7b080a35f12
--- /dev/null
+++ b/deps/v8/test/mjsunit/compiler/bigint-rematerialize.js
@@ -0,0 +1,156 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --turbofan --no-always-turbofan
+
+(function OptimizeAndTestAsUintN() {
+  function f(x) {
+    // Will be lowered to Int64Constant(-1) and stored as an immediate.
+    let y = BigInt.asUintN(64, -1n);
+    try {
+      return x + y;
+    } catch(_) {
+      return y;
+    }
+  }
+
+  %PrepareFunctionForOptimization(f);
+  assertEquals(2n ** 64n, f(1n));
+  assertEquals(2n ** 64n + 1n, f(2n));
+  %OptimizeFunctionOnNextCall(f);
+  assertEquals(2n ** 64n, f(1n));
+  assertOptimized(f);
+  // Should be rematerialized to 2n ** 64n - 1n in code generation.
+  assertEquals(2n ** 64n - 1n, f(0));
+  if (%Is64Bit()) {
+    assertUnoptimized(f);
+  }
+})();
+
+(function OptimizeAndTestAsUintN() {
+  function f(x) {
+    // Will be lowered to Int64Sub because exponentiation is not truncated and
+    // stored in a register.
+    let y = BigInt.asUintN(64, -(2n ** 0n));
+    try {
+      return x + y;
+    } catch(_) {
+      return y;
+    }
+  }
+
+  %PrepareFunctionForOptimization(f);
+  assertEquals(2n ** 64n, f(1n));
+  assertEquals(2n ** 64n + 1n, f(2n));
+  %OptimizeFunctionOnNextCall(f);
+  assertEquals(2n ** 64n, f(1n));
+  assertOptimized(f);
+  // Should be rematerialized to 2n ** 64n - 1n in deoptimization.
+  assertEquals(2n ** 64n - 1n, f(0));
+  if (%Is64Bit()) {
+    assertUnoptimized(f);
+  }
+})();
+
+(function OptimizeAndTestAsUintN() {
+  function f(x) {
+    // Will be lowered to Int64Sub because exponentiation is not truncated and
+    // stored in a stack slot.
+    let y = BigInt.asUintN(64, -(2n ** 0n));
+    try {
+      // The recursion is used to make sure `y` is stored on the stack.
+      return (x < 3n) ? (x + y) : f(x - 1n);
+    } catch(_) {
+      return y;
+    }
+  }
+
+  %PrepareFunctionForOptimization(f);
+  assertEquals(2n ** 64n, f(1n));
+  assertEquals(2n ** 64n + 1n, f(2n));
+  %OptimizeFunctionOnNextCall(f);
+  assertEquals(2n ** 64n, f(1n));
+  assertOptimized(f);
+  // Should be rematerialized to 2n ** 64n - 1n in deoptimization.
+  assertEquals(2n ** 64n - 1n, f(0));
+  if (%Is64Bit()) {
+    assertUnoptimized(f);
+  }
+})();
+
+(function OptimizeAndTestAsIntN() {
+  function f(x) {
+    // Will be lowered to Int64Constant(-1) and stored as an immediate.
+    let y = BigInt.asIntN(64, -1n);
+    try {
+      return x + y;
+    } catch (_) {
+      return y;
+    }
+  }
+
+  %PrepareFunctionForOptimization(f);
+  assertEquals(0n, f(1n));
+  assertEquals(1n, f(2n));
+  %OptimizeFunctionOnNextCall(f);
+  assertEquals(0n, f(1n));
+  assertOptimized(f);
+  // Should be rematerialized to -1n in code generation.
+  assertEquals(-1n, f(0));
+  if (%Is64Bit()) {
+    assertUnoptimized(f);
+  }
+})();
+
+(function OptimizeAndTestAsIntN() {
+  function f(x) {
+    // Will be lowered to Int64Sub because exponentiation is not truncated and
+    // stored in a register.
+    let y = BigInt.asIntN(64, -(2n ** 0n));
+    try {
+      return x + y;
+    } catch(_) {
+      return y;
+    }
+  }
+
+  %PrepareFunctionForOptimization(f);
+  assertEquals(0n, f(1n));
+  assertEquals(1n, f(2n));
+  %OptimizeFunctionOnNextCall(f);
+  assertEquals(0n, f(1n));
+  assertOptimized(f);
+  // Should be rematerialized to -1n in deoptimization.
+  assertEquals(-1n, f(0));
+  if (%Is64Bit()) {
+    assertUnoptimized(f);
+  }
+})();
+
+(function OptimizeAndTestAsIntN() {
+
+  function f(x) {
+    // Will be lowered to Int64Sub because exponentiation is not truncated and
+    // stored in a stack slot.
+    let y = BigInt.asIntN(64, -(2n ** 0n));
+    try {
+      // The recursion is used to make sure `y` is stored on the stack.
+      return (x < 3n) ? (x + y) : f(x - 1n);
+    } catch(_) {
+      return y;
+    }
+  }
+
+  %PrepareFunctionForOptimization(f);
+  assertEquals(0n, f(1n));
+  assertEquals(1n, f(2n));
+  %OptimizeFunctionOnNextCall(f);
+  assertEquals(0n, f(1n));
+  assertOptimized(f);
+  // Should be rematerialized to -1n in deoptimization.
+  assertEquals(-1n, f(0));
+  if (%Is64Bit()) {
+    assertUnoptimized(f);
+  }
+})();
diff --git a/deps/v8/test/mjsunit/compiler/bigint-unused-still-throws.js b/deps/v8/test/mjsunit/compiler/bigint-unused-still-throws.js
new file mode 100644
index 00000000000000..774f5ab3d508c7
--- /dev/null
+++ b/deps/v8/test/mjsunit/compiler/bigint-unused-still-throws.js
@@ -0,0 +1,73 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --turbofan
+
+function WarmupAndOptimize(f)  {
+  %PrepareFunctionForOptimization(f);
+  f(1n, 1n);
+  %OptimizeFunctionOnNextCall(f);
+  f(1n, 1n);
+  assertOptimized(f);
+}
+%NeverOptimizeFunction(WarmupAndOptimize);
+
+function TestBinary(f) {
+  WarmupAndOptimize(f);
+  assertThrows(() => { f(1, 1n); }, TypeError);
+  // Recompile in case the above deopts.
+  WarmupAndOptimize(f);
+  assertThrows(() => { f(1n, 1); }, TypeError);
+}
+%NeverOptimizeFunction(TestBinary);
+
+function Add(a, b) {
+  let [c] = [1n];
+  let temp = 0n;
+  temp = a + c;
+  temp = c + b;
+  temp = 42n;
+  result = temp;
+}
+TestBinary(Add);
+
+function Subtract(a, b) {
+  let [c] = [1n];
+  let temp = 0n;
+  temp = a - c;
+  temp = c - b;
+  temp = 42n;
+  result = temp;
+}
+TestBinary(Subtract);
+
+function Multiply(a, b) {
+  let [c] = [1n];
+  let temp = 0n;
+  temp = a * c;
+  temp = c * b;
+  temp = 42n;
+  result = temp;
+}
+TestBinary(Multiply);
+
+function Divide(a, b) {
+  let [c] = [1n];
+  let temp = 0n;
+  temp = a / c;
+  temp = c / b;
+  temp = 42n;
+  result = temp;
+}
+TestBinary(Divide);
+
+function BitwiseAnd(a, b) {
+  let [c] = [1n];
+  let temp = 0n;
+  temp = a & c;
+  temp = c & b;
+  temp = 42n;
+  result = temp;
+}
+TestBinary(BitwiseAnd);
diff --git a/deps/v8/test/mjsunit/compiler/bigint64-add-no-deopt-loop.js b/deps/v8/test/mjsunit/compiler/bigint64-add-no-deopt-loop.js
new file mode 100644
index 00000000000000..53f1f106c92495
--- /dev/null
+++ b/deps/v8/test/mjsunit/compiler/bigint64-add-no-deopt-loop.js
@@ -0,0 +1,61 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --turbofan --no-always-turbofan
+
+(function OptimizeAndTest() {
+  function f(x, y) {
+    return x + y;
+  }
+  %PrepareFunctionForOptimization(f);
+  assertEquals(1n, f(0n, 1n));
+  assertEquals(5n, f(2n, 3n));
+  %OptimizeFunctionOnNextCall(f);
+  assertEquals(9n, f(4n, 5n));
+  assertOptimized(f);
+  // CheckBigInt64 should trigger deopt.
+  assertEquals(-(2n ** 63n), f(-(2n ** 63n), 0n));
+  if (%Is64Bit()) {
+    assertUnoptimized(f);
+
+    %PrepareFunctionForOptimization(f);
+    assertEquals(1n, f(0n, 1n));
+    assertEquals(5n, f(2n, 3n));
+    %OptimizeFunctionOnNextCall(f);
+    assertEquals(9n, f(4n, 5n));
+    assertOptimized(f);
+    // Ensure there is no deopt loop.
+    assertEquals(-(2n ** 63n), f(-(2n ** 63n), 0n));
+    assertOptimized(f);
+  }
+})();
+
+(function OptimizeAndTestOverflow() {
+  function f(x, y) {
+    return x + y;
+  }
+  %PrepareFunctionForOptimization(f);
+  assertEquals(1n, f(0n, 1n));
+  assertEquals(5n, f(2n, 3n));
+  %OptimizeFunctionOnNextCall(f);
+  assertEquals(9n, f(4n, 5n));
+  assertOptimized(f);
+  assertEquals(-(2n ** 63n), f(-(2n ** 62n), -(2n ** 62n)));
+  assertOptimized(f);
+  // CheckedBigInt64Add will trigger deopt due to overflow.
+  assertEquals(-(2n ** 63n) - 1n, f(-(2n ** 62n + 1n), -(2n ** 62n)));
+  if (%Is64Bit()) {
+    assertUnoptimized(f);
+
+    %PrepareFunctionForOptimization(f);
+    assertEquals(1n, f(0n, 1n));
+    assertEquals(5n, f(2n, 3n));
+    %OptimizeFunctionOnNextCall(f);
+    assertEquals(9n, f(4n, 5n));
+    assertOptimized(f);
+    // Ensure there is no deopt loop.
+    assertEquals(-(2n ** 63n) - 1n, f(-(2n ** 62n + 1n), -(2n ** 62n)));
+    assertOptimized(f);
+  }
+})();
diff --git a/deps/v8/test/mjsunit/compiler/fast-api-annotations.js b/deps/v8/test/mjsunit/compiler/fast-api-annotations.js
index cb95c9420e9392..3fcfb83835f1c7 100644
--- a/deps/v8/test/mjsunit/compiler/fast-api-annotations.js
+++ b/deps/v8/test/mjsunit/compiler/fast-api-annotations.js
@@ -40,10 +40,16 @@ assertEquals(limits_result, add_all_annotate_enforce_range(limits_params));
 %OptimizeFunctionOnNextCall(add_all_annotate_enforce_range);
 assertEquals(limits_result, add_all_annotate_enforce_range(limits_params));
 
+const min_int32 = -(2 ** 31);
+const max_int32 = 2 ** 31 - 1;
+const min_uint32 = 0;
+const max_uint32 = 2 ** 32 - 1;
+
 // ----------- enforce_range_compare -----------
 // `enforce_range_compare` has the following signature:
-// double enforce_range_compare(bool /*should_fallback*/,
-//   double, int64_t)
+// bool enforce_range_compare(bool /*in_range*/,
+//   double, integer_type)
+// where integer_type = {int32_t, uint32_t, int64_t, uint64_t}
 
 // ----------- i32 -----------
 function compare_i32(in_range, arg) {
@@ -125,3 +131,105 @@ assertThrows(() => compare_u64(false, -1));
 assertThrows(() => compare_u64(false, -1.5));
 assertThrows(() => compare_u64(false, Number.MIN_SAFE_INTEGER));
 assertThrows(() => compare_u64(false, 2 ** 64 + 3.15));
+
+// ----------- clamp_compare -----------
+// `clamp_compare` has the following signature:
+// void clamp_compare(bool /*in_range*/,
+//   double, integer_type)
+// where integer_type = {int32_t, uint32_t, int64_t, uint64_t}
+
+// ----------- i32 -----------
+function is_in_range_i32(in_range, arg, expected) {
+  let result = fast_c_api.clamp_compare_i32(in_range, arg, arg);
+
+  assertEquals(expected, result);
+}
+
+%PrepareFunctionForOptimization(is_in_range_i32);
+is_in_range_i32(true, 123, 123);
+%OptimizeFunctionOnNextCall(is_in_range_i32);
+is_in_range_i32(true, 123, 123);
+is_in_range_i32(true, -0.5, 0);
+is_in_range_i32(true, 0.5, 0);
+is_in_range_i32(true, 1.5, 2);
+is_in_range_i32(true, min_int32, min_int32);
+is_in_range_i32(true, max_int32, max_int32);
+// Slow path doesn't perform clamping.
+if (isOptimized(is_in_range_i32)) {
+  is_in_range_i32(false, -(2 ** 32), min_int32);
+  is_in_range_i32(false, -(2 ** 32 + 1), min_int32);
+  is_in_range_i32(false, 2 ** 32, max_int32);
+  is_in_range_i32(false, 2 ** 32 + 3.15, max_int32);
+  is_in_range_i32(false, Number.MIN_SAFE_INTEGER, min_int32);
+  is_in_range_i32(false, Number.MAX_SAFE_INTEGER, max_int32);
+}
+
+// ----------- u32 -----------
+function is_in_range_u32(in_range, arg, expected) {
+  let result = fast_c_api.clamp_compare_u32(in_range, arg, arg);
+
+  assertEquals(expected, result);
+}
+
+%PrepareFunctionForOptimization(is_in_range_u32);
+is_in_range_u32(true, 123, 123);
+%OptimizeFunctionOnNextCall(is_in_range_u32);
+is_in_range_u32(true, 123, 123);
+is_in_range_u32(true, 0, 0);
+is_in_range_u32(true, -0.5, 0);
+is_in_range_u32(true, 0.5, 0);
+is_in_range_u32(true, 2 ** 32 - 1, max_uint32);
+is_in_range_u32(false, -(2 ** 31), min_uint32);
+is_in_range_u32(false, 2 ** 32, max_uint32);
+is_in_range_u32(false, -1, min_uint32);
+is_in_range_u32(false, -1.5, min_uint32);
+is_in_range_u32(false, Number.MIN_SAFE_INTEGER, min_uint32);
+is_in_range_u32(false, Number.MAX_SAFE_INTEGER, max_uint32);
+
+// ----------- i64 -----------
+function is_in_range_i64(in_range, arg, expected) {
+  let result = fast_c_api.clamp_compare_i64(in_range, arg, arg);
+  assertEquals(expected, result);
+}
+
+%PrepareFunctionForOptimization(is_in_range_i64);
+is_in_range_i64(true, 123, 123);
+%OptimizeFunctionOnNextCall(is_in_range_i64);
+is_in_range_i64(true, 123, 123);
+is_in_range_i64(true, -0.5, 0);
+is_in_range_i64(true, 0.5, 0);
+is_in_range_i64(true, 1.5, 2);
+is_in_range_i64(true, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER);
+is_in_range_i64(true, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);
+is_in_range_i64(false, -(2 ** 63), Number.MIN_SAFE_INTEGER);
+is_in_range_i64(false, 2 ** 63 - 1024, Number.MAX_SAFE_INTEGER);
+is_in_range_i64(false, 2 ** 63, Number.MAX_SAFE_INTEGER);
+is_in_range_i64(false, -(2 ** 64), Number.MIN_SAFE_INTEGER);
+is_in_range_i64(false, -(2 ** 64 + 1), Number.MIN_SAFE_INTEGER);
+is_in_range_i64(false, 2 ** 64, Number.MAX_SAFE_INTEGER);
+is_in_range_i64(false, 2 ** 64 + 3.15, Number.MAX_SAFE_INTEGER);
+
+// ----------- u64 -----------
+function is_in_range_u64(in_range, arg, expected) {
+  let result = fast_c_api.clamp_compare_u64(in_range, arg, arg);
+  assertEquals(expected, result);
+}
+
+%PrepareFunctionForOptimization(is_in_range_u64);
+is_in_range_u64(true, 123, 123);
+%OptimizeFunctionOnNextCall(is_in_range_u64);
+is_in_range_u64(true, 123, 123);
+is_in_range_u64(true, 0, 0);
+is_in_range_u64(true, -0.5, 0);
+is_in_range_u64(true, 0.5, 0);
+is_in_range_u64(true, 2 ** 32 - 1, 2 ** 32 - 1);
+is_in_range_u64(true, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);
+is_in_range_u64(false, Number.MIN_SAFE_INTEGER, 0);
+is_in_range_u64(false, -1, 0);
+is_in_range_u64(false, -1.5, 0);
+is_in_range_u64(false, 2 ** 64, Number.MAX_SAFE_INTEGER);
+is_in_range_u64(false, 2 ** 64 + 3.15, Number.MAX_SAFE_INTEGER);
+
+// ---------- invalid arguments for clamp_compare ---------
+fast_c_api.clamp_compare_i32(true);
+fast_c_api.clamp_compare_i32(true, 753801, -2147483650);
diff --git a/deps/v8/test/mjsunit/compiler/get-iterator-deopt.js b/deps/v8/test/mjsunit/compiler/get-iterator-deopt.js
deleted file mode 100644
index 4d7c08136346ad..00000000000000
--- a/deps/v8/test/mjsunit/compiler/get-iterator-deopt.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2022 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Flags: --allow-natives-syntax
-
-function throwsRepeated(fn, ErrorType) {
-  // Collect type feedback.
-  %PrepareFunctionForOptimization(fn);
-  for (let i = 0; i < 5; i++) assertThrows(fn, ErrorType);
-  // Force compilation and run.
-  %OptimizeFunctionOnNextCall(fn);
-  assertThrows(fn, ErrorType);
-  // If the function isn't optimized / turbofan tier not available,
-  // a deopt happened on the call above.
-  assertEquals(%IsTurbofanEnabled(), %ActiveTierIsTurbofan(fn));
-}
-
-function repeated(fn) {
-  // Collect type feedback.
-  %PrepareFunctionForOptimization(fn);
-  for (let i = 0; i < 5; i++) fn();
-  // Force compilation and run.
-  %OptimizeFunctionOnNextCall(fn);
-  fn();
-  // If the function isn't optimized / turbofan tier not available,
-  // a deopt happened on the call above.
-  assertEquals(%IsTurbofanEnabled(), %ActiveTierIsTurbofan(fn));
-}
-
-repeated(() => { for (let p of "abc") { } });
-repeated(() => { for (let p of [1, 2, 3]) { } });
-throwsRepeated(() => { for (let p of {a: 1, b: 2}) { } }, TypeError);
-let objWithIterator = { [Symbol.iterator]: function* () { yield 1; } };
-repeated(() => { for (let p of objWithIterator) { } });
-throwsRepeated(() => { for (let p of 5) { } }, TypeError);
-throwsRepeated(() => { for (let p of new Number(5)) { } }, TypeError);
-throwsRepeated(() => { for (let p of true) { } }, TypeError);
-throwsRepeated(() => { for (let p of new BigInt(123)) { } }, TypeError);
-throwsRepeated(() => { for (let p of new Symbol("symbol")) { } }, TypeError);
-throwsRepeated(function testUndef() { for (let p of undefined) { } }, TypeError);
-throwsRepeated(() => { for (let p of null) { } }, TypeError);
diff --git a/deps/v8/test/mjsunit/compiler/misc-ensure-no-deopt.js b/deps/v8/test/mjsunit/compiler/misc-ensure-no-deopt.js
new file mode 100644
index 00000000000000..5cc13d383f314b
--- /dev/null
+++ b/deps/v8/test/mjsunit/compiler/misc-ensure-no-deopt.js
@@ -0,0 +1,61 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+function throwsRepeated(fn, ErrorType, required_compilation_count) {
+  for (let j = 0; j < (required_compilation_count ?? 1); j++) {
+    // Collect type feedback.
+    %PrepareFunctionForOptimization(fn);
+    for (let i = 0; i < 5; i++) assertThrows(fn, ErrorType);
+    // Force compilation and run.
+    %OptimizeFunctionOnNextCall(fn);
+    assertThrows(fn, ErrorType);
+  }
+  // If the function isn't optimized / turbofan tier not available,
+  // a deopt happened on the call above.
+  assertEquals(%IsTurbofanEnabled(), %ActiveTierIsTurbofan(fn));
+}
+
+function repeated(fn) {
+  // Collect type feedback.
+  %PrepareFunctionForOptimization(fn);
+  for (let i = 0; i < 2; i++) fn();
+  // Force compilation and run.
+  %OptimizeFunctionOnNextCall(fn);
+  fn();
+  // If the function isn't optimized / turbofan tier not available,
+  // a deopt happened on the call above.
+  assertEquals(%IsTurbofanEnabled(), %ActiveTierIsTurbofan(fn));
+}
+
+repeated(() => { for (let p of "abc") { } });
+repeated(() => { for (let p of [1, 2, 3]) { } });
+throwsRepeated(() => { for (let p of {a: 1, b: 2}) { } }, TypeError);
+let objWithIterator = { [Symbol.iterator]: function* () { yield 1; } };
+repeated(() => { for (let p of objWithIterator) { } });
+throwsRepeated(() => { for (let p of 5) { } }, TypeError);
+throwsRepeated(() => { for (let p of new Number(5)) { } }, TypeError);
+throwsRepeated(() => { for (let p of true) { } }, TypeError);
+throwsRepeated(() => { for (let p of new BigInt(123)) { } }, TypeError);
+throwsRepeated(() => { for (let p of Symbol("symbol")) { } }, TypeError);
+throwsRepeated(() => { for (let p of undefined) { } }, TypeError);
+throwsRepeated(() => { for (let p of null) { } }, TypeError);
+
+throwsRepeated(() => (undefined).val = undefined, TypeError);
+throwsRepeated(() => (undefined)["test"] = undefined, TypeError);
+throwsRepeated(() => (undefined)[Symbol("test")] = undefined, TypeError);
+throwsRepeated(() => (undefined)[null] = undefined, TypeError);
+throwsRepeated(() => (undefined)[undefined] = undefined, TypeError);
+throwsRepeated(() => (undefined)[0] = undefined, TypeError);
+throwsRepeated(() => (undefined)[NaN] = undefined, TypeError);
+throwsRepeated(() => (null)[0] = undefined, TypeError);
+// BigInt.asIntN() deopts once but provides a better suitable compile result
+// on the second compilation which doesn't deopt any more.
+let compiles = 2;
+throwsRepeated(() => BigInt.asIntN(2, 2), TypeError, compiles);
+throwsRepeated(() => BigInt.asIntN(2, () => {}), SyntaxError, compiles);
+throwsRepeated(() => BigInt.asIntN(2, {some: Object}), SyntaxError, compiles);
+throwsRepeated(() => BigInt.asIntN(2, Symbol("test")), TypeError, compiles);
+throwsRepeated(() => BigInt.asIntN(2, null), TypeError, compiles);
diff --git a/deps/v8/test/mjsunit/compiler/omit-default-ctors-array-iterator.js b/deps/v8/test/mjsunit/compiler/omit-default-ctors-array-iterator.js
new file mode 100644
index 00000000000000..0c52b0e45e4c16
--- /dev/null
+++ b/deps/v8/test/mjsunit/compiler/omit-default-ctors-array-iterator.js
@@ -0,0 +1,33 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --omit-default-ctors --allow-natives-syntax --turbofan
+// Flags: --no-always-turbofan
+
+// This behavior is not spec compliant, see crbug.com/v8/13249.
+(function ArrayIteratorMonkeyPatched() {
+  let iterationCount = 0;
+  const oldIterator = Array.prototype[Symbol.iterator];
+  Array.prototype[Symbol.iterator] =
+      function () { ++iterationCount; return oldIterator.call(this); };
+
+  class A {}
+  class B extends A {}
+  class C extends B {}
+
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeFunctionOnNextCall(C);
+
+  // C default ctor doing "...args" and B default ctor doing "...args".
+  assertEquals(2, iterationCount);
+
+  new C();
+
+  // C default ctor doing "...args" and B default ctor doing "...args".
+  assertEquals(4, iterationCount);
+  assertTrue(isTurboFanned(C));  // No deopt.
+
+  Array.prototype[Symbol.iterator] = oldIterator;
+})();
diff --git a/deps/v8/test/mjsunit/compiler/omit-default-ctors.js b/deps/v8/test/mjsunit/compiler/omit-default-ctors.js
new file mode 100644
index 00000000000000..2f1c5c18c0ccd1
--- /dev/null
+++ b/deps/v8/test/mjsunit/compiler/omit-default-ctors.js
@@ -0,0 +1,781 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --omit-default-ctors --allow-natives-syntax --turbofan
+// Flags: --no-always-turbofan
+
+(function OmitDefaultBaseCtor() {
+  class A {};  // default base ctor -> will be omitted
+  class B extends A {};
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+  const o = new B();
+  assertSame(B.prototype, o.__proto__);
+  assertTrue(isTurboFanned(B));  // No deopt.
+})();
+
+(function OmitDefaultDerivedCtor() {
+  class A { constructor() {} };
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B {};
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeFunctionOnNextCall(C);
+  const o = new C();
+  assertSame(C.prototype, o.__proto__);
+  assertTrue(isTurboFanned(C));  // No deopt.
+})();
+
+(function OmitDefaultBaseAndDerivedCtor() {
+  class A {}; // default base ctor -> will be omitted
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B {};
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeFunctionOnNextCall(C);
+  const o = new C();
+  assertSame(C.prototype, o.__proto__);
+  assertTrue(isTurboFanned(C));  // No deopt.
+})();
+
+(function OmitDefaultBaseCtorWithExplicitSuper() {
+  class A {};  // default base ctor -> will be omitted
+  class B extends A { constructor() { super(); } };
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+  const o = new B();
+  assertSame(B.prototype, o.__proto__);
+  assertTrue(isTurboFanned(B));  // No deopt.
+})();
+
+(function OmitDefaultDerivedCtorWithExplicitSuper() {
+  class A { constructor() {} };
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B { constructor() { super(); } };
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeFunctionOnNextCall(C);
+  const o = new C();
+  assertSame(C.prototype, o.__proto__);
+  assertTrue(isTurboFanned(C));  // No deopt.
+})();
+
+(function OmitDefaultBaseAndDerivedCtorWithExplicitSuper() {
+  class A {}; // default base ctor -> will be omitted
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B { constructor() { super(); } };
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeFunctionOnNextCall(C);
+  const o = new C();
+  assertSame(C.prototype, o.__proto__);
+  assertTrue(isTurboFanned(C));  // No deopt.
+})();
+
+(function OmitDefaultBaseCtorWithExplicitSuperAndNonFinalSpread() {
+  class A {};  // default base ctor -> will be omitted
+  class B extends A { constructor(...args) { super(1, ...args, 2); } };
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+  const o = new B(3, 4);
+  assertSame(B.prototype, o.__proto__);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13310
+  // assertTrue(isTurboFanned(B));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isTurboFanned(B));
+})();
+
+(function OmitDefaultDerivedCtorWithExplicitSuperAndNonFinalSpread() {
+  class A { constructor() {} };
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B { constructor(...args) { super(1, ...args, 2); } };
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeFunctionOnNextCall(C);
+  const o = new C(3, 4);
+  assertSame(C.prototype, o.__proto__);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13310
+  // assertTrue(isTurboFanned(C));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isTurboFanned(C));
+})();
+
+(function OmitDefaultBaseAndDerivedCtorWithExplicitSuperAndNonFinalSpread() {
+  class A {}; // default base ctor -> will be omitted
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B { constructor(...args) { super(1, ...args, 2); } };
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeFunctionOnNextCall(C);
+  const o = new C(3, 4);
+  assertSame(C.prototype, o.__proto__);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13310
+  // assertTrue(isTurboFanned(C));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isTurboFanned(C));
+})();
+
+(function NonDefaultBaseConstructorCalled() {
+  let ctorCallCount = 0;
+  let lastArgs;
+  class Base {
+    constructor(...args) {
+      ++ctorCallCount;
+      this.baseTagged = true;
+      lastArgs = args;
+    }
+  };
+  // Nothing will be omitted.
+  class A extends Base {};
+  %PrepareFunctionForOptimization(A);
+  new A();
+  %OptimizeFunctionOnNextCall(A);
+  const a = new A(1, 2, 3);
+  assertEquals(2, ctorCallCount);
+  assertEquals([1, 2, 3], lastArgs);
+  assertTrue(a.baseTagged);
+  assertTrue(isTurboFanned(A));  // No deopt.
+
+  // 'A' default ctor will be omitted.
+  class B1 extends A {};
+  %PrepareFunctionForOptimization(B1);
+  new B1();
+  %OptimizeFunctionOnNextCall(B1);
+  const b1 = new B1(4, 5, 6);
+  assertEquals(4, ctorCallCount);
+  assertEquals([4, 5, 6], lastArgs);
+  assertTrue(b1.baseTagged);
+  assertTrue(isTurboFanned(B1));  // No deopt.
+
+  // The same test with non-final spread; 'A' default ctor will be omitted.
+  class B2 extends A {
+    constructor(...args) { super(1, ...args, 2); }
+  };
+  %PrepareFunctionForOptimization(B2);
+  new B2();
+  %OptimizeFunctionOnNextCall(B2);
+  const b2 = new B2(4, 5, 6);
+  assertEquals(6, ctorCallCount);
+  assertEquals([1, 4, 5, 6, 2], lastArgs);
+  assertTrue(b2.baseTagged);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13310
+  // assertTrue(isTurboFanned(B2));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isTurboFanned(B2));  // No deopt.
+})();
+
+(function NonDefaultDerivedConstructorCalled() {
+  let ctorCallCount = 0;
+  let lastArgs;
+  class Base {};
+  class Derived extends Base {
+    constructor(...args) {
+      super();
+      ++ctorCallCount;
+      this.derivedTagged = true;
+      lastArgs = args;
+    }
+  };
+  // Nothing will be omitted.
+  class A extends Derived {};
+  %PrepareFunctionForOptimization(A);
+  new A();
+  %OptimizeFunctionOnNextCall(A);
+  const a = new A(1, 2, 3);
+  assertEquals(2, ctorCallCount);
+  assertEquals([1, 2, 3], lastArgs);
+  assertTrue(a.derivedTagged);
+  assertTrue(isTurboFanned(A));  // No deopt.
+
+  // 'A' default ctor will be omitted.
+  class B1 extends A {};
+  %PrepareFunctionForOptimization(B1);
+  new B1();
+  %OptimizeFunctionOnNextCall(B1);
+  const b1 = new B1(4, 5, 6);
+  assertEquals(4, ctorCallCount);
+  assertEquals([4, 5, 6], lastArgs);
+  assertTrue(b1.derivedTagged);
+  assertTrue(isTurboFanned(B1));  // No deopt.
+
+  // The same test with non-final spread. 'A' default ctor will be omitted.
+  class B2 extends A {
+    constructor(...args) { super(1, ...args, 2); }
+  };
+  %PrepareFunctionForOptimization(B2);
+  new B2();
+  %OptimizeFunctionOnNextCall(B2);
+  const b2 = new B2(4, 5, 6);
+  assertEquals(6, ctorCallCount);
+  assertEquals([1, 4, 5, 6, 2], lastArgs);
+  assertTrue(b2.derivedTagged);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13310
+  // assertTrue(isTurboFanned(B2));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isTurboFanned(B2));  // No deopt.
+})();
+
+(function BaseFunctionCalled() {
+  let baseFunctionCallCount = 0;
+  function BaseFunction() {
+    ++baseFunctionCallCount;
+    this.baseTagged = true;
+  }
+
+  class A1 extends BaseFunction {};
+  %PrepareFunctionForOptimization(A1);
+  new A1();
+  %OptimizeFunctionOnNextCall(A1);
+  const a1 = new A1();
+  assertEquals(2, baseFunctionCallCount);
+  assertTrue(a1.baseTagged);
+  assertTrue(isTurboFanned(A1));  // No deopt.
+
+  class A2 extends BaseFunction {
+    constructor(...args) { super(1, ...args, 2); }
+  };
+  %PrepareFunctionForOptimization(A2);
+  new A2();
+  %OptimizeFunctionOnNextCall(A2);
+  const a2 = new A2();
+  assertEquals(4, baseFunctionCallCount);
+  assertTrue(a2.baseTagged);
+  assertTrue(isTurboFanned(A2));  // No deopt.
+})();
+
+(function NonSuperclassCtor() {
+  class A {};
+  class B extends A {};
+  class C extends B {};
+  class D1 extends C {};
+  class D2 extends C { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C);
+  %PrepareFunctionForOptimization(D1);
+  %PrepareFunctionForOptimization(D2);
+  new C();
+  new D1();
+  new D2();
+  %OptimizeFunctionOnNextCall(C);
+  %OptimizeFunctionOnNextCall(D1);
+  %OptimizeFunctionOnNextCall(D2);
+
+  // Install an object which is not a constructor into the class hierarchy.
+  C.__proto__ = {};
+
+  assertThrows(() => { new C(); }, TypeError);
+  assertThrows(() => { new D1(); }, TypeError);
+  assertThrows(() => { new D2(); }, TypeError);
+})();
+
+(function ArgumentsEvaluatedBeforeNonSuperclassCtorDetected() {
+  class A {};
+  class B extends A {};
+  class C extends B {};
+  class D1 extends C {};
+  class D2 extends C { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C);
+  %PrepareFunctionForOptimization(D1);
+  %PrepareFunctionForOptimization(D2);
+  new C();
+  new D1();
+  new D2();
+  %OptimizeFunctionOnNextCall(C);
+  %OptimizeFunctionOnNextCall(D1);
+  %OptimizeFunctionOnNextCall(D2);
+
+  // Install an object which is not a constructor into the class hierarchy.
+  C.__proto__ = {};
+
+  let callCount = 0;
+  function foo() {
+    ++callCount;
+  }
+
+  assertThrows(() => { new C(foo()); }, TypeError);
+  assertEquals(1, callCount);
+
+  assertThrows(() => { new D1(foo()); }, TypeError);
+  assertEquals(2, callCount);
+
+  assertThrows(() => { new D2(foo()); }, TypeError);
+  assertEquals(3, callCount);
+})();
+
+(function ArgumentsEvaluatedBeforeNonSuperclassCtorDetected2() {
+  class A {};
+  class B extends A {};
+  class C extends B {};
+  class D1 extends C {
+    constructor() {
+      super(foo());
+    }
+  };
+
+  class D2 extends C {
+    constructor(...args) {
+      super(...args, foo());
+    }
+  };
+
+  let callCount = 0;
+  function foo() {
+    ++callCount;
+  }
+
+  %PrepareFunctionForOptimization(D1);
+  %PrepareFunctionForOptimization(D2);
+  new D1();
+  new D2();
+  %OptimizeFunctionOnNextCall(D1);
+  %OptimizeFunctionOnNextCall(D2);
+  assertEquals(2, callCount);
+
+  // Install an object which is not a constructor into the class hierarchy.
+  C.__proto__ = {};
+
+  assertThrows(() => { new D1(); }, TypeError);
+  assertEquals(3, callCount);
+
+  assertThrows(() => { new D2(); }, TypeError);
+  assertEquals(4, callCount);
+})();
+
+(function EvaluatingArgumentsChangesClassHierarchy() {
+  let ctorCallCount = 0;
+  class A {};
+  class B extends A { constructor() {
+    super();
+    ++ctorCallCount;
+  }};
+  class C extends B {};
+  class D extends C {
+    constructor() {
+      super(foo());
+    }
+  };
+
+  let fooCallCount = 0;
+  let changeHierarchy = false;
+  function foo() {
+    if (changeHierarchy) {
+      C.__proto__ = A;
+      C.prototype.__proto__ = A.prototype;
+    }
+    ++fooCallCount;
+  }
+
+  %PrepareFunctionForOptimization(D);
+  new D();
+  assertEquals(1, fooCallCount);
+  assertEquals(1, ctorCallCount);
+  %OptimizeFunctionOnNextCall(D);
+  changeHierarchy = true;
+
+  new D();
+  assertEquals(2, fooCallCount);
+  assertEquals(1, ctorCallCount);
+  assertFalse(isTurboFanned(D));  // Deopt.
+})();
+
+// The same test as the previous one, but with a ctor with a non-final spread.
+(function EvaluatingArgumentsChangesClassHierarchyThisTimeWithNonFinalSpread() {
+  let ctorCallCount = 0;
+  class A {};
+  class B extends A { constructor() {
+    super();
+    ++ctorCallCount;
+  }};
+  class C extends B {};
+  class D extends C {
+    constructor(...args) {
+      super(...args, foo());
+    }
+  };
+
+  let fooCallCount = 0;
+  let changeHierarchy = false;
+  function foo() {
+    if (changeHierarchy) {
+      C.__proto__ = A;
+      C.prototype.__proto__ = A.prototype;
+    }
+    ++fooCallCount;
+  }
+
+  %PrepareFunctionForOptimization(D);
+  new D();
+  assertEquals(1, fooCallCount);
+  assertEquals(1, ctorCallCount);
+  %OptimizeFunctionOnNextCall(D);
+  changeHierarchy = true;
+
+  new D();
+  assertEquals(2, fooCallCount);
+  assertEquals(1, ctorCallCount);
+  assertFalse(isTurboFanned(D));  // Deopt.
+})();
+
+(function BasePrivateField() {
+  class A {
+   #aBrand = true;
+   isA() {
+    return #aBrand in this;
+   }
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+
+  const b = new B();
+  assertTrue(b.isA());
+  assertTrue(isTurboFanned(B));  // No deopt.
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  assertTrue(c1.isA());
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  assertTrue(c2.isA());
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function DerivedPrivateField() {
+  class A {};
+  class B extends A {
+    #bBrand = true;
+    isB() {
+     return #bBrand in this;
+    }
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  assertTrue(c1.isB());
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  assertTrue(c2.isB());
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function BasePrivateMethod() {
+  class A {
+   #m() { return 'private'; }
+   callPrivate() {
+    return this.#m();
+   }
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+
+  const b = new B();
+  assertEquals('private', b.callPrivate());
+  assertTrue(isTurboFanned(B));  // No deopt.
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  assertEquals('private', c1.callPrivate());
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  assertEquals('private', c2.callPrivate());
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function DerivedPrivateMethod() {
+  class A {};
+  class B extends A {
+    #m() { return 'private'; }
+    callPrivate() {
+     return this.#m();
+    }
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  assertEquals('private', c1.callPrivate());
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  assertEquals('private', c2.callPrivate());
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function BasePrivateGetter() {
+  class A {
+   get #p() { return 'private'; }
+   getPrivate() {
+    return this.#p;
+   }
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+
+  const b = new B();
+  assertEquals('private', b.getPrivate());
+  assertTrue(isTurboFanned(B));  // No deopt.
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  assertEquals('private', c1.getPrivate());
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  assertEquals('private', c2.getPrivate());
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function DerivedPrivateGetter() {
+  class A {};
+  class B extends A {
+    get #p() { return 'private'; }
+    getPrivate() {
+     return this.#p;
+    }
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  assertEquals('private', c1.getPrivate());
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  assertEquals('private', c2.getPrivate());
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function BasePrivateSetter() {
+  class A {
+   set #p(value) { this.secret = value; }
+   setPrivate() {
+    this.#p = 'private';
+   }
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+
+  const b = new B();
+  b.setPrivate();
+  assertEquals('private', b.secret);
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  c1.setPrivate();
+  assertEquals('private', c1.secret);
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  c2.setPrivate();
+  assertEquals('private', c2.secret);
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function DerivedPrivateSetter() {
+  class A {};
+  class B extends A {
+    set #p(value) { this.secret = value; }
+    setPrivate() {
+     this.#p = 'private';
+    }
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  c1.setPrivate();
+  assertEquals('private', c1.secret);
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  c2.setPrivate();
+  assertEquals('private', c2.secret);
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function BaseClassFields() {
+  class A {
+   aField = true;
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+
+  const b = new B();
+  assertTrue(b.aField);
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  assertTrue(c1.aField);
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  assertTrue(c2.aField);
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function DerivedClassFields() {
+  class A {};
+  class B extends A {
+    bField = true;
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeFunctionOnNextCall(C1);
+
+  const c1 = new C1();
+  assertTrue(c1.bField);
+  assertTrue(isTurboFanned(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeFunctionOnNextCall(C2);
+
+  const c2 = new C2();
+  assertTrue(c2.bField);
+  assertTrue(isTurboFanned(C2));  // No deopt.
+})();
+
+(function SuperInTryCatchDefaultCtor() {
+  class A {};
+  class B extends A {
+    constructor() {
+      try {
+        super();
+      } catch {
+        assertUnreachable();
+      }
+    }
+  };
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+
+  const b = new B();
+  assertSame(B.prototype, b.__proto__);
+  assertTrue(isTurboFanned(B));  // No deopt.
+})();
+
+(function SuperInTryCatchNonDefaultCtor() {
+  class A { constructor() {} };
+  class B extends A {
+    constructor() {
+      try {
+        super();
+      } catch {
+        assertUnreachable();
+      }
+    }
+  };
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeFunctionOnNextCall(B);
+
+  const b = new B();
+  assertSame(B.prototype, b.__proto__);
+  assertTrue(isTurboFanned(B));  // No deopt.
+})();
diff --git a/deps/v8/test/mjsunit/d8/performance-mark.js b/deps/v8/test/mjsunit/d8/performance-mark.js
new file mode 100644
index 00000000000000..52f8262140d68e
--- /dev/null
+++ b/deps/v8/test/mjsunit/d8/performance-mark.js
@@ -0,0 +1,23 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const mark = performance.mark("a mark");
+assertEquals("mark", mark.entryType);
+assertEquals("a mark", mark.name);
+assertTrue(typeof mark.startTime == "number");
+assertEquals(0, mark.duration);
+
+const measure = performance.measure("a measure")
+assertEquals("measure", measure.entryType);
+assertEquals("a measure", measure.name);
+assertEquals(0, measure.startTime);
+assertTrue(typeof mark.duration == "number");
+assertTrue(mark.startTime <= measure.duration);
+
+const range_measure = performance.measure("a range measure", mark)
+assertEquals("measure", range_measure.entryType);
+assertEquals("a range measure", range_measure.name);
+assertEquals(mark.startTime, range_measure.startTime);
+assertTrue(typeof range_measure.duration == "number");
+assertTrue(0 <= range_measure.duration);
diff --git a/deps/v8/test/mjsunit/harmony/array-to-reversed-big.js b/deps/v8/test/mjsunit/harmony/array-to-reversed-big.js
new file mode 100644
index 00000000000000..62d9730484d835
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/array-to-reversed-big.js
@@ -0,0 +1,14 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-change-array-by-copy
+
+(function TestBigPacked() {
+  let a = [];
+  for (let i = 0; i < 50000; i++) a.push(i);
+  let r = a.toReversed();
+  for (let i = 0; i < 50000; i++) {
+    assertEquals(r[i], a.at(-(i+1)));
+  }
+})();
diff --git a/deps/v8/test/mjsunit/harmony/array-to-reversed.js b/deps/v8/test/mjsunit/harmony/array-to-reversed.js
index adb1f23f29699e..caae4079ab088d 100644
--- a/deps/v8/test/mjsunit/harmony/array-to-reversed.js
+++ b/deps/v8/test/mjsunit/harmony/array-to-reversed.js
@@ -57,6 +57,10 @@ assertEquals("toReversed", Array.prototype.toReversed.name);
   assertEquals(["1st","2nd","3rd","4th"], order);
 })();
 
+(function TestEmpty() {
+  assertEquals([], [].toReversed());
+})();
+
 (function TestTooBig() {
   let a = { length: Math.pow(2, 32) };
   assertThrows(() => Array.prototype.toReversed.call(a), RangeError);
diff --git a/deps/v8/test/mjsunit/harmony/array-to-sorted.js b/deps/v8/test/mjsunit/harmony/array-to-sorted.js
index 6df02586183a41..e5ea813fb82de5 100644
--- a/deps/v8/test/mjsunit/harmony/array-to-sorted.js
+++ b/deps/v8/test/mjsunit/harmony/array-to-sorted.js
@@ -56,25 +56,25 @@ function TestToSortedBasicBehaviorHelper(input) {
 }
 
 // Smi packed
-AssertToSortedAndSortSameResult([1,3,2,4]);
+TestToSortedBasicBehaviorHelper([1,3,2,4]);
 
 // Double packed
-AssertToSortedAndSortSameResult([1.1,3.3,2.2,4.4]);
+TestToSortedBasicBehaviorHelper([1.1,3.3,2.2,4.4]);
 
 // Packed
-AssertToSortedAndSortSameResult([true,false,1,42.42,null,"foo"]);
+TestToSortedBasicBehaviorHelper([true,false,1,42.42,null,"foo"]);
 
 // Smi holey
-AssertToSortedAndSortSameResult([1,,3,,2,,4,,]);
+TestToSortedBasicBehaviorHelper([1,,3,,2,,4,,]);
 
 // Double holey
-AssertToSortedAndSortSameResult([1.1,,3.3,,2.2,,4.4,,]);
+TestToSortedBasicBehaviorHelper([1.1,,3.3,,2.2,,4.4,,]);
 
 // Holey
-AssertToSortedAndSortSameResult([true,,false,,1,,42.42,,null,,"foo",,]);
+TestToSortedBasicBehaviorHelper([true,,false,,1,,42.42,,null,,"foo",,]);
 
 // Generic
-AssertToSortedAndSortSameResult({ length: 4,
+TestToSortedBasicBehaviorHelper({ length: 4,
                                   get "0"() { return "hello"; },
                                   get "1"() { return "cursed"; },
                                   get "2"() { return "java"; },
@@ -94,6 +94,12 @@ AssertToSortedAndSortSameResult({ length: 4,
   assertEquals(0, a.length);
 })();
 
+(function TestBig() {
+  const a = [];
+  a[50001] = 42.42;
+  a.toSorted();
+})();
+
 (function TestTooBig() {
   const a = { length: Math.pow(2, 32) };
   assertThrows(() => Array.prototype.toSorted.call(a), RangeError);
diff --git a/deps/v8/test/mjsunit/harmony/array-to-spliced-big.js b/deps/v8/test/mjsunit/harmony/array-to-spliced-big.js
new file mode 100644
index 00000000000000..84e81056953630
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/array-to-spliced-big.js
@@ -0,0 +1,11 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-change-array-by-copy
+
+(function TestBigPacked() {
+  let a = [];
+  for (let i = 0; i < 50000; i++) a.push(i);
+  let r = a.toSpliced();
+})();
diff --git a/deps/v8/test/mjsunit/harmony/array-to-spliced.js b/deps/v8/test/mjsunit/harmony/array-to-spliced.js
index ad72eea5694d43..f76a71c4db9792 100644
--- a/deps/v8/test/mjsunit/harmony/array-to-spliced.js
+++ b/deps/v8/test/mjsunit/harmony/array-to-spliced.js
@@ -101,6 +101,24 @@ TestToSplicedBasicBehaviorHelper({ length: 4,
   assertEquals(Array, (new MyArray()).toSpliced().constructor);
 })();
 
+(function TestEmpty() {
+  assertEquals([], [].toSpliced());
+})();
+
+function TestFastSourceEmpty(input, itemsToInsert) {
+  // Create an empty input Array of the same ElementsKind with splice().
+  TestToSplicedBasicBehaviorHelper(input.splice(), itemsToInsert);
+}
+
+// Packed
+TestFastSourceEmpty([1,2,3,4], [5,6]);
+
+// Double packed
+TestFastSourceEmpty([1.1,2.2,3.3,4.4], [5.5,6.6]);
+
+// Packed
+TestFastSourceEmpty([true,false,1,42.42], [null,"foo"]);
+
 // All tests after this have an invalidated elements-on-prototype protector.
 (function TestNoHoles() {
   const a = [,,,,];
diff --git a/deps/v8/test/mjsunit/harmony/arraybuffer-transfer.js b/deps/v8/test/mjsunit/harmony/arraybuffer-transfer.js
index 2efe530d03088e..85b3fd417736cd 100644
--- a/deps/v8/test/mjsunit/harmony/arraybuffer-transfer.js
+++ b/deps/v8/test/mjsunit/harmony/arraybuffer-transfer.js
@@ -125,6 +125,11 @@ TestNonGrow(0, { maxByteLength: 2048 });
   }
 })();
 
+(function TestEmptySourceStore() {
+  let ab = new ArrayBuffer();
+  let xfer = ab.transfer().transfer(1024);
+})();
+
 if (typeof WebAssembly !== 'undefined') {
   // WebAssembly buffers cannot be detached.
   const memory = new WebAssembly.Memory({ initial: 1 });
diff --git a/deps/v8/test/mjsunit/harmony/json-parse-with-source.js b/deps/v8/test/mjsunit/harmony/json-parse-with-source.js
new file mode 100644
index 00000000000000..96990825299d49
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/json-parse-with-source.js
@@ -0,0 +1,287 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-json-parse-with-source
+
+(function TestBigInt() {
+  const tooBigForNumber = BigInt(Number.MAX_SAFE_INTEGER) + 2n;
+  const intToBigInt = (key, val, { source }) =>
+    typeof val === 'number' && val % 1 === 0 ? BigInt(source) : val;
+  const roundTripped = JSON.parse(String(tooBigForNumber), intToBigInt);
+  assertEquals(tooBigForNumber, roundTripped);
+
+  const bigIntToRawJSON = (key, val) =>
+    typeof val === 'bigint' ? JSON.rawJSON(val) : val;
+  const embedded = JSON.stringify({ tooBigForNumber }, bigIntToRawJSON);
+  assertEquals('{"tooBigForNumber":9007199254740993}', embedded);
+})();
+
+function GenerateParseReviverFunction(texts) {
+  let i = 0;
+  return function (key, value, context) {
+    assertTrue(typeof context === 'object');
+    assertEquals(Object.prototype, Object.getPrototypeOf(context));
+    // The json value is a primitive value, it's context only has a source property.
+    if (texts[i] !== undefined) {
+      const descriptor = Object.getOwnPropertyDescriptor(context, 'source');
+      assertTrue(descriptor.configurable);
+      assertTrue(descriptor.enumerable);
+      assertTrue(descriptor.writable);
+      assertEquals(undefined, descriptor.get);
+      assertEquals(undefined, descriptor.set);
+      assertEquals(texts[i++], descriptor.value);
+
+      assertEquals(['source'], Object.getOwnPropertyNames(context));
+      assertEquals([], Object.getOwnPropertySymbols(context));
+    } else {
+      // The json value is JSArray or JSObject, it's context has no property.
+      assertFalse(Object.hasOwn(context, 'source'));
+      assertEquals([], Object.getOwnPropertyNames(context));
+      assertEquals([], Object.getOwnPropertySymbols(context));
+      i++;
+    }
+    return value;
+  };
+}
+
+(function TestNumber() {
+  assertEquals(1, JSON.parse('1', GenerateParseReviverFunction(['1'])));
+  assertEquals(1.1, JSON.parse('1.1', GenerateParseReviverFunction(['1.1'])));
+  assertEquals(-1, JSON.parse('-1', GenerateParseReviverFunction(['-1'])));
+  assertEquals(
+    -1.1,
+    JSON.parse('-1.1', GenerateParseReviverFunction(['-1.1']))
+  );
+  assertEquals(
+    11,
+    JSON.parse('1.1e1', GenerateParseReviverFunction(['1.1e1']))
+  );
+  assertEquals(
+    11,
+    JSON.parse('1.1e+1', GenerateParseReviverFunction(['1.1e+1']))
+  );
+  assertEquals(
+    0.11,
+    JSON.parse('1.1e-1', GenerateParseReviverFunction(['1.1e-1']))
+  );
+  assertEquals(
+    11,
+    JSON.parse('1.1E1', GenerateParseReviverFunction(['1.1E1']))
+  );
+  assertEquals(
+    11,
+    JSON.parse('1.1E+1', GenerateParseReviverFunction(['1.1E+1']))
+  );
+  assertEquals(
+    0.11,
+    JSON.parse('1.1E-1', GenerateParseReviverFunction(['1.1E-1']))
+  );
+
+  assertEquals('1', JSON.stringify(JSON.rawJSON(1)));
+  assertEquals('1.1', JSON.stringify(JSON.rawJSON(1.1)));
+  assertEquals('-1', JSON.stringify(JSON.rawJSON(-1)));
+  assertEquals('-1.1', JSON.stringify(JSON.rawJSON(-1.1)));
+  assertEquals('11', JSON.stringify(JSON.rawJSON(1.1e1)));
+  assertEquals('0.11', JSON.stringify(JSON.rawJSON(1.1e-1)));
+})();
+
+(function TestBasic() {
+  assertEquals(
+    null,
+    JSON.parse('null', GenerateParseReviverFunction(['null']))
+  );
+  assertEquals(
+    true,
+    JSON.parse('true', GenerateParseReviverFunction(['true']))
+  );
+  assertEquals(
+    false,
+    JSON.parse('false', GenerateParseReviverFunction(['false']))
+  );
+  assertEquals(
+    'foo',
+    JSON.parse('"foo"', GenerateParseReviverFunction(['"foo"']))
+  );
+
+  assertEquals('null', JSON.stringify(JSON.rawJSON(null)));
+  assertEquals('true', JSON.stringify(JSON.rawJSON(true)));
+  assertEquals('false', JSON.stringify(JSON.rawJSON(false)));
+  assertEquals('"foo"', JSON.stringify(JSON.rawJSON('"foo"')));
+})();
+
+(function TestObject() {
+  assertEquals(
+    {},
+    JSON.parse('{}', GenerateParseReviverFunction([]))
+  );
+  assertEquals(
+    { 42: 37 },
+    JSON.parse('{"42":37}', GenerateParseReviverFunction(['37']))
+  );
+  assertEquals(
+    { x: 1, y: 2 },
+    JSON.parse('{"x": 1, "y": 2}', GenerateParseReviverFunction(['1', '2']))
+  );
+  // undefined means the json value is JSObject or JSArray and the passed
+  // context to the reviver function has no source property.
+  assertEquals(
+    { x: [1, 2], y: [2, 3] },
+    JSON.parse(
+      '{"x": [1,2], "y": [2,3]}',
+      GenerateParseReviverFunction(['1', '2', undefined, '2', '3', undefined])
+    )
+  );
+  assertEquals(
+    { x: { x: 1, y: 2 } },
+    JSON.parse(
+      '{"x": {"x": 1, "y": 2}}',
+      GenerateParseReviverFunction(['1', '2', undefined, undefined])
+    )
+  );
+
+  assertEquals('{"42":37}', JSON.stringify({ 42: JSON.rawJSON(37) }));
+  assertEquals(
+    '{"x":1,"y":2}',
+    JSON.stringify({ x: JSON.rawJSON(1), y: JSON.rawJSON(2) })
+  );
+  assertEquals(
+    '{"x":{"x":1,"y":2}}',
+    JSON.stringify({ x: { x: JSON.rawJSON(1), y: JSON.rawJSON(2) } })
+  );
+})();
+
+(function TestArray() {
+  assertEquals([1], JSON.parse('[1.0]', GenerateParseReviverFunction(['1.0'])));
+  assertEquals(
+    [1.1],
+    JSON.parse('[1.1]', GenerateParseReviverFunction(['1.1']))
+  );
+  assertEquals([], JSON.parse('[]', GenerateParseReviverFunction([])));
+  assertEquals(
+    [1, '2', true, null, { x: 1, y: 1 }],
+    JSON.parse(
+      '[1, "2", true, null, {"x": 1, "y": 1}]',
+      GenerateParseReviverFunction(['1', '"2"', 'true', 'null', '1', '1'])
+    )
+  );
+
+  assertEquals('[1,1.1]', JSON.stringify([JSON.rawJSON(1), JSON.rawJSON(1.1)]));
+  assertEquals(
+    '["1",true,null,false]',
+    JSON.stringify([
+      JSON.rawJSON('"1"'),
+      JSON.rawJSON(true),
+      JSON.rawJSON(null),
+      JSON.rawJSON(false),
+    ])
+  );
+  assertEquals(
+    '[{"x":1,"y":1}]',
+    JSON.stringify([{ x: JSON.rawJSON(1), y: JSON.rawJSON(1) }])
+  );
+})();
+
+function assertIsRawJson(rawJson, expectedRawJsonValue) {
+  assertEquals(null, Object.getPrototypeOf(rawJson));
+  assertTrue(Object.hasOwn(rawJson, 'rawJSON'));
+  assertEquals(['rawJSON'], Object.getOwnPropertyNames(rawJson));
+  assertEquals([], Object.getOwnPropertySymbols(rawJson));
+  assertEquals(expectedRawJsonValue, rawJson.rawJSON);
+}
+
+(function TestRawJson() {
+  assertIsRawJson(JSON.rawJSON(1), '1');
+  assertIsRawJson(JSON.rawJSON(null), 'null');
+  assertIsRawJson(JSON.rawJSON(true), 'true');
+  assertIsRawJson(JSON.rawJSON(false), 'false');
+  assertIsRawJson(JSON.rawJSON('"foo"'), '"foo"');
+
+  assertThrows(() => {
+    JSON.rawJSON(Symbol('123'));
+  }, TypeError);
+
+  assertThrows(() => {
+    JSON.rawJSON(undefined);
+  }, SyntaxError);
+
+  assertThrows(() => {
+    JSON.rawJSON({});
+  }, SyntaxError);
+
+  assertThrows(() => {
+    JSON.rawJSON([]);
+  }, SyntaxError);
+
+  const ILLEGAL_END_CHARS = ['\n', '\t', '\r', ' '];
+  for (const char of ILLEGAL_END_CHARS) {
+    assertThrows(() => {
+      JSON.rawJSON(`${char}123`);
+    }, SyntaxError);
+    assertThrows(() => {
+      JSON.rawJSON(`123${char}`);
+    }, SyntaxError);
+  }
+
+  assertThrows(() => {
+    JSON.rawJSON('');
+  }, SyntaxError);
+
+  const values = [1, 1.1, null, false, true, '123'];
+  for (const value of values) {
+    assertFalse(JSON.isRawJSON(value));
+    assertTrue(JSON.isRawJSON(JSON.rawJSON(value)));
+  }
+  assertFalse(JSON.isRawJSON(undefined));
+  assertFalse(JSON.isRawJSON(Symbol('123')));
+  assertFalse(JSON.isRawJSON([]));
+  assertFalse(JSON.isRawJSON({ rawJSON: '123' }));
+})();
+
+(function TestReviverModifyJsonValue() {
+  {
+    let reviverCallIndex = 0;
+    const expectedKeys = ['a', 'b', 'c', ''];
+    const reviver = function(key, value, {source}) {
+      assertEquals(expectedKeys[reviverCallIndex++], key);
+      if (key == 'a') {
+        this.b = 2;
+        assertEquals('0', source);
+      } else if (key == 'b') {
+        this.c = 3;
+        assertEquals(2, value);
+        assertEquals('1', source);
+      } else if (key == 'c') {
+        assertEquals(3, value);
+        assertEquals(undefined, source);
+      }
+      return value;
+    }
+    assertEquals({a: 0, b: 2, c: 3}, JSON.parse('{"a": 0, "b": 1, "c": [1, 2]}', reviver));
+  }
+  {
+    let reviverCallIndex = 0;
+    const expectedKeys = ['0', '1', '2', '3', ''];
+    const reviver = function(key, value, {source}) {
+      assertEquals(expectedKeys[reviverCallIndex++], key);
+      if (key == '0') {
+        this[1] = 3;
+        assertEquals(1, value);
+        assertEquals('1', source);
+      } else if (key == '1') {
+        this[2] = 4;
+        assertEquals(3, value);
+        assertEquals('2', source);
+      } else if(key == '2') {
+        this[3] = 5;
+        assertEquals(4, value);
+        assertEquals('3', source);
+      } else if(key == '5'){
+        assertEquals(5, value);
+        assertEquals(undefined, source);
+      }
+      return value;
+    }
+    assertEquals([1, 3, 4, 5], JSON.parse('[1, 2, 3, {"a": 1}]', reviver));
+  }
+})();
diff --git a/deps/v8/test/mjsunit/harmony/regexp-unicode-sets.js b/deps/v8/test/mjsunit/harmony/regexp-unicode-sets.js
new file mode 100644
index 00000000000000..19f95bbffbdf24
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/regexp-unicode-sets.js
@@ -0,0 +1,143 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-regexp-unicode-sets
+
+// u and v are not allowed together.
+assertEarlyError('/./uv');
+assertThrowsAtRuntime("new RegExp('.','uv')", SyntaxError);
+
+assertEquals('v', /./v.flags);
+assertTrue(/./v.unicodeSets);
+
+// Characters that require escaping within a character class in /v mode
+assertEarlyError('/[(]/v');
+assertEarlyError('/[)]/v');
+assertEarlyError('/[[]/v');
+assertEarlyError('/[]]/v');
+assertEarlyError('/[{]/v');
+assertEarlyError('/[}]/v');
+assertEarlyError('/[/]/v');
+assertEarlyError('/[-]/v');
+// Need to escape the backslash, as assertEarlyError uses eval().
+assertEarlyError('/[\\]/v');
+assertEarlyError('/[|]/v');
+
+assertEarlyError('/[&&]/v');
+assertEarlyError('/[!!]/v');
+assertEarlyError('/[##]/v');
+assertEarlyError('/[$$]/v');
+assertEarlyError('/[%%]/v');
+assertEarlyError('/[**]/v');
+assertEarlyError('/[++]/v');
+assertEarlyError('/[,,]/v');
+assertEarlyError('/[..]/v');
+assertEarlyError('/[::]/v');
+assertEarlyError('/[;;]/v');
+assertEarlyError('/[<<]/v');
+assertEarlyError('/[==]/v');
+assertEarlyError('/[>>]/v');
+assertEarlyError('/[??]/v');
+assertEarlyError('/[@@]/v');
+// The first ^ negates the class. The following two are not valid.
+assertEarlyError('/[^^^]/v');
+assertEarlyError('/[``]/v');
+assertEarlyError('/[~~]/v');
+
+assertEarlyError('/[a&&&]/v');
+assertEarlyError('/[&&&a]/v');
+
+const allAscii = Array.from(
+    {length: 127}, (v, i) => { return String.fromCharCode(i); });
+
+function check(re, expectMatch, expectNoMatch) {
+  if (expectNoMatch === undefined) {
+    const expectSet = new Set(expectMatch.map(val => {
+      return (typeof val == 'number') ? String(val) : val; }));
+    expectNoMatch = allAscii.filter(val => !expectSet.has(val));
+  }
+  for (const match of expectMatch) {
+    assertTrue(re.test(match), `${re}.test(${match})`);
+  }
+  for (const noMatch of expectNoMatch) {
+    assertFalse(re.test(noMatch), `${re}.test(${noMatch})`);
+  }
+  // Nest the current RegExp in a negated class and check expectations are
+  // inversed.
+  const inverted = new RegExp(`[^${re.source}]`, re.flags);
+  for (const match of expectMatch) {
+    assertFalse(inverted.test(match), `${inverted}.test(${match})`);
+  }
+  for (const noMatch of expectNoMatch) {
+    assertTrue(inverted.test(noMatch), `${inverted}.test(${noMatch})`);
+  }
+}
+
+// Union with nested class
+check(
+    /[\da-f[xy][^[^z]]]/v, Array.from('0123456789abcdefxyz'),
+    Array.from('ghijklmnopqrstuv!?'));
+
+// Intersections
+check(/[\d&&[0-9]]/v, Array.from('0123456789'), []);
+check(/[\d&&0]/v, [0], Array.from('123456789'));
+check(/[\d&&9]/v, [9], Array.from('012345678'));
+check(/[\d&&[02468]]/v, Array.from('02468'), Array.from('13579'));
+check(/[\d&&[13579]]/v, Array.from('13579'), Array.from('02468'));
+check(
+    /[\w&&[^a-zA-Z_]]/v, Array.from('0123456789'),
+    Array.from('abcdxyzABCDXYZ_!?'));
+check(
+    /[^\w&&[a-zA-Z_]]/v, Array.from('0123456789!?'),
+    Array.from('abcdxyzABCDXYZ_'));
+
+// Subtractions
+check(/[\d--[!-%]]/v, Array.from('0123456789'));
+check(/[\d--[A-Z]]/v, Array.from('0123456789'));
+check(/[\d--[0-9]]/v, []);
+check(/[\d--[\w]]/v, []);
+check(/[\d--0]/v, Array.from('123456789'));
+check(/[\d--9]/v, Array.from('012345678'));
+check(/[[\d[a-c]]--9]/v, Array.from('012345678abc'));
+check(/[\d--[02468]]/v, Array.from('13579'));
+check(/[\d--[13579]]/v, Array.from('02468'));
+check(/[[3-7]--[0-9]]/v, []);
+check(/[[3-7]--[0-7]]/v, []);
+check(/[[3-7]--[3-9]]/v, []);
+check(/[[3-79]--[0-7]]/v, [9]);
+check(/[[3-79]--[3-9]]/v, []);
+check(/[[3-7]--[0-3]]/v, Array.from('4567'));
+check(/[[3-7]--[0-5]]/v, Array.from('67'));
+check(/[[3-7]--[7-9]]/v, Array.from('3456'));
+check(/[[3-7]--[5-9]]/v, Array.from('34'));
+check(/[[3-7a-c]--[0-3]]/v, Array.from('4567abc'));
+check(/[[3-7a-c]--[0-5]]/v, Array.from('67abc'));
+check(/[[3-7a-c]--[7-9]]/v, Array.from('3456abc'));
+check(/[[3-7a-c]--[5-9]]/v, Array.from('34abc'));
+check(/[[2-8]--[0-3]--5--[7-9]]/v, Array.from('46'));
+check(/[[2-57-8]--[0-3]--[5-7]]/v, Array.from('48'));
+check(/[[0-57-8]--[1-34]--[5-7]]/v, Array.from('08'));
+check(/[\d--[^02468]]/v, Array.from('02468'));
+check(/[\d--[^13579]]/v, Array.from('13579'));
+
+// Ignore-Case
+check(/[Ā-č]/v, Array.from('ĀāĂ㥹Ćć'), Array.from('abc'));
+check(/[ĀĂĄĆ]/vi, Array.from('ĀāĂ㥹Ćć'), Array.from('abc'));
+check(/[āăąć]/vi, Array.from('ĀāĂ㥹Ćć'), Array.from('abc'));
+
+// Some more sophisticated tests taken from
+// https://v8.dev/features/regexp-v-flag
+assertFalse(/[\p{Script_Extensions=Greek}--π]/v.test('π'));
+assertFalse(/[\p{Script_Extensions=Greek}--[αβγ]]/v.test('α'));
+assertFalse(/[\p{Script_Extensions=Greek}--[α-γ]]/v.test('β'));
+assertTrue(/[\p{Decimal_Number}--[0-9]]/v.test('𑜹'));
+assertFalse(/[\p{Decimal_Number}--[0-9]]/v.test('4'));
+assertTrue(/[\p{Script_Extensions=Greek}&&\p{Letter}]/v.test('π'));
+assertFalse(/[\p{Script_Extensions=Greek}&&\p{Letter}]/v.test('𐆊'));
+assertTrue(/[\p{White_Space}&&\p{ASCII}]/v.test('\n'));
+assertFalse(/[\p{White_Space}&&\p{ASCII}]/v.test('\u2028'));
+assertTrue(/[\p{Script_Extensions=Mongolian}&&\p{Number}]/v.test('᠗'));
+assertFalse(/[\p{Script_Extensions=Mongolian}&&\p{Number}]/v.test('ᠴ'));
+assertEquals('XXXXXX4#', 'aAbBcC4#'.replaceAll(/\p{Lowercase_Letter}/giv, 'X'));
+assertEquals('XXXXXX4#', 'aAbBcC4#'.replaceAll(/[^\P{Lowercase_Letter}]/giv, 'X'));
diff --git a/deps/v8/test/mjsunit/harmony/regress/regress-crbug-1367133.js b/deps/v8/test/mjsunit/harmony/regress/regress-crbug-1367133.js
new file mode 100644
index 00000000000000..a80d9b0be904ca
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/regress/regress-crbug-1367133.js
@@ -0,0 +1,28 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-change-array-by-copy
+// Flags: --allow-natives-syntax --stress-concurrent-inlining
+
+(function TestArray() {
+  function doCall(a, method, ...args) { a[method](); }
+  function callOnArray(a) { doCall(a, 'with'); a.keys(); }
+
+  %PrepareFunctionForOptimization(callOnArray);
+  callOnArray([1]);
+  doCall({}, 'valueOf', "foo");
+  %OptimizeFunctionOnNextCall(callOnArray);
+  callOnArray([{},]);
+})();
+
+(function TestTypedArray() {
+  function doCall(a, method, ...args) { a[method](); }
+  function callOnArray(a) { doCall(a, 'with'); a.keys(); }
+
+  %PrepareFunctionForOptimization(callOnArray);
+  callOnArray(new Uint8Array(32));
+  doCall({}, 'valueOf', "foo");
+  %OptimizeFunctionOnNextCall(callOnArray);
+  callOnArray(new Float64Array(8));
+})();
diff --git a/deps/v8/test/mjsunit/harmony/regress/regress-crbug-1372500.js b/deps/v8/test/mjsunit/harmony/regress/regress-crbug-1372500.js
new file mode 100644
index 00000000000000..6264570fdd3bd7
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/regress/regress-crbug-1372500.js
@@ -0,0 +1,14 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-symbol-as-weakmap-key --expose-gc
+
+// Register an object in a FinalizationRegistry with a Symbol as the unregister
+// token.
+let fr = new FinalizationRegistry(function () {});
+(function register() {
+  fr.register({}, "holdings", Symbol('unregisterToken'));
+})();
+// The unregister token should be dead, trigger its collection.
+gc();
diff --git a/deps/v8/test/mjsunit/harmony/symbol-as-weakmap-key.js b/deps/v8/test/mjsunit/harmony/symbol-as-weakmap-key.js
new file mode 100644
index 00000000000000..284e78b30196b7
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/symbol-as-weakmap-key.js
@@ -0,0 +1,108 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-symbol-as-weakmap-key --expose-gc --allow-natives-syntax --noincremental-marking
+
+(function TestWeakMapWithNonRegisteredSymbolKey() {
+  const key = Symbol('123');
+  const value = 1;
+  const map = new WeakMap();
+  assertFalse(map.has(key));
+  assertSame(undefined, map.get(key));
+  assertFalse(map.delete(key));
+  assertSame(map, map.set(key, value));
+  assertSame(value, map.get(key));
+  assertTrue(map.has(key));
+  assertTrue(map.delete(key));
+  assertFalse(map.has(key));
+  assertSame(undefined, map.get(key));
+  assertFalse(map.delete(key));
+  assertFalse(map.has(key));
+  assertSame(undefined, map.get(key));
+})();
+
+(function TestWeakMapWithNonRegisteredSymbolKeyGC() {
+  const map = new WeakMap();
+
+  const outerKey = Symbol('234');
+  const outerValue = 1;
+  map.set(outerKey, outerValue);
+  (function () {
+    const innerKey = Symbol('123');
+    const innerValue = 1;
+    map.set(innerKey, innerValue);
+    assertTrue(map.has(innerKey));
+    assertSame(innerValue, map.get(innerKey));
+  })();
+  gc();
+  assertTrue(map.has(outerKey));
+  assertSame(outerValue, map.get(outerKey));
+  assertEquals(1, %GetWeakCollectionSize(map));
+})();
+
+(function TestWeakMapWithRegisteredSymbolKey() {
+  const key = Symbol.for('123');
+  const value = 1;
+  const map = new WeakMap();
+  assertFalse(map.has(key));
+  assertSame(undefined, map.get(key));
+  assertFalse(map.delete(key));
+  assertThrows(() => {
+    map.set(key, value);
+  }, TypeError, 'Invalid value used as weak map key');
+  assertFalse(map.has(key));
+  assertSame(undefined, map.get(key));
+  assertFalse(map.delete(key));
+  assertFalse(map.has(key));
+  assertSame(undefined, map.get(key));
+})();
+
+(function TestWeakSetWithNonRegisteredSymbolKey() {
+  const key = Symbol('123');
+  const set = new WeakSet();
+  assertFalse(set.has(key));
+  assertFalse(set.delete(key));
+  assertSame(set, set.add(key));
+  assertTrue(set.has(key));
+  assertTrue(set.delete(key));
+  assertFalse(set.has(key));
+  assertFalse(set.delete(key));
+  assertFalse(set.has(key));
+})();
+
+(function TestWeakSetWithNonRegisteredSymbolKeyGC() {
+  const set = new WeakSet();
+  const outerKey = Symbol('234');
+  set.add(outerKey);
+  (function () {
+    const innerKey = Symbol('123');
+    set.add(innerKey);
+    assertTrue(set.has(innerKey));
+  })();
+  assertTrue(set.has(outerKey));
+  gc();
+  assertEquals(1, %GetWeakCollectionSize(set));
+})();
+
+(function TestWeakSetWithRegisteredSymbolKey() {
+  const key = Symbol.for('123');
+  const set = new WeakSet();
+  assertFalse(set.has(key));
+  assertFalse(set.delete(key));
+
+  assertThrows(() => {
+    assertSame(set, set.add(key));
+  }, TypeError, 'Invalid value used in weak set');
+
+  assertFalse(set.has(key));
+  assertFalse(set.delete(key));
+  assertFalse(set.has(key));
+})();
+
+(function TestFinalizationRegistryUnregister() {
+  const fr = new FinalizationRegistry(function() {});
+  const key = {};
+  fr.register(Symbol('foo'), "holdings", key);
+  fr.unregister(key);
+})();
diff --git a/deps/v8/test/mjsunit/harmony/typed-array-to-sorted.js b/deps/v8/test/mjsunit/harmony/typed-array-to-sorted.js
new file mode 100644
index 00000000000000..71eac41dcb783d
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/typed-array-to-sorted.js
@@ -0,0 +1,299 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-change-array-by-copy --harmony-rab-gsab
+// Flags: --allow-natives-syntax
+
+d8.file.execute('test/mjsunit/typedarray-helpers.js');
+
+const TAProto = Object.getPrototypeOf(Int8Array.prototype);
+
+function AssertToSortedAndSortSameResult(input, ...args) {
+  const orig = input.slice();
+  const s = TAProto.toSorted.apply(input, args);
+  const copy = input.slice();
+  TAProto.sort.apply(copy, args);
+
+  // The in-place sorted version should be pairwise equal to the toSorted
+  // version.
+  assertEquals(copy, s);
+
+  // The original input should be unchanged.
+  assertEquals(orig, input);
+
+  // The result of toSorted() is a copy.
+  assertFalse(s === input);
+}
+
+function TestToSortedBasicBehaviorHelper(input) {
+  // No custom comparator.
+  AssertToSortedAndSortSameResult(input);
+  // Custom comparator.
+  AssertToSortedAndSortSameResult(input, (x, y) => {
+    if (x < y) return -1;
+    if (x > y) return 1;
+    return 0;
+  });
+}
+
+(function TestSurface() {
+  for (let TA of ctors) {
+    assertEquals(1, TA.prototype.toSorted.length);
+    assertEquals("toSorted", TA.prototype.toSorted.name);
+  }
+})();
+
+(function TestBasic() {
+  for (let TA of ctors) {
+    let a = new TA(4);
+    for (let i = 0; i < 4; i++) {
+      WriteToTypedArray(a, i, (Math.random() * 100)|0);
+    }
+    TestToSortedBasicBehaviorHelper(a);
+  }
+})();
+
+(function TestResizableBuffer() {
+  for (let TA of ctors) {
+    const rab = CreateResizableArrayBuffer(4 * TA.BYTES_PER_ELEMENT,
+                                           8 * TA.BYTES_PER_ELEMENT);
+    const fixedLength = new TA(rab, 0, 4);
+    const fixedLengthWithOffset = new TA(rab, 2 * TA.BYTES_PER_ELEMENT, 2);
+    const lengthTracking = new TA(rab, 0);
+    const lengthTrackingWithOffset = new TA(rab, 2 * TA.BYTES_PER_ELEMENT);
+
+    // Write some data into the array.
+    const taWrite = new TA(rab);
+    for (let i = 0; i < 4; i++) {
+      WriteToTypedArray(taWrite, i, (Math.random() * 100)|0);
+    }
+
+    // a, b, c, d, below represent random values.
+    //
+    // Orig. array: [a, b, c, d]
+    //              [a, b, c, d] << fixedLength
+    //                    [c, d] << fixedLengthWithOffset
+    //              [a, b, c, d, ...] << lengthTracking
+    //                    [c, d, ...] << lengthTrackingWithOffset
+
+    TestToSortedBasicBehaviorHelper(fixedLength);
+    TestToSortedBasicBehaviorHelper(fixedLengthWithOffset);
+    TestToSortedBasicBehaviorHelper(lengthTracking);
+    TestToSortedBasicBehaviorHelper(lengthTrackingWithOffset);
+
+    // Shrink so that the TAs with offset go out of bounds.
+    rab.resize(1 * TA.BYTES_PER_ELEMENT);
+    WriteToTypedArray(taWrite, 0, 0);
+
+    assertThrows(() => { fixedLength.toSorted(); }, TypeError);
+    assertThrows(() => { fixedLengthWithOffset.toSorted(); }, TypeError);
+    TestToSortedBasicBehaviorHelper(lengthTracking);
+    assertThrows(() => { lengthTrackingWithOffset.toSorted(); }, TypeError);
+
+    // Shrink to zero.
+    rab.resize(0);
+
+    assertThrows(() => { fixedLength.toSorted(); }, TypeError);
+    assertThrows(() => { fixedLengthWithOffset.toSorted(); }, TypeError);
+    TestToSortedBasicBehaviorHelper(lengthTracking);
+    assertThrows(() => { lengthTrackingWithOffset.toSorted(); }, TypeError);
+
+    // Grow so that all TAs are back in-bounds.
+    rab.resize(6 * TA.BYTES_PER_ELEMENT);
+    for (let i = 0; i < 6; ++i) {
+      WriteToTypedArray(taWrite, i, (Math.random() * 100)|0);
+    }
+
+    // Orig. array: [a, b, c, d, e, f]
+    //              [a, b, c, d] << fixedLength
+    //                    [c, d] << fixedLengthWithOffset
+    //              [a, b, c, d, e, f, ...] << lengthTracking
+    //                    [c, d, e, f, ...] << lengthTrackingWithOffset
+
+    TestToSortedBasicBehaviorHelper(fixedLength);
+    TestToSortedBasicBehaviorHelper(fixedLengthWithOffset);
+    TestToSortedBasicBehaviorHelper(lengthTracking);
+    TestToSortedBasicBehaviorHelper(lengthTrackingWithOffset);
+  }
+})();
+
+(function TestComparatorShrinks() {
+  for (let TA of ctors) {
+    const rab = CreateResizableArrayBuffer(4 * TA.BYTES_PER_ELEMENT,
+                                           8 * TA.BYTES_PER_ELEMENT);
+    const lengthTracking = new TA(rab, 0);
+    for (let i = 0; i < 4; i++) {
+      WriteToTypedArray(lengthTracking, i, (Math.random() * 100)|0)
+    }
+
+    let resized = false;
+    const evilComparator = (x, y) => {
+      if (!resized) {
+        resized = true;
+        rab.resize(2 * TA.BYTES_PER_ELEMENT);
+      }
+      if (x < y) return -1;
+      if (x > y) return 1;
+      return 0;
+    };
+
+    // Shrinks don't affect toSorted because sorting is done on a snapshot taken
+    // at the beginning.
+    let s = lengthTracking.toSorted(evilComparator);
+    assertEquals(4, s.length);
+    // Source shrunk.
+    assertEquals(2, lengthTracking.length);
+  }
+})();
+
+(function TestComparatorGrows() {
+  for (let TA of ctors) {
+    const rab = CreateResizableArrayBuffer(4 * TA.BYTES_PER_ELEMENT,
+                                           8 * TA.BYTES_PER_ELEMENT);
+    const lengthTracking = new TA(rab, 0);
+    for (let i = 0; i < 4; i++) {
+      WriteToTypedArray(lengthTracking, i, (Math.random() * 100)|0)
+    }
+
+    let resized = false;
+    const evilComparator = (x, y) => {
+      if (!resized) {
+        resized = true;
+        rab.resize(6 * TA.BYTES_PER_ELEMENT);
+      }
+      if (x < y) return -1;
+      if (x > y) return 1;
+      return 0;
+    };
+
+    // Grows also don't affect toSorted because sorting is done on a snapshot
+    // taken at the beginning.
+    let s = lengthTracking.toSorted(evilComparator);
+    assertEquals(4, s.length);
+    // Source grew.
+    assertEquals(6, lengthTracking.length);
+  }
+})();
+
+(function TestComparatorDetaches() {
+  for (let TA of ctors) {
+    const rab = CreateResizableArrayBuffer(4 * TA.BYTES_PER_ELEMENT,
+                                           8 * TA.BYTES_PER_ELEMENT);
+    const lengthTracking = new TA(rab, 0);
+    for (let i = 0; i < 4; i++) {
+      WriteToTypedArray(lengthTracking, i, (Math.random() * 100)|0)
+    }
+
+    let detached = false;
+    const evilComparator = (x, y) => {
+      if (!detached) {
+        detached = true;
+        %ArrayBufferDetach(rab);
+      }
+      if (x < y) return -1;
+      if (x > y) return 1;
+      return 0;
+    };
+
+    // Detaching also don't affect toSorted because sorting is done on a snapshot
+    // taken at the beginning.
+    let s = lengthTracking.toSorted(evilComparator);
+    assertEquals(4, s.length);
+    // Source is detached.
+    assertEquals(0, lengthTracking.length);
+  }
+})();
+
+(function TestGrowableSAB() {
+  for (let TA of ctors) {
+    const gsab = CreateGrowableSharedArrayBuffer(4 * TA.BYTES_PER_ELEMENT,
+                                                 8 * TA.BYTES_PER_ELEMENT);
+    const fixedLength = new TA(gsab, 0, 4);
+    const fixedLengthWithOffset = new TA(gsab, 2 * TA.BYTES_PER_ELEMENT, 2);
+    const lengthTracking = new TA(gsab, 0);
+    const lengthTrackingWithOffset = new TA(gsab, 2 * TA.BYTES_PER_ELEMENT);
+
+    // Write some data into the array.
+    const taWrite = new TA(gsab);
+    for (let i = 0; i < 4; i++) {
+      WriteToTypedArray(taWrite, i, (Math.random() * 100)|0);
+    }
+
+    // Orig. array: [a, b, c, d]
+    //              [a, b, c, d] << fixedLength
+    //                    [c, d] << fixedLengthWithOffset
+    //              [a, b, c, d, ...] << lengthTracking
+    //                    [c, d, ...] << lengthTrackingWithOffset
+    TestToSortedBasicBehaviorHelper(fixedLength);
+    TestToSortedBasicBehaviorHelper(fixedLengthWithOffset);
+    TestToSortedBasicBehaviorHelper(lengthTracking);
+    TestToSortedBasicBehaviorHelper(lengthTrackingWithOffset);
+
+    // Grow.
+    gsab.grow(6 * TA.BYTES_PER_ELEMENT);
+    for (let i = 0; i < 6; ++i) {
+      WriteToTypedArray(taWrite, i, (Math.random() * 100)|0);
+    }
+
+    // Orig. array: [a, b, c, d, e, f]
+    //              [a, b, c, d] << fixedLength
+    //                    [c, d] << fixedLengthWithOffset
+    //              [a, b, c, d, e, f, ...] << lengthTracking
+    //                    [c, d, e, f, ...] << lengthTrackingWithOffset
+    TestToSortedBasicBehaviorHelper(fixedLength);
+    TestToSortedBasicBehaviorHelper(fixedLengthWithOffset);
+    TestToSortedBasicBehaviorHelper(lengthTracking);
+    TestToSortedBasicBehaviorHelper(lengthTrackingWithOffset);
+  }
+})();
+
+(function TestComparatorGrows() {
+  for (let TA of ctors) {
+    const gsab = CreateGrowableSharedArrayBuffer(4 * TA.BYTES_PER_ELEMENT,
+                                                 8 * TA.BYTES_PER_ELEMENT);
+    const lengthTracking = new TA(gsab, 0);
+    for (let i = 0; i < 4; i++) {
+      WriteToTypedArray(lengthTracking, i, (Math.random() * 100)|0)
+    }
+
+    let resized = false;
+    const evilComparator = (x, y) => {
+      if (!resized) {
+        resized = true;
+        gsab.grow(6 * TA.BYTES_PER_ELEMENT);
+      }
+      if (x < y) return -1;
+      if (x > y) return 1;
+      return 0;
+    };
+
+    // Grows also don't affect toSorted because sorting is done on a snapshot
+    // taken at the beginning.
+    let s = lengthTracking.toSorted(evilComparator);
+    assertEquals(4, s.length);
+    // Source grew.
+    assertEquals(6, lengthTracking.length);
+  }
+})();
+
+(function TestNonTypedArray() {
+  for (let TA of ctors) {
+    assertThrows(() => { TA.prototype.toSorted.call([1,2,3,4]); }, TypeError);
+  }
+})();
+
+(function TestDetached() {
+  for (let TA of ctors) {
+    let a = new TA(4);
+    %ArrayBufferDetach(a.buffer);
+    assertThrows(() => { a.toSorted(); }, TypeError);
+  }
+})();
+
+(function TestNoSpecies() {
+  class MyUint8Array extends Uint8Array {
+    static get [Symbol.species]() { return MyUint8Array; }
+  }
+  assertEquals(Uint8Array, (new MyUint8Array()).toSorted().constructor);
+})();
diff --git a/deps/v8/test/mjsunit/harmony/weakrefs/basics.js b/deps/v8/test/mjsunit/harmony/weakrefs/basics.js
index f879df9a2a63b0..7628c641bc7984 100644
--- a/deps/v8/test/mjsunit/harmony/weakrefs/basics.js
+++ b/deps/v8/test/mjsunit/harmony/weakrefs/basics.js
@@ -47,7 +47,7 @@
 
 (function TestRegisterWithNonObjectTarget() {
   let fg = new FinalizationRegistry(() => {});
-  let message = "FinalizationRegistry.prototype.register: target must be an object";
+  let message = "FinalizationRegistry.prototype.register: invalid target";
   assertThrows(() => fg.register(1, "holdings"), TypeError, message);
   assertThrows(() => fg.register(false, "holdings"), TypeError, message);
   assertThrows(() => fg.register("foo", "holdings"), TypeError, message);
@@ -116,7 +116,7 @@
 })();
 
 (function TestWeakRefConstructorWithNonObject() {
-  let message = "WeakRef: target must be an object";
+  let message = "WeakRef: invalid target";
   assertThrows(() => new WeakRef(), TypeError, message);
   assertThrows(() => new WeakRef(1), TypeError, message);
   assertThrows(() => new WeakRef(false), TypeError, message);
diff --git a/deps/v8/test/mjsunit/harmony/weakrefs/symbol-as-weakref-target-gc.js b/deps/v8/test/mjsunit/harmony/weakrefs/symbol-as-weakref-target-gc.js
new file mode 100644
index 00000000000000..561bf4f058bdd7
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/weakrefs/symbol-as-weakref-target-gc.js
@@ -0,0 +1,39 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-symbol-as-weakmap-key --expose-gc --noincremental-marking
+
+(function TestWeakRefWithSymbolGC() {
+  let weakRef;
+  {
+    const innerKey = Symbol('123');
+    weakRef = new WeakRef(innerKey);
+  }
+  // Since the WeakRef was created during this turn, it is not cleared by GC.
+  gc();
+  assertNotEquals(undefined, weakRef.deref());
+  // Next task.
+  setTimeout(() => {
+    gc();
+    assertEquals(undefined, weakRef.deref());
+  }, 0);
+})();
+
+(function TestFinalizationRegistryWithSymbolGC() {
+  let cleanUpCalled = false;
+  const fg = new FinalizationRegistry((target) => {
+    assertEquals('123', target);
+    cleanUpCalled = true;
+  });
+  (function () {
+    const innerKey = Symbol('123');
+    fg.register(innerKey, '123');
+  })();
+  gc();
+  assertFalse(cleanUpCalled);
+  // Check that cleanup callback was called in a follow up task.
+  setTimeout(() => {
+    assertTrue(cleanUpCalled);
+  }, 0);
+})();
diff --git a/deps/v8/test/mjsunit/harmony/weakrefs/symbol-as-weakref-target.js b/deps/v8/test/mjsunit/harmony/weakrefs/symbol-as-weakref-target.js
new file mode 100644
index 00000000000000..1dc874ed83b3da
--- /dev/null
+++ b/deps/v8/test/mjsunit/harmony/weakrefs/symbol-as-weakref-target.js
@@ -0,0 +1,41 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-symbol-as-weakmap-key
+
+(function TestRegisterWithSymbolTarget() {
+  const fg = new FinalizationRegistry(() => { });
+  fg.register(Symbol('123'), 'holdings');
+  // Registered symbols cannot be the target.
+  assertThrows(() => fg.register(Symbol.for('123'), 'holdings'), TypeError);
+})();
+
+(function TestRegisterWithSymbolUnregisterToken() {
+  const fg = new FinalizationRegistry(() => { });
+  fg.register({}, 'holdings', Symbol('123'));
+  // Registered symbols cannot be the unregister token.
+  assertThrows(() => fg.register({}, 'holdings', Symbol.for('123')), TypeError);
+})();
+
+(function TestRegisterSymbolAndHoldingsSameValue() {
+  const fg = new FinalizationRegistry(() => {});
+  const obj = Symbol('123');
+  // SameValue(target, holdings) not ok.
+  assertThrows(() => fg.register(obj, obj), TypeError);
+  const holdings = {a: 1};
+  fg.register(obj, holdings);
+})();
+
+(function TestUnregisterWithSymbolUnregisterToken() {
+  const fg = new FinalizationRegistry(() => {});
+  fg.unregister(Symbol('123'));
+  // Registered symbols cannot be the unregister token.
+  assertThrows(() => fg.unregister(Symbol.for('123')), TypeError);
+})();
+
+(function TestWeakRefConstructorWithSymbol() {
+  new WeakRef(Symbol('123'));
+  // Registered symbols cannot be the WeakRef target.
+  assertThrows(() => new WeakRef(Symbol.for('123')), TypeError);
+})();
diff --git a/deps/v8/test/mjsunit/json.js b/deps/v8/test/mjsunit/json.js
index 37d427aa83b339..9732f08bfe73a5 100644
--- a/deps/v8/test/mjsunit/json.js
+++ b/deps/v8/test/mjsunit/json.js
@@ -489,6 +489,9 @@ assertTrue(Object.prototype.isPrototypeOf(o2));
 var json = '{"stuff before slash\\\\stuff after slash":"whatever"}';
 TestStringify(json, JSON.parse(json));
 
+// TODO(v8:12955): JSON parse with source access will assert failed when the
+// reviver modifies the json value like this. See
+// https://github.com/tc39/proposal-json-parse-with-source/issues/35.
 
 // https://bugs.chromium.org/p/v8/issues/detail?id=3139
 
diff --git a/deps/v8/test/mjsunit/maglev/omit-default-ctors-array-iterator.js b/deps/v8/test/mjsunit/maglev/omit-default-ctors-array-iterator.js
new file mode 100644
index 00000000000000..7131912abcec26
--- /dev/null
+++ b/deps/v8/test/mjsunit/maglev/omit-default-ctors-array-iterator.js
@@ -0,0 +1,32 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --omit-default-ctors --allow-natives-syntax --maglev
+
+// This behavior is not spec compliant, see crbug.com/v8/13249.
+(function ArrayIteratorMonkeyPatched() {
+  let iterationCount = 0;
+  const oldIterator = Array.prototype[Symbol.iterator];
+  Array.prototype[Symbol.iterator] =
+      function () { ++iterationCount; return oldIterator.call(this); };
+
+  class A {}
+  class B extends A {}
+  class C extends B {}
+
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeMaglevOnNextCall(C);
+
+  // C default ctor doing "...args" and B default ctor doing "...args".
+  assertEquals(2, iterationCount);
+
+  new C();
+
+  // C default ctor doing "...args" and B default ctor doing "...args".
+  assertEquals(4, iterationCount);
+  assertTrue(isMaglevved(C));  // No deopt.
+
+  Array.prototype[Symbol.iterator] = oldIterator;
+})();
diff --git a/deps/v8/test/mjsunit/maglev/omit-default-ctors.js b/deps/v8/test/mjsunit/maglev/omit-default-ctors.js
new file mode 100644
index 00000000000000..430a1118b8d5e2
--- /dev/null
+++ b/deps/v8/test/mjsunit/maglev/omit-default-ctors.js
@@ -0,0 +1,740 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --omit-default-ctors --allow-natives-syntax --maglev
+
+(function OmitDefaultBaseCtor() {
+  class A {};  // default base ctor -> will be omitted
+  class B extends A {};
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeMaglevOnNextCall(B);
+  const o = new B();
+  assertSame(B.prototype, o.__proto__);
+  assertTrue(isMaglevved(B));  // No deopt.
+})();
+
+(function OmitDefaultDerivedCtor() {
+  class A { constructor() {} };
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B {};
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeMaglevOnNextCall(C);
+  const o = new C();
+  assertSame(C.prototype, o.__proto__);
+  assertTrue(isMaglevved(C));  // No deopt.
+})();
+
+(function OmitDefaultBaseAndDerivedCtor() {
+  class A {}; // default base ctor -> will be omitted
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B {};
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeMaglevOnNextCall(C);
+  const o = new C();
+  assertSame(C.prototype, o.__proto__);
+  assertTrue(isMaglevved(C));  // No deopt.
+})();
+
+(function OmitDefaultBaseCtorWithExplicitSuper() {
+  class A {};  // default base ctor -> will be omitted
+  class B extends A { constructor() { super(); } };
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeMaglevOnNextCall(B);
+  const o = new B();
+  assertSame(B.prototype, o.__proto__);
+  assertTrue(isMaglevved(B));  // No deopt.
+})();
+
+(function OmitDefaultDerivedCtorWithExplicitSuper() {
+  class A { constructor() {} };
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B { constructor() { super(); } };
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeMaglevOnNextCall(C);
+  const o = new C();
+  assertSame(C.prototype, o.__proto__);
+  assertTrue(isMaglevved(C));  // No deopt.
+})();
+
+(function OmitDefaultBaseAndDerivedCtorWithExplicitSuper() {
+  class A {}; // default base ctor -> will be omitted
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B { constructor() { super(); } };
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeMaglevOnNextCall(C);
+  const o = new C();
+  assertSame(C.prototype, o.__proto__);
+  assertTrue(isMaglevved(C));  // No deopt.
+})();
+
+(function OmitDefaultBaseCtorWithExplicitSuperAndNonFinalSpread() {
+  class A {};  // default base ctor -> will be omitted
+  class B extends A { constructor(...args) { super(1, ...args, 2); } };
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeMaglevOnNextCall(B);
+  const o = new B(3, 4);
+  assertSame(B.prototype, o.__proto__);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13337
+  // assertTrue(isMaglevved(B));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isMaglevved(B));
+})();
+
+(function OmitDefaultDerivedCtorWithExplicitSuperAndNonFinalSpread() {
+  class A { constructor() {} };
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B { constructor(...args) { super(1, ...args, 2); } };
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeMaglevOnNextCall(C);
+  const o = new C(3, 4);
+  assertSame(C.prototype, o.__proto__);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13337
+  // assertTrue(isMaglevved(C));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isMaglevved(C));
+})();
+
+(function OmitDefaultBaseAndDerivedCtorWithExplicitSuperAndNonFinalSpread() {
+  class A {}; // default base ctor -> will be omitted
+  class B extends A {};  // default derived ctor -> will be omitted
+  class C extends B { constructor(...args) { super(1, ...args, 2); } };
+  %PrepareFunctionForOptimization(C);
+  new C();
+  %OptimizeMaglevOnNextCall(C);
+  const o = new C(3, 4);
+  assertSame(C.prototype, o.__proto__);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13337
+  // assertTrue(isMaglevved(C));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isMaglevved(C));
+})();
+
+(function NonDefaultBaseConstructorCalled() {
+  let ctorCallCount = 0;
+  let lastArgs;
+  class Base {
+    constructor(...args) {
+      ++ctorCallCount;
+      this.baseTagged = true;
+      lastArgs = args;
+    }
+  };
+  // Nothing will be omitted.
+  class A extends Base {};
+  %PrepareFunctionForOptimization(A);
+  new A();
+  %OptimizeMaglevOnNextCall(A);
+  const a = new A(1, 2, 3);
+  assertEquals(2, ctorCallCount);
+  assertEquals([1, 2, 3], lastArgs);
+  assertTrue(a.baseTagged);
+  assertTrue(isMaglevved(A));  // No deopt.
+
+  // 'A' default ctor will be omitted.
+  class B1 extends A {};
+  %PrepareFunctionForOptimization(B1);
+  new B1();
+  %OptimizeMaglevOnNextCall(B1);
+  const b1 = new B1(4, 5, 6);
+  assertEquals(4, ctorCallCount);
+  assertEquals([4, 5, 6], lastArgs);
+  assertTrue(b1.baseTagged);
+  assertTrue(isMaglevved(B1));  // No deopt.
+
+  // The same test with non-final spread; 'A' default ctor will be omitted.
+  class B2 extends A {
+    constructor(...args) { super(1, ...args, 2); }
+  };
+  %PrepareFunctionForOptimization(B2);
+  new B2();
+  %OptimizeMaglevOnNextCall(B2);
+  const b2 = new B2(4, 5, 6);
+  assertEquals(6, ctorCallCount);
+  assertEquals([1, 4, 5, 6, 2], lastArgs);
+  assertTrue(b2.baseTagged);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13337
+  // assertTrue(isMaglevved(B2));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isMaglevved(B2));  // No deopt.
+})();
+
+(function NonDefaultDerivedConstructorCalled() {
+  let ctorCallCount = 0;
+  let lastArgs;
+  class Base {};
+  class Derived extends Base {
+    constructor(...args) {
+      super();
+      ++ctorCallCount;
+      this.derivedTagged = true;
+      lastArgs = args;
+    }
+  };
+  // Nothing will be omitted.
+  class A extends Derived {};
+  %PrepareFunctionForOptimization(A);
+  new A();
+  %OptimizeMaglevOnNextCall(A);
+  const a = new A(1, 2, 3);
+  assertEquals(2, ctorCallCount);
+  assertEquals([1, 2, 3], lastArgs);
+  assertTrue(a.derivedTagged);
+  assertTrue(isMaglevved(A));  // No deopt.
+
+  // 'A' default ctor will be omitted.
+  class B1 extends A {};
+  %PrepareFunctionForOptimization(B1);
+  new B1();
+  %OptimizeMaglevOnNextCall(B1);
+  const b1 = new B1(4, 5, 6);
+  assertEquals(4, ctorCallCount);
+  assertEquals([4, 5, 6], lastArgs);
+  assertTrue(b1.derivedTagged);
+  assertTrue(isMaglevved(B1));  // No deopt.
+
+  // The same test with non-final spread. 'A' default ctor will be omitted.
+  class B2 extends A {
+    constructor(...args) { super(1, ...args, 2); }
+  };
+  %PrepareFunctionForOptimization(B2);
+  new B2();
+  %OptimizeMaglevOnNextCall(B2);
+  const b2 = new B2(4, 5, 6);
+  assertEquals(6, ctorCallCount);
+  assertEquals([1, 4, 5, 6, 2], lastArgs);
+  assertTrue(b2.derivedTagged);
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=13337
+  // assertTrue(isMaglevved(B2));  // No deopt.
+  // This assert will fail when the above bug is fixed:
+  assertFalse(isMaglevved(B2));  // No deopt.
+})();
+
+(function BaseFunctionCalled() {
+  let baseFunctionCallCount = 0;
+  function BaseFunction() {
+    ++baseFunctionCallCount;
+    this.baseTagged = true;
+  }
+
+  class A1 extends BaseFunction {};
+  %PrepareFunctionForOptimization(A1);
+  new A1();
+  %OptimizeMaglevOnNextCall(A1);
+  const a1 = new A1();
+  assertEquals(2, baseFunctionCallCount);
+  assertTrue(a1.baseTagged);
+  assertTrue(isMaglevved(A1));  // No deopt.
+
+  class A2 extends BaseFunction {
+    constructor(...args) { super(1, ...args, 2); }
+  };
+  %PrepareFunctionForOptimization(A2);
+  new A2();
+  %OptimizeMaglevOnNextCall(A2);
+  const a2 = new A2();
+  assertEquals(4, baseFunctionCallCount);
+  assertTrue(a2.baseTagged);
+  assertTrue(isMaglevved(A2));  // No deopt.
+})();
+
+(function NonSuperclassCtor() {
+  class A {};
+  class B extends A {};
+  class C extends B {};
+  class D1 extends C {};
+  class D2 extends C { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C);
+  %PrepareFunctionForOptimization(D1);
+  %PrepareFunctionForOptimization(D2);
+  new C();
+  new D1();
+  new D2();
+  %OptimizeMaglevOnNextCall(C);
+  %OptimizeMaglevOnNextCall(D1);
+  %OptimizeMaglevOnNextCall(D2);
+
+  // Install an object which is not a constructor into the class hierarchy.
+  C.__proto__ = {};
+
+  assertThrows(() => { new C(); }, TypeError);
+  assertThrows(() => { new D1(); }, TypeError);
+  assertThrows(() => { new D2(); }, TypeError);
+})();
+
+(function ArgumentsEvaluatedBeforeNonSuperclassCtorDetected() {
+  class A {};
+  class B extends A {};
+  class C extends B {};
+  class D1 extends C {};
+  class D2 extends C { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C);
+  %PrepareFunctionForOptimization(D1);
+  %PrepareFunctionForOptimization(D2);
+  new C();
+  new D1();
+  new D2();
+  %OptimizeMaglevOnNextCall(C);
+  %OptimizeMaglevOnNextCall(D1);
+  %OptimizeMaglevOnNextCall(D2);
+
+  // Install an object which is not a constructor into the class hierarchy.
+  C.__proto__ = {};
+
+  let callCount = 0;
+  function foo() {
+    ++callCount;
+  }
+
+  assertThrows(() => { new C(foo()); }, TypeError);
+  assertEquals(1, callCount);
+
+  assertThrows(() => { new D1(foo()); }, TypeError);
+  assertEquals(2, callCount);
+
+  assertThrows(() => { new D2(foo()); }, TypeError);
+  assertEquals(3, callCount);
+})();
+
+(function ArgumentsEvaluatedBeforeNonSuperclassCtorDetected2() {
+  class A {};
+  class B extends A {};
+  class C extends B {};
+  class D1 extends C {
+    constructor() {
+      super(foo());
+    }
+  };
+
+  class D2 extends C {
+    constructor(...args) {
+      super(...args, foo());
+    }
+  };
+
+  let callCount = 0;
+  function foo() {
+    ++callCount;
+  }
+
+  %PrepareFunctionForOptimization(D1);
+  %PrepareFunctionForOptimization(D2);
+  new D1();
+  new D2();
+  %OptimizeMaglevOnNextCall(D1);
+  %OptimizeMaglevOnNextCall(D2);
+  assertEquals(2, callCount);
+
+  // Install an object which is not a constructor into the class hierarchy.
+  C.__proto__ = {};
+
+  assertThrows(() => { new D1(); }, TypeError);
+  assertEquals(3, callCount);
+
+  assertThrows(() => { new D2(); }, TypeError);
+  assertEquals(4, callCount);
+})();
+
+(function EvaluatingArgumentsChangesClassHierarchy() {
+  let ctorCallCount = 0;
+  class A {};
+  class B extends A { constructor() {
+    super();
+    ++ctorCallCount;
+  }};
+  class C extends B {};
+  class D extends C {
+    constructor() {
+      super(foo());
+    }
+  };
+
+  let fooCallCount = 0;
+  let changeHierarchy = false;
+  function foo() {
+    if (changeHierarchy) {
+      C.__proto__ = A;
+      C.prototype.__proto__ = A.prototype;
+    }
+    ++fooCallCount;
+  }
+
+  %PrepareFunctionForOptimization(D);
+  new D();
+  assertEquals(1, fooCallCount);
+  assertEquals(1, ctorCallCount);
+  %OptimizeMaglevOnNextCall(D);
+  changeHierarchy = true;
+
+  new D();
+  assertEquals(2, fooCallCount);
+  assertEquals(1, ctorCallCount);
+  // No deopt (Maglev doesn't depend on the prototype chain not being mutated).
+  assertTrue(isMaglevved(D));
+})();
+
+// The same test as the previous one, but with a ctor with a non-final spread.
+(function EvaluatingArgumentsChangesClassHierarchyThisTimeWithNonFinalSpread() {
+  let ctorCallCount = 0;
+  class A {};
+  class B extends A { constructor() {
+    super();
+    ++ctorCallCount;
+  }};
+  class C extends B {};
+  class D extends C {
+    constructor(...args) {
+      super(...args, foo());
+    }
+  };
+
+  let fooCallCount = 0;
+  let changeHierarchy = false;
+  function foo() {
+    if (changeHierarchy) {
+      C.__proto__ = A;
+      C.prototype.__proto__ = A.prototype;
+    }
+    ++fooCallCount;
+  }
+
+  %PrepareFunctionForOptimization(D);
+  new D();
+  assertEquals(1, fooCallCount);
+  assertEquals(1, ctorCallCount);
+  %OptimizeMaglevOnNextCall(D);
+  changeHierarchy = true;
+
+  new D();
+  assertEquals(2, fooCallCount);
+  assertEquals(1, ctorCallCount);
+  // No deopt (Maglev doesn't depend on the prototype chain not being mutated).
+  assertTrue(isMaglevved(D));
+})();
+
+(function BasePrivateField() {
+  class A {
+   #aBrand = true;
+   isA() {
+    return #aBrand in this;
+   }
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeMaglevOnNextCall(B);
+
+  const b = new B();
+  assertTrue(b.isA());
+  assertTrue(isMaglevved(B));  // No deopt.
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  assertTrue(c1.isA());
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  assertTrue(c2.isA());
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
+
+(function DerivedPrivateField() {
+  class A {};
+  class B extends A {
+    #bBrand = true;
+    isB() {
+     return #bBrand in this;
+    }
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  assertTrue(c1.isB());
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  assertTrue(c2.isB());
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
+
+(function BasePrivateMethod() {
+  class A {
+   #m() { return 'private'; }
+   callPrivate() {
+    return this.#m();
+   }
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeMaglevOnNextCall(B);
+
+  const b = new B();
+  assertEquals('private', b.callPrivate());
+  assertTrue(isMaglevved(B));  // No deopt.
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  assertEquals('private', c1.callPrivate());
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  assertEquals('private', c2.callPrivate());
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
+
+(function DerivedPrivateMethod() {
+  class A {};
+  class B extends A {
+    #m() { return 'private'; }
+    callPrivate() {
+     return this.#m();
+    }
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  assertEquals('private', c1.callPrivate());
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  assertEquals('private', c2.callPrivate());
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
+
+(function BasePrivateGetter() {
+  class A {
+   get #p() { return 'private'; }
+   getPrivate() {
+    return this.#p;
+   }
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeMaglevOnNextCall(B);
+
+  const b = new B();
+  assertEquals('private', b.getPrivate());
+  assertTrue(isMaglevved(B));  // No deopt.
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  assertEquals('private', c1.getPrivate());
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  assertEquals('private', c2.getPrivate());
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
+
+(function DerivedPrivateGetter() {
+  class A {};
+  class B extends A {
+    get #p() { return 'private'; }
+    getPrivate() {
+     return this.#p;
+    }
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  assertEquals('private', c1.getPrivate());
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  assertEquals('private', c2.getPrivate());
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
+
+(function BasePrivateSetter() {
+  class A {
+   set #p(value) { this.secret = value; }
+   setPrivate() {
+    this.#p = 'private';
+   }
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeMaglevOnNextCall(B);
+
+  const b = new B();
+  b.setPrivate();
+  assertEquals('private', b.secret);
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  c1.setPrivate();
+  assertEquals('private', c1.secret);
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  c2.setPrivate();
+  assertEquals('private', c2.secret);
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
+
+(function DerivedPrivateSetter() {
+  class A {};
+  class B extends A {
+    set #p(value) { this.secret = value; }
+    setPrivate() {
+     this.#p = 'private';
+    }
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  c1.setPrivate();
+  assertEquals('private', c1.secret);
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  c2.setPrivate();
+  assertEquals('private', c2.secret);
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
+
+(function BaseClassFields() {
+  class A {
+   aField = true;
+  };
+  class B extends A {};
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(B);
+  new B();
+  %OptimizeMaglevOnNextCall(B);
+
+  const b = new B();
+  assertTrue(b.aField);
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  assertTrue(c1.aField);
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  assertTrue(c2.aField);
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
+
+(function DerivedClassFields() {
+  class A {};
+  class B extends A {
+    bField = true;
+  };
+  class C1 extends B {};
+  class C2 extends B { constructor(...args) { super(1, ...args, 2); }};
+
+  %PrepareFunctionForOptimization(C1);
+  new C1();
+  %OptimizeMaglevOnNextCall(C1);
+
+  const c1 = new C1();
+  assertTrue(c1.bField);
+  assertTrue(isMaglevved(C1));  // No deopt.
+
+  %PrepareFunctionForOptimization(C2);
+  new C2();
+  %OptimizeMaglevOnNextCall(C2);
+
+  const c2 = new C2();
+  assertTrue(c2.bField);
+  assertTrue(isMaglevved(C2));  // No deopt.
+})();
diff --git a/deps/v8/test/mjsunit/maglev/osr-to-tf.js b/deps/v8/test/mjsunit/maglev/osr-to-tf.js
index d810226c0e1c73..9b8b998ee9b2a2 100644
--- a/deps/v8/test/mjsunit/maglev/osr-to-tf.js
+++ b/deps/v8/test/mjsunit/maglev/osr-to-tf.js
@@ -5,13 +5,25 @@
 // Flags: --allow-natives-syntax --maglev --no-stress-opt
 // Flags: --no-baseline-batch-compilation --use-osr --turbofan
 
-let keep_going = 100000;  // A counter to avoid test hangs on failure.
+let keep_going = 10000000;  // A counter to avoid test hangs on failure.
 
 function f() {
   let reached_tf = false;
+  let prev_status = 0;
   while (!reached_tf && --keep_going) {
     // This loop should trigger OSR.
     reached_tf = %CurrentFrameIsTurbofan();
+    let status = %GetOptimizationStatus(f);
+    if (status !== prev_status) {
+      let p = []
+      for (let k in V8OptimizationStatus) {
+        if (V8OptimizationStatus[k] & status) {
+          p.push(k);
+        }
+      }
+      print(p.join(","));
+      prev_status = status;
+    }
   }
 }
 
diff --git a/deps/v8/test/mjsunit/maglev/regress/regress-1359723.js b/deps/v8/test/mjsunit/maglev/regress/regress-1359723.js
new file mode 100644
index 00000000000000..ce42eb11fe2e34
--- /dev/null
+++ b/deps/v8/test/mjsunit/maglev/regress/regress-1359723.js
@@ -0,0 +1,21 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --allow-natives-syntax
+
+function f(__v_51, __v_52, __v_53) {
+  var a = false;
+  var b = a;
+  try {
+    var c = false + false;
+  } catch {}
+  try {
+    var d = false - (null == true);
+  } catch {}
+  return a + b - c + d;
+}
+%PrepareFunctionForOptimization(f);
+assertEquals(0, f());
+%OptimizeMaglevOnNextCall(f);
+assertEquals(0, f());
diff --git a/deps/v8/test/mjsunit/maglev/regress/regress-1363450.js b/deps/v8/test/mjsunit/maglev/regress/regress-1363450.js
new file mode 100644
index 00000000000000..0bc2ddf5471e37
--- /dev/null
+++ b/deps/v8/test/mjsunit/maglev/regress/regress-1363450.js
@@ -0,0 +1,22 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --allow-natives-syntax
+
+class C extends (class {}) {
+  constructor() {
+    var f = () => {
+      try { C.__proto__ = null; } catch {}
+      try { super(); } catch {}
+    };
+    %PrepareFunctionForOptimization(f);
+    f();
+    %OptimizeMaglevOnNextCall(f);
+  }
+}
+try { new C(); } catch {}
+// The next 2 calls deopt before reaching relevant bits.
+try { new C(); } catch {}
+try { new C(); } catch {}
+try { new C(); } catch {}
diff --git a/deps/v8/test/mjsunit/maglev/regress/regress-1364074.js b/deps/v8/test/mjsunit/maglev/regress/regress-1364074.js
new file mode 100644
index 00000000000000..bdf96aa3f26f60
--- /dev/null
+++ b/deps/v8/test/mjsunit/maglev/regress/regress-1364074.js
@@ -0,0 +1,24 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --maglev
+
+class Base {
+}
+let Class = class extends Base {
+  constructor() {
+      super();
+  }
+};
+for (let i = 0; i < 100; i++) {
+    Class = class extends Class {
+      constructor() {
+        try {
+          super();
+          super();
+        } catch (e) {}
+      }
+    };
+}
+let instance = new Class();
diff --git a/deps/v8/test/mjsunit/maglev/regress/regress-1368046.js b/deps/v8/test/mjsunit/maglev/regress/regress-1368046.js
new file mode 100644
index 00000000000000..4cff62a54bb803
--- /dev/null
+++ b/deps/v8/test/mjsunit/maglev/regress/regress-1368046.js
@@ -0,0 +1,19 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --maglev --allow-natives-syntax
+
+function f(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
+  for (let i = 0; i < 0; i++) {}
+  try {
+    throw 42;
+  } catch (e) {
+  }
+}
+
+%PrepareFunctionForOptimization(f);
+f(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42);
+f(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42);
+%OptimizeMaglevOnNextCall(f);
+f(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42);
diff --git a/deps/v8/test/mjsunit/maglev/regress/regress-v8-13289.js b/deps/v8/test/mjsunit/maglev/regress/regress-v8-13289.js
new file mode 100644
index 00000000000000..c400303ce618fa
--- /dev/null
+++ b/deps/v8/test/mjsunit/maglev/regress/regress-v8-13289.js
@@ -0,0 +1,24 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --allow-natives-syntax
+
+function Thingy() {}
+Thingy.prototype = {
+  foo: function() { return 42; }
+};
+
+const x = new Thingy();
+
+function f(o) {
+  return o.foo();
+}
+
+%PrepareFunctionForOptimization(f);
+assertEquals(42, f(x));
+%OptimizeMaglevOnNextCall(f);
+assertEquals(42, f(x));
+
+Thingy.prototype.foo = function() { return 56; }
+assertEquals(56, f(x));
diff --git a/deps/v8/test/mjsunit/mjsunit.js b/deps/v8/test/mjsunit/mjsunit.js
index 9a70951758efd5..9cf8e4d6f3bd5e 100644
--- a/deps/v8/test/mjsunit/mjsunit.js
+++ b/deps/v8/test/mjsunit/mjsunit.js
@@ -136,6 +136,14 @@ var assertThrowsAsync;
 // Assert that the passed function or eval code does not throw an exception.
 var assertDoesNotThrow;
 
+// Assert that the passed code throws an early error (i.e. throws a SyntaxError
+// at parse time).
+var assertEarlyError;
+
+// Assert that the passed code throws an exception when executed.
+// Fails if the passed code throws an exception at parse time.
+var assertThrowsAtRuntime;
+
 // Asserts that the found value is an instance of the constructor passed
 // as the second argument.
 var assertInstanceof;
@@ -586,6 +594,25 @@ var prettyPrinted;
         e => checkException(e, type_opt, cause_opt));
   };
 
+  assertEarlyError = function assertEarlyError(code) {
+    try {
+      new Function(code);
+    } catch (e) {
+      checkException(e, SyntaxError);
+      return;
+    }
+    failWithMessage('Did not throw exception while parsing');
+  }
+
+  assertThrowsAtRuntime = function assertThrowsAtRuntime(code, type_opt) {
+    const f = new Function(code);
+    if (arguments.length > 1 && type_opt !== undefined) {
+      assertThrows(f, type_opt);
+    } else {
+      assertThrows(f);
+    }
+  }
+
   assertInstanceof = function assertInstanceof(obj, type) {
     if (!(obj instanceof type)) {
       var actualTypeName = null;
diff --git a/deps/v8/test/mjsunit/mjsunit.status b/deps/v8/test/mjsunit/mjsunit.status
index 7c70ab8184f00d..8f7a4f7a59452a 100644
--- a/deps/v8/test/mjsunit/mjsunit.status
+++ b/deps/v8/test/mjsunit/mjsunit.status
@@ -34,6 +34,8 @@
   'harmony/shadowrealm-skip*': [SKIP],
   'regress/modules-skip*': [SKIP],
   'wasm/exceptions-utils': [SKIP],
+  'wasm/gc-js-interop-helpers': [SKIP],
+  'wasm/gc-js-interop-export': [SKIP],
   'wasm/wasm-module-builder': [SKIP],
   'compiler/fast-api-helpers': [SKIP],
   'typedarray-helpers': [SKIP],
@@ -432,6 +434,10 @@
   'regress/regress-1262423': [PASS,FAIL],
   'regress/regress-793588': [PASS,FAIL],
 
+  # RegExp unicode tests relies on ICU for property classes and
+  # case-insensitive unicode patterns.
+  'harmony/regexp-unicode-sets': [PASS,FAIL],
+
   # The noi18n build cannot parse characters in supplementary plane.
   'harmony/regexp-named-captures': [FAIL],
   'regress/regress-v8-10384': [FAIL],
@@ -1073,6 +1079,9 @@
   'compiler/regress-1224277': [SKIP],
   'regress/regress-1220974': [SKIP],
   'regress/regress-992389': [SKIP],
+
+  # BUG(v8:13331) Skipped until issue is fixed to reduce noise on alerts.
+  'harmony/regress/regress-crbug-1367133': [SKIP],
 }], # gc_fuzzer or deopt_fuzzer or interrupt_fuzzer
 
 ##############################################################################
@@ -1207,6 +1216,10 @@
 
   # Baseline tests don't make sense with optimization stressing.
   'baseline/*': [SKIP],
+
+  # This test uses --wasm-speculative-inlining which is incompatible with
+  # stressing.
+  'regress/wasm/regress-1364036': [SKIP],
 }],  # variant == stress
 
 ##############################################################################
@@ -1404,6 +1417,12 @@
   # it. In the slow path, this results in one runtime call per element, which
   # takes several minutes overall.
   'regress/wasm/regress-9017': [SKIP],
+
+  # These test Array#toReversed and Array#toSpliced on a big packed array, which
+  # is created by repeated calls to Array#push. In the slow path this is very
+  # slow.
+  'harmony/array-to-reversed-big': [SKIP],
+  'harmony/array-to-spliced-big': [SKIP],
 }],  # variant == slow_path
 
 ['((arch == mips64el or arch == mips64) and not simd_mips) or (arch in [ppc64])', {
@@ -1548,8 +1567,7 @@
   'es6/collections-constructor-*': [SKIP],
   'es6/map-constructor-entry-side-effect*': [SKIP],
 
-  'shared-memory/shared-string-promotion-minor': [SKIP],
-  'shared-memory/shared-string-promotion-major': [SKIP],
+  'shared-memory/*': [SKIP],
 }], # single_generation
 
 ################################################################################
diff --git a/deps/v8/test/mjsunit/omit-default-ctors-array-iterator.js b/deps/v8/test/mjsunit/omit-default-ctors-array-iterator.js
index d67cff70d9b82f..57588681541818 100644
--- a/deps/v8/test/mjsunit/omit-default-ctors-array-iterator.js
+++ b/deps/v8/test/mjsunit/omit-default-ctors-array-iterator.js
@@ -2,9 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Flags: --omit-default-ctors --no-turbofan --no-always-turbofan
-
-// TODO(v8:13091): Enable TurboFan.
+// Flags: --omit-default-ctors
 
 // This behavior is not spec compliant, see crbug.com/v8/13249.
 (function ArrayIteratorMonkeyPatched() {
diff --git a/deps/v8/test/mjsunit/omit-default-ctors.js b/deps/v8/test/mjsunit/omit-default-ctors.js
index cbd70a925982e6..e06ca3964b8522 100644
--- a/deps/v8/test/mjsunit/omit-default-ctors.js
+++ b/deps/v8/test/mjsunit/omit-default-ctors.js
@@ -2,9 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Flags: --omit-default-ctors --no-turbofan --no-always-turbofan
-
-// TODO(v8:13091): Enable TurboFan.
+// Flags: --omit-default-ctors
 
 (function OmitDefaultBaseCtor() {
   class A {}  // default base ctor -> will be omitted
diff --git a/deps/v8/test/mjsunit/regexp-tier-up-multiple.js b/deps/v8/test/mjsunit/regexp-tier-up-multiple.js
index 3d161c40e8deb9..13f4eaabb32116 100644
--- a/deps/v8/test/mjsunit/regexp-tier-up-multiple.js
+++ b/deps/v8/test/mjsunit/regexp-tier-up-multiple.js
@@ -7,6 +7,10 @@
 // Flags: --regexp-tier-up --regexp-tier-up-ticks=5
 // Flags: --allow-natives-syntax --no-force-slow-path --no-regexp-interpret-all
 // Flags: --no-enable-experimental-regexp-engine
+//
+// Concurrent compiles can trigger interrupts which would cause regexp
+// re-execution and thus mess with test expectations below.
+// Flags: --no-concurrent-recompilation
 
 const kLatin1 = true;
 const kUnicode = false;
diff --git a/deps/v8/test/mjsunit/regress-crbug-1374232.js b/deps/v8/test/mjsunit/regress-crbug-1374232.js
new file mode 100644
index 00000000000000..984faf9c9892a6
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress-crbug-1374232.js
@@ -0,0 +1,6 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// '[' within a character class is not special without /v.
+/\1[[]()/
diff --git a/deps/v8/test/mjsunit/regress/regress-1359230.js b/deps/v8/test/mjsunit/regress/regress-1359230.js
index bbb50ee6441a2e..ce0f958e7b9e45 100644
--- a/deps/v8/test/mjsunit/regress/regress-1359230.js
+++ b/deps/v8/test/mjsunit/regress/regress-1359230.js
@@ -14,17 +14,24 @@ try {
 } catch(e) { }
 
 
-const str = /\dei7/sgiuy;
-const obj = {"a":str, "length":9007199254740991};
-const increment = 2061353130;
-let n = increment * 21;
-for (let i = 0; i < 52; i++) {
-  n += increment;
-  try {
-    const v9 =  d8.serializer.serialize(obj);
-    const v10 = new Uint8Array(v9);
-    v10[6] = n;
-    const v11 =  d8.serializer.deserialize(v9);
-  } catch(v12) {
+function test(length) {
+  const str = /\dei7/sgiuy;
+  const obj = {"a":str, "length":length};
+  const increment = 2061353130;
+  let n = increment * 21;
+  for (let i = 0; i < 52; i++) {
+    n += increment;
+    try {
+      const v9 =  d8.serializer.serialize(obj);
+      const v10 = new Uint8Array(v9);
+      v10[6] = n;
+      const v11 =  d8.serializer.deserialize(v9);
+    } catch(v12) {
+    }
   }
+
 }
+
+
+test(9007199254740991);
+test(0xFFFFFFFFFFFF3F43);
diff --git a/deps/v8/test/mjsunit/regress/regress-1364319.js b/deps/v8/test/mjsunit/regress/regress-1364319.js
new file mode 100644
index 00000000000000..c195afeaee36b2
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-1364319.js
@@ -0,0 +1,15 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --allow-natives-syntax
+
+function f() {
+  return "abcd".charCodeAt(BigInt.asUintN(0, -1307n));
+}
+
+%PrepareFunctionForOptimization(f);
+try { f(); } catch(e) {}
+try { f(); } catch(e) {}
+%OptimizeFunctionOnNextCall(f);
+assertThrows(f, TypeError);
diff --git a/deps/v8/test/mjsunit/regress/regress-1364400.js b/deps/v8/test/mjsunit/regress/regress-1364400.js
new file mode 100644
index 00000000000000..b7726817433101
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-1364400.js
@@ -0,0 +1,22 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+function foo(deopt, x) {
+  x = x >>> 0;
+  return deopt ? Math.max(x) : x;
+}
+
+function bar(deopt) {
+  return foo(deopt, 4294967295);
+};
+
+%PrepareFunctionForOptimization(bar);
+%PrepareFunctionForOptimization(foo);
+bar(false);
+%OptimizeFunctionOnNextCall(bar);
+// bar will bailout because of insufficient type feedback for generic named
+// access. The HeapNumber should be correctly rematerialized in deoptimzer.
+assertEquals(4294967295, bar(true));
diff --git a/deps/v8/test/mjsunit/regress/regress-1370398.js b/deps/v8/test/mjsunit/regress/regress-1370398.js
new file mode 100644
index 00000000000000..72e4303df96436
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-1370398.js
@@ -0,0 +1,18 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --turbofan
+
+function f() {
+  let [x] = [1n];
+  y = x;
+  x = 1n - y;
+  x = 1n - y;
+  y = x;
+}
+
+%PrepareFunctionForOptimization(f);
+f();
+%OptimizeFunctionOnNextCall(f);
+f();
diff --git a/deps/v8/test/mjsunit/regress/regress-1371935.js b/deps/v8/test/mjsunit/regress/regress-1371935.js
new file mode 100644
index 00000000000000..8ecd5880965cc6
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-1371935.js
@@ -0,0 +1,24 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --turbofan --no-always-turbofan
+
+function f(a, b, c) {
+  // CheckBigInt64 is required if the type of input is UnsignedBigInt64
+  // because its value can be out of the range of SignedBigInt64.
+  let t = BigInt.asUintN(64, a + b);
+  // The addition is speculated as CheckedBigInt64Add and triggers the deopt
+  // for the large value coming in through <t>.
+  return t + c;
+}
+
+%PrepareFunctionForOptimization(f);
+assertEquals(12n, f(9n, 2n, 1n));
+%OptimizeFunctionOnNextCall(f);
+assertEquals(12n, f(9n, 2n, 1n));
+assertOptimized(f);
+assertEquals(2n ** 64n, f(1n, -2n, 1n));
+if (%Is64Bit()) {
+  assertUnoptimized(f);
+}
diff --git a/deps/v8/test/mjsunit/regress/regress-1376930.js b/deps/v8/test/mjsunit/regress/regress-1376930.js
new file mode 100644
index 00000000000000..1c3c4b6b94a456
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-1376930.js
@@ -0,0 +1,20 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --turbofan --no-always-turbofan
+
+function f() {
+  let a = 42n;
+  // JSDecrement should be typed as BigInt.
+  let b = a--;
+  let c = -42n && 42n;
+  // JSDecrement was typed as Numeric instead of BigInt so the node could not
+  // be eliminated because of possible deoptimization.
+  let d = c & a;
+};
+
+%PrepareFunctionForOptimization(f);
+f();
+%OptimizeFunctionOnNextCall(f);
+f();
diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-1357318.js b/deps/v8/test/mjsunit/regress/regress-crbug-1357318.js
new file mode 100644
index 00000000000000..c13e929a717685
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-crbug-1357318.js
@@ -0,0 +1,102 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+(function array_iterator() {
+  let count = 0;
+  [].values().__proto__.return = function(value) {
+    ++count;
+    return {value: value, done: true};
+  };
+
+  let array = [1, 2, 3, 4, 5, 6, 7, 8];
+
+  // Aborted iteration in a builtin.
+  try {
+    new WeakSet(array);
+  } catch (e) {}
+  assertEquals(count, 1);
+
+  // Aborted iteration via for..of.
+  let i = array.length / 2;
+  for (c of array) {
+    if (--i == 0) break;
+  }
+  assertEquals(count, 2);
+})();
+
+(function set_iterator() {
+  let count = 0;
+  new Set().values().__proto__.return = function(value) {
+    ++count;
+    return {value: value, done: true};
+  };
+
+  let set = new Set();
+  for (let i = 0; i < 26; i++) {
+    set.add("item" + i);
+  }
+
+  // Aborted iteration in a builtin.
+  try {
+    new WeakSet(set);
+  } catch (e) {}
+  assertEquals(count, 1);
+
+  // Aborted iteration via for..of.
+  let i = set.size / 2;
+  for (c of set.values()) {
+    if (--i == 0) break;
+  }
+  assertEquals(count, 2);
+})();
+
+(function map_iterator() {
+  let count = 0;
+  new Map().values().__proto__.return = function(value) {
+    ++count;
+    return {value: value, done: true};
+  };
+
+  let map = new Map();
+  for (let i = 0; i < 26; i++) {
+    map.set(String.fromCharCode(97 + i), i);
+  }
+
+  // Aborted iteration in a builtin.
+  try {
+    new WeakMap(map);
+  } catch (e) {}
+  assertEquals(count, 1);
+
+  // Aborted iteration via for..of.
+  let i = map.size / 2;
+  for (c of map.keys()) {
+    if (--i == 0) break;
+  }
+  assertEquals(count, 2);
+})();
+
+(function string_iterator() {
+  let count = 0;
+  let str = "some long string";
+  let iterator = str[Symbol.iterator]();
+  iterator.__proto__.return = function(value) {
+    ++count;
+    return {value: value, done: true};
+  };
+
+  // Aborted iteration in a builtin.
+  try {
+    new WeakSet(iterator);
+  } catch (e) {}
+  assertEquals(count, 1);
+
+  // Aborted iteration via for..of.
+  let i = str.length / 2;
+  for (c of iterator) {
+    if (--i == 0) break;
+  }
+  assertEquals(count, 2);
+})();
diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-1362487.js b/deps/v8/test/mjsunit/regress/regress-crbug-1362487.js
new file mode 100644
index 00000000000000..388df981588898
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-crbug-1362487.js
@@ -0,0 +1,16 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-rab-gsab
+
+const rab1 = new ArrayBuffer(2000, {'maxByteLength': 4000});
+class MyInt8Array extends Int8Array {
+    constructor() {
+        super(rab1);
+    }
+};
+const rab2 = new ArrayBuffer(1000, {'maxByteLength': 4000});
+const ta = new Int8Array(rab2);
+ta.constructor = MyInt8Array;
+ta.slice();
diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-1373770.js b/deps/v8/test/mjsunit/regress/regress-crbug-1373770.js
new file mode 100644
index 00000000000000..d3e8de2ab5ba04
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-crbug-1373770.js
@@ -0,0 +1,10 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+JSON.parse('[0,0]', function (a, b, c) {
+    console.log(a);
+    console.log(b);
+    console.log(c);
+    quit();
+});
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-12945.js b/deps/v8/test/mjsunit/regress/wasm/regress-12945.js
index c2505f32461b0b..a681465db3c9a4 100644
--- a/deps/v8/test/mjsunit/regress/wasm/regress-12945.js
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-12945.js
@@ -15,7 +15,7 @@ let sig = makeSig([wasmRefNullType(supertype)], [kWasmI32]);
 
 let callee = builder.addFunction("callee", sig).addBody([
   kExprLocalGet, 0,
-  kGCPrefix, kExprRefTest, sub1,
+  kGCPrefix, kExprRefTestDeprecated, sub1,
   kExprIf, kWasmVoid,
   kExprLocalGet, 0,
   kGCPrefix, kExprRefCast, sub1,
diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1364036.js b/deps/v8/test/mjsunit/regress/wasm/regress-1364036.js
new file mode 100644
index 00000000000000..a880a77555b5a8
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/wasm/regress-1364036.js
@@ -0,0 +1,17 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --wasm-speculative-inlining --experimental-wasm-typed-funcref
+
+d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
+
+const builder = new WasmModuleBuilder();
+builder.addType(kSig_i_i);
+builder.addFunction("main", kSig_i_i)
+  .addBody([kExprI32Const, 0x00, kExprRefNull, 0x01, kExprCallRef, 0x01])
+  .exportFunc();
+
+let instance = builder.instantiate();
+
+assertTraps(WebAssembly.RuntimeError, () => instance.exports.main());
diff --git a/deps/v8/test/mjsunit/shared-memory/shared-external-string-dictionary-lookup.js b/deps/v8/test/mjsunit/shared-memory/shared-external-string-dictionary-lookup.js
new file mode 100644
index 00000000000000..bf942cdf120d6b
--- /dev/null
+++ b/deps/v8/test/mjsunit/shared-memory/shared-external-string-dictionary-lookup.js
@@ -0,0 +1,38 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --expose-externalize-string --shared-string-table
+
+const long_key = 'key1234567890abcdefg';
+const substr_key = long_key.substring(3,17);
+const consstr_key = 'key' + 1234567890 + 'abcdefg';
+const integer_index = long_key.substring(3,8);
+
+{
+  let obj = [];
+  for (let i = 0; i < 100; ++i) {
+    obj[i] = i;
+    obj['XXX' + i] = 'XXX' + i;
+  }
+
+  obj['key1234567890abcdefg'] = 'long_key_value';
+  obj['1234567890abcd'] = 'substr_value';
+  obj[12345] = 'integer_index';
+
+  try {
+    externalizeString(long_key);
+    externalizeString(substr_key);
+    externalizeString(consstr_key);
+    externalizeString(integer_index);
+  } catch {}
+
+  (function exerciseICs() {
+    for (let i = 0; i < 10; i++) {
+      assertEquals('long_key_value', obj[long_key]);
+      assertEquals('substr_value', obj[substr_key]);
+      assertEquals('long_key_value', obj[consstr_key]);
+      assertEquals('integer_index', obj[integer_index]);
+    }
+  })();
+}
diff --git a/deps/v8/test/mjsunit/shared-memory/shared-external-string-megamorphic-ic.js b/deps/v8/test/mjsunit/shared-memory/shared-external-string-megamorphic-ic.js
new file mode 100644
index 00000000000000..19d27a7cf858fc
--- /dev/null
+++ b/deps/v8/test/mjsunit/shared-memory/shared-external-string-megamorphic-ic.js
@@ -0,0 +1,37 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --expose-externalize-string --shared-string-table
+// Flags: --allow-natives-syntax
+
+function set(o, ext_key) {
+  o[ext_key] = "bar";
+}
+function get(o, ext_key) {
+  o[ext_key];
+}
+
+%PrepareFunctionForOptimization(set);
+%OptimizeFunctionOnNextCall(set);
+%PrepareFunctionForOptimization(get);
+%OptimizeFunctionOnNextCall(get);
+
+(function test() {
+  let ext_key = "AAAAAAAAAAAAAAAAAAAAAA";
+  externalizeString(ext_key);
+
+  set({a:1}, ext_key);
+  set({b:2}, ext_key);
+  set({c:3}, ext_key);
+  set({d:4}, ext_key);
+  set({e:5}, ext_key);
+  set({f:6}, ext_key);
+
+  get({a:1}, ext_key);
+  get({b:2}, ext_key);
+  get({c:3}, ext_key);
+  get({d:4}, ext_key);
+  get({e:5}, ext_key);
+  get({f:6}, ext_key);
+})();
diff --git a/deps/v8/test/mjsunit/temporal/duration-to-json-boundary-cases.js b/deps/v8/test/mjsunit/temporal/duration-to-json-boundary-cases.js
new file mode 100644
index 00000000000000..027945a4c8504d
--- /dev/null
+++ b/deps/v8/test/mjsunit/temporal/duration-to-json-boundary-cases.js
@@ -0,0 +1,297 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+// Flags: --harmony-temporal
+
+// Test Temporal.Duration toJSON with extreme cases.
+//
+// Test Number.MAX_VALUE
+//
+// This is out of the range of Number.MAX_SAFE_INTEGER so the specification
+// does not mandate the precision. But we should still check certain property of
+// the result.
+// Number.MAX_VALUE is 1.7976931348623157e+308 so the first 16 characters should
+// be "P179769313486231" which is 15 digits and only require 50 bits so that
+// should be precious in 64 bit floating point.
+// There are total 309 digits so it should be 179769313486231 with another
+// 294 digits (309-15 = 294)
+assertMatches(/P179769313486231\d{294}Y/,
+    (new Temporal.Duration(Number.MAX_VALUE)).toJSON());
+assertMatches(/-P179769313486231\d{294}Y/,
+    (new Temporal.Duration(-Number.MAX_VALUE)).toJSON());
+
+assertMatches(/P179769313486231\d{294}M/,
+    (new Temporal.Duration(0, Number.MAX_VALUE)).toJSON());
+assertMatches(/-P179769313486231\d{294}M/,
+    (new Temporal.Duration(0, -Number.MAX_VALUE)).toJSON());
+
+assertMatches(/P179769313486231\d{294}W/,
+    (new Temporal.Duration(0, 0, Number.MAX_VALUE)).toJSON());
+assertMatches(/-P179769313486231\d{294}W/,
+    (new Temporal.Duration(0, 0, -Number.MAX_VALUE)).toJSON());
+
+assertMatches(/P179769313486231\d{294}D/,
+    (new Temporal.Duration(0, 0, 0, Number.MAX_VALUE)).toJSON());
+assertMatches(/-P179769313486231\d{294}D/,
+    (new Temporal.Duration(0, 0, 0, -Number.MAX_VALUE)).toJSON());
+
+assertMatches(/PT179769313486231\d{294}H/,
+    (new Temporal.Duration(0, 0, 0, 0, Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179769313486231\d{294}H/,
+    (new Temporal.Duration(0, 0, 0, 0, -Number.MAX_VALUE)).toJSON());
+
+assertMatches(/PT179769313486231\d{294}M/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179769313486231\d{294}M/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, -Number.MAX_VALUE)).toJSON());
+
+assertMatches(/PT179769313486231\d{294}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179769313486231\d{294}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, -Number.MAX_VALUE)).toJSON());
+
+// For milliseconds, we should have 179769313486231 with another 291
+// (309 - 15 - 3 = 291) digits, a '.', and then 3 digits
+assertMatches(/PT179769313486231\d{291}[.]\d{3}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179769313486231\d{291}[.]\d{3}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -Number.MAX_VALUE)).toJSON());
+
+// For microseconds, we should have 179769313486231 with another 288
+// (309 - 15 - 6 = 288) digits, a '.', and then 6 digits
+assertMatches(/PT179769313486231\d{288}[.]\d{6}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, Number.MAX_VALUE))
+    .toJSON());
+assertMatches(/-PT179769313486231\d{288}[.]\d{6}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -Number.MAX_VALUE))
+    .toJSON());
+
+// For nanoseconds, we should have 179769313486231 with another 285
+// (309 - 15 - 9 = 285) digits, a '.', and then 9 digits
+assertMatches(/PT179769313486231\d{285}[.]\d{9}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, Number.MAX_VALUE))
+    .toJSON());
+assertMatches(/-PT179769313486231\d{285}[.]\d{9}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -Number.MAX_VALUE))
+    .toJSON());
+
+// Test seconds + milliseconds
+// Number.MAX_VALUE + Number.MAX_VALUE / 1000 = 1.7994908279971777e+308
+// So the first 17 characters should be "PT179949082799717" which is 15 digits
+// and only require 50 bits so that should be precious in 64 bit floating point.
+// For seconds and milliseconds, we should have 179949082799717 with another 294
+// digits, a '.', and then 3 digits
+assertMatches(/PT179949082799717\d{294}[.]\d{3}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, Number.MAX_VALUE,
+                           Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179949082799717\d{294}[.]\d{3}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, -Number.MAX_VALUE,
+                           -Number.MAX_VALUE)).toJSON());
+
+// Test milliseconds + microseconds
+// For milliseconds and microseconds, we should have 179949082799717 with
+// another 291 (309 - 15 - 3 = 291) digits, a '.', and then 6 digits.
+assertMatches(/PT179949082799717\d{291}[.]\d{6}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, Number.MAX_VALUE,
+                           Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179949082799717\d{291}[.]\d{6}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -Number.MAX_VALUE,
+                           -Number.MAX_VALUE)).toJSON());
+
+// Test microseconds + nanoseconds
+// For microseconds and nanoseconds, we should have 179949082799717 with another
+// 288 (309 - 15 - 6 = 288) digits, a '.', and then 9 digits.
+assertMatches(/PT179949082799717\d{288}[.]\d{9}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, Number.MAX_VALUE,
+                           Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179949082799717\d{288}[.]\d{9}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -Number.MAX_VALUE,
+                           -Number.MAX_VALUE)).toJSON());
+
+// Test seconds + milliseconds + microseconds
+// Number.MAX_VALUE + Number.MAX_VALUE / 1000 + Number.MAX_VALUE / 1000000 =
+// 1.7994926256903124e+308
+// So the first 17 characters should be "PT179949262569031" which is 15 digits
+// and only require 50 bits so that should be precious in 64 bit floating point.
+// For seconds and milliseconds and microseconds, we should have 179949262569031
+// with another 294 digits, a '.', and then 6 digits.
+assertMatches(/PT179949262569031\d{294}[.]\d{6}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, Number.MAX_VALUE,
+                           Number.MAX_VALUE, Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179949262569031\d{294}[.]\d{6}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, -Number.MAX_VALUE,
+                           -Number.MAX_VALUE, -Number.MAX_VALUE)).toJSON());
+
+// Test milliseconds + microseconds + nanoseconds
+// For milliseconds and microseconds and nanoseconds, we should have
+// 179949262569031 with another 291 digits, a '.', and then 9 digits.
+assertMatches(/PT179949262569031\d{291}[.]\d{9}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, Number.MAX_VALUE,
+                           Number.MAX_VALUE, Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179949262569031\d{291}[.]\d{9}S/,
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -Number.MAX_VALUE,
+                           -Number.MAX_VALUE, -Number.MAX_VALUE)).toJSON());
+
+// Test seconds + milliseconds + microseconds + nanoseconds
+// Number.MAX_VALUE + Number.MAX_VALUE / 1000 + Number.MAX_VALUE / 1000000 +
+// Number.MAX_VALUE / 1000000000 = 1.7994926274880055e+308
+// So the first 17 characters should be "PT179949262748800" which is 15 digits
+// and only require 50 bits so that should be precious in 64 bit floating point.
+// For seconds and milliseconds and microseconds, and nanoseconds, we should
+// have 179949262748800 with another 294 digits, a '.', and then 9 digits.
+assertMatches(/PT179949262748800\d{294}[.]\d{9}S/,
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE,
+        Number.MAX_VALUE)).toJSON());
+assertMatches(/-PT179949262748800\d{294}[.]\d{9}S/,
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, -Number.MAX_VALUE, -Number.MAX_VALUE,
+        -Number.MAX_VALUE, -Number.MAX_VALUE)).toJSON());
+
+// Test Number.MAX_SAFE_INTEGER
+// For MAX_SAFE_INTEGER, we need to test the result come out as exact, not just
+// close.
+let maxIntString = String(Number.MAX_SAFE_INTEGER);
+
+assertEquals("P" + maxIntString + "Y",
+    (new Temporal.Duration(Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-P" + maxIntString + "Y",
+    (new Temporal.Duration(-Number.MAX_SAFE_INTEGER)).toJSON());
+
+assertEquals("P" + maxIntString + "M",
+    (new Temporal.Duration(0, Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-P" + maxIntString + "M",
+    (new Temporal.Duration(0, -Number.MAX_SAFE_INTEGER)).toJSON());
+
+assertEquals("P" + maxIntString + "W",
+    (new Temporal.Duration(0, 0, Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-P" + maxIntString + "W",
+    (new Temporal.Duration(0, 0, -Number.MAX_SAFE_INTEGER)).toJSON());
+
+assertEquals("P" + maxIntString + "D",
+    (new Temporal.Duration(0, 0, 0, Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-P" + maxIntString + "D",
+    (new Temporal.Duration(0, 0, 0, -Number.MAX_SAFE_INTEGER)).toJSON());
+
+assertEquals("PT" + maxIntString + "H",
+    (new Temporal.Duration(0, 0, 0, 0, Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-PT" + maxIntString + "H",
+    (new Temporal.Duration(0, 0, 0, 0, -Number.MAX_SAFE_INTEGER)).toJSON());
+
+assertEquals("PT" + maxIntString + "M",
+    (new Temporal.Duration(0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-PT" + maxIntString + "M",
+    (new Temporal.Duration(0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER)).toJSON());
+
+assertEquals("PT" + maxIntString + "S",
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER))
+    .toJSON());
+assertEquals("-PT" + maxIntString + "S",
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER))
+    .toJSON());
+
+const insertDotFromRight = (str, pos) =>
+    `${str.slice(0, str.length-pos)}.${str.slice(str.length-pos)}`;
+
+// For milliseconds, microseconds, and nanoseconds
+assertEquals("PT" + insertDotFromRight(maxIntString, 3) + "S",
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER))
+    .toJSON());
+assertEquals("-PT" + insertDotFromRight(maxIntString, 3) + "S",
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER))
+    .toJSON());
+
+assertEquals("PT" + insertDotFromRight(maxIntString, 6) + "S",
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER))
+    .toJSON());
+assertEquals("-PT" + insertDotFromRight(maxIntString, 6) + "S",
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER))
+    .toJSON());
+
+assertEquals("PT" + insertDotFromRight(maxIntString, 9) + "S",
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER))
+    .toJSON());
+assertEquals("-PT" + insertDotFromRight(maxIntString, 9) + "S",
+    (new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER))
+    .toJSON());
+
+// Test seconds + milliseconds
+// Number.MAX_SAFE_INTEGER: 9007199254740991
+//   9007199254740991
+//      9007199254740.991
+//_+_____________________
+//   9016206453995731.991
+let twoMaxString = "9016206453995731991";
+assertEquals("PT" + insertDotFromRight(twoMaxString, 3) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER))
+    .toJSON());
+assertEquals("-PT" + insertDotFromRight(twoMaxString, 3) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER, -Number.MAX_SAFE_INTEGER))
+    .toJSON());
+
+// Test milliseconds + microseconds
+assertEquals("PT" + insertDotFromRight(twoMaxString, 6) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER))
+    .toJSON());
+assertEquals("-PT" + insertDotFromRight(twoMaxString, 6) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER, -Number.MAX_SAFE_INTEGER)
+     ).toJSON());
+
+// Test microseconds + nanoseconds
+assertEquals("PT" + insertDotFromRight(twoMaxString, 9) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER,
+        Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-PT" + insertDotFromRight(twoMaxString, 9) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER,
+        -Number.MAX_SAFE_INTEGER)).toJSON());
+
+// Test seconds + milliseconds + microseconds
+// Number.MAX_SAFE_INTEGER: 9007199254740991
+//   9007199254740991
+//      9007199254740.991
+//         9007199254.740991
+//_+_____________________
+//   9016215461194986.731991
+let threeMaxString = "9016215461194986731991";
+assertEquals("PT" + insertDotFromRight(threeMaxString, 6) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER,
+        Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-PT" + insertDotFromRight(threeMaxString, 6) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER, -Number.MAX_SAFE_INTEGER,
+        -Number.MAX_SAFE_INTEGER)).toJSON());
+
+// Test milliseconds + microseconds + nanoseconds
+assertEquals("PT" + insertDotFromRight(threeMaxString, 9) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER,
+        Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-PT" + insertDotFromRight(threeMaxString, 9) + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER, -Number.MAX_SAFE_INTEGER,
+        -Number.MAX_SAFE_INTEGER)).toJSON());
+
+// Test seconds + milliseconds + microseconds + nanoseconds
+// Number.MAX_SAFE_INTEGER: 9007199254740991
+//   9007199254740991
+//      9007199254740.991
+//         9007199254.740991
+//            9007199.254740991
+//_+____________________________
+//   9016215470202185.986731991
+let fourMaxString = "9016215470202185.986731991";
+assertEquals("PT" + fourMaxString + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER,
+        Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER)).toJSON());
+assertEquals("-PT" + fourMaxString + "S",
+    (new Temporal.Duration(
+        0, 0, 0, 0, 0, 0, -Number.MAX_SAFE_INTEGER, -Number.MAX_SAFE_INTEGER,
+        -Number.MAX_SAFE_INTEGER, -Number.MAX_SAFE_INTEGER)).toJSON());
diff --git a/deps/v8/test/mjsunit/tools/foozzie.js b/deps/v8/test/mjsunit/tools/foozzie.js
index fa3cc5a84a84db..4d7ca4cc1292f0 100644
--- a/deps/v8/test/mjsunit/tools/foozzie.js
+++ b/deps/v8/test/mjsunit/tools/foozzie.js
@@ -31,6 +31,8 @@ if (this.Intl) {
 
 // Dummy performance methods.
 assertEquals(1.2, performance.now());
+assertEquals(undefined, performance.mark("a mark"));
+assertEquals(undefined, performance.measure("a measure"));
 assertEquals([], performance.measureMemory());
 
 // Worker messages follow a predefined deterministic pattern.
diff --git a/deps/v8/test/mjsunit/wasm/bigint-rematerialize.js b/deps/v8/test/mjsunit/wasm/bigint-rematerialize.js
new file mode 100644
index 00000000000000..dd40297ecface1
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/bigint-rematerialize.js
@@ -0,0 +1,43 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax --turbofan --no-always-turbofan --turbo-inline-js-wasm-calls
+
+d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
+
+let builder = new WasmModuleBuilder();
+
+builder
+    .addFunction("f", kSig_l_v) // () -> i64
+    .addBody([
+      kExprI64Const, 0,
+      kExprI64Const, 1,
+      kExprI64Sub, // -1
+    ])
+    .exportFunc();
+
+let module = builder.instantiate();
+
+function f(x) {
+  let y = module.exports.f();
+  try {
+    return x + y;
+  } catch(_) {
+    return y;
+  }
+}
+
+%PrepareFunctionForOptimization(f);
+assertEquals(0n, f(1n));
+assertEquals(1n, f(2n));
+%OptimizeFunctionOnNextCall(f);
+assertEquals(0n, f(1n));
+assertOptimized(f);
+// After optimization, the result of the js wasm call is stored in word64 and
+// passed to StateValues without conversion. Rematerialization will happen
+// in deoptimizer.
+assertEquals(-1n, f(0));
+if (%Is64Bit()) {
+  assertUnoptimized(f);
+}
diff --git a/deps/v8/test/mjsunit/wasm/externref.js b/deps/v8/test/mjsunit/wasm/externref.js
index cf052cdd754e47..11e6a6f837e781 100644
--- a/deps/v8/test/mjsunit/wasm/externref.js
+++ b/deps/v8/test/mjsunit/wasm/externref.js
@@ -336,10 +336,12 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
 (function MultiReturnRefTest() {
   print("MultiReturnTest");
   let builder = new WasmModuleBuilder();
+  let gc_sig = builder.addType(kSig_v_v);
   let sig = makeSig([kWasmExternRef],
       [kWasmExternRef, kWasmExternRef, kWasmExternRef, kWasmExternRef]);
 
-  builder.addFunction("callee", sig)
+  let gc_index = builder.addImport('q', 'gc', gc_sig);
+  let callee = builder.addFunction("callee", sig)
     .addBody([
       kExprLocalGet, 0,
       kExprLocalGet, 0,
@@ -349,11 +351,13 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
   builder.addFunction("main", sig)
     .addBody([
       kExprLocalGet, 0,
-      kExprCallFunction, 0
+      kExprCallFunction, callee.index,
+      kExprCallFunction, gc_index,
     ])
     .exportAs("main");
 
-  let module = new WebAssembly.Module(builder.toBuffer());
-  let instance = new WebAssembly.Instance(module);
+  let instance = builder.instantiate({
+    q: { gc: () => gc() }
+  });
   assertEquals(instance.exports.main(null), [null, null, null, null]);
 })();
diff --git a/deps/v8/test/mjsunit/wasm/gc-casts-from-any.js b/deps/v8/test/mjsunit/wasm/gc-casts-from-any.js
new file mode 100644
index 00000000000000..234ddb7cd1c185
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-casts-from-any.js
@@ -0,0 +1,137 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc
+
+d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
+
+(function TestRefTest() {
+  var builder = new WasmModuleBuilder();
+  let structSuper = builder.addStruct([makeField(kWasmI32, true)]);
+  let structSub = builder.addStruct([makeField(kWasmI32, true)], structSuper);
+  let array = builder.addArray(kWasmI32);
+
+  let fct =
+  builder.addFunction('createStructSuper',
+                      makeSig([kWasmI32], [kWasmExternRef]))
+    .addBody([
+      kExprLocalGet, 0,
+      kGCPrefix, kExprStructNew, structSuper,
+      kGCPrefix, kExprExternExternalize,
+    ]).exportFunc();
+  builder.addFunction('createStructSub', makeSig([kWasmI32], [kWasmExternRef]))
+    .addBody([
+      kExprLocalGet, 0,
+      kGCPrefix, kExprStructNew, structSub,
+      kGCPrefix, kExprExternExternalize,
+    ]).exportFunc();
+  builder.addFunction('createArray', makeSig([kWasmI32], [kWasmExternRef]))
+    .addBody([
+      kExprLocalGet, 0,
+      kGCPrefix, kExprArrayNewFixed, array, 1,
+      kGCPrefix, kExprExternExternalize,
+    ]).exportFunc();
+  builder.addFunction('createFuncRef', makeSig([], [kWasmFuncRef]))
+    .addBody([
+      kExprRefFunc, fct.index,
+    ]).exportFunc();
+
+  [
+    ["StructSuper", structSuper],
+    ["StructSub", structSub],
+    ["Array", array],
+    ["I31", kI31RefCode],
+    ["AnyArray", kArrayRefCode],
+    ["Data", kDataRefCode],
+    ["Eq", kEqRefCode],
+    // 'ref.test any' is semantically the same as '!ref.is_null' here.
+    ["Any", kAnyRefCode],
+  ].forEach(([typeName, typeCode]) => {
+    builder.addFunction(`refTest${typeName}`,
+                        makeSig([kWasmExternRef], [kWasmI32, kWasmI32]))
+    .addBody([
+      kExprLocalGet, 0,
+      kGCPrefix, kExprExternInternalize,
+      kGCPrefix, kExprRefTest, typeCode,
+      kExprLocalGet, 0,
+      kGCPrefix, kExprExternInternalize,
+      kGCPrefix, kExprRefTestNull, typeCode,
+    ]).exportFunc();
+  });
+
+  var instance = builder.instantiate();
+  let wasm = instance.exports;
+  // result: [ref.test, ref.test null]
+  assertEquals([0, 1], wasm.refTestStructSuper(null));
+  assertEquals([0, 0], wasm.refTestStructSuper(undefined));
+  assertEquals([1, 1], wasm.refTestStructSuper(wasm.createStructSuper()));
+  assertEquals([1, 1], wasm.refTestStructSuper(wasm.createStructSub()));
+  assertEquals([0, 0], wasm.refTestStructSuper(wasm.createArray()));
+  assertEquals([0, 0], wasm.refTestStructSuper(wasm.createFuncRef()));
+  assertEquals([0, 0], wasm.refTestStructSuper(1));
+  assertEquals([0, 0], wasm.refTestStructSuper({'JavaScript': 'Object'}));
+
+  assertEquals([0, 1], wasm.refTestStructSub(null));
+  assertEquals([0, 0], wasm.refTestStructSub(undefined));
+  assertEquals([0, 0], wasm.refTestStructSub(wasm.createStructSuper()));
+  assertEquals([1, 1], wasm.refTestStructSub(wasm.createStructSub()));
+  assertEquals([0, 0], wasm.refTestStructSub(wasm.createArray()));
+  assertEquals([0, 0], wasm.refTestStructSub(wasm.createFuncRef()));
+  assertEquals([0, 0], wasm.refTestStructSub(1));
+  assertEquals([0, 0], wasm.refTestStructSub({'JavaScript': 'Object'}));
+
+  assertEquals([0, 1], wasm.refTestArray(null));
+  assertEquals([0, 0], wasm.refTestArray(undefined));
+  assertEquals([0, 0], wasm.refTestArray(wasm.createStructSuper()));
+  assertEquals([0, 0], wasm.refTestArray(wasm.createStructSub()));
+  assertEquals([1, 1], wasm.refTestArray(wasm.createArray()));
+  assertEquals([0, 0], wasm.refTestArray(wasm.createFuncRef()));
+  assertEquals([0, 0], wasm.refTestArray(1));
+  assertEquals([0, 0], wasm.refTestArray({'JavaScript': 'Object'}));
+
+  assertEquals([0, 1], wasm.refTestI31(null));
+  assertEquals([0, 0], wasm.refTestI31(undefined));
+  assertEquals([0, 0], wasm.refTestI31(wasm.createStructSuper()));
+  assertEquals([0, 0], wasm.refTestI31(wasm.createStructSub()));
+  assertEquals([0, 0], wasm.refTestI31(wasm.createArray()));
+  assertEquals([0, 0], wasm.refTestI31(wasm.createFuncRef()));
+  assertEquals([1, 1], wasm.refTestI31(1));
+  assertEquals([0, 0], wasm.refTestI31({'JavaScript': 'Object'}));
+
+  assertEquals([0, 1], wasm.refTestAnyArray(null));
+  assertEquals([0, 0], wasm.refTestAnyArray(undefined));
+  assertEquals([0, 0], wasm.refTestAnyArray(wasm.createStructSuper()));
+  assertEquals([0, 0], wasm.refTestAnyArray(wasm.createStructSub()));
+  assertEquals([1, 1], wasm.refTestAnyArray(wasm.createArray()));
+  assertEquals([0, 0], wasm.refTestAnyArray(wasm.createFuncRef()));
+  assertEquals([0, 0], wasm.refTestAnyArray(1));
+  assertEquals([0, 0], wasm.refTestAnyArray({'JavaScript': 'Object'}));
+
+  assertEquals([0, 1], wasm.refTestData(null));
+  assertEquals([0, 0], wasm.refTestData(undefined));
+  assertEquals([1, 1], wasm.refTestData(wasm.createStructSuper()));
+  assertEquals([1, 1], wasm.refTestData(wasm.createStructSub()));
+  assertEquals([1, 1], wasm.refTestData(wasm.createArray()));
+  assertEquals([0, 0], wasm.refTestData(wasm.createFuncRef()));
+  assertEquals([0, 0], wasm.refTestData(1));
+  assertEquals([0, 0], wasm.refTestData({'JavaScript': 'Object'}));
+
+  assertEquals([0, 1], wasm.refTestEq(null));
+  assertEquals([0, 0], wasm.refTestEq(undefined));
+  assertEquals([1, 1], wasm.refTestEq(wasm.createStructSuper()));
+  assertEquals([1, 1], wasm.refTestEq(wasm.createStructSub()));
+  assertEquals([1, 1], wasm.refTestEq(wasm.createArray()));
+  assertEquals([0, 0], wasm.refTestEq(wasm.createFuncRef()));
+  assertEquals([1, 1], wasm.refTestEq(1)); // ref.i31
+  assertEquals([0, 0], wasm.refTestEq({'JavaScript': 'Object'}));
+
+  assertEquals([0, 1], wasm.refTestAny(null));
+  assertEquals([1, 1], wasm.refTestAny(undefined));
+  assertEquals([1, 1], wasm.refTestAny(wasm.createStructSuper()));
+  assertEquals([1, 1], wasm.refTestAny(wasm.createStructSub()));
+  assertEquals([1, 1], wasm.refTestAny(wasm.createArray()));
+  assertEquals([1, 1], wasm.refTestAny(wasm.createFuncRef()));
+  assertEquals([1, 1], wasm.refTestAny(1)); // ref.i31
+  assertEquals([1, 1], wasm.refTestAny({'JavaScript': 'Object'}));
+})();
diff --git a/deps/v8/test/mjsunit/wasm/gc-casts-invalid.js b/deps/v8/test/mjsunit/wasm/gc-casts-invalid.js
new file mode 100644
index 00000000000000..236d6148bf7437
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-casts-invalid.js
@@ -0,0 +1,47 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc
+
+d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
+
+(function TestRefTestInvalid() {
+  let struct = 0;
+  let array = 1;
+  let sig = 2;
+  let types = [
+    // source value type |target heap type
+    [kWasmI32,            kAnyRefCode],
+    [kWasmNullExternRef,  struct],
+    [wasmRefType(struct), kNullFuncRefCode],
+    [wasmRefType(array),  kFuncRefCode],
+    [wasmRefType(struct), sig],
+    [wasmRefType(sig),    struct],
+    [wasmRefType(sig),    kExternRefCode],
+    [kWasmAnyRef,         kExternRefCode],
+    [kWasmAnyRef,         kFuncRefCode],
+  ];
+  let casts = [
+    kExprRefTest,
+    kExprRefTestNull,
+  ];
+
+  for (let [source_type, target_type_imm] of types) {
+    for (let cast of casts) {
+      let builder = new WasmModuleBuilder();
+      assertEquals(struct, builder.addStruct([makeField(kWasmI32, true)]));
+      assertEquals(array, builder.addArray(kWasmI32));
+      assertEquals(sig, builder.addType(makeSig([kWasmI32], [])));
+      builder.addFunction('refTest', makeSig([kWasmI32], [source_type]))
+      .addBody([
+        kExprLocalGet, 0,
+        kGCPrefix, cast, target_type_imm,
+      ]);
+
+      assertThrows(() => builder.instantiate(),
+                  WebAssembly.CompileError,
+                  /has to be in the same reference type hierarchy/);
+    }
+  }
+})();
diff --git a/deps/v8/test/mjsunit/wasm/gc-casts-subtypes.js b/deps/v8/test/mjsunit/wasm/gc-casts-subtypes.js
new file mode 100644
index 00000000000000..249c70483ef9e9
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-casts-subtypes.js
@@ -0,0 +1,248 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --experimental-wasm-type-reflection
+
+d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
+
+// Test casting null from one type to another using ref.test.
+(function RefTestNull() {
+  print(arguments.callee.name);
+  let builder = new WasmModuleBuilder();
+  let structSuper = builder.addStruct([makeField(kWasmI32, true)]);
+  let structSub = builder.addStruct([makeField(kWasmI32, true)], structSuper);
+  let array = builder.addArray(kWasmI32);
+
+  // Note: Casting between unrelated types is allowed as long as the types
+  // belong to the same type hierarchy (func / any / extern). In these cases the
+  // check will always fail.
+  let tests = [
+    [kWasmAnyRef, kWasmAnyRef, 'AnyToAny'],
+    [kWasmFuncRef, kWasmFuncRef, 'FuncToFunc'],
+    [kWasmExternRef, kWasmExternRef, 'ExternToExtern'],
+    [kWasmNullFuncRef, kWasmNullFuncRef, 'NullFuncToNullFunc'],
+    [kWasmNullExternRef, kWasmNullExternRef, 'NullExternToNullExtern'],
+    [structSub, array, 'StructToArray'],
+    [kWasmFuncRef, kWasmNullFuncRef, 'FuncToNullFunc'],
+    [kWasmNullFuncRef, kWasmFuncRef, 'NullFuncToFunc'],
+    [kWasmExternRef, kWasmNullExternRef, 'ExternToNullExtern'],
+    [kWasmNullExternRef, kWasmExternRef, 'NullExternToExtern'],
+    [kWasmNullRef, kWasmAnyRef, 'NullToAny'],
+    [kWasmI31Ref, structSub, 'I31ToStruct'],
+    [kWasmEqRef, kWasmI31Ref, 'EqToI31'],
+    [structSuper, structSub, 'StructSuperToStructSub'],
+    [structSub, structSuper, 'StructSubToStructSuper'],
+  ];
+
+  for (let [sourceType, targetType, testName] of tests) {
+    builder.addFunction('testNull' + testName,
+                      makeSig([], [kWasmI32]))
+    .addLocals(wasmRefNullType(sourceType), 1)
+    .addBody([
+      kExprLocalGet, 0,
+      kGCPrefix, kExprRefTest, targetType & kLeb128Mask,
+    ]).exportFunc();
+  }
+
+  let instance = builder.instantiate();
+  let wasm = instance.exports;
+
+  for (let [sourceType, targetType, testName] of tests) {
+    assertEquals(0, wasm['testNull' + testName]());
+  }
+})();
+
+(function RefTestFuncRef() {
+  print(arguments.callee.name);
+  let builder = new WasmModuleBuilder();
+  let sigSuper = builder.addType(makeSig([kWasmI32], []));
+  let sigSub = builder.addType(makeSig([kWasmI32], []), sigSuper);
+
+  builder.addFunction('fctSuper', sigSuper).addBody([]).exportFunc();
+  builder.addFunction('fctSub', sigSub).addBody([]).exportFunc();
+  builder.addFunction('testFromFuncRef',
+      makeSig([kWasmFuncRef], [kWasmI32, kWasmI32, kWasmI32, kWasmI32]))
+    .addBody([
+      kExprLocalGet, 0, kGCPrefix, kExprRefTest, kFuncRefCode,
+      kExprLocalGet, 0, kGCPrefix, kExprRefTest, kNullFuncRefCode,
+      kExprLocalGet, 0, kGCPrefix, kExprRefTest, sigSuper,
+      kExprLocalGet, 0, kGCPrefix, kExprRefTest, sigSub,
+    ]).exportFunc();
+
+  let instance = builder.instantiate();
+  let wasm = instance.exports;
+  let jsFct = new WebAssembly.Function(
+      {parameters:['i32', 'i32'], results: ['i32']},
+      function mul(a, b) { return a * b; });
+  assertEquals([1, 0, 0, 0], wasm.testFromFuncRef(jsFct));
+  assertEquals([1, 0, 1, 0], wasm.testFromFuncRef(wasm.fctSuper));
+  assertEquals([1, 0, 1, 1], wasm.testFromFuncRef(wasm.fctSub));
+})();
+
+(function RefTestExternRef() {
+  print(arguments.callee.name);
+  let builder = new WasmModuleBuilder();
+
+  builder.addFunction('testExternRef',
+      makeSig([kWasmExternRef], [kWasmI32, kWasmI32,]))
+    .addBody([
+      kExprLocalGet, 0, kGCPrefix, kExprRefTest, kExternRefCode,
+      kExprLocalGet, 0, kGCPrefix, kExprRefTest, kNullExternRefCode,
+    ]).exportFunc();
+
+  let instance = builder.instantiate();
+  let wasm = instance.exports;
+  assertEquals([0, 0], wasm.testExternRef(null));
+  assertEquals([1, 0], wasm.testExternRef(undefined));
+  assertEquals([1, 0], wasm.testExternRef(1));
+  assertEquals([1, 0], wasm.testExternRef({}));
+  assertEquals([1, 0], wasm.testExternRef(wasm.testExternRef));
+})();
+
+(function RefTestAnyRefHierarchy() {
+  print(arguments.callee.name);
+  let builder = new WasmModuleBuilder();
+  let structSuper = builder.addStruct([makeField(kWasmI32, true)]);
+  let structSub = builder.addStruct([makeField(kWasmI32, true)], structSuper);
+  let array = builder.addArray(kWasmI32);
+
+  let types = {
+    any: kWasmAnyRef,
+    eq: kWasmEqRef,
+    data: kWasmDataRef,
+    anyArray: kWasmArrayRef,
+    array: wasmRefNullType(array),
+    structSuper: wasmRefNullType(structSuper),
+    structSub: wasmRefNullType(structSub),
+  };
+
+  let createBodies = {
+    nullref: [kExprRefNull, kNullRefCode],
+    i31ref: [kExprI32Const, 42, kGCPrefix, kExprI31New],
+    structSuper: [kExprI32Const, 42, kGCPrefix, kExprStructNew, structSuper],
+    structSub: [kExprI32Const, 42, kGCPrefix, kExprStructNew, structSub],
+    array: [kExprI32Const, 42, kGCPrefix, kExprArrayNewFixed, array, 1],
+  };
+
+  // Each Test lists the following:
+  // source  => The static type of the source value.
+  // values  => All actual values that are subtypes of the static types.
+  // targets => A list of types for ref.test. For each type the values are
+  //            listed for which ref.test should return 1 (i.e. the ref.test
+  //            should succeed).
+  let tests = [
+    {
+      source: 'any',
+      values: ['nullref', 'i31ref', 'structSuper', 'structSub', 'array'],
+      targets: {
+        eq: ['i31ref', 'structSuper', 'structSub', 'array'],
+        data: ['structSuper', 'structSub', 'array'],
+        anyArray: ['array'],
+        array: ['array'],
+        structSuper: ['structSuper', 'structSub'],
+        structSub: ['structSub'],
+      }
+    },
+    {
+      source: 'eq',
+      values: ['nullref', 'i31ref', 'structSuper', 'structSub', 'array'],
+      targets: {
+        eq: ['i31ref', 'structSuper', 'structSub', 'array'],
+        data: ['structSuper', 'structSub', 'array'],
+        anyArray: ['array'],
+        array: ['array'],
+        structSuper: ['structSuper', 'structSub'],
+        structSub: ['structSub'],
+      }
+    },
+    {
+      source: 'data',
+      values: ['nullref', 'structSuper', 'structSub', 'array'],
+      targets: {
+        eq: ['structSuper', 'structSub', 'array'],
+        data: ['structSuper', 'structSub', 'array'],
+        anyArray: ['array'],
+        array: ['array'],
+        structSuper: ['structSuper', 'structSub'],
+        structSub: ['structSub'],
+      }
+    },
+    {
+      source: 'anyArray',
+      values: ['nullref', 'array'],
+      targets: {
+        eq: ['array'],
+        data: ['array'],
+        anyArray: ['array'],
+        array: ['array'],
+        structSuper: [],
+        structSub: [],
+      }
+    },
+    {
+      source: 'structSuper',
+      values: ['nullref', 'structSuper', 'structSub'],
+      targets: {
+        eq: ['structSuper', 'structSub'],
+        data: ['structSuper', 'structSub'],
+        anyArray: [],
+        array: [],
+        structSuper: ['structSuper', 'structSub'],
+        structSub: ['structSub'],
+      }
+    },
+  ];
+
+  for (let test of tests) {
+    let sourceType = types[test.source];
+    // Add creator functions.
+    let creatorSig = makeSig([], [sourceType]);
+    let creatorType = builder.addType(creatorSig);
+    for (let value of test.values) {
+      builder.addFunction(`create_${test.source}_${value}`, creatorType)
+      .addBody(createBodies[value]).exportFunc();
+    }
+    // Add ref.test tester functions.
+    // The functions take the creator functions as a callback to prevent the
+    // compiler to derive the actual type of the value and can only use the
+    // static source type.
+    for (let target in test.targets) {
+      // Get heap type for concrete types or apply Leb128 mask on the abstract
+      // type.
+      let heapType = types[target].heap_type ?? (types[target] & kLeb128Mask);
+      builder.addFunction(`test_${test.source}_to_${target}`,
+                          makeSig([wasmRefType(creatorType)], [kWasmI32]))
+      .addBody([
+        kExprLocalGet, 0,
+        kExprCallRef, creatorType,
+        kGCPrefix, kExprRefTest, heapType,
+      ]).exportFunc();
+      builder.addFunction(`test_null_${test.source}_to_${target}`,
+                          makeSig([wasmRefType(creatorType)], [kWasmI32]))
+      .addBody([
+        kExprLocalGet, 0,
+        kExprCallRef, creatorType,
+        kGCPrefix, kExprRefTestNull, heapType,
+      ]).exportFunc();
+    }
+  }
+
+  let instance = builder.instantiate();
+  let wasm = instance.exports;
+
+  for (let test of tests) {
+    for (let [target, validValues] of Object.entries(test.targets)) {
+      for (let value of test.values) {
+        print(`Test ref.test: ${test.source}(${value}) -> ${target}`);
+        let create_value = wasm[`create_${test.source}_${value}`];
+        let res = wasm[`test_${test.source}_to_${target}`](create_value);
+        assertEquals(validValues.includes(value) ? 1 : 0, res);
+        print(`Test ref.test null: ${test.source}(${value}) -> ${target}`);
+        res = wasm[`test_null_${test.source}_to_${target}`](create_value);
+        assertEquals(
+            (validValues.includes(value) || value == "nullref") ? 1 : 0, res);
+      }
+    }
+  }
+})();
diff --git a/deps/v8/test/mjsunit/wasm/gc-experimental-string-conversions.js b/deps/v8/test/mjsunit/wasm/gc-experimental-string-conversions.js
index f8356455ecb269..c1bdcb448c4583 100644
--- a/deps/v8/test/mjsunit/wasm/gc-experimental-string-conversions.js
+++ b/deps/v8/test/mjsunit/wasm/gc-experimental-string-conversions.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Flags: --experimental-wasm-gc --wasm-gc-js-interop
+// Flags: --experimental-wasm-gc --allow-natives-syntax
 
 d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 
@@ -45,3 +45,24 @@ const array =
 for (let i = 0; i < string.length; ++i) {
   assertEquals(getChar(array, i), string.charCodeAt(i));
 }
+
+// Test calling built-ins with different amount of (invalid) arguments.
+function arrayToString() {
+  WebAssembly.experimentalConvertArrayToString(...arguments);
+}
+function stringToArray() {
+  WebAssembly.experimentalConvertStringToArray(...arguments);
+}
+
+let args = [];
+for (let i = 1; i <= 5; ++i) {
+  assertThrows(() => arrayToString(...args));
+  assertThrows(() => stringToArray(...args));
+  %PrepareFunctionForOptimization(arrayToString);
+  %PrepareFunctionForOptimization(stringToArray);
+  %OptimizeFunctionOnNextCall(arrayToString);
+  %OptimizeFunctionOnNextCall(stringToArray);
+  assertThrows(() => arrayToString(...args));
+  assertThrows(() => stringToArray(...args));
+  args.push(i);
+}
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop-async.js b/deps/v8/test/mjsunit/wasm/gc-js-interop-async.js
new file mode 100644
index 00000000000000..110e908b40de10
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop-async.js
@@ -0,0 +1,68 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --wasm-gc-js-interop --allow-natives-syntax
+
+d8.file.execute('test/mjsunit/wasm/gc-js-interop-helpers.js');
+
+let {struct, array} = CreateWasmObjects();
+for (const wasm_obj of [struct, array]) {
+
+  repeated(() => assertThrowsAsync(Promise.all(wasm_obj), TypeError));
+  repeated(() => Promise.all([wasm_obj]));
+  repeated(() => assertThrowsAsync(Promise.allSettled(wasm_obj), TypeError));
+  repeated(
+      () => Promise.allSettled([wasm_obj])
+                .then((info) => assertEquals('fulfilled', info[0].status)));
+  repeated(() => assertThrowsAsync(Promise.any(wasm_obj), TypeError));
+  repeated(() => Promise.any([wasm_obj]));
+  repeated(() => assertThrowsAsync(Promise.race(wasm_obj), TypeError));
+  repeated(() => Promise.race([wasm_obj]));
+  // Using wasm objects in Promise.resolve and Promise.reject should work as
+  // for any other object.
+  repeated(
+      () => (new Promise((resolve, reject) => resolve(wasm_obj)))
+                .then((v) => assertSame(wasm_obj, v)));
+  repeated(
+      () => (new Promise((resolve, reject) => reject(wasm_obj)))
+                .then(() => assertUnreachable())
+                .catch((v) => assertSame(wasm_obj, v)));
+  // Wasm objects can also be passed as a result in a then chain.
+  repeated(
+      () => (new Promise((resolve) => resolve({})))
+                .then(() => wasm_obj)
+                .then((v) => assertSame(wasm_obj, v)));
+  // If the `then` argument isn't a callback, it will simply be replaced with
+  // an identity function (x) => x.
+  repeated(
+      () => (new Promise((resolve) => resolve({})))
+                .then(wasm_obj)  // The value itself doesn't have any impact.
+                .then((v) => assertEquals({}, v), () => assertUnreachable()));
+  // If the `catch` argument isn't a callback, it will be replaced with a
+  // thrower function (x) => { throw x; }.
+  repeated(
+      () => (new Promise((resolve, reject) => reject({})))
+                .then(() => null)
+                .catch(wasm_obj)  // The value itself doesn't have any impact.
+                .then(() => assertUnreachable(), (v) => assertEquals({}, v)));
+  // `finally(wasm_obj)` behaves just like `then(wasm_obj, wasm_obj)`
+  repeated(
+      () => (new Promise((resolve, reject) => resolve({})))
+                .finally(wasm_obj)
+                .then((v) => assertEquals({}, v), () => assertUnreachable()));
+  repeated(
+      () => (new Promise((resolve, reject) => reject({})))
+                .finally(wasm_obj)
+                .then(() => assertUnreachable(), (v) => assertEquals({}, v)));
+
+  // Ensure no statement re-assigned wasm_obj by accident.
+  assertTrue(wasm_obj == struct || wasm_obj == array);
+}
+
+repeated(async function testAsync() {
+  for (let wasm_obj of [struct, array]) {
+    let async_wasm_obj = await wasm_obj;
+    assertSame(wasm_obj, async_wasm_obj);
+  }
+});
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop-collections.js b/deps/v8/test/mjsunit/wasm/gc-js-interop-collections.js
new file mode 100644
index 00000000000000..aea0ce7300b20e
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop-collections.js
@@ -0,0 +1,159 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --wasm-gc-js-interop --allow-natives-syntax
+
+d8.file.execute('test/mjsunit/wasm/gc-js-interop-helpers.js');
+
+let {struct, array} = CreateWasmObjects();
+for (const wasm_obj of [struct, array]) {
+
+  // Test Array.
+  testThrowsRepeated(() => Array.from(wasm_obj), TypeError);
+  repeated(() => assertFalse(Array.isArray(wasm_obj)));
+  repeated(() => assertEquals([wasm_obj], Array.of(wasm_obj)));
+  testThrowsRepeated(() => [1, 2].at(wasm_obj), TypeError);
+  repeated(() => assertEquals([1, wasm_obj], [1].concat(wasm_obj)));
+  testThrowsRepeated(() => [1, 2].copyWithin(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].every(wasm_obj), TypeError);
+  repeated(
+      () => assertEquals([1, wasm_obj, 3], [1, 2, 3].fill(wasm_obj, 1, 2)));
+  testThrowsRepeated(() => [1, 2].filter(wasm_obj), TypeError);
+  repeated(
+      () => assertEquals(
+          [wasm_obj], [undefined, wasm_obj, null].filter(function(v) {
+            return v == this;
+          }, wasm_obj)));
+  testThrowsRepeated(() => [1, 2].find(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].findIndex(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].findLast(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].findLastIndex(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].flat(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].flatMap(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].forEach(wasm_obj), TypeError);
+  repeated(() => {
+    let res = [];
+    [1, 2].forEach(function(x) {
+      res.push(this);
+    }, wasm_obj);
+    assertEquals([wasm_obj, wasm_obj], res);
+  });
+  repeated(() => assertTrue([wasm_obj].includes(wasm_obj)));
+  repeated(() => assertFalse([1].includes(wasm_obj)));
+  repeated(() => assertEquals(1, [0, wasm_obj, 2].indexOf(wasm_obj)));
+  testThrowsRepeated(() => ['a', 'b'].join(wasm_obj), TypeError);
+  repeated(() => assertEquals(1, [0, wasm_obj, 2].lastIndexOf(wasm_obj)));
+  testThrowsRepeated(() => [1, 2].map(wasm_obj), TypeError);
+  repeated(() => assertEquals([wasm_obj, wasm_obj], [1, 2].map(function() {
+             return this;
+           }, wasm_obj)));
+  repeated(() => {
+    let arr = [1];
+    arr.push(wasm_obj, 3);
+    assertEquals([1, wasm_obj, 3], arr);
+  });
+  testThrowsRepeated(() => [1, 2].reduce(wasm_obj), TypeError);
+  repeated(() => assertSame(wasm_obj, [].reduce(() => null, wasm_obj)));
+  testThrowsRepeated(() => [1, 2].reduceRight(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].slice(wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => [1, 2].some(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].sort(wasm_obj), TypeError);
+  testThrowsRepeated(() => [1, 2].splice(1, wasm_obj), TypeError);
+  repeated(() => {
+    let arr = [1, 2];
+    arr.unshift(wasm_obj);
+    assertEquals([wasm_obj, 1, 2], arr);
+  });
+  testThrowsRepeated(() => Int8Array.from(wasm_obj), TypeError);
+  testThrowsRepeated(() => Int8Array.of(wasm_obj), TypeError);
+  for (let ArrayType
+           of [Int8Array, Int16Array, Int32Array, Uint8Array, Uint16Array,
+               Uint32Array]) {
+    let array = ArrayType.of(1, 2, 3);
+    testThrowsRepeated(() => array.at(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.copyWithin(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.fill(wasm_obj, 0, 1), TypeError);
+    testThrowsRepeated(() => array.filter(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.find(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.findIndex(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.findLast(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.findLastIndex(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.forEach(wasm_obj), TypeError);
+    repeated(() => assertFalse(array.includes(wasm_obj)));
+    repeated(() => assertEquals(-1, array.indexOf(wasm_obj)));
+    testThrowsRepeated(() => array.join(wasm_obj), TypeError);
+    repeated(() => assertEquals(-1, array.lastIndexOf(wasm_obj)));
+    testThrowsRepeated(() => array.map(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.map(() => wasm_obj), TypeError);
+    testThrowsRepeated(() => array.reduce(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.reduceRight(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.set(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.set([wasm_obj]), TypeError);
+    testThrowsRepeated(() => array.slice(wasm_obj, 1), TypeError);
+    testThrowsRepeated(() => array.some(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.sort(wasm_obj), TypeError);
+    testThrowsRepeated(() => array.subarray(0, wasm_obj), TypeError);
+  }
+
+  // Test Map.
+  for (let MapType of [Map, WeakMap]) {
+    repeated(() => {
+      let val = new String('a');
+      let map = new MapType([[val, wasm_obj], [wasm_obj, val]]);
+      assertSame(wasm_obj, map.get(val));
+      assertEquals(val, map.get(wasm_obj));
+      assertTrue(map.has(wasm_obj));
+      map.delete(wasm_obj);
+      assertFalse(map.has(wasm_obj));
+      assertThrows(() => map.forEach(wasm_obj), TypeError);
+      map.set(wasm_obj, wasm_obj);
+      assertSame(wasm_obj, map.get(wasm_obj));
+    });
+  }
+
+  // Test Set.
+  for (let SetType of [Set, WeakSet]) {
+    repeated(() => {
+      let set = new SetType([new String('a'), wasm_obj]);
+      set.add(wasm_obj);
+      assertTrue(set.has(wasm_obj));
+      set.delete(wasm_obj);
+      assertFalse(set.has(wasm_obj));
+    });
+  }
+
+  // Test ArrayBuffer.
+  repeated(() => assertFalse(ArrayBuffer.isView(wasm_obj)));
+  testThrowsRepeated(
+      () => (new ArrayBuffer(32)).slice(wasm_obj, wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => (new SharedArrayBuffer(32)).slice(wasm_obj, wasm_obj), TypeError);
+
+  // Test Dataview.
+  let arrayBuf = new ArrayBuffer(32);
+  let dataView = new DataView(arrayBuf);
+  testThrowsRepeated(() => dataView.getBigInt64(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.getBigUint64(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.getFloat32(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.getFloat64(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.getInt8(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.getInt16(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.getInt32(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.getUint8(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.getUint16(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.getUint32(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setBigInt64(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setBigUint64(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setFloat32(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setFloat64(0, wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setInt8(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setInt16(0, wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setInt32(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setUint8(0, wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setUint16(wasm_obj), TypeError);
+  testThrowsRepeated(() => dataView.setUint32(0, wasm_obj), TypeError);
+
+  // Ensure no statement re-assigned wasm_obj by accident.
+  assertTrue(wasm_obj == struct || wasm_obj == array);
+}
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop-export.mjs b/deps/v8/test/mjsunit/wasm/gc-js-interop-export.mjs
new file mode 100644
index 00000000000000..ee5e4a23bc2c96
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop-export.mjs
@@ -0,0 +1,6 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+d8.file.execute('test/mjsunit/wasm/gc-js-interop-helpers.js');
+export let {struct, array} = CreateWasmObjects();
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop-global-constructors.js b/deps/v8/test/mjsunit/wasm/gc-js-interop-global-constructors.js
new file mode 100644
index 00000000000000..d45cd30ec5b556
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop-global-constructors.js
@@ -0,0 +1,95 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --wasm-gc-js-interop --allow-natives-syntax
+
+d8.file.execute('test/mjsunit/wasm/gc-js-interop-helpers.js');
+
+let {struct, array} = CreateWasmObjects();
+for (const wasm_obj of [struct, array]) {
+
+  // Test constructors of the global object as function.
+  testThrowsRepeated(() => AggregateError(wasm_obj), TypeError);
+  repeated(() => assertSame(wasm_obj, Array(wasm_obj)[0]));
+  testThrowsRepeated(() => ArrayBuffer(wasm_obj), TypeError);
+  testThrowsRepeated(() => BigInt(wasm_obj), TypeError);
+  testThrowsRepeated(() => BigInt64Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => BigUint64Array(wasm_obj), TypeError);
+  repeated(() => assertEquals(true, Boolean(wasm_obj)));
+  testThrowsRepeated(() => DataView(wasm_obj), TypeError);
+  repeated(() => {
+    let date = Date(wasm_obj);
+    assertEquals('string', typeof date);
+  });
+  testThrowsRepeated(() => Error(wasm_obj), TypeError);
+  testThrowsRepeated(() => EvalError(wasm_obj), TypeError);
+  testThrowsRepeated(() => Float64Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => Function(wasm_obj), TypeError);
+  testThrowsRepeated(() => Int8Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => Int16Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => Int32Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => Map(wasm_obj), TypeError);
+  testThrowsRepeated(() => Number(wasm_obj), TypeError);
+  repeated(() => assertSame(wasm_obj, Object(wasm_obj)));
+  testThrowsRepeated(() => Promise(wasm_obj), TypeError);
+  testThrowsRepeated(() => Proxy(wasm_obj), TypeError);
+  testThrowsRepeated(() => RangeError(wasm_obj), TypeError);
+  testThrowsRepeated(() => ReferenceError(wasm_obj), TypeError);
+  testThrowsRepeated(() => RegExp(wasm_obj), TypeError);
+  testThrowsRepeated(() => Set(wasm_obj), TypeError);
+  testThrowsRepeated(() => SharedArrayBuffer(wasm_obj), TypeError);
+  testThrowsRepeated(() => String(wasm_obj), TypeError);
+  testThrowsRepeated(() => Symbol(wasm_obj), TypeError);
+  testThrowsRepeated(() => SyntaxError(wasm_obj), TypeError);
+  testThrowsRepeated(() => TypeError(wasm_obj), TypeError);
+  testThrowsRepeated(() => Uint8Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => Uint16Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => Uint32Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => URIError(wasm_obj), TypeError);
+  testThrowsRepeated(() => WeakMap(wasm_obj), TypeError);
+  testThrowsRepeated(() => WeakRef(wasm_obj), TypeError);
+  testThrowsRepeated(() => WeakSet(wasm_obj), TypeError);
+
+  // Test constructors of the global object with new.
+  testThrowsRepeated(() => new AggregateError(wasm_obj), TypeError);
+  repeated(() => assertSame(wasm_obj, new Array(wasm_obj)[0]));
+  testThrowsRepeated(() => new ArrayBuffer(wasm_obj), TypeError);
+  testThrowsRepeated(() => new BigInt(wasm_obj), TypeError);
+  testThrowsRepeated(() => new BigInt64Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => new BigUint64Array(wasm_obj), TypeError);
+  repeated(() => assertEquals(true, (new Boolean(wasm_obj)).valueOf()));
+  testThrowsRepeated(() => new DataView(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Date(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Error(wasm_obj), TypeError);
+  testThrowsRepeated(() => new EvalError(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Float64Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Function(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Int8Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Int16Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Int32Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Map(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Number(wasm_obj), TypeError);
+  repeated(() => assertSame(wasm_obj, new Object(wasm_obj)));
+  testThrowsRepeated(() => new Promise(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Proxy(wasm_obj), TypeError);
+  testThrowsRepeated(() => new RangeError(wasm_obj), TypeError);
+  testThrowsRepeated(() => new ReferenceError(wasm_obj), TypeError);
+  testThrowsRepeated(() => new RegExp(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Set(wasm_obj), TypeError);
+  testThrowsRepeated(() => new SharedArrayBuffer(wasm_obj), TypeError);
+  testThrowsRepeated(() => new String(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Symbol(wasm_obj), TypeError);
+  testThrowsRepeated(() => new SyntaxError(wasm_obj), TypeError);
+  testThrowsRepeated(() => new TypeError(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Uint8Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Uint16Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => new Uint32Array(wasm_obj), TypeError);
+  testThrowsRepeated(() => new URIError(wasm_obj), TypeError);
+  testThrowsRepeated(() => new WeakMap(wasm_obj), TypeError);
+  repeated(() => assertSame(wasm_obj, new WeakRef(wasm_obj).deref()));
+  testThrowsRepeated(() => new WeakSet(wasm_obj), TypeError);
+
+  // Ensure no statement re-assigned wasm_obj by accident.
+  assertTrue(wasm_obj == struct || wasm_obj == array);
+}
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop-helpers.js b/deps/v8/test/mjsunit/wasm/gc-js-interop-helpers.js
new file mode 100644
index 00000000000000..2047862d1682a7
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop-helpers.js
@@ -0,0 +1,54 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Helpers to test interoperability of Wasm objects in JavaScript.
+
+d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
+
+function CreateWasmObjects() {
+  let builder = new WasmModuleBuilder();
+  builder.setSingletonRecGroups();
+  let struct_type = builder.addStruct([makeField(kWasmI32, true)]);
+  let array_type = builder.addArray(kWasmI32, true);
+  builder.addFunction('MakeStruct', makeSig([], [kWasmExternRef]))
+      .exportFunc()
+      .addBody([
+        kExprI32Const, 42,                       // --
+        kGCPrefix, kExprStructNew, struct_type,  // --
+        kGCPrefix, kExprExternExternalize        // --
+      ]);
+  builder.addFunction('MakeArray', makeSig([], [kWasmExternRef]))
+      .exportFunc()
+      .addBody([
+        kExprI32Const, 2,                             // length
+        kGCPrefix, kExprArrayNewDefault, array_type,  // --
+        kGCPrefix, kExprExternExternalize             // --
+      ]);
+
+  let instance = builder.instantiate();
+  return {
+    struct: instance.exports.MakeStruct(),
+    array: instance.exports.MakeArray(),
+  };
+}
+
+function testThrowsRepeated(fn, ErrorType) {
+  %PrepareFunctionForOptimization(fn);
+  for (let i = 0; i < 5; i++) assertThrows(fn, ErrorType);
+  %OptimizeFunctionOnNextCall(fn);
+  assertThrows(fn, ErrorType);
+  // TODO(7748): This assertion doesn't hold true, as some cases run into
+  // deopt loops.
+  // assertTrue(%ActiveTierIsTurbofan(fn));
+}
+
+function repeated(fn) {
+  %PrepareFunctionForOptimization(fn);
+  for (let i = 0; i < 5; i++) fn();
+  %OptimizeFunctionOnNextCall(fn);
+  fn();
+  // TODO(7748): This assertion doesn't hold true, as some cases run into
+  // deopt loops.
+  // assertTrue(%ActiveTierIsTurbofan(fn));
+}
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop-import.mjs b/deps/v8/test/mjsunit/wasm/gc-js-interop-import.mjs
new file mode 100644
index 00000000000000..ce4d5f9633eb7b
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop-import.mjs
@@ -0,0 +1,37 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --wasm-gc-js-interop --allow-natives-syntax
+
+import {struct, array} from 'gc-js-interop-export.mjs';
+
+// Read struct and array with new wasm module.
+let builder = new WasmModuleBuilder();
+builder.setSingletonRecGroups();
+let struct_type = builder.addStruct([makeField(kWasmI32, true)]);
+let array_type = builder.addArray(kWasmI32, true);
+builder.addFunction('readStruct', makeSig([kWasmExternRef], [kWasmI32]))
+    .exportFunc()
+    .addBody([
+      kExprLocalGet, 0,                           // --
+      kGCPrefix, kExprExternInternalize,          // --
+      kGCPrefix, kExprRefAsData,                  // --
+      kGCPrefix, kExprRefCast, struct_type,       // --
+      kGCPrefix, kExprStructGet, struct_type, 0,  // --
+    ]);
+builder.addFunction('readArrayLength', makeSig([kWasmExternRef], [kWasmI32]))
+    .exportFunc()
+    .addBody([
+      kExprLocalGet, 0,                           // --
+      kGCPrefix, kExprExternInternalize,          // --
+      kGCPrefix, kExprRefAsArray,                 // --
+      kGCPrefix, kExprArrayLen,
+    ]);
+
+let instance = builder.instantiate();
+let wasm = instance.exports;
+assertEquals(42, wasm.readStruct(struct));
+assertEquals(2, wasm.readArrayLength(array));
+assertTraps(kTrapIllegalCast, () => wasm.readStruct(array));
+assertTraps(kTrapIllegalCast, () => wasm.readArrayLength(struct));
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop-numeric.js b/deps/v8/test/mjsunit/wasm/gc-js-interop-numeric.js
new file mode 100644
index 00000000000000..72c22da66fa4c0
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop-numeric.js
@@ -0,0 +1,104 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --wasm-gc-js-interop --allow-natives-syntax
+
+d8.file.execute('test/mjsunit/wasm/gc-js-interop-helpers.js');
+
+let {struct, array} = CreateWasmObjects();
+for (const wasm_obj of [struct, array]) {
+
+  // Test numeric operators.
+  testThrowsRepeated(() => ++wasm_obj, TypeError);
+  testThrowsRepeated(() => wasm_obj--, TypeError);
+  testThrowsRepeated(() => +wasm_obj, TypeError);
+  testThrowsRepeated(() => -wasm_obj, TypeError);
+  testThrowsRepeated(() => ~wasm_obj, TypeError);
+  testThrowsRepeated(() => wasm_obj - 2, TypeError);
+  testThrowsRepeated(() => wasm_obj * 2, TypeError);
+  testThrowsRepeated(() => wasm_obj / 2, TypeError);
+  testThrowsRepeated(() => wasm_obj ** 2, TypeError);
+  testThrowsRepeated(() => wasm_obj << 2, TypeError);
+  testThrowsRepeated(() => wasm_obj >> 2, TypeError);
+  testThrowsRepeated(() => 2 >>> wasm_obj, TypeError);
+  testThrowsRepeated(() => 2 % wasm_obj, TypeError);
+  testThrowsRepeated(() => wasm_obj | 1, TypeError);
+  testThrowsRepeated(() => 1 & wasm_obj, TypeError);
+  testThrowsRepeated(() => wasm_obj ^ wasm_obj, TypeError);
+  testThrowsRepeated(() => wasm_obj += 1, TypeError);
+  let tmp = 1;
+  testThrowsRepeated(() => tmp += wasm_obj, TypeError);
+  testThrowsRepeated(() => tmp <<= wasm_obj, TypeError);
+  testThrowsRepeated(() => tmp &= wasm_obj, TypeError);
+  testThrowsRepeated(() => tmp **= wasm_obj, TypeError);
+
+  // Test numeric functions of the global object.
+  testThrowsRepeated(() => isFinite(wasm_obj), TypeError);
+  testThrowsRepeated(() => isNaN(wasm_obj), TypeError);
+  testThrowsRepeated(() => parseFloat(wasm_obj), TypeError);
+  testThrowsRepeated(() => parseInt(wasm_obj), TypeError);
+
+  // Test Number.
+  repeated(() => assertFalse(Number.isFinite(wasm_obj)));
+  repeated(() => assertFalse(Number.isInteger(wasm_obj)));
+  repeated(() => assertFalse(Number.isNaN(wasm_obj)));
+  repeated(() => assertFalse(Number.isSafeInteger(wasm_obj)));
+  testThrowsRepeated(() => Number.parseFloat(wasm_obj), TypeError);
+  testThrowsRepeated(() => Number.parseInt(wasm_obj), TypeError);
+
+  // Test BigInt.
+  testThrowsRepeated(() => BigInt.asIntN(2, wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => BigInt.asUintN(wasm_obj, 123n), TypeError);
+
+  // Test Math.
+  testThrowsRepeated(() => Math.abs(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.acos(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.acosh(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.asin(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.asinh(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.atan(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.atanh(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.atan2(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.cbrt(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.ceil(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.clz32(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.cos(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.cosh(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.exp(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.expm1(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.floor(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.fround(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.hypot(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.imul(wasm_obj, wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.log(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.log1p(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.log10(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.log2(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.max(2, wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.min(2, wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.pow(2, wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.pow(wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => Math.round(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.sign(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.sin(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.sinh(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.sqrt(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.tan(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.tanh(wasm_obj), TypeError);
+  testThrowsRepeated(() => Math.trunc(wasm_obj), TypeError);
+
+  // Test boolean.
+  repeated(() => assertFalse(!wasm_obj));
+  repeated(() => assertTrue(wasm_obj ? true : false));
+  tmp = true;
+  repeated(() => assertSame(wasm_obj, tmp &&= wasm_obj));
+  tmp = 0;
+  repeated(() => assertSame(wasm_obj, tmp ||= wasm_obj));
+  tmp = null;
+  repeated(() => assertSame(wasm_obj, tmp ??= wasm_obj));
+
+  // Ensure no statement re-assigned wasm_obj by accident.
+  assertTrue(wasm_obj == struct || wasm_obj == array);
+}
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop-objects.js b/deps/v8/test/mjsunit/wasm/gc-js-interop-objects.js
new file mode 100644
index 00000000000000..9581248fa7d8d6
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop-objects.js
@@ -0,0 +1,176 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --wasm-gc-js-interop --allow-natives-syntax
+
+d8.file.execute('test/mjsunit/wasm/gc-js-interop-helpers.js');
+
+let {struct, array} = CreateWasmObjects();
+for (const wasm_obj of [struct, array]) {
+
+  // Test Object.
+  testThrowsRepeated(() => Object.freeze(wasm_obj), TypeError);
+  testThrowsRepeated(() => Object.seal(wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => Object.prototype.__lookupGetter__.call(wasm_obj, 'foo'), TypeError);
+  testThrowsRepeated(
+      () => Object.prototype.__lookupSetter__.call(wasm_obj, 'foo'), TypeError);
+  testThrowsRepeated(
+      () => Object.prototype.__defineGetter__.call(wasm_obj, 'foo', () => 42),
+      TypeError);
+  testThrowsRepeated(
+      () => Object.prototype.__defineSetter__.call(wasm_obj, 'foo', () => {}),
+      TypeError);
+  testThrowsRepeated(
+      () => Object.defineProperty(wasm_obj, 'foo', {value: 42}), TypeError);
+
+  repeated(() => assertEquals([], Object.getOwnPropertyNames(wasm_obj)));
+  repeated(() => assertEquals([], Object.getOwnPropertySymbols(wasm_obj)));
+  repeated(() => assertEquals({}, Object.getOwnPropertyDescriptors(wasm_obj)));
+  repeated(() => assertEquals([], Object.keys(wasm_obj)));
+  repeated(() => assertEquals([], Object.entries(wasm_obj)));
+  repeated(
+      () => assertEquals(
+          undefined, Object.getOwnPropertyDescriptor(wasm_obj, 'foo')));
+  repeated(() => assertEquals(false, 'foo' in wasm_obj));
+  repeated(
+      () => assertEquals(
+          false, Object.prototype.hasOwnProperty.call(wasm_obj, 'foo')));
+  repeated(() => assertEquals(true, Object.isSealed(wasm_obj)));
+  repeated(() => assertEquals(true, Object.isFrozen(wasm_obj)));
+  repeated(() => assertEquals(false, Object.isExtensible(wasm_obj)));
+  repeated(() => assertEquals('object', typeof wasm_obj));
+  repeated(
+      () => assertEquals(
+          '[object Object]', Object.prototype.toString.call(wasm_obj)));
+
+  repeated(() => {
+    let tgt = {};
+    Object.assign(tgt, wasm_obj);
+    assertEquals({}, tgt);
+  });
+  repeated(() => Object.create(wasm_obj));
+  repeated(() => ({}).__proto__ = wasm_obj);
+  testThrowsRepeated(
+      () => Object.defineProperties(wasm_obj, {prop: {value: 1}}), TypeError);
+  testThrowsRepeated(
+      () => Object.defineProperty(wasm_obj, 'prop', {value: 1}), TypeError);
+  testThrowsRepeated(() => Object.fromEntries(wasm_obj), TypeError);
+  testThrowsRepeated(() => Object.getPrototypeOf(wasm_obj), TypeError);
+  repeated(() => assertFalse(Object.hasOwn(wasm_obj, 'test')));
+  testThrowsRepeated(() => Object.preventExtensions(wasm_obj), TypeError);
+  testThrowsRepeated(() => Object.setPrototypeOf(wasm_obj, Object), TypeError);
+  repeated(() => assertEquals([], Object.values(wasm_obj)));
+  testThrowsRepeated(() => wasm_obj.toString(), TypeError);
+
+  // Test prototype chain containing a wasm object.
+  {
+    let obj = Object.create(wasm_obj);
+    repeated(() => assertSame(wasm_obj, Object.getPrototypeOf(obj)));
+    repeated(() => assertSame(wasm_obj, Reflect.getPrototypeOf(obj)));
+    testThrowsRepeated(() => obj.__proto__, TypeError);
+    testThrowsRepeated(() => obj.__proto__ = wasm_obj, TypeError);
+    // Property access fails.
+    testThrowsRepeated(() => obj[0], TypeError);
+    testThrowsRepeated(() => obj.prop, TypeError);
+    testThrowsRepeated(() => obj.toString(), TypeError);
+    // Most conversions fail as it will use .toString(), .valueOf(), ...
+    testThrowsRepeated(() => `${obj}`, TypeError);
+    testThrowsRepeated(() => obj + 1, TypeError);
+    repeated(() => assertTrue(!!obj));
+  }
+  repeated(() => {
+    let obj = {};
+    Object.setPrototypeOf(obj, wasm_obj);
+    assertSame(wasm_obj, Object.getPrototypeOf(obj));
+    Object.setPrototypeOf(obj, null);
+    assertSame(null, Object.getPrototypeOf(obj));
+    Reflect.setPrototypeOf(obj, wasm_obj);
+    assertSame(wasm_obj, Reflect.getPrototypeOf(obj));
+  })
+
+  // Test Reflect.
+  {
+    let fct = function(x) {
+      return [this, x]
+    };
+    repeated(
+        () => assertEquals([wasm_obj, 1], Reflect.apply(fct, wasm_obj, [1])));
+    repeated(
+        () => assertEquals([{}, wasm_obj], Reflect.apply(fct, {}, [wasm_obj])));
+    testThrowsRepeated(() => Reflect.apply(fct, 1, wasm_obj), TypeError);
+    testThrowsRepeated(() => Reflect.apply(wasm_obj, null, []), TypeError);
+  }
+  testThrowsRepeated(() => Reflect.construct(wasm_obj, []), TypeError);
+  testThrowsRepeated(() => Reflect.construct(Object, wasm_obj), TypeError);
+  testThrowsRepeated(() => Reflect.construct(Object, [], wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => Reflect.defineProperty(wasm_obj, 'prop', {value: 1}), TypeError);
+  testThrowsRepeated(
+      () => Reflect.defineProperty({}, wasm_obj, {value: 1}), TypeError);
+
+  // Reflect.defineProperty performs ToPropertyDescriptor on the third
+  // argument which checks whether {value} etc. exist before accessing them.
+  // Therefore it does not throw but add the property with value undefined.
+  repeated(() => {
+    let obj = {};
+    assertTrue(Reflect.defineProperty(obj, 'prop', wasm_obj));
+    assertTrue(obj.hasOwnProperty('prop'));
+    assertEquals(undefined, obj.prop);
+  });
+  repeated(() => {
+    let obj = {};
+    assertTrue(Reflect.defineProperty(obj, 'prop2', {value: wasm_obj}));
+    assertSame(wasm_obj, obj.prop2);
+  });
+  testThrowsRepeated(() => Reflect.deleteProperty(wasm_obj, 'prop'), TypeError);
+  testThrowsRepeated(() => Reflect.deleteProperty({}, wasm_obj), TypeError);
+  testThrowsRepeated(() => Reflect.get(wasm_obj, 'prop'), TypeError);
+  testThrowsRepeated(() => Reflect.getPrototypeOf(wasm_obj), TypeError);
+  repeated(() => assertFalse(Reflect.has(wasm_obj, 'prop')));
+  repeated(() => assertTrue(Reflect.has({wasm_obj}, 'wasm_obj')));
+
+  repeated(() => assertFalse(Reflect.isExtensible(wasm_obj)));
+  repeated(() => assertEquals([], Reflect.ownKeys(wasm_obj)));
+  testThrowsRepeated(() => Reflect.preventExtensions(wasm_obj), TypeError);
+  testThrowsRepeated(() => Reflect.set(wasm_obj, 'prop', 123), TypeError);
+  testThrowsRepeated(
+      () => Reflect.setPrototypeOf(wasm_obj, Object.prototype), TypeError);
+  repeated(() => Reflect.setPrototypeOf({}, wasm_obj));
+
+  // Test Proxy.
+  {
+    const handler = {
+      get(target, prop, receiver) {
+        return 'proxied';
+      }
+    };
+    let proxy = new Proxy(wasm_obj, handler);
+    repeated(() => assertEquals('proxied', proxy.abc));
+    testThrowsRepeated(() => proxy.abc = 123, TypeError);
+  }
+  {
+    let proxy = new Proxy({}, wasm_obj);
+    testThrowsRepeated(() => proxy.abc, TypeError);
+  }
+  {
+    const handler = {
+      get(target, prop, receiver) {
+        return 'proxied';
+      }
+    };
+    let {proxy, revoke} = Proxy.revocable(wasm_obj, handler);
+    repeated(() => assertEquals('proxied', proxy.abc));
+    testThrowsRepeated(() => proxy.abc = 123, TypeError);
+    revoke();
+    testThrowsRepeated(() => proxy.abc, TypeError);
+  }
+  {
+    let proxy = Proxy.revocable({}, wasm_obj).proxy;
+    testThrowsRepeated(() => proxy.abc, TypeError);
+  }
+
+  // Ensure no statement re-assigned wasm_obj by accident.
+  assertTrue(wasm_obj == struct || wasm_obj == array);
+}
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop-wasm.js b/deps/v8/test/mjsunit/wasm/gc-js-interop-wasm.js
new file mode 100644
index 00000000000000..d97bff89cdb7a2
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop-wasm.js
@@ -0,0 +1,87 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --wasm-gc-js-interop --wasm-test-streaming
+// Flags: --allow-natives-syntax
+
+d8.file.execute('test/mjsunit/wasm/gc-js-interop-helpers.js');
+
+let {struct, array} = CreateWasmObjects();
+for (const wasm_obj of [struct, array]) {
+  testThrowsRepeated(() => new WebAssembly.Global(wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => new WebAssembly.Global({value: wasm_obj}), TypeError);
+  testThrowsRepeated(
+      () => new WebAssembly.Global({value: 'i32'}, wasm_obj), TypeError);
+  repeated(
+      () => assertSame(
+          wasm_obj,
+          (new WebAssembly.Global({value: 'anyref'}, wasm_obj)).value));
+
+  testThrowsRepeated(() => new WebAssembly.Module(wasm_obj), TypeError);
+  let module = () => {
+    let buffer = (new Uint8Array((new WasmModuleBuilder()).toArray())).buffer;
+    return new WebAssembly.Module(buffer);
+  };
+  testThrowsRepeated(
+      () => WebAssembly.Module.customSections(wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => WebAssembly.Module.customSections(module, wasm_obj), TypeError);
+  testThrowsRepeated(() => WebAssembly.Module.exports(wasm_obj), TypeError);
+  testThrowsRepeated(() => WebAssembly.Module.imports(wasm_obj), TypeError);
+
+  testThrowsRepeated(() => new WebAssembly.Instance(wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => new WebAssembly.Instance(module, wasm_obj), TypeError);
+
+  repeated(() => assertThrowsAsync(WebAssembly.compile(wasm_obj), TypeError));
+  repeated(
+      () =>
+          assertThrowsAsync(WebAssembly.compileStreaming(wasm_obj), TypeError));
+  repeated(
+      () => assertThrowsAsync(WebAssembly.instantiate(wasm_obj), TypeError));
+  repeated(
+      () => assertThrowsAsync(
+          WebAssembly.instantiateStreaming(wasm_obj), TypeError));
+  testThrowsRepeated(() => WebAssembly.validate(wasm_obj), TypeError);
+
+  testThrowsRepeated(() => new WebAssembly.Memory(wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => new WebAssembly.Memory({initial: wasm_obj}), TypeError);
+  testThrowsRepeated(
+      () => new WebAssembly.Memory({initial: 1, shared: wasm_obj}), TypeError);
+  let memory = new WebAssembly.Memory({initial: 1});
+  testThrowsRepeated(() => memory.grow(wasm_obj), TypeError);
+
+  testThrowsRepeated(() => new WebAssembly.Table(wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => new WebAssembly.Table({element: wasm_obj, initial: wasm_obj}),
+      TypeError);
+  let table = new WebAssembly.Table({initial: 1, element: 'externref'});
+  testThrowsRepeated(() => table.get(wasm_obj), TypeError);
+  testThrowsRepeated(() => table.grow(wasm_obj), TypeError);
+  testThrowsRepeated(() => table.set(wasm_obj, null), TypeError);
+  repeated(() => table.set(0, wasm_obj));
+
+  testThrowsRepeated(() => new WebAssembly.Tag(wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => new WebAssembly.Tag({parameters: wasm_obj}), TypeError);
+  testThrowsRepeated(
+      () => new WebAssembly.Tag({parameters: [wasm_obj]}), TypeError);
+
+  let tag = new WebAssembly.Tag({parameters: ['dataref']});
+  testThrowsRepeated(() => new WebAssembly.Exception(wasm_obj), TypeError);
+  testThrowsRepeated(() => new WebAssembly.Exception(tag, wasm_obj), TypeError);
+  repeated(() => new WebAssembly.Exception(tag, [wasm_obj]));
+  let exception = new WebAssembly.Exception(tag, [wasm_obj]);
+  testThrowsRepeated(() => exception.is(wasm_obj), TypeError);
+  testThrowsRepeated(() => exception.getArg(wasm_obj), TypeError);
+  testThrowsRepeated(() => exception.getArg(tag, wasm_obj), TypeError);
+  testThrowsRepeated(() => new WebAssembly.CompileError(wasm_obj), TypeError);
+  testThrowsRepeated(() => new WebAssembly.LinkError(wasm_obj), TypeError);
+  testThrowsRepeated(() => new WebAssembly.RuntimeError(wasm_obj), TypeError);
+
+  // Ensure no statement re-assigned wasm_obj by accident.
+  assertTrue(wasm_obj == struct || wasm_obj == array);
+}
diff --git a/deps/v8/test/mjsunit/wasm/gc-js-interop.js b/deps/v8/test/mjsunit/wasm/gc-js-interop.js
new file mode 100644
index 00000000000000..d05144d13a1de2
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-js-interop.js
@@ -0,0 +1,280 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --wasm-gc-js-interop --allow-natives-syntax
+
+d8.file.execute('test/mjsunit/wasm/gc-js-interop-helpers.js');
+
+let {struct, array} = CreateWasmObjects();
+for (const wasm_obj of [struct, array]) {
+  testThrowsRepeated(() => wasm_obj.foo, TypeError);
+  testThrowsRepeated(() => wasm_obj.foo = 42, TypeError);
+  testThrowsRepeated(() => wasm_obj[0], TypeError);
+  testThrowsRepeated(() => wasm_obj[0] = undefined, TypeError);
+  testThrowsRepeated(() => wasm_obj.__proto__, TypeError);
+  testThrowsRepeated(
+      () => Object.prototype.__proto__.call(wasm_obj), TypeError);
+  testThrowsRepeated(() => wasm_obj.__proto__ = null, TypeError);
+  testThrowsRepeated(() => JSON.stringify(wasm_obj), TypeError);
+  testThrowsRepeated(() => {
+    for (let p in wasm_obj) {
+    }
+  }, TypeError);
+  testThrowsRepeated(() => {
+    for (let p of wasm_obj) {
+    }
+  }, TypeError);
+  testThrowsRepeated(() => wasm_obj.toString(), TypeError);
+  testThrowsRepeated(() => wasm_obj.valueOf(), TypeError);
+  testThrowsRepeated(() => '' + wasm_obj, TypeError);
+  testThrowsRepeated(() => 0 + wasm_obj, TypeError);
+  testThrowsRepeated(() => { delete wasm_obj.foo; }, TypeError);
+
+  {
+    let js_obj = {};
+    js_obj.foo = wasm_obj;
+    repeated(() => assertSame(wasm_obj, js_obj.foo));
+    js_obj[0] = wasm_obj;
+    repeated(() => assertSame(wasm_obj, js_obj[0]));
+  }
+
+  repeated(() => assertEquals(42, wasm_obj ? 42 : 0));
+  testThrowsRepeated(() => wasm_obj(), TypeError);
+
+  testThrowsRepeated(() => [...wasm_obj], TypeError);
+  repeated(() => assertEquals({}, {...wasm_obj}));
+  repeated(() => ((...wasm_obj) => {})());
+  repeated(() => assertSame(wasm_obj, ({wasm_obj}).wasm_obj));
+  testThrowsRepeated(() => ({[wasm_obj]: null}), TypeError);
+  testThrowsRepeated(() => `${wasm_obj}`, TypeError);
+  testThrowsRepeated(() => wasm_obj`test`, TypeError);
+  testThrowsRepeated(() => new wasm_obj, TypeError);
+  testThrowsRepeated(() => wasm_obj?.property, TypeError);
+
+  repeated(() => assertEquals(undefined, void wasm_obj));
+  testThrowsRepeated(() => 2 == wasm_obj, TypeError);
+  repeated(() => assertFalse(2 === wasm_obj));
+  repeated(() => assertFalse({} === wasm_obj));
+  repeated(() => assertTrue(wasm_obj == wasm_obj));
+  repeated(() => assertTrue(wasm_obj === wasm_obj));
+  repeated(() => assertFalse(wasm_obj != wasm_obj));
+  repeated(() => assertFalse(wasm_obj !== wasm_obj));
+  repeated(() => assertFalse(struct == array));
+  repeated(() => assertTrue(struct != array));
+  testThrowsRepeated(() => wasm_obj < wasm_obj, TypeError);
+  testThrowsRepeated(() => wasm_obj <= wasm_obj, TypeError);
+  testThrowsRepeated(() => wasm_obj >= wasm_obj, TypeError);
+
+  testThrowsRepeated(() => { let [] = wasm_obj; }, TypeError);
+  testThrowsRepeated(() => { let [a, b] = wasm_obj; }, TypeError);
+  testThrowsRepeated(() => { let [...all] = wasm_obj; }, TypeError);
+  testThrowsRepeated(() => { let {a} = wasm_obj; }, TypeError);
+  repeated(() => { let {} = wasm_obj; }, TypeError);
+  repeated(() => {
+    let {...rest} = wasm_obj;
+    assertTrue(rest instanceof Object);
+  });
+  testThrowsRepeated(() => {
+    with(wasm_obj) test;
+  }, ReferenceError);
+  repeated(() => {
+    let tmp = 1;
+    with(wasm_obj) var with_lookup = tmp;
+    assertEquals(tmp, with_lookup);
+  });
+  repeated(() => {
+    switch (wasm_obj) {
+      case 0:
+      default:
+        throw 1;
+      case wasm_obj:
+        break;
+    }
+  });
+  repeated(() => {
+    try {
+      throw wasm_obj;
+    } catch (e) {
+      assertEquals(e, wasm_obj);
+    }
+  });
+  testThrowsRepeated(
+      () => {class SubClass extends wasm_obj {}}, TypeError,
+      'Class extends value [object Object] is not a constructor or null');
+  repeated(() => {
+    class TestMemberInit {
+      x = wasm_obj;
+    };
+    assertSame(wasm_obj, new TestMemberInit().x);
+  });
+  repeated(() => assertSame(wasm_obj, eval('wasm_obj')));
+
+  // Test functions of the global object.
+  testThrowsRepeated(() => decodeURI(wasm_obj), TypeError);
+  testThrowsRepeated(() => decodeURIComponent(wasm_obj), TypeError);
+  testThrowsRepeated(() => encodeURI(wasm_obj), TypeError);
+  testThrowsRepeated(() => encodeURIComponent(wasm_obj), TypeError);
+
+  {
+    let fct = function(x) {
+      return [this, x]
+    };
+    repeated(() => assertEquals([wasm_obj, 1], fct.apply(wasm_obj, [1])));
+    repeated(
+        () =>
+            assertEquals([new Number(1), wasm_obj], fct.apply(1, [wasm_obj])));
+    testThrowsRepeated(() => fct.apply(1, wasm_obj), TypeError);
+    repeated(() => assertEquals([wasm_obj, 1], fct.bind(wasm_obj)(1)));
+    repeated(() => assertEquals([wasm_obj, 1], fct.call(wasm_obj, 1)));
+  }
+
+  testThrowsRepeated(() => Symbol.for(wasm_obj), TypeError);
+  testThrowsRepeated(() => Symbol.keyFor(wasm_obj), TypeError);
+  testThrowsRepeated(() => Date.parse(wasm_obj), TypeError);
+  testThrowsRepeated(() => Date.UTC(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setDate(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setFullYear(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setHours(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setMilliseconds(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setMinutes(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setMonth(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setSeconds(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setTime(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setUTCDate(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setUTCFullYear(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setUTCHours(wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => (new Date()).setUTCMilliseconds(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setUTCMinutes(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setUTCMonth(wasm_obj), TypeError);
+  testThrowsRepeated(() => (new Date()).setUTCSeconds(wasm_obj), TypeError);
+  // Date.prototype.toJSON() parameter `key` is ignored.
+  repeated(() => (new Date()).toJSON(wasm_obj));
+  testThrowsRepeated(() => String.fromCharCode(wasm_obj), TypeError);
+  testThrowsRepeated(() => String.fromCodePoint(wasm_obj), TypeError);
+  testThrowsRepeated(() => String.raw(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.at(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.charAt(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.charCodeAt(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.codePointAt(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.concat(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.endsWith(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.endsWith('t', wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.includes(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.includes('t', wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.indexOf(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.lastIndexOf(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.localeCompare(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.match(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.matchAll(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.normalize(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.padEnd(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.padStart(10, wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.repeat(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.replace(wasm_obj, ''), TypeError);
+  testThrowsRepeated(() => 'test'.replace('t', wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.replaceAll(wasm_obj, ''), TypeError);
+  testThrowsRepeated(() => 'test'.search(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.slice(wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => 'test'.split(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.startsWith(wasm_obj), TypeError);
+  testThrowsRepeated(() => 'test'.substring(wasm_obj), TypeError);
+
+  let i8Array = new Int8Array(32);
+  testThrowsRepeated(() => Atomics.add(wasm_obj, 1, 2), TypeError);
+  testThrowsRepeated(() => Atomics.add(i8Array, wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => Atomics.add(i8Array, 1, wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.and(wasm_obj, 1, 2), TypeError);
+  testThrowsRepeated(() => Atomics.and(i8Array, wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => Atomics.and(i8Array, 1, wasm_obj), TypeError);
+  testThrowsRepeated(
+      () => Atomics.compareExchange(wasm_obj, 1, 2, 3), TypeError);
+  testThrowsRepeated(
+      () => Atomics.compareExchange(i8Array, wasm_obj, 2, 3), TypeError);
+  testThrowsRepeated(
+      () => Atomics.compareExchange(i8Array, 1, wasm_obj, 3), TypeError);
+  testThrowsRepeated(
+      () => Atomics.compareExchange(i8Array, 1, 2, wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.exchange(wasm_obj, 1, 2), TypeError);
+  testThrowsRepeated(() => Atomics.exchange(i8Array, wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => Atomics.exchange(i8Array, 1, wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.isLockFree(wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.load(wasm_obj, 1), TypeError);
+  testThrowsRepeated(() => Atomics.load(i8Array, wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.or(wasm_obj, 1, 2), TypeError);
+  testThrowsRepeated(() => Atomics.or(i8Array, wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => Atomics.or(i8Array, 1, wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.store(wasm_obj, 1, 2), TypeError);
+  testThrowsRepeated(() => Atomics.store(i8Array, wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => Atomics.store(i8Array, 1, wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.sub(wasm_obj, 1, 2), TypeError);
+  testThrowsRepeated(() => Atomics.sub(i8Array, wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => Atomics.sub(i8Array, 1, wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.wait(wasm_obj, 1, 2, 3), TypeError);
+  testThrowsRepeated(() => Atomics.wait(i8Array, wasm_obj, 2, 3), TypeError);
+  testThrowsRepeated(() => Atomics.wait(i8Array, 1, wasm_obj, 3), TypeError);
+  testThrowsRepeated(() => Atomics.wait(i8Array, 1, 2, wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.notify(wasm_obj, 1, 2), TypeError);
+  testThrowsRepeated(() => Atomics.notify(i8Array, wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => Atomics.notify(i8Array, 1, wasm_obj), TypeError);
+  testThrowsRepeated(() => Atomics.xor(wasm_obj, 1, 2), TypeError);
+  testThrowsRepeated(() => Atomics.xor(i8Array, wasm_obj, 2), TypeError);
+  testThrowsRepeated(() => Atomics.xor(i8Array, 1, wasm_obj), TypeError);
+
+  testThrowsRepeated(() => JSON.parse(wasm_obj), TypeError);
+  repeated(() => assertEquals({x: 1}, JSON.parse('{"x": 1}', wasm_obj)));
+  testThrowsRepeated(() => JSON.stringify(wasm_obj), TypeError);
+  repeated(() => assertEquals('{"x":1}', JSON.stringify({x: 1}, wasm_obj)));
+  repeated(
+      () => assertEquals('{"x":1}', JSON.stringify({x: 1}, null, wasm_obj)));
+
+  // Yielding wasm objects from a generator function is valid.
+  repeated(() => {
+    let gen = (function*() {
+      yield wasm_obj;
+    })();
+    assertSame(wasm_obj, gen.next().value);
+  });
+  // Test passing wasm objects via next() back to a generator function.
+  repeated(() => {
+    let gen = (function*() {
+      assertSame(wasm_obj, yield 1);
+    })();
+    assertEquals(1, gen.next().value);
+    assertTrue(gen.next(wasm_obj).done);  // triggers the assertEquals.
+  });
+  // Test passing wasm objects via return() to a generator function.
+  repeated(() => {
+    let gen = (function*() {
+      yield 1;
+      assertTrue(false);
+    })();
+    assertEquals({value: wasm_obj, done: true}, gen.return(wasm_obj));
+  });
+  // Test passing wasm objects via throw() to a generator function.
+  repeated(() => {
+    let gen = (function*() {
+      try {
+        yield 1;
+        assertTrue(false);  // unreached
+      } catch (e) {
+        assertSame(wasm_obj, e);
+        return 2;
+      }
+    })();
+    assertEquals({value: 1, done: false}, gen.next());
+    // wasm_obj is caught inside the generator
+    assertEquals({value: 2, done: true}, gen.throw(wasm_obj));
+  });
+  // Treating wasm objects as generators is invalid.
+  repeated(() => {
+    let gen = function*() {
+      yield* wasm_obj;
+    };
+    assertThrows(() => gen().next(), TypeError);
+  });
+
+  // Ensure no statement re-assigned wasm_obj by accident.
+  assertTrue(wasm_obj == struct || wasm_obj == array);
+}
diff --git a/deps/v8/test/mjsunit/wasm/gc-optimizations.js b/deps/v8/test/mjsunit/wasm/gc-optimizations.js
index a05b417bf5d340..c814abdc53fd38 100644
--- a/deps/v8/test/mjsunit/wasm/gc-optimizations.js
+++ b/deps/v8/test/mjsunit/wasm/gc-optimizations.js
@@ -409,7 +409,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
     .addLocals(kWasmI32, 1)
     .addBody([
       kExprLocalGet, 0,
-      kGCPrefix, kExprRefTest, sub_struct,
+      kGCPrefix, kExprRefTestDeprecated, sub_struct,
 
       // These casts have to be preserved.
       kExprLocalGet, 0,
diff --git a/deps/v8/test/mjsunit/wasm/gc-typecheck-reducer.js b/deps/v8/test/mjsunit/wasm/gc-typecheck-reducer.js
new file mode 100644
index 00000000000000..af790ab9f4f8d6
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/gc-typecheck-reducer.js
@@ -0,0 +1,45 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc --no-liftoff
+
+d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
+
+// Test inlining of a non-trivial type check (i.e. the decoder can't remove it
+// directly) that becomes trivial after inlining.
+// This covers a bug in the optimizing compiler treating null as a test failure
+// for the "ref.test null" instruction.
+(function TestRefTestNonTrivialTypeCheckInlinedTrivial() {
+  var builder = new WasmModuleBuilder();
+  let struct = builder.addStruct([makeField(kWasmI32, true)]);
+
+
+  let refTestFromAny =  builder.addFunction(`refTestFromAny`,
+                        makeSig([kWasmAnyRef], [kWasmI32, kWasmI32]))
+    .addBody([
+      kExprLocalGet, 0,
+      kGCPrefix, kExprRefTest, struct,
+      kExprLocalGet, 0,
+      kGCPrefix, kExprRefTestNull, struct,
+    ]);
+
+  builder.addFunction(`main`,
+      makeSig([], [kWasmI32, kWasmI32, kWasmI32, kWasmI32]))
+    .addBody([
+      kExprI32Const, 1,
+      kGCPrefix, kExprStructNew, struct,
+      kExprCallFunction, refTestFromAny.index,
+      kExprRefNull, kNullRefCode,
+      kExprCallFunction, refTestFromAny.index,
+    ]).exportFunc();
+
+  var instance = builder.instantiate();
+  let expected = [
+    1,  // ref.test <struct> (struct)
+    1,  // ref.test null <struct> (struct)
+    0,  // ref.test <struct> (null)
+    1   // ref.test null <struct> (null)
+  ]
+  assertEquals(expected, instance.exports.main());
+})();
diff --git a/deps/v8/test/mjsunit/wasm/load-immutable.js b/deps/v8/test/mjsunit/wasm/load-immutable.js
index 8239d0016f97ea..988f48bac2e6ed 100644
--- a/deps/v8/test/mjsunit/wasm/load-immutable.js
+++ b/deps/v8/test/mjsunit/wasm/load-immutable.js
@@ -127,7 +127,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
       // TF should be able to eliminate the second type check, and return the
       // constant 1.
       kExprLocalGet, 0,
-      kGCPrefix, kExprRefTest, sig])
+      kGCPrefix, kExprRefTestDeprecated, sig])
     .exportFunc();
 
   var instance = builder.instantiate({m : { f: function () {} }});
diff --git a/deps/v8/test/mjsunit/wasm/reference-globals.js b/deps/v8/test/mjsunit/wasm/reference-globals.js
index 92b24bc1606dd0..57a37e6552007e 100644
--- a/deps/v8/test/mjsunit/wasm/reference-globals.js
+++ b/deps/v8/test/mjsunit/wasm/reference-globals.js
@@ -380,3 +380,18 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
   assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
                /i31.new\[0\] expected type i32, found i64.const of type i64/);
 })();
+
+(function TestConstantExprFuncIndexOutOfBounds() {
+  print(arguments.callee.name);
+  let builder = new WasmModuleBuilder();
+  let struct_index = builder.addStruct([makeField(kWasmFuncRef, true)]);
+  let func = builder.addFunction("element", kSig_i_i)
+    .addBody([kExprLocalGet, 0])
+    .exportFunc()
+
+  builder.addGlobal(wasmRefType(struct_index), false,
+                    [kExprRefFunc, func.index + 1, kExprStructNew, struct_index]);
+
+  assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
+               /function index #1 is out of bounds/);
+})();
diff --git a/deps/v8/test/mjsunit/wasm/reference-table-js-interop.js b/deps/v8/test/mjsunit/wasm/reference-table-js-interop.js
index 5071ecd0d1ff25..5d91b68940989d 100644
--- a/deps/v8/test/mjsunit/wasm/reference-table-js-interop.js
+++ b/deps/v8/test/mjsunit/wasm/reference-table-js-interop.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Flags: --experimental-wasm-gc --experimental-wasm-stringref
+// Flags: --experimental-wasm-gc --experimental-wasm-stringref --wasm-gc-js-interop
 
 d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 
@@ -116,18 +116,6 @@ for (let [typeName, type] of Object.entries(tableTypes)) {
       kExprUnreachable, // conversion failure
     kExprEnd,
   ];
-  // TODO(7748): Directly compare the externrefs in JS once
-  // FLAG_wasm_gc_js_interop is supported.
-  builder.addFunction("eq",
-                      makeSig([kWasmExternRef, kWasmExternRef], [kWasmI32]))
-    .addBody([
-      kExprLocalGet, 0,
-      ...castExternToEqRef,
-      kExprLocalGet, 1,
-      ...castExternToEqRef,
-      kExprRefEq,
-    ])
-    .exportFunc();
 
   builder.addFunction("createNull", creatorSig)
     .addBody([kExprRefNull, kNullRefCode])
@@ -173,29 +161,29 @@ for (let [typeName, type] of Object.entries(tableTypes)) {
   // Set i31.
   if (typeName != "dataref" && typeName != "arrayref") {
     table.set(2, wasm.exported(wasm.createI31));
-    assertEquals(1, wasm.eq(table.get(2), wasm.tableGet(2)));
+    assertSame(table.get(2), wasm.tableGet(2));
     wasm.tableSet(3, wasm.createI31);
-    assertEquals(1, wasm.eq(table.get(3), wasm.tableGet(3)));
-    assertEquals(1, wasm.eq(table.get(2), table.get(3))); // The same smi.
+    assertSame(table.get(3), wasm.tableGet(3));
+    assertSame(table.get(2), table.get(3)); // The same smi.
   }
   // Set struct.
   if (typeName != "arrayref") {
     table.set(4, wasm.exported(wasm.createStruct));
-    assertEquals(1, wasm.eq(table.get(4), wasm.tableGet(4)));
+    assertSame(table.get(4), wasm.tableGet(4));
     assertEquals(12, wasm.tableGetStructVal(4));
     wasm.tableSet(5, wasm.createStruct);
-    assertEquals(1, wasm.eq(table.get(5), wasm.tableGet(5)));
+    assertSame(table.get(5), wasm.tableGet(5));
     assertEquals(12, wasm.tableGetStructVal(5));
-    assertEquals(0, wasm.eq(table.get(4), table.get(5))); // Not the same.
+    assertNotSame(table.get(4), table.get(5));
   }
   // Set array.
   table.set(6, wasm.exported(wasm.createArray));
-  assertEquals(1, wasm.eq(table.get(6), wasm.tableGet(6)));
+  assertSame(table.get(6), wasm.tableGet(6));
   assertEquals(12, wasm.tableGetArrayVal(6));
   wasm.tableSet(7, wasm.createArray);
-  assertEquals(1, wasm.eq(table.get(7), wasm.tableGet(7)));
+  assertSame(table.get(7), wasm.tableGet(7));
   assertEquals(12, wasm.tableGetArrayVal(7));
-  assertEquals(0, wasm.eq(table.get(6), table.get(7))); // Not the same.
+  assertNotSame(table.get(6), table.get(7));
 
   // Set stringref.
   if (typeName == "anyref") {
@@ -209,11 +197,6 @@ for (let [typeName, type] of Object.entries(tableTypes)) {
     assertEquals(largeString, table.get(9));
   }
 
-  // Ensure all objects are externalized, so they can be handled by JS.
-  for (let i = 0; i < table.length; ++i) {
-    JSON.stringify(table.get(i));
-  }
-
   if (typeName != "arrayref") {
     // Grow table with explicit value.
     table.grow(2, wasm.exported(wasm.createStruct));
diff --git a/deps/v8/test/mjsunit/wasm/runtime-type-canonicalization.js b/deps/v8/test/mjsunit/wasm/runtime-type-canonicalization.js
index fbd758ddc81014..1d87812cf47d7f 100644
--- a/deps/v8/test/mjsunit/wasm/runtime-type-canonicalization.js
+++ b/deps/v8/test/mjsunit/wasm/runtime-type-canonicalization.js
@@ -20,12 +20,12 @@ let struct_init = builder.addFunction("struct_init",
 let test_pass = builder.addFunction("test_pass",
                                     makeSig([kWasmDataRef], [kWasmI32]))
     .addBody([kExprLocalGet, 0,
-              kGCPrefix, kExprRefTest, identical_struct_index])
+              kGCPrefix, kExprRefTestDeprecated, identical_struct_index])
     .exportFunc();
 let test_fail = builder.addFunction("test_fail",
                                     makeSig([kWasmDataRef], [kWasmI32]))
     .addBody([kExprLocalGet, 0,
-              kGCPrefix, kExprRefTest, distinct_struct_index])
+              kGCPrefix, kExprRefTestDeprecated, distinct_struct_index])
     .exportFunc();
 
 (function TestCanonicalizationSameInstance() {
diff --git a/deps/v8/test/mjsunit/wasm/stack-switching-export.js b/deps/v8/test/mjsunit/wasm/stack-switching-export.js
index 3fbe979ab6f729..7b8c91e09efd0a 100644
--- a/deps/v8/test/mjsunit/wasm/stack-switching-export.js
+++ b/deps/v8/test/mjsunit/wasm/stack-switching-export.js
@@ -4,7 +4,6 @@
 
 // Flags: --wasm-generic-wrapper --expose-gc --allow-natives-syntax
 // Flags: --experimental-wasm-stack-switching
-// Flags: --experimental-wasm-type-reflection
 
 // This is a port of the generic-wrapper.js tests for the JS Promise Integration
 // variant of the wrapper. We don't suspend the stacks in this test, we only
diff --git a/deps/v8/test/mjsunit/wasm/stack-switching.js b/deps/v8/test/mjsunit/wasm/stack-switching.js
index 65d2704efa7446..667b2e01b0ae8b 100644
--- a/deps/v8/test/mjsunit/wasm/stack-switching.js
+++ b/deps/v8/test/mjsunit/wasm/stack-switching.js
@@ -3,8 +3,8 @@
 // found in the LICENSE file.
 
 // Flags: --allow-natives-syntax --experimental-wasm-stack-switching
-// Flags: --experimental-wasm-type-reflection --expose-gc
-// Flags: --wasm-stack-switching-stack-size=100
+// Flags: --expose-gc --wasm-stack-switching-stack-size=100
+// Flags: --experimental-wasm-typed-funcref
 
 // We pick a small stack size to run the stack overflow test quickly, but big
 // enough to run all the tests.
@@ -521,3 +521,58 @@ function TestNestedSuspenders(suspend) {
         /invalid suspender object for suspend/);
   }
 })();
+
+(function SuspendCallRef() {
+  print(arguments.callee.name);
+  let builder = new WasmModuleBuilder();
+  let funcref_type = builder.addType(kSig_i_r);
+  let table = builder.addTable(wasmRefNullType(funcref_type), 1)
+                         .exportAs('table');
+  builder.addFunction("test", kSig_i_r)
+      .addBody([
+          kExprLocalGet, 0,
+          kExprI32Const, 0, kExprTableGet, table.index,
+          kExprCallRef, funcref_type,
+      ]).exportFunc();
+  let instance = builder.instantiate();
+
+  let funcref = new WebAssembly.Function(
+      {parameters: ['externref'], results: ['i32']},
+      () => Promise.resolve(42),
+      {suspending: 'first'});
+  instance.exports.table.set(0, funcref);
+
+  let exp = new WebAssembly.Function(
+      {parameters: [], results: ['externref']},
+      instance.exports.test,
+      {promising: 'first'});
+  assertPromiseResult(exp(), v => assertEquals(42, v));
+})();
+
+(function SuspendCallIndirect() {
+  print(arguments.callee.name);
+  let builder = new WasmModuleBuilder();
+  let functype = builder.addType(kSig_i_r);
+  let table = builder.addTable(kWasmFuncRef, 10, 10);
+  let callee = builder.addImport('m', 'f', kSig_i_r);
+  builder.addActiveElementSegment(table, wasmI32Const(0), [callee]);
+  builder.addFunction("test", kSig_i_r)
+      .addBody([
+          kExprLocalGet, 0,
+          kExprI32Const, 0,
+          kExprCallIndirect, functype, table.index,
+      ]).exportFunc();
+
+  let create_promise = new WebAssembly.Function(
+      {parameters: ['externref'], results: ['i32']},
+      () => Promise.resolve(42),
+      {suspending: 'first'});
+
+  let instance = builder.instantiate({m: {f: create_promise}});
+
+  let exp = new WebAssembly.Function(
+      {parameters: [], results: ['externref']},
+      instance.exports.test,
+      {promising: 'first'});
+  assertPromiseResult(exp(), v => assertEquals(42, v));
+})();
diff --git a/deps/v8/test/mjsunit/wasm/stringrefs-regressions.js b/deps/v8/test/mjsunit/wasm/stringrefs-regressions.js
new file mode 100644
index 00000000000000..c12111f29d80d7
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/stringrefs-regressions.js
@@ -0,0 +1,98 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-stringref --allow-natives-syntax
+// We just want speculative inlining, but the "stress" variant doesn't like
+// that flag for some reason, so use the GC flag which implies it.
+// Flags: --experimental-wasm-gc
+
+d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
+
+let kSig_w_v = makeSig([], [kWasmStringRef]);
+let kSig_w_i = makeSig([kWasmI32], [kWasmStringRef]);
+let kSig_v_w = makeSig([kWasmStringRef], []);
+
+(function () {
+  let huge_builder = new WasmModuleBuilder();
+  huge_builder.addMemory(65001, undefined, false, false);
+
+  huge_builder.addFunction("huge", kSig_w_v).exportFunc().addBody([
+    kExprI32Const, 0,                  // address
+    ...wasmI32Const(65000 * 65536),    // bytes
+    ...GCInstr(kExprStringNewUtf8), 0  // memory index
+  ]);
+
+  let callee = huge_builder.addFunction("callee", kSig_w_i).addBody([
+    kExprI32Const, 0,                  // address
+    kExprLocalGet, 0,                  // bytes
+    ...GCInstr(kExprStringNewUtf8), 0  // memory index
+  ]);
+
+  let caller = huge_builder.addFunction("caller", kSig_i_i).exportFunc()
+    .addBody([
+      kExprTry, kWasmI32,
+      kExprLocalGet, 0,
+      kExprCallFunction, callee.index,
+      kExprDrop,
+      kExprI32Const, 1,
+      kExprCatchAll,
+      kExprI32Const, 0,
+      kExprEnd
+    ]);
+
+  let instance;
+  try {
+    instance = huge_builder.instantiate();
+    // On 64-bit platforms, expect to see this message.
+    console.log("Instantiation successful, proceeding.");
+  } catch (e) {
+    // 32-bit builds don't have enough virtual memory, that's OK.
+    assertInstanceof(e, RangeError);
+    assertMatches(/Cannot allocate Wasm memory for new instance/, e.message,
+      'Error message');
+    return;
+  }
+
+  // Bug 1: The Utf8Decoder can't handle more than kMaxInt bytes as input.
+  assertThrows(() => instance.exports.huge(), RangeError);
+
+  // Bug 2: Exceptions created by the JS-focused strings infrastructure must
+  // be marked as uncatchable by Wasm.
+  let f1 = instance.exports.caller;
+  assertThrows(() => f1(2147483647), RangeError);
+
+  // Bug 3: Builtin calls that have neither a kNoThrow annotation nor exception-
+  // handling support make the Wasm inliner sad.
+  for (let i = 0; i < 20; i++) f1(10);
+  %WasmTierUpFunction(instance, caller.index);
+  f1(10);
+})();
+
+let builder = new WasmModuleBuilder();
+
+let concat_body = [];
+// This doubles the string 26 times, i.e. multiplies its length with a factor
+// of ~65 million.
+for (let i = 0; i < 26; i++) {
+  concat_body.push(...[
+    kExprLocalGet, 0, kExprLocalGet, 0,
+    ...GCInstr(kExprStringConcat),
+    kExprLocalSet, 0
+  ]);
+}
+
+let concat =
+    builder.addFunction('concat', kSig_v_w).exportFunc().addBody(concat_body);
+
+let instance = builder.instantiate();
+
+// Bug 4: Throwing in StringAdd must clear the "thread in wasm" bit.
+let f2 = instance.exports.concat;
+assertThrows(() => f2("1234567890"));  // 650M characters is too much.
+
+// Bug 5: Operations that can trap must not be marked as kEliminatable,
+// otherwise the trap may be eliminated.
+for (let i = 0; i < 3; i++) f2("a");   // 65M characters is okay.
+%WasmTierUpFunction(instance, concat.index);
+assertThrows(() => f2("1234567890"));  // Optimized code still traps.
diff --git a/deps/v8/test/mjsunit/wasm/type-based-optimizations.js b/deps/v8/test/mjsunit/wasm/type-based-optimizations.js
index 40eb18b1046fed..5ac4debefb1180 100644
--- a/deps/v8/test/mjsunit/wasm/type-based-optimizations.js
+++ b/deps/v8/test/mjsunit/wasm/type-based-optimizations.js
@@ -33,11 +33,11 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
         // while (true) {
         kExprLoop, kWasmVoid,
           // if (ref.test temp bottom1) {
-          kExprLocalGet, 2, kGCPrefix, kExprRefTest, bottom1,
+          kExprLocalGet, 2, kGCPrefix, kExprRefTestDeprecated, bottom1,
           kExprIf, kWasmVoid,
             // counter += ((bottom1) temp).field_2;
-            // TODO(manoskouk): Implement path-based type tracking so we can
-            // eliminate this check.
+            // Note: This cast should get optimized away with path-based type
+            // tracking.
             kExprLocalGet, 2, kGCPrefix, kExprRefCast, bottom1,
             kGCPrefix, kExprStructGet, bottom1, 2,
             kExprLocalGet, 3, kExprI32Add, kExprLocalSet, 3,
diff --git a/deps/v8/test/mjsunit/wasm/type-reflection-with-externref.js b/deps/v8/test/mjsunit/wasm/type-reflection-with-externref.js
index 40da63a57d2390..c324472e1c9cb2 100644
--- a/deps/v8/test/mjsunit/wasm/type-reflection-with-externref.js
+++ b/deps/v8/test/mjsunit/wasm/type-reflection-with-externref.js
@@ -7,6 +7,7 @@
 d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 
 (function TestTableType() {
+  print(arguments.callee.name);
   let table = new WebAssembly.Table({initial: 1, element: "externref"});
   let type = table.type();
   assertEquals(1, type.minimum);
@@ -22,6 +23,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestGlobalType() {
+  print(arguments.callee.name);
   let global = new WebAssembly.Global({value: "externref", mutable: true});
   let type = global.type();
   assertEquals("externref", type.value);
@@ -48,6 +50,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionGlobalGetAndSet() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   let fun1 = new WebAssembly.Function({parameters:[], results:["i32"]}, _ => 7);
   let fun2 = new WebAssembly.Function({parameters:[], results:["i32"]}, _ => 9);
@@ -80,6 +83,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionMultiTableSetAndCall() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   let v1 = 7; let v2 = 9; let v3 = 0.0;
   let f1 = new WebAssembly.Function({parameters:[], results:["i32"]}, _ => v1);
diff --git a/deps/v8/test/mjsunit/wasm/type-reflection.js b/deps/v8/test/mjsunit/wasm/type-reflection.js
index 1c88ed62b2e2df..f81980b2510218 100644
--- a/deps/v8/test/mjsunit/wasm/type-reflection.js
+++ b/deps/v8/test/mjsunit/wasm/type-reflection.js
@@ -7,6 +7,7 @@
 d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 
 (function TestMemoryType() {
+  print(arguments.callee.name);
   let mem = new WebAssembly.Memory({initial: 1});
   let type = mem.type();
   assertEquals(1, type.minimum);
@@ -22,6 +23,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestMemoryExports() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   builder.addMemory(1).exportMemoryAs("a")
   let module = new WebAssembly.Module(builder.toBuffer());
@@ -44,6 +46,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestMemoryImports() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   builder.addImportedMemory("m", "a", 1);
   let module = new WebAssembly.Module(builder.toBuffer());
@@ -68,6 +71,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestTableType() {
+  print(arguments.callee.name);
   let table = new WebAssembly.Table({initial: 1, element: "funcref"});
   let type = table.type();
   assertEquals(1, type.minimum);
@@ -98,6 +102,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestTableExports() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   builder.addTable(kWasmAnyFunc, 20).exportAs("a");
   let module = new WebAssembly.Module(builder.toBuffer());
@@ -122,6 +127,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestTableImports() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   builder.addImportedTable("m", "a", 20, undefined, kWasmAnyFunc);
   let module = new WebAssembly.Module(builder.toBuffer());
@@ -148,6 +154,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestGlobalType() {
+  print(arguments.callee.name);
   let global = new WebAssembly.Global({value: "i32", mutable: true});
   let type = global.type();
   assertEquals("i32", type.value);
@@ -180,6 +187,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestGlobalExports() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   builder.addGlobal(kWasmI32).exportAs("a");
   builder.addGlobal(kWasmF64, true).exportAs("b");
@@ -198,6 +206,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestGlobalImports() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   builder.addImportedGlobal("m", "a", kWasmI32);
   builder.addImportedGlobal("m", "b", kWasmF64, true);
@@ -218,6 +227,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestMemoryConstructorWithMinimum() {
+  print(arguments.callee.name);
   let mem = new WebAssembly.Memory({minimum: 1});
   assertTrue(mem instanceof WebAssembly.Memory);
   let type = mem.type();
@@ -252,6 +262,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestTableConstructorWithMinimum() {
+  print(arguments.callee.name);
   let table = new WebAssembly.Table({minimum: 1, element: 'funcref'});
   assertTrue(table instanceof WebAssembly.Table);
   let type = table.type();
@@ -280,6 +291,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionConstructor() {
+  print(arguments.callee.name);
   let toolong = new Array(1000 + 1);
   let desc = Object.getOwnPropertyDescriptor(WebAssembly, 'Function');
   assertEquals(typeof desc.value, 'function');
@@ -323,6 +335,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionConstructorWithWasmExportedFunction() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
 
   builder.addFunction('func1', kSig_v_i).addBody([]).exportFunc();
@@ -343,6 +356,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionConstructorWithWasmJSFunction() {
+  print(arguments.callee.name);
   const func = new WebAssembly.Function({parameters: [], results: []}, _ => 0);
 
   assertDoesNotThrow(
@@ -356,6 +370,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionConstructorNonArray1() {
+  print(arguments.callee.name);
   let log = [];  // Populated with a log of accesses.
   let two = { toString: () => "2" };  // Just a fancy "2".
   let logger = new Proxy({ length: two, "0": "i32", "1": "f32"}, {
@@ -368,6 +383,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionConstructorNonArray2() {
+  print(arguments.callee.name);
   let throw1 = { get length() { throw new Error("cannot see length"); }};
   let throw2 = { length: { toString: _ => { throw new Error("no length") } } };
   let throw3 = { length: "not a length value, this also throws" };
@@ -392,6 +408,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionConstructedFunction() {
+  print(arguments.callee.name);
   let fun = new WebAssembly.Function({parameters:[], results:[]}, _ => 0);
   assertTrue(fun instanceof WebAssembly.Function);
   assertTrue(fun instanceof Function);
@@ -405,6 +422,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionExportedFunction() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   builder.addFunction("fun", kSig_v_v).addBody([]).exportFunc();
   let instance = builder.instantiate();
@@ -421,6 +439,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionTypeOfConstructedFunction() {
+  print(arguments.callee.name);
   let testcases = [
     {parameters:[], results:[]},
     {parameters:["i32"], results:[]},
@@ -436,6 +455,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionTypeOfExportedFunction() {
+  print(arguments.callee.name);
   let testcases = [
     [kSig_v_v, {parameters:[], results:[]}],
     [kSig_v_i, {parameters:["i32"], results:[]}],
@@ -453,6 +473,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionExports() {
+  print(arguments.callee.name);
   let testcases = [
     [kSig_v_v, {parameters:[], results:[]}],
     [kSig_v_i, {parameters:["i32"], results:[]}],
@@ -472,6 +493,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionImports() {
+  print(arguments.callee.name);
   let testcases = [
     [kSig_v_v, {parameters:[], results:[]}],
     [kSig_v_i, {parameters:["i32"], results:[]}],
@@ -492,6 +514,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionConstructedCoercions() {
+  print(arguments.callee.name);
   let obj1 = { valueOf: _ => 123.45 };
   let obj2 = { toString: _ => "456" };
   let gcer = { valueOf: _ => gc() };
@@ -529,6 +552,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionTableSetI64() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   let fun = new WebAssembly.Function({parameters:[], results:["i64"]}, _ => 0n);
   let table = new WebAssembly.Table({element: "anyfunc", initial: 2});
@@ -550,6 +574,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionModuleImportMatchingSig() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   let fun = new WebAssembly.Function({parameters:[], results:["i32"]}, _ => 7);
   let fun_index = builder.addImport("m", "fun", kSig_i_v)
@@ -563,6 +588,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionModuleImportMismatchingSig() {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   let fun1 = new WebAssembly.Function({parameters:[], results:[]}, _ => 7);
   let fun2 = new WebAssembly.Function({parameters:["i32"], results:[]}, _ => 8);
@@ -585,6 +611,7 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
 })();
 
 (function TestFunctionModuleImportReExport () {
+  print(arguments.callee.name);
   let builder = new WasmModuleBuilder();
   let fun = new WebAssembly.Function({parameters:[], results:["i32"]}, _ => 7);
   let fun_index = builder.addImport("m", "fun", kSig_i_v)
@@ -594,3 +621,28 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
   assertSame(instance.exports.fun1, instance.exports.fun2);
   assertSame(fun, instance.exports.fun1);
 })();
+
+(function TestCallIndirectJSFunction() {
+  print(arguments.callee.name);
+  let imp = new WebAssembly.Function(
+    {parameters:["i32", "i32", "i32"], results:["i32"]},
+    function(a, b, c) { if (c) return a; return b; });
+
+  let builder = new WasmModuleBuilder();
+  let sig_index = builder.addType(kSig_i_iii);
+  let fun_index = builder.addImport("m", "imp", kSig_i_iii)
+  builder.addTable(kWasmFuncRef, 1, 1);
+  let table_index = 0;
+  let segment = builder.addActiveElementSegment(
+      table_index, wasmI32Const(0), [[kExprRefFunc, 0]], kWasmFuncRef);
+
+  let main = builder.addFunction("rc", kSig_i_i)
+      .addBody([...wasmI32Const(-2), kExprI32Const, 3, kExprLocalGet, 0,
+                kExprI32Const, 0, kExprCallIndirect, sig_index, table_index])
+      .exportFunc();
+
+  let instance = builder.instantiate({ m: { imp: imp }});
+
+  assertEquals(instance.exports.rc(1), -2);
+  assertEquals(instance.exports.rc(0), 3);
+})();
diff --git a/deps/v8/test/mjsunit/wasm/wasm-array-js-interop.js b/deps/v8/test/mjsunit/wasm/wasm-array-js-interop.js
deleted file mode 100644
index d1b663e425f203..00000000000000
--- a/deps/v8/test/mjsunit/wasm/wasm-array-js-interop.js
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2021 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Flags: --allow-natives-syntax --experimental-wasm-gc --wasm-gc-js-interop
-// Flags: --expose-gc
-
-d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
-
-const kIterationsCountForICProgression = 20;
-
-function createArray_i() {
-  let builder = new WasmModuleBuilder();
-
-  const type_index = builder.addArray(kWasmI32, true);
-
-  let sig_a_i = makeSig_r_x(kWasmDataRef, kWasmI32);
-  let sig_i_ai = makeSig([kWasmDataRef, kWasmI32], [kWasmI32]);
-  let sig_v_aii = makeSig([kWasmDataRef, kWasmI32, kWasmI32], []);
-
-  builder.addFunction("new_array", sig_a_i)
-    .addBody([
-      kExprLocalGet, 0,                      // --
-      kExprI32Const, 10,                     // --
-      kGCPrefix, kExprArrayNew, type_index]) // --
-    .exportAs("new_array");
-
-  builder.addFunction("array_get", sig_i_ai)
-    .addBody([
-      kExprLocalGet, 0,                      // --
-      kGCPrefix, kExprRefCast, type_index,   // --
-      kExprLocalGet, 1,                      // --
-      kGCPrefix, kExprArrayGet, type_index]) // --
-    .exportAs("array_get");
-
-  builder.addFunction("array_set", sig_v_aii)
-    .addBody([
-      kExprLocalGet, 0,                      // --
-      kGCPrefix, kExprRefCast, type_index,   // --
-      kExprLocalGet, 1,                      // --
-      kExprLocalGet, 2,                      // --
-      kGCPrefix, kExprArraySet, type_index]) // --
-    .exportAs("array_set");
-
-  let instance = builder.instantiate();
-  let new_array = instance.exports.new_array;
-  let array_get = instance.exports.array_get;
-  let array_set = instance.exports.array_set;
-
-  let value = 42;
-  let o = new_array(value);
-  %DebugPrint(o);
-  assertEquals(10, o.length);
-  for (let i = 0; i < o.length; i++) {
-    let res;
-    res = array_get(o, i);
-    assertEquals(value, res);
-
-    array_set(o, i, i);
-    res = array_get(o, i);
-    assertEquals(i, res);
-  }
-  return o;
-}
-
-(function TestSimpleArrayInterop() {
-  function f(o) {
-    assertEquals(10, o.length);
-    for (let i = 0; i < o.length; i++) {
-      let len = o.length;
-      assertEquals(10, len);
-      let v = o[i];
-      assertEquals(i, v);
-    }
-  }
-
-  let o = createArray_i();
-  %DebugPrint(o);
-
-  f(o);
-  gc();
-})();
diff --git a/deps/v8/test/mjsunit/wasm/wasm-gc-js-ref.js b/deps/v8/test/mjsunit/wasm/wasm-gc-js-ref.js
index 7b5cb91e605ba9..f59d10b236126b 100644
--- a/deps/v8/test/mjsunit/wasm/wasm-gc-js-ref.js
+++ b/deps/v8/test/mjsunit/wasm/wasm-gc-js-ref.js
@@ -22,18 +22,15 @@ let instance = (() => {
 })();
 
 let obj = instance.exports.createStruct(123);
-// The struct is wrapped in the special wrapper.
-// It doesn't have any observable properties.
-assertTrue(obj instanceof Object);
+// The struct is opaque and doesn't have any observable properties.
+assertFalse(obj instanceof Object);
 assertEquals([], Object.getOwnPropertyNames(obj));
-assertEquals("{}", JSON.stringify(obj));
 // It can be passed as externref without any observable change.
 let passObj = instance.exports.passObj;
-obj = passObj(obj);
-assertTrue(obj instanceof Object);
-assertEquals([], Object.getOwnPropertyNames(obj));
-assertEquals("{}", JSON.stringify(obj));
+let obj2 = passObj(obj);
+assertFalse(obj2 instanceof Object);
+assertEquals([], Object.getOwnPropertyNames(obj2));
+assertSame(obj, obj2);
 // A JavaScript object can be passed as externref.
-// It will not be wrapped.
-obj = passObj({"hello": "world"});
-assertEquals({"hello": "world"}, obj);
+let jsObject = {"hello": "world"};
+assertSame(jsObject, passObj(jsObject));
diff --git a/deps/v8/test/mjsunit/wasm/wasm-invalid-local.js b/deps/v8/test/mjsunit/wasm/wasm-invalid-local.js
new file mode 100644
index 00000000000000..1bf6c1e9cd2218
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/wasm-invalid-local.js
@@ -0,0 +1,19 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --experimental-wasm-gc
+
+d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
+
+(function TestLocalInvalidHeapType() {
+  let builder = new WasmModuleBuilder();
+  builder.addFunction('testEqLocal',
+                    makeSig([], [kWasmAnyRef]))
+  .addLocals(wasmRefNullType(123), 1) // 123 is not a valid type index
+  .addBody([
+    kExprRefNull, kNullRefCode,
+    kExprLocalSet, 0,
+  ]).exportFunc();
+  assertThrows(() => builder.instantiate(), WebAssembly.CompileError);
+})();
diff --git a/deps/v8/test/mjsunit/wasm/wasm-module-builder.js b/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
index 390337def08690..18928fe4be3b1b 100644
--- a/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
+++ b/deps/v8/test/mjsunit/wasm/wasm-module-builder.js
@@ -507,11 +507,13 @@ let kExprArrayNewElem = 0x1f;
 let kExprI31New = 0x20;
 let kExprI31GetS = 0x21;
 let kExprI31GetU = 0x22;
-let kExprRefTest = 0x44;
+let kExprRefTest = 0x40;
+let kExprRefTestNull = 0x48;
+let kExprRefTestDeprecated = 0x44;
 let kExprRefCast = 0x45;
 let kExprBrOnCast = 0x46;
 let kExprBrOnCastFail = 0x47;
-let kExprRefCastNop = 0x48;
+let kExprRefCastNop = 0x4c;
 let kExprRefIsData = 0x51;
 let kExprRefIsI31 = 0x52;
 let kExprRefIsArray = 0x53;
@@ -1053,9 +1055,6 @@ class Binary {
   }
 
   emit_init_expr(expr) {
-    // TODO(manoskouk): This is redundant, remove it once we are confident we
-    // check everything.
-    checkExpr(expr);
     this.emit_bytes(expr);
     this.emit_u8(kExprEnd);
   }
diff --git a/deps/v8/test/mjsunit/web-snapshot/web-snapshot-array.js b/deps/v8/test/mjsunit/web-snapshot/web-snapshot-array.js
index 04802579e6ece0..d1d021ab8a5e69 100644
--- a/deps/v8/test/mjsunit/web-snapshot/web-snapshot-array.js
+++ b/deps/v8/test/mjsunit/web-snapshot/web-snapshot-array.js
@@ -107,3 +107,27 @@ d8.file.execute('test/mjsunit/web-snapshot/web-snapshot-helpers.js');
   // cctests.
   assertEquals('foobarfoo', foo.array.join(''));
 })();
+
+(function TestArrayWithSlackElements() {
+  function createObjects() {
+    globalThis.foo = {
+      array: [],
+      doubleArray: [],
+      objectArray: []
+    };
+    for (let i = 0; i < 100; ++i) {
+      globalThis.foo.array.push(i);
+      globalThis.foo.doubleArray.push(i + 0.1);
+      globalThis.foo.objectArray.push({});
+    }
+  }
+  const { foo } = takeAndUseWebSnapshot(createObjects, ['foo']);
+  assertEquals(100, foo.array.length);
+  assertEquals(100, foo.doubleArray.length);
+  assertEquals(100, foo.objectArray.length);
+  for (let i = 0; i < 100; ++i){
+    assertEquals(i, foo.array[i]);
+    assertEquals(i + 0.1, foo.doubleArray[i]);
+    assertEquals({}, foo.objectArray[i]);
+  }
+})();
diff --git a/deps/v8/test/mjsunit/web-snapshot/web-snapshot-object.js b/deps/v8/test/mjsunit/web-snapshot/web-snapshot-object.js
index b81122a96aa60d..394bb3de55e678 100644
--- a/deps/v8/test/mjsunit/web-snapshot/web-snapshot-object.js
+++ b/deps/v8/test/mjsunit/web-snapshot/web-snapshot-object.js
@@ -186,3 +186,19 @@ d8.file.execute('test/mjsunit/web-snapshot/web-snapshot-helpers.js');
   assertEquals(['4394967296'], Object.getOwnPropertyNames(obj));
   assertEquals['lol', obj[4394967296]];
 })();
+
+(function TestObjectWithSlackElements() {
+  function createObjects() {
+    globalThis.foo = {};
+    globalThis.bar = {};
+    for (let i = 0; i < 100; ++i) {
+      globalThis.foo[i] = i;
+      globalThis.bar[i] = {};
+    }
+  }
+  const { foo, bar } = takeAndUseWebSnapshot(createObjects, ['foo', 'bar']);
+  for (let i = 0; i < 100; ++i) {
+    assertEquals(i, foo[i]);
+    assertEquals({}, bar[i]);
+  }
+})();
diff --git a/deps/v8/test/mkgrokdump/mkgrokdump.cc b/deps/v8/test/mkgrokdump/mkgrokdump.cc
index 800964e26e174c..4e532a5ab2294c 100644
--- a/deps/v8/test/mkgrokdump/mkgrokdump.cc
+++ b/deps/v8/test/mkgrokdump/mkgrokdump.cc
@@ -31,7 +31,7 @@ static const char* kHeader =
     "# yapf: disable\n\n";
 
 // Debug builds emit debug code, affecting code object sizes.
-#ifndef DEBUG
+#if !defined(DEBUG) && defined(V8_ENABLE_SANDBOX)
 static const char* kBuild = "shipping";
 #else
 static const char* kBuild = "non-shipping";
@@ -102,7 +102,8 @@ static void DumpKnownObject(FILE* out, i::Heap* heap, const char* space_name,
 static void DumpSpaceFirstPageAddress(FILE* out, i::BaseSpace* space,
                                       i::Address first_page) {
   const char* name = space->name();
-  i::Tagged_t compressed = i::CompressTagged(first_page);
+  i::Tagged_t compressed =
+      i::V8HeapCompressionScheme::CompressTagged(first_page);
   uintptr_t unsigned_compressed = static_cast<uint32_t>(compressed);
   i::PrintF(out, "  0x%08" V8PRIxPTR ": \"%s\",\n", unsigned_compressed, name);
 }
diff --git a/deps/v8/test/test262/test262.status b/deps/v8/test/test262/test262.status
index d7b120af66841c..529aab96afd76d 100644
--- a/deps/v8/test/test262/test262.status
+++ b/deps/v8/test/test262/test262.status
@@ -225,10 +225,6 @@
   'language/expressions/async-generator/generator-created-after-decl-inst': [FAIL],
   'language/statements/async-generator/generator-created-after-decl-inst': [FAIL],
 
-  # https://bugs.chromium.org/p/v8/issues/detail?id=13275
-  'language/statements/async-generator/yield-star-promise-not-unwrapped': [FAIL],
-  'language/statements/async-generator/yield-star-return-then-getter-ticks': [FAIL],
-
   # https://bugs.chromium.org/p/v8/issues/detail?id=9875
   'language/expressions/coalesce/tco-pos-undefined': [FAIL],
   'language/expressions/coalesce/tco-pos-null': [FAIL],
@@ -321,76 +317,28 @@
   'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_ZWJ_Sequence-negative-CharacterClass': [SKIP],
   'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_ZWJ_Sequence-negative-P': [SKIP],
   'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_ZWJ_Sequence-negative-u': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-difference-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-difference-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-difference-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-difference-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-difference-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-difference-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-intersection-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-intersection-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-intersection-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-intersection-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-intersection-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-intersection-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-union-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-union-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-union-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-class-union-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-union-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-class-union-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-difference-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-difference-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-difference-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-difference-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-difference-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-difference-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-intersection-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-intersection-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-intersection-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-intersection-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-intersection-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-intersection-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-string-literal': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-union-character-class-escape': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-union-character-class': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-union-character': [SKIP],
-  'built-ins/RegExp/unicodeSets/generated/character-union-character-property-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-union-property-of-strings-escape': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/character-union-string-literal': [SKIP],
   'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-class-escape': [SKIP],
@@ -449,116 +397,24 @@
   'intl402/Temporal/Calendar/prototype/dateFromFields/infinity-throws-rangeerror': [FAIL],
   'intl402/Temporal/Calendar/prototype/monthDayFromFields/infinity-throws-rangeerror': [FAIL],
   'intl402/Temporal/Calendar/prototype/yearMonthFromFields/infinity-throws-rangeerror': [FAIL],
-  'intl402/Temporal/Duration/prototype/round/relativeto-string-datetime': [FAIL],
   'intl402/Temporal/Duration/prototype/total/relativeto-string-datetime': [FAIL],
   'intl402/Temporal/PlainYearMonth/from/argument-object': [FAIL],
 
-  'built-ins/Temporal/Instant/prototype/round/rounding-direction': [FAIL],
-  'built-ins/Temporal/Instant/prototype/toString/rounding-direction': [FAIL],
-  'built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-ceil-basic': [FAIL],
-  'built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor-basic': [FAIL],
-  'built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-ceil-basic': [FAIL],
-  'built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic': [FAIL],
-  'built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction': [FAIL],
   'intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-calendar': [FAIL],
 
-  # https://github.com/tc39/test262/issues/3553
-  'built-ins/Temporal/Calendar/from/calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-number': [FAIL],
-  'intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-number': [FAIL],
-  'intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-number': [FAIL],
-  'built-ins/Temporal/Now/plainDate/calendar-number': [FAIL],
-  'built-ins/Temporal/Now/plainDateTime/calendar-number': [FAIL],
-  'built-ins/Temporal/Now/zonedDateTime/calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDate/calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDateTime/calendar-number': [FAIL],
-  'built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-number': [FAIL],
-  'built-ins/Temporal/PlainMonthDay/calendar-number': [FAIL],
-  'built-ins/Temporal/PlainYearMonth/calendar-number': [FAIL],
-  'built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-number': [FAIL],
-  'built-ins/Temporal/ZonedDateTime/calendar-number': [FAIL],
-  'built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-number': [FAIL],
-  'built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-number': [FAIL],
-  'built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-number': [FAIL],
-
   'intl402/Temporal/Calendar/prototype/dateFromFields/order-of-operations': [FAIL],
   'intl402/Temporal/Calendar/prototype/monthDayFromFields/order-of-operations': [FAIL],
   'intl402/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations': [FAIL],
-  'intl402/Temporal/Duration/compare/relativeto-hour': [FAIL],
   'built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-with-fractional-days-different-sign': [FAIL],
   'built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-with-fractional-days': [FAIL],
-  'intl402/Temporal/TimeZone/prototype/getNextTransition/subtract-second-and-nanosecond-from-last-transition': [FAIL],
-  'intl402/Temporal/TimeZone/prototype/getPreviousTransition/nanoseconds-subtracted-or-added-at-dst-transition': [FAIL],
 
-  'intl402/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/nanoseconds-subtracted-or-added-at-dst-transition': [FAIL],
-  'intl402/Temporal/TimeZone/prototype/getPlainDateTimeFor/dst': [FAIL],
-  'staging/Temporal/Duration/old/add': [FAIL],
-  'staging/Temporal/Duration/old/limits': [FAIL],
   'staging/Temporal/Duration/old/round': [FAIL],
-  'staging/Temporal/Duration/old/subtract': [FAIL],
-  'staging/Temporal/Duration/old/toString': [FAIL],
   'staging/Temporal/Duration/old/total': [FAIL],
-  'staging/Temporal/Regex/old/plaintime': [FAIL],
-  'staging/Temporal/Regex/old/timezone': [FAIL],
-  'staging/Temporal/TimeZone/old/subminute-offset': [FAIL],
   'staging/Temporal/ZonedDateTime/old/construction-and-properties': [FAIL],
   'staging/Temporal/ZonedDateTime/old/dst-math': [FAIL],
-  'staging/Temporal/ZonedDateTime/old/dst-properties': [FAIL],
   'staging/Temporal/ZonedDateTime/old/equals': [FAIL],
-  'staging/Temporal/ZonedDateTime/old/property-bags': [FAIL],
-  'staging/Temporal/ZonedDateTime/old/round': [FAIL],
-  'staging/Temporal/ZonedDateTime/old/since': [FAIL],
-  'staging/Temporal/ZonedDateTime/old/string-parsing': [FAIL],
   'staging/Temporal/ZonedDateTime/old/toPlainMonthDay': [FAIL],
   'staging/Temporal/ZonedDateTime/old/toPlainYearMonth': [FAIL],
-  'staging/Temporal/ZonedDateTime/old/toString': [FAIL],
-  'staging/Temporal/ZonedDateTime/old/until': [FAIL],
-  'staging/Temporal/ZonedDateTime/old/with': [FAIL],
 
   # UBSan complain about static_cast<int32_t> from double in AddISODate()
   'built-ins/Temporal/Calendar/prototype/dateAdd/argument-duration-years-and-months-number-max-value': [SKIP],
@@ -578,64 +434,175 @@
   'staging/Intl402/Temporal/old/yearmonth-toLocaleString': [FAIL],
   'staging/Intl402/Temporal/old/zoneddatetime-toLocaleString': [FAIL],
 
-  # https://github.com/tc39/proposal-intl-numberformat-v3/pull/107
-  'intl402/NumberFormat/test-option-useGrouping': [FAIL],
+  'built-ins/Temporal/Calendar/from/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Now/plainDate/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Now/plainDateTime/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/Now/zonedDateTime/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDate/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDateTime/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainMonthDay/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainYearMonth/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-case-insensitive': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-case-insensitive': [FAIL],
+  # intl402
+  'intl402/Temporal/Calendar/calendar-case-insensitive': [FAIL],
+  'intl402/Temporal/Calendar/from/calendar-case-insensitive': [FAIL],
+  'intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-case-insensitive': [FAIL],
+  'intl402/Temporal/TimeZone/from/timezone-case-insensitive': [FAIL],
+
+  'built-ins/Temporal/Duration/compare/precision-exact-mathematical-values-1': [FAIL],
+  'built-ins/Temporal/Duration/compare/precision-exact-mathematical-values-2': [FAIL],
+  'built-ins/Temporal/Duration/prototype/round/precision-exact-in-balance-duration-relative-months': [FAIL],
+  'built-ins/Temporal/Duration/prototype/round/precision-exact-in-balance-duration-relative-weeks': [FAIL],
+  'built-ins/Temporal/Duration/prototype/round/precision-exact-in-balance-duration-relative-years-days': [FAIL],
+  'built-ins/Temporal/Duration/prototype/round/precision-exact-in-balance-duration-relative-years-months': [FAIL],
+  'built-ins/Temporal/Duration/prototype/round/precision-exact-in-balance-duration-relative-years-with-calendar': [FAIL],
+  'built-ins/Temporal/Duration/prototype/round/precision-exact-in-round-duration': [FAIL],
+  'built-ins/Temporal/Duration/prototype/round/roundingmode-ceil': [FAIL],
+  'built-ins/Temporal/Duration/prototype/round/roundingmode-floor': [FAIL],
+  'built-ins/Temporal/Duration/prototype/round/roundingmode-trunc': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-ceil': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-expand': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-ceil': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-expand': [FAIL],
+  'built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor': [FAIL],
+  'built-ins/Temporal/PlainTime/prototype/add/precision-exact-mathematical-values-1': [FAIL],
+  'built-ins/Temporal/PlainTime/prototype/add/precision-exact-mathematical-values-2': [FAIL],
+  'built-ins/Temporal/PlainTime/prototype/add/precision-exact-mathematical-values-3': [FAIL],
+  'built-ins/Temporal/PlainTime/prototype/subtract/precision-exact-mathematical-values-1': [FAIL],
+  'built-ins/Temporal/PlainTime/prototype/subtract/precision-exact-mathematical-values-2': [FAIL],
+  'built-ins/Temporal/PlainTime/prototype/subtract/precision-exact-mathematical-values-3': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-ceil': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-expand': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-floor': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-ceil': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-expand': [FAIL],
+  'built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-floor': [FAIL],
+  'intl402/Temporal/ZonedDateTime/prototype/withCalendar/calendar-case-insensitive': [FAIL],
+
+  # https://bugs.chromium.org/p/v8/issues/detail?id=13342
+  'built-ins/RegExp/property-escapes/generated/Alphabetic': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Assigned': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Cased': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Case_Ignorable': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Changes_When_NFKC_Casefolded': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Diacritic': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Emoji': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Emoji_Modifier_Base': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Emoji_Presentation': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Cased_Letter': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Decimal_Number': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Format': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Letter': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Lowercase_Letter': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Mark': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Letter': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Nonspacing_Mark': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Number': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Other': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Letter': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Number': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Punctuation': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Symbol': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Punctuation': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Spacing_Mark': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Symbol': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/General_Category_-_Unassigned': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Grapheme_Base': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Grapheme_Extend': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/ID_Continue': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Ideographic': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/ID_Start': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Lowercase': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Arabic': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Common': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Cyrillic': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Devanagari': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Egyptian_Hieroglyphs': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Arabic': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Common': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cyrillic': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Devanagari': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Egyptian_Hieroglyphs': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Han': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hiragana': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kannada': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Katakana': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kawi': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khojki': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lao': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Latin': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nag_Mundari': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Han': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Hiragana': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Kannada': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Katakana': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Kawi': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Khojki': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Lao': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Latin': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Script_-_Nag_Mundari': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Sentence_Terminal': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Soft_Dotted': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Terminal_Punctuation': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/Unified_Ideograph': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/XID_Continue': [FAIL],
+  'built-ins/RegExp/property-escapes/generated/XID_Start': [FAIL],
+  'language/identifiers/part-unicode-15.0.0-class-escaped': [FAIL],
+  'language/identifiers/part-unicode-15.0.0-class': [FAIL],
+  'language/identifiers/part-unicode-15.0.0-escaped': [FAIL],
+  'language/identifiers/part-unicode-15.0.0': [FAIL],
+  'language/identifiers/start-unicode-15.0.0-class-escaped': [FAIL],
+  'language/identifiers/start-unicode-15.0.0-class': [FAIL],
+  'language/identifiers/start-unicode-15.0.0-escaped': [FAIL],
+  'language/identifiers/start-unicode-15.0.0': [FAIL],
 
   # https://bugs.chromium.org/p/v8/issues/detail?id=11660
-  'intl402/DurationFormat/prototype/prototype_attributes': [FAIL],
-  'intl402/DurationFormat/prototype/constructor/prop-desc': [FAIL],
-  'intl402/DurationFormat/prototype/constructor/value': [FAIL],
-  'intl402/DurationFormat/prototype/format/length': [FAIL],
-  'intl402/DurationFormat/prototype/format/name': [FAIL],
-  'intl402/DurationFormat/prototype/format/prop-desc': [FAIL],
-  'intl402/DurationFormat/prototype/format/throw-invoked-as-func': [FAIL],
-  'intl402/DurationFormat/prototype/formatToParts/length': [FAIL],
-  'intl402/DurationFormat/prototype/formatToParts/name': [FAIL],
-  'intl402/DurationFormat/prototype/formatToParts/prop-desc': [FAIL],
-  'intl402/DurationFormat/prototype/formatToParts/throw-invoked-as-func': [FAIL],
-  'intl402/DurationFormat/prototype/resolvedOptions/length': [FAIL],
-  'intl402/DurationFormat/prototype/resolvedOptions/name': [FAIL],
-  'intl402/DurationFormat/prototype/resolvedOptions/prop-desc': [FAIL],
-  'intl402/DurationFormat/prototype/resolvedOptions/throw-invoked-as-func': [FAIL],
-  'intl402/DurationFormat/prototype/toStringTag/toString': [FAIL],
-  'intl402/DurationFormat/prototype/toStringTag/toStringTag': [FAIL],
-  'intl402/DurationFormat/constructor-locales-invalid': [FAIL],
-  'intl402/DurationFormat/constructor-locales-valid': [FAIL],
-  'intl402/DurationFormat/constructor-options-defaults': [FAIL],
-  'intl402/DurationFormat/constructor-options-fractionalDigits-invalid': [FAIL],
-  'intl402/DurationFormat/constructor-options-fractionalDigits-valid': [FAIL],
-  'intl402/DurationFormat/constructor-options-invalid': [FAIL],
-  'intl402/DurationFormat/constructor-options-localeMatcher-invalid': [FAIL],
-  'intl402/DurationFormat/constructor-options-localeMatcher-valid': [FAIL],
-  'intl402/DurationFormat/constructor-options-numberingSystem-invalid': [FAIL],
-  'intl402/DurationFormat/constructor-options-numberingSystem-valid': [FAIL],
-  'intl402/DurationFormat/constructor-options-order': [FAIL],
-  'intl402/DurationFormat/constructor-options-style-invalid': [FAIL],
-  'intl402/DurationFormat/constructor-options-style-valid': [FAIL],
-  'intl402/DurationFormat/extensibility': [FAIL],
-  'intl402/DurationFormat/length': [FAIL],
-  'intl402/DurationFormat/name': [FAIL],
-  'intl402/DurationFormat/newtarget-undefined': [FAIL],
-  'intl402/DurationFormat/prop-desc': [FAIL],
-  'intl402/DurationFormat/prototype': [FAIL],
-  'intl402/DurationFormat/supportedLocalesOf/basic': [FAIL],
-  'intl402/DurationFormat/supportedLocalesOf/branding': [FAIL],
-  'intl402/DurationFormat/supportedLocalesOf/length': [FAIL],
-  'intl402/DurationFormat/supportedLocalesOf/locales-empty': [FAIL],
-  'intl402/DurationFormat/supportedLocalesOf/locales-invalid': [FAIL],
-  'intl402/DurationFormat/supportedLocalesOf/locales-specific': [FAIL],
-  'intl402/DurationFormat/supportedLocalesOf/name': [FAIL],
-  'intl402/DurationFormat/supportedLocalesOf/prop-desc': [FAIL],
-  'intl402/DurationFormat/prototype/format/invalid-negative-duration-throws': [FAIL],
-  'intl402/DurationFormat/prototype/formatToParts/invalid-negative-duration-throws': [FAIL],
-  'intl402/DurationFormat/prototype/format/basic-format-en': [FAIL],
-  'intl402/DurationFormat/prototype/format/branding': [FAIL],
-  'intl402/DurationFormat/prototype/format/invalid-arguments-throws': [FAIL],
-  'intl402/DurationFormat/prototype/format/not-a-constructor': [FAIL],
+  # https://github.com/tc39/proposal-intl-duration-format/issues/114
   'intl402/DurationFormat/prototype/format/style-options-en': [FAIL],
-  'intl402/DurationFormat/prototype/formatToParts/branding': [FAIL],
-  'intl402/DurationFormat/prototype/formatToParts/invalid-arguments-throws': [FAIL],
-  'intl402/DurationFormat/prototype/formatToParts/not-a-constructor': [FAIL],
 
   # https://bugs.chromium.org/p/v8/issues/detail?id=12763
   'language/expressions/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier': [FAIL],
@@ -679,9 +646,6 @@
   'built-ins/Date/prototype/setUTCMonth/arg-coercion-order': [FAIL],
   'built-ins/Date/prototype/setUTCSeconds/arg-coercion-order': [FAIL],
 
-  # https://bugs.chromium.org/p/v8/issues/detail?id=12044
-  'built-ins/Array/prototype/Symbol.unscopables/array-grouping': [FAIL],
-
   # https://bugs.chromium.org/p/v8/issues/detail?id=12681
   'built-ins/Array/prototype/push/set-length-zero-array-length-is-non-writable': [FAIL],
 
@@ -793,6 +757,27 @@
   'built-ins/RegExp/named-groups/unicode-property-names-valid': [SKIP],
   'built-ins/RegExp/named-groups/non-unicode-property-names-valid': [FAIL],
   'built-ins/RegExp/match-indices/indices-array-unicode-property-names': [SKIP],
+  'built-ins/RegExp/unicodeSets/generated/character-class-difference-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-class-intersection-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-class-union-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-difference-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-intersection-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-union-character-property-escape': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class': [PASS,FAIL],
+  'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-property-escape': [PASS,FAIL],
 
   # Unicode in identifiers.
   'language/identifiers/part-unicode-*': [FAIL],
@@ -805,8 +790,11 @@
 
   # Temporal staging test which use timeZone other than "UTC" or
   # calendar other than "iso8601" which are not supported in no i18n mode.
+  'staging/Temporal/Duration/old/add': [FAIL],
+  'staging/Temporal/Duration/old/subtract': [FAIL],
   'staging/Temporal/Instant/old/toZonedDateTime': [FAIL],
   'staging/Temporal/Instant/old/toZonedDateTimeISO': [FAIL],
+  'staging/Temporal/Regex/old/timezone': [FAIL],
   'staging/Temporal/TimeZone/old/dst-change': [FAIL],
   'staging/Temporal/TimeZone/old/getInstantFor': [FAIL],
   'staging/Temporal/TimeZone/old/getInstantFor-disambiguation': [FAIL],
@@ -820,13 +808,20 @@
   'staging/Temporal/ZonedDateTime/old/add': [FAIL],
   'staging/Temporal/ZonedDateTime/old/compare': [FAIL],
   'staging/Temporal/ZonedDateTime/old/date-time-hours-overflow': [FAIL],
+  'staging/Temporal/ZonedDateTime/old/dst-properties': [FAIL],
   'staging/Temporal/ZonedDateTime/old/order-of-operations': [FAIL],
+  'staging/Temporal/ZonedDateTime/old/property-bags': [FAIL],
   'staging/Temporal/ZonedDateTime/old/reversibility-of-differences': [FAIL],
+  'staging/Temporal/ZonedDateTime/old/round': [FAIL],
   'staging/Temporal/ZonedDateTime/old/since': [FAIL],
+  'staging/Temporal/ZonedDateTime/old/string-parsing': [FAIL],
   'staging/Temporal/ZonedDateTime/old/subtract': [FAIL],
   'staging/Temporal/ZonedDateTime/old/toInstant': [FAIL],
   'staging/Temporal/ZonedDateTime/old/toPlainDate': [FAIL],
   'staging/Temporal/ZonedDateTime/old/toPlainTime': [FAIL],
+  'staging/Temporal/ZonedDateTime/old/toString': [FAIL],
+  'staging/Temporal/ZonedDateTime/old/until': [FAIL],
+  'staging/Temporal/ZonedDateTime/old/with': [FAIL],
   'staging/Temporal/ZonedDateTime/old/withCalendar': [FAIL],
   'staging/Temporal/ZonedDateTime/old/withPlainDate': [FAIL],
   'staging/Temporal/ZonedDateTime/old/withPlainTime': [FAIL],
diff --git a/deps/v8/test/test262/testcfg.py b/deps/v8/test/test262/testcfg.py
index 6d72acbe4e5c0b..f0dab8ae29eb1d 100644
--- a/deps/v8/test/test262/testcfg.py
+++ b/deps/v8/test/test262/testcfg.py
@@ -41,7 +41,8 @@
 
 # TODO(littledan): move the flag mapping into the status file
 FEATURE_FLAGS = {
-    'Intl.NumberFormat-v3': '--harmony_intl_number_format_v3',
+    'Intl.NumberFormat-v3': '--harmony-intl-number-format-v3',
+    'Intl.DurationFormat': '--harmony-intl-duration-format',
     'Symbol.prototype.description': '--harmony-symbol-description',
     'FinalizationRegistry': '--harmony-weak-refs-with-cleanup-some',
     'WeakRef': '--harmony-weak-refs-with-cleanup-some',
@@ -50,9 +51,10 @@
     'import-assertions': '--harmony-import-assertions',
     'resizable-arraybuffer': '--harmony-rab-gsab',
     'Temporal': '--harmony-temporal',
-    'array-find-from-last': '--harmony_array_find_last',
+    'array-find-from-last': '--harmony-array-find-last',
     'ShadowRealm': '--harmony-shadow-realm',
     'regexp-v-flag': '--harmony-regexp-unicode-sets',
+    'array-grouping': '--harmony-array-grouping',
 }
 
 SKIPPED_FEATURES = set([])
diff --git a/deps/v8/test/unittests/BUILD.gn b/deps/v8/test/unittests/BUILD.gn
index f5fa21f23ab478..3ed05d219da6b3 100644
--- a/deps/v8/test/unittests/BUILD.gn
+++ b/deps/v8/test/unittests/BUILD.gn
@@ -59,6 +59,7 @@ v8_source_set("v8_heap_base_unittests_sources") {
 
   sources = [
     "heap/base/active-system-pages-unittest.cc",
+    "heap/base/basic-slot-set-unittest.cc",
     "heap/base/worklist-unittest.cc",
   ]
 
@@ -238,6 +239,7 @@ v8_source_set("unittests_sources") {
     "api/access-check-unittest.cc",
     "api/accessor-unittest.cc",
     "api/api-icu-unittest.cc",
+    "api/context-unittest.cc",
     "api/deserialize-unittest.cc",
     "api/exception-unittest.cc",
     "api/gc-callbacks-unittest.cc",
@@ -348,6 +350,7 @@ v8_source_set("unittests_sources") {
     "compiler/regalloc/mid-tier-register-allocator-unittest.cc",
     "compiler/regalloc/move-optimizer-unittest.cc",
     "compiler/regalloc/register-allocator-unittest.cc",
+    "compiler/run-bytecode-graph-builder-unittest.cc",
     "compiler/run-deopt-unittest.cc",
     "compiler/run-jsbranches-unittest.cc",
     "compiler/run-jscalls-unittest.cc",
@@ -409,7 +412,6 @@ v8_source_set("unittests_sources") {
     "heap/local-factory-unittest.cc",
     "heap/local-handles-unittest.cc",
     "heap/local-heap-unittest.cc",
-    "heap/marking-inner-pointer-resolution-unittest.cc",
     "heap/marking-unittest.cc",
     "heap/marking-worklist-unittest.cc",
     "heap/memory-reducer-unittest.cc",
@@ -582,6 +584,14 @@ v8_source_set("unittests_sources") {
     sources += [ "heap/object-start-bitmap-unittest.cc" ]
   }
 
+  if (v8_enable_inner_pointer_resolution_mb) {
+    sources += [ "heap/marking-inner-pointer-resolution-unittest.cc" ]
+  }
+
+  if (v8_enable_conservative_stack_scanning) {
+    sources += [ "heap/conservative-stack-visitor-unittest.cc" ]
+  }
+
   if (v8_enable_i18n_support) {
     defines = [ "V8_INTL_SUPPORT" ]
     public_deps = [ "//third_party/icu" ]
diff --git a/deps/v8/test/unittests/api/accessor-unittest.cc b/deps/v8/test/unittests/api/accessor-unittest.cc
index ffddb2da1acd3c..8cd8a6fccffe50 100644
--- a/deps/v8/test/unittests/api/accessor-unittest.cc
+++ b/deps/v8/test/unittests/api/accessor-unittest.cc
@@ -33,7 +33,7 @@ static void UnreachableCallback(
 TEST_F(AccessorTest, CachedAccessor) {
   // TurboFan support for fast accessors is not implemented; turbofanned
   // code uses the slow accessor which breaks this test's expectations.
-  v8::internal::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
   v8::Isolate* isolate = context()->GetIsolate();
   v8::HandleScope scope(isolate);
 
@@ -78,8 +78,8 @@ TEST_F(AccessorTest, CachedAccessor) {
 }
 
 TEST_F(AccessorTest, CachedAccessorTurboFan) {
-  i::FLAG_allow_natives_syntax = true;
-  // v8::internal::FLAG_always_turbofan = false;
+  i::v8_flags.allow_natives_syntax = true;
+  // i::v8_flags.always_turbofan = false;
   v8::Isolate* isolate = context()->GetIsolate();
   v8::HandleScope scope(isolate);
 
@@ -162,7 +162,7 @@ TEST_F(AccessorTest, CachedAccessorTurboFan) {
 }
 
 TEST_F(AccessorTest, CachedAccessorOnGlobalObject) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(isolate());
 
   v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate());
@@ -845,7 +845,7 @@ v8::MaybeLocal<v8::Context> TestHostCreateShadowRealmContextCallback(
 }  // namespace
 
 TEST_F(AccessorTest, WrapFunctionTemplateSetNativeDataProperty) {
-  i::FLAG_harmony_shadow_realm = true;
+  i::v8_flags.harmony_shadow_realm = true;
   isolate()->SetHostCreateShadowRealmContextCallback(
       TestHostCreateShadowRealmContextCallback);
 
diff --git a/deps/v8/test/unittests/api/api-wasm-unittest.cc b/deps/v8/test/unittests/api/api-wasm-unittest.cc
index 6a3d363b62f780..04f52549486079 100644
--- a/deps/v8/test/unittests/api/api-wasm-unittest.cc
+++ b/deps/v8/test/unittests/api/api-wasm-unittest.cc
@@ -104,6 +104,13 @@ void WasmStreamingCallbackTestOnBytesReceived(
   streaming->OnBytesReceived(bytes, arraysize(bytes));
 }
 
+void WasmStreamingMoreFunctionsCanBeSerializedCallback(
+    const FunctionCallbackInfo<Value>& args) {
+  std::shared_ptr<WasmStreaming> streaming =
+      WasmStreaming::Unpack(args.GetIsolate(), args.Data());
+  streaming->SetMoreFunctionsCanBeSerializedCallback([](CompiledWasmModule) {});
+}
+
 TEST_F(ApiWasmTest, WasmStreamingCallback) {
   TestWasmStreaming(WasmStreamingCallbackTestCallbackIsCalled,
                     Promise::kPending);
@@ -144,6 +151,11 @@ TEST_F(ApiWasmTest, WasmCompileToWasmModuleObject) {
   CHECK(!maybe_module.IsEmpty());
 }
 
+TEST_F(ApiWasmTest, WasmStreamingSetCallback) {
+  TestWasmStreaming(WasmStreamingMoreFunctionsCanBeSerializedCallback,
+                    Promise::kPending);
+}
+
 namespace {
 
 bool wasm_simd_enabled_value = false;
diff --git a/deps/v8/test/unittests/api/context-unittest.cc b/deps/v8/test/unittests/api/context-unittest.cc
new file mode 100644
index 00000000000000..e144a60ca42ba1
--- /dev/null
+++ b/deps/v8/test/unittests/api/context-unittest.cc
@@ -0,0 +1,96 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "include/libplatform/libplatform.h"
+#include "include/v8-context.h"
+#include "include/v8-data.h"
+#include "include/v8-isolate.h"
+#include "include/v8-local-handle.h"
+#include "include/v8-value.h"
+#include "test/unittests/test-utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ContextTest = v8::TestWithIsolate;
+
+TEST_F(ContextTest, HasTemplateLiteralObjectBasic) {
+  v8::Local<v8::Context> context = v8::Context::New(isolate());
+  v8::Context::Scope scope(context);
+  ASSERT_FALSE(
+      context->HasTemplateLiteralObject(v8::Number::New(isolate(), 1)));
+  ASSERT_FALSE(context->HasTemplateLiteralObject(v8::String::Empty(isolate())));
+  ASSERT_FALSE(
+      context->HasTemplateLiteralObject(v8::Array::New(isolate(), 10)));
+}
+
+TEST_F(ContextTest, HasTemplateLiteralObject) {
+  const char* source = R"(
+    function ret(literal) {
+      return literal;
+    };
+    ret`one_${'two'}_three`;
+  )";
+  const char* otherObject1Source = R"(
+    Object.freeze(
+      Object.defineProperty(['one_', '_three'], 'raw', {
+        value: ['asdf'],
+        writable: false,
+        enumerable: false,
+        configurable: false,
+      })
+    );
+  )";
+  const char* otherObject2Source = R"(
+    Object.freeze(
+      Object.defineProperty(['one_', '_three'], 'raw', {
+        get() { return ['asdf']; },
+        enumerable: false,
+        configurable: false,
+      })
+    );
+  )";
+
+  v8::Local<v8::Context> context1 = v8::Context::New(isolate());
+  v8::Local<v8::Value> templateLiteral1;
+  v8::Local<v8::Value> templateLiteral1_2;
+  v8::Local<v8::Value> otherObject1_ctx1;
+  v8::Local<v8::Value> otherObject2_ctx1;
+  {
+    v8::Context::Scope scope(context1);
+    auto script =
+        v8::Script::Compile(context1, NewString(source)).ToLocalChecked();
+    templateLiteral1 = script->Run(context1).ToLocalChecked();
+    templateLiteral1_2 = script->Run(context1).ToLocalChecked();
+    otherObject1_ctx1 = RunJS(context1, otherObject1Source);
+    otherObject2_ctx1 = RunJS(context1, otherObject2Source);
+  }
+
+  v8::Local<v8::Value> templateLiteral2;
+  v8::Local<v8::Context> context2 = v8::Context::New(isolate());
+  v8::Local<v8::Value> otherObject1_ctx2;
+  v8::Local<v8::Value> otherObject2_ctx2;
+  {
+    v8::Context::Scope scope(context2);
+    templateLiteral2 = RunJS(context2, source);
+    otherObject1_ctx2 = RunJS(context2, otherObject1Source);
+    otherObject2_ctx2 = RunJS(context1, otherObject2Source);
+  }
+
+  ASSERT_TRUE(context1->HasTemplateLiteralObject(templateLiteral1));
+  ASSERT_TRUE(context1->HasTemplateLiteralObject(templateLiteral1_2));
+  ASSERT_FALSE(context1->HasTemplateLiteralObject(templateLiteral2));
+
+  ASSERT_FALSE(context2->HasTemplateLiteralObject(templateLiteral1));
+  ASSERT_FALSE(context2->HasTemplateLiteralObject(templateLiteral1_2));
+  ASSERT_TRUE(context2->HasTemplateLiteralObject(templateLiteral2));
+
+  // Neither otherObject is a template object
+  ASSERT_FALSE(context1->HasTemplateLiteralObject(otherObject1_ctx1));
+  ASSERT_FALSE(context1->HasTemplateLiteralObject(otherObject2_ctx1));
+  ASSERT_FALSE(context1->HasTemplateLiteralObject(otherObject1_ctx2));
+  ASSERT_FALSE(context1->HasTemplateLiteralObject(otherObject1_ctx1));
+  ASSERT_FALSE(context2->HasTemplateLiteralObject(otherObject2_ctx1));
+  ASSERT_FALSE(context2->HasTemplateLiteralObject(otherObject1_ctx2));
+  ASSERT_FALSE(context2->HasTemplateLiteralObject(otherObject2_ctx2));
+  ASSERT_FALSE(context2->HasTemplateLiteralObject(otherObject2_ctx2));
+}
diff --git a/deps/v8/test/unittests/api/deserialize-unittest.cc b/deps/v8/test/unittests/api/deserialize-unittest.cc
index a1237b6bc32318..f649beb26fca43 100644
--- a/deps/v8/test/unittests/api/deserialize-unittest.cc
+++ b/deps/v8/test/unittests/api/deserialize-unittest.cc
@@ -402,7 +402,8 @@ class MergeDeserializedCodeTest : public DeserializeTest {
                           ScriptObjectFlag aged_after_background_merge,
                           bool lazy_should_be_compiled = false,
                           bool eager_should_be_compiled = true) {
-    i::FLAG_merge_background_deserialized_script_with_compilation_cache = true;
+    i::v8_flags.merge_background_deserialized_script_with_compilation_cache =
+        true;
     std::unique_ptr<v8::ScriptCompiler::CachedData> cached_data;
     IsolateAndContextScope scope(this);
     i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate());
@@ -632,4 +633,86 @@ TEST_F(MergeDeserializedCodeTest, Regress1360024) {
                      true);                  // lazy_should_be_compiled
 }
 
+TEST_F(MergeDeserializedCodeTest, MergeWithNoFollowUpWork) {
+  i::v8_flags.merge_background_deserialized_script_with_compilation_cache =
+      true;
+  std::unique_ptr<v8::ScriptCompiler::CachedData> cached_data;
+  IsolateAndContextScope scope(this);
+  i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate());
+  ScriptOrigin default_origin(isolate(), NewString(""));
+
+  constexpr char kSourceCode[] = "function f() {}";
+  Local<Script> original_script;
+
+  // Compile the script for the first time, to both populate the Isolate
+  // compilation cache and produce code cache data.
+  {
+    v8::EscapableHandleScope handle_scope(isolate());
+    Local<Script> script =
+        Script::Compile(context(), NewString(kSourceCode), &default_origin)
+            .ToLocalChecked();
+
+    cached_data.reset(
+        ScriptCompiler::CreateCodeCache(script->GetUnboundScript()));
+
+    // Retain the v8::Script (a JSFunction) so we can run it later.
+    original_script = handle_scope.Escape(script);
+  }
+
+  // Age the top-level bytecode so that the Isolate compilation cache will
+  // contain only the Script.
+  i::BytecodeArray bytecode =
+      GetSharedFunctionInfo(original_script).GetBytecodeArray(i_isolate);
+  const int kAgingThreshold = 6;
+  for (int j = 0; j < kAgingThreshold; ++j) {
+    bytecode.MakeOlder();
+  }
+  i_isolate->heap()->CollectAllGarbage(i::Heap::kNoGCFlags,
+                                       i::GarbageCollectionReason::kTesting);
+
+  // A second round of GC is necessary in case incremental marking had already
+  // started before the bytecode was aged.
+  i_isolate->heap()->CollectAllGarbage(i::Heap::kNoGCFlags,
+                                       i::GarbageCollectionReason::kTesting);
+
+  DeserializeThread deserialize_thread(ScriptCompiler::StartConsumingCodeCache(
+      isolate(), std::make_unique<ScriptCompiler::CachedData>(
+                     cached_data->data, cached_data->length,
+                     ScriptCompiler::CachedData::BufferNotOwned)));
+  CHECK(deserialize_thread.Start());
+  deserialize_thread.Join();
+
+  std::unique_ptr<ScriptCompiler::ConsumeCodeCacheTask> task =
+      deserialize_thread.TakeTask();
+
+  // At this point, the cached script's top-level SFI is not compiled, so a
+  // background merge is recommended.
+  task->SourceTextAvailable(isolate(), NewString(kSourceCode), default_origin);
+
+  CHECK(task->ShouldMergeWithExistingScript());
+
+  // Run the original script, which will cause its top-level SFI to become
+  // compiled again, and make the SFI for the nested function exist.
+  CHECK(!original_script->Run(context()).IsEmpty());
+
+  // The background merge does nothing and requests no follow-up work on the
+  // main thread because the original script has the same SFIs at the same level
+  // of compiledness.
+  MergeThread merge_thread(task.get());
+  CHECK(merge_thread.Start());
+  merge_thread.Join();
+
+  // Complete compilation on the main thread. Even though no follow-up work is
+  // required, this step should reuse the original script.
+  ScriptCompiler::Source source(NewString(kSourceCode), default_origin,
+                                cached_data.release(), task.release());
+  Local<Script> script =
+      ScriptCompiler::Compile(context(), &source,
+                              ScriptCompiler::kConsumeCodeCache)
+          .ToLocalChecked();
+
+  CHECK_EQ(GetSharedFunctionInfo(script),
+           GetSharedFunctionInfo(original_script));
+}
+
 }  // namespace v8
diff --git a/deps/v8/test/unittests/api/exception-unittest.cc b/deps/v8/test/unittests/api/exception-unittest.cc
index cda1d9defe1c42..2455e4c78f94b1 100644
--- a/deps/v8/test/unittests/api/exception-unittest.cc
+++ b/deps/v8/test/unittests/api/exception-unittest.cc
@@ -44,10 +44,10 @@ class APIExceptionTest : public TestWithIsolate {
 
 class V8_NODISCARD ScopedExposeGc {
  public:
-  ScopedExposeGc() : was_exposed_(i::FLAG_expose_gc) {
-    i::FLAG_expose_gc = true;
+  ScopedExposeGc() : was_exposed_(i::v8_flags.expose_gc) {
+    i::v8_flags.expose_gc = true;
   }
-  ~ScopedExposeGc() { i::FLAG_expose_gc = was_exposed_; }
+  ~ScopedExposeGc() { i::v8_flags.expose_gc = was_exposed_; }
 
  private:
   const bool was_exposed_;
diff --git a/deps/v8/test/unittests/api/gc-callbacks-unittest.cc b/deps/v8/test/unittests/api/gc-callbacks-unittest.cc
index edbc9d1af70fa2..1603d7709627d9 100644
--- a/deps/v8/test/unittests/api/gc-callbacks-unittest.cc
+++ b/deps/v8/test/unittests/api/gc-callbacks-unittest.cc
@@ -20,7 +20,7 @@ class GCCallbacksTest : public internal::TestWithHeapInternalsAndContext {
     CHECK_EQ(current_test_->gc_callbacks_isolate_, isolate);
     ++current_test_->prologue_call_count_alloc_;
 
-    if (!v8::internal::FLAG_single_generation) {
+    if (!i::v8_flags.single_generation) {
       // Simulate full heap to see if we will reenter this callback
       current_test_->SimulateFullSpace(current_test_->heap()->new_space());
     }
@@ -39,7 +39,7 @@ class GCCallbacksTest : public internal::TestWithHeapInternalsAndContext {
     CHECK_EQ(current_test_->gc_callbacks_isolate_, isolate);
     ++current_test_->epilogue_call_count_alloc_;
 
-    if (!v8::internal::FLAG_single_generation) {
+    if (!i::v8_flags.single_generation) {
       // Simulate full heap to see if we will reenter this callback
       current_test_->SimulateFullSpace(current_test_->heap()->new_space());
     }
@@ -120,7 +120,7 @@ GCCallbacksTest* GCCallbacksTest::current_test_ = nullptr;
 
 TEST_F(GCCallbacksTest, GCCallbacks) {
   // For SimulateFullSpace in PrologueCallbackAlloc and EpilogueCallbackAlloc.
-  i::FLAG_stress_concurrent_allocation = false;
+  i::v8_flags.stress_concurrent_allocation = false;
   v8::Isolate* isolate = context()->GetIsolate();
   gc_callbacks_isolate_ = isolate;
   isolate->AddGCPrologueCallback(PrologueCallback);
diff --git a/deps/v8/test/unittests/api/v8-object-unittest.cc b/deps/v8/test/unittests/api/v8-object-unittest.cc
index a4b5dc76e5ad53..9fcb9a402088da 100644
--- a/deps/v8/test/unittests/api/v8-object-unittest.cc
+++ b/deps/v8/test/unittests/api/v8-object-unittest.cc
@@ -101,7 +101,7 @@ TEST_F(LapContextTest, CurrentContextInLazyAccessorOnPrototype) {
       "%OptimizeFunctionOnNextCall(f); "
       "f();";
   Context::Scope scope(caller_context);
-  internal::FLAG_allow_natives_syntax = true;
+  internal::v8_flags.allow_natives_syntax = true;
   Script::Compile(caller_context, String::NewFromUtf8Literal(isolate(), script))
       .ToLocalChecked()
       ->Run(caller_context)
@@ -153,7 +153,7 @@ TEST_F(LapContextTest, CurrentContextInLazyAccessorOnPlatformObject) {
       "%OptimizeFunctionOnNextCall(f); "
       "f();";
   Context::Scope scope(caller_context);
-  internal::FLAG_allow_natives_syntax = true;
+  internal::v8_flags.allow_natives_syntax = true;
   Script::Compile(caller_context, String::NewFromUtf8Literal(isolate(), script))
       .ToLocalChecked()
       ->Run(caller_context)
@@ -204,7 +204,7 @@ TEST_F(LapContextTest, CurrentContextInLazyAccessorOnInterface) {
       "%OptimizeFunctionOnNextCall(f); "
       "f();";
   Context::Scope scope(caller_context);
-  internal::FLAG_allow_natives_syntax = true;
+  internal::v8_flags.allow_natives_syntax = true;
   Script::Compile(caller_context, String::NewFromUtf8Literal(isolate(), script))
       .ToLocalChecked()
       ->Run(caller_context)
diff --git a/deps/v8/test/unittests/assembler/disasm-arm-unittest.cc b/deps/v8/test/unittests/assembler/disasm-arm-unittest.cc
index 52e2ad53e55d66..e0f9c5f90b96e9 100644
--- a/deps/v8/test/unittests/assembler/disasm-arm-unittest.cc
+++ b/deps/v8/test/unittests/assembler/disasm-arm-unittest.cc
@@ -1641,7 +1641,7 @@ static void TestLoadLiteral(byte* buffer, Assembler* assm, bool* failure,
 }
 
 
-TEST_F(DisasmArmTest,LoadLiteral) {
+TEST_F(DisasmArmTest, LoadLiteral) {
   SET_UP();
 
   TestLoadLiteral(buffer, &assm, &failure, 0);
diff --git a/deps/v8/test/unittests/assembler/disasm-ia32-unittest.cc b/deps/v8/test/unittests/assembler/disasm-ia32-unittest.cc
index 86759cf7748e7f..d35a7a23dff50b 100644
--- a/deps/v8/test/unittests/assembler/disasm-ia32-unittest.cc
+++ b/deps/v8/test/unittests/assembler/disasm-ia32-unittest.cc
@@ -45,8 +45,6 @@ using DisasmIa320Test = TestWithIsolate;
 
 #define __ assm.
 
-static void DummyStaticFunction(Object result) {}
-
 TEST_F(DisasmIa320Test, DisasmIa320) {
   HandleScope scope(isolate());
   v8::internal::byte buffer[8192];
@@ -293,8 +291,6 @@ TEST_F(DisasmIa320Test, DisasmIa320) {
   Handle<Code> ic = BUILTIN_CODE(isolate(), ArrayFrom);
   __ call(ic, RelocInfo::CODE_TARGET);
   __ nop();
-  __ call(FUNCTION_ADDR(DummyStaticFunction), RelocInfo::RUNTIME_ENTRY);
-  __ nop();
 
   __ jmp(&L1);
   __ jmp(Operand(ebx, ecx, times_4, 10000));
diff --git a/deps/v8/test/unittests/assembler/disasm-riscv-unittest.cc b/deps/v8/test/unittests/assembler/disasm-riscv-unittest.cc
index f2b83adb852ae2..7bc9ca42cb3fe1 100644
--- a/deps/v8/test/unittests/assembler/disasm-riscv-unittest.cc
+++ b/deps/v8/test/unittests/assembler/disasm-riscv-unittest.cc
@@ -469,7 +469,7 @@ TEST_F(DisasmRiscv64Test, PSEUDO) {
 }
 #ifdef V8_TARGET_ARCH_RISCV64
 TEST_F(DisasmRiscv64Test, RV64C) {
-  i::FLAG_riscv_c_extension = true;
+  i::v8_flags.riscv_c_extension = true;
   SET_UP();
 
   COMPARE(c_nop(), "00000001       nop");
diff --git a/deps/v8/test/unittests/assembler/macro-assembler-x64-unittest.cc b/deps/v8/test/unittests/assembler/macro-assembler-x64-unittest.cc
index 5cc8f9856b7743..b7e5b0ffbe7f6f 100644
--- a/deps/v8/test/unittests/assembler/macro-assembler-x64-unittest.cc
+++ b/deps/v8/test/unittests/assembler/macro-assembler-x64-unittest.cc
@@ -440,7 +440,7 @@ void TestSmiIndex(MacroAssembler* masm, Label* exit, int id, int x) {
 
 TEST_F(MacroAssemblerX64Test, EmbeddedObj) {
 #ifdef V8_COMPRESS_POINTERS
-  FLAG_compact_on_every_full_gc = true;
+  v8_flags.compact_on_every_full_gc = true;
 
   Isolate* isolate = i_isolate();
   HandleScope handles(isolate);
diff --git a/deps/v8/test/unittests/assembler/turbo-assembler-arm-unittest.cc b/deps/v8/test/unittests/assembler/turbo-assembler-arm-unittest.cc
index b04f7806aa57a7..6fa1bd5927341e 100644
--- a/deps/v8/test/unittests/assembler/turbo-assembler-arm-unittest.cc
+++ b/deps/v8/test/unittests/assembler/turbo-assembler-arm-unittest.cc
@@ -153,7 +153,7 @@ TEST_P(TurboAssemblerTestMoveObjectAndSlot, MoveObjectAndSlot) {
 
     CodeDesc desc;
     tasm.GetCode(nullptr, &desc);
-    if (FLAG_print_code) {
+    if (v8_flags.print_code) {
       Handle<Code> code =
           Factory::CodeBuilder(isolate(), desc, CodeKind::FOR_TESTING).Build();
       StdoutStream os;
diff --git a/deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc b/deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc
index 9ac58a827626ed..77123ef56513d2 100644
--- a/deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc
+++ b/deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc
@@ -216,7 +216,7 @@ TEST_P(TurboAssemblerTestMoveObjectAndSlot, MoveObjectAndSlot) {
 
       CodeDesc desc;
       tasm.GetCode(nullptr, &desc);
-      if (FLAG_print_code) {
+      if (v8_flags.print_code) {
         Handle<Code> code =
             Factory::CodeBuilder(isolate(), desc, CodeKind::FOR_TESTING)
                 .Build();
diff --git a/deps/v8/test/unittests/base/functional-unittest.cc b/deps/v8/test/unittests/base/functional-unittest.cc
index efcabb75a25e3b..95e79b5176be3f 100644
--- a/deps/v8/test/unittests/base/functional-unittest.cc
+++ b/deps/v8/test/unittests/base/functional-unittest.cc
@@ -43,7 +43,7 @@ template <typename T>
 class FunctionalTest : public ::testing::Test {
  public:
   FunctionalTest()
-      : rng_(GetRandomSeedFromFlag(::v8::internal::FLAG_random_seed)) {}
+      : rng_(GetRandomSeedFromFlag(::v8::internal::v8_flags.random_seed)) {}
   ~FunctionalTest() override = default;
   FunctionalTest(const FunctionalTest&) = delete;
   FunctionalTest& operator=(const FunctionalTest&) = delete;
diff --git a/deps/v8/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc b/deps/v8/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc
index 3f50f5a091d69b..2e777256ae2577 100644
--- a/deps/v8/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc
+++ b/deps/v8/test/unittests/compiler-dispatcher/compiler-dispatcher-unittest.cc
@@ -43,7 +43,7 @@ class LazyCompileDispatcherTestFlags {
   static void SetFlagsForTest() {
     CHECK_NULL(save_flags_);
     save_flags_ = new SaveFlags();
-    FLAG_lazy_compile_dispatcher = true;
+    v8_flags.lazy_compile_dispatcher = true;
     FlagList::EnforceFlagImplications();
   }
 
@@ -334,13 +334,13 @@ class MockPlatform : public v8::Platform {
 
 TEST_F(LazyCompileDispatcherTest, Construct) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
   dispatcher.AbortAll();
 }
 
 TEST_F(LazyCompileDispatcherTest, IsEnqueued) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
@@ -360,7 +360,7 @@ TEST_F(LazyCompileDispatcherTest, IsEnqueued) {
 
 TEST_F(LazyCompileDispatcherTest, FinishNow) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
@@ -379,7 +379,7 @@ TEST_F(LazyCompileDispatcherTest, FinishNow) {
 
 TEST_F(LazyCompileDispatcherTest, CompileAndFinalize) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
@@ -407,7 +407,7 @@ TEST_F(LazyCompileDispatcherTest, CompileAndFinalize) {
 
 TEST_F(LazyCompileDispatcherTest, IdleTaskNoIdleTime) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
@@ -458,7 +458,7 @@ TEST_F(LazyCompileDispatcherTest, IdleTaskNoIdleTime) {
 
 TEST_F(LazyCompileDispatcherTest, IdleTaskSmallIdleTime) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared_1 =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
@@ -556,7 +556,7 @@ TEST_F(LazyCompileDispatcherTest, IdleTaskException) {
 
 TEST_F(LazyCompileDispatcherTest, FinishNowWithWorkerTask) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
@@ -589,7 +589,7 @@ TEST_F(LazyCompileDispatcherTest, FinishNowWithWorkerTask) {
 
 TEST_F(LazyCompileDispatcherTest, IdleTaskMultipleJobs) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared_1 =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
@@ -648,7 +648,7 @@ TEST_F(LazyCompileDispatcherTest, FinishNowException) {
 
 TEST_F(LazyCompileDispatcherTest, AbortJobNotStarted) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
@@ -675,7 +675,7 @@ TEST_F(LazyCompileDispatcherTest, AbortJobNotStarted) {
 
 TEST_F(LazyCompileDispatcherTest, AbortJobAlreadyStarted) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
@@ -789,7 +789,7 @@ TEST_F(LazyCompileDispatcherTest, CompileLazy2FinishesDispatcherJob) {
 
 TEST_F(LazyCompileDispatcherTest, CompileMultipleOnBackgroundThread) {
   MockPlatform platform;
-  LazyCompileDispatcher dispatcher(i_isolate(), &platform, FLAG_stack_size);
+  LazyCompileDispatcher dispatcher(i_isolate(), &platform, v8_flags.stack_size);
 
   Handle<SharedFunctionInfo> shared_1 =
       test::CreateSharedFunctionInfo(i_isolate(), nullptr);
diff --git a/deps/v8/test/unittests/compiler/backend/instruction-selector-unittest.cc b/deps/v8/test/unittests/compiler/backend/instruction-selector-unittest.cc
index e52661fae260ef..30928fe94a8b82 100644
--- a/deps/v8/test/unittests/compiler/backend/instruction-selector-unittest.cc
+++ b/deps/v8/test/unittests/compiler/backend/instruction-selector-unittest.cc
@@ -19,7 +19,7 @@ namespace compiler {
 
 InstructionSelectorTest::InstructionSelectorTest()
     : TestWithNativeContextAndZone(kCompressGraphZone),
-      rng_(FLAG_random_seed) {}
+      rng_(v8_flags.random_seed) {}
 
 InstructionSelectorTest::~InstructionSelectorTest() = default;
 
@@ -28,7 +28,7 @@ InstructionSelectorTest::Stream InstructionSelectorTest::StreamBuilder::Build(
     InstructionSelectorTest::StreamBuilderMode mode,
     InstructionSelector::SourcePositionMode source_position_mode) {
   Schedule* schedule = ExportForTest();
-  if (FLAG_trace_turbo) {
+  if (v8_flags.trace_turbo) {
     StdoutStream{} << "=== Schedule before instruction selection ==="
                    << std::endl
                    << *schedule;
@@ -52,7 +52,7 @@ InstructionSelectorTest::Stream InstructionSelectorTest::StreamBuilder::Build(
       source_position_mode, features, InstructionSelector::kDisableScheduling,
       InstructionSelector::kEnableRootsRelativeAddressing);
   selector.SelectInstructions();
-  if (FLAG_trace_turbo) {
+  if (v8_flags.trace_turbo) {
     StdoutStream{} << "=== Code sequence after instruction selection ==="
                    << std::endl
                    << sequence;
diff --git a/deps/v8/test/unittests/compiler/bytecode-analysis-unittest.cc b/deps/v8/test/unittests/compiler/bytecode-analysis-unittest.cc
index 90a80b968eb0aa..1eb43200419d66 100644
--- a/deps/v8/test/unittests/compiler/bytecode-analysis-unittest.cc
+++ b/deps/v8/test/unittests/compiler/bytecode-analysis-unittest.cc
@@ -29,8 +29,8 @@ class BytecodeAnalysisTest : public TestWithIsolateAndZone {
   static void SetUpTestSuite() {
     CHECK_NULL(save_flags_);
     save_flags_ = new SaveFlags();
-    i::FLAG_ignition_elide_noneffectful_bytecodes = false;
-    i::FLAG_ignition_reo = false;
+    i::v8_flags.ignition_elide_noneffectful_bytecodes = false;
+    i::v8_flags.ignition_reo = false;
 
     TestWithIsolateAndZone::SetUpTestSuite();
   }
diff --git a/deps/v8/test/unittests/compiler/compiler-unittest.cc b/deps/v8/test/unittests/compiler/compiler-unittest.cc
index b5419dba417d51..abef44976cfe3b 100644
--- a/deps/v8/test/unittests/compiler/compiler-unittest.cc
+++ b/deps/v8/test/unittests/compiler/compiler-unittest.cc
@@ -206,7 +206,7 @@ using CompilerC2JSFramesTest = WithPrintExtensionMixin<v8::TestWithIsolate>;
 //   |      JS       |
 //   |   C-to-JS     |
 TEST_F(CompilerC2JSFramesTest, C2JSFrames) {
-  FLAG_expose_gc = true;
+  v8_flags.expose_gc = true;
   v8::HandleScope scope(isolate());
   const char* extension_names[2] = {
       "v8/gc", WithPrintExtensionMixin::kPrintExtensionName};
@@ -276,8 +276,8 @@ TEST_F(CompilerTest, GetScriptLineNumber) {
 }
 
 TEST_F(CompilerTest, FeedbackVectorPreservedAcrossRecompiles) {
-  if (i::FLAG_always_turbofan || !i::FLAG_turbofan) return;
-  i::FLAG_allow_natives_syntax = true;
+  if (i::v8_flags.always_turbofan || !i::v8_flags.turbofan) return;
+  i::v8_flags.allow_natives_syntax = true;
   if (!i_isolate()->use_optimizer()) return;
   v8::HandleScope scope(isolate());
 
@@ -319,7 +319,8 @@ TEST_F(CompilerTest, FeedbackVectorPreservedAcrossRecompiles) {
 }
 
 TEST_F(CompilerTest, FeedbackVectorUnaffectedByScopeChanges) {
-  if (i::FLAG_always_turbofan || !i::FLAG_lazy || i::FLAG_lite_mode) {
+  if (i::v8_flags.always_turbofan || !i::v8_flags.lazy ||
+      i::v8_flags.lite_mode) {
     return;
   }
   v8::HandleScope scope(isolate());
@@ -357,8 +358,8 @@ TEST_F(CompilerTest, FeedbackVectorUnaffectedByScopeChanges) {
 
 // Test that optimized code for different closures is actually shared.
 TEST_F(CompilerTest, OptimizedCodeSharing1) {
-  FLAG_stress_compaction = false;
-  FLAG_allow_natives_syntax = true;
+  v8_flags.stress_compaction = false;
+  v8_flags.allow_natives_syntax = true;
   v8::HandleScope scope(isolate());
   for (int i = 0; i < 3; i++) {
     context()
@@ -399,7 +400,7 @@ TEST_F(CompilerTest, OptimizedCodeSharing1) {
 }
 
 TEST_F(CompilerTest, CompileFunction) {
-  if (i::FLAG_always_turbofan) return;
+  if (i::v8_flags.always_turbofan) return;
   v8::HandleScope scope(isolate());
   RunJS("var r = 10;");
   v8::Local<v8::Object> math = v8::Local<v8::Object>::Cast(
@@ -724,9 +725,9 @@ TEST_F(CompilerTest, CompileFunctionFunctionToString) {
 }
 
 TEST_F(CompilerTest, InvocationCount) {
-  if (FLAG_lite_mode) return;
-  FLAG_allow_natives_syntax = true;
-  FLAG_always_turbofan = false;
+  if (v8_flags.lite_mode) return;
+  v8_flags.allow_natives_syntax = true;
+  v8_flags.always_turbofan = false;
   v8::HandleScope scope(isolate());
 
   RunJS(
@@ -746,7 +747,7 @@ TEST_F(CompilerTest, InvocationCount) {
 }
 
 TEST_F(CompilerTest, ShallowEagerCompilation) {
-  i::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
   v8::HandleScope scope(isolate());
   v8::Local<v8::String> source = NewString(
       "function f(x) {"
@@ -766,7 +767,7 @@ TEST_F(CompilerTest, ShallowEagerCompilation) {
 }
 
 TEST_F(CompilerTest, DeepEagerCompilation) {
-  i::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
   v8::HandleScope scope(isolate());
   v8::Local<v8::String> source = NewString(
       "function f(x) {"
@@ -792,7 +793,7 @@ TEST_F(CompilerTest, DeepEagerCompilation) {
 }
 
 TEST_F(CompilerTest, DeepEagerCompilationPeakMemory) {
-  i::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
   v8::HandleScope scope(isolate());
   v8::Local<v8::String> source = NewString(
       "function f() {"
diff --git a/deps/v8/test/unittests/compiler/control-equivalence-unittest.cc b/deps/v8/test/unittests/compiler/control-equivalence-unittest.cc
index e56d18a8cbc27a..1463f4ac8e8553 100644
--- a/deps/v8/test/unittests/compiler/control-equivalence-unittest.cc
+++ b/deps/v8/test/unittests/compiler/control-equivalence-unittest.cc
@@ -30,7 +30,7 @@ class ControlEquivalenceTest : public GraphTest {
  protected:
   void ComputeEquivalence(Node* end_node) {
     graph()->SetEnd(graph()->NewNode(common()->End(1), end_node));
-    if (FLAG_trace_turbo) {
+    if (v8_flags.trace_turbo) {
       SourcePositionTable table(graph());
       NodeOriginTable table2(graph());
       StdoutStream{} << AsJSON(*graph(), &table, &table2);
diff --git a/deps/v8/test/unittests/compiler/function-tester.cc b/deps/v8/test/unittests/compiler/function-tester.cc
index 1d8895d3d0c22a..d6951da6f70338 100644
--- a/deps/v8/test/unittests/compiler/function-tester.cc
+++ b/deps/v8/test/unittests/compiler/function-tester.cc
@@ -37,7 +37,7 @@ FunctionTester::FunctionTester(Isolate* isolate, const char* source,
                                uint32_t flags)
     : isolate(isolate),
       canonical(isolate),
-      function((FLAG_allow_natives_syntax = true, NewFunction(source))),
+      function((v8_flags.allow_natives_syntax = true, NewFunction(source))),
       flags_(flags) {
   Compile(function);
   const uint32_t supported_flags = OptimizedCompilationInfo::kInlining;
@@ -56,7 +56,7 @@ FunctionTester::FunctionTester(Isolate* isolate, Handle<Code> code,
                                int param_count)
     : isolate(isolate),
       canonical(isolate),
-      function((FLAG_allow_natives_syntax = true,
+      function((v8_flags.allow_natives_syntax = true,
                 NewFunction(BuildFunction(param_count).c_str()))),
       flags_(0) {
   CHECK(!code.is_null());
diff --git a/deps/v8/test/unittests/compiler/loop-peeling-unittest.cc b/deps/v8/test/unittests/compiler/loop-peeling-unittest.cc
index 4e3d238bcdd52d..160064439c778f 100644
--- a/deps/v8/test/unittests/compiler/loop-peeling-unittest.cc
+++ b/deps/v8/test/unittests/compiler/loop-peeling-unittest.cc
@@ -59,7 +59,7 @@ class LoopPeelingTest : public GraphTest {
   MachineOperatorBuilder* machine() { return &machine_; }
 
   LoopTree* GetLoopTree() {
-    if (FLAG_trace_turbo_graph) {
+    if (v8_flags.trace_turbo_graph) {
       StdoutStream{} << AsRPO(*graph());
     }
     Zone zone(isolate()->allocator(), ZONE_NAME);
@@ -79,7 +79,7 @@ class LoopPeelingTest : public GraphTest {
   PeeledIteration* Peel(LoopPeeler peeler, LoopTree::Loop* loop) {
     EXPECT_TRUE(peeler.CanPeel(loop));
     PeeledIteration* peeled = peeler.Peel(loop);
-    if (FLAG_trace_turbo_graph) {
+    if (v8_flags.trace_turbo_graph) {
       StdoutStream{} << AsRPO(*graph());
     }
     return peeled;
diff --git a/deps/v8/test/unittests/compiler/mips64/instruction-selector-mips64-unittest.cc b/deps/v8/test/unittests/compiler/mips64/instruction-selector-mips64-unittest.cc
index c24ad5b48e03aa..bb8698c91baadd 100644
--- a/deps/v8/test/unittests/compiler/mips64/instruction-selector-mips64-unittest.cc
+++ b/deps/v8/test/unittests/compiler/mips64/instruction-selector-mips64-unittest.cc
@@ -334,7 +334,7 @@ TEST_P(InstructionSelectorCmpTest, Parameter) {
   m.Return((m.*cmp.mi.constructor)(m.Parameter(0), m.Parameter(1)));
   Stream s = m.Build();
 
-  if (FLAG_debug_code &&
+  if (v8_flags.debug_code &&
       type.representation() == MachineRepresentation::kWord32) {
     ASSERT_EQ(6U, s.size());
 
@@ -1164,7 +1164,7 @@ TEST_P(InstructionSelectorElidedChangeUint32ToUint64Test, Parameter) {
       (m.*binop.constructor)(m.Parameter(0), m.Parameter(1))));
   Stream s = m.Build();
   // Make sure the `ChangeUint32ToUint64` node turned into a no-op.
-  if (FLAG_debug_code && binop.arch_opcode == kMips64Cmp) {
+  if (v8_flags.debug_code && binop.arch_opcode == kMips64Cmp) {
     ASSERT_EQ(6U, s.size());
     EXPECT_EQ(kMips64Cmp, s[0]->arch_opcode());
     EXPECT_EQ(kMips64Dshl, s[1]->arch_opcode());
diff --git a/deps/v8/test/unittests/compiler/regalloc/live-range-unittest.cc b/deps/v8/test/unittests/compiler/regalloc/live-range-unittest.cc
index b8fe329f697b19..d2785465caeb4c 100644
--- a/deps/v8/test/unittests/compiler/regalloc/live-range-unittest.cc
+++ b/deps/v8/test/unittests/compiler/regalloc/live-range-unittest.cc
@@ -56,13 +56,13 @@ class TestRangeBuilder {
       LifetimePosition start = LifetimePosition::FromInt(pair.first);
       LifetimePosition end = LifetimePosition::FromInt(pair.second);
       CHECK(start < end);
-      range->AddUseInterval(start, end, zone_, FLAG_trace_turbo_alloc);
+      range->AddUseInterval(start, end, zone_, v8_flags.trace_turbo_alloc);
     }
     for (int pos : uses_) {
       UsePosition* use_position =
           zone_->New<UsePosition>(LifetimePosition::FromInt(pos), nullptr,
                                   nullptr, UsePositionHintType::kNone);
-      range->AddUsePosition(use_position, FLAG_trace_turbo_alloc);
+      range->AddUsePosition(use_position, v8_flags.trace_turbo_alloc);
     }
 
     pairs_.clear();
@@ -117,10 +117,11 @@ TEST_F(LiveRangeUnitTest, InvalidConstruction) {
   // Build a range manually, because the builder guards against empty cases.
   TopLevelLiveRange* range =
       zone()->New<TopLevelLiveRange>(1, MachineRepresentation::kTagged);
-  V8_ASSERT_DEBUG_DEATH(range->AddUseInterval(LifetimePosition::FromInt(0),
-                                              LifetimePosition::FromInt(0),
-                                              zone(), FLAG_trace_turbo_alloc),
-                        ".*");
+  V8_ASSERT_DEBUG_DEATH(
+      range->AddUseInterval(LifetimePosition::FromInt(0),
+                            LifetimePosition::FromInt(0), zone(),
+                            v8_flags.trace_turbo_alloc),
+      ".*");
 }
 
 TEST_F(LiveRangeUnitTest, SplitInvalidStart) {
diff --git a/deps/v8/test/unittests/compiler/regalloc/mid-tier-register-allocator-unittest.cc b/deps/v8/test/unittests/compiler/regalloc/mid-tier-register-allocator-unittest.cc
index 4218f66180fc07..d879636e5208f9 100644
--- a/deps/v8/test/unittests/compiler/regalloc/mid-tier-register-allocator-unittest.cc
+++ b/deps/v8/test/unittests/compiler/regalloc/mid-tier-register-allocator-unittest.cc
@@ -400,7 +400,7 @@ TEST_F(MidTierRegisterAllocatorTest, SpillPhiDueToRegisterPressure) {
 }
 
 TEST_F(MidTierRegisterAllocatorTest, MoveLotsOfConstants) {
-  FLAG_trace_turbo = true;
+  v8_flags.trace_turbo = true;
   StartBlock();
   VReg constants[Register::kNumRegisters];
   for (size_t i = 0; i < arraysize(constants); ++i) {
@@ -816,7 +816,7 @@ class MidTierRegAllocSlotConstraintTest
 }  // namespace
 
 TEST_P(MidTierRegAllocSlotConstraintTest, SlotConstraint) {
-  FLAG_trace_turbo = true;
+  v8_flags.trace_turbo = true;
   StartBlock();
   VReg p_0;
   switch (parameter_type()) {
diff --git a/deps/v8/test/unittests/compiler/regalloc/move-optimizer-unittest.cc b/deps/v8/test/unittests/compiler/regalloc/move-optimizer-unittest.cc
index 4a26bbc715d429..709ec6601b9aea 100644
--- a/deps/v8/test/unittests/compiler/regalloc/move-optimizer-unittest.cc
+++ b/deps/v8/test/unittests/compiler/regalloc/move-optimizer-unittest.cc
@@ -52,14 +52,14 @@ class MoveOptimizerTest : public InstructionSequenceTest {
   // TODO(dcarney): add a verifier.
   void Optimize() {
     WireBlocks();
-    if (FLAG_trace_turbo) {
+    if (v8_flags.trace_turbo) {
       StdoutStream{}
           << "----- Instruction sequence before move optimization -----\n"
           << *sequence();
     }
     MoveOptimizer move_optimizer(zone(), sequence());
     move_optimizer.Run();
-    if (FLAG_trace_turbo) {
+    if (v8_flags.trace_turbo) {
       StdoutStream{}
           << "----- Instruction sequence after move optimization -----\n"
           << *sequence();
diff --git a/deps/v8/test/unittests/compiler/riscv32/instruction-selector-riscv32-unittest.cc b/deps/v8/test/unittests/compiler/riscv32/instruction-selector-riscv32-unittest.cc
index 0c7b6478fd9cd9..f9380ce8cc64e2 100644
--- a/deps/v8/test/unittests/compiler/riscv32/instruction-selector-riscv32-unittest.cc
+++ b/deps/v8/test/unittests/compiler/riscv32/instruction-selector-riscv32-unittest.cc
@@ -264,7 +264,7 @@ TEST_P(InstructionSelectorCmpTest, Parameter) {
   m.Return((m.*cmp.mi.constructor)(m.Parameter(0), m.Parameter(1)));
   Stream s = m.Build();
 
-  if (FLAG_debug_code &&
+  if (v8_flags.debug_code &&
       type.representation() == MachineRepresentation::kWord32) {
     ASSERT_EQ(1U, s.size());
 
diff --git a/deps/v8/test/unittests/compiler/riscv64/instruction-selector-riscv64-unittest.cc b/deps/v8/test/unittests/compiler/riscv64/instruction-selector-riscv64-unittest.cc
index b56149b604fcc4..8458e4e7d560b8 100644
--- a/deps/v8/test/unittests/compiler/riscv64/instruction-selector-riscv64-unittest.cc
+++ b/deps/v8/test/unittests/compiler/riscv64/instruction-selector-riscv64-unittest.cc
@@ -313,7 +313,7 @@ TEST_P(InstructionSelectorCmpTest, Parameter) {
   m.Return((m.*cmp.mi.constructor)(m.Parameter(0), m.Parameter(1)));
   Stream s = m.Build();
 
-  if (FLAG_debug_code &&
+  if (v8_flags.debug_code &&
       type.representation() == MachineRepresentation::kWord32) {
 #ifndef V8_COMPRESS_POINTERS
     ASSERT_EQ(6U, s.size());
diff --git a/deps/v8/test/cctest/compiler/test-run-bytecode-graph-builder.cc b/deps/v8/test/unittests/compiler/run-bytecode-graph-builder-unittest.cc
similarity index 76%
rename from deps/v8/test/cctest/compiler/test-run-bytecode-graph-builder.cc
rename to deps/v8/test/unittests/compiler/run-bytecode-graph-builder-unittest.cc
index eb970693b98d7d..8b3befc48c85b9 100644
--- a/deps/v8/test/cctest/compiler/test-run-bytecode-graph-builder.cc
+++ b/deps/v8/test/unittests/compiler/run-bytecode-graph-builder-unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 the V8 project authors. All rights reserved.
+// Copyright 2022 the V8 project authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -15,20 +15,20 @@
 #include "src/interpreter/interpreter.h"
 #include "src/objects/objects-inl.h"
 #include "src/parsing/parse-info.h"
-#include "test/cctest/cctest.h"
+#include "test/unittests/test-utils.h"
 
 namespace v8 {
 namespace internal {
 namespace compiler {
 
-#define SHARD_TEST_BY_2(x)    \
-  TEST(x##_0) { Test##x(0); } \
-  TEST(x##_1) { Test##x(1); }
-#define SHARD_TEST_BY_4(x)    \
-  TEST(x##_0) { Test##x(0); } \
-  TEST(x##_1) { Test##x(1); } \
-  TEST(x##_2) { Test##x(2); } \
-  TEST(x##_3) { Test##x(3); }
+#define SHARD_TEST_BY_2(x)                                   \
+  TEST_F(RunBytecodeGraphBuilderTest, x##_0) { Test##x(0); } \
+  TEST_F(RunBytecodeGraphBuilderTest, x##_1) { Test##x(1); }
+#define SHARD_TEST_BY_4(x)                                   \
+  TEST_F(RunBytecodeGraphBuilderTest, x##_0) { Test##x(0); } \
+  TEST_F(RunBytecodeGraphBuilderTest, x##_1) { Test##x(1); } \
+  TEST_F(RunBytecodeGraphBuilderTest, x##_2) { Test##x(2); } \
+  TEST_F(RunBytecodeGraphBuilderTest, x##_3) { Test##x(3); }
 
 static const char kFunctionName[] = "f";
 
@@ -56,6 +56,22 @@ static MaybeHandle<Object> CallFunction(Isolate* isolate,
                          argv);
 }
 
+static v8::Local<v8::Value> CompileRun(v8::Isolate* isolate,
+                                       const char* source) {
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Script> script =
+      v8::Script::Compile(
+          context, v8::String::NewFromUtf8(isolate, source).ToLocalChecked())
+          .ToLocalChecked();
+
+  v8::Local<v8::Value> result;
+  if (script->Run(context).ToLocal(&result)) {
+    return result;
+  } else {
+    return v8::Local<v8::Value>();
+  }
+}
+
 template <class... A>
 class BytecodeGraphCallable {
  public:
@@ -77,8 +93,8 @@ class BytecodeGraphTester {
   BytecodeGraphTester(Isolate* isolate, const char* script,
                       const char* filter = kFunctionName)
       : isolate_(isolate), script_(script) {
-    i::FLAG_always_turbofan = false;
-    i::FLAG_allow_natives_syntax = true;
+    i::v8_flags.always_turbofan = false;
+    i::v8_flags.allow_natives_syntax = true;
   }
   virtual ~BytecodeGraphTester() = default;
   BytecodeGraphTester(const BytecodeGraphTester&) = delete;
@@ -102,19 +118,20 @@ class BytecodeGraphTester {
     return try_catch.Message();
   }
 
-  static Handle<Object> NewObject(const char* script) {
-    return v8::Utils::OpenHandle(*CompileRun(script));
-  }
-
  private:
   Isolate* isolate_;
   const char* script_;
 
   Handle<JSFunction> GetFunction(const char* functionName) {
-    CompileRun(script_);
+    v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate_);
+    v8::Local<v8::Context> context = v8_isolate->GetCurrentContext();
+
+    CompileRun(v8_isolate, script_);
+
     Local<Function> api_function = Local<Function>::Cast(
-        CcTest::global()
-            ->Get(CcTest::isolate()->GetCurrentContext(), v8_str(functionName))
+        context->Global()
+            ->Get(context, v8::String::NewFromUtf8(v8_isolate, functionName)
+                               .ToLocalChecked())
             .ToLocalChecked());
     Handle<JSFunction> function =
         Handle<JSFunction>::cast(v8::Utils::OpenHandle(*api_function));
@@ -185,9 +202,183 @@ struct ExpectedSnippet {
   }
 };
 
-TEST(BytecodeGraphBuilderReturnStatements) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+class RunBytecodeGraphBuilderTest : public TestWithNativeContext {
+ public:
+  void TestBytecodeGraphBuilderNamedStore(size_t shard) {
+    Factory* factory = i_isolate()->factory();
+
+    ExpectedSnippet<1> snippets[] = {
+        {"return p1.val = 20;",
+         {factory->NewNumberFromInt(20), RunJS("({val : 10})")}},
+        {"p1.type = 'int'; return p1.type;",
+         {MakeString("int"), RunJS("({val : 10})")}},
+        {"p1.name = 'def'; return p1[\"name\"];",
+         {MakeString("def"), RunJS("({name : 'abc'})")}},
+        {"'use strict'; p1.val = 20; return p1.val;",
+         {factory->NewNumberFromInt(20), RunJS("({val : 10 })")}},
+        {"'use strict'; return p1.type = 'int';",
+         {MakeString("int"), RunJS("({val : 10})")}},
+        {"'use strict'; p1.val = 20; return p1[\"val\"];",
+         {factory->NewNumberFromInt(20), RunJS("({val : 10, name : 'abc'})")}},
+        {"var b = 'abc';\n" REPEAT_127(
+             SPACE, " p1.name = b; ") " p1.name = 'def'; return p1.name;\n",
+         {MakeString("def"), RunJS("({name : 'abc'})")}},
+        {"'use strict'; var b = 'def';\n" REPEAT_127(
+             SPACE, " p1.name = 'abc'; ") "p1.name = b; return p1.name;\n",
+         {MakeString("def"), RunJS("({ name : 'abc'})")}},
+    };
+
+    for (size_t i = 0; i < arraysize(snippets); i++) {
+      if ((i % 2) != shard) continue;
+      base::ScopedVector<char> script(3072);
+      SNPrintF(script, "function %s(p1) { %s };\n%s({});", kFunctionName,
+               snippets[i].code_snippet, kFunctionName);
+
+      BytecodeGraphTester tester(i_isolate(), script.begin());
+      auto callable = tester.GetCallable<Handle<Object>>();
+      Handle<Object> return_value =
+          callable(snippets[i].parameter(0)).ToHandleChecked();
+      CHECK(return_value->SameValue(*snippets[i].return_value()));
+    }
+  }
+
+  void TestBytecodeGraphBuilderKeyedStore(size_t shard) {
+    Isolate* isolate = i_isolate();
+    Factory* factory = isolate->factory();
+
+    ExpectedSnippet<2> snippets[] = {
+        {"p1[p2] = 20; return p1[p2];",
+         {factory->NewNumberFromInt(20), RunJS("({val : 10})"),
+          MakeString("val")}},
+        {"return p1[100] = 'def';",
+         {MakeString("def"), RunJS("({100 : 'abc'})"),
+          factory->NewNumberFromInt(0)}},
+        {"var b = 100; p1[b] = 'def'; return p1[b];",
+         {MakeString("def"), RunJS("({100 : 'abc'})"),
+          factory->NewNumberFromInt(0)}},
+        {"'use strict'; p1[p2] = 20; return p1[p2];",
+         {factory->NewNumberFromInt(20), RunJS("({val : 10 })"),
+          MakeString("val")}},
+        {"'use strict'; return p1[100] = 20;",
+         {factory->NewNumberFromInt(20), RunJS("({100 : 10})"),
+          factory->NewNumberFromInt(0)}},
+        {"'use strict'; var b = p2; p1[b] = 'def'; return p1[b];",
+         {MakeString("def"), RunJS("({100 : 'abc'})"),
+          factory->NewNumberFromInt(100)}},
+        {"var b;\n" REPEAT_127(
+             SPACE, " b = p1[p2]; ") " p1[p2] = 'def'; return p1[p2];\n",
+         {MakeString("def"), RunJS("({100 : 'abc'})"),
+          factory->NewNumberFromInt(100)}},
+        {"'use strict'; var b;\n" REPEAT_127(
+             SPACE, " b = p1[p2]; ") " p1[p2] = 'def'; return p1[p2];\n",
+         {MakeString("def"), RunJS("({ 100 : 'abc'})"),
+          factory->NewNumberFromInt(100)}},
+    };
+
+    for (size_t i = 0; i < arraysize(snippets); i++) {
+      if ((i % 2) != shard) continue;
+      base::ScopedVector<char> script(2048);
+      SNPrintF(script, "function %s(p1, p2) { %s };\n%s({});", kFunctionName,
+               snippets[i].code_snippet, kFunctionName);
+
+      BytecodeGraphTester tester(isolate, script.begin());
+      auto callable = tester.GetCallable<Handle<Object>>();
+      Handle<Object> return_value =
+          callable(snippets[i].parameter(0)).ToHandleChecked();
+      CHECK(return_value->SameValue(*snippets[i].return_value()));
+    }
+  }
+
+  void TestBytecodeGraphBuilderGlobals(size_t shard) {
+    Isolate* isolate = i_isolate();
+    Factory* factory = isolate->factory();
+
+    ExpectedSnippet<0> snippets[] = {
+        {"var global = 321;\n function f() { return global; };\n f();",
+         {factory->NewNumberFromInt(321)}},
+        {"var global = 321;\n"
+         "function f() { global = 123; return global };\n f();",
+         {factory->NewNumberFromInt(123)}},
+        {"var global = function() { return 'abc'};\n"
+         "function f() { return global(); };\n f();",
+         {MakeString("abc")}},
+        {"var global = 456;\n"
+         "function f() { 'use strict'; return global; };\n f();",
+         {factory->NewNumberFromInt(456)}},
+        {"var global = 987;\n"
+         "function f() { 'use strict'; global = 789; return global };\n f();",
+         {factory->NewNumberFromInt(789)}},
+        {"var global = function() { return 'xyz'};\n"
+         "function f() { 'use strict'; return global(); };\n f();",
+         {MakeString("xyz")}},
+        {"var global = 'abc'; var global_obj = {val:123};\n"
+         "function f() {\n" REPEAT_127(
+             SPACE, " var b = global_obj.name;\n") "return global; };\n f();\n",
+         {MakeString("abc")}},
+        {"var global = 'abc'; var global_obj = {val:123};\n"
+         "function f() { 'use strict';\n" REPEAT_127(
+             SPACE, " var b = global_obj.name;\n") "global = 'xyz'; return "
+                                                   "global };\n f();\n",
+         {MakeString("xyz")}},
+        {"function f() { return typeof(undeclared_var); }\n; f();\n",
+         {MakeString("undefined")}},
+        {"var defined_var = 10; function f() { return typeof(defined_var); "
+         "}\n; "
+         "f();\n",
+         {MakeString("number")}},
+    };
+
+    for (size_t i = 0; i < arraysize(snippets); i++) {
+      if ((i % 2) != shard) continue;
+      BytecodeGraphTester tester(isolate, snippets[i].code_snippet);
+      auto callable = tester.GetCallable<>();
+      Handle<Object> return_value = callable().ToHandleChecked();
+      CHECK(return_value->SameValue(*snippets[i].return_value()));
+    }
+  }
+
+  void TestJumpWithConstantsAndWideConstants(size_t shard) {
+    const int kStep = 46;
+    int start = static_cast<int>(7 + 17 * shard);
+    for (int constants = start; constants < 300; constants += kStep) {
+      std::stringstream filler_os;
+      // Generate a string that consumes constant pool entries and
+      // spread out branch distances in script below.
+      for (int i = 0; i < constants; i++) {
+        filler_os << "var x_ = 'x_" << i << "';\n";
+      }
+      std::string filler(filler_os.str());
+
+      std::stringstream script_os;
+      script_os << "function " << kFunctionName << "(a) {\n";
+      script_os << "  " << filler;
+      script_os << "  for (var i = a; i < 2; i++) {\n";
+      script_os << "  " << filler;
+      script_os << "    if (i == 0) { " << filler << "i = 10; continue; }\n";
+      script_os << "    else if (i == a) { " << filler << "i = 12; break; }\n";
+      script_os << "    else { " << filler << " }\n";
+      script_os << "  }\n";
+      script_os << "  return i;\n";
+      script_os << "}\n";
+      script_os << kFunctionName << "(0);\n";
+      std::string script(script_os.str());
+
+      Isolate* isolate = i_isolate();
+      Factory* factory = isolate->factory();
+      BytecodeGraphTester tester(isolate, script.c_str());
+      auto callable = tester.GetCallable<Handle<Object>>();
+      for (int a = 0; a < 3; a++) {
+        Handle<Object> return_val =
+            callable(factory->NewNumberFromInt(a)).ToHandleChecked();
+        static const int results[] = {11, 12, 2};
+        CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]);
+      }
+    }
+  }
+};
+
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderReturnStatements) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -203,8 +394,8 @@ TEST(BytecodeGraphBuilderReturnStatements) {
       {"return 0.001;", {factory->NewNumber(0.001)}},
       {"return 3.7e-60;", {factory->NewNumber(3.7e-60)}},
       {"return -3.7e60;", {factory->NewNumber(-3.7e60)}},
-      {"return '';", {factory->NewStringFromStaticChars("")}},
-      {"return 'catfood';", {factory->NewStringFromStaticChars("catfood")}},
+      {"return '';", {MakeString("")}},
+      {"return 'catfood';", {MakeString("catfood")}},
       {"return NaN;", {factory->nan_value()}}};
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -219,9 +410,8 @@ TEST(BytecodeGraphBuilderReturnStatements) {
   }
 }
 
-TEST(BytecodeGraphBuilderPrimitiveExpressions) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderPrimitiveExpressions) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -244,9 +434,8 @@ TEST(BytecodeGraphBuilderPrimitiveExpressions) {
   }
 }
 
-TEST(BytecodeGraphBuilderTwoParameterTests) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderTwoParameterTests) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<2> snippets[] = {
@@ -284,9 +473,7 @@ TEST(BytecodeGraphBuilderTwoParameterTests) {
         factory->NewHeapNumber(4)}},
       // Strings
       {"return p1 + p2;",
-       {factory->NewStringFromStaticChars("abcdef"),
-        factory->NewStringFromStaticChars("abc"),
-        factory->NewStringFromStaticChars("def")}}};
+       {MakeString("abcdef"), MakeString("abc"), MakeString("def")}}};
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
     base::ScopedVector<char> script(1024);
@@ -302,33 +489,23 @@ TEST(BytecodeGraphBuilderTwoParameterTests) {
   }
 }
 
-
-TEST(BytecodeGraphBuilderNamedLoad) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderNamedLoad) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
       {"return p1.val;",
-       {factory->NewNumberFromInt(10),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
-      {"return p1[\"name\"];",
-       {factory->NewStringFromStaticChars("abc"),
-        BytecodeGraphTester::NewObject("({name : 'abc'})")}},
+       {factory->NewNumberFromInt(10), RunJS("({val : 10})")}},
+      {"return p1[\"name\"];", {MakeString("abc"), RunJS("({name : 'abc'})")}},
       {"'use strict'; return p1.val;",
-       {factory->NewNumberFromInt(10),
-        BytecodeGraphTester::NewObject("({val : 10 })")}},
+       {factory->NewNumberFromInt(10), RunJS("({val : 10 })")}},
       {"'use strict'; return p1[\"val\"];",
-       {factory->NewNumberFromInt(10),
-        BytecodeGraphTester::NewObject("({val : 10, name : 'abc'})")}},
+       {factory->NewNumberFromInt(10), RunJS("({val : 10, name : 'abc'})")}},
       {"var b;\n" REPEAT_127(SPACE, " b = p1.name; ") " return p1.name;\n",
-       {factory->NewStringFromStaticChars("abc"),
-        BytecodeGraphTester::NewObject("({name : 'abc'})")}},
-      {"'use strict'; var b;\n"
-       REPEAT_127(SPACE, " b = p1.name; ")
-       "return p1.name;\n",
-       {factory->NewStringFromStaticChars("abc"),
-        BytecodeGraphTester::NewObject("({ name : 'abc'})")}},
+       {MakeString("abc"), RunJS("({name : 'abc'})")}},
+      {"'use strict'; var b;\n" REPEAT_127(
+           SPACE, " b = p1.name; ") "return p1.name;\n",
+       {MakeString("abc"), RunJS("({ name : 'abc'})")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -344,44 +521,35 @@ TEST(BytecodeGraphBuilderNamedLoad) {
   }
 }
 
-TEST(BytecodeGraphBuilderKeyedLoad) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderKeyedLoad) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<2> snippets[] = {
       {"return p1[p2];",
-       {factory->NewNumberFromInt(10),
-        BytecodeGraphTester::NewObject("({val : 10})"),
-        factory->NewStringFromStaticChars("val")}},
+       {factory->NewNumberFromInt(10), RunJS("({val : 10})"),
+        MakeString("val")}},
       {"return p1[100];",
-       {factory->NewStringFromStaticChars("abc"),
-        BytecodeGraphTester::NewObject("({100 : 'abc'})"),
+       {MakeString("abc"), RunJS("({100 : 'abc'})"),
         factory->NewNumberFromInt(0)}},
       {"var b = 100; return p1[b];",
-       {factory->NewStringFromStaticChars("abc"),
-        BytecodeGraphTester::NewObject("({100 : 'abc'})"),
+       {MakeString("abc"), RunJS("({100 : 'abc'})"),
         factory->NewNumberFromInt(0)}},
       {"'use strict'; return p1[p2];",
-       {factory->NewNumberFromInt(10),
-        BytecodeGraphTester::NewObject("({val : 10 })"),
-        factory->NewStringFromStaticChars("val")}},
+       {factory->NewNumberFromInt(10), RunJS("({val : 10 })"),
+        MakeString("val")}},
       {"'use strict'; return p1[100];",
-       {factory->NewNumberFromInt(10),
-        BytecodeGraphTester::NewObject("({100 : 10})"),
+       {factory->NewNumberFromInt(10), RunJS("({100 : 10})"),
         factory->NewNumberFromInt(0)}},
       {"'use strict'; var b = p2; return p1[b];",
-       {factory->NewStringFromStaticChars("abc"),
-        BytecodeGraphTester::NewObject("({100 : 'abc'})"),
+       {MakeString("abc"), RunJS("({100 : 'abc'})"),
         factory->NewNumberFromInt(100)}},
       {"var b;\n" REPEAT_127(SPACE, " b = p1[p2]; ") " return p1[p2];\n",
-       {factory->NewStringFromStaticChars("abc"),
-        BytecodeGraphTester::NewObject("({100 : 'abc'})"),
+       {MakeString("abc"), RunJS("({100 : 'abc'})"),
         factory->NewNumberFromInt(100)}},
       {"'use strict'; var b;\n" REPEAT_127(SPACE,
                                            " b = p1[p2]; ") "return p1[p2];\n",
-       {factory->NewStringFromStaticChars("abc"),
-        BytecodeGraphTester::NewObject("({ 100 : 'abc'})"),
+       {MakeString("abc"), RunJS("({ 100 : 'abc'})"),
         factory->NewNumberFromInt(100)}},
   };
 
@@ -399,131 +567,23 @@ TEST(BytecodeGraphBuilderKeyedLoad) {
   }
 }
 
-void TestBytecodeGraphBuilderNamedStore(size_t shard) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
-  Factory* factory = isolate->factory();
-
-  ExpectedSnippet<1> snippets[] = {
-      {"return p1.val = 20;",
-       {factory->NewNumberFromInt(20),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
-      {"p1.type = 'int'; return p1.type;",
-       {factory->NewStringFromStaticChars("int"),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
-      {"p1.name = 'def'; return p1[\"name\"];",
-       {factory->NewStringFromStaticChars("def"),
-        BytecodeGraphTester::NewObject("({name : 'abc'})")}},
-      {"'use strict'; p1.val = 20; return p1.val;",
-       {factory->NewNumberFromInt(20),
-        BytecodeGraphTester::NewObject("({val : 10 })")}},
-      {"'use strict'; return p1.type = 'int';",
-       {factory->NewStringFromStaticChars("int"),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
-      {"'use strict'; p1.val = 20; return p1[\"val\"];",
-       {factory->NewNumberFromInt(20),
-        BytecodeGraphTester::NewObject("({val : 10, name : 'abc'})")}},
-      {"var b = 'abc';\n" REPEAT_127(
-           SPACE, " p1.name = b; ") " p1.name = 'def'; return p1.name;\n",
-       {factory->NewStringFromStaticChars("def"),
-        BytecodeGraphTester::NewObject("({name : 'abc'})")}},
-      {"'use strict'; var b = 'def';\n" REPEAT_127(
-           SPACE, " p1.name = 'abc'; ") "p1.name = b; return p1.name;\n",
-       {factory->NewStringFromStaticChars("def"),
-        BytecodeGraphTester::NewObject("({ name : 'abc'})")}},
-  };
-
-  for (size_t i = 0; i < arraysize(snippets); i++) {
-    if ((i % 2) != shard) continue;
-    base::ScopedVector<char> script(3072);
-    SNPrintF(script, "function %s(p1) { %s };\n%s({});", kFunctionName,
-             snippets[i].code_snippet, kFunctionName);
-
-    BytecodeGraphTester tester(isolate, script.begin());
-    auto callable = tester.GetCallable<Handle<Object>>();
-    Handle<Object> return_value =
-        callable(snippets[i].parameter(0)).ToHandleChecked();
-    CHECK(return_value->SameValue(*snippets[i].return_value()));
-  }
-}
-
 SHARD_TEST_BY_2(BytecodeGraphBuilderNamedStore)
 
-void TestBytecodeGraphBuilderKeyedStore(size_t shard) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
-  Factory* factory = isolate->factory();
-
-  ExpectedSnippet<2> snippets[] = {
-      {"p1[p2] = 20; return p1[p2];",
-       {factory->NewNumberFromInt(20),
-        BytecodeGraphTester::NewObject("({val : 10})"),
-        factory->NewStringFromStaticChars("val")}},
-      {"return p1[100] = 'def';",
-       {factory->NewStringFromStaticChars("def"),
-        BytecodeGraphTester::NewObject("({100 : 'abc'})"),
-        factory->NewNumberFromInt(0)}},
-      {"var b = 100; p1[b] = 'def'; return p1[b];",
-       {factory->NewStringFromStaticChars("def"),
-        BytecodeGraphTester::NewObject("({100 : 'abc'})"),
-        factory->NewNumberFromInt(0)}},
-      {"'use strict'; p1[p2] = 20; return p1[p2];",
-       {factory->NewNumberFromInt(20),
-        BytecodeGraphTester::NewObject("({val : 10 })"),
-        factory->NewStringFromStaticChars("val")}},
-      {"'use strict'; return p1[100] = 20;",
-       {factory->NewNumberFromInt(20),
-        BytecodeGraphTester::NewObject("({100 : 10})"),
-        factory->NewNumberFromInt(0)}},
-      {"'use strict'; var b = p2; p1[b] = 'def'; return p1[b];",
-       {factory->NewStringFromStaticChars("def"),
-        BytecodeGraphTester::NewObject("({100 : 'abc'})"),
-        factory->NewNumberFromInt(100)}},
-      {"var b;\n" REPEAT_127(
-           SPACE, " b = p1[p2]; ") " p1[p2] = 'def'; return p1[p2];\n",
-       {factory->NewStringFromStaticChars("def"),
-        BytecodeGraphTester::NewObject("({100 : 'abc'})"),
-        factory->NewNumberFromInt(100)}},
-      {"'use strict'; var b;\n" REPEAT_127(
-           SPACE, " b = p1[p2]; ") " p1[p2] = 'def'; return p1[p2];\n",
-       {factory->NewStringFromStaticChars("def"),
-        BytecodeGraphTester::NewObject("({ 100 : 'abc'})"),
-        factory->NewNumberFromInt(100)}},
-  };
-
-  for (size_t i = 0; i < arraysize(snippets); i++) {
-    if ((i % 2) != shard) continue;
-    base::ScopedVector<char> script(2048);
-    SNPrintF(script, "function %s(p1, p2) { %s };\n%s({});", kFunctionName,
-             snippets[i].code_snippet, kFunctionName);
-
-    BytecodeGraphTester tester(isolate, script.begin());
-    auto callable = tester.GetCallable<Handle<Object>>();
-    Handle<Object> return_value =
-        callable(snippets[i].parameter(0)).ToHandleChecked();
-    CHECK(return_value->SameValue(*snippets[i].return_value()));
-  }
-}
-
 SHARD_TEST_BY_2(BytecodeGraphBuilderKeyedStore)
 
-TEST(BytecodeGraphBuilderPropertyCall) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderPropertyCall) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
       {"return p1.func();",
-       {factory->NewNumberFromInt(25),
-        BytecodeGraphTester::NewObject("({func() { return 25; }})")}},
+       {factory->NewNumberFromInt(25), RunJS("({func() { return 25; }})")}},
       {"return p1.func('abc');",
-       {factory->NewStringFromStaticChars("abc"),
-        BytecodeGraphTester::NewObject("({func(a) { return a; }})")}},
+       {MakeString("abc"), RunJS("({func(a) { return a; }})")}},
       {"return p1.func(1, 2, 3, 4, 5, 6, 7, 8);",
        {factory->NewNumberFromInt(36),
-        BytecodeGraphTester::NewObject(
-            "({func(a, b, c, d, e, f, g, h) {\n"
-            "  return a + b + c + d + e + f + g + h;}})")}},
+        RunJS("({func(a, b, c, d, e, f, g, h) {\n"
+              "  return a + b + c + d + e + f + g + h;}})")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -539,9 +599,8 @@ TEST(BytecodeGraphBuilderPropertyCall) {
   }
 }
 
-TEST(BytecodeGraphBuilderCallNew) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderCallNew) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -575,9 +634,8 @@ TEST(BytecodeGraphBuilderCallNew) {
   }
 }
 
-TEST(BytecodeGraphBuilderCreateClosure) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderCreateClosure) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -611,16 +669,15 @@ TEST(BytecodeGraphBuilderCreateClosure) {
   }
 }
 
-TEST(BytecodeGraphBuilderCallRuntime) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderCallRuntime) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
       {"function f(arg0) { return %MaxSmi(); }\nf()",
        {factory->NewNumberFromInt(Smi::kMaxValue), factory->undefined_value()}},
       {"function f(arg0) { return %IsArray(arg0) }\nf(undefined)",
-       {factory->true_value(), BytecodeGraphTester::NewObject("[1, 2, 3]")}},
+       {factory->true_value(), RunJS("[1, 2, 3]")}},
       {"function f(arg0) { return %Add(arg0, 2) }\nf(1)",
        {factory->NewNumberFromInt(5), factory->NewNumberFromInt(3)}},
   };
@@ -634,63 +691,14 @@ TEST(BytecodeGraphBuilderCallRuntime) {
   }
 }
 
-void TestBytecodeGraphBuilderGlobals(size_t shard) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
-  Factory* factory = isolate->factory();
-
-  ExpectedSnippet<0> snippets[] = {
-      {"var global = 321;\n function f() { return global; };\n f();",
-       {factory->NewNumberFromInt(321)}},
-      {"var global = 321;\n"
-       "function f() { global = 123; return global };\n f();",
-       {factory->NewNumberFromInt(123)}},
-      {"var global = function() { return 'abc'};\n"
-       "function f() { return global(); };\n f();",
-       {factory->NewStringFromStaticChars("abc")}},
-      {"var global = 456;\n"
-       "function f() { 'use strict'; return global; };\n f();",
-       {factory->NewNumberFromInt(456)}},
-      {"var global = 987;\n"
-       "function f() { 'use strict'; global = 789; return global };\n f();",
-       {factory->NewNumberFromInt(789)}},
-      {"var global = function() { return 'xyz'};\n"
-       "function f() { 'use strict'; return global(); };\n f();",
-       {factory->NewStringFromStaticChars("xyz")}},
-      {"var global = 'abc'; var global_obj = {val:123};\n"
-       "function f() {\n" REPEAT_127(
-           SPACE, " var b = global_obj.name;\n") "return global; };\n f();\n",
-       {factory->NewStringFromStaticChars("abc")}},
-      {"var global = 'abc'; var global_obj = {val:123};\n"
-       "function f() { 'use strict';\n" REPEAT_127(
-           SPACE, " var b = global_obj.name;\n") "global = 'xyz'; return "
-                                                 "global };\n f();\n",
-       {factory->NewStringFromStaticChars("xyz")}},
-      {"function f() { return typeof(undeclared_var); }\n; f();\n",
-       {factory->NewStringFromStaticChars("undefined")}},
-      {"var defined_var = 10; function f() { return typeof(defined_var); }\n; "
-       "f();\n",
-       {factory->NewStringFromStaticChars("number")}},
-  };
-
-  for (size_t i = 0; i < arraysize(snippets); i++) {
-    if ((i % 2) != shard) continue;
-    BytecodeGraphTester tester(isolate, snippets[i].code_snippet);
-    auto callable = tester.GetCallable<>();
-    Handle<Object> return_value = callable().ToHandleChecked();
-    CHECK(return_value->SameValue(*snippets[i].return_value()));
-  }
-}
-
 SHARD_TEST_BY_2(BytecodeGraphBuilderGlobals)
 
-TEST(BytecodeGraphBuilderToObject) {
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderToObject) {
   // TODO(mythria): tests for ToObject. Needs ForIn.
 }
 
-TEST(BytecodeGraphBuilderToName) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderToName) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -730,21 +738,17 @@ TEST(BytecodeGraphBuilderToName) {
   }
 }
 
-TEST(BytecodeGraphBuilderLogicalNot) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderLogicalNot) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
-      {"return !p1;",
-       {factory->false_value(),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
+      {"return !p1;", {factory->false_value(), RunJS("({val : 10})")}},
       {"return !p1;", {factory->true_value(), factory->NewNumberFromInt(0)}},
       {"return !p1;", {factory->true_value(), factory->undefined_value()}},
       {"return !p1;", {factory->false_value(), factory->NewNumberFromInt(10)}},
       {"return !p1;", {factory->false_value(), factory->true_value()}},
-      {"return !p1;",
-       {factory->false_value(), factory->NewStringFromStaticChars("abc")}},
+      {"return !p1;", {factory->false_value(), MakeString("abc")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -760,26 +764,18 @@ TEST(BytecodeGraphBuilderLogicalNot) {
   }
 }
 
-TEST(BytecodeGraphBuilderTypeOf) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderTypeOf) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
+      {"return typeof p1;", {MakeString("object"), RunJS("({val : 10})")}},
       {"return typeof p1;",
-       {factory->NewStringFromStaticChars("object"),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
-      {"return typeof p1;",
-       {factory->NewStringFromStaticChars("undefined"),
-        factory->undefined_value()}},
-      {"return typeof p1;",
-       {factory->NewStringFromStaticChars("number"),
-        factory->NewNumberFromInt(10)}},
-      {"return typeof p1;",
-       {factory->NewStringFromStaticChars("boolean"), factory->true_value()}},
+       {MakeString("undefined"), factory->undefined_value()}},
       {"return typeof p1;",
-       {factory->NewStringFromStaticChars("string"),
-        factory->NewStringFromStaticChars("abc")}},
+       {MakeString("number"), factory->NewNumberFromInt(10)}},
+      {"return typeof p1;", {MakeString("boolean"), factory->true_value()}},
+      {"return typeof p1;", {MakeString("string"), MakeString("abc")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -795,9 +791,8 @@ TEST(BytecodeGraphBuilderTypeOf) {
   }
 }
 
-TEST(BytecodeGraphBuilderCompareTypeOf) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderCompareTypeOf) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
@@ -806,7 +801,7 @@ TEST(BytecodeGraphBuilderCompareTypeOf) {
       {"return typeof p1 === 'string';",
        {factory->false_value(), factory->NewNumber(1.1)}},
       {"return typeof p1 === 'string';",
-       {factory->true_value(), factory->NewStringFromStaticChars("string")}},
+       {factory->true_value(), MakeString("string")}},
       {"return typeof p1 === 'string';",
        {factory->false_value(), factory->undefined_value()}},
       {"return typeof p1 === 'undefined';",
@@ -814,14 +809,13 @@ TEST(BytecodeGraphBuilderCompareTypeOf) {
       {"return typeof p1 === 'object';",
        {factory->true_value(), factory->null_value()}},
       {"return typeof p1 === 'object';",
-       {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}},
+       {factory->true_value(), RunJS("({val : 10})")}},
       {"return typeof p1 === 'function';",
-       {factory->false_value(),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
+       {factory->false_value(), RunJS("({val : 10})")}},
       {"return typeof p1 === 'symbol';",
        {factory->true_value(), factory->NewSymbol()}},
       {"return typeof p1 === 'symbol';",
-       {factory->false_value(), factory->NewStringFromStaticChars("string")}},
+       {factory->false_value(), MakeString("string")}},
       {"return typeof p1 === 'other';",
        {factory->false_value(), factory->NewNumber(1.1)}},
   };
@@ -839,9 +833,8 @@ TEST(BytecodeGraphBuilderCompareTypeOf) {
   }
 }
 
-TEST(BytecodeGraphBuilderCountOperation) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderCountOperation) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
@@ -862,20 +855,15 @@ TEST(BytecodeGraphBuilderCountOperation) {
       {"return 20 + --p1;",
        {factory->NewNumberFromInt(29), factory->NewNumberFromInt(10)}},
       {"return p1.val--;",
-       {factory->NewNumberFromInt(10),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
+       {factory->NewNumberFromInt(10), RunJS("({val : 10})")}},
       {"return ++p1['val'];",
-       {factory->NewNumberFromInt(11),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
-      {"return ++p1[1];",
-       {factory->NewNumberFromInt(11),
-        BytecodeGraphTester::NewObject("({1 : 10})")}},
+       {factory->NewNumberFromInt(11), RunJS("({val : 10})")}},
+      {"return ++p1[1];", {factory->NewNumberFromInt(11), RunJS("({1 : 10})")}},
       {" function inner() { return p1 } return --p1;",
        {factory->NewNumberFromInt(9), factory->NewNumberFromInt(10)}},
       {" function inner() { return p1 } return p1--;",
        {factory->NewNumberFromInt(10), factory->NewNumberFromInt(10)}},
-      {"return ++p1;",
-       {factory->nan_value(), factory->NewStringFromStaticChars("String")}},
+      {"return ++p1;", {factory->nan_value(), MakeString("String")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -891,28 +879,22 @@ TEST(BytecodeGraphBuilderCountOperation) {
   }
 }
 
-TEST(BytecodeGraphBuilderDelete) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderDelete) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
-      {"return delete p1.val;",
-       {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}},
+      {"return delete p1.val;", {factory->true_value(), RunJS("({val : 10})")}},
       {"delete p1.val; return p1.val;",
-       {factory->undefined_value(),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
+       {factory->undefined_value(), RunJS("({val : 10})")}},
       {"delete p1.name; return p1.val;",
-       {factory->NewNumberFromInt(10),
-        BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}},
+       {factory->NewNumberFromInt(10), RunJS("({val : 10, name:'abc'})")}},
       {"'use strict'; return delete p1.val;",
-       {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}},
+       {factory->true_value(), RunJS("({val : 10})")}},
       {"'use strict'; delete p1.val; return p1.val;",
-       {factory->undefined_value(),
-        BytecodeGraphTester::NewObject("({val : 10})")}},
+       {factory->undefined_value(), RunJS("({val : 10})")}},
       {"'use strict'; delete p1.name; return p1.val;",
-       {factory->NewNumberFromInt(10),
-        BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}},
+       {factory->NewNumberFromInt(10), RunJS("({val : 10, name:'abc'})")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -928,9 +910,8 @@ TEST(BytecodeGraphBuilderDelete) {
   }
 }
 
-TEST(BytecodeGraphBuilderDeleteGlobal) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderDeleteGlobal) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -978,23 +959,24 @@ TEST(BytecodeGraphBuilderDeleteGlobal) {
   }
 }
 
-TEST(BytecodeGraphBuilderDeleteLookupSlot) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderDeleteLookupSlot) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   // TODO(mythria): Add more tests when we have support for LdaLookupSlot.
-  const char* function_prologue = "var f;"
-                                  "var x = 1;"
-                                  "y = 10;"
-                                  "var obj = {val:10};"
-                                  "var z = 30;"
-                                  "function f1() {"
-                                  "  var z = 20;"
-                                  "  eval(\"function t() {";
-  const char* function_epilogue = "        }; f = t; t();\");"
-                                  "}"
-                                  "f1();";
+  const char* function_prologue =
+      "var f;"
+      "var x = 1;"
+      "y = 10;"
+      "var obj = {val:10};"
+      "var z = 30;"
+      "function f1() {"
+      "  var z = 20;"
+      "  eval(\"function t() {";
+  const char* function_epilogue =
+      "        }; f = t; t();\");"
+      "}"
+      "f1();";
 
   ExpectedSnippet<0> snippets[] = {
       {"return delete y;", {factory->true_value()}},
@@ -1013,29 +995,29 @@ TEST(BytecodeGraphBuilderDeleteLookupSlot) {
   }
 }
 
-TEST(BytecodeGraphBuilderLookupSlot) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderLookupSlot) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
-  const char* function_prologue = "var f;"
-                                  "var x = 12;"
-                                  "y = 10;"
-                                  "var obj = {val:3.1414};"
-                                  "var z = 30;"
-                                  "function f1() {"
-                                  "  var z = 20;"
-                                  "  eval(\"function t() {";
-  const char* function_epilogue = "        }; f = t; t();\");"
-                                  "}"
-                                  "f1();";
+  const char* function_prologue =
+      "var f;"
+      "var x = 12;"
+      "y = 10;"
+      "var obj = {val:3.1414};"
+      "var z = 30;"
+      "function f1() {"
+      "  var z = 20;"
+      "  eval(\"function t() {";
+  const char* function_epilogue =
+      "        }; f = t; t();\");"
+      "}"
+      "f1();";
 
   ExpectedSnippet<0> snippets[] = {
       {"return x;", {factory->NewNumber(12)}},
       {"return obj.val;", {factory->NewNumber(3.1414)}},
-      {"return typeof x;", {factory->NewStringFromStaticChars("number")}},
-      {"return typeof dummy;",
-       {factory->NewStringFromStaticChars("undefined")}},
+      {"return typeof x;", {MakeString("number")}},
+      {"return typeof dummy;", {MakeString("undefined")}},
       {"x = 23; return x;", {factory->NewNumber(23)}},
       {"'use strict'; obj.val = 23.456; return obj.val;",
        {factory->NewNumber(23.456)}}};
@@ -1052,9 +1034,8 @@ TEST(BytecodeGraphBuilderLookupSlot) {
   }
 }
 
-TEST(BytecodeGraphBuilderLookupContextSlot) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderLookupContextSlot) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   // Testing with eval called in the current context.
@@ -1101,9 +1082,8 @@ TEST(BytecodeGraphBuilderLookupContextSlot) {
   }
 }
 
-TEST(BytecodeGraphBuilderLookupGlobalSlot) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderLookupGlobalSlot) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   // Testing with eval called in the current context.
@@ -1150,9 +1130,8 @@ TEST(BytecodeGraphBuilderLookupGlobalSlot) {
   }
 }
 
-TEST(BytecodeGraphBuilderLookupSlotWide) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderLookupSlotWide) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   const char* function_prologue =
@@ -1173,7 +1152,7 @@ TEST(BytecodeGraphBuilderLookupSlotWide) {
       {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return x;",
        {factory->NewNumber(12)}},
       {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return typeof x;",
-       {factory->NewStringFromStaticChars("number")}},
+       {MakeString("number")}},
       {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return x = 23;",
        {factory->NewNumber(23)}},
       {"'use strict';" REPEAT_256(SPACE, "y = 2.3;") "return obj.val = 23.456;",
@@ -1191,9 +1170,8 @@ TEST(BytecodeGraphBuilderLookupSlotWide) {
   }
 }
 
-TEST(BytecodeGraphBuilderCallLookupSlot) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderCallLookupSlot) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<0> snippets[] = {
       {"g = function(){ return 2 }; eval(''); return g();",
@@ -1218,10 +1196,8 @@ TEST(BytecodeGraphBuilderCallLookupSlot) {
   }
 }
 
-TEST(BytecodeGraphBuilderEval) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
-  Factory* factory = isolate->factory();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderEval) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<0> snippets[] = {
       {"return eval('1;');", {handle(Smi::FromInt(1), isolate)}},
@@ -1243,18 +1219,16 @@ TEST(BytecodeGraphBuilderEval) {
        {handle(Smi::FromInt(1), isolate)}},
       {"'use strict'; var x = 1; eval('var x = 2;'); return x;",
        {handle(Smi::FromInt(1), isolate)}},
-      {"var x = 10; eval('x + 20;'); return typeof x;",
-       {factory->NewStringFromStaticChars("number")}},
+      {"var x = 10; eval('x + 20;'); return typeof x;", {MakeString("number")}},
       {"eval('var y = 10;'); return typeof unallocated;",
-       {factory->NewStringFromStaticChars("undefined")}},
+       {MakeString("undefined")}},
       {"'use strict'; eval('var y = 10;'); return typeof unallocated;",
-       {factory->NewStringFromStaticChars("undefined")}},
-      {"eval('var x = 10;'); return typeof x;",
-       {factory->NewStringFromStaticChars("number")}},
+       {MakeString("undefined")}},
+      {"eval('var x = 10;'); return typeof x;", {MakeString("number")}},
       {"var x = {}; eval('var x = 10;'); return typeof x;",
-       {factory->NewStringFromStaticChars("number")}},
+       {MakeString("number")}},
       {"'use strict'; var x = {}; eval('var x = 10;'); return typeof x;",
-       {factory->NewStringFromStaticChars("object")}},
+       {MakeString("object")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -1268,9 +1242,8 @@ TEST(BytecodeGraphBuilderEval) {
   }
 }
 
-TEST(BytecodeGraphBuilderEvalParams) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderEvalParams) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<1> snippets[] = {
       {"var x = 10; return eval('x + p1;');",
@@ -1295,10 +1268,8 @@ TEST(BytecodeGraphBuilderEvalParams) {
   }
 }
 
-TEST(BytecodeGraphBuilderEvalGlobal) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
-  Factory* factory = isolate->factory();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderEvalGlobal) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<0> snippets[] = {
       {"function add_global() { eval('function f() { z = 33; }; f()'); };"
@@ -1309,7 +1280,7 @@ TEST(BytecodeGraphBuilderEvalGlobal) {
        "      try { f() } catch(e) {}');\n"
        "}\n"
        "function f() { add_global(); return typeof y; } f();",
-       {factory->NewStringFromStaticChars("undefined")}},
+       {MakeString("undefined")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -1368,21 +1339,18 @@ const char* get_code_snippet(Token::Value opcode) {
   }
 }
 
-TEST(BytecodeGraphBuilderCompare) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderCompare) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
   Handle<Object> lhs_values[] = {
       factory->NewNumberFromInt(10), factory->NewHeapNumber(3.45),
-      factory->NewStringFromStaticChars("abc"),
-      factory->NewNumberFromInt(SMI_MAX), factory->NewNumberFromInt(SMI_MIN)};
-  Handle<Object> rhs_values[] = {factory->NewNumberFromInt(10),
-                                 factory->NewStringFromStaticChars("10"),
-                                 factory->NewNumberFromInt(20),
-                                 factory->NewStringFromStaticChars("abc"),
-                                 factory->NewHeapNumber(3.45),
-                                 factory->NewNumberFromInt(SMI_MAX),
-                                 factory->NewNumberFromInt(SMI_MIN)};
+      MakeString("abc"), factory->NewNumberFromInt(SMI_MAX),
+      factory->NewNumberFromInt(SMI_MIN)};
+  Handle<Object> rhs_values[] = {
+      factory->NewNumberFromInt(10),     MakeString("10"),
+      factory->NewNumberFromInt(20),     MakeString("abc"),
+      factory->NewHeapNumber(3.45),      factory->NewNumberFromInt(SMI_MAX),
+      factory->NewNumberFromInt(SMI_MIN)};
 
   for (size_t i = 0; i < arraysize(kCompareOperators); i++) {
     base::ScopedVector<char> script(1024);
@@ -1403,36 +1371,29 @@ TEST(BytecodeGraphBuilderCompare) {
   }
 }
 
-TEST(BytecodeGraphBuilderTestIn) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderTestIn) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<2> snippets[] = {
       {"return p2 in p1;",
-       {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})"),
-        factory->NewStringFromStaticChars("val")}},
+       {factory->true_value(), RunJS("({val : 10})"), MakeString("val")}},
       {"return p2 in p1;",
-       {factory->true_value(), BytecodeGraphTester::NewObject("[]"),
-        factory->NewStringFromStaticChars("length")}},
+       {factory->true_value(), RunJS("[]"), MakeString("length")}},
       {"return p2 in p1;",
-       {factory->true_value(), BytecodeGraphTester::NewObject("[]"),
-        factory->NewStringFromStaticChars("toString")}},
+       {factory->true_value(), RunJS("[]"), MakeString("toString")}},
       {"return p2 in p1;",
-       {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})"),
-        factory->NewStringFromStaticChars("toString")}},
+       {factory->true_value(), RunJS("({val : 10})"), MakeString("toString")}},
       {"return p2 in p1;",
-       {factory->false_value(), BytecodeGraphTester::NewObject("({val : 10})"),
-        factory->NewStringFromStaticChars("abc")}},
+       {factory->false_value(), RunJS("({val : 10})"), MakeString("abc")}},
       {"return p2 in p1;",
-       {factory->false_value(), BytecodeGraphTester::NewObject("({val : 10})"),
+       {factory->false_value(), RunJS("({val : 10})"),
         factory->NewNumberFromInt(10)}},
       {"return p2 in p1;",
-       {factory->true_value(), BytecodeGraphTester::NewObject("({10 : 'val'})"),
+       {factory->true_value(), RunJS("({10 : 'val'})"),
         factory->NewNumberFromInt(10)}},
       {"return p2 in p1;",
-       {factory->false_value(),
-        BytecodeGraphTester::NewObject("({10 : 'val'})"),
+       {factory->false_value(), RunJS("({10 : 'val'})"),
         factory->NewNumberFromInt(1)}},
   };
 
@@ -1450,16 +1411,15 @@ TEST(BytecodeGraphBuilderTestIn) {
   }
 }
 
-TEST(BytecodeGraphBuilderTestInstanceOf) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderTestInstanceOf) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
       {"return p1 instanceof Object;",
-       {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}},
+       {factory->true_value(), RunJS("({val : 10})")}},
       {"return p1 instanceof String;",
-       {factory->false_value(), factory->NewStringFromStaticChars("string")}},
+       {factory->false_value(), MakeString("string")}},
       {"var cons = function() {};"
        "var obj = new cons();"
        "return obj instanceof cons;",
@@ -1479,9 +1439,8 @@ TEST(BytecodeGraphBuilderTestInstanceOf) {
   }
 }
 
-TEST(BytecodeGraphBuilderTryCatch) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderTryCatch) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<0> snippets[] = {
       {"var a = 1; try { a = 2 } catch(e) { a = 3 }; return a;",
@@ -1507,9 +1466,8 @@ TEST(BytecodeGraphBuilderTryCatch) {
   }
 }
 
-TEST(BytecodeGraphBuilderTryFinally1) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderTryFinally1) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<0> snippets[] = {
       {"var a = 1; try { a = a + 1; } finally { a = a + 2; }; return a;",
@@ -1544,9 +1502,8 @@ TEST(BytecodeGraphBuilderTryFinally1) {
   }
 }
 
-TEST(BytecodeGraphBuilderTryFinally2) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderTryFinally2) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<0, const char*> snippets[] = {
       {"var a = 1; try { a = 2; throw 23; } finally { a = 3 }; return a;",
@@ -1562,16 +1519,15 @@ TEST(BytecodeGraphBuilderTryFinally2) {
 
     BytecodeGraphTester tester(isolate, script.begin());
     v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get();
-    v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value());
-    CHECK(
-        message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string)
-            .FromJust());
+    v8::Local<v8::String> expected_string =
+        NewString(snippets[i].return_value());
+    CHECK(message->Equals(v8_isolate()->GetCurrentContext(), expected_string)
+              .FromJust());
   }
 }
 
-TEST(BytecodeGraphBuilderThrow) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderThrow) {
+  Isolate* isolate = i_isolate();
 
   // TODO(mythria): Add more tests when real try-catch and deoptimization
   // information are supported.
@@ -1590,17 +1546,15 @@ TEST(BytecodeGraphBuilderThrow) {
 
     BytecodeGraphTester tester(isolate, script.begin());
     v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get();
-    v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value());
-    CHECK(
-        message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string)
-            .FromJust());
+    v8::Local<v8::String> expected_string =
+        NewString(snippets[i].return_value());
+    CHECK(message->Equals(v8_isolate()->GetCurrentContext(), expected_string)
+              .FromJust());
   }
 }
 
-TEST(BytecodeGraphBuilderContext) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
-  Factory* factory = isolate->factory();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderContext) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<0> snippets[] = {
       {"var x = 'outer';"
@@ -1613,7 +1567,7 @@ TEST(BytecodeGraphBuilderContext) {
        "return(x);"
        "}"
        "f();",
-       {factory->NewStringFromStaticChars("outer")}},
+       {MakeString("outer")}},
       {"var x = 'outer';"
        "function f() {"
        " 'use strict';"
@@ -1624,7 +1578,7 @@ TEST(BytecodeGraphBuilderContext) {
        "return(innerFunc() + x);"
        "}"
        "f();",
-       {factory->NewStringFromStaticChars("inner outer")}},
+       {MakeString("inner outer")}},
       {"var x = 'outer';"
        "function f() {"
        " 'use strict';"
@@ -1640,7 +1594,7 @@ TEST(BytecodeGraphBuilderContext) {
        " return(innerMostFunc() + x);"
        "}"
        "f();",
-       {factory->NewStringFromStaticChars("innermost inner_changed outer")}},
+       {MakeString("innermost inner_changed outer")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -1654,9 +1608,8 @@ TEST(BytecodeGraphBuilderContext) {
   }
 }
 
-TEST(BytecodeGraphBuilderLoadContext) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderLoadContext) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
@@ -1718,9 +1671,9 @@ TEST(BytecodeGraphBuilderLoadContext) {
   }
 }
 
-TEST(BytecodeGraphBuilderCreateArgumentsNoParameters) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest,
+       BytecodeGraphBuilderCreateArgumentsNoParameters) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -1747,9 +1700,8 @@ TEST(BytecodeGraphBuilderCreateArgumentsNoParameters) {
   }
 }
 
-TEST(BytecodeGraphBuilderCreateArguments) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderCreateArguments) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<3> snippets[] = {
@@ -1792,9 +1744,8 @@ TEST(BytecodeGraphBuilderCreateArguments) {
   }
 }
 
-TEST(BytecodeGraphBuilderCreateRestArguments) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderCreateRestArguments) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<3> snippets[] = {
@@ -1834,26 +1785,20 @@ TEST(BytecodeGraphBuilderCreateRestArguments) {
   }
 }
 
-TEST(BytecodeGraphBuilderRegExpLiterals) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderRegExpLiterals) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
       {"return /abd/.exec('cccabbdd');", {factory->null_value()}},
-      {"return /ab+d/.exec('cccabbdd')[0];",
-       {factory->NewStringFromStaticChars("abbd")}},
-      {"var a = 3.1414;"
-       REPEAT_256(SPACE, "a = 3.1414;")
-       "return /ab+d/.exec('cccabbdd')[0];",
-       {factory->NewStringFromStaticChars("abbd")}},
+      {"return /ab+d/.exec('cccabbdd')[0];", {MakeString("abbd")}},
+      {"var a = 3.1414;" REPEAT_256(
+           SPACE, "a = 3.1414;") "return /ab+d/.exec('cccabbdd')[0];",
+       {MakeString("abbd")}},
       {"return /ab+d/.exec('cccabbdd')[1];", {factory->undefined_value()}},
-      {"return /AbC/i.exec('ssaBC')[0];",
-       {factory->NewStringFromStaticChars("aBC")}},
-      {"return 'ssaBC'.match(/AbC/i)[0];",
-       {factory->NewStringFromStaticChars("aBC")}},
-      {"return 'ssaBCtAbC'.match(/(AbC)/gi)[1];",
-       {factory->NewStringFromStaticChars("AbC")}},
+      {"return /AbC/i.exec('ssaBC')[0];", {MakeString("aBC")}},
+      {"return 'ssaBC'.match(/AbC/i)[0];", {MakeString("aBC")}},
+      {"return 'ssaBCtAbC'.match(/(AbC)/gi)[1];", {MakeString("AbC")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -1868,9 +1813,8 @@ TEST(BytecodeGraphBuilderRegExpLiterals) {
   }
 }
 
-TEST(BytecodeGraphBuilderArrayLiterals) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderArrayLiterals) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -1878,21 +1822,19 @@ TEST(BytecodeGraphBuilderArrayLiterals) {
       {"return [1, 3, 2][1];", {factory->NewNumberFromInt(3)}},
       {"var a;" REPEAT_256(SPACE, "a = 9.87;") "return [1, 3, 2][1];",
        {factory->NewNumberFromInt(3)}},
-      {"return ['a', 'b', 'c'][2];", {factory->NewStringFromStaticChars("c")}},
+      {"return ['a', 'b', 'c'][2];", {MakeString("c")}},
       {"var a = 100; return [a, a++, a + 2, a + 3][2];",
        {factory->NewNumberFromInt(103)}},
       {"var a = 100; return [a, ++a, a + 2, a + 3][1];",
        {factory->NewNumberFromInt(101)}},
-      {"var a = 9.2;"
-       REPEAT_256(SPACE, "a = 9.34;")
-       "return [a, ++a, a + 2, a + 3][2];",
+      {"var a = 9.2;" REPEAT_256(
+           SPACE, "a = 9.34;") "return [a, ++a, a + 2, a + 3][2];",
        {factory->NewHeapNumber(12.34)}},
-      {"return [[1, 2, 3], ['a', 'b', 'c']][1][0];",
-       {factory->NewStringFromStaticChars("a")}},
+      {"return [[1, 2, 3], ['a', 'b', 'c']][1][0];", {MakeString("a")}},
       {"var t = 't'; return [[t, t + 'est'], [1 + t]][0][1];",
-       {factory->NewStringFromStaticChars("test")}},
+       {MakeString("test")}},
       {"var t = 't'; return [[t, t + 'est'], [1 + t]][1][0];",
-       {factory->NewStringFromStaticChars("1t")}}};
+       {MakeString("1t")}}};
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
     base::ScopedVector<char> script(4096);
@@ -1906,52 +1848,47 @@ TEST(BytecodeGraphBuilderArrayLiterals) {
   }
 }
 
-TEST(BytecodeGraphBuilderObjectLiterals) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderObjectLiterals) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
       {"return { }.name;", {factory->undefined_value()}},
-      {"return { name: 'string', val: 9.2 }.name;",
-       {factory->NewStringFromStaticChars("string")}},
-      {"var a;\n"
-       REPEAT_256(SPACE, "a = 1.23;\n")
-       "return { name: 'string', val: 9.2 }.name;",
-       {factory->NewStringFromStaticChars("string")}},
-      {"return { name: 'string', val: 9.2 }['name'];",
-       {factory->NewStringFromStaticChars("string")}},
+      {"return { name: 'string', val: 9.2 }.name;", {MakeString("string")}},
+      {"var a;\n" REPEAT_256(
+           SPACE, "a = 1.23;\n") "return { name: 'string', val: 9.2 }.name;",
+       {MakeString("string")}},
+      {"return { name: 'string', val: 9.2 }['name'];", {MakeString("string")}},
       {"var a = 15; return { name: 'string', val: a }.val;",
        {factory->NewNumberFromInt(15)}},
-      {"var a;"
-       REPEAT_256(SPACE, "a = 1.23;")
-       "return { name: 'string', val: a }.val;",
+      {"var a;" REPEAT_256(
+           SPACE, "a = 1.23;") "return { name: 'string', val: a }.val;",
        {factory->NewHeapNumber(1.23)}},
       {"var a = 15; var b = 'val'; return { name: 'string', val: a }[b];",
        {factory->NewNumberFromInt(15)}},
       {"var a = 5; return { val: a, val: a + 1 }.val;",
        {factory->NewNumberFromInt(6)}},
       {"return { func: function() { return 'test' } }.func();",
-       {factory->NewStringFromStaticChars("test")}},
+       {MakeString("test")}},
       {"return { func(a) { return a + 'st'; } }.func('te');",
-       {factory->NewStringFromStaticChars("test")}},
+       {MakeString("test")}},
       {"return { get a() { return 22; } }.a;", {factory->NewNumberFromInt(22)}},
       {"var a = { get b() { return this.x + 't'; },\n"
        "          set b(val) { this.x = val + 's' } };\n"
        "a.b = 'te';\n"
        "return a.b;",
-       {factory->NewStringFromStaticChars("test")}},
+       {MakeString("test")}},
       {"var a = 123; return { 1: a }[1];", {factory->NewNumberFromInt(123)}},
       {"return Object.getPrototypeOf({ __proto__: null });",
        {factory->null_value()}},
       {"var a = 'test'; return { [a]: 1 }.test;",
        {factory->NewNumberFromInt(1)}},
       {"var a = 'test'; return { b: a, [a]: a + 'ing' }['test']",
-       {factory->NewStringFromStaticChars("testing")}},
+       {MakeString("testing")}},
       {"var a = 'proto_str';\n"
        "var b = { [a]: 1, __proto__: { var : a } };\n"
        "return Object.getPrototypeOf(b).var",
-       {factory->NewStringFromStaticChars("proto_str")}},
+       {MakeString("proto_str")}},
       {"var n = 'name';\n"
        "return { [n]: 'val', get a() { return 987 } }['a'];",
        {factory->NewNumberFromInt(987)}},
@@ -1968,9 +1905,8 @@ TEST(BytecodeGraphBuilderObjectLiterals) {
   }
 }
 
-TEST(BytecodeGraphBuilderIf) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderIf) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
@@ -2076,9 +2012,8 @@ TEST(BytecodeGraphBuilderIf) {
   }
 }
 
-TEST(BytecodeGraphBuilderConditionalOperator) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderConditionalOperator) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<1> snippets[] = {
@@ -2105,9 +2040,8 @@ TEST(BytecodeGraphBuilderConditionalOperator) {
   }
 }
 
-TEST(BytecodeGraphBuilderSwitch) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderSwitch) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   const char* switch_code =
@@ -2151,9 +2085,8 @@ TEST(BytecodeGraphBuilderSwitch) {
   }
 }
 
-TEST(BytecodeGraphBuilderSwitchMerge) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderSwitchMerge) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   const char* switch_code =
@@ -2199,9 +2132,8 @@ TEST(BytecodeGraphBuilderSwitchMerge) {
   }
 }
 
-TEST(BytecodeGraphBuilderNestedSwitch) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderNestedSwitch) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   const char* switch_code =
@@ -2258,9 +2190,8 @@ TEST(BytecodeGraphBuilderNestedSwitch) {
   }
 }
 
-TEST(BytecodeGraphBuilderBreakableBlocks) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderBreakableBlocks) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -2297,9 +2228,8 @@ TEST(BytecodeGraphBuilderBreakableBlocks) {
   }
 }
 
-TEST(BytecodeGraphBuilderWhile) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderWhile) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -2344,9 +2274,8 @@ TEST(BytecodeGraphBuilderWhile) {
   }
 }
 
-TEST(BytecodeGraphBuilderDo) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderDo) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -2391,9 +2320,8 @@ TEST(BytecodeGraphBuilderDo) {
   }
 }
 
-TEST(BytecodeGraphBuilderFor) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderFor) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -2483,9 +2411,8 @@ TEST(BytecodeGraphBuilderFor) {
   }
 }
 
-TEST(BytecodeGraphBuilderForIn) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderForIn) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
   ExpectedSnippet<0> snippets[] = {
       {"var sum = 0;\n"
@@ -2553,10 +2480,8 @@ TEST(BytecodeGraphBuilderForIn) {
   }
 }
 
-TEST(BytecodeGraphBuilderForOf) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
-  Factory* factory = isolate->factory();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderForOf) {
+  Isolate* isolate = i_isolate();
   ExpectedSnippet<0> snippets[] = {
       {"  var r = 0;\n"
        "  for (var a of [0,6,7,9]) { r += a; }\n"
@@ -2565,7 +2490,7 @@ TEST(BytecodeGraphBuilderForOf) {
       {"  var r = '';\n"
        "  for (var a of 'foobar') { r = a + r; }\n"
        "  return r;\n",
-       {factory->NewStringFromStaticChars("raboof")}},
+       {MakeString("raboof")}},
       {"  var a = [1, 2, 3];\n"
        "  a.name = 4;\n"
        "  var r = 0;\n"
@@ -2575,15 +2500,15 @@ TEST(BytecodeGraphBuilderForOf) {
       {"  var r = '';\n"
        "  var data = [1, 2, 3]; \n"
        "  for (a of data) { delete data[0]; r += a; } return r;",
-       {factory->NewStringFromStaticChars("123")}},
+       {MakeString("123")}},
       {"  var r = '';\n"
        "  var data = [1, 2, 3]; \n"
        "  for (a of data) { delete data[2]; r += a; } return r;",
-       {factory->NewStringFromStaticChars("12undefined")}},
+       {MakeString("12undefined")}},
       {"  var r = '';\n"
        "  var data = [1, 2, 3]; \n"
        "  for (a of data) { delete data; r += a; } return r;",
-       {factory->NewStringFromStaticChars("123")}},
+       {MakeString("123")}},
       {"  var r = '';\n"
        "  var input = 'foobar';\n"
        "  for (var a of input) {\n"
@@ -2591,7 +2516,7 @@ TEST(BytecodeGraphBuilderForOf) {
        "    r += a;\n"
        "  }\n"
        "  return r;\n",
-       {factory->NewStringFromStaticChars("foo")}},
+       {MakeString("foo")}},
       {"  var r = '';\n"
        "  var input = 'foobar';\n"
        "  for (var a of input) {\n"
@@ -2599,22 +2524,22 @@ TEST(BytecodeGraphBuilderForOf) {
        "    r += a;\n"
        "  }\n"
        "  return r;\n",
-       {factory->NewStringFromStaticChars("fooar")}},
+       {MakeString("fooar")}},
       {"  var r = '';\n"
        "  var data = [1, 2, 3, 4]; \n"
        "  for (a of data) { data[2] = 567; r += a; }\n"
        "  return r;\n",
-       {factory->NewStringFromStaticChars("125674")}},
+       {MakeString("125674")}},
       {"  var r = '';\n"
        "  var data = [1, 2, 3, 4]; \n"
        "  for (a of data) { data[4] = 567; r += a; }\n"
        "  return r;\n",
-       {factory->NewStringFromStaticChars("1234567")}},
+       {MakeString("1234567")}},
       {"  var r = '';\n"
        "  var data = [1, 2, 3, 4]; \n"
        "  for (a of data) { data[5] = 567; r += a; }\n"
        "  return r;\n",
-       {factory->NewStringFromStaticChars("1234undefined567")}},
+       {MakeString("1234undefined567")}},
       {"  var r = '';\n"
        "  var obj = new Object();\n"
        "  obj[Symbol.iterator] = function() { return {\n"
@@ -2629,7 +2554,7 @@ TEST(BytecodeGraphBuilderForOf) {
        "    }}\n"
        "  for (a of obj) { r += a }\n"
        "  return r;\n",
-       {factory->NewStringFromStaticChars("dcba")}},
+       {MakeString("dcba")}},
   };
 
   for (size_t i = 0; i < arraysize(snippets); i++) {
@@ -2644,51 +2569,10 @@ TEST(BytecodeGraphBuilderForOf) {
   }
 }
 
-void TestJumpWithConstantsAndWideConstants(size_t shard) {
-  const int kStep = 46;
-  int start = static_cast<int>(7 + 17 * shard);
-  for (int constants = start; constants < 300; constants += kStep) {
-    std::stringstream filler_os;
-    // Generate a string that consumes constant pool entries and
-    // spread out branch distances in script below.
-    for (int i = 0; i < constants; i++) {
-      filler_os << "var x_ = 'x_" << i << "';\n";
-    }
-    std::string filler(filler_os.str());
-
-    std::stringstream script_os;
-    script_os << "function " << kFunctionName << "(a) {\n";
-    script_os << "  " << filler;
-    script_os << "  for (var i = a; i < 2; i++) {\n";
-    script_os << "  " << filler;
-    script_os << "    if (i == 0) { " << filler << "i = 10; continue; }\n";
-    script_os << "    else if (i == a) { " << filler << "i = 12; break; }\n";
-    script_os << "    else { " << filler << " }\n";
-    script_os << "  }\n";
-    script_os << "  return i;\n";
-    script_os << "}\n";
-    script_os << kFunctionName << "(0);\n";
-    std::string script(script_os.str());
-
-    HandleAndZoneScope scope;
-    auto isolate = scope.main_isolate();
-    auto factory = isolate->factory();
-    BytecodeGraphTester tester(isolate, script.c_str());
-    auto callable = tester.GetCallable<Handle<Object>>();
-    for (int a = 0; a < 3; a++) {
-      Handle<Object> return_val =
-          callable(factory->NewNumberFromInt(a)).ToHandleChecked();
-      static const int results[] = {11, 12, 2};
-      CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]);
-    }
-  }
-}
-
 SHARD_TEST_BY_4(JumpWithConstantsAndWideConstants)
 
-TEST(BytecodeGraphBuilderWithStatement) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderWithStatement) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<0> snippets[] = {
       {"with({x:42}) return x;", {handle(Smi::FromInt(42), isolate)}},
@@ -2722,9 +2606,8 @@ TEST(BytecodeGraphBuilderWithStatement) {
   }
 }
 
-TEST(BytecodeGraphBuilderConstDeclaration) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderConstDeclaration) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -2780,9 +2663,9 @@ TEST(BytecodeGraphBuilderConstDeclaration) {
   }
 }
 
-TEST(BytecodeGraphBuilderConstDeclarationLookupSlots) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest,
+       BytecodeGraphBuilderConstDeclarationLookupSlots) {
+  Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
 
   ExpectedSnippet<0> snippets[] = {
@@ -2821,9 +2704,9 @@ TEST(BytecodeGraphBuilderConstDeclarationLookupSlots) {
   }
 }
 
-TEST(BytecodeGraphBuilderConstInLookupContextChain) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest,
+       BytecodeGraphBuilderConstInLookupContextChain) {
+  Isolate* isolate = i_isolate();
 
   const char* prologue =
       "function OuterMost() {\n"
@@ -2868,9 +2751,9 @@ TEST(BytecodeGraphBuilderConstInLookupContextChain) {
   }
 }
 
-TEST(BytecodeGraphBuilderIllegalConstDeclaration) {
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+TEST_F(RunBytecodeGraphBuilderTest,
+       BytecodeGraphBuilderIllegalConstDeclaration) {
+  Isolate* isolate = i_isolate();
 
   ExpectedSnippet<0, const char*> illegal_const_decl[] = {
       {"const x = x = 10 + 3; return x;",
@@ -2896,10 +2779,9 @@ TEST(BytecodeGraphBuilderIllegalConstDeclaration) {
     BytecodeGraphTester tester(isolate, script.begin());
     v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get();
     v8::Local<v8::String> expected_string =
-        v8_str(illegal_const_decl[i].return_value());
-    CHECK(
-        message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string)
-            .FromJust());
+        NewString(illegal_const_decl[i].return_value());
+    CHECK(message->Equals(v8_isolate()->GetCurrentContext(), expected_string)
+              .FromJust());
   }
 
   // Tests for strict mode.
@@ -2911,10 +2793,9 @@ TEST(BytecodeGraphBuilderIllegalConstDeclaration) {
     BytecodeGraphTester tester(isolate, script.begin());
     v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get();
     v8::Local<v8::String> expected_string =
-        v8_str(illegal_const_decl[i].return_value());
-    CHECK(
-        message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string)
-            .FromJust());
+        NewString(illegal_const_decl[i].return_value());
+    CHECK(message->Equals(v8_isolate()->GetCurrentContext(), expected_string)
+              .FromJust());
   }
 }
 
@@ -2928,12 +2809,11 @@ class CountBreakDebugDelegate : public v8::debug::DebugDelegate {
   int debug_break_count = 0;
 };
 
-TEST(BytecodeGraphBuilderDebuggerStatement) {
+TEST_F(RunBytecodeGraphBuilderTest, BytecodeGraphBuilderDebuggerStatement) {
   CountBreakDebugDelegate delegate;
-  HandleAndZoneScope scope;
-  Isolate* isolate = scope.main_isolate();
+  Isolate* isolate = i_isolate();
 
-  v8::debug::SetDebugDelegate(CcTest::isolate(), &delegate);
+  v8::debug::SetDebugDelegate(v8_isolate(), &delegate);
 
   ExpectedSnippet<0> snippet = {
       "function f() {"
@@ -2946,7 +2826,7 @@ TEST(BytecodeGraphBuilderDebuggerStatement) {
   auto callable = tester.GetCallable<>();
   Handle<Object> return_value = callable().ToHandleChecked();
 
-  v8::debug::SetDebugDelegate(CcTest::isolate(), nullptr);
+  v8::debug::SetDebugDelegate(v8_isolate(), nullptr);
   CHECK(return_value.is_identical_to(snippet.return_value()));
   CHECK_EQ(2, delegate.debug_break_count);
 }
diff --git a/deps/v8/test/unittests/compiler/run-deopt-unittest.cc b/deps/v8/test/unittests/compiler/run-deopt-unittest.cc
index 8535d7feb144e6..2c75b0455f03ab 100644
--- a/deps/v8/test/unittests/compiler/run-deopt-unittest.cc
+++ b/deps/v8/test/unittests/compiler/run-deopt-unittest.cc
@@ -31,7 +31,7 @@ class RunDeoptTest : public TestWithContext {
 };
 
 TEST_F(RunDeoptTest, DeoptSimple) {
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
 
   FunctionTester T(i_isolate(),
                    "(function f(a) {"
@@ -47,7 +47,7 @@ TEST_F(RunDeoptTest, DeoptSimple) {
 }
 
 TEST_F(RunDeoptTest, DeoptSimpleInExpr) {
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
 
   FunctionTester T(i_isolate(),
                    "(function f(a) {"
@@ -64,7 +64,7 @@ TEST_F(RunDeoptTest, DeoptSimpleInExpr) {
 }
 
 TEST_F(RunDeoptTest, DeoptExceptionHandlerCatch) {
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
 
   FunctionTester T(i_isolate(),
                    "(function f() {"
@@ -82,7 +82,7 @@ TEST_F(RunDeoptTest, DeoptExceptionHandlerCatch) {
 }
 
 TEST_F(RunDeoptTest, DeoptExceptionHandlerFinally) {
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
 
   FunctionTester T(i_isolate(),
                    "(function f() {"
@@ -100,7 +100,7 @@ TEST_F(RunDeoptTest, DeoptExceptionHandlerFinally) {
 }
 
 TEST_F(RunDeoptTest, DeoptTrivial) {
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
 
   FunctionTester T(i_isolate(),
                    "(function foo() {"
diff --git a/deps/v8/test/unittests/compiler/run-jscalls-unittest.cc b/deps/v8/test/unittests/compiler/run-jscalls-unittest.cc
index 65135e8344e5d5..b651e8e640e52b 100644
--- a/deps/v8/test/unittests/compiler/run-jscalls-unittest.cc
+++ b/deps/v8/test/unittests/compiler/run-jscalls-unittest.cc
@@ -137,7 +137,7 @@ TEST_F(RunJSCallsTest, ConstructorCall) {
 }
 
 TEST_F(RunJSCallsTest, RuntimeCall) {
-  FLAG_allow_natives_syntax = true;
+  v8_flags.allow_natives_syntax = true;
   FunctionTester T(i_isolate(), "(function(a) { return %IsJSReceiver(a); })");
 
   T.CheckCall(T.false_value(), T.NewNumber(23), T.undefined());
diff --git a/deps/v8/test/unittests/compiler/scheduler-unittest.cc b/deps/v8/test/unittests/compiler/scheduler-unittest.cc
index 2f2a6c3f4c3d83..b7254e39386c89 100644
--- a/deps/v8/test/unittests/compiler/scheduler-unittest.cc
+++ b/deps/v8/test/unittests/compiler/scheduler-unittest.cc
@@ -37,7 +37,7 @@ class SchedulerTest : public TestWithIsolateAndZone {
         js_(zone()) {}
 
   Schedule* ComputeAndVerifySchedule(size_t expected) {
-    if (FLAG_trace_turbo) {
+    if (v8_flags.trace_turbo) {
       SourcePositionTable table(graph());
       NodeOriginTable table2(graph());
       StdoutStream{} << AsJSON(*graph(), &table, &table2);
@@ -46,7 +46,7 @@ class SchedulerTest : public TestWithIsolateAndZone {
     Schedule* schedule = Scheduler::ComputeSchedule(
         zone(), graph(), Scheduler::kSplitNodes, tick_counter(), nullptr);
 
-    if (FLAG_trace_turbo_scheduler) {
+    if (v8_flags.trace_turbo_scheduler) {
       StdoutStream{} << *schedule << std::endl;
     }
     ScheduleVerifier::Run(schedule);
diff --git a/deps/v8/test/unittests/compiler/sloppy-equality-unittest.cc b/deps/v8/test/unittests/compiler/sloppy-equality-unittest.cc
index a1b13ebb239ef9..b019c58a87cf3f 100644
--- a/deps/v8/test/unittests/compiler/sloppy-equality-unittest.cc
+++ b/deps/v8/test/unittests/compiler/sloppy-equality-unittest.cc
@@ -61,8 +61,8 @@ class TestSloppyEqualityFactory {
 };
 
 TEST_F(SloppyEqualityTest, SloppyEqualityTest) {
-  FlagScope<bool> allow_natives_syntax(&i::FLAG_allow_natives_syntax, true);
-  FlagScope<bool> always_turbofan(&i::FLAG_always_turbofan, false);
+  FlagScope<bool> allow_natives_syntax(&i::v8_flags.allow_natives_syntax, true);
+  FlagScope<bool> always_turbofan(&i::v8_flags.always_turbofan, false);
   TestSloppyEqualityFactory f(zone());
   // TODO(nicohartmann@, v8:5660): Collect more precise feedback for some useful
   // cases.
diff --git a/deps/v8/test/unittests/deoptimizer/deoptimization-unittest.cc b/deps/v8/test/unittests/deoptimizer/deoptimization-unittest.cc
index 42a5cc0b8627e6..6db03235c8d55e 100644
--- a/deps/v8/test/unittests/deoptimizer/deoptimization-unittest.cc
+++ b/deps/v8/test/unittests/deoptimizer/deoptimization-unittest.cc
@@ -67,18 +67,18 @@ class DeoptimizationTest : public TestWithContext {
 class AlwaysOptimizeAllowNativesSyntaxNoInlining {
  public:
   AlwaysOptimizeAllowNativesSyntaxNoInlining()
-      : always_turbofan_(i::FLAG_always_turbofan),
-        allow_natives_syntax_(i::FLAG_allow_natives_syntax),
-        turbo_inlining_(i::FLAG_turbo_inlining) {
-    i::FLAG_always_turbofan = true;
-    i::FLAG_allow_natives_syntax = true;
-    i::FLAG_turbo_inlining = false;
+      : always_turbofan_(i::v8_flags.always_turbofan),
+        allow_natives_syntax_(i::v8_flags.allow_natives_syntax),
+        turbo_inlining_(i::v8_flags.turbo_inlining) {
+    i::v8_flags.always_turbofan = true;
+    i::v8_flags.allow_natives_syntax = true;
+    i::v8_flags.turbo_inlining = false;
   }
 
   ~AlwaysOptimizeAllowNativesSyntaxNoInlining() {
-    i::FLAG_always_turbofan = always_turbofan_;
-    i::FLAG_allow_natives_syntax = allow_natives_syntax_;
-    i::FLAG_turbo_inlining = turbo_inlining_;
+    i::v8_flags.always_turbofan = always_turbofan_;
+    i::v8_flags.allow_natives_syntax = allow_natives_syntax_;
+    i::v8_flags.turbo_inlining = turbo_inlining_;
   }
 
  private:
@@ -93,15 +93,15 @@ class AlwaysOptimizeAllowNativesSyntaxNoInlining {
 class AllowNativesSyntaxNoInlining {
  public:
   AllowNativesSyntaxNoInlining()
-      : allow_natives_syntax_(i::FLAG_allow_natives_syntax),
-        turbo_inlining_(i::FLAG_turbo_inlining) {
-    i::FLAG_allow_natives_syntax = true;
-    i::FLAG_turbo_inlining = false;
+      : allow_natives_syntax_(i::v8_flags.allow_natives_syntax),
+        turbo_inlining_(i::v8_flags.turbo_inlining) {
+    i::v8_flags.allow_natives_syntax = true;
+    i::v8_flags.turbo_inlining = false;
   }
 
   ~AllowNativesSyntaxNoInlining() {
-    i::FLAG_allow_natives_syntax = allow_natives_syntax_;
-    i::FLAG_turbo_inlining = turbo_inlining_;
+    i::v8_flags.allow_natives_syntax = allow_natives_syntax_;
+    i::v8_flags.turbo_inlining = turbo_inlining_;
   }
 
  private:
@@ -418,7 +418,7 @@ class DeoptimizationDisableConcurrentRecompilationTest
         "  if (deopt) { count++; %DeoptimizeFunction(f); } return 8"
         "};");
   }
-  static void SetUpTestSuite() { i::FLAG_concurrent_recompilation = false; }
+  static void SetUpTestSuite() { i::v8_flags.concurrent_recompilation = false; }
   void TestDeoptimizeBinaryOp(const char* binary_op) {
     v8::base::EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> f_source_buffer;
     v8::base::SNPrintF(f_source_buffer, "function f(x, y) { return x %s y; };",
@@ -428,7 +428,7 @@ class DeoptimizationDisableConcurrentRecompilationTest
     AllowNativesSyntaxNoInlining options;
     // Compile function f and collect to type feedback to insert binary op stub
     // call in the optimized code.
-    i::FLAG_prepare_always_turbofan = true;
+    i::v8_flags.prepare_always_turbofan = true;
     CompileConstructorWithDeoptimizingValueOf();
     RunJS(f_source);
     RunJS(
@@ -437,7 +437,7 @@ class DeoptimizationDisableConcurrentRecompilationTest
         "};");
 
     // Compile an optimized version of f.
-    i::FLAG_always_turbofan = true;
+    i::v8_flags.always_turbofan = true;
     RunJS(f_source);
     RunJS("f(7, new X());");
     CHECK(!i_isolate()->use_optimizer() ||
@@ -464,7 +464,7 @@ TEST_F(DeoptimizationDisableConcurrentRecompilationTest,
   {
     // Compile function f and collect to type feedback to insert binary op
     // stub call in the optimized code.
-    i::FLAG_prepare_always_turbofan = true;
+    i::v8_flags.prepare_always_turbofan = true;
     RunJS(
         "var count = 0;"
         "var result = 0;"
@@ -480,7 +480,7 @@ TEST_F(DeoptimizationDisableConcurrentRecompilationTest,
         "};");
 
     // Compile an optimized version of f.
-    i::FLAG_always_turbofan = true;
+    i::v8_flags.always_turbofan = true;
     RunJS(f_source);
     RunJS("f('a+', new X());");
     CHECK(!i_isolate()->use_optimizer() ||
@@ -629,7 +629,7 @@ TEST_F(DeoptimizationDisableConcurrentRecompilationTest, DeoptimizeCompare) {
     AllowNativesSyntaxNoInlining options;
     // Compile function f and collect to type feedback to insert compare ic
     // call in the optimized code.
-    i::FLAG_prepare_always_turbofan = true;
+    i::v8_flags.prepare_always_turbofan = true;
     RunJS(
         "var count = 0;"
         "var result = 0;"
@@ -645,7 +645,7 @@ TEST_F(DeoptimizationDisableConcurrentRecompilationTest, DeoptimizeCompare) {
         "};");
 
     // Compile an optimized version of f.
-    i::FLAG_always_turbofan = true;
+    i::v8_flags.always_turbofan = true;
     RunJS(f_source);
     RunJS("f('a', new X());");
     CHECK(!i_isolate()->use_optimizer() ||
@@ -688,7 +688,7 @@ TEST_F(DeoptimizationDisableConcurrentRecompilationTest,
     AllowNativesSyntaxNoInlining options;
     // Compile functions and collect to type feedback to insert ic
     // calls in the optimized code.
-    i::FLAG_prepare_always_turbofan = true;
+    i::v8_flags.prepare_always_turbofan = true;
     RunJS(
         "var count = 0;"
         "var result = 0;"
@@ -721,7 +721,7 @@ TEST_F(DeoptimizationDisableConcurrentRecompilationTest,
         "};");
 
     // Compile an optimized version of the functions.
-    i::FLAG_always_turbofan = true;
+    i::v8_flags.always_turbofan = true;
     RunJS(f1_source);
     RunJS(g1_source);
     RunJS(f2_source);
@@ -780,7 +780,7 @@ TEST_F(DeoptimizationDisableConcurrentRecompilationTest,
     AllowNativesSyntaxNoInlining options;
     // Compile functions and collect to type feedback to insert ic
     // calls in the optimized code.
-    i::FLAG_prepare_always_turbofan = true;
+    i::v8_flags.prepare_always_turbofan = true;
     RunJS(
         "var count = 0;"
         "var result = 0;"
@@ -817,7 +817,7 @@ TEST_F(DeoptimizationDisableConcurrentRecompilationTest,
         "};");
 
     // Compile an optimized version of the functions.
-    i::FLAG_always_turbofan = true;
+    i::v8_flags.always_turbofan = true;
     RunJS(f1_source);
     RunJS(g1_source);
     RunJS(f2_source);
diff --git a/deps/v8/test/unittests/execution/microtask-queue-unittest.cc b/deps/v8/test/unittests/execution/microtask-queue-unittest.cc
index 55e36c9f444d91..c8b3f4a3ce6b21 100644
--- a/deps/v8/test/unittests/execution/microtask-queue-unittest.cc
+++ b/deps/v8/test/unittests/execution/microtask-queue-unittest.cc
@@ -42,8 +42,8 @@ class WithFinalizationRegistryMixin : public TMixin {
   static void SetUpTestSuite() {
     CHECK_NULL(save_flags_);
     save_flags_ = new SaveFlags();
-    FLAG_expose_gc = true;
-    FLAG_allow_natives_syntax = true;
+    v8_flags.expose_gc = true;
+    v8_flags.allow_natives_syntax = true;
     TMixin::SetUpTestSuite();
   }
 
diff --git a/deps/v8/test/unittests/execution/thread-termination-unittest.cc b/deps/v8/test/unittests/execution/thread-termination-unittest.cc
index ef23af37fdce7b..c05cb4c96f1a00 100644
--- a/deps/v8/test/unittests/execution/thread-termination-unittest.cc
+++ b/deps/v8/test/unittests/execution/thread-termination-unittest.cc
@@ -33,6 +33,7 @@
 #include "src/init/v8.h"
 #include "src/objects/objects-inl.h"
 #include "test/unittests/test-utils.h"
+#include "testing/gmock-support.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace v8 {
@@ -235,7 +236,7 @@ TEST_F(ThreadTerminationTest, TerminateBigIntMultiplication) {
 }
 
 TEST_F(ThreadTerminationTest, TerminateOptimizedBigIntMultiplication) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   TestTerminatingFromCurrentThread(
       "function foo(a, b) { return a * b; }"
       "%PrepareFunctionForOptimization(foo);"
@@ -260,7 +261,7 @@ TEST_F(ThreadTerminationTest, TerminateBigIntDivision) {
 }
 
 TEST_F(ThreadTerminationTest, TerminateOptimizedBigIntDivision) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   TestTerminatingFromCurrentThread(
       "function foo(a, b) { return a / b; }"
       "%PrepareFunctionForOptimization(foo);"
@@ -822,7 +823,7 @@ TEST_F(ThreadTerminationTest, TerminationInInnerTryCall) {
 }
 
 TEST_F(ThreadTerminationTest, TerminateAndTryCall) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   HandleScope scope(isolate());
   Local<ObjectTemplate> global = CreateGlobalTemplate(
       isolate(), TerminateCurrentThread, DoLoopCancelTerminate);
@@ -863,7 +864,7 @@ class ConsoleImpl : public debug::ConsoleDelegate {
 };
 
 TEST_F(ThreadTerminationTest, TerminateConsole) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   ConsoleImpl console;
   debug::SetConsoleDelegate(isolate(), &console);
   HandleScope scope(isolate());
@@ -889,6 +890,75 @@ TEST_F(ThreadTerminationTest, TerminateConsole) {
   CHECK(isolate()->IsExecutionTerminating());
 }
 
+TEST_F(ThreadTerminationTest, TerminationClearArrayJoinStack) {
+  internal::v8_flags.allow_natives_syntax = true;
+  HandleScope scope(isolate());
+  Local<ObjectTemplate> global_template =
+      CreateGlobalTemplate(isolate(), TerminateCurrentThread, DoLoopNoCall);
+  {
+    Local<Context> context = Context::New(isolate(), nullptr, global_template);
+    Context::Scope context_scope(context);
+    {
+      TryCatch try_catch(isolate());
+      TryRunJS(
+          "var error = false;"
+          "var a = [{toString(){if(error)loop()}}];"
+          "function Join(){ return a.join();}; "
+          "%PrepareFunctionForOptimization(Join);"
+          "Join();"
+          "%OptimizeFunctionOnNextCall(Join);"
+          "error = true;"
+          "Join();");
+      CHECK(try_catch.HasTerminated());
+      CHECK(isolate()->IsExecutionTerminating());
+    }
+    EXPECT_THAT(RunJS("a[0] = 1; Join();"), testing::IsString("1"));
+  }
+  {
+    Local<Context> context = Context::New(isolate(), nullptr, global_template);
+    Context::Scope context_scope(context);
+    {
+      TryCatch try_catch(isolate());
+      TryRunJS(
+          "var a = [{toString(){loop()}}];"
+          "function Join(){ return a.join();}; "
+          "Join();");
+      CHECK(try_catch.HasTerminated());
+      CHECK(isolate()->IsExecutionTerminating());
+    }
+    EXPECT_THAT(RunJS("a[0] = 1; Join();"), testing::IsString("1"));
+  }
+  {
+    ConsoleImpl console;
+    debug::SetConsoleDelegate(isolate(), &console);
+    HandleScope scope(isolate());
+    Local<Context> context = Context::New(isolate(), nullptr, global_template);
+    Context::Scope context_scope(context);
+    {
+      // setup console global.
+      HandleScope scope(isolate());
+      Local<String> name = String::NewFromUtf8Literal(
+          isolate(), "console", NewStringType::kInternalized);
+      Local<Value> console = context->GetExtrasBindingObject()
+                                 ->Get(context, name)
+                                 .ToLocalChecked();
+      context->Global()->Set(context, name, console).FromJust();
+    }
+    CHECK(!isolate()->IsExecutionTerminating());
+    {
+      TryCatch try_catch(isolate());
+      CHECK(!isolate()->IsExecutionTerminating());
+      CHECK(TryRunJS("var a = [{toString(){terminate();console.log();fail()}}];"
+                     "function Join() {return a.join();}"
+                     "Join();")
+                .IsEmpty());
+      CHECK(try_catch.HasCaught());
+      CHECK(isolate()->IsExecutionTerminating());
+    }
+    EXPECT_THAT(RunJS("a[0] = 1; Join();"), testing::IsString("1"));
+  }
+}
+
 class TerminatorSleeperThread : public base::Thread {
  public:
   explicit TerminatorSleeperThread(Isolate* isolate, int sleep_ms)
@@ -907,12 +977,12 @@ class TerminatorSleeperThread : public base::Thread {
 };
 
 TEST_F(ThreadTerminationTest, TerminateRegExp) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   // We want to be stuck regexp execution, so no fallback to linear-time
   // engine.
   // TODO(mbid,v8:10765): Find a way to test interrupt support of the
   // experimental engine.
-  i::FLAG_enable_experimental_regexp_engine_on_excessive_backtracks = false;
+  i::v8_flags.enable_experimental_regexp_engine_on_excessive_backtracks = false;
 
   HandleScope scope(isolate());
   Local<ObjectTemplate> global = CreateGlobalTemplate(
diff --git a/deps/v8/test/unittests/flags/flag-definitions-unittest.cc b/deps/v8/test/unittests/flags/flag-definitions-unittest.cc
index ee18fe00bdea9f..89022cc95e7301 100644
--- a/deps/v8/test/unittests/flags/flag-definitions-unittest.cc
+++ b/deps/v8/test/unittests/flags/flag-definitions-unittest.cc
@@ -41,10 +41,10 @@ class FlagDefinitionsTest : public ::testing::Test {
 };
 
 void TestDefault() {
-  CHECK(FLAG_testing_bool_flag);
-  CHECK_EQ(13, FLAG_testing_int_flag);
-  CHECK_EQ(2.5, FLAG_testing_float_flag);
-  CHECK_EQ(0, strcmp(FLAG_testing_string_flag, "Hello, world!"));
+  CHECK(v8_flags.testing_bool_flag);
+  CHECK_EQ(13, v8_flags.testing_int_flag);
+  CHECK_EQ(2.5, v8_flags.testing_float_flag);
+  CHECK_EQ(0, strcmp(v8_flags.testing_string_flag, "Hello, world!"));
 }
 
 // This test must be executed first!
@@ -65,12 +65,12 @@ TEST_F(FlagDefinitionsTest, Flags2) {
   CHECK_EQ(0, FlagList::SetFlagsFromCommandLine(&argc, const_cast<char**>(argv),
                                                 false));
   CHECK_EQ(8, argc);
-  CHECK(!FLAG_testing_bool_flag);
-  CHECK(FLAG_testing_maybe_bool_flag.value().has_value());
-  CHECK(!FLAG_testing_maybe_bool_flag.value().value());
-  CHECK_EQ(77, FLAG_testing_int_flag);
-  CHECK_EQ(.25, FLAG_testing_float_flag);
-  CHECK_EQ(0, strcmp(FLAG_testing_string_flag, "no way!"));
+  CHECK(!v8_flags.testing_bool_flag);
+  CHECK(v8_flags.testing_maybe_bool_flag.value().has_value());
+  CHECK(!v8_flags.testing_maybe_bool_flag.value().value());
+  CHECK_EQ(77, v8_flags.testing_int_flag);
+  CHECK_EQ(.25, v8_flags.testing_float_flag);
+  CHECK_EQ(0, strcmp(v8_flags.testing_string_flag, "no way!"));
 }
 
 TEST_F(FlagDefinitionsTest, Flags2b) {
@@ -80,12 +80,12 @@ TEST_F(FlagDefinitionsTest, Flags2b) {
       "-testing_float_flag=.25  "
       "--testing_string_flag   no_way!  ";
   CHECK_EQ(0, FlagList::SetFlagsFromString(str, strlen(str)));
-  CHECK(!FLAG_testing_bool_flag);
-  CHECK(FLAG_testing_maybe_bool_flag.value().has_value());
-  CHECK(!FLAG_testing_maybe_bool_flag.value().value());
-  CHECK_EQ(77, FLAG_testing_int_flag);
-  CHECK_EQ(.25, FLAG_testing_float_flag);
-  CHECK_EQ(0, strcmp(FLAG_testing_string_flag, "no_way!"));
+  CHECK(!v8_flags.testing_bool_flag);
+  CHECK(v8_flags.testing_maybe_bool_flag.value().has_value());
+  CHECK(!v8_flags.testing_maybe_bool_flag.value().value());
+  CHECK_EQ(77, v8_flags.testing_int_flag);
+  CHECK_EQ(.25, v8_flags.testing_float_flag);
+  CHECK_EQ(0, strcmp(v8_flags.testing_string_flag, "no_way!"));
 }
 
 TEST_F(FlagDefinitionsTest, Flags3) {
@@ -102,12 +102,12 @@ TEST_F(FlagDefinitionsTest, Flags3) {
   CHECK_EQ(0, FlagList::SetFlagsFromCommandLine(&argc, const_cast<char**>(argv),
                                                 true));
   CHECK_EQ(2, argc);
-  CHECK(FLAG_testing_bool_flag);
-  CHECK(FLAG_testing_maybe_bool_flag.value().has_value());
-  CHECK(FLAG_testing_maybe_bool_flag.value().value());
-  CHECK_EQ(-666, FLAG_testing_int_flag);
-  CHECK_EQ(-12E10, FLAG_testing_float_flag);
-  CHECK_EQ(0, strcmp(FLAG_testing_string_flag, "foo-bar"));
+  CHECK(v8_flags.testing_bool_flag);
+  CHECK(v8_flags.testing_maybe_bool_flag.value().has_value());
+  CHECK(v8_flags.testing_maybe_bool_flag.value().value());
+  CHECK_EQ(-666, v8_flags.testing_int_flag);
+  CHECK_EQ(-12E10, v8_flags.testing_float_flag);
+  CHECK_EQ(0, strcmp(v8_flags.testing_string_flag, "foo-bar"));
 }
 
 TEST_F(FlagDefinitionsTest, Flags3b) {
@@ -117,12 +117,12 @@ TEST_F(FlagDefinitionsTest, Flags3b) {
       "--testing_float_flag -12E10 "
       "-testing-string-flag=foo-bar";
   CHECK_EQ(0, FlagList::SetFlagsFromString(str, strlen(str)));
-  CHECK(FLAG_testing_bool_flag);
-  CHECK(FLAG_testing_maybe_bool_flag.value().has_value());
-  CHECK(FLAG_testing_maybe_bool_flag.value().value());
-  CHECK_EQ(-666, FLAG_testing_int_flag);
-  CHECK_EQ(-12E10, FLAG_testing_float_flag);
-  CHECK_EQ(0, strcmp(FLAG_testing_string_flag, "foo-bar"));
+  CHECK(v8_flags.testing_bool_flag);
+  CHECK(v8_flags.testing_maybe_bool_flag.value().has_value());
+  CHECK(v8_flags.testing_maybe_bool_flag.value().value());
+  CHECK_EQ(-666, v8_flags.testing_int_flag);
+  CHECK_EQ(-12E10, v8_flags.testing_float_flag);
+  CHECK_EQ(0, strcmp(v8_flags.testing_string_flag, "foo-bar"));
 }
 
 TEST_F(FlagDefinitionsTest, Flags4) {
@@ -131,13 +131,13 @@ TEST_F(FlagDefinitionsTest, Flags4) {
   CHECK_EQ(0, FlagList::SetFlagsFromCommandLine(&argc, const_cast<char**>(argv),
                                                 true));
   CHECK_EQ(2, argc);
-  CHECK(!FLAG_testing_maybe_bool_flag.value().has_value());
+  CHECK(!v8_flags.testing_maybe_bool_flag.value().has_value());
 }
 
 TEST_F(FlagDefinitionsTest, Flags4b) {
   const char* str = "--testing_bool_flag --foo";
   CHECK_EQ(2, FlagList::SetFlagsFromString(str, strlen(str)));
-  CHECK(!FLAG_testing_maybe_bool_flag.value().has_value());
+  CHECK(!v8_flags.testing_maybe_bool_flag.value().has_value());
 }
 
 TEST_F(FlagDefinitionsTest, Flags5) {
@@ -179,44 +179,45 @@ TEST_F(FlagDefinitionsTest, FlagsRemoveIncomplete) {
 }
 
 TEST_F(FlagDefinitionsTest, FlagsJitlessImplications) {
-  if (FLAG_jitless) {
+  if (v8_flags.jitless) {
     // Double-check implications work as expected. Our implication system is
     // fairly primitive and can break easily depending on the implication
     // definition order in flag-definitions.h.
-    CHECK(!FLAG_turbofan);
-    CHECK(!FLAG_maglev);
-    CHECK(!FLAG_sparkplug);
+    CHECK(!v8_flags.turbofan);
+    CHECK(!v8_flags.maglev);
+    CHECK(!v8_flags.sparkplug);
 #if V8_ENABLE_WEBASSEMBLY
-    CHECK(!FLAG_validate_asm);
-    CHECK(!FLAG_asm_wasm_lazy_compilation);
-    CHECK(!FLAG_wasm_lazy_compilation);
+    CHECK(!v8_flags.validate_asm);
+    CHECK(!v8_flags.asm_wasm_lazy_compilation);
+    CHECK(!v8_flags.wasm_lazy_compilation);
 #endif  // V8_ENABLE_WEBASSEMBLY
   }
 }
 
 TEST_F(FlagDefinitionsTest, FreezeFlags) {
   // Before freezing, we can arbitrarily change values.
-  CHECK_EQ(13, FLAG_testing_int_flag);  // Initial (default) value.
-  FLAG_testing_int_flag = 27;
-  CHECK_EQ(27, FLAG_testing_int_flag);
+  CHECK_EQ(13, v8_flags.testing_int_flag);  // Initial (default) value.
+  v8_flags.testing_int_flag = 27;
+  CHECK_EQ(27, v8_flags.testing_int_flag);
 
   // Get a direct pointer to the flag storage.
-  static_assert(sizeof(FLAG_testing_int_flag) == sizeof(int));
-  int* direct_testing_int_ptr = reinterpret_cast<int*>(&FLAG_testing_int_flag);
+  static_assert(sizeof(v8_flags.testing_int_flag) == sizeof(int));
+  int* direct_testing_int_ptr =
+      reinterpret_cast<int*>(&v8_flags.testing_int_flag);
   CHECK_EQ(27, *direct_testing_int_ptr);
   *direct_testing_int_ptr = 42;
-  CHECK_EQ(42, FLAG_testing_int_flag);
+  CHECK_EQ(42, v8_flags.testing_int_flag);
 
   // Now freeze flags. Accesses via the API and via the direct pointer should
   // both crash.
   FlagList::FreezeFlags();
   // Accessing via the API fails with a CHECK.
-  ASSERT_DEATH_IF_SUPPORTED(FLAG_testing_int_flag = 41,
+  ASSERT_DEATH_IF_SUPPORTED(v8_flags.testing_int_flag = 41,
                             "Check failed: !IsFrozen\\(\\)");
   // Writing to the memory directly results in a segfault.
   ASSERT_DEATH_IF_SUPPORTED(*direct_testing_int_ptr = 41, "");
   // We can still read the old value.
-  CHECK_EQ(42, FLAG_testing_int_flag);
+  CHECK_EQ(42, v8_flags.testing_int_flag);
   CHECK_EQ(42, *direct_testing_int_ptr);
 }
 
diff --git a/deps/v8/test/unittests/heap/base/basic-slot-set-unittest.cc b/deps/v8/test/unittests/heap/base/basic-slot-set-unittest.cc
new file mode 100644
index 00000000000000..ea493de3f02af0
--- /dev/null
+++ b/deps/v8/test/unittests/heap/base/basic-slot-set-unittest.cc
@@ -0,0 +1,198 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/base/basic-slot-set.h"
+
+#include <limits>
+#include <map>
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace heap {
+namespace base {
+
+static constexpr size_t kTestGranularity = sizeof(void*);
+using TestSlotSet = ::heap::base::BasicSlotSet<kTestGranularity>;
+static constexpr size_t kTestPageSize = 1 << 17;
+static constexpr size_t kBucketsTestPage =
+    TestSlotSet::BucketsForSize(kTestPageSize);
+
+TEST(BasicSlotSet, InsertAndLookup1) {
+  TestSlotSet* set = TestSlotSet::Allocate(kBucketsTestPage);
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    EXPECT_FALSE(set->Lookup(i));
+  }
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    set->Insert<TestSlotSet::AccessMode::ATOMIC>(i);
+  }
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    EXPECT_TRUE(set->Lookup(i));
+  }
+  TestSlotSet::Delete(set, kBucketsTestPage);
+}
+
+TEST(BasicSlotSet, InsertAndLookup2) {
+  TestSlotSet* set = TestSlotSet::Allocate(kBucketsTestPage);
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    if (i % 7 == 0) {
+      set->Insert<TestSlotSet::AccessMode::ATOMIC>(i);
+    }
+  }
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    if (i % 7 == 0) {
+      EXPECT_TRUE(set->Lookup(i));
+    } else {
+      EXPECT_FALSE(set->Lookup(i));
+    }
+  }
+  TestSlotSet::Delete(set, kBucketsTestPage);
+}
+
+TEST(BasicSlotSet, Iterate) {
+  TestSlotSet* set = TestSlotSet::Allocate(kBucketsTestPage);
+
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    if (i % 7 == 0) {
+      set->Insert<TestSlotSet::AccessMode::ATOMIC>(i);
+    }
+  }
+
+  set->Iterate(
+      0, 0, kBucketsTestPage,
+      [](uintptr_t slot) {
+        if (slot % 3 == 0) {
+          return KEEP_SLOT;
+        } else {
+          return REMOVE_SLOT;
+        }
+      },
+      TestSlotSet::KEEP_EMPTY_BUCKETS);
+
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    if (i % 21 == 0) {
+      EXPECT_TRUE(set->Lookup(i));
+    } else {
+      EXPECT_FALSE(set->Lookup(i));
+    }
+  }
+
+  TestSlotSet::Delete(set, kBucketsTestPage);
+}
+
+TEST(BasicSlotSet, IterateFromHalfway) {
+  TestSlotSet* set = TestSlotSet::Allocate(kBucketsTestPage);
+
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    if (i % 7 == 0) {
+      set->Insert<TestSlotSet::AccessMode::ATOMIC>(i);
+    }
+  }
+
+  set->Iterate(
+      0, kBucketsTestPage / 2, kBucketsTestPage,
+      [](uintptr_t slot) {
+        if (slot % 3 == 0) {
+          return KEEP_SLOT;
+        } else {
+          return REMOVE_SLOT;
+        }
+      },
+      TestSlotSet::KEEP_EMPTY_BUCKETS);
+
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    if (i < kTestPageSize / 2 && i % 7 == 0) {
+      EXPECT_TRUE(set->Lookup(i));
+    } else if (i >= kTestPageSize / 2 && i % 21 == 0) {
+      EXPECT_TRUE(set->Lookup(i));
+    } else {
+      EXPECT_FALSE(set->Lookup(i));
+    }
+  }
+
+  TestSlotSet::Delete(set, kBucketsTestPage);
+}
+
+TEST(BasicSlotSet, Remove) {
+  TestSlotSet* set = TestSlotSet::Allocate(kBucketsTestPage);
+
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    if (i % 7 == 0) {
+      set->Insert<TestSlotSet::AccessMode::ATOMIC>(i);
+    }
+  }
+
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    if (i % 3 != 0) {
+      set->Remove(i);
+    }
+  }
+
+  for (size_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+    if (i % 21 == 0) {
+      EXPECT_TRUE(set->Lookup(i));
+    } else {
+      EXPECT_FALSE(set->Lookup(i));
+    }
+  }
+
+  TestSlotSet::Delete(set, kBucketsTestPage);
+}
+
+namespace {
+void CheckRemoveRangeOn(uint32_t start, uint32_t end) {
+  TestSlotSet* set = TestSlotSet::Allocate(kBucketsTestPage);
+  uint32_t first = start == 0 ? 0 : start - kTestGranularity;
+  uint32_t last = end == kTestPageSize ? end - kTestGranularity : end;
+  for (const auto mode :
+       {TestSlotSet::FREE_EMPTY_BUCKETS, TestSlotSet::KEEP_EMPTY_BUCKETS}) {
+    for (uint32_t i = first; i <= last; i += kTestGranularity) {
+      set->Insert<TestSlotSet::AccessMode::ATOMIC>(i);
+    }
+    set->RemoveRange(start, end, kBucketsTestPage, mode);
+    if (first != start) {
+      EXPECT_TRUE(set->Lookup(first));
+    }
+    if (last == end) {
+      EXPECT_TRUE(set->Lookup(last));
+    }
+    for (size_t i = start; i < end; i += kTestGranularity) {
+      EXPECT_FALSE(set->Lookup(i));
+    }
+  }
+  TestSlotSet::Delete(set, kBucketsTestPage);
+}
+}  // namespace
+
+TEST(BasicSlotSet, RemoveRange) {
+  CheckRemoveRangeOn(0, kTestPageSize);
+  CheckRemoveRangeOn(1 * kTestGranularity, 1023 * kTestGranularity);
+  for (uint32_t start = 0; start <= 32; start++) {
+    CheckRemoveRangeOn(start * kTestGranularity,
+                       (start + 1) * kTestGranularity);
+    CheckRemoveRangeOn(start * kTestGranularity,
+                       (start + 2) * kTestGranularity);
+    const uint32_t kEnds[] = {32, 64, 100, 128, 1024, 1500, 2048};
+    for (size_t i = 0; i < sizeof(kEnds) / sizeof(uint32_t); i++) {
+      for (int k = -3; k <= 3; k++) {
+        uint32_t end = (kEnds[i] + k);
+        if (start < end) {
+          CheckRemoveRangeOn(start * kTestGranularity, end * kTestGranularity);
+        }
+      }
+    }
+  }
+  TestSlotSet* set = TestSlotSet::Allocate(kBucketsTestPage);
+  for (const auto mode :
+       {TestSlotSet::FREE_EMPTY_BUCKETS, TestSlotSet::KEEP_EMPTY_BUCKETS}) {
+    set->Insert<TestSlotSet::AccessMode::ATOMIC>(kTestPageSize / 2);
+    set->RemoveRange(0, kTestPageSize, kBucketsTestPage, mode);
+    for (uint32_t i = 0; i < kTestPageSize; i += kTestGranularity) {
+      EXPECT_FALSE(set->Lookup(i));
+    }
+  }
+  TestSlotSet::Delete(set, kBucketsTestPage);
+}
+
+}  // namespace base
+}  // namespace heap
diff --git a/deps/v8/test/unittests/heap/conservative-stack-visitor-unittest.cc b/deps/v8/test/unittests/heap/conservative-stack-visitor-unittest.cc
new file mode 100644
index 00000000000000..937b58161841c0
--- /dev/null
+++ b/deps/v8/test/unittests/heap/conservative-stack-visitor-unittest.cc
@@ -0,0 +1,230 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/heap/conservative-stack-visitor.h"
+
+#include "test/unittests/heap/heap-utils.h"
+#include "test/unittests/test-utils.h"
+
+namespace v8 {
+namespace internal {
+
+namespace {
+
+class RecordingVisitor final : public RootVisitor {
+ public:
+  V8_NOINLINE explicit RecordingVisitor(Isolate* isolate) {
+    // Allocate the object.
+    auto h = isolate->factory()->NewFixedArray(256, AllocationType::kOld);
+    the_object_ = h->GetHeapObject();
+    base_address_ = the_object_.address();
+    tagged_address_ = the_object_.ptr();
+    inner_address_ = base_address_ + 42 * kTaggedSize;
+#ifdef V8_COMPRESS_POINTERS
+    compr_address_ = static_cast<uint32_t>(
+        V8HeapCompressionScheme::CompressTagged(base_address_));
+    compr_inner_ = static_cast<uint32_t>(
+        V8HeapCompressionScheme::CompressTagged(inner_address_));
+#else
+    compr_address_ = static_cast<uint32_t>(base_address_);
+    compr_inner_ = static_cast<uint32_t>(inner_address_);
+#endif
+  }
+
+  void VisitRootPointers(Root root, const char* description,
+                         FullObjectSlot start, FullObjectSlot end) override {
+    for (FullObjectSlot current = start; current != end; ++current) {
+      if (*current == the_object_) found_ = true;
+    }
+  }
+
+  void Reset() { found_ = false; }
+  bool found() const { return found_; }
+
+  Address base_address() const { return base_address_; }
+  Address tagged_address() const { return tagged_address_; }
+  Address inner_address() const { return inner_address_; }
+  uint32_t compr_address() const { return compr_address_; }
+  uint32_t compr_inner() const { return compr_inner_; }
+
+ private:
+  // Some heap object that we want to check if it is visited or not.
+  HeapObject the_object_;
+
+  // Addresses of this object.
+  Address base_address_;    // Uncompressed base address
+  Address tagged_address_;  // Tagged uncompressed base address
+  Address inner_address_;   // Some inner address
+  uint32_t compr_address_;  // Compressed base address
+  uint32_t compr_inner_;    // Compressed inner address
+
+  // Has the object been found?
+  bool found_ = false;
+};
+
+}  // namespace
+
+using ConservativeStackVisitorTest = TestWithHeapInternalsAndContext;
+
+// In the following, we avoid negative tests, i.e., tests checking that objects
+// are not visited when there are no pointers to them on the stack. Such tests
+// are generally fragile and could fail on some platforms because of unforeseen
+// compiler optimizations. In general we cannot ensure in a portable way that
+// no pointer remained on the stack (or in some register) after the
+// initialization of RecordingVisitor and until the invocation of
+// Stack::IteratePointers.
+
+TEST_F(ConservativeStackVisitorTest, DirectBasePointer) {
+  auto recorder = std::make_unique<RecordingVisitor>(isolate());
+
+  // Ensure the heap is iterable before CSS.
+  SafepointScope safepoint_scope(heap());
+  heap()->MakeHeapIterable();
+
+  {
+    volatile Address ptr = recorder->base_address();
+
+    ConservativeStackVisitor stack_visitor(isolate(), recorder.get());
+    isolate()->heap()->stack().IteratePointers(&stack_visitor);
+
+    // Make sure to keep the pointer alive.
+    EXPECT_NE(kNullAddress, ptr);
+  }
+
+  // The object should have been visited.
+  EXPECT_TRUE(recorder->found());
+}
+
+TEST_F(ConservativeStackVisitorTest, TaggedBasePointer) {
+  auto recorder = std::make_unique<RecordingVisitor>(isolate());
+
+  // Ensure the heap is iterable before CSS.
+  SafepointScope safepoint_scope(heap());
+  heap()->MakeHeapIterable();
+
+  {
+    volatile Address ptr = recorder->tagged_address();
+
+    ConservativeStackVisitor stack_visitor(isolate(), recorder.get());
+    isolate()->heap()->stack().IteratePointers(&stack_visitor);
+
+    // Make sure to keep the pointer alive.
+    EXPECT_NE(kNullAddress, ptr);
+  }
+
+  // The object should have been visited.
+  EXPECT_TRUE(recorder->found());
+}
+
+TEST_F(ConservativeStackVisitorTest, InnerPointer) {
+  auto recorder = std::make_unique<RecordingVisitor>(isolate());
+
+  // Ensure the heap is iterable before CSS.
+  SafepointScope safepoint_scope(heap());
+  heap()->MakeHeapIterable();
+
+  {
+    volatile Address ptr = recorder->inner_address();
+
+    ConservativeStackVisitor stack_visitor(isolate(), recorder.get());
+    isolate()->heap()->stack().IteratePointers(&stack_visitor);
+
+    // Make sure to keep the pointer alive.
+    EXPECT_NE(kNullAddress, ptr);
+  }
+
+  // The object should have been visited.
+  EXPECT_TRUE(recorder->found());
+}
+
+#ifdef V8_COMPRESS_POINTERS
+
+TEST_F(ConservativeStackVisitorTest, HalfWord1) {
+  auto recorder = std::make_unique<RecordingVisitor>(isolate());
+
+  // Ensure the heap is iterable before CSS.
+  SafepointScope safepoint_scope(heap());
+  heap()->MakeHeapIterable();
+
+  {
+    volatile uint32_t ptr[] = {recorder->compr_address(), 0};
+
+    ConservativeStackVisitor stack_visitor(isolate(), recorder.get());
+    isolate()->heap()->stack().IteratePointers(&stack_visitor);
+
+    // Make sure to keep the pointer alive.
+    EXPECT_NE(static_cast<uint32_t>(0), ptr[0]);
+  }
+
+  // The object should have been visited.
+  EXPECT_TRUE(recorder->found());
+}
+
+TEST_F(ConservativeStackVisitorTest, HalfWord2) {
+  auto recorder = std::make_unique<RecordingVisitor>(isolate());
+
+  // Ensure the heap is iterable before CSS.
+  SafepointScope safepoint_scope(heap());
+  heap()->MakeHeapIterable();
+
+  {
+    volatile uint32_t ptr[] = {0, recorder->compr_address()};
+
+    ConservativeStackVisitor stack_visitor(isolate(), recorder.get());
+    isolate()->heap()->stack().IteratePointers(&stack_visitor);
+
+    // Make sure to keep the pointer alive.
+    EXPECT_NE(static_cast<uint32_t>(0), ptr[1]);
+  }
+
+  // The object should have been visited.
+  EXPECT_TRUE(recorder->found());
+}
+
+TEST_F(ConservativeStackVisitorTest, InnerHalfWord1) {
+  auto recorder = std::make_unique<RecordingVisitor>(isolate());
+
+  // Ensure the heap is iterable before CSS.
+  SafepointScope safepoint_scope(heap());
+  heap()->MakeHeapIterable();
+
+  {
+    volatile uint32_t ptr[] = {recorder->compr_inner(), 0};
+
+    ConservativeStackVisitor stack_visitor(isolate(), recorder.get());
+    isolate()->heap()->stack().IteratePointers(&stack_visitor);
+
+    // Make sure to keep the pointer alive.
+    EXPECT_NE(static_cast<uint32_t>(0), ptr[0]);
+  }
+
+  // The object should have been visited.
+  EXPECT_TRUE(recorder->found());
+}
+
+TEST_F(ConservativeStackVisitorTest, InnerHalfWord2) {
+  auto recorder = std::make_unique<RecordingVisitor>(isolate());
+
+  // Ensure the heap is iterable before CSS.
+  SafepointScope safepoint_scope(heap());
+  heap()->MakeHeapIterable();
+
+  {
+    volatile uint32_t ptr[] = {0, recorder->compr_inner()};
+
+    ConservativeStackVisitor stack_visitor(isolate(), recorder.get());
+    isolate()->heap()->stack().IteratePointers(&stack_visitor);
+
+    // Make sure to keep the pointer alive.
+    EXPECT_NE(static_cast<uint32_t>(0), ptr[1]);
+  }
+
+  // The object should have been visited.
+  EXPECT_TRUE(recorder->found());
+}
+
+#endif  // V8_COMPRESS_POINTERS
+
+}  // namespace internal
+}  // namespace v8
diff --git a/deps/v8/test/unittests/heap/cppgc-js/traced-reference-unittest.cc b/deps/v8/test/unittests/heap/cppgc-js/traced-reference-unittest.cc
index 3521f848a2bbe2..eec4069ad14446 100644
--- a/deps/v8/test/unittests/heap/cppgc-js/traced-reference-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc-js/traced-reference-unittest.cc
@@ -7,6 +7,7 @@
 #include "src/api/api-inl.h"
 #include "src/handles/global-handles.h"
 #include "src/heap/cppgc/visitor.h"
+#include "src/heap/marking-state-inl.h"
 #include "test/unittests/heap/heap-utils.h"
 #include "test/unittests/test-utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/deps/v8/test/unittests/heap/cppgc-js/unified-heap-unittest.cc b/deps/v8/test/unittests/heap/cppgc-js/unified-heap-unittest.cc
index e904f95a55f667..4be30638239100 100644
--- a/deps/v8/test/unittests/heap/cppgc-js/unified-heap-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc-js/unified-heap-unittest.cc
@@ -389,5 +389,36 @@ TEST_F(UnifiedHeapTest, InConstructionObjectReferringToGlobalHandle) {
   }
 }
 
+namespace {
+
+class ResetReferenceInDestructorObject final
+    : public cppgc::GarbageCollected<ResetReferenceInDestructorObject> {
+ public:
+  ResetReferenceInDestructorObject(Heap* heap, v8::Local<v8::Object> wrapper)
+      : wrapper_(reinterpret_cast<v8::Isolate*>(heap->isolate()), wrapper) {}
+  ~ResetReferenceInDestructorObject() { wrapper_.Reset(); }
+
+  void Trace(cppgc::Visitor* visitor) const { visitor->Trace(wrapper_); }
+
+ private:
+  TracedReference<v8::Object> wrapper_;
+};
+
+}  // namespace
+
+TEST_F(UnifiedHeapTest, ResetReferenceInDestructor) {
+  v8::HandleScope handle_scope(v8_isolate());
+  v8::Local<v8::Context> context = v8::Context::New(v8_isolate());
+  v8::Context::Scope context_scope(context);
+  {
+    v8::HandleScope inner_handle_scope(v8_isolate());
+    auto local = v8::Object::New(v8_isolate());
+    cppgc::MakeGarbageCollected<ResetReferenceInDestructorObject>(
+        allocation_handle(),
+        reinterpret_cast<i::Isolate*>(v8_isolate())->heap(), local);
+  }
+  CollectGarbageWithoutEmbedderStack(cppgc::Heap::SweepingType::kAtomic);
+}
+
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/test/unittests/heap/cppgc/compactor-unittest.cc b/deps/v8/test/unittests/heap/cppgc/compactor-unittest.cc
index a1482cf7097a6d..1df053ae64e9af 100644
--- a/deps/v8/test/unittests/heap/cppgc/compactor-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/compactor-unittest.cc
@@ -74,9 +74,8 @@ class CompactorTest : public testing::TestWithPlatform {
 
   void StartCompaction() {
     compactor().EnableForNextGCForTesting();
-    compactor().InitializeIfShouldCompact(
-        GarbageCollector::Config::MarkingType::kIncremental,
-        GarbageCollector::Config::StackState::kNoHeapPointers);
+    compactor().InitializeIfShouldCompact(GCConfig::MarkingType::kIncremental,
+                                          StackState::kNoHeapPointers);
     EXPECT_TRUE(compactor().IsEnabledForTesting());
   }
 
@@ -86,18 +85,17 @@ class CompactorTest : public testing::TestWithPlatform {
     CompactableGCed::g_destructor_callcount = 0u;
     StartCompaction();
     heap()->StartIncrementalGarbageCollection(
-        GarbageCollector::Config::PreciseIncrementalConfig());
+        GCConfig::PreciseIncrementalConfig());
   }
 
   void EndGC() {
-    heap()->marker()->FinishMarking(
-        GarbageCollector::Config::StackState::kNoHeapPointers);
+    heap()->marker()->FinishMarking(StackState::kNoHeapPointers);
     heap()->GetMarkerRefForTesting().reset();
     FinishCompaction();
     // Sweeping also verifies the object start bitmap.
-    const Sweeper::SweepingConfig sweeping_config{
-        Sweeper::SweepingConfig::SweepingType::kAtomic,
-        Sweeper::SweepingConfig::CompactableSpaceHandling::kIgnore};
+    const SweepingConfig sweeping_config{
+        SweepingConfig::SweepingType::kAtomic,
+        SweepingConfig::CompactableSpaceHandling::kIgnore};
     heap()->sweeper().Start(sweeping_config);
   }
 
@@ -125,13 +123,12 @@ namespace internal {
 TEST_F(CompactorTest, NothingToCompact) {
   StartCompaction();
   heap()->stats_collector()->NotifyMarkingStarted(
-      GarbageCollector::Config::CollectionType::kMajor,
-      GarbageCollector::Config::MarkingType::kAtomic,
-      GarbageCollector::Config::IsForcedGC::kNotForced);
+      CollectionType::kMajor, GCConfig::MarkingType::kAtomic,
+      GCConfig::IsForcedGC::kNotForced);
   heap()->stats_collector()->NotifyMarkingCompleted(0);
   FinishCompaction();
   heap()->stats_collector()->NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+      GCConfig::SweepingType::kAtomic);
 }
 
 TEST_F(CompactorTest, NonEmptySpaceAllLive) {
diff --git a/deps/v8/test/unittests/heap/cppgc/concurrent-marking-unittest.cc b/deps/v8/test/unittests/heap/cppgc/concurrent-marking-unittest.cc
index 3a8d0307d02b71..617d78e253d298 100644
--- a/deps/v8/test/unittests/heap/cppgc/concurrent-marking-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/concurrent-marking-unittest.cc
@@ -27,20 +27,15 @@ class ConcurrentMarkingTest : public testing::TestWithHeap {
   static constexpr int kNumStep = 10;
 #endif  // defined(THREAD_SANITIZER)
 
-  using Config = Heap::Config;
-  static constexpr Config ConcurrentPreciseConfig = {
-      Config::CollectionType::kMajor, Config::StackState::kNoHeapPointers,
-      Config::MarkingType::kIncrementalAndConcurrent,
-      Config::SweepingType::kIncrementalAndConcurrent};
-
   void StartConcurrentGC() {
     Heap* heap = Heap::From(GetHeap());
     heap->DisableHeapGrowingForTesting();
-    heap->StartIncrementalGarbageCollection(ConcurrentPreciseConfig);
+    heap->StartIncrementalGarbageCollection(
+        GCConfig::PreciseConcurrentConfig());
     heap->marker()->SetMainThreadMarkingDisabledForTesting(true);
   }
 
-  bool SingleStep(Config::StackState stack_state) {
+  bool SingleStep(StackState stack_state) {
     MarkerBase* marker = Heap::From(GetHeap())->marker();
     DCHECK(marker);
     return marker->IncrementalMarkingStepForTesting(stack_state);
@@ -50,14 +45,10 @@ class ConcurrentMarkingTest : public testing::TestWithHeap {
     Heap* heap = Heap::From(GetHeap());
     heap->marker()->SetMainThreadMarkingDisabledForTesting(false);
     heap->FinalizeIncrementalGarbageCollectionIfRunning(
-        ConcurrentPreciseConfig);
+        GCConfig::PreciseConcurrentConfig());
   }
 };
 
-// static
-constexpr ConcurrentMarkingTest::Config
-    ConcurrentMarkingTest::ConcurrentPreciseConfig;
-
 template <typename T>
 struct GCedHolder : public GarbageCollected<GCedHolder<T>> {
   void Trace(cppgc::Visitor* visitor) const { visitor->Trace(object); }
@@ -110,7 +101,7 @@ TEST_F(ConcurrentMarkingTest, MarkingObjects) {
       last_object = &(*last_object)->child_;
     }
     // Use SingleStep to re-post concurrent jobs.
-    SingleStep(Config::StackState::kNoHeapPointers);
+    SingleStep(StackState::kNoHeapPointers);
   }
   FinishGC();
 }
@@ -129,7 +120,7 @@ TEST_F(ConcurrentMarkingTest, MarkingInConstructionObjects) {
           });
     }
     // Use SingleStep to re-post concurrent jobs.
-    SingleStep(Config::StackState::kNoHeapPointers);
+    SingleStep(StackState::kNoHeapPointers);
   }
   FinishGC();
 }
@@ -145,7 +136,7 @@ TEST_F(ConcurrentMarkingTest, MarkingMixinObjects) {
       last_object = &(*last_object)->child_;
     }
     // Use SingleStep to re-post concurrent jobs.
-    SingleStep(Config::StackState::kNoHeapPointers);
+    SingleStep(StackState::kNoHeapPointers);
   }
   FinishGC();
 }
diff --git a/deps/v8/test/unittests/heap/cppgc/concurrent-sweeper-unittest.cc b/deps/v8/test/unittests/heap/cppgc/concurrent-sweeper-unittest.cc
index 3e417f7a5480b1..d2ea7390165dde 100644
--- a/deps/v8/test/unittests/heap/cppgc/concurrent-sweeper-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/concurrent-sweeper-unittest.cc
@@ -73,14 +73,13 @@ class ConcurrentSweeperTest : public testing::TestWithHeap {
     // Pretend do finish marking as StatsCollector verifies that Notify*
     // methods are called in the right order.
     heap->stats_collector()->NotifyMarkingStarted(
-        GarbageCollector::Config::CollectionType::kMajor,
-        GarbageCollector::Config::MarkingType::kAtomic,
-        GarbageCollector::Config::IsForcedGC::kNotForced);
+        CollectionType::kMajor, GCConfig::MarkingType::kAtomic,
+        GCConfig::IsForcedGC::kNotForced);
     heap->stats_collector()->NotifyMarkingCompleted(0);
     Sweeper& sweeper = heap->sweeper();
-    const Sweeper::SweepingConfig sweeping_config{
-        Sweeper::SweepingConfig::SweepingType::kIncrementalAndConcurrent,
-        Sweeper::SweepingConfig::CompactableSpaceHandling::kSweep};
+    const SweepingConfig sweeping_config{
+        SweepingConfig::SweepingType::kIncrementalAndConcurrent,
+        SweepingConfig::CompactableSpaceHandling::kSweep};
     sweeper.Start(sweeping_config);
   }
 
diff --git a/deps/v8/test/unittests/heap/cppgc/ephemeron-pair-unittest.cc b/deps/v8/test/unittests/heap/cppgc/ephemeron-pair-unittest.cc
index fd04531f3a5716..41c98bc64f5bd5 100644
--- a/deps/v8/test/unittests/heap/cppgc/ephemeron-pair-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/ephemeron-pair-unittest.cc
@@ -49,11 +49,8 @@ class EphemeronHolderTraceEphemeron
 };
 
 class EphemeronPairTest : public testing::TestWithHeap {
-  using MarkingConfig = Marker::MarkingConfig;
-
-  static constexpr Marker::MarkingConfig IncrementalPreciseMarkingConfig = {
-      MarkingConfig::CollectionType::kMajor,
-      MarkingConfig::StackState::kNoHeapPointers,
+  static constexpr MarkingConfig IncrementalPreciseMarkingConfig = {
+      CollectionType::kMajor, StackState::kNoHeapPointers,
       MarkingConfig::MarkingType::kIncremental};
 
  public:
@@ -63,11 +60,11 @@ class EphemeronPairTest : public testing::TestWithHeap {
   }
 
   void FinishMarking() {
-    marker_->FinishMarking(MarkingConfig::StackState::kNoHeapPointers);
+    marker_->FinishMarking(StackState::kNoHeapPointers);
     // Pretend do finish sweeping as StatsCollector verifies that Notify*
     // methods are called in the right order.
     Heap::From(GetHeap())->stats_collector()->NotifySweepingCompleted(
-        GarbageCollector::Config::SweepingType::kIncremental);
+        GCConfig::SweepingType::kIncremental);
   }
 
   void InitializeMarker(HeapBase& heap, cppgc::Platform* platform) {
@@ -81,15 +78,14 @@ class EphemeronPairTest : public testing::TestWithHeap {
  private:
   bool SingleStep() {
     return marker_->IncrementalMarkingStepForTesting(
-        MarkingConfig::StackState::kNoHeapPointers);
+        StackState::kNoHeapPointers);
   }
 
   std::unique_ptr<Marker> marker_;
 };
 
 // static
-constexpr Marker::MarkingConfig
-    EphemeronPairTest::IncrementalPreciseMarkingConfig;
+constexpr MarkingConfig EphemeronPairTest::IncrementalPreciseMarkingConfig;
 
 }  // namespace
 
diff --git a/deps/v8/test/unittests/heap/cppgc/gc-invoker-unittest.cc b/deps/v8/test/unittests/heap/cppgc/gc-invoker-unittest.cc
index 529a42aef697e7..301612feb1612e 100644
--- a/deps/v8/test/unittests/heap/cppgc/gc-invoker-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/gc-invoker-unittest.cc
@@ -18,9 +18,8 @@ namespace {
 
 class MockGarbageCollector : public GarbageCollector {
  public:
-  MOCK_METHOD(void, CollectGarbage, (GarbageCollector::Config), (override));
-  MOCK_METHOD(void, StartIncrementalGarbageCollection,
-              (GarbageCollector::Config), (override));
+  MOCK_METHOD(void, CollectGarbage, (GCConfig), (override));
+  MOCK_METHOD(void, StartIncrementalGarbageCollection, (GCConfig), (override));
   MOCK_METHOD(size_t, epoch, (), (const, override));
   MOCK_METHOD(const EmbedderStackState*, override_stack_state, (),
               (const, override));
@@ -73,9 +72,8 @@ TEST(GCInvokerTest, PrecideGCIsInvokedSynchronously) {
   GCInvoker invoker(&gc, &platform,
                     cppgc::Heap::StackSupport::kNoConservativeStackScan);
   EXPECT_CALL(gc, CollectGarbage(::testing::Field(
-                      &GarbageCollector::Config::stack_state,
-                      GarbageCollector::Config::StackState::kNoHeapPointers)));
-  invoker.CollectGarbage(GarbageCollector::Config::PreciseAtomicConfig());
+                      &GCConfig::stack_state, StackState::kNoHeapPointers)));
+  invoker.CollectGarbage(GCConfig::PreciseAtomicConfig());
 }
 
 TEST(GCInvokerTest, ConservativeGCIsInvokedSynchronouslyWhenSupported) {
@@ -85,9 +83,8 @@ TEST(GCInvokerTest, ConservativeGCIsInvokedSynchronouslyWhenSupported) {
                     cppgc::Heap::StackSupport::kSupportsConservativeStackScan);
   EXPECT_CALL(
       gc, CollectGarbage(::testing::Field(
-              &GarbageCollector::Config::stack_state,
-              GarbageCollector::Config::StackState::kMayContainHeapPointers)));
-  invoker.CollectGarbage(GarbageCollector::Config::ConservativeAtomicConfig());
+              &GCConfig::stack_state, StackState::kMayContainHeapPointers)));
+  invoker.CollectGarbage(GCConfig::ConservativeAtomicConfig());
 }
 
 TEST(GCInvokerTest, ConservativeGCIsScheduledAsPreciseGCViaPlatform) {
@@ -100,7 +97,7 @@ TEST(GCInvokerTest, ConservativeGCIsScheduledAsPreciseGCViaPlatform) {
   EXPECT_CALL(gc, epoch).WillOnce(::testing::Return(0));
   EXPECT_CALL(*static_cast<MockTaskRunner*>(runner.get()),
               PostNonNestableTask(::testing::_));
-  invoker.CollectGarbage(GarbageCollector::Config::ConservativeAtomicConfig());
+  invoker.CollectGarbage(GCConfig::ConservativeAtomicConfig());
 }
 
 TEST(GCInvokerTest, ConservativeGCIsInvokedAsPreciseGCViaPlatform) {
@@ -110,7 +107,7 @@ TEST(GCInvokerTest, ConservativeGCIsInvokedAsPreciseGCViaPlatform) {
                     cppgc::Heap::StackSupport::kNoConservativeStackScan);
   EXPECT_CALL(gc, epoch).WillRepeatedly(::testing::Return(0));
   EXPECT_CALL(gc, CollectGarbage);
-  invoker.CollectGarbage(GarbageCollector::Config::ConservativeAtomicConfig());
+  invoker.CollectGarbage(GCConfig::ConservativeAtomicConfig());
   platform.RunAllForegroundTasks();
 }
 
@@ -125,20 +122,18 @@ TEST(GCInvokerTest, IncrementalGCIsStarted) {
       cppgc::Heap::StackSupport::kSupportsConservativeStackScan);
   EXPECT_CALL(
       gc, StartIncrementalGarbageCollection(::testing::Field(
-              &GarbageCollector::Config::stack_state,
-              GarbageCollector::Config::StackState::kMayContainHeapPointers)));
+              &GCConfig::stack_state, StackState::kMayContainHeapPointers)));
   invoker_with_support.StartIncrementalGarbageCollection(
-      GarbageCollector::Config::ConservativeIncrementalConfig());
+      GCConfig::ConservativeIncrementalConfig());
   // Conservative stack scanning *not* supported.
   GCInvoker invoker_without_support(
       &gc, &platform, cppgc::Heap::StackSupport::kNoConservativeStackScan);
-  EXPECT_CALL(
-      gc, StartIncrementalGarbageCollection(::testing::Field(
-              &GarbageCollector::Config::stack_state,
-              GarbageCollector::Config::StackState::kMayContainHeapPointers)))
+  EXPECT_CALL(gc,
+              StartIncrementalGarbageCollection(::testing::Field(
+                  &GCConfig::stack_state, StackState::kMayContainHeapPointers)))
       .Times(0);
   invoker_without_support.StartIncrementalGarbageCollection(
-      GarbageCollector::Config::ConservativeIncrementalConfig());
+      GCConfig::ConservativeIncrementalConfig());
 }
 
 }  // namespace internal
diff --git a/deps/v8/test/unittests/heap/cppgc/heap-growing-unittest.cc b/deps/v8/test/unittests/heap/cppgc/heap-growing-unittest.cc
index c980791af99969..5901482e0be840 100644
--- a/deps/v8/test/unittests/heap/cppgc/heap-growing-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/heap-growing-unittest.cc
@@ -22,19 +22,16 @@ class FakeGarbageCollector : public GarbageCollector {
 
   void SetLiveBytes(size_t live_bytes) { live_bytes_ = live_bytes; }
 
-  void CollectGarbage(GarbageCollector::Config config) override {
-    stats_collector_->NotifyMarkingStarted(
-        GarbageCollector::Config::CollectionType::kMajor,
-        GarbageCollector::Config::MarkingType::kAtomic,
-        GarbageCollector::Config::IsForcedGC::kNotForced);
+  void CollectGarbage(GCConfig config) override {
+    stats_collector_->NotifyMarkingStarted(CollectionType::kMajor,
+                                           GCConfig::MarkingType::kAtomic,
+                                           GCConfig::IsForcedGC::kNotForced);
     stats_collector_->NotifyMarkingCompleted(live_bytes_);
-    stats_collector_->NotifySweepingCompleted(
-        GarbageCollector::Config::SweepingType::kAtomic);
+    stats_collector_->NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
     callcount_++;
   }
 
-  void StartIncrementalGarbageCollection(
-      GarbageCollector::Config config) override {
+  void StartIncrementalGarbageCollection(GCConfig config) override {
     UNREACHABLE();
   }
 
@@ -51,9 +48,8 @@ class FakeGarbageCollector : public GarbageCollector {
 
 class MockGarbageCollector : public GarbageCollector {
  public:
-  MOCK_METHOD(void, CollectGarbage, (GarbageCollector::Config), (override));
-  MOCK_METHOD(void, StartIncrementalGarbageCollection,
-              (GarbageCollector::Config), (override));
+  MOCK_METHOD(void, CollectGarbage, (GCConfig), (override));
+  MOCK_METHOD(void, StartIncrementalGarbageCollection, (GCConfig), (override));
   MOCK_METHOD(size_t, epoch, (), (const, override));
   MOCK_METHOD(const EmbedderStackState*, override_stack_state, (),
               (const, override));
@@ -79,8 +75,7 @@ TEST(HeapGrowingTest, ConservativeGCInvoked) {
                       cppgc::Heap::SweepingType::kIncrementalAndConcurrent);
   EXPECT_CALL(
       gc, CollectGarbage(::testing::Field(
-              &GarbageCollector::Config::stack_state,
-              GarbageCollector::Config::StackState::kMayContainHeapPointers)));
+              &GCConfig::stack_state, StackState::kMayContainHeapPointers)));
   FakeAllocate(&stats_collector, 100 * kMB);
 }
 
@@ -97,8 +92,7 @@ TEST(HeapGrowingTest, InitialHeapSize) {
   FakeAllocate(&stats_collector, kObjectSize - 1);
   EXPECT_CALL(
       gc, CollectGarbage(::testing::Field(
-              &GarbageCollector::Config::stack_state,
-              GarbageCollector::Config::StackState::kMayContainHeapPointers)));
+              &GCConfig::stack_state, StackState::kMayContainHeapPointers)));
   FakeAllocate(&stats_collector, kObjectSize);
 }
 
@@ -146,9 +140,8 @@ TEST(HeapGrowingTest, IncrementalGCStarted) {
                       cppgc::Heap::MarkingType::kIncrementalAndConcurrent,
                       cppgc::Heap::SweepingType::kIncrementalAndConcurrent);
   EXPECT_CALL(
-      gc, CollectGarbage(::testing::Field(
-              &GarbageCollector::Config::stack_state,
-              GarbageCollector::Config::StackState::kMayContainHeapPointers)))
+      gc, CollectGarbage(::testing::Field(&GCConfig::stack_state,
+                                          StackState::kMayContainHeapPointers)))
       .Times(0);
   EXPECT_CALL(gc, StartIncrementalGarbageCollection(::testing::_));
   // Allocate 1 byte less the limit for atomic gc to trigger incremental gc.
@@ -163,9 +156,8 @@ TEST(HeapGrowingTest, IncrementalGCFinalized) {
                       cppgc::Heap::MarkingType::kIncrementalAndConcurrent,
                       cppgc::Heap::SweepingType::kIncrementalAndConcurrent);
   EXPECT_CALL(
-      gc, CollectGarbage(::testing::Field(
-              &GarbageCollector::Config::stack_state,
-              GarbageCollector::Config::StackState::kMayContainHeapPointers)))
+      gc, CollectGarbage(::testing::Field(&GCConfig::stack_state,
+                                          StackState::kMayContainHeapPointers)))
       .Times(0);
   EXPECT_CALL(gc, StartIncrementalGarbageCollection(::testing::_));
   // Allocate 1 byte less the limit for atomic gc to trigger incremental gc.
@@ -174,8 +166,7 @@ TEST(HeapGrowingTest, IncrementalGCFinalized) {
   ::testing::Mock::VerifyAndClearExpectations(&gc);
   EXPECT_CALL(
       gc, CollectGarbage(::testing::Field(
-              &GarbageCollector::Config::stack_state,
-              GarbageCollector::Config::StackState::kMayContainHeapPointers)));
+              &GCConfig::stack_state, StackState::kMayContainHeapPointers)));
   EXPECT_CALL(gc, StartIncrementalGarbageCollection(::testing::_)).Times(0);
   // Allocate the rest needed to trigger atomic gc ().
   FakeAllocate(&stats_collector, StatsCollector::kAllocationThresholdBytes);
diff --git a/deps/v8/test/unittests/heap/cppgc/heap-unittest.cc b/deps/v8/test/unittests/heap/cppgc/heap-unittest.cc
index 7dd850c5f6fa8b..c2021fe6eacc77 100644
--- a/deps/v8/test/unittests/heap/cppgc/heap-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/heap-unittest.cc
@@ -27,11 +27,11 @@ class GCHeapTest : public testing::TestWithHeap {
  public:
   void ConservativeGC() {
     internal::Heap::From(GetHeap())->CollectGarbage(
-        Heap::Config::ConservativeAtomicConfig());
+        GCConfig::ConservativeAtomicConfig());
   }
   void PreciseGC() {
     internal::Heap::From(GetHeap())->CollectGarbage(
-        Heap::Config::PreciseAtomicConfig());
+        GCConfig::PreciseAtomicConfig());
   }
 };
 
@@ -74,7 +74,7 @@ namespace {
 const void* ConservativeGCReturningObject(cppgc::Heap* heap,
                                           const void* object) {
   internal::Heap::From(heap)->CollectGarbage(
-      Heap::Config::ConservativeAtomicConfig());
+      GCConfig::ConservativeAtomicConfig());
   return object;
 }
 
@@ -113,7 +113,7 @@ class LargeObjectGCDuringCtor final
       : child_(MakeGarbageCollected<GCedWithFinalizer>(
             heap->GetAllocationHandle())) {
     internal::Heap::From(heap)->CollectGarbage(
-        Heap::Config::ConservativeAtomicConfig());
+        GCConfig::ConservativeAtomicConfig());
   }
 
   void Trace(Visitor* visitor) const { visitor->Trace(child_); }
@@ -235,8 +235,8 @@ TEST_F(GCHeapTest, IsGarbageCollectionAllowed) {
 }
 
 TEST_F(GCHeapTest, IsMarking) {
-  GarbageCollector::Config config = GarbageCollector::Config::
-      PreciseIncrementalMarkingConcurrentSweepingConfig();
+  GCConfig config =
+      GCConfig::PreciseIncrementalMarkingConcurrentSweepingConfig();
   auto* heap = Heap::From(GetHeap());
   EXPECT_FALSE(subtle::HeapState::IsMarking(*heap));
   heap->StartIncrementalGarbageCollection(config);
@@ -248,8 +248,8 @@ TEST_F(GCHeapTest, IsMarking) {
 }
 
 TEST_F(GCHeapTest, IsSweeping) {
-  GarbageCollector::Config config = GarbageCollector::Config::
-      PreciseIncrementalMarkingConcurrentSweepingConfig();
+  GCConfig config =
+      GCConfig::PreciseIncrementalMarkingConcurrentSweepingConfig();
   auto* heap = Heap::From(GetHeap());
   EXPECT_FALSE(subtle::HeapState::IsSweeping(*heap));
   heap->StartIncrementalGarbageCollection(config);
@@ -280,8 +280,8 @@ class GCedExpectSweepingOnOwningThread final
 }  // namespace
 
 TEST_F(GCHeapTest, IsSweepingOnOwningThread) {
-  GarbageCollector::Config config = GarbageCollector::Config::
-      PreciseIncrementalMarkingConcurrentSweepingConfig();
+  GCConfig config =
+      GCConfig::PreciseIncrementalMarkingConcurrentSweepingConfig();
   auto* heap = Heap::From(GetHeap());
   MakeGarbageCollected<GCedExpectSweepingOnOwningThread>(
       heap->GetAllocationHandle(), *heap);
@@ -316,8 +316,7 @@ class ExpectAtomicPause final : public GarbageCollected<ExpectAtomicPause> {
 }  // namespace
 
 TEST_F(GCHeapTest, IsInAtomicPause) {
-  GarbageCollector::Config config =
-      GarbageCollector::Config::PreciseIncrementalConfig();
+  GCConfig config = GCConfig::PreciseIncrementalConfig();
   auto* heap = Heap::From(GetHeap());
   MakeGarbageCollected<ExpectAtomicPause>(heap->object_allocator(), *heap);
   EXPECT_FALSE(subtle::HeapState::IsInAtomicPause(*heap));
diff --git a/deps/v8/test/unittests/heap/cppgc/marker-unittest.cc b/deps/v8/test/unittests/heap/cppgc/marker-unittest.cc
index 0149cac755beeb..2572e4a65c3c90 100644
--- a/deps/v8/test/unittests/heap/cppgc/marker-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/marker-unittest.cc
@@ -25,18 +25,15 @@ namespace internal {
 namespace {
 class MarkerTest : public testing::TestWithHeap {
  public:
-  using MarkingConfig = Marker::MarkingConfig;
-
-  void DoMarking(MarkingConfig::StackState stack_state) {
-    const MarkingConfig config = {MarkingConfig::CollectionType::kMajor,
-                                  stack_state};
+  void DoMarking(StackState stack_state) {
+    const MarkingConfig config = {CollectionType::kMajor, stack_state};
     auto* heap = Heap::From(GetHeap());
     InitializeMarker(*heap, GetPlatformHandle().get(), config);
     marker_->FinishMarking(stack_state);
     // Pretend do finish sweeping as StatsCollector verifies that Notify*
     // methods are called in the right order.
     heap->stats_collector()->NotifySweepingCompleted(
-        GarbageCollector::Config::SweepingType::kAtomic);
+        GCConfig::SweepingType::kAtomic);
   }
 
   void InitializeMarker(HeapBase& heap, cppgc::Platform* platform,
@@ -80,7 +77,7 @@ TEST_F(MarkerTest, PersistentIsMarked) {
   Persistent<GCed> object = MakeGarbageCollected<GCed>(GetAllocationHandle());
   HeapObjectHeader& header = HeapObjectHeader::FromObject(object);
   EXPECT_FALSE(header.IsMarked());
-  DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+  DoMarking(StackState::kNoHeapPointers);
   EXPECT_TRUE(header.IsMarked());
 }
 
@@ -89,7 +86,7 @@ TEST_F(MarkerTest, ReachableMemberIsMarked) {
   parent->SetChild(MakeGarbageCollected<GCed>(GetAllocationHandle()));
   HeapObjectHeader& header = HeapObjectHeader::FromObject(parent->child());
   EXPECT_FALSE(header.IsMarked());
-  DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+  DoMarking(StackState::kNoHeapPointers);
   EXPECT_TRUE(header.IsMarked());
 }
 
@@ -97,14 +94,14 @@ TEST_F(MarkerTest, UnreachableMemberIsNotMarked) {
   Member<GCed> object = MakeGarbageCollected<GCed>(GetAllocationHandle());
   HeapObjectHeader& header = HeapObjectHeader::FromObject(object);
   EXPECT_FALSE(header.IsMarked());
-  DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+  DoMarking(StackState::kNoHeapPointers);
   EXPECT_FALSE(header.IsMarked());
 }
 
 TEST_F(MarkerTest, ObjectReachableFromStackIsMarked) {
   GCed* object = MakeGarbageCollected<GCed>(GetAllocationHandle());
   EXPECT_FALSE(HeapObjectHeader::FromObject(object).IsMarked());
-  DoMarking(MarkingConfig::StackState::kMayContainHeapPointers);
+  DoMarking(StackState::kMayContainHeapPointers);
   EXPECT_TRUE(HeapObjectHeader::FromObject(object).IsMarked());
   access(object);
 }
@@ -113,7 +110,7 @@ TEST_F(MarkerTest, ObjectReachableOnlyFromStackIsNotMarkedIfStackIsEmpty) {
   GCed* object = MakeGarbageCollected<GCed>(GetAllocationHandle());
   HeapObjectHeader& header = HeapObjectHeader::FromObject(object);
   EXPECT_FALSE(header.IsMarked());
-  DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+  DoMarking(StackState::kNoHeapPointers);
   EXPECT_FALSE(header.IsMarked());
   access(object);
 }
@@ -123,14 +120,14 @@ TEST_F(MarkerTest, WeakReferenceToUnreachableObjectIsCleared) {
     WeakPersistent<GCed> weak_object =
         MakeGarbageCollected<GCed>(GetAllocationHandle());
     EXPECT_TRUE(weak_object);
-    DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+    DoMarking(StackState::kNoHeapPointers);
     EXPECT_FALSE(weak_object);
   }
   {
     Persistent<GCed> parent = MakeGarbageCollected<GCed>(GetAllocationHandle());
     parent->SetWeakChild(MakeGarbageCollected<GCed>(GetAllocationHandle()));
     EXPECT_TRUE(parent->weak_child());
-    DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+    DoMarking(StackState::kNoHeapPointers);
     EXPECT_FALSE(parent->weak_child());
   }
 }
@@ -141,7 +138,7 @@ TEST_F(MarkerTest, WeakReferenceToReachableObjectIsNotCleared) {
     Persistent<GCed> object = MakeGarbageCollected<GCed>(GetAllocationHandle());
     WeakPersistent<GCed> weak_object(object);
     EXPECT_TRUE(weak_object);
-    DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+    DoMarking(StackState::kNoHeapPointers);
     EXPECT_TRUE(weak_object);
   }
   {
@@ -149,7 +146,7 @@ TEST_F(MarkerTest, WeakReferenceToReachableObjectIsNotCleared) {
     Persistent<GCed> parent = MakeGarbageCollected<GCed>(GetAllocationHandle());
     parent->SetWeakChild(object);
     EXPECT_TRUE(parent->weak_child());
-    DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+    DoMarking(StackState::kNoHeapPointers);
     EXPECT_TRUE(parent->weak_child());
   }
   // Reachable from Member
@@ -159,7 +156,7 @@ TEST_F(MarkerTest, WeakReferenceToReachableObjectIsNotCleared) {
         MakeGarbageCollected<GCed>(GetAllocationHandle()));
     parent->SetChild(weak_object);
     EXPECT_TRUE(weak_object);
-    DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+    DoMarking(StackState::kNoHeapPointers);
     EXPECT_TRUE(weak_object);
   }
   {
@@ -167,7 +164,7 @@ TEST_F(MarkerTest, WeakReferenceToReachableObjectIsNotCleared) {
     parent->SetChild(MakeGarbageCollected<GCed>(GetAllocationHandle()));
     parent->SetWeakChild(parent->child());
     EXPECT_TRUE(parent->weak_child());
-    DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+    DoMarking(StackState::kNoHeapPointers);
     EXPECT_TRUE(parent->weak_child());
   }
   // Reachable from stack
@@ -175,7 +172,7 @@ TEST_F(MarkerTest, WeakReferenceToReachableObjectIsNotCleared) {
     GCed* object = MakeGarbageCollected<GCed>(GetAllocationHandle());
     WeakPersistent<GCed> weak_object(object);
     EXPECT_TRUE(weak_object);
-    DoMarking(MarkingConfig::StackState::kMayContainHeapPointers);
+    DoMarking(StackState::kMayContainHeapPointers);
     EXPECT_TRUE(weak_object);
     access(object);
   }
@@ -184,7 +181,7 @@ TEST_F(MarkerTest, WeakReferenceToReachableObjectIsNotCleared) {
     Persistent<GCed> parent = MakeGarbageCollected<GCed>(GetAllocationHandle());
     parent->SetWeakChild(object);
     EXPECT_TRUE(parent->weak_child());
-    DoMarking(MarkingConfig::StackState::kMayContainHeapPointers);
+    DoMarking(StackState::kMayContainHeapPointers);
     EXPECT_TRUE(parent->weak_child());
     access(object);
   }
@@ -199,7 +196,7 @@ TEST_F(MarkerTest, DeepHierarchyIsMarked) {
     parent->SetWeakChild(parent->child());
     parent = parent->child();
   }
-  DoMarking(MarkingConfig::StackState::kNoHeapPointers);
+  DoMarking(StackState::kNoHeapPointers);
   EXPECT_TRUE(HeapObjectHeader::FromObject(root).IsMarked());
   parent = root;
   for (int i = 0; i < kHierarchyDepth; ++i) {
@@ -213,7 +210,7 @@ TEST_F(MarkerTest, NestedObjectsOnStackAreMarked) {
   GCed* root = MakeGarbageCollected<GCed>(GetAllocationHandle());
   root->SetChild(MakeGarbageCollected<GCed>(GetAllocationHandle()));
   root->child()->SetChild(MakeGarbageCollected<GCed>(GetAllocationHandle()));
-  DoMarking(MarkingConfig::StackState::kMayContainHeapPointers);
+  DoMarking(StackState::kMayContainHeapPointers);
   EXPECT_TRUE(HeapObjectHeader::FromObject(root).IsMarked());
   EXPECT_TRUE(HeapObjectHeader::FromObject(root->child()).IsMarked());
   EXPECT_TRUE(HeapObjectHeader::FromObject(root->child()->child()).IsMarked());
@@ -244,9 +241,8 @@ class GCedWithCallback : public GarbageCollected<GCedWithCallback> {
 }  // namespace
 
 TEST_F(MarkerTest, InConstructionObjectIsEventuallyMarkedEmptyStack) {
-  static const Marker::MarkingConfig config = {
-      MarkingConfig::CollectionType::kMajor,
-      MarkingConfig::StackState::kMayContainHeapPointers};
+  static const MarkingConfig config = {CollectionType::kMajor,
+                                       StackState::kMayContainHeapPointers};
   InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(), config);
   GCedWithCallback* object = MakeGarbageCollected<GCedWithCallback>(
       GetAllocationHandle(), [marker = marker()](GCedWithCallback* obj) {
@@ -254,22 +250,20 @@ TEST_F(MarkerTest, InConstructionObjectIsEventuallyMarkedEmptyStack) {
         marker->Visitor().Trace(member);
       });
   EXPECT_FALSE(HeapObjectHeader::FromObject(object).IsMarked());
-  marker()->FinishMarking(MarkingConfig::StackState::kMayContainHeapPointers);
+  marker()->FinishMarking(StackState::kMayContainHeapPointers);
   EXPECT_TRUE(HeapObjectHeader::FromObject(object).IsMarked());
 }
 
 TEST_F(MarkerTest, InConstructionObjectIsEventuallyMarkedNonEmptyStack) {
-  static const Marker::MarkingConfig config = {
-      MarkingConfig::CollectionType::kMajor,
-      MarkingConfig::StackState::kMayContainHeapPointers};
+  static const MarkingConfig config = {CollectionType::kMajor,
+                                       StackState::kMayContainHeapPointers};
   InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(), config);
   MakeGarbageCollected<GCedWithCallback>(
       GetAllocationHandle(), [marker = marker()](GCedWithCallback* obj) {
         Member<GCedWithCallback> member(obj);
         marker->Visitor().Trace(member);
         EXPECT_FALSE(HeapObjectHeader::FromObject(obj).IsMarked());
-        marker->FinishMarking(
-            MarkingConfig::StackState::kMayContainHeapPointers);
+        marker->FinishMarking(StackState::kMayContainHeapPointers);
         EXPECT_TRUE(HeapObjectHeader::FromObject(obj).IsMarked());
       });
 }
@@ -318,36 +312,34 @@ V8_NOINLINE void RegisterInConstructionObject(
 
 TEST_F(MarkerTest,
        InConstructionObjectIsEventuallyMarkedDifferentNonEmptyStack) {
-  static const Marker::MarkingConfig config = {
-      MarkingConfig::CollectionType::kMajor,
-      MarkingConfig::StackState::kMayContainHeapPointers};
+  static const MarkingConfig config = {CollectionType::kMajor,
+                                       StackState::kMayContainHeapPointers};
   InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(), config);
 
   GCObliviousObjectStorage storage;
   RegisterInConstructionObject(GetAllocationHandle(), marker()->Visitor(),
                                storage);
   EXPECT_FALSE(HeapObjectHeader::FromObject(storage.object()).IsMarked());
-  marker()->FinishMarking(MarkingConfig::StackState::kMayContainHeapPointers);
+  marker()->FinishMarking(StackState::kMayContainHeapPointers);
   EXPECT_TRUE(HeapObjectHeader::FromObject(storage.object()).IsMarked());
 }
 
 TEST_F(MarkerTest, SentinelNotClearedOnWeakPersistentHandling) {
-  static const Marker::MarkingConfig config = {
-      MarkingConfig::CollectionType::kMajor,
-      MarkingConfig::StackState::kNoHeapPointers,
+  static const MarkingConfig config = {
+      CollectionType::kMajor, StackState::kNoHeapPointers,
       MarkingConfig::MarkingType::kIncremental};
   Persistent<GCed> root = MakeGarbageCollected<GCed>(GetAllocationHandle());
   auto* tmp = MakeGarbageCollected<GCed>(GetAllocationHandle());
   root->SetWeakChild(tmp);
   InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(), config);
   while (!marker()->IncrementalMarkingStepForTesting(
-      MarkingConfig::StackState::kNoHeapPointers)) {
+      StackState::kNoHeapPointers)) {
   }
   // {root} object must be marked at this point because we do not allow
   // encountering kSentinelPointer in WeakMember on regular Trace() calls.
   ASSERT_TRUE(HeapObjectHeader::FromObject(root.Get()).IsMarked());
   root->SetWeakChild(kSentinelPointer);
-  marker()->FinishMarking(MarkingConfig::StackState::kNoHeapPointers);
+  marker()->FinishMarking(StackState::kNoHeapPointers);
   EXPECT_EQ(kSentinelPointer, root->weak_child());
 }
 
@@ -383,15 +375,14 @@ class ObjectWithEphemeronPair final
 }  // namespace
 
 TEST_F(MarkerTest, MarkerProcessesAllEphemeronPairs) {
-  static const Marker::MarkingConfig config = {
-      MarkingConfig::CollectionType::kMajor,
-      MarkingConfig::StackState::kNoHeapPointers,
-      MarkingConfig::MarkingType::kAtomic};
+  static const MarkingConfig config = {CollectionType::kMajor,
+                                       StackState::kNoHeapPointers,
+                                       MarkingConfig::MarkingType::kAtomic};
   Persistent<ObjectWithEphemeronPair> obj =
       MakeGarbageCollected<ObjectWithEphemeronPair>(GetAllocationHandle(),
                                                     GetAllocationHandle());
   InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(), config);
-  marker()->FinishMarking(MarkingConfig::StackState::kNoHeapPointers);
+  marker()->FinishMarking(StackState::kNoHeapPointers);
   ResetMarker();
 }
 
@@ -399,26 +390,22 @@ TEST_F(MarkerTest, MarkerProcessesAllEphemeronPairs) {
 
 class IncrementalMarkingTest : public testing::TestWithHeap {
  public:
-  using MarkingConfig = Marker::MarkingConfig;
-
   static constexpr MarkingConfig IncrementalPreciseMarkingConfig = {
-      MarkingConfig::CollectionType::kMajor,
-      MarkingConfig::StackState::kNoHeapPointers,
+      CollectionType::kMajor, StackState::kNoHeapPointers,
       MarkingConfig::MarkingType::kIncremental};
 
-  void FinishSteps(MarkingConfig::StackState stack_state) {
+  void FinishSteps(StackState stack_state) {
     while (!SingleStep(stack_state)) {
     }
   }
 
   void FinishMarking() {
-    GetMarkerRef()->FinishMarking(
-        MarkingConfig::StackState::kMayContainHeapPointers);
+    GetMarkerRef()->FinishMarking(StackState::kMayContainHeapPointers);
     // Pretend do finish sweeping as StatsCollector verifies that Notify*
     // methods are called in the right order.
     GetMarkerRef().reset();
     Heap::From(GetHeap())->stats_collector()->NotifySweepingCompleted(
-        GarbageCollector::Config::SweepingType::kIncremental);
+        GCConfig::SweepingType::kIncremental);
   }
 
   void InitializeMarker(HeapBase& heap, cppgc::Platform* platform,
@@ -430,13 +417,12 @@ class IncrementalMarkingTest : public testing::TestWithHeap {
   MarkerBase* marker() const { return Heap::From(GetHeap())->marker(); }
 
  private:
-  bool SingleStep(MarkingConfig::StackState stack_state) {
+  bool SingleStep(StackState stack_state) {
     return GetMarkerRef()->IncrementalMarkingStepForTesting(stack_state);
   }
 };
 
-constexpr IncrementalMarkingTest::MarkingConfig
-    IncrementalMarkingTest::IncrementalPreciseMarkingConfig;
+constexpr MarkingConfig IncrementalMarkingTest::IncrementalPreciseMarkingConfig;
 
 TEST_F(IncrementalMarkingTest, RootIsMarkedAfterMarkingStarted) {
   Persistent<GCed> root = MakeGarbageCollected<GCed>(GetAllocationHandle());
@@ -454,7 +440,7 @@ TEST_F(IncrementalMarkingTest, MemberIsMarkedAfterMarkingSteps) {
   EXPECT_FALSE(header.IsMarked());
   InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(),
                    IncrementalPreciseMarkingConfig);
-  FinishSteps(MarkingConfig::StackState::kNoHeapPointers);
+  FinishSteps(StackState::kNoHeapPointers);
   EXPECT_TRUE(header.IsMarked());
   FinishMarking();
 }
@@ -465,7 +451,7 @@ TEST_F(IncrementalMarkingTest,
   InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(),
                    IncrementalPreciseMarkingConfig);
   root->SetChild(MakeGarbageCollected<GCed>(GetAllocationHandle()));
-  FinishSteps(MarkingConfig::StackState::kNoHeapPointers);
+  FinishSteps(StackState::kNoHeapPointers);
   HeapObjectHeader& header = HeapObjectHeader::FromObject(root->child());
   EXPECT_TRUE(header.IsMarked());
   FinishMarking();
@@ -491,10 +477,10 @@ TEST_F(IncrementalMarkingTest, IncrementalStepDuringAllocation) {
         header = &HeapObjectHeader::FromObject(obj);
         holder->member_ = obj;
         EXPECT_FALSE(header->IsMarked());
-        FinishSteps(MarkingConfig::StackState::kMayContainHeapPointers);
+        FinishSteps(StackState::kMayContainHeapPointers);
         EXPECT_FALSE(header->IsMarked());
       });
-  FinishSteps(MarkingConfig::StackState::kNoHeapPointers);
+  FinishSteps(StackState::kNoHeapPointers);
   EXPECT_TRUE(header->IsMarked());
   FinishMarking();
 }
@@ -502,7 +488,7 @@ TEST_F(IncrementalMarkingTest, IncrementalStepDuringAllocation) {
 TEST_F(IncrementalMarkingTest, MarkingRunsOutOfWorkEventually) {
   InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get(),
                    IncrementalPreciseMarkingConfig);
-  FinishSteps(MarkingConfig::StackState::kNoHeapPointers);
+  FinishSteps(StackState::kNoHeapPointers);
   FinishMarking();
 }
 
diff --git a/deps/v8/test/unittests/heap/cppgc/marking-verifier-unittest.cc b/deps/v8/test/unittests/heap/cppgc/marking-verifier-unittest.cc
index 3e2236abdfbed9..39909ab7bc6c29 100644
--- a/deps/v8/test/unittests/heap/cppgc/marking-verifier-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/marking-verifier-unittest.cc
@@ -20,12 +20,10 @@ namespace {
 
 class MarkingVerifierTest : public testing::TestWithHeap {
  public:
-  using StackState = Heap::Config::StackState;
-
   V8_NOINLINE void VerifyMarking(HeapBase& heap, StackState stack_state,
                                  size_t expected_marked_bytes) {
     Heap::From(GetHeap())->object_allocator().ResetLinearAllocationBuffers();
-    MarkingVerifier verifier(heap, Heap::Config::CollectionType::kMajor);
+    MarkingVerifier verifier(heap, CollectionType::kMajor);
     verifier.Run(stack_state, v8::base::Stack::GetCurrentStackPosition(),
                  expected_marked_bytes);
   }
@@ -140,16 +138,14 @@ TEST_F(MarkingVerifierTest, DoesntDieOnInConstructionObjectWithWriteBarrier) {
   Persistent<Holder<GCedWithCallbackAndChild>> persistent =
       MakeGarbageCollected<Holder<GCedWithCallbackAndChild>>(
           GetAllocationHandle());
-  GarbageCollector::Config config =
-      GarbageCollector::Config::PreciseIncrementalConfig();
+  GCConfig config = GCConfig::PreciseIncrementalConfig();
   Heap::From(GetHeap())->StartIncrementalGarbageCollection(config);
   MakeGarbageCollected<GCedWithCallbackAndChild>(
       GetAllocationHandle(), MakeGarbageCollected<GCed>(GetAllocationHandle()),
       [&persistent](GCedWithCallbackAndChild* obj) {
         persistent->object = obj;
       });
-  GetMarkerRef()->IncrementalMarkingStepForTesting(
-      GarbageCollector::Config::StackState::kNoHeapPointers);
+  GetMarkerRef()->IncrementalMarkingStepForTesting(StackState::kNoHeapPointers);
   Heap::From(GetHeap())->FinalizeIncrementalGarbageCollectionIfRunning(config);
 }
 
diff --git a/deps/v8/test/unittests/heap/cppgc/metric-recorder-unittest.cc b/deps/v8/test/unittests/heap/cppgc/metric-recorder-unittest.cc
index 841d400143c0ef..cf02f8a9facf7c 100644
--- a/deps/v8/test/unittests/heap/cppgc/metric-recorder-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/metric-recorder-unittest.cc
@@ -51,15 +51,13 @@ class MetricRecorderTest : public testing::TestWithHeap {
   }
 
   void StartGC() {
-    stats->NotifyMarkingStarted(
-        GarbageCollector::Config::CollectionType::kMajor,
-        GarbageCollector::Config::MarkingType::kIncremental,
-        GarbageCollector::Config::IsForcedGC::kNotForced);
+    stats->NotifyMarkingStarted(CollectionType::kMajor,
+                                GCConfig::MarkingType::kIncremental,
+                                GCConfig::IsForcedGC::kNotForced);
   }
   void EndGC(size_t marked_bytes) {
     stats->NotifyMarkingCompleted(marked_bytes);
-    stats->NotifySweepingCompleted(
-        GarbageCollector::Config::SweepingType::kIncremental);
+    stats->NotifySweepingCompleted(GCConfig::SweepingType::kIncremental);
   }
 
   StatsCollector* stats;
@@ -308,8 +306,7 @@ TEST_F(MetricRecorderTest, ObjectSizeMetricsWithAllocations) {
   stats->NotifyAllocation(150);
   stats->NotifyAllocatedMemory(1000);
   stats->NotifyFreedMemory(400);
-  stats->NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+  stats->NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
   EXPECT_EQ(1300u, MetricRecorderImpl::GCCycle_event.objects.before_bytes);
   EXPECT_EQ(800, MetricRecorderImpl::GCCycle_event.objects.after_bytes);
   EXPECT_EQ(500u, MetricRecorderImpl::GCCycle_event.objects.freed_bytes);
diff --git a/deps/v8/test/unittests/heap/cppgc/minor-gc-unittest.cc b/deps/v8/test/unittests/heap/cppgc/minor-gc-unittest.cc
index bc50f0deed3c14..6ec873b71f1a82 100644
--- a/deps/v8/test/unittests/heap/cppgc/minor-gc-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/minor-gc-unittest.cc
@@ -13,6 +13,7 @@
 #include "include/cppgc/internal/caged-heap-local-data.h"
 #include "include/cppgc/persistent.h"
 #include "src/heap/cppgc/heap-object-header.h"
+#include "src/heap/cppgc/heap-visitor.h"
 #include "src/heap/cppgc/heap.h"
 #include "test/unittests/heap/cppgc/tests.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -87,6 +88,46 @@ void ExpectPageOld(BasePage& page) {
                 CagedHeap::OffsetFromAddress(page.PayloadEnd())));
 }
 
+class RememberedSetExtractor : HeapVisitor<RememberedSetExtractor> {
+  friend class HeapVisitor<RememberedSetExtractor>;
+
+ public:
+  static std::set<void*> Extract(cppgc::Heap* heap) {
+    RememberedSetExtractor extractor;
+    extractor.Traverse(Heap::From(heap)->raw_heap());
+    return std::move(extractor.slots_);
+  }
+
+ private:
+  void VisitPage(BasePage& page) {
+    auto* slot_set = page.slot_set();
+    if (!slot_set) return;
+
+    const uintptr_t page_start = reinterpret_cast<uintptr_t>(&page);
+    const size_t buckets_size = SlotSet::BucketsForSize(page.AllocatedSize());
+
+    slot_set->Iterate(
+        page_start, 0, buckets_size,
+        [this](SlotSet::Address slot) {
+          slots_.insert(reinterpret_cast<void*>(slot));
+          return heap::base::KEEP_SLOT;
+        },
+        SlotSet::EmptyBucketMode::FREE_EMPTY_BUCKETS);
+  }
+
+  bool VisitNormalPage(NormalPage& page) {
+    VisitPage(page);
+    return true;
+  }
+
+  bool VisitLargePage(LargePage& page) {
+    VisitPage(page);
+    return true;
+  }
+
+  std::set<void*> slots_;
+};
+
 }  // namespace
 
 class MinorGCTest : public testing::TestWithHeap {
@@ -107,16 +148,11 @@ class MinorGCTest : public testing::TestWithHeap {
   }
 
   void CollectMinor() {
-    Heap::From(GetHeap())->CollectGarbage(
-        Heap::Config::MinorPreciseAtomicConfig());
+    Heap::From(GetHeap())->CollectGarbage(GCConfig::MinorPreciseAtomicConfig());
   }
 
   void CollectMajor() {
-    Heap::From(GetHeap())->CollectGarbage(Heap::Config::PreciseAtomicConfig());
-  }
-
-  const auto& RememberedSlots() const {
-    return Heap::From(GetHeap())->remembered_set().remembered_slots_;
+    Heap::From(GetHeap())->CollectGarbage(GCConfig::PreciseAtomicConfig());
   }
 
   const auto& RememberedSourceObjects() const {
@@ -145,75 +181,72 @@ struct ExpectRememberedSlotsAdded final {
   ExpectRememberedSlotsAdded(
       const MinorGCTest& test,
       std::initializer_list<void*> slots_expected_to_be_remembered)
-      : remembered_slots_(test.RememberedSlots()),
+      : test_(test),
         slots_expected_to_be_remembered_(slots_expected_to_be_remembered),
-        initial_number_of_slots_(remembered_slots_.size()) {
+        initial_slots_(RememberedSetExtractor::Extract(test.GetHeap())) {
     // Check that the remembered set doesn't contain specified slots.
-    EXPECT_FALSE(std::includes(remembered_slots_.begin(),
-                               remembered_slots_.end(),
+    EXPECT_FALSE(std::includes(initial_slots_.begin(), initial_slots_.end(),
                                slots_expected_to_be_remembered_.begin(),
                                slots_expected_to_be_remembered_.end()));
   }
 
   ~ExpectRememberedSlotsAdded() {
-    const size_t current_number_of_slots = remembered_slots_.size();
-    EXPECT_EQ(
-        initial_number_of_slots_ + slots_expected_to_be_remembered_.size(),
-        current_number_of_slots);
-    EXPECT_TRUE(std::includes(remembered_slots_.begin(),
-                              remembered_slots_.end(),
+    const auto current_slots = RememberedSetExtractor::Extract(test_.GetHeap());
+    EXPECT_EQ(initial_slots_.size() + slots_expected_to_be_remembered_.size(),
+              current_slots.size());
+    EXPECT_TRUE(std::includes(current_slots.begin(), current_slots.end(),
                               slots_expected_to_be_remembered_.begin(),
                               slots_expected_to_be_remembered_.end()));
   }
 
  private:
-  const std::set<void*>& remembered_slots_;
+  const MinorGCTest& test_;
   std::set<void*> slots_expected_to_be_remembered_;
-  const size_t initial_number_of_slots_ = 0;
+  std::set<void*> initial_slots_;
 };
 
 struct ExpectRememberedSlotsRemoved final {
   ExpectRememberedSlotsRemoved(
       const MinorGCTest& test,
       std::initializer_list<void*> slots_expected_to_be_removed)
-      : remembered_slots_(test.RememberedSlots()),
+      : test_(test),
         slots_expected_to_be_removed_(slots_expected_to_be_removed),
-        initial_number_of_slots_(remembered_slots_.size()) {
-    DCHECK_GE(initial_number_of_slots_, slots_expected_to_be_removed_.size());
+        initial_slots_(RememberedSetExtractor::Extract(test.GetHeap())) {
+    DCHECK_GE(initial_slots_.size(), slots_expected_to_be_removed_.size());
     // Check that the remembered set does contain specified slots to be removed.
-    EXPECT_TRUE(std::includes(remembered_slots_.begin(),
-                              remembered_slots_.end(),
+    EXPECT_TRUE(std::includes(initial_slots_.begin(), initial_slots_.end(),
                               slots_expected_to_be_removed_.begin(),
                               slots_expected_to_be_removed_.end()));
   }
 
   ~ExpectRememberedSlotsRemoved() {
-    const size_t current_number_of_slots = remembered_slots_.size();
-    EXPECT_EQ(initial_number_of_slots_ - slots_expected_to_be_removed_.size(),
-              current_number_of_slots);
-    EXPECT_FALSE(std::includes(remembered_slots_.begin(),
-                               remembered_slots_.end(),
+    const auto current_slots = RememberedSetExtractor::Extract(test_.GetHeap());
+    EXPECT_EQ(initial_slots_.size() - slots_expected_to_be_removed_.size(),
+              current_slots.size());
+    EXPECT_FALSE(std::includes(current_slots.begin(), current_slots.end(),
                                slots_expected_to_be_removed_.begin(),
                                slots_expected_to_be_removed_.end()));
   }
 
  private:
-  const std::set<void*>& remembered_slots_;
+  const MinorGCTest& test_;
   std::set<void*> slots_expected_to_be_removed_;
-  const size_t initial_number_of_slots_ = 0;
+  std::set<void*> initial_slots_;
 };
 
 struct ExpectNoRememberedSlotsAdded final {
   explicit ExpectNoRememberedSlotsAdded(const MinorGCTest& test)
-      : remembered_slots_(test.RememberedSlots()),
-        initial_remembered_slots_(remembered_slots_) {}
+      : test_(test),
+        initial_remembered_slots_(
+            RememberedSetExtractor::Extract(test.GetHeap())) {}
 
   ~ExpectNoRememberedSlotsAdded() {
-    EXPECT_EQ(initial_remembered_slots_, remembered_slots_);
+    EXPECT_EQ(initial_remembered_slots_,
+              RememberedSetExtractor::Extract(test_.GetHeap()));
   }
 
  private:
-  const std::set<void*>& remembered_slots_;
+  const MinorGCTest& test_;
   std::set<void*> initial_remembered_slots_;
 };
 
@@ -298,19 +331,23 @@ void InterGenerationalPointerTest(MinorGCTest* test, cppgc::Heap* heap) {
     }
   }
 
-  const auto& set = test->RememberedSlots();
-  auto set_size_before = set.size();
+  auto remembered_set_size_before_barrier =
+      RememberedSetExtractor::Extract(test->GetHeap()).size();
 
   // Issue generational barrier.
   old->next = young;
 
-  EXPECT_EQ(set_size_before + 1u, set.size());
+  auto remembered_set_size_after_barrier =
+      RememberedSetExtractor::Extract(test->GetHeap()).size();
+
+  EXPECT_EQ(remembered_set_size_before_barrier + 1u,
+            remembered_set_size_after_barrier);
 
   // Check that the remembered set is visited.
   test->CollectMinor();
 
   EXPECT_EQ(0u, MinorGCTest::DestructedObjects());
-  EXPECT_TRUE(set.empty());
+  EXPECT_TRUE(RememberedSetExtractor::Extract(test->GetHeap()).empty());
 
   for (size_t i = 0; i < 64; ++i) {
     EXPECT_FALSE(HeapObjectHeader::FromObject(young).IsFree());
@@ -428,8 +465,8 @@ TEST_F(MinorGCTest, RememberedSetInvalidationOnShrink) {
 
   auto* young = MakeGarbageCollected<Small>(GetAllocationHandle());
 
-  const auto& set = RememberedSlots();
-  const size_t set_size_before_barrier = set.size();
+  const size_t remembered_set_size_before_barrier =
+      RememberedSetExtractor::Extract(GetHeap()).size();
 
   // Issue the generational barriers.
   for (size_t i = kFirstMemberToInvalidate; i < kLastMemberToInvalidate; ++i) {
@@ -439,17 +476,23 @@ TEST_F(MinorGCTest, RememberedSetInvalidationOnShrink) {
     get_member(i) = young;
   }
 
+  const auto remembered_set_size_after_barrier =
+      RememberedSetExtractor::Extract(GetHeap()).size();
+
   // Check that barriers hit (kLastMemberToInvalidate -
   // kFirstMemberToInvalidate) times.
-  EXPECT_EQ(set_size_before_barrier +
+  EXPECT_EQ(remembered_set_size_before_barrier +
                 (kLastMemberToInvalidate - kFirstMemberToInvalidate),
-            set.size());
+            remembered_set_size_after_barrier);
 
   // Shrink the buffer for old object.
   subtle::Resize(*old, AdditionalBytes(kBytesToAllocate / 2));
 
+  const auto remembered_set_after_shrink =
+      RememberedSetExtractor::Extract(GetHeap()).size();
+
   // Check that the reference was invalidated.
-  EXPECT_EQ(set_size_before_barrier, set.size());
+  EXPECT_EQ(remembered_set_size_before_barrier, remembered_set_after_shrink);
 
   // Visiting remembered slots must not fail.
   CollectMinor();
diff --git a/deps/v8/test/unittests/heap/cppgc/stats-collector-scopes-unittest.cc b/deps/v8/test/unittests/heap/cppgc/stats-collector-scopes-unittest.cc
index 59dcfabd98ba31..131841564a5b0c 100644
--- a/deps/v8/test/unittests/heap/cppgc/stats-collector-scopes-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/stats-collector-scopes-unittest.cc
@@ -4,6 +4,7 @@
 
 #if CPPGC_IS_STANDALONE
 
+#include "src/heap/cppgc/heap-config.h"
 #include "src/heap/cppgc/stats-collector.h"
 #include "test/unittests/heap/cppgc/tests.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -57,17 +58,14 @@ std::vector<uint8_t> DelegatingTracingControllerImpl::stored_arg_types;
 std::vector<uint64_t> DelegatingTracingControllerImpl::stored_arg_values;
 
 class V8_NODISCARD CppgcTracingScopesTest : public testing::TestWithHeap {
-  using Config = Marker::MarkingConfig;
-
  public:
   CppgcTracingScopesTest() {
     SetTracingController(std::make_unique<DelegatingTracingControllerImpl>());
   }
 
   void StartGC() {
-    Config config = {Config::CollectionType::kMajor,
-                     Config::StackState::kNoHeapPointers,
-                     Config::MarkingType::kIncremental};
+    MarkingConfig config = {CollectionType::kMajor, StackState::kNoHeapPointers,
+                            GCConfig::MarkingType::kIncremental};
     GetMarkerRef() = std::make_unique<Marker>(
         Heap::From(GetHeap())->AsBase(), GetPlatformHandle().get(), config);
     GetMarkerRef()->StartMarking();
@@ -76,10 +74,10 @@ class V8_NODISCARD CppgcTracingScopesTest : public testing::TestWithHeap {
 
   void EndGC() {
     DelegatingTracingControllerImpl::check_expectations = false;
-    GetMarkerRef()->FinishMarking(Config::StackState::kNoHeapPointers);
+    GetMarkerRef()->FinishMarking(StackState::kNoHeapPointers);
     GetMarkerRef().reset();
     Heap::From(GetHeap())->stats_collector()->NotifySweepingCompleted(
-        GarbageCollector::Config::SweepingType::kAtomic);
+        GCConfig::SweepingType::kAtomic);
   }
 
   void ResetDelegatingTracingController(const char* expected_name = nullptr) {
@@ -228,13 +226,11 @@ TEST_F(CppgcTracingScopesTest, CheckScopeArgs) {
 
 TEST_F(CppgcTracingScopesTest, InitalScopesAreZero) {
   StatsCollector* stats_collector = Heap::From(GetHeap())->stats_collector();
-  stats_collector->NotifyMarkingStarted(
-      GarbageCollector::Config::CollectionType::kMajor,
-      GarbageCollector::Config::MarkingType::kAtomic,
-      GarbageCollector::Config::IsForcedGC::kNotForced);
+  stats_collector->NotifyMarkingStarted(CollectionType::kMajor,
+                                        GCConfig::MarkingType::kAtomic,
+                                        GCConfig::IsForcedGC::kNotForced);
   stats_collector->NotifyMarkingCompleted(0);
-  stats_collector->NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+  stats_collector->NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
   const StatsCollector::Event& event =
       stats_collector->GetPreviousEventForTesting();
   for (int i = 0; i < StatsCollector::kNumHistogramScopeIds; ++i) {
@@ -249,10 +245,9 @@ TEST_F(CppgcTracingScopesTest, TestIndividualScopes) {
   for (int scope_id = 0; scope_id < StatsCollector::kNumHistogramScopeIds;
        ++scope_id) {
     StatsCollector* stats_collector = Heap::From(GetHeap())->stats_collector();
-    stats_collector->NotifyMarkingStarted(
-        GarbageCollector::Config::CollectionType::kMajor,
-        GarbageCollector::Config::MarkingType::kIncremental,
-        GarbageCollector::Config::IsForcedGC::kNotForced);
+    stats_collector->NotifyMarkingStarted(CollectionType::kMajor,
+                                          GCConfig::MarkingType::kIncremental,
+                                          GCConfig::IsForcedGC::kNotForced);
     DelegatingTracingControllerImpl::check_expectations = false;
     {
       StatsCollector::EnabledScope scope(
@@ -265,7 +260,7 @@ TEST_F(CppgcTracingScopesTest, TestIndividualScopes) {
     }
     stats_collector->NotifyMarkingCompleted(0);
     stats_collector->NotifySweepingCompleted(
-        GarbageCollector::Config::SweepingType::kIncremental);
+        GCConfig::SweepingType::kIncremental);
     const StatsCollector::Event& event =
         stats_collector->GetPreviousEventForTesting();
     for (int i = 0; i < StatsCollector::kNumHistogramScopeIds; ++i) {
@@ -284,10 +279,9 @@ TEST_F(CppgcTracingScopesTest, TestIndividualConcurrentScopes) {
   for (int scope_id = 0;
        scope_id < StatsCollector::kNumHistogramConcurrentScopeIds; ++scope_id) {
     StatsCollector* stats_collector = Heap::From(GetHeap())->stats_collector();
-    stats_collector->NotifyMarkingStarted(
-        GarbageCollector::Config::CollectionType::kMajor,
-        GarbageCollector::Config::MarkingType::kAtomic,
-        GarbageCollector::Config::IsForcedGC::kNotForced);
+    stats_collector->NotifyMarkingStarted(CollectionType::kMajor,
+                                          GCConfig::MarkingType::kAtomic,
+                                          GCConfig::IsForcedGC::kNotForced);
     DelegatingTracingControllerImpl::check_expectations = false;
     {
       StatsCollector::EnabledConcurrentScope scope(
@@ -299,8 +293,7 @@ TEST_F(CppgcTracingScopesTest, TestIndividualConcurrentScopes) {
       }
     }
     stats_collector->NotifyMarkingCompleted(0);
-    stats_collector->NotifySweepingCompleted(
-        GarbageCollector::Config::SweepingType::kAtomic);
+    stats_collector->NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
     const StatsCollector::Event& event =
         stats_collector->GetPreviousEventForTesting();
     for (int i = 0; i < StatsCollector::kNumHistogramScopeIds; ++i) {
diff --git a/deps/v8/test/unittests/heap/cppgc/stats-collector-unittest.cc b/deps/v8/test/unittests/heap/cppgc/stats-collector-unittest.cc
index 765456d9df5038..c28b69b09267cb 100644
--- a/deps/v8/test/unittests/heap/cppgc/stats-collector-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/stats-collector-unittest.cc
@@ -38,23 +38,21 @@ class StatsCollectorTest : public ::testing::Test {
 }  // namespace
 
 TEST_F(StatsCollectorTest, NoMarkedBytes) {
-  stats.NotifyMarkingStarted(GarbageCollector::Config::CollectionType::kMajor,
-                             GarbageCollector::Config::MarkingType::kAtomic,
-                             GarbageCollector::Config::IsForcedGC::kNotForced);
+  stats.NotifyMarkingStarted(CollectionType::kMajor,
+                             GCConfig::MarkingType::kAtomic,
+                             GCConfig::IsForcedGC::kNotForced);
   stats.NotifyMarkingCompleted(kNoMarkedBytes);
-  stats.NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+  stats.NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
   auto event = stats.GetPreviousEventForTesting();
   EXPECT_EQ(0u, event.marked_bytes);
 }
 
 TEST_F(StatsCollectorTest, EventPrevGCMarkedObjectSize) {
-  stats.NotifyMarkingStarted(GarbageCollector::Config::CollectionType::kMajor,
-                             GarbageCollector::Config::MarkingType::kAtomic,
-                             GarbageCollector::Config::IsForcedGC::kNotForced);
+  stats.NotifyMarkingStarted(CollectionType::kMajor,
+                             GCConfig::MarkingType::kAtomic,
+                             GCConfig::IsForcedGC::kNotForced);
   stats.NotifyMarkingCompleted(1024);
-  stats.NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+  stats.NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
   auto event = stats.GetPreviousEventForTesting();
   EXPECT_EQ(1024u, event.marked_bytes);
 }
@@ -74,54 +72,50 @@ TEST_F(StatsCollectorTest, AlllocationReportAboveAllocationThresholdBytes) {
 }
 
 TEST_F(StatsCollectorTest, InitialAllocatedObjectSize) {
-  stats.NotifyMarkingStarted(GarbageCollector::Config::CollectionType::kMajor,
-                             GarbageCollector::Config::MarkingType::kAtomic,
-                             GarbageCollector::Config::IsForcedGC::kNotForced);
+  stats.NotifyMarkingStarted(CollectionType::kMajor,
+                             GCConfig::MarkingType::kAtomic,
+                             GCConfig::IsForcedGC::kNotForced);
   EXPECT_EQ(0u, stats.allocated_object_size());
   stats.NotifyMarkingCompleted(kNoMarkedBytes);
   EXPECT_EQ(0u, stats.allocated_object_size());
-  stats.NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+  stats.NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
   EXPECT_EQ(0u, stats.allocated_object_size());
 }
 
 TEST_F(StatsCollectorTest, AllocatedObjectSize) {
-  stats.NotifyMarkingStarted(GarbageCollector::Config::CollectionType::kMajor,
-                             GarbageCollector::Config::MarkingType::kAtomic,
-                             GarbageCollector::Config::IsForcedGC::kNotForced);
+  stats.NotifyMarkingStarted(CollectionType::kMajor,
+                             GCConfig::MarkingType::kAtomic,
+                             GCConfig::IsForcedGC::kNotForced);
   FakeAllocate(kMinReportedSize);
   EXPECT_EQ(kMinReportedSize, stats.allocated_object_size());
   stats.NotifyMarkingCompleted(kMinReportedSize);
   EXPECT_EQ(kMinReportedSize, stats.allocated_object_size());
-  stats.NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+  stats.NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
   EXPECT_EQ(kMinReportedSize, stats.allocated_object_size());
 }
 
 TEST_F(StatsCollectorTest, AllocatedObjectSizeNoMarkedBytes) {
-  stats.NotifyMarkingStarted(GarbageCollector::Config::CollectionType::kMajor,
-                             GarbageCollector::Config::MarkingType::kAtomic,
-                             GarbageCollector::Config::IsForcedGC::kNotForced);
+  stats.NotifyMarkingStarted(CollectionType::kMajor,
+                             GCConfig::MarkingType::kAtomic,
+                             GCConfig::IsForcedGC::kNotForced);
   FakeAllocate(kMinReportedSize);
   EXPECT_EQ(kMinReportedSize, stats.allocated_object_size());
   stats.NotifyMarkingCompleted(kNoMarkedBytes);
   EXPECT_EQ(0u, stats.allocated_object_size());
-  stats.NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+  stats.NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
   EXPECT_EQ(0u, stats.allocated_object_size());
 }
 
 TEST_F(StatsCollectorTest, AllocatedObjectSizeAllocateAfterMarking) {
-  stats.NotifyMarkingStarted(GarbageCollector::Config::CollectionType::kMajor,
-                             GarbageCollector::Config::MarkingType::kAtomic,
-                             GarbageCollector::Config::IsForcedGC::kNotForced);
+  stats.NotifyMarkingStarted(CollectionType::kMajor,
+                             GCConfig::MarkingType::kAtomic,
+                             GCConfig::IsForcedGC::kNotForced);
   FakeAllocate(kMinReportedSize);
   EXPECT_EQ(kMinReportedSize, stats.allocated_object_size());
   stats.NotifyMarkingCompleted(kMinReportedSize);
   FakeAllocate(kMinReportedSize);
   EXPECT_EQ(2 * kMinReportedSize, stats.allocated_object_size());
-  stats.NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+  stats.NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
   EXPECT_EQ(2 * kMinReportedSize, stats.allocated_object_size());
 }
 
@@ -153,12 +147,11 @@ TEST_F(StatsCollectorTest, ObserveAllocatedObjectSizeIncreaseAndDecrease) {
 namespace {
 
 void FakeGC(StatsCollector* stats, size_t marked_bytes) {
-  stats->NotifyMarkingStarted(GarbageCollector::Config::CollectionType::kMajor,
-                              GarbageCollector::Config::MarkingType::kAtomic,
-                              GarbageCollector::Config::IsForcedGC::kNotForced);
+  stats->NotifyMarkingStarted(CollectionType::kMajor,
+                              GCConfig::MarkingType::kAtomic,
+                              GCConfig::IsForcedGC::kNotForced);
   stats->NotifyMarkingCompleted(marked_bytes);
-  stats->NotifySweepingCompleted(
-      GarbageCollector::Config::SweepingType::kAtomic);
+  stats->NotifySweepingCompleted(GCConfig::SweepingType::kAtomic);
 }
 
 }  // namespace
diff --git a/deps/v8/test/unittests/heap/cppgc/sweeper-unittest.cc b/deps/v8/test/unittests/heap/cppgc/sweeper-unittest.cc
index 3f5c01ac001b04..b93c7b6bc040b1 100644
--- a/deps/v8/test/unittests/heap/cppgc/sweeper-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/sweeper-unittest.cc
@@ -14,6 +14,7 @@
 #include "src/heap/cppgc/heap-page.h"
 #include "src/heap/cppgc/heap-visitor.h"
 #include "src/heap/cppgc/heap.h"
+#include "src/heap/cppgc/object-view.h"
 #include "src/heap/cppgc/page-memory.h"
 #include "src/heap/cppgc/stats-collector.h"
 #include "test/unittests/heap/cppgc/tests.h"
@@ -48,13 +49,12 @@ class SweeperTest : public testing::TestWithHeap {
     // Pretend do finish marking as StatsCollector verifies that Notify*
     // methods are called in the right order.
     heap->stats_collector()->NotifyMarkingStarted(
-        GarbageCollector::Config::CollectionType::kMajor,
-        GarbageCollector::Config::MarkingType::kAtomic,
-        GarbageCollector::Config::IsForcedGC::kNotForced);
+        CollectionType::kMajor, GCConfig::MarkingType::kAtomic,
+        GCConfig::IsForcedGC::kNotForced);
     heap->stats_collector()->NotifyMarkingCompleted(0);
-    const Sweeper::SweepingConfig sweeping_config{
-        Sweeper::SweepingConfig::SweepingType::kAtomic,
-        Sweeper::SweepingConfig::CompactableSpaceHandling::kSweep};
+    const SweepingConfig sweeping_config{
+        SweepingConfig::SweepingType::kAtomic,
+        SweepingConfig::CompactableSpaceHandling::kSweep};
     sweeper.Start(sweeping_config);
     sweeper.FinishIfRunning();
   }
@@ -226,8 +226,7 @@ class GCInDestructor final : public GarbageCollected<GCInDestructor> {
   ~GCInDestructor() {
     // Instead of directly calling GC, allocations should be supported here as
     // well.
-    heap_->CollectGarbage(
-        internal::GarbageCollector::Config::ConservativeAtomicConfig());
+    heap_->CollectGarbage(internal::GCConfig::ConservativeAtomicConfig());
   }
   void Trace(Visitor*) const {}
 
@@ -272,7 +271,16 @@ TEST_F(SweeperTest, UnmarkObjects) {
 }
 
 TEST_F(SweeperTest, LazySweepingDuringAllocation) {
-  using GCedObject = GCed<256>;
+  // The test allocates objects in such a way that the object with its header is
+  // power of two. This is to make sure that if there is some padding at the end
+  // of the page, it will go to a different freelist bucket. To get that,
+  // subtract vptr and object-header-size from a power-of-two.
+  static constexpr size_t kGCObjectSize =
+      256 - sizeof(void*) - sizeof(HeapObjectHeader);
+  using GCedObject = GCed<kGCObjectSize>;
+  static_assert(v8::base::bits::IsPowerOfTwo(sizeof(GCedObject) +
+                                             sizeof(HeapObjectHeader)));
+
   static const size_t kObjectsPerPage =
       NormalPage::PayloadSize() /
       (sizeof(GCedObject) + sizeof(HeapObjectHeader));
@@ -299,11 +307,10 @@ TEST_F(SweeperTest, LazySweepingDuringAllocation) {
   testing::TestPlatform::DisableBackgroundTasksScope no_concurrent_sweep_scope(
       GetPlatformHandle().get());
   g_destructor_callcount = 0;
-  static constexpr Heap::Config config = {
-      Heap::Config::CollectionType::kMajor,
-      Heap::Config::StackState::kNoHeapPointers,
-      Heap::Config::MarkingType::kAtomic,
-      Heap::Config::SweepingType::kIncrementalAndConcurrent};
+  static constexpr GCConfig config = {
+      CollectionType::kMajor, StackState::kNoHeapPointers,
+      GCConfig::MarkingType::kAtomic,
+      GCConfig::SweepingType::kIncrementalAndConcurrent};
   Heap::From(GetHeap())->CollectGarbage(config);
   // Incremental sweeping is active and the space should have two pages with
   // no room for an additional GCedObject. Allocating a new GCedObject should
@@ -334,11 +341,13 @@ TEST_F(SweeperTest, LazySweepingNormalPages) {
   PreciseGC();
   EXPECT_EQ(0u, g_destructor_callcount);
   MakeGarbageCollected<GCedObject>(GetAllocationHandle());
-  static constexpr Heap::Config config = {
-      Heap::Config::CollectionType::kMajor,
-      Heap::Config::StackState::kNoHeapPointers,
-      Heap::Config::MarkingType::kAtomic,
-      Heap::Config::SweepingType::kIncrementalAndConcurrent};
+  static constexpr GCConfig config = {
+      CollectionType::kMajor, StackState::kNoHeapPointers,
+      GCConfig::MarkingType::kAtomic,
+      // Sweeping type must not include concurrent as that could lead to the
+      // concurrent sweeper holding onto pages in rare cases which delays
+      // reclamation of objects.
+      GCConfig::SweepingType::kIncremental};
   Heap::From(GetHeap())->CollectGarbage(config);
   EXPECT_EQ(0u, g_destructor_callcount);
   MakeGarbageCollected<GCedObject>(GetAllocationHandle());
@@ -439,10 +448,9 @@ TEST_F(SweeperTest, CrossThreadPersistentCanBeClearedFromOtherThread) {
   testing::TestPlatform::DisableBackgroundTasksScope no_concurrent_sweep_scope(
       GetPlatformHandle().get());
   Heap::From(GetHeap())->CollectGarbage(
-      {Heap::Config::CollectionType::kMajor,
-       Heap::Config::StackState::kNoHeapPointers,
-       Heap::Config::MarkingType::kAtomic,
-       Heap::Config::SweepingType::kIncrementalAndConcurrent});
+      {CollectionType::kMajor, StackState::kNoHeapPointers,
+       GCConfig::MarkingType::kAtomic,
+       GCConfig::SweepingType::kIncrementalAndConcurrent});
   // `holder` is unreachable (as the stack is not scanned) and will be
   // reclaimed. Its payload memory is generally poisoned at this point. The
   // CrossThreadPersistent slot should be unpoisoned.
@@ -467,11 +475,10 @@ TEST_F(SweeperTest, WeakCrossThreadPersistentCanBeClearedFromOtherThread) {
 
   testing::TestPlatform::DisableBackgroundTasksScope no_concurrent_sweep_scope(
       GetPlatformHandle().get());
-  static constexpr Heap::Config config = {
-      Heap::Config::CollectionType::kMajor,
-      Heap::Config::StackState::kNoHeapPointers,
-      Heap::Config::MarkingType::kAtomic,
-      Heap::Config::SweepingType::kIncrementalAndConcurrent};
+  static constexpr GCConfig config = {
+      CollectionType::kMajor, StackState::kNoHeapPointers,
+      GCConfig::MarkingType::kAtomic,
+      GCConfig::SweepingType::kIncrementalAndConcurrent};
   Heap::From(GetHeap())->CollectGarbage(config);
   // `holder` is unreachable (as the stack is not scanned) and will be
   // reclaimed. Its payload memory is generally poisoned at this point. The
@@ -480,10 +487,9 @@ TEST_F(SweeperTest, WeakCrossThreadPersistentCanBeClearedFromOtherThread) {
   // GC in the remote heap should also clear `holder->weak_ref`. The slot for
   // `weak_ref` should be unpoisoned by the GC.
   Heap::From(remote_heap.get())
-      ->CollectGarbage({Heap::Config::CollectionType::kMajor,
-                        Heap::Config::StackState::kNoHeapPointers,
-                        Heap::Config::MarkingType::kAtomic,
-                        Heap::Config::SweepingType::kAtomic});
+      ->CollectGarbage({CollectionType::kMajor, StackState::kNoHeapPointers,
+                        GCConfig::MarkingType::kAtomic,
+                        GCConfig::SweepingType::kAtomic});
 
   // Finish the sweeper which will find the CrossThreadPersistent in cleared
   // state.
@@ -491,5 +497,41 @@ TEST_F(SweeperTest, WeakCrossThreadPersistentCanBeClearedFromOtherThread) {
   EXPECT_EQ(1u, Holder::destructor_callcount);
 }
 
+TEST_F(SweeperTest, SweepOnAllocationTakeLastFreeListEntry) {
+  // The test allocates the following layout:
+  // |--object-A--|-object-B-|--object-A--|---free-space---|
+  // Objects A are reachable, whereas object B is not. sizeof(B) is smaller than
+  // that of A. The test starts garbage-collection with lazy sweeping, then
+  // tries to allocate object A, expecting the allocation to end up on the same
+  // page at the free-space.
+  using GCedA = GCed<256>;
+  using GCedB = GCed<240>;
+
+  PreciseGC();
+
+  // Allocate the layout.
+  Persistent<GCedA> a1 = MakeGarbageCollected<GCedA>(GetAllocationHandle());
+  MakeGarbageCollected<GCedB>(GetAllocationHandle());
+  Persistent<GCedA> a2 = MakeGarbageCollected<GCedA>(GetAllocationHandle());
+  ConstAddress free_space_start =
+      ObjectView<>(HeapObjectHeader::FromObject(a2.Get())).End();
+
+  // Start the GC without sweeping.
+  testing::TestPlatform::DisableBackgroundTasksScope no_concurrent_sweep_scope(
+      GetPlatformHandle().get());
+  static constexpr GCConfig config = {
+      CollectionType::kMajor, StackState::kNoHeapPointers,
+      GCConfig::MarkingType::kAtomic,
+      GCConfig::SweepingType::kIncrementalAndConcurrent};
+  Heap::From(GetHeap())->CollectGarbage(config);
+
+  // Allocate and sweep.
+  const GCedA* allocated_after_sweeping =
+      MakeGarbageCollected<GCedA>(GetAllocationHandle());
+  EXPECT_EQ(free_space_start,
+            reinterpret_cast<ConstAddress>(
+                &HeapObjectHeader::FromObject(allocated_after_sweeping)));
+}
+
 }  // namespace internal
 }  // namespace cppgc
diff --git a/deps/v8/test/unittests/heap/cppgc/testing-unittest.cc b/deps/v8/test/unittests/heap/cppgc/testing-unittest.cc
index 70f971e62f3393..7700a55fc6ab1e 100644
--- a/deps/v8/test/unittests/heap/cppgc/testing-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/testing-unittest.cc
@@ -28,7 +28,7 @@ TEST_F(TestingTest,
     auto* gced = MakeGarbageCollected<GCed>(GetHeap()->GetAllocationHandle());
     WeakPersistent<GCed> weak{gced};
     internal::Heap::From(GetHeap())->CollectGarbage(
-        Heap::Config::PreciseAtomicConfig());
+        GCConfig::PreciseAtomicConfig());
     EXPECT_FALSE(weak);
   }
   {
@@ -38,7 +38,7 @@ TEST_F(TestingTest,
         GetHeap()->GetHeapHandle(),
         EmbedderStackState::kMayContainHeapPointers);
     internal::Heap::From(GetHeap())->CollectGarbage(
-        Heap::Config::PreciseAtomicConfig());
+        GCConfig::PreciseAtomicConfig());
     EXPECT_FALSE(weak);
   }
   {
@@ -47,7 +47,7 @@ TEST_F(TestingTest,
     cppgc::testing::OverrideEmbedderStackStateScope override_stack(
         GetHeap()->GetHeapHandle(), EmbedderStackState::kNoHeapPointers);
     internal::Heap::From(GetHeap())->CollectGarbage(
-        Heap::Config::ConservativeAtomicConfig());
+        GCConfig::ConservativeAtomicConfig());
     EXPECT_TRUE(weak);
   }
 }
diff --git a/deps/v8/test/unittests/heap/cppgc/tests.h b/deps/v8/test/unittests/heap/cppgc/tests.h
index aa6db51e422bb0..5a9536b048395e 100644
--- a/deps/v8/test/unittests/heap/cppgc/tests.h
+++ b/deps/v8/test/unittests/heap/cppgc/tests.h
@@ -87,10 +87,9 @@ class TestWithHeap : public TestWithPlatform {
   // size of the heap and corresponding pages.
   void ConservativeMemoryDiscardingGC() {
     internal::Heap::From(GetHeap())->CollectGarbage(
-        {GarbageCollector::Config::CollectionType::kMajor,
-         Heap::StackState::kMayContainHeapPointers,
+        {CollectionType::kMajor, Heap::StackState::kMayContainHeapPointers,
          cppgc::Heap::MarkingType::kAtomic, cppgc::Heap::SweepingType::kAtomic,
-         GarbageCollector::Config::FreeMemoryHandling::kDiscardWherePossible});
+         GCConfig::FreeMemoryHandling::kDiscardWherePossible});
   }
 
   cppgc::Heap* GetHeap() const { return heap_.get(); }
diff --git a/deps/v8/test/unittests/heap/cppgc/weak-container-unittest.cc b/deps/v8/test/unittests/heap/cppgc/weak-container-unittest.cc
index 5fa8b1a884fcd4..192f4b7052c854 100644
--- a/deps/v8/test/unittests/heap/cppgc/weak-container-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/weak-container-unittest.cc
@@ -18,26 +18,23 @@ namespace internal {
 namespace {
 class WeakContainerTest : public testing::TestWithHeap {
  public:
-  using Config = Marker::MarkingConfig;
-
   void StartMarking() {
     CHECK_EQ(0u,
              Heap::From(GetHeap())->AsBase().stats_collector()->marked_bytes());
-    Config config = {Config::CollectionType::kMajor,
-                     Config::StackState::kNoHeapPointers,
-                     Config::MarkingType::kIncremental};
+    MarkingConfig config = {CollectionType::kMajor, StackState::kNoHeapPointers,
+                            MarkingConfig::MarkingType::kIncremental};
     GetMarkerRef() = std::make_unique<Marker>(
         Heap::From(GetHeap())->AsBase(), GetPlatformHandle().get(), config);
     GetMarkerRef()->StartMarking();
   }
 
-  void FinishMarking(Config::StackState stack_state) {
+  void FinishMarking(StackState stack_state) {
     GetMarkerRef()->FinishMarking(stack_state);
     marked_bytes_ =
         Heap::From(GetHeap())->AsBase().stats_collector()->marked_bytes();
     GetMarkerRef().reset();
     Heap::From(GetHeap())->stats_collector()->NotifySweepingCompleted(
-        GarbageCollector::Config::SweepingType::kAtomic);
+        GCConfig::SweepingType::kAtomic);
   }
 
   size_t GetMarkedBytes() const { return marked_bytes_; }
@@ -96,7 +93,7 @@ TEST_F(WeakContainerTest, TraceableGCedTraced) {
   obj->n_trace_calls = 0u;
   StartMarking();
   GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
-  FinishMarking(Config::StackState::kNoHeapPointers);
+  FinishMarking(StackState::kNoHeapPointers);
   EXPECT_NE(0u, obj->n_trace_calls);
   EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
 }
@@ -107,7 +104,7 @@ TEST_F(WeakContainerTest, NonTraceableGCedNotTraced) {
   obj->n_trace_calls = 0u;
   StartMarking();
   GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
-  FinishMarking(Config::StackState::kNoHeapPointers);
+  FinishMarking(StackState::kNoHeapPointers);
   EXPECT_EQ(0u, obj->n_trace_calls);
   EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes());
 }
@@ -118,7 +115,7 @@ TEST_F(WeakContainerTest, NonTraceableGCedNotTracedConservatively) {
   obj->n_trace_calls = 0u;
   StartMarking();
   GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
-  FinishMarking(Config::StackState::kMayContainHeapPointers);
+  FinishMarking(StackState::kMayContainHeapPointers);
   EXPECT_NE(0u, obj->n_trace_calls);
   EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes());
 }
@@ -129,7 +126,7 @@ TEST_F(WeakContainerTest, PreciseGCTracesWeakContainerWhenTraced) {
   obj->n_trace_calls = 0u;
   StartMarking();
   GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
-  FinishMarking(Config::StackState::kNoHeapPointers);
+  FinishMarking(StackState::kNoHeapPointers);
   EXPECT_EQ(1u, obj->n_trace_calls);
   EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
 }
@@ -140,7 +137,7 @@ TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainer) {
   obj->n_trace_calls = 0u;
   StartMarking();
   GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
-  FinishMarking(Config::StackState::kMayContainHeapPointers);
+  FinishMarking(StackState::kMayContainHeapPointers);
   EXPECT_EQ(2u, obj->n_trace_calls);
   EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
 }
@@ -155,7 +152,7 @@ TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainerOnce) {
   obj->n_trace_calls = 0u;
   StartMarking();
   GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
-  FinishMarking(Config::StackState::kMayContainHeapPointers);
+  FinishMarking(StackState::kMayContainHeapPointers);
   EXPECT_EQ(1u, obj->n_trace_calls);
   EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes());
 }
@@ -183,7 +180,7 @@ TEST_F(WeakContainerTest, WeakContainerWeakCallbackCalled) {
   StartMarking();
   GetMarkerRef()->Visitor().TraceWeakContainer(obj, WeakCallback::callback,
                                                obj);
-  FinishMarking(Config::StackState::kMayContainHeapPointers);
+  FinishMarking(StackState::kMayContainHeapPointers);
   EXPECT_NE(0u, WeakCallback::n_callback_called);
   EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
   EXPECT_EQ(obj, WeakCallback::obj);
diff --git a/deps/v8/test/unittests/heap/cppgc/workloads-unittest.cc b/deps/v8/test/unittests/heap/cppgc/workloads-unittest.cc
index 820bac967aa090..2b3c5b0841f41b 100644
--- a/deps/v8/test/unittests/heap/cppgc/workloads-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/workloads-unittest.cc
@@ -26,11 +26,11 @@ class WorkloadsTest : public testing::TestWithHeap {
  public:
   void ConservativeGC() {
     internal::Heap::From(GetHeap())->CollectGarbage(
-        Heap::Config::ConservativeAtomicConfig());
+        GCConfig::ConservativeAtomicConfig());
   }
   void PreciseGC() {
     internal::Heap::From(GetHeap())->CollectGarbage(
-        Heap::Config::PreciseAtomicConfig());
+        GCConfig::PreciseAtomicConfig());
   }
 };
 
diff --git a/deps/v8/test/unittests/heap/cppgc/write-barrier-unittest.cc b/deps/v8/test/unittests/heap/cppgc/write-barrier-unittest.cc
index 845e580ccdfba6..2d6df97180de73 100644
--- a/deps/v8/test/unittests/heap/cppgc/write-barrier-unittest.cc
+++ b/deps/v8/test/unittests/heap/cppgc/write-barrier-unittest.cc
@@ -29,16 +29,15 @@ class V8_NODISCARD IncrementalMarkingScope {
     marker_->FinishMarking(kIncrementalConfig.stack_state);
   }
 
-  static constexpr Marker::MarkingConfig kIncrementalConfig{
-      Marker::MarkingConfig::CollectionType::kMajor,
-      Marker::MarkingConfig::StackState::kNoHeapPointers,
-      Marker::MarkingConfig::MarkingType::kIncremental};
+  static constexpr MarkingConfig kIncrementalConfig{
+      CollectionType::kMajor, StackState::kNoHeapPointers,
+      MarkingConfig::MarkingType::kIncremental};
 
  private:
   MarkerBase* marker_;
 };
 
-constexpr Marker::MarkingConfig IncrementalMarkingScope::kIncrementalConfig;
+constexpr MarkingConfig IncrementalMarkingScope::kIncrementalConfig;
 
 class V8_NODISCARD ExpectWriteBarrierFires final
     : private IncrementalMarkingScope {
diff --git a/deps/v8/test/unittests/heap/embedder-tracing-unittest.cc b/deps/v8/test/unittests/heap/embedder-tracing-unittest.cc
index 6391c7dce2568e..5c60de51ce7040 100644
--- a/deps/v8/test/unittests/heap/embedder-tracing-unittest.cc
+++ b/deps/v8/test/unittests/heap/embedder-tracing-unittest.cc
@@ -457,9 +457,9 @@ TEST_F(EmbedderTracingTest, FinalizeTracingWhenMarking) {
 
   // Finalize a potentially running garbage collection.
   CollectGarbage(OLD_SPACE);
-  if (heap->mark_compact_collector()->sweeping_in_progress()) {
-    heap->mark_compact_collector()->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   heap->tracer()->StopFullCycleIfNeeded();
   EXPECT_TRUE(heap->incremental_marking()->IsStopped());
diff --git a/deps/v8/test/unittests/heap/global-handles-unittest.cc b/deps/v8/test/unittests/heap/global-handles-unittest.cc
index 65ad38f0d48205..99e9f23d980593 100644
--- a/deps/v8/test/unittests/heap/global-handles-unittest.cc
+++ b/deps/v8/test/unittests/heap/global-handles-unittest.cc
@@ -30,6 +30,7 @@
 #include "include/v8-function.h"
 #include "src/api/api-inl.h"
 #include "src/execution/isolate.h"
+#include "src/flags/flags.h"
 #include "src/heap/factory.h"
 #include "src/heap/heap-inl.h"
 #include "src/objects/objects-inl.h"
@@ -496,7 +497,8 @@ TEST_F(GlobalHandlesTest, GCFromWeakCallbacks) {
   if (v8_flags.single_generation) {
     FlagAndGlobal fp;
     ConstructJSApiObject(isolate, context, &fp);
-    CHECK(!InYoungGeneration(isolate, fp.handle));
+    CHECK_IMPLIES(!v8_flags.single_generation,
+                  !InYoungGeneration(isolate, fp.handle));
     fp.flag = false;
     fp.handle.SetWeak(&fp, &ForceMarkSweep1, v8::WeakCallbackType::kParameter);
     CollectAllGarbage();
diff --git a/deps/v8/test/unittests/heap/global-safepoint-unittest.cc b/deps/v8/test/unittests/heap/global-safepoint-unittest.cc
index 57e94e15dfee64..16cb6ea64ab736 100644
--- a/deps/v8/test/unittests/heap/global-safepoint-unittest.cc
+++ b/deps/v8/test/unittests/heap/global-safepoint-unittest.cc
@@ -22,7 +22,7 @@ namespace {
 
 class IsolateWithContextWrapper {
  public:
-  explicit IsolateWithContextWrapper()
+  IsolateWithContextWrapper()
       : isolate_wrapper_(kNoCounters),
         isolate_scope_(isolate_wrapper_.isolate()),
         handle_scope_(isolate_wrapper_.isolate()),
@@ -125,8 +125,9 @@ TEST_F(GlobalSafepointTest, Interrupt) {
     // as of FeedbackVectors, and we wouldn't be testing the interrupt check.
     base::OS::Sleep(base::TimeDelta::FromMilliseconds(500));
     GlobalSafepointScope global_safepoint(i_main_isolate);
-    i_main_isolate->shared_isolate()->global_safepoint()->IterateClientIsolates(
-        [](Isolate* client) {
+    i_main_isolate->shared_heap_isolate()
+        ->global_safepoint()
+        ->IterateClientIsolates([](Isolate* client) {
           client->stack_guard()->RequestTerminateExecution();
         });
   }
diff --git a/deps/v8/test/unittests/heap/heap-unittest.cc b/deps/v8/test/unittests/heap/heap-unittest.cc
index 300602ee5cdede..32d1d4525a3fb4 100644
--- a/deps/v8/test/unittests/heap/heap-unittest.cc
+++ b/deps/v8/test/unittests/heap/heap-unittest.cc
@@ -10,8 +10,10 @@
 
 #include "include/v8-isolate.h"
 #include "include/v8-object.h"
+#include "src/flags/flags.h"
 #include "src/handles/handles-inl.h"
 #include "src/heap/gc-tracer.h"
+#include "src/heap/marking-state-inl.h"
 #include "src/heap/memory-chunk.h"
 #include "src/heap/remembered-set.h"
 #include "src/heap/safepoint.h"
@@ -179,6 +181,37 @@ TEST_F(HeapTest, HeapLayout) {
 }
 #endif  // V8_COMPRESS_POINTERS
 
+namespace {
+void ShrinkNewSpace(NewSpace* new_space) {
+  if (!v8_flags.minor_mc) {
+    new_space->Shrink();
+    return;
+  }
+  // MinorMC shrinks the space as part of sweeping.
+  PagedNewSpace* paged_new_space = PagedNewSpace::From(new_space);
+  GCTracer* tracer = paged_new_space->heap()->tracer();
+  tracer->StartObservablePause();
+  tracer->StartCycle(GarbageCollector::MARK_COMPACTOR,
+                     GarbageCollectionReason::kTesting, "heap unittest",
+                     GCTracer::MarkingType::kAtomic);
+  tracer->StartAtomicPause();
+  paged_new_space->StartShrinking();
+  for (Page* page = paged_new_space->first_page();
+       page != paged_new_space->last_page() &&
+       (paged_new_space->ShouldReleasePage());) {
+    Page* current_page = page;
+    page = page->next_page();
+    if (current_page->allocated_bytes() == 0) {
+      paged_new_space->ReleasePage(current_page);
+    }
+  }
+  paged_new_space->FinishShrinking();
+  tracer->StopAtomicPause();
+  tracer->StopObservablePause();
+  tracer->NotifySweepingCompleted();
+}
+}  // namespace
+
 TEST_F(HeapTest, GrowAndShrinkNewSpace) {
   if (v8_flags.single_generation) return;
   {
@@ -197,7 +230,7 @@ TEST_F(HeapTest, GrowAndShrinkNewSpace) {
   // Make sure we're in a consistent state to start out.
   CollectAllGarbage();
   CollectAllGarbage();
-  new_space->Shrink();
+  ShrinkNewSpace(new_space);
 
   // Explicitly growing should double the space capacity.
   size_t old_capacity, new_capacity;
@@ -216,7 +249,7 @@ TEST_F(HeapTest, GrowAndShrinkNewSpace) {
 
   // Explicitly shrinking should not affect space capacity.
   old_capacity = new_space->TotalCapacity();
-  new_space->Shrink();
+  ShrinkNewSpace(new_space);
   new_capacity = new_space->TotalCapacity();
   CHECK_EQ(old_capacity, new_capacity);
 
@@ -226,7 +259,7 @@ TEST_F(HeapTest, GrowAndShrinkNewSpace) {
 
   // Explicitly shrinking should halve the space capacity.
   old_capacity = new_space->TotalCapacity();
-  new_space->Shrink();
+  ShrinkNewSpace(new_space);
   new_capacity = new_space->TotalCapacity();
   if (v8_flags.minor_mc) {
     // Shrinking may not be able to remove any pages if all contain live
@@ -238,9 +271,9 @@ TEST_F(HeapTest, GrowAndShrinkNewSpace) {
 
   // Consecutive shrinking should not affect space capacity.
   old_capacity = new_space->TotalCapacity();
-  new_space->Shrink();
-  new_space->Shrink();
-  new_space->Shrink();
+  ShrinkNewSpace(new_space);
+  ShrinkNewSpace(new_space);
+  ShrinkNewSpace(new_space);
   new_capacity = new_space->TotalCapacity();
   CHECK_EQ(old_capacity, new_capacity);
 }
@@ -396,7 +429,7 @@ TEST_F(HeapTest, Regress978156) {
     marking->Start(GarbageCollector::MARK_COMPACTOR,
                    i::GarbageCollectionReason::kTesting);
   }
-  MarkingState* marking_state = marking->marking_state();
+  MarkingState* marking_state = heap->marking_state();
   // 6. Mark the filler black to access its two markbits. This triggers
   // an out-of-bounds access of the marking bitmap in a bad case.
   marking_state->WhiteToGrey(filler);
diff --git a/deps/v8/test/unittests/heap/heap-utils.cc b/deps/v8/test/unittests/heap/heap-utils.cc
index ea7d2a8002d0b7..880b03400224de 100644
--- a/deps/v8/test/unittests/heap/heap-utils.cc
+++ b/deps/v8/test/unittests/heap/heap-utils.cc
@@ -13,7 +13,6 @@
 #include "src/heap/new-spaces.h"
 #include "src/heap/safepoint.h"
 #include "src/objects/free-space-inl.h"
-#include "v8-internal.h"
 
 namespace v8 {
 namespace internal {
@@ -23,19 +22,18 @@ void HeapInternalsBase::SimulateIncrementalMarking(Heap* heap,
   constexpr double kStepSizeInMs = 100;
   CHECK(v8_flags.incremental_marking);
   i::IncrementalMarking* marking = heap->incremental_marking();
-  i::MarkCompactCollector* collector = heap->mark_compact_collector();
 
-  if (collector->sweeping_in_progress()) {
+  if (heap->sweeping_in_progress()) {
     SafepointScope scope(heap);
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
 
   if (marking->IsStopped()) {
     heap->StartIncrementalMarking(i::Heap::kNoGCFlags,
                                   i::GarbageCollectionReason::kTesting);
   }
-  CHECK(marking->IsMarking());
+  CHECK(marking->IsMajorMarking());
   if (!force_completion) return;
 
   while (!marking->IsMajorMarkingComplete()) {
@@ -153,11 +151,11 @@ void HeapInternalsBase::SimulateFullSpace(v8::internal::PagedSpace* space) {
   // v8_flags.stress_concurrent_allocation = false;
   // Background thread allocating concurrently interferes with this function.
   CHECK(!v8_flags.stress_concurrent_allocation);
-  CodePageCollectionMemoryModificationScopeForTesting code_scope(space->heap());
-  i::MarkCompactCollector* collector = space->heap()->mark_compact_collector();
-  if (collector->sweeping_in_progress()) {
-    collector->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+  Heap* heap = space->heap();
+  CodePageCollectionMemoryModificationScopeForTesting code_scope(heap);
+  if (heap->sweeping_in_progress()) {
+    heap->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
   }
   space->FreeLinearAllocationArea();
   space->ResetFreeList();
diff --git a/deps/v8/test/unittests/heap/heap-utils.h b/deps/v8/test/unittests/heap/heap-utils.h
index f4bd609d01315e..6a111aaa80ae0d 100644
--- a/deps/v8/test/unittests/heap/heap-utils.h
+++ b/deps/v8/test/unittests/heap/heap-utils.h
@@ -78,8 +78,8 @@ class WithHeapInternals : public TMixin, HeapInternalsBase {
     CHECK(!v8_flags.stress_concurrent_allocation);
     FullGC();
     FullGC();
-    heap()->mark_compact_collector()->EnsureSweepingCompleted(
-        MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+    heap()->EnsureSweepingCompleted(
+        Heap::SweepingForcedFinalizationMode::kV8Only);
     heap()->old_space()->FreeLinearAllocationArea();
     for (Page* page : *heap()->old_space()) {
       page->MarkNeverAllocateForTesting();
@@ -88,10 +88,10 @@ class WithHeapInternals : public TMixin, HeapInternalsBase {
 
   void GcAndSweep(i::AllocationSpace space) {
     heap()->CollectGarbage(space, GarbageCollectionReason::kTesting);
-    if (heap()->mark_compact_collector()->sweeping_in_progress()) {
+    if (heap()->sweeping_in_progress()) {
       SafepointScope scope(heap());
-      heap()->mark_compact_collector()->EnsureSweepingCompleted(
-          MarkCompactCollector::SweepingForcedFinalizationMode::kV8Only);
+      heap()->EnsureSweepingCompleted(
+          Heap::SweepingForcedFinalizationMode::kV8Only);
     }
   }
 };
diff --git a/deps/v8/test/unittests/heap/marking-inner-pointer-resolution-unittest.cc b/deps/v8/test/unittests/heap/marking-inner-pointer-resolution-unittest.cc
index 2ab6589a5b354b..1dd205574f5731 100644
--- a/deps/v8/test/unittests/heap/marking-inner-pointer-resolution-unittest.cc
+++ b/deps/v8/test/unittests/heap/marking-inner-pointer-resolution-unittest.cc
@@ -2,15 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "src/heap/gc-tracer.h"
 #include "src/heap/mark-compact.h"
+#include "test/unittests/heap/heap-utils.h"
 #include "test/unittests/test-utils.h"
 
 namespace v8 {
 namespace internal {
 
-#ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_MB
 namespace {
 
+constexpr int Tagged = kTaggedSize;
+constexpr int FullCell = Bitmap::kBitsPerCell * Tagged;
+
 class InnerPointerResolutionTest : public TestWithIsolate {
  public:
   struct ObjectRequest {
@@ -99,7 +103,7 @@ class InnerPointerResolutionTest : public TestWithIsolate {
     Address ptr = page->area_start();
     for (auto object : objects) {
       DCHECK_NE(ObjectRequest::LARGE, object.type);
-      DCHECK_EQ(0, object.size % kTaggedSize);
+      DCHECK_EQ(0, object.size % Tagged);
 
       // Check if padding is needed.
       int index_in_cell = Bitmap::IndexInCell(page->AddressToMarkbitIndex(ptr));
@@ -111,7 +115,7 @@ class InnerPointerResolutionTest : public TestWithIsolate {
         const int needed_padding_size =
             ((Bitmap::kBitsPerCell + object.index_in_cell - index_in_cell) %
              Bitmap::kBitsPerCell) *
-            Bitmap::kBytesPerCell;
+            Tagged;
         if (needed_padding_size > 0) {
           ObjectRequest pad{needed_padding_size,
                             ObjectRequest::FREE,
@@ -181,13 +185,13 @@ class InnerPointerResolutionTest : public TestWithIsolate {
     switch (object.type) {
       case ObjectRequest::REGULAR:
       case ObjectRequest::LARGE: {
-        DCHECK_LE(2 * kTaggedSize, object.size);
+        DCHECK_LE(2 * Tagged, object.size);
         ReadOnlyRoots roots(heap());
         HeapObject heap_object(HeapObject::FromAddress(object.address));
         heap_object.set_map_after_allocation(roots.unchecked_fixed_array_map(),
                                              SKIP_WRITE_BARRIER);
         FixedArray arr(FixedArray::cast(heap_object));
-        arr.set_length((object.size - FixedArray::SizeFor(0)) / kTaggedSize);
+        arr.set_length((object.size - FixedArray::SizeFor(0)) / Tagged);
         DCHECK_EQ(object.size, arr.AllocatedSize());
         break;
       }
@@ -201,17 +205,17 @@ class InnerPointerResolutionTest : public TestWithIsolate {
       case ObjectRequest::WHITE:
         break;
       case ObjectRequest::GREY:
-        collector()->marking_state()->WhiteToGrey(
+        heap()->marking_state()->WhiteToGrey(
             HeapObject::FromAddress(object.address));
         break;
       case ObjectRequest::BLACK:
-        DCHECK_LE(2 * kTaggedSize, object.size);
-        collector()->marking_state()->WhiteToBlack(
+        DCHECK_LE(2 * Tagged, object.size);
+        heap()->marking_state()->WhiteToBlack(
             HeapObject::FromAddress(object.address));
         break;
       case ObjectRequest::BLACK_AREA: {
         MemoryChunk* page = LookupPage(object.page_id);
-        collector()->marking_state()->bitmap(page)->SetRange(
+        heap()->marking_state()->bitmap(page)->SetRange(
             page->AddressToMarkbitIndex(object.address),
             page->AddressToMarkbitIndex(object.address + object.size));
         break;
@@ -229,8 +233,8 @@ class InnerPointerResolutionTest : public TestWithIsolate {
         !IsPageAlive(object.page_id) || (object.type == ObjectRequest::FREE) ||
         (object.type == ObjectRequest::REGULAR &&
          (object.marked == ObjectRequest::BLACK_AREA ||
-          (object.marked == ObjectRequest::BLACK && offset < 2 * kTaggedSize) ||
-          (object.marked == ObjectRequest::GREY && offset < kTaggedSize)));
+          (object.marked == ObjectRequest::BLACK && offset < 2 * Tagged) ||
+          (object.marked == ObjectRequest::GREY && offset < Tagged)));
     if (should_return_null)
       EXPECT_EQ(kNullAddress, base_ptr);
     else
@@ -279,15 +283,15 @@ TEST_F(InnerPointerResolutionTest, EmptyPage) {
 TEST_F(InnerPointerResolutionTest, NothingMarked) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {64},
-      {48},
-      {52},
-      {512},
-      {4, ObjectRequest::FREE},
-      {60},
-      {8, ObjectRequest::FREE},
-      {8},
-      {42176},
+      {16 * Tagged},
+      {12 * Tagged},
+      {13 * Tagged},
+      {128 * Tagged},
+      {1 * Tagged, ObjectRequest::FREE},
+      {15 * Tagged},
+      {2 * Tagged, ObjectRequest::FREE},
+      {2 * Tagged},
+      {10544 * Tagged},
   });
   TestAll();
 }
@@ -295,15 +299,15 @@ TEST_F(InnerPointerResolutionTest, NothingMarked) {
 TEST_F(InnerPointerResolutionTest, AllMarked) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {64, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {48, ObjectRequest::REGULAR, ObjectRequest::GREY},
-      {52, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {512, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {4, ObjectRequest::FREE, ObjectRequest::GREY},
-      {60, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {8, ObjectRequest::FREE, ObjectRequest::GREY},
-      {8, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {42176, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {12 * Tagged, ObjectRequest::REGULAR, ObjectRequest::GREY},
+      {13 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {128 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {1 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {15 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {2 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {2 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {10544 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
   });
   TestAll();
 }
@@ -311,15 +315,15 @@ TEST_F(InnerPointerResolutionTest, AllMarked) {
 TEST_F(InnerPointerResolutionTest, SomeMarked) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {48, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {52, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {512, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {4, ObjectRequest::FREE, ObjectRequest::GREY},
-      {60, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {8, ObjectRequest::FREE, ObjectRequest::GREY},
-      {8, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {42176, ObjectRequest::REGULAR, ObjectRequest::GREY},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {12 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {13 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {128 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {1 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {15 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {2 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {2 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {10544 * Tagged, ObjectRequest::REGULAR, ObjectRequest::GREY},
   });
   TestAll();
 }
@@ -327,15 +331,15 @@ TEST_F(InnerPointerResolutionTest, SomeMarked) {
 TEST_F(InnerPointerResolutionTest, BlackAreas) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {48, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {52, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {512, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {4, ObjectRequest::FREE, ObjectRequest::GREY},
-      {60, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {8, ObjectRequest::FREE, ObjectRequest::GREY},
-      {8, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {42176, ObjectRequest::REGULAR, ObjectRequest::GREY},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {12 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {13 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {128 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {1 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {15 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {2 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {2 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {10544 * Tagged, ObjectRequest::REGULAR, ObjectRequest::GREY},
   });
   TestAll();
 }
@@ -347,16 +351,16 @@ TEST_F(InnerPointerResolutionTest, ThreeMarkedObjectsInSameCell) {
   CreateObjectsInPage({
       // Some initial large unmarked object, followed by a small marked object
       // towards the end of the cell.
-      {512},
-      {20, ObjectRequest::REGULAR, ObjectRequest::BLACK, 20,
+      {128 * Tagged},
+      {5 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK, 20,
        ObjectRequest::PAD_WHITE},
       // Then three marked objects in the same cell.
-      {32, ObjectRequest::REGULAR, ObjectRequest::BLACK, 3,
+      {8 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK, 3,
        ObjectRequest::PAD_WHITE},
-      {48, ObjectRequest::REGULAR, ObjectRequest::BLACK, 11},
-      {20, ObjectRequest::REGULAR, ObjectRequest::BLACK, 23},
+      {12 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK, 11},
+      {5 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK, 23},
       // This marked object is in the next cell.
-      {64, ObjectRequest::REGULAR, ObjectRequest::BLACK, 17,
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK, 17,
        ObjectRequest::PAD_WHITE},
   });
   TestAll();
@@ -367,16 +371,16 @@ TEST_F(InnerPointerResolutionTest, ThreeBlackAreasInSameCell) {
   CreateObjectsInPage({
       // Some initial large unmarked object, followed by a small black area
       // towards the end of the cell.
-      {512},
-      {20, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 20,
+      {128 * Tagged},
+      {5 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 20,
        ObjectRequest::PAD_WHITE},
       // Then three black areas in the same cell.
-      {32, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 3,
+      {8 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 3,
        ObjectRequest::PAD_WHITE},
-      {48, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 11},
-      {20, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 23},
+      {12 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 11},
+      {5 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 23},
       // This black area is in the next cell.
-      {64, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 17,
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 17,
        ObjectRequest::PAD_WHITE},
   });
   TestAll();
@@ -385,7 +389,7 @@ TEST_F(InnerPointerResolutionTest, ThreeBlackAreasInSameCell) {
 TEST_F(InnerPointerResolutionTest, SmallBlackAreaAtPageStart) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE, 30,
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE, 30,
        ObjectRequest::PAD_BLACK},
   });
   TestAll();
@@ -394,8 +398,8 @@ TEST_F(InnerPointerResolutionTest, SmallBlackAreaAtPageStart) {
 TEST_F(InnerPointerResolutionTest, SmallBlackAreaAtPageStartUntilCellBoundary) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {8, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
+      {2 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
        ObjectRequest::PAD_BLACK},
   });
   TestAll();
@@ -404,9 +408,8 @@ TEST_F(InnerPointerResolutionTest, SmallBlackAreaAtPageStartUntilCellBoundary) {
 TEST_F(InnerPointerResolutionTest, LargeBlackAreaAtPageStart) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {42 * Bitmap::kBitsPerCell * Bitmap::kBytesPerCell,
-       ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE, 30,
+      {42 * FullCell, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE, 30,
        ObjectRequest::PAD_BLACK},
   });
   TestAll();
@@ -415,9 +418,8 @@ TEST_F(InnerPointerResolutionTest, LargeBlackAreaAtPageStart) {
 TEST_F(InnerPointerResolutionTest, LargeBlackAreaAtPageStartUntilCellBoundary) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {42 * Bitmap::kBitsPerCell * Bitmap::kBytesPerCell,
-       ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
+      {42 * FullCell, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
        ObjectRequest::PAD_BLACK},
   });
   TestAll();
@@ -426,8 +428,8 @@ TEST_F(InnerPointerResolutionTest, LargeBlackAreaAtPageStartUntilCellBoundary) {
 TEST_F(InnerPointerResolutionTest, SmallBlackAreaStartingAtCellBoundary) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {512},
-      {20, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 0,
+      {128 * Tagged},
+      {5 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 0,
        ObjectRequest::PAD_WHITE},
   });
   TestAll();
@@ -436,10 +438,9 @@ TEST_F(InnerPointerResolutionTest, SmallBlackAreaStartingAtCellBoundary) {
 TEST_F(InnerPointerResolutionTest, LargeBlackAreaStartingAtCellBoundary) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {512},
-      {42 * Bitmap::kBitsPerCell * Bitmap::kBytesPerCell + 64,
-       ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 0,
-       ObjectRequest::PAD_WHITE},
+      {128 * Tagged},
+      {42 * FullCell + 16 * Tagged, ObjectRequest::REGULAR,
+       ObjectRequest::BLACK_AREA, 0, ObjectRequest::PAD_WHITE},
   });
   TestAll();
 }
@@ -447,10 +448,10 @@ TEST_F(InnerPointerResolutionTest, LargeBlackAreaStartingAtCellBoundary) {
 TEST_F(InnerPointerResolutionTest, SmallBlackAreaEndingAtCellBoundary) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {512},
-      {8, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 13,
+      {128 * Tagged},
+      {2 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 13,
        ObjectRequest::PAD_WHITE},
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
        ObjectRequest::PAD_BLACK},
   });
   TestAll();
@@ -459,11 +460,10 @@ TEST_F(InnerPointerResolutionTest, SmallBlackAreaEndingAtCellBoundary) {
 TEST_F(InnerPointerResolutionTest, LargeBlackAreaEndingAtCellBoundary) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {512},
-      {42 * Bitmap::kBitsPerCell * Bitmap::kBytesPerCell + 64,
-       ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 0,
-       ObjectRequest::PAD_WHITE},
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
+      {128 * Tagged},
+      {42 * FullCell + 16 * Tagged, ObjectRequest::REGULAR,
+       ObjectRequest::BLACK_AREA, 0, ObjectRequest::PAD_WHITE},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
        ObjectRequest::PAD_BLACK},
   });
   TestAll();
@@ -472,12 +472,12 @@ TEST_F(InnerPointerResolutionTest, LargeBlackAreaEndingAtCellBoundary) {
 TEST_F(InnerPointerResolutionTest, TwoSmallBlackAreasAtCellBoundaries) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {512},
-      {24, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 0,
+      {128 * Tagged},
+      {6 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 0,
        ObjectRequest::PAD_WHITE},
-      {8, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 25,
+      {2 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 25,
        ObjectRequest::PAD_WHITE},
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE, 0,
        ObjectRequest::PAD_BLACK},
   });
   TestAll();
@@ -486,9 +486,9 @@ TEST_F(InnerPointerResolutionTest, TwoSmallBlackAreasAtCellBoundaries) {
 TEST_F(InnerPointerResolutionTest, BlackAreaOfOneCell) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {512},
-      {Bitmap::kBitsPerCell * Bitmap::kBytesPerCell, ObjectRequest::REGULAR,
-       ObjectRequest::BLACK_AREA, 0, ObjectRequest::PAD_WHITE},
+      {128 * Tagged},
+      {1 * FullCell, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 0,
+       ObjectRequest::PAD_WHITE},
   });
   TestAll();
 }
@@ -496,9 +496,8 @@ TEST_F(InnerPointerResolutionTest, BlackAreaOfOneCell) {
 TEST_F(InnerPointerResolutionTest, BlackAreaOfManyCells) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {512},
-      {17 * Bitmap::kBitsPerCell * Bitmap::kBytesPerCell,
-       ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 0,
+      {128 * Tagged},
+      {17 * FullCell, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA, 0,
        ObjectRequest::PAD_WHITE},
   });
   TestAll();
@@ -509,21 +508,21 @@ TEST_F(InnerPointerResolutionTest, BlackAreaOfManyCells) {
 TEST_F(InnerPointerResolutionTest, TwoPages) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {52, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {512, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {60, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {42176, ObjectRequest::REGULAR, ObjectRequest::GREY},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {13 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {128 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {15 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {10544 * Tagged, ObjectRequest::REGULAR, ObjectRequest::GREY},
   });
   CreateObjectsInPage({
-      {512, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {48, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {52, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {4, ObjectRequest::FREE, ObjectRequest::GREY},
-      {8, ObjectRequest::FREE, ObjectRequest::GREY},
-      {8, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {60, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {128 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {12 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {13 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {1 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {2 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {2 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {15 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
   });
   TestAll();
 }
@@ -548,21 +547,21 @@ TEST_F(InnerPointerResolutionTest, SeveralLargePages) {
 TEST_F(InnerPointerResolutionTest, PagesOfBothKind) {
   if (v8_flags.enable_third_party_heap) return;
   CreateObjectsInPage({
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {52, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {512, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {60, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {42176, ObjectRequest::REGULAR, ObjectRequest::GREY},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {13 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {128 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {15 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {10544 * Tagged, ObjectRequest::REGULAR, ObjectRequest::GREY},
   });
   CreateObjectsInPage({
-      {512, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {48, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {52, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {4, ObjectRequest::FREE, ObjectRequest::GREY},
-      {8, ObjectRequest::FREE, ObjectRequest::GREY},
-      {8, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {60, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {128 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {12 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {13 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {1 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {2 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {2 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {15 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
   });
   CreateLargeObjects({
       {1 * MB, ObjectRequest::LARGE, ObjectRequest::WHITE},
@@ -574,21 +573,21 @@ TEST_F(InnerPointerResolutionTest, PagesOfBothKind) {
 TEST_F(InnerPointerResolutionTest, FreePages) {
   if (v8_flags.enable_third_party_heap) return;
   int some_normal_page = CreateObjectsInPage({
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {52, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {512, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {60, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {42176, ObjectRequest::REGULAR, ObjectRequest::GREY},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {13 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {128 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {15 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {10544 * Tagged, ObjectRequest::REGULAR, ObjectRequest::GREY},
   });
   CreateObjectsInPage({
-      {512, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {64, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {48, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
-      {52, ObjectRequest::REGULAR, ObjectRequest::BLACK},
-      {4, ObjectRequest::FREE, ObjectRequest::GREY},
-      {8, ObjectRequest::FREE, ObjectRequest::GREY},
-      {8, ObjectRequest::REGULAR, ObjectRequest::WHITE},
-      {60, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {128 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {16 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {12 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK_AREA},
+      {13 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
+      {1 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {2 * Tagged, ObjectRequest::FREE, ObjectRequest::GREY},
+      {2 * Tagged, ObjectRequest::REGULAR, ObjectRequest::WHITE},
+      {15 * Tagged, ObjectRequest::REGULAR, ObjectRequest::BLACK},
   });
   auto large_pages = CreateLargeObjects({
       {1 * MB, ObjectRequest::LARGE, ObjectRequest::WHITE},
@@ -601,7 +600,262 @@ TEST_F(InnerPointerResolutionTest, FreePages) {
   TestAll();
 }
 
-#endif  // V8_ENABLE_INNER_POINTER_RESOLUTION_MB
+using InnerPointerResolutionHeapTest = TestWithHeapInternalsAndContext;
+
+TEST_F(InnerPointerResolutionHeapTest, UnusedRegularYoungPages) {
+  ManualGCScope manual_gc_scope(isolate());
+  v8_flags.page_promotion = false;
+
+  Persistent<v8::FixedArray> weak1, weak2, strong;
+  Address inner_ptr1, inner_ptr2, inner_ptr3, outside_ptr1, outside_ptr2;
+  Page *page1, *page2;
+
+  {
+    PtrComprCageBase cage_base{isolate()};
+    HandleScope scope(isolate());
+
+    // Allocate two objects, large enough that they fall in two different young
+    // generation pages. Keep weak references to these objects.
+    const int length =
+        (heap()->MaxRegularHeapObjectSize(AllocationType::kYoung) -
+         FixedArray::SizeFor(0)) /
+        Tagged;
+    auto h1 = factory()->NewFixedArray(length, AllocationType::kYoung);
+    auto h2 = factory()->NewFixedArray(length, AllocationType::kYoung);
+    weak1.Reset(v8_isolate(), Utils::FixedArrayToLocal(h1));
+    weak2.Reset(v8_isolate(), Utils::FixedArrayToLocal(h2));
+    weak1.SetWeak();
+    weak2.SetWeak();
+    auto obj1 = h1->GetHeapObject();
+    auto obj2 = h2->GetHeapObject();
+    page1 = Page::FromHeapObject(obj1);
+    EXPECT_TRUE(!page1->IsLargePage());
+    EXPECT_TRUE(v8_flags.minor_mc || page1->IsToPage());
+    page2 = Page::FromHeapObject(obj2);
+    EXPECT_TRUE(!page2->IsLargePage());
+    EXPECT_TRUE(v8_flags.minor_mc || page2->IsToPage());
+    EXPECT_NE(page1, page2);
+
+    // Allocate one more object, small enough that it fits in page2.
+    // Keep a strong reference to this object.
+    auto h3 = factory()->NewFixedArray(16, AllocationType::kYoung);
+    strong.Reset(v8_isolate(), Utils::FixedArrayToLocal(h3));
+    auto obj3 = h3->GetHeapObject();
+    EXPECT_EQ(page2, Page::FromHeapObject(obj3));
+    EXPECT_EQ(obj3.address(), obj2.address() + obj2.Size(cage_base));
+
+    // Keep inner pointers to all objects.
+    inner_ptr1 = obj1.address() + 17 * Tagged;
+    inner_ptr2 = obj2.address() + 37 * Tagged;
+    inner_ptr3 = obj3.address() + 7 * Tagged;
+
+    // Keep pointers to the end of the pages, after the objects.
+    outside_ptr1 = page1->area_end() - 3 * Tagged;
+    outside_ptr2 = page2->area_end() - 2 * Tagged;
+    EXPECT_LE(obj1.address() + obj1.Size(cage_base), outside_ptr1);
+    EXPECT_LE(obj2.address() + obj2.Size(cage_base), outside_ptr2);
+    EXPECT_LE(obj3.address() + obj3.Size(cage_base), outside_ptr2);
+
+    // Ensure the young generation space is iterable.
+    heap()->new_space()->MakeLinearAllocationAreaIterable();
+
+    // Inner pointer resolution should work now, finding the objects in the
+    // case of the inner pointers.
+    EXPECT_EQ(
+        obj1.address(),
+        heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr1));
+    EXPECT_EQ(
+        obj2.address(),
+        heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr2));
+    EXPECT_EQ(
+        obj3.address(),
+        heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr3));
+    EXPECT_EQ(
+        kNullAddress,
+        heap()->mark_compact_collector()->FindBasePtrForMarking(outside_ptr1));
+    EXPECT_EQ(
+        kNullAddress,
+        heap()->mark_compact_collector()->FindBasePtrForMarking(outside_ptr2));
+
+    // Start incremental marking and mark the third object.
+    i::IncrementalMarking* marking = heap()->incremental_marking();
+    if (marking->IsStopped()) {
+      SafepointScope scope(heap());
+      heap()->tracer()->StartCycle(
+          GarbageCollector::MARK_COMPACTOR, GarbageCollectionReason::kTesting,
+          "unit test", GCTracer::MarkingType::kIncremental);
+      marking->Start(GarbageCollector::MARK_COMPACTOR,
+                     i::GarbageCollectionReason::kTesting);
+    }
+    MarkingState* marking_state = heap()->marking_state();
+    marking_state->WhiteToGrey(obj3);
+    marking_state->GreyToBlack(obj3);
+  }
+
+  // Garbage collection should reclaim the two large objects with the weak
+  // references, but not the small one with the strong reference.
+  CollectGarbage(NEW_SPACE);
+  EXPECT_TRUE(weak1.IsEmpty());
+  EXPECT_TRUE(weak2.IsEmpty());
+  EXPECT_TRUE(!strong.IsEmpty());
+  // The two pages should still be around, in the new space.
+  EXPECT_EQ(page1, heap()->memory_allocator()->LookupChunkContainingAddress(
+                       inner_ptr1));
+  EXPECT_EQ(page2, heap()->memory_allocator()->LookupChunkContainingAddress(
+                       inner_ptr2));
+  EXPECT_EQ(AllocationSpace::NEW_SPACE, page1->owner_identity());
+  EXPECT_EQ(AllocationSpace::NEW_SPACE, page2->owner_identity());
+  EXPECT_TRUE(v8_flags.minor_mc || page1->IsFromPage());
+  EXPECT_TRUE(v8_flags.minor_mc || page2->IsFromPage());
+
+  // Inner pointer resolution should work with pointers to unused young
+  // generation pages (in case of the scavenger, the two pages are now in the
+  // "from" semispace). There are no objects to be found.
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr1));
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr2));
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr3));
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(outside_ptr1));
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(outside_ptr2));
+
+  // Garbage collection once more.
+  CollectGarbage(NEW_SPACE);
+  EXPECT_EQ(AllocationSpace::NEW_SPACE, page1->owner_identity());
+  EXPECT_EQ(AllocationSpace::NEW_SPACE, page2->owner_identity());
+  // The two pages should still be around, in the new space.
+  EXPECT_EQ(page1, heap()->memory_allocator()->LookupChunkContainingAddress(
+                       inner_ptr1));
+  EXPECT_EQ(page2, heap()->memory_allocator()->LookupChunkContainingAddress(
+                       inner_ptr2));
+  EXPECT_TRUE(v8_flags.minor_mc || page1->IsToPage());
+  EXPECT_TRUE(v8_flags.minor_mc || page2->IsToPage());
+
+  // Inner pointer resolution should work with pointers to unused young
+  // generation pages (in case of the scavenger, the two pages are now in the
+  // "to" semispace). There are no objects to be found.
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr1));
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr2));
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr3));
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(outside_ptr1));
+  EXPECT_EQ(
+      kNullAddress,
+      heap()->mark_compact_collector()->FindBasePtrForMarking(outside_ptr2));
+}
+
+TEST_F(InnerPointerResolutionHeapTest, UnusedLargeYoungPage) {
+  ManualGCScope manual_gc_scope(isolate());
+  v8_flags.page_promotion = false;
+
+  Global<v8::FixedArray> weak;
+  Address inner_ptr;
+  Page* page;
+
+  {
+    PtrComprCageBase cage_base{isolate()};
+    HandleScope scope(isolate());
+
+    // Allocate a large object in the young generation.
+    const int length =
+        std::max(1 << kPageSizeBits,
+                 2 * heap()->MaxRegularHeapObjectSize(AllocationType::kYoung)) /
+        Tagged;
+    auto h = factory()->NewFixedArray(length, AllocationType::kYoung);
+    weak.Reset(v8_isolate(), Utils::FixedArrayToLocal(h));
+    weak.SetWeak();
+    auto obj = h->GetHeapObject();
+    page = Page::FromHeapObject(obj);
+    EXPECT_TRUE(page->IsLargePage());
+    EXPECT_EQ(AllocationSpace::NEW_LO_SPACE, page->owner_identity());
+    EXPECT_TRUE(v8_flags.minor_mc || page->IsToPage());
+
+    // Keep inner pointer.
+    inner_ptr = obj.address() + 17 * Tagged;
+
+    // Inner pointer resolution should work now, finding the object.
+    EXPECT_EQ(
+        obj.address(),
+        heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr));
+  }
+
+  // Garbage collection should reclaim the object.
+  CollectGarbage(NEW_SPACE);
+  EXPECT_TRUE(weak.IsEmpty());
+
+  // Inner pointer resolution should work with a pointer to an unused young
+  // generation large page. There is no object to be found.
+  EXPECT_EQ(kNullAddress,
+            heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr));
+}
+
+TEST_F(InnerPointerResolutionHeapTest, RegularPageAfterEnd) {
+  // Allocate a regular page.
+  OldSpace* old_space = heap()->old_space();
+  DCHECK_NE(nullptr, old_space);
+  auto* page = heap()->memory_allocator()->AllocatePage(
+      MemoryAllocator::AllocationMode::kRegular, old_space, NOT_EXECUTABLE);
+  EXPECT_NE(nullptr, page);
+
+  // The end of the page area is expected not to coincide with the beginning of
+  // the next page.
+  const int size = (1 << kPageSizeBits) / 2;
+  const Address mark = page->area_start() + size;
+  heap()->CreateFillerObjectAt(page->area_start(), size);
+  heap()->CreateFillerObjectAt(mark, static_cast<int>(page->area_end() - mark));
+  Page::UpdateHighWaterMark(mark);
+  page->ShrinkToHighWaterMark();
+  EXPECT_FALSE(Page::IsAlignedToPageSize(page->area_end()));
+
+  // Inner pointer resolution after the end of the page area should work.
+  Address inner_ptr = page->area_end() + Tagged;
+  EXPECT_FALSE(Page::IsAlignedToPageSize(inner_ptr));
+  EXPECT_EQ(kNullAddress,
+            heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr));
+
+  // Deallocate the page.
+  heap()->memory_allocator()->Free(MemoryAllocator::FreeMode::kImmediately,
+                                   page);
+}
+
+TEST_F(InnerPointerResolutionHeapTest, LargePageAfterEnd) {
+  // Allocate a large page.
+  OldLargeObjectSpace* lo_space = heap()->lo_space();
+  EXPECT_NE(nullptr, lo_space);
+  const int size = 3 * (1 << kPageSizeBits) / 2;
+  LargePage* page = heap()->memory_allocator()->AllocateLargePage(
+      lo_space, size, NOT_EXECUTABLE);
+  EXPECT_NE(nullptr, page);
+
+  // The end of the page area is expected not to coincide with the beginning of
+  // the next page.
+  EXPECT_FALSE(Page::IsAlignedToPageSize(page->area_end()));
+
+  // Inner pointer resolution after the end of the pare area should work.
+  Address inner_ptr = page->area_end() + Tagged;
+  EXPECT_FALSE(Page::IsAlignedToPageSize(inner_ptr));
+  EXPECT_EQ(kNullAddress,
+            heap()->mark_compact_collector()->FindBasePtrForMarking(inner_ptr));
+
+  // Deallocate the page.
+  heap()->memory_allocator()->Free(MemoryAllocator::FreeMode::kImmediately,
+                                   page);
+}
 
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/test/unittests/heap/page-promotion-unittest.cc b/deps/v8/test/unittests/heap/page-promotion-unittest.cc
index 36c08091c0c8f7..515a6b98197815 100644
--- a/deps/v8/test/unittests/heap/page-promotion-unittest.cc
+++ b/deps/v8/test/unittests/heap/page-promotion-unittest.cc
@@ -3,8 +3,8 @@
 // found in the LICENSE file.
 
 #include "src/execution/isolate.h"
+#include "src/heap/marking-state-inl.h"
 #include "test/unittests/heap/heap-utils.h"
-#include "v8-isolate.h"
 
 namespace v8 {
 namespace internal {
@@ -65,8 +65,7 @@ TEST_F(PagePromotionTest, PagePromotion_NewToOld) {
     const int threshold_bytes = static_cast<int>(
         v8_flags.page_promotion_threshold *
         MemoryChunkLayout::AllocatableMemoryInDataPage() / 100);
-    CHECK_GE(heap->incremental_marking()->marking_state()->live_bytes(
-                 to_be_promoted_page),
+    CHECK_GE(heap->marking_state()->live_bytes(to_be_promoted_page),
              threshold_bytes);
 
     // Actual checks: The page is in new space first, but is moved to old space
diff --git a/deps/v8/test/unittests/heap/shared-heap-unittest.cc b/deps/v8/test/unittests/heap/shared-heap-unittest.cc
index cae779a3605957..19b5b1eb6f67d5 100644
--- a/deps/v8/test/unittests/heap/shared-heap-unittest.cc
+++ b/deps/v8/test/unittests/heap/shared-heap-unittest.cc
@@ -19,23 +19,33 @@ using SharedHeapTest = TestJSSharedMemoryWithIsolate;
 class SharedHeapNoClientsTest : public TestJSSharedMemoryWithPlatform {
  public:
   SharedHeapNoClientsTest() {
-    bool created;
-    shared_isolate_ = Isolate::GetProcessWideSharedIsolate(&created);
-    CHECK(created);
+    if (v8_flags.shared_space) {
+      shared_space_isolate_wrapper.emplace(kNoCounters);
+      shared_isolate_ = shared_space_isolate_wrapper->i_isolate();
+    } else {
+      bool created;
+      shared_isolate_ = Isolate::GetProcessWideSharedIsolate(&created);
+      CHECK(created);
+    }
   }
 
   ~SharedHeapNoClientsTest() override {
-    Isolate::DeleteProcessWideSharedIsolate();
+    if (!v8_flags.shared_space) {
+      Isolate::DeleteProcessWideSharedIsolate();
+    }
+
+    shared_isolate_ = nullptr;
   }
 
-  v8::Isolate* shared_isolate() {
-    return reinterpret_cast<v8::Isolate*>(i_shared_isolate());
+  v8::Isolate* shared_heap_isolate() {
+    return reinterpret_cast<v8::Isolate*>(i_shared_heap_isolate());
   }
 
-  Isolate* i_shared_isolate() { return shared_isolate_; }
+  Isolate* i_shared_heap_isolate() { return shared_isolate_; }
 
  private:
   Isolate* shared_isolate_;
+  base::Optional<IsolateWrapper> shared_space_isolate_wrapper;
 };
 
 namespace {
@@ -182,10 +192,12 @@ TEST_F(SharedHeapTest, ConcurrentAllocationInSharedMapSpace) {
 }
 
 TEST_F(SharedHeapNoClientsTest, SharedCollectionWithoutClients) {
-  DCHECK_NULL(i_shared_isolate()->heap()->new_space());
-  DCHECK_NULL(i_shared_isolate()->heap()->new_lo_space());
+  if (!v8_flags.shared_space) {
+    DCHECK_NULL(i_shared_heap_isolate()->heap()->new_space());
+    DCHECK_NULL(i_shared_heap_isolate()->heap()->new_lo_space());
+  }
 
-  ::v8::internal::CollectGarbage(OLD_SPACE, shared_isolate());
+  ::v8::internal::CollectGarbage(OLD_SPACE, shared_heap_isolate());
 }
 
 void AllocateInSharedHeap(int iterations = 100) {
diff --git a/deps/v8/test/unittests/heap/slot-set-unittest.cc b/deps/v8/test/unittests/heap/slot-set-unittest.cc
index effd54290f8166..dc1a862059c2cd 100644
--- a/deps/v8/test/unittests/heap/slot-set-unittest.cc
+++ b/deps/v8/test/unittests/heap/slot-set-unittest.cc
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "src/heap/slot-set.h"
+
 #include <limits>
 #include <map>
 
 #include "src/common/globals.h"
-#include "src/heap/slot-set.h"
 #include "src/heap/spaces.h"
 #include "src/objects/slots.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -44,128 +45,6 @@ TEST(SlotSet, BucketsForSize) {
             SlotSet::BucketsForSize(Page::kPageSize * 2));
 }
 
-TEST(SlotSet, InsertAndLookup1) {
-  SlotSet* set = SlotSet::Allocate(SlotSet::kBucketsRegularPage);
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    EXPECT_FALSE(set->Lookup(i));
-  }
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    set->Insert<AccessMode::ATOMIC>(i);
-  }
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    EXPECT_TRUE(set->Lookup(i));
-  }
-  SlotSet::Delete(set, SlotSet::kBucketsRegularPage);
-}
-
-TEST(SlotSet, InsertAndLookup2) {
-  SlotSet* set = SlotSet::Allocate(SlotSet::kBucketsRegularPage);
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    if (i % 7 == 0) {
-      set->Insert<AccessMode::ATOMIC>(i);
-    }
-  }
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    if (i % 7 == 0) {
-      EXPECT_TRUE(set->Lookup(i));
-    } else {
-      EXPECT_FALSE(set->Lookup(i));
-    }
-  }
-  SlotSet::Delete(set, SlotSet::kBucketsRegularPage);
-}
-
-TEST(SlotSet, Iterate) {
-  SlotSet* set = SlotSet::Allocate(SlotSet::kBucketsRegularPage);
-
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    if (i % 7 == 0) {
-      set->Insert<AccessMode::ATOMIC>(i);
-    }
-  }
-
-  set->Iterate(
-      kNullAddress, 0, SlotSet::kBucketsRegularPage,
-      [](MaybeObjectSlot slot) {
-        if (slot.address() % 3 == 0) {
-          return KEEP_SLOT;
-        } else {
-          return REMOVE_SLOT;
-        }
-      },
-      SlotSet::KEEP_EMPTY_BUCKETS);
-
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    if (i % 21 == 0) {
-      EXPECT_TRUE(set->Lookup(i));
-    } else {
-      EXPECT_FALSE(set->Lookup(i));
-    }
-  }
-
-  SlotSet::Delete(set, SlotSet::kBucketsRegularPage);
-}
-
-TEST(SlotSet, IterateFromHalfway) {
-  SlotSet* set = SlotSet::Allocate(SlotSet::kBucketsRegularPage);
-
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    if (i % 7 == 0) {
-      set->Insert<AccessMode::ATOMIC>(i);
-    }
-  }
-
-  set->Iterate(
-      kNullAddress, SlotSet::kBucketsRegularPage / 2,
-      SlotSet::kBucketsRegularPage,
-      [](MaybeObjectSlot slot) {
-        if (slot.address() % 3 == 0) {
-          return KEEP_SLOT;
-        } else {
-          return REMOVE_SLOT;
-        }
-      },
-      SlotSet::KEEP_EMPTY_BUCKETS);
-
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    if (i < Page::kPageSize / 2 && i % 7 == 0) {
-      EXPECT_TRUE(set->Lookup(i));
-    } else if (i >= Page::kPageSize / 2 && i % 21 == 0) {
-      EXPECT_TRUE(set->Lookup(i));
-    } else {
-      EXPECT_FALSE(set->Lookup(i));
-    }
-  }
-
-  SlotSet::Delete(set, SlotSet::kBucketsRegularPage);
-}
-
-TEST(SlotSet, Remove) {
-  SlotSet* set = SlotSet::Allocate(SlotSet::kBucketsRegularPage);
-
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    if (i % 7 == 0) {
-      set->Insert<AccessMode::ATOMIC>(i);
-    }
-  }
-
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    if (i % 3 != 0) {
-      set->Remove(i);
-    }
-  }
-
-  for (int i = 0; i < Page::kPageSize; i += kTaggedSize) {
-    if (i % 21 == 0) {
-      EXPECT_TRUE(set->Lookup(i));
-    } else {
-      EXPECT_FALSE(set->Lookup(i));
-    }
-  }
-
-  SlotSet::Delete(set, SlotSet::kBucketsRegularPage);
-}
-
 TEST(PossiblyEmptyBuckets, ContainsAndInsert) {
   static const int kBuckets = 100;
   PossiblyEmptyBuckets possibly_empty_buckets;
@@ -180,57 +59,6 @@ TEST(PossiblyEmptyBuckets, ContainsAndInsert) {
   EXPECT_TRUE(possibly_empty_buckets.Contains(last + 1));
 }
 
-void CheckRemoveRangeOn(uint32_t start, uint32_t end) {
-  SlotSet* set = SlotSet::Allocate(SlotSet::kBucketsRegularPage);
-  uint32_t first = start == 0 ? 0 : start - kTaggedSize;
-  uint32_t last = end == Page::kPageSize ? end - kTaggedSize : end;
-  for (const auto mode :
-       {SlotSet::FREE_EMPTY_BUCKETS, SlotSet::KEEP_EMPTY_BUCKETS}) {
-    for (uint32_t i = first; i <= last; i += kTaggedSize) {
-      set->Insert<AccessMode::ATOMIC>(i);
-    }
-    set->RemoveRange(start, end, SlotSet::kBucketsRegularPage, mode);
-    if (first != start) {
-      EXPECT_TRUE(set->Lookup(first));
-    }
-    if (last == end) {
-      EXPECT_TRUE(set->Lookup(last));
-    }
-    for (uint32_t i = start; i < end; i += kTaggedSize) {
-      EXPECT_FALSE(set->Lookup(i));
-    }
-  }
-  SlotSet::Delete(set, SlotSet::kBucketsRegularPage);
-}
-
-TEST(SlotSet, RemoveRange) {
-  CheckRemoveRangeOn(0, Page::kPageSize);
-  CheckRemoveRangeOn(1 * kTaggedSize, 1023 * kTaggedSize);
-  for (uint32_t start = 0; start <= 32; start++) {
-    CheckRemoveRangeOn(start * kTaggedSize, (start + 1) * kTaggedSize);
-    CheckRemoveRangeOn(start * kTaggedSize, (start + 2) * kTaggedSize);
-    const uint32_t kEnds[] = {32, 64, 100, 128, 1024, 1500, 2048};
-    for (size_t i = 0; i < sizeof(kEnds) / sizeof(uint32_t); i++) {
-      for (int k = -3; k <= 3; k++) {
-        uint32_t end = (kEnds[i] + k);
-        if (start < end) {
-          CheckRemoveRangeOn(start * kTaggedSize, end * kTaggedSize);
-        }
-      }
-    }
-  }
-  SlotSet* set = SlotSet::Allocate(SlotSet::kBucketsRegularPage);
-  for (const auto mode :
-       {SlotSet::FREE_EMPTY_BUCKETS, SlotSet::KEEP_EMPTY_BUCKETS}) {
-    set->Insert<AccessMode::ATOMIC>(Page::kPageSize / 2);
-    set->RemoveRange(0, Page::kPageSize, SlotSet::kBucketsRegularPage, mode);
-    for (uint32_t i = 0; i < Page::kPageSize; i += kTaggedSize) {
-      EXPECT_FALSE(set->Lookup(i));
-    }
-  }
-  SlotSet::Delete(set, SlotSet::kBucketsRegularPage);
-}
-
 TEST(TypedSlotSet, Iterate) {
   TypedSlotSet set(0);
   // These two constants must be static as a workaround
diff --git a/deps/v8/test/unittests/heap/unmapper-unittest.cc b/deps/v8/test/unittests/heap/unmapper-unittest.cc
index 894699f68ae4db..90a32db51dfeed 100644
--- a/deps/v8/test/unittests/heap/unmapper-unittest.cc
+++ b/deps/v8/test/unittests/heap/unmapper-unittest.cc
@@ -312,8 +312,10 @@ class SequentialUnmapperTest : public                                     //
     CHECK(tracking_page_allocator_->IsEmpty());
     CHECK_EQ(old_page_allocator_,
              SetPlatformPageAllocatorForTesting(tracking_page_allocator_));
-    old_flag_ = i::v8_flags.concurrent_sweeping;
+    old_sweeping_flag_ = i::v8_flags.concurrent_sweeping;
     i::v8_flags.concurrent_sweeping = false;
+    old_minor_sweeping_flag_ = i::v8_flags.concurrent_minor_mc_sweeping;
+    i::v8_flags.concurrent_minor_mc_sweeping = false;
 #ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE
     // Reinitialize the process-wide pointer cage so it can pick up the
     // TrackingPageAllocator.
@@ -339,7 +341,8 @@ class SequentialUnmapperTest : public                                     //
 #ifdef V8_ENABLE_SANDBOX
     GetProcessWideSandbox()->TearDown();
 #endif
-    i::v8_flags.concurrent_sweeping = old_flag_;
+    i::v8_flags.concurrent_sweeping = old_sweeping_flag_;
+    i::v8_flags.concurrent_minor_mc_sweeping = old_minor_sweeping_flag_;
     CHECK(tracking_page_allocator_->IsEmpty());
 
     // Restore the original v8::PageAllocator and delete the tracking one.
@@ -360,13 +363,15 @@ class SequentialUnmapperTest : public                                     //
  private:
   static TrackingPageAllocator* tracking_page_allocator_;
   static v8::PageAllocator* old_page_allocator_;
-  static bool old_flag_;
+  static bool old_sweeping_flag_;
+  static bool old_minor_sweeping_flag_;
 };
 
 TrackingPageAllocator* SequentialUnmapperTest::tracking_page_allocator_ =
     nullptr;
 v8::PageAllocator* SequentialUnmapperTest::old_page_allocator_ = nullptr;
-bool SequentialUnmapperTest::old_flag_;
+bool SequentialUnmapperTest::old_sweeping_flag_;
+bool SequentialUnmapperTest::old_minor_sweeping_flag_;
 
 template <typename TMixin>
 SequentialUnmapperTestMixin<TMixin>::SequentialUnmapperTestMixin() {
diff --git a/deps/v8/test/unittests/inspector/inspector-unittest.cc b/deps/v8/test/unittests/inspector/inspector-unittest.cc
index 442c32a118f955..0ca795ecc7c937 100644
--- a/deps/v8/test/unittests/inspector/inspector-unittest.cc
+++ b/deps/v8/test/unittests/inspector/inspector-unittest.cc
@@ -259,7 +259,7 @@ TEST_F(InspectorTest, NoConsoleAPIForUntrustedClient) {
 }
 
 TEST_F(InspectorTest, ApiCreatedTasksAreCleanedUp) {
-  i::FLAG_experimental_async_stack_tagging_api = true;
+  i::v8_flags.experimental_async_stack_tagging_api = true;
   v8::Isolate* isolate = v8_isolate();
   v8::HandleScope handle_scope(isolate);
 
diff --git a/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc b/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
index 07259a782a20ac..2a0770a90c83ad 100644
--- a/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
+++ b/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
@@ -484,12 +484,9 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
   // Insert entry for illegal bytecode as this is never willingly emitted.
   scorecard[Bytecodes::ToByte(Bytecode::kIllegal)] = 1;
 
-  // Bytecode for CollectTypeProfile is only emitted when
-  // Type Information for DevTools is turned on.
-  scorecard[Bytecodes::ToByte(Bytecode::kCollectTypeProfile)] = 1;
-
   // This bytecode is too inconvenient to test manually.
-  scorecard[Bytecodes::ToByte(Bytecode::kFindNonDefaultConstructor)] = 1;
+  scorecard[Bytecodes::ToByte(
+      Bytecode::kFindNonDefaultConstructorOrConstruct)] = 1;
 
   // Check return occurs at the end and only once in the BytecodeArray.
   CHECK_EQ(final_bytecode, Bytecode::kReturn);
diff --git a/deps/v8/test/unittests/interpreter/bytecode-array-writer-unittest.cc b/deps/v8/test/unittests/interpreter/bytecode-array-writer-unittest.cc
index 441718040a0113..873e27bb56a0bc 100644
--- a/deps/v8/test/unittests/interpreter/bytecode-array-writer-unittest.cc
+++ b/deps/v8/test/unittests/interpreter/bytecode-array-writer-unittest.cc
@@ -246,7 +246,7 @@ TEST_F(BytecodeArrayWriterUnittest, ComplexExample) {
 }
 
 TEST_F(BytecodeArrayWriterUnittest, ElideNoneffectfulBytecodes) {
-  if (!i::FLAG_ignition_elide_noneffectful_bytecodes) return;
+  if (!i::v8_flags.ignition_elide_noneffectful_bytecodes) return;
 
   static const uint8_t expected_bytes[] = {
       // clang-format off
diff --git a/deps/v8/test/unittests/interpreter/bytecode-expectations-printer.cc b/deps/v8/test/unittests/interpreter/bytecode-expectations-printer.cc
index 013e8ff1439e22..bec63500b30c1b 100644
--- a/deps/v8/test/unittests/interpreter/bytecode-expectations-printer.cc
+++ b/deps/v8/test/unittests/interpreter/bytecode-expectations-printer.cc
@@ -393,7 +393,7 @@ void BytecodeExpectationsPrinter::PrintExpectation(
       wrap_ ? WrapCodeInFunction(test_function_name_.c_str(), snippet)
             : snippet;
 
-  i::FLAG_compilation_cache = false;
+  i::v8_flags.compilation_cache = false;
   i::Handle<i::BytecodeArray> bytecode_array;
   if (module_) {
     CHECK(top_level_ && !wrap_);
diff --git a/deps/v8/test/unittests/interpreter/bytecode-generator-unittest.cc b/deps/v8/test/unittests/interpreter/bytecode-generator-unittest.cc
index a0cf4552b625b5..eb855dd4d67a55 100644
--- a/deps/v8/test/unittests/interpreter/bytecode-generator-unittest.cc
+++ b/deps/v8/test/unittests/interpreter/bytecode-generator-unittest.cc
@@ -23,9 +23,9 @@ class BytecodeGeneratorTest : public TestWithContext {
  public:
   BytecodeGeneratorTest() : printer_(isolate()) {}
   static void SetUpTestSuite() {
-    i::FLAG_always_turbofan = false;
-    i::FLAG_allow_natives_syntax = true;
-    i::FLAG_enable_lazy_source_positions = false;
+    i::v8_flags.always_turbofan = false;
+    i::v8_flags.allow_natives_syntax = true;
+    i::v8_flags.enable_lazy_source_positions = false;
     TestWithContext::SetUpTestSuite();
   }
 
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/ArrayLiterals.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/ArrayLiterals.golden
index 28eb0aaa8ba313..c93d81af3084e4 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/ArrayLiterals.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/ArrayLiterals.golden
@@ -145,7 +145,7 @@ bytecodes: [
   /*   52 S> */ B(CreateArrayLiteral), U8(1), U8(1), U8(37),
                 B(Star1),
                 B(LdaSmi), I8(1),
-  /*   67 S> */ B(Star2),
+                B(Star2),
   /*   67 E> */ B(GetIterator), R(0), U8(2), U8(4),
                 B(Star4),
                 B(GetNamedProperty), R(4), U8(2), U8(6),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/AssignmentsInBinaryExpression.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/AssignmentsInBinaryExpression.golden
index 6f2b1bf616d4a0..77edb47b8b41c8 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/AssignmentsInBinaryExpression.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/AssignmentsInBinaryExpression.golden
@@ -20,11 +20,11 @@ bytecodes: [
                 B(Star1),
   /*   52 S> */ B(LdaSmi), I8(2),
                 B(Star0),
-                B(LdaSmi), I8(3),
+  /*   69 S> */ B(LdaSmi), I8(3),
                 B(Star1),
-                B(LdaSmi), I8(4),
+  /*   76 S> */ B(LdaSmi), I8(4),
                 B(Star0),
-                B(LdaSmi), I8(5),
+  /*   83 S> */ B(LdaSmi), I8(5),
                 B(Star1),
   /*   88 S> */ B(Return),
 ]
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/AsyncGenerators.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/AsyncGenerators.golden
index 841a2a45262a6b..de4576618d9c51 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/AsyncGenerators.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/AsyncGenerators.golden
@@ -128,7 +128,7 @@ bytecodes: [
                 B(LdaFalse),
                 B(Star7),
                 B(Mov), R(0), R(5),
-                B(InvokeIntrinsic), U8(Runtime::k_AsyncGeneratorYield), R(5), U8(3),
+                B(InvokeIntrinsic), U8(Runtime::k_AsyncGeneratorYieldWithAwait), R(5), U8(3),
   /*   22 E> */ B(SuspendGenerator), R(0), R(0), U8(5), U8(1),
                 B(ResumeGenerator), R(0), R(0), U8(5),
                 B(Star5),
@@ -258,7 +258,7 @@ bytecodes: [
                 B(Star), R(16),
                 B(Mov), R(0), R(14),
                 B(Mov), R(3), R(15),
-                B(InvokeIntrinsic), U8(Runtime::k_AsyncGeneratorYield), R(14), U8(3),
+                B(InvokeIntrinsic), U8(Runtime::k_AsyncGeneratorYieldWithAwait), R(14), U8(3),
   /*   42 E> */ B(SuspendGenerator), R(0), R(0), U8(14), U8(1),
                 B(ResumeGenerator), R(0), R(0), U8(14),
                 B(Star14),
@@ -511,7 +511,7 @@ bytecodes: [
                 B(LdaFalse),
                 B(Star), R(16),
                 B(Mov), R(0), R(14),
-                B(InvokeIntrinsic), U8(Runtime::k_AsyncGeneratorYield), R(14), U8(3),
+                B(InvokeIntrinsic), U8(Runtime::k_AsyncGeneratorResolve), R(14), U8(3),
   /*   49 E> */ B(SuspendGenerator), R(0), R(0), U8(14), U8(4),
                 B(ResumeGenerator), R(0), R(0), U8(14),
                 B(Star8),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/CallAndSpread.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/CallAndSpread.golden
index 16ca804e77ed57..cfcf6aa5f30e3d 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/CallAndSpread.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/CallAndSpread.golden
@@ -75,7 +75,7 @@ bytecodes: [
                 B(Star2),
                 B(LdaSmi), I8(1),
                 B(Star3),
-  /*   49 S> */ B(CreateArrayLiteral), U8(3), U8(5), U8(37),
+  /*   49 E> */ B(CreateArrayLiteral), U8(3), U8(5), U8(37),
                 B(Star6),
   /*   49 E> */ B(GetIterator), R(6), U8(6), U8(8),
                 B(Star5),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/DestructuringAssignment.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/DestructuringAssignment.golden
index 8bc522dc46e3b4..bf6c4115021626 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/DestructuringAssignment.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/DestructuringAssignment.golden
@@ -24,8 +24,8 @@ bytecodes: [
                 B(Mov), R(1), R(2),
                 B(Star5),
                 B(Mov), R(context), R(8),
-  /*   57 S> */ B(Ldar), R(5),
-                B(JumpIfToBooleanTrue), U8(33),
+                B(Ldar), R(5),
+  /*   57 E> */ B(JumpIfToBooleanTrue), U8(33),
                 B(LdaTrue),
                 B(Star5),
                 B(CallProperty0), R(3), R(4), U8(11),
@@ -122,8 +122,8 @@ bytecodes: [
                 B(JumpIfToBooleanTrue), U8(4),
                 B(LdaFalse),
                 B(Star6),
-  /*   61 S> */ B(Ldar), R(6),
-                B(JumpIfToBooleanTrue), U8(33),
+                B(Ldar), R(6),
+  /*   61 E> */ B(JumpIfToBooleanTrue), U8(33),
                 B(LdaTrue),
                 B(Star6),
                 B(CallProperty0), R(4), R(5), U8(13),
@@ -140,7 +140,7 @@ bytecodes: [
                 B(Jump), U8(3),
                 B(LdaUndefined),
                 B(Star0),
-  /*   63 S> */ B(CreateEmptyArrayLiteral), U8(15),
+  /*   63 E> */ B(CreateEmptyArrayLiteral), U8(15),
                 B(Star11),
                 B(Ldar), R(6),
                 B(JumpIfToBooleanTrue), U8(41),
@@ -231,9 +231,9 @@ bytecodes: [
                 B(Mov), R(2), R(3),
                 B(Star6),
                 B(Mov), R(context), R(9),
-  /*   59 S> */ B(Ldar), R(6),
+                B(Ldar), R(6),
                 B(Mov), R(0), R(11),
-                B(JumpIfToBooleanTrue), U8(33),
+  /*   57 E> */ B(JumpIfToBooleanTrue), U8(33),
                 B(LdaTrue),
                 B(Star6),
                 B(CallProperty0), R(4), R(5), U8(11),
@@ -250,8 +250,8 @@ bytecodes: [
                 B(Jump), U8(3),
                 B(LdaUndefined),
                 B(SetNamedProperty), R(11), U8(4), U8(13),
-  /*   63 S> */ B(Ldar), R(6),
-                B(JumpIfToBooleanTrue), U8(33),
+                B(Ldar), R(6),
+  /*   63 E> */ B(JumpIfToBooleanTrue), U8(33),
                 B(LdaTrue),
                 B(Star6),
                 B(CallProperty0), R(4), R(5), U8(15),
@@ -354,7 +354,7 @@ bytecodes: [
                 B(Star0),
   /*   48 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(41),
                 B(Star1),
-  /*   61 S> */ B(GetNamedProperty), R(1), U8(1), U8(1),
+  /*   59 S> */ B(GetNamedProperty), R(1), U8(1), U8(1),
                 B(SetNamedProperty), R(0), U8(2), U8(3),
                 B(LdaUndefined),
   /*   72 S> */ B(Return),
@@ -378,14 +378,14 @@ bytecode array length: 28
 bytecodes: [
   /*   45 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(41),
                 B(Star1),
-  /*   64 S> */ B(LdaConstant), U8(1),
+  /*   62 S> */ B(LdaConstant), U8(1),
                 B(Star3),
-                B(GetNamedProperty), R(1), U8(1), U8(1),
+  /*   64 E> */ B(GetNamedProperty), R(1), U8(1), U8(1),
                 B(Mov), R(1), R(2),
                 B(JumpIfNotUndefined), U8(3),
                 B(LdaZero),
                 B(Star0),
-  /*   71 S> */ B(InvokeIntrinsic), U8(Runtime::k_CopyDataPropertiesWithExcludedPropertiesOnStack), R(2), U8(2),
+  /*   71 E> */ B(InvokeIntrinsic), U8(Runtime::k_CopyDataPropertiesWithExcludedPropertiesOnStack), R(2), U8(2),
                 B(StaGlobal), U8(2), U8(3),
                 B(LdaUndefined),
   /*   80 S> */ B(Return),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/ForOfLoop.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/ForOfLoop.golden
index d09401f25db731..0f801aa51681fe 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/ForOfLoop.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/ForOfLoop.golden
@@ -339,7 +339,7 @@ bytecodes: [
                 B(Mov), R(12), R(0),
   /*   31 S> */ B(GetNamedProperty), R(12), U8(3), U8(12),
                 B(Star3),
-  /*   34 S> */ B(GetNamedProperty), R(12), U8(4), U8(14),
+  /*   34 E> */ B(GetNamedProperty), R(12), U8(4), U8(14),
                 B(Star4),
   /*   56 S> */ B(Ldar), R(4),
   /*   58 E> */ B(Add), R(3), U8(16),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/LogicalExpressions.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/LogicalExpressions.golden
index 13bed9d061b0cb..d53ffdcfd10390 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/LogicalExpressions.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/LogicalExpressions.golden
@@ -96,7 +96,7 @@ bytecodes: [
   /*   42 S> */ B(LdaZero),
                 B(Star0),
   /*   45 S> */ B(JumpIfToBooleanTrue), U8(4),
-                B(LdaSmi), I8(3),
+  /*   64 S> */ B(LdaSmi), I8(3),
   /*   67 S> */ B(Return),
 ]
 constant pool: [
@@ -120,9 +120,9 @@ bytecodes: [
                 B(Star2),
   /*   59 S> */ B(Ldar), R(0),
                 B(JumpIfToBooleanTrue), U8(7),
-                B(LdaSmi), I8(5),
+  /*   86 S> */ B(LdaSmi), I8(5),
                 B(Star2),
-                B(LdaSmi), I8(3),
+  /*   91 S> */ B(LdaSmi), I8(3),
   /*   94 S> */ B(Return),
 ]
 constant pool: [
@@ -180,133 +180,133 @@ bytecodes: [
                 B(JumpIfToBooleanTrue), U8(196),
                 B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*   88 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*   98 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  105 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  115 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  122 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  132 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  139 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  149 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  156 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  166 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  173 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  183 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  190 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  200 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  207 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  217 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  224 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  234 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  241 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  251 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  258 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  268 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  275 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  285 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  292 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  302 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  309 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  319 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  326 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  336 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  343 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  353 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  360 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  370 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  377 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  387 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  394 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  404 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  411 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  421 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  428 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  438 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  445 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  455 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  462 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  472 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  479 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  489 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  496 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  506 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  513 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  523 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  530 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  540 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  547 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  557 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  564 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  574 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  581 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  591 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  598 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  608 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  615 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(3),
+  /*  620 S> */ B(LdaSmi), I8(3),
   /*  623 S> */ B(Return),
 ]
 constant pool: [
@@ -364,133 +364,133 @@ bytecodes: [
                 B(JumpIfToBooleanFalse), U8(196),
                 B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*   88 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*   98 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  105 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  115 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  122 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  132 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  139 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  149 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  156 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  166 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  173 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  183 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  190 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  200 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  207 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  217 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  224 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  234 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  241 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  251 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  258 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  268 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  275 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  285 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  292 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  302 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  309 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  319 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  326 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  336 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  343 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  353 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  360 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  370 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  377 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  387 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  394 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  404 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  411 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  421 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  428 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  438 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  445 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  455 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  462 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  472 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  479 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  489 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  496 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  506 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  513 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  523 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  530 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  540 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  547 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  557 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  564 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  574 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  581 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  591 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  598 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  608 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  615 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(3),
+  /*  620 S> */ B(LdaSmi), I8(3),
   /*  623 S> */ B(Return),
 ]
 constant pool: [
@@ -549,133 +549,133 @@ bytecodes: [
                 B(JumpIfTrue), U8(196),
                 B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*   94 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  104 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  111 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  121 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  128 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  138 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  145 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  155 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  162 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  172 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  179 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  189 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  196 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  206 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  213 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  223 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  230 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  240 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  247 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  257 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  264 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  274 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  281 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  291 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  298 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  308 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  315 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  325 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  332 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  342 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  349 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  359 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  366 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  376 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  383 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  393 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  400 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  410 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  417 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  427 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  434 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  444 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  451 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  461 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  468 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  478 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  485 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  495 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  502 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  512 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  519 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  529 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  536 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  546 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  553 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  563 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  570 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  580 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  587 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  597 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  604 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  614 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  621 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(3),
+  /*  626 S> */ B(LdaSmi), I8(3),
   /*  629 S> */ B(Return),
 ]
 constant pool: [
@@ -734,133 +734,133 @@ bytecodes: [
                 B(JumpIfFalse), U8(196),
                 B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*   94 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  104 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  111 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  121 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  128 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  138 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  145 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  155 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  162 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  172 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  179 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  189 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  196 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  206 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  213 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  223 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  230 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  240 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  247 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  257 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  264 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  274 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  281 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  291 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  298 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  308 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  315 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  325 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  332 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  342 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  349 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  359 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  366 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  376 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  383 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  393 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  400 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  410 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  417 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  427 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  434 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  444 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  451 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  461 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  468 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  478 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  485 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  495 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  502 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  512 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  519 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  529 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  536 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  546 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  553 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  563 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  570 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  580 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  587 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  597 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  604 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(1),
+  /*  614 S> */ B(LdaSmi), I8(1),
                 B(Star1),
-                B(LdaSmi), I8(2),
+  /*  621 S> */ B(LdaSmi), I8(2),
                 B(Star2),
-                B(LdaSmi), I8(3),
+  /*  626 S> */ B(LdaSmi), I8(3),
   /*  629 S> */ B(Return),
 ]
 constant pool: [
@@ -914,7 +914,7 @@ bytecodes: [
                 B(LdaSmi), I8(3),
                 B(JumpIfToBooleanTrue), U8(3),
                 B(LdaZero),
-                B(LdaSmi), I8(1),
+  /*   65 S> */ B(LdaSmi), I8(1),
   /*   67 S> */ B(Return),
 ]
 constant pool: [
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/NewAndSpread.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/NewAndSpread.golden
index 07182e59a78909..46a4f12b03cc4b 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/NewAndSpread.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/NewAndSpread.golden
@@ -106,7 +106,7 @@ bytecodes: [
                 B(Star2),
                 B(LdaSmi), I8(1),
                 B(Star3),
-  /*  101 S> */ B(CreateArrayLiteral), U8(4), U8(1), U8(37),
+  /*  101 E> */ B(CreateArrayLiteral), U8(4), U8(1), U8(37),
                 B(Star6),
   /*  101 E> */ B(GetIterator), R(6), U8(2), U8(4),
                 B(Star5),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/PrimitiveExpressions.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/PrimitiveExpressions.golden
index e2d02ee52701b9..b8490f7295304e 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/PrimitiveExpressions.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/PrimitiveExpressions.golden
@@ -449,7 +449,7 @@ bytecode array length: 5
 bytecodes: [
   /*   42 S> */ B(LdaZero),
                 B(Star0),
-  /*   45 S> */ B(LdaSmi), I8(3),
+  /*   56 S> */ B(LdaSmi), I8(3),
   /*   59 S> */ B(Return),
 ]
 constant pool: [
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/PrivateAccessorAccess.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/PrivateAccessorAccess.golden
index 040e0cd41dd7d1..e2fafcdcee3986 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/PrivateAccessorAccess.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/PrivateAccessorAccess.golden
@@ -83,7 +83,7 @@ bytecodes: [
   /*   48 E> */ B(DefineKeyedOwnProperty), R(this), R(0), U8(0),
   /*   53 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
   /*   58 E> */ B(GetKeyedProperty), R(this), U8(2),
-                B(Wide), B(LdaSmi), I16(304),
+                B(Wide), B(LdaSmi), I16(305),
                 B(Star2),
                 B(LdaConstant), U8(0),
                 B(Star3),
@@ -115,7 +115,7 @@ bytecodes: [
   /*   41 E> */ B(DefineKeyedOwnProperty), R(this), R(0), U8(0),
   /*   46 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
   /*   51 E> */ B(GetKeyedProperty), R(this), U8(2),
-                B(Wide), B(LdaSmi), I16(303),
+                B(Wide), B(LdaSmi), I16(304),
                 B(Star2),
                 B(LdaConstant), U8(0),
                 B(Star3),
@@ -149,7 +149,7 @@ bytecodes: [
                 B(Star2),
                 B(LdaImmutableCurrentContextSlot), U8(3),
   /*   58 E> */ B(GetKeyedProperty), R(this), U8(2),
-                B(Wide), B(LdaSmi), I16(304),
+                B(Wide), B(LdaSmi), I16(305),
                 B(Star3),
                 B(LdaConstant), U8(0),
                 B(Star4),
@@ -181,7 +181,7 @@ bytecodes: [
   /*   41 E> */ B(DefineKeyedOwnProperty), R(this), R(0), U8(0),
   /*   46 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
   /*   51 E> */ B(GetKeyedProperty), R(this), U8(2),
-                B(Wide), B(LdaSmi), I16(303),
+                B(Wide), B(LdaSmi), I16(304),
                 B(Star2),
                 B(LdaConstant), U8(0),
                 B(Star3),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/PrivateMethodAccess.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/PrivateMethodAccess.golden
index a386bdccbf7d0e..40e7d2bd4f30d4 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/PrivateMethodAccess.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/PrivateMethodAccess.golden
@@ -58,7 +58,7 @@ bytecodes: [
                 B(Star2),
                 B(LdaImmutableCurrentContextSlot), U8(3),
   /*   54 E> */ B(GetKeyedProperty), R(this), U8(2),
-                B(Wide), B(LdaSmi), I16(302),
+                B(Wide), B(LdaSmi), I16(303),
                 B(Star3),
                 B(LdaConstant), U8(0),
                 B(Star4),
@@ -91,7 +91,7 @@ bytecodes: [
   /*   44 E> */ B(DefineKeyedOwnProperty), R(this), R(0), U8(0),
   /*   49 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
   /*   54 E> */ B(GetKeyedProperty), R(this), U8(2),
-                B(Wide), B(LdaSmi), I16(302),
+                B(Wide), B(LdaSmi), I16(303),
                 B(Star2),
                 B(LdaConstant), U8(0),
                 B(Star3),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/StandardForLoop.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/StandardForLoop.golden
index e89a2db8df6b30..dbfdbf9f31ba6a 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/StandardForLoop.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/StandardForLoop.golden
@@ -216,9 +216,9 @@ bytecode array length: 38
 bytecodes: [
   /*   37 S> */ B(CreateObjectLiteral), U8(0), U8(0), U8(41),
                 B(Star3),
-  /*   28 S> */ B(GetNamedProperty), R(3), U8(1), U8(1),
+  /*   28 E> */ B(GetNamedProperty), R(3), U8(1), U8(1),
                 B(Star0),
-  /*   31 S> */ B(GetNamedProperty), R(3), U8(2), U8(3),
+  /*   31 E> */ B(GetNamedProperty), R(3), U8(2), U8(3),
                 B(Star1),
   /*   55 S> */ B(LdaZero),
   /*   55 E> */ B(TestGreaterThan), R(1), U8(5),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/StaticPrivateMethodAccess.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/StaticPrivateMethodAccess.golden
index 653b11e6d90b5e..57dfc42dc55127 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/StaticPrivateMethodAccess.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/StaticPrivateMethodAccess.golden
@@ -24,7 +24,7 @@ bytecodes: [
                 B(TestReferenceEqual), R(this),
                 B(Mov), R(this), R(1),
                 B(JumpIfTrue), U8(16),
-                B(Wide), B(LdaSmi), I16(296),
+                B(Wide), B(LdaSmi), I16(297),
                 B(Star2),
                 B(LdaConstant), U8(0),
                 B(Star3),
@@ -61,13 +61,13 @@ bytecodes: [
                 B(TestReferenceEqual), R(this),
                 B(Mov), R(this), R(0),
                 B(JumpIfTrue), U8(16),
-                B(Wide), B(LdaSmi), I16(296),
+                B(Wide), B(LdaSmi), I16(297),
                 B(Star2),
                 B(LdaConstant), U8(0),
                 B(Star3),
   /*   61 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(2), U8(2),
                 B(Throw),
-                B(Wide), B(LdaSmi), I16(302),
+                B(Wide), B(LdaSmi), I16(303),
                 B(Star2),
                 B(LdaConstant), U8(1),
                 B(Star3),
@@ -99,13 +99,13 @@ bytecodes: [
                 B(TestReferenceEqual), R(this),
                 B(Mov), R(this), R(0),
                 B(JumpIfTrue), U8(16),
-                B(Wide), B(LdaSmi), I16(296),
+                B(Wide), B(LdaSmi), I16(297),
                 B(Star1),
                 B(LdaConstant), U8(0),
                 B(Star2),
   /*   61 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(1), U8(2),
                 B(Throw),
-                B(Wide), B(LdaSmi), I16(302),
+                B(Wide), B(LdaSmi), I16(303),
                 B(Star1),
                 B(LdaConstant), U8(1),
                 B(Star2),
@@ -145,7 +145,7 @@ bytecodes: [
                 B(TestReferenceEqual), R(this),
                 B(Mov), R(this), R(0),
                 B(JumpIfTrue), U8(16),
-                B(Wide), B(LdaSmi), I16(296),
+                B(Wide), B(LdaSmi), I16(297),
                 B(Star2),
                 B(LdaConstant), U8(0),
                 B(Star3),
@@ -167,7 +167,7 @@ bytecodes: [
                 B(TestReferenceEqual), R(this),
                 B(Mov), R(this), R(0),
                 B(JumpIfTrue), U8(16),
-                B(Wide), B(LdaSmi), I16(296),
+                B(Wide), B(LdaSmi), I16(297),
                 B(Star3),
                 B(LdaConstant), U8(0),
                 B(Star4),
@@ -182,7 +182,7 @@ bytecodes: [
                 B(TestReferenceEqual), R(this),
                 B(Mov), R(this), R(0),
                 B(JumpIfTrue), U8(16),
-                B(Wide), B(LdaSmi), I16(296),
+                B(Wide), B(LdaSmi), I16(297),
                 B(Star2),
                 B(LdaConstant), U8(0),
                 B(Star3),
@@ -216,13 +216,13 @@ bytecodes: [
                 B(TestReferenceEqual), R(this),
                 B(Mov), R(this), R(0),
                 B(JumpIfTrue), U8(16),
-                B(Wide), B(LdaSmi), I16(296),
+                B(Wide), B(LdaSmi), I16(297),
                 B(Star1),
                 B(LdaConstant), U8(0),
                 B(Star2),
   /*   65 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(1), U8(2),
                 B(Throw),
-                B(Wide), B(LdaSmi), I16(304),
+                B(Wide), B(LdaSmi), I16(305),
                 B(Star1),
                 B(LdaConstant), U8(1),
                 B(Star2),
@@ -253,13 +253,13 @@ bytecodes: [
                 B(TestReferenceEqual), R(this),
                 B(Mov), R(this), R(0),
                 B(JumpIfTrue), U8(16),
-                B(Wide), B(LdaSmi), I16(296),
+                B(Wide), B(LdaSmi), I16(297),
                 B(Star1),
                 B(LdaConstant), U8(0),
                 B(Star2),
   /*   58 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(1), U8(2),
                 B(Throw),
-                B(Wide), B(LdaSmi), I16(303),
+                B(Wide), B(LdaSmi), I16(304),
                 B(Star1),
                 B(LdaConstant), U8(1),
                 B(Star2),
@@ -292,13 +292,13 @@ bytecodes: [
                 B(TestReferenceEqual), R(this),
                 B(Mov), R(this), R(0),
                 B(JumpIfTrue), U8(16),
-                B(Wide), B(LdaSmi), I16(296),
+                B(Wide), B(LdaSmi), I16(297),
                 B(Star2),
                 B(LdaConstant), U8(0),
                 B(Star3),
   /*   65 E> */ B(CallRuntime), U16(Runtime::kNewTypeError), R(2), U8(2),
                 B(Throw),
-                B(Wide), B(LdaSmi), I16(304),
+                B(Wide), B(LdaSmi), I16(305),
                 B(Star2),
                 B(LdaConstant), U8(1),
                 B(Star3),
@@ -327,7 +327,7 @@ bytecode array length: 19
 bytecodes: [
   /*   46 S> */ B(LdaImmutableCurrentContextSlot), U8(3),
   /*   51 E> */ B(GetKeyedProperty), R(this), U8(0),
-                B(Wide), B(LdaSmi), I16(303),
+                B(Wide), B(LdaSmi), I16(304),
                 B(Star1),
                 B(LdaConstant), U8(0),
                 B(Star2),
diff --git a/deps/v8/test/unittests/interpreter/bytecode_expectations/SuperCallAndSpread.golden b/deps/v8/test/unittests/interpreter/bytecode_expectations/SuperCallAndSpread.golden
index 568f7770249744..3ed6406af66c7a 100644
--- a/deps/v8/test/unittests/interpreter/bytecode_expectations/SuperCallAndSpread.golden
+++ b/deps/v8/test/unittests/interpreter/bytecode_expectations/SuperCallAndSpread.golden
@@ -102,7 +102,7 @@ bytecodes: [
   /*  140 S> */ B(CreateArrayLiteral), U8(0), U8(0), U8(37),
                 B(Star6),
                 B(LdaSmi), I8(1),
-  /*  152 S> */ B(Star7),
+                B(Star7),
   /*  152 E> */ B(GetIterator), R(3), U8(1), U8(3),
                 B(Star9),
                 B(GetNamedProperty), R(9), U8(1), U8(5),
diff --git a/deps/v8/test/unittests/interpreter/generate-bytecode-expectations.cc b/deps/v8/test/unittests/interpreter/generate-bytecode-expectations.cc
index 9a3749264fcc2e..ed0f0e1c6dce30 100644
--- a/deps/v8/test/unittests/interpreter/generate-bytecode-expectations.cc
+++ b/deps/v8/test/unittests/interpreter/generate-bytecode-expectations.cc
@@ -336,13 +336,13 @@ void ProgramOptions::PrintHeader(std::ostream* stream) const {
 
 V8InitializationScope::V8InitializationScope(const char* exec_path)
     : platform_(v8::platform::NewDefaultPlatform()) {
-  i::FLAG_always_turbofan = false;
-  i::FLAG_allow_natives_syntax = true;
-  i::FLAG_enable_lazy_source_positions = false;
+  i::v8_flags.always_turbofan = false;
+  i::v8_flags.allow_natives_syntax = true;
+  i::v8_flags.enable_lazy_source_positions = false;
 
   // The bytecode expectations printer changes flags; this is not security
   // relevant, allow this.
-  i::FLAG_freeze_flags_after_init = false;
+  i::v8_flags.freeze_flags_after_init = false;
 
   v8::V8::InitializeICUDefaultLocation(exec_path);
   v8::V8::InitializeExternalStartupData(exec_path);
diff --git a/deps/v8/test/unittests/interpreter/interpreter-tester.cc b/deps/v8/test/unittests/interpreter/interpreter-tester.cc
index 559b4b9f3b1013..7c22729aaa705e 100644
--- a/deps/v8/test/unittests/interpreter/interpreter-tester.cc
+++ b/deps/v8/test/unittests/interpreter/interpreter-tester.cc
@@ -25,7 +25,7 @@ InterpreterTester::InterpreterTester(
       source_(source),
       bytecode_(bytecode),
       feedback_metadata_(feedback_metadata) {
-  i::FLAG_always_turbofan = false;
+  i::v8_flags.always_turbofan = false;
 }
 
 InterpreterTester::InterpreterTester(
diff --git a/deps/v8/test/unittests/interpreter/interpreter-unittest.cc b/deps/v8/test/unittests/interpreter/interpreter-unittest.cc
index 0f567ec757ba72..1052bccb54bf69 100644
--- a/deps/v8/test/unittests/interpreter/interpreter-unittest.cc
+++ b/deps/v8/test/unittests/interpreter/interpreter-unittest.cc
@@ -377,7 +377,10 @@ TEST_F(InterpreterTest, InterpreterBinaryOpsBigInt) {
         if (tester.HasFeedbackMetadata()) {
           MaybeObject feedback = callable.vector().Get(slot);
           CHECK(feedback->IsSmi());
-          CHECK_EQ(BinaryOperationFeedback::kBigInt, feedback->ToSmi().value());
+          // TODO(panq): Create a standalone unit test for kBigInt64.
+          CHECK(BinaryOperationFeedback::kBigInt64 ==
+                    feedback->ToSmi().value() ||
+                BinaryOperationFeedback::kBigInt == feedback->ToSmi().value());
         }
       }
     }
@@ -4739,9 +4742,9 @@ TEST_F(InterpreterTest, InterpreterGenerators) {
 #ifndef V8_TARGET_ARCH_ARM
 TEST_F(InterpreterTest, InterpreterWithNativeStack) {
   // "Always sparkplug" messes with this test.
-  if (FLAG_always_sparkplug) return;
+  if (v8_flags.always_sparkplug) return;
 
-  i::FLAG_interpreted_frames_native_stack = true;
+  i::v8_flags.interpreted_frames_native_stack = true;
 
   const char* source_text =
       "function testInterpreterWithNativeStack(a,b) { return a + b };";
@@ -4793,8 +4796,8 @@ TEST_F(InterpreterTest, InterpreterGetBytecodeHandler) {
 }
 
 TEST_F(InterpreterTest, InterpreterCollectSourcePositions) {
-  FLAG_enable_lazy_source_positions = true;
-  FLAG_stress_lazy_source_positions = false;
+  v8_flags.enable_lazy_source_positions = true;
+  v8_flags.stress_lazy_source_positions = false;
 
   const char* source =
       "(function () {\n"
@@ -4817,8 +4820,8 @@ TEST_F(InterpreterTest, InterpreterCollectSourcePositions) {
 }
 
 TEST_F(InterpreterTest, InterpreterCollectSourcePositions_StackOverflow) {
-  FLAG_enable_lazy_source_positions = true;
-  FLAG_stress_lazy_source_positions = false;
+  v8_flags.enable_lazy_source_positions = true;
+  v8_flags.stress_lazy_source_positions = false;
 
   const char* source =
       "(function () {\n"
@@ -4852,8 +4855,8 @@ TEST_F(InterpreterTest, InterpreterCollectSourcePositions_StackOverflow) {
 }
 
 TEST_F(InterpreterTest, InterpreterCollectSourcePositions_ThrowFrom1stFrame) {
-  FLAG_enable_lazy_source_positions = true;
-  FLAG_stress_lazy_source_positions = false;
+  v8_flags.enable_lazy_source_positions = true;
+  v8_flags.stress_lazy_source_positions = false;
 
   const char* source =
       R"javascript(
@@ -4886,8 +4889,8 @@ TEST_F(InterpreterTest, InterpreterCollectSourcePositions_ThrowFrom1stFrame) {
 }
 
 TEST_F(InterpreterTest, InterpreterCollectSourcePositions_ThrowFrom2ndFrame) {
-  FLAG_enable_lazy_source_positions = true;
-  FLAG_stress_lazy_source_positions = false;
+  v8_flags.enable_lazy_source_positions = true;
+  v8_flags.stress_lazy_source_positions = false;
 
   const char* source =
       R"javascript(
@@ -4941,8 +4944,8 @@ void CheckStringEqual(const char* expected_ptr, Handle<Object> actual_handle) {
 }  // namespace
 
 TEST_F(InterpreterTest, InterpreterCollectSourcePositions_GenerateStackTrace) {
-  FLAG_enable_lazy_source_positions = true;
-  FLAG_stress_lazy_source_positions = false;
+  v8_flags.enable_lazy_source_positions = true;
+  v8_flags.stress_lazy_source_positions = false;
 
   const char* source =
       R"javascript(
diff --git a/deps/v8/test/unittests/interpreter/source-positions-unittest.cc b/deps/v8/test/unittests/interpreter/source-positions-unittest.cc
index e55bf540656a8a..cdba5378441b1e 100644
--- a/deps/v8/test/unittests/interpreter/source-positions-unittest.cc
+++ b/deps/v8/test/unittests/interpreter/source-positions-unittest.cc
@@ -21,9 +21,10 @@ namespace interpreter {
 
 // Flags enabling optimizations that change generated bytecode array.
 // Format is <command-line flag> <flag name> <bit index>
-#define OPTIMIZATION_FLAGS(V)      \
-  V(FLAG_ignition_reo, kUseReo, 0) \
-  V(FLAG_ignition_filter_expression_positions, kUseFilterExpressionPositions, 2)
+#define OPTIMIZATION_FLAGS(V)                      \
+  V(v8_flags.ignition_reo, kUseReo, 0)             \
+  V(v8_flags.ignition_filter_expression_positions, \
+    kUseFilterExpressionPositions, 2)
 
 #define DECLARE_BIT(_, Name, BitIndex) static const int Name = 1 << BitIndex;
 OPTIMIZATION_FLAGS(DECLARE_BIT)
@@ -105,8 +106,8 @@ class SourcePositionTest : public TestWithContext,
                                std::tuple<int, TestCaseData>> {
  public:
   static void SetUpTestSuite() {
-    FLAG_always_turbofan = false;
-    FLAG_enable_lazy_source_positions = false;
+    v8_flags.always_turbofan = false;
+    v8_flags.enable_lazy_source_positions = false;
     TestWithContext::SetUpTestSuite();
   }
   bool SourcePositionsMatch(int optimization_bitmap, const char* function_body,
@@ -196,9 +197,8 @@ TEST_P(SourcePositionTest, SourcePositionsEquivalent) {
 INSTANTIATE_TEST_SUITE_P(
     SourcePositionsEquivalentTestCases, SourcePositionTest,
     ::testing::Combine(::testing::Values(kUseReo, kUseFilterExpressionPositions,
-                                         kUseReo | kUseFilterExpressionPositions
-
-                                         ),
+                                         kUseReo |
+                                             kUseFilterExpressionPositions),
                        ::testing::ValuesIn(kTestCaseData)));
 
 }  // namespace interpreter
diff --git a/deps/v8/test/unittests/libplatform/single-threaded-default-platform-unittest.cc b/deps/v8/test/unittests/libplatform/single-threaded-default-platform-unittest.cc
index 33b26af40ff578..d3d9580a21d4d2 100644
--- a/deps/v8/test/unittests/libplatform/single-threaded-default-platform-unittest.cc
+++ b/deps/v8/test/unittests/libplatform/single-threaded-default-platform-unittest.cc
@@ -37,7 +37,7 @@ class SingleThreadedDefaultPlatformTest
                   ::testing::Test>>> {
  public:
   static void SetUpTestSuite() {
-    i::FLAG_single_threaded = true;
+    i::v8_flags.single_threaded = true;
     i::FlagList::EnforceFlagImplications();
     WithIsolateScopeMixin::SetUpTestSuite();
   }
diff --git a/deps/v8/test/unittests/logging/counters-unittest.cc b/deps/v8/test/unittests/logging/counters-unittest.cc
index 6e8a4243a3a93d..b7b92867fa7f12 100644
--- a/deps/v8/test/unittests/logging/counters-unittest.cc
+++ b/deps/v8/test/unittests/logging/counters-unittest.cc
@@ -75,7 +75,7 @@ class SnapshotNativeCounterTest : public TestWithNativeContextAndCounters {
 }  // namespace
 
 TEST_F(AggregatedMemoryHistogramTest, OneSample1) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 1000);
   AddSample(20, 1000);
   EXPECT_EQ(1U, samples()->size());
@@ -83,7 +83,7 @@ TEST_F(AggregatedMemoryHistogramTest, OneSample1) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, OneSample2) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 500);
   AddSample(20, 1000);
   EXPECT_EQ(1U, samples()->size());
@@ -91,7 +91,7 @@ TEST_F(AggregatedMemoryHistogramTest, OneSample2) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, OneSample3) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 500);
   AddSample(15, 500);
   AddSample(15, 1000);
@@ -101,7 +101,7 @@ TEST_F(AggregatedMemoryHistogramTest, OneSample3) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, OneSample4) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 500);
   AddSample(15, 750);
   AddSample(20, 1000);
@@ -110,7 +110,7 @@ TEST_F(AggregatedMemoryHistogramTest, OneSample4) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, TwoSamples1) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 1000);
   AddSample(30, 1000);
   EXPECT_EQ(2U, samples()->size());
@@ -119,7 +119,7 @@ TEST_F(AggregatedMemoryHistogramTest, TwoSamples1) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, TwoSamples2) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 1000);
   AddSample(20, 1000);
   AddSample(30, 1000);
@@ -129,7 +129,7 @@ TEST_F(AggregatedMemoryHistogramTest, TwoSamples2) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, TwoSamples3) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 1000);
   AddSample(20, 1000);
   AddSample(20, 500);
@@ -140,7 +140,7 @@ TEST_F(AggregatedMemoryHistogramTest, TwoSamples3) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, TwoSamples4) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 1000);
   AddSample(30, 0);
   EXPECT_EQ(2U, samples()->size());
@@ -149,7 +149,7 @@ TEST_F(AggregatedMemoryHistogramTest, TwoSamples4) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, TwoSamples5) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 0);
   AddSample(30, 1000);
   EXPECT_EQ(2U, samples()->size());
@@ -158,7 +158,7 @@ TEST_F(AggregatedMemoryHistogramTest, TwoSamples5) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, TwoSamples6) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 0);
   AddSample(15, 1000);
   AddSample(30, 1000);
@@ -168,7 +168,7 @@ TEST_F(AggregatedMemoryHistogramTest, TwoSamples6) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, TwoSamples7) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 0);
   AddSample(15, 1000);
   AddSample(25, 0);
@@ -179,7 +179,7 @@ TEST_F(AggregatedMemoryHistogramTest, TwoSamples7) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, TwoSamples8) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   AddSample(10, 1000);
   AddSample(15, 0);
   AddSample(25, 1000);
@@ -190,7 +190,7 @@ TEST_F(AggregatedMemoryHistogramTest, TwoSamples8) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, ManySamples1) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   const int kMaxSamples = 1000;
   AddSample(0, 0);
   AddSample(10 * kMaxSamples, 10 * kMaxSamples);
@@ -201,7 +201,7 @@ TEST_F(AggregatedMemoryHistogramTest, ManySamples1) {
 }
 
 TEST_F(AggregatedMemoryHistogramTest, ManySamples2) {
-  FLAG_histogram_interval = 10;
+  v8_flags.histogram_interval = 10;
   const int kMaxSamples = 1000;
   AddSample(0, 0);
   AddSample(10 * (2 * kMaxSamples), 10 * (2 * kMaxSamples));
@@ -214,7 +214,7 @@ TEST_F(AggregatedMemoryHistogramTest, ManySamples2) {
 TEST_F(SnapshotNativeCounterTest, WriteBarrier) {
   RunJS("let o = {a: 42};");
 
-  if (!FLAG_single_generation && SupportsNativeCounters()) {
+  if (!v8_flags.single_generation && SupportsNativeCounters()) {
     EXPECT_NE(0, write_barriers());
   } else {
     EXPECT_EQ(0, write_barriers());
diff --git a/deps/v8/test/unittests/logging/log-unittest.cc b/deps/v8/test/unittests/logging/log-unittest.cc
index ff7729edbde8f8..764064c40df85d 100644
--- a/deps/v8/test/unittests/logging/log-unittest.cc
+++ b/deps/v8/test/unittests/logging/log-unittest.cc
@@ -57,11 +57,11 @@ namespace {
 class LogTest : public TestWithIsolate {
  public:
   static void SetUpTestSuite() {
-    i::FLAG_log = true;
-    i::FLAG_prof = true;
-    i::FLAG_log_code = true;
-    i::FLAG_logfile = i::LogFile::kLogToTemporaryFile;
-    i::FLAG_logfile_per_isolate = false;
+    i::v8_flags.log = true;
+    i::v8_flags.prof = true;
+    i::v8_flags.log_code = true;
+    i::v8_flags.logfile = i::LogFile::kLogToTemporaryFile;
+    i::v8_flags.logfile_per_isolate = false;
     TestWithIsolate::SetUpTestSuite();
   }
 };
@@ -498,11 +498,11 @@ TEST_F(LogTest, Issue539892) {
 class LogAllTest : public LogTest {
  public:
   static void SetUpTestSuite() {
-    i::FLAG_log_all = true;
-    i::FLAG_log_deopt = true;
-    i::FLAG_turbo_inlining = false;
-    i::FLAG_log_internal_timer_events = true;
-    i::FLAG_allow_natives_syntax = true;
+    i::v8_flags.log_all = true;
+    i::v8_flags.log_deopt = true;
+    i::v8_flags.turbo_inlining = false;
+    i::v8_flags.log_internal_timer_events = true;
+    i::v8_flags.allow_natives_syntax = true;
     LogTest::SetUpTestSuite();
   }
 };
@@ -543,7 +543,7 @@ TEST_F(LogAllTest, LogAll) {
     CHECK(logger.ContainsLine({"code-creation,Script", ":1:1"}));
     CHECK(logger.ContainsLine({"code-creation,JS,", "testAddFn"}));
 
-    if (i::FLAG_turbofan && !i::FLAG_always_turbofan) {
+    if (i::v8_flags.turbofan && !i::v8_flags.always_turbofan) {
       CHECK(logger.ContainsLine({"code-deopt,", "not a Smi"}));
       CHECK(logger.ContainsLine({"timer-event-start", "V8.DeoptimizeCode"}));
       CHECK(logger.ContainsLine({"timer-event-end", "V8.DeoptimizeCode"}));
@@ -554,7 +554,7 @@ TEST_F(LogAllTest, LogAll) {
 class LogInterpretedFramesNativeStackTest : public LogTest {
  public:
   static void SetUpTestSuite() {
-    i::FLAG_interpreted_frames_native_stack = true;
+    i::v8_flags.interpreted_frames_native_stack = true;
     LogTest::SetUpTestSuite();
   }
 };
@@ -583,13 +583,13 @@ class LogInterpretedFramesNativeStackWithSerializationTest
       : array_buffer_allocator_(
             v8::ArrayBuffer::Allocator::NewDefaultAllocator()) {}
   static void SetUpTestSuite() {
-    i::FLAG_log = true;
-    i::FLAG_prof = true;
-    i::FLAG_log_code = true;
-    i::FLAG_logfile = i::LogFile::kLogToTemporaryFile;
-    i::FLAG_logfile_per_isolate = false;
-    i::FLAG_interpreted_frames_native_stack = true;
-    i::FLAG_always_turbofan = false;
+    i::v8_flags.log = true;
+    i::v8_flags.prof = true;
+    i::v8_flags.log_code = true;
+    i::v8_flags.logfile = i::LogFile::kLogToTemporaryFile;
+    i::v8_flags.logfile_per_isolate = false;
+    i::v8_flags.interpreted_frames_native_stack = true;
+    i::v8_flags.always_turbofan = false;
     TestWithPlatform::SetUpTestSuite();
   }
 
@@ -673,8 +673,8 @@ TEST_F(LogInterpretedFramesNativeStackWithSerializationTest,
 class LogExternalLogEventListenerTest : public TestWithIsolate {
  public:
   static void SetUpTestSuite() {
-    i::FLAG_log = false;
-    i::FLAG_prof = false;
+    i::v8_flags.log = false;
+    i::v8_flags.prof = false;
     TestWithIsolate::SetUpTestSuite();
   }
 };
@@ -728,8 +728,8 @@ class LogExternalLogEventListenerInnerFunctionTest : public TestWithPlatform {
       : array_buffer_allocator_(
             v8::ArrayBuffer::Allocator::NewDefaultAllocator()) {}
   static void SetUpTestSuite() {
-    i::FLAG_log = false;
-    i::FLAG_prof = false;
+    i::v8_flags.log = false;
+    i::v8_flags.prof = false;
     TestWithPlatform::SetUpTestSuite();
   }
 
@@ -771,11 +771,11 @@ TEST_F(LogExternalLogEventListenerInnerFunctionTest,
         v8::ScriptCompiler::CompileUnboundScript(isolate1, &source)
             .ToLocalChecked();
     CHECK_EQ(code_event_handler.CountLines("Function", "f1"),
-             1 + (i::FLAG_stress_background_compile ? 1 : 0) +
-                 (i::FLAG_always_sparkplug ? 1 : 0));
+             1 + (i::v8_flags.stress_background_compile ? 1 : 0) +
+                 (i::v8_flags.always_sparkplug ? 1 : 0));
     CHECK_EQ(code_event_handler.CountLines("Function", "f2"),
-             1 + (i::FLAG_stress_background_compile ? 1 : 0) +
-                 (i::FLAG_always_sparkplug ? 1 : 0));
+             1 + (i::v8_flags.stress_background_compile ? 1 : 0) +
+                 (i::v8_flags.always_sparkplug ? 1 : 0));
     cache = v8::ScriptCompiler::CreateCodeCache(script);
   }
   isolate1->Dispose();
@@ -811,9 +811,9 @@ TEST_F(LogExternalLogEventListenerInnerFunctionTest,
 class LogExternalInterpretedFramesNativeStackTest : public TestWithIsolate {
  public:
   static void SetUpTestSuite() {
-    i::FLAG_log = false;
-    i::FLAG_prof = false;
-    i::FLAG_interpreted_frames_native_stack = true;
+    i::v8_flags.log = false;
+    i::v8_flags.prof = false;
+    i::v8_flags.interpreted_frames_native_stack = true;
     TestWithIsolate::SetUpTestSuite();
   }
 };
@@ -863,7 +863,7 @@ TEST_F(LogExternalInterpretedFramesNativeStackTest,
 class LogMapsTest : public LogTest {
  public:
   static void SetUpTestSuite() {
-    i::FLAG_log_maps = true;
+    i::v8_flags.log_maps = true;
     LogTest::SetUpTestSuite();
   }
 };
@@ -949,8 +949,9 @@ void ValidateMapDetailsLogging(v8::Isolate* isolate,
 
 TEST_F(LogMapsTest, LogMapsDetailsStartup) {
   // Reusing map addresses might cause these tests to fail.
-  if (i::FLAG_gc_global || i::FLAG_stress_compaction ||
-      i::FLAG_stress_incremental_marking || i::FLAG_enable_third_party_heap) {
+  if (i::v8_flags.gc_global || i::v8_flags.stress_compaction ||
+      i::v8_flags.stress_incremental_marking ||
+      i::v8_flags.enable_third_party_heap) {
     return;
   }
   // Test that all Map details from Maps in the snapshot are logged properly.
@@ -964,16 +965,17 @@ TEST_F(LogMapsTest, LogMapsDetailsStartup) {
 class LogMapsCodeTest : public LogTest {
  public:
   static void SetUpTestSuite() {
-    i::FLAG_retain_maps_for_n_gc = 0xFFFFFFF;
-    i::FLAG_log_maps = true;
+    i::v8_flags.retain_maps_for_n_gc = 0xFFFFFFF;
+    i::v8_flags.log_maps = true;
     LogTest::SetUpTestSuite();
   }
 };
 
 TEST_F(LogMapsCodeTest, LogMapsDetailsCode) {
   // Reusing map addresses might cause these tests to fail.
-  if (i::FLAG_gc_global || i::FLAG_stress_compaction ||
-      i::FLAG_stress_incremental_marking || i::FLAG_enable_third_party_heap) {
+  if (i::v8_flags.gc_global || i::v8_flags.stress_compaction ||
+      i::v8_flags.stress_incremental_marking ||
+      i::v8_flags.enable_third_party_heap) {
     return;
   }
 
@@ -1061,8 +1063,9 @@ TEST_F(LogMapsCodeTest, LogMapsDetailsCode) {
 
 TEST_F(LogMapsTest, LogMapsDetailsContexts) {
   // Reusing map addresses might cause these tests to fail.
-  if (i::FLAG_gc_global || i::FLAG_stress_compaction ||
-      i::FLAG_stress_incremental_marking || i::FLAG_enable_third_party_heap) {
+  if (i::v8_flags.gc_global || i::v8_flags.stress_compaction ||
+      i::v8_flags.stress_incremental_marking ||
+      i::v8_flags.enable_third_party_heap) {
     return;
   }
   // Test that all Map details from Maps in the snapshot are logged properly.
@@ -1132,7 +1135,7 @@ class LogFunctionEventsTest : public LogTest {
 
 TEST_F(LogFunctionEventsTest, LogFunctionEvents) {
   // --always-turbofan will break the fine-grained log order.
-  if (i::FLAG_always_turbofan) return;
+  if (i::v8_flags.always_turbofan) return;
 
   {
     ScopedLoggerInitializer logger(isolate());
diff --git a/deps/v8/test/unittests/logging/runtime-call-stats-unittest.cc b/deps/v8/test/unittests/logging/runtime-call-stats-unittest.cc
index f69127bf9efd3c..fdde4441a28e18 100644
--- a/deps/v8/test/unittests/logging/runtime-call-stats-unittest.cc
+++ b/deps/v8/test/unittests/logging/runtime-call-stats-unittest.cc
@@ -460,8 +460,8 @@ static void CustomCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
 }  // namespace
 
 TEST_F(RuntimeCallStatsTest, CallbackFunction) {
-  FLAG_allow_natives_syntax = true;
-  FLAG_incremental_marking = false;
+  v8_flags.allow_natives_syntax = true;
+  v8_flags.incremental_marking = false;
 
   RuntimeCallCounter* callback_counter =
       stats()->GetCounter(RuntimeCallCounterId::kFunctionCallback);
@@ -539,8 +539,8 @@ TEST_F(RuntimeCallStatsTest, CallbackFunction) {
 }
 
 TEST_F(RuntimeCallStatsTest, ApiGetter) {
-  FLAG_allow_natives_syntax = true;
-  FLAG_incremental_marking = false;
+  v8_flags.allow_natives_syntax = true;
+  v8_flags.incremental_marking = false;
 
   RuntimeCallCounter* callback_counter =
       stats()->GetCounter(RuntimeCallCounterId::kFunctionCallback);
@@ -627,12 +627,12 @@ TEST_F(RuntimeCallStatsTest, ApiGetter) {
 }
 
 TEST_F(RuntimeCallStatsTest, GarbageCollection) {
-  if (FLAG_stress_incremental_marking) return;
-  FLAG_expose_gc = true;
+  if (v8_flags.stress_incremental_marking) return;
+  v8_flags.expose_gc = true;
   // Disable concurrent GC threads because otherwise they may continue
   // running after this test completes and race with is_runtime_stats_enabled()
   // updates.
-  FLAG_single_threaded_gc = true;
+  v8_flags.single_threaded_gc = true;
 
   FlagList::EnforceFlagImplications();
   v8::Isolate* isolate = v8_isolate();
diff --git a/deps/v8/test/unittests/objects/concurrent-feedback-vector-unittest.cc b/deps/v8/test/unittests/objects/concurrent-feedback-vector-unittest.cc
index f329e38495bc8a..9ed7e76ad36ba5 100644
--- a/deps/v8/test/unittests/objects/concurrent-feedback-vector-unittest.cc
+++ b/deps/v8/test/unittests/objects/concurrent-feedback-vector-unittest.cc
@@ -161,7 +161,7 @@ static void CheckedWait(base::Semaphore& semaphore) {
 // Verify that a LoadIC can be cycled through different states and safely
 // read on a background thread.
 TEST_F(ConcurrentFeedbackVectorTest, CheckLoadICStates) {
-  FLAG_lazy_feedback_allocation = false;
+  v8_flags.lazy_feedback_allocation = false;
 
   std::unique_ptr<PersistentHandles> ph = i_isolate()->NewPersistentHandles();
   HandleScope handle_scope(i_isolate());
diff --git a/deps/v8/test/unittests/objects/concurrent-string-unittest.cc b/deps/v8/test/unittests/objects/concurrent-string-unittest.cc
index 604b6f017cf4be..569bceb01c8dfa 100644
--- a/deps/v8/test/unittests/objects/concurrent-string-unittest.cc
+++ b/deps/v8/test/unittests/objects/concurrent-string-unittest.cc
@@ -234,9 +234,9 @@ TEST_F(ConcurrentStringTest, InspectTwoByteExternalizing) {
 // InspectOneByteExternalizing, but using thin strings.
 TEST_F(ConcurrentStringTest, InspectOneByteExternalizing_ThinString) {
   // We will not create a thin string if single_generation is turned on.
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   // We don't create ThinStrings immediately when using the forwarding table.
-  if (FLAG_always_use_string_forwarding_table) return;
+  if (v8_flags.always_use_string_forwarding_table) return;
   std::unique_ptr<PersistentHandles> ph = i_isolate()->NewPersistentHandles();
 
   auto factory = i_isolate()->factory();
@@ -296,9 +296,9 @@ TEST_F(ConcurrentStringTest, InspectOneByteExternalizing_ThinString) {
 // strings.
 TEST_F(ConcurrentStringTest, InspectOneIntoTwoByteExternalizing_ThinString) {
   // We will not create a thin string if single_generation is turned on.
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   // We don't create ThinStrings immediately when using the forwarding table.
-  if (FLAG_always_use_string_forwarding_table) return;
+  if (v8_flags.always_use_string_forwarding_table) return;
   std::unique_ptr<PersistentHandles> ph = i_isolate()->NewPersistentHandles();
 
   auto factory = i_isolate()->factory();
@@ -358,9 +358,9 @@ TEST_F(ConcurrentStringTest, InspectOneIntoTwoByteExternalizing_ThinString) {
 // InspectTwoByteExternalizing, but using thin strings.
 TEST_F(ConcurrentStringTest, InspectTwoByteExternalizing_ThinString) {
   // We will not create a thin string if single_generation is turned on.
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   // We don't create ThinStrings immediately when using the forwarding table.
-  if (FLAG_always_use_string_forwarding_table) return;
+  if (v8_flags.always_use_string_forwarding_table) return;
   std::unique_ptr<PersistentHandles> ph = i_isolate()->NewPersistentHandles();
 
   auto factory = i_isolate()->factory();
diff --git a/deps/v8/test/unittests/objects/dictionary-unittest.cc b/deps/v8/test/unittests/objects/dictionary-unittest.cc
index ecdf0ec7109f5c..28bda6116f767e 100644
--- a/deps/v8/test/unittests/objects/dictionary-unittest.cc
+++ b/deps/v8/test/unittests/objects/dictionary-unittest.cc
@@ -204,7 +204,7 @@ class DictionaryTest : public TestWithHeapInternalsAndContext {
 
     // Even though we simulate a full heap, generating an identity hash
     // code in subsequent calls will not request GC.
-    if (!FLAG_single_generation) {
+    if (!v8_flags.single_generation) {
       SimulateFullSpace(heap()->new_space());
     }
     SimulateFullSpace(heap()->old_space());
@@ -276,9 +276,9 @@ TEST_F(DictionaryTest, HashTableRehash) {
 
 #ifdef DEBUG
 TEST_F(DictionaryTest, ObjectHashTableCausesGC) {
-  i::FLAG_stress_compaction = false;
+  i::v8_flags.stress_compaction = false;
   // For SimulateFullSpace in TestHashMapDoesNotCauseGC.
-  i::FLAG_stress_concurrent_allocation = false;
+  i::v8_flags.stress_concurrent_allocation = false;
   TestHashMapDoesNotCauseGC(ObjectHashTable::New(isolate(), 1));
 }
 #endif
diff --git a/deps/v8/test/unittests/objects/feedback-vector-unittest.cc b/deps/v8/test/unittests/objects/feedback-vector-unittest.cc
index 4730536afb392e..c9eedf28b54cfb 100644
--- a/deps/v8/test/unittests/objects/feedback-vector-unittest.cc
+++ b/deps/v8/test/unittests/objects/feedback-vector-unittest.cc
@@ -144,9 +144,9 @@ TEST_F(FeedbackVectorTest, VectorICMetadata) {
 }
 
 TEST_F(FeedbackVectorTest, VectorCallICStates) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -173,9 +173,9 @@ TEST_F(FeedbackVectorTest, VectorCallICStates) {
 
 // Test the Call IC states transfer with Function.prototype.apply
 TEST_F(FeedbackVectorTest, VectorCallICStateApply) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -213,9 +213,9 @@ TEST_F(FeedbackVectorTest, VectorCallICStateApply) {
 }
 
 TEST_F(FeedbackVectorTest, VectorCallFeedback) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -243,10 +243,10 @@ TEST_F(FeedbackVectorTest, VectorCallFeedback) {
 }
 
 TEST_F(FeedbackVectorTest, VectorPolymorphicCallFeedback) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
-  FLAG_lazy_feedback_allocation = false;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
+  v8_flags.lazy_feedback_allocation = false;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -274,9 +274,9 @@ TEST_F(FeedbackVectorTest, VectorPolymorphicCallFeedback) {
 }
 
 TEST_F(FeedbackVectorTest, VectorCallFeedbackForArray) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -303,9 +303,9 @@ TEST_F(FeedbackVectorTest, VectorCallFeedbackForArray) {
 }
 
 TEST_F(FeedbackVectorTest, VectorCallCounts) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -334,9 +334,9 @@ TEST_F(FeedbackVectorTest, VectorCallCounts) {
 }
 
 TEST_F(FeedbackVectorTest, VectorConstructCounts) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -367,9 +367,9 @@ TEST_F(FeedbackVectorTest, VectorConstructCounts) {
 }
 
 TEST_F(FeedbackVectorTest, VectorSpeculationMode) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -401,11 +401,11 @@ TEST_F(FeedbackVectorTest, VectorSpeculationMode) {
 }
 
 TEST_F(FeedbackVectorTest, VectorCallSpeculationModeAndFeedbackContent) {
-  if (!i::FLAG_use_ic) return;
-  if (!i::FLAG_turbofan) return;
-  if (i::FLAG_always_turbofan) return;
-  if (i::FLAG_jitless) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (!i::v8_flags.turbofan) return;
+  if (i::v8_flags.always_turbofan) return;
+  if (i::v8_flags.jitless) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -436,9 +436,9 @@ TEST_F(FeedbackVectorTest, VectorCallSpeculationModeAndFeedbackContent) {
 }
 
 TEST_F(FeedbackVectorTest, VectorLoadICStates) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -489,9 +489,9 @@ TEST_F(FeedbackVectorTest, VectorLoadICStates) {
 }
 
 TEST_F(FeedbackVectorTest, VectorLoadGlobalICSlotSharing) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -525,9 +525,9 @@ TEST_F(FeedbackVectorTest, VectorLoadGlobalICSlotSharing) {
 }
 
 TEST_F(FeedbackVectorTest, VectorLoadICOnSmi) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -581,9 +581,9 @@ TEST_F(FeedbackVectorTest, VectorLoadICOnSmi) {
 }
 
 TEST_F(FeedbackVectorTest, ReferenceContextAllocatesNoSlots) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
@@ -725,9 +725,9 @@ TEST_F(FeedbackVectorTest, ReferenceContextAllocatesNoSlots) {
 }
 
 TEST_F(FeedbackVectorTest, VectorStoreICBasic) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
 
@@ -751,9 +751,9 @@ TEST_F(FeedbackVectorTest, VectorStoreICBasic) {
 }
 
 TEST_F(FeedbackVectorTest, DefineNamedOwnIC) {
-  if (!i::FLAG_use_ic) return;
-  if (i::FLAG_always_turbofan) return;
-  FLAG_allow_natives_syntax = true;
+  if (!i::v8_flags.use_ic) return;
+  if (i::v8_flags.always_turbofan) return;
+  v8_flags.allow_natives_syntax = true;
 
   v8::HandleScope scope(v8_isolate());
 
diff --git a/deps/v8/test/unittests/objects/inobject-slack-tracking-unittest.cc b/deps/v8/test/unittests/objects/inobject-slack-tracking-unittest.cc
index f2e1e12bb370ab..2be8c2ec8bb271 100644
--- a/deps/v8/test/unittests/objects/inobject-slack-tracking-unittest.cc
+++ b/deps/v8/test/unittests/objects/inobject-slack-tracking-unittest.cc
@@ -314,7 +314,7 @@ class InObjectSlackTrackingTest : public TestWithContext {
 
   void TestSubclassChain(const std::vector<int>& hierarchy_desc) {
     // Avoid eventual completion of in-object slack tracking.
-    FLAG_always_turbofan = false;
+    v8_flags.always_turbofan = false;
 
     CreateClassHierarchy(hierarchy_desc);
     TestClassHierarchy(hierarchy_desc, static_cast<int>(hierarchy_desc.size()));
@@ -325,7 +325,7 @@ class InObjectSlackTrackingTest : public TestWithContext {
 
 TEST_F(InObjectSlackTrackingTest, JSObjectBasic) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   const char* source =
       "function A() {"
       "  this.a = 42;"
@@ -373,13 +373,13 @@ TEST_F(InObjectSlackTrackingTest, JSObjectBasic) {
 }
 
 TEST_F(InObjectSlackTrackingTest, JSObjectBasicNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestJSObjectBasic();
 }
 
 TEST_F(InObjectSlackTrackingTest, JSObjectComplex) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   const char* source =
       "function A(n) {"
       "  if (n > 0) this.a = 42;"
@@ -449,13 +449,13 @@ TEST_F(InObjectSlackTrackingTest, JSObjectComplex) {
 }
 
 TEST_F(InObjectSlackTrackingTest, JSObjectComplexNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestJSObjectComplex();
 }
 
 TEST_F(InObjectSlackTrackingTest, JSGeneratorObjectBasic) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   const char* source =
       "function* A() {"
       "  var i = 0;"
@@ -511,13 +511,13 @@ TEST_F(InObjectSlackTrackingTest, JSGeneratorObjectBasic) {
 }
 
 TEST_F(InObjectSlackTrackingTest, JSGeneratorObjectBasicNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestJSGeneratorObjectBasic();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassBasicNoBaseClassInstances) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   // Check that base class' and subclass' slack tracking do not interfere with
   // each other.
@@ -600,13 +600,13 @@ TEST_F(InObjectSlackTrackingTest, SubclassBasicNoBaseClassInstances) {
 
 TEST_F(InObjectSlackTrackingTest,
        SubclassBasicNoBaseClassInstancesNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassBasicNoBaseClassInstances();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassBasic) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   // Check that base class' and subclass' slack tracking do not interfere with
   // each other.
@@ -699,7 +699,7 @@ TEST_F(InObjectSlackTrackingTest, SubclassBasic) {
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassBasicNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassBasic();
 }
 
@@ -738,7 +738,7 @@ TEST_F(InObjectSlackTrackingTest, LongSubclassChain3) {
 
 TEST_F(InObjectSlackTrackingTest, InobjectPropetiesCountOverflowInSubclass) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   std::vector<int> hierarchy_desc;
   const int kNoOverflowCount = 5;
@@ -910,10 +910,10 @@ TEST_F(InObjectSlackTrackingTest, ObjectLiteralPropertyBackingStoreSize) {
 }
 
 TEST_F(InObjectSlackTrackingTest, SlowModeSubclass) {
-  if (FLAG_stress_concurrent_allocation) return;
+  if (v8_flags.stress_concurrent_allocation) return;
 
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   std::vector<int> hierarchy_desc;
   const int kNoOverflowCount = 5;
@@ -969,46 +969,46 @@ TEST_F(InObjectSlackTrackingTest, SlowModeSubclass) {
 
 TEST_F(InObjectSlackTrackingTest, SubclassObjectBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   TestSubclassBuiltin("A1", JS_OBJECT_TYPE, "Object", "true");
   TestSubclassBuiltin("A2", JS_OBJECT_TYPE, "Object", "42");
   TestSubclassBuiltin("A3", JS_OBJECT_TYPE, "Object", "'some string'");
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassObjectBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassObjectBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassFunctionBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   TestSubclassBuiltin("A1", JS_FUNCTION_TYPE, "Function", "'return 153;'");
   TestSubclassBuiltin("A2", JS_FUNCTION_TYPE, "Function", "'this.a = 44;'");
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassFunctionBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassFunctionBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassBooleanBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   TestSubclassBuiltin("A1", JS_PRIMITIVE_WRAPPER_TYPE, "Boolean", "true");
   TestSubclassBuiltin("A2", JS_PRIMITIVE_WRAPPER_TYPE, "Boolean", "false");
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassBooleanBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassBooleanBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassErrorBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   const int first_field = 2;
   TestSubclassBuiltin("A1", JS_ERROR_TYPE, "Error", "'err'", first_field);
@@ -1022,38 +1022,38 @@ TEST_F(InObjectSlackTrackingTest, SubclassErrorBuiltin) {
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassErrorBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassErrorBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassNumberBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   TestSubclassBuiltin("A1", JS_PRIMITIVE_WRAPPER_TYPE, "Number", "42");
   TestSubclassBuiltin("A2", JS_PRIMITIVE_WRAPPER_TYPE, "Number", "4.2");
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassNumberBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassNumberBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassDateBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   TestSubclassBuiltin("A1", JS_DATE_TYPE, "Date", "123456789");
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassDateBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassDateBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassStringBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   TestSubclassBuiltin("A1", JS_PRIMITIVE_WRAPPER_TYPE, "String",
                       "'some string'");
@@ -1061,12 +1061,12 @@ TEST_F(InObjectSlackTrackingTest, SubclassStringBuiltin) {
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassStringBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassRegExpBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   const int first_field = 1;
   TestSubclassBuiltin("A1", JS_REG_EXP_TYPE, "RegExp", "'o(..)h', 'g'",
@@ -1074,25 +1074,25 @@ TEST_F(InObjectSlackTrackingTest, SubclassRegExpBuiltin) {
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassRegExpBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassRegExpBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassArrayBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
   TestSubclassBuiltin("A1", JS_ARRAY_TYPE, "Array", "42");
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassArrayBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassArrayBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassTypedArrayBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
 
 #define TYPED_ARRAY_TEST_F(InObjectSlackTrackingTest, Type, type, TYPE, \
                            elementType)                                 \
@@ -1104,13 +1104,13 @@ TEST_F(InObjectSlackTrackingTest, SubclassTypedArrayBuiltin) {
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassTypedArrayBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassTypedArrayBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassCollectionBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1121,13 +1121,13 @@ TEST_F(InObjectSlackTrackingTest, SubclassCollectionBuiltin) {
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassCollectionBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassCollectionBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassArrayBufferBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1137,13 +1137,13 @@ TEST_F(InObjectSlackTrackingTest, SubclassArrayBufferBuiltin) {
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassArrayBufferBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassArrayBufferBuiltin();
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassPromiseBuiltin) {
   // Avoid eventual completion of in-object slack tracking.
-  FLAG_always_turbofan = false;
+  v8_flags.always_turbofan = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1152,7 +1152,7 @@ TEST_F(InObjectSlackTrackingTest, SubclassPromiseBuiltin) {
 }
 
 TEST_F(InObjectSlackTrackingTest, SubclassPromiseBuiltinNoInlineNew) {
-  FLAG_inline_new = false;
+  v8_flags.inline_new = false;
   TestSubclassPromiseBuiltin();
 }
 
@@ -1362,7 +1362,7 @@ TEST_F(InObjectSlackTrackingTest,
 
 TEST_F(InObjectSlackTrackingTest,
        InstanceFieldsArePropertiesDefaultConstructorEager) {
-  i::FLAG_lazy = false;
+  i::v8_flags.lazy = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
@@ -1385,7 +1385,7 @@ TEST_F(InObjectSlackTrackingTest,
 
 TEST_F(InObjectSlackTrackingTest,
        InstanceFieldsArePropertiesFieldsAndConstructorEager) {
-  i::FLAG_lazy = false;
+  i::v8_flags.lazy = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
 
diff --git a/deps/v8/test/unittests/objects/modules-unittest.cc b/deps/v8/test/unittests/objects/modules-unittest.cc
index 677ae0da0e3edd..d3ac95a3e352dc 100644
--- a/deps/v8/test/unittests/objects/modules-unittest.cc
+++ b/deps/v8/test/unittests/objects/modules-unittest.cc
@@ -177,8 +177,8 @@ MaybeLocal<Module> ResolveCallbackWithImportAssertions(
 }
 
 TEST_F(ModuleTest, ModuleInstantiationWithImportAssertions) {
-  bool prev_import_assertions = i::FLAG_harmony_import_assertions;
-  i::FLAG_harmony_import_assertions = true;
+  bool prev_import_assertions = i::v8_flags.harmony_import_assertions;
+  i::v8_flags.harmony_import_assertions = true;
   HandleScope scope(isolate());
   v8::TryCatch try_catch(isolate());
 
@@ -269,7 +269,7 @@ TEST_F(ModuleTest, ModuleInstantiationWithImportAssertions) {
     CHECK_EQ(42, result->Int32Value(context()).FromJust());
   }
   CHECK(!try_catch.HasCaught());
-  i::FLAG_harmony_import_assertions = prev_import_assertions;
+  i::v8_flags.harmony_import_assertions = prev_import_assertions;
 }
 
 TEST_F(ModuleTest, ModuleInstantiationFailures2) {
diff --git a/deps/v8/test/unittests/objects/roots-unittest.cc b/deps/v8/test/unittests/objects/roots-unittest.cc
index a12ccdfb3fc4b4..6bb3bc16ee3384 100644
--- a/deps/v8/test/unittests/objects/roots-unittest.cc
+++ b/deps/v8/test/unittests/objects/roots-unittest.cc
@@ -59,6 +59,7 @@ bool IsInitiallyMutable(Factory* factory, Address object_address) {
   V(retaining_path_targets)               \
   V(serialized_global_proxy_sizes)        \
   V(serialized_objects)                   \
+  IF_WASM(V, js_to_wasm_wrappers)         \
   IF_WASM(V, wasm_canonical_rtts)         \
   V(weak_refs_keep_during_job)
 
diff --git a/deps/v8/test/unittests/objects/value-serializer-unittest.cc b/deps/v8/test/unittests/objects/value-serializer-unittest.cc
index 0e1aa59a39656b..f433fd10f51394 100644
--- a/deps/v8/test/unittests/objects/value-serializer-unittest.cc
+++ b/deps/v8/test/unittests/objects/value-serializer-unittest.cc
@@ -1686,13 +1686,13 @@ TEST_F(ValueSerializerTest, DecodeRegExpDotAll) {
 }
 
 TEST_F(ValueSerializerTest, DecodeLinearRegExp) {
-  bool flag_was_enabled = i::FLAG_enable_experimental_regexp_engine;
+  bool flag_was_enabled = i::v8_flags.enable_experimental_regexp_engine;
 
   // The last byte encodes the regexp flags.
   std::vector<uint8_t> regexp_encoding = {0xFF, 0x09, 0x3F, 0x00, 0x52,
                                           0x03, 0x66, 0x6F, 0x6F, 0x6D};
 
-  i::FLAG_enable_experimental_regexp_engine = true;
+  i::v8_flags.enable_experimental_regexp_engine = true;
   // DecodeTestUpToVersion will overwrite the version number in the data but
   // it's fine.
   DecodeTestUpToVersion(
@@ -1702,10 +1702,10 @@ TEST_F(ValueSerializerTest, DecodeLinearRegExp) {
         ExpectScriptTrue("result.toString() === '/foo/glmsy'");
       });
 
-  i::FLAG_enable_experimental_regexp_engine = false;
+  i::v8_flags.enable_experimental_regexp_engine = false;
   InvalidDecodeTest(regexp_encoding);
 
-  i::FLAG_enable_experimental_regexp_engine = flag_was_enabled;
+  i::v8_flags.enable_experimental_regexp_engine = flag_was_enabled;
 }
 
 TEST_F(ValueSerializerTest, DecodeHasIndicesRegExp) {
@@ -2503,14 +2503,14 @@ class ValueSerializerTestWithSharedArrayBufferClone
   }
 
   static void SetUpTestSuite() {
-    flag_was_enabled_ = i::FLAG_harmony_sharedarraybuffer;
-    i::FLAG_harmony_sharedarraybuffer = true;
+    flag_was_enabled_ = i::v8_flags.harmony_sharedarraybuffer;
+    i::v8_flags.harmony_sharedarraybuffer = true;
     ValueSerializerTest::SetUpTestSuite();
   }
 
   static void TearDownTestSuite() {
     ValueSerializerTest::TearDownTestSuite();
-    i::FLAG_harmony_sharedarraybuffer = flag_was_enabled_;
+    i::v8_flags.harmony_sharedarraybuffer = flag_was_enabled_;
     flag_was_enabled_ = false;
   }
 
@@ -2608,8 +2608,8 @@ TEST_F(ValueSerializerTestWithSharedArrayBufferClone,
 #if V8_ENABLE_WEBASSEMBLY
 TEST_F(ValueSerializerTestWithSharedArrayBufferClone,
        RoundTripWebAssemblyMemory) {
-  bool flag_was_enabled = i::FLAG_experimental_wasm_threads;
-  i::FLAG_experimental_wasm_threads = true;
+  bool flag_was_enabled = i::v8_flags.experimental_wasm_threads;
+  i::v8_flags.experimental_wasm_threads = true;
 
   std::vector<uint8_t> data = {0x00, 0x01, 0x80, 0xFF};
   data.resize(65536);
@@ -2636,7 +2636,7 @@ TEST_F(ValueSerializerTestWithSharedArrayBufferClone,
   ExpectScriptTrue(
       "new Uint8Array(result.buffer, 0, 4).toString() === '0,1,128,255'");
 
-  i::FLAG_experimental_wasm_threads = flag_was_enabled;
+  i::v8_flags.experimental_wasm_threads = flag_was_enabled;
 }
 #endif  // V8_ENABLE_WEBASSEMBLY
 
@@ -2960,14 +2960,14 @@ class ValueSerializerTestWithWasm : public ValueSerializerTest {
 
  protected:
   static void SetUpTestSuite() {
-    g_saved_flag = i::FLAG_expose_wasm;
-    i::FLAG_expose_wasm = true;
+    g_saved_flag = i::v8_flags.expose_wasm;
+    i::v8_flags.expose_wasm = true;
     ValueSerializerTest::SetUpTestSuite();
   }
 
   static void TearDownTestSuite() {
     ValueSerializerTest::TearDownTestSuite();
-    i::FLAG_expose_wasm = g_saved_flag;
+    i::v8_flags.expose_wasm = g_saved_flag;
     g_saved_flag = false;
   }
 
diff --git a/deps/v8/test/unittests/objects/weakmaps-unittest.cc b/deps/v8/test/unittests/objects/weakmaps-unittest.cc
index cd2aad1269a469..9e839463dd9e0c 100644
--- a/deps/v8/test/unittests/objects/weakmaps-unittest.cc
+++ b/deps/v8/test/unittests/objects/weakmaps-unittest.cc
@@ -55,7 +55,7 @@ static void WeakPointerCallback(const v8::WeakCallbackInfo<void>& data) {
 }
 
 TEST_F(WeakMapsTest, Weakness) {
-  FLAG_incremental_marking = false;
+  v8_flags.incremental_marking = false;
   Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
   HandleScope scope(isolate);
@@ -83,14 +83,22 @@ TEST_F(WeakMapsTest, Weakness) {
     int32_t object_hash = object->GetOrCreateHash(isolate).value();
     JSWeakCollection::Set(weakmap, object, smi, object_hash);
   }
-  CHECK_EQ(2, EphemeronHashTable::cast(weakmap->table()).NumberOfElements());
+  // Put a symbol key into weak map.
+  {
+    HandleScope inner_scope(isolate);
+    Handle<Symbol> symbol = factory->NewSymbol();
+    Handle<Smi> smi(Smi::FromInt(23), isolate);
+    JSWeakCollection::Set(weakmap, symbol, smi, symbol->hash());
+  }
+  CHECK_EQ(3, EphemeronHashTable::cast(weakmap->table()).NumberOfElements());
 
   // Force a full GC.
   PreciseCollectAllGarbage();
   CHECK_EQ(0, NumberOfWeakCalls);
+  // Symbol key should be deleted.
   CHECK_EQ(2, EphemeronHashTable::cast(weakmap->table()).NumberOfElements());
   CHECK_EQ(
-      0, EphemeronHashTable::cast(weakmap->table()).NumberOfDeletedElements());
+      1, EphemeronHashTable::cast(weakmap->table()).NumberOfDeletedElements());
 
   // Make the global reference to the key weak.
   std::pair<Handle<Object>*, int> handle_and_id(&key, 1234);
@@ -103,7 +111,7 @@ TEST_F(WeakMapsTest, Weakness) {
   CHECK_EQ(1, NumberOfWeakCalls);
   CHECK_EQ(0, EphemeronHashTable::cast(weakmap->table()).NumberOfElements());
   CHECK_EQ(
-      2, EphemeronHashTable::cast(weakmap->table()).NumberOfDeletedElements());
+      3, EphemeronHashTable::cast(weakmap->table()).NumberOfDeletedElements());
 }
 
 TEST_F(WeakMapsTest, Shrinking) {
@@ -185,7 +193,8 @@ TEST_F(WeakMapsTest, WeakMapPromotionMarkCompact) {
 }
 
 TEST_F(WeakMapsTest, WeakMapScavenge) {
-  if (i::FLAG_single_generation || i::FLAG_stress_incremental_marking) return;
+  if (i::v8_flags.single_generation) return;
+  if (i::v8_flags.stress_incremental_marking) return;
   Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
   HandleScope scope(isolate);
@@ -203,7 +212,7 @@ TEST_F(WeakMapsTest, WeakMapScavenge) {
   CHECK(EphemeronHashTableContainsKey(
       EphemeronHashTable::cast(weakmap->table()), *object));
 
-  if (!FLAG_minor_mc) {
+  if (!v8_flags.minor_mc) {
     GcAndSweep(NEW_SPACE);
     CHECK(ObjectInYoungGeneration(*object));
     CHECK(!ObjectInYoungGeneration(weakmap->table()));
@@ -221,10 +230,10 @@ TEST_F(WeakMapsTest, WeakMapScavenge) {
 // Test that weak map values on an evacuation candidate which are not reachable
 // by other paths are correctly recorded in the slots buffer.
 TEST_F(WeakMapsTest, Regress2060a) {
-  if (!i::FLAG_compact) return;
-  if (i::FLAG_enable_third_party_heap) return;
-  FLAG_compact_on_every_full_gc = true;
-  FLAG_stress_concurrent_allocation = false;  // For SimulateFullSpace.
+  if (!i::v8_flags.compact) return;
+  if (i::v8_flags.enable_third_party_heap) return;
+  v8_flags.compact_on_every_full_gc = true;
+  v8_flags.stress_concurrent_allocation = false;  // For SimulateFullSpace.
   Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
   Heap* heap = isolate->heap();
@@ -245,7 +254,7 @@ TEST_F(WeakMapsTest, Regress2060a) {
       Handle<JSObject> object =
           factory->NewJSObject(function, AllocationType::kOld);
       CHECK(!Heap::InYoungGeneration(*object));
-      CHECK_IMPLIES(!FLAG_enable_third_party_heap,
+      CHECK_IMPLIES(!v8_flags.enable_third_party_heap,
                     !first_page->Contains(object->address()));
       int32_t hash = key->GetOrCreateHash(isolate).value();
       JSWeakCollection::Set(weakmap, key, object, hash);
@@ -253,19 +262,19 @@ TEST_F(WeakMapsTest, Regress2060a) {
   }
 
   // Force compacting garbage collection.
-  CHECK(FLAG_compact_on_every_full_gc);
+  CHECK(v8_flags.compact_on_every_full_gc);
   CollectAllGarbage();
 }
 
 // Test that weak map keys on an evacuation candidate which are reachable by
 // other strong paths are correctly recorded in the slots buffer.
 TEST_F(WeakMapsTest, Regress2060b) {
-  if (!i::FLAG_compact) return;
-  FLAG_compact_on_every_full_gc = true;
+  if (!i::v8_flags.compact) return;
+  v8_flags.compact_on_every_full_gc = true;
 #ifdef VERIFY_HEAP
-  FLAG_verify_heap = true;
+  v8_flags.verify_heap = true;
 #endif
-  FLAG_stress_concurrent_allocation = false;  // For SimulateFullSpace.
+  v8_flags.stress_concurrent_allocation = false;  // For SimulateFullSpace.
 
   Isolate* isolate = i_isolate();
   Factory* factory = isolate->factory();
@@ -283,7 +292,7 @@ TEST_F(WeakMapsTest, Regress2060b) {
   for (int i = 0; i < 32; i++) {
     keys[i] = factory->NewJSObject(function, AllocationType::kOld);
     CHECK(!Heap::InYoungGeneration(*keys[i]));
-    CHECK_IMPLIES(!FLAG_enable_third_party_heap,
+    CHECK_IMPLIES(!v8_flags.enable_third_party_heap,
                   !first_page->Contains(keys[i]->address()));
   }
   Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap();
@@ -295,14 +304,14 @@ TEST_F(WeakMapsTest, Regress2060b) {
 
   // Force compacting garbage collection. The subsequent collections are used
   // to verify that key references were actually updated.
-  CHECK(FLAG_compact_on_every_full_gc);
+  CHECK(v8_flags.compact_on_every_full_gc);
   CollectAllGarbage();
   CollectAllGarbage();
   CollectAllGarbage();
 }
 
 TEST_F(WeakMapsTest, Regress399527) {
-  if (!FLAG_incremental_marking) return;
+  if (!v8_flags.incremental_marking) return;
   v8::HandleScope scope(v8_isolate());
   Isolate* isolate = i_isolate();
   Heap* heap = isolate->heap();
diff --git a/deps/v8/test/unittests/objects/weaksets-unittest.cc b/deps/v8/test/unittests/objects/weaksets-unittest.cc
index e8cc95779561bc..b2a9df3a0cc380 100644
--- a/deps/v8/test/unittests/objects/weaksets-unittest.cc
+++ b/deps/v8/test/unittests/objects/weaksets-unittest.cc
@@ -71,7 +71,7 @@ static void WeakPointerCallback(const v8::WeakCallbackInfo<void>& data) {
 }
 
 TEST_F(WeakSetsTest, WeakSet_Weakness) {
-  FLAG_incremental_marking = false;
+  v8_flags.incremental_marking = false;
   Factory* factory = i_isolate()->factory();
   HandleScope scope(i_isolate());
   Handle<JSWeakSet> weakset = AllocateJSWeakSet();
@@ -156,10 +156,10 @@ TEST_F(WeakSetsTest, WeakSet_Shrinking) {
 // Test that weak set values on an evacuation candidate which are not reachable
 // by other paths are correctly recorded in the slots buffer.
 TEST_F(WeakSetsTest, WeakSet_Regress2060a) {
-  if (!i::FLAG_compact) return;
-  if (i::FLAG_enable_third_party_heap) return;
-  FLAG_compact_on_every_full_gc = true;
-  FLAG_stress_concurrent_allocation = false;  // For SimulateFullSpace.
+  if (!i::v8_flags.compact) return;
+  if (i::v8_flags.enable_third_party_heap) return;
+  v8_flags.compact_on_every_full_gc = true;
+  v8_flags.stress_concurrent_allocation = false;  // For SimulateFullSpace.
   Factory* factory = i_isolate()->factory();
   Heap* heap = i_isolate()->heap();
   HandleScope scope(i_isolate());
@@ -179,7 +179,7 @@ TEST_F(WeakSetsTest, WeakSet_Regress2060a) {
       Handle<JSObject> object =
           factory->NewJSObject(function, AllocationType::kOld);
       CHECK(!Heap::InYoungGeneration(*object));
-      CHECK_IMPLIES(!FLAG_enable_third_party_heap,
+      CHECK_IMPLIES(!v8_flags.enable_third_party_heap,
                     !first_page->Contains(object->address()));
       int32_t hash = key->GetOrCreateHash(i_isolate()).value();
       JSWeakCollection::Set(weakset, key, object, hash);
@@ -187,20 +187,20 @@ TEST_F(WeakSetsTest, WeakSet_Regress2060a) {
   }
 
   // Force compacting garbage collection.
-  CHECK(FLAG_compact_on_every_full_gc);
+  CHECK(v8_flags.compact_on_every_full_gc);
   CollectAllGarbage();
 }
 
 // Test that weak set keys on an evacuation candidate which are reachable by
 // other strong paths are correctly recorded in the slots buffer.
 TEST_F(WeakSetsTest, WeakSet_Regress2060b) {
-  if (!i::FLAG_compact) return;
-  if (i::FLAG_enable_third_party_heap) return;
-  FLAG_compact_on_every_full_gc = true;
+  if (!i::v8_flags.compact) return;
+  if (i::v8_flags.enable_third_party_heap) return;
+  v8_flags.compact_on_every_full_gc = true;
 #ifdef VERIFY_HEAP
-  FLAG_verify_heap = true;
+  v8_flags.verify_heap = true;
 #endif
-  FLAG_stress_concurrent_allocation = false;  // For SimulateFullSpace.
+  v8_flags.stress_concurrent_allocation = false;  // For SimulateFullSpace.
 
   Factory* factory = i_isolate()->factory();
   Heap* heap = i_isolate()->heap();
@@ -217,7 +217,7 @@ TEST_F(WeakSetsTest, WeakSet_Regress2060b) {
   for (int i = 0; i < 32; i++) {
     keys[i] = factory->NewJSObject(function, AllocationType::kOld);
     CHECK(!Heap::InYoungGeneration(*keys[i]));
-    CHECK_IMPLIES(!FLAG_enable_third_party_heap,
+    CHECK_IMPLIES(!v8_flags.enable_third_party_heap,
                   !first_page->Contains(keys[i]->address()));
   }
   Handle<JSWeakSet> weakset = AllocateJSWeakSet();
@@ -229,7 +229,7 @@ TEST_F(WeakSetsTest, WeakSet_Regress2060b) {
 
   // Force compacting garbage collection. The subsequent collections are used
   // to verify that key references were actually updated.
-  CHECK(FLAG_compact_on_every_full_gc);
+  CHECK(v8_flags.compact_on_every_full_gc);
   CollectAllGarbage();
   CollectAllGarbage();
   CollectAllGarbage();
diff --git a/deps/v8/test/unittests/parser/decls-unittest.cc b/deps/v8/test/unittests/parser/decls-unittest.cc
index ed35baf8ab1a44..8b12db12e3e554 100644
--- a/deps/v8/test/unittests/parser/decls-unittest.cc
+++ b/deps/v8/test/unittests/parser/decls-unittest.cc
@@ -466,7 +466,7 @@ TEST_F(DeclsTest, CrossScriptReferences) {
 }
 
 TEST_F(DeclsTest, CrossScriptReferences_Simple) {
-  i::FLAG_use_strict = true;
+  i::v8_flags.use_strict = true;
 
   HandleScope scope(isolate());
 
@@ -478,7 +478,7 @@ TEST_F(DeclsTest, CrossScriptReferences_Simple) {
 }
 
 TEST_F(DeclsTest, CrossScriptReferences_Simple2) {
-  i::FLAG_use_strict = true;
+  i::v8_flags.use_strict = true;
 
   HandleScope scope(isolate());
 
@@ -657,7 +657,7 @@ TEST_F(DeclsTest, CrossScriptReferencesHarmonyRegress) {
 }
 
 TEST_F(DeclsTest, GlobalLexicalOSR) {
-  i::FLAG_use_strict = true;
+  i::v8_flags.use_strict = true;
 
   HandleScope scope(isolate());
   SimpleContext context;
@@ -680,7 +680,7 @@ TEST_F(DeclsTest, GlobalLexicalOSR) {
 }
 
 TEST_F(DeclsTest, CrossScriptConflicts) {
-  i::FLAG_use_strict = true;
+  i::v8_flags.use_strict = true;
 
   HandleScope scope(isolate());
 
@@ -805,7 +805,7 @@ TEST_F(DeclsTest, CrossScriptStaticLookupUndeclared) {
 }
 
 TEST_F(DeclsTest, CrossScriptLoadICs) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
   HandleScope handle_scope(isolate());
 
@@ -863,7 +863,7 @@ TEST_F(DeclsTest, CrossScriptLoadICs) {
 }
 
 TEST_F(DeclsTest, CrossScriptStoreICs) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
   HandleScope handle_scope(isolate());
 
@@ -932,7 +932,7 @@ TEST_F(DeclsTest, CrossScriptStoreICs) {
 }
 
 TEST_F(DeclsTest, CrossScriptAssignmentToConst) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
   HandleScope handle_scope(isolate());
 
@@ -953,7 +953,7 @@ TEST_F(DeclsTest, CrossScriptAssignmentToConst) {
 }
 
 TEST_F(DeclsTest, Regress425510) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
   HandleScope handle_scope(isolate());
 
@@ -969,7 +969,7 @@ TEST_F(DeclsTest, Regress425510) {
 }
 
 TEST_F(DeclsTest, Regress3941) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
   HandleScope handle_scope(isolate());
 
@@ -1009,7 +1009,7 @@ TEST_F(DeclsTest, Regress3941) {
 }
 
 TEST_F(DeclsTest, Regress3941_Reads) {
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
   HandleScope handle_scope(isolate());
 
diff --git a/deps/v8/test/unittests/parser/parse-decision-unittest.cc b/deps/v8/test/unittests/parser/parse-decision-unittest.cc
index 67c217d24fdf82..8ac2bf23c03042 100644
--- a/deps/v8/test/unittests/parser/parse-decision-unittest.cc
+++ b/deps/v8/test/unittests/parser/parse-decision-unittest.cc
@@ -55,7 +55,7 @@ void GetTopLevelFunctionInfo(
 }  // anonymous namespace
 
 TEST_F(ParseDecisionTest, GetTopLevelFunctionInfo) {
-  if (!FLAG_lazy) return;
+  if (!v8_flags.lazy) return;
 
   HandleScope scope(i_isolate());
 
@@ -69,7 +69,7 @@ TEST_F(ParseDecisionTest, GetTopLevelFunctionInfo) {
 }
 
 TEST_F(ParseDecisionTest, EagerlyCompileImmediateUseFunctions) {
-  if (!FLAG_lazy) return;
+  if (!v8_flags.lazy) return;
 
   HandleScope scope(i_isolate());
 
@@ -100,7 +100,7 @@ TEST_F(ParseDecisionTest, EagerlyCompileImmediateUseFunctions) {
 }
 
 TEST_F(ParseDecisionTest, CommaFunctionSequence) {
-  if (!FLAG_lazy) return;
+  if (!v8_flags.lazy) return;
 
   HandleScope scope(i_isolate());
 
diff --git a/deps/v8/test/unittests/parser/parsing-unittest.cc b/deps/v8/test/unittests/parser/parsing-unittest.cc
index 965a628571ae14..ac53e538fec9c1 100644
--- a/deps/v8/test/unittests/parser/parsing-unittest.cc
+++ b/deps/v8/test/unittests/parser/parsing-unittest.cc
@@ -51,7 +51,7 @@ enum ParserFlag {
 enum ParserSyncTestResult { kSuccessOrError, kSuccess, kError };
 
 void SetGlobalFlags(base::EnumSet<ParserFlag> flags) {
-  i::FLAG_allow_natives_syntax = flags.contains(kAllowNatives);
+  i::v8_flags.allow_natives_syntax = flags.contains(kAllowNatives);
 }
 
 void SetParserFlags(i::UnoptimizedCompileFlags* compile_flags,
@@ -226,7 +226,7 @@ class ParsingTest : public TestWithContextAndZone {
     i::UnoptimizedCompileFlags compile_flags =
         i::UnoptimizedCompileFlags::ForToplevelCompile(
             isolate, true, LanguageMode::kSloppy, REPLMode::kNo,
-            ScriptType::kClassic, FLAG_lazy);
+            ScriptType::kClassic, v8_flags.lazy);
     SetParserFlags(&compile_flags, flags);
     compile_flags.set_is_module(is_module);
 
@@ -3122,7 +3122,7 @@ TEST_F(ParsingTest, InvalidLeftHandSide) {
 
 TEST_F(ParsingTest, FuncNameInferrerBasic) {
   // Tests that function names are inferred properly.
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
 
   RunJS(
       "var foo1 = function() {}; "
@@ -3160,7 +3160,7 @@ TEST_F(ParsingTest, FuncNameInferrerBasic) {
 TEST_F(ParsingTest, FuncNameInferrerTwoByte) {
   // Tests function name inferring in cases where some parts of the inferred
   // function name are two-byte strings.
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate* isolate = v8_isolate();
 
   uint16_t* two_byte_source = AsciiToTwoByteString(
@@ -3183,7 +3183,7 @@ TEST_F(ParsingTest, FuncNameInferrerTwoByte) {
 TEST_F(ParsingTest, FuncNameInferrerEscaped) {
   // The same as FuncNameInferrerTwoByte, except that we express the two-byte
   // character as a Unicode escape.
-  i::FLAG_allow_natives_syntax = true;
+  i::v8_flags.allow_natives_syntax = true;
   v8::Isolate* isolate = v8_isolate();
 
   uint16_t* two_byte_source = AsciiToTwoByteString(
@@ -4164,7 +4164,7 @@ i::Scope* DeserializeFunctionScope(i::Isolate* isolate, i::Zone* zone,
 }  // namespace
 
 TEST_F(ParsingTest, AsmModuleFlag) {
-  i::FLAG_validate_asm = false;
+  i::v8_flags.validate_asm = false;
   i::Isolate* isolate = i_isolate();
 
   const char* src =
@@ -4211,8 +4211,8 @@ TEST_F(ParsingTest, SloppyModeUseCount) {
   int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
   global_use_counts = use_counts;
   // Force eager parsing (preparser doesn't update use counts).
-  i::FLAG_lazy = false;
-  i::FLAG_lazy_streaming = false;
+  i::v8_flags.lazy = false;
+  i::v8_flags.lazy_streaming = false;
   v8_isolate()->SetUseCounterCallback(MockUseCounterCallback);
   RunJS("function bar() { var baz = 1; }");
   CHECK_LT(0, use_counts[v8::Isolate::kSloppyMode]);
@@ -4222,8 +4222,8 @@ TEST_F(ParsingTest, SloppyModeUseCount) {
 TEST_F(ParsingTest, BothModesUseCount) {
   int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
   global_use_counts = use_counts;
-  i::FLAG_lazy = false;
-  i::FLAG_lazy_streaming = false;
+  i::v8_flags.lazy = false;
+  i::v8_flags.lazy_streaming = false;
   v8_isolate()->SetUseCounterCallback(MockUseCounterCallback);
   RunJS("function bar() { 'use strict'; var baz = 1; }");
   CHECK_LT(0, use_counts[v8::Isolate::kSloppyMode]);
@@ -4647,7 +4647,7 @@ TEST_F(ParsingTest, ImportExpressionSuccess) {
 }
 
 TEST_F(ParsingTest, ImportExpressionWithImportAssertionSuccess) {
-  i::FLAG_harmony_import_assertions = true;
+  i::v8_flags.harmony_import_assertions = true;
 
   // clang-format off
   const char* context_data[][2] = {
@@ -4701,9 +4701,8 @@ TEST_F(ParsingTest, ImportExpressionErrors) {
       "import{",
       "import{x",
       "import{x}",
-      "import(x, y)",
+      "import(x, y, z)",
       "import(...y)",
-      "import(x,)",
       "import(,)",
       "import(,y)",
       "import(;)",
@@ -4778,7 +4777,7 @@ TEST_F(ParsingTest, ImportExpressionErrors) {
 
 TEST_F(ParsingTest, ImportExpressionWithImportAssertionErrors) {
   {
-    i::FLAG_harmony_import_assertions = true;
+    i::v8_flags.harmony_import_assertions = true;
 
     // clang-format off
     const char* context_data[][2] = {
@@ -4880,7 +4879,7 @@ TEST_F(ParsingTest, BasicImportAssertionParsing) {
   };
   // clang-format on
 
-  i::FLAG_harmony_import_assertions = true;
+  i::v8_flags.harmony_import_assertions = true;
   i::Isolate* isolate = i_isolate();
   i::Factory* factory = isolate->factory();
 
@@ -4947,7 +4946,7 @@ TEST_F(ParsingTest, ImportAssertionParsingErrors) {
   };
   // clang-format on
 
-  i::FLAG_harmony_import_assertions = true;
+  i::v8_flags.harmony_import_assertions = true;
   i::Isolate* isolate = i_isolate();
   i::Factory* factory = isolate->factory();
 
@@ -7956,7 +7955,7 @@ TEST_F(ParsingTest, ModuleParsingInternals) {
 }
 
 TEST_F(ParsingTest, ModuleParsingInternalsWithImportAssertions) {
-  i::FLAG_harmony_import_assertions = true;
+  i::v8_flags.harmony_import_assertions = true;
   i::Isolate* isolate = i_isolate();
   i::Factory* factory = isolate->factory();
   isolate->stack_guard()->SetStackLimit(base::Stack::GetCurrentStackPosition() -
@@ -8049,7 +8048,7 @@ TEST_F(ParsingTest, ModuleParsingInternalsWithImportAssertions) {
 }
 
 TEST_F(ParsingTest, ModuleParsingModuleRequestOrdering) {
-  i::FLAG_harmony_import_assertions = true;
+  i::v8_flags.harmony_import_assertions = true;
   i::Isolate* isolate = i_isolate();
   i::Factory* factory = isolate->factory();
   isolate->stack_guard()->SetStackLimit(base::Stack::GetCurrentStackPosition() -
@@ -8317,7 +8316,7 @@ TEST_F(ParsingTest, ModuleParsingModuleRequestOrdering) {
 }
 
 TEST_F(ParsingTest, ModuleParsingImportAssertionKeySorting) {
-  i::FLAG_harmony_import_assertions = true;
+  i::v8_flags.harmony_import_assertions = true;
   i::Isolate* isolate = i_isolate();
   i::Factory* factory = isolate->factory();
   isolate->stack_guard()->SetStackLimit(base::Stack::GetCurrentStackPosition() -
diff --git a/deps/v8/test/unittests/parser/scanner-streams-unittest.cc b/deps/v8/test/unittests/parser/scanner-streams-unittest.cc
index c8f697c87cbba2..41355df10ff9d5 100644
--- a/deps/v8/test/unittests/parser/scanner-streams-unittest.cc
+++ b/deps/v8/test/unittests/parser/scanner-streams-unittest.cc
@@ -760,8 +760,8 @@ TEST_F(ScannerStreamsTest, TestOverlongAndInvalidSequences) {
 
 TEST_F(ScannerStreamsTest, RelocatingCharacterStream) {
   // This test relies on the invariant that the scavenger will move objects
-  if (i::FLAG_single_generation) return;
-  i::FLAG_manual_evacuation_candidates_selection = true;
+  if (i::v8_flags.single_generation) return;
+  i::v8_flags.manual_evacuation_candidates_selection = true;
   v8::internal::ManualGCScope manual_gc_scope(i_isolate());
   v8::HandleScope scope(isolate());
 
@@ -798,8 +798,8 @@ TEST_F(ScannerStreamsTest, RelocatingCharacterStream) {
 
 TEST_F(ScannerStreamsTest, RelocatingUnbufferedCharacterStream) {
   // This test relies on the invariant that the scavenger will move objects
-  if (i::FLAG_single_generation) return;
-  i::FLAG_manual_evacuation_candidates_selection = true;
+  if (i::v8_flags.single_generation) return;
+  i::v8_flags.manual_evacuation_candidates_selection = true;
   v8::internal::ManualGCScope manual_gc_scope(i_isolate());
   v8::HandleScope scope(isolate());
 
diff --git a/deps/v8/test/unittests/regexp/regexp-unittest.cc b/deps/v8/test/unittests/regexp/regexp-unittest.cc
index f4e0f9577633f5..065eea336f4eb2 100644
--- a/deps/v8/test/unittests/regexp/regexp-unittest.cc
+++ b/deps/v8/test/unittests/regexp/regexp-unittest.cc
@@ -576,10 +576,10 @@ static void Execute(const char* input, bool multiline, bool unicode,
 #ifdef DEBUG
 
 TEST_F(RegExpTest, ParsePossessiveRepetition) {
-  bool old_flag_value = FLAG_regexp_possessive_quantifier;
+  bool old_flag_value = v8_flags.regexp_possessive_quantifier;
 
   // Enable possessive quantifier syntax.
-  FLAG_regexp_possessive_quantifier = true;
+  v8_flags.regexp_possessive_quantifier = true;
 
   CheckParseEq("a*+", "(# 0 - p 'a')");
   CheckParseEq("a++", "(# 1 - p 'a')");
@@ -588,7 +588,7 @@ TEST_F(RegExpTest, ParsePossessiveRepetition) {
   CheckParseEq("za{10,20}+b", "(: 'z' (# 10 20 p 'a') 'b')");
 
   // Disable possessive quantifier syntax.
-  FLAG_regexp_possessive_quantifier = false;
+  v8_flags.regexp_possessive_quantifier = false;
 
   CHECK_PARSE_ERROR("a*+");
   CHECK_PARSE_ERROR("a++");
@@ -596,7 +596,7 @@ TEST_F(RegExpTest, ParsePossessiveRepetition) {
   CHECK_PARSE_ERROR("a{10,20}+");
   CHECK_PARSE_ERROR("a{10,20}+b");
 
-  FLAG_regexp_possessive_quantifier = old_flag_value;
+  v8_flags.regexp_possessive_quantifier = old_flag_value;
 }
 
 #endif
@@ -1783,12 +1783,12 @@ TEST_F(RegExpTest, PeepholeNoChange) {
 
   Handle<String> source = factory->NewStringFromStaticChars("^foo");
 
-  i::FLAG_regexp_peephole_optimization = false;
+  v8_flags.regexp_peephole_optimization = false;
   Handle<ByteArray> array = Handle<ByteArray>::cast(orig.GetCode(source));
   int length = array->length();
   byte* byte_array = array->GetDataStartAddress();
 
-  i::FLAG_regexp_peephole_optimization = true;
+  v8_flags.regexp_peephole_optimization = true;
   Handle<ByteArray> array_optimized =
       Handle<ByteArray>::cast(opt.GetCode(source));
   byte* byte_array_optimized = array_optimized->GetDataStartAddress();
@@ -1818,11 +1818,11 @@ TEST_F(RegExpTest, PeepholeSkipUntilChar) {
 
   Handle<String> source = factory->NewStringFromStaticChars("dummy");
 
-  i::FLAG_regexp_peephole_optimization = false;
+  v8_flags.regexp_peephole_optimization = false;
   Handle<ByteArray> array = Handle<ByteArray>::cast(orig.GetCode(source));
   int length = array->length();
 
-  i::FLAG_regexp_peephole_optimization = true;
+  v8_flags.regexp_peephole_optimization = true;
   Handle<ByteArray> array_optimized =
       Handle<ByteArray>::cast(opt.GetCode(source));
   int length_optimized = array_optimized->length();
@@ -1871,11 +1871,11 @@ TEST_F(RegExpTest, PeepholeSkipUntilBitInTable) {
 
   Handle<String> source = factory->NewStringFromStaticChars("dummy");
 
-  i::FLAG_regexp_peephole_optimization = false;
+  v8_flags.regexp_peephole_optimization = false;
   Handle<ByteArray> array = Handle<ByteArray>::cast(orig.GetCode(source));
   int length = array->length();
 
-  i::FLAG_regexp_peephole_optimization = true;
+  v8_flags.regexp_peephole_optimization = true;
   Handle<ByteArray> array_optimized =
       Handle<ByteArray>::cast(opt.GetCode(source));
   int length_optimized = array_optimized->length();
@@ -1918,11 +1918,11 @@ TEST_F(RegExpTest, PeepholeSkipUntilCharPosChecked) {
 
   Handle<String> source = factory->NewStringFromStaticChars("dummy");
 
-  i::FLAG_regexp_peephole_optimization = false;
+  v8_flags.regexp_peephole_optimization = false;
   Handle<ByteArray> array = Handle<ByteArray>::cast(orig.GetCode(source));
   int length = array->length();
 
-  i::FLAG_regexp_peephole_optimization = true;
+  v8_flags.regexp_peephole_optimization = true;
   Handle<ByteArray> array_optimized =
       Handle<ByteArray>::cast(opt.GetCode(source));
   int length_optimized = array_optimized->length();
@@ -1966,11 +1966,11 @@ TEST_F(RegExpTest, PeepholeSkipUntilCharAnd) {
 
   Handle<String> source = factory->NewStringFromStaticChars("dummy");
 
-  i::FLAG_regexp_peephole_optimization = false;
+  v8_flags.regexp_peephole_optimization = false;
   Handle<ByteArray> array = Handle<ByteArray>::cast(orig.GetCode(source));
   int length = array->length();
 
-  i::FLAG_regexp_peephole_optimization = true;
+  v8_flags.regexp_peephole_optimization = true;
   Handle<ByteArray> array_optimized =
       Handle<ByteArray>::cast(opt.GetCode(source));
   int length_optimized = array_optimized->length();
@@ -2014,11 +2014,11 @@ TEST_F(RegExpTest, PeepholeSkipUntilCharOrChar) {
 
   Handle<String> source = factory->NewStringFromStaticChars("dummy");
 
-  i::FLAG_regexp_peephole_optimization = false;
+  v8_flags.regexp_peephole_optimization = false;
   Handle<ByteArray> array = Handle<ByteArray>::cast(orig.GetCode(source));
   int length = array->length();
 
-  i::FLAG_regexp_peephole_optimization = true;
+  v8_flags.regexp_peephole_optimization = true;
   Handle<ByteArray> array_optimized =
       Handle<ByteArray>::cast(opt.GetCode(source));
   int length_optimized = array_optimized->length();
@@ -2073,11 +2073,11 @@ TEST_F(RegExpTest, PeepholeSkipUntilGtOrNotBitInTable) {
 
   Handle<String> source = factory->NewStringFromStaticChars("dummy");
 
-  i::FLAG_regexp_peephole_optimization = false;
+  v8_flags.regexp_peephole_optimization = false;
   Handle<ByteArray> array = Handle<ByteArray>::cast(orig.GetCode(source));
   int length = array->length();
 
-  i::FLAG_regexp_peephole_optimization = true;
+  v8_flags.regexp_peephole_optimization = true;
   Handle<ByteArray> array_optimized =
       Handle<ByteArray>::cast(opt.GetCode(source));
   int length_optimized = array_optimized->length();
@@ -2152,7 +2152,7 @@ TEST_F(RegExpTest, PeepholeLabelFixupsInside) {
 
   Handle<String> source = factory->NewStringFromStaticChars("dummy");
 
-  i::FLAG_regexp_peephole_optimization = false;
+  v8_flags.regexp_peephole_optimization = false;
   Handle<ByteArray> array = Handle<ByteArray>::cast(orig.GetCode(source));
 
   for (int label_idx = 0; label_idx < 3; label_idx++) {
@@ -2162,7 +2162,7 @@ TEST_F(RegExpTest, PeepholeLabelFixupsInside) {
     }
   }
 
-  i::FLAG_regexp_peephole_optimization = true;
+  v8_flags.regexp_peephole_optimization = true;
   Handle<ByteArray> array_optimized =
       Handle<ByteArray>::cast(opt.GetCode(source));
 
@@ -2258,7 +2258,7 @@ TEST_F(RegExpTest, PeepholeLabelFixupsComplex) {
 
   Handle<String> source = factory->NewStringFromStaticChars("dummy");
 
-  i::FLAG_regexp_peephole_optimization = false;
+  v8_flags.regexp_peephole_optimization = false;
   Handle<ByteArray> array = Handle<ByteArray>::cast(orig.GetCode(source));
 
   for (int label_idx = 0; label_idx < 4; label_idx++) {
@@ -2268,7 +2268,7 @@ TEST_F(RegExpTest, PeepholeLabelFixupsComplex) {
     }
   }
 
-  i::FLAG_regexp_peephole_optimization = true;
+  v8_flags.regexp_peephole_optimization = true;
   Handle<ByteArray> array_optimized =
       Handle<ByteArray>::cast(opt.GetCode(source));
 
@@ -2300,7 +2300,7 @@ TEST_F(RegExpTest, PeepholeLabelFixupsComplex) {
 }
 
 TEST_F(RegExpTestWithContext, UnicodePropertyEscapeCodeSize) {
-  i::FlagScope<bool> f(&v8::internal::FLAG_regexp_tier_up, false);
+  FlagScope<bool> f(&v8_flags.regexp_tier_up, false);
 
   v8::HandleScope scope(isolate());
   i::Handle<i::JSRegExp> re = Utils::OpenHandle(
@@ -2347,8 +2347,8 @@ void ReenterRegExp(v8::Isolate* isolate, void* data) {
 
 // Tests reentrant irregexp calls.
 TEST_F(RegExpTestWithContext, RegExpInterruptReentrantExecution) {
-  CHECK(!i::FLAG_jitless);
-  i::FLAG_regexp_tier_up = false;  // Enter irregexp, not the interpreter.
+  CHECK(!v8_flags.jitless);
+  v8_flags.regexp_tier_up = false;  // Enter irregexp, not the interpreter.
 
   v8::HandleScope scope(isolate());
 
diff --git a/deps/v8/test/unittests/runtime/runtime-debug-unittest.cc b/deps/v8/test/unittests/runtime/runtime-debug-unittest.cc
index a73795bb401d7e..6e99365335d7e4 100644
--- a/deps/v8/test/unittests/runtime/runtime-debug-unittest.cc
+++ b/deps/v8/test/unittests/runtime/runtime-debug-unittest.cc
@@ -7,6 +7,7 @@
 #include "include/v8-object.h"
 #include "include/v8-template.h"
 #include "src/api/api.h"
+#include "src/objects/js-array-inl.h"
 #include "src/objects/objects-inl.h"
 #include "src/runtime/runtime.h"
 #include "test/unittests/test-utils.h"
@@ -56,6 +57,27 @@ TEST_F(RuntimeTest, DoesNotReturnPrototypeWhenInacessible) {
   EXPECT_EQ(0u, result->Length());
 }
 
+#if V8_ENABLE_WEBASSEMBLY
+TEST_F(RuntimeTest, WasmTableWithoutInstance) {
+  uint32_t initial = 1u;
+  bool has_maximum = false;
+  uint32_t maximum = std::numeric_limits<uint32_t>::max();
+  Handle<FixedArray> elements;
+  Handle<WasmTableObject> table = WasmTableObject::New(
+      i_isolate(), Handle<WasmInstanceObject>(), wasm::kWasmAnyRef, initial,
+      has_maximum, maximum, &elements, i_isolate()->factory()->null_value());
+  MaybeHandle<JSArray> result =
+      Runtime::GetInternalProperties(i_isolate(), table);
+  ASSERT_FALSE(result.is_null());
+  // ["[[Prototype]]", <map>, "[[Entries]]", <entries>]
+  ASSERT_EQ(4, result.ToHandleChecked()->elements().length());
+  Handle<Object> entries =
+      FixedArrayBase::GetElement(i_isolate(), result.ToHandleChecked(), 3)
+          .ToHandleChecked();
+  EXPECT_EQ(1, JSArray::cast(*entries).elements().length());
+}
+#endif
+
 }  // namespace
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/test/unittests/strings/unicode-unittest.cc b/deps/v8/test/unittests/strings/unicode-unittest.cc
index d32ed8871f5bb1..5d647279732aaa 100644
--- a/deps/v8/test/unittests/strings/unicode-unittest.cc
+++ b/deps/v8/test/unittests/strings/unicode-unittest.cc
@@ -499,7 +499,8 @@ class UnicodeWithGCTest : public TestWithHeapInternals {};
 
 #define GC_INSIDE_NEW_STRING_FROM_UTF8_SUB_STRING(NAME, STRING)                \
   TEST_F(UnicodeWithGCTest, GCInsideNewStringFromUtf8SubStringWith##NAME) {    \
-    FLAG_stress_concurrent_allocation = false; /* For SimulateFullSpace. */    \
+    v8_flags.stress_concurrent_allocation =                                    \
+        false; /* For SimulateFullSpace. */                                    \
     v8::HandleScope scope(reinterpret_cast<v8::Isolate*>(isolate()));          \
     Factory* factory = isolate()->factory();                                   \
     /* Length must be bigger than the buffer size of the Utf8Decoder. */       \
@@ -510,7 +511,7 @@ class UnicodeWithGCTest : public TestWithHeapInternals {};
             ->NewStringFromOneByte(v8::base::Vector<const uint8_t>(            \
                 reinterpret_cast<const uint8_t*>(buf), len))                   \
             .ToHandleChecked();                                                \
-    if (FLAG_single_generation) {                                              \
+    if (v8_flags.single_generation) {                                          \
       CHECK(!Heap::InYoungGeneration(*main_string));                           \
       SimulateFullSpace(heap()->old_space());                                  \
     } else {                                                                   \
diff --git a/deps/v8/test/unittests/tasks/background-compile-task-unittest.cc b/deps/v8/test/unittests/tasks/background-compile-task-unittest.cc
index 5ad5279a72fee9..1dba91de98fc69 100644
--- a/deps/v8/test/unittests/tasks/background-compile-task-unittest.cc
+++ b/deps/v8/test/unittests/tasks/background-compile-task-unittest.cc
@@ -50,11 +50,12 @@ class BackgroundCompileTaskTest : public TestWithNativeContext {
 
   BackgroundCompileTask* NewBackgroundCompileTask(
       Isolate* isolate, Handle<SharedFunctionInfo> shared,
-      size_t stack_size = FLAG_stack_size) {
+      size_t stack_size = v8_flags.stack_size) {
     return new BackgroundCompileTask(
         isolate, shared, test::SourceCharacterStreamForShared(isolate, shared),
         isolate->counters()->worker_thread_runtime_call_stats(),
-        isolate->counters()->compile_function_on_background(), FLAG_stack_size);
+        isolate->counters()->compile_function_on_background(),
+        v8_flags.stack_size);
   }
 
  private:
diff --git a/deps/v8/test/unittests/temporal/temporal-parser-unittest.cc b/deps/v8/test/unittests/temporal/temporal-parser-unittest.cc
index 6277c7a3f1da0e..319bfd012ef8ca 100644
--- a/deps/v8/test/unittests/temporal/temporal-parser-unittest.cc
+++ b/deps/v8/test/unittests/temporal/temporal-parser-unittest.cc
@@ -158,15 +158,30 @@ class TemporalParserTest : public TestWithIsolate {
     }
   }
 
-  void VerifyParseTemporalCalendarStringSuccess(
-      const char* str, const std::string& calendar_name) {
+  void VerifyParseCalendarNameSuccess(const char* str) {
     Handle<String> input = MakeString(str);
     base::Optional<ParsedISO8601Result> result =
-        TemporalParser::ParseTemporalCalendarString(i_isolate(), input);
+        TemporalParser::ParseCalendarName(i_isolate(), input);
     CHECK(result.has_value());
     ParsedISO8601Result actual = *result;
-    CheckCalendar(i_isolate(), input, actual.calendar_name_start,
-                  actual.calendar_name_length, calendar_name);
+    // For ParseCalendarName, we just validate the input fully match
+    // CalendarName, therefore, the test pass if the start is 0 and
+    // the calendar_name_length is the same as the length of the input.
+    CHECK_EQ(actual.calendar_name_start, 0);
+    CHECK_EQ(actual.calendar_name_length, input->length());
+  }
+
+  void VerifyParseTimeZoneIdentifierSuccess(const char* str) {
+    Handle<String> input = MakeString(str);
+    base::Optional<ParsedISO8601Result> result =
+        TemporalParser::ParseTimeZoneIdentifier(i_isolate(), input);
+    CHECK(result.has_value());
+    ParsedISO8601Result actual = *result;
+    // For ParseTimeZoneIdentifier, we just validate the input fully match
+    // TimeZoneIdentifier, therefore, the test pass if the start is 0 and
+    // the tzi_name_length is the same as the length of the input.
+    CHECK_EQ(actual.tzi_name_start, 0);
+    CHECK_EQ(actual.tzi_name_length, input->length());
   }
 
   void VerifyParseTemporalTimeStringSuccess(const char* str, int32_t time_hour,
@@ -1601,47 +1616,6 @@ TEST_F(TemporalParserTest, TemporalZonedDateTimeStringIllegal) {
   VERIFY_PARSE_FAIL_ON_ZONED_DATE_TIME(TemporalZonedDateTimeString);
 }
 
-TEST_F(TemporalParserTest, TemporalCalendarStringSuccess) {
-  // CalendarName
-  VerifyParseTemporalCalendarStringSuccess("chinese", "chinese");
-  VerifyParseTemporalCalendarStringSuccess("roc", "roc");
-  VerifyParseTemporalCalendarStringSuccess("indian", "indian");
-  VerifyParseTemporalCalendarStringSuccess("persian", "persian");
-  VerifyParseTemporalCalendarStringSuccess("abcd-efghi", "abcd-efghi");
-  VerifyParseTemporalCalendarStringSuccess("abcd-efghi", "abcd-efghi");
-  VerifyParseTemporalCalendarStringSuccess(
-      "a2345678-b2345678-c2345678-d7654321",
-      "a2345678-b2345678-c2345678-d7654321");
-  // TemporalInstantString
-  VerifyParseTemporalCalendarStringSuccess("2021-11-08z[ABCD]", "");
-  // CalendarDateTime
-  VerifyParseTemporalCalendarStringSuccess("2021-11-08[u-ca=chinese]",
-                                           "chinese");
-  VerifyParseTemporalCalendarStringSuccess("2021-11-08[ABCDEFG][u-ca=chinese]",
-                                           "chinese");
-  VerifyParseTemporalCalendarStringSuccess(
-      "2021-11-08[ABCDEFG/hijklmn][u-ca=roc]", "roc");
-  // Time
-  VerifyParseTemporalCalendarStringSuccess("23:45:59", "");
-  // DateSpecYearMonth
-  VerifyParseTemporalCalendarStringSuccess("2021-12", "");
-  // DateSpecMonthDay
-  VerifyParseTemporalCalendarStringSuccess("--12-31", "");
-  VerifyParseTemporalCalendarStringSuccess("12-31", "");
-  VerifyParseTemporalCalendarStringSuccess("--1231", "");
-}
-
-TEST_F(TemporalParserTest, TemporalCalendarStringIllegal) {
-  VERIFY_PARSE_FAIL(TemporalCalendarString, "20210304[u-ca=]");
-  VERIFY_PARSE_FAIL(TemporalCalendarString, "20210304[u-ca=a]");
-  VERIFY_PARSE_FAIL(TemporalCalendarString, "20210304[u-ca=ab]");
-  VERIFY_PARSE_FAIL(TemporalCalendarString, "20210304[u-ca=abcdef-ab]");
-  VERIFY_PARSE_FAIL(TemporalCalendarString, "20210304[u-ca=abcdefghijkl]");
-  // It is a Syntax Error if DateExtendedYear is "-000000"
-  VERIFY_PARSE_FAIL(TemporalCalendarString, "-0000000304[u-ca=abcdef-ab]");
-  VERIFY_PARSE_FAIL(TemporalCalendarString, "\u22120000000304[u-ca=abcdef-ab]");
-}
-
 constexpr int64_t empty = ParsedISO8601Duration::kEmpty;
 
 // Test basic cases.
@@ -2060,5 +2034,241 @@ TEST_F(TemporalParserTest, TimeZoneNumericUTCOffsetIllegal) {
   VERIFY_PARSE_FAIL(TimeZoneNumericUTCOffset, "+073401,9876543219");
 }
 
+TEST_F(TemporalParserTest, TimeZoneIdentifierSucccess) {
+  // TimeZoneIANAName:
+  //  Etc/GMT ASCIISign UnpaddedHour:
+  VerifyParseTimeZoneIdentifierSuccess("Etc/GMT+0");
+  VerifyParseTimeZoneIdentifierSuccess("Etc/GMT+1");
+  VerifyParseTimeZoneIdentifierSuccess("Etc/GMT+11");
+  VerifyParseTimeZoneIdentifierSuccess("Etc/GMT+23");
+  //  TimeZoneIANANameTail
+  VerifyParseTimeZoneIdentifierSuccess("_");
+  VerifyParseTimeZoneIdentifierSuccess("_/_");
+  VerifyParseTimeZoneIdentifierSuccess("a.");
+  VerifyParseTimeZoneIdentifierSuccess("a..");
+  VerifyParseTimeZoneIdentifierSuccess("a_");
+  VerifyParseTimeZoneIdentifierSuccess("a-");
+  VerifyParseTimeZoneIdentifierSuccess("a-b");
+  VerifyParseTimeZoneIdentifierSuccess("a-b/c");
+  VerifyParseTimeZoneIdentifierSuccess("abcdefghijklmn");
+  VerifyParseTimeZoneIdentifierSuccess("abcdefghijklmn/ABCDEFGHIJKLMN");
+
+  //  TimeZoneIANALegacyName
+  VerifyParseTimeZoneIdentifierSuccess("Etc/GMT0");
+  VerifyParseTimeZoneIdentifierSuccess("GMT0");
+  VerifyParseTimeZoneIdentifierSuccess("GMT-0");
+  VerifyParseTimeZoneIdentifierSuccess("GMT+0");
+  VerifyParseTimeZoneIdentifierSuccess("EST5EDT");
+  VerifyParseTimeZoneIdentifierSuccess("CST6CDT");
+  VerifyParseTimeZoneIdentifierSuccess("MST7MDT");
+  VerifyParseTimeZoneIdentifierSuccess("PST8PDT");
+
+  // TimeZoneUTCOffsetName
+  //  Sign Hour
+  VerifyParseTimeZoneIdentifierSuccess("+00");
+  VerifyParseTimeZoneIdentifierSuccess("+23");
+  VerifyParseTimeZoneIdentifierSuccess("-00");
+  VerifyParseTimeZoneIdentifierSuccess("-23");
+  VerifyParseTimeZoneIdentifierSuccess("\u221200");
+  VerifyParseTimeZoneIdentifierSuccess("\u221223");
+  //  Sign Hour : MinuteSecond
+  VerifyParseTimeZoneIdentifierSuccess("+00:00");
+  VerifyParseTimeZoneIdentifierSuccess("+23:59");
+  VerifyParseTimeZoneIdentifierSuccess("-00:00");
+  VerifyParseTimeZoneIdentifierSuccess("-23:59");
+  VerifyParseTimeZoneIdentifierSuccess("\u221200:00");
+  VerifyParseTimeZoneIdentifierSuccess("\u221223:59");
+  //  Sign Hour MinuteSecond
+  VerifyParseTimeZoneIdentifierSuccess("+0000");
+  VerifyParseTimeZoneIdentifierSuccess("+2359");
+  VerifyParseTimeZoneIdentifierSuccess("-0000");
+  VerifyParseTimeZoneIdentifierSuccess("-2359");
+  VerifyParseTimeZoneIdentifierSuccess("\u22120000");
+  VerifyParseTimeZoneIdentifierSuccess("\u22122359");
+
+  //  Sign Hour : MinuteSecond : MinuteSecond Fractionopt
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00");
+  VerifyParseTimeZoneIdentifierSuccess("+23:59:59");
+  VerifyParseTimeZoneIdentifierSuccess("-00:00:00");
+  VerifyParseTimeZoneIdentifierSuccess("-23:59:59");
+  VerifyParseTimeZoneIdentifierSuccess("\u221200:00:00");
+  VerifyParseTimeZoneIdentifierSuccess("\u221223:59:59");
+
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00.0");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00,0");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00.10");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00,01");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00.012");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00,010");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00.0123");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00,0120");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00.01234");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00,01230");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00.012345");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00,012340");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00.0123450");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00,0123456");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00,01234567");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00.01234560");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00,012345678");
+  VerifyParseTimeZoneIdentifierSuccess("+00:00:00.012345680");
+
+  //  Sign Hour MinuteSecond MinuteSecond Fractionopt
+  VerifyParseTimeZoneIdentifierSuccess("+000000");
+  VerifyParseTimeZoneIdentifierSuccess("+235959");
+  VerifyParseTimeZoneIdentifierSuccess("-000000");
+  VerifyParseTimeZoneIdentifierSuccess("-235959");
+  VerifyParseTimeZoneIdentifierSuccess("\u2212000000");
+  VerifyParseTimeZoneIdentifierSuccess("\u2212235959");
+
+  VerifyParseTimeZoneIdentifierSuccess("-000000.0");
+  VerifyParseTimeZoneIdentifierSuccess("-000000,0");
+  VerifyParseTimeZoneIdentifierSuccess("-000000.10");
+  VerifyParseTimeZoneIdentifierSuccess("-000000,01");
+  VerifyParseTimeZoneIdentifierSuccess("-000000.012");
+  VerifyParseTimeZoneIdentifierSuccess("-000000,010");
+  VerifyParseTimeZoneIdentifierSuccess("-000000.0123");
+  VerifyParseTimeZoneIdentifierSuccess("-000000,0120");
+  VerifyParseTimeZoneIdentifierSuccess("-000000.01234");
+  VerifyParseTimeZoneIdentifierSuccess("-000000,01230");
+  VerifyParseTimeZoneIdentifierSuccess("-000000.012345");
+  VerifyParseTimeZoneIdentifierSuccess("-000000,012340");
+  VerifyParseTimeZoneIdentifierSuccess("-000000.0123450");
+  VerifyParseTimeZoneIdentifierSuccess("-000000,0123456");
+  VerifyParseTimeZoneIdentifierSuccess("-000000,01234567");
+  VerifyParseTimeZoneIdentifierSuccess("-000000.01234560");
+  VerifyParseTimeZoneIdentifierSuccess("-000000,012345678");
+  VerifyParseTimeZoneIdentifierSuccess("-000000.012345680");
+}
+TEST_F(TemporalParserTest, TimeZoneIdentifierIllegal) {
+  //  Etc/GMT ASCIISign Hour:
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "[Etc/GMT+1]");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "Etc/GMT+01");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "Etc/GMT+24");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, ".");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "..");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "A/..");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "A/.");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-ab");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "abcdefghijklmno");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "abcdefghijklmno/ABCDEFGHIJKLMN");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "abcdefghijklmn/ABCDEFGHIJKLMNO");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "1");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "a1");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "Etc/GMT1");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "GMT1");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "GMT+1");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "GMT-1");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "EDT5EST");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "CDT6CST");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "MDT7MST");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "PDT8PST");
+
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+2");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+24");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-24");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u221224");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+0:60");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+00:5");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+00:60");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-00:60");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u221200:60");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+24:59");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-24:59");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u221224:59");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+0060");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+00590");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-0060");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u22120060");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+2459");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-2459");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u22122459");
+
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+00:0000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+0000:00");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+23:0000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+2300:00");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+00:5900");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+0059:00");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+00:0059");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+0000:59");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-00:0000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-0000:00");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-23:0000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-2300:00");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-00:5900");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-0059:00");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-00:0059");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-0000:59");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u221200:0000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u22120000:00");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u221223:0000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u22122300:00");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u221200:5900");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u22120059:00");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u221200:0059");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u22120000:59");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-00059");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-0:0059");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-00:059");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-000:59");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-0005:9");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-0000000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-00000000");
+
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+240000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+006000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+000060");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-240000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-006000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-000060");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u2212240000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u2212006000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u2212000060");
+
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+00:00:00.0000000000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-00:00:00.0000000000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u221200:00:00.0000000000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "+000000.0000000000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "-000000.0000000000");
+  VERIFY_PARSE_FAIL(TimeZoneIdentifier, "\u2212000000.0000000000");
+}
+
+TEST_F(TemporalParserTest, CalendarNameSuccess) {
+  // CalendarName
+  VerifyParseCalendarNameSuccess("chinese");
+  VerifyParseCalendarNameSuccess("roc");
+  VerifyParseCalendarNameSuccess("indian");
+  VerifyParseCalendarNameSuccess("persian");
+  VerifyParseCalendarNameSuccess("abcd-efghi");
+  VerifyParseCalendarNameSuccess("abcd-efghi");
+  VerifyParseCalendarNameSuccess("a2345678-b2345678-c2345678-d7654321");
+}
+
+TEST_F(TemporalParserTest, CalendarNameIllegal) {
+  VERIFY_PARSE_FAIL(CalendarName, "20210304[u-ca=]");
+  VERIFY_PARSE_FAIL(CalendarName, "20210304[u-ca=a]");
+  VERIFY_PARSE_FAIL(CalendarName, "20210304[u-ca=ab]");
+  VERIFY_PARSE_FAIL(CalendarName, "20210304[u-ca=abcdef-ab]");
+  VERIFY_PARSE_FAIL(CalendarName, "20210304[u-ca=abcdefghijkl]");
+  // It is a Syntax Error if DateExtendedYear is "-000000"
+  VERIFY_PARSE_FAIL(CalendarName, "-0000000304[u-ca=abcdef-ab]");
+  VERIFY_PARSE_FAIL(CalendarName, "\u22120000000304[u-ca=abcdef-ab]");
+  // TemporalInstantString
+  VERIFY_PARSE_FAIL(CalendarName, "2021-11-08z[ABCD]");
+  // CalendarDateTime
+  VERIFY_PARSE_FAIL(CalendarName, "2021-11-08[u-ca=chinese]");
+  VERIFY_PARSE_FAIL(CalendarName, "2021-11-08[ABCDEFG][u-ca=chinese]");
+  VERIFY_PARSE_FAIL(CalendarName, "2021-11-08[ABCDEFG/hijklmn][u-ca=roc]");
+  // Time
+  VERIFY_PARSE_FAIL(CalendarName, "23:45:59");
+  // DateSpecYearMonth
+  VERIFY_PARSE_FAIL(CalendarName, "2021-12");
+  // DateSpecMonthDay
+  VERIFY_PARSE_FAIL(CalendarName, "--12-31");
+  VERIFY_PARSE_FAIL(CalendarName, "12-31");
+  VERIFY_PARSE_FAIL(CalendarName, "--1231");
+}
+
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/test/unittests/test-utils.cc b/deps/v8/test/unittests/test-utils.cc
index f6f9ac78b1894f..1e2ab73e7ba08c 100644
--- a/deps/v8/test/unittests/test-utils.cc
+++ b/deps/v8/test/unittests/test-utils.cc
@@ -68,7 +68,7 @@ namespace internal {
 SaveFlags::SaveFlags() {
   // For each flag, save the current flag value.
 #define FLAG_MODE_APPLY(ftype, ctype, nam, def, cmt) \
-  SAVED_##nam = FLAG_##nam.value();
+  SAVED_##nam = v8_flags.nam.value();
 #include "src/flags/flag-definitions.h"
 #undef FLAG_MODE_APPLY
 }
@@ -77,8 +77,8 @@ SaveFlags::~SaveFlags() {
   // For each flag, set back the old flag value if it changed (don't write the
   // flag if it didn't change, to keep TSAN happy).
 #define FLAG_MODE_APPLY(ftype, ctype, nam, def, cmt) \
-  if (SAVED_##nam != FLAG_##nam.value()) {           \
-    FLAG_##nam = SAVED_##nam;                        \
+  if (SAVED_##nam != v8_flags.nam.value()) {         \
+    v8_flags.nam = SAVED_##nam;                      \
   }
 #include "src/flags/flag-definitions.h"  // NOLINT
 #undef FLAG_MODE_APPLY
@@ -95,13 +95,15 @@ ManualGCScope::ManualGCScope(i::Isolate* isolate) {
     isolate->heap()->CompleteSweepingFull();
   }
 
-  i::FLAG_concurrent_marking = false;
-  i::FLAG_concurrent_sweeping = false;
-  i::FLAG_stress_incremental_marking = false;
-  i::FLAG_stress_concurrent_allocation = false;
+  i::v8_flags.concurrent_marking = false;
+  i::v8_flags.concurrent_sweeping = false;
+  i::v8_flags.concurrent_minor_mc_marking = false;
+  i::v8_flags.concurrent_minor_mc_sweeping = false;
+  i::v8_flags.stress_incremental_marking = false;
+  i::v8_flags.stress_concurrent_allocation = false;
   // Parallel marking has a dependency on concurrent marking.
-  i::FLAG_parallel_marking = false;
-  i::FLAG_detect_ineffective_gcs_near_heap_limit = false;
+  i::v8_flags.parallel_marking = false;
+  i::v8_flags.detect_ineffective_gcs_near_heap_limit = false;
 }
 
 }  // namespace internal
diff --git a/deps/v8/test/unittests/test-utils.h b/deps/v8/test/unittests/test-utils.h
index 967b70bfd04959..56e4f4538b6f18 100644
--- a/deps/v8/test/unittests/test-utils.h
+++ b/deps/v8/test/unittests/test-utils.h
@@ -13,6 +13,7 @@
 #include "include/v8-context.h"
 #include "include/v8-extension.h"
 #include "include/v8-local-handle.h"
+#include "include/v8-object.h"
 #include "include/v8-primitive.h"
 #include "include/v8-template.h"
 #include "src/api/api-inl.h"
@@ -41,7 +42,7 @@ class WithDefaultPlatformMixin : public TMixin {
     // Allow changing flags in unit tests.
     // TODO(12887): Fix tests to avoid changing flag values after
     // initialization.
-    i::FLAG_freeze_flags_after_init = false;
+    i::v8_flags.freeze_flags_after_init = false;
     v8::V8::Initialize();
   }
 
@@ -60,7 +61,7 @@ class WithDefaultPlatformMixin : public TMixin {
 template <typename TMixin>
 class WithJSSharedMemoryFeatureFlagsMixin : public TMixin {
  public:
-  WithJSSharedMemoryFeatureFlagsMixin() { i::FLAG_harmony_struct = true; }
+  WithJSSharedMemoryFeatureFlagsMixin() { i::v8_flags.harmony_struct = true; }
 };
 
 using CounterMap = std::map<std::string, int>;
@@ -80,6 +81,9 @@ class IsolateWrapper final {
   IsolateWrapper& operator=(const IsolateWrapper&) = delete;
 
   v8::Isolate* isolate() const { return isolate_; }
+  i::Isolate* i_isolate() const {
+    return reinterpret_cast<i::Isolate*>(isolate_);
+  }
 
  private:
   std::unique_ptr<v8::ArrayBuffer::Allocator> array_buffer_allocator_;
@@ -97,6 +101,18 @@ class WithIsolateMixin : public TMixin {
 
   v8::Isolate* v8_isolate() const { return isolate_wrapper_.isolate(); }
 
+  Local<Value> RunJS(const char* source, Local<Context> context) {
+    return RunJS(
+        v8::String::NewFromUtf8(this->v8_isolate(), source).ToLocalChecked(),
+        context);
+  }
+
+  Local<Value> RunJS(Local<String> source, Local<Context> context) {
+    Local<Script> script =
+        v8::Script::Compile(context, source).ToLocalChecked();
+    return script->Run(context).ToLocalChecked();
+  }
+
  private:
   v8::IsolateWrapper isolate_wrapper_;
 };
@@ -131,6 +147,12 @@ class WithIsolateScopeMixin : public TMixin {
         v8::String::NewFromUtf8(this->v8_isolate(), source).ToLocalChecked());
   }
 
+  Local<Value> RunJS(Local<Context> context, const char* source) {
+    return RunJS(
+        context,
+        v8::String::NewFromUtf8(this->v8_isolate(), source).ToLocalChecked());
+  }
+
   MaybeLocal<Value> TryRunJS(const char* source) {
     return TryRunJS(
         v8::String::NewFromUtf8(this->v8_isolate(), source).ToLocalChecked());
@@ -138,6 +160,11 @@ class WithIsolateScopeMixin : public TMixin {
 
   static MaybeLocal<Value> TryRunJS(Isolate* isolate, Local<String> source) {
     auto context = isolate->GetCurrentContext();
+    return TryRunJS(context, source);
+  }
+
+  static MaybeLocal<Value> TryRunJS(Local<Context> context,
+                                    Local<String> source) {
     v8::Local<v8::Value> result;
     Local<Script> script =
         v8::Script::Compile(context, source).ToLocalChecked();
@@ -207,6 +234,10 @@ class WithIsolateScopeMixin : public TMixin {
     return TryRunJS(source).ToLocalChecked();
   }
 
+  Local<Value> RunJS(Local<Context> context, Local<String> source) {
+    return TryRunJS(context, source).ToLocalChecked();
+  }
+
   MaybeLocal<Value> TryRunJS(Local<String> source) {
     return TryRunJS(this->v8_isolate(), source);
   }
diff --git a/deps/v8/test/unittests/unittests.status b/deps/v8/test/unittests/unittests.status
index 3242ed72ceb35d..a195afc30c7770 100644
--- a/deps/v8/test/unittests/unittests.status
+++ b/deps/v8/test/unittests/unittests.status
@@ -286,6 +286,7 @@
   'RegExpTest.Graph': [SKIP],
   'SloppyEqualityTest.*' : [SKIP],
   'DisasmX64Test.*': [SKIP],
+  'RunBytecodeGraphBuilderTest.*': [SKIP],
   'RunJSBranchesTest.*': [SKIP],
   'RunJSCallsTest.*': [SKIP],
   'RunJSExceptionsTest.*': [SKIP],
diff --git a/deps/v8/test/unittests/utils/identity-map-unittest.cc b/deps/v8/test/unittests/utils/identity-map-unittest.cc
index 337ef8e5ff0773..f61559f7503792 100644
--- a/deps/v8/test/unittests/utils/identity-map-unittest.cc
+++ b/deps/v8/test/unittests/utils/identity-map-unittest.cc
@@ -785,9 +785,9 @@ TEST_F(IdentityMapTest, CanonicalHandleScope) {
 }
 
 TEST_F(IdentityMapTest, GCShortCutting) {
-  if (FLAG_single_generation) return;
+  if (v8_flags.single_generation) return;
   // We don't create ThinStrings immediately when using the forwarding table.
-  if (FLAG_always_use_string_forwarding_table) return;
+  if (v8_flags.always_use_string_forwarding_table) return;
   ManualGCScope manual_gc_scope(isolate());
   IdentityMapTester t(isolate()->heap(), zone());
   Factory* factory = isolate()->factory();
@@ -816,7 +816,7 @@ TEST_F(IdentityMapTest, GCShortCutting) {
     // Do an explicit, real GC, this should short-cut the thin string to point
     // to the internalized string (this is not implemented for MinorMC).
     CollectGarbage(i::NEW_SPACE);
-    DCHECK_IMPLIES(!FLAG_minor_mc && !FLAG_optimize_for_size,
+    DCHECK_IMPLIES(!v8_flags.minor_mc && !v8_flags.optimize_for_size,
                    *thin_string == *internalized_string);
 
     // Check that getting the object points to one of the handles.
diff --git a/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc b/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
index 52f0e4696f969f..1b031200b50ccc 100644
--- a/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
+++ b/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
@@ -9,10 +9,10 @@
 #include "src/wasm/function-body-decoder-impl.h"
 #include "src/wasm/leb-helper.h"
 #include "src/wasm/local-decl-encoder.h"
-#include "src/wasm/signature-map.h"
 #include "src/wasm/wasm-limits.h"
 #include "src/wasm/wasm-module.h"
 #include "src/wasm/wasm-opcodes-inl.h"
+#include "src/wasm/wasm-subtyping.h"
 #include "src/zone/zone.h"
 #include "test/common/wasm/flag-utils.h"
 #include "test/common/wasm/test-signatures.h"
@@ -184,7 +184,6 @@ class TestModuleBuilder {
          static_cast<uint32_t>(mod.functions.size()),  // func_index
          sig_index,                                    // sig_index
          {0, 0},                                       // code
-         0,                                            // feedback slots
          false,                                        // import
          false,                                        // export
          declared});                                   // declared
@@ -262,8 +261,8 @@ class FunctionBodyDecoderTestBase : public WithZoneMixin<BaseTest> {
     FunctionBody body(sig, 0, code.begin(), code.end());
     WasmFeatures unused_detected_features = WasmFeatures::None();
     DecodeResult result =
-        VerifyWasmCode(this->zone()->allocator(), enabled_features_, module,
-                       &unused_detected_features, body);
+        ValidateFunctionBody(this->zone()->allocator(), enabled_features_,
+                             module, &unused_detected_features, body);
 
     std::ostringstream str;
     if (result.failed()) {
@@ -1153,8 +1152,13 @@ TEST_F(FunctionBodyDecoderTest, UnreachableRefTypes) {
                   {WASM_UNREACHABLE, WASM_GC_OP(kExprArrayNewDefault),
                    array_index, kExprDrop});
 
+  ExpectValidates(
+      sigs.i_v(),
+      {WASM_UNREACHABLE, WASM_GC_OP(kExprRefTestDeprecated), struct_index});
   ExpectValidates(sigs.i_v(),
                   {WASM_UNREACHABLE, WASM_GC_OP(kExprRefTest), struct_index});
+  ExpectValidates(sigs.i_v(),
+                  {WASM_UNREACHABLE, WASM_GC_OP(kExprRefTest), kEqRefCode});
 
   ExpectValidates(sigs.v_v(), {WASM_UNREACHABLE, WASM_GC_OP(kExprRefCast),
                                struct_index, kExprDrop});
@@ -3287,8 +3291,8 @@ TEST_F(FunctionBodyDecoderTest, Regression709741) {
     FunctionBody body(sigs.v_v(), 0, code, code + i);
     WasmFeatures unused_detected_features;
     DecodeResult result =
-        VerifyWasmCode(this->zone()->allocator(), WasmFeatures::All(), nullptr,
-                       &unused_detected_features, body);
+        ValidateFunctionBody(this->zone()->allocator(), WasmFeatures::All(),
+                             nullptr, &unused_detected_features, body);
     if (result.ok()) {
       std::ostringstream str;
       str << "Expected verification to fail";
@@ -4305,24 +4309,31 @@ TEST_F(FunctionBodyDecoderTest, RefTestCast) {
   HeapType::Representation func_heap_2 =
       static_cast<HeapType::Representation>(builder.AddSignature(sigs.i_v()));
 
-  std::tuple<HeapType::Representation, HeapType::Representation, bool> tests[] =
-      {std::make_tuple(HeapType::kData, array_heap, true),
-       std::make_tuple(HeapType::kData, super_struct_heap, true),
-       std::make_tuple(HeapType::kFunc, func_heap_1, true),
-       std::make_tuple(func_heap_1, func_heap_1, true),
-       std::make_tuple(func_heap_1, func_heap_2, true),
-       std::make_tuple(super_struct_heap, sub_struct_heap, true),
-       std::make_tuple(array_heap, sub_struct_heap, true),
-       std::make_tuple(super_struct_heap, func_heap_1, true),
-       std::make_tuple(HeapType::kEq, super_struct_heap, false),
-       std::make_tuple(HeapType::kExtern, func_heap_1, false),
-       std::make_tuple(HeapType::kAny, array_heap, false),
-       std::make_tuple(HeapType::kI31, array_heap, false)};
+  std::tuple<HeapType::Representation, HeapType::Representation, bool, bool>
+      tests[] = {
+          std::make_tuple(HeapType::kData, array_heap, true, true),
+          std::make_tuple(HeapType::kData, super_struct_heap, true, true),
+          std::make_tuple(HeapType::kFunc, func_heap_1, true, true),
+          std::make_tuple(func_heap_1, func_heap_1, true, true),
+          std::make_tuple(func_heap_1, func_heap_2, true, true),
+          std::make_tuple(super_struct_heap, sub_struct_heap, true, true),
+          std::make_tuple(array_heap, sub_struct_heap, true, true),
+          std::make_tuple(super_struct_heap, func_heap_1, true, false),
+          std::make_tuple(HeapType::kEq, super_struct_heap, false, true),
+          std::make_tuple(HeapType::kExtern, func_heap_1, false, false),
+          std::make_tuple(HeapType::kAny, array_heap, false, true),
+          std::make_tuple(HeapType::kI31, array_heap, false, true),
+          std::make_tuple(HeapType::kNone, array_heap, true, true),
+          std::make_tuple(HeapType::kNone, func_heap_1, true, false),
+      };
 
   for (auto test : tests) {
     HeapType from_heap = HeapType(std::get<0>(test));
     HeapType to_heap = HeapType(std::get<1>(test));
     bool should_pass = std::get<2>(test);
+    bool should_pass_ref_test = std::get<3>(test);
+    SCOPED_TRACE("from_heap = " + from_heap.name() +
+                 ", to_heap = " + to_heap.name());
 
     ValueType test_reps[] = {kWasmI32, ValueType::RefNull(from_heap)};
     FunctionSig test_sig(1, 1, test_reps);
@@ -4332,7 +4343,8 @@ TEST_F(FunctionBodyDecoderTest, RefTestCast) {
     FunctionSig cast_sig(1, 1, cast_reps);
 
     if (should_pass) {
-      ExpectValidates(&test_sig, {WASM_REF_TEST(WASM_LOCAL_GET(0),
+      ExpectValidates(&test_sig,
+                      {WASM_REF_TEST_DEPRECATED(WASM_LOCAL_GET(0),
                                                 WASM_HEAP_TYPE(to_heap))});
       ExpectValidates(&cast_sig, {WASM_REF_CAST(WASM_LOCAL_GET(0),
                                                 WASM_HEAP_TYPE(to_heap))});
@@ -4342,20 +4354,40 @@ TEST_F(FunctionBodyDecoderTest, RefTestCast) {
           "local.get of type " +
           test_reps[1].name();
       ExpectFailure(&test_sig,
-                    {WASM_REF_TEST(WASM_LOCAL_GET(0), WASM_HEAP_TYPE(to_heap))},
+                    {WASM_REF_TEST_DEPRECATED(WASM_LOCAL_GET(0),
+                                              WASM_HEAP_TYPE(to_heap))},
                     kAppendEnd, ("ref.test" + error_message).c_str());
       ExpectFailure(&cast_sig,
                     {WASM_REF_CAST(WASM_LOCAL_GET(0), WASM_HEAP_TYPE(to_heap))},
                     kAppendEnd, ("ref.cast" + error_message).c_str());
     }
+
+    if (should_pass_ref_test) {
+      ExpectValidates(&test_sig, {WASM_REF_TEST(WASM_LOCAL_GET(0),
+                                                WASM_HEAP_TYPE(to_heap))});
+    } else {
+      std::string error_message =
+          "Invalid types for ref.test: local.get of type " +
+          cast_reps[1].name() +
+          " has to be in the same reference type hierarchy as (ref " +
+          to_heap.name() + ")";
+      ExpectFailure(&test_sig,
+                    {WASM_REF_TEST(WASM_LOCAL_GET(0), WASM_HEAP_TYPE(to_heap))},
+                    kAppendEnd, error_message.c_str());
+    }
   }
 
   // Trivial type error.
   ExpectFailure(sigs.v_v(),
-                {WASM_REF_TEST(WASM_I32V(1), array_heap), kExprDrop},
+                {WASM_REF_TEST_DEPRECATED(WASM_I32V(1), array_heap), kExprDrop},
                 kAppendEnd,
                 "ref.test[0] expected subtype of (ref null func) or "
                 "(ref null data), found i32.const of type i32");
+  ExpectFailure(sigs.v_v(),
+                {WASM_REF_TEST(WASM_I32V(1), array_heap), kExprDrop},
+                kAppendEnd,
+                "Invalid types for ref.test: i32.const of type i32 has to be "
+                "in the same reference type hierarchy as (ref 0)");
   ExpectFailure(sigs.v_v(),
                 {WASM_REF_CAST(WASM_I32V(1), array_heap), kExprDrop},
                 kAppendEnd,
@@ -4691,13 +4723,16 @@ class WasmOpcodeLengthTest : public TestWithZone {
       DCHECK_LE(static_cast<uint32_t>(opcode), 0xFF);
       bytes[0] = static_cast<byte>(opcode);
       // Special case: select_with_type insists on a {1} immediate.
-      if (opcode == kExprSelectWithType) bytes[1] = 1;
+      if (opcode == kExprSelectWithType) {
+        bytes[1] = 1;
+        bytes[2] = kAnyRefCode;
+      }
     }
     WasmFeatures detected;
-    WasmDecoder<Decoder::kNoValidation> decoder(
+    WasmDecoder<Decoder::kBooleanValidation> decoder(
         this->zone(), nullptr, WasmFeatures::All(), &detected, nullptr, bytes,
         bytes + sizeof(bytes), 0);
-    WasmDecoder<Decoder::kNoValidation>::OpcodeLength(&decoder, bytes);
+    WasmDecoder<Decoder::kBooleanValidation>::OpcodeLength(&decoder, bytes);
     EXPECT_TRUE(decoder.ok())
         << opcode << " aka " << WasmOpcodes::OpcodeName(opcode) << ": "
         << decoder.error().message();
@@ -4956,17 +4991,15 @@ TEST_F(TypeReaderTest, HeapTypeDecodingTest) {
   }
 }
 
-using TypesOfLocals = ZoneVector<ValueType>;
-
 class LocalDeclDecoderTest : public TestWithZone {
  public:
   v8::internal::AccountingAllocator allocator;
   WasmFeatures enabled_features_;
 
-  size_t ExpectRun(TypesOfLocals map, size_t pos, ValueType expected,
+  size_t ExpectRun(ValueType* local_types, size_t pos, ValueType expected,
                    size_t count) {
     for (size_t i = 0; i < count; i++) {
-      EXPECT_EQ(expected, map[pos++]);
+      EXPECT_EQ(expected, local_types[pos++]);
     }
     return pos;
   }
@@ -4975,27 +5008,27 @@ class LocalDeclDecoderTest : public TestWithZone {
                         const byte* end) {
     WasmModule module;
     return i::wasm::DecodeLocalDecls(enabled_features_, decls, &module, start,
-                                     end);
+                                     end, zone());
   }
 };
 
 TEST_F(LocalDeclDecoderTest, EmptyLocals) {
-  BodyLocalDecls decls(zone());
+  BodyLocalDecls decls;
   bool result = DecodeLocalDecls(&decls, nullptr, nullptr);
   EXPECT_FALSE(result);
 }
 
 TEST_F(LocalDeclDecoderTest, NoLocals) {
   static const byte data[] = {0};
-  BodyLocalDecls decls(zone());
+  BodyLocalDecls decls;
   bool result = DecodeLocalDecls(&decls, data, data + sizeof(data));
   EXPECT_TRUE(result);
-  EXPECT_TRUE(decls.type_list.empty());
+  EXPECT_EQ(0u, decls.num_locals);
 }
 
 TEST_F(LocalDeclDecoderTest, WrongLocalDeclsCount1) {
   static const byte data[] = {1};
-  BodyLocalDecls decls(zone());
+  BodyLocalDecls decls;
   bool result = DecodeLocalDecls(&decls, data, data + sizeof(data));
   EXPECT_FALSE(result);
 }
@@ -5003,7 +5036,7 @@ TEST_F(LocalDeclDecoderTest, WrongLocalDeclsCount1) {
 TEST_F(LocalDeclDecoderTest, WrongLocalDeclsCount2) {
   static const byte data[] = {2, 1,
                               static_cast<byte>(kWasmI32.value_type_code())};
-  BodyLocalDecls decls(zone());
+  BodyLocalDecls decls;
   bool result = DecodeLocalDecls(&decls, data, data + sizeof(data));
   EXPECT_FALSE(result);
 }
@@ -5012,13 +5045,12 @@ TEST_F(LocalDeclDecoderTest, OneLocal) {
   for (size_t i = 0; i < arraysize(kValueTypes); i++) {
     ValueType type = kValueTypes[i];
     const byte data[] = {1, 1, static_cast<byte>(type.value_type_code())};
-    BodyLocalDecls decls(zone());
+    BodyLocalDecls decls;
     bool result = DecodeLocalDecls(&decls, data, data + sizeof(data));
     EXPECT_TRUE(result);
-    EXPECT_EQ(1u, decls.type_list.size());
+    EXPECT_EQ(1u, decls.num_locals);
 
-    TypesOfLocals map = decls.type_list;
-    EXPECT_EQ(type, map[0]);
+    EXPECT_EQ(type, decls.local_types[0]);
   }
 }
 
@@ -5026,15 +5058,12 @@ TEST_F(LocalDeclDecoderTest, FiveLocals) {
   for (size_t i = 0; i < arraysize(kValueTypes); i++) {
     ValueType type = kValueTypes[i];
     const byte data[] = {1, 5, static_cast<byte>(type.value_type_code())};
-    BodyLocalDecls decls(zone());
+    BodyLocalDecls decls;
     bool result = DecodeLocalDecls(&decls, data, data + sizeof(data));
     EXPECT_TRUE(result);
     EXPECT_EQ(sizeof(data), decls.encoded_size);
-    EXPECT_EQ(5u, decls.type_list.size());
-
-    TypesOfLocals map = decls.type_list;
-    EXPECT_EQ(5u, map.size());
-    ExpectRun(map, 0, type, 5);
+    EXPECT_EQ(5u, decls.num_locals);
+    ExpectRun(decls.local_types, 0, type, 5);
   }
 }
 
@@ -5045,20 +5074,17 @@ TEST_F(LocalDeclDecoderTest, MixedLocals) {
         for (byte d = 0; d < 3; d++) {
           const byte data[] = {4, a,        kI32Code, b,       kI64Code,
                                c, kF32Code, d,        kF64Code};
-          BodyLocalDecls decls(zone());
+          BodyLocalDecls decls;
           bool result = DecodeLocalDecls(&decls, data, data + sizeof(data));
           EXPECT_TRUE(result);
           EXPECT_EQ(sizeof(data), decls.encoded_size);
-          EXPECT_EQ(static_cast<uint32_t>(a + b + c + d),
-                    decls.type_list.size());
-
-          TypesOfLocals map = decls.type_list;
+          EXPECT_EQ(static_cast<uint32_t>(a + b + c + d), decls.num_locals);
 
           size_t pos = 0;
-          pos = ExpectRun(map, pos, kWasmI32, a);
-          pos = ExpectRun(map, pos, kWasmI64, b);
-          pos = ExpectRun(map, pos, kWasmF32, c);
-          pos = ExpectRun(map, pos, kWasmF64, d);
+          pos = ExpectRun(decls.local_types, pos, kWasmI32, a);
+          pos = ExpectRun(decls.local_types, pos, kWasmI64, b);
+          pos = ExpectRun(decls.local_types, pos, kWasmF32, c);
+          pos = ExpectRun(decls.local_types, pos, kWasmF64, d);
         }
       }
     }
@@ -5075,16 +5101,15 @@ TEST_F(LocalDeclDecoderTest, UseEncoder) {
   local_decls.AddLocals(212, kWasmI64);
   local_decls.Prepend(zone(), &data, &end);
 
-  BodyLocalDecls decls(zone());
+  BodyLocalDecls decls;
   bool result = DecodeLocalDecls(&decls, data, end);
   EXPECT_TRUE(result);
-  EXPECT_EQ(5u + 1337u + 212u, decls.type_list.size());
+  EXPECT_EQ(5u + 1337u + 212u, decls.num_locals);
 
-  TypesOfLocals map = decls.type_list;
   size_t pos = 0;
-  pos = ExpectRun(map, pos, kWasmF32, 5);
-  pos = ExpectRun(map, pos, kWasmI32, 1337);
-  pos = ExpectRun(map, pos, kWasmI64, 212);
+  pos = ExpectRun(decls.local_types, pos, kWasmF32, 5);
+  pos = ExpectRun(decls.local_types, pos, kWasmI32, 1337);
+  pos = ExpectRun(decls.local_types, pos, kWasmI64, 212);
 }
 
 TEST_F(LocalDeclDecoderTest, InvalidTypeIndex) {
@@ -5095,7 +5120,7 @@ TEST_F(LocalDeclDecoderTest, InvalidTypeIndex) {
   LocalDeclEncoder local_decls(zone());
 
   local_decls.AddLocals(1, ValueType::RefNull(0));
-  BodyLocalDecls decls(zone());
+  BodyLocalDecls decls;
   bool result = DecodeLocalDecls(&decls, data, end);
   EXPECT_FALSE(result);
 }
@@ -5160,8 +5185,8 @@ TEST_F(BytecodeIteratorTest, ForeachOffset) {
 
 TEST_F(BytecodeIteratorTest, WithLocalDecls) {
   byte code[] = {1, 1, kI32Code, WASM_I32V_1(9), WASM_I32V_1(11)};
-  BodyLocalDecls decls(zone());
-  BytecodeIterator iter(code, code + sizeof(code), &decls);
+  BodyLocalDecls decls;
+  BytecodeIterator iter(code, code + sizeof(code), &decls, zone());
 
   EXPECT_EQ(3u, decls.encoded_size);
   EXPECT_EQ(3u, iter.pc_offset());
diff --git a/deps/v8/test/unittests/wasm/memory-protection-unittest.cc b/deps/v8/test/unittests/wasm/memory-protection-unittest.cc
index a6b2feaa6c6f40..4c137757033644 100644
--- a/deps/v8/test/unittests/wasm/memory-protection-unittest.cc
+++ b/deps/v8/test/unittests/wasm/memory-protection-unittest.cc
@@ -128,13 +128,12 @@ class MemoryProtectionTest : public TestWithNativeContext {
                          DecodingMethod::kSync, GetWasmEngine()->allocator());
     CHECK(result.ok());
 
-    Handle<FixedArray> export_wrappers;
     ErrorThrower thrower(isolate(), "");
     constexpr int kNoCompilationId = 0;
     std::shared_ptr<NativeModule> native_module = CompileToNativeModule(
         isolate(), WasmFeatures::All(), &thrower, std::move(result).value(),
-        ModuleWireBytes{base::ArrayVector(module_bytes)}, &export_wrappers,
-        kNoCompilationId, v8::metrics::Recorder::ContextId::Empty());
+        ModuleWireBytes{base::ArrayVector(module_bytes)}, kNoCompilationId,
+        v8::metrics::Recorder::ContextId::Empty());
     CHECK(!thrower.error());
     CHECK_NOT_NULL(native_module);
 
diff --git a/deps/v8/test/unittests/wasm/module-decoder-unittest.cc b/deps/v8/test/unittests/wasm/module-decoder-unittest.cc
index cd72ac75c06cd6..9b0dd9c809e382 100644
--- a/deps/v8/test/unittests/wasm/module-decoder-unittest.cc
+++ b/deps/v8/test/unittests/wasm/module-decoder-unittest.cc
@@ -1029,7 +1029,6 @@ TEST_F(WasmModuleVerifyTest, InvalidArrayTypeDef) {
 TEST_F(WasmModuleVerifyTest, TypeCanonicalization) {
   WASM_FEATURE_SCOPE(typed_funcref);
   WASM_FEATURE_SCOPE(gc);
-  FLAG_SCOPE(wasm_type_canonicalization);
   static const byte identical_group[] = {
       SECTION(Type,            // --
               ENTRY_COUNT(2),  // two identical rec. groups
@@ -1070,7 +1069,6 @@ TEST_F(WasmModuleVerifyTest, TypeCanonicalization) {
 TEST_F(WasmModuleVerifyTest, InvalidSupertypeInRecGroup) {
   WASM_FEATURE_SCOPE(typed_funcref);
   WASM_FEATURE_SCOPE(gc);
-  FLAG_SCOPE(wasm_type_canonicalization);
   static const byte invalid_supertype[] = {
       SECTION(Type, ENTRY_COUNT(1),                         // --
               kWasmRecursiveTypeGroupCode, ENTRY_COUNT(2),  // --
@@ -1310,16 +1308,13 @@ TEST_F(WasmModuleVerifyTest, CanonicalTypeIds) {
   const WasmModule* module = result.value().get();
 
   EXPECT_EQ(5u, module->types.size());
-  EXPECT_EQ(5u, module->per_module_canonical_type_ids.size());
-  EXPECT_EQ(2u, module->signature_map.size());
-
-  // No canonicalization for structs.
-  EXPECT_EQ(0u, module->per_module_canonical_type_ids[0]);
-  EXPECT_EQ(0u, module->per_module_canonical_type_ids[1]);
-  EXPECT_EQ(1u, module->per_module_canonical_type_ids[2]);
-  EXPECT_EQ(0u, module->per_module_canonical_type_ids[3]);
-  // No canonicalization for arrays.
-  EXPECT_EQ(0u, module->per_module_canonical_type_ids[4]);
+  EXPECT_EQ(5u, module->isorecursive_canonical_type_ids.size());
+
+  EXPECT_EQ(0u, module->isorecursive_canonical_type_ids[0]);
+  EXPECT_EQ(1u, module->isorecursive_canonical_type_ids[1]);
+  EXPECT_EQ(2u, module->isorecursive_canonical_type_ids[2]);
+  EXPECT_EQ(1u, module->isorecursive_canonical_type_ids[3]);
+  EXPECT_EQ(3u, module->isorecursive_canonical_type_ids[4]);
 }
 
 TEST_F(WasmModuleVerifyTest, DataSegmentWithImmutableImportedGlobal) {
diff --git a/deps/v8/test/unittests/wasm/subtyping-unittest.cc b/deps/v8/test/unittests/wasm/subtyping-unittest.cc
index caf04321a10471..81648716ceed5a 100644
--- a/deps/v8/test/unittests/wasm/subtyping-unittest.cc
+++ b/deps/v8/test/unittests/wasm/subtyping-unittest.cc
@@ -174,9 +174,7 @@ TEST_F(WasmSubtypingTest, Subtyping) {
             TypeInModule(type_result, module_result))
 
   for (WasmModule* module : {module1, module2}) {
-    // For cross module subtyping, we need to enable type canonicalization.
     // Type judgements across modules should work the same as within one module.
-    FLAG_VALUE_SCOPE(wasm_type_canonicalization, module == module2);
 
     // Value types are unrelated, except if they are equal.
     for (ValueType subtype : numeric_types) {
@@ -311,7 +309,6 @@ TEST_F(WasmSubtypingTest, Subtyping) {
 
     {
       // Canonicalization tests.
-      FLAG_SCOPE(wasm_type_canonicalization);
 
       // Groups should only be canonicalized to identical groups.
       IDENTICAL(18, 22);
diff --git a/deps/v8/test/unittests/web-snapshot/web-snapshot-unittest.cc b/deps/v8/test/unittests/web-snapshot/web-snapshot-unittest.cc
index 9c15622183dbde..1f1081805cdac0 100644
--- a/deps/v8/test/unittests/web-snapshot/web-snapshot-unittest.cc
+++ b/deps/v8/test/unittests/web-snapshot/web-snapshot-unittest.cc
@@ -503,8 +503,8 @@ TEST_F(WebSnapshotTest, SFIDeduplicationClasses) {
 }
 
 TEST_F(WebSnapshotTest, SFIDeduplicationAfterBytecodeFlushing) {
-  FLAG_stress_flush_code = true;
-  FLAG_flush_bytecode = true;
+  v8_flags.stress_flush_code = true;
+  v8_flags.flush_bytecode = true;
   v8::Isolate* isolate = v8_isolate();
 
   WebSnapshotData snapshot_data;
@@ -587,8 +587,8 @@ TEST_F(WebSnapshotTest, SFIDeduplicationAfterBytecodeFlushing) {
 }
 
 TEST_F(WebSnapshotTest, SFIDeduplicationAfterBytecodeFlushingClasses) {
-  FLAG_stress_flush_code = true;
-  FLAG_flush_bytecode = true;
+  v8_flags.stress_flush_code = true;
+  v8_flags.flush_bytecode = true;
   v8::Isolate* isolate = v8_isolate();
 
   WebSnapshotData snapshot_data;
@@ -1079,5 +1079,57 @@ TEST_F(WebSnapshotTest, ConstructorFunctionKinds) {
   }
 }
 
+TEST_F(WebSnapshotTest, SlackElementsInObjects) {
+  v8::Isolate* isolate = v8_isolate();
+  v8::HandleScope scope(isolate);
+
+  WebSnapshotData snapshot_data;
+  {
+    v8::Local<v8::Context> new_context = v8::Context::New(isolate);
+    v8::Context::Scope context_scope(new_context);
+    const char* snapshot_source =
+        "var foo = {};"
+        "for (let i = 0; i < 100; ++i) {"
+        "  foo[i] = i;"
+        "}"
+        "var bar = {};"
+        "for (let i = 0; i < 100; ++i) {"
+        "  bar[i] = {};"
+        "}";
+
+    RunJS(snapshot_source);
+    v8::Local<v8::PrimitiveArray> exports = v8::PrimitiveArray::New(isolate, 2);
+    exports->Set(isolate, 0,
+                 v8::String::NewFromUtf8(isolate, "foo").ToLocalChecked());
+    exports->Set(isolate, 1,
+                 v8::String::NewFromUtf8(isolate, "bar").ToLocalChecked());
+    WebSnapshotSerializer serializer(isolate);
+    CHECK(serializer.TakeSnapshot(new_context, exports, snapshot_data));
+    CHECK(!serializer.has_error());
+    CHECK_NOT_NULL(snapshot_data.buffer);
+  }
+
+  {
+    v8::Local<v8::Context> new_context = v8::Context::New(isolate);
+    v8::Context::Scope context_scope(new_context);
+    WebSnapshotDeserializer deserializer(isolate, snapshot_data.buffer,
+                                         snapshot_data.buffer_size);
+    CHECK(deserializer.Deserialize());
+    CHECK(!deserializer.has_error());
+
+    Handle<JSObject> foo =
+        Handle<JSObject>::cast(Utils::OpenHandle<v8::Object, JSReceiver>(
+            RunJS("foo").As<v8::Object>()));
+    CHECK_EQ(100, foo->elements().length());
+    CHECK_EQ(HOLEY_ELEMENTS, foo->GetElementsKind());
+
+    Handle<JSObject> bar =
+        Handle<JSObject>::cast(Utils::OpenHandle<v8::Object, JSReceiver>(
+            RunJS("bar").As<v8::Object>()));
+    CHECK_EQ(100, bar->elements().length());
+    CHECK_EQ(HOLEY_ELEMENTS, bar->GetElementsKind());
+  }
+}
+
 }  // namespace internal
 }  // namespace v8
diff --git a/deps/v8/third_party/inspector_protocol/BUILD.gn b/deps/v8/third_party/inspector_protocol/BUILD.gn
index d3fb166a0fd069..73097ad359b140 100644
--- a/deps/v8/third_party/inspector_protocol/BUILD.gn
+++ b/deps/v8/third_party/inspector_protocol/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2019 the V8 project authors. All rights reserved.
+# Copyright 2019 the V8 project Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/LICENSE b/deps/v8/third_party/inspector_protocol/LICENSE
index 800468e5763479..1e5610962e92dd 100644
--- a/deps/v8/third_party/inspector_protocol/LICENSE
+++ b/deps/v8/third_party/inspector_protocol/LICENSE
@@ -1,4 +1,4 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 //
 // Redistribution and use in source and binary forms, with or without
 // modification, are permitted provided that the following conditions are
diff --git a/deps/v8/third_party/inspector_protocol/README.v8 b/deps/v8/third_party/inspector_protocol/README.v8
index 8e9cd9c12746e0..be83565de2b7ea 100644
--- a/deps/v8/third_party/inspector_protocol/README.v8
+++ b/deps/v8/third_party/inspector_protocol/README.v8
@@ -2,7 +2,7 @@ Name: inspector protocol
 Short Name: inspector_protocol
 URL: https://chromium.googlesource.com/deps/inspector_protocol/
 Version: 0
-Revision: 134539780e606a77d660d58bf95b5ab55875bc3c
+Revision: dec7ec1932f5277b933ed8a675cc6eb7cfc36f88
 License: BSD
 License File: LICENSE
 Security Critical: no
diff --git a/deps/v8/third_party/inspector_protocol/check_protocol_compatibility.py b/deps/v8/third_party/inspector_protocol/check_protocol_compatibility.py
index 9b6223dd96a41b..0d40f26e14a39d 100755
--- a/deps/v8/third_party/inspector_protocol/check_protocol_compatibility.py
+++ b/deps/v8/third_party/inspector_protocol/check_protocol_compatibility.py
@@ -1,31 +1,7 @@
 #!/usr/bin/env python3
-# Copyright (c) 2011 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# Copyright 2011 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 #
 # Inspector protocol validator.
 #
diff --git a/deps/v8/third_party/inspector_protocol/code_generator.py b/deps/v8/third_party/inspector_protocol/code_generator.py
index c3768b8d3e054e..b9a0b644efee88 100755
--- a/deps/v8/third_party/inspector_protocol/code_generator.py
+++ b/deps/v8/third_party/inspector_protocol/code_generator.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-# Copyright 2016 The Chromium Authors. All rights reserved.
+# Copyright 2016 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
@@ -279,15 +279,16 @@ def create_any_type_definition():
 def create_string_type_definition():
   # pylint: disable=W0622
   return {
-    "return_type": "String",
-    "pass_type": "const String&",
-    "to_pass_type": "%s",
-    "to_raw_type": "%s",
-    "to_rvalue": "%s",
-    "type": "String",
-    "raw_type": "String",
-    "raw_pass_type": "const String&",
-    "raw_return_type": "String",
+      "return_type": "String",
+      "pass_type": "const String&",
+      "to_pass_type": "%s",
+      "to_raw_type": "%s",
+      "to_rvalue": "%s",
+      "type": "String",
+      "raw_type": "String",
+      "raw_pass_type": "const String&",
+      "raw_return_type": "String",
+      "is_primitive": True
   }
 
 
@@ -324,19 +325,19 @@ def create_primitive_type_definition(type):
     "boolean": "TypeBoolean",
   }
   return {
-    "return_type": typedefs[type],
-    "pass_type": typedefs[type],
-    "to_pass_type": "%s",
-    "to_raw_type": "%s",
-    "to_rvalue": "%s",
-    "type": typedefs[type],
-    "raw_type": typedefs[type],
-    "raw_pass_type": typedefs[type],
-    "raw_return_type": typedefs[type],
-    "default_value": defaults[type]
+      "return_type": typedefs[type],
+      "pass_type": typedefs[type],
+      "to_pass_type": "%s",
+      "to_raw_type": "%s",
+      "to_rvalue": "%s",
+      "type": typedefs[type],
+      "raw_type": typedefs[type],
+      "raw_pass_type": typedefs[type],
+      "raw_return_type": typedefs[type],
+      "default_value": defaults[type],
+      "is_primitive": True
   }
 
-
 def wrap_array_definition(type):
   # pylint: disable=W0622
   return {
@@ -424,6 +425,22 @@ def all_references(self, json):
         refs.add(json["$ref"])
     return refs
 
+  def check_if_dependency_declared(self, domain, refs):
+    dependencies = domain.get('dependencies', set())
+    for ref in refs:
+      type_definition = self.type_definitions[ref]
+      if type_definition.get('is_primitive', False):
+        continue
+      domain_match = re.match(r'^(.*)[.]', ref)
+      if domain_match:
+        referenced_domain_name = domain_match.group(1)
+        if referenced_domain_name != domain[
+            'domain'] and not referenced_domain_name in dependencies:
+          sys.stderr.write((
+              "Domains [%s] uses type [%s] from domain [%s], but did not declare the dependency\n\n"
+          ) % (domain["domain"], ref, referenced_domain_name))
+          exit(1)
+
   def generate_used_types(self):
     all_refs = set()
     for domain in self.json_api["domains"]:
@@ -431,11 +448,19 @@ def generate_used_types(self):
       if "commands" in domain:
         for command in domain["commands"]:
           if self.generate_command(domain_name, command["name"]):
-            all_refs |= self.all_references(command)
+            all_refs_command = self.all_references(command)
+            # If the command has a redirect, it is as if it didn't exist on this domain.
+            if not command.get('redirect', False):
+              self.check_if_dependency_declared(domain, all_refs_command)
+            all_refs |= all_refs_command
+
       if "events" in domain:
         for event in domain["events"]:
           if self.generate_event(domain_name, event["name"]):
-            all_refs |= self.all_references(event)
+            all_refs_event = self.all_references(event)
+            self.check_if_dependency_declared(domain, all_refs_event)
+            all_refs |= all_refs_event
+
 
     dependencies = self.generate_type_dependencies()
     queue = set(all_refs)
diff --git a/deps/v8/third_party/inspector_protocol/concatenate_protocols.py b/deps/v8/third_party/inspector_protocol/concatenate_protocols.py
index a2e869431c3ac6..11f1fed06c49f6 100755
--- a/deps/v8/third_party/inspector_protocol/concatenate_protocols.py
+++ b/deps/v8/third_party/inspector_protocol/concatenate_protocols.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-# Copyright 2016 The Chromium Authors. All rights reserved.
+# Copyright 2016 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/convert_protocol_to_json.py b/deps/v8/third_party/inspector_protocol/convert_protocol_to_json.py
index 23f8622d3e4890..e099c346e37389 100755
--- a/deps/v8/third_party/inspector_protocol/convert_protocol_to_json.py
+++ b/deps/v8/third_party/inspector_protocol/convert_protocol_to_json.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-# Copyright 2017 The Chromium Authors. All rights reserved.
+# Copyright 2017 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/cbor.cc b/deps/v8/third_party/inspector_protocol/crdtp/cbor.cc
index b2d5c2e1037a77..d6359f72a6fc4a 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/cbor.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/cbor.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -344,7 +344,7 @@ void EncodeDouble(double value, std::vector<uint8_t>* out) {
 void EnvelopeEncoder::EncodeStart(std::vector<uint8_t>* out) {
   assert(byte_size_pos_ == 0);
   out->push_back(kInitialByteForEnvelope);
-  // TODO(caseq): encode tag as an additional byte here.
+  out->push_back(kCBOREnvelopeTag);
   out->push_back(kInitialByteFor32BitLengthByteString);
   byte_size_pos_ = out->size();
   out->resize(out->size() + sizeof(uint32_t));
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/cbor.h b/deps/v8/third_party/inspector_protocol/crdtp/cbor.h
index 6e3fcef30996f4..9e71e07163458d 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/cbor.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/cbor.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/cbor_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/cbor_test.cc
index 3fcf702eb173ec..abf64d3a92fbad 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/cbor_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/cbor_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -727,9 +727,9 @@ TEST(JsonCborRoundtrip, EncodingDecoding) {
   span<uint8_t> ascii_in = SpanFrom(json);
   json::ParseJSON(ascii_in, encoder.get());
   std::vector<uint8_t> expected = {
-      0xd8,            // envelope
-      0x5a,            // byte string with 32 bit length
-      0,    0, 0, 94,  // length is 94 bytes
+      0xd8, 0x18,         // envelope
+      0x5a,               // byte string with 32 bit length
+      0,    0,    0, 95,  // length is 95 bytes
   };
   expected.push_back(0xbf);  // indef length map start
   EncodeString8(SpanFrom("string"), &expected);
@@ -752,7 +752,8 @@ TEST(JsonCborRoundtrip, EncodingDecoding) {
   EncodeString8(SpanFrom("null"), &expected);
   expected.push_back(7 << 5 | 22);  // RFC 7049 Section 2.3, Table 2: null
   EncodeString8(SpanFrom("array"), &expected);
-  expected.push_back(0xd8);  // envelope
+  expected.push_back(0xd8);  // envelope (tag first byte)
+  expected.push_back(0x18);  // envelope (tag second byte)
   expected.push_back(0x5a);  // byte string with 32 bit length
   // the length is 5 bytes (that's up to end indef length array below).
   for (uint8_t ch : std::array<uint8_t, 4>{{0, 0, 0, 5}})
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/dispatch.cc b/deps/v8/third_party/inspector_protocol/crdtp/dispatch.cc
index ff0d291d4242dd..c0939f0e740acc 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/dispatch.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/dispatch.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/dispatch.h b/deps/v8/third_party/inspector_protocol/crdtp/dispatch.h
index f57a9c6ff02b01..b035e21930cbc6 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/dispatch.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/dispatch.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/dispatch_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/dispatch_test.cc
index 8eacdee93e7c9e..faef35503bea18 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/dispatch_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/dispatch_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -267,8 +267,8 @@ TEST(DispatchableTest, FaultyCBORTrailingJunk) {
   Dispatchable dispatchable(SpanFrom(cbor));
   EXPECT_FALSE(dispatchable.ok());
   EXPECT_EQ(DispatchCode::PARSE_ERROR, dispatchable.DispatchError().Code());
-  EXPECT_EQ(56u, trailing_junk_pos);
-  EXPECT_EQ("CBOR: trailing junk at position 56",
+  EXPECT_EQ(57u, trailing_junk_pos);
+  EXPECT_EQ("CBOR: trailing junk at position 57",
             dispatchable.DispatchError().Message());
 }
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/error_support.cc b/deps/v8/third_party/inspector_protocol/crdtp/error_support.cc
index 6fc6a033d55976..caf3009a7aee2c 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/error_support.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/error_support.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/error_support.h b/deps/v8/third_party/inspector_protocol/crdtp/error_support.h
index 34e2ce21186e1b..45d2ef7d9da3a3 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/error_support.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/error_support.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/error_support_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/error_support_test.cc
index f7c075d6e7bdef..af86f70fe6a122 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/error_support_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/error_support_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/export.h b/deps/v8/third_party/inspector_protocol/crdtp/export.h
index a97722e746d02c..b814e16e5e12aa 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/export.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/export.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/find_by_first.h b/deps/v8/third_party/inspector_protocol/crdtp/find_by_first.h
index ae4224141364cc..2469bd7654435e 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/find_by_first.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/find_by_first.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/find_by_first_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/find_by_first_test.cc
index 67d5114869e820..b62ec72167fd1b 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/find_by_first_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/find_by_first_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/frontend_channel.h b/deps/v8/third_party/inspector_protocol/crdtp/frontend_channel.h
index eba8b2acbdaa55..9f12930a1de4df 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/frontend_channel.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/frontend_channel.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/glue.h b/deps/v8/third_party/inspector_protocol/crdtp/glue.h
index 359c355846c1a0..3a69a5409899b5 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/glue.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/glue.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/glue_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/glue_test.cc
index 95160352ca7482..2a2c74c20fb6f3 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/glue_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/glue_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/json.cc b/deps/v8/third_party/inspector_protocol/crdtp/json.cc
index ed27d72e90b27c..47ada8518b29d4 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/json.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/json.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/json.h b/deps/v8/third_party/inspector_protocol/crdtp/json.h
index 63fce408bdf8a3..3600b9038a9972 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/json.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/json.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/json_platform.h b/deps/v8/third_party/inspector_protocol/crdtp/json_platform.h
index 5a3be592855634..80e57df25f9795 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/json_platform.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/json_platform.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/json_platform_v8.cc b/deps/v8/third_party/inspector_protocol/crdtp/json_platform_v8.cc
index 497bb708e5885f..891aa3e8d42eaa 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/json_platform_v8.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/json_platform_v8.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The V8 Authors. All rights reserved.
+// Copyright 2019 The V8 Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/json_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/json_test.cc
index 4dce7e89bb4d95..7e25888faeb1f0 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/json_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/json_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/maybe.h b/deps/v8/third_party/inspector_protocol/crdtp/maybe.h
index 97844b65a180f6..a476dd58101ff5 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/maybe.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/maybe.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 #ifndef V8_CRDTP_MAYBE_H_
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/maybe_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/maybe_test.cc
index 8e8690a1c13288..e8b549a5d83fe8 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/maybe_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/maybe_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/parser_handler.h b/deps/v8/third_party/inspector_protocol/crdtp/parser_handler.h
index 47bbe6d5e8a1e7..c583e35ad440b0 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/parser_handler.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/parser_handler.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/protocol_core.cc b/deps/v8/third_party/inspector_protocol/crdtp/protocol_core.cc
index 9263c50fd3e479..c432a91a4e8578 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/protocol_core.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/protocol_core.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/protocol_core.h b/deps/v8/third_party/inspector_protocol/crdtp/protocol_core.h
index f61bb5783b1b97..486bf7b2d6b5f8 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/protocol_core.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/protocol_core.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -9,6 +9,7 @@
 
 #include <memory>
 #include <string>
+#include <tuple>
 #include <vector>
 
 #include "cbor.h"
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/protocol_core_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/protocol_core_test.cc
index fcf9c2f9919641..9f92b3ae0b30e8 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/protocol_core_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/protocol_core_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/serializable.cc b/deps/v8/third_party/inspector_protocol/crdtp/serializable.cc
index 7a21ffd35fed0a..8c17569d970afc 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/serializable.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/serializable.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/serializable.h b/deps/v8/third_party/inspector_protocol/crdtp/serializable.h
index 66386711b0d79d..01c1f8b46151ba 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/serializable.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/serializable.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/serializable_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/serializable_test.cc
index d28ca69edd363c..cea9a2ec06caba 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/serializable_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/serializable_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/span.cc b/deps/v8/third_party/inspector_protocol/crdtp/span.cc
index 5953ba128755e7..7f6e7ec4019dd3 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/span.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/span.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/span.h b/deps/v8/third_party/inspector_protocol/crdtp/span.h
index ea3a6f4962f045..8f132636f3b317 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/span.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/span.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/span_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/span_test.cc
index 0f31e5a6bab760..0d4fd79760ff96 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/span_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/span_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/status.cc b/deps/v8/third_party/inspector_protocol/crdtp/status.cc
index 8d04e8e17f36a6..703eacc3286e6e 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/status.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/status.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/status.h b/deps/v8/third_party/inspector_protocol/crdtp/status.h
index 2439b1bcbed3ac..10745f83e024be 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/status.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/status.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/status_test.cc b/deps/v8/third_party/inspector_protocol/crdtp/status_test.cc
index 420686c72fe4a7..8fdfb6282357be 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/status_test.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/status_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/status_test_support.cc b/deps/v8/third_party/inspector_protocol/crdtp/status_test_support.cc
index 00362db24b6ede..c36bbae9557961 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/status_test_support.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/status_test_support.cc
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/status_test_support.h b/deps/v8/third_party/inspector_protocol/crdtp/status_test_support.h
index e9eef19a6852e0..3ae8eaa3de3649 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/status_test_support.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/status_test_support.h
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/test_platform.h b/deps/v8/third_party/inspector_protocol/crdtp/test_platform.h
index c7dc7a8a7aa7b4..e6698f252e2097 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/test_platform.h
+++ b/deps/v8/third_party/inspector_protocol/crdtp/test_platform.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The V8 Authors. All rights reserved.
+// Copyright 2019 The V8 Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/crdtp/test_platform_v8.cc b/deps/v8/third_party/inspector_protocol/crdtp/test_platform_v8.cc
index 51752772edb85e..c9d89eaa42f1d8 100644
--- a/deps/v8/third_party/inspector_protocol/crdtp/test_platform_v8.cc
+++ b/deps/v8/third_party/inspector_protocol/crdtp/test_platform_v8.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The V8 Authors. All rights reserved.
+// Copyright 2019 The V8 Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/inspector_protocol.gni b/deps/v8/third_party/inspector_protocol/inspector_protocol.gni
index 1e2a30cf5b77fa..8002f0794c5251 100644
--- a/deps/v8/third_party/inspector_protocol/inspector_protocol.gni
+++ b/deps/v8/third_party/inspector_protocol/inspector_protocol.gni
@@ -1,4 +1,4 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
+# Copyright 2016 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/lib/Forward_h.template b/deps/v8/third_party/inspector_protocol/lib/Forward_h.template
index 4a1a6d707da683..4de0eeb803174b 100644
--- a/deps/v8/third_party/inspector_protocol/lib/Forward_h.template
+++ b/deps/v8/third_party/inspector_protocol/lib/Forward_h.template
@@ -1,6 +1,6 @@
 // This file is generated by Forward_h.template.
 
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/lib/Object_cpp.template b/deps/v8/third_party/inspector_protocol/lib/Object_cpp.template
index b639b1bb776ad0..2b08cee303d335 100644
--- a/deps/v8/third_party/inspector_protocol/lib/Object_cpp.template
+++ b/deps/v8/third_party/inspector_protocol/lib/Object_cpp.template
@@ -1,6 +1,6 @@
 // This file is generated by Object_cpp.template.
 
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/lib/Object_h.template b/deps/v8/third_party/inspector_protocol/lib/Object_h.template
index f0dce5d1b7f198..fe4df6b9cc7d5e 100644
--- a/deps/v8/third_party/inspector_protocol/lib/Object_h.template
+++ b/deps/v8/third_party/inspector_protocol/lib/Object_h.template
@@ -1,6 +1,6 @@
 // This file is generated by Object_h.template.
 
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/lib/Protocol_cpp.template b/deps/v8/third_party/inspector_protocol/lib/Protocol_cpp.template
index 88303a27ab9e7e..84bd6e70d6b200 100644
--- a/deps/v8/third_party/inspector_protocol/lib/Protocol_cpp.template
+++ b/deps/v8/third_party/inspector_protocol/lib/Protocol_cpp.template
@@ -1,6 +1,6 @@
 // This file is generated by Protocol_cpp.template.
 
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/lib/ValueConversions_cpp.template b/deps/v8/third_party/inspector_protocol/lib/ValueConversions_cpp.template
index 998808be6c6dc3..d2ab41a2dbab6a 100644
--- a/deps/v8/third_party/inspector_protocol/lib/ValueConversions_cpp.template
+++ b/deps/v8/third_party/inspector_protocol/lib/ValueConversions_cpp.template
@@ -1,6 +1,6 @@
 // This file is generated by ValueConversions_cpp.template.
 
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/lib/ValueConversions_h.template b/deps/v8/third_party/inspector_protocol/lib/ValueConversions_h.template
index 0fac003d90cbc1..bf05014f10154f 100644
--- a/deps/v8/third_party/inspector_protocol/lib/ValueConversions_h.template
+++ b/deps/v8/third_party/inspector_protocol/lib/ValueConversions_h.template
@@ -1,6 +1,6 @@
 // This file is generated by ValueConversions_h.template.
 
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/lib/Values_cpp.template b/deps/v8/third_party/inspector_protocol/lib/Values_cpp.template
index ac35475c3865af..dbc51694db2fa6 100644
--- a/deps/v8/third_party/inspector_protocol/lib/Values_cpp.template
+++ b/deps/v8/third_party/inspector_protocol/lib/Values_cpp.template
@@ -1,6 +1,6 @@
 // This file is generated by Values_cpp.template.
 
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/lib/Values_h.template b/deps/v8/third_party/inspector_protocol/lib/Values_h.template
index 53087c914ca8c9..30cd0e16323517 100644
--- a/deps/v8/third_party/inspector_protocol/lib/Values_h.template
+++ b/deps/v8/third_party/inspector_protocol/lib/Values_h.template
@@ -1,6 +1,6 @@
 // This file is generated by Values_h.template.
 
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/pdl.py b/deps/v8/third_party/inspector_protocol/pdl.py
index 9a9fec9898823d..6b448c07443c7e 100644
--- a/deps/v8/third_party/inspector_protocol/pdl.py
+++ b/deps/v8/third_party/inspector_protocol/pdl.py
@@ -1,4 +1,4 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
+# Copyright 2018 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/roll.py b/deps/v8/third_party/inspector_protocol/roll.py
index 1b7bc54e3695d3..0e3520ad70f430 100755
--- a/deps/v8/third_party/inspector_protocol/roll.py
+++ b/deps/v8/third_party/inspector_protocol/roll.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-# Copcright 2019 The Chromium Authors. All rights reserved.
+# Copyright 2019 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/templates/Exported_h.template b/deps/v8/third_party/inspector_protocol/templates/Exported_h.template
index 6481eef50c6889..f00875ac77a2a1 100644
--- a/deps/v8/third_party/inspector_protocol/templates/Exported_h.template
+++ b/deps/v8/third_party/inspector_protocol/templates/Exported_h.template
@@ -1,6 +1,6 @@
 // This file is generated by Exported_h.template.
 
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/templates/Imported_h.template b/deps/v8/third_party/inspector_protocol/templates/Imported_h.template
index 47f27ac1081a53..5161d27351be47 100644
--- a/deps/v8/third_party/inspector_protocol/templates/Imported_h.template
+++ b/deps/v8/third_party/inspector_protocol/templates/Imported_h.template
@@ -1,6 +1,6 @@
 // This file is generated by Imported_h.template.
 
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/templates/TypeBuilder_cpp.template b/deps/v8/third_party/inspector_protocol/templates/TypeBuilder_cpp.template
index 1ddd98dc593fc6..42e832133b1e7c 100644
--- a/deps/v8/third_party/inspector_protocol/templates/TypeBuilder_cpp.template
+++ b/deps/v8/third_party/inspector_protocol/templates/TypeBuilder_cpp.template
@@ -1,6 +1,6 @@
 // This file is generated by TypeBuilder_cpp.template.
 
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/inspector_protocol/templates/TypeBuilder_h.template b/deps/v8/third_party/inspector_protocol/templates/TypeBuilder_h.template
index c2e21a2d31eea8..9b42833014e57d 100644
--- a/deps/v8/third_party/inspector_protocol/templates/TypeBuilder_h.template
+++ b/deps/v8/third_party/inspector_protocol/templates/TypeBuilder_h.template
@@ -1,6 +1,6 @@
 // This file is generated by TypeBuilder_h.template.
 
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/ittapi/CMakeLists.txt b/deps/v8/third_party/ittapi/CMakeLists.txt
new file mode 100644
index 00000000000000..0e3baac30511ef
--- /dev/null
+++ b/deps/v8/third_party/ittapi/CMakeLists.txt
@@ -0,0 +1,93 @@
+#
+# Copyright (C) 2005-2019 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+#
+
+cmake_minimum_required(VERSION 2.8.12)
+
+project(ittapi)
+
+OPTION(FORCE_32 "Force a 32bit compile on 64bit" OFF)
+OPTION(ITT_API_IPT_SUPPORT "ptmarks support")
+
+IF(FORCE_32 AND UNIX)
+    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
+ENDIF()
+
+if(CMAKE_SIZEOF_VOID_P MATCHES "8" AND NOT(FORCE_32))
+    set(ARCH_64 1)
+endif()
+
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+    add_definitions(-D_DEBUG)
+    if (NOT WIN32)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
+        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
+    endif()
+else()
+    if (NOT WIN32)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
+        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
+    endif()
+    add_definitions(-DNDEBUG)
+endif()
+
+set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
+
+foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
+    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
+    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG}     ${LIBRARY_OUTPUT_PATH} )
+endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
+
+set(ITT_PUBLIC_HDRS
+    include/ittnotify.h
+    include/jitprofiling.h
+    include/libittnotify.h
+)
+
+if (ITT_API_IPT_SUPPORT)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DITT_API_IPT_SUPPORT")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DITT_API_IPT_SUPPORT")
+    if (NOT WIN32)
+        enable_language(ASM)
+        if (ARCH_64)
+            set(ITT_PT src/ittnotify/ittptmark64.S)
+        else()
+            set(ASM_OPTIONS "-m32")
+            set(ITT_PT src/ittnotify/ittptmark32.S)
+        endif()
+        set(CMAKE_ASM_FLAGS "${CFLAGS} ${ASM_OPTIONS}" )
+    else()
+        enable_language(ASM_MASM)
+        if (ARCH_64)
+            set(ITT_PT src/ittnotify/ittptmark64.asm)
+	else()
+            set(ITT_PT src/ittnotify/ittptmark32.asm)
+        endif()
+    endif()
+endif()
+
+file(GLOB ITT_SRCS "src/ittnotify/*.c" "src/ittnotify/*.h")
+
+add_library(ittnotify STATIC ${ITT_SRCS} ${ITT_PUBLIC_HDRS} ${ITT_PT})
+
+if(WIN32)
+    SET_TARGET_PROPERTIES(ittnotify PROPERTIES OUTPUT_NAME libittnotify)
+else()
+    SET_TARGET_PROPERTIES(ittnotify PROPERTIES OUTPUT_NAME ittnotify)
+endif()
+
+if (NOT WIN32)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
+    TARGET_LINK_LIBRARIES(ittnotify dl)
+endif()
+
+SET_TARGET_PROPERTIES(ittnotify PROPERTIES LINKER_LANGUAGE C)
+
+target_include_directories(ittnotify
+    PUBLIC include src/ittnotify
+)
+
+set(CMAKE_SUPPRESS_REGENERATION true)
diff --git a/deps/v8/third_party/ittapi/LICENSES/BSD-3-Clause.txt b/deps/v8/third_party/ittapi/LICENSES/BSD-3-Clause.txt
new file mode 100644
index 00000000000000..37478a55f35f5a
--- /dev/null
+++ b/deps/v8/third_party/ittapi/LICENSES/BSD-3-Clause.txt
@@ -0,0 +1,8 @@
+Copyright (c) 2019 Intel Corporation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/deps/v8/third_party/ittapi/LICENSES/GPL-2.0-only.txt b/deps/v8/third_party/ittapi/LICENSES/GPL-2.0-only.txt
new file mode 100644
index 00000000000000..be1e815450496e
--- /dev/null
+++ b/deps/v8/third_party/ittapi/LICENSES/GPL-2.0-only.txt
@@ -0,0 +1,103 @@
+GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+<one line to give the program's name and an idea of what it does.>
+Copyright (C) < yyyy> <name of author>
+
+This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+<signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.
diff --git a/deps/v8/third_party/ittapi/README.md b/deps/v8/third_party/ittapi/README.md
new file mode 100644
index 00000000000000..4844f55651706a
--- /dev/null
+++ b/deps/v8/third_party/ittapi/README.md
@@ -0,0 +1,38 @@
+Intel® Instrumentation and Tracing Technology (ITT) and Just-In-Time (JIT) API
+==================================================================================
+
+This ITT/JIT open source profiling API includes:
+
+  - Instrumentation and Tracing Technology (ITT) API
+  - Just-In-Time (JIT) Profiling API
+
+The Instrumentation and Tracing Technology (ITT) API enables your application
+to generate and control the collection of trace data during its execution 
+across different Intel tools.
+
+ITT API consists of two parts: a _static part_ and a _dynamic part_. The
+_dynamic part_ is specific for a tool and distributed only with a particular
+tool. The _static part_ is a common part shared between tools. Currently, the
+static part of ITT API is distributed as a static library and released under
+a BSD/GPLv2 dual license with every tool supporting ITT API.
+
+### Build
+
+To build the library:
+ - On Windows, Linux and OSX: requires [cmake](https://cmake.org) to be set in `PATH`
+ - Windows: requires Visual Studio installed or requires [Ninja](https://github.com/ninja-build/ninja/releases) to be set in `PATH`
+ - To list available build options execute: `python buildall.py -h`
+```
+usage: buildall.py [-h] [-d] [-c] [-v] [-pt] [--force_bits]
+
+optional arguments:
+  -h, --help     show this help message and exit
+  -d, --debug    specify debug build configuration (release by default)
+  -c, --clean    delete any intermediate and output files
+  -v, --verbose  enable verbose output from build process
+  -pt, --ptmark  enable anomaly detection support
+  --force_bits   specify bit version for the target
+```
+### License
+
+All code in the repo is dual licensed under GPLv2 and 3-Clause BSD licenses
diff --git a/deps/v8/third_party/ittapi/buildall.py b/deps/v8/third_party/ittapi/buildall.py
new file mode 100755
index 00000000000000..f03eafbe7c89ee
--- /dev/null
+++ b/deps/v8/third_party/ittapi/buildall.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2005-2019 Intel Corporation
+#
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+#
+
+from __future__ import print_function
+import os
+import sys
+import shutil
+import fnmatch
+import subprocess
+
+
+def run_shell(cmd):
+    print("\n>>", cmd)
+    os.system(cmd)
+
+
+if sys.platform == 'win32':
+    def read_registry(path, depth=0xFFFFFFFF, statics={}):
+        try:
+            import _winreg
+        except ImportError:
+            import winreg as _winreg
+        parts = path.split('\\')
+        hub = parts[0]
+        path = '\\'.join(parts[1:])
+        if not statics:
+            statics['hubs'] = {'HKLM': _winreg.HKEY_LOCAL_MACHINE, 'HKCL': _winreg.HKEY_CLASSES_ROOT}
+
+        def enum_nodes(curpath, level):
+            if level < 1:
+                return {}
+            res = {}
+            try:
+                aKey = _winreg.OpenKey(statics['hubs'][hub], curpath, 0, _winreg.KEY_READ | _winreg.KEY_WOW64_64KEY)
+            except WindowsError:
+                return res
+
+            try:
+                i = 0
+                while True:
+                    name, value, _ = _winreg.EnumValue(aKey, i)
+                    i += 1
+                    res[name] = value
+            except WindowsError:
+                pass
+
+            keys = []
+            try:
+                i = 0
+                while True:
+                    key = _winreg.EnumKey(aKey, i)
+                    i += 1
+                    keys.append(key)
+            except WindowsError:
+                pass
+
+            _winreg.CloseKey(aKey)
+
+            for key in keys:
+                res[key] = enum_nodes(curpath + '\\' + key, level - 1)
+
+            return res
+
+        return enum_nodes(path, depth)
+
+
+def get_vs_versions():  # https://www.mztools.com/articles/2008/MZ2008003.aspx
+    if sys.platform != 'win32':
+        return []
+    versions = []
+
+    hkcl = read_registry(r'HKCL', 1)
+    for key in hkcl:
+        if 'VisualStudio.DTE.' in key:
+            version = key.split('.')[2]
+            if int(version) >= 12:
+                versions.append(version)
+
+    if not versions:
+        print("No Visual Studio version found")
+    return sorted(versions)
+
+
+def detect_cmake():
+    if sys.platform == 'darwin':
+        path, err = subprocess.Popen("which cmake", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+        if not path.strip():
+            path, err = subprocess.Popen("which xcrun", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+            if not path.strip():
+                print("No cmake and no XCode found...")
+                return None
+            return 'xcrun cmake'
+    return 'cmake'
+
+
+def main():
+    import argparse
+    parser = argparse.ArgumentParser()
+    vs_versions = get_vs_versions()
+    parser.add_argument("-d", "--debug", help="specify debug build configuration (release by default)", action="store_true")
+    parser.add_argument("-c", "--clean", help="delete any intermediate and output files", action="store_true")
+    parser.add_argument("-v", "--verbose", help="enable verbose output from build process", action="store_true")
+    parser.add_argument("-pt", "--ptmark", help="enable anomaly detection support", action="store_true")
+    parser.add_argument("--force_bits", choices=["32", "64"], help="specify bit version for the target")
+    if sys.platform == 'win32' and vs_versions:
+        parser.add_argument("--vs", help="specify visual studio version {default}", choices=vs_versions, default=vs_versions[0])
+    args = parser.parse_args()
+
+    if args.force_bits:
+        target_bits = [args.force_bits]
+    else:
+        target_bits = ['64']
+        if (sys.platform != 'darwin'):  # on MAC OSX we produce FAT library including both 32 and 64 bits
+            target_bits.append('32')
+
+    print("target_bits", target_bits)
+    work_dir = os.getcwd()
+    if args.clean:
+        bin_dir = os.path.join(work_dir, 'bin')
+        if os.path.exists(bin_dir):
+            shutil.rmtree(bin_dir)
+    for bits in target_bits:
+        work_folder = os.path.join(work_dir, "build_" + (sys.platform.replace('32', "")), bits)
+        already_there = os.path.exists(work_folder)
+        if already_there and args.clean:
+            shutil.rmtree(work_folder)
+            already_there = False
+        if not already_there:
+            os.makedirs(work_folder)
+        print("work_folder: ", work_folder)
+        os.chdir(work_folder)
+        if args.clean:
+            continue
+
+        cmake = detect_cmake()
+        if not cmake:
+            print("Error: cmake is not found")
+            return
+
+        if sys.platform == 'win32':
+            if vs_versions:
+                generator = ('Visual Studio %s' % args.vs) + (' Win64' if bits == '64' else '')
+            else:
+                generator = 'Ninja'
+        else:
+            generator = 'Unix Makefiles'
+        run_shell('%s "%s" -G"%s" %s' % (cmake, work_dir, generator, " ".join([
+            ("-DFORCE_32=ON" if bits == '32' else ""),
+            ("-DCMAKE_BUILD_TYPE=Debug" if args.debug else ""),
+            ('-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON' if args.verbose else ''),
+            ("-DITT_API_IPT_SUPPORT=1" if args.ptmark else "")
+        ])))
+        if sys.platform == 'win32':
+            target_project = 'ALL_BUILD'
+            run_shell('%s --build . --config %s --target %s' % (cmake, ('Debug' if args.debug else 'Release'), target_project))
+        else:
+            import glob
+            run_shell('%s --build . --config %s' % (cmake, ('Debug' if args.debug else 'Release')))
+            if ('linux' in sys.platform and bits == '64'):
+                continue
+            run_shell('%s --build . --config %s --target' % (cmake, ('Debug' if args.debug else 'Release')))
+
+if __name__== "__main__":
+    main()
+
diff --git a/deps/v8/third_party/ittapi/include/fortran/posix/ittnotify.f90 b/deps/v8/third_party/ittapi/include/fortran/posix/ittnotify.f90
new file mode 100644
index 00000000000000..9a9aa2c2bc9af0
--- /dev/null
+++ b/deps/v8/third_party/ittapi/include/fortran/posix/ittnotify.f90
@@ -0,0 +1,473 @@
+! ========================================================================
+! <copyright>
+!  This file is provided under a dual BSD/GPLv2 license.  When using or
+!  redistributing this file, you may do so under either license.
+!
+!  GPL LICENSE SUMMARY
+!
+!  Copyright (c) 2005-2017 Intel Corporation. All rights reserved.
+!
+!  This program is free software; you can redistribute it and/or modify
+!  it under the terms of version 2 of the GNU General Public License as
+!  published by the Free Software Foundation.
+!
+!  This program is distributed in the hope that it will be useful, but
+!  WITHOUT ANY WARRANTY; without even the implied warranty of
+!  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!  General Public License for more details.
+!
+!  You should have received a copy of the GNU General Public License
+!  along with this program; if not, write to the Free Software
+!  Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+!  The full GNU General Public License is included in this distribution
+!  in the file called LICENSE.GPL.
+!
+!  Contact Information:
+!  http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
+!
+!  BSD LICENSE
+!
+!  Copyright (c) 2005-2017 Intel Corporation. All rights reserved.
+!  All rights reserved.
+!
+!  Redistribution and use in source and binary forms, with or without
+!  modification, are permitted provided that the following conditions
+!  are met:
+!
+!    * Redistributions of source code must retain the above copyright
+!      notice, this list of conditions and the following disclaimer.
+!    * Redistributions in binary form must reproduce the above copyright
+!      notice, this list of conditions and the following disclaimer in
+!      the documentation and/or other materials provided with the
+!      distribution.
+!    * Neither the name of Intel Corporation nor the names of its
+!      contributors may be used to endorse or promote products derived
+!      from this software without specific prior written permission.
+!
+!  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+!  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+!  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+!  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+!  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+!  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+!  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+!  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+!  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+!  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+!  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+! </copyright>
+! ========================================================================
+!
+
+!--------
+!
+! This file defines functions used by Intel(R) Parallel Inspector and
+! Amplifier.
+!
+! Version of ittnotify that was used to generate this file. 
+! This is not Fortran code that can be used to check but rather a comment 
+! that only serves to identify the interface. 
+! INTEL_ITT_FORTRAN_API_VERSION 3.0
+!--------
+
+module ittnotify                                                                 
+    use, intrinsic :: iso_c_binding, only: C_PTR, C_FUNPTR, C_INT, C_CHAR, C_NULL_CHAR, C_F_PROCPOINTER, C_LOC, C_ASSOCIATED
+    implicit none                                                                
+
+    !--------                                                                    
+    !                                                                            
+    ! Public interface                                                           
+    !                                                                            
+    !--------
+    integer, parameter :: itt_ptr     = int_ptr_kind()
+    public :: itt_pause
+    public :: itt_resume
+    public :: itt_thread_ignore
+    public :: itt_suppress_push
+    public :: itt_suppress_pop
+    public :: itt_suppress_mark_range
+    public :: itt_suppress_clear_range
+    public :: itt_sync_prepare
+    public :: itt_sync_cancel
+    public :: itt_sync_acquired
+    public :: itt_sync_releasing
+    public :: itt_fsync_prepare
+    public :: itt_fsync_cancel
+    public :: itt_fsync_acquired
+    public :: itt_fsync_releasing
+    public :: itt_sync_destroy
+    public :: itt_sync_create
+    public :: itt_sync_rename
+    public :: itt_thread_set_name
+    public :: itt_heap_record_memory_growth_begin
+    public :: itt_heap_record_memory_growth_end
+    public :: itt_heap_reset_detection
+    public :: itt_heap_record
+
+    integer, parameter, public :: itt_attr_barrier                 =          1
+    integer, parameter, public :: itt_attr_mutex                   =          2
+    integer, parameter, public :: itt_suppress_threading_errors    =        255
+    integer, parameter, public :: itt_suppress_memory_errors       =      65280
+    integer, parameter, public :: itt_suppress_all_errors          = 2147483647
+    integer, parameter, public :: itt_unsuppress_range             =          0
+    integer, parameter, public :: itt_suppress_range               =          1
+    integer, parameter, public :: itt_heap_leaks                   =          1
+    integer, parameter, public :: itt_heap_growth                  =          2
+
+    private
+
+    abstract interface
+
+      subroutine itt_proc_none() bind(C)
+          import
+      end subroutine itt_proc_none
+
+      subroutine itt_proc_sup_push(mask) bind(C)
+          import
+          integer, intent(in), value :: mask
+      end subroutine itt_proc_sup_push
+
+      subroutine itt_proc_sup_range(action, mask, addr, size) bind(C)
+          import
+          integer, intent(in), value :: action
+          integer, intent(in), value :: mask
+          integer(kind=itt_ptr), intent(in), value :: addr
+          integer(kind=itt_ptr), intent(in), value :: size
+      end subroutine itt_proc_sup_range
+
+      subroutine itt_proc_address(addr) bind(C)
+          import
+          integer(kind=itt_ptr), intent(in), value :: addr
+      end subroutine itt_proc_address
+
+      subroutine itt_proc_create(addr, objname, attribute) bind(C)
+          import
+          integer(kind=itt_ptr), intent(in), value :: addr
+          character(kind=C_CHAR), dimension(*), intent(in) :: objname
+          integer, intent(in), value :: attribute
+      end subroutine itt_proc_create
+
+      subroutine itt_proc_name(name) bind(C)
+          import
+          character(kind=C_CHAR), dimension(*), intent(in) :: name
+      end subroutine itt_proc_name
+
+      subroutine itt_proc_rename(addr, objname) bind(C)
+          import
+          integer(kind=itt_ptr), intent(in), value :: addr
+          character(kind=C_CHAR), dimension(*), intent(in) :: objname
+      end subroutine itt_proc_rename
+
+      subroutine itt_proc_heapmask(heapmask) bind(C)
+          import
+          integer, intent(in), value :: heapmask
+      end subroutine itt_proc_heapmask
+
+    end interface
+
+    type(C_FUNPTR) :: itt_pause_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_pause_ptr__3_0' :: itt_pause_fort_ptr
+    type(C_FUNPTR) :: itt_resume_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_resume_ptr__3_0' :: itt_resume_fort_ptr
+    type(C_FUNPTR) :: itt_thread_ignore_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_thread_ignore_ptr__3_0' :: itt_thread_ignore_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_push_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_suppress_push_ptr__3_0' :: itt_suppress_push_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_pop_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_suppress_pop_ptr__3_0' :: itt_suppress_pop_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_mark_range_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_suppress_mark_range_ptr__3_0' :: itt_suppress_mark_range_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_clear_range_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_suppress_clear_range_ptr__3_0' :: itt_suppress_clear_range_fort_ptr
+    type(C_FUNPTR) :: itt_sync_prepare_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_prepare_ptr__3_0' :: itt_sync_prepare_fort_ptr
+    type(C_FUNPTR) :: itt_sync_cancel_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_cancel_ptr__3_0' :: itt_sync_cancel_fort_ptr
+    type(C_FUNPTR) :: itt_sync_acquired_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_acquired_ptr__3_0' :: itt_sync_acquired_fort_ptr
+    type(C_FUNPTR) :: itt_sync_releasing_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_releasing_ptr__3_0' :: itt_sync_releasing_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_prepare_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_fsync_prepare_ptr__3_0' :: itt_fsync_prepare_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_cancel_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_fsync_cancel_ptr__3_0' :: itt_fsync_cancel_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_acquired_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_fsync_acquired_ptr__3_0' :: itt_fsync_acquired_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_releasing_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_fsync_releasing_ptr__3_0' :: itt_fsync_releasing_fort_ptr
+    type(C_FUNPTR) :: itt_sync_destroy_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_destroy_ptr__3_0' :: itt_sync_destroy_fort_ptr
+    type(C_FUNPTR) :: itt_sync_create_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_create_ptr__3_0' :: itt_sync_create_fort_ptr
+    type(C_FUNPTR) :: itt_sync_rename_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_rename_ptr__3_0' :: itt_sync_rename_fort_ptr
+    type(C_FUNPTR) :: itt_thread_set_name_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_thread_set_name_ptr__3_0' :: itt_thread_set_name_fort_ptr
+    type(C_FUNPTR) :: itt_heap_record_memory_growth_begin_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_heap_record_memory_growth_begin_ptr__3_0' :: itt_heap_record_memory_growth_begin_fort_ptr
+    type(C_FUNPTR) :: itt_heap_record_memory_growth_end_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_heap_record_memory_growth_end_ptr__3_0' :: itt_heap_record_memory_growth_end_fort_ptr
+    type(C_FUNPTR) :: itt_heap_reset_detection_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_heap_reset_detection_ptr__3_0' :: itt_heap_reset_detection_fort_ptr
+    type(C_FUNPTR) :: itt_heap_record_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_heap_record_ptr__3_0' :: itt_heap_record_fort_ptr
+
+    contains
+
+      subroutine itt_pause()
+          procedure(itt_proc_none), pointer :: pause_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_pause
+          if (C_ASSOCIATED(itt_pause_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_pause_fort_ptr, pause_ptr)
+              call pause_ptr()
+          end if
+      end subroutine itt_pause
+
+      subroutine itt_resume()
+          procedure(itt_proc_none), pointer :: resume_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_resume
+          if (C_ASSOCIATED(itt_resume_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_resume_fort_ptr, resume_ptr)
+              call resume_ptr()
+          end if
+      end subroutine itt_resume
+
+      subroutine itt_thread_ignore()
+          procedure(itt_proc_none), pointer :: thread_ignore_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_thread_ignore
+          if (C_ASSOCIATED(itt_thread_ignore_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_thread_ignore_fort_ptr, thread_ignore_ptr)
+              call thread_ignore_ptr()
+          end if
+      end subroutine itt_thread_ignore
+
+      subroutine itt_suppress_push(mask)
+          procedure(itt_proc_sup_push), pointer :: suppress_push_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_suppress_push
+          integer, intent(in), value :: mask
+          if (C_ASSOCIATED(itt_suppress_push_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_suppress_push_fort_ptr, suppress_push_ptr)
+              call suppress_push_ptr(mask)
+          end if
+      end subroutine itt_suppress_push
+
+      subroutine itt_suppress_pop()
+          procedure(itt_proc_none), pointer :: suppress_pop_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_suppress_pop
+          if (C_ASSOCIATED(itt_suppress_pop_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_suppress_pop_fort_ptr, suppress_pop_ptr)
+              call suppress_pop_ptr()
+          end if
+      end subroutine itt_suppress_pop
+
+      subroutine itt_suppress_mark_range(action, mask, addr, size)
+          procedure(itt_proc_sup_range), pointer :: suppress_mark_range_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_suppress_mark_range
+          integer, intent(in), value :: action
+          integer, intent(in), value :: mask
+          integer(kind=itt_ptr), intent(in), value :: addr
+          integer(kind=itt_ptr), intent(in), value :: size
+          if (C_ASSOCIATED(itt_suppress_mark_range_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_suppress_mark_range_fort_ptr, suppress_mark_range_ptr)
+              call suppress_mark_range_ptr(action, mask, addr, size)
+          end if
+      end subroutine itt_suppress_mark_range
+
+      subroutine itt_suppress_clear_range(action, mask, addr, size)
+          procedure(itt_proc_sup_range), pointer :: suppress_clear_range_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_suppress_clear_range
+          integer, intent(in), value :: action
+          integer, intent(in), value :: mask
+          integer(kind=itt_ptr), intent(in), value :: addr
+          integer(kind=itt_ptr), intent(in), value :: size
+          if (C_ASSOCIATED(itt_suppress_clear_range_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_suppress_clear_range_fort_ptr, suppress_clear_range_ptr)
+              call suppress_clear_range_ptr(action, mask, addr, size)
+          end if
+      end subroutine itt_suppress_clear_range
+
+      subroutine itt_sync_prepare(addr)
+          procedure(itt_proc_address), pointer :: sync_prepare_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_prepare
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_prepare_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_prepare_fort_ptr, sync_prepare_ptr)
+              call sync_prepare_ptr(addr)
+          end if
+      end subroutine itt_sync_prepare
+
+      subroutine itt_sync_cancel(addr)
+          procedure(itt_proc_address), pointer :: sync_cancel_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_cancel
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_cancel_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_cancel_fort_ptr, sync_cancel_ptr)
+              call sync_cancel_ptr(addr)
+          end if
+      end subroutine itt_sync_cancel
+
+      subroutine itt_sync_acquired(addr)
+          procedure(itt_proc_address), pointer :: sync_acquired_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_acquired
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_acquired_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_acquired_fort_ptr, sync_acquired_ptr)
+              call sync_acquired_ptr(addr)
+          end if
+      end subroutine itt_sync_acquired
+
+      subroutine itt_sync_releasing(addr)
+          procedure(itt_proc_address), pointer :: sync_releasing_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_releasing
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_releasing_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_releasing_fort_ptr, sync_releasing_ptr)
+              call sync_releasing_ptr(addr)
+          end if
+      end subroutine itt_sync_releasing
+
+      subroutine itt_fsync_prepare(addr)
+          procedure(itt_proc_address), pointer :: fsync_prepare_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_fsync_prepare
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_fsync_prepare_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_fsync_prepare_fort_ptr, fsync_prepare_ptr)
+              call fsync_prepare_ptr(addr)
+          end if
+      end subroutine itt_fsync_prepare
+
+      subroutine itt_fsync_cancel(addr)
+          procedure(itt_proc_address), pointer :: fsync_cancel_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_fsync_cancel
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_fsync_cancel_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_fsync_cancel_fort_ptr, fsync_cancel_ptr)
+              call fsync_cancel_ptr(addr)
+          end if
+      end subroutine itt_fsync_cancel
+
+      subroutine itt_fsync_acquired(addr)
+          procedure(itt_proc_address), pointer :: fsync_acquired_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_fsync_acquired
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_fsync_acquired_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_fsync_acquired_fort_ptr, fsync_acquired_ptr)
+              call fsync_acquired_ptr(addr)
+          end if
+      end subroutine itt_fsync_acquired
+
+      subroutine itt_fsync_releasing(addr)
+          procedure(itt_proc_address), pointer :: fsync_releasing_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_fsync_releasing
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_fsync_releasing_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_fsync_releasing_fort_ptr, fsync_releasing_ptr)
+              call fsync_releasing_ptr(addr)
+          end if
+      end subroutine itt_fsync_releasing
+
+      subroutine itt_sync_destroy(addr)
+          procedure(itt_proc_address), pointer :: sync_destroy_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_destroy
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_destroy_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_destroy_fort_ptr, sync_destroy_ptr)
+              call sync_destroy_ptr(addr)
+          end if
+      end subroutine itt_sync_destroy
+
+      subroutine itt_sync_create(addr, objname, attribute)
+          procedure(itt_proc_create), pointer :: sync_create_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_create
+          integer(kind=itt_ptr), intent(in), value :: addr
+          character(len=*), intent(in) :: objname
+          integer, intent(in), value :: attribute
+          CHARACTER(LEN=1,KIND=C_CHAR) :: objnametmp(LEN_TRIM(objname)+1)
+          INTEGER                      :: iobjname, nobjname
+          if (C_ASSOCIATED(itt_sync_create_fort_ptr)) then
+              nobjname = LEN_TRIM(objname)
+              DO iobjname = 1, nobjname
+                  objnametmp(iobjname) = objname(iobjname:iobjname)
+              END DO
+              objnametmp(nobjname + 1) = C_NULL_CHAR
+              call C_F_PROCPOINTER(itt_sync_create_fort_ptr, sync_create_ptr)
+              call sync_create_ptr(addr, objnametmp, attribute)
+          end if
+      end subroutine itt_sync_create
+
+      subroutine itt_sync_rename(addr, objname)
+          procedure(itt_proc_rename), pointer :: sync_rename_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_rename
+          integer(kind=itt_ptr), intent(in), value :: addr
+          character(len=*), intent(in) :: objname
+          CHARACTER(LEN=1,KIND=C_CHAR) :: objnametmp(LEN_TRIM(objname)+1)
+          INTEGER                      :: iobjname, nobjname
+          if (C_ASSOCIATED(itt_sync_rename_fort_ptr)) then
+              nobjname = LEN_TRIM(objname)
+              DO iobjname = 1, nobjname
+                  objnametmp(iobjname) = objname(iobjname:iobjname)
+              END DO
+              objnametmp(nobjname + 1) = C_NULL_CHAR
+              call C_F_PROCPOINTER(itt_sync_rename_fort_ptr, sync_rename_ptr)
+              call sync_rename_ptr(addr, objnametmp)
+          end if
+      end subroutine itt_sync_rename
+
+      subroutine itt_thread_set_name(name)
+          procedure(itt_proc_name), pointer :: thread_set_name_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_thread_set_name
+          character(len=*), intent(in) :: name
+          CHARACTER(LEN=1,KIND=C_CHAR) :: nametmp(LEN_TRIM(name)+1)
+          INTEGER                      :: iname, nname
+          if (C_ASSOCIATED(itt_thread_set_name_fort_ptr)) then
+              nname = LEN_TRIM(name)
+              DO iname = 1, nname
+                  nametmp(iname) = name(iname:iname)
+              END DO
+              nametmp(nname + 1) = C_NULL_CHAR
+              call C_F_PROCPOINTER(itt_thread_set_name_fort_ptr, thread_set_name_ptr)
+              call thread_set_name_ptr(nametmp)
+          end if
+      end subroutine itt_thread_set_name
+
+      subroutine itt_heap_record_memory_growth_begin()
+          procedure(itt_proc_none), pointer :: heap_record_memory_growth_begin_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_heap_record_memory_growth_begin
+          if (C_ASSOCIATED(itt_heap_record_memory_growth_begin_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_heap_record_memory_growth_begin_fort_ptr, heap_record_memory_growth_begin_ptr)
+              call heap_record_memory_growth_begin_ptr()
+          end if
+      end subroutine itt_heap_record_memory_growth_begin
+
+      subroutine itt_heap_record_memory_growth_end()
+          procedure(itt_proc_none), pointer :: heap_record_memory_growth_end_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_heap_record_memory_growth_end
+          if (C_ASSOCIATED(itt_heap_record_memory_growth_end_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_heap_record_memory_growth_end_fort_ptr, heap_record_memory_growth_end_ptr)
+              call heap_record_memory_growth_end_ptr()
+          end if
+      end subroutine itt_heap_record_memory_growth_end
+
+      subroutine itt_heap_reset_detection(heapmask)
+          procedure(itt_proc_heapmask), pointer :: heap_reset_detection_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_heap_reset_detection
+          integer, intent(in), value :: heapmask
+          if (C_ASSOCIATED(itt_heap_reset_detection_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_heap_reset_detection_fort_ptr, heap_reset_detection_ptr)
+              call heap_reset_detection_ptr(heapmask)
+          end if
+      end subroutine itt_heap_reset_detection
+
+      subroutine itt_heap_record(heapmask)
+          procedure(itt_proc_heapmask), pointer :: heap_record_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_heap_record
+          integer, intent(in), value :: heapmask
+          if (C_ASSOCIATED(itt_heap_record_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_heap_record_fort_ptr, heap_record_ptr)
+              call heap_record_ptr(heapmask)
+          end if
+      end subroutine itt_heap_record
+
+
+    end module ittnotify
+
diff --git a/deps/v8/third_party/ittapi/include/fortran/win32/ittnotify.f90 b/deps/v8/third_party/ittapi/include/fortran/win32/ittnotify.f90
new file mode 100644
index 00000000000000..ebbcd3d3100035
--- /dev/null
+++ b/deps/v8/third_party/ittapi/include/fortran/win32/ittnotify.f90
@@ -0,0 +1,522 @@
+! ========================================================================
+! <copyright>
+!  This file is provided under a dual BSD/GPLv2 license.  When using or
+!  redistributing this file, you may do so under either license.
+!
+!  GPL LICENSE SUMMARY
+!
+!  Copyright (c) 2005-2017 Intel Corporation. All rights reserved.
+!
+!  This program is free software; you can redistribute it and/or modify
+!  it under the terms of version 2 of the GNU General Public License as
+!  published by the Free Software Foundation.
+!
+!  This program is distributed in the hope that it will be useful, but
+!  WITHOUT ANY WARRANTY; without even the implied warranty of
+!  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!  General Public License for more details.
+!
+!  You should have received a copy of the GNU General Public License
+!  along with this program; if not, write to the Free Software
+!  Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+!  The full GNU General Public License is included in this distribution
+!  in the file called LICENSE.GPL.
+!
+!  Contact Information:
+!  http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
+!
+!  BSD LICENSE
+!
+!  Copyright (c) 2005-2017 Intel Corporation. All rights reserved.
+!  All rights reserved.
+!
+!  Redistribution and use in source and binary forms, with or without
+!  modification, are permitted provided that the following conditions
+!  are met:
+!
+!    * Redistributions of source code must retain the above copyright
+!      notice, this list of conditions and the following disclaimer.
+!    * Redistributions in binary form must reproduce the above copyright
+!      notice, this list of conditions and the following disclaimer in
+!      the documentation and/or other materials provided with the
+!      distribution.
+!    * Neither the name of Intel Corporation nor the names of its
+!      contributors may be used to endorse or promote products derived
+!      from this software without specific prior written permission.
+!
+!  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+!  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+!  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+!  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+!  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+!  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+!  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+!  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+!  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+!  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+!  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+! </copyright>
+! ========================================================================
+!
+
+!--------
+!
+! This file defines functions used by Intel(R) Parallel Inspector and
+! Amplifier.
+!
+! Version of ittnotify that was used to generate this file. 
+! This is not Fortran code that can be used to check but rather a comment 
+! that only serves to identify the interface. 
+! INTEL_ITT_FORTRAN_API_VERSION 3.0
+!--------
+
+module ittnotify
+    use, intrinsic :: iso_c_binding, only: C_PTR, C_FUNPTR, C_INT, C_CHAR, C_NULL_CHAR, C_F_PROCPOINTER, C_LOC, C_ASSOCIATED
+    implicit none
+
+    !--------
+    !
+    ! Public interface
+    !
+    !--------
+    integer, parameter :: itt_ptr     = int_ptr_kind()
+    public :: itt_pause
+    public :: itt_resume
+    public :: itt_thread_ignore
+    public :: itt_suppress_push
+    public :: itt_suppress_pop
+    public :: itt_suppress_mark_range
+    public :: itt_suppress_clear_range
+    public :: itt_sync_prepare
+    public :: itt_sync_cancel
+    public :: itt_sync_acquired
+    public :: itt_sync_releasing
+    public :: itt_fsync_prepare
+    public :: itt_fsync_cancel
+    public :: itt_fsync_acquired
+    public :: itt_fsync_releasing
+    public :: itt_sync_destroy
+    public :: itt_sync_create
+    public :: itt_sync_rename
+    public :: itt_thread_set_name
+    public :: itt_heap_record_memory_growth_begin
+    public :: itt_heap_record_memory_growth_end
+    public :: itt_heap_reset_detection
+    public :: itt_heap_record
+
+    integer, parameter, public :: itt_attr_barrier                 =          1
+    integer, parameter, public :: itt_attr_mutex                   =          2
+    integer, parameter, public :: itt_suppress_threading_errors    =        255
+    integer, parameter, public :: itt_suppress_memory_errors       =      65280
+    integer, parameter, public :: itt_suppress_all_errors          = 2147483647
+    integer, parameter, public :: itt_unsuppress_range             =          0
+    integer, parameter, public :: itt_suppress_range               =          1
+    integer, parameter, public :: itt_heap_leaks                   =          1
+    integer, parameter, public :: itt_heap_growth                  =          2
+
+    private
+
+    abstract interface
+
+      subroutine itt_proc_none() bind(C)
+          import
+      end subroutine itt_proc_none
+
+      subroutine itt_proc_sup_push(mask) bind(C)
+          import
+          integer, intent(in), value :: mask
+      end subroutine itt_proc_sup_push
+
+      subroutine itt_proc_sup_range(action, mask, addr, size) bind(C)
+          import
+          integer, intent(in), value :: action
+          integer, intent(in), value :: mask
+          integer(kind=itt_ptr), intent(in), value :: addr
+          integer(kind=itt_ptr), intent(in), value :: size
+      end subroutine itt_proc_sup_range
+
+      subroutine itt_proc_address(addr) bind(C)
+          import
+          integer(kind=itt_ptr), intent(in), value :: addr
+      end subroutine itt_proc_address
+
+      subroutine itt_proc_create(addr, objname, attribute) bind(C)
+          import
+          integer(kind=itt_ptr), intent(in), value :: addr
+          character(kind=C_CHAR), dimension(*), intent(in) :: objname
+          integer, intent(in), value :: attribute
+      end subroutine itt_proc_create
+
+      subroutine itt_proc_name(name) bind(C)
+          import
+          character(kind=C_CHAR), dimension(*), intent(in) :: name
+      end subroutine itt_proc_name
+
+      subroutine itt_proc_rename(addr, objname) bind(C)
+          import
+          integer(kind=itt_ptr), intent(in), value :: addr
+          character(kind=C_CHAR), dimension(*), intent(in) :: objname
+      end subroutine itt_proc_rename
+
+      subroutine itt_proc_heapmask(heapmask) bind(C)
+          import
+          integer, intent(in), value :: heapmask
+      end subroutine itt_proc_heapmask
+
+    end interface
+
+    !DEC$IF DEFINED(intel64)
+    type(C_FUNPTR) :: itt_pause_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_pause_ptr__3_0' :: itt_pause_fort_ptr
+    type(C_FUNPTR) :: itt_resume_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_resume_ptr__3_0' :: itt_resume_fort_ptr
+    type(C_FUNPTR) :: itt_thread_ignore_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_thread_ignore_ptr__3_0' :: itt_thread_ignore_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_push_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_suppress_push_ptr__3_0' :: itt_suppress_push_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_pop_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_suppress_pop_ptr__3_0' :: itt_suppress_pop_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_mark_range_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_suppress_mark_range_ptr__3_0' :: itt_suppress_mark_range_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_clear_range_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_suppress_clear_range_ptr__3_0' :: itt_suppress_clear_range_fort_ptr
+    type(C_FUNPTR) :: itt_sync_prepare_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_prepare_ptr__3_0' :: itt_sync_prepare_fort_ptr
+    type(C_FUNPTR) :: itt_sync_cancel_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_cancel_ptr__3_0' :: itt_sync_cancel_fort_ptr
+    type(C_FUNPTR) :: itt_sync_acquired_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_acquired_ptr__3_0' :: itt_sync_acquired_fort_ptr
+    type(C_FUNPTR) :: itt_sync_releasing_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_releasing_ptr__3_0' :: itt_sync_releasing_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_prepare_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_fsync_prepare_ptr__3_0' :: itt_fsync_prepare_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_cancel_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_fsync_cancel_ptr__3_0' :: itt_fsync_cancel_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_acquired_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_fsync_acquired_ptr__3_0' :: itt_fsync_acquired_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_releasing_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_fsync_releasing_ptr__3_0' :: itt_fsync_releasing_fort_ptr
+    type(C_FUNPTR) :: itt_sync_destroy_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_destroy_ptr__3_0' :: itt_sync_destroy_fort_ptr
+    type(C_FUNPTR) :: itt_sync_create_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_createA_ptr__3_0' :: itt_sync_create_fort_ptr
+    type(C_FUNPTR) :: itt_sync_rename_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_sync_renameA_ptr__3_0' :: itt_sync_rename_fort_ptr
+    type(C_FUNPTR) :: itt_thread_set_name_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_thread_set_nameA_ptr__3_0' :: itt_thread_set_name_fort_ptr
+    type(C_FUNPTR) :: itt_heap_record_memory_growth_begin_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_heap_record_memory_growth_begin_ptr__3_0' :: itt_heap_record_memory_growth_begin_fort_ptr
+    type(C_FUNPTR) :: itt_heap_record_memory_growth_end_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_heap_record_memory_growth_end_ptr__3_0' :: itt_heap_record_memory_growth_end_fort_ptr
+    type(C_FUNPTR) :: itt_heap_reset_detection_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_heap_reset_detection_ptr__3_0' :: itt_heap_reset_detection_fort_ptr
+    type(C_FUNPTR) :: itt_heap_record_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'__itt_heap_record_ptr__3_0' :: itt_heap_record_fort_ptr
+    !DEC$ELSE
+    type(C_FUNPTR) :: itt_pause_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_pause_ptr__3_0' :: itt_pause_fort_ptr
+    type(C_FUNPTR) :: itt_resume_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_resume_ptr__3_0' :: itt_resume_fort_ptr
+    type(C_FUNPTR) :: itt_thread_ignore_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_thread_ignore_ptr__3_0' :: itt_thread_ignore_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_push_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_suppress_push_ptr__3_0' :: itt_suppress_push_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_pop_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_suppress_pop_ptr__3_0' :: itt_suppress_pop_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_mark_range_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_suppress_mark_range_ptr__3_0' :: itt_suppress_mark_range_fort_ptr
+    type(C_FUNPTR) :: itt_suppress_clear_range_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_suppress_clear_range_ptr__3_0' :: itt_suppress_clear_range_fort_ptr
+    type(C_FUNPTR) :: itt_sync_prepare_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_sync_prepare_ptr__3_0' :: itt_sync_prepare_fort_ptr
+    type(C_FUNPTR) :: itt_sync_cancel_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_sync_cancel_ptr__3_0' :: itt_sync_cancel_fort_ptr
+    type(C_FUNPTR) :: itt_sync_acquired_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_sync_acquired_ptr__3_0' :: itt_sync_acquired_fort_ptr
+    type(C_FUNPTR) :: itt_sync_releasing_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_sync_releasing_ptr__3_0' :: itt_sync_releasing_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_prepare_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_fsync_prepare_ptr__3_0' :: itt_fsync_prepare_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_cancel_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_fsync_cancel_ptr__3_0' :: itt_fsync_cancel_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_acquired_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_fsync_acquired_ptr__3_0' :: itt_fsync_acquired_fort_ptr
+    type(C_FUNPTR) :: itt_fsync_releasing_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_fsync_releasing_ptr__3_0' :: itt_fsync_releasing_fort_ptr
+    type(C_FUNPTR) :: itt_sync_destroy_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_sync_destroy_ptr__3_0' :: itt_sync_destroy_fort_ptr
+    type(C_FUNPTR) :: itt_sync_create_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_sync_createA_ptr__3_0' :: itt_sync_create_fort_ptr
+    type(C_FUNPTR) :: itt_sync_rename_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_sync_renameA_ptr__3_0' :: itt_sync_rename_fort_ptr
+    type(C_FUNPTR) :: itt_thread_set_name_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_thread_set_nameA_ptr__3_0' :: itt_thread_set_name_fort_ptr
+    type(C_FUNPTR) :: itt_heap_record_memory_growth_begin_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_heap_record_memory_growth_begin_ptr__3_0' :: itt_heap_record_memory_growth_begin_fort_ptr
+    type(C_FUNPTR) :: itt_heap_record_memory_growth_end_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_heap_record_memory_growth_end_ptr__3_0' :: itt_heap_record_memory_growth_end_fort_ptr
+    type(C_FUNPTR) :: itt_heap_reset_detection_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_heap_reset_detection_ptr__3_0' :: itt_heap_reset_detection_fort_ptr
+    type(C_FUNPTR) :: itt_heap_record_fort_ptr
+    !DEC$ ATTRIBUTES C, EXTERN, ALIAS:'___itt_heap_record_ptr__3_0' :: itt_heap_record_fort_ptr
+    !DEC$ENDIF
+
+    contains
+
+      subroutine itt_pause()
+          procedure(itt_proc_none), pointer :: pause_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_pause
+          if (C_ASSOCIATED(itt_pause_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_pause_fort_ptr, pause_ptr)
+              call pause_ptr()
+          end if
+      end subroutine itt_pause
+
+      subroutine itt_resume()
+          procedure(itt_proc_none), pointer :: resume_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_resume
+          if (C_ASSOCIATED(itt_resume_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_resume_fort_ptr, resume_ptr)
+              call resume_ptr()
+          end if
+      end subroutine itt_resume
+
+      subroutine itt_thread_ignore()
+          procedure(itt_proc_none), pointer :: thread_ignore_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_thread_ignore
+          if (C_ASSOCIATED(itt_thread_ignore_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_thread_ignore_fort_ptr, thread_ignore_ptr)
+              call thread_ignore_ptr()
+          end if
+      end subroutine itt_thread_ignore
+
+      subroutine itt_suppress_push(mask)
+          procedure(itt_proc_sup_push), pointer :: suppress_push_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_suppress_push
+          integer, intent(in), value :: mask
+          if (C_ASSOCIATED(itt_suppress_push_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_suppress_push_fort_ptr, suppress_push_ptr)
+              call suppress_push_ptr(mask)
+          end if
+      end subroutine itt_suppress_push
+
+      subroutine itt_suppress_pop()
+          procedure(itt_proc_none), pointer :: suppress_pop_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_suppress_pop
+          if (C_ASSOCIATED(itt_suppress_pop_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_suppress_pop_fort_ptr, suppress_pop_ptr)
+              call suppress_pop_ptr()
+          end if
+      end subroutine itt_suppress_pop
+
+      subroutine itt_suppress_mark_range(action, mask, addr, size)
+          procedure(itt_proc_sup_range), pointer :: suppress_mark_range_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_suppress_mark_range
+          integer, intent(in), value :: action
+          integer, intent(in), value :: mask
+          integer(kind=itt_ptr), intent(in), value :: addr
+          integer(kind=itt_ptr), intent(in), value :: size
+          if (C_ASSOCIATED(itt_suppress_mark_range_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_suppress_mark_range_fort_ptr, suppress_mark_range_ptr)
+              call suppress_mark_range_ptr(action, mask, addr, size)
+          end if
+      end subroutine itt_suppress_mark_range
+
+      subroutine itt_suppress_clear_range(action, mask, addr, size)
+          procedure(itt_proc_sup_range), pointer :: suppress_clear_range_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_suppress_clear_range
+          integer, intent(in), value :: action
+          integer, intent(in), value :: mask
+          integer(kind=itt_ptr), intent(in), value :: addr
+          integer(kind=itt_ptr), intent(in), value :: size
+          if (C_ASSOCIATED(itt_suppress_clear_range_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_suppress_clear_range_fort_ptr, suppress_clear_range_ptr)
+              call suppress_clear_range_ptr(action, mask, addr, size)
+          end if
+      end subroutine itt_suppress_clear_range
+
+      subroutine itt_sync_prepare(addr)
+          procedure(itt_proc_address), pointer :: sync_prepare_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_prepare
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_prepare_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_prepare_fort_ptr, sync_prepare_ptr)
+              call sync_prepare_ptr(addr)
+          end if
+      end subroutine itt_sync_prepare
+
+      subroutine itt_sync_cancel(addr)
+          procedure(itt_proc_address), pointer :: sync_cancel_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_cancel
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_cancel_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_cancel_fort_ptr, sync_cancel_ptr)
+              call sync_cancel_ptr(addr)
+          end if
+      end subroutine itt_sync_cancel
+
+      subroutine itt_sync_acquired(addr)
+          procedure(itt_proc_address), pointer :: sync_acquired_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_acquired
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_acquired_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_acquired_fort_ptr, sync_acquired_ptr)
+              call sync_acquired_ptr(addr)
+          end if
+      end subroutine itt_sync_acquired
+
+      subroutine itt_sync_releasing(addr)
+          procedure(itt_proc_address), pointer :: sync_releasing_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_releasing
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_releasing_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_releasing_fort_ptr, sync_releasing_ptr)
+              call sync_releasing_ptr(addr)
+          end if
+      end subroutine itt_sync_releasing
+
+      subroutine itt_fsync_prepare(addr)
+          procedure(itt_proc_address), pointer :: fsync_prepare_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_fsync_prepare
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_fsync_prepare_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_fsync_prepare_fort_ptr, fsync_prepare_ptr)
+              call fsync_prepare_ptr(addr)
+          end if
+      end subroutine itt_fsync_prepare
+
+      subroutine itt_fsync_cancel(addr)
+          procedure(itt_proc_address), pointer :: fsync_cancel_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_fsync_cancel
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_fsync_cancel_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_fsync_cancel_fort_ptr, fsync_cancel_ptr)
+              call fsync_cancel_ptr(addr)
+          end if
+      end subroutine itt_fsync_cancel
+
+      subroutine itt_fsync_acquired(addr)
+          procedure(itt_proc_address), pointer :: fsync_acquired_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_fsync_acquired
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_fsync_acquired_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_fsync_acquired_fort_ptr, fsync_acquired_ptr)
+              call fsync_acquired_ptr(addr)
+          end if
+      end subroutine itt_fsync_acquired
+
+      subroutine itt_fsync_releasing(addr)
+          procedure(itt_proc_address), pointer :: fsync_releasing_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_fsync_releasing
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_fsync_releasing_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_fsync_releasing_fort_ptr, fsync_releasing_ptr)
+              call fsync_releasing_ptr(addr)
+          end if
+      end subroutine itt_fsync_releasing
+
+      subroutine itt_sync_destroy(addr)
+          procedure(itt_proc_address), pointer :: sync_destroy_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_destroy
+          integer(kind=itt_ptr), intent(in), value :: addr
+          if (C_ASSOCIATED(itt_sync_destroy_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_sync_destroy_fort_ptr, sync_destroy_ptr)
+              call sync_destroy_ptr(addr)
+          end if
+      end subroutine itt_sync_destroy
+
+      subroutine itt_sync_create(addr, objname, attribute)
+          procedure(itt_proc_create), pointer :: sync_create_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_create
+          integer(kind=itt_ptr), intent(in), value :: addr
+          character(len=*), intent(in) :: objname
+          integer, intent(in), value :: attribute
+          CHARACTER(LEN=1,KIND=C_CHAR) :: objnametmp(LEN_TRIM(objname)+1)
+          INTEGER                      :: iobjname, nobjname
+          if (C_ASSOCIATED(itt_sync_create_fort_ptr)) then
+              nobjname = LEN_TRIM(objname)
+              DO iobjname = 1, nobjname
+                  objnametmp(iobjname) = objname(iobjname:iobjname)
+              END DO
+              objnametmp(nobjname + 1) = C_NULL_CHAR
+              call C_F_PROCPOINTER(itt_sync_create_fort_ptr, sync_create_ptr)
+              call sync_create_ptr(addr, objnametmp, attribute)
+          end if
+      end subroutine itt_sync_create
+
+      subroutine itt_sync_rename(addr, objname)
+          procedure(itt_proc_rename), pointer :: sync_rename_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_sync_rename
+          integer(kind=itt_ptr), intent(in), value :: addr
+          character(len=*), intent(in) :: objname
+          CHARACTER(LEN=1,KIND=C_CHAR) :: objnametmp(LEN_TRIM(objname)+1)
+          INTEGER                      :: iobjname, nobjname
+          if (C_ASSOCIATED(itt_sync_rename_fort_ptr)) then
+              nobjname = LEN_TRIM(objname)
+              DO iobjname = 1, nobjname
+                  objnametmp(iobjname) = objname(iobjname:iobjname)
+              END DO
+              objnametmp(nobjname + 1) = C_NULL_CHAR
+              call C_F_PROCPOINTER(itt_sync_rename_fort_ptr, sync_rename_ptr)
+              call sync_rename_ptr(addr, objnametmp)
+          end if
+      end subroutine itt_sync_rename
+
+      subroutine itt_thread_set_name(name)
+          procedure(itt_proc_name), pointer :: thread_set_name_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_thread_set_name
+          character(len=*), intent(in) :: name
+          CHARACTER(LEN=1,KIND=C_CHAR) :: nametmp(LEN_TRIM(name)+1)
+          INTEGER                      :: iname, nname
+          if (C_ASSOCIATED(itt_thread_set_name_fort_ptr)) then
+              nname = LEN_TRIM(name)
+              DO iname = 1, nname
+                  nametmp(iname) = name(iname:iname)
+              END DO
+              nametmp(nname + 1) = C_NULL_CHAR
+              call C_F_PROCPOINTER(itt_thread_set_name_fort_ptr, thread_set_name_ptr)
+              call thread_set_name_ptr(nametmp)
+          end if
+      end subroutine itt_thread_set_name
+
+      subroutine itt_heap_record_memory_growth_begin()
+          procedure(itt_proc_none), pointer :: heap_record_memory_growth_begin_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_heap_record_memory_growth_begin
+          if (C_ASSOCIATED(itt_heap_record_memory_growth_begin_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_heap_record_memory_growth_begin_fort_ptr, heap_record_memory_growth_begin_ptr)
+              call heap_record_memory_growth_begin_ptr()
+          end if
+      end subroutine itt_heap_record_memory_growth_begin
+
+      subroutine itt_heap_record_memory_growth_end()
+          procedure(itt_proc_none), pointer :: heap_record_memory_growth_end_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_heap_record_memory_growth_end
+          if (C_ASSOCIATED(itt_heap_record_memory_growth_end_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_heap_record_memory_growth_end_fort_ptr, heap_record_memory_growth_end_ptr)
+              call heap_record_memory_growth_end_ptr()
+          end if
+      end subroutine itt_heap_record_memory_growth_end
+
+      subroutine itt_heap_reset_detection(heapmask)
+          procedure(itt_proc_heapmask), pointer :: heap_reset_detection_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_heap_reset_detection
+          integer, intent(in), value :: heapmask
+          if (C_ASSOCIATED(itt_heap_reset_detection_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_heap_reset_detection_fort_ptr, heap_reset_detection_ptr)
+              call heap_reset_detection_ptr(heapmask)
+          end if
+      end subroutine itt_heap_reset_detection
+
+      subroutine itt_heap_record(heapmask)
+          procedure(itt_proc_heapmask), pointer :: heap_record_ptr
+          !DEC$ ATTRIBUTES DEFAULT :: itt_heap_record
+          integer, intent(in), value :: heapmask
+          if (C_ASSOCIATED(itt_heap_record_fort_ptr)) then
+              call C_F_PROCPOINTER(itt_heap_record_fort_ptr, heap_record_ptr)
+              call heap_record_ptr(heapmask)
+          end if
+      end subroutine itt_heap_record
+
+
+    end module ittnotify
+
diff --git a/deps/v8/third_party/ittapi/include/ittnotify.h b/deps/v8/third_party/ittapi/include/ittnotify.h
new file mode 100644
index 00000000000000..0a9e007b701d9e
--- /dev/null
+++ b/deps/v8/third_party/ittapi/include/ittnotify.h
@@ -0,0 +1,4327 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+#ifndef _ITTNOTIFY_H_
+#define _ITTNOTIFY_H_
+
+/**
+@file
+@brief Public User API functions and types
+@mainpage
+
+The ITT API is used to annotate a user's program with additional information
+that can be used by correctness and performance tools. The user inserts
+calls in their program. Those calls generate information that is collected
+at runtime, and used by Intel(R) Threading Tools.
+
+@section API Concepts
+The following general concepts are used throughout the API.
+
+@subsection Unicode Support
+Many API functions take character string arguments. On Windows, there
+are two versions of each such function. The function name is suffixed
+by W if Unicode support is enabled, and by A otherwise. Any API function
+that takes a character string argument adheres to this convention.
+
+@subsection Conditional Compilation
+Many users prefer having an option to modify ITT API code when linking it
+inside their runtimes. ITT API header file provides a mechanism to replace
+ITT API function names inside your code with empty strings. To do this,
+define the macros INTEL_NO_ITTNOTIFY_API during compilation and remove the
+static library from the linker script.
+
+@subsection Domains
+[see domains]
+Domains provide a way to separate notification for different modules or
+libraries in a program. Domains are specified by dotted character strings,
+e.g. TBB.Internal.Control.
+
+A mechanism (to be specified) is provided to enable and disable
+domains. By default, all domains are enabled.
+@subsection Named Entities and Instances
+Named entities (frames, regions, tasks, and markers) communicate
+information about the program to the analysis tools. A named entity often
+refers to a section of program code, or to some set of logical concepts
+that the programmer wants to group together.
+
+Named entities relate to the programmer's static view of the program. When
+the program actually executes, many instances of a given named entity
+may be created.
+
+The API annotations denote instances of named entities. The actual
+named entities are displayed using the analysis tools. In other words,
+the named entities come into existence when instances are created.
+
+Instances of named entities may have instance identifiers (IDs). Some
+API calls use instance identifiers to create relationships between
+different instances of named entities. Other API calls associate data
+with instances of named entities.
+
+Some named entities must always have instance IDs. In particular, regions
+and frames always have IDs. Task and markers need IDs only if the ID is
+needed in another API call (such as adding a relation or metadata).
+
+The lifetime of instance IDs is distinct from the lifetime of
+instances. This allows various relationships to be specified separate
+from the actual execution of instances. This flexibility comes at the
+expense of extra API calls.
+
+The same ID may not be reused for different instances, unless a previous
+[ref] __itt_id_destroy call for that ID has been issued.
+*/
+
+/** @cond exclude_from_documentation */
+#ifndef ITT_OS_WIN
+#  define ITT_OS_WIN   1
+#endif /* ITT_OS_WIN */
+
+#ifndef ITT_OS_LINUX
+#  define ITT_OS_LINUX 2
+#endif /* ITT_OS_LINUX */
+
+#ifndef ITT_OS_MAC
+#  define ITT_OS_MAC   3
+#endif /* ITT_OS_MAC */
+
+#ifndef ITT_OS_FREEBSD
+#  define ITT_OS_FREEBSD   4
+#endif /* ITT_OS_FREEBSD */
+
+#ifndef ITT_OS
+#  if defined WIN32 || defined _WIN32
+#    define ITT_OS ITT_OS_WIN
+#  elif defined( __APPLE__ ) && defined( __MACH__ )
+#    define ITT_OS ITT_OS_MAC
+#  elif defined( __FreeBSD__ )
+#    define ITT_OS ITT_OS_FREEBSD
+#  else
+#    define ITT_OS ITT_OS_LINUX
+#  endif
+#endif /* ITT_OS */
+
+#ifndef ITT_PLATFORM_WIN
+#  define ITT_PLATFORM_WIN 1
+#endif /* ITT_PLATFORM_WIN */
+
+#ifndef ITT_PLATFORM_POSIX
+#  define ITT_PLATFORM_POSIX 2
+#endif /* ITT_PLATFORM_POSIX */
+
+#ifndef ITT_PLATFORM_MAC
+#  define ITT_PLATFORM_MAC 3
+#endif /* ITT_PLATFORM_MAC */
+
+#ifndef ITT_PLATFORM_FREEBSD
+#  define ITT_PLATFORM_FREEBSD 4
+#endif /* ITT_PLATFORM_FREEBSD */
+
+#ifndef ITT_PLATFORM
+#  if ITT_OS==ITT_OS_WIN
+#    define ITT_PLATFORM ITT_PLATFORM_WIN
+#  elif ITT_OS==ITT_OS_MAC
+#    define ITT_PLATFORM ITT_PLATFORM_MAC
+#  elif ITT_OS==ITT_OS_FREEBSD
+#    define ITT_PLATFORM ITT_PLATFORM_FREEBSD
+#  else
+#    define ITT_PLATFORM ITT_PLATFORM_POSIX
+#  endif
+#endif /* ITT_PLATFORM */
+
+#if defined(_UNICODE) && !defined(UNICODE)
+#define UNICODE
+#endif
+
+#include <stddef.h>
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#include <tchar.h>
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#include <stdint.h>
+#if defined(UNICODE) || defined(_UNICODE)
+#include <wchar.h>
+#endif /* UNICODE || _UNICODE */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#ifndef ITTAPI_CDECL
+#  if ITT_PLATFORM==ITT_PLATFORM_WIN
+#    define ITTAPI_CDECL __cdecl
+#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#    if defined _M_IX86 || defined __i386__
+#      define ITTAPI_CDECL __attribute__ ((cdecl))
+#    else  /* _M_IX86 || __i386__ */
+#      define ITTAPI_CDECL /* actual only on x86 platform */
+#    endif /* _M_IX86 || __i386__ */
+#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* ITTAPI_CDECL */
+
+#ifndef STDCALL
+#  if ITT_PLATFORM==ITT_PLATFORM_WIN
+#    define STDCALL __stdcall
+#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#    if defined _M_IX86 || defined __i386__
+#      define STDCALL __attribute__ ((stdcall))
+#    else  /* _M_IX86 || __i386__ */
+#      define STDCALL /* supported only on x86 platform */
+#    endif /* _M_IX86 || __i386__ */
+#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* STDCALL */
+
+#define ITTAPI    ITTAPI_CDECL
+#define LIBITTAPI ITTAPI_CDECL
+
+/* TODO: Temporary for compatibility! */
+#define ITTAPI_CALL    ITTAPI_CDECL
+#define LIBITTAPI_CALL ITTAPI_CDECL
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+/* use __forceinline (VC++ specific) */
+#if defined(__MINGW32__) && !defined(__cplusplus)
+#define ITT_INLINE           static __inline__ __attribute__((__always_inline__,__gnu_inline__))
+#else
+#define ITT_INLINE           static __forceinline
+#endif /* __MINGW32__ */
+
+#define ITT_INLINE_ATTRIBUTE /* nothing */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+/*
+ * Generally, functions are not inlined unless optimization is specified.
+ * For functions declared inline, this attribute inlines the function even
+ * if no optimization level was specified.
+ */
+#ifdef __STRICT_ANSI__
+#define ITT_INLINE           static
+#define ITT_INLINE_ATTRIBUTE __attribute__((unused))
+#else  /* __STRICT_ANSI__ */
+#define ITT_INLINE           static inline
+#define ITT_INLINE_ATTRIBUTE __attribute__((always_inline, unused))
+#endif /* __STRICT_ANSI__ */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+/** @endcond */
+
+#ifdef INTEL_ITTNOTIFY_ENABLE_LEGACY
+#  if ITT_PLATFORM==ITT_PLATFORM_WIN
+#    pragma message("WARNING!!! Deprecated API is used. Please undefine INTEL_ITTNOTIFY_ENABLE_LEGACY macro")
+#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#    warning "Deprecated API is used. Please undefine INTEL_ITTNOTIFY_ENABLE_LEGACY macro"
+#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#  include "legacy/ittnotify.h"
+#endif /* INTEL_ITTNOTIFY_ENABLE_LEGACY */
+
+/** @cond exclude_from_documentation */
+/* Helper macro for joining tokens */
+#define ITT_JOIN_AUX(p,n) p##n
+#define ITT_JOIN(p,n)     ITT_JOIN_AUX(p,n)
+
+#ifdef ITT_MAJOR
+#undef ITT_MAJOR
+#endif
+#ifdef ITT_MINOR
+#undef ITT_MINOR
+#endif
+#define ITT_MAJOR     3
+#define ITT_MINOR     0
+
+/* Standard versioning of a token with major and minor version numbers */
+#define ITT_VERSIONIZE(x)    \
+    ITT_JOIN(x,              \
+    ITT_JOIN(_,              \
+    ITT_JOIN(ITT_MAJOR,      \
+    ITT_JOIN(_, ITT_MINOR))))
+
+#ifndef INTEL_ITTNOTIFY_PREFIX
+#  define INTEL_ITTNOTIFY_PREFIX __itt_
+#endif /* INTEL_ITTNOTIFY_PREFIX */
+#ifndef INTEL_ITTNOTIFY_POSTFIX
+#  define INTEL_ITTNOTIFY_POSTFIX _ptr_
+#endif /* INTEL_ITTNOTIFY_POSTFIX */
+
+#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
+#define ITTNOTIFY_NAME(n)     ITT_VERSIONIZE(ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX)))
+
+#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)
+#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)
+
+#define ITTNOTIFY_VOID_D0(n,d)       (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d)
+#define ITTNOTIFY_VOID_D1(n,d,x)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x)
+#define ITTNOTIFY_VOID_D2(n,d,x,y)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y)
+#define ITTNOTIFY_VOID_D3(n,d,x,y,z) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z)
+#define ITTNOTIFY_VOID_D4(n,d,x,y,z,a)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)
+#define ITTNOTIFY_VOID_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)
+#define ITTNOTIFY_VOID_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)
+#define ITTNOTIFY_DATA_D0(n,d)       (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d)
+#define ITTNOTIFY_DATA_D1(n,d,x)     (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x)
+#define ITTNOTIFY_DATA_D2(n,d,x,y)   (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y)
+#define ITTNOTIFY_DATA_D3(n,d,x,y,z) (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z)
+#define ITTNOTIFY_DATA_D4(n,d,x,y,z,a)     (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)
+#define ITTNOTIFY_DATA_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)
+#define ITTNOTIFY_DATA_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)
+
+#ifdef ITT_STUB
+#undef ITT_STUB
+#endif
+#ifdef ITT_STUBV
+#undef ITT_STUBV
+#endif
+#define ITT_STUBV(api,type,name,args)                             \
+    typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args;   \
+    extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);
+#define ITT_STUB ITT_STUBV
+/** @endcond */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** @cond exclude_from_gpa_documentation */
+/**
+ * @defgroup public Public API
+ * @{
+ * @}
+ */
+
+/**
+ * @defgroup control Collection Control
+ * @ingroup public
+ * General behavior: application continues to run, but no profiling information is being collected
+ *
+ * Pausing occurs not only for the current thread but for all process as well as spawned processes
+ * - Intel(R) Parallel Inspector and Intel(R) Inspector XE:
+ *   - Does not analyze or report errors that involve memory access.
+ *   - Other errors are reported as usual. Pausing data collection in
+ *     Intel(R) Parallel Inspector and Intel(R) Inspector XE
+ *     only pauses tracing and analyzing memory access.
+ *     It does not pause tracing or analyzing threading APIs.
+ *   .
+ * - Intel(R) Parallel Amplifier and Intel(R) VTune(TM) Amplifier XE:
+ *   - Does continue to record when new threads are started.
+ *   .
+ * - Other effects:
+ *   - Possible reduction of runtime overhead.
+ *   .
+ * @{
+ */
+/** @brief Pause collection */
+void ITTAPI __itt_pause(void);
+/** @brief Resume collection */
+void ITTAPI __itt_resume(void);
+/** @brief Detach collection */
+void ITTAPI __itt_detach(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, pause,  (void))
+ITT_STUBV(ITTAPI, void, resume, (void))
+ITT_STUBV(ITTAPI, void, detach, (void))
+#define __itt_pause      ITTNOTIFY_VOID(pause)
+#define __itt_pause_ptr  ITTNOTIFY_NAME(pause)
+#define __itt_resume     ITTNOTIFY_VOID(resume)
+#define __itt_resume_ptr ITTNOTIFY_NAME(resume)
+#define __itt_detach     ITTNOTIFY_VOID(detach)
+#define __itt_detach_ptr ITTNOTIFY_NAME(detach)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_pause()
+#define __itt_pause_ptr  0
+#define __itt_resume()
+#define __itt_resume_ptr 0
+#define __itt_detach()
+#define __itt_detach_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_pause_ptr  0
+#define __itt_resume_ptr 0
+#define __itt_detach_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} control group */
+/** @endcond */
+
+/**
+ * @defgroup Intel Processor Trace control
+ * API from this group provides control over collection and analysis of Intel Processor Trace (Intel PT) data
+ * Information about Intel Processor Trace technology can be found here (Volume 3 chapter 35):
+ * https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf
+ * Use this API to mark particular code regions for loading detailed performance statistics.
+ * This mode makes your analysis faster and more accurate.
+ * @{
+*/
+typedef unsigned char __itt_pt_region;
+
+/**
+ * @brief function saves a region name marked with Intel PT API and returns a region id.
+ * Only 7 names can be registered. Attempts to register more names will be ignored and a region id with auto names will be returned.
+ * For automatic naming of regions pass NULL as function parameter
+*/
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_pt_region ITTAPI __itt_pt_region_createA(const char    *name);
+__itt_pt_region ITTAPI __itt_pt_region_createW(const wchar_t *name);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_pt_region_create __itt_pt_region_createW
+#else /* UNICODE */
+#  define __itt_pt_region_create __itt_pt_region_createA
+#endif /* UNICODE */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_pt_region ITTAPI __itt_pt_region_create(const char *name);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_pt_region, pt_region_createA, (const char    *name))
+ITT_STUB(ITTAPI, __itt_pt_region, pt_region_createW, (const wchar_t *name))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_pt_region, pt_region_create,  (const char    *name))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_pt_region_createA     ITTNOTIFY_DATA(pt_region_createA)
+#define __itt_pt_region_createA_ptr ITTNOTIFY_NAME(pt_region_createA)
+#define __itt_pt_region_createW     ITTNOTIFY_DATA(pt_region_createW)
+#define __itt_pt_region_createW_ptr ITTNOTIFY_NAME(pt_region_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_pt_region_create     ITTNOTIFY_DATA(pt_region_create)
+#define __itt_pt_region_create_ptr ITTNOTIFY_NAME(pt_region_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_pt_region_createA(name) (__itt_pt_region)0
+#define __itt_pt_region_createA_ptr 0
+#define __itt_pt_region_createW(name) (__itt_pt_region)0
+#define __itt_pt_region_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_pt_region_create(name)  (__itt_pt_region)0
+#define __itt_pt_region_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_pt_region_createA_ptr 0
+#define __itt_pt_region_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_pt_region_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief function contains a special code pattern identified on the post-processing stage and
+ * marks the beginning of a code region targeted for Intel PT analysis
+ * @param[in] region - region id, 0 <= region < 8
+*/
+void __itt_mark_pt_region_begin(__itt_pt_region region);
+/**
+ * @brief function contains a special code pattern identified on the post-processing stage and
+ * marks the end of a code region targeted for Intel PT analysis
+ * @param[in] region - region id, 0 <= region < 8
+*/
+void __itt_mark_pt_region_end(__itt_pt_region region);
+/** @} Intel PT control group*/
+
+/**
+ * @defgroup threads Threads
+ * @ingroup public
+ * Give names to threads
+ * @{
+ */
+/**
+ * @brief Sets thread name of calling thread
+ * @param[in] name - name of thread
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_thread_set_nameA(const char    *name);
+void ITTAPI __itt_thread_set_nameW(const wchar_t *name);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_thread_set_name     __itt_thread_set_nameW
+#  define __itt_thread_set_name_ptr __itt_thread_set_nameW_ptr
+#else /* UNICODE */
+#  define __itt_thread_set_name     __itt_thread_set_nameA
+#  define __itt_thread_set_name_ptr __itt_thread_set_nameA_ptr
+#endif /* UNICODE */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+void ITTAPI __itt_thread_set_name(const char *name);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, thread_set_nameA, (const char    *name))
+ITT_STUBV(ITTAPI, void, thread_set_nameW, (const wchar_t *name))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, thread_set_name,  (const char    *name))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thread_set_nameA     ITTNOTIFY_VOID(thread_set_nameA)
+#define __itt_thread_set_nameA_ptr ITTNOTIFY_NAME(thread_set_nameA)
+#define __itt_thread_set_nameW     ITTNOTIFY_VOID(thread_set_nameW)
+#define __itt_thread_set_nameW_ptr ITTNOTIFY_NAME(thread_set_nameW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thread_set_name     ITTNOTIFY_VOID(thread_set_name)
+#define __itt_thread_set_name_ptr ITTNOTIFY_NAME(thread_set_name)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thread_set_nameA(name)
+#define __itt_thread_set_nameA_ptr 0
+#define __itt_thread_set_nameW(name)
+#define __itt_thread_set_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thread_set_name(name)
+#define __itt_thread_set_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thread_set_nameA_ptr 0
+#define __itt_thread_set_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thread_set_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @cond exclude_from_gpa_documentation */
+
+/**
+ * @brief Mark current thread as ignored from this point on, for the duration of its existence.
+ */
+void ITTAPI __itt_thread_ignore(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, thread_ignore, (void))
+#define __itt_thread_ignore     ITTNOTIFY_VOID(thread_ignore)
+#define __itt_thread_ignore_ptr ITTNOTIFY_NAME(thread_ignore)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_thread_ignore()
+#define __itt_thread_ignore_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_thread_ignore_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} threads group */
+
+/**
+ * @defgroup suppress Error suppression
+ * @ingroup public
+ * General behavior: application continues to run, but errors are suppressed
+ *
+ * @{
+ */
+
+/*****************************************************************//**
+ * @name group of functions used for error suppression in correctness tools
+ *********************************************************************/
+/** @{ */
+/**
+ * @hideinitializer
+ * @brief possible value for suppression mask
+ */
+#define __itt_suppress_all_errors 0x7fffffff
+
+/**
+ * @hideinitializer
+ * @brief possible value for suppression mask (suppresses errors from threading analysis)
+ */
+#define __itt_suppress_threading_errors 0x000000ff
+
+/**
+ * @hideinitializer
+ * @brief possible value for suppression mask (suppresses errors from memory analysis)
+ */
+#define __itt_suppress_memory_errors 0x0000ff00
+
+/**
+ * @brief Start suppressing errors identified in mask on this thread
+ */
+void ITTAPI __itt_suppress_push(unsigned int mask);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, suppress_push, (unsigned int mask))
+#define __itt_suppress_push     ITTNOTIFY_VOID(suppress_push)
+#define __itt_suppress_push_ptr ITTNOTIFY_NAME(suppress_push)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_suppress_push(mask)
+#define __itt_suppress_push_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_suppress_push_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Undo the effects of the matching call to __itt_suppress_push
+ */
+void ITTAPI __itt_suppress_pop(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, suppress_pop, (void))
+#define __itt_suppress_pop     ITTNOTIFY_VOID(suppress_pop)
+#define __itt_suppress_pop_ptr ITTNOTIFY_NAME(suppress_pop)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_suppress_pop()
+#define __itt_suppress_pop_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_suppress_pop_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @enum __itt_model_disable
+ * @brief Enumerator for the disable methods
+ */
+typedef enum __itt_suppress_mode {
+    __itt_unsuppress_range,
+    __itt_suppress_range
+} __itt_suppress_mode_t;
+
+/**
+ * @brief Mark a range of memory for error suppression or unsuppression for error types included in mask
+ */
+void ITTAPI __itt_suppress_mark_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size))
+#define __itt_suppress_mark_range     ITTNOTIFY_VOID(suppress_mark_range)
+#define __itt_suppress_mark_range_ptr ITTNOTIFY_NAME(suppress_mark_range)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_suppress_mark_range(mask)
+#define __itt_suppress_mark_range_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_suppress_mark_range_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Undo the effect of a matching call to __itt_suppress_mark_range.   If not matching
+ *        call is found, nothing is changed.
+ */
+void ITTAPI __itt_suppress_clear_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, suppress_clear_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size))
+#define __itt_suppress_clear_range     ITTNOTIFY_VOID(suppress_clear_range)
+#define __itt_suppress_clear_range_ptr ITTNOTIFY_NAME(suppress_clear_range)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_suppress_clear_range(mask)
+#define __itt_suppress_clear_range_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_suppress_clear_range_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} */
+/** @} suppress group */
+
+/**
+ * @defgroup sync Synchronization
+ * @ingroup public
+ * Indicate user-written synchronization code
+ * @{
+ */
+/**
+ * @hideinitializer
+ * @brief possible value of attribute argument for sync object type
+ */
+#define __itt_attr_barrier 1
+
+/**
+ * @hideinitializer
+ * @brief possible value of attribute argument for sync object type
+ */
+#define __itt_attr_mutex   2
+
+/**
+@brief Name a synchronization object
+@param[in] addr       Handle for the synchronization object. You should
+use a real address to uniquely identify the synchronization object.
+@param[in] objtype    null-terminated object type string. If NULL is
+passed, the name will be "User Synchronization".
+@param[in] objname    null-terminated object name string. If NULL,
+no name will be assigned to the object.
+@param[in] attribute  one of [#__itt_attr_barrier, #__itt_attr_mutex]
+ */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_sync_createA(void *addr, const char    *objtype, const char    *objname, int attribute);
+void ITTAPI __itt_sync_createW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_sync_create     __itt_sync_createW
+#  define __itt_sync_create_ptr __itt_sync_createW_ptr
+#else /* UNICODE */
+#  define __itt_sync_create     __itt_sync_createA
+#  define __itt_sync_create_ptr __itt_sync_createA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+void ITTAPI __itt_sync_create (void *addr, const char *objtype, const char *objname, int attribute);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, sync_createA, (void *addr, const char    *objtype, const char    *objname, int attribute))
+ITT_STUBV(ITTAPI, void, sync_createW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_create,  (void *addr, const char*    objtype, const char*    objname, int attribute))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_createA     ITTNOTIFY_VOID(sync_createA)
+#define __itt_sync_createA_ptr ITTNOTIFY_NAME(sync_createA)
+#define __itt_sync_createW     ITTNOTIFY_VOID(sync_createW)
+#define __itt_sync_createW_ptr ITTNOTIFY_NAME(sync_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_create     ITTNOTIFY_VOID(sync_create)
+#define __itt_sync_create_ptr ITTNOTIFY_NAME(sync_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_createA(addr, objtype, objname, attribute)
+#define __itt_sync_createA_ptr 0
+#define __itt_sync_createW(addr, objtype, objname, attribute)
+#define __itt_sync_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_create(addr, objtype, objname, attribute)
+#define __itt_sync_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_createA_ptr 0
+#define __itt_sync_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+@brief Rename a synchronization object
+
+You can use the rename call to assign or reassign a name to a given
+synchronization object.
+@param[in] addr  handle for the synchronization object.
+@param[in] name  null-terminated object name string.
+*/
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_sync_renameA(void *addr, const char    *name);
+void ITTAPI __itt_sync_renameW(void *addr, const wchar_t *name);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_sync_rename     __itt_sync_renameW
+#  define __itt_sync_rename_ptr __itt_sync_renameW_ptr
+#else /* UNICODE */
+#  define __itt_sync_rename     __itt_sync_renameA
+#  define __itt_sync_rename_ptr __itt_sync_renameA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+void ITTAPI __itt_sync_rename(void *addr, const char *name);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, sync_renameA, (void *addr, const char    *name))
+ITT_STUBV(ITTAPI, void, sync_renameW, (void *addr, const wchar_t *name))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_rename,  (void *addr, const char    *name))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_renameA     ITTNOTIFY_VOID(sync_renameA)
+#define __itt_sync_renameA_ptr ITTNOTIFY_NAME(sync_renameA)
+#define __itt_sync_renameW     ITTNOTIFY_VOID(sync_renameW)
+#define __itt_sync_renameW_ptr ITTNOTIFY_NAME(sync_renameW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_rename     ITTNOTIFY_VOID(sync_rename)
+#define __itt_sync_rename_ptr ITTNOTIFY_NAME(sync_rename)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_renameA(addr, name)
+#define __itt_sync_renameA_ptr 0
+#define __itt_sync_renameW(addr, name)
+#define __itt_sync_renameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_rename(addr, name)
+#define __itt_sync_rename_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_renameA_ptr 0
+#define __itt_sync_renameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_rename_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ @brief Destroy a synchronization object.
+ @param addr Handle for the synchronization object.
+ */
+void ITTAPI __itt_sync_destroy(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_destroy, (void *addr))
+#define __itt_sync_destroy     ITTNOTIFY_VOID(sync_destroy)
+#define __itt_sync_destroy_ptr ITTNOTIFY_NAME(sync_destroy)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_destroy(addr)
+#define __itt_sync_destroy_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_destroy_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/*****************************************************************//**
+ * @name group of functions is used for performance measurement tools
+ *********************************************************************/
+/** @{ */
+/**
+ * @brief Enter spin loop on user-defined sync object
+ */
+void ITTAPI __itt_sync_prepare(void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_prepare, (void *addr))
+#define __itt_sync_prepare     ITTNOTIFY_VOID(sync_prepare)
+#define __itt_sync_prepare_ptr ITTNOTIFY_NAME(sync_prepare)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_prepare(addr)
+#define __itt_sync_prepare_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_prepare_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Quit spin loop without acquiring spin object
+ */
+void ITTAPI __itt_sync_cancel(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_cancel, (void *addr))
+#define __itt_sync_cancel     ITTNOTIFY_VOID(sync_cancel)
+#define __itt_sync_cancel_ptr ITTNOTIFY_NAME(sync_cancel)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_cancel(addr)
+#define __itt_sync_cancel_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_cancel_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Successful spin loop completion (sync object acquired)
+ */
+void ITTAPI __itt_sync_acquired(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_acquired, (void *addr))
+#define __itt_sync_acquired     ITTNOTIFY_VOID(sync_acquired)
+#define __itt_sync_acquired_ptr ITTNOTIFY_NAME(sync_acquired)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_acquired(addr)
+#define __itt_sync_acquired_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_acquired_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Start sync object releasing code. Is called before the lock release call.
+ */
+void ITTAPI __itt_sync_releasing(void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, sync_releasing, (void *addr))
+#define __itt_sync_releasing     ITTNOTIFY_VOID(sync_releasing)
+#define __itt_sync_releasing_ptr ITTNOTIFY_NAME(sync_releasing)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_sync_releasing(addr)
+#define __itt_sync_releasing_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_sync_releasing_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} */
+
+/** @} sync group */
+
+/**************************************************************//**
+ * @name group of functions is used for correctness checking tools
+ ******************************************************************/
+/** @{ */
+/**
+ * @ingroup legacy
+ * @deprecated Legacy API
+ * @brief Fast synchronization which does no require spinning.
+ * - This special function is to be used by TBB and OpenMP libraries only when they know
+ *   there is no spin but they need to suppress TC warnings about shared variable modifications.
+ * - It only has corresponding pointers in static library and does not have corresponding function
+ *   in dynamic library.
+ * @see void __itt_sync_prepare(void* addr);
+ */
+void ITTAPI __itt_fsync_prepare(void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, fsync_prepare, (void *addr))
+#define __itt_fsync_prepare     ITTNOTIFY_VOID(fsync_prepare)
+#define __itt_fsync_prepare_ptr ITTNOTIFY_NAME(fsync_prepare)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_fsync_prepare(addr)
+#define __itt_fsync_prepare_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_fsync_prepare_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup legacy
+ * @deprecated Legacy API
+ * @brief Fast synchronization which does no require spinning.
+ * - This special function is to be used by TBB and OpenMP libraries only when they know
+ *   there is no spin but they need to suppress TC warnings about shared variable modifications.
+ * - It only has corresponding pointers in static library and does not have corresponding function
+ *   in dynamic library.
+ * @see void __itt_sync_cancel(void *addr);
+ */
+void ITTAPI __itt_fsync_cancel(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, fsync_cancel, (void *addr))
+#define __itt_fsync_cancel     ITTNOTIFY_VOID(fsync_cancel)
+#define __itt_fsync_cancel_ptr ITTNOTIFY_NAME(fsync_cancel)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_fsync_cancel(addr)
+#define __itt_fsync_cancel_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_fsync_cancel_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup legacy
+ * @deprecated Legacy API
+ * @brief Fast synchronization which does no require spinning.
+ * - This special function is to be used by TBB and OpenMP libraries only when they know
+ *   there is no spin but they need to suppress TC warnings about shared variable modifications.
+ * - It only has corresponding pointers in static library and does not have corresponding function
+ *   in dynamic library.
+ * @see void __itt_sync_acquired(void *addr);
+ */
+void ITTAPI __itt_fsync_acquired(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, fsync_acquired, (void *addr))
+#define __itt_fsync_acquired     ITTNOTIFY_VOID(fsync_acquired)
+#define __itt_fsync_acquired_ptr ITTNOTIFY_NAME(fsync_acquired)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_fsync_acquired(addr)
+#define __itt_fsync_acquired_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_fsync_acquired_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup legacy
+ * @deprecated Legacy API
+ * @brief Fast synchronization which does no require spinning.
+ * - This special function is to be used by TBB and OpenMP libraries only when they know
+ *   there is no spin but they need to suppress TC warnings about shared variable modifications.
+ * - It only has corresponding pointers in static library and does not have corresponding function
+ *   in dynamic library.
+ * @see void __itt_sync_releasing(void* addr);
+ */
+void ITTAPI __itt_fsync_releasing(void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, fsync_releasing, (void *addr))
+#define __itt_fsync_releasing     ITTNOTIFY_VOID(fsync_releasing)
+#define __itt_fsync_releasing_ptr ITTNOTIFY_NAME(fsync_releasing)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_fsync_releasing(addr)
+#define __itt_fsync_releasing_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_fsync_releasing_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} */
+
+/**
+ * @defgroup model Modeling by Intel(R) Parallel Advisor
+ * @ingroup public
+ * This is the subset of itt used for modeling by Intel(R) Parallel Advisor.
+ * This API is called ONLY using annotate.h, by "Annotation" macros
+ * the user places in their sources during the parallelism modeling steps.
+ *
+ * site_begin/end and task_begin/end take the address of handle variables,
+ * which are writeable by the API.  Handles must be 0 initialized prior
+ * to the first call to begin, or may cause a run-time failure.
+ * The handles are initialized in a multi-thread safe way by the API if
+ * the handle is 0.  The commonly expected idiom is one static handle to
+ * identify a site or task.  If a site or task of the same name has already
+ * been started during this collection, the same handle MAY be returned,
+ * but is not required to be - it is unspecified if data merging is done
+ * based on name.  These routines also take an instance variable.  Like
+ * the lexical instance, these must be 0 initialized.  Unlike the lexical
+ * instance, this is used to track a single dynamic instance.
+ *
+ * API used by the Intel(R) Parallel Advisor to describe potential concurrency
+ * and related activities. User-added source annotations expand to calls
+ * to these procedures to enable modeling of a hypothetical concurrent
+ * execution serially.
+ * @{
+ */
+#if !defined(_ADVISOR_ANNOTATE_H_) || defined(ANNOTATE_EXPAND_NULL)
+
+typedef void* __itt_model_site;             /*!< @brief handle for lexical site     */
+typedef void* __itt_model_site_instance;    /*!< @brief handle for dynamic instance */
+typedef void* __itt_model_task;             /*!< @brief handle for lexical site     */
+typedef void* __itt_model_task_instance;    /*!< @brief handle for dynamic instance */
+
+/**
+ * @enum __itt_model_disable
+ * @brief Enumerator for the disable methods
+ */
+typedef enum {
+    __itt_model_disable_observation,
+    __itt_model_disable_collection
+} __itt_model_disable;
+
+#endif /* !_ADVISOR_ANNOTATE_H_ || ANNOTATE_EXPAND_NULL */
+
+/**
+ * @brief ANNOTATE_SITE_BEGIN/ANNOTATE_SITE_END support.
+ *
+ * site_begin/end model a potential concurrency site.
+ * site instances may be recursively nested with themselves.
+ * site_end exits the most recently started but unended site for the current
+ * thread.  The handle passed to end may be used to validate structure.
+ * Instances of a site encountered on different threads concurrently
+ * are considered completely distinct. If the site name for two different
+ * lexical sites match, it is unspecified whether they are treated as the
+ * same or different for data presentation.
+ */
+void ITTAPI __itt_model_site_begin(__itt_model_site *site, __itt_model_site_instance *instance, const char *name);
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_model_site_beginW(const wchar_t *name);
+#endif
+void ITTAPI __itt_model_site_beginA(const char *name);
+void ITTAPI __itt_model_site_beginAL(const char *name, size_t siteNameLen);
+void ITTAPI __itt_model_site_end  (__itt_model_site *site, __itt_model_site_instance *instance);
+void ITTAPI __itt_model_site_end_2(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_site_begin,  (__itt_model_site *site, __itt_model_site_instance *instance, const char *name))
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, model_site_beginW,  (const wchar_t *name))
+#endif
+ITT_STUBV(ITTAPI, void, model_site_beginA,  (const char *name))
+ITT_STUBV(ITTAPI, void, model_site_beginAL,  (const char *name, size_t siteNameLen))
+ITT_STUBV(ITTAPI, void, model_site_end,    (__itt_model_site *site, __itt_model_site_instance *instance))
+ITT_STUBV(ITTAPI, void, model_site_end_2,  (void))
+#define __itt_model_site_begin      ITTNOTIFY_VOID(model_site_begin)
+#define __itt_model_site_begin_ptr  ITTNOTIFY_NAME(model_site_begin)
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_model_site_beginW      ITTNOTIFY_VOID(model_site_beginW)
+#define __itt_model_site_beginW_ptr  ITTNOTIFY_NAME(model_site_beginW)
+#endif
+#define __itt_model_site_beginA      ITTNOTIFY_VOID(model_site_beginA)
+#define __itt_model_site_beginA_ptr  ITTNOTIFY_NAME(model_site_beginA)
+#define __itt_model_site_beginAL      ITTNOTIFY_VOID(model_site_beginAL)
+#define __itt_model_site_beginAL_ptr  ITTNOTIFY_NAME(model_site_beginAL)
+#define __itt_model_site_end        ITTNOTIFY_VOID(model_site_end)
+#define __itt_model_site_end_ptr    ITTNOTIFY_NAME(model_site_end)
+#define __itt_model_site_end_2        ITTNOTIFY_VOID(model_site_end_2)
+#define __itt_model_site_end_2_ptr    ITTNOTIFY_NAME(model_site_end_2)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_site_begin(site, instance, name)
+#define __itt_model_site_begin_ptr  0
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_model_site_beginW(name)
+#define __itt_model_site_beginW_ptr  0
+#endif
+#define __itt_model_site_beginA(name)
+#define __itt_model_site_beginA_ptr  0
+#define __itt_model_site_beginAL(name, siteNameLen)
+#define __itt_model_site_beginAL_ptr  0
+#define __itt_model_site_end(site, instance)
+#define __itt_model_site_end_ptr    0
+#define __itt_model_site_end_2()
+#define __itt_model_site_end_2_ptr    0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_model_site_begin_ptr  0
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_model_site_beginW_ptr  0
+#endif
+#define __itt_model_site_beginA_ptr  0
+#define __itt_model_site_beginAL_ptr  0
+#define __itt_model_site_end_ptr    0
+#define __itt_model_site_end_2_ptr    0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief ANNOTATE_TASK_BEGIN/ANNOTATE_TASK_END support
+ *
+ * task_begin/end model a potential task, which is contained within the most
+ * closely enclosing dynamic site.  task_end exits the most recently started
+ * but unended task.  The handle passed to end may be used to validate
+ * structure.  It is unspecified if bad dynamic nesting is detected.  If it
+ * is, it should be encoded in the resulting data collection.  The collector
+ * should not fail due to construct nesting issues, nor attempt to directly
+ * indicate the problem.
+ */
+void ITTAPI __itt_model_task_begin(__itt_model_task *task, __itt_model_task_instance *instance, const char *name);
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_model_task_beginW(const wchar_t *name);
+void ITTAPI __itt_model_iteration_taskW(const wchar_t *name);
+#endif
+void ITTAPI __itt_model_task_beginA(const char *name);
+void ITTAPI __itt_model_task_beginAL(const char *name, size_t taskNameLen);
+void ITTAPI __itt_model_iteration_taskA(const char *name);
+void ITTAPI __itt_model_iteration_taskAL(const char *name, size_t taskNameLen);
+void ITTAPI __itt_model_task_end  (__itt_model_task *task, __itt_model_task_instance *instance);
+void ITTAPI __itt_model_task_end_2(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_task_begin,  (__itt_model_task *task, __itt_model_task_instance *instance, const char *name))
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, model_task_beginW,  (const wchar_t *name))
+ITT_STUBV(ITTAPI, void, model_iteration_taskW, (const wchar_t *name))
+#endif
+ITT_STUBV(ITTAPI, void, model_task_beginA,  (const char *name))
+ITT_STUBV(ITTAPI, void, model_task_beginAL,  (const char *name, size_t taskNameLen))
+ITT_STUBV(ITTAPI, void, model_iteration_taskA,  (const char *name))
+ITT_STUBV(ITTAPI, void, model_iteration_taskAL,  (const char *name, size_t taskNameLen))
+ITT_STUBV(ITTAPI, void, model_task_end,    (__itt_model_task *task, __itt_model_task_instance *instance))
+ITT_STUBV(ITTAPI, void, model_task_end_2,  (void))
+#define __itt_model_task_begin      ITTNOTIFY_VOID(model_task_begin)
+#define __itt_model_task_begin_ptr  ITTNOTIFY_NAME(model_task_begin)
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_model_task_beginW     ITTNOTIFY_VOID(model_task_beginW)
+#define __itt_model_task_beginW_ptr ITTNOTIFY_NAME(model_task_beginW)
+#define __itt_model_iteration_taskW     ITTNOTIFY_VOID(model_iteration_taskW)
+#define __itt_model_iteration_taskW_ptr ITTNOTIFY_NAME(model_iteration_taskW)
+#endif
+#define __itt_model_task_beginA    ITTNOTIFY_VOID(model_task_beginA)
+#define __itt_model_task_beginA_ptr ITTNOTIFY_NAME(model_task_beginA)
+#define __itt_model_task_beginAL    ITTNOTIFY_VOID(model_task_beginAL)
+#define __itt_model_task_beginAL_ptr ITTNOTIFY_NAME(model_task_beginAL)
+#define __itt_model_iteration_taskA    ITTNOTIFY_VOID(model_iteration_taskA)
+#define __itt_model_iteration_taskA_ptr ITTNOTIFY_NAME(model_iteration_taskA)
+#define __itt_model_iteration_taskAL    ITTNOTIFY_VOID(model_iteration_taskAL)
+#define __itt_model_iteration_taskAL_ptr ITTNOTIFY_NAME(model_iteration_taskAL)
+#define __itt_model_task_end        ITTNOTIFY_VOID(model_task_end)
+#define __itt_model_task_end_ptr    ITTNOTIFY_NAME(model_task_end)
+#define __itt_model_task_end_2        ITTNOTIFY_VOID(model_task_end_2)
+#define __itt_model_task_end_2_ptr    ITTNOTIFY_NAME(model_task_end_2)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_task_begin(task, instance, name)
+#define __itt_model_task_begin_ptr  0
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_model_task_beginW(name)
+#define __itt_model_task_beginW_ptr  0
+#endif
+#define __itt_model_task_beginA(name)
+#define __itt_model_task_beginA_ptr  0
+#define __itt_model_task_beginAL(name, siteNameLen)
+#define __itt_model_task_beginAL_ptr  0
+#define __itt_model_iteration_taskA(name)
+#define __itt_model_iteration_taskA_ptr  0
+#define __itt_model_iteration_taskAL(name, siteNameLen)
+#define __itt_model_iteration_taskAL_ptr  0
+#define __itt_model_task_end(task, instance)
+#define __itt_model_task_end_ptr    0
+#define __itt_model_task_end_2()
+#define __itt_model_task_end_2_ptr    0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_model_task_begin_ptr  0
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_model_task_beginW_ptr 0
+#endif
+#define __itt_model_task_beginA_ptr  0
+#define __itt_model_task_beginAL_ptr  0
+#define __itt_model_iteration_taskA_ptr    0
+#define __itt_model_iteration_taskAL_ptr    0
+#define __itt_model_task_end_ptr    0
+#define __itt_model_task_end_2_ptr    0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief ANNOTATE_LOCK_ACQUIRE/ANNOTATE_LOCK_RELEASE support
+ *
+ * lock_acquire/release model a potential lock for both lockset and
+ * performance modeling.  Each unique address is modeled as a separate
+ * lock, with invalid addresses being valid lock IDs.  Specifically:
+ * no storage is accessed by the API at the specified address - it is only
+ * used for lock identification.  Lock acquires may be self-nested and are
+ * unlocked by a corresponding number of releases.
+ * (These closely correspond to __itt_sync_acquired/__itt_sync_releasing,
+ * but may not have identical semantics.)
+ */
+void ITTAPI __itt_model_lock_acquire(void *lock);
+void ITTAPI __itt_model_lock_acquire_2(void *lock);
+void ITTAPI __itt_model_lock_release(void *lock);
+void ITTAPI __itt_model_lock_release_2(void *lock);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_lock_acquire, (void *lock))
+ITT_STUBV(ITTAPI, void, model_lock_acquire_2, (void *lock))
+ITT_STUBV(ITTAPI, void, model_lock_release, (void *lock))
+ITT_STUBV(ITTAPI, void, model_lock_release_2, (void *lock))
+#define __itt_model_lock_acquire     ITTNOTIFY_VOID(model_lock_acquire)
+#define __itt_model_lock_acquire_ptr ITTNOTIFY_NAME(model_lock_acquire)
+#define __itt_model_lock_acquire_2     ITTNOTIFY_VOID(model_lock_acquire_2)
+#define __itt_model_lock_acquire_2_ptr ITTNOTIFY_NAME(model_lock_acquire_2)
+#define __itt_model_lock_release     ITTNOTIFY_VOID(model_lock_release)
+#define __itt_model_lock_release_ptr ITTNOTIFY_NAME(model_lock_release)
+#define __itt_model_lock_release_2     ITTNOTIFY_VOID(model_lock_release_2)
+#define __itt_model_lock_release_2_ptr ITTNOTIFY_NAME(model_lock_release_2)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_lock_acquire(lock)
+#define __itt_model_lock_acquire_ptr 0
+#define __itt_model_lock_acquire_2(lock)
+#define __itt_model_lock_acquire_2_ptr 0
+#define __itt_model_lock_release(lock)
+#define __itt_model_lock_release_ptr 0
+#define __itt_model_lock_release_2(lock)
+#define __itt_model_lock_release_2_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_model_lock_acquire_ptr 0
+#define __itt_model_lock_acquire_2_ptr 0
+#define __itt_model_lock_release_ptr 0
+#define __itt_model_lock_release_2_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief ANNOTATE_RECORD_ALLOCATION/ANNOTATE_RECORD_DEALLOCATION support
+ *
+ * record_allocation/deallocation describe user-defined memory allocator
+ * behavior, which may be required for correctness modeling to understand
+ * when storage is not expected to be actually reused across threads.
+ */
+void ITTAPI __itt_model_record_allocation  (void *addr, size_t size);
+void ITTAPI __itt_model_record_deallocation(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_record_allocation,   (void *addr, size_t size))
+ITT_STUBV(ITTAPI, void, model_record_deallocation, (void *addr))
+#define __itt_model_record_allocation       ITTNOTIFY_VOID(model_record_allocation)
+#define __itt_model_record_allocation_ptr   ITTNOTIFY_NAME(model_record_allocation)
+#define __itt_model_record_deallocation     ITTNOTIFY_VOID(model_record_deallocation)
+#define __itt_model_record_deallocation_ptr ITTNOTIFY_NAME(model_record_deallocation)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_record_allocation(addr, size)
+#define __itt_model_record_allocation_ptr   0
+#define __itt_model_record_deallocation(addr)
+#define __itt_model_record_deallocation_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_model_record_allocation_ptr   0
+#define __itt_model_record_deallocation_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief ANNOTATE_INDUCTION_USES support
+ *
+ * Note particular storage is inductive through the end of the current site
+ */
+void ITTAPI __itt_model_induction_uses(void* addr, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_induction_uses, (void *addr, size_t size))
+#define __itt_model_induction_uses     ITTNOTIFY_VOID(model_induction_uses)
+#define __itt_model_induction_uses_ptr ITTNOTIFY_NAME(model_induction_uses)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_induction_uses(addr, size)
+#define __itt_model_induction_uses_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_model_induction_uses_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief ANNOTATE_REDUCTION_USES support
+ *
+ * Note particular storage is used for reduction through the end
+ * of the current site
+ */
+void ITTAPI __itt_model_reduction_uses(void* addr, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_reduction_uses, (void *addr, size_t size))
+#define __itt_model_reduction_uses     ITTNOTIFY_VOID(model_reduction_uses)
+#define __itt_model_reduction_uses_ptr ITTNOTIFY_NAME(model_reduction_uses)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_reduction_uses(addr, size)
+#define __itt_model_reduction_uses_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_model_reduction_uses_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief ANNOTATE_OBSERVE_USES support
+ *
+ * Have correctness modeling record observations about uses of storage
+ * through the end of the current site
+ */
+void ITTAPI __itt_model_observe_uses(void* addr, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_observe_uses, (void *addr, size_t size))
+#define __itt_model_observe_uses     ITTNOTIFY_VOID(model_observe_uses)
+#define __itt_model_observe_uses_ptr ITTNOTIFY_NAME(model_observe_uses)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_observe_uses(addr, size)
+#define __itt_model_observe_uses_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_model_observe_uses_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief ANNOTATE_CLEAR_USES support
+ *
+ * Clear the special handling of a piece of storage related to induction,
+ * reduction or observe_uses
+ */
+void ITTAPI __itt_model_clear_uses(void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_clear_uses, (void *addr))
+#define __itt_model_clear_uses     ITTNOTIFY_VOID(model_clear_uses)
+#define __itt_model_clear_uses_ptr ITTNOTIFY_NAME(model_clear_uses)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_clear_uses(addr)
+#define __itt_model_clear_uses_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_model_clear_uses_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief ANNOTATE_DISABLE_*_PUSH/ANNOTATE_DISABLE_*_POP support
+ *
+ * disable_push/disable_pop push and pop disabling based on a parameter.
+ * Disabling observations stops processing of memory references during
+ * correctness modeling, and all annotations that occur in the disabled
+ * region.  This allows description of code that is expected to be handled
+ * specially during conversion to parallelism or that is not recognized
+ * by tools (e.g. some kinds of synchronization operations.)
+ * This mechanism causes all annotations in the disabled region, other
+ * than disable_push and disable_pop, to be ignored.  (For example, this
+ * might validly be used to disable an entire parallel site and the contained
+ * tasks and locking in it for data collection purposes.)
+ * The disable for collection is a more expensive operation, but reduces
+ * collector overhead significantly.  This applies to BOTH correctness data
+ * collection and performance data collection.  For example, a site
+ * containing a task might only enable data collection for the first 10
+ * iterations.  Both performance and correctness data should reflect this,
+ * and the program should run as close to full speed as possible when
+ * collection is disabled.
+ */
+void ITTAPI __itt_model_disable_push(__itt_model_disable x);
+void ITTAPI __itt_model_disable_pop(void);
+void ITTAPI __itt_model_aggregate_task(size_t x);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x))
+ITT_STUBV(ITTAPI, void, model_disable_pop,  (void))
+ITT_STUBV(ITTAPI, void, model_aggregate_task, (size_t x))
+#define __itt_model_disable_push     ITTNOTIFY_VOID(model_disable_push)
+#define __itt_model_disable_push_ptr ITTNOTIFY_NAME(model_disable_push)
+#define __itt_model_disable_pop      ITTNOTIFY_VOID(model_disable_pop)
+#define __itt_model_disable_pop_ptr  ITTNOTIFY_NAME(model_disable_pop)
+#define __itt_model_aggregate_task      ITTNOTIFY_VOID(model_aggregate_task)
+#define __itt_model_aggregate_task_ptr  ITTNOTIFY_NAME(model_aggregate_task)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_model_disable_push(x)
+#define __itt_model_disable_push_ptr 0
+#define __itt_model_disable_pop()
+#define __itt_model_disable_pop_ptr 0
+#define __itt_model_aggregate_task(x)
+#define __itt_model_aggregate_task_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_model_disable_push_ptr 0
+#define __itt_model_disable_pop_ptr 0
+#define __itt_model_aggregate_task_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} model group */
+
+/**
+ * @defgroup heap Heap
+ * @ingroup public
+ * Heap group
+ * @{
+ */
+
+typedef void* __itt_heap_function;
+
+/**
+ * @brief Create an identification for heap function
+ * @return non-zero identifier or NULL
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_heap_function ITTAPI __itt_heap_function_createA(const char*    name, const char*    domain);
+__itt_heap_function ITTAPI __itt_heap_function_createW(const wchar_t* name, const wchar_t* domain);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_heap_function_create     __itt_heap_function_createW
+#  define __itt_heap_function_create_ptr __itt_heap_function_createW_ptr
+#else
+#  define __itt_heap_function_create     __itt_heap_function_createA
+#  define __itt_heap_function_create_ptr __itt_heap_function_createA_ptr
+#endif /* UNICODE */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_heap_function ITTAPI __itt_heap_function_create(const char* name, const char* domain);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createA, (const char*    name, const char*    domain))
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createW, (const wchar_t* name, const wchar_t* domain))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_create,  (const char*    name, const char*    domain))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_heap_function_createA     ITTNOTIFY_DATA(heap_function_createA)
+#define __itt_heap_function_createA_ptr ITTNOTIFY_NAME(heap_function_createA)
+#define __itt_heap_function_createW     ITTNOTIFY_DATA(heap_function_createW)
+#define __itt_heap_function_createW_ptr ITTNOTIFY_NAME(heap_function_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_heap_function_create      ITTNOTIFY_DATA(heap_function_create)
+#define __itt_heap_function_create_ptr  ITTNOTIFY_NAME(heap_function_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_heap_function_createA(name, domain) (__itt_heap_function)0
+#define __itt_heap_function_createA_ptr 0
+#define __itt_heap_function_createW(name, domain) (__itt_heap_function)0
+#define __itt_heap_function_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_heap_function_create(name, domain)  (__itt_heap_function)0
+#define __itt_heap_function_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_heap_function_createA_ptr 0
+#define __itt_heap_function_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_heap_function_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record an allocation begin occurrence.
+ */
+void ITTAPI __itt_heap_allocate_begin(__itt_heap_function h, size_t size, int initialized);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_allocate_begin, (__itt_heap_function h, size_t size, int initialized))
+#define __itt_heap_allocate_begin     ITTNOTIFY_VOID(heap_allocate_begin)
+#define __itt_heap_allocate_begin_ptr ITTNOTIFY_NAME(heap_allocate_begin)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_allocate_begin(h, size, initialized)
+#define __itt_heap_allocate_begin_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_allocate_begin_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record an allocation end occurrence.
+ */
+void ITTAPI __itt_heap_allocate_end(__itt_heap_function h, void** addr, size_t size, int initialized);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_allocate_end, (__itt_heap_function h, void** addr, size_t size, int initialized))
+#define __itt_heap_allocate_end     ITTNOTIFY_VOID(heap_allocate_end)
+#define __itt_heap_allocate_end_ptr ITTNOTIFY_NAME(heap_allocate_end)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_allocate_end(h, addr, size, initialized)
+#define __itt_heap_allocate_end_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_allocate_end_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record a free begin occurrence.
+ */
+void ITTAPI __itt_heap_free_begin(__itt_heap_function h, void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_free_begin, (__itt_heap_function h, void* addr))
+#define __itt_heap_free_begin     ITTNOTIFY_VOID(heap_free_begin)
+#define __itt_heap_free_begin_ptr ITTNOTIFY_NAME(heap_free_begin)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_free_begin(h, addr)
+#define __itt_heap_free_begin_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_free_begin_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record a free end occurrence.
+ */
+void ITTAPI __itt_heap_free_end(__itt_heap_function h, void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_free_end, (__itt_heap_function h, void* addr))
+#define __itt_heap_free_end     ITTNOTIFY_VOID(heap_free_end)
+#define __itt_heap_free_end_ptr ITTNOTIFY_NAME(heap_free_end)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_free_end(h, addr)
+#define __itt_heap_free_end_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_free_end_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record a reallocation begin occurrence.
+ */
+void ITTAPI __itt_heap_reallocate_begin(__itt_heap_function h, void* addr, size_t new_size, int initialized);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void* addr, size_t new_size, int initialized))
+#define __itt_heap_reallocate_begin     ITTNOTIFY_VOID(heap_reallocate_begin)
+#define __itt_heap_reallocate_begin_ptr ITTNOTIFY_NAME(heap_reallocate_begin)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_reallocate_begin(h, addr, new_size, initialized)
+#define __itt_heap_reallocate_begin_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_reallocate_begin_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record a reallocation end occurrence.
+ */
+void ITTAPI __itt_heap_reallocate_end(__itt_heap_function h, void* addr, void** new_addr, size_t new_size, int initialized);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_reallocate_end, (__itt_heap_function h, void* addr, void** new_addr, size_t new_size, int initialized))
+#define __itt_heap_reallocate_end     ITTNOTIFY_VOID(heap_reallocate_end)
+#define __itt_heap_reallocate_end_ptr ITTNOTIFY_NAME(heap_reallocate_end)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_reallocate_end(h, addr, new_addr, new_size, initialized)
+#define __itt_heap_reallocate_end_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_reallocate_end_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @brief internal access begin */
+void ITTAPI __itt_heap_internal_access_begin(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_internal_access_begin,  (void))
+#define __itt_heap_internal_access_begin      ITTNOTIFY_VOID(heap_internal_access_begin)
+#define __itt_heap_internal_access_begin_ptr  ITTNOTIFY_NAME(heap_internal_access_begin)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_internal_access_begin()
+#define __itt_heap_internal_access_begin_ptr  0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_internal_access_begin_ptr  0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @brief internal access end */
+void ITTAPI __itt_heap_internal_access_end(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_internal_access_end, (void))
+#define __itt_heap_internal_access_end     ITTNOTIFY_VOID(heap_internal_access_end)
+#define __itt_heap_internal_access_end_ptr ITTNOTIFY_NAME(heap_internal_access_end)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_internal_access_end()
+#define __itt_heap_internal_access_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_internal_access_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @brief record memory growth begin */
+void ITTAPI __itt_heap_record_memory_growth_begin(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin,  (void))
+#define __itt_heap_record_memory_growth_begin      ITTNOTIFY_VOID(heap_record_memory_growth_begin)
+#define __itt_heap_record_memory_growth_begin_ptr  ITTNOTIFY_NAME(heap_record_memory_growth_begin)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_record_memory_growth_begin()
+#define __itt_heap_record_memory_growth_begin_ptr  0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_record_memory_growth_begin_ptr  0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @brief record memory growth end */
+void ITTAPI __itt_heap_record_memory_growth_end(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_record_memory_growth_end, (void))
+#define __itt_heap_record_memory_growth_end     ITTNOTIFY_VOID(heap_record_memory_growth_end)
+#define __itt_heap_record_memory_growth_end_ptr ITTNOTIFY_NAME(heap_record_memory_growth_end)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_record_memory_growth_end()
+#define __itt_heap_record_memory_growth_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_record_memory_growth_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Specify the type of heap detection/reporting to modify.
+ */
+/**
+ * @hideinitializer
+ * @brief Report on memory leaks.
+ */
+#define __itt_heap_leaks 0x00000001
+
+/**
+ * @hideinitializer
+ * @brief Report on memory growth.
+ */
+#define __itt_heap_growth 0x00000002
+
+
+/** @brief heap reset detection */
+void ITTAPI __itt_heap_reset_detection(unsigned int reset_mask);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_reset_detection,  (unsigned int reset_mask))
+#define __itt_heap_reset_detection      ITTNOTIFY_VOID(heap_reset_detection)
+#define __itt_heap_reset_detection_ptr  ITTNOTIFY_NAME(heap_reset_detection)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_reset_detection()
+#define __itt_heap_reset_detection_ptr  0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_reset_detection_ptr  0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @brief report */
+void ITTAPI __itt_heap_record(unsigned int record_mask);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, heap_record, (unsigned int record_mask))
+#define __itt_heap_record     ITTNOTIFY_VOID(heap_record)
+#define __itt_heap_record_ptr ITTNOTIFY_NAME(heap_record)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_heap_record()
+#define __itt_heap_record_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_heap_record_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @} heap group */
+/** @endcond */
+/* ========================================================================== */
+
+/**
+ * @defgroup domains Domains
+ * @ingroup public
+ * Domains group
+ * @{
+ */
+
+/** @cond exclude_from_documentation */
+#pragma pack(push, 8)
+
+typedef struct ___itt_domain
+{
+    volatile int flags; /*!< Zero if disabled, non-zero if enabled. The meaning of different non-zero values is reserved to the runtime */
+    const char* nameA;  /*!< Copy of original name in ASCII. */
+#if defined(UNICODE) || defined(_UNICODE)
+    const wchar_t* nameW; /*!< Copy of original name in UNICODE. */
+#else  /* UNICODE || _UNICODE */
+    void* nameW;
+#endif /* UNICODE || _UNICODE */
+    int   extra1; /*!< Reserved to the runtime */
+    void* extra2; /*!< Reserved to the runtime */
+    struct ___itt_domain* next;
+} __itt_domain;
+
+#pragma pack(pop)
+/** @endcond */
+
+/**
+ * @ingroup domains
+ * @brief Create a domain.
+ * Create domain using some domain name: the URI naming style is recommended.
+ * Because the set of domains is expected to be static over the application's
+ * execution time, there is no mechanism to destroy a domain.
+ * Any domain can be accessed by any thread in the process, regardless of
+ * which thread created the domain. This call is thread-safe.
+ * @param[in] name name of domain
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_domain* ITTAPI __itt_domain_createA(const char    *name);
+__itt_domain* ITTAPI __itt_domain_createW(const wchar_t *name);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_domain_create     __itt_domain_createW
+#  define __itt_domain_create_ptr __itt_domain_createW_ptr
+#else /* UNICODE */
+#  define __itt_domain_create     __itt_domain_createA
+#  define __itt_domain_create_ptr __itt_domain_createA_ptr
+#endif /* UNICODE */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_domain* ITTAPI __itt_domain_create(const char *name);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_domain*, domain_createA, (const char    *name))
+ITT_STUB(ITTAPI, __itt_domain*, domain_createW, (const wchar_t *name))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_domain*, domain_create,  (const char    *name))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_domain_createA     ITTNOTIFY_DATA(domain_createA)
+#define __itt_domain_createA_ptr ITTNOTIFY_NAME(domain_createA)
+#define __itt_domain_createW     ITTNOTIFY_DATA(domain_createW)
+#define __itt_domain_createW_ptr ITTNOTIFY_NAME(domain_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_domain_create     ITTNOTIFY_DATA(domain_create)
+#define __itt_domain_create_ptr ITTNOTIFY_NAME(domain_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_domain_createA(name) (__itt_domain*)0
+#define __itt_domain_createA_ptr 0
+#define __itt_domain_createW(name) (__itt_domain*)0
+#define __itt_domain_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_domain_create(name)  (__itt_domain*)0
+#define __itt_domain_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_domain_createA_ptr 0
+#define __itt_domain_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_domain_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} domains group */
+
+/**
+ * @defgroup ids IDs
+ * @ingroup public
+ * IDs group
+ * @{
+ */
+
+/** @cond exclude_from_documentation */
+#pragma pack(push, 8)
+
+typedef struct ___itt_id
+{
+    unsigned long long d1, d2, d3;
+} __itt_id;
+
+#pragma pack(pop)
+/** @endcond */
+
+static const __itt_id __itt_null = { 0, 0, 0 };
+
+/**
+ * @ingroup ids
+ * @brief A convenience function is provided to create an ID without domain control.
+ * @brief This is a convenience function to initialize an __itt_id structure. This function
+ * does not affect the collector runtime in any way. After you make the ID with this
+ * function, you still must create it with the __itt_id_create function before using the ID
+ * to identify a named entity.
+ * @param[in] addr The address of object; high QWORD of the ID value.
+ * @param[in] extra The extra data to unique identify object; low QWORD of the ID value.
+ */
+
+ITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) ITT_INLINE_ATTRIBUTE;
+ITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra)
+{
+    __itt_id id = __itt_null;
+    id.d1 = (unsigned long long)((uintptr_t)addr);
+    id.d2 = (unsigned long long)extra;
+    id.d3 = (unsigned long long)0; /* Reserved. Must be zero */
+    return id;
+}
+
+/**
+ * @ingroup ids
+ * @brief Create an instance of identifier.
+ * This establishes the beginning of the lifetime of an instance of
+ * the given ID in the trace. Once this lifetime starts, the ID
+ * can be used to tag named entity instances in calls such as
+ * __itt_task_begin, and to specify relationships among
+ * identified named entity instances, using the \ref relations APIs.
+ * Instance IDs are not domain specific!
+ * @param[in] domain The domain controlling the execution of this call.
+ * @param[in] id The ID to create.
+ */
+void ITTAPI __itt_id_create(const __itt_domain *domain, __itt_id id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, id_create, (const __itt_domain *domain, __itt_id id))
+#define __itt_id_create(d,x) ITTNOTIFY_VOID_D1(id_create,d,x)
+#define __itt_id_create_ptr  ITTNOTIFY_NAME(id_create)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_id_create(domain,id)
+#define __itt_id_create_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_id_create_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup ids
+ * @brief Destroy an instance of identifier.
+ * This ends the lifetime of the current instance of the given ID value in the trace.
+ * Any relationships that are established after this lifetime ends are invalid.
+ * This call must be performed before the given ID value can be reused for a different
+ * named entity instance.
+ * @param[in] domain The domain controlling the execution of this call.
+ * @param[in] id The ID to destroy.
+ */
+void ITTAPI __itt_id_destroy(const __itt_domain *domain, __itt_id id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, id_destroy, (const __itt_domain *domain, __itt_id id))
+#define __itt_id_destroy(d,x) ITTNOTIFY_VOID_D1(id_destroy,d,x)
+#define __itt_id_destroy_ptr  ITTNOTIFY_NAME(id_destroy)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_id_destroy(domain,id)
+#define __itt_id_destroy_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_id_destroy_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} ids group */
+
+/**
+ * @defgroup handless String Handles
+ * @ingroup public
+ * String Handles group
+ * @{
+ */
+
+/** @cond exclude_from_documentation */
+#pragma pack(push, 8)
+
+typedef struct ___itt_string_handle
+{
+    const char* strA; /*!< Copy of original string in ASCII. */
+#if defined(UNICODE) || defined(_UNICODE)
+    const wchar_t* strW; /*!< Copy of original string in UNICODE. */
+#else  /* UNICODE || _UNICODE */
+    void* strW;
+#endif /* UNICODE || _UNICODE */
+    int   extra1; /*!< Reserved. Must be zero   */
+    void* extra2; /*!< Reserved. Must be zero   */
+    struct ___itt_string_handle* next;
+} __itt_string_handle;
+
+#pragma pack(pop)
+/** @endcond */
+
+/**
+ * @ingroup handles
+ * @brief Create a string handle.
+ * Create and return handle value that can be associated with a string.
+ * Consecutive calls to __itt_string_handle_create with the same name
+ * return the same value. Because the set of string handles is expected to remain
+ * static during the application's execution time, there is no mechanism to destroy a string handle.
+ * Any string handle can be accessed by any thread in the process, regardless of which thread created
+ * the string handle. This call is thread-safe.
+ * @param[in] name The input string
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_string_handle* ITTAPI __itt_string_handle_createA(const char    *name);
+__itt_string_handle* ITTAPI __itt_string_handle_createW(const wchar_t *name);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_string_handle_create     __itt_string_handle_createW
+#  define __itt_string_handle_create_ptr __itt_string_handle_createW_ptr
+#else /* UNICODE */
+#  define __itt_string_handle_create     __itt_string_handle_createA
+#  define __itt_string_handle_create_ptr __itt_string_handle_createA_ptr
+#endif /* UNICODE */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_string_handle* ITTAPI __itt_string_handle_create(const char *name);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createA, (const char    *name))
+ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createW, (const wchar_t *name))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_create,  (const char    *name))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_string_handle_createA     ITTNOTIFY_DATA(string_handle_createA)
+#define __itt_string_handle_createA_ptr ITTNOTIFY_NAME(string_handle_createA)
+#define __itt_string_handle_createW     ITTNOTIFY_DATA(string_handle_createW)
+#define __itt_string_handle_createW_ptr ITTNOTIFY_NAME(string_handle_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_string_handle_create     ITTNOTIFY_DATA(string_handle_create)
+#define __itt_string_handle_create_ptr ITTNOTIFY_NAME(string_handle_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_string_handle_createA(name) (__itt_string_handle*)0
+#define __itt_string_handle_createA_ptr 0
+#define __itt_string_handle_createW(name) (__itt_string_handle*)0
+#define __itt_string_handle_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_string_handle_create(name)  (__itt_string_handle*)0
+#define __itt_string_handle_create_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_string_handle_createA_ptr 0
+#define __itt_string_handle_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_string_handle_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} handles group */
+
+/** @cond exclude_from_documentation */
+typedef unsigned long long __itt_timestamp;
+/** @endcond */
+
+#define __itt_timestamp_none ((__itt_timestamp)-1LL)
+
+/** @cond exclude_from_gpa_documentation */
+
+/**
+ * @ingroup timestamps
+ * @brief Return timestamp corresponding to the current moment.
+ * This returns the timestamp in the format that is the most relevant for the current
+ * host or platform (RDTSC, QPC, and others). You can use the "<" operator to
+ * compare __itt_timestamp values.
+ */
+__itt_timestamp ITTAPI __itt_get_timestamp(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void))
+#define __itt_get_timestamp      ITTNOTIFY_DATA(get_timestamp)
+#define __itt_get_timestamp_ptr  ITTNOTIFY_NAME(get_timestamp)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_get_timestamp()
+#define __itt_get_timestamp_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_get_timestamp_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} timestamps */
+/** @endcond */
+
+/** @cond exclude_from_gpa_documentation */
+
+/**
+ * @defgroup regions Regions
+ * @ingroup public
+ * Regions group
+ * @{
+ */
+/**
+ * @ingroup regions
+ * @brief Begin of region instance.
+ * Successive calls to __itt_region_begin with the same ID are ignored
+ * until a call to __itt_region_end with the same ID
+ * @param[in] domain The domain for this region instance
+ * @param[in] id The instance ID for this region instance. Must not be __itt_null
+ * @param[in] parentid The instance ID for the parent of this region instance, or __itt_null
+ * @param[in] name The name of this region
+ */
+void ITTAPI __itt_region_begin(const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name);
+
+/**
+ * @ingroup regions
+ * @brief End of region instance.
+ * The first call to __itt_region_end with a given ID ends the
+ * region. Successive calls with the same ID are ignored, as are
+ * calls that do not have a matching __itt_region_begin call.
+ * @param[in] domain The domain for this region instance
+ * @param[in] id The instance ID for this region instance
+ */
+void ITTAPI __itt_region_end(const __itt_domain *domain, __itt_id id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, region_begin, (const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name))
+ITT_STUBV(ITTAPI, void, region_end,   (const __itt_domain *domain, __itt_id id))
+#define __itt_region_begin(d,x,y,z) ITTNOTIFY_VOID_D3(region_begin,d,x,y,z)
+#define __itt_region_begin_ptr      ITTNOTIFY_NAME(region_begin)
+#define __itt_region_end(d,x)       ITTNOTIFY_VOID_D1(region_end,d,x)
+#define __itt_region_end_ptr        ITTNOTIFY_NAME(region_end)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_region_begin(d,x,y,z)
+#define __itt_region_begin_ptr 0
+#define __itt_region_end(d,x)
+#define __itt_region_end_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_region_begin_ptr 0
+#define __itt_region_end_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} regions group */
+
+/**
+ * @defgroup frames Frames
+ * @ingroup public
+ * Frames are similar to regions, but are intended to be easier to use and to implement.
+ * In particular:
+ * - Frames always represent periods of elapsed time
+ * - By default, frames have no nesting relationships
+ * @{
+ */
+
+/**
+ * @ingroup frames
+ * @brief Begin a frame instance.
+ * Successive calls to __itt_frame_begin with the
+ * same ID are ignored until a call to __itt_frame_end with the same ID.
+ * @param[in] domain The domain for this frame instance
+ * @param[in] id The instance ID for this frame instance or NULL
+ */
+void ITTAPI __itt_frame_begin_v3(const __itt_domain *domain, __itt_id *id);
+
+/**
+ * @ingroup frames
+ * @brief End a frame instance.
+ * The first call to __itt_frame_end with a given ID
+ * ends the frame. Successive calls with the same ID are ignored, as are
+ * calls that do not have a matching __itt_frame_begin call.
+ * @param[in] domain The domain for this frame instance
+ * @param[in] id The instance ID for this frame instance or NULL for current
+ */
+void ITTAPI __itt_frame_end_v3(const __itt_domain *domain, __itt_id *id);
+
+/**
+ * @ingroup frames
+ * @brief Submits a frame instance.
+ * Successive calls to __itt_frame_begin or __itt_frame_submit with the
+ * same ID are ignored until a call to __itt_frame_end or __itt_frame_submit
+ * with the same ID.
+ * Passing special __itt_timestamp_none value as "end" argument means
+ * take the current timestamp as the end timestamp.
+ * @param[in] domain The domain for this frame instance
+ * @param[in] id The instance ID for this frame instance or NULL
+ * @param[in] begin Timestamp of the beginning of the frame
+ * @param[in] end Timestamp of the end of the frame
+ */
+void ITTAPI __itt_frame_submit_v3(const __itt_domain *domain, __itt_id *id,
+    __itt_timestamp begin, __itt_timestamp end);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, frame_begin_v3,  (const __itt_domain *domain, __itt_id *id))
+ITT_STUBV(ITTAPI, void, frame_end_v3,    (const __itt_domain *domain, __itt_id *id))
+ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end))
+#define __itt_frame_begin_v3(d,x)      ITTNOTIFY_VOID_D1(frame_begin_v3,d,x)
+#define __itt_frame_begin_v3_ptr       ITTNOTIFY_NAME(frame_begin_v3)
+#define __itt_frame_end_v3(d,x)        ITTNOTIFY_VOID_D1(frame_end_v3,d,x)
+#define __itt_frame_end_v3_ptr         ITTNOTIFY_NAME(frame_end_v3)
+#define __itt_frame_submit_v3(d,x,b,e) ITTNOTIFY_VOID_D3(frame_submit_v3,d,x,b,e)
+#define __itt_frame_submit_v3_ptr      ITTNOTIFY_NAME(frame_submit_v3)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_frame_begin_v3(domain,id)
+#define __itt_frame_begin_v3_ptr 0
+#define __itt_frame_end_v3(domain,id)
+#define __itt_frame_end_v3_ptr   0
+#define __itt_frame_submit_v3(domain,id,begin,end)
+#define __itt_frame_submit_v3_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_frame_begin_v3_ptr 0
+#define __itt_frame_end_v3_ptr   0
+#define __itt_frame_submit_v3_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} frames group */
+/** @endcond */
+
+/**
+ * @defgroup taskgroup Task Group
+ * @ingroup public
+ * Task Group
+ * @{
+ */
+/**
+ * @ingroup task_groups
+ * @brief Denotes a task_group instance.
+ * Successive calls to __itt_task_group with the same ID are ignored.
+ * @param[in] domain The domain for this task_group instance
+ * @param[in] id The instance ID for this task_group instance. Must not be __itt_null.
+ * @param[in] parentid The instance ID for the parent of this task_group instance, or __itt_null.
+ * @param[in] name The name of this task_group
+ */
+void ITTAPI __itt_task_group(const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, task_group, (const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name))
+#define __itt_task_group(d,x,y,z) ITTNOTIFY_VOID_D3(task_group,d,x,y,z)
+#define __itt_task_group_ptr      ITTNOTIFY_NAME(task_group)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_task_group(d,x,y,z)
+#define __itt_task_group_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_task_group_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} taskgroup group */
+
+/**
+ * @defgroup tasks Tasks
+ * @ingroup public
+ * A task instance represents a piece of work performed by a particular
+ * thread for a period of time. A call to __itt_task_begin creates a
+ * task instance. This becomes the current instance for that task on that
+ * thread. A following call to __itt_task_end on the same thread ends the
+ * instance. There may be multiple simultaneous instances of tasks with the
+ * same name on different threads. If an ID is specified, the task instance
+ * receives that ID. Nested tasks are allowed.
+ *
+ * Note: The task is defined by the bracketing of __itt_task_begin and
+ * __itt_task_end on the same thread. If some scheduling mechanism causes
+ * task switching (the thread executes a different user task) or task
+ * switching (the user task switches to a different thread) then this breaks
+ * the notion of  current instance. Additional API calls are required to
+ * deal with that possibility.
+ * @{
+ */
+
+/**
+ * @ingroup tasks
+ * @brief Begin a task instance.
+ * @param[in] domain The domain for this task
+ * @param[in] taskid The instance ID for this task instance, or __itt_null
+ * @param[in] parentid The parent instance to which this task instance belongs, or __itt_null
+ * @param[in] name The name of this task
+ */
+void ITTAPI __itt_task_begin(const __itt_domain *domain, __itt_id taskid, __itt_id parentid, __itt_string_handle *name);
+
+/**
+ * @ingroup tasks
+ * @brief Begin a task instance.
+ * @param[in] domain The domain for this task
+ * @param[in] taskid The identifier for this task instance (may be 0)
+ * @param[in] parentid The parent of this task (may be 0)
+ * @param[in] fn The pointer to the function you are tracing
+ */
+void ITTAPI __itt_task_begin_fn(const __itt_domain *domain, __itt_id taskid, __itt_id parentid, void* fn);
+
+/**
+ * @ingroup tasks
+ * @brief End the current task instance.
+ * @param[in] domain The domain for this task
+ */
+void ITTAPI __itt_task_end(const __itt_domain *domain);
+
+/**
+ * @ingroup tasks
+ * @brief Begin an overlapped task instance.
+ * @param[in] domain The domain for this task.
+ * @param[in] taskid The identifier for this task instance, *cannot* be __itt_null.
+ * @param[in] parentid The parent of this task, or __itt_null.
+ * @param[in] name The name of this task.
+ */
+void ITTAPI __itt_task_begin_overlapped(const __itt_domain* domain, __itt_id taskid, __itt_id parentid, __itt_string_handle* name);
+
+/**
+ * @ingroup tasks
+ * @brief End an overlapped task instance.
+ * @param[in] domain The domain for this task
+ * @param[in] taskid Explicit ID of finished task
+ */
+void ITTAPI __itt_task_end_overlapped(const __itt_domain *domain, __itt_id taskid);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, task_begin,    (const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name))
+ITT_STUBV(ITTAPI, void, task_begin_fn, (const __itt_domain *domain, __itt_id id, __itt_id parentid, void* fn))
+ITT_STUBV(ITTAPI, void, task_end,      (const __itt_domain *domain))
+ITT_STUBV(ITTAPI, void, task_begin_overlapped, (const __itt_domain *domain, __itt_id taskid, __itt_id parentid, __itt_string_handle *name))
+ITT_STUBV(ITTAPI, void, task_end_overlapped,   (const __itt_domain *domain, __itt_id taskid))
+#define __itt_task_begin(d,x,y,z)    ITTNOTIFY_VOID_D3(task_begin,d,x,y,z)
+#define __itt_task_begin_ptr         ITTNOTIFY_NAME(task_begin)
+#define __itt_task_begin_fn(d,x,y,z) ITTNOTIFY_VOID_D3(task_begin_fn,d,x,y,z)
+#define __itt_task_begin_fn_ptr      ITTNOTIFY_NAME(task_begin_fn)
+#define __itt_task_end(d)            ITTNOTIFY_VOID_D0(task_end,d)
+#define __itt_task_end_ptr           ITTNOTIFY_NAME(task_end)
+#define __itt_task_begin_overlapped(d,x,y,z) ITTNOTIFY_VOID_D3(task_begin_overlapped,d,x,y,z)
+#define __itt_task_begin_overlapped_ptr      ITTNOTIFY_NAME(task_begin_overlapped)
+#define __itt_task_end_overlapped(d,x)       ITTNOTIFY_VOID_D1(task_end_overlapped,d,x)
+#define __itt_task_end_overlapped_ptr        ITTNOTIFY_NAME(task_end_overlapped)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_task_begin(domain,id,parentid,name)
+#define __itt_task_begin_ptr    0
+#define __itt_task_begin_fn(domain,id,parentid,fn)
+#define __itt_task_begin_fn_ptr 0
+#define __itt_task_end(domain)
+#define __itt_task_end_ptr      0
+#define __itt_task_begin_overlapped(domain,taskid,parentid,name)
+#define __itt_task_begin_overlapped_ptr         0
+#define __itt_task_end_overlapped(domain,taskid)
+#define __itt_task_end_overlapped_ptr           0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_task_begin_ptr    0
+#define __itt_task_begin_fn_ptr 0
+#define __itt_task_end_ptr      0
+#define __itt_task_begin_overlapped_ptr 0
+#define __itt_task_end_overlapped_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} tasks group */
+
+
+/**
+ * @defgroup markers Markers
+ * Markers represent a single discreet event in time. Markers have a scope,
+ * described by an enumerated type __itt_scope. Markers are created by
+ * the API call __itt_marker. A marker instance can be given an ID for use in
+ * adding metadata.
+ * @{
+ */
+
+/**
+ * @brief Describes the scope of an event object in the trace.
+ */
+typedef enum
+{
+    __itt_scope_unknown = 0,
+    __itt_scope_global,
+    __itt_scope_track_group,
+    __itt_scope_track,
+    __itt_scope_task,
+    __itt_scope_marker
+} __itt_scope;
+
+/** @cond exclude_from_documentation */
+#define __itt_marker_scope_unknown  __itt_scope_unknown
+#define __itt_marker_scope_global   __itt_scope_global
+#define __itt_marker_scope_process  __itt_scope_track_group
+#define __itt_marker_scope_thread   __itt_scope_track
+#define __itt_marker_scope_task     __itt_scope_task
+/** @endcond */
+
+/**
+ * @ingroup markers
+ * @brief Create a marker instance
+ * @param[in] domain The domain for this marker
+ * @param[in] id The instance ID for this marker or __itt_null
+ * @param[in] name The name for this marker
+ * @param[in] scope The scope for this marker
+ */
+void ITTAPI __itt_marker(const __itt_domain *domain, __itt_id id, __itt_string_handle *name, __itt_scope scope);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, marker, (const __itt_domain *domain, __itt_id id, __itt_string_handle *name, __itt_scope scope))
+#define __itt_marker(d,x,y,z) ITTNOTIFY_VOID_D3(marker,d,x,y,z)
+#define __itt_marker_ptr      ITTNOTIFY_NAME(marker)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_marker(domain,id,name,scope)
+#define __itt_marker_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_marker_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} markers group */
+
+/**
+ * @defgroup metadata Metadata
+ * The metadata API is used to attach extra information to named
+ * entities. Metadata can be attached to an identified named entity by ID,
+ * or to the current entity (which is always a task).
+ *
+ * Conceptually metadata has a type (what kind of metadata), a key (the
+ * name of the metadata), and a value (the actual data). The encoding of
+ * the value depends on the type of the metadata.
+ *
+ * The type of metadata is specified by an enumerated type __itt_metdata_type.
+ * @{
+ */
+
+/**
+ * @ingroup parameters
+ * @brief describes the type of metadata
+ */
+typedef enum {
+    __itt_metadata_unknown = 0,
+    __itt_metadata_u64,     /**< Unsigned 64-bit integer */
+    __itt_metadata_s64,     /**< Signed 64-bit integer */
+    __itt_metadata_u32,     /**< Unsigned 32-bit integer */
+    __itt_metadata_s32,     /**< Signed 32-bit integer */
+    __itt_metadata_u16,     /**< Unsigned 16-bit integer */
+    __itt_metadata_s16,     /**< Signed 16-bit integer */
+    __itt_metadata_float,   /**< Signed 32-bit floating-point */
+    __itt_metadata_double   /**< SIgned 64-bit floating-point */
+} __itt_metadata_type;
+
+/**
+ * @ingroup parameters
+ * @brief Add metadata to an instance of a named entity.
+ * @param[in] domain The domain controlling the call
+ * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task
+ * @param[in] key The name of the metadata
+ * @param[in] type The type of the metadata
+ * @param[in] count The number of elements of the given type. If count == 0, no metadata will be added.
+ * @param[in] data The metadata itself
+*/
+void ITTAPI __itt_metadata_add(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, metadata_add, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data))
+#define __itt_metadata_add(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(metadata_add,d,x,y,z,a,b)
+#define __itt_metadata_add_ptr          ITTNOTIFY_NAME(metadata_add)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_metadata_add(d,x,y,z,a,b)
+#define __itt_metadata_add_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_metadata_add_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup parameters
+ * @brief Add string metadata to an instance of a named entity.
+ * @param[in] domain The domain controlling the call
+ * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task
+ * @param[in] key The name of the metadata
+ * @param[in] data The metadata itself
+ * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated
+*/
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_metadata_str_addA(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length);
+void ITTAPI __itt_metadata_str_addW(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const wchar_t *data, size_t length);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_metadata_str_add     __itt_metadata_str_addW
+#  define __itt_metadata_str_add_ptr __itt_metadata_str_addW_ptr
+#else /* UNICODE */
+#  define __itt_metadata_str_add     __itt_metadata_str_addA
+#  define __itt_metadata_str_add_ptr __itt_metadata_str_addA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+void ITTAPI __itt_metadata_str_add(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length);
+#endif
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, metadata_str_addA, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length))
+ITT_STUBV(ITTAPI, void, metadata_str_addW, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const wchar_t *data, size_t length))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, metadata_str_add, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_metadata_str_addA(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_addA,d,x,y,z,a)
+#define __itt_metadata_str_addA_ptr        ITTNOTIFY_NAME(metadata_str_addA)
+#define __itt_metadata_str_addW(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_addW,d,x,y,z,a)
+#define __itt_metadata_str_addW_ptr        ITTNOTIFY_NAME(metadata_str_addW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_metadata_str_add(d,x,y,z,a)  ITTNOTIFY_VOID_D4(metadata_str_add,d,x,y,z,a)
+#define __itt_metadata_str_add_ptr         ITTNOTIFY_NAME(metadata_str_add)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_metadata_str_addA(d,x,y,z,a)
+#define __itt_metadata_str_addA_ptr 0
+#define __itt_metadata_str_addW(d,x,y,z,a)
+#define __itt_metadata_str_addW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_metadata_str_add(d,x,y,z,a)
+#define __itt_metadata_str_add_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_metadata_str_addA_ptr 0
+#define __itt_metadata_str_addW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_metadata_str_add_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup parameters
+ * @brief Add metadata to an instance of a named entity.
+ * @param[in] domain The domain controlling the call
+ * @param[in] scope The scope of the instance to which the metadata is to be added
+
+ * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task
+
+ * @param[in] key The name of the metadata
+ * @param[in] type The type of the metadata
+ * @param[in] count The number of elements of the given type. If count == 0, no metadata will be added.
+ * @param[in] data The metadata itself
+*/
+void ITTAPI __itt_metadata_add_with_scope(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, metadata_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data))
+#define __itt_metadata_add_with_scope(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(metadata_add_with_scope,d,x,y,z,a,b)
+#define __itt_metadata_add_with_scope_ptr          ITTNOTIFY_NAME(metadata_add_with_scope)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_metadata_add_with_scope(d,x,y,z,a,b)
+#define __itt_metadata_add_with_scope_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_metadata_add_with_scope_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup parameters
+ * @brief Add string metadata to an instance of a named entity.
+ * @param[in] domain The domain controlling the call
+ * @param[in] scope The scope of the instance to which the metadata is to be added
+
+ * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task
+
+ * @param[in] key The name of the metadata
+ * @param[in] data The metadata itself
+ * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated
+*/
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_metadata_str_add_with_scopeA(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length);
+void ITTAPI __itt_metadata_str_add_with_scopeW(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const wchar_t *data, size_t length);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_metadata_str_add_with_scope     __itt_metadata_str_add_with_scopeW
+#  define __itt_metadata_str_add_with_scope_ptr __itt_metadata_str_add_with_scopeW_ptr
+#else /* UNICODE */
+#  define __itt_metadata_str_add_with_scope     __itt_metadata_str_add_with_scopeA
+#  define __itt_metadata_str_add_with_scope_ptr __itt_metadata_str_add_with_scopeA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+void ITTAPI __itt_metadata_str_add_with_scope(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length);
+#endif
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeA, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length))
+ITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeW, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const wchar_t *data, size_t length))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, metadata_str_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_metadata_str_add_with_scopeA(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_add_with_scopeA,d,x,y,z,a)
+#define __itt_metadata_str_add_with_scopeA_ptr        ITTNOTIFY_NAME(metadata_str_add_with_scopeA)
+#define __itt_metadata_str_add_with_scopeW(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_add_with_scopeW,d,x,y,z,a)
+#define __itt_metadata_str_add_with_scopeW_ptr        ITTNOTIFY_NAME(metadata_str_add_with_scopeW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_metadata_str_add_with_scope(d,x,y,z,a)  ITTNOTIFY_VOID_D4(metadata_str_add_with_scope,d,x,y,z,a)
+#define __itt_metadata_str_add_with_scope_ptr         ITTNOTIFY_NAME(metadata_str_add_with_scope)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_metadata_str_add_with_scopeA(d,x,y,z,a)
+#define __itt_metadata_str_add_with_scopeA_ptr  0
+#define __itt_metadata_str_add_with_scopeW(d,x,y,z,a)
+#define __itt_metadata_str_add_with_scopeW_ptr  0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_metadata_str_add_with_scope(d,x,y,z,a)
+#define __itt_metadata_str_add_with_scope_ptr   0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_metadata_str_add_with_scopeA_ptr  0
+#define __itt_metadata_str_add_with_scopeW_ptr  0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_metadata_str_add_with_scope_ptr   0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @} metadata group */
+
+/**
+ * @defgroup relations Relations
+ * Instances of named entities can be explicitly associated with other
+ * instances using instance IDs and the relationship API calls.
+ *
+ * @{
+ */
+
+/**
+ * @ingroup relations
+ * @brief The kind of relation between two instances is specified by the enumerated type __itt_relation.
+ * Relations between instances can be added with an API call. The relation
+ * API uses instance IDs. Relations can be added before or after the actual
+ * instances are created and persist independently of the instances. This
+ * is the motivation for having different lifetimes for instance IDs and
+ * the actual instances.
+ */
+typedef enum
+{
+    __itt_relation_is_unknown = 0,
+    __itt_relation_is_dependent_on,         /**< "A is dependent on B" means that A cannot start until B completes */
+    __itt_relation_is_sibling_of,           /**< "A is sibling of B" means that A and B were created as a group */
+    __itt_relation_is_parent_of,            /**< "A is parent of B" means that A created B */
+    __itt_relation_is_continuation_of,      /**< "A is continuation of B" means that A assumes the dependencies of B */
+    __itt_relation_is_child_of,             /**< "A is child of B" means that A was created by B (inverse of is_parent_of) */
+    __itt_relation_is_continued_by,         /**< "A is continued by B" means that B assumes the dependencies of A (inverse of is_continuation_of) */
+    __itt_relation_is_predecessor_to        /**< "A is predecessor to B" means that B cannot start until A completes (inverse of is_dependent_on) */
+} __itt_relation;
+
+/**
+ * @ingroup relations
+ * @brief Add a relation to the current task instance.
+ * The current task instance is the head of the relation.
+ * @param[in] domain The domain controlling this call
+ * @param[in] relation The kind of relation
+ * @param[in] tail The ID for the tail of the relation
+ */
+void ITTAPI __itt_relation_add_to_current(const __itt_domain *domain, __itt_relation relation, __itt_id tail);
+
+/**
+ * @ingroup relations
+ * @brief Add a relation between two instance identifiers.
+ * @param[in] domain The domain controlling this call
+ * @param[in] head The ID for the head of the relation
+ * @param[in] relation The kind of relation
+ * @param[in] tail The ID for the tail of the relation
+ */
+void ITTAPI __itt_relation_add(const __itt_domain *domain, __itt_id head, __itt_relation relation, __itt_id tail);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, relation_add_to_current, (const __itt_domain *domain, __itt_relation relation, __itt_id tail))
+ITT_STUBV(ITTAPI, void, relation_add,            (const __itt_domain *domain, __itt_id head, __itt_relation relation, __itt_id tail))
+#define __itt_relation_add_to_current(d,x,y) ITTNOTIFY_VOID_D2(relation_add_to_current,d,x,y)
+#define __itt_relation_add_to_current_ptr    ITTNOTIFY_NAME(relation_add_to_current)
+#define __itt_relation_add(d,x,y,z)          ITTNOTIFY_VOID_D3(relation_add,d,x,y,z)
+#define __itt_relation_add_ptr               ITTNOTIFY_NAME(relation_add)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_relation_add_to_current(d,x,y)
+#define __itt_relation_add_to_current_ptr 0
+#define __itt_relation_add(d,x,y,z)
+#define __itt_relation_add_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_relation_add_to_current_ptr 0
+#define __itt_relation_add_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} relations group */
+
+/** @cond exclude_from_documentation */
+#pragma pack(push, 8)
+
+typedef struct ___itt_clock_info
+{
+    unsigned long long clock_freq; /*!< Clock domain frequency */
+    unsigned long long clock_base; /*!< Clock domain base timestamp */
+} __itt_clock_info;
+
+#pragma pack(pop)
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+typedef void (ITTAPI *__itt_get_clock_info_fn)(__itt_clock_info* clock_info, void* data);
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+#pragma pack(push, 8)
+
+typedef struct ___itt_clock_domain
+{
+    __itt_clock_info info;      /*!< Most recent clock domain info */
+    __itt_get_clock_info_fn fn; /*!< Callback function pointer */
+    void* fn_data;              /*!< Input argument for the callback function */
+    int   extra1;               /*!< Reserved. Must be zero */
+    void* extra2;               /*!< Reserved. Must be zero */
+    struct ___itt_clock_domain* next;
+} __itt_clock_domain;
+
+#pragma pack(pop)
+/** @endcond */
+
+/**
+ * @ingroup clockdomains
+ * @brief Create a clock domain.
+ * Certain applications require the capability to trace their application using
+ * a clock domain different than the CPU, for instance the instrumentation of events
+ * that occur on a GPU.
+ * Because the set of domains is expected to be static over the application's execution time,
+ * there is no mechanism to destroy a domain.
+ * Any domain can be accessed by any thread in the process, regardless of which thread created
+ * the domain. This call is thread-safe.
+ * @param[in] fn A pointer to a callback function which retrieves alternative CPU timestamps
+ * @param[in] fn_data Argument for a callback function; may be NULL
+ */
+__itt_clock_domain* ITTAPI __itt_clock_domain_create(__itt_get_clock_info_fn fn, void* fn_data);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_clock_domain*, clock_domain_create, (__itt_get_clock_info_fn fn, void* fn_data))
+#define __itt_clock_domain_create     ITTNOTIFY_DATA(clock_domain_create)
+#define __itt_clock_domain_create_ptr ITTNOTIFY_NAME(clock_domain_create)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_clock_domain_create(fn,fn_data) (__itt_clock_domain*)0
+#define __itt_clock_domain_create_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_clock_domain_create_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup clockdomains
+ * @brief Recalculate clock domains frequencies and clock base timestamps.
+ */
+void ITTAPI __itt_clock_domain_reset(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, clock_domain_reset, (void))
+#define __itt_clock_domain_reset     ITTNOTIFY_VOID(clock_domain_reset)
+#define __itt_clock_domain_reset_ptr ITTNOTIFY_NAME(clock_domain_reset)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_clock_domain_reset()
+#define __itt_clock_domain_reset_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_clock_domain_reset_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup clockdomain
+ * @brief Create an instance of identifier. This establishes the beginning of the lifetime of
+ * an instance of the given ID in the trace. Once this lifetime starts, the ID can be used to
+ * tag named entity instances in calls such as __itt_task_begin, and to specify relationships among
+ * identified named entity instances, using the \ref relations APIs.
+ * @param[in] domain The domain controlling the execution of this call.
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ * @param[in] id The ID to create.
+ */
+void ITTAPI __itt_id_create_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id);
+
+/**
+ * @ingroup clockdomain
+ * @brief Destroy an instance of identifier. This ends the lifetime of the current instance of the
+ * given ID value in the trace. Any relationships that are established after this lifetime ends are
+ * invalid. This call must be performed before the given ID value can be reused for a different
+ * named entity instance.
+ * @param[in] domain The domain controlling the execution of this call.
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ * @param[in] id The ID to destroy.
+ */
+void ITTAPI __itt_id_destroy_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, id_create_ex,  (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id))
+ITT_STUBV(ITTAPI, void, id_destroy_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id))
+#define __itt_id_create_ex(d,x,y,z)  ITTNOTIFY_VOID_D3(id_create_ex,d,x,y,z)
+#define __itt_id_create_ex_ptr       ITTNOTIFY_NAME(id_create_ex)
+#define __itt_id_destroy_ex(d,x,y,z) ITTNOTIFY_VOID_D3(id_destroy_ex,d,x,y,z)
+#define __itt_id_destroy_ex_ptr      ITTNOTIFY_NAME(id_destroy_ex)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_id_create_ex(domain,clock_domain,timestamp,id)
+#define __itt_id_create_ex_ptr    0
+#define __itt_id_destroy_ex(domain,clock_domain,timestamp,id)
+#define __itt_id_destroy_ex_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_id_create_ex_ptr    0
+#define __itt_id_destroy_ex_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup clockdomain
+ * @brief Begin a task instance.
+ * @param[in] domain The domain for this task
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ * @param[in] taskid The instance ID for this task instance, or __itt_null
+ * @param[in] parentid The parent instance to which this task instance belongs, or __itt_null
+ * @param[in] name The name of this task
+ */
+void ITTAPI __itt_task_begin_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, __itt_string_handle* name);
+
+/**
+ * @ingroup clockdomain
+ * @brief Begin a task instance.
+ * @param[in] domain The domain for this task
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ * @param[in] taskid The identifier for this task instance, or __itt_null
+ * @param[in] parentid The parent of this task, or __itt_null
+ * @param[in] fn The pointer to the function you are tracing
+ */
+void ITTAPI __itt_task_begin_fn_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, void* fn);
+
+/**
+ * @ingroup clockdomain
+ * @brief End the current task instance.
+ * @param[in] domain The domain for this task
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ */
+void ITTAPI __itt_task_end_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, task_begin_ex,        (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, __itt_string_handle *name))
+ITT_STUBV(ITTAPI, void, task_begin_fn_ex,     (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, void* fn))
+ITT_STUBV(ITTAPI, void, task_end_ex,          (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp))
+#define __itt_task_begin_ex(d,x,y,z,a,b)      ITTNOTIFY_VOID_D5(task_begin_ex,d,x,y,z,a,b)
+#define __itt_task_begin_ex_ptr               ITTNOTIFY_NAME(task_begin_ex)
+#define __itt_task_begin_fn_ex(d,x,y,z,a,b)   ITTNOTIFY_VOID_D5(task_begin_fn_ex,d,x,y,z,a,b)
+#define __itt_task_begin_fn_ex_ptr            ITTNOTIFY_NAME(task_begin_fn_ex)
+#define __itt_task_end_ex(d,x,y)              ITTNOTIFY_VOID_D2(task_end_ex,d,x,y)
+#define __itt_task_end_ex_ptr                 ITTNOTIFY_NAME(task_end_ex)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_task_begin_ex(domain,clock_domain,timestamp,id,parentid,name)
+#define __itt_task_begin_ex_ptr          0
+#define __itt_task_begin_fn_ex(domain,clock_domain,timestamp,id,parentid,fn)
+#define __itt_task_begin_fn_ex_ptr       0
+#define __itt_task_end_ex(domain,clock_domain,timestamp)
+#define __itt_task_end_ex_ptr            0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_task_begin_ex_ptr          0
+#define __itt_task_begin_fn_ex_ptr       0
+#define __itt_task_end_ex_ptr            0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @defgroup counters Counters
+ * @ingroup public
+ * Counters are user-defined objects with a monotonically increasing
+ * value. Counter values are 64-bit unsigned integers.
+ * Counters have names that can be displayed in
+ * the tools.
+ * @{
+ */
+
+/**
+ * @brief opaque structure for counter identification
+ */
+/** @cond exclude_from_documentation */
+
+typedef struct ___itt_counter* __itt_counter;
+
+/**
+ * @brief Create an unsigned 64 bits integer counter with given name/domain
+ *
+ * After __itt_counter_create() is called, __itt_counter_inc(id), __itt_counter_inc_delta(id, delta),
+ * __itt_counter_set_value(id, value_ptr) or __itt_counter_set_value_ex(id, clock_domain, timestamp, value_ptr)
+ * can be used to change the value of the counter, where value_ptr is a pointer to an unsigned 64 bits integer
+ *
+ * The call is equal to __itt_counter_create_typed(name, domain, __itt_metadata_u64)
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_counter ITTAPI __itt_counter_createA(const char    *name, const char    *domain);
+__itt_counter ITTAPI __itt_counter_createW(const wchar_t *name, const wchar_t *domain);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_counter_create     __itt_counter_createW
+#  define __itt_counter_create_ptr __itt_counter_createW_ptr
+#else /* UNICODE */
+#  define __itt_counter_create     __itt_counter_createA
+#  define __itt_counter_create_ptr __itt_counter_createA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_counter ITTAPI __itt_counter_create(const char *name, const char *domain);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_counter, counter_createA, (const char    *name, const char    *domain))
+ITT_STUB(ITTAPI, __itt_counter, counter_createW, (const wchar_t *name, const wchar_t *domain))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_counter, counter_create,  (const char *name, const char *domain))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_counter_createA     ITTNOTIFY_DATA(counter_createA)
+#define __itt_counter_createA_ptr ITTNOTIFY_NAME(counter_createA)
+#define __itt_counter_createW     ITTNOTIFY_DATA(counter_createW)
+#define __itt_counter_createW_ptr ITTNOTIFY_NAME(counter_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_counter_create     ITTNOTIFY_DATA(counter_create)
+#define __itt_counter_create_ptr ITTNOTIFY_NAME(counter_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_counter_createA(name, domain)
+#define __itt_counter_createA_ptr 0
+#define __itt_counter_createW(name, domain)
+#define __itt_counter_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_counter_create(name, domain)
+#define __itt_counter_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_counter_createA_ptr 0
+#define __itt_counter_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_counter_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Increment the unsigned 64 bits integer counter value
+ *
+ * Calling this function to non-unsigned 64 bits integer counters has no effect
+ */
+void ITTAPI __itt_counter_inc(__itt_counter id);
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_inc, (__itt_counter id))
+#define __itt_counter_inc     ITTNOTIFY_VOID(counter_inc)
+#define __itt_counter_inc_ptr ITTNOTIFY_NAME(counter_inc)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_inc(id)
+#define __itt_counter_inc_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_inc_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/**
+ * @brief Increment the unsigned 64 bits integer counter value with x
+ *
+ * Calling this function to non-unsigned 64 bits integer counters has no effect
+ */
+void ITTAPI __itt_counter_inc_delta(__itt_counter id, unsigned long long value);
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_inc_delta, (__itt_counter id, unsigned long long value))
+#define __itt_counter_inc_delta     ITTNOTIFY_VOID(counter_inc_delta)
+#define __itt_counter_inc_delta_ptr ITTNOTIFY_NAME(counter_inc_delta)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_inc_delta(id, value)
+#define __itt_counter_inc_delta_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_inc_delta_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Decrement the unsigned 64 bits integer counter value
+ *
+ * Calling this function to non-unsigned 64 bits integer counters has no effect
+ */
+void ITTAPI __itt_counter_dec(__itt_counter id);
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_dec, (__itt_counter id))
+#define __itt_counter_dec     ITTNOTIFY_VOID(counter_dec)
+#define __itt_counter_dec_ptr ITTNOTIFY_NAME(counter_dec)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_dec(id)
+#define __itt_counter_dec_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_dec_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/**
+ * @brief Decrement the unsigned 64 bits integer counter value with x
+ *
+ * Calling this function to non-unsigned 64 bits integer counters has no effect
+ */
+void ITTAPI __itt_counter_dec_delta(__itt_counter id, unsigned long long value);
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_dec_delta, (__itt_counter id, unsigned long long value))
+#define __itt_counter_dec_delta     ITTNOTIFY_VOID(counter_dec_delta)
+#define __itt_counter_dec_delta_ptr ITTNOTIFY_NAME(counter_dec_delta)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_dec_delta(id, value)
+#define __itt_counter_dec_delta_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_dec_delta_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup counters
+ * @brief Increment a counter by one.
+ * The first call with a given name creates a counter by that name and sets its
+ * value to zero. Successive calls increment the counter value.
+ * @param[in] domain The domain controlling the call. Counter names are not domain specific.
+ *            The domain argument is used only to enable or disable the API calls.
+ * @param[in] name The name of the counter
+ */
+void ITTAPI __itt_counter_inc_v3(const __itt_domain *domain, __itt_string_handle *name);
+
+/**
+ * @ingroup counters
+ * @brief Increment a counter by the value specified in delta.
+ * @param[in] domain The domain controlling the call. Counter names are not domain specific.
+ *            The domain argument is used only to enable or disable the API calls.
+ * @param[in] name The name of the counter
+ * @param[in] delta The amount by which to increment the counter
+ */
+void ITTAPI __itt_counter_inc_delta_v3(const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta);
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_inc_v3,       (const __itt_domain *domain, __itt_string_handle *name))
+ITT_STUBV(ITTAPI, void, counter_inc_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta))
+#define __itt_counter_inc_v3(d,x)         ITTNOTIFY_VOID_D1(counter_inc_v3,d,x)
+#define __itt_counter_inc_v3_ptr          ITTNOTIFY_NAME(counter_inc_v3)
+#define __itt_counter_inc_delta_v3(d,x,y) ITTNOTIFY_VOID_D2(counter_inc_delta_v3,d,x,y)
+#define __itt_counter_inc_delta_v3_ptr    ITTNOTIFY_NAME(counter_inc_delta_v3)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_inc_v3(domain,name)
+#define __itt_counter_inc_v3_ptr       0
+#define __itt_counter_inc_delta_v3(domain,name,delta)
+#define __itt_counter_inc_delta_v3_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_inc_v3_ptr       0
+#define __itt_counter_inc_delta_v3_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+
+/**
+ * @ingroup counters
+ * @brief Decrement a counter by one.
+ * The first call with a given name creates a counter by that name and sets its
+ * value to zero. Successive calls decrement the counter value.
+ * @param[in] domain The domain controlling the call. Counter names are not domain specific.
+ *            The domain argument is used only to enable or disable the API calls.
+ * @param[in] name The name of the counter
+ */
+void ITTAPI __itt_counter_dec_v3(const __itt_domain *domain, __itt_string_handle *name);
+
+/**
+ * @ingroup counters
+ * @brief Decrement a counter by the value specified in delta.
+ * @param[in] domain The domain controlling the call. Counter names are not domain specific.
+ *            The domain argument is used only to enable or disable the API calls.
+ * @param[in] name The name of the counter
+ * @param[in] delta The amount by which to decrement the counter
+ */
+void ITTAPI __itt_counter_dec_delta_v3(const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta);
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_dec_v3,       (const __itt_domain *domain, __itt_string_handle *name))
+ITT_STUBV(ITTAPI, void, counter_dec_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta))
+#define __itt_counter_dec_v3(d,x)         ITTNOTIFY_VOID_D1(counter_dec_v3,d,x)
+#define __itt_counter_dec_v3_ptr          ITTNOTIFY_NAME(counter_dec_v3)
+#define __itt_counter_dec_delta_v3(d,x,y) ITTNOTIFY_VOID_D2(counter_dec_delta_v3,d,x,y)
+#define __itt_counter_dec_delta_v3_ptr    ITTNOTIFY_NAME(counter_dec_delta_v3)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_dec_v3(domain,name)
+#define __itt_counter_dec_v3_ptr       0
+#define __itt_counter_dec_delta_v3(domain,name,delta)
+#define __itt_counter_dec_delta_v3_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_dec_v3_ptr       0
+#define __itt_counter_dec_delta_v3_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @} counters group */
+
+
+/**
+ * @brief Set the counter value
+ */
+void ITTAPI __itt_counter_set_value(__itt_counter id, void *value_ptr);
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_set_value, (__itt_counter id, void *value_ptr))
+#define __itt_counter_set_value     ITTNOTIFY_VOID(counter_set_value)
+#define __itt_counter_set_value_ptr ITTNOTIFY_NAME(counter_set_value)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_set_value(id, value_ptr)
+#define __itt_counter_set_value_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_set_value_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Set the counter value
+ */
+void ITTAPI __itt_counter_set_value_ex(__itt_counter id, __itt_clock_domain *clock_domain, unsigned long long timestamp, void *value_ptr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_set_value_ex, (__itt_counter id, __itt_clock_domain *clock_domain, unsigned long long timestamp, void *value_ptr))
+#define __itt_counter_set_value_ex     ITTNOTIFY_VOID(counter_set_value_ex)
+#define __itt_counter_set_value_ex_ptr ITTNOTIFY_NAME(counter_set_value_ex)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_set_value_ex(id, clock_domain, timestamp, value_ptr)
+#define __itt_counter_set_value_ex_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_set_value_ex_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Create a typed counter with given name/domain
+ *
+ * After __itt_counter_create_typed() is called, __itt_counter_inc(id), __itt_counter_inc_delta(id, delta),
+ * __itt_counter_set_value(id, value_ptr) or __itt_counter_set_value_ex(id, clock_domain, timestamp, value_ptr)
+ * can be used to change the value of the counter
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_counter ITTAPI __itt_counter_create_typedA(const char    *name, const char    *domain, __itt_metadata_type type);
+__itt_counter ITTAPI __itt_counter_create_typedW(const wchar_t *name, const wchar_t *domain, __itt_metadata_type type);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_counter_create_typed     __itt_counter_create_typedW
+#  define __itt_counter_create_typed_ptr __itt_counter_create_typedW_ptr
+#else /* UNICODE */
+#  define __itt_counter_create_typed     __itt_counter_create_typedA
+#  define __itt_counter_create_typed_ptr __itt_counter_create_typedA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_counter ITTAPI __itt_counter_create_typed(const char *name, const char *domain, __itt_metadata_type type);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_counter, counter_create_typedA, (const char    *name, const char    *domain, __itt_metadata_type type))
+ITT_STUB(ITTAPI, __itt_counter, counter_create_typedW, (const wchar_t *name, const wchar_t *domain, __itt_metadata_type type))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_counter, counter_create_typed,  (const char *name, const char *domain, __itt_metadata_type type))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_counter_create_typedA     ITTNOTIFY_DATA(counter_create_typedA)
+#define __itt_counter_create_typedA_ptr ITTNOTIFY_NAME(counter_create_typedA)
+#define __itt_counter_create_typedW     ITTNOTIFY_DATA(counter_create_typedW)
+#define __itt_counter_create_typedW_ptr ITTNOTIFY_NAME(counter_create_typedW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_counter_create_typed     ITTNOTIFY_DATA(counter_create_typed)
+#define __itt_counter_create_typed_ptr ITTNOTIFY_NAME(counter_create_typed)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_counter_create_typedA(name, domain, type)
+#define __itt_counter_create_typedA_ptr 0
+#define __itt_counter_create_typedW(name, domain, type)
+#define __itt_counter_create_typedW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_counter_create_typed(name, domain, type)
+#define __itt_counter_create_typed_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_counter_create_typedA_ptr 0
+#define __itt_counter_create_typedW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_counter_create_typed_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Destroy the counter identified by the pointer previously returned by __itt_counter_create() or
+ * __itt_counter_create_typed()
+ */
+void ITTAPI __itt_counter_destroy(__itt_counter id);
+
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, counter_destroy, (__itt_counter id))
+#define __itt_counter_destroy     ITTNOTIFY_VOID(counter_destroy)
+#define __itt_counter_destroy_ptr ITTNOTIFY_NAME(counter_destroy)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_counter_destroy(id)
+#define __itt_counter_destroy_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_counter_destroy_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} counters group */
+
+/**
+ * @ingroup markers
+ * @brief Create a marker instance.
+ * @param[in] domain The domain for this marker
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ * @param[in] id The instance ID for this marker, or __itt_null
+ * @param[in] name The name for this marker
+ * @param[in] scope The scope for this marker
+ */
+void ITTAPI __itt_marker_ex(const __itt_domain *domain,  __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_string_handle *name, __itt_scope scope);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, marker_ex,    (const __itt_domain *domain,  __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_string_handle *name, __itt_scope scope))
+#define __itt_marker_ex(d,x,y,z,a,b)    ITTNOTIFY_VOID_D5(marker_ex,d,x,y,z,a,b)
+#define __itt_marker_ex_ptr             ITTNOTIFY_NAME(marker_ex)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_marker_ex(domain,clock_domain,timestamp,id,name,scope)
+#define __itt_marker_ex_ptr    0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_marker_ex_ptr    0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @ingroup clockdomain
+ * @brief Add a relation to the current task instance.
+ * The current task instance is the head of the relation.
+ * @param[in] domain The domain controlling this call
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ * @param[in] relation The kind of relation
+ * @param[in] tail The ID for the tail of the relation
+ */
+void ITTAPI __itt_relation_add_to_current_ex(const __itt_domain *domain,  __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_relation relation, __itt_id tail);
+
+/**
+ * @ingroup clockdomain
+ * @brief Add a relation between two instance identifiers.
+ * @param[in] domain The domain controlling this call
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ * @param[in] head The ID for the head of the relation
+ * @param[in] relation The kind of relation
+ * @param[in] tail The ID for the tail of the relation
+ */
+void ITTAPI __itt_relation_add_ex(const __itt_domain *domain,  __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id head, __itt_relation relation, __itt_id tail);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, relation_add_to_current_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_relation relation, __itt_id tail))
+ITT_STUBV(ITTAPI, void, relation_add_ex,            (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id head, __itt_relation relation, __itt_id tail))
+#define __itt_relation_add_to_current_ex(d,x,y,z,a) ITTNOTIFY_VOID_D4(relation_add_to_current_ex,d,x,y,z,a)
+#define __itt_relation_add_to_current_ex_ptr        ITTNOTIFY_NAME(relation_add_to_current_ex)
+#define __itt_relation_add_ex(d,x,y,z,a,b)          ITTNOTIFY_VOID_D5(relation_add_ex,d,x,y,z,a,b)
+#define __itt_relation_add_ex_ptr                   ITTNOTIFY_NAME(relation_add_ex)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_relation_add_to_current_ex(domain,clock_domain,timestame,relation,tail)
+#define __itt_relation_add_to_current_ex_ptr 0
+#define __itt_relation_add_ex(domain,clock_domain,timestamp,head,relation,tail)
+#define __itt_relation_add_ex_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_relation_add_to_current_ex_ptr 0
+#define __itt_relation_add_ex_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+typedef enum ___itt_track_group_type
+{
+    __itt_track_group_type_normal = 0
+} __itt_track_group_type;
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+#pragma pack(push, 8)
+
+typedef struct ___itt_track_group
+{
+    __itt_string_handle* name;     /*!< Name of the track group */
+    struct ___itt_track* track;    /*!< List of child tracks    */
+    __itt_track_group_type tgtype; /*!< Type of the track group */
+    int   extra1;                  /*!< Reserved. Must be zero  */
+    void* extra2;                  /*!< Reserved. Must be zero  */
+    struct ___itt_track_group* next;
+} __itt_track_group;
+
+#pragma pack(pop)
+/** @endcond */
+
+/**
+ * @brief Placeholder for custom track types. Currently, "normal" custom track
+ * is the only available track type.
+ */
+typedef enum ___itt_track_type
+{
+    __itt_track_type_normal = 0
+#ifdef INTEL_ITTNOTIFY_API_PRIVATE
+    , __itt_track_type_queue
+#endif /* INTEL_ITTNOTIFY_API_PRIVATE */
+} __itt_track_type;
+
+/** @cond exclude_from_documentation */
+#pragma pack(push, 8)
+
+typedef struct ___itt_track
+{
+    __itt_string_handle* name; /*!< Name of the track group */
+    __itt_track_group* group;  /*!< Parent group to a track */
+    __itt_track_type ttype;    /*!< Type of the track       */
+    int   extra1;              /*!< Reserved. Must be zero  */
+    void* extra2;              /*!< Reserved. Must be zero  */
+    struct ___itt_track* next;
+} __itt_track;
+
+#pragma pack(pop)
+/** @endcond */
+
+/**
+ * @brief Create logical track group.
+ */
+__itt_track_group* ITTAPI __itt_track_group_create(__itt_string_handle* name, __itt_track_group_type track_group_type);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_track_group*, track_group_create, (__itt_string_handle* name, __itt_track_group_type track_group_type))
+#define __itt_track_group_create     ITTNOTIFY_DATA(track_group_create)
+#define __itt_track_group_create_ptr ITTNOTIFY_NAME(track_group_create)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_track_group_create(name)  (__itt_track_group*)0
+#define __itt_track_group_create_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_track_group_create_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Create logical track.
+ */
+__itt_track* ITTAPI __itt_track_create(__itt_track_group* track_group, __itt_string_handle* name, __itt_track_type track_type);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_track*, track_create, (__itt_track_group* track_group,__itt_string_handle* name, __itt_track_type track_type))
+#define __itt_track_create     ITTNOTIFY_DATA(track_create)
+#define __itt_track_create_ptr ITTNOTIFY_NAME(track_create)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_track_create(track_group,name,track_type)  (__itt_track*)0
+#define __itt_track_create_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_track_create_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Set the logical track.
+ */
+void ITTAPI __itt_set_track(__itt_track* track);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, set_track, (__itt_track *track))
+#define __itt_set_track     ITTNOTIFY_VOID(set_track)
+#define __itt_set_track_ptr ITTNOTIFY_NAME(set_track)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_set_track(track)
+#define __itt_set_track_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_set_track_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/* ========================================================================== */
+/** @cond exclude_from_gpa_documentation */
+/**
+ * @defgroup events Events
+ * @ingroup public
+ * Events group
+ * @{
+ */
+/** @brief user event type */
+typedef int __itt_event;
+
+/**
+ * @brief Create an event notification
+ * @note name or namelen being null/name and namelen not matching, user event feature not enabled
+ * @return non-zero event identifier upon success and __itt_err otherwise
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_event LIBITTAPI __itt_event_createA(const char    *name, int namelen);
+__itt_event LIBITTAPI __itt_event_createW(const wchar_t *name, int namelen);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_event_create     __itt_event_createW
+#  define __itt_event_create_ptr __itt_event_createW_ptr
+#else
+#  define __itt_event_create     __itt_event_createA
+#  define __itt_event_create_ptr __itt_event_createA_ptr
+#endif /* UNICODE */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_event LIBITTAPI __itt_event_create(const char *name, int namelen);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char    *name, int namelen))
+ITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, __itt_event, event_create,  (const char    *name, int namelen))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA     ITTNOTIFY_DATA(event_createA)
+#define __itt_event_createA_ptr ITTNOTIFY_NAME(event_createA)
+#define __itt_event_createW     ITTNOTIFY_DATA(event_createW)
+#define __itt_event_createW_ptr ITTNOTIFY_NAME(event_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create      ITTNOTIFY_DATA(event_create)
+#define __itt_event_create_ptr  ITTNOTIFY_NAME(event_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA(name, namelen) (__itt_event)0
+#define __itt_event_createA_ptr 0
+#define __itt_event_createW(name, namelen) (__itt_event)0
+#define __itt_event_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create(name, namelen)  (__itt_event)0
+#define __itt_event_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA_ptr 0
+#define __itt_event_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record an event occurrence.
+ * @return __itt_err upon failure (invalid event id/user event feature not enabled)
+ */
+int LIBITTAPI __itt_event_start(__itt_event event);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(LIBITTAPI, int, event_start, (__itt_event event))
+#define __itt_event_start     ITTNOTIFY_DATA(event_start)
+#define __itt_event_start_ptr ITTNOTIFY_NAME(event_start)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_event_start(event) (int)0
+#define __itt_event_start_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_event_start_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record an event end occurrence.
+ * @note It is optional if events do not have durations.
+ * @return __itt_err upon failure (invalid event id/user event feature not enabled)
+ */
+int LIBITTAPI __itt_event_end(__itt_event event);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event))
+#define __itt_event_end     ITTNOTIFY_DATA(event_end)
+#define __itt_event_end_ptr ITTNOTIFY_NAME(event_end)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_event_end(event) (int)0
+#define __itt_event_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_event_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} events group */
+
+
+/**
+ * @defgroup arrays Arrays Visualizer
+ * @ingroup public
+ * Visualize arrays
+ * @{
+ */
+
+/**
+ * @enum __itt_av_data_type
+ * @brief Defines types of arrays data (for C/C++ intrinsic types)
+ */
+typedef enum
+{
+    __itt_e_first = 0,
+    __itt_e_char = 0,  /* 1-byte integer */
+    __itt_e_uchar,     /* 1-byte unsigned integer */
+    __itt_e_int16,     /* 2-byte integer */
+    __itt_e_uint16,    /* 2-byte unsigned integer  */
+    __itt_e_int32,     /* 4-byte integer */
+    __itt_e_uint32,    /* 4-byte unsigned integer */
+    __itt_e_int64,     /* 8-byte integer */
+    __itt_e_uint64,    /* 8-byte unsigned integer */
+    __itt_e_float,     /* 4-byte floating */
+    __itt_e_double,    /* 8-byte floating */
+    __itt_e_last = __itt_e_double
+} __itt_av_data_type;
+
+/**
+ * @brief Save an array data to a file.
+ * Output format is defined by the file extension. The csv and bmp formats are supported (bmp - for 2-dimensional array only).
+ * @param[in] data - pointer to the array data
+ * @param[in] rank - the rank of the array
+ * @param[in] dimensions - pointer to an array of integers, which specifies the array dimensions.
+ * The size of dimensions must be equal to the rank
+ * @param[in] type - the type of the array, specified as one of the __itt_av_data_type values (for intrinsic types)
+ * @param[in] filePath - the file path; the output format is defined by the file extension
+ * @param[in] columnOrder - defines how the array is stored in the linear memory.
+ * It should be 1 for column-major order (e.g. in FORTRAN) or 0 - for row-major order (e.g. in C).
+ */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int ITTAPI __itt_av_saveA(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder);
+int ITTAPI __itt_av_saveW(void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_av_save     __itt_av_saveW
+#  define __itt_av_save_ptr __itt_av_saveW_ptr
+#else /* UNICODE */
+#  define __itt_av_save     __itt_av_saveA
+#  define __itt_av_save_ptr __itt_av_saveA_ptr
+#endif /* UNICODE */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int ITTAPI __itt_av_save(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder))
+ITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, av_save,  (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_av_saveA     ITTNOTIFY_DATA(av_saveA)
+#define __itt_av_saveA_ptr ITTNOTIFY_NAME(av_saveA)
+#define __itt_av_saveW     ITTNOTIFY_DATA(av_saveW)
+#define __itt_av_saveW_ptr ITTNOTIFY_NAME(av_saveW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_av_save     ITTNOTIFY_DATA(av_save)
+#define __itt_av_save_ptr ITTNOTIFY_NAME(av_save)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_av_saveA(name)
+#define __itt_av_saveA_ptr 0
+#define __itt_av_saveW(name)
+#define __itt_av_saveW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_av_save(name)
+#define __itt_av_save_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_av_saveA_ptr 0
+#define __itt_av_saveW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_av_save_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+void ITTAPI __itt_enable_attach(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, enable_attach, (void))
+#define __itt_enable_attach     ITTNOTIFY_VOID(enable_attach)
+#define __itt_enable_attach_ptr ITTNOTIFY_NAME(enable_attach)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_enable_attach()
+#define __itt_enable_attach_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_enable_attach_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @cond exclude_from_gpa_documentation */
+
+/** @} arrays group */
+
+/** @endcond */
+
+/**
+ * @brief Module load notification
+ * This API is used to report necessary information in case of bypassing default system loader.
+ * Notification should be done immidiatelly after this module is loaded to process memory.
+ * @param[in] start_addr - module start address
+ * @param[in] end_addr - module end address
+ * @param[in] path - file system full path to the module
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_module_loadA(void *start_addr, void *end_addr, const char *path);
+void ITTAPI __itt_module_loadW(void *start_addr, void *end_addr, const wchar_t *path);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_module_load     __itt_module_loadW
+#  define __itt_module_load_ptr __itt_module_loadW_ptr
+#else /* UNICODE */
+#  define __itt_module_load     __itt_module_loadA
+#  define __itt_module_load_ptr __itt_module_loadA_ptr
+#endif /* UNICODE */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+void ITTAPI __itt_module_load(void *start_addr, void *end_addr, const char *path);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, void, module_loadA, (void *start_addr, void *end_addr, const char *path))
+ITT_STUB(ITTAPI, void, module_loadW, (void *start_addr, void *end_addr, const wchar_t *path))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, void, module_load,  (void *start_addr, void *end_addr, const char *path))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_module_loadA     ITTNOTIFY_VOID(module_loadA)
+#define __itt_module_loadA_ptr ITTNOTIFY_NAME(module_loadA)
+#define __itt_module_loadW     ITTNOTIFY_VOID(module_loadW)
+#define __itt_module_loadW_ptr ITTNOTIFY_NAME(module_loadW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_module_load     ITTNOTIFY_VOID(module_load)
+#define __itt_module_load_ptr ITTNOTIFY_NAME(module_load)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_module_loadA(start_addr, end_addr, path)
+#define __itt_module_loadA_ptr 0
+#define __itt_module_loadW(start_addr, end_addr, path)
+#define __itt_module_loadW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_module_load(start_addr, end_addr, path)
+#define __itt_module_load_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_module_loadA_ptr 0
+#define __itt_module_loadW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_module_load_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Report module unload
+ * This API is used to report necessary information in case of bypassing default system loader.
+ * Notification should be done just before the module is unloaded from process memory.
+ * @param[in] addr - base address of loaded module
+ */
+void ITTAPI __itt_module_unload(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, module_unload, (void *addr))
+#define __itt_module_unload     ITTNOTIFY_VOID(module_unload)
+#define __itt_module_unload_ptr ITTNOTIFY_NAME(module_unload)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_module_unload(addr)
+#define __itt_module_unload_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_module_unload_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+typedef enum
+{
+    __itt_module_type_unknown = 0,
+    __itt_module_type_elf,
+    __itt_module_type_coff
+} __itt_module_type;
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+typedef enum
+{
+    itt_section_type_unknown,
+    itt_section_type_bss,        /* notifies that the section contains uninitialized data. These are the relevant section types and the modules that contain them:
+                                  * ELF module:  SHT_NOBITS section type
+                                  * COFF module: IMAGE_SCN_CNT_UNINITIALIZED_DATA section type
+                                  */
+    itt_section_type_data,       /* notifies that section contains initialized data. These are the relevant section types and the modules that contain them:
+                                  * ELF module:  SHT_PROGBITS section type
+                                  * COFF module: IMAGE_SCN_CNT_INITIALIZED_DATA section type
+                                  */
+    itt_section_type_text        /* notifies that the section contains executable code. These are the relevant section types and the modules that contain them:
+                                  * ELF module:  SHT_PROGBITS section type
+                                  * COFF module: IMAGE_SCN_CNT_CODE section type
+                                  */
+} __itt_section_type;
+/** @endcond */
+
+/**
+ * @hideinitializer
+ * @brief bit-mask, detects a section attribute that indicates whether a section can be executed as code:
+ * These are the relevant section attributes and the modules that contain them:
+ * ELF module:  PF_X section attribute
+ * COFF module: IMAGE_SCN_MEM_EXECUTE attribute
+ */
+#define __itt_section_exec 0x20000000
+
+/**
+ * @hideinitializer
+ * @brief bit-mask, detects a section attribute that indicates whether a section can be read.
+ * These are the relevant section attributes and the modules that contain them:
+ * ELF module:  PF_R attribute
+ * COFF module: IMAGE_SCN_MEM_READ attribute
+ */
+#define __itt_section_read 0x40000000
+
+/**
+ * @hideinitializer
+ * @brief bit-mask, detects a section attribute that indicates whether a section can be written to.
+ * These are the relevant section attributes and the modules that contain them:
+ * ELF module:  PF_W attribute
+ * COFF module: IMAGE_SCN_MEM_WRITE attribute
+ */
+#define __itt_section_write 0x80000000
+
+/** @cond exclude_from_documentation */
+#pragma pack(push, 8)
+
+typedef struct ___itt_section_info
+{
+    const char* name;                 /*!< Section name in UTF8 */
+    __itt_section_type type;          /*!< Section content and semantics description */
+    size_t flags;                     /*!< Section bit flags that describe attributes using bit mask
+                                       * Zero if disabled, non-zero if enabled
+                                       */
+    void* start_addr;                 /*!< Section load(relocated) start address */
+    size_t size;                      /*!< Section file offset */
+    size_t file_offset;               /*!< Section size */
+} __itt_section_info;
+
+#pragma pack(pop)
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+#pragma pack(push, 8)
+
+typedef struct ___itt_module_object
+{
+    unsigned int version;                 /*!< API version*/
+    __itt_id module_id;                   /*!< Unique identifier. This is unchanged for sections that belong to the same module */
+    __itt_module_type module_type;        /*!< Binary module format */
+    const char* module_name;              /*!< Unique module name or path to module in UTF8
+                                           * Contains module name when module_bufer and module_size exist
+                                           * Contains module path when module_bufer and module_size absent
+                                           * module_name remains the same for the certain module_id
+                                           */
+    void* module_buffer;                  /*!< Module buffer content */
+    size_t module_size;                   /*!< Module buffer size */
+                                          /*!< If module_buffer and module_size exist, the binary module is dumped onto the system.
+                                           * If module_buffer and module_size do not exist,
+                                           * the binary module exists on the system already.
+                                           * The module_name parameter contains the path to the module.
+                                           */
+    __itt_section_info* section_array;    /*!< Reference to section information */
+    size_t section_number;
+} __itt_module_object;
+
+#pragma pack(pop)
+/** @endcond */
+
+/**
+ * @brief Load module content and its loaded(relocated) sections.
+ * This API is useful to save a module, or specify its location on the system and report information about loaded sections.
+ * The target module is saved on the system if module buffer content and size are available.
+ * If module buffer content and size are unavailable, the module name contains the path to the existing binary module.
+ * @param[in] module_obj - provides module and section information, along with unique module identifiers (name,module ID)
+ * which bind the binary module to particular sections.
+ */
+void ITTAPI __itt_module_load_with_sections(__itt_module_object* module_obj);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, module_load_with_sections,  (__itt_module_object* module_obj))
+#define __itt_module_load_with_sections     ITTNOTIFY_VOID(module_load_with_sections)
+#define __itt_module_load_with_sections_ptr ITTNOTIFY_NAME(module_load_with_sections)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_module_load_with_sections(module_obj)
+#define __itt_module_load_with_sections_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_module_load_with_sections_ptr  0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Unload a module and its loaded(relocated) sections.
+ * This API notifies that the module and its sections were unloaded.
+ * @param[in] module_obj - provides module and sections information, along with unique module identifiers (name,module ID)
+ * which bind the binary module to particular sections.
+ */
+void ITTAPI __itt_module_unload_with_sections(__itt_module_object* module_obj);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, module_unload_with_sections,  (__itt_module_object* module_obj))
+#define __itt_module_unload_with_sections     ITTNOTIFY_VOID(module_unload_with_sections)
+#define __itt_module_unload_with_sections_ptr ITTNOTIFY_NAME(module_unload_with_sections)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_module_unload_with_sections(module_obj)
+#define __itt_module_unload_with_sections_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_module_unload_with_sections_ptr  0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _ITTNOTIFY_H_ */
+
+#ifdef INTEL_ITTNOTIFY_API_PRIVATE
+
+#ifndef _ITTNOTIFY_PRIVATE_
+#define _ITTNOTIFY_PRIVATE_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @ingroup clockdomain
+ * @brief Begin an overlapped task instance.
+ * @param[in] domain The domain for this task
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ * @param[in] taskid The identifier for this task instance, *cannot* be __itt_null.
+ * @param[in] parentid The parent of this task, or __itt_null.
+ * @param[in] name The name of this task.
+ */
+void ITTAPI __itt_task_begin_overlapped_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, __itt_string_handle* name);
+
+/**
+ * @ingroup clockdomain
+ * @brief End an overlapped task instance.
+ * @param[in] domain The domain for this task
+ * @param[in] clock_domain The clock domain controlling the execution of this call.
+ * @param[in] timestamp The user defined timestamp.
+ * @param[in] taskid Explicit ID of finished task
+ */
+void ITTAPI __itt_task_end_overlapped_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, task_begin_overlapped_ex,       (const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, __itt_string_handle* name))
+ITT_STUBV(ITTAPI, void, task_end_overlapped_ex,         (const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid))
+#define __itt_task_begin_overlapped_ex(d,x,y,z,a,b)     ITTNOTIFY_VOID_D5(task_begin_overlapped_ex,d,x,y,z,a,b)
+#define __itt_task_begin_overlapped_ex_ptr              ITTNOTIFY_NAME(task_begin_overlapped_ex)
+#define __itt_task_end_overlapped_ex(d,x,y,z)           ITTNOTIFY_VOID_D3(task_end_overlapped_ex,d,x,y,z)
+#define __itt_task_end_overlapped_ex_ptr                ITTNOTIFY_NAME(task_end_overlapped_ex)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_task_begin_overlapped_ex(domain,clock_domain,timestamp,taskid,parentid,name)
+#define __itt_task_begin_overlapped_ex_ptr      0
+#define __itt_task_end_overlapped_ex(domain,clock_domain,timestamp,taskid)
+#define __itt_task_end_overlapped_ex_ptr        0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_task_begin_overlapped_ex_ptr      0
+#define __itt_task_end_overlapped_ptr           0
+#define __itt_task_end_overlapped_ex_ptr        0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @defgroup makrs_internal Marks
+ * @ingroup internal
+ * Marks group
+ * @warning Internal API:
+ *   - It is not shipped to outside of Intel
+ *   - It is delivered to internal Intel teams using e-mail or SVN access only
+ * @{
+ */
+/** @brief user mark type */
+typedef int __itt_mark_type;
+
+/**
+ * @brief Creates a user mark type with the specified name using char or Unicode string.
+ * @param[in] name - name of mark to create
+ * @return Returns a handle to the mark type
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_mark_type ITTAPI __itt_mark_createA(const char    *name);
+__itt_mark_type ITTAPI __itt_mark_createW(const wchar_t *name);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_mark_create     __itt_mark_createW
+#  define __itt_mark_create_ptr __itt_mark_createW_ptr
+#else /* UNICODE */
+#  define __itt_mark_create     __itt_mark_createA
+#  define __itt_mark_create_ptr __itt_mark_createA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_mark_type ITTAPI __itt_mark_create(const char *name);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_mark_type, mark_createA, (const char    *name))
+ITT_STUB(ITTAPI, __itt_mark_type, mark_createW, (const wchar_t *name))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_mark_type, mark_create,  (const char *name))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_createA     ITTNOTIFY_DATA(mark_createA)
+#define __itt_mark_createA_ptr ITTNOTIFY_NAME(mark_createA)
+#define __itt_mark_createW     ITTNOTIFY_DATA(mark_createW)
+#define __itt_mark_createW_ptr ITTNOTIFY_NAME(mark_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_create      ITTNOTIFY_DATA(mark_create)
+#define __itt_mark_create_ptr  ITTNOTIFY_NAME(mark_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_createA(name) (__itt_mark_type)0
+#define __itt_mark_createA_ptr 0
+#define __itt_mark_createW(name) (__itt_mark_type)0
+#define __itt_mark_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_create(name)  (__itt_mark_type)0
+#define __itt_mark_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_createA_ptr 0
+#define __itt_mark_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Creates a "discrete" user mark type of the specified type and an optional parameter using char or Unicode string.
+ *
+ * - The mark of "discrete" type is placed to collection results in case of success. It appears in overtime view(s) as a special tick sign.
+ * - The call is "synchronous" - function returns after mark is actually added to results.
+ * - This function is useful, for example, to mark different phases of application
+ *   (beginning of the next mark automatically meand end of current region).
+ * - Can be used together with "continuous" marks (see below) at the same collection session
+ * @param[in] mt - mark, created by __itt_mark_create(const char* name) function
+ * @param[in] parameter - string parameter of mark
+ * @return Returns zero value in case of success, non-zero value otherwise.
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int ITTAPI __itt_markA(__itt_mark_type mt, const char    *parameter);
+int ITTAPI __itt_markW(__itt_mark_type mt, const wchar_t *parameter);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_mark     __itt_markW
+#  define __itt_mark_ptr __itt_markW_ptr
+#else /* UNICODE  */
+#  define __itt_mark     __itt_markA
+#  define __itt_mark_ptr __itt_markA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int ITTAPI __itt_mark(__itt_mark_type mt, const char *parameter);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, markA, (__itt_mark_type mt, const char    *parameter))
+ITT_STUB(ITTAPI, int, markW, (__itt_mark_type mt, const wchar_t *parameter))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, mark,  (__itt_mark_type mt, const char *parameter))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_markA     ITTNOTIFY_DATA(markA)
+#define __itt_markA_ptr ITTNOTIFY_NAME(markA)
+#define __itt_markW     ITTNOTIFY_DATA(markW)
+#define __itt_markW_ptr ITTNOTIFY_NAME(markW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark      ITTNOTIFY_DATA(mark)
+#define __itt_mark_ptr  ITTNOTIFY_NAME(mark)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_markA(mt, parameter) (int)0
+#define __itt_markA_ptr 0
+#define __itt_markW(mt, parameter) (int)0
+#define __itt_markW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark(mt, parameter)  (int)0
+#define __itt_mark_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_markA_ptr 0
+#define __itt_markW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Use this if necessary to create a "discrete" user event type (mark) for process
+ * rather then for one thread
+ * @see int __itt_mark(__itt_mark_type mt, const char* parameter);
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int ITTAPI __itt_mark_globalA(__itt_mark_type mt, const char    *parameter);
+int ITTAPI __itt_mark_globalW(__itt_mark_type mt, const wchar_t *parameter);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_mark_global     __itt_mark_globalW
+#  define __itt_mark_global_ptr __itt_mark_globalW_ptr
+#else /* UNICODE  */
+#  define __itt_mark_global     __itt_mark_globalA
+#  define __itt_mark_global_ptr __itt_mark_globalA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int ITTAPI __itt_mark_global(__itt_mark_type mt, const char *parameter);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, mark_globalA, (__itt_mark_type mt, const char    *parameter))
+ITT_STUB(ITTAPI, int, mark_globalW, (__itt_mark_type mt, const wchar_t *parameter))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, mark_global,  (__itt_mark_type mt, const char *parameter))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_globalA     ITTNOTIFY_DATA(mark_globalA)
+#define __itt_mark_globalA_ptr ITTNOTIFY_NAME(mark_globalA)
+#define __itt_mark_globalW     ITTNOTIFY_DATA(mark_globalW)
+#define __itt_mark_globalW_ptr ITTNOTIFY_NAME(mark_globalW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_global      ITTNOTIFY_DATA(mark_global)
+#define __itt_mark_global_ptr  ITTNOTIFY_NAME(mark_global)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_globalA(mt, parameter) (int)0
+#define __itt_mark_globalA_ptr 0
+#define __itt_mark_globalW(mt, parameter) (int)0
+#define __itt_mark_globalW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_global(mt, parameter)  (int)0
+#define __itt_mark_global_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_mark_globalA_ptr 0
+#define __itt_mark_globalW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_mark_global_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Creates an "end" point for "continuous" mark with specified name.
+ *
+ * - Returns zero value in case of success, non-zero value otherwise.
+ *   Also returns non-zero value when preceding "begin" point for the
+ *   mark with the same name failed to be created or not created.
+ * - The mark of "continuous" type is placed to collection results in
+ *   case of success. It appears in overtime view(s) as a special tick
+ *   sign (different from "discrete" mark) together with line from
+ *   corresponding "begin" mark to "end" mark.
+ * @note Continuous marks can overlap and be nested inside each other.
+ * Discrete mark can be nested inside marked region
+ * @param[in] mt - mark, created by __itt_mark_create(const char* name) function
+ * @return Returns zero value in case of success, non-zero value otherwise.
+ */
+int ITTAPI __itt_mark_off(__itt_mark_type mt);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, int, mark_off, (__itt_mark_type mt))
+#define __itt_mark_off     ITTNOTIFY_DATA(mark_off)
+#define __itt_mark_off_ptr ITTNOTIFY_NAME(mark_off)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_mark_off(mt) (int)0
+#define __itt_mark_off_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_mark_off_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Use this if necessary to create an "end" point for mark of process
+ * @see int __itt_mark_off(__itt_mark_type mt);
+ */
+int ITTAPI __itt_mark_global_off(__itt_mark_type mt);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, int, mark_global_off, (__itt_mark_type mt))
+#define __itt_mark_global_off     ITTNOTIFY_DATA(mark_global_off)
+#define __itt_mark_global_off_ptr ITTNOTIFY_NAME(mark_global_off)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_mark_global_off(mt) (int)0
+#define __itt_mark_global_off_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_mark_global_off_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} marks group */
+
+/**
+ * @defgroup counters_internal Counters
+ * @ingroup internal
+ * Counters group
+ * @{
+ */
+
+
+/**
+ * @defgroup stitch Stack Stitching
+ * @ingroup internal
+ * Stack Stitching group
+ * @{
+ */
+/**
+ * @brief opaque structure for counter identification
+ */
+typedef struct ___itt_caller *__itt_caller;
+
+/**
+ * @brief Create the stitch point e.g. a point in call stack where other stacks should be stitched to.
+ * The function returns a unique identifier which is used to match the cut points with corresponding stitch points.
+ */
+__itt_caller ITTAPI __itt_stack_caller_create(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_caller, stack_caller_create, (void))
+#define __itt_stack_caller_create     ITTNOTIFY_DATA(stack_caller_create)
+#define __itt_stack_caller_create_ptr ITTNOTIFY_NAME(stack_caller_create)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_stack_caller_create() (__itt_caller)0
+#define __itt_stack_caller_create_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_stack_caller_create_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Destroy the information about stitch point identified by the pointer previously returned by __itt_stack_caller_create()
+ */
+void ITTAPI __itt_stack_caller_destroy(__itt_caller id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, stack_caller_destroy, (__itt_caller id))
+#define __itt_stack_caller_destroy     ITTNOTIFY_VOID(stack_caller_destroy)
+#define __itt_stack_caller_destroy_ptr ITTNOTIFY_NAME(stack_caller_destroy)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_stack_caller_destroy(id)
+#define __itt_stack_caller_destroy_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_stack_caller_destroy_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Sets the cut point. Stack from each event which occurs after this call will be cut
+ * at the same stack level the function was called and stitched to the corresponding stitch point.
+ */
+void ITTAPI __itt_stack_callee_enter(__itt_caller id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, stack_callee_enter, (__itt_caller id))
+#define __itt_stack_callee_enter     ITTNOTIFY_VOID(stack_callee_enter)
+#define __itt_stack_callee_enter_ptr ITTNOTIFY_NAME(stack_callee_enter)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_stack_callee_enter(id)
+#define __itt_stack_callee_enter_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_stack_callee_enter_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief This function eliminates the cut point which was set by latest __itt_stack_callee_enter().
+ */
+void ITTAPI __itt_stack_callee_leave(__itt_caller id);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, stack_callee_leave, (__itt_caller id))
+#define __itt_stack_callee_leave     ITTNOTIFY_VOID(stack_callee_leave)
+#define __itt_stack_callee_leave_ptr ITTNOTIFY_NAME(stack_callee_leave)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_stack_callee_leave(id)
+#define __itt_stack_callee_leave_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_stack_callee_leave_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @} stitch group */
+
+/* ***************************************************************************************************************************** */
+
+#include <stdarg.h>
+
+/** @cond exclude_from_documentation */
+typedef enum __itt_error_code
+{
+    __itt_error_success       = 0, /*!< no error */
+    __itt_error_no_module     = 1, /*!< module can't be loaded */
+    /* %1$s -- library name; win: %2$d -- system error code; unx: %2$s -- system error message. */
+    __itt_error_no_symbol     = 2, /*!< symbol not found */
+    /* %1$s -- library name, %2$s -- symbol name. */
+    __itt_error_unknown_group = 3, /*!< unknown group specified */
+    /* %1$s -- env var name, %2$s -- group name. */
+    __itt_error_cant_read_env = 4, /*!< GetEnvironmentVariable() failed */
+    /* %1$s -- env var name, %2$d -- system error. */
+    __itt_error_env_too_long  = 5, /*!< variable value too long */
+    /* %1$s -- env var name, %2$d -- actual length of the var, %3$d -- max allowed length. */
+    __itt_error_system        = 6  /*!< pthread_mutexattr_init or pthread_mutex_init failed */
+    /* %1$s -- function name, %2$d -- errno. */
+} __itt_error_code;
+
+typedef void (__itt_error_handler_t)(__itt_error_code code, va_list);
+__itt_error_handler_t* __itt_set_error_handler(__itt_error_handler_t*);
+
+const char* ITTAPI __itt_api_version(void);
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#define __itt_error_handler ITT_JOIN(INTEL_ITTNOTIFY_PREFIX, error_handler)
+void __itt_error_handler(__itt_error_code code, va_list args);
+extern const int ITTNOTIFY_NAME(err);
+#define __itt_err ITTNOTIFY_NAME(err)
+ITT_STUB(ITTAPI, const char*, api_version, (void))
+#define __itt_api_version     ITTNOTIFY_DATA(api_version)
+#define __itt_api_version_ptr ITTNOTIFY_NAME(api_version)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_api_version()   (const char*)0
+#define __itt_api_version_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_api_version_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _ITTNOTIFY_PRIVATE_ */
+
+#endif /* INTEL_ITTNOTIFY_API_PRIVATE */
diff --git a/deps/v8/third_party/ittapi/include/jitprofiling.h b/deps/v8/third_party/ittapi/include/jitprofiling.h
new file mode 100644
index 00000000000000..ffda0048d05a4e
--- /dev/null
+++ b/deps/v8/third_party/ittapi/include/jitprofiling.h
@@ -0,0 +1,642 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+
+#ifndef __JITPROFILING_H__
+#define __JITPROFILING_H__
+
+/**
+ * @brief JIT Profiling APIs
+ *
+ * The JIT Profiling API is used to report information about just-in-time
+ * generated code that can be used by performance tools. The user inserts
+ * calls in the code generator to report information before JIT-compiled
+ * code goes to execution. This information is collected at runtime and used
+ * by tools like Intel(R) VTune(TM) Amplifier to display performance metrics
+ * associated with JIT-compiled code.
+ *
+ * These APIs can be used to\n
+ * - **Profile trace-based and method-based JIT-compiled
+ * code**. Some examples of environments that you can profile with these APIs:
+ * dynamic JIT compilation of JavaScript code traces, JIT execution in OpenCL(TM)
+ * software technology, Java/.NET managed execution environments, and custom
+ * ISV JIT engines.
+ * @code
+ * #include <jitprofiling.h>
+ *
+ * if (iJIT_IsProfilingActive != iJIT_SAMPLING_ON) {
+ *     return;
+ * }
+ *
+ * iJIT_Method_Load jmethod = {0};
+ * jmethod.method_id = iJIT_GetNewMethodID();
+ * jmethod.method_name = "method_name";
+ * jmethod.class_file_name = "class_name";
+ * jmethod.source_file_name = "source_file_name";
+ * jmethod.method_load_address = code_addr;
+ * jmethod.method_size = code_size;
+ *
+ * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&jmethod);
+ * iJIT_NotifyEvent(iJVM_EVENT_TYPE_SHUTDOWN, NULL);
+ * @endcode
+ *
+ *  * Expected behavior:
+ *    * If any iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED event overwrites an
+ *      already reported method, then such a method becomes invalid and its
+ *      memory region is treated as unloaded. VTune Amplifier displays the metrics
+ *      collected by the method until it is overwritten.
+ *    * If supplied line number information contains multiple source lines for
+ *      the same assembly instruction (code location), then VTune Amplifier picks up
+ *      the first line number.
+ *    * Dynamically generated code can be associated with a module name.
+ *      Use the iJIT_Method_Load_V2 structure.\n
+ *      Clarification of some cases:
+ *        * If you register a function with the same method ID multiple times,
+ *          specifying different module names, then the VTune Amplifier picks up
+ *          the module name registered first. If you want to distinguish the same
+ *          function between different JIT engines, supply different method IDs for
+ *          each function. Other symbolic information (for example, source file)
+ *          can be identical.
+ *
+ * - **Analyze split functions** (multiple joint or disjoint code regions
+ * belonging to the same function) **including re-JIT**
+ * with potential overlapping of code regions in time, which is common in
+ * resource-limited environments.
+ * @code
+ * #include <jitprofiling.h>
+ *
+ * unsigned int method_id = iJIT_GetNewMethodID();
+ *
+ * iJIT_Method_Load a = {0};
+ * a.method_id = method_id;
+ * a.method_load_address = 0x100;
+ * a.method_size = 0x20;
+ *
+ * iJIT_Method_Load b = {0};
+ * b.method_id = method_id;
+ * b.method_load_address = 0x200;
+ * b.method_size = 0x30;
+ *
+ * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&a);
+ * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&b);
+ * @endcode
+ *
+ *  * Expected behaviour:
+ *      * If a iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED event overwrites an
+ *        already reported method, then such a method becomes invalid and
+ *        its memory region is treated as unloaded.
+ *      * All code regions reported with the same method ID are considered as
+ *        belonging to the same method. Symbolic information (method name,
+ *        source file name) will be taken from the first notification, and all
+ *        subsequent notifications with the same method ID will be processed
+ *        only for line number table information. So, the VTune Amplifier will map
+ *        samples to a source line using the line number table from the current
+ *        notification while taking the source file name from the very first one.\n
+ *        Clarification of some cases:\n
+ *          * If you register a second code region with a different source file
+ *          name and the same method ID, then this information will be saved and
+ *          will not be considered as an extension of the first code region, but
+ *          VTune Amplifier will use the source file of the first code region and map
+ *          performance metrics incorrectly.
+ *          * If you register a second code region with the same source file as
+ *          for the first region and the same method ID, then the source file will be
+ *          discarded but VTune Amplifier will map metrics to the source file correctly.
+ *          * If you register a second code region with a null source file and
+ *          the same method ID, then provided line number info will be associated
+ *          with the source file of the first code region.
+ *
+ * - **Explore inline functions** including multi-level hierarchy of
+ * nested inline methods which shows how performance metrics are distributed through them.
+ * @code
+ * #include <jitprofiling.h>
+ *
+ *  //                                    method_id   parent_id
+ *  //   [-- c --]                          3000        2000
+ *  //                  [---- d -----]      2001        1000
+ *  //  [---- b ----]                       2000        1000
+ *  // [------------ a ----------------]    1000         n/a
+ *
+ * iJIT_Method_Load a = {0};
+ * a.method_id = 1000;
+ *
+ * iJIT_Method_Inline_Load b = {0};
+ * b.method_id = 2000;
+ * b.parent_method_id = 1000;
+ *
+ * iJIT_Method_Inline_Load c = {0};
+ * c.method_id = 3000;
+ * c.parent_method_id = 2000;
+ *
+ * iJIT_Method_Inline_Load d = {0};
+ * d.method_id = 2001;
+ * d.parent_method_id = 1000;
+ *
+ * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&a);
+ * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED, (void*)&b);
+ * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED, (void*)&c);
+ * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED, (void*)&d);
+ * @endcode
+ *
+ *  * Requirements:
+ *      * Each inline (iJIT_Method_Inline_Load) method should be associated
+ *        with two method IDs: one for itself; one for its immediate parent.
+ *      * Address regions of inline methods of the same parent method cannot
+ *        overlap each other.
+ *      * Execution of the parent method must not be started until it and all
+ *        its inline methods are reported.
+ *  * Expected behaviour:
+ *      * In case of nested inline methods an order of
+ *        iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED events is not important.
+ *      * If any event overwrites either inline method or top parent method,
+ *        then the parent, including inline methods, becomes invalid and its memory
+ *        region is treated as unloaded.
+ *
+ * **Life time of allocated data**\n
+ * The client sends an event notification to the agent with event-specific
+ * data, which is a structure. The pointers in the structure refer to memory
+ * allocated by the client, which responsible for releasing it. The pointers are
+ * used by the iJIT_NotifyEvent method to copy client's data in a trace file,
+ * and they are not used after the iJIT_NotifyEvent method returns.
+ */
+
+/**
+ * @defgroup jitapi JIT Profiling
+ * @ingroup internal
+ * @{
+ */
+
+/**
+ * @brief Enumerator for the types of notifications
+ */
+typedef enum iJIT_jvm_event
+{
+    iJVM_EVENT_TYPE_SHUTDOWN = 2,               /**<\brief Send this to shutdown the agent.
+                                                 * Use NULL for event data. */
+
+    iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED = 13,  /**<\brief Send when dynamic code is
+                                                 * JIT compiled and loaded into
+                                                 * memory by the JIT engine, but
+                                                 * before the code is executed.
+                                                 * Use iJIT_Method_Load as event
+                                                 * data. */
+/** @cond exclude_from_documentation */
+    iJVM_EVENT_TYPE_METHOD_UNLOAD_START,    /**<\brief Send when compiled dynamic
+                                             * code is being unloaded from memory.
+                                             * Use iJIT_Method_Load as event data.*/
+/** @endcond */
+
+    iJVM_EVENT_TYPE_METHOD_UPDATE,   /**<\brief Send to provide new content for
+                                      * a previously reported dynamic code.
+                                      * The previous content will be invalidated
+                                      * starting from the time of the notification.
+                                      * Use iJIT_Method_Load as event data but
+                                      * required fields are following:
+                                      * - method_id    identify the code to update.
+                                      * - method_load_address    specify start address
+                                      *                          within identified code range
+                                      *                          where update should be started.
+                                      * - method_size            specify length of updated code
+                                      *                          range. */
+
+
+    iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED, /**<\brief Send when an inline dynamic
+                                                  * code is JIT compiled and loaded
+                                                  * into memory by the JIT engine,
+                                                  * but before the parent code region
+                                                  * starts executing.
+                                                  * Use iJIT_Method_Inline_Load as event data.*/
+
+/** @cond exclude_from_documentation */
+    iJVM_EVENT_TYPE_METHOD_UPDATE_V2,
+/** @endcond */
+
+    iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V2 = 21, /**<\brief Send when a dynamic code is
+                                                   * JIT compiled and loaded into
+                                                   * memory by the JIT engine, but
+                                                   * before the code is executed.
+                                                   * Use iJIT_Method_Load_V2 as event data. */
+
+    iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V3       /**<\brief Send when a dynamic code is
+                                                   * JIT compiled and loaded into
+                                                   * memory by the JIT engine, but
+                                                   * before the code is executed.
+                                                   * Use iJIT_Method_Load_V3 as event data. */
+} iJIT_JVM_EVENT;
+
+/**
+ * @brief Enumerator for the agent's mode
+ */
+typedef enum _iJIT_IsProfilingActiveFlags
+{
+    iJIT_NOTHING_RUNNING           = 0x0000,    /**<\brief The agent is not running;
+                                                 * iJIT_NotifyEvent calls will
+                                                 * not be processed. */
+    iJIT_SAMPLING_ON               = 0x0001,    /**<\brief The agent is running and
+                                                 * ready to process notifications. */
+} iJIT_IsProfilingActiveFlags;
+
+/**
+ * @brief Description of a single entry in the line number information of a code region.
+ * @details A table of line number entries gives information about how the reported code region
+ * is mapped to source file.
+ * Intel(R) VTune(TM) Amplifier uses line number information to attribute
+ * the samples (virtual address) to a line number. \n
+ * It is acceptable to report different code addresses for the same source line:
+ * @code
+ *   Offset LineNumber
+ *      1       2
+ *      12      4
+ *      15      2
+ *      18      1
+ *      21      30
+ *
+ *  VTune Amplifier constructs the following table using the client data
+ *
+ *   Code subrange  Line number
+ *      0-1             2
+ *      1-12            4
+ *      12-15           2
+ *      15-18           1
+ *      18-21           30
+ * @endcode
+ */
+typedef struct _LineNumberInfo
+{
+    unsigned int Offset;     /**<\brief Offset from the begining of the code region. */
+    unsigned int LineNumber; /**<\brief Matching source line number offset (from beginning of source file). */
+
+} *pLineNumberInfo, LineNumberInfo;
+
+/**
+ * @brief Enumerator for the code architecture.
+ */
+typedef enum _iJIT_CodeArchitecture
+{
+    iJIT_CA_NATIVE = 0, /**<\brief Native to the process architecture that is calling it. */
+
+    iJIT_CA_32,         /**<\brief 32-bit machine code. */
+
+    iJIT_CA_64          /**<\brief 64-bit machine code. */
+
+} iJIT_CodeArchitecture;
+
+#pragma pack(push, 8)
+
+/**
+ * @brief Description of a JIT-compiled method
+ * @details When you use the iJIT_Method_Load structure to describe
+ *  the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED
+ *  as an event type to report it.
+ */
+typedef struct _iJIT_Method_Load
+{
+    unsigned int method_id; /**<\brief Unique method ID. Cannot be 0.
+                             *  You must either use the API function
+                             *  iJIT_GetNewMethodID to get a valid and unique
+                             *  method ID, or else manage ID uniqueness
+                             *  and correct range by yourself.\n
+                             *  You must use the same method ID for all code
+                             *  regions of the same method, otherwise different
+                             *  method IDs specify different methods. */
+
+    char* method_name; /**<\brief The name of the method. It can be optionally
+                        *  prefixed with its class name and appended with
+                        *  its complete signature. Can't be NULL. */
+
+    void* method_load_address; /**<\brief The start virtual address of the method code
+                                *  region. If NULL, data provided with
+                                *  event are not accepted. */
+
+    unsigned int method_size; /**<\brief The code size of the method in memory.
+                               *  If 0, then data provided with the event are not
+                               *  accepted. */
+
+    unsigned int line_number_size; /**<\brief The number of entries in the line number
+                                    *  table.0 if none. */
+
+    pLineNumberInfo line_number_table; /**<\brief Pointer to the line numbers info
+                                        *  array. Can be NULL if
+                                        *  line_number_size is 0. See
+                                        *  LineNumberInfo Structure for a
+                                        *  description of a single entry in
+                                        *  the line number info array */
+
+    unsigned int class_id; /**<\brief This field is obsolete. */
+
+    char* class_file_name; /**<\brief Class name. Can be NULL.*/
+
+    char* source_file_name; /**<\brief Source file name. Can be NULL.*/
+
+} *piJIT_Method_Load, iJIT_Method_Load;
+
+/**
+ * @brief Description of a JIT-compiled method
+ * @details When you use the iJIT_Method_Load_V2 structure to describe
+ *  the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V2
+ *  as an event type to report it.
+ */
+typedef struct _iJIT_Method_Load_V2
+{
+    unsigned int method_id; /**<\brief Unique method ID. Cannot be 0.
+                             *  You must either use the API function
+                             *  iJIT_GetNewMethodID to get a valid and unique
+                             *  method ID, or else manage ID uniqueness
+                             *  and correct range by yourself.\n
+                             *  You must use the same method ID for all code
+                             *  regions of the same method, otherwise different
+                             *  method IDs specify different methods. */
+
+    char* method_name; /**<\brief The name of the method. It can be optionally
+                        *  prefixed with its class name and appended with
+                        *  its complete signature. Can't be  NULL. */
+
+    void* method_load_address; /**<\brief The start virtual address of the method code
+                                *  region. If NULL, then data provided with the
+                                *  event are not accepted. */
+
+    unsigned int method_size; /**<\brief The code size of the method in memory.
+                               *  If 0, then data provided with the event are not
+                               *  accepted. */
+
+    unsigned int line_number_size; /**<\brief The number of entries in the line number
+                                    *  table. 0 if none. */
+
+    pLineNumberInfo line_number_table; /**<\brief Pointer to the line numbers info
+                                        *  array. Can be NULL if
+                                        *  line_number_size is 0. See
+                                        *  LineNumberInfo Structure for a
+                                        *  description of a single entry in
+                                        *  the line number info array. */
+
+    char* class_file_name; /**<\brief Class name. Can be NULL. */
+
+    char* source_file_name; /**<\brief Source file name. Can be NULL. */
+
+    char* module_name; /**<\brief Module name. Can be NULL.
+                           The module name can be useful for distinguishing among
+                           different JIT engines. VTune Amplifier will display
+                           reported methods grouped by specific module. */
+
+} *piJIT_Method_Load_V2, iJIT_Method_Load_V2;
+
+/**
+ * @brief Description of a JIT-compiled method
+ * @details The iJIT_Method_Load_V3 structure is the same as iJIT_Method_Load_V2
+ *  with a newly introduced 'arch' field that specifies architecture of the code region.
+ *  When you use the iJIT_Method_Load_V3 structure to describe
+ *  the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V3
+ *  as an event type to report it.
+ */
+typedef struct _iJIT_Method_Load_V3
+{
+    unsigned int method_id; /**<\brief Unique method ID. Cannot be 0.
+                             *  You must either use the API function
+                             *  iJIT_GetNewMethodID to get a valid and unique
+                             *  method ID, or manage ID uniqueness
+                             *  and correct range by yourself.\n
+                             *  You must use the same method ID for all code
+                             *  regions of the same method, otherwise they are
+                             *  treated as regions of different methods. */
+
+    char* method_name; /**<\brief The name of the method. It can be optionally
+                        *  prefixed with its class name and appended with
+                        *  its complete signature. Cannot be  NULL. */
+
+    void* method_load_address; /**<\brief The start virtual address of the method code
+                                *  region. If NULL, then data provided with the
+                                *  event are not accepted. */
+
+    unsigned int method_size; /**<\brief The code size of the method in memory.
+                               *  If 0, then data provided with the event are not
+                               *  accepted. */
+
+    unsigned int line_number_size; /**<\brief The number of entries in the line number
+                                    *  table. 0 if none. */
+
+    pLineNumberInfo line_number_table; /**<\brief Pointer to the line numbers info
+                                        *  array. Can be NULL if
+                                        *  line_number_size is 0. See
+                                        *  LineNumberInfo Structure for a
+                                        *  description of a single entry in
+                                        *  the line number info array. */
+
+    char* class_file_name; /**<\brief Class name. Can be NULL. */
+
+    char* source_file_name; /**<\brief Source file name. Can be NULL. */
+
+    char* module_name; /**<\brief Module name. Can be NULL.
+                        *  The module name can be useful for distinguishing among
+                        *  different JIT engines. VTune Amplifier will display
+                        *  reported methods grouped by specific module. */
+
+    iJIT_CodeArchitecture module_arch; /**<\brief Architecture of the method's code region.
+                                        *  By default, it is the same as the process
+                                        *  architecture that is calling it.
+                                        *  For example, you can use it if your 32-bit JIT
+                                        *  engine generates 64-bit code.
+                                        *
+                                        *  If JIT engine reports both 32-bit and 64-bit types
+                                        *  of methods then VTune Amplifier splits the methods
+                                        *  with the same module name but with different
+                                        *  architectures in two different modules. VTune Amplifier
+                                        *  modifies the original name provided with a 64-bit method
+                                        *  version by ending it with '(64)' */
+
+} *piJIT_Method_Load_V3, iJIT_Method_Load_V3;
+
+/**
+ * @brief Description of an inline JIT-compiled method
+ * @details When you use the_iJIT_Method_Inline_Load structure to describe
+ *  the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED
+ *  as an event type to report it.
+ */
+typedef struct _iJIT_Method_Inline_Load
+{
+    unsigned int method_id; /**<\brief Unique method ID. Cannot be 0.
+                             *  You must either use the API function
+                             *  iJIT_GetNewMethodID to get a valid and unique
+                             *  method ID, or else manage ID uniqueness
+                             *  and correct range by yourself. */
+
+    unsigned int parent_method_id; /**<\brief Unique immediate parent's method ID.
+                                    *  Cannot be 0.
+                                    *  You must either use the API function
+                                    *  iJIT_GetNewMethodID to get a valid and unique
+                                    *  method ID, or else manage ID uniqueness
+                                    *  and correct range by yourself. */
+
+    char* method_name; /**<\brief The name of the method. It can be optionally
+                        *  prefixed with its class name and appended with
+                        *  its complete signature. Can't be NULL. */
+
+    void* method_load_address;  /** <\brief The virtual address on which the method
+                                 *  is inlined. If NULL, then data provided with
+                                 *  the event are not accepted. */
+
+    unsigned int method_size; /**<\brief The code size of the method in memory.
+                               *  If 0, then data provided with the event are not
+                               *  accepted. */
+
+    unsigned int line_number_size; /**<\brief The number of entries in the line number
+                                    *  table. 0 if none. */
+
+    pLineNumberInfo line_number_table; /**<\brief Pointer to the line numbers info
+                                        *  array. Can be NULL if
+                                        *  line_number_size is 0. See
+                                        *  LineNumberInfo Structure for a
+                                        *  description of a single entry in
+                                        *  the line number info array */
+
+    char* class_file_name; /**<\brief Class name. Can be NULL.*/
+
+    char* source_file_name; /**<\brief Source file name. Can be NULL.*/
+
+} *piJIT_Method_Inline_Load, iJIT_Method_Inline_Load;
+
+/** @cond exclude_from_documentation */
+/**
+ * @brief Description of a segment type
+ * @details Use the segment type to specify a type of data supplied
+ * with the iJVM_EVENT_TYPE_METHOD_UPDATE_V2 event to be applied to
+ * a certain code trace.
+ */
+typedef enum _iJIT_SegmentType
+{
+    iJIT_CT_UNKNOWN = 0,
+
+    iJIT_CT_CODE,           /**<\brief Executable code. */
+
+    iJIT_CT_DATA,           /**<\brief Data (not executable code).
+                             * VTune Amplifier uses the format string
+                             * (see iJIT_Method_Update) to represent
+                             * this data in the VTune Amplifier GUI */
+
+    iJIT_CT_KEEP,           /**<\brief Use the previous markup for the trace.
+                             * Can be used for the following
+                             * iJVM_EVENT_TYPE_METHOD_UPDATE_V2 events,
+                             * if the type of the previously reported segment
+                             * type is the same. */
+    iJIT_CT_EOF
+} iJIT_SegmentType;
+
+/**
+ * @brief Description of a dynamic update of the content within JIT-compiled method
+ * @details The JIT engine may generate the methods that are updated at runtime
+ * partially by mixed (data + executable code) content. When you use the iJIT_Method_Update
+ * structure to describe the update of the content within a JIT-compiled method,
+ * use iJVM_EVENT_TYPE_METHOD_UPDATE_V2 as an event type to report it.
+ *
+ * On the first Update event, VTune Amplifier copies the original code range reported by
+ * the iJVM_EVENT_TYPE_METHOD_LOAD event, then modifies it with the supplied bytes and
+ * adds the modified range to the original method. For next update events, VTune Amplifier
+ * does the same but it uses the latest modified version of a code region for update.
+ * Eventually, VTune Amplifier GUI displays multiple code ranges for the method reported by
+ * the iJVM_EVENT_TYPE_METHOD_LOAD event.
+ * Notes:
+ * - Multiple update events with different types for the same trace are allowed
+ *   but they must be reported for the same code ranges.
+ *   Example,
+ * @code
+ *                      [-- data---]        Allowed
+ *          [-- code --]                    Allowed
+ *        [code]                            Ignored
+ *                      [-- data---]        Allowed
+ *          [-- code --]                    Allowed
+ *      [------------ trace ---------]
+ * @endcode
+ * - The types of previously reported events can be changed but they must be reported
+ *   for the same code ranges.
+ *   Example,
+ * @code
+ *          [-- data---]                    Allowed
+ *          [-- code --]                    Allowed
+ *          [-- data---]                    Allowed
+ *          [-- code --]                    Allowed
+ *      [------------ trace ---------]
+ * @endcode
+ */
+
+typedef struct _iJIT_Method_Update
+{
+    void* load_address;         /**<\brief Start address of the update within a method */
+
+    unsigned int size;          /**<\brief The update size */
+
+    iJIT_SegmentType type;      /**<\brief Type of the update */
+
+    const char* data_format;    /**<\brief C string that contains a format string
+                                 * that follows the same specifications as format in printf.
+                                 * The format string is used for iJIT_CT_CODE only
+                                 * and cannot be NULL.
+                                 * Format can be changed on the fly. */
+} *piJIT_Method_Update, iJIT_Method_Update;
+
+/** @endcond */
+
+#pragma pack(pop)
+
+/** @cond exclude_from_documentation */
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifndef JITAPI_CDECL
+#  if defined WIN32 || defined _WIN32
+#    define JITAPI_CDECL __cdecl
+#  else /* defined WIN32 || defined _WIN32 */
+#    if defined _M_IX86 || defined __i386__
+#      define JITAPI_CDECL __attribute__ ((cdecl))
+#    else  /* _M_IX86 || __i386__ */
+#      define JITAPI_CDECL /* actual only on x86_64 platform */
+#    endif /* _M_IX86 || __i386__ */
+#  endif /* defined WIN32 || defined _WIN32 */
+#endif /* JITAPI_CDECL */
+
+#define JITAPI JITAPI_CDECL
+/** @endcond */
+
+/**
+ * @brief Generates a new unique method ID.
+ *
+ * You must use this API to obtain unique and valid method IDs for methods or
+ * traces reported to the agent if you don't have your own mechanism to generate
+ * unique method IDs.
+ *
+ * @return a new unique method ID. When out of unique method IDs, this API
+ * returns 0, which is not an accepted value.
+ */
+unsigned int JITAPI iJIT_GetNewMethodID(void);
+
+/**
+ * @brief Returns the current mode of the agent.
+ *
+ * @return iJIT_SAMPLING_ON, indicating that agent is running, or
+ * iJIT_NOTHING_RUNNING if no agent is running.
+ */
+iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive(void);
+
+/**
+ * @brief Reports infomation about JIT-compiled code to the agent.
+ *
+ * The reported information is used to attribute samples obtained from any
+ * Intel(R) VTune(TM) Amplifier collector. This API needs to be called
+ * after JIT compilation and before the first entry into the JIT-compiled
+ * code.
+ *
+ * @param[in] event_type - type of the data sent to the agent
+ * @param[in] EventSpecificData - pointer to event-specific data
+ * 
+ * @returns 1 on success, otherwise 0.
+ */
+int JITAPI iJIT_NotifyEvent(iJIT_JVM_EVENT event_type, void *EventSpecificData);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+/** @endcond */
+
+/** @} jitapi group */
+
+#endif /* __JITPROFILING_H__ */
diff --git a/deps/v8/third_party/ittapi/include/legacy/ittnotify.h b/deps/v8/third_party/ittapi/include/legacy/ittnotify.h
new file mode 100644
index 00000000000000..75ee4e4edcf8be
--- /dev/null
+++ b/deps/v8/third_party/ittapi/include/legacy/ittnotify.h
@@ -0,0 +1,992 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+#ifndef _LEGACY_ITTNOTIFY_H_
+#define _LEGACY_ITTNOTIFY_H_
+
+/**
+ * @file
+ * @brief Legacy User API functions and types
+ */
+
+/** @cond exclude_from_documentation */
+#ifndef ITT_OS_WIN
+#  define ITT_OS_WIN   1
+#endif /* ITT_OS_WIN */
+
+#ifndef ITT_OS_LINUX
+#  define ITT_OS_LINUX 2
+#endif /* ITT_OS_LINUX */
+
+#ifndef ITT_OS_MAC
+#  define ITT_OS_MAC   3
+#endif /* ITT_OS_MAC */
+
+#ifndef ITT_OS_FREEBSD
+#  define ITT_OS_FREEBSD   4
+#endif /* ITT_OS_FREEBSD */
+
+#ifndef ITT_OS
+#  if defined WIN32 || defined _WIN32
+#    define ITT_OS ITT_OS_WIN
+#  elif defined( __APPLE__ ) && defined( __MACH__ )
+#    define ITT_OS ITT_OS_MAC
+#  elif defined( __FreeBSD__ )
+#    define ITT_OS ITT_OS_FREEBSD
+#  else
+#    define ITT_OS ITT_OS_LINUX
+#  endif
+#endif /* ITT_OS */
+
+#ifndef ITT_PLATFORM_WIN
+#  define ITT_PLATFORM_WIN 1
+#endif /* ITT_PLATFORM_WIN */
+
+#ifndef ITT_PLATFORM_POSIX
+#  define ITT_PLATFORM_POSIX 2
+#endif /* ITT_PLATFORM_POSIX */
+
+#ifndef ITT_PLATFORM_MAC
+#  define ITT_PLATFORM_MAC 3
+#endif /* ITT_PLATFORM_MAC */
+
+#ifndef ITT_PLATFORM_FREEBSD
+#  define ITT_PLATFORM_FREEBSD 4
+#endif /* ITT_PLATFORM_FREEBSD */
+
+#ifndef ITT_PLATFORM
+#  if ITT_OS==ITT_OS_WIN
+#    define ITT_PLATFORM ITT_PLATFORM_WIN
+#  elif ITT_OS==ITT_OS_MAC
+#    define ITT_PLATFORM ITT_PLATFORM_MAC
+#  elif ITT_OS==ITT_OS_FREEBSD
+#    define ITT_PLATFORM ITT_PLATFORM_FREEBSD
+#  else
+#    define ITT_PLATFORM ITT_PLATFORM_POSIX
+#  endif
+#endif /* ITT_PLATFORM */
+
+#if defined(_UNICODE) && !defined(UNICODE)
+#define UNICODE
+#endif
+
+#include <stddef.h>
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#include <tchar.h>
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#include <stdint.h>
+#if defined(UNICODE) || defined(_UNICODE)
+#include <wchar.h>
+#endif /* UNICODE || _UNICODE */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#ifndef ITTAPI_CDECL
+#  if ITT_PLATFORM==ITT_PLATFORM_WIN
+#    define ITTAPI_CDECL __cdecl
+#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#    if defined _M_IX86 || defined __i386__
+#      define ITTAPI_CDECL __attribute__ ((cdecl))
+#    else  /* _M_IX86 || __i386__ */
+#      define ITTAPI_CDECL /* actual only on x86 platform */
+#    endif /* _M_IX86 || __i386__ */
+#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* ITTAPI_CDECL */
+
+#ifndef STDCALL
+#  if ITT_PLATFORM==ITT_PLATFORM_WIN
+#    define STDCALL __stdcall
+#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#    if defined _M_IX86 || defined __i386__
+#      define STDCALL __attribute__ ((stdcall))
+#    else  /* _M_IX86 || __i386__ */
+#      define STDCALL /* supported only on x86 platform */
+#    endif /* _M_IX86 || __i386__ */
+#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* STDCALL */
+
+#define ITTAPI    ITTAPI_CDECL
+#define LIBITTAPI ITTAPI_CDECL
+
+/* TODO: Temporary for compatibility! */
+#define ITTAPI_CALL    ITTAPI_CDECL
+#define LIBITTAPI_CALL ITTAPI_CDECL
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+/* use __forceinline (VC++ specific) */
+#if defined(__MINGW32__) && !defined(__cplusplus)
+#define ITT_INLINE           static __inline__ __attribute__((__always_inline__,__gnu_inline__))
+#else
+#define ITT_INLINE           static __forceinline
+#endif /* __MINGW32__ */
+
+#define ITT_INLINE_ATTRIBUTE /* nothing */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+/*
+ * Generally, functions are not inlined unless optimization is specified.
+ * For functions declared inline, this attribute inlines the function even
+ * if no optimization level was specified.
+ */
+#ifdef __STRICT_ANSI__
+#define ITT_INLINE           static
+#define ITT_INLINE_ATTRIBUTE __attribute__((unused))
+#else  /* __STRICT_ANSI__ */
+#define ITT_INLINE           static inline
+#define ITT_INLINE_ATTRIBUTE __attribute__((always_inline, unused))
+#endif /* __STRICT_ANSI__ */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+/** @endcond */
+
+/** @cond exclude_from_documentation */
+/* Helper macro for joining tokens */
+#define ITT_JOIN_AUX(p,n) p##n
+#define ITT_JOIN(p,n)     ITT_JOIN_AUX(p,n)
+
+#ifdef ITT_MAJOR
+#undef ITT_MAJOR
+#endif
+#ifdef ITT_MINOR
+#undef ITT_MINOR
+#endif
+#define ITT_MAJOR     3
+#define ITT_MINOR     0
+
+/* Standard versioning of a token with major and minor version numbers */
+#define ITT_VERSIONIZE(x)    \
+    ITT_JOIN(x,              \
+    ITT_JOIN(_,              \
+    ITT_JOIN(ITT_MAJOR,      \
+    ITT_JOIN(_, ITT_MINOR))))
+
+#ifndef INTEL_ITTNOTIFY_PREFIX
+#  define INTEL_ITTNOTIFY_PREFIX __itt_
+#endif /* INTEL_ITTNOTIFY_PREFIX */
+#ifndef INTEL_ITTNOTIFY_POSTFIX
+#  define INTEL_ITTNOTIFY_POSTFIX _ptr_
+#endif /* INTEL_ITTNOTIFY_POSTFIX */
+
+#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
+#define ITTNOTIFY_NAME(n)     ITT_VERSIONIZE(ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX)))
+
+#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)
+#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)
+
+#define ITTNOTIFY_VOID_D0(n,d)       (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d)
+#define ITTNOTIFY_VOID_D1(n,d,x)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x)
+#define ITTNOTIFY_VOID_D2(n,d,x,y)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y)
+#define ITTNOTIFY_VOID_D3(n,d,x,y,z) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z)
+#define ITTNOTIFY_VOID_D4(n,d,x,y,z,a)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)
+#define ITTNOTIFY_VOID_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)
+#define ITTNOTIFY_VOID_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)
+#define ITTNOTIFY_DATA_D0(n,d)       (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d)
+#define ITTNOTIFY_DATA_D1(n,d,x)     (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x)
+#define ITTNOTIFY_DATA_D2(n,d,x,y)   (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y)
+#define ITTNOTIFY_DATA_D3(n,d,x,y,z) (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z)
+#define ITTNOTIFY_DATA_D4(n,d,x,y,z,a)     (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)
+#define ITTNOTIFY_DATA_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)
+#define ITTNOTIFY_DATA_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)
+
+#ifdef ITT_STUB
+#undef ITT_STUB
+#endif
+#ifdef ITT_STUBV
+#undef ITT_STUBV
+#endif
+#define ITT_STUBV(api,type,name,args)                             \
+    typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args;   \
+    extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);
+#define ITT_STUB ITT_STUBV
+/** @endcond */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup legacy Legacy API
+ * @{
+ * @}
+ */
+
+/**
+ * @defgroup legacy_control Collection Control
+ * @ingroup legacy
+ * General behavior: application continues to run, but no profiling information is being collected
+ *
+ * Pausing occurs not only for the current thread but for all process as well as spawned processes
+ * - Intel(R) Parallel Inspector and Intel(R) Inspector XE:
+ *   - Does not analyze or report errors that involve memory access.
+ *   - Other errors are reported as usual. Pausing data collection in
+ *     Intel(R) Parallel Inspector and Intel(R) Inspector XE
+ *     only pauses tracing and analyzing memory access.
+ *     It does not pause tracing or analyzing threading APIs.
+ *   .
+ * - Intel(R) Parallel Amplifier and Intel(R) VTune(TM) Amplifier XE:
+ *   - Does continue to record when new threads are started.
+ *   .
+ * - Other effects:
+ *   - Possible reduction of runtime overhead.
+ *   .
+ * @{
+ */
+#ifndef _ITTNOTIFY_H_
+/** @brief Pause collection */
+void ITTAPI __itt_pause(void);
+/** @brief Resume collection */
+void ITTAPI __itt_resume(void);
+/** @brief Detach collection */
+void ITTAPI __itt_detach(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, pause,   (void))
+ITT_STUBV(ITTAPI, void, resume,  (void))
+ITT_STUBV(ITTAPI, void, detach,  (void))
+#define __itt_pause      ITTNOTIFY_VOID(pause)
+#define __itt_pause_ptr  ITTNOTIFY_NAME(pause)
+#define __itt_resume     ITTNOTIFY_VOID(resume)
+#define __itt_resume_ptr ITTNOTIFY_NAME(resume)
+#define __itt_detach     ITTNOTIFY_VOID(detach)
+#define __itt_detach_ptr ITTNOTIFY_NAME(detach)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_pause()
+#define __itt_pause_ptr  0
+#define __itt_resume()
+#define __itt_resume_ptr 0
+#define __itt_detach()
+#define __itt_detach_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_pause_ptr  0
+#define __itt_resume_ptr 0
+#define __itt_detach_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+#endif /* _ITTNOTIFY_H_ */
+/** @} legacy_control group */
+
+/**
+ * @defgroup legacy_threads Threads
+ * @ingroup legacy
+ * Threads group
+ * @warning Legacy API
+ * @{
+ */
+/**
+ * @deprecated Legacy API
+ * @brief Set name to be associated with thread in analysis GUI.
+ * @return __itt_err upon failure (name or namelen being null,name and namelen mismatched)
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int LIBITTAPI __itt_thr_name_setA(const char    *name, int namelen);
+int LIBITTAPI __itt_thr_name_setW(const wchar_t *name, int namelen);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_thr_name_set     __itt_thr_name_setW
+#  define __itt_thr_name_set_ptr __itt_thr_name_setW_ptr
+#else
+#  define __itt_thr_name_set     __itt_thr_name_setA
+#  define __itt_thr_name_set_ptr __itt_thr_name_setA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int LIBITTAPI __itt_thr_name_set(const char *name, int namelen);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, int, thr_name_setA, (const char    *name, int namelen))
+ITT_STUB(LIBITTAPI, int, thr_name_setW, (const wchar_t *name, int namelen))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int, thr_name_set,  (const char    *name, int namelen))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thr_name_setA     ITTNOTIFY_DATA(thr_name_setA)
+#define __itt_thr_name_setA_ptr ITTNOTIFY_NAME(thr_name_setA)
+#define __itt_thr_name_setW     ITTNOTIFY_DATA(thr_name_setW)
+#define __itt_thr_name_setW_ptr ITTNOTIFY_NAME(thr_name_setW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thr_name_set     ITTNOTIFY_DATA(thr_name_set)
+#define __itt_thr_name_set_ptr ITTNOTIFY_NAME(thr_name_set)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thr_name_setA(name, namelen)
+#define __itt_thr_name_setA_ptr 0
+#define __itt_thr_name_setW(name, namelen)
+#define __itt_thr_name_setW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thr_name_set(name, namelen)
+#define __itt_thr_name_set_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_thr_name_setA_ptr 0
+#define __itt_thr_name_setW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_thr_name_set_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Mark current thread as ignored from this point on, for the duration of its existence.
+ */
+void LIBITTAPI __itt_thr_ignore(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, thr_ignore, (void))
+#define __itt_thr_ignore     ITTNOTIFY_VOID(thr_ignore)
+#define __itt_thr_ignore_ptr ITTNOTIFY_NAME(thr_ignore)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_thr_ignore()
+#define __itt_thr_ignore_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_thr_ignore_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_threads group */
+
+/**
+ * @defgroup legacy_sync Synchronization
+ * @ingroup legacy
+ * Synchronization group
+ * @warning Legacy API
+ * @{
+ */
+/**
+ * @hideinitializer
+ * @brief possible value of attribute argument for sync object type
+ */
+#define __itt_attr_barrier 1
+
+/**
+ * @hideinitializer
+ * @brief possible value of attribute argument for sync object type
+ */
+#define __itt_attr_mutex   2
+
+/**
+ * @deprecated Legacy API
+ * @brief Assign a name to a sync object using char or Unicode string
+ * @param[in] addr    - pointer to the sync object. You should use a real pointer to your object
+ *                      to make sure that the values don't clash with other object addresses
+ * @param[in] objtype - null-terminated object type string. If NULL is passed, the object will
+ *                      be assumed to be of generic "User Synchronization" type
+ * @param[in] objname - null-terminated object name string. If NULL, no name will be assigned
+ *                      to the object -- you can use the __itt_sync_rename call later to assign
+ *                      the name
+ * @param[in] attribute - one of [#__itt_attr_barrier, #__itt_attr_mutex] values which defines the
+ *                      exact semantics of how prepare/acquired/releasing calls work.
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+void ITTAPI __itt_sync_set_nameA(void *addr, const char    *objtype, const char    *objname, int attribute);
+void ITTAPI __itt_sync_set_nameW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_sync_set_name     __itt_sync_set_nameW
+#  define __itt_sync_set_name_ptr __itt_sync_set_nameW_ptr
+#else /* UNICODE */
+#  define __itt_sync_set_name     __itt_sync_set_nameA
+#  define __itt_sync_set_name_ptr __itt_sync_set_nameA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+void ITTAPI __itt_sync_set_name(void *addr, const char* objtype, const char* objname, int attribute);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, sync_set_nameA, (void *addr, const char    *objtype, const char    *objname, int attribute))
+ITT_STUBV(ITTAPI, void, sync_set_nameW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_set_name,  (void *addr, const char    *objtype, const char    *objname, int attribute))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_set_nameA     ITTNOTIFY_VOID(sync_set_nameA)
+#define __itt_sync_set_nameA_ptr ITTNOTIFY_NAME(sync_set_nameA)
+#define __itt_sync_set_nameW     ITTNOTIFY_VOID(sync_set_nameW)
+#define __itt_sync_set_nameW_ptr ITTNOTIFY_NAME(sync_set_nameW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_set_name     ITTNOTIFY_VOID(sync_set_name)
+#define __itt_sync_set_name_ptr ITTNOTIFY_NAME(sync_set_name)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_set_nameA(addr, objtype, objname, attribute)
+#define __itt_sync_set_nameA_ptr 0
+#define __itt_sync_set_nameW(addr, objtype, objname, attribute)
+#define __itt_sync_set_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_set_name(addr, objtype, objname, attribute)
+#define __itt_sync_set_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_sync_set_nameA_ptr 0
+#define __itt_sync_set_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_sync_set_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Assign a name and type to a sync object using char or Unicode string
+ * @param[in] addr -      pointer to the sync object. You should use a real pointer to your object
+ *                        to make sure that the values don't clash with other object addresses
+ * @param[in] objtype -   null-terminated object type string. If NULL is passed, the object will
+ *                        be assumed to be of generic "User Synchronization" type
+ * @param[in] objname -   null-terminated object name string. If NULL, no name will be assigned
+ *                        to the object -- you can use the __itt_sync_rename call later to assign
+ *                        the name
+ * @param[in] typelen, namelen -   a length of string for appropriate objtype and objname parameter
+ * @param[in] attribute - one of [#__itt_attr_barrier, #__itt_attr_mutex] values which defines the
+ *                        exact semantics of how prepare/acquired/releasing calls work.
+ * @return __itt_err upon failure (name or namelen being null,name and namelen mismatched)
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+int LIBITTAPI __itt_notify_sync_nameA(void *addr, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute);
+int LIBITTAPI __itt_notify_sync_nameW(void *addr, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_notify_sync_name __itt_notify_sync_nameW
+#else
+#  define __itt_notify_sync_name __itt_notify_sync_nameA
+#endif
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+int LIBITTAPI __itt_notify_sync_name(void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, int, notify_sync_nameA, (void *addr, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute))
+ITT_STUB(LIBITTAPI, int, notify_sync_nameW, (void *addr, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int, notify_sync_name,  (void *addr, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_notify_sync_nameA     ITTNOTIFY_DATA(notify_sync_nameA)
+#define __itt_notify_sync_nameA_ptr ITTNOTIFY_NAME(notify_sync_nameA)
+#define __itt_notify_sync_nameW     ITTNOTIFY_DATA(notify_sync_nameW)
+#define __itt_notify_sync_nameW_ptr ITTNOTIFY_NAME(notify_sync_nameW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_notify_sync_name     ITTNOTIFY_DATA(notify_sync_name)
+#define __itt_notify_sync_name_ptr ITTNOTIFY_NAME(notify_sync_name)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_notify_sync_nameA(addr, objtype, typelen, objname, namelen, attribute)
+#define __itt_notify_sync_nameA_ptr 0
+#define __itt_notify_sync_nameW(addr, objtype, typelen, objname, namelen, attribute)
+#define __itt_notify_sync_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_notify_sync_name(addr, objtype, typelen, objname, namelen, attribute)
+#define __itt_notify_sync_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_notify_sync_nameA_ptr 0
+#define __itt_notify_sync_nameW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_notify_sync_name_ptr 0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Enter spin loop on user-defined sync object
+ */
+void LIBITTAPI __itt_notify_sync_prepare(void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, notify_sync_prepare, (void *addr))
+#define __itt_notify_sync_prepare     ITTNOTIFY_VOID(notify_sync_prepare)
+#define __itt_notify_sync_prepare_ptr ITTNOTIFY_NAME(notify_sync_prepare)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_notify_sync_prepare(addr)
+#define __itt_notify_sync_prepare_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_notify_sync_prepare_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Quit spin loop without acquiring spin object
+ */
+void LIBITTAPI __itt_notify_sync_cancel(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, notify_sync_cancel, (void *addr))
+#define __itt_notify_sync_cancel     ITTNOTIFY_VOID(notify_sync_cancel)
+#define __itt_notify_sync_cancel_ptr ITTNOTIFY_NAME(notify_sync_cancel)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_notify_sync_cancel(addr)
+#define __itt_notify_sync_cancel_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_notify_sync_cancel_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Successful spin loop completion (sync object acquired)
+ */
+void LIBITTAPI __itt_notify_sync_acquired(void *addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, notify_sync_acquired, (void *addr))
+#define __itt_notify_sync_acquired     ITTNOTIFY_VOID(notify_sync_acquired)
+#define __itt_notify_sync_acquired_ptr ITTNOTIFY_NAME(notify_sync_acquired)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_notify_sync_acquired(addr)
+#define __itt_notify_sync_acquired_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_notify_sync_acquired_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Start sync object releasing code. Is called before the lock release call.
+ */
+void LIBITTAPI __itt_notify_sync_releasing(void* addr);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, notify_sync_releasing, (void *addr))
+#define __itt_notify_sync_releasing     ITTNOTIFY_VOID(notify_sync_releasing)
+#define __itt_notify_sync_releasing_ptr ITTNOTIFY_NAME(notify_sync_releasing)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_notify_sync_releasing(addr)
+#define __itt_notify_sync_releasing_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_notify_sync_releasing_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_sync group */
+
+#ifndef _ITTNOTIFY_H_
+/**
+ * @defgroup legacy_events Events
+ * @ingroup legacy
+ * Events group
+ * @{
+ */
+
+/** @brief user event type */
+typedef int __itt_event;
+
+/**
+ * @brief Create an event notification
+ * @note name or namelen being null/name and namelen not matching, user event feature not enabled
+ * @return non-zero event identifier upon success and __itt_err otherwise
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_event LIBITTAPI __itt_event_createA(const char    *name, int namelen);
+__itt_event LIBITTAPI __itt_event_createW(const wchar_t *name, int namelen);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_event_create     __itt_event_createW
+#  define __itt_event_create_ptr __itt_event_createW_ptr
+#else
+#  define __itt_event_create     __itt_event_createA
+#  define __itt_event_create_ptr __itt_event_createA_ptr
+#endif /* UNICODE */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_event LIBITTAPI __itt_event_create(const char *name, int namelen);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char    *name, int namelen))
+ITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, __itt_event, event_create,  (const char *name, int namelen))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA     ITTNOTIFY_DATA(event_createA)
+#define __itt_event_createA_ptr ITTNOTIFY_NAME(event_createA)
+#define __itt_event_createW     ITTNOTIFY_DATA(event_createW)
+#define __itt_event_createW_ptr ITTNOTIFY_NAME(event_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create      ITTNOTIFY_DATA(event_create)
+#define __itt_event_create_ptr  ITTNOTIFY_NAME(event_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA(name, namelen) (__itt_event)0
+#define __itt_event_createA_ptr 0
+#define __itt_event_createW(name, namelen) (__itt_event)0
+#define __itt_event_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create(name, namelen)  (__itt_event)0
+#define __itt_event_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_event_createA_ptr 0
+#define __itt_event_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_event_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record an event occurrence.
+ * @return __itt_err upon failure (invalid event id/user event feature not enabled)
+ */
+int LIBITTAPI __itt_event_start(__itt_event event);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(LIBITTAPI, int, event_start, (__itt_event event))
+#define __itt_event_start     ITTNOTIFY_DATA(event_start)
+#define __itt_event_start_ptr ITTNOTIFY_NAME(event_start)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_event_start(event) (int)0
+#define __itt_event_start_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_event_start_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @brief Record an event end occurrence.
+ * @note It is optional if events do not have durations.
+ * @return __itt_err upon failure (invalid event id/user event feature not enabled)
+ */
+int LIBITTAPI __itt_event_end(__itt_event event);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event))
+#define __itt_event_end     ITTNOTIFY_DATA(event_end)
+#define __itt_event_end_ptr ITTNOTIFY_NAME(event_end)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_event_end(event) (int)0
+#define __itt_event_end_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_event_end_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_events group */
+#endif /* _ITTNOTIFY_H_ */
+
+/**
+ * @defgroup legacy_memory Memory Accesses
+ * @ingroup legacy
+ */
+
+/**
+ * @deprecated Legacy API
+ * @brief Inform the tool of memory accesses on reading
+ */
+void LIBITTAPI __itt_memory_read(void *addr, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, memory_read, (void *addr, size_t size))
+#define __itt_memory_read     ITTNOTIFY_VOID(memory_read)
+#define __itt_memory_read_ptr ITTNOTIFY_NAME(memory_read)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_memory_read(addr, size)
+#define __itt_memory_read_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_memory_read_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Inform the tool of memory accesses on writing
+ */
+void LIBITTAPI __itt_memory_write(void *addr, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, memory_write, (void *addr, size_t size))
+#define __itt_memory_write     ITTNOTIFY_VOID(memory_write)
+#define __itt_memory_write_ptr ITTNOTIFY_NAME(memory_write)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_memory_write(addr, size)
+#define __itt_memory_write_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_memory_write_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief Inform the tool of memory accesses on updating
+ */
+void LIBITTAPI __itt_memory_update(void *address, size_t size);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(LIBITTAPI, void, memory_update, (void *addr, size_t size))
+#define __itt_memory_update     ITTNOTIFY_VOID(memory_update)
+#define __itt_memory_update_ptr ITTNOTIFY_NAME(memory_update)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_memory_update(addr, size)
+#define __itt_memory_update_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_memory_update_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_memory group */
+
+/**
+ * @defgroup legacy_state Thread and Object States
+ * @ingroup legacy
+ */
+
+/** @brief state type */
+typedef int __itt_state_t;
+
+/** @cond exclude_from_documentation */
+typedef enum __itt_obj_state {
+    __itt_obj_state_err = 0,
+    __itt_obj_state_clr = 1,
+    __itt_obj_state_set = 2,
+    __itt_obj_state_use = 3
+} __itt_obj_state_t;
+
+typedef enum __itt_thr_state {
+    __itt_thr_state_err = 0,
+    __itt_thr_state_clr = 1,
+    __itt_thr_state_set = 2
+} __itt_thr_state_t;
+
+typedef enum __itt_obj_prop {
+    __itt_obj_prop_watch    = 1,
+    __itt_obj_prop_ignore   = 2,
+    __itt_obj_prop_sharable = 3
+} __itt_obj_prop_t;
+
+typedef enum __itt_thr_prop {
+    __itt_thr_prop_quiet = 1
+} __itt_thr_prop_t;
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief managing thread and object states
+ */
+__itt_state_t LIBITTAPI __itt_state_get(void);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_state_t, state_get, (void))
+#define __itt_state_get     ITTNOTIFY_DATA(state_get)
+#define __itt_state_get_ptr ITTNOTIFY_NAME(state_get)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_state_get(void) (__itt_state_t)0
+#define __itt_state_get_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_state_get_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief managing thread and object states
+ */
+__itt_state_t LIBITTAPI __itt_state_set(__itt_state_t s);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_state_t, state_set, (__itt_state_t s))
+#define __itt_state_set     ITTNOTIFY_DATA(state_set)
+#define __itt_state_set_ptr ITTNOTIFY_NAME(state_set)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_state_set(s) (__itt_state_t)0
+#define __itt_state_set_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_state_set_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief managing thread and object modes
+ */
+__itt_thr_state_t LIBITTAPI __itt_thr_mode_set(__itt_thr_prop_t p, __itt_thr_state_t s);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t p, __itt_thr_state_t s))
+#define __itt_thr_mode_set     ITTNOTIFY_DATA(thr_mode_set)
+#define __itt_thr_mode_set_ptr ITTNOTIFY_NAME(thr_mode_set)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_thr_mode_set(p, s) (__itt_thr_state_t)0
+#define __itt_thr_mode_set_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_thr_mode_set_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/**
+ * @deprecated Legacy API
+ * @brief managing thread and object modes
+ */
+__itt_obj_state_t LIBITTAPI __itt_obj_mode_set(__itt_obj_prop_t p, __itt_obj_state_t s);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUB(ITTAPI, __itt_obj_state_t, obj_mode_set, (__itt_obj_prop_t p, __itt_obj_state_t s))
+#define __itt_obj_mode_set     ITTNOTIFY_DATA(obj_mode_set)
+#define __itt_obj_mode_set_ptr ITTNOTIFY_NAME(obj_mode_set)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_obj_mode_set(p, s) (__itt_obj_state_t)0
+#define __itt_obj_mode_set_ptr 0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_obj_mode_set_ptr 0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} legacy_state group */
+
+/**
+ * @defgroup frames Frames
+ * @ingroup legacy
+ * Frames group
+ * @{
+ */
+/**
+ * @brief opaque structure for frame identification
+ */
+typedef struct __itt_frame_t *__itt_frame;
+
+/**
+ * @brief Create a global frame with given domain
+ */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+__itt_frame ITTAPI __itt_frame_createA(const char    *domain);
+__itt_frame ITTAPI __itt_frame_createW(const wchar_t *domain);
+#if defined(UNICODE) || defined(_UNICODE)
+#  define __itt_frame_create     __itt_frame_createW
+#  define __itt_frame_create_ptr __itt_frame_createW_ptr
+#else /* UNICODE */
+#  define __itt_frame_create     __itt_frame_createA
+#  define __itt_frame_create_ptr __itt_frame_createA_ptr
+#endif /* UNICODE */
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+__itt_frame ITTAPI __itt_frame_create(const char *domain);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_frame, frame_createA, (const char    *domain))
+ITT_STUB(ITTAPI, __itt_frame, frame_createW, (const wchar_t *domain))
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_frame, frame_create,  (const char *domain))
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_frame_createA     ITTNOTIFY_DATA(frame_createA)
+#define __itt_frame_createA_ptr ITTNOTIFY_NAME(frame_createA)
+#define __itt_frame_createW     ITTNOTIFY_DATA(frame_createW)
+#define __itt_frame_createW_ptr ITTNOTIFY_NAME(frame_createW)
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_frame_create     ITTNOTIFY_DATA(frame_create)
+#define __itt_frame_create_ptr ITTNOTIFY_NAME(frame_create)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_frame_createA(domain)
+#define __itt_frame_createA_ptr 0
+#define __itt_frame_createW(domain)
+#define __itt_frame_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_frame_create(domain)
+#define __itt_frame_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_frame_createA_ptr 0
+#define __itt_frame_createW_ptr 0
+#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#define __itt_frame_create_ptr  0
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+
+/** @brief Record a frame begin occurrence. */
+void ITTAPI __itt_frame_begin(__itt_frame frame);
+/** @brief Record a frame end occurrence. */
+void ITTAPI __itt_frame_end  (__itt_frame frame);
+
+/** @cond exclude_from_documentation */
+#ifndef INTEL_NO_MACRO_BODY
+#ifndef INTEL_NO_ITTNOTIFY_API
+ITT_STUBV(ITTAPI, void, frame_begin, (__itt_frame frame))
+ITT_STUBV(ITTAPI, void, frame_end,   (__itt_frame frame))
+#define __itt_frame_begin     ITTNOTIFY_VOID(frame_begin)
+#define __itt_frame_begin_ptr ITTNOTIFY_NAME(frame_begin)
+#define __itt_frame_end       ITTNOTIFY_VOID(frame_end)
+#define __itt_frame_end_ptr   ITTNOTIFY_NAME(frame_end)
+#else  /* INTEL_NO_ITTNOTIFY_API */
+#define __itt_frame_begin(frame)
+#define __itt_frame_begin_ptr 0
+#define __itt_frame_end(frame)
+#define __itt_frame_end_ptr   0
+#endif /* INTEL_NO_ITTNOTIFY_API */
+#else  /* INTEL_NO_MACRO_BODY */
+#define __itt_frame_begin_ptr 0
+#define __itt_frame_end_ptr   0
+#endif /* INTEL_NO_MACRO_BODY */
+/** @endcond */
+/** @} frames group */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _LEGACY_ITTNOTIFY_H_ */
diff --git a/deps/v8/third_party/ittapi/include/libittnotify.h b/deps/v8/third_party/ittapi/include/libittnotify.h
new file mode 100644
index 00000000000000..107949aa7668d3
--- /dev/null
+++ b/deps/v8/third_party/ittapi/include/libittnotify.h
@@ -0,0 +1,19 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+
+#ifndef _LIBITTNOTIFY_H_
+#define _LIBITTNOTIFY_H_
+
+#ifndef __ITT_INTERNAL_INCLUDE
+#  if defined WIN32 || defined _WIN32
+#    pragma message("WARNING!!! Include file libittnotify.h is deprecated and should not be included anymore")
+#  else /* WIN32 */
+#    warning "Include file libittnotify.h is deprecated and should not be included anymore"
+#  endif /* WIN32 */
+#endif /* __ITT_INTERNAL_INCLUDE */
+#include "legacy/ittnotify.h"
+
+#endif /* _LIBITTNOTIFY_H_ */
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/.gitignore b/deps/v8/third_party/ittapi/ittapi-rs/.gitignore
new file mode 100644
index 00000000000000..693699042b1a8c
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/.gitignore
@@ -0,0 +1,3 @@
+/target
+**/*.rs.bk
+Cargo.lock
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/CMakeLists.txt b/deps/v8/third_party/ittapi/ittapi-rs/CMakeLists.txt
new file mode 120000
index 00000000000000..de0cf227139ff6
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/CMakeLists.txt
@@ -0,0 +1 @@
+../CMakeLists.txt
\ No newline at end of file
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/Cargo.toml b/deps/v8/third_party/ittapi/ittapi-rs/Cargo.toml
new file mode 100644
index 00000000000000..b85ab97b22135a
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/Cargo.toml
@@ -0,0 +1,22 @@
+[package]
+name = "ittapi-rs"
+version = "0.1.5"
+authors = ["Johnnie Birch <45402135+jlb6740@users.noreply.github.com>"]
+edition = "2018"
+description = "Rust bindings for ittapi"
+license-file = "LICENSES/"
+documentation  = "https://docs.rs/ittapi-rs"
+homepage  = "https://github.com/intel/ittapi/ittapi-rs"
+repository = "https://github.com/intel/ittapi"
+
+[dependencies]
+
+[features]
+force_32 = []
+
+[build-dependencies]
+cmake = "0.1.42"
+
+[dev-dependencies]
+bindgen = "0.52.0"
+diff = "0.1"
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/LICENSES b/deps/v8/third_party/ittapi/ittapi-rs/LICENSES
new file mode 120000
index 00000000000000..a274e110699818
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/LICENSES
@@ -0,0 +1 @@
+../LICENSES/
\ No newline at end of file
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/README.md b/deps/v8/third_party/ittapi/ittapi-rs/README.md
new file mode 100644
index 00000000000000..69340620786847
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/README.md
@@ -0,0 +1,14 @@
+# ittapi-rs
+This package creates Rust bindings for ittapi. Ittapi is used for instrumentation and tracking and just-in-time profiling.
+
+Note the building of this package is currently only supported (tested) on a couple of Linux platforms (recent Ubuntu and Fedora builds) but support for other platforms is intended and contributions are welcomed.
+
+# Build the package
+cargo build
+
+** Note This package uses bindgen which in turn requires recent versions of cmake and llvm to be installed. For Fedora, "yum install llvm-devel" was needed to bring in llvm-config.
+
+** Also note building this package requires rust nightly.
+
+# Publish the package to crates.io
+cargo publish
\ No newline at end of file
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/build.rs b/deps/v8/third_party/ittapi/ittapi-rs/build.rs
new file mode 100644
index 00000000000000..549afe2ec108f2
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/build.rs
@@ -0,0 +1,37 @@
+#![allow(unused)]
+use cmake::Config;
+use std::env;
+use std::path::PathBuf;
+
+#[cfg(target_os = "windows")]
+fn main() {}
+
+#[cfg(not(target_os = "windows"))]
+fn main() {
+    let out_dir = env::var("OUT_DIR").unwrap();
+    let out_path = PathBuf::from(out_dir);
+
+    #[cfg(not(feature = "force_32"))]
+    {
+        let _ittnotify_64 = Config::new("./")
+            .generator("Unix Makefiles")
+            .no_build_target(true)
+            .build();
+
+        println!("cargo:rustc-link-search={}/build/bin/", out_path.display());
+        println!("cargo:rustc-link-lib=static=ittnotify");
+    }
+
+    #[cfg(feature = "force_32")]
+    #[cfg(not(any(target_os = "ios", target_os = "macos")))]
+    {
+        let _ittnotify_32 = Config::new("./")
+            .generator("Unix Makefiles")
+            .define("FORCE_32", "ON")
+            .no_build_target(true)
+            .build();
+
+        println!("cargo:rustc-link-search={}/build/bin/", out_path.display());
+        println!("cargo:rustc-link-lib=static=ittnotify32");
+    }
+}
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/include b/deps/v8/third_party/ittapi/ittapi-rs/include
new file mode 120000
index 00000000000000..3a1af68fd1cdb6
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/include
@@ -0,0 +1 @@
+../include/
\ No newline at end of file
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/src/ittnotify b/deps/v8/third_party/ittapi/ittapi-rs/src/ittnotify
new file mode 120000
index 00000000000000..4859c0fe8132b0
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/src/ittnotify
@@ -0,0 +1 @@
+../../src/ittnotify
\ No newline at end of file
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/src/ittnotify_bindings.rs b/deps/v8/third_party/ittapi/ittapi-rs/src/ittnotify_bindings.rs
new file mode 100644
index 00000000000000..a5b45f4b30e32e
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/src/ittnotify_bindings.rs
@@ -0,0 +1,2987 @@
+/* automatically generated by rust-bindgen */
+
+pub const ITT_OS_WIN: u32 = 1;
+pub const ITT_OS_LINUX: u32 = 2;
+pub const ITT_OS_MAC: u32 = 3;
+pub const ITT_OS_FREEBSD: u32 = 4;
+pub const ITT_OS: u32 = 2;
+pub const ITT_PLATFORM_WIN: u32 = 1;
+pub const ITT_PLATFORM_POSIX: u32 = 2;
+pub const ITT_PLATFORM_MAC: u32 = 3;
+pub const ITT_PLATFORM_FREEBSD: u32 = 4;
+pub const ITT_PLATFORM: u32 = 2;
+pub const _STDINT_H: u32 = 1;
+pub const _FEATURES_H: u32 = 1;
+pub const _DEFAULT_SOURCE: u32 = 1;
+pub const __USE_ISOC11: u32 = 1;
+pub const __USE_ISOC99: u32 = 1;
+pub const __USE_ISOC95: u32 = 1;
+pub const __USE_POSIX_IMPLICITLY: u32 = 1;
+pub const _POSIX_SOURCE: u32 = 1;
+pub const _POSIX_C_SOURCE: u32 = 200809;
+pub const __USE_POSIX: u32 = 1;
+pub const __USE_POSIX2: u32 = 1;
+pub const __USE_POSIX199309: u32 = 1;
+pub const __USE_POSIX199506: u32 = 1;
+pub const __USE_XOPEN2K: u32 = 1;
+pub const __USE_XOPEN2K8: u32 = 1;
+pub const _ATFILE_SOURCE: u32 = 1;
+pub const __USE_MISC: u32 = 1;
+pub const __USE_ATFILE: u32 = 1;
+pub const __USE_FORTIFY_LEVEL: u32 = 0;
+pub const __GLIBC_USE_DEPRECATED_GETS: u32 = 0;
+pub const _STDC_PREDEF_H: u32 = 1;
+pub const __STDC_IEC_559__: u32 = 1;
+pub const __STDC_IEC_559_COMPLEX__: u32 = 1;
+pub const __STDC_ISO_10646__: u32 = 201706;
+pub const __STDC_NO_THREADS__: u32 = 1;
+pub const __GNU_LIBRARY__: u32 = 6;
+pub const __GLIBC__: u32 = 2;
+pub const __GLIBC_MINOR__: u32 = 27;
+pub const _SYS_CDEFS_H: u32 = 1;
+pub const __glibc_c99_flexarr_available: u32 = 1;
+pub const __WORDSIZE: u32 = 64;
+pub const __WORDSIZE_TIME64_COMPAT32: u32 = 1;
+pub const __SYSCALL_WORDSIZE: u32 = 64;
+pub const __HAVE_GENERIC_SELECTION: u32 = 1;
+pub const __GLIBC_USE_LIB_EXT2: u32 = 0;
+pub const __GLIBC_USE_IEC_60559_BFP_EXT: u32 = 0;
+pub const __GLIBC_USE_IEC_60559_FUNCS_EXT: u32 = 0;
+pub const __GLIBC_USE_IEC_60559_TYPES_EXT: u32 = 0;
+pub const _BITS_TYPES_H: u32 = 1;
+pub const _BITS_TYPESIZES_H: u32 = 1;
+pub const __OFF_T_MATCHES_OFF64_T: u32 = 1;
+pub const __INO_T_MATCHES_INO64_T: u32 = 1;
+pub const __RLIM_T_MATCHES_RLIM64_T: u32 = 1;
+pub const __FD_SETSIZE: u32 = 1024;
+pub const _BITS_WCHAR_H: u32 = 1;
+pub const _BITS_STDINT_INTN_H: u32 = 1;
+pub const _BITS_STDINT_UINTN_H: u32 = 1;
+pub const INT8_MIN: i32 = -128;
+pub const INT16_MIN: i32 = -32768;
+pub const INT32_MIN: i32 = -2147483648;
+pub const INT8_MAX: u32 = 127;
+pub const INT16_MAX: u32 = 32767;
+pub const INT32_MAX: u32 = 2147483647;
+pub const UINT8_MAX: u32 = 255;
+pub const UINT16_MAX: u32 = 65535;
+pub const UINT32_MAX: u32 = 4294967295;
+pub const INT_LEAST8_MIN: i32 = -128;
+pub const INT_LEAST16_MIN: i32 = -32768;
+pub const INT_LEAST32_MIN: i32 = -2147483648;
+pub const INT_LEAST8_MAX: u32 = 127;
+pub const INT_LEAST16_MAX: u32 = 32767;
+pub const INT_LEAST32_MAX: u32 = 2147483647;
+pub const UINT_LEAST8_MAX: u32 = 255;
+pub const UINT_LEAST16_MAX: u32 = 65535;
+pub const UINT_LEAST32_MAX: u32 = 4294967295;
+pub const INT_FAST8_MIN: i32 = -128;
+pub const INT_FAST16_MIN: i64 = -9223372036854775808;
+pub const INT_FAST32_MIN: i64 = -9223372036854775808;
+pub const INT_FAST8_MAX: u32 = 127;
+pub const INT_FAST16_MAX: u64 = 9223372036854775807;
+pub const INT_FAST32_MAX: u64 = 9223372036854775807;
+pub const UINT_FAST8_MAX: u32 = 255;
+pub const UINT_FAST16_MAX: i32 = -1;
+pub const UINT_FAST32_MAX: i32 = -1;
+pub const INTPTR_MIN: i64 = -9223372036854775808;
+pub const INTPTR_MAX: u64 = 9223372036854775807;
+pub const UINTPTR_MAX: i32 = -1;
+pub const PTRDIFF_MIN: i64 = -9223372036854775808;
+pub const PTRDIFF_MAX: u64 = 9223372036854775807;
+pub const SIG_ATOMIC_MIN: i32 = -2147483648;
+pub const SIG_ATOMIC_MAX: u32 = 2147483647;
+pub const SIZE_MAX: i32 = -1;
+pub const WINT_MIN: u32 = 0;
+pub const WINT_MAX: u32 = 4294967295;
+pub const ITT_MAJOR: u32 = 3;
+pub const ITT_MINOR: u32 = 0;
+pub const __itt_suppress_all_errors: u32 = 2147483647;
+pub const __itt_suppress_threading_errors: u32 = 255;
+pub const __itt_suppress_memory_errors: u32 = 65280;
+pub const __itt_attr_barrier: u32 = 1;
+pub const __itt_attr_mutex: u32 = 2;
+pub const __itt_heap_leaks: u32 = 1;
+pub const __itt_heap_growth: u32 = 2;
+pub const __itt_section_exec: u32 = 536870912;
+pub const __itt_section_read: u32 = 1073741824;
+pub const __itt_section_write: u32 = 2147483648;
+pub type wchar_t = ::std::os::raw::c_int;
+#[repr(C)]
+#[repr(align(16))]
+#[derive(Debug, Copy, Clone)]
+pub struct max_align_t {
+    pub __clang_max_align_nonce1: ::std::os::raw::c_longlong,
+    pub __bindgen_padding_0: u64,
+    pub __clang_max_align_nonce2: u128,
+}
+#[test]
+fn bindgen_test_layout_max_align_t() {
+    assert_eq!(
+        ::std::mem::size_of::<max_align_t>(),
+        32usize,
+        concat!("Size of: ", stringify!(max_align_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<max_align_t>(),
+        16usize,
+        concat!("Alignment of ", stringify!(max_align_t))
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<max_align_t>())).__clang_max_align_nonce1 as *const _ as usize
+        },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(max_align_t),
+            "::",
+            stringify!(__clang_max_align_nonce1)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<max_align_t>())).__clang_max_align_nonce2 as *const _ as usize
+        },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(max_align_t),
+            "::",
+            stringify!(__clang_max_align_nonce2)
+        )
+    );
+}
+pub type __u_char = ::std::os::raw::c_uchar;
+pub type __u_short = ::std::os::raw::c_ushort;
+pub type __u_int = ::std::os::raw::c_uint;
+pub type __u_long = ::std::os::raw::c_ulong;
+pub type __int8_t = ::std::os::raw::c_schar;
+pub type __uint8_t = ::std::os::raw::c_uchar;
+pub type __int16_t = ::std::os::raw::c_short;
+pub type __uint16_t = ::std::os::raw::c_ushort;
+pub type __int32_t = ::std::os::raw::c_int;
+pub type __uint32_t = ::std::os::raw::c_uint;
+pub type __int64_t = ::std::os::raw::c_long;
+pub type __uint64_t = ::std::os::raw::c_ulong;
+pub type __quad_t = ::std::os::raw::c_long;
+pub type __u_quad_t = ::std::os::raw::c_ulong;
+pub type __intmax_t = ::std::os::raw::c_long;
+pub type __uintmax_t = ::std::os::raw::c_ulong;
+pub type __dev_t = ::std::os::raw::c_ulong;
+pub type __uid_t = ::std::os::raw::c_uint;
+pub type __gid_t = ::std::os::raw::c_uint;
+pub type __ino_t = ::std::os::raw::c_ulong;
+pub type __ino64_t = ::std::os::raw::c_ulong;
+pub type __mode_t = ::std::os::raw::c_uint;
+pub type __nlink_t = ::std::os::raw::c_ulong;
+pub type __off_t = ::std::os::raw::c_long;
+pub type __off64_t = ::std::os::raw::c_long;
+pub type __pid_t = ::std::os::raw::c_int;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __fsid_t {
+    pub __val: [::std::os::raw::c_int; 2usize],
+}
+#[test]
+fn bindgen_test_layout___fsid_t() {
+    assert_eq!(
+        ::std::mem::size_of::<__fsid_t>(),
+        8usize,
+        concat!("Size of: ", stringify!(__fsid_t))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<__fsid_t>(),
+        4usize,
+        concat!("Alignment of ", stringify!(__fsid_t))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<__fsid_t>())).__val as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(__fsid_t),
+            "::",
+            stringify!(__val)
+        )
+    );
+}
+pub type __clock_t = ::std::os::raw::c_long;
+pub type __rlim_t = ::std::os::raw::c_ulong;
+pub type __rlim64_t = ::std::os::raw::c_ulong;
+pub type __id_t = ::std::os::raw::c_uint;
+pub type __time_t = ::std::os::raw::c_long;
+pub type __useconds_t = ::std::os::raw::c_uint;
+pub type __suseconds_t = ::std::os::raw::c_long;
+pub type __daddr_t = ::std::os::raw::c_int;
+pub type __key_t = ::std::os::raw::c_int;
+pub type __clockid_t = ::std::os::raw::c_int;
+pub type __timer_t = *mut ::std::os::raw::c_void;
+pub type __blksize_t = ::std::os::raw::c_long;
+pub type __blkcnt_t = ::std::os::raw::c_long;
+pub type __blkcnt64_t = ::std::os::raw::c_long;
+pub type __fsblkcnt_t = ::std::os::raw::c_ulong;
+pub type __fsblkcnt64_t = ::std::os::raw::c_ulong;
+pub type __fsfilcnt_t = ::std::os::raw::c_ulong;
+pub type __fsfilcnt64_t = ::std::os::raw::c_ulong;
+pub type __fsword_t = ::std::os::raw::c_long;
+pub type __ssize_t = ::std::os::raw::c_long;
+pub type __syscall_slong_t = ::std::os::raw::c_long;
+pub type __syscall_ulong_t = ::std::os::raw::c_ulong;
+pub type __loff_t = __off64_t;
+pub type __caddr_t = *mut ::std::os::raw::c_char;
+pub type __intptr_t = ::std::os::raw::c_long;
+pub type __socklen_t = ::std::os::raw::c_uint;
+pub type __sig_atomic_t = ::std::os::raw::c_int;
+pub type int_least8_t = ::std::os::raw::c_schar;
+pub type int_least16_t = ::std::os::raw::c_short;
+pub type int_least32_t = ::std::os::raw::c_int;
+pub type int_least64_t = ::std::os::raw::c_long;
+pub type uint_least8_t = ::std::os::raw::c_uchar;
+pub type uint_least16_t = ::std::os::raw::c_ushort;
+pub type uint_least32_t = ::std::os::raw::c_uint;
+pub type uint_least64_t = ::std::os::raw::c_ulong;
+pub type int_fast8_t = ::std::os::raw::c_schar;
+pub type int_fast16_t = ::std::os::raw::c_long;
+pub type int_fast32_t = ::std::os::raw::c_long;
+pub type int_fast64_t = ::std::os::raw::c_long;
+pub type uint_fast8_t = ::std::os::raw::c_uchar;
+pub type uint_fast16_t = ::std::os::raw::c_ulong;
+pub type uint_fast32_t = ::std::os::raw::c_ulong;
+pub type uint_fast64_t = ::std::os::raw::c_ulong;
+pub type intmax_t = __intmax_t;
+pub type uintmax_t = __uintmax_t;
+extern "C" {
+    #[doc = " @defgroup control Collection Control"]
+    #[doc = " @ingroup public"]
+    #[doc = " General behavior: application continues to run, but no profiling information is being collected"]
+    #[doc = ""]
+    #[doc = " Pausing occurs not only for the current thread but for all process as well as spawned processes"]
+    #[doc = " - Intel(R) Parallel Inspector and Intel(R) Inspector XE:"]
+    #[doc = "   - Does not analyze or report errors that involve memory access."]
+    #[doc = "   - Other errors are reported as usual. Pausing data collection in"]
+    #[doc = "     Intel(R) Parallel Inspector and Intel(R) Inspector XE"]
+    #[doc = "     only pauses tracing and analyzing memory access."]
+    #[doc = "     It does not pause tracing or analyzing threading APIs."]
+    #[doc = "   ."]
+    #[doc = " - Intel(R) Parallel Amplifier and Intel(R) VTune(TM) Amplifier XE:"]
+    #[doc = "   - Does continue to record when new threads are started."]
+    #[doc = "   ."]
+    #[doc = " - Other effects:"]
+    #[doc = "   - Possible reduction of runtime overhead."]
+    #[doc = "   ."]
+    #[doc = " @{"]
+    pub fn __itt_pause();
+}
+extern "C" {
+    #[doc = " @brief Resume collection"]
+    pub fn __itt_resume();
+}
+extern "C" {
+    #[doc = " @brief Detach collection"]
+    pub fn __itt_detach();
+}
+pub type __itt_pause_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_pause_ptr__3_0: __itt_pause_ptr__3_0_t;
+}
+pub type __itt_resume_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_resume_ptr__3_0: __itt_resume_ptr__3_0_t;
+}
+pub type __itt_detach_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_detach_ptr__3_0: __itt_detach_ptr__3_0_t;
+}
+#[doc = " @defgroup Intel Processor Trace control"]
+#[doc = " API from this group provides control over collection and analysis of Intel Processor Trace (Intel PT) data"]
+#[doc = " Information about Intel Processor Trace technology can be found here (Volume 3 chapter 35):"]
+#[doc = " https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf"]
+#[doc = " Use this API to mark particular code regions for loading detailed performance statistics."]
+#[doc = " This mode makes your analysis faster and more accurate."]
+#[doc = " @{"]
+pub type __itt_pt_region = ::std::os::raw::c_uchar;
+extern "C" {
+    pub fn __itt_pt_region_create(name: *const ::std::os::raw::c_char) -> __itt_pt_region;
+}
+pub type __itt_pt_region_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(name: *const ::std::os::raw::c_char) -> __itt_pt_region,
+>;
+extern "C" {
+    pub static mut __itt_pt_region_create_ptr__3_0: __itt_pt_region_create_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief function contains a special code pattern identified on the post-processing stage and"]
+    #[doc = " marks the beginning of a code region targeted for Intel PT analysis"]
+    #[doc = " @param[in] region - region id, 0 <= region < 8"]
+    pub fn __itt_mark_pt_region_begin(region: __itt_pt_region);
+}
+extern "C" {
+    #[doc = " @brief function contains a special code pattern identified on the post-processing stage and"]
+    #[doc = " marks the end of a code region targeted for Intel PT analysis"]
+    #[doc = " @param[in] region - region id, 0 <= region < 8"]
+    pub fn __itt_mark_pt_region_end(region: __itt_pt_region);
+}
+extern "C" {
+    pub fn __itt_thread_set_name(name: *const ::std::os::raw::c_char);
+}
+pub type __itt_thread_set_name_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(name: *const ::std::os::raw::c_char)>;
+extern "C" {
+    pub static mut __itt_thread_set_name_ptr__3_0: __itt_thread_set_name_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Mark current thread as ignored from this point on, for the duration of its existence."]
+    pub fn __itt_thread_ignore();
+}
+pub type __itt_thread_ignore_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_thread_ignore_ptr__3_0: __itt_thread_ignore_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Start suppressing errors identified in mask on this thread"]
+    pub fn __itt_suppress_push(mask: ::std::os::raw::c_uint);
+}
+pub type __itt_suppress_push_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(mask: ::std::os::raw::c_uint)>;
+extern "C" {
+    pub static mut __itt_suppress_push_ptr__3_0: __itt_suppress_push_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Undo the effects of the matching call to __itt_suppress_push"]
+    pub fn __itt_suppress_pop();
+}
+pub type __itt_suppress_pop_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_suppress_pop_ptr__3_0: __itt_suppress_pop_ptr__3_0_t;
+}
+pub const __itt_suppress_mode___itt_unsuppress_range: __itt_suppress_mode = 0;
+pub const __itt_suppress_mode___itt_suppress_range: __itt_suppress_mode = 1;
+#[doc = " @enum __itt_model_disable"]
+#[doc = " @brief Enumerator for the disable methods"]
+pub type __itt_suppress_mode = u32;
+pub use self::__itt_suppress_mode as __itt_suppress_mode_t;
+extern "C" {
+    #[doc = " @brief Mark a range of memory for error suppression or unsuppression for error types included in mask"]
+    pub fn __itt_suppress_mark_range(
+        mode: __itt_suppress_mode_t,
+        mask: ::std::os::raw::c_uint,
+        address: *mut ::std::os::raw::c_void,
+        size: usize,
+    );
+}
+pub type __itt_suppress_mark_range_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        mode: __itt_suppress_mode_t,
+        mask: ::std::os::raw::c_uint,
+        address: *mut ::std::os::raw::c_void,
+        size: usize,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_suppress_mark_range_ptr__3_0: __itt_suppress_mark_range_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Undo the effect of a matching call to __itt_suppress_mark_range.   If not matching"]
+    #[doc = "        call is found, nothing is changed."]
+    pub fn __itt_suppress_clear_range(
+        mode: __itt_suppress_mode_t,
+        mask: ::std::os::raw::c_uint,
+        address: *mut ::std::os::raw::c_void,
+        size: usize,
+    );
+}
+pub type __itt_suppress_clear_range_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        mode: __itt_suppress_mode_t,
+        mask: ::std::os::raw::c_uint,
+        address: *mut ::std::os::raw::c_void,
+        size: usize,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_suppress_clear_range_ptr__3_0: __itt_suppress_clear_range_ptr__3_0_t;
+}
+extern "C" {
+    pub fn __itt_sync_create(
+        addr: *mut ::std::os::raw::c_void,
+        objtype: *const ::std::os::raw::c_char,
+        objname: *const ::std::os::raw::c_char,
+        attribute: ::std::os::raw::c_int,
+    );
+}
+pub type __itt_sync_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        addr: *mut ::std::os::raw::c_void,
+        objtype: *const ::std::os::raw::c_char,
+        objname: *const ::std::os::raw::c_char,
+        attribute: ::std::os::raw::c_int,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_sync_create_ptr__3_0: __itt_sync_create_ptr__3_0_t;
+}
+extern "C" {
+    pub fn __itt_sync_rename(
+        addr: *mut ::std::os::raw::c_void,
+        name: *const ::std::os::raw::c_char,
+    );
+}
+pub type __itt_sync_rename_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void, name: *const ::std::os::raw::c_char),
+>;
+extern "C" {
+    pub static mut __itt_sync_rename_ptr__3_0: __itt_sync_rename_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = "@brief Destroy a synchronization object."]
+    #[doc = "@param addr Handle for the synchronization object."]
+    pub fn __itt_sync_destroy(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_sync_destroy_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_sync_destroy_ptr__3_0: __itt_sync_destroy_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @name group of functions is used for performance measurement tools"]
+    #[doc = " @brief Enter spin loop on user-defined sync object"]
+    pub fn __itt_sync_prepare(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_sync_prepare_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_sync_prepare_ptr__3_0: __itt_sync_prepare_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Quit spin loop without acquiring spin object"]
+    pub fn __itt_sync_cancel(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_sync_cancel_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_sync_cancel_ptr__3_0: __itt_sync_cancel_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Successful spin loop completion (sync object acquired)"]
+    pub fn __itt_sync_acquired(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_sync_acquired_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_sync_acquired_ptr__3_0: __itt_sync_acquired_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Start sync object releasing code. Is called before the lock release call."]
+    pub fn __itt_sync_releasing(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_sync_releasing_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_sync_releasing_ptr__3_0: __itt_sync_releasing_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @name group of functions is used for correctness checking tools"]
+    #[doc = " @ingroup legacy"]
+    #[doc = " @deprecated Legacy API"]
+    #[doc = " @brief Fast synchronization which does no require spinning."]
+    #[doc = " - This special function is to be used by TBB and OpenMP libraries only when they know"]
+    #[doc = "   there is no spin but they need to suppress TC warnings about shared variable modifications."]
+    #[doc = " - It only has corresponding pointers in static library and does not have corresponding function"]
+    #[doc = "   in dynamic library."]
+    #[doc = " @see void __itt_sync_prepare(void* addr);"]
+    pub fn __itt_fsync_prepare(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_fsync_prepare_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_fsync_prepare_ptr__3_0: __itt_fsync_prepare_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup legacy"]
+    #[doc = " @deprecated Legacy API"]
+    #[doc = " @brief Fast synchronization which does no require spinning."]
+    #[doc = " - This special function is to be used by TBB and OpenMP libraries only when they know"]
+    #[doc = "   there is no spin but they need to suppress TC warnings about shared variable modifications."]
+    #[doc = " - It only has corresponding pointers in static library and does not have corresponding function"]
+    #[doc = "   in dynamic library."]
+    #[doc = " @see void __itt_sync_cancel(void *addr);"]
+    pub fn __itt_fsync_cancel(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_fsync_cancel_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_fsync_cancel_ptr__3_0: __itt_fsync_cancel_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup legacy"]
+    #[doc = " @deprecated Legacy API"]
+    #[doc = " @brief Fast synchronization which does no require spinning."]
+    #[doc = " - This special function is to be used by TBB and OpenMP libraries only when they know"]
+    #[doc = "   there is no spin but they need to suppress TC warnings about shared variable modifications."]
+    #[doc = " - It only has corresponding pointers in static library and does not have corresponding function"]
+    #[doc = "   in dynamic library."]
+    #[doc = " @see void __itt_sync_acquired(void *addr);"]
+    pub fn __itt_fsync_acquired(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_fsync_acquired_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_fsync_acquired_ptr__3_0: __itt_fsync_acquired_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup legacy"]
+    #[doc = " @deprecated Legacy API"]
+    #[doc = " @brief Fast synchronization which does no require spinning."]
+    #[doc = " - This special function is to be used by TBB and OpenMP libraries only when they know"]
+    #[doc = "   there is no spin but they need to suppress TC warnings about shared variable modifications."]
+    #[doc = " - It only has corresponding pointers in static library and does not have corresponding function"]
+    #[doc = "   in dynamic library."]
+    #[doc = " @see void __itt_sync_releasing(void* addr);"]
+    pub fn __itt_fsync_releasing(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_fsync_releasing_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_fsync_releasing_ptr__3_0: __itt_fsync_releasing_ptr__3_0_t;
+}
+pub type __itt_model_site = *mut ::std::os::raw::c_void;
+pub type __itt_model_site_instance = *mut ::std::os::raw::c_void;
+pub type __itt_model_task = *mut ::std::os::raw::c_void;
+pub type __itt_model_task_instance = *mut ::std::os::raw::c_void;
+pub const __itt_model_disable___itt_model_disable_observation: __itt_model_disable = 0;
+pub const __itt_model_disable___itt_model_disable_collection: __itt_model_disable = 1;
+#[doc = " @enum __itt_model_disable"]
+#[doc = " @brief Enumerator for the disable methods"]
+pub type __itt_model_disable = u32;
+extern "C" {
+    #[doc = " @brief ANNOTATE_SITE_BEGIN/ANNOTATE_SITE_END support."]
+    #[doc = ""]
+    #[doc = " site_begin/end model a potential concurrency site."]
+    #[doc = " site instances may be recursively nested with themselves."]
+    #[doc = " site_end exits the most recently started but unended site for the current"]
+    #[doc = " thread.  The handle passed to end may be used to validate structure."]
+    #[doc = " Instances of a site encountered on different threads concurrently"]
+    #[doc = " are considered completely distinct. If the site name for two different"]
+    #[doc = " lexical sites match, it is unspecified whether they are treated as the"]
+    #[doc = " same or different for data presentation."]
+    pub fn __itt_model_site_begin(
+        site: *mut __itt_model_site,
+        instance: *mut __itt_model_site_instance,
+        name: *const ::std::os::raw::c_char,
+    );
+}
+extern "C" {
+    pub fn __itt_model_site_beginA(name: *const ::std::os::raw::c_char);
+}
+extern "C" {
+    pub fn __itt_model_site_beginAL(name: *const ::std::os::raw::c_char, siteNameLen: usize);
+}
+extern "C" {
+    pub fn __itt_model_site_end(
+        site: *mut __itt_model_site,
+        instance: *mut __itt_model_site_instance,
+    );
+}
+extern "C" {
+    pub fn __itt_model_site_end_2();
+}
+pub type __itt_model_site_begin_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        site: *mut __itt_model_site,
+        instance: *mut __itt_model_site_instance,
+        name: *const ::std::os::raw::c_char,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_model_site_begin_ptr__3_0: __itt_model_site_begin_ptr__3_0_t;
+}
+pub type __itt_model_site_beginA_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(name: *const ::std::os::raw::c_char)>;
+extern "C" {
+    pub static mut __itt_model_site_beginA_ptr__3_0: __itt_model_site_beginA_ptr__3_0_t;
+}
+pub type __itt_model_site_beginAL_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(name: *const ::std::os::raw::c_char, siteNameLen: usize),
+>;
+extern "C" {
+    pub static mut __itt_model_site_beginAL_ptr__3_0: __itt_model_site_beginAL_ptr__3_0_t;
+}
+pub type __itt_model_site_end_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(site: *mut __itt_model_site, instance: *mut __itt_model_site_instance),
+>;
+extern "C" {
+    pub static mut __itt_model_site_end_ptr__3_0: __itt_model_site_end_ptr__3_0_t;
+}
+pub type __itt_model_site_end_2_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_model_site_end_2_ptr__3_0: __itt_model_site_end_2_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief ANNOTATE_TASK_BEGIN/ANNOTATE_TASK_END support"]
+    #[doc = ""]
+    #[doc = " task_begin/end model a potential task, which is contained within the most"]
+    #[doc = " closely enclosing dynamic site.  task_end exits the most recently started"]
+    #[doc = " but unended task.  The handle passed to end may be used to validate"]
+    #[doc = " structure.  It is unspecified if bad dynamic nesting is detected.  If it"]
+    #[doc = " is, it should be encoded in the resulting data collection.  The collector"]
+    #[doc = " should not fail due to construct nesting issues, nor attempt to directly"]
+    #[doc = " indicate the problem."]
+    pub fn __itt_model_task_begin(
+        task: *mut __itt_model_task,
+        instance: *mut __itt_model_task_instance,
+        name: *const ::std::os::raw::c_char,
+    );
+}
+extern "C" {
+    pub fn __itt_model_task_beginA(name: *const ::std::os::raw::c_char);
+}
+extern "C" {
+    pub fn __itt_model_task_beginAL(name: *const ::std::os::raw::c_char, taskNameLen: usize);
+}
+extern "C" {
+    pub fn __itt_model_iteration_taskA(name: *const ::std::os::raw::c_char);
+}
+extern "C" {
+    pub fn __itt_model_iteration_taskAL(name: *const ::std::os::raw::c_char, taskNameLen: usize);
+}
+extern "C" {
+    pub fn __itt_model_task_end(
+        task: *mut __itt_model_task,
+        instance: *mut __itt_model_task_instance,
+    );
+}
+extern "C" {
+    pub fn __itt_model_task_end_2();
+}
+pub type __itt_model_task_begin_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        task: *mut __itt_model_task,
+        instance: *mut __itt_model_task_instance,
+        name: *const ::std::os::raw::c_char,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_model_task_begin_ptr__3_0: __itt_model_task_begin_ptr__3_0_t;
+}
+pub type __itt_model_task_beginA_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(name: *const ::std::os::raw::c_char)>;
+extern "C" {
+    pub static mut __itt_model_task_beginA_ptr__3_0: __itt_model_task_beginA_ptr__3_0_t;
+}
+pub type __itt_model_task_beginAL_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(name: *const ::std::os::raw::c_char, taskNameLen: usize),
+>;
+extern "C" {
+    pub static mut __itt_model_task_beginAL_ptr__3_0: __itt_model_task_beginAL_ptr__3_0_t;
+}
+pub type __itt_model_iteration_taskA_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(name: *const ::std::os::raw::c_char)>;
+extern "C" {
+    pub static mut __itt_model_iteration_taskA_ptr__3_0: __itt_model_iteration_taskA_ptr__3_0_t;
+}
+pub type __itt_model_iteration_taskAL_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(name: *const ::std::os::raw::c_char, taskNameLen: usize),
+>;
+extern "C" {
+    pub static mut __itt_model_iteration_taskAL_ptr__3_0: __itt_model_iteration_taskAL_ptr__3_0_t;
+}
+pub type __itt_model_task_end_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(task: *mut __itt_model_task, instance: *mut __itt_model_task_instance),
+>;
+extern "C" {
+    pub static mut __itt_model_task_end_ptr__3_0: __itt_model_task_end_ptr__3_0_t;
+}
+pub type __itt_model_task_end_2_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_model_task_end_2_ptr__3_0: __itt_model_task_end_2_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief ANNOTATE_LOCK_ACQUIRE/ANNOTATE_LOCK_RELEASE support"]
+    #[doc = ""]
+    #[doc = " lock_acquire/release model a potential lock for both lockset and"]
+    #[doc = " performance modeling.  Each unique address is modeled as a separate"]
+    #[doc = " lock, with invalid addresses being valid lock IDs.  Specifically:"]
+    #[doc = " no storage is accessed by the API at the specified address - it is only"]
+    #[doc = " used for lock identification.  Lock acquires may be self-nested and are"]
+    #[doc = " unlocked by a corresponding number of releases."]
+    #[doc = " (These closely correspond to __itt_sync_acquired/__itt_sync_releasing,"]
+    #[doc = " but may not have identical semantics.)"]
+    pub fn __itt_model_lock_acquire(lock: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+    pub fn __itt_model_lock_acquire_2(lock: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+    pub fn __itt_model_lock_release(lock: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+    pub fn __itt_model_lock_release_2(lock: *mut ::std::os::raw::c_void);
+}
+pub type __itt_model_lock_acquire_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(lock: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_model_lock_acquire_ptr__3_0: __itt_model_lock_acquire_ptr__3_0_t;
+}
+pub type __itt_model_lock_acquire_2_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(lock: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_model_lock_acquire_2_ptr__3_0: __itt_model_lock_acquire_2_ptr__3_0_t;
+}
+pub type __itt_model_lock_release_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(lock: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_model_lock_release_ptr__3_0: __itt_model_lock_release_ptr__3_0_t;
+}
+pub type __itt_model_lock_release_2_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(lock: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_model_lock_release_2_ptr__3_0: __itt_model_lock_release_2_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief ANNOTATE_RECORD_ALLOCATION/ANNOTATE_RECORD_DEALLOCATION support"]
+    #[doc = ""]
+    #[doc = " record_allocation/deallocation describe user-defined memory allocator"]
+    #[doc = " behavior, which may be required for correctness modeling to understand"]
+    #[doc = " when storage is not expected to be actually reused across threads."]
+    pub fn __itt_model_record_allocation(addr: *mut ::std::os::raw::c_void, size: usize);
+}
+extern "C" {
+    pub fn __itt_model_record_deallocation(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_model_record_allocation_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void, size: usize)>;
+extern "C" {
+    pub static mut __itt_model_record_allocation_ptr__3_0: __itt_model_record_allocation_ptr__3_0_t;
+}
+pub type __itt_model_record_deallocation_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_model_record_deallocation_ptr__3_0:
+        __itt_model_record_deallocation_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief ANNOTATE_INDUCTION_USES support"]
+    #[doc = ""]
+    #[doc = " Note particular storage is inductive through the end of the current site"]
+    pub fn __itt_model_induction_uses(addr: *mut ::std::os::raw::c_void, size: usize);
+}
+pub type __itt_model_induction_uses_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void, size: usize)>;
+extern "C" {
+    pub static mut __itt_model_induction_uses_ptr__3_0: __itt_model_induction_uses_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief ANNOTATE_REDUCTION_USES support"]
+    #[doc = ""]
+    #[doc = " Note particular storage is used for reduction through the end"]
+    #[doc = " of the current site"]
+    pub fn __itt_model_reduction_uses(addr: *mut ::std::os::raw::c_void, size: usize);
+}
+pub type __itt_model_reduction_uses_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void, size: usize)>;
+extern "C" {
+    pub static mut __itt_model_reduction_uses_ptr__3_0: __itt_model_reduction_uses_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief ANNOTATE_OBSERVE_USES support"]
+    #[doc = ""]
+    #[doc = " Have correctness modeling record observations about uses of storage"]
+    #[doc = " through the end of the current site"]
+    pub fn __itt_model_observe_uses(addr: *mut ::std::os::raw::c_void, size: usize);
+}
+pub type __itt_model_observe_uses_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void, size: usize)>;
+extern "C" {
+    pub static mut __itt_model_observe_uses_ptr__3_0: __itt_model_observe_uses_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief ANNOTATE_CLEAR_USES support"]
+    #[doc = ""]
+    #[doc = " Clear the special handling of a piece of storage related to induction,"]
+    #[doc = " reduction or observe_uses"]
+    pub fn __itt_model_clear_uses(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_model_clear_uses_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_model_clear_uses_ptr__3_0: __itt_model_clear_uses_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief ANNOTATE_DISABLE_*_PUSH/ANNOTATE_DISABLE_*_POP support"]
+    #[doc = ""]
+    #[doc = " disable_push/disable_pop push and pop disabling based on a parameter."]
+    #[doc = " Disabling observations stops processing of memory references during"]
+    #[doc = " correctness modeling, and all annotations that occur in the disabled"]
+    #[doc = " region.  This allows description of code that is expected to be handled"]
+    #[doc = " specially during conversion to parallelism or that is not recognized"]
+    #[doc = " by tools (e.g. some kinds of synchronization operations.)"]
+    #[doc = " This mechanism causes all annotations in the disabled region, other"]
+    #[doc = " than disable_push and disable_pop, to be ignored.  (For example, this"]
+    #[doc = " might validly be used to disable an entire parallel site and the contained"]
+    #[doc = " tasks and locking in it for data collection purposes.)"]
+    #[doc = " The disable for collection is a more expensive operation, but reduces"]
+    #[doc = " collector overhead significantly.  This applies to BOTH correctness data"]
+    #[doc = " collection and performance data collection.  For example, a site"]
+    #[doc = " containing a task might only enable data collection for the first 10"]
+    #[doc = " iterations.  Both performance and correctness data should reflect this,"]
+    #[doc = " and the program should run as close to full speed as possible when"]
+    #[doc = " collection is disabled."]
+    pub fn __itt_model_disable_push(x: __itt_model_disable);
+}
+extern "C" {
+    pub fn __itt_model_disable_pop();
+}
+extern "C" {
+    pub fn __itt_model_aggregate_task(x: usize);
+}
+pub type __itt_model_disable_push_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(x: __itt_model_disable)>;
+extern "C" {
+    pub static mut __itt_model_disable_push_ptr__3_0: __itt_model_disable_push_ptr__3_0_t;
+}
+pub type __itt_model_disable_pop_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_model_disable_pop_ptr__3_0: __itt_model_disable_pop_ptr__3_0_t;
+}
+pub type __itt_model_aggregate_task_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(x: usize)>;
+extern "C" {
+    pub static mut __itt_model_aggregate_task_ptr__3_0: __itt_model_aggregate_task_ptr__3_0_t;
+}
+#[doc = " @defgroup heap Heap"]
+#[doc = " @ingroup public"]
+#[doc = " Heap group"]
+#[doc = " @{"]
+pub type __itt_heap_function = *mut ::std::os::raw::c_void;
+extern "C" {
+    pub fn __itt_heap_function_create(
+        name: *const ::std::os::raw::c_char,
+        domain: *const ::std::os::raw::c_char,
+    ) -> __itt_heap_function;
+}
+pub type __itt_heap_function_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        name: *const ::std::os::raw::c_char,
+        domain: *const ::std::os::raw::c_char,
+    ) -> __itt_heap_function,
+>;
+extern "C" {
+    pub static mut __itt_heap_function_create_ptr__3_0: __itt_heap_function_create_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Record an allocation begin occurrence."]
+    pub fn __itt_heap_allocate_begin(
+        h: __itt_heap_function,
+        size: usize,
+        initialized: ::std::os::raw::c_int,
+    );
+}
+pub type __itt_heap_allocate_begin_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(h: __itt_heap_function, size: usize, initialized: ::std::os::raw::c_int),
+>;
+extern "C" {
+    pub static mut __itt_heap_allocate_begin_ptr__3_0: __itt_heap_allocate_begin_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Record an allocation end occurrence."]
+    pub fn __itt_heap_allocate_end(
+        h: __itt_heap_function,
+        addr: *mut *mut ::std::os::raw::c_void,
+        size: usize,
+        initialized: ::std::os::raw::c_int,
+    );
+}
+pub type __itt_heap_allocate_end_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        h: __itt_heap_function,
+        addr: *mut *mut ::std::os::raw::c_void,
+        size: usize,
+        initialized: ::std::os::raw::c_int,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_heap_allocate_end_ptr__3_0: __itt_heap_allocate_end_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Record an free begin occurrence."]
+    pub fn __itt_heap_free_begin(h: __itt_heap_function, addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_heap_free_begin_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(h: __itt_heap_function, addr: *mut ::std::os::raw::c_void),
+>;
+extern "C" {
+    pub static mut __itt_heap_free_begin_ptr__3_0: __itt_heap_free_begin_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Record an free end occurrence."]
+    pub fn __itt_heap_free_end(h: __itt_heap_function, addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_heap_free_end_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(h: __itt_heap_function, addr: *mut ::std::os::raw::c_void),
+>;
+extern "C" {
+    pub static mut __itt_heap_free_end_ptr__3_0: __itt_heap_free_end_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Record an reallocation begin occurrence."]
+    pub fn __itt_heap_reallocate_begin(
+        h: __itt_heap_function,
+        addr: *mut ::std::os::raw::c_void,
+        new_size: usize,
+        initialized: ::std::os::raw::c_int,
+    );
+}
+pub type __itt_heap_reallocate_begin_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        h: __itt_heap_function,
+        addr: *mut ::std::os::raw::c_void,
+        new_size: usize,
+        initialized: ::std::os::raw::c_int,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_heap_reallocate_begin_ptr__3_0: __itt_heap_reallocate_begin_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Record an reallocation end occurrence."]
+    pub fn __itt_heap_reallocate_end(
+        h: __itt_heap_function,
+        addr: *mut ::std::os::raw::c_void,
+        new_addr: *mut *mut ::std::os::raw::c_void,
+        new_size: usize,
+        initialized: ::std::os::raw::c_int,
+    );
+}
+pub type __itt_heap_reallocate_end_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        h: __itt_heap_function,
+        addr: *mut ::std::os::raw::c_void,
+        new_addr: *mut *mut ::std::os::raw::c_void,
+        new_size: usize,
+        initialized: ::std::os::raw::c_int,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_heap_reallocate_end_ptr__3_0: __itt_heap_reallocate_end_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief internal access begin"]
+    pub fn __itt_heap_internal_access_begin();
+}
+pub type __itt_heap_internal_access_begin_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_heap_internal_access_begin_ptr__3_0:
+        __itt_heap_internal_access_begin_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief internal access end"]
+    pub fn __itt_heap_internal_access_end();
+}
+pub type __itt_heap_internal_access_end_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_heap_internal_access_end_ptr__3_0:
+        __itt_heap_internal_access_end_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief record memory growth begin"]
+    pub fn __itt_heap_record_memory_growth_begin();
+}
+pub type __itt_heap_record_memory_growth_begin_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_heap_record_memory_growth_begin_ptr__3_0:
+        __itt_heap_record_memory_growth_begin_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief record memory growth end"]
+    pub fn __itt_heap_record_memory_growth_end();
+}
+pub type __itt_heap_record_memory_growth_end_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_heap_record_memory_growth_end_ptr__3_0:
+        __itt_heap_record_memory_growth_end_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief heap reset detection"]
+    pub fn __itt_heap_reset_detection(reset_mask: ::std::os::raw::c_uint);
+}
+pub type __itt_heap_reset_detection_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(reset_mask: ::std::os::raw::c_uint)>;
+extern "C" {
+    pub static mut __itt_heap_reset_detection_ptr__3_0: __itt_heap_reset_detection_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief report"]
+    pub fn __itt_heap_record(record_mask: ::std::os::raw::c_uint);
+}
+pub type __itt_heap_record_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(record_mask: ::std::os::raw::c_uint)>;
+extern "C" {
+    pub static mut __itt_heap_record_ptr__3_0: __itt_heap_record_ptr__3_0_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_domain {
+    #[doc = "< Zero if disabled, non-zero if enabled. The meaning of different non-zero values is reserved to the runtime"]
+    pub flags: ::std::os::raw::c_int,
+    #[doc = "< Copy of original name in ASCII."]
+    pub nameA: *const ::std::os::raw::c_char,
+    pub nameW: *mut ::std::os::raw::c_void,
+    #[doc = "< Reserved to the runtime"]
+    pub extra1: ::std::os::raw::c_int,
+    #[doc = "< Reserved to the runtime"]
+    pub extra2: *mut ::std::os::raw::c_void,
+    pub next: *mut ___itt_domain,
+}
+#[test]
+fn bindgen_test_layout____itt_domain() {
+    assert_eq!(
+        ::std::mem::size_of::<___itt_domain>(),
+        48usize,
+        concat!("Size of: ", stringify!(___itt_domain))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<___itt_domain>(),
+        8usize,
+        concat!("Alignment of ", stringify!(___itt_domain))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_domain>())).flags as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_domain),
+            "::",
+            stringify!(flags)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_domain>())).nameA as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_domain),
+            "::",
+            stringify!(nameA)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_domain>())).nameW as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_domain),
+            "::",
+            stringify!(nameW)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_domain>())).extra1 as *const _ as usize },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_domain),
+            "::",
+            stringify!(extra1)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_domain>())).extra2 as *const _ as usize },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_domain),
+            "::",
+            stringify!(extra2)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_domain>())).next as *const _ as usize },
+        40usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_domain),
+            "::",
+            stringify!(next)
+        )
+    );
+}
+pub type __itt_domain = ___itt_domain;
+extern "C" {
+    pub fn __itt_domain_create(name: *const ::std::os::raw::c_char) -> *mut __itt_domain;
+}
+pub type __itt_domain_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(name: *const ::std::os::raw::c_char) -> *mut __itt_domain,
+>;
+extern "C" {
+    pub static mut __itt_domain_create_ptr__3_0: __itt_domain_create_ptr__3_0_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_id {
+    pub d1: ::std::os::raw::c_ulonglong,
+    pub d2: ::std::os::raw::c_ulonglong,
+    pub d3: ::std::os::raw::c_ulonglong,
+}
+#[test]
+fn bindgen_test_layout____itt_id() {
+    assert_eq!(
+        ::std::mem::size_of::<___itt_id>(),
+        24usize,
+        concat!("Size of: ", stringify!(___itt_id))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<___itt_id>(),
+        8usize,
+        concat!("Alignment of ", stringify!(___itt_id))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_id>())).d1 as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_id),
+            "::",
+            stringify!(d1)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_id>())).d2 as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_id),
+            "::",
+            stringify!(d2)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_id>())).d3 as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_id),
+            "::",
+            stringify!(d3)
+        )
+    );
+}
+pub type __itt_id = ___itt_id;
+extern "C" {
+    pub static __itt_null: __itt_id;
+}
+extern "C" {
+    #[doc = " @ingroup ids"]
+    #[doc = " @brief Create an instance of identifier."]
+    #[doc = " This establishes the beginning of the lifetime of an instance of"]
+    #[doc = " the given ID in the trace. Once this lifetime starts, the ID"]
+    #[doc = " can be used to tag named entity instances in calls such as"]
+    #[doc = " __itt_task_begin, and to specify relationships among"]
+    #[doc = " identified named entity instances, using the \\ref relations APIs."]
+    #[doc = " Instance IDs are not domain specific!"]
+    #[doc = " @param[in] domain The domain controlling the execution of this call."]
+    #[doc = " @param[in] id The ID to create."]
+    pub fn __itt_id_create(domain: *const __itt_domain, id: __itt_id);
+}
+pub type __itt_id_create_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(domain: *const __itt_domain, id: __itt_id)>;
+extern "C" {
+    pub static mut __itt_id_create_ptr__3_0: __itt_id_create_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup ids"]
+    #[doc = " @brief Destroy an instance of identifier."]
+    #[doc = " This ends the lifetime of the current instance of the given ID value in the trace."]
+    #[doc = " Any relationships that are established after this lifetime ends are invalid."]
+    #[doc = " This call must be performed before the given ID value can be reused for a different"]
+    #[doc = " named entity instance."]
+    #[doc = " @param[in] domain The domain controlling the execution of this call."]
+    #[doc = " @param[in] id The ID to destroy."]
+    pub fn __itt_id_destroy(domain: *const __itt_domain, id: __itt_id);
+}
+pub type __itt_id_destroy_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(domain: *const __itt_domain, id: __itt_id)>;
+extern "C" {
+    pub static mut __itt_id_destroy_ptr__3_0: __itt_id_destroy_ptr__3_0_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_string_handle {
+    #[doc = "< Copy of original string in ASCII."]
+    pub strA: *const ::std::os::raw::c_char,
+    pub strW: *mut ::std::os::raw::c_void,
+    #[doc = "< Reserved. Must be zero"]
+    pub extra1: ::std::os::raw::c_int,
+    #[doc = "< Reserved. Must be zero"]
+    pub extra2: *mut ::std::os::raw::c_void,
+    pub next: *mut ___itt_string_handle,
+}
+#[test]
+fn bindgen_test_layout____itt_string_handle() {
+    assert_eq!(
+        ::std::mem::size_of::<___itt_string_handle>(),
+        40usize,
+        concat!("Size of: ", stringify!(___itt_string_handle))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<___itt_string_handle>(),
+        8usize,
+        concat!("Alignment of ", stringify!(___itt_string_handle))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_string_handle>())).strA as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_string_handle),
+            "::",
+            stringify!(strA)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_string_handle>())).strW as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_string_handle),
+            "::",
+            stringify!(strW)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_string_handle>())).extra1 as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_string_handle),
+            "::",
+            stringify!(extra1)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_string_handle>())).extra2 as *const _ as usize },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_string_handle),
+            "::",
+            stringify!(extra2)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_string_handle>())).next as *const _ as usize },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_string_handle),
+            "::",
+            stringify!(next)
+        )
+    );
+}
+pub type __itt_string_handle = ___itt_string_handle;
+extern "C" {
+    pub fn __itt_string_handle_create(
+        name: *const ::std::os::raw::c_char,
+    ) -> *mut __itt_string_handle;
+}
+pub type __itt_string_handle_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(name: *const ::std::os::raw::c_char) -> *mut __itt_string_handle,
+>;
+extern "C" {
+    pub static mut __itt_string_handle_create_ptr__3_0: __itt_string_handle_create_ptr__3_0_t;
+}
+#[doc = " @cond exclude_from_documentation"]
+pub type __itt_timestamp = ::std::os::raw::c_ulonglong;
+extern "C" {
+    #[doc = " @ingroup timestamps"]
+    #[doc = " @brief Return timestamp corresponding to the current moment."]
+    #[doc = " This returns the timestamp in the format that is the most relevant for the current"]
+    #[doc = " host or platform (RDTSC, QPC, and others). You can use the \"<\" operator to"]
+    #[doc = " compare __itt_timestamp values."]
+    pub fn __itt_get_timestamp() -> __itt_timestamp;
+}
+pub type __itt_get_timestamp_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn() -> __itt_timestamp>;
+extern "C" {
+    pub static mut __itt_get_timestamp_ptr__3_0: __itt_get_timestamp_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @defgroup regions Regions"]
+    #[doc = " @ingroup public"]
+    #[doc = " Regions group"]
+    #[doc = " @{"]
+    #[doc = " @ingroup regions"]
+    #[doc = " @brief Begin of region instance."]
+    #[doc = " Successive calls to __itt_region_begin with the same ID are ignored"]
+    #[doc = " until a call to __itt_region_end with the same ID"]
+    #[doc = " @param[in] domain The domain for this region instance"]
+    #[doc = " @param[in] id The instance ID for this region instance. Must not be __itt_null"]
+    #[doc = " @param[in] parentid The instance ID for the parent of this region instance, or __itt_null"]
+    #[doc = " @param[in] name The name of this region"]
+    pub fn __itt_region_begin(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    );
+}
+extern "C" {
+    #[doc = " @ingroup regions"]
+    #[doc = " @brief End of region instance."]
+    #[doc = " The first call to __itt_region_end with a given ID ends the"]
+    #[doc = " region. Successive calls with the same ID are ignored, as are"]
+    #[doc = " calls that do not have a matching __itt_region_begin call."]
+    #[doc = " @param[in] domain The domain for this region instance"]
+    #[doc = " @param[in] id The instance ID for this region instance"]
+    pub fn __itt_region_end(domain: *const __itt_domain, id: __itt_id);
+}
+pub type __itt_region_begin_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_region_begin_ptr__3_0: __itt_region_begin_ptr__3_0_t;
+}
+pub type __itt_region_end_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(domain: *const __itt_domain, id: __itt_id)>;
+extern "C" {
+    pub static mut __itt_region_end_ptr__3_0: __itt_region_end_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup frames"]
+    #[doc = " @brief Begin a frame instance."]
+    #[doc = " Successive calls to __itt_frame_begin with the"]
+    #[doc = " same ID are ignored until a call to __itt_frame_end with the same ID."]
+    #[doc = " @param[in] domain The domain for this frame instance"]
+    #[doc = " @param[in] id The instance ID for this frame instance or NULL"]
+    pub fn __itt_frame_begin_v3(domain: *const __itt_domain, id: *mut __itt_id);
+}
+extern "C" {
+    #[doc = " @ingroup frames"]
+    #[doc = " @brief End a frame instance."]
+    #[doc = " The first call to __itt_frame_end with a given ID"]
+    #[doc = " ends the frame. Successive calls with the same ID are ignored, as are"]
+    #[doc = " calls that do not have a matching __itt_frame_begin call."]
+    #[doc = " @param[in] domain The domain for this frame instance"]
+    #[doc = " @param[in] id The instance ID for this frame instance or NULL for current"]
+    pub fn __itt_frame_end_v3(domain: *const __itt_domain, id: *mut __itt_id);
+}
+extern "C" {
+    #[doc = " @ingroup frames"]
+    #[doc = " @brief Submits a frame instance."]
+    #[doc = " Successive calls to __itt_frame_begin or __itt_frame_submit with the"]
+    #[doc = " same ID are ignored until a call to __itt_frame_end or __itt_frame_submit"]
+    #[doc = " with the same ID."]
+    #[doc = " Passing special __itt_timestamp_none value as \"end\" argument means"]
+    #[doc = " take the current timestamp as the end timestamp."]
+    #[doc = " @param[in] domain The domain for this frame instance"]
+    #[doc = " @param[in] id The instance ID for this frame instance or NULL"]
+    #[doc = " @param[in] begin Timestamp of the beginning of the frame"]
+    #[doc = " @param[in] end Timestamp of the end of the frame"]
+    pub fn __itt_frame_submit_v3(
+        domain: *const __itt_domain,
+        id: *mut __itt_id,
+        begin: __itt_timestamp,
+        end: __itt_timestamp,
+    );
+}
+pub type __itt_frame_begin_v3_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(domain: *const __itt_domain, id: *mut __itt_id)>;
+extern "C" {
+    pub static mut __itt_frame_begin_v3_ptr__3_0: __itt_frame_begin_v3_ptr__3_0_t;
+}
+pub type __itt_frame_end_v3_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(domain: *const __itt_domain, id: *mut __itt_id)>;
+extern "C" {
+    pub static mut __itt_frame_end_v3_ptr__3_0: __itt_frame_end_v3_ptr__3_0_t;
+}
+pub type __itt_frame_submit_v3_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        id: *mut __itt_id,
+        begin: __itt_timestamp,
+        end: __itt_timestamp,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_frame_submit_v3_ptr__3_0: __itt_frame_submit_v3_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @defgroup taskgroup Task Group"]
+    #[doc = " @ingroup public"]
+    #[doc = " Task Group"]
+    #[doc = " @{"]
+    #[doc = " @ingroup task_groups"]
+    #[doc = " @brief Denotes a task_group instance."]
+    #[doc = " Successive calls to __itt_task_group with the same ID are ignored."]
+    #[doc = " @param[in] domain The domain for this task_group instance"]
+    #[doc = " @param[in] id The instance ID for this task_group instance. Must not be __itt_null."]
+    #[doc = " @param[in] parentid The instance ID for the parent of this task_group instance, or __itt_null."]
+    #[doc = " @param[in] name The name of this task_group"]
+    pub fn __itt_task_group(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    );
+}
+pub type __itt_task_group_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_task_group_ptr__3_0: __itt_task_group_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup tasks"]
+    #[doc = " @brief Begin a task instance."]
+    #[doc = " @param[in] domain The domain for this task"]
+    #[doc = " @param[in] taskid The instance ID for this task instance, or __itt_null"]
+    #[doc = " @param[in] parentid The parent instance to which this task instance belongs, or __itt_null"]
+    #[doc = " @param[in] name The name of this task"]
+    pub fn __itt_task_begin(
+        domain: *const __itt_domain,
+        taskid: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    );
+}
+extern "C" {
+    #[doc = " @ingroup tasks"]
+    #[doc = " @brief Begin a task instance."]
+    #[doc = " @param[in] domain The domain for this task"]
+    #[doc = " @param[in] taskid The identifier for this task instance (may be 0)"]
+    #[doc = " @param[in] parentid The parent of this task (may be 0)"]
+    #[doc = " @param[in] fn The pointer to the function you are tracing"]
+    pub fn __itt_task_begin_fn(
+        domain: *const __itt_domain,
+        taskid: __itt_id,
+        parentid: __itt_id,
+        fn_: *mut ::std::os::raw::c_void,
+    );
+}
+extern "C" {
+    #[doc = " @ingroup tasks"]
+    #[doc = " @brief End the current task instance."]
+    #[doc = " @param[in] domain The domain for this task"]
+    pub fn __itt_task_end(domain: *const __itt_domain);
+}
+extern "C" {
+    #[doc = " @ingroup tasks"]
+    #[doc = " @brief Begin an overlapped task instance."]
+    #[doc = " @param[in] domain The domain for this task."]
+    #[doc = " @param[in] taskid The identifier for this task instance, *cannot* be __itt_null."]
+    #[doc = " @param[in] parentid The parent of this task, or __itt_null."]
+    #[doc = " @param[in] name The name of this task."]
+    pub fn __itt_task_begin_overlapped(
+        domain: *const __itt_domain,
+        taskid: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    );
+}
+extern "C" {
+    #[doc = " @ingroup tasks"]
+    #[doc = " @brief End an overlapped task instance."]
+    #[doc = " @param[in] domain The domain for this task"]
+    #[doc = " @param[in] taskid Explicit ID of finished task"]
+    pub fn __itt_task_end_overlapped(domain: *const __itt_domain, taskid: __itt_id);
+}
+pub type __itt_task_begin_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_task_begin_ptr__3_0: __itt_task_begin_ptr__3_0_t;
+}
+pub type __itt_task_begin_fn_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        parentid: __itt_id,
+        fn_: *mut ::std::os::raw::c_void,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_task_begin_fn_ptr__3_0: __itt_task_begin_fn_ptr__3_0_t;
+}
+pub type __itt_task_end_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(domain: *const __itt_domain)>;
+extern "C" {
+    pub static mut __itt_task_end_ptr__3_0: __itt_task_end_ptr__3_0_t;
+}
+pub type __itt_task_begin_overlapped_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        taskid: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_task_begin_overlapped_ptr__3_0: __itt_task_begin_overlapped_ptr__3_0_t;
+}
+pub type __itt_task_end_overlapped_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(domain: *const __itt_domain, taskid: __itt_id)>;
+extern "C" {
+    pub static mut __itt_task_end_overlapped_ptr__3_0: __itt_task_end_overlapped_ptr__3_0_t;
+}
+pub const __itt_scope___itt_scope_unknown: __itt_scope = 0;
+pub const __itt_scope___itt_scope_global: __itt_scope = 1;
+pub const __itt_scope___itt_scope_track_group: __itt_scope = 2;
+pub const __itt_scope___itt_scope_track: __itt_scope = 3;
+pub const __itt_scope___itt_scope_task: __itt_scope = 4;
+pub const __itt_scope___itt_scope_marker: __itt_scope = 5;
+#[doc = " @brief Describes the scope of an event object in the trace."]
+pub type __itt_scope = u32;
+extern "C" {
+    #[doc = " @ingroup markers"]
+    #[doc = " @brief Create a marker instance"]
+    #[doc = " @param[in] domain The domain for this marker"]
+    #[doc = " @param[in] id The instance ID for this marker or __itt_null"]
+    #[doc = " @param[in] name The name for this marker"]
+    #[doc = " @param[in] scope The scope for this marker"]
+    pub fn __itt_marker(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        name: *mut __itt_string_handle,
+        scope: __itt_scope,
+    );
+}
+pub type __itt_marker_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        name: *mut __itt_string_handle,
+        scope: __itt_scope,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_marker_ptr__3_0: __itt_marker_ptr__3_0_t;
+}
+pub const __itt_metadata_type___itt_metadata_unknown: __itt_metadata_type = 0;
+#[doc = "< Unsigned 64-bit integer"]
+pub const __itt_metadata_type___itt_metadata_u64: __itt_metadata_type = 1;
+#[doc = "< Signed 64-bit integer"]
+pub const __itt_metadata_type___itt_metadata_s64: __itt_metadata_type = 2;
+#[doc = "< Unsigned 32-bit integer"]
+pub const __itt_metadata_type___itt_metadata_u32: __itt_metadata_type = 3;
+#[doc = "< Signed 32-bit integer"]
+pub const __itt_metadata_type___itt_metadata_s32: __itt_metadata_type = 4;
+#[doc = "< Unsigned 16-bit integer"]
+pub const __itt_metadata_type___itt_metadata_u16: __itt_metadata_type = 5;
+#[doc = "< Signed 16-bit integer"]
+pub const __itt_metadata_type___itt_metadata_s16: __itt_metadata_type = 6;
+#[doc = "< Signed 32-bit floating-point"]
+pub const __itt_metadata_type___itt_metadata_float: __itt_metadata_type = 7;
+#[doc = "< SIgned 64-bit floating-point"]
+pub const __itt_metadata_type___itt_metadata_double: __itt_metadata_type = 8;
+#[doc = " @ingroup parameters"]
+#[doc = " @brief describes the type of metadata"]
+pub type __itt_metadata_type = u32;
+extern "C" {
+    #[doc = " @ingroup parameters"]
+    #[doc = " @brief Add metadata to an instance of a named entity."]
+    #[doc = " @param[in] domain The domain controlling the call"]
+    #[doc = " @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task"]
+    #[doc = " @param[in] key The name of the metadata"]
+    #[doc = " @param[in] type The type of the metadata"]
+    #[doc = " @param[in] count The number of elements of the given type. If count == 0, no metadata will be added."]
+    #[doc = " @param[in] data The metadata itself"]
+    pub fn __itt_metadata_add(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        key: *mut __itt_string_handle,
+        type_: __itt_metadata_type,
+        count: usize,
+        data: *mut ::std::os::raw::c_void,
+    );
+}
+pub type __itt_metadata_add_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        key: *mut __itt_string_handle,
+        type_: __itt_metadata_type,
+        count: usize,
+        data: *mut ::std::os::raw::c_void,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_metadata_add_ptr__3_0: __itt_metadata_add_ptr__3_0_t;
+}
+extern "C" {
+    pub fn __itt_metadata_str_add(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        key: *mut __itt_string_handle,
+        data: *const ::std::os::raw::c_char,
+        length: usize,
+    );
+}
+pub type __itt_metadata_str_add_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        id: __itt_id,
+        key: *mut __itt_string_handle,
+        data: *const ::std::os::raw::c_char,
+        length: usize,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_metadata_str_add_ptr__3_0: __itt_metadata_str_add_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup parameters"]
+    #[doc = " @brief Add metadata to an instance of a named entity."]
+    #[doc = " @param[in] domain The domain controlling the call"]
+    #[doc = " @param[in] scope The scope of the instance to which the metadata is to be added"]
+    #[doc = ""]
+    #[doc = " @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task"]
+    #[doc = ""]
+    #[doc = " @param[in] key The name of the metadata"]
+    #[doc = " @param[in] type The type of the metadata"]
+    #[doc = " @param[in] count The number of elements of the given type. If count == 0, no metadata will be added."]
+    #[doc = " @param[in] data The metadata itself"]
+    pub fn __itt_metadata_add_with_scope(
+        domain: *const __itt_domain,
+        scope: __itt_scope,
+        key: *mut __itt_string_handle,
+        type_: __itt_metadata_type,
+        count: usize,
+        data: *mut ::std::os::raw::c_void,
+    );
+}
+pub type __itt_metadata_add_with_scope_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        scope: __itt_scope,
+        key: *mut __itt_string_handle,
+        type_: __itt_metadata_type,
+        count: usize,
+        data: *mut ::std::os::raw::c_void,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_metadata_add_with_scope_ptr__3_0: __itt_metadata_add_with_scope_ptr__3_0_t;
+}
+extern "C" {
+    pub fn __itt_metadata_str_add_with_scope(
+        domain: *const __itt_domain,
+        scope: __itt_scope,
+        key: *mut __itt_string_handle,
+        data: *const ::std::os::raw::c_char,
+        length: usize,
+    );
+}
+pub type __itt_metadata_str_add_with_scope_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        scope: __itt_scope,
+        key: *mut __itt_string_handle,
+        data: *const ::std::os::raw::c_char,
+        length: usize,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_metadata_str_add_with_scope_ptr__3_0:
+        __itt_metadata_str_add_with_scope_ptr__3_0_t;
+}
+pub const __itt_relation___itt_relation_is_unknown: __itt_relation = 0;
+#[doc = "< \"A is dependent on B\" means that A cannot start until B completes"]
+pub const __itt_relation___itt_relation_is_dependent_on: __itt_relation = 1;
+#[doc = "< \"A is sibling of B\" means that A and B were created as a group"]
+pub const __itt_relation___itt_relation_is_sibling_of: __itt_relation = 2;
+#[doc = "< \"A is parent of B\" means that A created B"]
+pub const __itt_relation___itt_relation_is_parent_of: __itt_relation = 3;
+#[doc = "< \"A is continuation of B\" means that A assumes the dependencies of B"]
+pub const __itt_relation___itt_relation_is_continuation_of: __itt_relation = 4;
+#[doc = "< \"A is child of B\" means that A was created by B (inverse of is_parent_of)"]
+pub const __itt_relation___itt_relation_is_child_of: __itt_relation = 5;
+#[doc = "< \"A is continued by B\" means that B assumes the dependencies of A (inverse of is_continuation_of)"]
+pub const __itt_relation___itt_relation_is_continued_by: __itt_relation = 6;
+#[doc = "< \"A is predecessor to B\" means that B cannot start until A completes (inverse of is_dependent_on)"]
+pub const __itt_relation___itt_relation_is_predecessor_to: __itt_relation = 7;
+#[doc = " @ingroup relations"]
+#[doc = " @brief The kind of relation between two instances is specified by the enumerated type __itt_relation."]
+#[doc = " Relations between instances can be added with an API call. The relation"]
+#[doc = " API uses instance IDs. Relations can be added before or after the actual"]
+#[doc = " instances are created and persist independently of the instances. This"]
+#[doc = " is the motivation for having different lifetimes for instance IDs and"]
+#[doc = " the actual instances."]
+pub type __itt_relation = u32;
+extern "C" {
+    #[doc = " @ingroup relations"]
+    #[doc = " @brief Add a relation to the current task instance."]
+    #[doc = " The current task instance is the head of the relation."]
+    #[doc = " @param[in] domain The domain controlling this call"]
+    #[doc = " @param[in] relation The kind of relation"]
+    #[doc = " @param[in] tail The ID for the tail of the relation"]
+    pub fn __itt_relation_add_to_current(
+        domain: *const __itt_domain,
+        relation: __itt_relation,
+        tail: __itt_id,
+    );
+}
+extern "C" {
+    #[doc = " @ingroup relations"]
+    #[doc = " @brief Add a relation between two instance identifiers."]
+    #[doc = " @param[in] domain The domain controlling this call"]
+    #[doc = " @param[in] head The ID for the head of the relation"]
+    #[doc = " @param[in] relation The kind of relation"]
+    #[doc = " @param[in] tail The ID for the tail of the relation"]
+    pub fn __itt_relation_add(
+        domain: *const __itt_domain,
+        head: __itt_id,
+        relation: __itt_relation,
+        tail: __itt_id,
+    );
+}
+pub type __itt_relation_add_to_current_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(domain: *const __itt_domain, relation: __itt_relation, tail: __itt_id),
+>;
+extern "C" {
+    pub static mut __itt_relation_add_to_current_ptr__3_0: __itt_relation_add_to_current_ptr__3_0_t;
+}
+pub type __itt_relation_add_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        head: __itt_id,
+        relation: __itt_relation,
+        tail: __itt_id,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_relation_add_ptr__3_0: __itt_relation_add_ptr__3_0_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_clock_info {
+    #[doc = "< Clock domain frequency"]
+    pub clock_freq: ::std::os::raw::c_ulonglong,
+    #[doc = "< Clock domain base timestamp"]
+    pub clock_base: ::std::os::raw::c_ulonglong,
+}
+#[test]
+fn bindgen_test_layout____itt_clock_info() {
+    assert_eq!(
+        ::std::mem::size_of::<___itt_clock_info>(),
+        16usize,
+        concat!("Size of: ", stringify!(___itt_clock_info))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<___itt_clock_info>(),
+        8usize,
+        concat!("Alignment of ", stringify!(___itt_clock_info))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_clock_info>())).clock_freq as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_clock_info),
+            "::",
+            stringify!(clock_freq)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_clock_info>())).clock_base as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_clock_info),
+            "::",
+            stringify!(clock_base)
+        )
+    );
+}
+pub type __itt_clock_info = ___itt_clock_info;
+#[doc = " @cond exclude_from_documentation"]
+pub type __itt_get_clock_info_fn = ::std::option::Option<
+    unsafe extern "C" fn(clock_info: *mut __itt_clock_info, data: *mut ::std::os::raw::c_void),
+>;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_clock_domain {
+    #[doc = "< Most recent clock domain info"]
+    pub info: __itt_clock_info,
+    #[doc = "< Callback function pointer"]
+    pub fn_: __itt_get_clock_info_fn,
+    #[doc = "< Input argument for the callback function"]
+    pub fn_data: *mut ::std::os::raw::c_void,
+    #[doc = "< Reserved. Must be zero"]
+    pub extra1: ::std::os::raw::c_int,
+    #[doc = "< Reserved. Must be zero"]
+    pub extra2: *mut ::std::os::raw::c_void,
+    pub next: *mut ___itt_clock_domain,
+}
+#[test]
+fn bindgen_test_layout____itt_clock_domain() {
+    assert_eq!(
+        ::std::mem::size_of::<___itt_clock_domain>(),
+        56usize,
+        concat!("Size of: ", stringify!(___itt_clock_domain))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<___itt_clock_domain>(),
+        8usize,
+        concat!("Alignment of ", stringify!(___itt_clock_domain))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_clock_domain>())).info as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_clock_domain),
+            "::",
+            stringify!(info)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_clock_domain>())).fn_ as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_clock_domain),
+            "::",
+            stringify!(fn_)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_clock_domain>())).fn_data as *const _ as usize },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_clock_domain),
+            "::",
+            stringify!(fn_data)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_clock_domain>())).extra1 as *const _ as usize },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_clock_domain),
+            "::",
+            stringify!(extra1)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_clock_domain>())).extra2 as *const _ as usize },
+        40usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_clock_domain),
+            "::",
+            stringify!(extra2)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_clock_domain>())).next as *const _ as usize },
+        48usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_clock_domain),
+            "::",
+            stringify!(next)
+        )
+    );
+}
+pub type __itt_clock_domain = ___itt_clock_domain;
+extern "C" {
+    #[doc = " @ingroup clockdomains"]
+    #[doc = " @brief Create a clock domain."]
+    #[doc = " Certain applications require the capability to trace their application using"]
+    #[doc = " a clock domain different than the CPU, for instance the instrumentation of events"]
+    #[doc = " that occur on a GPU."]
+    #[doc = " Because the set of domains is expected to be static over the application's execution time,"]
+    #[doc = " there is no mechanism to destroy a domain."]
+    #[doc = " Any domain can be accessed by any thread in the process, regardless of which thread created"]
+    #[doc = " the domain. This call is thread-safe."]
+    #[doc = " @param[in] fn A pointer to a callback function which retrieves alternative CPU timestamps"]
+    #[doc = " @param[in] fn_data Argument for a callback function; may be NULL"]
+    pub fn __itt_clock_domain_create(
+        fn_: __itt_get_clock_info_fn,
+        fn_data: *mut ::std::os::raw::c_void,
+    ) -> *mut __itt_clock_domain;
+}
+pub type __itt_clock_domain_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        fn_: __itt_get_clock_info_fn,
+        fn_data: *mut ::std::os::raw::c_void,
+    ) -> *mut __itt_clock_domain,
+>;
+extern "C" {
+    pub static mut __itt_clock_domain_create_ptr__3_0: __itt_clock_domain_create_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup clockdomains"]
+    #[doc = " @brief Recalculate clock domains frequencies and clock base timestamps."]
+    pub fn __itt_clock_domain_reset();
+}
+pub type __itt_clock_domain_reset_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_clock_domain_reset_ptr__3_0: __itt_clock_domain_reset_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup clockdomain"]
+    #[doc = " @brief Create an instance of identifier. This establishes the beginning of the lifetime of"]
+    #[doc = " an instance of the given ID in the trace. Once this lifetime starts, the ID can be used to"]
+    #[doc = " tag named entity instances in calls such as __itt_task_begin, and to specify relationships among"]
+    #[doc = " identified named entity instances, using the \\ref relations APIs."]
+    #[doc = " @param[in] domain The domain controlling the execution of this call."]
+    #[doc = " @param[in] clock_domain The clock domain controlling the execution of this call."]
+    #[doc = " @param[in] timestamp The user defined timestamp."]
+    #[doc = " @param[in] id The ID to create."]
+    pub fn __itt_id_create_ex(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        id: __itt_id,
+    );
+}
+extern "C" {
+    #[doc = " @ingroup clockdomain"]
+    #[doc = " @brief Destroy an instance of identifier. This ends the lifetime of the current instance of the"]
+    #[doc = " given ID value in the trace. Any relationships that are established after this lifetime ends are"]
+    #[doc = " invalid. This call must be performed before the given ID value can be reused for a different"]
+    #[doc = " named entity instance."]
+    #[doc = " @param[in] domain The domain controlling the execution of this call."]
+    #[doc = " @param[in] clock_domain The clock domain controlling the execution of this call."]
+    #[doc = " @param[in] timestamp The user defined timestamp."]
+    #[doc = " @param[in] id The ID to destroy."]
+    pub fn __itt_id_destroy_ex(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        id: __itt_id,
+    );
+}
+pub type __itt_id_create_ex_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        id: __itt_id,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_id_create_ex_ptr__3_0: __itt_id_create_ex_ptr__3_0_t;
+}
+pub type __itt_id_destroy_ex_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        id: __itt_id,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_id_destroy_ex_ptr__3_0: __itt_id_destroy_ex_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup clockdomain"]
+    #[doc = " @brief Begin a task instance."]
+    #[doc = " @param[in] domain The domain for this task"]
+    #[doc = " @param[in] clock_domain The clock domain controlling the execution of this call."]
+    #[doc = " @param[in] timestamp The user defined timestamp."]
+    #[doc = " @param[in] taskid The instance ID for this task instance, or __itt_null"]
+    #[doc = " @param[in] parentid The parent instance to which this task instance belongs, or __itt_null"]
+    #[doc = " @param[in] name The name of this task"]
+    pub fn __itt_task_begin_ex(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        taskid: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    );
+}
+extern "C" {
+    #[doc = " @ingroup clockdomain"]
+    #[doc = " @brief Begin a task instance."]
+    #[doc = " @param[in] domain The domain for this task"]
+    #[doc = " @param[in] clock_domain The clock domain controlling the execution of this call."]
+    #[doc = " @param[in] timestamp The user defined timestamp."]
+    #[doc = " @param[in] taskid The identifier for this task instance, or __itt_null"]
+    #[doc = " @param[in] parentid The parent of this task, or __itt_null"]
+    #[doc = " @param[in] fn The pointer to the function you are tracing"]
+    pub fn __itt_task_begin_fn_ex(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        taskid: __itt_id,
+        parentid: __itt_id,
+        fn_: *mut ::std::os::raw::c_void,
+    );
+}
+extern "C" {
+    #[doc = " @ingroup clockdomain"]
+    #[doc = " @brief End the current task instance."]
+    #[doc = " @param[in] domain The domain for this task"]
+    #[doc = " @param[in] clock_domain The clock domain controlling the execution of this call."]
+    #[doc = " @param[in] timestamp The user defined timestamp."]
+    pub fn __itt_task_end_ex(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+    );
+}
+pub type __itt_task_begin_ex_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        id: __itt_id,
+        parentid: __itt_id,
+        name: *mut __itt_string_handle,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_task_begin_ex_ptr__3_0: __itt_task_begin_ex_ptr__3_0_t;
+}
+pub type __itt_task_begin_fn_ex_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        id: __itt_id,
+        parentid: __itt_id,
+        fn_: *mut ::std::os::raw::c_void,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_task_begin_fn_ex_ptr__3_0: __itt_task_begin_fn_ex_ptr__3_0_t;
+}
+pub type __itt_task_end_ex_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_task_end_ex_ptr__3_0: __itt_task_end_ex_ptr__3_0_t;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_counter {
+    _unused: [u8; 0],
+}
+#[doc = " @brief opaque structure for counter identification"]
+pub type __itt_counter = *mut ___itt_counter;
+extern "C" {
+    pub fn __itt_counter_create(
+        name: *const ::std::os::raw::c_char,
+        domain: *const ::std::os::raw::c_char,
+    ) -> __itt_counter;
+}
+pub type __itt_counter_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        name: *const ::std::os::raw::c_char,
+        domain: *const ::std::os::raw::c_char,
+    ) -> __itt_counter,
+>;
+extern "C" {
+    pub static mut __itt_counter_create_ptr__3_0: __itt_counter_create_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Increment the unsigned 64 bits integer counter value"]
+    #[doc = ""]
+    #[doc = " Calling this function to non-unsigned 64 bits integer counters has no effect"]
+    pub fn __itt_counter_inc(id: __itt_counter);
+}
+pub type __itt_counter_inc_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(id: __itt_counter)>;
+extern "C" {
+    pub static mut __itt_counter_inc_ptr__3_0: __itt_counter_inc_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @endcond */"]
+    #[doc = " @brief Increment the unsigned 64 bits integer counter value with x"]
+    #[doc = ""]
+    #[doc = " Calling this function to non-unsigned 64 bits integer counters has no effect"]
+    pub fn __itt_counter_inc_delta(id: __itt_counter, value: ::std::os::raw::c_ulonglong);
+}
+pub type __itt_counter_inc_delta_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(id: __itt_counter, value: ::std::os::raw::c_ulonglong),
+>;
+extern "C" {
+    pub static mut __itt_counter_inc_delta_ptr__3_0: __itt_counter_inc_delta_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Decrement the unsigned 64 bits integer counter value"]
+    #[doc = ""]
+    #[doc = " Calling this function to non-unsigned 64 bits integer counters has no effect"]
+    pub fn __itt_counter_dec(id: __itt_counter);
+}
+pub type __itt_counter_dec_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(id: __itt_counter)>;
+extern "C" {
+    pub static mut __itt_counter_dec_ptr__3_0: __itt_counter_dec_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @endcond */"]
+    #[doc = " @brief Decrement the unsigned 64 bits integer counter value with x"]
+    #[doc = ""]
+    #[doc = " Calling this function to non-unsigned 64 bits integer counters has no effect"]
+    pub fn __itt_counter_dec_delta(id: __itt_counter, value: ::std::os::raw::c_ulonglong);
+}
+pub type __itt_counter_dec_delta_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(id: __itt_counter, value: ::std::os::raw::c_ulonglong),
+>;
+extern "C" {
+    pub static mut __itt_counter_dec_delta_ptr__3_0: __itt_counter_dec_delta_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup counters"]
+    #[doc = " @brief Increment a counter by one."]
+    #[doc = " The first call with a given name creates a counter by that name and sets its"]
+    #[doc = " value to zero. Successive calls increment the counter value."]
+    #[doc = " @param[in] domain The domain controlling the call. Counter names are not domain specific."]
+    #[doc = "            The domain argument is used only to enable or disable the API calls."]
+    #[doc = " @param[in] name The name of the counter"]
+    pub fn __itt_counter_inc_v3(domain: *const __itt_domain, name: *mut __itt_string_handle);
+}
+extern "C" {
+    #[doc = " @ingroup counters"]
+    #[doc = " @brief Increment a counter by the value specified in delta."]
+    #[doc = " @param[in] domain The domain controlling the call. Counter names are not domain specific."]
+    #[doc = "            The domain argument is used only to enable or disable the API calls."]
+    #[doc = " @param[in] name The name of the counter"]
+    #[doc = " @param[in] delta The amount by which to increment the counter"]
+    pub fn __itt_counter_inc_delta_v3(
+        domain: *const __itt_domain,
+        name: *mut __itt_string_handle,
+        delta: ::std::os::raw::c_ulonglong,
+    );
+}
+pub type __itt_counter_inc_v3_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(domain: *const __itt_domain, name: *mut __itt_string_handle),
+>;
+extern "C" {
+    pub static mut __itt_counter_inc_v3_ptr__3_0: __itt_counter_inc_v3_ptr__3_0_t;
+}
+pub type __itt_counter_inc_delta_v3_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        name: *mut __itt_string_handle,
+        delta: ::std::os::raw::c_ulonglong,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_counter_inc_delta_v3_ptr__3_0: __itt_counter_inc_delta_v3_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup counters"]
+    #[doc = " @brief Decrement a counter by one."]
+    #[doc = " The first call with a given name creates a counter by that name and sets its"]
+    #[doc = " value to zero. Successive calls decrement the counter value."]
+    #[doc = " @param[in] domain The domain controlling the call. Counter names are not domain specific."]
+    #[doc = "            The domain argument is used only to enable or disable the API calls."]
+    #[doc = " @param[in] name The name of the counter"]
+    pub fn __itt_counter_dec_v3(domain: *const __itt_domain, name: *mut __itt_string_handle);
+}
+extern "C" {
+    #[doc = " @ingroup counters"]
+    #[doc = " @brief Decrement a counter by the value specified in delta."]
+    #[doc = " @param[in] domain The domain controlling the call. Counter names are not domain specific."]
+    #[doc = "            The domain argument is used only to enable or disable the API calls."]
+    #[doc = " @param[in] name The name of the counter"]
+    #[doc = " @param[in] delta The amount by which to decrement the counter"]
+    pub fn __itt_counter_dec_delta_v3(
+        domain: *const __itt_domain,
+        name: *mut __itt_string_handle,
+        delta: ::std::os::raw::c_ulonglong,
+    );
+}
+pub type __itt_counter_dec_v3_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(domain: *const __itt_domain, name: *mut __itt_string_handle),
+>;
+extern "C" {
+    pub static mut __itt_counter_dec_v3_ptr__3_0: __itt_counter_dec_v3_ptr__3_0_t;
+}
+pub type __itt_counter_dec_delta_v3_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        name: *mut __itt_string_handle,
+        delta: ::std::os::raw::c_ulonglong,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_counter_dec_delta_v3_ptr__3_0: __itt_counter_dec_delta_v3_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Set the counter value"]
+    pub fn __itt_counter_set_value(id: __itt_counter, value_ptr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_counter_set_value_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(id: __itt_counter, value_ptr: *mut ::std::os::raw::c_void),
+>;
+extern "C" {
+    pub static mut __itt_counter_set_value_ptr__3_0: __itt_counter_set_value_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Set the counter value"]
+    pub fn __itt_counter_set_value_ex(
+        id: __itt_counter,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        value_ptr: *mut ::std::os::raw::c_void,
+    );
+}
+pub type __itt_counter_set_value_ex_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        id: __itt_counter,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        value_ptr: *mut ::std::os::raw::c_void,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_counter_set_value_ex_ptr__3_0: __itt_counter_set_value_ex_ptr__3_0_t;
+}
+extern "C" {
+    pub fn __itt_counter_create_typed(
+        name: *const ::std::os::raw::c_char,
+        domain: *const ::std::os::raw::c_char,
+        type_: __itt_metadata_type,
+    ) -> __itt_counter;
+}
+pub type __itt_counter_create_typed_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        name: *const ::std::os::raw::c_char,
+        domain: *const ::std::os::raw::c_char,
+        type_: __itt_metadata_type,
+    ) -> __itt_counter,
+>;
+extern "C" {
+    pub static mut __itt_counter_create_typed_ptr__3_0: __itt_counter_create_typed_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Destroy the counter identified by the pointer previously returned by __itt_counter_create() or"]
+    #[doc = " __itt_counter_create_typed()"]
+    pub fn __itt_counter_destroy(id: __itt_counter);
+}
+pub type __itt_counter_destroy_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(id: __itt_counter)>;
+extern "C" {
+    pub static mut __itt_counter_destroy_ptr__3_0: __itt_counter_destroy_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup markers"]
+    #[doc = " @brief Create a marker instance."]
+    #[doc = " @param[in] domain The domain for this marker"]
+    #[doc = " @param[in] clock_domain The clock domain controlling the execution of this call."]
+    #[doc = " @param[in] timestamp The user defined timestamp."]
+    #[doc = " @param[in] id The instance ID for this marker, or __itt_null"]
+    #[doc = " @param[in] name The name for this marker"]
+    #[doc = " @param[in] scope The scope for this marker"]
+    pub fn __itt_marker_ex(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        id: __itt_id,
+        name: *mut __itt_string_handle,
+        scope: __itt_scope,
+    );
+}
+pub type __itt_marker_ex_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        id: __itt_id,
+        name: *mut __itt_string_handle,
+        scope: __itt_scope,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_marker_ex_ptr__3_0: __itt_marker_ex_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @ingroup clockdomain"]
+    #[doc = " @brief Add a relation to the current task instance."]
+    #[doc = " The current task instance is the head of the relation."]
+    #[doc = " @param[in] domain The domain controlling this call"]
+    #[doc = " @param[in] clock_domain The clock domain controlling the execution of this call."]
+    #[doc = " @param[in] timestamp The user defined timestamp."]
+    #[doc = " @param[in] relation The kind of relation"]
+    #[doc = " @param[in] tail The ID for the tail of the relation"]
+    pub fn __itt_relation_add_to_current_ex(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        relation: __itt_relation,
+        tail: __itt_id,
+    );
+}
+extern "C" {
+    #[doc = " @ingroup clockdomain"]
+    #[doc = " @brief Add a relation between two instance identifiers."]
+    #[doc = " @param[in] domain The domain controlling this call"]
+    #[doc = " @param[in] clock_domain The clock domain controlling the execution of this call."]
+    #[doc = " @param[in] timestamp The user defined timestamp."]
+    #[doc = " @param[in] head The ID for the head of the relation"]
+    #[doc = " @param[in] relation The kind of relation"]
+    #[doc = " @param[in] tail The ID for the tail of the relation"]
+    pub fn __itt_relation_add_ex(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        head: __itt_id,
+        relation: __itt_relation,
+        tail: __itt_id,
+    );
+}
+pub type __itt_relation_add_to_current_ex_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        relation: __itt_relation,
+        tail: __itt_id,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_relation_add_to_current_ex_ptr__3_0:
+        __itt_relation_add_to_current_ex_ptr__3_0_t;
+}
+pub type __itt_relation_add_ex_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        domain: *const __itt_domain,
+        clock_domain: *mut __itt_clock_domain,
+        timestamp: ::std::os::raw::c_ulonglong,
+        head: __itt_id,
+        relation: __itt_relation,
+        tail: __itt_id,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_relation_add_ex_ptr__3_0: __itt_relation_add_ex_ptr__3_0_t;
+}
+pub const ___itt_track_group_type___itt_track_group_type_normal: ___itt_track_group_type = 0;
+#[doc = " @cond exclude_from_documentation"]
+pub type ___itt_track_group_type = u32;
+pub use self::___itt_track_group_type as __itt_track_group_type;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_track_group {
+    #[doc = "< Name of the track group"]
+    pub name: *mut __itt_string_handle,
+    #[doc = "< List of child tracks"]
+    pub track: *mut ___itt_track,
+    #[doc = "< Type of the track group"]
+    pub tgtype: __itt_track_group_type,
+    #[doc = "< Reserved. Must be zero"]
+    pub extra1: ::std::os::raw::c_int,
+    #[doc = "< Reserved. Must be zero"]
+    pub extra2: *mut ::std::os::raw::c_void,
+    pub next: *mut ___itt_track_group,
+}
+#[test]
+fn bindgen_test_layout____itt_track_group() {
+    assert_eq!(
+        ::std::mem::size_of::<___itt_track_group>(),
+        40usize,
+        concat!("Size of: ", stringify!(___itt_track_group))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<___itt_track_group>(),
+        8usize,
+        concat!("Alignment of ", stringify!(___itt_track_group))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track_group>())).name as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track_group),
+            "::",
+            stringify!(name)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track_group>())).track as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track_group),
+            "::",
+            stringify!(track)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track_group>())).tgtype as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track_group),
+            "::",
+            stringify!(tgtype)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track_group>())).extra1 as *const _ as usize },
+        20usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track_group),
+            "::",
+            stringify!(extra1)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track_group>())).extra2 as *const _ as usize },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track_group),
+            "::",
+            stringify!(extra2)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track_group>())).next as *const _ as usize },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track_group),
+            "::",
+            stringify!(next)
+        )
+    );
+}
+pub type __itt_track_group = ___itt_track_group;
+pub const ___itt_track_type___itt_track_type_normal: ___itt_track_type = 0;
+#[doc = " @brief Placeholder for custom track types. Currently, \"normal\" custom track"]
+#[doc = " is the only available track type."]
+pub type ___itt_track_type = u32;
+pub use self::___itt_track_type as __itt_track_type;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_track {
+    #[doc = "< Name of the track group"]
+    pub name: *mut __itt_string_handle,
+    #[doc = "< Parent group to a track"]
+    pub group: *mut __itt_track_group,
+    #[doc = "< Type of the track"]
+    pub ttype: __itt_track_type,
+    #[doc = "< Reserved. Must be zero"]
+    pub extra1: ::std::os::raw::c_int,
+    #[doc = "< Reserved. Must be zero"]
+    pub extra2: *mut ::std::os::raw::c_void,
+    pub next: *mut ___itt_track,
+}
+#[test]
+fn bindgen_test_layout____itt_track() {
+    assert_eq!(
+        ::std::mem::size_of::<___itt_track>(),
+        40usize,
+        concat!("Size of: ", stringify!(___itt_track))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<___itt_track>(),
+        8usize,
+        concat!("Alignment of ", stringify!(___itt_track))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track>())).name as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track),
+            "::",
+            stringify!(name)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track>())).group as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track),
+            "::",
+            stringify!(group)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track>())).ttype as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track),
+            "::",
+            stringify!(ttype)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track>())).extra1 as *const _ as usize },
+        20usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track),
+            "::",
+            stringify!(extra1)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track>())).extra2 as *const _ as usize },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track),
+            "::",
+            stringify!(extra2)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_track>())).next as *const _ as usize },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_track),
+            "::",
+            stringify!(next)
+        )
+    );
+}
+pub type __itt_track = ___itt_track;
+extern "C" {
+    #[doc = " @brief Create logical track group."]
+    pub fn __itt_track_group_create(
+        name: *mut __itt_string_handle,
+        track_group_type: __itt_track_group_type,
+    ) -> *mut __itt_track_group;
+}
+pub type __itt_track_group_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        name: *mut __itt_string_handle,
+        track_group_type: __itt_track_group_type,
+    ) -> *mut __itt_track_group,
+>;
+extern "C" {
+    pub static mut __itt_track_group_create_ptr__3_0: __itt_track_group_create_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Create logical track."]
+    pub fn __itt_track_create(
+        track_group: *mut __itt_track_group,
+        name: *mut __itt_string_handle,
+        track_type: __itt_track_type,
+    ) -> *mut __itt_track;
+}
+pub type __itt_track_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        track_group: *mut __itt_track_group,
+        name: *mut __itt_string_handle,
+        track_type: __itt_track_type,
+    ) -> *mut __itt_track,
+>;
+extern "C" {
+    pub static mut __itt_track_create_ptr__3_0: __itt_track_create_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Set the logical track."]
+    pub fn __itt_set_track(track: *mut __itt_track);
+}
+pub type __itt_set_track_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(track: *mut __itt_track)>;
+extern "C" {
+    pub static mut __itt_set_track_ptr__3_0: __itt_set_track_ptr__3_0_t;
+}
+#[doc = " @cond exclude_from_gpa_documentation */"]
+#[doc = " @defgroup events Events"]
+#[doc = " @ingroup public"]
+#[doc = " Events group"]
+#[doc = " @{"]
+pub type __itt_event = ::std::os::raw::c_int;
+extern "C" {
+    pub fn __itt_event_create(
+        name: *const ::std::os::raw::c_char,
+        namelen: ::std::os::raw::c_int,
+    ) -> __itt_event;
+}
+pub type __itt_event_create_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        name: *const ::std::os::raw::c_char,
+        namelen: ::std::os::raw::c_int,
+    ) -> __itt_event,
+>;
+extern "C" {
+    pub static mut __itt_event_create_ptr__3_0: __itt_event_create_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Record an event occurrence."]
+    #[doc = " @return __itt_err upon failure (invalid event id/user event feature not enabled)"]
+    pub fn __itt_event_start(event: __itt_event) -> ::std::os::raw::c_int;
+}
+pub type __itt_event_start_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(event: __itt_event) -> ::std::os::raw::c_int>;
+extern "C" {
+    pub static mut __itt_event_start_ptr__3_0: __itt_event_start_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Record an event end occurrence."]
+    #[doc = " @note It is optional if events do not have durations."]
+    #[doc = " @return __itt_err upon failure (invalid event id/user event feature not enabled)"]
+    pub fn __itt_event_end(event: __itt_event) -> ::std::os::raw::c_int;
+}
+pub type __itt_event_end_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(event: __itt_event) -> ::std::os::raw::c_int>;
+extern "C" {
+    pub static mut __itt_event_end_ptr__3_0: __itt_event_end_ptr__3_0_t;
+}
+pub const __itt_av_data_type___itt_e_first: __itt_av_data_type = 0;
+pub const __itt_av_data_type___itt_e_char: __itt_av_data_type = 0;
+pub const __itt_av_data_type___itt_e_uchar: __itt_av_data_type = 1;
+pub const __itt_av_data_type___itt_e_int16: __itt_av_data_type = 2;
+pub const __itt_av_data_type___itt_e_uint16: __itt_av_data_type = 3;
+pub const __itt_av_data_type___itt_e_int32: __itt_av_data_type = 4;
+pub const __itt_av_data_type___itt_e_uint32: __itt_av_data_type = 5;
+pub const __itt_av_data_type___itt_e_int64: __itt_av_data_type = 6;
+pub const __itt_av_data_type___itt_e_uint64: __itt_av_data_type = 7;
+pub const __itt_av_data_type___itt_e_float: __itt_av_data_type = 8;
+pub const __itt_av_data_type___itt_e_double: __itt_av_data_type = 9;
+pub const __itt_av_data_type___itt_e_last: __itt_av_data_type = 9;
+#[doc = " @enum __itt_av_data_type"]
+#[doc = " @brief Defines types of arrays data (for C/C++ intrinsic types)"]
+pub type __itt_av_data_type = u32;
+extern "C" {
+    pub fn __itt_av_save(
+        data: *mut ::std::os::raw::c_void,
+        rank: ::std::os::raw::c_int,
+        dimensions: *const ::std::os::raw::c_int,
+        type_: ::std::os::raw::c_int,
+        filePath: *const ::std::os::raw::c_char,
+        columnOrder: ::std::os::raw::c_int,
+    ) -> ::std::os::raw::c_int;
+}
+pub type __itt_av_save_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        data: *mut ::std::os::raw::c_void,
+        rank: ::std::os::raw::c_int,
+        dimensions: *const ::std::os::raw::c_int,
+        type_: ::std::os::raw::c_int,
+        filePath: *const ::std::os::raw::c_char,
+        columnOrder: ::std::os::raw::c_int,
+    ) -> ::std::os::raw::c_int,
+>;
+extern "C" {
+    pub static mut __itt_av_save_ptr__3_0: __itt_av_save_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @endcond"]
+    pub fn __itt_enable_attach();
+}
+pub type __itt_enable_attach_ptr__3_0_t = ::std::option::Option<unsafe extern "C" fn()>;
+extern "C" {
+    pub static mut __itt_enable_attach_ptr__3_0: __itt_enable_attach_ptr__3_0_t;
+}
+extern "C" {
+    pub fn __itt_module_load(
+        start_addr: *mut ::std::os::raw::c_void,
+        end_addr: *mut ::std::os::raw::c_void,
+        path: *const ::std::os::raw::c_char,
+    );
+}
+pub type __itt_module_load_ptr__3_0_t = ::std::option::Option<
+    unsafe extern "C" fn(
+        start_addr: *mut ::std::os::raw::c_void,
+        end_addr: *mut ::std::os::raw::c_void,
+        path: *const ::std::os::raw::c_char,
+    ),
+>;
+extern "C" {
+    pub static mut __itt_module_load_ptr__3_0: __itt_module_load_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Report module unload"]
+    #[doc = " This API is used to report necessary information in case of bypassing default system loader."]
+    #[doc = " Notification should be done just before the module is unloaded from process memory."]
+    #[doc = " @param[in] addr - base address of loaded module"]
+    pub fn __itt_module_unload(addr: *mut ::std::os::raw::c_void);
+}
+pub type __itt_module_unload_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(addr: *mut ::std::os::raw::c_void)>;
+extern "C" {
+    pub static mut __itt_module_unload_ptr__3_0: __itt_module_unload_ptr__3_0_t;
+}
+pub const __itt_module_type___itt_module_type_unknown: __itt_module_type = 0;
+pub const __itt_module_type___itt_module_type_elf: __itt_module_type = 1;
+pub const __itt_module_type___itt_module_type_coff: __itt_module_type = 2;
+#[doc = " @cond exclude_from_documentation"]
+pub type __itt_module_type = u32;
+pub const __itt_section_type_itt_section_type_unknown: __itt_section_type = 0;
+pub const __itt_section_type_itt_section_type_bss: __itt_section_type = 1;
+pub const __itt_section_type_itt_section_type_data: __itt_section_type = 2;
+pub const __itt_section_type_itt_section_type_text: __itt_section_type = 3;
+#[doc = " @cond exclude_from_documentation"]
+pub type __itt_section_type = u32;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_section_info {
+    #[doc = "< Section name in UTF8"]
+    pub name: *const ::std::os::raw::c_char,
+    #[doc = "< Section content and semantics description"]
+    pub type_: __itt_section_type,
+    #[doc = "< Section bit flags that describe attributes using bit mask"]
+    #[doc = " Zero if disabled, non-zero if enabled"]
+    pub flags: usize,
+    #[doc = "< Section load(relocated) start address"]
+    pub start_addr: *mut ::std::os::raw::c_void,
+    #[doc = "< Section file offset"]
+    pub size: usize,
+    #[doc = "< Section size"]
+    pub file_offset: usize,
+}
+#[test]
+fn bindgen_test_layout____itt_section_info() {
+    assert_eq!(
+        ::std::mem::size_of::<___itt_section_info>(),
+        48usize,
+        concat!("Size of: ", stringify!(___itt_section_info))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<___itt_section_info>(),
+        8usize,
+        concat!("Alignment of ", stringify!(___itt_section_info))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_section_info>())).name as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_section_info),
+            "::",
+            stringify!(name)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_section_info>())).type_ as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_section_info),
+            "::",
+            stringify!(type_)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_section_info>())).flags as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_section_info),
+            "::",
+            stringify!(flags)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_section_info>())).start_addr as *const _ as usize },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_section_info),
+            "::",
+            stringify!(start_addr)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_section_info>())).size as *const _ as usize },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_section_info),
+            "::",
+            stringify!(size)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_section_info>())).file_offset as *const _ as usize },
+        40usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_section_info),
+            "::",
+            stringify!(file_offset)
+        )
+    );
+}
+pub type __itt_section_info = ___itt_section_info;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ___itt_module_object {
+    #[doc = "< API version"]
+    pub version: ::std::os::raw::c_uint,
+    #[doc = "< Unique identifier. This is unchanged for sections that belong to the same module"]
+    pub module_id: __itt_id,
+    #[doc = "< Binary module format"]
+    pub module_type: __itt_module_type,
+    #[doc = "< Unique module name or path to module in UTF8"]
+    #[doc = " Contains module name when module_bufer and module_size exist"]
+    #[doc = " Contains module path when module_bufer and module_size absent"]
+    #[doc = " module_name remains the same for the certain module_id"]
+    pub module_name: *const ::std::os::raw::c_char,
+    #[doc = "< Module buffer content"]
+    pub module_buffer: *mut ::std::os::raw::c_void,
+    #[doc = "< Module buffer size */"]
+    #[doc = " If module_buffer and module_size do not exist,"]
+    #[doc = " the binary module exists on the system already."]
+    #[doc = " The module_name parameter contains the path to the module."]
+    pub module_size: usize,
+    #[doc = "< Reference to section information"]
+    pub section_array: *mut __itt_section_info,
+    pub section_number: usize,
+}
+#[test]
+fn bindgen_test_layout____itt_module_object() {
+    assert_eq!(
+        ::std::mem::size_of::<___itt_module_object>(),
+        80usize,
+        concat!("Size of: ", stringify!(___itt_module_object))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<___itt_module_object>(),
+        8usize,
+        concat!("Alignment of ", stringify!(___itt_module_object))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_module_object>())).version as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_module_object),
+            "::",
+            stringify!(version)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<___itt_module_object>())).module_id as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_module_object),
+            "::",
+            stringify!(module_id)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<___itt_module_object>())).module_type as *const _ as usize
+        },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_module_object),
+            "::",
+            stringify!(module_type)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<___itt_module_object>())).module_name as *const _ as usize
+        },
+        40usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_module_object),
+            "::",
+            stringify!(module_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<___itt_module_object>())).module_buffer as *const _ as usize
+        },
+        48usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_module_object),
+            "::",
+            stringify!(module_buffer)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<___itt_module_object>())).module_size as *const _ as usize
+        },
+        56usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_module_object),
+            "::",
+            stringify!(module_size)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<___itt_module_object>())).section_array as *const _ as usize
+        },
+        64usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_module_object),
+            "::",
+            stringify!(section_array)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<___itt_module_object>())).section_number as *const _ as usize
+        },
+        72usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(___itt_module_object),
+            "::",
+            stringify!(section_number)
+        )
+    );
+}
+pub type __itt_module_object = ___itt_module_object;
+extern "C" {
+    #[doc = " @brief Load module content and its loaded(relocated) sections."]
+    #[doc = " This API is useful to save a module, or specify its location on the system and report information about loaded sections."]
+    #[doc = " The target module is saved on the system if module buffer content and size are available."]
+    #[doc = " If module buffer content and size are unavailable, the module name contains the path to the existing binary module."]
+    #[doc = " @param[in] module_obj - provides module and section information, along with unique module identifiers (name,module ID)"]
+    #[doc = " which bind the binary module to particular sections."]
+    pub fn __itt_module_load_with_sections(module_obj: *mut __itt_module_object);
+}
+pub type __itt_module_load_with_sections_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(module_obj: *mut __itt_module_object)>;
+extern "C" {
+    pub static mut __itt_module_load_with_sections_ptr__3_0:
+        __itt_module_load_with_sections_ptr__3_0_t;
+}
+extern "C" {
+    #[doc = " @brief Unload a module and its loaded(relocated) sections."]
+    #[doc = " This API notifies that the module and its sections were unloaded."]
+    #[doc = " @param[in] module_obj - provides module and sections information, along with unique module identifiers (name,module ID)"]
+    #[doc = " which bind the binary module to particular sections."]
+    pub fn __itt_module_unload_with_sections(module_obj: *mut __itt_module_object);
+}
+pub type __itt_module_unload_with_sections_ptr__3_0_t =
+    ::std::option::Option<unsafe extern "C" fn(module_obj: *mut __itt_module_object)>;
+extern "C" {
+    pub static mut __itt_module_unload_with_sections_ptr__3_0:
+        __itt_module_unload_with_sections_ptr__3_0_t;
+}
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/src/jitprofiling_bindings.rs b/deps/v8/third_party/ittapi/ittapi-rs/src/jitprofiling_bindings.rs
new file mode 100644
index 00000000000000..3b3bc23f646480
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/src/jitprofiling_bindings.rs
@@ -0,0 +1,1002 @@
+/* automatically generated by rust-bindgen */
+
+#[doc = "<\\brief Send this to shutdown the agent."]
+#[doc = " Use NULL for event data."]
+pub const iJIT_jvm_event_iJVM_EVENT_TYPE_SHUTDOWN: iJIT_jvm_event = 2;
+#[doc = "<\\brief Send when dynamic code is"]
+#[doc = " JIT compiled and loaded into"]
+#[doc = " memory by the JIT engine, but"]
+#[doc = " before the code is executed."]
+#[doc = " Use iJIT_Method_Load as event"]
+#[doc = " data."]
+pub const iJIT_jvm_event_iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED: iJIT_jvm_event = 13;
+#[doc = "<\\brief Send when compiled dynamic"]
+#[doc = " code is being unloaded from memory."]
+#[doc = " Use iJIT_Method_Load as event data."]
+pub const iJIT_jvm_event_iJVM_EVENT_TYPE_METHOD_UNLOAD_START: iJIT_jvm_event = 14;
+#[doc = "<\\brief Send to provide new content for"]
+#[doc = " a previously reported dynamic code."]
+#[doc = " The previous content will be invalidated"]
+#[doc = " starting from the time of the notification."]
+#[doc = " Use iJIT_Method_Load as event data but"]
+#[doc = " required fields are following:"]
+#[doc = " - method_id    identify the code to update."]
+#[doc = " - method_load_address    specify start address"]
+#[doc = "                          within identified code range"]
+#[doc = "                          where update should be started."]
+#[doc = " - method_size            specify length of updated code"]
+#[doc = "                          range."]
+pub const iJIT_jvm_event_iJVM_EVENT_TYPE_METHOD_UPDATE: iJIT_jvm_event = 15;
+#[doc = "<\\brief Send when an inline dynamic"]
+#[doc = " code is JIT compiled and loaded"]
+#[doc = " into memory by the JIT engine,"]
+#[doc = " but before the parent code region"]
+#[doc = " starts executing."]
+#[doc = " Use iJIT_Method_Inline_Load as event data."]
+pub const iJIT_jvm_event_iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED: iJIT_jvm_event = 16;
+#[doc = " @cond exclude_from_documentation"]
+pub const iJIT_jvm_event_iJVM_EVENT_TYPE_METHOD_UPDATE_V2: iJIT_jvm_event = 17;
+#[doc = "<\\brief Send when a dynamic code is"]
+#[doc = " JIT compiled and loaded into"]
+#[doc = " memory by the JIT engine, but"]
+#[doc = " before the code is executed."]
+#[doc = " Use iJIT_Method_Load_V2 as event data."]
+pub const iJIT_jvm_event_iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V2: iJIT_jvm_event = 21;
+#[doc = "<\\brief Send when a dynamic code is"]
+#[doc = " JIT compiled and loaded into"]
+#[doc = " memory by the JIT engine, but"]
+#[doc = " before the code is executed."]
+#[doc = " Use iJIT_Method_Load_V3 as event data."]
+pub const iJIT_jvm_event_iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V3: iJIT_jvm_event = 22;
+#[doc = " @brief Enumerator for the types of notifications"]
+pub type iJIT_jvm_event = u32;
+pub use self::iJIT_jvm_event as iJIT_JVM_EVENT;
+#[doc = "<\\brief The agent is not running;"]
+#[doc = " iJIT_NotifyEvent calls will"]
+#[doc = " not be processed."]
+pub const _iJIT_IsProfilingActiveFlags_iJIT_NOTHING_RUNNING: _iJIT_IsProfilingActiveFlags = 0;
+#[doc = "<\\brief The agent is running and"]
+#[doc = " ready to process notifications."]
+pub const _iJIT_IsProfilingActiveFlags_iJIT_SAMPLING_ON: _iJIT_IsProfilingActiveFlags = 1;
+#[doc = " @brief Enumerator for the agent's mode"]
+pub type _iJIT_IsProfilingActiveFlags = u32;
+pub use self::_iJIT_IsProfilingActiveFlags as iJIT_IsProfilingActiveFlags;
+#[doc = " @brief Description of a single entry in the line number information of a code region."]
+#[doc = " @details A table of line number entries gives information about how the reported code region"]
+#[doc = " is mapped to source file."]
+#[doc = " Intel(R) VTune(TM) Amplifier uses line number information to attribute"]
+#[doc = " the samples (virtual address) to a line number. \\n"]
+#[doc = " It is acceptable to report different code addresses for the same source line:"]
+#[doc = " @code"]
+#[doc = "   Offset LineNumber"]
+#[doc = "      1       2"]
+#[doc = "      12      4"]
+#[doc = "      15      2"]
+#[doc = "      18      1"]
+#[doc = "      21      30"]
+#[doc = ""]
+#[doc = "  VTune Amplifier constructs the following table using the client data"]
+#[doc = ""]
+#[doc = "   Code subrange  Line number"]
+#[doc = "      0-1             2"]
+#[doc = "      1-12            4"]
+#[doc = "      12-15           2"]
+#[doc = "      15-18           1"]
+#[doc = "      18-21           30"]
+#[doc = " @endcode"]
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct _LineNumberInfo {
+    #[doc = "<\\brief Offset from the begining of the code region."]
+    pub Offset: ::std::os::raw::c_uint,
+    #[doc = "<\\brief Matching source line number offset (from beginning of source file)."]
+    pub LineNumber: ::std::os::raw::c_uint,
+}
+#[test]
+fn bindgen_test_layout__LineNumberInfo() {
+    assert_eq!(
+        ::std::mem::size_of::<_LineNumberInfo>(),
+        8usize,
+        concat!("Size of: ", stringify!(_LineNumberInfo))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<_LineNumberInfo>(),
+        4usize,
+        concat!("Alignment of ", stringify!(_LineNumberInfo))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_LineNumberInfo>())).Offset as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_LineNumberInfo),
+            "::",
+            stringify!(Offset)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_LineNumberInfo>())).LineNumber as *const _ as usize },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_LineNumberInfo),
+            "::",
+            stringify!(LineNumber)
+        )
+    );
+}
+pub type pLineNumberInfo = *mut _LineNumberInfo;
+pub type LineNumberInfo = _LineNumberInfo;
+#[doc = "<\\brief Native to the process architecture that is calling it."]
+pub const _iJIT_CodeArchitecture_iJIT_CA_NATIVE: _iJIT_CodeArchitecture = 0;
+#[doc = "<\\brief 32-bit machine code."]
+pub const _iJIT_CodeArchitecture_iJIT_CA_32: _iJIT_CodeArchitecture = 1;
+#[doc = "<\\brief 64-bit machine code."]
+pub const _iJIT_CodeArchitecture_iJIT_CA_64: _iJIT_CodeArchitecture = 2;
+#[doc = " @brief Enumerator for the code architecture."]
+pub type _iJIT_CodeArchitecture = u32;
+pub use self::_iJIT_CodeArchitecture as iJIT_CodeArchitecture;
+#[doc = " @brief Description of a JIT-compiled method"]
+#[doc = " @details When you use the iJIT_Method_Load structure to describe"]
+#[doc = "  the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED"]
+#[doc = "  as an event type to report it."]
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct _iJIT_Method_Load {
+    #[doc = "<\\brief Unique method ID. Cannot be 0."]
+    #[doc = "  You must either use the API function"]
+    #[doc = "  iJIT_GetNewMethodID to get a valid and unique"]
+    #[doc = "  method ID, or else manage ID uniqueness"]
+    #[doc = "  and correct range by yourself.\\n"]
+    #[doc = "  You must use the same method ID for all code"]
+    #[doc = "  regions of the same method, otherwise different"]
+    #[doc = "  method IDs specify different methods."]
+    pub method_id: ::std::os::raw::c_uint,
+    #[doc = "<\\brief The name of the method. It can be optionally"]
+    #[doc = "  prefixed with its class name and appended with"]
+    #[doc = "  its complete signature. Can't be NULL."]
+    pub method_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief The start virtual address of the method code"]
+    #[doc = "  region. If NULL, data provided with"]
+    #[doc = "  event are not accepted."]
+    pub method_load_address: *mut ::std::os::raw::c_void,
+    #[doc = "<\\brief The code size of the method in memory."]
+    #[doc = "  If 0, then data provided with the event are not"]
+    #[doc = "  accepted."]
+    pub method_size: ::std::os::raw::c_uint,
+    #[doc = "<\\brief The number of entries in the line number"]
+    #[doc = "  table.0 if none."]
+    pub line_number_size: ::std::os::raw::c_uint,
+    #[doc = "<\\brief Pointer to the line numbers info"]
+    #[doc = "  array. Can be NULL if"]
+    #[doc = "  line_number_size is 0. See"]
+    #[doc = "  LineNumberInfo Structure for a"]
+    #[doc = "  description of a single entry in"]
+    #[doc = "  the line number info array"]
+    pub line_number_table: pLineNumberInfo,
+    #[doc = "<\\brief This field is obsolete."]
+    pub class_id: ::std::os::raw::c_uint,
+    #[doc = "<\\brief Class name. Can be NULL."]
+    pub class_file_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief Source file name. Can be NULL."]
+    pub source_file_name: *mut ::std::os::raw::c_char,
+}
+#[test]
+fn bindgen_test_layout__iJIT_Method_Load() {
+    assert_eq!(
+        ::std::mem::size_of::<_iJIT_Method_Load>(),
+        64usize,
+        concat!("Size of: ", stringify!(_iJIT_Method_Load))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<_iJIT_Method_Load>(),
+        8usize,
+        concat!("Alignment of ", stringify!(_iJIT_Method_Load))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_iJIT_Method_Load>())).method_id as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load),
+            "::",
+            stringify!(method_id)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_iJIT_Method_Load>())).method_name as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load),
+            "::",
+            stringify!(method_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load>())).method_load_address as *const _ as usize
+        },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load),
+            "::",
+            stringify!(method_load_address)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_iJIT_Method_Load>())).method_size as *const _ as usize },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load),
+            "::",
+            stringify!(method_size)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load>())).line_number_size as *const _ as usize
+        },
+        28usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load),
+            "::",
+            stringify!(line_number_size)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load>())).line_number_table as *const _ as usize
+        },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load),
+            "::",
+            stringify!(line_number_table)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_iJIT_Method_Load>())).class_id as *const _ as usize },
+        40usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load),
+            "::",
+            stringify!(class_id)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load>())).class_file_name as *const _ as usize
+        },
+        48usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load),
+            "::",
+            stringify!(class_file_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load>())).source_file_name as *const _ as usize
+        },
+        56usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load),
+            "::",
+            stringify!(source_file_name)
+        )
+    );
+}
+pub type piJIT_Method_Load = *mut _iJIT_Method_Load;
+pub type iJIT_Method_Load = _iJIT_Method_Load;
+#[doc = " @brief Description of a JIT-compiled method"]
+#[doc = " @details When you use the iJIT_Method_Load_V2 structure to describe"]
+#[doc = "  the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V2"]
+#[doc = "  as an event type to report it."]
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct _iJIT_Method_Load_V2 {
+    #[doc = "<\\brief Unique method ID. Cannot be 0."]
+    #[doc = "  You must either use the API function"]
+    #[doc = "  iJIT_GetNewMethodID to get a valid and unique"]
+    #[doc = "  method ID, or else manage ID uniqueness"]
+    #[doc = "  and correct range by yourself.\\n"]
+    #[doc = "  You must use the same method ID for all code"]
+    #[doc = "  regions of the same method, otherwise different"]
+    #[doc = "  method IDs specify different methods."]
+    pub method_id: ::std::os::raw::c_uint,
+    #[doc = "<\\brief The name of the method. It can be optionally"]
+    #[doc = "  prefixed with its class name and appended with"]
+    #[doc = "  its complete signature. Can't be  NULL."]
+    pub method_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief The start virtual address of the method code"]
+    #[doc = "  region. If NULL, then data provided with the"]
+    #[doc = "  event are not accepted."]
+    pub method_load_address: *mut ::std::os::raw::c_void,
+    #[doc = "<\\brief The code size of the method in memory."]
+    #[doc = "  If 0, then data provided with the event are not"]
+    #[doc = "  accepted."]
+    pub method_size: ::std::os::raw::c_uint,
+    #[doc = "<\\brief The number of entries in the line number"]
+    #[doc = "  table. 0 if none."]
+    pub line_number_size: ::std::os::raw::c_uint,
+    #[doc = "<\\brief Pointer to the line numbers info"]
+    #[doc = "  array. Can be NULL if"]
+    #[doc = "  line_number_size is 0. See"]
+    #[doc = "  LineNumberInfo Structure for a"]
+    #[doc = "  description of a single entry in"]
+    #[doc = "  the line number info array."]
+    pub line_number_table: pLineNumberInfo,
+    #[doc = "<\\brief Class name. Can be NULL."]
+    pub class_file_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief Source file name. Can be NULL."]
+    pub source_file_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief Module name. Can be NULL."]
+    #[doc = "The module name can be useful for distinguishing among"]
+    #[doc = "different JIT engines. VTune Amplifier will display"]
+    #[doc = "reported methods grouped by specific module."]
+    pub module_name: *mut ::std::os::raw::c_char,
+}
+#[test]
+fn bindgen_test_layout__iJIT_Method_Load_V2() {
+    assert_eq!(
+        ::std::mem::size_of::<_iJIT_Method_Load_V2>(),
+        64usize,
+        concat!("Size of: ", stringify!(_iJIT_Method_Load_V2))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<_iJIT_Method_Load_V2>(),
+        8usize,
+        concat!("Alignment of ", stringify!(_iJIT_Method_Load_V2))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_iJIT_Method_Load_V2>())).method_id as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V2),
+            "::",
+            stringify!(method_id)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V2>())).method_name as *const _ as usize
+        },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V2),
+            "::",
+            stringify!(method_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V2>())).method_load_address as *const _
+                as usize
+        },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V2),
+            "::",
+            stringify!(method_load_address)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V2>())).method_size as *const _ as usize
+        },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V2),
+            "::",
+            stringify!(method_size)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V2>())).line_number_size as *const _ as usize
+        },
+        28usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V2),
+            "::",
+            stringify!(line_number_size)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V2>())).line_number_table as *const _ as usize
+        },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V2),
+            "::",
+            stringify!(line_number_table)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V2>())).class_file_name as *const _ as usize
+        },
+        40usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V2),
+            "::",
+            stringify!(class_file_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V2>())).source_file_name as *const _ as usize
+        },
+        48usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V2),
+            "::",
+            stringify!(source_file_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V2>())).module_name as *const _ as usize
+        },
+        56usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V2),
+            "::",
+            stringify!(module_name)
+        )
+    );
+}
+pub type piJIT_Method_Load_V2 = *mut _iJIT_Method_Load_V2;
+pub type iJIT_Method_Load_V2 = _iJIT_Method_Load_V2;
+#[doc = " @brief Description of a JIT-compiled method"]
+#[doc = " @details The iJIT_Method_Load_V3 structure is the same as iJIT_Method_Load_V2"]
+#[doc = "  with a newly introduced 'arch' field that specifies architecture of the code region."]
+#[doc = "  When you use the iJIT_Method_Load_V3 structure to describe"]
+#[doc = "  the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V3"]
+#[doc = "  as an event type to report it."]
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct _iJIT_Method_Load_V3 {
+    #[doc = "<\\brief Unique method ID. Cannot be 0."]
+    #[doc = "  You must either use the API function"]
+    #[doc = "  iJIT_GetNewMethodID to get a valid and unique"]
+    #[doc = "  method ID, or manage ID uniqueness"]
+    #[doc = "  and correct range by yourself.\\n"]
+    #[doc = "  You must use the same method ID for all code"]
+    #[doc = "  regions of the same method, otherwise they are"]
+    #[doc = "  treated as regions of different methods."]
+    pub method_id: ::std::os::raw::c_uint,
+    #[doc = "<\\brief The name of the method. It can be optionally"]
+    #[doc = "  prefixed with its class name and appended with"]
+    #[doc = "  its complete signature. Cannot be  NULL."]
+    pub method_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief The start virtual address of the method code"]
+    #[doc = "  region. If NULL, then data provided with the"]
+    #[doc = "  event are not accepted."]
+    pub method_load_address: *mut ::std::os::raw::c_void,
+    #[doc = "<\\brief The code size of the method in memory."]
+    #[doc = "  If 0, then data provided with the event are not"]
+    #[doc = "  accepted."]
+    pub method_size: ::std::os::raw::c_uint,
+    #[doc = "<\\brief The number of entries in the line number"]
+    #[doc = "  table. 0 if none."]
+    pub line_number_size: ::std::os::raw::c_uint,
+    #[doc = "<\\brief Pointer to the line numbers info"]
+    #[doc = "  array. Can be NULL if"]
+    #[doc = "  line_number_size is 0. See"]
+    #[doc = "  LineNumberInfo Structure for a"]
+    #[doc = "  description of a single entry in"]
+    #[doc = "  the line number info array."]
+    pub line_number_table: pLineNumberInfo,
+    #[doc = "<\\brief Class name. Can be NULL."]
+    pub class_file_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief Source file name. Can be NULL."]
+    pub source_file_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief Module name. Can be NULL."]
+    #[doc = "  The module name can be useful for distinguishing among"]
+    #[doc = "  different JIT engines. VTune Amplifier will display"]
+    #[doc = "  reported methods grouped by specific module."]
+    pub module_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief Architecture of the method's code region."]
+    #[doc = "  By default, it is the same as the process"]
+    #[doc = "  architecture that is calling it."]
+    #[doc = "  For example, you can use it if your 32-bit JIT"]
+    #[doc = "  engine generates 64-bit code."]
+    #[doc = ""]
+    #[doc = "  If JIT engine reports both 32-bit and 64-bit types"]
+    #[doc = "  of methods then VTune Amplifier splits the methods"]
+    #[doc = "  with the same module name but with different"]
+    #[doc = "  architectures in two different modules. VTune Amplifier"]
+    #[doc = "  modifies the original name provided with a 64-bit method"]
+    #[doc = "  version by ending it with '(64)'"]
+    pub module_arch: iJIT_CodeArchitecture,
+}
+#[test]
+fn bindgen_test_layout__iJIT_Method_Load_V3() {
+    assert_eq!(
+        ::std::mem::size_of::<_iJIT_Method_Load_V3>(),
+        72usize,
+        concat!("Size of: ", stringify!(_iJIT_Method_Load_V3))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<_iJIT_Method_Load_V3>(),
+        8usize,
+        concat!("Alignment of ", stringify!(_iJIT_Method_Load_V3))
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).method_id as *const _ as usize },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(method_id)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).method_name as *const _ as usize
+        },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(method_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).method_load_address as *const _
+                as usize
+        },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(method_load_address)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).method_size as *const _ as usize
+        },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(method_size)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).line_number_size as *const _ as usize
+        },
+        28usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(line_number_size)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).line_number_table as *const _ as usize
+        },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(line_number_table)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).class_file_name as *const _ as usize
+        },
+        40usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(class_file_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).source_file_name as *const _ as usize
+        },
+        48usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(source_file_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).module_name as *const _ as usize
+        },
+        56usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(module_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Load_V3>())).module_arch as *const _ as usize
+        },
+        64usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Load_V3),
+            "::",
+            stringify!(module_arch)
+        )
+    );
+}
+pub type piJIT_Method_Load_V3 = *mut _iJIT_Method_Load_V3;
+pub type iJIT_Method_Load_V3 = _iJIT_Method_Load_V3;
+#[doc = " @brief Description of an inline JIT-compiled method"]
+#[doc = " @details When you use the_iJIT_Method_Inline_Load structure to describe"]
+#[doc = "  the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED"]
+#[doc = "  as an event type to report it."]
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct _iJIT_Method_Inline_Load {
+    #[doc = "<\\brief Unique method ID. Cannot be 0."]
+    #[doc = "  You must either use the API function"]
+    #[doc = "  iJIT_GetNewMethodID to get a valid and unique"]
+    #[doc = "  method ID, or else manage ID uniqueness"]
+    #[doc = "  and correct range by yourself."]
+    pub method_id: ::std::os::raw::c_uint,
+    #[doc = "<\\brief Unique immediate parent's method ID."]
+    #[doc = "  Cannot be 0."]
+    #[doc = "  You must either use the API function"]
+    #[doc = "  iJIT_GetNewMethodID to get a valid and unique"]
+    #[doc = "  method ID, or else manage ID uniqueness"]
+    #[doc = "  and correct range by yourself."]
+    pub parent_method_id: ::std::os::raw::c_uint,
+    #[doc = "<\\brief The name of the method. It can be optionally"]
+    #[doc = "  prefixed with its class name and appended with"]
+    #[doc = "  its complete signature. Can't be NULL."]
+    pub method_name: *mut ::std::os::raw::c_char,
+    pub method_load_address: *mut ::std::os::raw::c_void,
+    #[doc = "<\\brief The code size of the method in memory."]
+    #[doc = "  If 0, then data provided with the event are not"]
+    #[doc = "  accepted."]
+    pub method_size: ::std::os::raw::c_uint,
+    #[doc = "<\\brief The number of entries in the line number"]
+    #[doc = "  table. 0 if none."]
+    pub line_number_size: ::std::os::raw::c_uint,
+    #[doc = "<\\brief Pointer to the line numbers info"]
+    #[doc = "  array. Can be NULL if"]
+    #[doc = "  line_number_size is 0. See"]
+    #[doc = "  LineNumberInfo Structure for a"]
+    #[doc = "  description of a single entry in"]
+    #[doc = "  the line number info array"]
+    pub line_number_table: pLineNumberInfo,
+    #[doc = "<\\brief Class name. Can be NULL."]
+    pub class_file_name: *mut ::std::os::raw::c_char,
+    #[doc = "<\\brief Source file name. Can be NULL."]
+    pub source_file_name: *mut ::std::os::raw::c_char,
+}
+#[test]
+fn bindgen_test_layout__iJIT_Method_Inline_Load() {
+    assert_eq!(
+        ::std::mem::size_of::<_iJIT_Method_Inline_Load>(),
+        56usize,
+        concat!("Size of: ", stringify!(_iJIT_Method_Inline_Load))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<_iJIT_Method_Inline_Load>(),
+        8usize,
+        concat!("Alignment of ", stringify!(_iJIT_Method_Inline_Load))
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Inline_Load>())).method_id as *const _ as usize
+        },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Inline_Load),
+            "::",
+            stringify!(method_id)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Inline_Load>())).parent_method_id as *const _
+                as usize
+        },
+        4usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Inline_Load),
+            "::",
+            stringify!(parent_method_id)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Inline_Load>())).method_name as *const _ as usize
+        },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Inline_Load),
+            "::",
+            stringify!(method_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Inline_Load>())).method_load_address as *const _
+                as usize
+        },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Inline_Load),
+            "::",
+            stringify!(method_load_address)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Inline_Load>())).method_size as *const _ as usize
+        },
+        24usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Inline_Load),
+            "::",
+            stringify!(method_size)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Inline_Load>())).line_number_size as *const _
+                as usize
+        },
+        28usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Inline_Load),
+            "::",
+            stringify!(line_number_size)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Inline_Load>())).line_number_table as *const _
+                as usize
+        },
+        32usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Inline_Load),
+            "::",
+            stringify!(line_number_table)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Inline_Load>())).class_file_name as *const _
+                as usize
+        },
+        40usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Inline_Load),
+            "::",
+            stringify!(class_file_name)
+        )
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Inline_Load>())).source_file_name as *const _
+                as usize
+        },
+        48usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Inline_Load),
+            "::",
+            stringify!(source_file_name)
+        )
+    );
+}
+pub type piJIT_Method_Inline_Load = *mut _iJIT_Method_Inline_Load;
+pub type iJIT_Method_Inline_Load = _iJIT_Method_Inline_Load;
+pub const _iJIT_SegmentType_iJIT_CT_UNKNOWN: _iJIT_SegmentType = 0;
+#[doc = "<\\brief Executable code."]
+pub const _iJIT_SegmentType_iJIT_CT_CODE: _iJIT_SegmentType = 1;
+#[doc = "<\\brief Data (not executable code)."]
+#[doc = " VTune Amplifier uses the format string"]
+#[doc = " (see iJIT_Method_Update) to represent"]
+#[doc = " this data in the VTune Amplifier GUI"]
+pub const _iJIT_SegmentType_iJIT_CT_DATA: _iJIT_SegmentType = 2;
+#[doc = "<\\brief Use the previous markup for the trace."]
+#[doc = " Can be used for the following"]
+#[doc = " iJVM_EVENT_TYPE_METHOD_UPDATE_V2 events,"]
+#[doc = " if the type of the previously reported segment"]
+#[doc = " type is the same."]
+pub const _iJIT_SegmentType_iJIT_CT_KEEP: _iJIT_SegmentType = 3;
+pub const _iJIT_SegmentType_iJIT_CT_EOF: _iJIT_SegmentType = 4;
+#[doc = " @cond exclude_from_documentation */"]
+#[doc = " @brief Description of a segment type"]
+#[doc = " @details Use the segment type to specify a type of data supplied"]
+#[doc = " with the iJVM_EVENT_TYPE_METHOD_UPDATE_V2 event to be applied to"]
+#[doc = " a certain code trace."]
+pub type _iJIT_SegmentType = u32;
+pub use self::_iJIT_SegmentType as iJIT_SegmentType;
+#[doc = " @brief Description of a dynamic update of the content within JIT-compiled method"]
+#[doc = " @details The JIT engine may generate the methods that are updated at runtime"]
+#[doc = " partially by mixed (data + executable code) content. When you use the iJIT_Method_Update"]
+#[doc = " structure to describe the update of the content within a JIT-compiled method,"]
+#[doc = " use iJVM_EVENT_TYPE_METHOD_UPDATE_V2 as an event type to report it."]
+#[doc = ""]
+#[doc = " On the first Update event, VTune Amplifier copies the original code range reported by"]
+#[doc = " the iJVM_EVENT_TYPE_METHOD_LOAD event, then modifies it with the supplied bytes and"]
+#[doc = " adds the modified range to the original method. For next update events, VTune Amplifier"]
+#[doc = " does the same but it uses the latest modified version of a code region for update."]
+#[doc = " Eventually, VTune Amplifier GUI displays multiple code ranges for the method reported by"]
+#[doc = " the iJVM_EVENT_TYPE_METHOD_LOAD event."]
+#[doc = " Notes:"]
+#[doc = " - Multiple update events with different types for the same trace are allowed"]
+#[doc = "   but they must be reported for the same code ranges."]
+#[doc = "   Example,"]
+#[doc = " @code"]
+#[doc = "                      [-- data---]        Allowed"]
+#[doc = "          [-- code --]                    Allowed"]
+#[doc = "        [code]                            Ignored"]
+#[doc = "                      [-- data---]        Allowed"]
+#[doc = "          [-- code --]                    Allowed"]
+#[doc = "      [------------ trace ---------]"]
+#[doc = " @endcode"]
+#[doc = " - The types of previously reported events can be changed but they must be reported"]
+#[doc = "   for the same code ranges."]
+#[doc = "   Example,"]
+#[doc = " @code"]
+#[doc = "          [-- data---]                    Allowed"]
+#[doc = "          [-- code --]                    Allowed"]
+#[doc = "          [-- data---]                    Allowed"]
+#[doc = "          [-- code --]                    Allowed"]
+#[doc = "      [------------ trace ---------]"]
+#[doc = " @endcode"]
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct _iJIT_Method_Update {
+    #[doc = "<\\brief Start address of the update within a method"]
+    pub load_address: *mut ::std::os::raw::c_void,
+    #[doc = "<\\brief The update size"]
+    pub size: ::std::os::raw::c_uint,
+    #[doc = "<\\brief Type of the update"]
+    pub type_: iJIT_SegmentType,
+    #[doc = "<\\brief C string that contains a format string"]
+    #[doc = " that follows the same specifications as format in printf."]
+    #[doc = " The format string is used for iJIT_CT_CODE only"]
+    #[doc = " and cannot be NULL."]
+    #[doc = " Format can be changed on the fly."]
+    pub data_format: *const ::std::os::raw::c_char,
+}
+#[test]
+fn bindgen_test_layout__iJIT_Method_Update() {
+    assert_eq!(
+        ::std::mem::size_of::<_iJIT_Method_Update>(),
+        24usize,
+        concat!("Size of: ", stringify!(_iJIT_Method_Update))
+    );
+    assert_eq!(
+        ::std::mem::align_of::<_iJIT_Method_Update>(),
+        8usize,
+        concat!("Alignment of ", stringify!(_iJIT_Method_Update))
+    );
+    assert_eq!(
+        unsafe {
+            &(*(::std::ptr::null::<_iJIT_Method_Update>())).load_address as *const _ as usize
+        },
+        0usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Update),
+            "::",
+            stringify!(load_address)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_iJIT_Method_Update>())).size as *const _ as usize },
+        8usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Update),
+            "::",
+            stringify!(size)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_iJIT_Method_Update>())).type_ as *const _ as usize },
+        12usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Update),
+            "::",
+            stringify!(type_)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<_iJIT_Method_Update>())).data_format as *const _ as usize },
+        16usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(_iJIT_Method_Update),
+            "::",
+            stringify!(data_format)
+        )
+    );
+}
+pub type piJIT_Method_Update = *mut _iJIT_Method_Update;
+pub type iJIT_Method_Update = _iJIT_Method_Update;
+extern "C" {
+    #[doc = " @brief Generates a new unique method ID."]
+    #[doc = ""]
+    #[doc = " You must use this API to obtain unique and valid method IDs for methods or"]
+    #[doc = " traces reported to the agent if you don't have your own mechanism to generate"]
+    #[doc = " unique method IDs."]
+    #[doc = ""]
+    #[doc = " @return a new unique method ID. When out of unique method IDs, this API"]
+    #[doc = " returns 0, which is not an accepted value."]
+    pub fn iJIT_GetNewMethodID() -> ::std::os::raw::c_uint;
+}
+extern "C" {
+    #[doc = " @brief Returns the current mode of the agent."]
+    #[doc = ""]
+    #[doc = " @return iJIT_SAMPLING_ON, indicating that agent is running, or"]
+    #[doc = " iJIT_NOTHING_RUNNING if no agent is running."]
+    pub fn iJIT_IsProfilingActive() -> iJIT_IsProfilingActiveFlags;
+}
+extern "C" {
+    #[doc = " @brief Reports infomation about JIT-compiled code to the agent."]
+    #[doc = ""]
+    #[doc = " The reported information is used to attribute samples obtained from any"]
+    #[doc = " Intel(R) VTune(TM) Amplifier collector. This API needs to be called"]
+    #[doc = " after JIT compilation and before the first entry into the JIT-compiled"]
+    #[doc = " code."]
+    #[doc = ""]
+    #[doc = " @param[in] event_type - type of the data sent to the agent"]
+    #[doc = " @param[in] EventSpecificData - pointer to event-specific data"]
+    #[doc = ""]
+    #[doc = " @returns 1 on success, otherwise 0."]
+    pub fn iJIT_NotifyEvent(
+        event_type: iJIT_JVM_EVENT,
+        EventSpecificData: *mut ::std::os::raw::c_void,
+    ) -> ::std::os::raw::c_int;
+}
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/src/lib.rs b/deps/v8/third_party/ittapi/ittapi-rs/src/lib.rs
new file mode 100644
index 00000000000000..0ce85516a54ce2
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/src/lib.rs
@@ -0,0 +1,4 @@
+#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
+#![allow(unused)]
+include!("ittnotify_bindings.rs");
+include!("jitprofiling_bindings.rs");
diff --git a/deps/v8/third_party/ittapi/ittapi-rs/tests/bindgen-up-to-date.rs b/deps/v8/third_party/ittapi/ittapi-rs/tests/bindgen-up-to-date.rs
new file mode 100644
index 00000000000000..d3eb75da715dd7
--- /dev/null
+++ b/deps/v8/third_party/ittapi/ittapi-rs/tests/bindgen-up-to-date.rs
@@ -0,0 +1,68 @@
+// This is a smoke test for pre-generated `src/ittapi-bindings.rs` and
+// `src/jitprofiling-bindings.rs` files to see that they don't need to be
+// updated. We check in a generated version so downstream consumers don't
+// have to get `bindgen` working themselves.
+//
+// If bindgen or ittapi.h or jitprofiling.h change you can run tests with
+// `BLESS=1` (inpired by a similiar pach for binaryen) to regenerate the
+// source files, otherwise this can test on CI that the file doesn't need
+// to be regenerated.
+
+#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
+#![allow(unused)]
+
+#[test]
+fn test_ittnotify_bindings_up_to_date() {
+    let expected = bindgen::Builder::default()
+        .rustfmt_bindings(true)
+        .header("./include/ittnotify.h")
+        .generate()
+        .expect("Unable to generate ittnotify bindings.")
+        .to_string();
+
+    if std::env::var("BLESS").is_ok() {
+        std::fs::write("src/ittnotify_bindings.rs", expected).unwrap();
+    } else {
+        let actual = include_str!("../src/ittnotify_bindings.rs");
+        if expected == actual {
+            return;
+        }
+
+        for diff in diff::lines(&expected, &actual) {
+            match diff {
+                diff::Result::Both(_, s) => println!(" {}", s),
+                diff::Result::Left(s) => println!("-{}", s),
+                diff::Result::Right(s) => println!("+{}", s),
+            }
+        }
+        panic!("differences found, need to regenerate ittnotify bindings");
+    }
+}
+
+#[test]
+fn test_jitprofiling_bindings_up_to_date() {
+    let expected = bindgen::Builder::default()
+        .rustfmt_bindings(true)
+        .header("./include/jitprofiling.h")
+        .generate()
+        .expect("Unable to generate jitprofiling bindings")
+        .to_string();
+
+    if std::env::var("BLESS").is_ok() {
+        std::fs::write("src/jitprofiling_bindings.rs", expected).unwrap();
+    } else {
+        let actual = include_str!("../src/jitprofiling_bindings.rs");
+        if expected == actual {
+            return;
+        }
+
+        for diff in diff::lines(&expected, &actual) {
+            match diff {
+                diff::Result::Both(_, s) => println!(" {}", s),
+                diff::Result::Left(s) => println!("-{}", s),
+                diff::Result::Right(s) => println!("+{}", s),
+            }
+        }
+        panic!("differences found, need to regenerate jitprofiling bindings");
+    }
+}
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/disable_warnings.h b/deps/v8/third_party/ittapi/src/ittnotify/disable_warnings.h
new file mode 100644
index 00000000000000..4ebdd77e446344
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/disable_warnings.h
@@ -0,0 +1,25 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+
+#include "ittnotify_config.h"
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+
+#pragma warning (disable: 593)   /* parameter "XXXX" was set but never used                 */
+#pragma warning (disable: 344)   /* typedef name has already been declared (with same type) */
+#pragma warning (disable: 174)   /* expression has no effect                                */
+#pragma warning (disable: 4127)  /* conditional expression is constant                      */
+#pragma warning (disable: 4306)  /* conversion from '?' to '?' of greater size              */
+
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#if defined __INTEL_COMPILER
+
+#pragma warning (disable: 869)  /* parameter "XXXXX" was never referenced                  */
+#pragma warning (disable: 1418) /* external function definition with no prior declaration  */
+#pragma warning (disable: 1419) /* external declaration in primary source file             */
+
+#endif /* __INTEL_COMPILER */
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_config.h b/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_config.h
new file mode 100644
index 00000000000000..cb289f79eb25b4
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_config.h
@@ -0,0 +1,585 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+#ifndef _ITTNOTIFY_CONFIG_H_
+#define _ITTNOTIFY_CONFIG_H_
+
+/** @cond exclude_from_documentation */
+#ifndef ITT_OS_WIN
+#  define ITT_OS_WIN   1
+#endif /* ITT_OS_WIN */
+
+#ifndef ITT_OS_LINUX
+#  define ITT_OS_LINUX 2
+#endif /* ITT_OS_LINUX */
+
+#ifndef ITT_OS_MAC
+#  define ITT_OS_MAC   3
+#endif /* ITT_OS_MAC */
+
+#ifndef ITT_OS_FREEBSD
+#  define ITT_OS_FREEBSD   4
+#endif /* ITT_OS_FREEBSD */
+
+#ifndef ITT_OS
+#  if defined WIN32 || defined _WIN32
+#    define ITT_OS ITT_OS_WIN
+#  elif defined( __APPLE__ ) && defined( __MACH__ )
+#    define ITT_OS ITT_OS_MAC
+#  elif defined( __FreeBSD__ )
+#    define ITT_OS ITT_OS_FREEBSD
+#  else
+#    define ITT_OS ITT_OS_LINUX
+#  endif
+#endif /* ITT_OS */
+
+#ifndef ITT_PLATFORM_WIN
+#  define ITT_PLATFORM_WIN 1
+#endif /* ITT_PLATFORM_WIN */
+
+#ifndef ITT_PLATFORM_POSIX
+#  define ITT_PLATFORM_POSIX 2
+#endif /* ITT_PLATFORM_POSIX */
+
+#ifndef ITT_PLATFORM_MAC
+#  define ITT_PLATFORM_MAC 3
+#endif /* ITT_PLATFORM_MAC */
+
+#ifndef ITT_PLATFORM_FREEBSD
+#  define ITT_PLATFORM_FREEBSD 4
+#endif /* ITT_PLATFORM_FREEBSD */
+
+#ifndef ITT_PLATFORM
+#  if ITT_OS==ITT_OS_WIN
+#    define ITT_PLATFORM ITT_PLATFORM_WIN
+#  elif ITT_OS==ITT_OS_MAC
+#    define ITT_PLATFORM ITT_PLATFORM_MAC
+#  elif ITT_OS==ITT_OS_FREEBSD
+#    define ITT_PLATFORM ITT_PLATFORM_FREEBSD
+#  else
+#    define ITT_PLATFORM ITT_PLATFORM_POSIX
+#  endif
+#endif /* ITT_PLATFORM */
+
+#if defined(_UNICODE) && !defined(UNICODE)
+#define UNICODE
+#endif
+
+#include <stddef.h>
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#include <tchar.h>
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#include <stdint.h>
+#if defined(UNICODE) || defined(_UNICODE)
+#include <wchar.h>
+#endif /* UNICODE || _UNICODE */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#ifndef ITTAPI_CDECL
+#  if ITT_PLATFORM==ITT_PLATFORM_WIN
+#    define ITTAPI_CDECL __cdecl
+#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#    if defined _M_IX86 || defined __i386__
+#      define ITTAPI_CDECL __attribute__ ((cdecl))
+#    else  /* _M_IX86 || __i386__ */
+#      define ITTAPI_CDECL /* actual only on x86 platform */
+#    endif /* _M_IX86 || __i386__ */
+#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* ITTAPI_CDECL */
+
+#ifndef STDCALL
+#  if ITT_PLATFORM==ITT_PLATFORM_WIN
+#    define STDCALL __stdcall
+#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#    if defined _M_IX86 || defined __i386__
+#      define STDCALL __attribute__ ((stdcall))
+#    else  /* _M_IX86 || __i386__ */
+#      define STDCALL /* supported only on x86 platform */
+#    endif /* _M_IX86 || __i386__ */
+#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* STDCALL */
+
+#define ITTAPI    ITTAPI_CDECL
+#define LIBITTAPI ITTAPI_CDECL
+
+/* TODO: Temporary for compatibility! */
+#define ITTAPI_CALL    ITTAPI_CDECL
+#define LIBITTAPI_CALL ITTAPI_CDECL
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+/* use __forceinline (VC++ specific) */
+#if defined(__MINGW32__) && !defined(__cplusplus)
+#define ITT_INLINE           static __inline__ __attribute__((__always_inline__,__gnu_inline__))
+#else
+#define ITT_INLINE           static __forceinline
+#endif /* __MINGW32__ */
+
+#define ITT_INLINE_ATTRIBUTE /* nothing */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+/*
+ * Generally, functions are not inlined unless optimization is specified.
+ * For functions declared inline, this attribute inlines the function even
+ * if no optimization level was specified.
+ */
+#ifdef __STRICT_ANSI__
+#define ITT_INLINE           static
+#define ITT_INLINE_ATTRIBUTE __attribute__((unused))
+#else  /* __STRICT_ANSI__ */
+#define ITT_INLINE           static inline
+#define ITT_INLINE_ATTRIBUTE __attribute__((always_inline, unused))
+#endif /* __STRICT_ANSI__ */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+/** @endcond */
+
+#ifndef ITT_ARCH_IA32
+#  define ITT_ARCH_IA32  1
+#endif /* ITT_ARCH_IA32 */
+
+#ifndef ITT_ARCH_IA32E
+#  define ITT_ARCH_IA32E 2
+#endif /* ITT_ARCH_IA32E */
+
+#ifndef ITT_ARCH_ARM
+#  define ITT_ARCH_ARM  4
+#endif /* ITT_ARCH_ARM */
+
+#ifndef ITT_ARCH_PPC64
+#  define ITT_ARCH_PPC64  5
+#endif /* ITT_ARCH_PPC64 */
+
+#ifndef ITT_ARCH_ARM64
+#  define ITT_ARCH_ARM64  6
+#endif /* ITT_ARCH_ARM64 */
+
+#ifndef ITT_ARCH
+#  if defined _M_IX86 || defined __i386__
+#    define ITT_ARCH ITT_ARCH_IA32
+#  elif defined _M_X64 || defined _M_AMD64 || defined __x86_64__
+#    define ITT_ARCH ITT_ARCH_IA32E
+#  elif defined _M_IA64 || defined __ia64__
+#    define ITT_ARCH ITT_ARCH_IA64
+#  elif defined _M_ARM || defined __arm__
+#    define ITT_ARCH ITT_ARCH_ARM
+#  elif defined __aarch64__
+#    define ITT_ARCH ITT_ARCH_ARM64
+#  elif defined __powerpc64__
+#    define ITT_ARCH ITT_ARCH_PPC64
+#  endif
+#endif
+
+#ifdef __cplusplus
+#  define ITT_EXTERN_C extern "C"
+#  define ITT_EXTERN_C_BEGIN extern "C" {
+#  define ITT_EXTERN_C_END }
+#else
+#  define ITT_EXTERN_C /* nothing */
+#  define ITT_EXTERN_C_BEGIN /* nothing */
+#  define ITT_EXTERN_C_END /* nothing */
+#endif /* __cplusplus */
+
+#define ITT_TO_STR_AUX(x) #x
+#define ITT_TO_STR(x)     ITT_TO_STR_AUX(x)
+
+#define __ITT_BUILD_ASSERT(expr, suffix) do { \
+    static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \
+    __itt_build_check_##suffix[0] = 0; \
+} while(0)
+#define _ITT_BUILD_ASSERT(expr, suffix)  __ITT_BUILD_ASSERT((expr), suffix)
+#define ITT_BUILD_ASSERT(expr)           _ITT_BUILD_ASSERT((expr), __LINE__)
+
+#define ITT_MAGIC { 0xED, 0xAB, 0xAB, 0xEC, 0x0D, 0xEE, 0xDA, 0x30 }
+
+/* Replace with snapshot date YYYYMMDD for promotion build. */
+#define API_VERSION_BUILD    20180723
+
+#ifndef API_VERSION_NUM
+#define API_VERSION_NUM 3.18.13
+#endif /* API_VERSION_NUM */
+
+#define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) \
+                                " (" ITT_TO_STR(API_VERSION_BUILD) ")"
+
+/* OS communication functions */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#include <windows.h>
+typedef HMODULE           lib_t;
+typedef DWORD             TIDT;
+typedef CRITICAL_SECTION  mutex_t;
+#define MUTEX_INITIALIZER { 0 }
+#define strong_alias(name, aliasname) /* empty for Windows */
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#include <dlfcn.h>
+#if defined(UNICODE) || defined(_UNICODE)
+#include <wchar.h>
+#endif /* UNICODE */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */
+#endif /* _GNU_SOURCE */
+#ifndef __USE_UNIX98
+#define __USE_UNIX98 1 /* need for PTHREAD_MUTEX_RECURSIVE, on SLES11.1 with gcc 4.3.4 wherein pthread.h missing dependency on __USE_XOPEN2K8 */
+#endif /*__USE_UNIX98*/
+#include <pthread.h>
+typedef void*             lib_t;
+typedef pthread_t         TIDT;
+typedef pthread_mutex_t   mutex_t;
+#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+#define _strong_alias(name, aliasname) \
+            extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+#define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define __itt_get_proc(lib, name) GetProcAddress(lib, name)
+#define __itt_mutex_init(mutex)   InitializeCriticalSection(mutex)
+#define __itt_mutex_lock(mutex)   EnterCriticalSection(mutex)
+#define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex)
+#define __itt_load_lib(name)      LoadLibraryA(name)
+#define __itt_unload_lib(handle)  FreeLibrary(handle)
+#define __itt_system_error()      (int)GetLastError()
+#define __itt_fstrcmp(s1, s2)     lstrcmpA(s1, s2)
+#define __itt_fstrnlen(s, l)      strnlen_s(s, l)
+#define __itt_fstrcpyn(s1, b, s2, l) strncpy_s(s1, b, s2, l)
+#define __itt_fstrdup(s)          _strdup(s)
+#define __itt_thread_id()         GetCurrentThreadId()
+#define __itt_thread_yield()      SwitchToThread()
+#ifndef ITT_SIMPLE_INIT
+ITT_INLINE long
+__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
+ITT_INLINE long __itt_interlocked_increment(volatile long* ptr)
+{
+    return InterlockedIncrement(ptr);
+}
+#endif /* ITT_SIMPLE_INIT */
+
+#define DL_SYMBOLS (1)
+#define PTHREAD_SYMBOLS (1)
+
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+#define __itt_get_proc(lib, name) dlsym(lib, name)
+#define __itt_mutex_init(mutex)   {\
+    pthread_mutexattr_t mutex_attr;                                         \
+    int error_code = pthread_mutexattr_init(&mutex_attr);                   \
+    if (error_code)                                                         \
+        __itt_report_error(__itt_error_system, "pthread_mutexattr_init",    \
+                           error_code);                                     \
+    error_code = pthread_mutexattr_settype(&mutex_attr,                     \
+                                           PTHREAD_MUTEX_RECURSIVE);        \
+    if (error_code)                                                         \
+        __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", \
+                           error_code);                                     \
+    error_code = pthread_mutex_init(mutex, &mutex_attr);                    \
+    if (error_code)                                                         \
+        __itt_report_error(__itt_error_system, "pthread_mutex_init",        \
+                           error_code);                                     \
+    error_code = pthread_mutexattr_destroy(&mutex_attr);                    \
+    if (error_code)                                                         \
+        __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", \
+                           error_code);                                     \
+}
+#define __itt_mutex_lock(mutex)   pthread_mutex_lock(mutex)
+#define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex)
+#define __itt_load_lib(name)      dlopen(name, RTLD_LAZY)
+#define __itt_unload_lib(handle)  dlclose(handle)
+#define __itt_system_error()      errno
+#define __itt_fstrcmp(s1, s2)     strcmp(s1, s2)
+
+/* makes customer code define safe APIs for SDL_STRNLEN_S and SDL_STRNCPY_S */
+#ifdef SDL_STRNLEN_S
+#define __itt_fstrnlen(s, l)      SDL_STRNLEN_S(s, l)
+#else
+#define __itt_fstrnlen(s, l)      strlen(s)
+#endif /* SDL_STRNLEN_S */
+#ifdef SDL_STRNCPY_S
+#define __itt_fstrcpyn(s1, b, s2, l) SDL_STRNCPY_S(s1, b, s2, l)
+#else
+#define __itt_fstrcpyn(s1, b, s2, l) {                                      \
+    if (b > 0) {                                                            \
+        /* 'volatile' is used to suppress the warning that a destination */ \
+        /*  bound depends on the length of the source.                   */ \
+        volatile size_t num_to_copy = (size_t)(b - 1) < (size_t)(l) ?       \
+                (size_t)(b - 1) : (size_t)(l);                              \
+        strncpy(s1, s2, num_to_copy);                                       \
+        s1[num_to_copy] = 0;                                                \
+    }                                                                       \
+}
+#endif /* SDL_STRNCPY_S */
+
+#define __itt_fstrdup(s)          strdup(s)
+#define __itt_thread_id()         pthread_self()
+#define __itt_thread_yield()      sched_yield()
+#if ITT_ARCH==ITT_ARCH_IA64
+#ifdef __INTEL_COMPILER
+#define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val)
+#else  /* __INTEL_COMPILER */
+/* TODO: Add Support for not Intel compilers for IA-64 architecture */
+#endif /* __INTEL_COMPILER */
+#elif ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_IA32E /* ITT_ARCH!=ITT_ARCH_IA64 */
+ITT_INLINE long
+__TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE;
+ITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend)
+{
+    long result;
+    __asm__ __volatile__("lock\nxadd %0,%1"
+                          : "=r"(result),"=m"(*(volatile int*)ptr)
+                          : "0"(addend), "m"(*(volatile int*)ptr)
+                          : "memory");
+    return result;
+}
+#else
+#define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val)
+#endif /* ITT_ARCH==ITT_ARCH_IA64 */
+#ifndef ITT_SIMPLE_INIT
+ITT_INLINE long
+__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
+ITT_INLINE long __itt_interlocked_increment(volatile long* ptr)
+{
+    return __TBB_machine_fetchadd4(ptr, 1) + 1L;
+}
+#endif /* ITT_SIMPLE_INIT */
+
+void* dlopen(const char*, int) __attribute__((weak));
+void* dlsym(void*, const char*) __attribute__((weak));
+int dlclose(void*) __attribute__((weak));
+#define DL_SYMBOLS (dlopen && dlsym && dlclose)
+
+int pthread_mutex_init(pthread_mutex_t*, const pthread_mutexattr_t*) __attribute__((weak));
+int pthread_mutex_lock(pthread_mutex_t*) __attribute__((weak));
+int pthread_mutex_unlock(pthread_mutex_t*) __attribute__((weak));
+int pthread_mutex_destroy(pthread_mutex_t*) __attribute__((weak));
+int pthread_mutexattr_init(pthread_mutexattr_t*) __attribute__((weak));
+int pthread_mutexattr_settype(pthread_mutexattr_t*, int) __attribute__((weak));
+int pthread_mutexattr_destroy(pthread_mutexattr_t*) __attribute__((weak));
+pthread_t pthread_self(void) __attribute__((weak));
+#define PTHREAD_SYMBOLS (pthread_mutex_init && pthread_mutex_lock && pthread_mutex_unlock && pthread_mutex_destroy && pthread_mutexattr_init && pthread_mutexattr_settype && pthread_mutexattr_destroy && pthread_self)
+
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+typedef enum {
+    __itt_collection_normal = 0,
+    __itt_collection_paused = 1
+} __itt_collection_state;
+
+typedef enum {
+    __itt_thread_normal  = 0,
+    __itt_thread_ignored = 1
+} __itt_thread_state;
+
+#pragma pack(push, 8)
+
+typedef struct ___itt_thread_info
+{
+    const char* nameA; /*!< Copy of original name in ASCII. */
+#if defined(UNICODE) || defined(_UNICODE)
+    const wchar_t* nameW; /*!< Copy of original name in UNICODE. */
+#else  /* UNICODE || _UNICODE */
+    void* nameW;
+#endif /* UNICODE || _UNICODE */
+    TIDT               tid;
+    __itt_thread_state state;   /*!< Thread state (paused or normal) */
+    int                extra1;  /*!< Reserved to the runtime */
+    void*              extra2;  /*!< Reserved to the runtime */
+    struct ___itt_thread_info* next;
+} __itt_thread_info;
+
+#include "ittnotify_types.h" /* For __itt_group_id definition */
+
+typedef struct ___itt_api_info_20101001
+{
+    const char*    name;
+    void**         func_ptr;
+    void*          init_func;
+    __itt_group_id group;
+}  __itt_api_info_20101001;
+
+typedef struct ___itt_api_info
+{
+    const char*    name;
+    void**         func_ptr;
+    void*          init_func;
+    void*          null_func;
+    __itt_group_id group;
+}  __itt_api_info;
+
+typedef struct __itt_counter_info
+{
+    const char* nameA;  /*!< Copy of original name in ASCII. */
+#if defined(UNICODE) || defined(_UNICODE)
+    const wchar_t* nameW; /*!< Copy of original name in UNICODE. */
+#else  /* UNICODE || _UNICODE */
+    void* nameW;
+#endif /* UNICODE || _UNICODE */
+    const char* domainA;  /*!< Copy of original name in ASCII. */
+#if defined(UNICODE) || defined(_UNICODE)
+    const wchar_t* domainW; /*!< Copy of original name in UNICODE. */
+#else  /* UNICODE || _UNICODE */
+    void* domainW;
+#endif /* UNICODE || _UNICODE */
+    int type;
+    long index;
+    int   extra1; /*!< Reserved to the runtime */
+    void* extra2; /*!< Reserved to the runtime */
+    struct __itt_counter_info* next;
+}  __itt_counter_info_t;
+
+struct ___itt_domain;
+struct ___itt_string_handle;
+
+typedef struct ___itt_global
+{
+    unsigned char          magic[8];
+    unsigned long          version_major;
+    unsigned long          version_minor;
+    unsigned long          version_build;
+    volatile long          api_initialized;
+    volatile long          mutex_initialized;
+    volatile long          atomic_counter;
+    mutex_t                mutex;
+    lib_t                  lib;
+    void*                  error_handler;
+    const char**           dll_path_ptr;
+    __itt_api_info*        api_list_ptr;
+    struct ___itt_global*  next;
+    /* Joinable structures below */
+    __itt_thread_info*     thread_list;
+    struct ___itt_domain*  domain_list;
+    struct ___itt_string_handle* string_list;
+    __itt_collection_state state;
+    __itt_counter_info_t* counter_list;
+    unsigned int           ipt_collect_events;
+} __itt_global;
+
+#pragma pack(pop)
+
+#define NEW_THREAD_INFO_W(gptr,h,h_tail,t,s,n) { \
+    h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \
+    if (h != NULL) { \
+        h->tid    = t; \
+        h->nameA  = NULL; \
+        h->nameW  = n ? _wcsdup(n) : NULL; \
+        h->state  = s; \
+        h->extra1 = 0;    /* reserved */ \
+        h->extra2 = NULL; /* reserved */ \
+        h->next   = NULL; \
+        if (h_tail == NULL) \
+            (gptr)->thread_list = h; \
+        else \
+            h_tail->next = h; \
+    } \
+}
+
+#define NEW_THREAD_INFO_A(gptr,h,h_tail,t,s,n) { \
+    h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \
+    if (h != NULL) { \
+        h->tid    = t; \
+        h->nameA  = n ? __itt_fstrdup(n) : NULL; \
+        h->nameW  = NULL; \
+        h->state  = s; \
+        h->extra1 = 0;    /* reserved */ \
+        h->extra2 = NULL; /* reserved */ \
+        h->next   = NULL; \
+        if (h_tail == NULL) \
+            (gptr)->thread_list = h; \
+        else \
+            h_tail->next = h; \
+    } \
+}
+
+#define NEW_DOMAIN_W(gptr,h,h_tail,name) { \
+    h = (__itt_domain*)malloc(sizeof(__itt_domain)); \
+    if (h != NULL) { \
+        h->flags  = 1;    /* domain is enabled by default */ \
+        h->nameA  = NULL; \
+        h->nameW  = name ? _wcsdup(name) : NULL; \
+        h->extra1 = 0;    /* reserved */ \
+        h->extra2 = NULL; /* reserved */ \
+        h->next   = NULL; \
+        if (h_tail == NULL) \
+            (gptr)->domain_list = h; \
+        else \
+            h_tail->next = h; \
+    } \
+}
+
+#define NEW_DOMAIN_A(gptr,h,h_tail,name) { \
+    h = (__itt_domain*)malloc(sizeof(__itt_domain)); \
+    if (h != NULL) { \
+        h->flags  = 1;    /* domain is enabled by default */ \
+        h->nameA  = name ? __itt_fstrdup(name) : NULL; \
+        h->nameW  = NULL; \
+        h->extra1 = 0;    /* reserved */ \
+        h->extra2 = NULL; /* reserved */ \
+        h->next   = NULL; \
+        if (h_tail == NULL) \
+            (gptr)->domain_list = h; \
+        else \
+            h_tail->next = h; \
+    } \
+}
+
+#define NEW_STRING_HANDLE_W(gptr,h,h_tail,name) { \
+    h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \
+    if (h != NULL) { \
+        h->strA   = NULL; \
+        h->strW   = name ? _wcsdup(name) : NULL; \
+        h->extra1 = 0;    /* reserved */ \
+        h->extra2 = NULL; /* reserved */ \
+        h->next   = NULL; \
+        if (h_tail == NULL) \
+            (gptr)->string_list = h; \
+        else \
+            h_tail->next = h; \
+    } \
+}
+
+#define NEW_STRING_HANDLE_A(gptr,h,h_tail,name) { \
+    h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \
+    if (h != NULL) { \
+        h->strA   = name ? __itt_fstrdup(name) : NULL; \
+        h->strW   = NULL; \
+        h->extra1 = 0;    /* reserved */ \
+        h->extra2 = NULL; /* reserved */ \
+        h->next   = NULL; \
+        if (h_tail == NULL) \
+            (gptr)->string_list = h; \
+        else \
+            h_tail->next = h; \
+    } \
+}
+
+#define NEW_COUNTER_W(gptr,h,h_tail,name,domain,type) { \
+    h = (__itt_counter_info_t*)malloc(sizeof(__itt_counter_info_t)); \
+    if (h != NULL) { \
+        h->nameA   = NULL; \
+        h->nameW   = name ? _wcsdup(name) : NULL; \
+        h->domainA   = NULL; \
+        h->domainW   = name ? _wcsdup(domain) : NULL; \
+        h->type = type; \
+        h->index = 0; \
+        h->next   = NULL; \
+        if (h_tail == NULL) \
+            (gptr)->counter_list = h; \
+        else \
+            h_tail->next = h; \
+    } \
+}
+
+#define NEW_COUNTER_A(gptr,h,h_tail,name,domain,type) { \
+    h = (__itt_counter_info_t*)malloc(sizeof(__itt_counter_info_t)); \
+    if (h != NULL) { \
+        h->nameA   = name ? __itt_fstrdup(name) : NULL; \
+        h->nameW   = NULL; \
+        h->domainA   = domain ? __itt_fstrdup(domain) : NULL; \
+        h->domainW   = NULL; \
+        h->type = type; \
+        h->index = 0; \
+        h->next   = NULL; \
+        if (h_tail == NULL) \
+            (gptr)->counter_list = h; \
+        else \
+            h_tail->next = h; \
+    } \
+}
+
+#endif /* _ITTNOTIFY_CONFIG_H_ */
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_static.c b/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_static.c
new file mode 100644
index 00000000000000..7ada72af62793b
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_static.c
@@ -0,0 +1,1359 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+
+#include "ittnotify_config.h"
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#if !defined(PATH_MAX)
+#define PATH_MAX 512
+#endif
+#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+#include <limits.h>
+#include <dlfcn.h>
+#include <errno.h>
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#define INTEL_NO_MACRO_BODY 
+#define INTEL_ITTNOTIFY_API_PRIVATE
+#include "ittnotify.h"
+#include "legacy/ittnotify.h"
+
+#include "disable_warnings.h"
+
+static const char api_version[] = API_VERSION "\0\n@(#) $Revision$\n";
+
+#define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
+
+#ifndef HAS_CPP_ATTR
+#if defined(__cplusplus) && defined(__has_cpp_attribute)
+#define HAS_CPP_ATTR(X) __has_cpp_attribute(X)
+#else
+#define HAS_CPP_ATTR(X) 0
+#endif
+#endif
+
+#ifndef HAS_C_ATTR
+#if defined(__STDC__) && defined(__has_c_attribute)
+#define HAS_C_ATTR(X) __has_c_attribute(X)
+#else
+#define HAS_C_ATTR(X) 0
+#endif
+#endif
+
+#ifndef HAS_GNU_ATTR
+#if defined(__has_attribute)
+#define HAS_GNU_ATTR(X) __has_attribute(X)
+#else
+#define HAS_GNU_ATTR(X) 0
+#endif
+#endif
+
+#ifndef ITT_ATTRIBUTE_FALLTHROUGH
+#if HAS_CPP_ATTR(fallthrough) || HAS_C_ATTR(fallthrough)
+#define ITT_ATTRIBUTE_FALLTHROUGH [[fallthrough]]
+#elif HAS_CPP_ATTR(gnu::fallthrough)
+#define ITT_ATTRIBUTE_FALLTHROUGH [[gnu::fallthrough]]
+#elif HAS_CPP_ATTR(clang::fallthrough)
+#define ITT_ATTRIBUTE_FALLTHROUGH [[clang::fallthrough]]
+#elif HAS_GNU_ATTR(fallthrough)
+#define ITT_ATTRIBUTE_FALLTHROUGH __attribute__((fallthrough))
+#else
+#define ITT_ATTRIBUTE_FALLTHROUGH
+#endif
+#endif
+
+#if ITT_OS==ITT_OS_WIN
+static const char* ittnotify_lib_name = "libittnotify.dll";
+#elif ITT_OS==ITT_OS_LINUX || ITT_OS==ITT_OS_FREEBSD
+static const char* ittnotify_lib_name = "libittnotify.so";
+#elif ITT_OS==ITT_OS_MAC
+static const char* ittnotify_lib_name = "libittnotify.dylib";
+#else
+#error Unsupported or unknown OS.
+#endif
+
+#ifdef __ANDROID__
+#include <android/log.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <linux/limits.h>
+
+#ifdef ITT_ANDROID_LOG
+    #define ITT_ANDROID_LOG_TAG   "INTEL_VTUNE_USERAPI"
+    #define ITT_ANDROID_LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ITT_ANDROID_LOG_TAG, __VA_ARGS__))
+    #define ITT_ANDROID_LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ITT_ANDROID_LOG_TAG, __VA_ARGS__))
+    #define ITT_ANDROID_LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,ITT_ANDROID_LOG_TAG, __VA_ARGS__))
+    #define ITT_ANDROID_LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG,ITT_ANDROID_LOG_TAG, __VA_ARGS__))
+#else
+    #define ITT_ANDROID_LOGI(...)
+    #define ITT_ANDROID_LOGW(...)
+    #define ITT_ANDROID_LOGE(...)
+    #define ITT_ANDROID_LOGD(...)
+#endif
+
+/* default location of userapi collector on Android */
+#define ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(x)  "/data/data/com.intel.vtune/perfrun/lib" \
+                                                #x "/runtime/libittnotify.so"
+
+#if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
+#define ANDROID_ITTNOTIFY_DEFAULT_PATH  ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(32)
+#else
+#define ANDROID_ITTNOTIFY_DEFAULT_PATH  ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(64)
+#endif
+
+#endif
+
+
+#ifndef LIB_VAR_NAME
+#if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
+#define LIB_VAR_NAME INTEL_LIBITTNOTIFY32
+#else
+#define LIB_VAR_NAME INTEL_LIBITTNOTIFY64
+#endif
+#endif /* LIB_VAR_NAME */
+
+#define ITT_MUTEX_INIT_AND_LOCK(p) {                                 \
+    if (PTHREAD_SYMBOLS)                                             \
+    {                                                                \
+        if (!p.mutex_initialized)                                    \
+        {                                                            \
+            if (__itt_interlocked_increment(&p.atomic_counter) == 1) \
+            {                                                        \
+                __itt_mutex_init(&p.mutex);                          \
+                p.mutex_initialized = 1;                             \
+            }                                                        \
+            else                                                     \
+                while (!p.mutex_initialized)                         \
+                    __itt_thread_yield();                            \
+        }                                                            \
+        __itt_mutex_lock(&p.mutex);                                  \
+    }                                                                \
+}
+
+#define ITT_MODULE_OBJECT_VERSION 1
+
+typedef int (__itt_init_ittlib_t)(const char*, __itt_group_id);
+
+/* this define used to control initialization function name. */
+#ifndef __itt_init_ittlib_name
+ITT_EXTERN_C int _N_(init_ittlib)(const char*, __itt_group_id);
+static __itt_init_ittlib_t* __itt_init_ittlib_ptr = _N_(init_ittlib);
+#define __itt_init_ittlib_name __itt_init_ittlib_ptr
+#endif /* __itt_init_ittlib_name */
+
+typedef void (__itt_fini_ittlib_t)(void);
+
+/* this define used to control finalization function name. */
+#ifndef __itt_fini_ittlib_name
+ITT_EXTERN_C void _N_(fini_ittlib)(void);
+static __itt_fini_ittlib_t* __itt_fini_ittlib_ptr = _N_(fini_ittlib);
+#define __itt_fini_ittlib_name __itt_fini_ittlib_ptr
+#endif /* __itt_fini_ittlib_name */
+
+extern __itt_global _N_(_ittapi_global);
+
+/* building pointers to imported funcs */
+#undef ITT_STUBV
+#undef ITT_STUB
+#define ITT_STUB(api,type,name,args,params,ptr,group,format)   \
+static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
+typedef type api ITT_JOIN(_N_(name),_t) args;                  \
+ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END \
+static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \
+{                                                              \
+    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) \
+        __itt_init_ittlib_name(NULL, __itt_group_all);         \
+    if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \
+        return ITTNOTIFY_NAME(name) params;                    \
+    else                                                       \
+        return (type)0;                                        \
+}
+
+#define ITT_STUBV(api,type,name,args,params,ptr,group,format)  \
+static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
+typedef type api ITT_JOIN(_N_(name),_t) args;                  \
+ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END \
+static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \
+{                                                              \
+    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) \
+        __itt_init_ittlib_name(NULL, __itt_group_all);         \
+    if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \
+        ITTNOTIFY_NAME(name) params;                           \
+    else                                                       \
+        return;                                                \
+}
+
+#undef __ITT_INTERNAL_INIT
+#include "ittnotify_static.h"
+
+#undef ITT_STUB
+#undef ITT_STUBV
+#define ITT_STUB(api,type,name,args,params,ptr,group,format)   \
+static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
+typedef type api ITT_JOIN(_N_(name),_t) args;                  \
+ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END
+
+#define ITT_STUBV(api,type,name,args,params,ptr,group,format)  \
+static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
+typedef type api ITT_JOIN(_N_(name),_t) args;                  \
+ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END
+
+#define __ITT_INTERNAL_INIT
+#include "ittnotify_static.h"
+#undef __ITT_INTERNAL_INIT
+
+ITT_GROUP_LIST(group_list);
+
+#pragma pack(push, 8)
+
+typedef struct ___itt_group_alias
+{
+    const char*    env_var;
+    __itt_group_id groups;
+} __itt_group_alias;
+
+static __itt_group_alias group_alias[] = {
+    { "KMP_FOR_TPROFILE", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync  | __itt_group_mark) },
+    { "KMP_FOR_TCHECK",   (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync  | __itt_group_fsync | __itt_group_mark | __itt_group_suppress) },
+    { NULL,               (__itt_group_none) },
+    { api_version,        (__itt_group_none) } /* !!! Just to avoid unused code elimination !!! */
+};
+
+#pragma pack(pop)
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#pragma warning(push)
+#pragma warning(disable: 4054) /* warning C4054: 'type cast' : from function pointer 'XXX' to data pointer 'void *' */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+static __itt_api_info api_list[] = {
+/* Define functions with static implementation */
+#undef ITT_STUB
+#undef ITT_STUBV
+#define ITT_STUB(api,type,name,args,params,nameindll,group,format) { ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (__itt_group_id)(group)},
+#define ITT_STUBV ITT_STUB
+#define __ITT_INTERNAL_INIT
+#include "ittnotify_static.h"
+#undef __ITT_INTERNAL_INIT
+/* Define functions without static implementation */
+#undef ITT_STUB
+#undef ITT_STUBV
+#define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), NULL, (__itt_group_id)(group)},
+#define ITT_STUBV ITT_STUB
+#include "ittnotify_static.h"
+    {NULL, NULL, NULL, NULL, __itt_group_none}
+};
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#pragma warning(pop)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/* static part descriptor which handles. all notification api attributes. */
+__itt_global _N_(_ittapi_global) = {
+    ITT_MAGIC,                                     /* identification info */
+    ITT_MAJOR, ITT_MINOR, API_VERSION_BUILD,       /* version info */
+    0,                                             /* api_initialized */
+    0,                                             /* mutex_initialized */
+    0,                                             /* atomic_counter */
+    MUTEX_INITIALIZER,                             /* mutex */
+    NULL,                                          /* dynamic library handle */
+    NULL,                                          /* error_handler */
+    NULL,                                          /* dll_path_ptr */
+    (__itt_api_info*)&api_list,                    /* api_list_ptr */
+    NULL,                                          /* next __itt_global */
+    NULL,                                          /* thread_list */
+    NULL,                                          /* domain_list */
+    NULL,                                          /* string_list */
+    __itt_collection_normal,                       /* collection state */
+    NULL,                                          /* counter_list */
+    0                                              /* ipt_collect_events */
+};
+
+typedef void (__itt_api_init_t)(__itt_global*, __itt_group_id);
+typedef void (__itt_api_fini_t)(__itt_global*);
+
+static __itt_domain dummy_domain;
+/* ========================================================================= */
+
+#ifdef ITT_NOTIFY_EXT_REPORT
+ITT_EXTERN_C void _N_(error_handler)(__itt_error_code, va_list args);
+#endif /* ITT_NOTIFY_EXT_REPORT */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#pragma warning(push)
+#pragma warning(disable: 4055) /* warning C4055: 'type cast' : from data pointer 'void *' to function pointer 'XXX' */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+static void __itt_report_error(__itt_error_code code, ...)
+{
+    va_list args;
+    va_start(args, code);
+    if (_N_(_ittapi_global).error_handler != NULL)
+    {
+        __itt_error_handler_t* handler = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler;
+        handler(code, args);
+    }
+#ifdef ITT_NOTIFY_EXT_REPORT
+    _N_(error_handler)(code, args);
+#endif /* ITT_NOTIFY_EXT_REPORT */
+    va_end(args);
+}
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#pragma warning(pop)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))(const wchar_t* name)
+{
+    __itt_domain *h_tail = NULL, *h = NULL;
+
+    if (name == NULL)
+    {
+        return NULL;
+    }
+
+    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+    if (_N_(_ittapi_global).api_initialized)
+    {
+        if (ITTNOTIFY_NAME(domain_createW) && ITTNOTIFY_NAME(domain_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init)))
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(domain_createW)(name);
+        }
+        else
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return &dummy_domain;
+        }
+    }
+    for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next)
+    {
+        if (h->nameW != NULL && !wcscmp(h->nameW, name)) break;
+    }
+    if (h == NULL)
+    {
+        NEW_DOMAIN_W(&_N_(_ittapi_global),h,h_tail,name);
+    }
+    if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+    return h;
+}
+
+static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA),_init))(const char* name)
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init))(const char* name)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+{
+    __itt_domain *h_tail = NULL, *h = NULL;
+
+    if (name == NULL)
+    {
+        return NULL;
+    }
+
+    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+    if (_N_(_ittapi_global).api_initialized)
+    {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+        if (ITTNOTIFY_NAME(domain_createA) && ITTNOTIFY_NAME(domain_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA),_init)))
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(domain_createA)(name);
+        }
+#else
+        if (ITTNOTIFY_NAME(domain_create) && ITTNOTIFY_NAME(domain_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init)))
+        {
+            if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(domain_create)(name);
+        }
+#endif
+        else
+        {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+#else
+            if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+#endif
+            return &dummy_domain;
+        }
+    }
+    for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next)
+    {
+        if (h->nameA != NULL && !__itt_fstrcmp(h->nameA, name)) break;
+    }
+    if (h == NULL)
+    {
+        NEW_DOMAIN_A(&_N_(_ittapi_global),h,h_tail,name);
+    }
+    if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+    return h;
+}
+
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(module_load_with_sections),_init))(__itt_module_object* module_obj)
+{
+    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
+    {
+        __itt_init_ittlib_name(NULL, __itt_group_all);
+    }
+    if (ITTNOTIFY_NAME(module_load_with_sections) && ITTNOTIFY_NAME(module_load_with_sections) != ITT_VERSIONIZE(ITT_JOIN(_N_(module_load_with_sections),_init)))
+    {
+        if(module_obj != NULL)
+        {
+            module_obj->version = ITT_MODULE_OBJECT_VERSION;
+            ITTNOTIFY_NAME(module_load_with_sections)(module_obj);
+        }
+    }
+}
+
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(module_unload_with_sections),_init))(__itt_module_object* module_obj)
+{
+    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
+    {
+        __itt_init_ittlib_name(NULL, __itt_group_all);
+    }
+    if (ITTNOTIFY_NAME(module_unload_with_sections) && ITTNOTIFY_NAME(module_unload_with_sections) != ITT_VERSIONIZE(ITT_JOIN(_N_(module_unload_with_sections),_init)))
+    {
+        if(module_obj != NULL)
+        {
+            module_obj->version = ITT_MODULE_OBJECT_VERSION;
+            ITTNOTIFY_NAME(module_unload_with_sections)(module_obj);
+        }
+    }
+}
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init))(const wchar_t* name)
+{
+    __itt_string_handle *h_tail = NULL, *h = NULL;
+
+    if (name == NULL)
+    {
+        return NULL;
+    }
+
+    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+    if (_N_(_ittapi_global).api_initialized)
+    {
+        if (ITTNOTIFY_NAME(string_handle_createW) && ITTNOTIFY_NAME(string_handle_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init)))
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(string_handle_createW)(name);
+        }
+        else
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return NULL;
+        }
+    }
+    for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next)
+    {
+        if (h->strW != NULL && !wcscmp(h->strW, name)) break;
+    }
+    if (h == NULL)
+    {
+        NEW_STRING_HANDLE_W(&_N_(_ittapi_global),h,h_tail,name);
+    }
+    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+    return h;
+}
+
+static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA),_init))(const char* name)
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create),_init))(const char* name)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+{
+    __itt_string_handle *h_tail = NULL, *h = NULL;
+
+    if (name == NULL)
+    {
+        return NULL;
+    }
+
+    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+    if (_N_(_ittapi_global).api_initialized)
+    {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+        if (ITTNOTIFY_NAME(string_handle_createA) && ITTNOTIFY_NAME(string_handle_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA),_init)))
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(string_handle_createA)(name);
+        }
+#else
+        if (ITTNOTIFY_NAME(string_handle_create) && ITTNOTIFY_NAME(string_handle_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create),_init)))
+        {
+            if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(string_handle_create)(name);
+        }
+#endif
+        else
+        {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+#else
+            if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+#endif
+            return NULL;
+        }
+    }
+    for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next)
+    {
+        if (h->strA != NULL && !__itt_fstrcmp(h->strA, name)) break;
+    }
+    if (h == NULL)
+    {
+        NEW_STRING_HANDLE_A(&_N_(_ittapi_global),h,h_tail,name);
+    }
+    if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+    return h;
+}
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW),_init))(const wchar_t *name, const wchar_t *domain)
+{
+    __itt_counter_info_t *h_tail = NULL, *h = NULL;
+    __itt_metadata_type type = __itt_metadata_u64;
+
+    if (name == NULL)
+    {
+        return NULL;
+    }
+
+    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+    if (_N_(_ittapi_global).api_initialized)
+    {
+        if (ITTNOTIFY_NAME(counter_createW) && ITTNOTIFY_NAME(counter_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW),_init)))
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(counter_createW)(name, domain);
+        }
+        else
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return NULL;
+        }
+    }
+    for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
+    {
+        if (h->nameW != NULL  && h->type == (int)type && !wcscmp(h->nameW, name) && ((h->domainW == NULL && domain == NULL) ||
+            (h->domainW != NULL && domain != NULL && !wcscmp(h->domainW, domain)))) break;
+
+    }
+    if (h == NULL)
+    {
+        NEW_COUNTER_W(&_N_(_ittapi_global),h,h_tail,name,domain,type);
+    }
+    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+    return (__itt_counter)h;
+}
+
+static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA),_init))(const char *name, const char *domain)
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create),_init))(const char *name, const char *domain)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+{
+    __itt_counter_info_t *h_tail = NULL, *h = NULL;
+    __itt_metadata_type type = __itt_metadata_u64;
+
+    if (name == NULL)
+    {
+        return NULL;
+    }
+
+    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+    if (_N_(_ittapi_global).api_initialized)
+    {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+        if (ITTNOTIFY_NAME(counter_createA) && ITTNOTIFY_NAME(counter_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA),_init)))
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(counter_createA)(name, domain);
+        }
+#else
+        if (ITTNOTIFY_NAME(counter_create) && ITTNOTIFY_NAME(counter_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create),_init)))
+        {
+            if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(counter_create)(name, domain);
+        }
+#endif
+        else
+        {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+#else
+            if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+#endif
+            return NULL;
+        }
+    }
+    for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
+    {
+        if (h->nameA != NULL  && h->type == (int)type && !__itt_fstrcmp(h->nameA, name) && ((h->domainA == NULL && domain == NULL) ||
+            (h->domainA != NULL && domain != NULL && !__itt_fstrcmp(h->domainA, domain)))) break;
+    }
+    if (h == NULL)
+    {
+       NEW_COUNTER_A(&_N_(_ittapi_global),h,h_tail,name,domain,type);
+    }
+    if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+    return (__itt_counter)h;
+}
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedW),_init))(const wchar_t *name, const wchar_t *domain, __itt_metadata_type type)
+{
+    __itt_counter_info_t *h_tail = NULL, *h = NULL;
+
+    if (name == NULL)
+    {
+        return NULL;
+    }
+
+    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+    if (_N_(_ittapi_global).api_initialized)
+    {
+        if (ITTNOTIFY_NAME(counter_create_typedW) && ITTNOTIFY_NAME(counter_create_typedW) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedW),_init)))
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(counter_create_typedW)(name, domain, type);
+        }
+        else
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return NULL;
+        }
+    }
+    for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
+    {
+        if (h->nameW != NULL  && h->type == (int)type && !wcscmp(h->nameW, name) && ((h->domainW == NULL && domain == NULL) ||
+            (h->domainW != NULL && domain != NULL && !wcscmp(h->domainW, domain)))) break;
+
+    }
+    if (h == NULL)
+    {
+        NEW_COUNTER_W(&_N_(_ittapi_global),h,h_tail,name,domain,type);
+    }
+    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+    return (__itt_counter)h;
+}
+
+static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedA),_init))(const char *name, const char *domain, __itt_metadata_type type)
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typed),_init))(const char *name, const char *domain, __itt_metadata_type type)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+{
+    __itt_counter_info_t *h_tail = NULL, *h = NULL;
+
+    if (name == NULL)
+    {
+        return NULL;
+    }
+
+    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+    if (_N_(_ittapi_global).api_initialized)
+    {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+        if (ITTNOTIFY_NAME(counter_create_typedA) && ITTNOTIFY_NAME(counter_create_typedA) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedA),_init)))
+        {
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(counter_create_typedA)(name, domain, type);
+        }
+#else
+        if (ITTNOTIFY_NAME(counter_create_typed) && ITTNOTIFY_NAME(counter_create_typed) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typed),_init)))
+        {
+            if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+            return ITTNOTIFY_NAME(counter_create_typed)(name, domain, type);
+        }
+#endif
+        else
+        {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+            __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+#else
+            if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+#endif
+            return NULL;
+        }
+    }
+    for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
+    {
+        if (h->nameA != NULL  && h->type == (int)type && !__itt_fstrcmp(h->nameA, name) && ((h->domainA == NULL && domain == NULL) ||
+            (h->domainA != NULL && domain != NULL && !__itt_fstrcmp(h->domainA, domain)))) break;
+    }
+    if (h == NULL)
+    {
+       NEW_COUNTER_A(&_N_(_ittapi_global),h,h_tail,name,domain,type);
+    }
+    if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+    return (__itt_counter)h;
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))(void)
+{
+    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
+    {
+        __itt_init_ittlib_name(NULL, __itt_group_all);
+    }
+    if (ITTNOTIFY_NAME(pause) && ITTNOTIFY_NAME(pause) != ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init)))
+    {
+        ITTNOTIFY_NAME(pause)();
+    }
+    else
+    {
+        _N_(_ittapi_global).state = __itt_collection_paused;
+    }
+}
+
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))(void)
+{
+    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
+    {
+        __itt_init_ittlib_name(NULL, __itt_group_all);
+    }
+    if (ITTNOTIFY_NAME(resume) && ITTNOTIFY_NAME(resume) != ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init)))
+    {
+        ITTNOTIFY_NAME(resume)();
+    }
+    else
+    {
+        _N_(_ittapi_global).state = __itt_collection_normal;
+    }
+}
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(const wchar_t* name)
+{
+    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
+    {
+        __itt_init_ittlib_name(NULL, __itt_group_all);
+    }
+    if (ITTNOTIFY_NAME(thread_set_nameW) && ITTNOTIFY_NAME(thread_set_nameW) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init)))
+    {
+        ITTNOTIFY_NAME(thread_set_nameW)(name);
+    }
+}
+
+static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setW),_init))(const wchar_t* name, int namelen)
+{
+    (void)namelen;
+    ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(name);
+    return 0;
+}
+
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init))(const char* name)
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(const char* name)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+{
+    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
+    {
+        __itt_init_ittlib_name(NULL, __itt_group_all);
+    }
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+    if (ITTNOTIFY_NAME(thread_set_nameA) && ITTNOTIFY_NAME(thread_set_nameA) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init)))
+    {
+        ITTNOTIFY_NAME(thread_set_nameA)(name);
+    }
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+    if (ITTNOTIFY_NAME(thread_set_name) && ITTNOTIFY_NAME(thread_set_name) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init)))
+    {
+        ITTNOTIFY_NAME(thread_set_name)(name);
+    }
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+}
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setA),_init))(const char* name, int namelen)
+{
+    (void)namelen;
+    ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init))(name);
+    return 0;
+}
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_set),_init))(const char* name, int namelen)
+{
+    (void)namelen;
+    ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(name);
+    return 0;
+}
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(void)
+{
+    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
+    {
+        __itt_init_ittlib_name(NULL, __itt_group_all);
+    }
+    if (ITTNOTIFY_NAME(thread_ignore) && ITTNOTIFY_NAME(thread_ignore) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init)))
+    {
+        ITTNOTIFY_NAME(thread_ignore)();
+    }
+}
+
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_ignore),_init))(void)
+{
+    ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))();
+}
+
+static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(enable_attach),_init))(void)
+{
+#ifdef __ANDROID__
+    /*
+     * if LIB_VAR_NAME env variable were set before then stay previous value
+     * else set default path
+    */
+    setenv(ITT_TO_STR(LIB_VAR_NAME), ANDROID_ITTNOTIFY_DEFAULT_PATH, 0);
+#endif
+}
+
+/* -------------------------------------------------------------------------- */
+
+static const char* __itt_fsplit(const char* s, const char* sep, const char** out, int* len)
+{
+    int i;
+    int j;
+
+    if (!s || !sep || !out || !len)
+        return NULL;
+
+    for (i = 0; s[i]; i++)
+    {
+        int b = 0;
+        for (j = 0; sep[j]; j++)
+            if (s[i] == sep[j])
+            {
+                b = 1;
+                break;
+            }
+        if (!b)
+            break;
+    }
+
+    if (!s[i])
+        return NULL;
+
+    *len = 0;
+    *out = &s[i];
+
+    for (; s[i]; i++, (*len)++)
+    {
+        int b = 0;
+        for (j = 0; sep[j]; j++)
+            if (s[i] == sep[j])
+            {
+                b = 1;
+                break;
+            }
+        if (b)
+            break;
+    }
+
+    for (; s[i]; i++)
+    {
+        int b = 0;
+        for (j = 0; sep[j]; j++)
+            if (s[i] == sep[j])
+            {
+                b = 1;
+                break;
+            }
+        if (!b)
+            break;
+    }
+
+    return &s[i];
+}
+
+/* This function return value of env variable that placed into static buffer.
+ * !!! The same static buffer is used for subsequent calls. !!!
+ * This was done to avoid dynamic allocation for few calls.
+ * Actually we need this function only four times.
+ */
+static const char* __itt_get_env_var(const char* name)
+{
+#define MAX_ENV_VALUE_SIZE 4086
+    static char  env_buff[MAX_ENV_VALUE_SIZE];
+    static char* env_value = (char*)env_buff;
+
+    if (name != NULL)
+    {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+        size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff);
+        DWORD rc = GetEnvironmentVariableA(name, env_value, (DWORD)max_len);
+        if (rc >= max_len)
+            __itt_report_error(__itt_error_env_too_long, name, (size_t)rc - 1, (size_t)(max_len - 1));
+        else if (rc > 0)
+        {
+            const char* ret = (const char*)env_value;
+            env_value += rc + 1;
+            return ret;
+        }
+        else
+        {
+            /* If environment variable is empty, GetEnvironmentVariables()
+             * returns zero (number of characters (not including terminating null),
+             * and GetLastError() returns ERROR_SUCCESS. */
+            DWORD err = GetLastError();
+            if (err == ERROR_SUCCESS)
+                return env_value;
+
+            if (err != ERROR_ENVVAR_NOT_FOUND)
+                __itt_report_error(__itt_error_cant_read_env, name, (int)err);
+        }
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+        char* env = getenv(name);
+        if (env != NULL)
+        {
+            size_t len = __itt_fstrnlen(env, MAX_ENV_VALUE_SIZE);
+            size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff);
+            if (len < max_len)
+            {
+                const char* ret = (const char*)env_value;
+                __itt_fstrcpyn(env_value, max_len, env, len + 1);
+                env_value += len + 1;
+                return ret;
+            } else
+                __itt_report_error(__itt_error_env_too_long, name, (size_t)len, (size_t)(max_len - 1));
+        }
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+    }
+    return NULL;
+}
+
+static const char* __itt_get_lib_name(void)
+{
+    const char* lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
+
+#ifdef __ANDROID__
+    if (lib_name == NULL)
+    {
+
+#if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
+        const char* const marker_filename = "com.intel.itt.collector_lib_32";
+#else
+        const char* const marker_filename = "com.intel.itt.collector_lib_64";
+#endif
+
+        char system_wide_marker_filename[PATH_MAX] = {0};
+        int itt_marker_file_fd = -1;
+        ssize_t res = 0;
+
+        res = snprintf(system_wide_marker_filename, PATH_MAX - 1, "%s%s", "/data/local/tmp/", marker_filename);
+        if (res < 0)
+        {
+            ITT_ANDROID_LOGE("Unable to concatenate marker file string.");
+            return lib_name;
+        }
+        itt_marker_file_fd = open(system_wide_marker_filename, O_RDONLY);
+
+        if (itt_marker_file_fd == -1)
+        {
+            const pid_t my_pid = getpid();
+            char cmdline_path[PATH_MAX] = {0};
+            char package_name[PATH_MAX] = {0};
+            char app_sandbox_file[PATH_MAX] = {0};
+            int cmdline_fd = 0;
+
+            ITT_ANDROID_LOGI("Unable to open system-wide marker file.");
+            res = snprintf(cmdline_path, PATH_MAX - 1, "/proc/%d/cmdline", my_pid);
+            if (res < 0)
+            {
+                ITT_ANDROID_LOGE("Unable to get cmdline path string.");
+                return lib_name;
+            }
+
+            ITT_ANDROID_LOGI("CMD file: %s\n", cmdline_path);
+            cmdline_fd = open(cmdline_path, O_RDONLY);
+            if (cmdline_fd == -1)
+            {
+                ITT_ANDROID_LOGE("Unable to open %s file!", cmdline_path);
+                return lib_name;
+            }
+            res = read(cmdline_fd, package_name, PATH_MAX - 1);
+            if (res == -1)
+            {
+                ITT_ANDROID_LOGE("Unable to read %s file!", cmdline_path);
+                res = close(cmdline_fd);
+                if (res == -1)
+                {
+                    ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path);
+                }
+                return lib_name;
+            }
+            res = close(cmdline_fd);
+            if (res == -1)
+            {
+                ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path);
+                return lib_name;
+            }
+            ITT_ANDROID_LOGI("Package name: %s\n", package_name);
+            res = snprintf(app_sandbox_file, PATH_MAX - 1, "/data/data/%s/%s", package_name, marker_filename);
+            if (res < 0)
+            {
+                ITT_ANDROID_LOGE("Unable to concatenate marker file string.");
+                return lib_name;
+            }
+
+            ITT_ANDROID_LOGI("Lib marker file name: %s\n", app_sandbox_file);
+            itt_marker_file_fd = open(app_sandbox_file, O_RDONLY);
+            if (itt_marker_file_fd == -1)
+            {
+                ITT_ANDROID_LOGE("Unable to open app marker file!");
+                return lib_name;
+            }
+        }
+
+        {
+            char itt_lib_name[PATH_MAX] = {0};
+
+            res = read(itt_marker_file_fd, itt_lib_name, PATH_MAX - 1);
+            if (res == -1)
+            {
+                ITT_ANDROID_LOGE("Unable to read %s file!", itt_marker_file_fd);
+                res = close(itt_marker_file_fd);
+                if (res == -1)
+                {
+                    ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd);
+                }
+                return lib_name;
+            }
+            ITT_ANDROID_LOGI("ITT Lib path: %s", itt_lib_name);
+            res = close(itt_marker_file_fd);
+            if (res == -1)
+            {
+                ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd);
+                return lib_name;
+            }
+            ITT_ANDROID_LOGI("Set env %s to %s", ITT_TO_STR(LIB_VAR_NAME), itt_lib_name);
+            res = setenv(ITT_TO_STR(LIB_VAR_NAME), itt_lib_name, 0);
+            if (res == -1)
+            {
+                ITT_ANDROID_LOGE("Unable to set env var!");
+                return lib_name;
+            }
+            lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
+            ITT_ANDROID_LOGI("ITT Lib path from env: %s", lib_name);
+        }
+    }
+#endif
+
+    return lib_name;
+}
+
+/* Avoid clashes with std::min, reported by tbb team */
+#define __itt_min(a,b) ((a) < (b) ? (a) : (b))
+
+static __itt_group_id __itt_get_groups(void)
+{
+    int i;
+    __itt_group_id res = __itt_group_none;
+    const char* var_name  = "INTEL_ITTNOTIFY_GROUPS";
+    const char* group_str = __itt_get_env_var(var_name);
+
+    if (group_str != NULL)
+    {
+        int len;
+        char gr[255];
+        const char* chunk;
+        while ((group_str = __itt_fsplit(group_str, ",; ", &chunk, &len)) != NULL)
+        {
+            int min_len = __itt_min(len, (int)(sizeof(gr) - 1));
+            __itt_fstrcpyn(gr, sizeof(gr) - 1, chunk,  min_len);
+            gr[min_len] = 0;
+
+            for (i = 0; group_list[i].name != NULL; i++)
+            {
+                if (!__itt_fstrcmp(gr, group_list[i].name))
+                {
+                    res = (__itt_group_id)(res | group_list[i].id);
+                    break;
+                }
+            }
+        }
+        /* TODO: !!! Workaround for bug with warning for unknown group !!!
+         * Should be fixed in new initialization scheme.
+         * Now the following groups should be set always. */
+        for (i = 0; group_list[i].id != __itt_group_none; i++)
+            if (group_list[i].id != __itt_group_all &&
+                group_list[i].id > __itt_group_splitter_min &&
+                group_list[i].id < __itt_group_splitter_max)
+                res = (__itt_group_id)(res | group_list[i].id);
+        return res;
+    }
+    else
+    {
+        for (i = 0; group_alias[i].env_var != NULL; i++)
+            if (__itt_get_env_var(group_alias[i].env_var) != NULL)
+                return group_alias[i].groups;
+    }
+
+    return res;
+}
+
+#undef __itt_min
+
+static int __itt_lib_version(lib_t lib)
+{
+    if (lib == NULL)
+        return 0;
+    if (__itt_get_proc(lib, "__itt_api_init"))
+        return 2;
+    if (__itt_get_proc(lib, "__itt_api_version"))
+        return 1;
+    return 0;
+}
+
+/* It's not used right now! Comment it out to avoid warnings.
+static void __itt_reinit_all_pointers(void)
+{
+    register int i;
+    // Fill all pointers with initial stubs
+    for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
+        *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].init_func;
+}
+*/
+
+static void __itt_nullify_all_pointers(void)
+{
+    int i;
+    /* Nulify all pointers except domain_create, string_handle_create  and counter_create */
+    for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
+        *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
+}
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#pragma warning(push)
+#pragma warning(disable: 4054) /* warning C4054: 'type cast' : from function pointer 'XXX' to data pointer 'void *' */
+#pragma warning(disable: 4055) /* warning C4055: 'type cast' : from data pointer 'void *' to function pointer 'XXX' */
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+ITT_EXTERN_C void _N_(fini_ittlib)(void)
+{
+    __itt_api_fini_t* __itt_api_fini_ptr = NULL;
+    static volatile TIDT current_thread = 0;
+
+    if (_N_(_ittapi_global).api_initialized)
+    {
+        ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+        if (_N_(_ittapi_global).api_initialized)
+        {
+            if (current_thread == 0)
+            {
+                if (PTHREAD_SYMBOLS) current_thread = __itt_thread_id();
+                if (_N_(_ittapi_global).lib != NULL)
+                {
+                    __itt_api_fini_ptr = (__itt_api_fini_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_fini");
+                }
+                if (__itt_api_fini_ptr)
+                {
+                    __itt_api_fini_ptr(&_N_(_ittapi_global));
+                }
+
+                __itt_nullify_all_pointers();
+
+ /* TODO: !!! not safe !!! don't support unload so far.
+  *             if (_N_(_ittapi_global).lib != NULL)
+  *                 __itt_unload_lib(_N_(_ittapi_global).lib);
+  *             _N_(_ittapi_global).lib = NULL;
+  */
+                _N_(_ittapi_global).api_initialized = 0;
+                current_thread = 0;
+            }
+        }
+        if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+    }
+}
+
+ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_groups)
+{
+    int i;
+    __itt_group_id groups;
+#ifdef ITT_COMPLETE_GROUP
+    __itt_group_id zero_group = __itt_group_none;
+#endif /* ITT_COMPLETE_GROUP */
+    static volatile TIDT current_thread = 0;
+
+    if (!_N_(_ittapi_global).api_initialized)
+    {
+#ifndef ITT_SIMPLE_INIT
+        ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
+#endif /* ITT_SIMPLE_INIT */
+
+        if (!_N_(_ittapi_global).api_initialized)
+        {
+            if (current_thread == 0)
+            {
+                if (PTHREAD_SYMBOLS) current_thread = __itt_thread_id();
+                if (lib_name == NULL)
+                {
+                    lib_name = __itt_get_lib_name();
+                }
+                groups = __itt_get_groups();
+                if (DL_SYMBOLS && (groups != __itt_group_none || lib_name != NULL))
+                {
+                    _N_(_ittapi_global).lib = __itt_load_lib((lib_name == NULL) ? ittnotify_lib_name : lib_name);
+
+                    if (_N_(_ittapi_global).lib != NULL)
+                    {
+                        __itt_api_init_t* __itt_api_init_ptr;
+                        int lib_version = __itt_lib_version(_N_(_ittapi_global).lib);
+
+                        switch (lib_version)
+                        {
+                        case 0:
+                            groups = __itt_group_legacy;
+                            ITT_ATTRIBUTE_FALLTHROUGH;
+                        case 1:
+                            /* Fill all pointers from dynamic library */
+                            for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
+                            {
+                                if (_N_(_ittapi_global).api_list_ptr[i].group & groups & init_groups)
+                                {
+                                    *_N_(_ittapi_global).api_list_ptr[i].func_ptr = (void*)__itt_get_proc(_N_(_ittapi_global).lib, _N_(_ittapi_global).api_list_ptr[i].name);
+                                    if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr == NULL)
+                                    {
+                                        /* Restore pointers for function with static implementation */
+                                        *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
+                                        __itt_report_error(__itt_error_no_symbol, lib_name, _N_(_ittapi_global).api_list_ptr[i].name);
+#ifdef ITT_COMPLETE_GROUP
+                                        zero_group = (__itt_group_id)(zero_group | _N_(_ittapi_global).api_list_ptr[i].group);
+#endif /* ITT_COMPLETE_GROUP */
+                                    }
+                                }
+                                else
+                                    *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
+                            }
+
+                            if (groups == __itt_group_legacy)
+                            {
+                                /* Compatibility with legacy tools */
+                                ITTNOTIFY_NAME(thread_ignore)  = ITTNOTIFY_NAME(thr_ignore);
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+                                ITTNOTIFY_NAME(sync_createA)   = ITTNOTIFY_NAME(sync_set_nameA);
+                                ITTNOTIFY_NAME(sync_createW)   = ITTNOTIFY_NAME(sync_set_nameW);
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+                                ITTNOTIFY_NAME(sync_create)    = ITTNOTIFY_NAME(sync_set_name);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+                                ITTNOTIFY_NAME(sync_prepare)   = ITTNOTIFY_NAME(notify_sync_prepare);
+                                ITTNOTIFY_NAME(sync_cancel)    = ITTNOTIFY_NAME(notify_sync_cancel);
+                                ITTNOTIFY_NAME(sync_acquired)  = ITTNOTIFY_NAME(notify_sync_acquired);
+                                ITTNOTIFY_NAME(sync_releasing) = ITTNOTIFY_NAME(notify_sync_releasing);
+                            }
+
+#ifdef ITT_COMPLETE_GROUP
+                            for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
+                                if (_N_(_ittapi_global).api_list_ptr[i].group & zero_group)
+                                    *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
+#endif /* ITT_COMPLETE_GROUP */
+                            break;
+                        case 2:
+                            __itt_api_init_ptr = (__itt_api_init_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_init");
+                            if (__itt_api_init_ptr)
+                                __itt_api_init_ptr(&_N_(_ittapi_global), init_groups);
+                            break;
+                        }
+                    }
+                    else
+                    {
+                        __itt_nullify_all_pointers();
+
+                        __itt_report_error(__itt_error_no_module, lib_name,
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+                            __itt_system_error()
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+                            dlerror()
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+                        );
+                    }
+                }
+                else
+                {
+                    __itt_nullify_all_pointers();
+                }
+                _N_(_ittapi_global).api_initialized = 1;
+                current_thread = 0;
+                /* !!! Just to avoid unused code elimination !!! */
+                if (__itt_fini_ittlib_ptr == _N_(fini_ittlib)) current_thread = 0;
+            }
+        }
+
+#ifndef ITT_SIMPLE_INIT
+        if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
+#endif /* ITT_SIMPLE_INIT */
+    }
+
+    /* Evaluating if any function ptr is non empty and it's in init_groups */
+    for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
+    {
+        if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr != _N_(_ittapi_global).api_list_ptr[i].null_func &&
+            _N_(_ittapi_global).api_list_ptr[i].group & init_groups)
+        {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+ITT_EXTERN_C __itt_error_handler_t* _N_(set_error_handler)(__itt_error_handler_t* handler)
+{
+    __itt_error_handler_t* prev = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler;
+    _N_(_ittapi_global).error_handler = (void*)(size_t)handler;
+    return prev;
+}
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#pragma warning(pop)
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/** __itt_mark_pt_region functions marks region of interest
+ * region parameter defines different regions.
+ * 0 <= region < 8 */
+
+#if defined(ITT_API_IPT_SUPPORT) && (ITT_PLATFORM==ITT_PLATFORM_WIN || ITT_PLATFORM==ITT_PLATFORM_POSIX) && !defined(__ANDROID__)
+void __itt_pt_mark(__itt_pt_region region);
+void __itt_pt_mark_event(__itt_pt_region region);
+#endif
+
+ITT_EXTERN_C void _N_(mark_pt_region_begin)(__itt_pt_region region)
+{
+#if defined(ITT_API_IPT_SUPPORT) && (ITT_PLATFORM==ITT_PLATFORM_WIN || ITT_PLATFORM==ITT_PLATFORM_POSIX) && !defined(__ANDROID__)
+    if (_N_(_ittapi_global).ipt_collect_events == 1)
+    {
+        __itt_pt_mark_event(2*region);
+    }
+    else
+    {
+        __itt_pt_mark(2*region);
+    }
+#else
+    (void)region;
+#endif
+}
+
+ITT_EXTERN_C void _N_(mark_pt_region_end)(__itt_pt_region region)
+{
+#if defined(ITT_API_IPT_SUPPORT) && (ITT_PLATFORM==ITT_PLATFORM_WIN || ITT_PLATFORM==ITT_PLATFORM_POSIX) && !defined(__ANDROID__)
+    if (_N_(_ittapi_global).ipt_collect_events == 1)
+    {
+        __itt_pt_mark_event(2*region + 1);
+    }
+    else
+    {
+        __itt_pt_mark(2*region + 1);
+    }
+#else
+     (void)region;
+#endif
+}
+
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_static.h b/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_static.h
new file mode 100644
index 00000000000000..2186eca35f1870
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_static.h
@@ -0,0 +1,346 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+
+#include "ittnotify_config.h"
+
+#ifndef ITT_FORMAT_DEFINED
+#  ifndef ITT_FORMAT
+#    define ITT_FORMAT
+#  endif /* ITT_FORMAT */
+#  ifndef ITT_NO_PARAMS
+#    define ITT_NO_PARAMS
+#  endif /* ITT_NO_PARAMS */
+#endif /* ITT_FORMAT_DEFINED */
+
+/*
+ * parameters for macro expected:
+ * ITT_STUB(api, type, func_name, arguments, params, func_name_in_dll, group, printf_fmt)
+ */
+#ifdef __ITT_INTERNAL_INIT
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_domain*, domain_createA, (const char    *name), (ITT_FORMAT name), domain_createA, __itt_group_structure, "\"%s\"")
+ITT_STUB(ITTAPI, __itt_domain*, domain_createW, (const wchar_t *name), (ITT_FORMAT name), domain_createW, __itt_group_structure, "\"%S\"")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_domain*, domain_create,  (const char    *name), (ITT_FORMAT name), domain_create,  __itt_group_structure, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+ITT_STUBV(ITTAPI, void, module_load_with_sections, (__itt_module_object* module_obj), (ITT_FORMAT module_obj), module_load_with_sections, __itt_group_module, "%p")
+ITT_STUBV(ITTAPI, void, module_unload_with_sections, (__itt_module_object* module_obj), (ITT_FORMAT module_obj), module_unload_with_sections, __itt_group_module, "%p")
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createA, (const char    *name), (ITT_FORMAT name), string_handle_createA, __itt_group_structure, "\"%s\"")
+ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createW, (const wchar_t *name), (ITT_FORMAT name), string_handle_createW, __itt_group_structure, "\"%S\"")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_create,  (const char    *name), (ITT_FORMAT name), string_handle_create,  __itt_group_structure, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_counter, counter_createA, (const char    *name, const char    *domain), (ITT_FORMAT name, domain), counter_createA, __itt_group_counter, "\"%s\", \"%s\"")
+ITT_STUB(ITTAPI, __itt_counter, counter_createW, (const wchar_t *name, const wchar_t *domain), (ITT_FORMAT name, domain), counter_createW, __itt_group_counter, "\"%s\", \"%s\"")
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_counter, counter_create,  (const char    *name, const char    *domain), (ITT_FORMAT name, domain), counter_create,  __itt_group_counter, "\"%s\", \"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_counter, counter_create_typedA, (const char    *name, const char    *domain, __itt_metadata_type type), (ITT_FORMAT name, domain, type), counter_create_typedA, __itt_group_counter, "\"%s\", \"%s\", %d")
+ITT_STUB(ITTAPI, __itt_counter, counter_create_typedW, (const wchar_t *name, const wchar_t *domain, __itt_metadata_type type), (ITT_FORMAT name, domain, type), counter_create_typedW, __itt_group_counter, "\"%s\", \"%s\", %d")
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_counter, counter_create_typed,  (const char    *name, const char    *domain, __itt_metadata_type type), (ITT_FORMAT name, domain, type), counter_create_typed,  __itt_group_counter, "\"%s\", \"%s\", %d")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+
+ITT_STUBV(ITTAPI, void, pause,  (void), (ITT_NO_PARAMS), pause,  __itt_group_control | __itt_group_legacy, "no args")
+ITT_STUBV(ITTAPI, void, resume, (void), (ITT_NO_PARAMS), resume, __itt_group_control | __itt_group_legacy, "no args")
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, thread_set_nameA, (const char    *name), (ITT_FORMAT name), thread_set_nameA, __itt_group_thread, "\"%s\"")
+ITT_STUBV(ITTAPI, void, thread_set_nameW, (const wchar_t *name), (ITT_FORMAT name), thread_set_nameW, __itt_group_thread, "\"%S\"")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, thread_set_name,  (const char    *name), (ITT_FORMAT name), thread_set_name,  __itt_group_thread, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, thread_ignore, (void), (ITT_NO_PARAMS), thread_ignore, __itt_group_thread, "no args")
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, int,  thr_name_setA, (const char    *name, int namelen), (ITT_FORMAT name, namelen), thr_name_setA, __itt_group_thread | __itt_group_legacy, "\"%s\", %d")
+ITT_STUB(LIBITTAPI, int,  thr_name_setW, (const wchar_t *name, int namelen), (ITT_FORMAT name, namelen), thr_name_setW, __itt_group_thread | __itt_group_legacy, "\"%S\", %d")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int,  thr_name_set,  (const char    *name, int namelen), (ITT_FORMAT name, namelen), thr_name_set,  __itt_group_thread | __itt_group_legacy, "\"%s\", %d")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(LIBITTAPI, void, thr_ignore,   (void),                             (ITT_NO_PARAMS),            thr_ignore,    __itt_group_thread | __itt_group_legacy, "no args")
+#endif /* __ITT_INTERNAL_BODY */
+
+ITT_STUBV(ITTAPI, void, enable_attach, (void), (ITT_NO_PARAMS), enable_attach, __itt_group_all, "no args")
+
+#else  /* __ITT_INTERNAL_INIT */
+
+ITT_STUBV(ITTAPI, void, detach, (void), (ITT_NO_PARAMS), detach, __itt_group_control | __itt_group_legacy, "no args")
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, sync_createA, (void *addr, const char    *objtype, const char    *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_createA, __itt_group_sync | __itt_group_fsync, "%p, \"%s\", \"%s\", %x")
+ITT_STUBV(ITTAPI, void, sync_createW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_createW, __itt_group_sync | __itt_group_fsync, "%p, \"%S\", \"%S\", %x")
+ITT_STUBV(ITTAPI, void, sync_renameA, (void *addr, const char    *name), (ITT_FORMAT addr, name), sync_renameA, __itt_group_sync | __itt_group_fsync, "%p, \"%s\"")
+ITT_STUBV(ITTAPI, void, sync_renameW, (void *addr, const wchar_t *name), (ITT_FORMAT addr, name), sync_renameW, __itt_group_sync | __itt_group_fsync, "%p, \"%S\"")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_create,  (void *addr, const char    *objtype, const char    *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_create,  __itt_group_sync | __itt_group_fsync, "%p, \"%s\", \"%s\", %x")
+ITT_STUBV(ITTAPI, void, sync_rename,  (void *addr, const char    *name), (ITT_FORMAT addr, name), sync_rename,  __itt_group_sync | __itt_group_fsync, "%p, \"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_destroy,    (void *addr), (ITT_FORMAT addr), sync_destroy,   __itt_group_sync | __itt_group_fsync, "%p")
+
+ITT_STUBV(ITTAPI, void, sync_prepare,    (void* addr), (ITT_FORMAT addr), sync_prepare,   __itt_group_sync,  "%p")
+ITT_STUBV(ITTAPI, void, sync_cancel,     (void *addr), (ITT_FORMAT addr), sync_cancel,    __itt_group_sync,  "%p")
+ITT_STUBV(ITTAPI, void, sync_acquired,   (void *addr), (ITT_FORMAT addr), sync_acquired,  __itt_group_sync,  "%p")
+ITT_STUBV(ITTAPI, void, sync_releasing,  (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_sync,  "%p")
+
+ITT_STUBV(ITTAPI, void, suppress_push,       (unsigned int mask),                             (ITT_FORMAT mask), suppress_push,  __itt_group_suppress,  "%p")
+ITT_STUBV(ITTAPI, void, suppress_pop,        (void),                                          (ITT_NO_PARAMS),   suppress_pop,   __itt_group_suppress,  "no args")
+ITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_mark_range, __itt_group_suppress, "%d, %p, %p, %d")
+ITT_STUBV(ITTAPI, void, suppress_clear_range,(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_clear_range,__itt_group_suppress, "%d, %p, %p, %d")
+
+ITT_STUBV(ITTAPI, void, fsync_prepare,   (void* addr), (ITT_FORMAT addr), sync_prepare,   __itt_group_fsync, "%p")
+ITT_STUBV(ITTAPI, void, fsync_cancel,    (void *addr), (ITT_FORMAT addr), sync_cancel,    __itt_group_fsync, "%p")
+ITT_STUBV(ITTAPI, void, fsync_acquired,  (void *addr), (ITT_FORMAT addr), sync_acquired,  __itt_group_fsync, "%p")
+ITT_STUBV(ITTAPI, void, fsync_releasing, (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_fsync, "%p")
+
+ITT_STUBV(ITTAPI, void, model_site_begin,          (__itt_model_site *site, __itt_model_site_instance *instance, const char *name), (ITT_FORMAT site, instance, name), model_site_begin, __itt_group_model, "%p, %p, \"%s\"")
+ITT_STUBV(ITTAPI, void, model_site_end,            (__itt_model_site *site, __itt_model_site_instance *instance),                   (ITT_FORMAT site, instance),       model_site_end,   __itt_group_model, "%p, %p")
+ITT_STUBV(ITTAPI, void, model_task_begin,          (__itt_model_task *task, __itt_model_task_instance *instance, const char *name), (ITT_FORMAT task, instance, name), model_task_begin, __itt_group_model, "%p, %p, \"%s\"")
+ITT_STUBV(ITTAPI, void, model_task_end,            (__itt_model_task *task, __itt_model_task_instance *instance),                   (ITT_FORMAT task, instance),       model_task_end,   __itt_group_model, "%p, %p")
+ITT_STUBV(ITTAPI, void, model_lock_acquire,        (void *lock), (ITT_FORMAT lock), model_lock_acquire, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_lock_release,        (void *lock), (ITT_FORMAT lock), model_lock_release, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_record_allocation,   (void *addr, size_t size), (ITT_FORMAT addr, size), model_record_allocation,   __itt_group_model, "%p, %d")
+ITT_STUBV(ITTAPI, void, model_record_deallocation, (void *addr),              (ITT_FORMAT addr),       model_record_deallocation, __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_induction_uses,      (void* addr, size_t size), (ITT_FORMAT addr, size), model_induction_uses,      __itt_group_model, "%p, %d")
+ITT_STUBV(ITTAPI, void, model_reduction_uses,      (void* addr, size_t size), (ITT_FORMAT addr, size), model_reduction_uses,      __itt_group_model, "%p, %d")
+ITT_STUBV(ITTAPI, void, model_observe_uses,        (void* addr, size_t size), (ITT_FORMAT addr, size), model_observe_uses,        __itt_group_model, "%p, %d")
+ITT_STUBV(ITTAPI, void, model_clear_uses,          (void* addr),              (ITT_FORMAT addr),       model_clear_uses,          __itt_group_model, "%p")
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, model_site_beginW,         (const wchar_t *name),     (ITT_FORMAT name),       model_site_beginW,         __itt_group_model, "\"%s\"")
+ITT_STUBV(ITTAPI, void, model_task_beginW,         (const wchar_t *name),     (ITT_FORMAT name),       model_task_beginW,         __itt_group_model, "\"%s\"")
+ITT_STUBV(ITTAPI, void, model_iteration_taskW,     (const wchar_t *name),     (ITT_FORMAT name),       model_iteration_taskW,     __itt_group_model, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, model_site_beginA,         (const char *name),        (ITT_FORMAT name),       model_site_beginA,         __itt_group_model, "\"%s\"")
+ITT_STUBV(ITTAPI, void, model_site_beginAL,        (const char *name, size_t len), (ITT_FORMAT name, len), model_site_beginAL,    __itt_group_model, "\"%s\", %d")
+ITT_STUBV(ITTAPI, void, model_task_beginA,         (const char *name),        (ITT_FORMAT name),       model_task_beginA,         __itt_group_model, "\"%s\"")
+ITT_STUBV(ITTAPI, void, model_task_beginAL,        (const char *name, size_t len), (ITT_FORMAT name, len), model_task_beginAL,    __itt_group_model, "\"%s\", %d")
+ITT_STUBV(ITTAPI, void, model_iteration_taskA,     (const char *name),        (ITT_FORMAT name),       model_iteration_taskA,     __itt_group_model, "\"%s\"")
+ITT_STUBV(ITTAPI, void, model_iteration_taskAL,    (const char *name, size_t len), (ITT_FORMAT name, len), model_iteration_taskAL, __itt_group_model, "\"%s\", %d")
+ITT_STUBV(ITTAPI, void, model_site_end_2,          (void),                    (ITT_NO_PARAMS),         model_site_end_2,          __itt_group_model, "no args")
+ITT_STUBV(ITTAPI, void, model_task_end_2,          (void),                    (ITT_NO_PARAMS),         model_task_end_2,          __itt_group_model, "no args")
+ITT_STUBV(ITTAPI, void, model_lock_acquire_2,      (void *lock),              (ITT_FORMAT lock),       model_lock_acquire_2,      __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_lock_release_2,      (void *lock),              (ITT_FORMAT lock),       model_lock_release_2,      __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_aggregate_task,      (size_t count),            (ITT_FORMAT count),      model_aggregate_task,      __itt_group_model, "%d")
+ITT_STUBV(ITTAPI, void, model_disable_push,        (__itt_model_disable x),   (ITT_FORMAT x),          model_disable_push,        __itt_group_model, "%p")
+ITT_STUBV(ITTAPI, void, model_disable_pop,         (void),                    (ITT_NO_PARAMS),         model_disable_pop,         __itt_group_model, "no args")
+#endif /* __ITT_INTERNAL_BODY */
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createA, (const char    *name, const char    *domain), (ITT_FORMAT name, domain), heap_function_createA, __itt_group_heap, "\"%s\", \"%s\"")
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createW, (const wchar_t *name, const wchar_t *domain), (ITT_FORMAT name, domain), heap_function_createW, __itt_group_heap, "\"%s\", \"%s\"")
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_heap_function, heap_function_create,  (const char    *name, const char    *domain), (ITT_FORMAT name, domain), heap_function_create,  __itt_group_heap, "\"%s\", \"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __ITT_INTERNAL_BODY */
+ITT_STUBV(ITTAPI, void, heap_allocate_begin,   (__itt_heap_function h, size_t size, int initialized),             (ITT_FORMAT h, size, initialized),       heap_allocate_begin, __itt_group_heap, "%p, %lu, %d")
+ITT_STUBV(ITTAPI, void, heap_allocate_end,     (__itt_heap_function h, void** addr, size_t size, int initialized), (ITT_FORMAT h, addr, size, initialized), heap_allocate_end,   __itt_group_heap, "%p, %p, %lu, %d")
+ITT_STUBV(ITTAPI, void, heap_free_begin,       (__itt_heap_function h, void*  addr), (ITT_FORMAT h, addr), heap_free_begin, __itt_group_heap, "%p, %p")
+ITT_STUBV(ITTAPI, void, heap_free_end,         (__itt_heap_function h, void*  addr), (ITT_FORMAT h, addr), heap_free_end,   __itt_group_heap, "%p, %p")
+ITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void*  addr, size_t new_size, int initialized),                  (ITT_FORMAT h, addr, new_size, initialized),           heap_reallocate_begin, __itt_group_heap, "%p, %p, %lu, %d")
+ITT_STUBV(ITTAPI, void, heap_reallocate_end,   (__itt_heap_function h, void*  addr, void** new_addr, size_t new_size, int initialized), (ITT_FORMAT h, addr, new_addr, new_size, initialized), heap_reallocate_end,   __itt_group_heap, "%p, %p, %p, %lu, %d")
+ITT_STUBV(ITTAPI, void, heap_internal_access_begin, (void), (ITT_NO_PARAMS), heap_internal_access_begin, __itt_group_heap, "no args")
+ITT_STUBV(ITTAPI, void, heap_internal_access_end,   (void), (ITT_NO_PARAMS), heap_internal_access_end,   __itt_group_heap, "no args")
+ITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin, (void), (ITT_NO_PARAMS), heap_record_memory_growth_begin, __itt_group_heap, "no args")
+ITT_STUBV(ITTAPI, void, heap_record_memory_growth_end,   (void), (ITT_NO_PARAMS), heap_record_memory_growth_end,   __itt_group_heap, "no args")
+ITT_STUBV(ITTAPI, void, heap_reset_detection, (unsigned int reset_mask),  (ITT_FORMAT reset_mask), heap_reset_detection, __itt_group_heap, "%u")
+ITT_STUBV(ITTAPI, void, heap_record,          (unsigned int record_mask), (ITT_FORMAT record_mask),  heap_record,        __itt_group_heap, "%u")
+
+ITT_STUBV(ITTAPI, void, id_create,  (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_create,  __itt_group_structure, "%p, %lu")
+ITT_STUBV(ITTAPI, void, id_destroy, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_destroy, __itt_group_structure, "%p, %lu")
+
+ITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void), (ITT_NO_PARAMS), get_timestamp,  __itt_group_structure, "no args")
+
+ITT_STUBV(ITTAPI, void, region_begin, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), region_begin, __itt_group_structure, "%p, %lu, %lu, %p")
+ITT_STUBV(ITTAPI, void, region_end,   (const __itt_domain *domain, __itt_id id),                                             (ITT_FORMAT domain, id),               region_end,   __itt_group_structure, "%p, %lu")
+
+#ifndef __ITT_INTERNAL_BODY
+ITT_STUBV(ITTAPI, void, frame_begin_v3,  (const __itt_domain *domain, __itt_id *id),                                             (ITT_FORMAT domain, id),             frame_begin_v3,  __itt_group_structure, "%p, %p")
+ITT_STUBV(ITTAPI, void, frame_end_v3,    (const __itt_domain *domain, __itt_id *id),                                             (ITT_FORMAT domain, id),             frame_end_v3,    __itt_group_structure, "%p, %p")
+ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end), (ITT_FORMAT domain, id, begin, end), frame_submit_v3, __itt_group_structure, "%p, %p, %lu, %lu")
+#endif /* __ITT_INTERNAL_BODY */
+
+ITT_STUBV(ITTAPI, void, task_group,   (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), task_group,  __itt_group_structure, "%p, %lu, %lu, %p")
+
+ITT_STUBV(ITTAPI, void, task_begin,    (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), task_begin,    __itt_group_structure, "%p, %lu, %lu, %p")
+ITT_STUBV(ITTAPI, void, task_begin_fn, (const __itt_domain *domain, __itt_id id, __itt_id parent, void* fn),                  (ITT_FORMAT domain, id, parent, fn),   task_begin_fn, __itt_group_structure, "%p, %lu, %lu, %p")
+ITT_STUBV(ITTAPI, void, task_end,      (const __itt_domain *domain),                                                          (ITT_FORMAT domain),                   task_end,      __itt_group_structure, "%p")
+
+ITT_STUBV(ITTAPI, void, counter_inc_v3,       (const __itt_domain *domain, __itt_string_handle *name),                           (ITT_FORMAT domain, name),        counter_inc_v3,       __itt_group_structure, "%p, %p")
+ITT_STUBV(ITTAPI, void, counter_inc_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long value), (ITT_FORMAT domain, name, value), counter_inc_delta_v3, __itt_group_structure, "%p, %p, %lu")
+ITT_STUBV(ITTAPI, void, counter_dec_v3,       (const __itt_domain *domain, __itt_string_handle *name),                           (ITT_FORMAT domain, name),        counter_dec_v3,       __itt_group_structure, "%p, %p")
+ITT_STUBV(ITTAPI, void, counter_dec_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long value), (ITT_FORMAT domain, name, value), counter_dec_delta_v3, __itt_group_structure, "%p, %p, %lu")
+
+ITT_STUBV(ITTAPI, void, marker, (const __itt_domain *domain, __itt_id id, __itt_string_handle *name, __itt_scope scope), (ITT_FORMAT domain, id, name, scope), marker, __itt_group_structure, "%p, %lu, %p, %d")
+
+ITT_STUBV(ITTAPI, void, metadata_add,      (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data), (ITT_FORMAT domain, id, key, type, count, data), metadata_add, __itt_group_structure, "%p, %lu, %p, %d, %lu, %p")
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, metadata_str_addA, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char* data, size_t length),    (ITT_FORMAT domain, id, key, data, length), metadata_str_addA, __itt_group_structure, "%p, %lu, %p, %p, %lu")
+ITT_STUBV(ITTAPI, void, metadata_str_addW, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const wchar_t* data, size_t length), (ITT_FORMAT domain, id, key, data, length), metadata_str_addW, __itt_group_structure, "%p, %lu, %p, %p, %lu")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, metadata_str_add,  (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char* data, size_t length),    (ITT_FORMAT domain, id, key, data, length), metadata_str_add,  __itt_group_structure, "%p, %lu, %p, %p, %lu")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+ITT_STUBV(ITTAPI, void, relation_add_to_current, (const __itt_domain *domain, __itt_relation relation, __itt_id tail),                (ITT_FORMAT domain, relation, tail),       relation_add_to_current, __itt_group_structure, "%p, %lu, %p")
+ITT_STUBV(ITTAPI, void, relation_add,            (const __itt_domain *domain, __itt_id head, __itt_relation relation, __itt_id tail), (ITT_FORMAT domain, head, relation, tail), relation_add,            __itt_group_structure, "%p, %p, %lu, %p")
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char    *name, int namelen), (ITT_FORMAT name, namelen), event_createA, __itt_group_mark | __itt_group_legacy, "\"%s\", %d")
+ITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen), (ITT_FORMAT name, namelen), event_createW, __itt_group_mark | __itt_group_legacy, "\"%S\", %d")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, __itt_event, event_create,  (const char    *name, int namelen), (ITT_FORMAT name, namelen), event_create,  __itt_group_mark | __itt_group_legacy, "\"%s\", %d")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int,  event_start,          (__itt_event event),                (ITT_FORMAT event),         event_start,   __itt_group_mark | __itt_group_legacy, "%d")
+ITT_STUB(LIBITTAPI, int,  event_end,            (__itt_event event),                (ITT_FORMAT event),         event_end,     __itt_group_mark | __itt_group_legacy, "%d")
+#endif /* __ITT_INTERNAL_BODY */
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, sync_set_nameA, (void *addr, const char    *objtype, const char    *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_nameA, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%s\", \"%s\", %x")
+ITT_STUBV(ITTAPI, void, sync_set_nameW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_nameW, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%S\", \"%S\", %x")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, sync_set_name,  (void *addr, const char    *objtype, const char    *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_name,  __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "p, \"%s\", \"%s\", %x")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(LIBITTAPI, int, notify_sync_nameA, (void *p, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_nameA, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%s\", %d, \"%s\", %d, %x")
+ITT_STUB(LIBITTAPI, int, notify_sync_nameW, (void *p, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_nameW, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%S\", %d, \"%S\", %d, %x")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(LIBITTAPI, int, notify_sync_name,  (void *p, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_name,  __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%s\", %d, \"%s\", %d, %x")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+ITT_STUBV(LIBITTAPI, void, notify_sync_prepare,   (void *p), (ITT_FORMAT p), notify_sync_prepare,   __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p")
+ITT_STUBV(LIBITTAPI, void, notify_sync_cancel,    (void *p), (ITT_FORMAT p), notify_sync_cancel,    __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p")
+ITT_STUBV(LIBITTAPI, void, notify_sync_acquired,  (void *p), (ITT_FORMAT p), notify_sync_acquired,  __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p")
+ITT_STUBV(LIBITTAPI, void, notify_sync_releasing, (void *p), (ITT_FORMAT p), notify_sync_releasing, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p")
+#endif /* __ITT_INTERNAL_BODY */
+
+ITT_STUBV(LIBITTAPI, void, memory_read,   (void *addr, size_t size), (ITT_FORMAT addr, size), memory_read,   __itt_group_legacy, "%p, %lu")
+ITT_STUBV(LIBITTAPI, void, memory_write,  (void *addr, size_t size), (ITT_FORMAT addr, size), memory_write,  __itt_group_legacy, "%p, %lu")
+ITT_STUBV(LIBITTAPI, void, memory_update, (void *addr, size_t size), (ITT_FORMAT addr, size), memory_update, __itt_group_legacy, "%p, %lu")
+
+ITT_STUB(LIBITTAPI, __itt_state_t,     state_get,    (void),                                    (ITT_NO_PARAMS),   state_get,    __itt_group_legacy, "no args")
+ITT_STUB(LIBITTAPI, __itt_state_t,     state_set,    (__itt_state_t s),                         (ITT_FORMAT s),    state_set,    __itt_group_legacy, "%d")
+ITT_STUB(LIBITTAPI, __itt_obj_state_t, obj_mode_set, (__itt_obj_prop_t p, __itt_obj_state_t s), (ITT_FORMAT p, s), obj_mode_set, __itt_group_legacy, "%d, %d")
+ITT_STUB(LIBITTAPI, __itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t p, __itt_thr_state_t s), (ITT_FORMAT p, s), thr_mode_set, __itt_group_legacy, "%d, %d")
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_frame, frame_createA, (const char    *domain), (ITT_FORMAT domain), frame_createA, __itt_group_frame, "\"%s\"")
+ITT_STUB(ITTAPI, __itt_frame, frame_createW, (const wchar_t *domain), (ITT_FORMAT domain), frame_createW, __itt_group_frame, "\"%s\"")
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_frame, frame_create,  (const char    *domain), (ITT_FORMAT domain), frame_create,  __itt_group_frame, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_pt_region, pt_region_createA, (const char    *name), (ITT_FORMAT name), pt_region_createA, __itt_group_structure, "\"%s\"")
+ITT_STUB(ITTAPI, __itt_pt_region, pt_region_createW, (const wchar_t *name), (ITT_FORMAT name), pt_region_createW, __itt_group_structure, "\"%S\"")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_pt_region, pt_region_create,  (const char    *name), (ITT_FORMAT name), pt_region_create,  __itt_group_structure, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __ITT_INTERNAL_BODY */
+ITT_STUBV(ITTAPI, void, frame_begin,         (__itt_frame frame),     (ITT_FORMAT frame),  frame_begin,   __itt_group_frame, "%p")
+ITT_STUBV(ITTAPI, void, frame_end,           (__itt_frame frame),     (ITT_FORMAT frame),  frame_end,     __itt_group_frame, "%p")
+
+ITT_STUBV(ITTAPI, void, counter_destroy,      (__itt_counter id),                                                                                  (ITT_FORMAT id),        counter_destroy,   __itt_group_counter, "%p")
+ITT_STUBV(ITTAPI, void, counter_inc,          (__itt_counter id),                                                                                  (ITT_FORMAT id),        counter_inc,       __itt_group_counter, "%p")
+ITT_STUBV(ITTAPI, void, counter_inc_delta,    (__itt_counter id, unsigned long long value),                                                        (ITT_FORMAT id, value), counter_inc_delta, __itt_group_counter, "%p, %lu")
+ITT_STUBV(ITTAPI, void, counter_dec,          (__itt_counter id),                                                                                  (ITT_FORMAT id),        counter_dec,       __itt_group_counter, "%p")
+ITT_STUBV(ITTAPI, void, counter_dec_delta,    (__itt_counter id, unsigned long long value),                                                        (ITT_FORMAT id, value), counter_dec_delta, __itt_group_counter, "%p, %lu")
+ITT_STUBV(ITTAPI, void, counter_set_value,    (__itt_counter id, void *value_ptr),                                                                 (ITT_FORMAT id, value_ptr),                          counter_set_value,    __itt_group_counter, "%p, %p")
+ITT_STUBV(ITTAPI, void, counter_set_value_ex, (__itt_counter id, __itt_clock_domain *clock_domain, unsigned long long timestamp, void *value_ptr), (ITT_FORMAT id, clock_domain, timestamp, value_ptr), counter_set_value_ex, __itt_group_counter, "%p, %p, %llu, %p")
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, __itt_mark_type, mark_createA, (const char    *name), (ITT_FORMAT name), mark_createA, __itt_group_mark, "\"%s\"")
+ITT_STUB(ITTAPI, __itt_mark_type, mark_createW, (const wchar_t *name), (ITT_FORMAT name), mark_createW, __itt_group_mark, "\"%S\"")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, __itt_mark_type, mark_create,  (const char    *name), (ITT_FORMAT name), mark_create,  __itt_group_mark, "\"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __ITT_INTERNAL_BODY */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int,  markA,        (__itt_mark_type mt, const char    *parameter), (ITT_FORMAT mt, parameter), markA, __itt_group_mark, "%d, \"%s\"")
+ITT_STUB(ITTAPI, int,  markW,        (__itt_mark_type mt, const wchar_t *parameter), (ITT_FORMAT mt, parameter), markW, __itt_group_mark, "%d, \"%S\"")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int,  mark,         (__itt_mark_type mt, const char    *parameter), (ITT_FORMAT mt, parameter), mark,  __itt_group_mark, "%d, \"%s\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int,  mark_off, (__itt_mark_type mt), (ITT_FORMAT mt), mark_off, __itt_group_mark, "%d")
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int,  mark_globalA, (__itt_mark_type mt, const char    *parameter), (ITT_FORMAT mt, parameter), mark_globalA, __itt_group_mark, "%d, \"%s\"")
+ITT_STUB(ITTAPI, int,  mark_globalW, (__itt_mark_type mt, const wchar_t *parameter), (ITT_FORMAT mt, parameter), mark_globalW, __itt_group_mark, "%d, \"%S\"")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int,  mark_global,  (__itt_mark_type mt, const char    *parameter), (ITT_FORMAT mt, parameter), mark_global,  __itt_group_mark, "%d, \"%S\"")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int,  mark_global_off, (__itt_mark_type mt),                        (ITT_FORMAT mt),            mark_global_off, __itt_group_mark, "%d")
+
+#ifndef __ITT_INTERNAL_BODY
+ITT_STUB(ITTAPI, __itt_caller, stack_caller_create, (void), (ITT_NO_PARAMS), stack_caller_create,  __itt_group_stitch, "no args")
+#endif /* __ITT_INTERNAL_BODY */
+ITT_STUBV(ITTAPI, void, stack_caller_destroy, (__itt_caller id), (ITT_FORMAT id), stack_caller_destroy, __itt_group_stitch, "%p")
+ITT_STUBV(ITTAPI, void, stack_callee_enter,   (__itt_caller id), (ITT_FORMAT id), stack_callee_enter,   __itt_group_stitch, "%p")
+ITT_STUBV(ITTAPI, void, stack_callee_leave,   (__itt_caller id), (ITT_FORMAT id), stack_callee_leave,   __itt_group_stitch, "%p")
+
+ITT_STUB(ITTAPI,  __itt_clock_domain*, clock_domain_create, (__itt_get_clock_info_fn fn, void* fn_data), (ITT_FORMAT fn, fn_data), clock_domain_create, __itt_group_structure, "%p, %p")
+ITT_STUBV(ITTAPI, void,                clock_domain_reset,  (void),                                      (ITT_NO_PARAMS),          clock_domain_reset,  __itt_group_structure, "no args")
+ITT_STUBV(ITTAPI, void, id_create_ex,  (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id), (ITT_FORMAT domain, clock_domain, timestamp, id), id_create_ex,  __itt_group_structure, "%p, %p, %lu, %lu")
+ITT_STUBV(ITTAPI, void, id_destroy_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id), (ITT_FORMAT domain, clock_domain, timestamp, id), id_destroy_ex, __itt_group_structure, "%p, %p, %lu, %lu")
+ITT_STUBV(ITTAPI, void, task_begin_ex,    (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, __itt_string_handle *name), (ITT_FORMAT domain, clock_domain, timestamp, id, parentid, name), task_begin_ex, __itt_group_structure, "%p, %p, %lu, %lu, %lu, %p")
+ITT_STUBV(ITTAPI, void, task_begin_fn_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, void* fn),                  (ITT_FORMAT domain, clock_domain, timestamp, id, parentid, fn), task_begin_fn_ex, __itt_group_structure, "%p, %p, %lu, %lu, %lu, %p")
+ITT_STUBV(ITTAPI, void, task_end_ex,      (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp),                                                            (ITT_FORMAT domain, clock_domain, timestamp), task_end_ex, __itt_group_structure, "%p, %p, %lu")
+ITT_STUBV(ITTAPI, void, task_begin_overlapped,       (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name),                                                                   (ITT_FORMAT domain, id, parent, name), task_begin_overlapped, __itt_group_structure, "%p, %lu, %lu, %p")
+ITT_STUBV(ITTAPI, void, task_begin_overlapped_ex,    (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, __itt_string_handle *name), (ITT_FORMAT domain, clock_domain, timestamp, id, parentid, name), task_begin_overlapped_ex, __itt_group_structure, "%p, %p, %lu, %lu, %lu, %p")
+ITT_STUBV(ITTAPI, void, task_end_overlapped, (const __itt_domain *domain, __itt_id id),                                                                                                                       (ITT_FORMAT domain, id), task_end_overlapped, __itt_group_structure, "%p, %lu")
+ITT_STUBV(ITTAPI, void, task_end_overlapped_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id),                                                    (ITT_FORMAT domain, clock_domain, timestamp, id), task_end_overlapped_ex, __itt_group_structure, "%p, %p, %lu, %lu")
+ITT_STUBV(ITTAPI, void, marker_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_string_handle *name, __itt_scope scope), (ITT_FORMAT domain, clock_domain, timestamp, id, name, scope), marker_ex, __itt_group_structure, "%p, %p, %lu, %lu, %p, %d")
+ITT_STUBV(ITTAPI, void, metadata_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data), (ITT_FORMAT domain, scope, key, type, count, data), metadata_add_with_scope, __itt_group_structure, "%p, %d, %p, %d, %lu, %p")
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeA, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length),    (ITT_FORMAT domain, scope, key, data, length), metadata_str_add_with_scopeA, __itt_group_structure, "%p, %d, %p, %p, %lu")
+ITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeW, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const wchar_t *data, size_t length), (ITT_FORMAT domain, scope, key, data, length), metadata_str_add_with_scopeW, __itt_group_structure, "%p, %d, %p, %p, %lu")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, metadata_str_add_with_scope,  (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length),    (ITT_FORMAT domain, scope, key, data, length), metadata_str_add_with_scope,  __itt_group_structure, "%p, %d, %p, %p, %lu")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, relation_add_to_current_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_relation relation, __itt_id tail),                (ITT_FORMAT domain, clock_domain, timestamp, relation, tail),       relation_add_to_current_ex, __itt_group_structure, "%p, %p, %lu, %d, %lu")
+ITT_STUBV(ITTAPI, void, relation_add_ex,            (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id head, __itt_relation relation, __itt_id tail), (ITT_FORMAT domain, clock_domain, timestamp, head, relation, tail), relation_add_ex,            __itt_group_structure, "%p, %p, %lu, %lu, %d, %lu")
+ITT_STUB(ITTAPI,  __itt_track_group*, track_group_create, (__itt_string_handle* name, __itt_track_group_type track_group_type),                    (ITT_FORMAT name, track_group_type),        track_group_create, __itt_group_structure, "%p, %d")
+ITT_STUB(ITTAPI,  __itt_track*,       track_create,       (__itt_track_group* track_group,__itt_string_handle* name, __itt_track_type track_type), (ITT_FORMAT track_group, name, track_type), track_create,       __itt_group_structure, "%p, %p, %d")
+ITT_STUBV(ITTAPI, void,               set_track,          (__itt_track *track),                                                                    (ITT_FORMAT track),                         set_track,          __itt_group_structure, "%p")
+
+#ifndef __ITT_INTERNAL_BODY
+ITT_STUB(ITTAPI, const char*, api_version, (void), (ITT_NO_PARAMS), api_version, __itt_group_all & ~__itt_group_legacy, "no args")
+#endif /* __ITT_INTERNAL_BODY */
+
+#ifndef __ITT_INTERNAL_BODY
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveA, __itt_group_arrays, "%p, %d, %p, %d, \"%s\", %d")
+ITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveW, __itt_group_arrays, "%p, %d, %p, %d, \"%S\", %d")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUB(ITTAPI, int, av_save,  (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_save,  __itt_group_arrays, "%p, %d, %p, %d, \"%s\", %d")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#endif /* __ITT_INTERNAL_BODY */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+ITT_STUBV(ITTAPI, void, module_loadA, (void *start_addr, void* end_addr, const char *path), (ITT_FORMAT start_addr, end_addr, path), module_loadA, __itt_group_module, "%p, %p, %p")
+ITT_STUBV(ITTAPI, void, module_loadW, (void *start_addr, void* end_addr, const wchar_t *path), (ITT_FORMAT start_addr, end_addr, path), module_loadW, __itt_group_module, "%p, %p, %p")
+#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, module_load, (void *start_addr, void *end_addr, const char *path), (ITT_FORMAT start_addr, end_addr, path), module_load, __itt_group_module, "%p, %p, %p")
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+ITT_STUBV(ITTAPI, void, module_unload, (void *start_addr), (ITT_FORMAT start_addr), module_unload, __itt_group_module, "%p")
+
+
+#endif /* __ITT_INTERNAL_INIT */
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_types.h b/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_types.h
new file mode 100644
index 00000000000000..7346c8032f626f
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/ittnotify_types.h
@@ -0,0 +1,65 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+
+#ifndef _ITTNOTIFY_TYPES_H_
+#define _ITTNOTIFY_TYPES_H_
+
+typedef enum ___itt_group_id
+{
+    __itt_group_none      		= 0,
+    __itt_group_legacy    		= 1<<0,
+    __itt_group_control   		= 1<<1,
+    __itt_group_thread    		= 1<<2,
+    __itt_group_mark      		= 1<<3,
+    __itt_group_sync      		= 1<<4,
+    __itt_group_fsync     		= 1<<5,
+    __itt_group_jit       		= 1<<6,
+    __itt_group_model     		= 1<<7,
+    __itt_group_splitter_min 	= 1<<7,
+    __itt_group_counter   		= 1<<8,
+    __itt_group_frame     		= 1<<9,
+    __itt_group_stitch    		= 1<<10,
+    __itt_group_heap      		= 1<<11,
+    __itt_group_splitter_max 	= 1<<12,
+    __itt_group_structure 		= 1<<12,
+    __itt_group_suppress 		= 1<<13,
+    __itt_group_arrays    		= 1<<14,
+    __itt_group_module    		= 1<<15,
+    __itt_group_all       		= -1
+} __itt_group_id;
+
+#pragma pack(push, 8)
+
+typedef struct ___itt_group_list
+{
+    __itt_group_id id;
+    const char*    name;
+} __itt_group_list;
+
+#pragma pack(pop)
+
+#define ITT_GROUP_LIST(varname) \
+    static __itt_group_list varname[] = {       \
+        { __itt_group_all,       "all"       }, \
+        { __itt_group_control,   "control"   }, \
+        { __itt_group_thread,    "thread"    }, \
+        { __itt_group_mark,      "mark"      }, \
+        { __itt_group_sync,      "sync"      }, \
+        { __itt_group_fsync,     "fsync"     }, \
+        { __itt_group_jit,       "jit"       }, \
+        { __itt_group_model,     "model"     }, \
+        { __itt_group_counter,   "counter"   }, \
+        { __itt_group_frame,     "frame"     }, \
+        { __itt_group_stitch,    "stitch"    }, \
+        { __itt_group_heap,      "heap"      }, \
+        { __itt_group_structure, "structure" }, \
+        { __itt_group_suppress,  "suppress"  }, \
+        { __itt_group_arrays,    "arrays"    }, \
+		{ __itt_group_module,    "module"    }, \
+        { __itt_group_none,      NULL        }  \
+    }
+
+#endif /* _ITTNOTIFY_TYPES_H_ */
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/ittptmark32.S b/deps/v8/third_party/ittapi/src/ittnotify/ittptmark32.S
new file mode 100644
index 00000000000000..7568bc8a64a459
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/ittptmark32.S
@@ -0,0 +1,764 @@
+/* <copyright>
+  This file is provided under a dual BSD/GPLv2 license.  When using or
+  redistributing this file, you may do so under either license.
+
+  GPL LICENSE SUMMARY
+
+  Copyright (c) 2017-2020 Intel Corporation. All rights reserved.
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of version 2 of the GNU General Public License as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+  The full GNU General Public License is included in this distribution
+  in the file called LICENSE.GPL.
+
+  Contact Information:
+  http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
+
+  BSD LICENSE
+
+  Copyright (c) 2017-2020 Intel Corporation. All rights reserved.
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+    * Neither the name of Intel Corporation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</copyright> */
+
+
+// /////////////////////////////////////////////////////////////////////////
+////// Intel Processor Trace Marker Functionality
+////////////////////////////////////////////////////////////////////////////
+
+        .text
+        .align  16
+        .globl  __itt_pt_mark
+        .globl  __itt_pt_event
+        .globl  __itt_pt_mark_event
+        .globl  __itt_pt_mark_threshold
+        .globl  __itt_pt_byte
+        .globl  __itt_pt_write
+
+/// void __itt_pt_mark(unsigned char index);
+__itt_pt_mark:
+        movzbl  4(%esp), %eax
+//        and     $0xff, %eax
+        lea     __itt_pt_mark_call_table(,%eax,4), %eax
+        jmp     *%eax
+        .align  4
+
+        .long   0, 1, 2, 3      // GUID
+        .long   0xfadefade
+
+__itt_pt_mark_call_table:
+///        .fill 256,4,(0x0000c2c3 | (( . - __itt_pt_mark_call_table) << 14))
+        ret
+        ret    $0x0
+        ret
+        ret    $0x1
+        ret
+        ret    $0x2
+        ret
+        ret    $0x3
+        ret
+        ret    $0x4
+        ret
+        ret    $0x5
+        ret
+        ret    $0x6
+        ret
+        ret    $0x7
+        ret
+        ret    $0x8
+        ret
+        ret    $0x9
+        ret
+        ret    $0xa
+        ret
+        ret    $0xb
+        ret
+        ret    $0xc
+        ret
+        ret    $0xd
+        ret
+        ret    $0xe
+        ret
+        ret    $0xf
+
+        ret
+        ret    $0x10
+        ret
+        ret    $0x11
+        ret
+        ret    $0x12
+        ret
+        ret    $0x13
+        ret
+        ret    $0x14
+        ret
+        ret    $0x15
+        ret
+        ret    $0x16
+        ret
+        ret    $0x17
+        ret
+        ret    $0x18
+        ret
+        ret    $0x19
+        ret
+        ret    $0x1a
+        ret
+        ret    $0x1b
+        ret
+        ret    $0x1c
+        ret
+        ret    $0x1d
+        ret
+        ret    $0x1e
+        ret
+        ret    $0x1f
+
+        ret
+        ret    $0x20
+        ret
+        ret    $0x21
+        ret
+        ret    $0x22
+        ret
+        ret    $0x23
+        ret
+        ret    $0x24
+        ret
+        ret    $0x25
+        ret
+        ret    $0x26
+        ret
+        ret    $0x27
+        ret
+        ret    $0x28
+        ret
+        ret    $0x29
+        ret
+        ret    $0x2a
+        ret
+        ret    $0x2b
+        ret
+        ret    $0x2c
+        ret
+        ret    $0x2d
+        ret
+        ret    $0x2e
+        ret
+        ret    $0x2f
+
+        ret
+        ret    $0x30
+        ret
+        ret    $0x31
+        ret
+        ret    $0x32
+        ret
+        ret    $0x33
+        ret
+        ret    $0x34
+        ret
+        ret    $0x35
+        ret
+        ret    $0x36
+        ret
+        ret    $0x37
+        ret
+        ret    $0x38
+        ret
+        ret    $0x39
+        ret
+        ret    $0x3a
+        ret
+        ret    $0x3b
+        ret
+        ret    $0x3c
+        ret
+        ret    $0x3d
+        ret
+        ret    $0x3e
+        ret
+        ret    $0x3f
+
+        ret
+        ret    $0x40
+        ret
+        ret    $0x41
+        ret
+        ret    $0x42
+        ret
+        ret    $0x43
+        ret
+        ret    $0x44
+        ret
+        ret    $0x45
+        ret
+        ret    $0x46
+        ret
+        ret    $0x47
+        ret
+        ret    $0x48
+        ret
+        ret    $0x49
+        ret
+        ret    $0x4a
+        ret
+        ret    $0x4b
+        ret
+        ret    $0x4c
+        ret
+        ret    $0x4d
+        ret
+        ret    $0x4e
+        ret
+        ret    $0x4f
+
+        ret
+        ret    $0x50
+        ret
+        ret    $0x51
+        ret
+        ret    $0x52
+        ret
+        ret    $0x53
+        ret
+        ret    $0x54
+        ret
+        ret    $0x55
+        ret
+        ret    $0x56
+        ret
+        ret    $0x57
+        ret
+        ret    $0x58
+        ret
+        ret    $0x59
+        ret
+        ret    $0x5a
+        ret
+        ret    $0x5b
+        ret
+        ret    $0x5c
+        ret
+        ret    $0x5d
+        ret
+        ret    $0x5e
+        ret
+        ret    $0x5f
+
+        ret
+        ret    $0x60
+        ret
+        ret    $0x61
+        ret
+        ret    $0x62
+        ret
+        ret    $0x63
+        ret
+        ret    $0x64
+        ret
+        ret    $0x65
+        ret
+        ret    $0x66
+        ret
+        ret    $0x67
+        ret
+        ret    $0x68
+        ret
+        ret    $0x69
+        ret
+        ret    $0x6a
+        ret
+        ret    $0x6b
+        ret
+        ret    $0x6c
+        ret
+        ret    $0x6d
+        ret
+        ret    $0x6e
+        ret
+        ret    $0x6f
+
+        ret
+        ret    $0x70
+        ret
+        ret    $0x71
+        ret
+        ret    $0x72
+        ret
+        ret    $0x73
+        ret
+        ret    $0x74
+        ret
+        ret    $0x75
+        ret
+        ret    $0x76
+        ret
+        ret    $0x77
+        ret
+        ret    $0x78
+        ret
+        ret    $0x79
+        ret
+        ret    $0x7a
+        ret
+        ret    $0x7b
+        ret
+        ret    $0x7c
+        ret
+        ret    $0x7d
+        ret
+        ret    $0x7e
+        ret
+        ret    $0x7f
+
+        ret
+        ret    $0x80
+        ret
+        ret    $0x81
+        ret
+        ret    $0x82
+        ret
+        ret    $0x83
+        ret
+        ret    $0x84
+        ret
+        ret    $0x85
+        ret
+        ret    $0x86
+        ret
+        ret    $0x87
+        ret
+        ret    $0x88
+        ret
+        ret    $0x89
+        ret
+        ret    $0x8a
+        ret
+        ret    $0x8b
+        ret
+        ret    $0x8c
+        ret
+        ret    $0x8d
+        ret
+        ret    $0x8e
+        ret
+        ret    $0x8f
+
+        ret
+        ret    $0x90
+        ret
+        ret    $0x91
+        ret
+        ret    $0x92
+        ret
+        ret    $0x93
+        ret
+        ret    $0x94
+        ret
+        ret    $0x95
+        ret
+        ret    $0x96
+        ret
+        ret    $0x97
+        ret
+        ret    $0x98
+        ret
+        ret    $0x99
+        ret
+        ret    $0x9a
+        ret
+        ret    $0x9b
+        ret
+        ret    $0x9c
+        ret
+        ret    $0x9d
+        ret
+        ret    $0x9e
+        ret
+        ret    $0x9f
+
+        ret
+        ret    $0xa0
+        ret
+        ret    $0xa1
+        ret
+        ret    $0xa2
+        ret
+        ret    $0xa3
+        ret
+        ret    $0xa4
+        ret
+        ret    $0xa5
+        ret
+        ret    $0xa6
+        ret
+        ret    $0xa7
+        ret
+        ret    $0xa8
+        ret
+        ret    $0xa9
+        ret
+        ret    $0xaa
+        ret
+        ret    $0xab
+        ret
+        ret    $0xac
+        ret
+        ret    $0xad
+        ret
+        ret    $0xae
+        ret
+        ret    $0xaf
+
+        ret
+        ret    $0xb0
+        ret
+        ret    $0xb1
+        ret
+        ret    $0xb2
+        ret
+        ret    $0xb3
+        ret
+        ret    $0xb4
+        ret
+        ret    $0xb5
+        ret
+        ret    $0xb6
+        ret
+        ret    $0xb7
+        ret
+        ret    $0xb8
+        ret
+        ret    $0xb9
+        ret
+        ret    $0xba
+        ret
+        ret    $0xbb
+        ret
+        ret    $0xbc
+        ret
+        ret    $0xbd
+        ret
+        ret    $0xbe
+        ret
+        ret    $0xbf
+
+        ret
+        ret    $0xc0
+        ret
+        ret    $0xc1
+        ret
+        ret    $0xc2
+        ret
+        ret    $0xc3
+        ret
+        ret    $0xc4
+        ret
+        ret    $0xc5
+        ret
+        ret    $0xc6
+        ret
+        ret    $0xc7
+        ret
+        ret    $0xc8
+        ret
+        ret    $0xc9
+        ret
+        ret    $0xca
+        ret
+        ret    $0xcb
+        ret
+        ret    $0xcc
+        ret
+        ret    $0xcd
+        ret
+        ret    $0xce
+        ret
+        ret    $0xcf
+
+        ret
+        ret    $0xd0
+        ret
+        ret    $0xd1
+        ret
+        ret    $0xd2
+        ret
+        ret    $0xd3
+        ret
+        ret    $0xd4
+        ret
+        ret    $0xd5
+        ret
+        ret    $0xd6
+        ret
+        ret    $0xd7
+        ret
+        ret    $0xd8
+        ret
+        ret    $0xd9
+        ret
+        ret    $0xda
+        ret
+        ret    $0xdb
+        ret
+        ret    $0xdc
+        ret
+        ret    $0xdd
+        ret
+        ret    $0xde
+        ret
+        ret    $0xdf
+
+        ret
+        ret    $0xe0
+        ret
+        ret    $0xe1
+        ret
+        ret    $0xe2
+        ret
+        ret    $0xe3
+        ret
+        ret    $0xe4
+        ret
+        ret    $0xe5
+        ret
+        ret    $0xe6
+        ret
+        ret    $0xe7
+        ret
+        ret    $0xe8
+        ret
+        ret    $0xe9
+        ret
+        ret    $0xea
+        ret
+        ret    $0xeb
+        ret
+        ret    $0xec
+        ret
+        ret    $0xed
+        ret
+        ret    $0xee
+        ret
+        ret    $0xef
+
+        ret
+        ret    $0xf0
+        ret
+        ret    $0xf1
+        ret
+        ret    $0xf2
+        ret
+        ret    $0xf3
+        ret
+        ret    $0xf4
+        ret
+        ret    $0xf5
+        ret
+        ret    $0xf6
+        ret
+        ret    $0xf7
+        ret
+        ret    $0xf8
+        ret
+        ret    $0xf9
+        ret
+        ret    $0xfa
+        ret
+        ret    $0xfb
+        ret
+        ret    $0xfc
+        ret
+        ret    $0xfd
+        ret
+        ret    $0xfe
+        ret
+        ret    $0xff
+
+        .align  16
+
+__itt_pt_byte:
+
+        movl    4(%esp), %ecx
+
+__itt_pt_byte_:
+
+        and     $0xff, %ecx
+        lea     __itt_pt_byte_call_table(,%ecx,1), %ecx
+        jmp     *%ecx
+
+        .align  4
+
+        .long   0, 1, 2, 3      // GUID
+        .long   0xfadedeaf
+
+__itt_pt_byte_call_table:
+
+        .fill   256,1,0xc3
+
+        .align  16
+
+__itt_pt_event:
+
+        push   %ecx
+        mov    8(%esp), %ecx
+        rdpmc
+
+        mov     %al,%cl
+        call    __itt_pt_byte_
+        shr     $8,%eax
+        mov     %al,%cl
+        call    __itt_pt_byte_
+        shr     $8,%eax
+        mov     %al,%cl
+        call    __itt_pt_byte_
+        shr     $8,%eax
+        mov     %al,%cl
+        call    __itt_pt_byte_
+
+        mov     %dl,%cl
+        call    __itt_pt_byte_
+        shr     $8,%edx
+        mov     %dl,%cl
+        call    __itt_pt_byte_
+        shr     $8,%edx
+        mov     %dl,%cl
+        call    __itt_pt_byte_
+        shr     $8,%edx
+        mov     %dl,%cl
+        call    __itt_pt_byte_
+
+        pop    %ecx
+        ret
+
+        .align  16
+
+__itt_pt_mark_event:
+
+        testl   $1,4(%esp)
+        jnz     odd
+        pushl   $0
+        call    __itt_pt_event
+        add     $2,%esp
+        jmp     __itt_pt_mark
+
+odd:
+        pushl  4(%esp)
+        call    __itt_pt_mark
+        add     $2,%esp
+        movl    $0,4(%esp)
+        jmp     __itt_pt_event
+
+
+        .align  16
+
+__itt_pt_flush:
+
+        lea     __itt_pt_mark_flush_1,%eax
+        jmp     *%eax
+
+        .align   16
+        nop
+__itt_pt_mark_flush_1:
+        lea     __itt_pt_mark_flush_2,%eax
+        jmp     *%eax
+
+        .align   16
+        nop
+        nop
+__itt_pt_mark_flush_2:
+        lea     __itt_pt_mark_flush_3,%eax
+        jmp     *%eax
+
+        .align   16
+        nop
+        nop
+        nop
+__itt_pt_mark_flush_3:
+        ret
+
+        .align  16
+
+// int __itt_pt_mark_threshold(unsigned char index, unsigned long long* tmp, int threshold);
+
+__itt_pt_mark_threshold:
+        //  4(%esp) == index
+        //  8(%esp) == tmp
+        // 12(%esp) == threshold
+        xor     %edx,%edx
+        xor     %eax,%eax
+
+        testl   $1,4(%esp)
+        jnz     mark_end
+mark_begin:
+        mov     $((1 << 30) + 1),%ecx
+        rdpmc
+        mov     8(%esp), %ecx
+        mov     %eax, (%ecx)
+        mov     %edx,4(%ecx)
+        jmp     __itt_pt_mark
+mark_end:
+        mov     $((1 << 30) + 1),%ecx
+        rdpmc
+        mov     8(%esp), %ecx
+        sub      (%ecx), %eax
+        sbb     4(%ecx), %edx
+
+        sub     12(%esp), %eax // threshold
+        jnc     found
+        sbb     $0, %edx
+        jnc     found
+        jmp     __itt_pt_mark
+found:
+        call    __itt_pt_mark
+        jmp     __itt_pt_flush
+
+// PTWRITE
+
+        .align  16
+
+// void __itt_pt_write(unsigned long long value);
+
+        .long   0, 1, 2, 3      // GUID
+
+__itt_pt_write:
+
+//        ptwrite dword ptr [esp + 4]
+        .byte   0xF3, 0x0F, 0xAE, 0x64, 0x24, 0x04
+        ret
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/ittptmark32.asm b/deps/v8/third_party/ittapi/src/ittnotify/ittptmark32.asm
new file mode 100644
index 00000000000000..5fde394e9e174f
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/ittptmark32.asm
@@ -0,0 +1,255 @@
+COMMENT @
+<copyright>
+  This file is provided under a dual BSD/GPLv2 license.  When using or
+  redistributing this file, you may do so under either license.
+
+  GPL LICENSE SUMMARY
+
+  Copyright (c) 2017-2020 Intel Corporation. All rights reserved.
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of version 2 of the GNU General Public License as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+  The full GNU General Public License is included in this distribution
+  in the file called LICENSE.GPL.
+
+  Contact Information:
+  http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
+
+  BSD LICENSE
+
+  Copyright (c) 2017-2020 Intel Corporation. All rights reserved.
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+    * Neither the name of Intel Corporation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</copyright>
+@
+
+;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; ;;; Intel Processor Trace Marker Functionality
+;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+.686p
+.xmm
+.model  FLAT
+
+_TEXT	segment
+
+        public	___itt_pt_mark
+        public	___itt_pt_event
+        public	___itt_pt_mark_event
+        public  ___itt_pt_mark_threshold
+        public  ___itt_pt_write
+        public  ___itt_pt_byte
+
+        align   10h
+
+;;; void __itt_pt_mark(unsigned char index);
+
+___itt_pt_mark  proc    near
+
+        movzx   eax,byte ptr [esp + 4]
+        lea     eax,__itt_pt_mark_call_table[eax * 4]
+        jmp	eax
+
+        align   04h
+
+        dd      0, 1, 2, 3      ;;; GUID
+
+        dd      0fadefadeh      ;;; magic marker
+
+__itt_pt_mark_call_table:
+
+        dd      256 dup(0000c2c3h OR (( $ - offset __itt_pt_mark_call_table) SHL 14))
+
+___itt_pt_mark  endp
+
+
+___itt_pt_byte   proc   near
+
+        mov      ecx,[esp + 4]
+
+___itt_pt_byte_::
+
+        and     ecx,0ffh
+        lea     ecx,__itt_pt_byte_call_table[ecx]
+        jmp	ecx
+
+        align   04h
+
+        dd      0, 1, 2, 3      ;;; GUID
+
+        dd      0fadedeafh      ;;; magic marker
+
+__itt_pt_byte_call_table:
+
+        db      256 dup(0c3h)
+
+___itt_pt_byte   endp
+
+        align   10h
+
+___itt_pt_event  proc   near
+
+        push    ecx
+        mov     ecx,[esp + 8]
+        rdpmc
+
+        mov     cl,al
+        call    ___itt_pt_byte_
+        mov     cl,ah
+        call    ___itt_pt_byte_
+        shr     eax,16
+        mov     cl,al
+        call    ___itt_pt_byte_
+        mov     cl,ah
+        call    ___itt_pt_byte_
+
+        mov     cl,dl
+        call    ___itt_pt_byte_
+        mov     cl,dh
+        call    ___itt_pt_byte_
+        shr     edx,16
+        mov     cl,dl
+        call    ___itt_pt_byte_
+        mov     cl,dh
+        call    ___itt_pt_byte_
+
+        pop     ecx
+        ret
+
+___itt_pt_event  endp
+
+        align   10h
+
+___itt_pt_mark_event    proc    near
+
+        test    byte ptr [esp + 4],1
+        jnz     odd
+        push    0
+        call    ___itt_pt_event
+        add     esp,4
+        jmp     ___itt_pt_mark
+
+odd:
+        push    dword ptr [esp + 4]
+        call    ___itt_pt_mark
+        add     esp,4
+        mov     dword ptr [esp + 4],0
+        jmp     ___itt_pt_event
+
+___itt_pt_mark_event    endp
+
+        align   10h
+
+___itt_pt_flush proc    near
+
+        lea     eax,offset __itt_pt_mark_flush_1
+        jmp     eax
+
+        align   10h
+        nop
+__itt_pt_mark_flush_1:
+        lea     eax,offset __itt_pt_mark_flush_2
+        jmp     eax
+
+        align   10h
+        nop
+        nop
+__itt_pt_mark_flush_2:
+        lea     eax,offset __itt_pt_mark_flush_3
+        jmp     eax
+
+        align   10h
+        nop
+        nop
+        nop
+__itt_pt_mark_flush_3:
+        ret
+
+___itt_pt_flush endp
+
+        align   10h
+
+;;; int __itt_pt_mark_threshold(unsigned char index, unsigned long long* tmp, int threshold);
+
+___itt_pt_mark_threshold        proc    near
+        test    byte ptr [esp + 4],1    ;;; index
+        jnz     mark_end
+mark_begin:
+        mov     ecx,(1 SHL 30) + 1
+        rdpmc
+        mov     ecx,[esp + 8]   ;;; tmp
+        mov     [ecx + 0],eax
+        mov     [ecx + 4],edx
+        jmp     ___itt_pt_mark
+mark_end:
+        mov     ecx,(1 SHL 30) + 1
+        rdpmc
+        mov     ecx,[esp + 8]   ;;; tmp
+        sub     eax,[ecx + 0]
+        sbb     edx,[ecx + 4]
+        or      edx,edx
+        jnz     found
+        cmp     edx,[esp + 12]  ;;; threshold
+        jnc     found
+        jmp     ___itt_pt_mark
+found:
+        call    ___itt_pt_mark
+        jmp     ___itt_pt_flush
+
+___itt_pt_mark_threshold        endp
+
+;;; PTWRITE
+
+        align   10h
+
+;;; void __itt_pt_write(unsigned long long value);
+
+        dd      0, 1, 2, 3      ;;; GUID
+
+___itt_pt_write proc
+
+;;;        ptwrite dword ptr [esp + 4]
+        db      0F3h, 0Fh, 0AEh, 64h, 24h, 04h
+        ret
+
+___itt_pt_write endp
+
+;;;
+
+_TEXT	ends
+        end
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/ittptmark64.S b/deps/v8/third_party/ittapi/src/ittnotify/ittptmark64.S
new file mode 100644
index 00000000000000..25b2058d57b138
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/ittptmark64.S
@@ -0,0 +1,766 @@
+/* <copyright>
+  This file is provided under a dual BSD/GPLv2 license.  When using or
+  redistributing this file, you may do so under either license.
+
+  GPL LICENSE SUMMARY
+
+  Copyright (c) 2017-2020 Intel Corporation. All rights reserved.
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of version 2 of the GNU General Public License as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+  The full GNU General Public License is included in this distribution
+  in the file called LICENSE.GPL.
+
+  Contact Information:
+  http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
+
+  BSD LICENSE
+
+  Copyright (c) 2017-2020 Intel Corporation. All rights reserved.
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+    * Neither the name of Intel Corporation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</copyright> */
+
+// /////////////////////////////////////////////////////////////////////////
+////// Intel Processor Trace Marker Functionality
+////////////////////////////////////////////////////////////////////////////
+
+        .text
+        .align  16
+        .globl  __itt_pt_mark
+        .globl  __itt_pt_event
+        .globl  __itt_pt_mark_event
+        .globl  __itt_pt_mark_threshold
+        .globl  __itt_pt_byte
+        .globl  __itt_pt_write
+
+/// void __itt_pt_mark(unsigned char index);
+__itt_pt_mark:
+__itt_pt_mark_int:
+        and     $0xff, %rdi
+        call    __itt_pt_mark_pic
+__itt_pt_mark_pic:
+        popq    %rax
+        lea     (__itt_pt_mark_call_table - __itt_pt_mark_pic) (%rax,%rdi,4), %rdi
+        jmp     *%rdi
+
+        .long   0, 1, 2, 3      // GUID
+        .long   0xfadefade
+
+__itt_pt_mark_call_table:
+        retq
+        retq    $0x0
+        retq
+        retq    $0x1
+        retq
+        retq    $0x2
+        retq
+        retq    $0x3
+        retq
+        retq    $0x4
+        retq
+        retq    $0x5
+        retq
+        retq    $0x6
+        retq
+        retq    $0x7
+        retq
+        retq    $0x8
+        retq
+        retq    $0x9
+        retq
+        retq    $0xa
+        retq
+        retq    $0xb
+        retq
+        retq    $0xc
+        retq
+        retq    $0xd
+        retq
+        retq    $0xe
+        retq
+        retq    $0xf
+
+        retq
+        retq    $0x10
+        retq
+        retq    $0x11
+        retq
+        retq    $0x12
+        retq
+        retq    $0x13
+        retq
+        retq    $0x14
+        retq
+        retq    $0x15
+        retq
+        retq    $0x16
+        retq
+        retq    $0x17
+        retq
+        retq    $0x18
+        retq
+        retq    $0x19
+        retq
+        retq    $0x1a
+        retq
+        retq    $0x1b
+        retq
+        retq    $0x1c
+        retq
+        retq    $0x1d
+        retq
+        retq    $0x1e
+        retq
+        retq    $0x1f
+
+        retq
+        retq    $0x20
+        retq
+        retq    $0x21
+        retq
+        retq    $0x22
+        retq
+        retq    $0x23
+        retq
+        retq    $0x24
+        retq
+        retq    $0x25
+        retq
+        retq    $0x26
+        retq
+        retq    $0x27
+        retq
+        retq    $0x28
+        retq
+        retq    $0x29
+        retq
+        retq    $0x2a
+        retq
+        retq    $0x2b
+        retq
+        retq    $0x2c
+        retq
+        retq    $0x2d
+        retq
+        retq    $0x2e
+        retq
+        retq    $0x2f
+
+        retq
+        retq    $0x30
+        retq
+        retq    $0x31
+        retq
+        retq    $0x32
+        retq
+        retq    $0x33
+        retq
+        retq    $0x34
+        retq
+        retq    $0x35
+        retq
+        retq    $0x36
+        retq
+        retq    $0x37
+        retq
+        retq    $0x38
+        retq
+        retq    $0x39
+        retq
+        retq    $0x3a
+        retq
+        retq    $0x3b
+        retq
+        retq    $0x3c
+        retq
+        retq    $0x3d
+        retq
+        retq    $0x3e
+        retq
+        retq    $0x3f
+
+        retq
+        retq    $0x40
+        retq
+        retq    $0x41
+        retq
+        retq    $0x42
+        retq
+        retq    $0x43
+        retq
+        retq    $0x44
+        retq
+        retq    $0x45
+        retq
+        retq    $0x46
+        retq
+        retq    $0x47
+        retq
+        retq    $0x48
+        retq
+        retq    $0x49
+        retq
+        retq    $0x4a
+        retq
+        retq    $0x4b
+        retq
+        retq    $0x4c
+        retq
+        retq    $0x4d
+        retq
+        retq    $0x4e
+        retq
+        retq    $0x4f
+
+        retq
+        retq    $0x50
+        retq
+        retq    $0x51
+        retq
+        retq    $0x52
+        retq
+        retq    $0x53
+        retq
+        retq    $0x54
+        retq
+        retq    $0x55
+        retq
+        retq    $0x56
+        retq
+        retq    $0x57
+        retq
+        retq    $0x58
+        retq
+        retq    $0x59
+        retq
+        retq    $0x5a
+        retq
+        retq    $0x5b
+        retq
+        retq    $0x5c
+        retq
+        retq    $0x5d
+        retq
+        retq    $0x5e
+        retq
+        retq    $0x5f
+
+        retq
+        retq    $0x60
+        retq
+        retq    $0x61
+        retq
+        retq    $0x62
+        retq
+        retq    $0x63
+        retq
+        retq    $0x64
+        retq
+        retq    $0x65
+        retq
+        retq    $0x66
+        retq
+        retq    $0x67
+        retq
+        retq    $0x68
+        retq
+        retq    $0x69
+        retq
+        retq    $0x6a
+        retq
+        retq    $0x6b
+        retq
+        retq    $0x6c
+        retq
+        retq    $0x6d
+        retq
+        retq    $0x6e
+        retq
+        retq    $0x6f
+
+        retq
+        retq    $0x70
+        retq
+        retq    $0x71
+        retq
+        retq    $0x72
+        retq
+        retq    $0x73
+        retq
+        retq    $0x74
+        retq
+        retq    $0x75
+        retq
+        retq    $0x76
+        retq
+        retq    $0x77
+        retq
+        retq    $0x78
+        retq
+        retq    $0x79
+        retq
+        retq    $0x7a
+        retq
+        retq    $0x7b
+        retq
+        retq    $0x7c
+        retq
+        retq    $0x7d
+        retq
+        retq    $0x7e
+        retq
+        retq    $0x7f
+
+        retq
+        retq    $0x80
+        retq
+        retq    $0x81
+        retq
+        retq    $0x82
+        retq
+        retq    $0x83
+        retq
+        retq    $0x84
+        retq
+        retq    $0x85
+        retq
+        retq    $0x86
+        retq
+        retq    $0x87
+        retq
+        retq    $0x88
+        retq
+        retq    $0x89
+        retq
+        retq    $0x8a
+        retq
+        retq    $0x8b
+        retq
+        retq    $0x8c
+        retq
+        retq    $0x8d
+        retq
+        retq    $0x8e
+        retq
+        retq    $0x8f
+
+        retq
+        retq    $0x90
+        retq
+        retq    $0x91
+        retq
+        retq    $0x92
+        retq
+        retq    $0x93
+        retq
+        retq    $0x94
+        retq
+        retq    $0x95
+        retq
+        retq    $0x96
+        retq
+        retq    $0x97
+        retq
+        retq    $0x98
+        retq
+        retq    $0x99
+        retq
+        retq    $0x9a
+        retq
+        retq    $0x9b
+        retq
+        retq    $0x9c
+        retq
+        retq    $0x9d
+        retq
+        retq    $0x9e
+        retq
+        retq    $0x9f
+
+        retq
+        retq    $0xa0
+        retq
+        retq    $0xa1
+        retq
+        retq    $0xa2
+        retq
+        retq    $0xa3
+        retq
+        retq    $0xa4
+        retq
+        retq    $0xa5
+        retq
+        retq    $0xa6
+        retq
+        retq    $0xa7
+        retq
+        retq    $0xa8
+        retq
+        retq    $0xa9
+        retq
+        retq    $0xaa
+        retq
+        retq    $0xab
+        retq
+        retq    $0xac
+        retq
+        retq    $0xad
+        retq
+        retq    $0xae
+        retq
+        retq    $0xaf
+
+        retq
+        retq    $0xb0
+        retq
+        retq    $0xb1
+        retq
+        retq    $0xb2
+        retq
+        retq    $0xb3
+        retq
+        retq    $0xb4
+        retq
+        retq    $0xb5
+        retq
+        retq    $0xb6
+        retq
+        retq    $0xb7
+        retq
+        retq    $0xb8
+        retq
+        retq    $0xb9
+        retq
+        retq    $0xba
+        retq
+        retq    $0xbb
+        retq
+        retq    $0xbc
+        retq
+        retq    $0xbd
+        retq
+        retq    $0xbe
+        retq
+        retq    $0xbf
+
+        retq
+        retq    $0xc0
+        retq
+        retq    $0xc1
+        retq
+        retq    $0xc2
+        retq
+        retq    $0xc3
+        retq
+        retq    $0xc4
+        retq
+        retq    $0xc5
+        retq
+        retq    $0xc6
+        retq
+        retq    $0xc7
+        retq
+        retq    $0xc8
+        retq
+        retq    $0xc9
+        retq
+        retq    $0xca
+        retq
+        retq    $0xcb
+        retq
+        retq    $0xcc
+        retq
+        retq    $0xcd
+        retq
+        retq    $0xce
+        retq
+        retq    $0xcf
+
+        retq
+        retq    $0xd0
+        retq
+        retq    $0xd1
+        retq
+        retq    $0xd2
+        retq
+        retq    $0xd3
+        retq
+        retq    $0xd4
+        retq
+        retq    $0xd5
+        retq
+        retq    $0xd6
+        retq
+        retq    $0xd7
+        retq
+        retq    $0xd8
+        retq
+        retq    $0xd9
+        retq
+        retq    $0xda
+        retq
+        retq    $0xdb
+        retq
+        retq    $0xdc
+        retq
+        retq    $0xdd
+        retq
+        retq    $0xde
+        retq
+        retq    $0xdf
+
+        retq
+        retq    $0xe0
+        retq
+        retq    $0xe1
+        retq
+        retq    $0xe2
+        retq
+        retq    $0xe3
+        retq
+        retq    $0xe4
+        retq
+        retq    $0xe5
+        retq
+        retq    $0xe6
+        retq
+        retq    $0xe7
+        retq
+        retq    $0xe8
+        retq
+        retq    $0xe9
+        retq
+        retq    $0xea
+        retq
+        retq    $0xeb
+        retq
+        retq    $0xec
+        retq
+        retq    $0xed
+        retq
+        retq    $0xee
+        retq
+        retq    $0xef
+
+        retq
+        retq    $0xf0
+        retq
+        retq    $0xf1
+        retq
+        retq    $0xf2
+        retq
+        retq    $0xf3
+        retq
+        retq    $0xf4
+        retq
+        retq    $0xf5
+        retq
+        retq    $0xf6
+        retq
+        retq    $0xf7
+        retq
+        retq    $0xf8
+        retq
+        retq    $0xf9
+        retq
+        retq    $0xfa
+        retq
+        retq    $0xfb
+        retq
+        retq    $0xfc
+        retq
+        retq    $0xfd
+        retq
+        retq    $0xfe
+        retq
+        retq    $0xff
+
+        .align  16
+
+__itt_pt_byte:
+__itt_pt_byte_int:
+
+        and     $0xff, %rdi
+        call    __itt_pt_byte_pic
+__itt_pt_byte_pic:
+        popq    %rcx
+        lea     (__itt_pt_byte_call_table - __itt_pt_byte_pic) (%rcx,%rdi,1), %rdi
+        jmp     *%rdi
+
+        .align  4
+
+        .long   0, 1, 2, 3      // GUID
+
+        .long   0xfadedeaf
+
+__itt_pt_byte_call_table:
+
+        .fill   256,1,0xc3
+
+        .align  16
+
+__itt_pt_event:
+__itt_pt_event_int:
+
+        pushq   %rcx
+        mov     %rdi,%rcx
+        rdpmc
+
+        xor     %rdi, %rdi
+        mov     %al, %dil
+        call    __itt_pt_byte_int
+        shr     $8, %eax
+        mov     %al, %dil
+        call    __itt_pt_byte_int
+        shr     $8, %eax
+        mov     %al, %dil
+        call    __itt_pt_byte_int
+        shr     $8, %eax
+        mov     %al, %dil
+        call    __itt_pt_byte_int
+
+        mov     %dl, %dil
+        call    __itt_pt_byte_int
+        shr     $8, %edx
+        mov     %dl, %dil
+        call    __itt_pt_byte_int
+        shr     $8, %edx
+        mov     %dl, %dil
+        call    __itt_pt_byte_int
+        shr     $8, %edx
+        mov     %dl, %dil
+        call    __itt_pt_byte_int
+
+        popq    %rcx
+        ret
+
+        .align  16
+
+__itt_pt_mark_event:
+
+        test    $1, %rdi
+        jnz     odd
+        mov     %rdi, %rsi
+        xor     %rdi,%rdi
+        call    __itt_pt_event_int
+        mov     %rsi, %rdi
+        jmp     __itt_pt_mark_int
+
+odd:
+        call    __itt_pt_mark_int
+        xor     %rdi,%rdi
+        jmp     __itt_pt_event_int
+
+
+        .align  16
+
+__itt_pt_flush:
+
+        call    __itt_pt_flush_pic
+__itt_pt_flush_pic:
+        popq    %rdx
+        lea     (__itt_pt_mark_flush_1 - __itt_pt_flush_pic) (%rdx), %rax
+        jmp     *%rax
+
+        .align   16
+        nop
+__itt_pt_mark_flush_1:
+        lea     (__itt_pt_mark_flush_2 - __itt_pt_flush_pic) (%rdx), %rax
+        jmp     *%rax
+
+        .align   16
+        nop
+        nop
+__itt_pt_mark_flush_2:
+        lea     (__itt_pt_mark_flush_3 - __itt_pt_flush_pic) (%rdx), %rax
+        jmp     *%rax
+
+        .align   16
+        nop
+        nop
+        nop
+__itt_pt_mark_flush_3:
+        ret
+
+        .align  16
+
+// int __itt_pt_mark_threshold(unsigned char index, unsigned long long* tmp, int threshold);
+
+__itt_pt_mark_threshold:
+        // rdi == index
+        // rsi == tmp
+        // rdx == threshold
+        mov     %rdx, %r8 // r8 = threshold
+        xor     %rdx, %rdx
+        xor     %rax, %rax
+        test    $1, %rdi
+        jnz     mark_end
+mark_begin:
+        mov     $((1 << 30) + 1),%rcx
+        rdpmc
+        shl     $32, %rdx
+        or      %rax, %rdx
+        mov     %rdx, (%rsi)
+        jmp     __itt_pt_mark_int
+mark_end:
+        mov     $((1 << 30) + 1),%rcx
+        rdpmc
+        shl     $32, %rdx
+        or      %rax, %rdx
+        sub     (%rsi), %rdx
+        cmp     %r8, %rdx  // threshold
+        jnc     found
+        jmp     __itt_pt_mark_int
+found:
+        call    __itt_pt_mark_int
+        jmp     __itt_pt_flush
+
+// PTWRITE
+
+        .align  16 
+
+// void __itt_pt_write(unsigned long long value);
+
+        .long   0, 1, 2, 3      // GUID
+
+__itt_pt_write:
+
+//        ptwrite rcx
+        .byte   0xF3, 0x48, 0x0F, 0xAE, 0xE1
+        ret
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/ittptmark64.asm b/deps/v8/third_party/ittapi/src/ittnotify/ittptmark64.asm
new file mode 100644
index 00000000000000..3ea108d67e9d88
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/ittptmark64.asm
@@ -0,0 +1,251 @@
+COMMENT @
+ <copyright>
+  This file is provided under a dual BSD/GPLv2 license.  When using or
+  redistributing this file, you may do so under either license.
+
+  GPL LICENSE SUMMARY
+
+  Copyright (c) 2017-2020 Intel Corporation. All rights reserved.
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of version 2 of the GNU General Public License as
+  published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+  The full GNU General Public License is included in this distribution
+  in the file called LICENSE.GPL.
+
+  Contact Information:
+  http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
+
+  BSD LICENSE
+
+  Copyright (c) 2017-2020 Intel Corporation. All rights reserved.
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+    * Neither the name of Intel Corporation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</copyright>
+@
+
+;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; ;;; Intel Processor Trace Marker Functionality
+;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+_TEXT	segment
+
+        public	__itt_pt_mark
+        public	__itt_pt_event
+        public	__itt_pt_mark_event
+        public  __itt_pt_mark_threshold
+        public  __itt_pt_write
+        public  __itt_pt_byte
+
+        align   10h
+
+;;; void __itt_pt_mark(unsigned char index);
+
+__itt_pt_mark   proc
+
+        and     rcx,0ffh
+        lea     r10,offset __itt_pt_mark_call_table
+        lea     rcx,[r10 + rcx * 4]
+        jmp	rcx
+
+        align   04h
+
+        dd      0, 1, 2, 3      ;;; GUID
+
+        dd      0fadefadeh      ;;; magic marker
+
+__itt_pt_mark_call_table:
+
+        dd      256 dup(0000c2c3h OR (( $ - offset __itt_pt_mark_call_table) SHL 14))
+        
+__itt_pt_mark   endp
+
+        align   10h
+
+__itt_pt_byte   proc
+
+        and     rcx,0ffh
+        lea     r10,offset __itt_pt_byte_call_table
+        add     rcx,r10
+        jmp     rcx
+
+        align   04h
+
+        dd      0, 1, 2, 3      ;;; GUID
+
+        dd      0fadedeafh      ;;; magic marker
+
+__itt_pt_byte_call_table:
+
+        db      256 dup(0c3h)
+
+__itt_pt_byte   endp
+
+        align   10h
+
+__itt_pt_event  proc
+
+        rdpmc
+
+        mov     cl,al
+        call    __itt_pt_byte
+        mov     cl,ah
+        call    __itt_pt_byte
+        shr     eax,16
+        mov     cl,al
+        call    __itt_pt_byte
+        mov     cl,ah
+        call    __itt_pt_byte
+
+        mov     cl,dl
+        call    __itt_pt_byte
+        mov     cl,dh
+        call    __itt_pt_byte
+        shr     edx,16
+        mov     cl,dl
+        call    __itt_pt_byte
+        mov     cl,dh
+        call    __itt_pt_byte
+
+        ret
+
+__itt_pt_event  endp
+
+        align   10h
+
+__itt_pt_mark_event     proc
+
+        test    rcx,1
+        jnz     odd
+        mov     r8,rcx
+        xor     rcx,rcx
+        call    __itt_pt_event
+        mov     rcx,r8
+        jmp     __itt_pt_mark
+
+odd:
+        call    __itt_pt_mark
+        xor     rcx,rcx
+        jmp     __itt_pt_event
+
+__itt_pt_mark_event     endp
+
+        align   10h
+
+__itt_pt_flush  proc
+
+        lea     rax,offset __itt_pt_mark_flush_1
+        jmp     rax
+
+        align   10h
+        nop
+__itt_pt_mark_flush_1:
+        lea     rax,offset __itt_pt_mark_flush_2
+        jmp     rax
+
+        align   10h
+        nop
+        nop
+__itt_pt_mark_flush_2:
+        lea     rax,offset __itt_pt_mark_flush_3
+        jmp     rax
+
+        align   10h
+        nop
+        nop
+        nop
+__itt_pt_mark_flush_3:
+        ret
+
+__itt_pt_flush  endp
+
+        align   10h
+
+;;; int __itt_pt_mark_threshold(unsigned char index, unsigned long long* tmp, int threshold);
+
+__itt_pt_mark_threshold proc
+        mov     r9,rcx  ;;; index
+        mov     r10,rdx ;;; tmp
+        xor     rdx,rdx
+        xor     rax,rax
+        test    rcx,1
+        jnz     mark_end
+mark_begin:
+        mov     rcx,(1 SHL 30) + 1
+        rdpmc
+        shl     rdx,32
+        or      rdx,rax
+        mov     [r10],rdx
+        mov     rcx,r9
+        jmp     __itt_pt_mark
+mark_end:
+        mov     rcx,(1 SHL 30) + 1
+        rdpmc
+        shl     rdx,32
+        or      rdx,rax
+        sub     rdx,[r10]
+        cmp     rdx,r8  ;;; threshold
+        mov     rcx,r9
+        jnc     found
+        jmp     __itt_pt_mark
+found:
+        call    __itt_pt_mark
+        jmp     __itt_pt_flush
+
+__itt_pt_mark_threshold endp
+
+;;; PTWRITE
+
+        align   10h
+
+;;; void __itt_pt_write(unsigned long long value);
+
+        dd      0, 1, 2, 3      ;;; GUID
+
+__itt_pt_write  proc
+
+;;;        ptwrite rcx
+        db      0F3h, 48h, 0Fh, 0AEh, 0E1h
+        ret
+
+__itt_pt_write  endp
+
+;;;
+
+_TEXT	ends
+        end
diff --git a/deps/v8/third_party/ittapi/src/ittnotify/jitprofiling.c b/deps/v8/third_party/ittapi/src/ittnotify/jitprofiling.c
new file mode 100644
index 00000000000000..9c372db2e8d8e6
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify/jitprofiling.c
@@ -0,0 +1,268 @@
+/*
+  Copyright (C) 2005-2019 Intel Corporation
+
+  SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
+*/
+
+#include "ittnotify_config.h"
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#include <windows.h>
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+#if ITT_PLATFORM != ITT_PLATFORM_MAC && ITT_PLATFORM != ITT_PLATFORM_FREEBSD
+#include <malloc.h>
+#endif
+#include <stdlib.h>
+
+#include "jitprofiling.h"
+
+static const char rcsid[] = "\n@(#) $Revision$\n";
+
+#define DLL_ENVIRONMENT_VAR             "VS_PROFILER"
+
+#ifndef NEW_DLL_ENVIRONMENT_VAR
+#if ITT_ARCH==ITT_ARCH_IA32
+#define NEW_DLL_ENVIRONMENT_VAR	        "INTEL_JIT_PROFILER32"
+#else
+#define NEW_DLL_ENVIRONMENT_VAR	        "INTEL_JIT_PROFILER64"
+#endif
+#endif /* NEW_DLL_ENVIRONMENT_VAR */
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+#define DEFAULT_DLLNAME                 "JitPI.dll"
+HINSTANCE m_libHandle = NULL;
+#elif ITT_PLATFORM==ITT_PLATFORM_MAC
+#define DEFAULT_DLLNAME                 "libJitPI.dylib"
+void* m_libHandle = NULL;
+#else
+#define DEFAULT_DLLNAME                 "libJitPI.so"
+void* m_libHandle = NULL;
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+/* default location of JIT profiling agent on Android */
+#define ANDROID_JIT_AGENT_PATH  "/data/intel/libittnotify.so"
+
+/* the function pointers */
+typedef unsigned int(JITAPI *TPInitialize)(void);
+static TPInitialize FUNC_Initialize=NULL;
+
+typedef unsigned int(JITAPI *TPNotify)(unsigned int, void*);
+static TPNotify FUNC_NotifyEvent=NULL;
+
+static iJIT_IsProfilingActiveFlags executionMode = iJIT_NOTHING_RUNNING;
+
+/* end collector dll part. */
+
+/* loadiJIT_Funcs() : this function is called just in the beginning
+ * and is responsible to load the functions from BistroJavaCollector.dll
+ * result:
+ *  on success: the functions loads, iJIT_DLL_is_missing=0, return value = 1
+ *  on failure: the functions are NULL, iJIT_DLL_is_missing=1, return value = 0
+ */
+static int loadiJIT_Funcs(void);
+
+/* global representing whether the collector can't be loaded */
+static int iJIT_DLL_is_missing = 0;
+
+ITT_EXTERN_C int JITAPI
+iJIT_NotifyEvent(iJIT_JVM_EVENT event_type, void *EventSpecificData)
+{
+    int ReturnValue = 0;
+
+    /* initialization part - the collector has not been loaded yet. */
+    if (!FUNC_NotifyEvent)
+    {
+        if (iJIT_DLL_is_missing)
+            return 0;
+
+        if (!loadiJIT_Funcs())
+            return 0;
+    }
+
+    if (event_type == iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED ||
+        event_type == iJVM_EVENT_TYPE_METHOD_UPDATE)
+    {
+        if (((piJIT_Method_Load)EventSpecificData)->method_id == 0)
+            return 0;
+    }
+    else if (event_type == iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V2)
+    {
+        if (((piJIT_Method_Load_V2)EventSpecificData)->method_id == 0)
+            return 0;
+    }
+    else if (event_type == iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V3)
+    {
+        if (((piJIT_Method_Load_V3)EventSpecificData)->method_id == 0)
+            return 0;
+    }
+    else if (event_type == iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED)
+    {
+        if (((piJIT_Method_Inline_Load)EventSpecificData)->method_id == 0 ||
+            ((piJIT_Method_Inline_Load)EventSpecificData)->parent_method_id == 0)
+            return 0;
+    }
+
+    ReturnValue = (int)FUNC_NotifyEvent(event_type, EventSpecificData);
+
+    return ReturnValue;
+}
+
+ITT_EXTERN_C iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive()
+{
+    if (!iJIT_DLL_is_missing)
+    {
+        loadiJIT_Funcs();
+    }
+
+    return executionMode;
+}
+
+/* This function loads the collector dll and the relevant functions.
+ * on success: all functions load,     iJIT_DLL_is_missing = 0, return value = 1
+ * on failure: all functions are NULL, iJIT_DLL_is_missing = 1, return value = 0
+ */
+static int loadiJIT_Funcs()
+{
+    static int bDllWasLoaded = 0;
+    char *dllName = (char*)rcsid; /* !! Just to avoid unused code elimination */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+    DWORD dNameLength = 0;
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+    if(bDllWasLoaded)
+    {
+        /* dll was already loaded, no need to do it for the second time */
+        return 1;
+    }
+
+    /* Assumes that the DLL will not be found */
+    iJIT_DLL_is_missing = 1;
+    FUNC_NotifyEvent = NULL;
+
+    if (m_libHandle)
+    {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+        FreeLibrary(m_libHandle);
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+        dlclose(m_libHandle);
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+        m_libHandle = NULL;
+    }
+
+    /* Try to get the dll name from the environment */
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+    dNameLength = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR, NULL, 0);
+    if (dNameLength)
+    {
+        DWORD envret = 0;
+        dllName = (char*)malloc(sizeof(char) * (dNameLength + 1));
+        if(dllName != NULL)
+        {
+            envret = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR, 
+                                             dllName, dNameLength);
+            if (envret)
+            {
+                /* Try to load the dll from the PATH... */
+                m_libHandle = LoadLibraryExA(dllName, 
+                                             NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+            }
+            free(dllName);
+        }
+    } else {
+        /* Try to use old VS_PROFILER variable */
+        dNameLength = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR, NULL, 0);
+        if (dNameLength)
+        {
+            DWORD envret = 0;
+            dllName = (char*)malloc(sizeof(char) * (dNameLength + 1));
+            if(dllName != NULL)
+            {
+                envret = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR, 
+                                                 dllName, dNameLength);
+                if (envret)
+                {
+                    /* Try to load the dll from the PATH... */
+                    m_libHandle = LoadLibraryA(dllName);
+                }
+                free(dllName);
+            }
+        }
+    }
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+    dllName = getenv(NEW_DLL_ENVIRONMENT_VAR);
+    if (!dllName)
+        dllName = getenv(DLL_ENVIRONMENT_VAR);
+#if defined(__ANDROID__) || defined(ANDROID)
+    if (!dllName)
+        dllName = ANDROID_JIT_AGENT_PATH;
+#endif
+    if (dllName)
+    {
+        /* Try to load the dll from the PATH... */
+        if (DL_SYMBOLS)
+        {
+            m_libHandle = dlopen(dllName, RTLD_LAZY);
+        }
+    }
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+
+    if (!m_libHandle)
+    {
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+        m_libHandle = LoadLibraryA(DEFAULT_DLLNAME);
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+        if (DL_SYMBOLS)
+        {
+            m_libHandle = dlopen(DEFAULT_DLLNAME, RTLD_LAZY);
+        }
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+    }
+
+    /* if the dll wasn't loaded - exit. */
+    if (!m_libHandle)
+    {
+        iJIT_DLL_is_missing = 1; /* don't try to initialize
+                                  * JIT agent the second time
+                                  */
+        return 0;
+    }
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+    FUNC_NotifyEvent = (TPNotify)GetProcAddress(m_libHandle, "NotifyEvent");
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+    FUNC_NotifyEvent = (TPNotify)dlsym(m_libHandle, "NotifyEvent");
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+    if (!FUNC_NotifyEvent) 
+    {
+        FUNC_Initialize = NULL;
+        return 0;
+    }
+
+#if ITT_PLATFORM==ITT_PLATFORM_WIN
+    FUNC_Initialize = (TPInitialize)GetProcAddress(m_libHandle, "Initialize");
+#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+    FUNC_Initialize = (TPInitialize)dlsym(m_libHandle, "Initialize");
+#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+    if (!FUNC_Initialize) 
+    {
+        FUNC_NotifyEvent = NULL;
+        return 0;
+    }
+
+    executionMode = (iJIT_IsProfilingActiveFlags)FUNC_Initialize();
+
+    bDllWasLoaded = 1;
+    iJIT_DLL_is_missing = 0; /* DLL is ok. */
+
+    return 1;
+}
+
+ITT_EXTERN_C unsigned int JITAPI iJIT_GetNewMethodID()
+{
+    static unsigned int methodID = 1;
+
+    if (methodID == 0)
+        return 0;  /* ERROR : this is not a valid value */
+
+    return methodID++;
+}
diff --git a/deps/v8/third_party/ittapi/src/ittnotify_refcol/Makefile b/deps/v8/third_party/ittapi/src/ittnotify_refcol/Makefile
new file mode 100644
index 00000000000000..5500c92306b8de
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify_refcol/Makefile
@@ -0,0 +1,14 @@
+INCLUDE_DIR = ../../include/
+SRC_DIR = ../ittnotify/
+SOURCE_NAME = itt_refcol_impl.c
+OBJ_NAME = itt_refcol_impl.o
+LIB_NAME = libittrefcol.so
+CC ?= gcc
+CFLAGS = -I$(INCLUDE_DIR) -I$(SRC_DIR)
+
+build:
+	$(CC) -fPIC $(CFLAGS) -c $(SOURCE_NAME)
+	$(CC) -shared -o $(LIB_NAME) $(OBJ_NAME)
+
+clean:
+	 rm $(OBJ_NAME) $(LIB_NAME)
diff --git a/deps/v8/third_party/ittapi/src/ittnotify_refcol/README.md b/deps/v8/third_party/ittapi/src/ittnotify_refcol/README.md
new file mode 100644
index 00000000000000..a6180b0536a89f
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify_refcol/README.md
@@ -0,0 +1,26 @@
+This is a reference implementation of the ITT API _dynamic part_
+that performs tracing data from ITT API functions calls to log files.
+
+To use this solution it is requered to build it like a shared library and add
+full library path to the `INTEL_LIBITTNOTIFY64/INTEL_LIBITTNOTIFY32` environment variable:
+```
+make
+export INTEL_LIBITTNOTIFY64=<build_dir>/libittnotify_refcol.so
+```
+
+Temp directory is used by default to save log files.
+To change log directory use the `INTEL_LIBITTNOTIFY_LOG_DIR` environment variable:
+```
+export INTEL_LIBITTNOTIFY_LOG_DIR=<log_dir>
+```
+
+This implementation adds logging of some of the ITT API functions calls.
+Adding logging of the other ITT API functions calls are welcome.
+The solution provides 4 functions with different log levels
+that takes printf format for logging:
+```
+LOG_FUNC_CALL_INFO(const char *msg_format, ...);
+LOG_FUNC_CALL_WARN(const char *msg_format, ...);
+LOG_FUNC_CALL_ERROR(const char *msg_format, ...);
+LOG_FUNC_CALL_FATAL(const char *msg_format, ...);
+```
diff --git a/deps/v8/third_party/ittapi/src/ittnotify_refcol/itt_refcol_impl.c b/deps/v8/third_party/ittapi/src/ittnotify_refcol/itt_refcol_impl.c
new file mode 100644
index 00000000000000..e463408ee67504
--- /dev/null
+++ b/deps/v8/third_party/ittapi/src/ittnotify_refcol/itt_refcol_impl.c
@@ -0,0 +1,277 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#define INTEL_NO_MACRO_BODY
+#define INTEL_ITTNOTIFY_API_PRIVATE
+#include "ittnotify.h"
+#include "ittnotify_config.h"
+
+#define LOG_BUFFER_MAX_SIZE 256
+
+static const char* env_log_dir = "INTEL_LIBITTNOTIFY_LOG_DIR";
+static const char* log_level_str[] = {"INFO", "WARN", "ERROR", "FATAL_ERROR"};
+
+enum {
+    LOG_LVL_INFO,
+    LOG_LVL_WARN,
+    LOG_LVL_ERROR,
+    LOG_LVL_FATAL
+};
+
+static struct ref_collector_logger {
+    char* file_name;
+    uint8_t init_state;
+} g_ref_collector_logger = {NULL, 0};
+
+char* log_file_name_generate()
+{
+    time_t time_now = time(NULL);
+    struct tm* time_info = localtime(&time_now);
+    char* log_file_name = malloc(sizeof(char) * (LOG_BUFFER_MAX_SIZE/2));
+
+    sprintf(log_file_name,"libittnotify_refcol_%d%d%d%d%d%d.log",
+            time_info->tm_year+1900, time_info->tm_mon+1, time_info->tm_mday,
+            time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
+
+    return log_file_name;
+}
+
+void ref_col_init()
+{
+    if (!g_ref_collector_logger.init_state)
+    {
+        static char file_name_buffer[LOG_BUFFER_MAX_SIZE*2];
+        char* log_dir = getenv(env_log_dir);
+        char* log_file = log_file_name_generate();
+
+        if (log_dir != NULL)
+        {
+            #ifdef _WIN32
+                sprintf(file_name_buffer,"%s\\%s", log_dir, log_file);
+            #else
+                sprintf(file_name_buffer,"%s/%s", log_dir, log_file);
+            #endif
+        }
+        else
+        {
+            #ifdef _WIN32
+                char* temp_dir = getenv("TEMP");
+                if (temp_dir != NULL)
+                {
+                    sprintf(file_name_buffer,"%s\\%s", temp_dir, log_file);
+                }
+            #else
+                sprintf(file_name_buffer,"/tmp/%s", log_file);
+            #endif
+        }
+
+        g_ref_collector_logger.file_name = file_name_buffer;
+        g_ref_collector_logger.init_state = 1;
+    }
+}
+
+static void fill_func_ptr_per_lib(__itt_global* p)
+{
+    __itt_api_info* api_list = (__itt_api_info*)p->api_list_ptr;
+
+    for (int i = 0; api_list[i].name != NULL; i++)
+    {
+        *(api_list[i].func_ptr) = (void*)__itt_get_proc(p->lib, api_list[i].name);
+        if (*(api_list[i].func_ptr) == NULL)
+        {
+            *(api_list[i].func_ptr) = api_list[i].null_func;
+        }
+    }
+}
+
+ITT_EXTERN_C void ITTAPI __itt_api_init(__itt_global* p, __itt_group_id init_groups)
+{
+    if (p != NULL)
+    {
+        fill_func_ptr_per_lib(p);
+        ref_col_init();
+    }
+    else
+    {
+        printf("ERROR: Failed to initialize dynamic library\n");
+    }
+}
+
+void log_func_call(uint8_t log_level, const char* function_name, const char* message_format, ...)
+{
+    if (g_ref_collector_logger.init_state)
+    {
+        FILE * pLogFile = NULL;
+        char log_buffer[LOG_BUFFER_MAX_SIZE];
+        uint32_t result_len = 0;
+        va_list message_args;
+
+        result_len += sprintf(log_buffer, "[%s] %s(...) - ", log_level_str[log_level] ,function_name);
+        va_start(message_args, message_format);
+        vsnprintf(log_buffer + result_len, LOG_BUFFER_MAX_SIZE - result_len, message_format, message_args);
+
+        pLogFile = fopen(g_ref_collector_logger.file_name, "a");
+        if (!pLogFile)
+        {
+            printf("ERROR: Cannot open file: %s\n", g_ref_collector_logger.file_name);
+            return;
+        }
+        fprintf(pLogFile, "%s\n", log_buffer);
+        fclose(pLogFile);
+    }
+    else
+    {
+        return;
+    }
+}
+
+#define LOG_FUNC_CALL_INFO(...)  log_func_call(LOG_LVL_INFO, __FUNCTION__, __VA_ARGS__)
+#define LOG_FUNC_CALL_WARN(...)  log_func_call(LOG_LVL_WARN, __FUNCTION__, __VA_ARGS__)
+#define LOG_FUNC_CALL_ERROR(...) log_func_call(LOG_LVL_ERROR, __FUNCTION__, __VA_ARGS__)
+#define LOG_FUNC_CALL_FATAL(...) log_func_call(LOG_LVL_FATAL, __FUNCTION__, __VA_ARGS__)
+
+/* ------------------------------------------------------------------------------ */
+/* The code below is a reference implementation of the ITT API dynamic collector. */
+/* This implementation is designed to log ITTAPI functions calls.*/
+/* ------------------------------------------------------------------------------ */
+
+char* get_metadata_elements(size_t size, __itt_metadata_type type, void* metadata)
+{
+    char* metadata_str = malloc(sizeof(char) * LOG_BUFFER_MAX_SIZE);
+    *metadata_str = '\0';
+
+    switch (type)
+    {
+    case __itt_metadata_u64:
+        for (uint16_t i = 0; i < size; i++)
+            sprintf(metadata_str, "%s%llu;", metadata_str, ((uint64_t*)metadata)[i]);
+        break;
+    case __itt_metadata_s64:
+        for (uint16_t i = 0; i < size; i++)
+            sprintf(metadata_str, "%s%lld;", metadata_str, ((int64_t*)metadata)[i]);
+        break;
+    case __itt_metadata_u32:
+        for (uint16_t i = 0; i < size; i++)
+            sprintf(metadata_str, "%s%lu;", metadata_str, ((uint32_t*)metadata)[i]);
+        break;
+    case __itt_metadata_s32:
+        for (uint16_t i = 0; i < size; i++)
+            sprintf(metadata_str, "%s%ld;", metadata_str, ((int32_t*)metadata)[i]);
+        break;
+    case __itt_metadata_u16:
+        for (uint16_t i = 0; i < size; i++)
+            sprintf(metadata_str, "%s%u;", metadata_str, ((uint16_t*)metadata)[i]);
+        break;
+    case __itt_metadata_s16:
+        for (uint16_t i = 0; i < size; i++)
+            sprintf(metadata_str, "%s%d;", metadata_str, ((int16_t*)metadata)[i]);
+        break;
+    case __itt_metadata_float:
+        for (uint16_t i = 0; i < size; i++)
+            sprintf(metadata_str, "%s%f;", metadata_str, ((float*)metadata)[i]);
+        break;
+    case __itt_metadata_double:
+        for (uint16_t i = 0; i < size; i++)
+            sprintf(metadata_str, "%s%lf;", metadata_str, ((double*)metadata)[i]);
+        break;
+    default:
+            printf("ERROR: Unknow metadata type\n");
+    }
+
+    return metadata_str;
+}
+
+ITT_EXTERN_C void ITTAPI __itt_pause(void)
+{
+    LOG_FUNC_CALL_INFO("function call");
+}
+
+ITT_EXTERN_C void ITTAPI __itt_resume(void)
+{
+    LOG_FUNC_CALL_INFO("function call");
+}
+
+ITT_EXTERN_C void ITTAPI __itt_detach(void)
+{
+    LOG_FUNC_CALL_INFO("function call");
+}
+
+ITT_EXTERN_C void ITTAPI __itt_frame_begin_v3(const __itt_domain *domain, __itt_id *id)
+{
+    if (domain != NULL)
+    {
+        LOG_FUNC_CALL_INFO("functions args: domain_name=%s", domain->nameA);
+    }
+    else
+    {
+        LOG_FUNC_CALL_WARN("Incorrect function call");
+    }
+}
+
+ITT_EXTERN_C void ITTAPI __itt_frame_end_v3(const __itt_domain *domain, __itt_id *id)
+{
+    if (domain != NULL)
+    {
+        LOG_FUNC_CALL_INFO("functions args: domain_name=%s", domain->nameA);
+    }
+    else
+    {
+        LOG_FUNC_CALL_WARN("Incorrect function call");
+    }
+}
+
+ITT_EXTERN_C void ITTAPI __itt_frame_submit_v3(const __itt_domain *domain, __itt_id *id,
+    __itt_timestamp begin, __itt_timestamp end)
+{
+    if (domain != NULL)
+    {
+        LOG_FUNC_CALL_INFO("functions args: domain_name=%s, time_begin=%lu, time_end=%llu",
+                        domain->nameA, (uint64_t*)id, begin, end);
+    }
+    else
+    {
+        LOG_FUNC_CALL_WARN("Incorrect function call");
+    }
+}
+
+ITT_EXTERN_C void ITTAPI __itt_task_begin(
+    const __itt_domain *domain, __itt_id taskid, __itt_id parentid, __itt_string_handle *name)
+{
+    if (domain != NULL && name != NULL)
+    {
+        LOG_FUNC_CALL_INFO("functions args: domain_name=%s handle_name=%s", domain->nameA, name->strA);
+    }
+    else
+    {
+        LOG_FUNC_CALL_WARN("Incorrect function call");
+    }
+}
+
+ITT_EXTERN_C void ITTAPI __itt_task_end(const __itt_domain *domain)
+{
+    if (domain != NULL)
+    {
+        LOG_FUNC_CALL_INFO("functions args: domain_name=%s", domain->nameA);
+    }
+    else
+    {
+        LOG_FUNC_CALL_WARN("Incorrect function call");
+    }
+}
+
+ITT_EXTERN_C void __itt_metadata_add(const __itt_domain *domain, __itt_id id,
+    __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data)
+{
+    if (domain != NULL && count != 0)
+    {
+        LOG_FUNC_CALL_INFO("functions args: domain_name=%s metadata_size=%lu metadata[]=%s",
+                            domain->nameA, count, get_metadata_elements(count, type, data));
+    }
+    else
+    {
+        LOG_FUNC_CALL_WARN("Incorrect function call");
+    }
+}
diff --git a/deps/v8/third_party/zlib/BUILD.gn b/deps/v8/third_party/zlib/BUILD.gn
index ee7483e9ef6a4f..b85067a12bd86d 100644
--- a/deps/v8/third_party/zlib/BUILD.gn
+++ b/deps/v8/third_party/zlib/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Copyright 2013 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
@@ -144,7 +144,7 @@ if (use_arm_neon_optimizations) {
       if (!is_win && !is_clang) {
         assert(!use_thin_lto,
                "ThinLTO fails mixing different module-level targets")
-        cflags_c = [ "-march=armv8-a+crc" ]
+        cflags_c = [ "-march=armv8-a+aes+crc" ]
       }
 
       sources = [
diff --git a/deps/v8/third_party/zlib/adler32_simd.c b/deps/v8/third_party/zlib/adler32_simd.c
index 1354915cc099ad..58966eecf0b800 100644
--- a/deps/v8/third_party/zlib/adler32_simd.c
+++ b/deps/v8/third_party/zlib/adler32_simd.c
@@ -1,6 +1,6 @@
 /* adler32_simd.c
  *
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  *
diff --git a/deps/v8/third_party/zlib/adler32_simd.h b/deps/v8/third_party/zlib/adler32_simd.h
index 52bb14d16751c8..0b2361a5174f7a 100644
--- a/deps/v8/third_party/zlib/adler32_simd.h
+++ b/deps/v8/third_party/zlib/adler32_simd.h
@@ -1,6 +1,6 @@
 /* adler32_simd.h
  *
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/v8/third_party/zlib/chromeconf.h b/deps/v8/third_party/zlib/chromeconf.h
index 7c2241aac4dc40..5b91c86442105a 100644
--- a/deps/v8/third_party/zlib/chromeconf.h
+++ b/deps/v8/third_party/zlib/chromeconf.h
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Chromium Authors. All rights reserved.
+/* Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
diff --git a/deps/v8/third_party/zlib/contrib/optimizations/chunkcopy.h b/deps/v8/third_party/zlib/contrib/optimizations/chunkcopy.h
index 9c0b7cb06c2dcc..88022ef5fc2b05 100644
--- a/deps/v8/third_party/zlib/contrib/optimizations/chunkcopy.h
+++ b/deps/v8/third_party/zlib/contrib/optimizations/chunkcopy.h
@@ -1,6 +1,6 @@
 /* chunkcopy.h -- fast chunk copy and set operations
  * Copyright (C) 2017 ARM, Inc.
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/v8/third_party/zlib/contrib/optimizations/insert_string.h b/deps/v8/third_party/zlib/contrib/optimizations/insert_string.h
index a7f24a340812cc..2a04f699349435 100644
--- a/deps/v8/third_party/zlib/contrib/optimizations/insert_string.h
+++ b/deps/v8/third_party/zlib/contrib/optimizations/insert_string.h
@@ -1,6 +1,6 @@
 /* insert_string.h
  *
- * Copyright 2019 The Chromium Authors. All rights reserved.
+ * Copyright 2019 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/v8/third_party/zlib/cpu_features.c b/deps/v8/third_party/zlib/cpu_features.c
index 9391d7b4febcec..877d5f23d0ceae 100644
--- a/deps/v8/third_party/zlib/cpu_features.c
+++ b/deps/v8/third_party/zlib/cpu_features.c
@@ -1,6 +1,6 @@
 /* cpu_features.c -- Processor features detection.
  *
- * Copyright 2018 The Chromium Authors. All rights reserved.
+ * Copyright 2018 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/v8/third_party/zlib/cpu_features.h b/deps/v8/third_party/zlib/cpu_features.h
index c7b15c5597623f..279246c859e87e 100644
--- a/deps/v8/third_party/zlib/cpu_features.h
+++ b/deps/v8/third_party/zlib/cpu_features.h
@@ -1,6 +1,6 @@
 /* cpu_features.h -- Processor features detection.
  *
- * Copyright 2018 The Chromium Authors. All rights reserved.
+ * Copyright 2018 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/v8/third_party/zlib/crc32_simd.c b/deps/v8/third_party/zlib/crc32_simd.c
index 14a8534220538c..d80beba39c0397 100644
--- a/deps/v8/third_party/zlib/crc32_simd.c
+++ b/deps/v8/third_party/zlib/crc32_simd.c
@@ -1,6 +1,6 @@
 /* crc32_simd.c
  *
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
@@ -160,6 +160,13 @@ uint32_t ZLIB_INTERNAL crc32_sse42_simd_(  /* SSE4.2+PCLMUL */
  */
 
 #if defined(__clang__)
+/* We need some extra types for using PMULL.
+ */
+#if defined(__aarch64__)
+#include <arm_neon.h>
+#include <arm_acle.h>
+#endif
+
 /* CRC32 intrinsics are #ifdef'ed out of arm_acle.h unless we build with an
  * armv8 target, which is incompatible with ThinLTO optimizations on Android.
  * (Namely, mixing and matching different module-level targets makes ThinLTO
@@ -175,6 +182,10 @@ uint32_t ZLIB_INTERNAL crc32_sse42_simd_(  /* SSE4.2+PCLMUL */
  * NOTE: clang currently complains that "'+soft-float-abi' is not a recognized
  * feature for this target (ignoring feature)." This appears to be a harmless
  * bug in clang.
+ *
+ * These definitions must appear *after* including arm_acle.h otherwise that
+ * header may end up defining functions named __builtin_arm_crc32* that call
+ * themselves, creating an infinite loop when the intrinsic is called.
  */
 /* XXX: Cannot hook into builtins with XCode for arm64. */
 #if !defined(ARMV8_OS_MACOS)
@@ -184,13 +195,6 @@ uint32_t ZLIB_INTERNAL crc32_sse42_simd_(  /* SSE4.2+PCLMUL */
 #define __crc32cw __builtin_arm_crc32cw
 #endif
 
-/* We need some extra types for using PMULL.
- */
-#if defined(__aarch64__)
-#include <arm_neon.h>
-#include <arm_acle.h>
-#endif
-
 #if defined(__aarch64__)
 #define TARGET_ARMV8_WITH_CRC __attribute__((target("aes,crc")))
 #else  // !defined(__aarch64__)
@@ -202,6 +206,7 @@ uint32_t ZLIB_INTERNAL crc32_sse42_simd_(  /* SSE4.2+PCLMUL */
  * allowed. We can just include arm_acle.h.
  */
 #include <arm_acle.h>
+#include <arm_neon.h>
 #define TARGET_ARMV8_WITH_CRC
 #else  // !defined(__GNUC__) && !defined(_aarch64__)
 #error ARM CRC32 SIMD extensions only supported for Clang and GCC
diff --git a/deps/v8/third_party/zlib/crc32_simd.h b/deps/v8/third_party/zlib/crc32_simd.h
index 6985cbb1cd81d5..c0346dc3d903e3 100644
--- a/deps/v8/third_party/zlib/crc32_simd.h
+++ b/deps/v8/third_party/zlib/crc32_simd.h
@@ -1,6 +1,6 @@
 /* crc32_simd.h
  *
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/v8/third_party/zlib/deflate.h b/deps/v8/third_party/zlib/deflate.h
index 1407931971adf1..ad3cef7e45da4f 100644
--- a/deps/v8/third_party/zlib/deflate.h
+++ b/deps/v8/third_party/zlib/deflate.h
@@ -151,11 +151,6 @@ typedef struct internal_state {
      *   hash_shift * MIN_MATCH >= hash_bits
      */
 
-    uInt chromium_zlib_hash;
-    /* 0 if Rabin-Karp rolling hash is enabled, non-zero if chromium zlib
-     * hash is enabled.
-     */
-
     long block_start;
     /* Window position at the beginning of the current output block. Gets
      * negative when the window is moved backwards.
@@ -273,6 +268,11 @@ typedef struct internal_state {
      * updated to the new high water mark.
      */
 
+    uInt chromium_zlib_hash;
+    /* 0 if Rabin-Karp rolling hash is enabled, non-zero if chromium zlib
+     * hash is enabled.
+     */
+
 } FAR deflate_state;
 
 /* Output a byte on the stream.
diff --git a/deps/v8/third_party/zlib/google/BUILD.gn b/deps/v8/third_party/zlib/google/BUILD.gn
index e996b167dba856..35ba1daf2dfea3 100644
--- a/deps/v8/third_party/zlib/google/BUILD.gn
+++ b/deps/v8/third_party/zlib/google/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
+# Copyright 2017 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/compression_utils.cc b/deps/v8/third_party/zlib/google/compression_utils.cc
index 0c4cf08108b599..279ea0732980c3 100644
--- a/deps/v8/third_party/zlib/google/compression_utils.cc
+++ b/deps/v8/third_party/zlib/google/compression_utils.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/compression_utils.h b/deps/v8/third_party/zlib/google/compression_utils.h
index cca47be1efef6a..ea399816f60351 100644
--- a/deps/v8/third_party/zlib/google/compression_utils.h
+++ b/deps/v8/third_party/zlib/google/compression_utils.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/compression_utils_portable.cc b/deps/v8/third_party/zlib/google/compression_utils_portable.cc
index 331e41e1257253..49d6bfe9ea6ed4 100644
--- a/deps/v8/third_party/zlib/google/compression_utils_portable.cc
+++ b/deps/v8/third_party/zlib/google/compression_utils_portable.cc
@@ -1,6 +1,6 @@
 /* compression_utils_portable.cc
  *
- * Copyright 2019 The Chromium Authors. All rights reserved.
+ * Copyright 2019 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/v8/third_party/zlib/google/compression_utils_portable.h b/deps/v8/third_party/zlib/google/compression_utils_portable.h
index c1f377571fbba0..92b033e889f7f8 100644
--- a/deps/v8/third_party/zlib/google/compression_utils_portable.h
+++ b/deps/v8/third_party/zlib/google/compression_utils_portable.h
@@ -1,6 +1,6 @@
 /* compression_utils_portable.h
  *
- * Copyright 2019 The Chromium Authors. All rights reserved.
+ * Copyright 2019 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/v8/third_party/zlib/google/compression_utils_unittest.cc b/deps/v8/third_party/zlib/google/compression_utils_unittest.cc
index 76572e5a47eac4..8e24387ee341da 100644
--- a/deps/v8/third_party/zlib/google/compression_utils_unittest.cc
+++ b/deps/v8/third_party/zlib/google/compression_utils_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/redact.h b/deps/v8/third_party/zlib/google/redact.h
index ea7da16a52751c..df6bcafc2af8dd 100644
--- a/deps/v8/third_party/zlib/google/redact.h
+++ b/deps/v8/third_party/zlib/google/redact.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2022 The Chromium Authors. All rights reserved.
+// Copyright 2022 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 #ifndef THIRD_PARTY_ZLIB_GOOGLE_REDACT_H_
diff --git a/deps/v8/third_party/zlib/google/zip.cc b/deps/v8/third_party/zlib/google/zip.cc
index 7d5404b4bf707e..490dcee34e1e42 100644
--- a/deps/v8/third_party/zlib/google/zip.cc
+++ b/deps/v8/third_party/zlib/google/zip.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/zip.h b/deps/v8/third_party/zlib/google/zip.h
index 0d9af0cbd935e0..e3036c809c2376 100644
--- a/deps/v8/third_party/zlib/google/zip.h
+++ b/deps/v8/third_party/zlib/google/zip.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/zip_internal.cc b/deps/v8/third_party/zlib/google/zip_internal.cc
index 1adf2e6d0e8fef..e65d7ce6b5f464 100644
--- a/deps/v8/third_party/zlib/google/zip_internal.cc
+++ b/deps/v8/third_party/zlib/google/zip_internal.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/zip_internal.h b/deps/v8/third_party/zlib/google/zip_internal.h
index 92833fa1702130..f107d7fe883541 100644
--- a/deps/v8/third_party/zlib/google/zip_internal.h
+++ b/deps/v8/third_party/zlib/google/zip_internal.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/zip_reader.cc b/deps/v8/third_party/zlib/google/zip_reader.cc
index 075ba70aa8aca4..e97027a0bbb2fb 100644
--- a/deps/v8/third_party/zlib/google/zip_reader.cc
+++ b/deps/v8/third_party/zlib/google/zip_reader.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/zip_reader.h b/deps/v8/third_party/zlib/google/zip_reader.h
index 286ddfd9bd4d13..48244c8238368e 100644
--- a/deps/v8/third_party/zlib/google/zip_reader.h
+++ b/deps/v8/third_party/zlib/google/zip_reader.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 #ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_READER_H_
diff --git a/deps/v8/third_party/zlib/google/zip_reader_unittest.cc b/deps/v8/third_party/zlib/google/zip_reader_unittest.cc
index 31dceaccad30de..52dab200a3494c 100644
--- a/deps/v8/third_party/zlib/google/zip_reader_unittest.cc
+++ b/deps/v8/third_party/zlib/google/zip_reader_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/zip_unittest.cc b/deps/v8/third_party/zlib/google/zip_unittest.cc
index 435d7b02ee2344..b639e8e8437799 100644
--- a/deps/v8/third_party/zlib/google/zip_unittest.cc
+++ b/deps/v8/third_party/zlib/google/zip_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -1358,10 +1358,10 @@ TEST_F(ZipTest, NestedZip) {
 // performing this test (android-asan, android-11-x86-rel,
 // android-marshmallow-x86-rel-non-cq).
 // Some Mac, Linux and Debug (dbg) bots tend to time out when performing this
-// test (crbug.com/1299736, crbug.com/1300448).
+// test (crbug.com/1299736, crbug.com/1300448, crbug.com/1369958).
 #if defined(THREAD_SANITIZER) || BUILDFLAG(IS_FUCHSIA) ||                \
     BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS_LACROS) || !defined(NDEBUG)
+    BUILDFLAG(IS_CHROMEOS) || !defined(NDEBUG)
 TEST_F(ZipTest, DISABLED_BigFile) {
 #else
 TEST_F(ZipTest, BigFile) {
diff --git a/deps/v8/third_party/zlib/google/zip_writer.cc b/deps/v8/third_party/zlib/google/zip_writer.cc
index e3f677fe328082..31161ae86c3b7a 100644
--- a/deps/v8/third_party/zlib/google/zip_writer.cc
+++ b/deps/v8/third_party/zlib/google/zip_writer.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/google/zip_writer.h b/deps/v8/third_party/zlib/google/zip_writer.h
index aa3c965d911599..dd109293da0a4f 100644
--- a/deps/v8/third_party/zlib/google/zip_writer.h
+++ b/deps/v8/third_party/zlib/google/zip_writer.h
@@ -1,4 +1,4 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/v8/third_party/zlib/slide_hash_simd.h b/deps/v8/third_party/zlib/slide_hash_simd.h
index 6f715bcde176a9..1000b774ccb60a 100644
--- a/deps/v8/third_party/zlib/slide_hash_simd.h
+++ b/deps/v8/third_party/zlib/slide_hash_simd.h
@@ -1,6 +1,6 @@
 /* slide_hash_simd.h
  *
- * Copyright 2022 The Chromium Authors. All rights reserved.
+ * Copyright 2022 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/v8/tools/builtins-pgo/arm.profile b/deps/v8/tools/builtins-pgo/arm.profile
new file mode 100644
index 00000000000000..8c6d20982ca6b1
--- /dev/null
+++ b/deps/v8/tools/builtins-pgo/arm.profile
@@ -0,0 +1,6359 @@
+block_hint,RecordWriteSaveFP,6,7,1
+block_hint,RecordWriteSaveFP,19,20,1
+block_hint,RecordWriteSaveFP,9,10,1
+block_hint,RecordWriteSaveFP,32,33,0
+block_hint,RecordWriteSaveFP,36,37,1
+block_hint,RecordWriteSaveFP,34,35,1
+block_hint,RecordWriteSaveFP,25,26,0
+block_hint,RecordWriteSaveFP,15,16,0
+block_hint,RecordWriteSaveFP,17,18,1
+block_hint,RecordWriteIgnoreFP,6,7,1
+block_hint,RecordWriteIgnoreFP,19,20,1
+block_hint,RecordWriteIgnoreFP,9,10,1
+block_hint,RecordWriteIgnoreFP,25,26,0
+block_hint,RecordWriteIgnoreFP,15,16,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,19,20,1
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,43,44,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,83,84,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,80,81,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,63,64,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,35,36,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,67,68,1
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,50,51,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,29,30,1
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,56,57,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,7,8,1
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,61,62,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,14,15,1
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,16,17,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,69,70,0
+block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,54,55,1
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,19,20,1
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,83,84,0
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,80,81,0
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,63,64,0
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,5,6,1
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,46,47,1
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,25,26,1
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,67,68,1
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,50,51,0
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,29,30,1
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,7,8,1
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,61,62,0
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,14,15,1
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,16,17,0
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,69,70,0
+block_hint,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,54,55,1
+block_hint,Call_ReceiverIsAny_Baseline_Compact,19,20,1
+block_hint,Call_ReceiverIsAny_Baseline_Compact,21,22,1
+block_hint,CallProxy,38,39,1
+block_hint,CallProxy,22,23,1
+block_hint,CallProxy,18,19,1
+block_hint,CallWithSpread,51,52,1
+block_hint,CallWithSpread,31,32,1
+block_hint,CallWithSpread,6,7,1
+block_hint,CallWithSpread,57,58,1
+block_hint,CallWithSpread,59,60,0
+block_hint,CallWithSpread,43,44,0
+block_hint,CallWithSpread,45,46,1
+block_hint,CallWithSpread,33,34,0
+block_hint,CallWithSpread,38,39,1
+block_hint,CallWithSpread,40,41,1
+block_hint,CallWithSpread,22,23,1
+block_hint,CallWithSpread,24,25,1
+block_hint,CallWithSpread,26,27,0
+block_hint,CallWithSpread,53,54,1
+block_hint,CallWithSpread,47,48,1
+block_hint,CallWithSpread,9,10,0
+block_hint,CallWithSpread,11,12,1
+block_hint,CallWithSpread,13,14,0
+block_hint,CallWithSpread,49,50,0
+block_hint,CallWithSpread,55,56,1
+block_hint,CallWithSpread,15,16,1
+block_hint,CallWithSpread_Baseline,115,116,1
+block_hint,CallWithSpread_Baseline,60,61,0
+block_hint,CallWithSpread_Baseline,113,114,0
+block_hint,CallWithSpread_Baseline,106,107,0
+block_hint,CallWithSpread_Baseline,81,82,0
+block_hint,CallWithSpread_Baseline,48,49,0
+block_hint,CallWithSpread_Baseline,138,139,1
+block_hint,CallWithSpread_Baseline,130,131,0
+block_hint,CallWithSpread_Baseline,119,120,1
+block_hint,CallWithSpread_Baseline,85,86,1
+block_hint,CallWithSpread_Baseline,12,13,1
+block_hint,CallWithSpread_Baseline,100,101,1
+block_hint,CallWithSpread_Baseline,102,103,0
+block_hint,CallWithSpread_Baseline,68,69,0
+block_hint,CallWithSpread_Baseline,33,34,1
+block_hint,CallWithSpread_Baseline,53,54,0
+block_hint,CallWithSpread_Baseline,63,64,1
+block_hint,CallWithSpread_Baseline,65,66,1
+block_hint,CallWithSpread_Baseline,37,38,1
+block_hint,CallWithArrayLike,28,29,1
+block_hint,CallWithArrayLike,30,31,1
+block_hint,CallWithArrayLike,32,33,1
+block_hint,CallWithArrayLike,6,7,1
+block_hint,CallWithArrayLike,8,9,1
+block_hint,CallWithArrayLike,61,62,0
+block_hint,CallWithArrayLike,53,54,1
+block_hint,CallWithArrayLike,46,47,0
+block_hint,CallWithArrayLike,10,11,1
+block_hint,CallWithArrayLike,63,64,1
+block_hint,CallWithArrayLike,55,56,0
+block_hint,CallWithArrayLike,57,58,1
+block_hint,CallWithArrayLike,12,13,0
+block_hint,ConstructWithSpread_Baseline,90,91,1
+block_hint,ConstructWithSpread_Baseline,70,71,1
+block_hint,ConstructWithSpread_Baseline,45,46,1
+block_hint,ConstructWithSpread_Baseline,11,12,1
+block_hint,ConstructWithSpread_Baseline,81,82,1
+block_hint,ConstructWithSpread_Baseline,83,84,0
+block_hint,ConstructWithSpread_Baseline,58,59,0
+block_hint,ConstructWithSpread_Baseline,27,28,1
+block_hint,Construct_Baseline,48,49,0
+block_hint,Construct_Baseline,46,47,1
+block_hint,Construct_Baseline,38,39,1
+block_hint,Construct_Baseline,23,24,1
+block_hint,Construct_Baseline,5,6,1
+block_hint,Construct_Baseline,20,21,1
+block_hint,Construct_Baseline,25,26,1
+block_hint,Construct_Baseline,7,8,1
+block_hint,Construct_Baseline,36,37,0
+block_hint,Construct_Baseline,11,12,1
+block_hint,Construct_Baseline,13,14,0
+block_hint,Construct_Baseline,40,41,0
+block_hint,Construct_Baseline,27,28,1
+block_hint,FastNewObject,38,39,1
+block_hint,FastNewObject,40,41,1
+block_hint,FastNewObject,42,43,1
+block_hint,FastNewObject,44,45,1
+block_hint,FastNewObject,53,54,0
+block_hint,FastNewObject,55,56,1
+block_hint,FastNewObject,48,49,0
+block_hint,FastNewObject,23,24,0
+block_hint,FastNewObject,27,28,0
+block_hint,FastNewObject,31,32,1
+block_hint,FastNewClosure,15,16,0
+block_hint,FastNewClosure,4,5,1
+block_hint,FastNewClosure,19,20,1
+block_hint,FastNewClosure,8,9,1
+block_hint,StringEqual,57,58,0
+block_hint,StringEqual,29,30,1
+block_hint,StringEqual,55,56,0
+block_hint,StringEqual,45,46,1
+block_hint,StringEqual,81,82,1
+block_hint,StringEqual,69,70,0
+block_hint,StringEqual,51,52,0
+block_hint,StringEqual,23,24,1
+block_hint,StringEqual,79,80,0
+block_hint,StringEqual,65,66,0
+block_hint,StringEqual,47,48,0
+block_hint,StringEqual,39,40,0
+block_hint,StringEqual,71,72,0
+block_hint,StringEqual,53,54,0
+block_hint,StringGreaterThanOrEqual,40,41,1
+block_hint,StringGreaterThanOrEqual,30,31,1
+block_hint,StringGreaterThanOrEqual,36,37,0
+block_hint,StringGreaterThanOrEqual,12,13,0
+block_hint,StringLessThan,22,23,0
+block_hint,StringLessThan,40,41,1
+block_hint,StringLessThan,36,37,0
+block_hint,StringLessThan,24,25,0
+block_hint,StringLessThanOrEqual,40,41,1
+block_hint,StringLessThanOrEqual,30,31,1
+block_hint,StringLessThanOrEqual,36,37,0
+block_hint,StringLessThanOrEqual,12,13,0
+block_hint,StringSubstring,87,88,0
+block_hint,StringSubstring,29,30,0
+block_hint,StringSubstring,63,64,1
+block_hint,StringSubstring,58,59,1
+block_hint,StringSubstring,56,57,1
+block_hint,StringSubstring,110,111,0
+block_hint,StringSubstring,19,20,0
+block_hint,StringSubstring,21,22,0
+block_hint,StringSubstring,114,115,1
+block_hint,StringSubstring,102,103,1
+block_hint,StringSubstring,38,39,0
+block_hint,StringSubstring,17,18,0
+block_hint,StringSubstring,116,117,1
+block_hint,StringSubstring,104,105,1
+block_hint,StringSubstring,42,43,0
+block_hint,StringSubstring,75,76,1
+block_hint,StringSubstring,127,128,0
+block_hint,StringSubstring,34,35,1
+block_hint,StringSubstring,31,32,0
+block_hint,OrderedHashTableHealIndex,5,6,1
+block_hint,OrderedHashTableHealIndex,9,10,0
+block_hint,CompileLazy,42,43,1
+block_hint,CompileLazy,22,23,0
+block_hint,CompileLazy,40,41,0
+block_hint,CompileLazy,8,9,0
+block_hint,CompileLazy,10,11,0
+block_hint,CompileLazy,15,16,0
+block_hint,CompileLazy,3,4,0
+block_hint,CompileLazy,18,19,1
+block_hint,AllocateInYoungGeneration,2,3,1
+block_hint,AllocateRegularInYoungGeneration,2,3,1
+block_hint,AllocateRegularInOldGeneration,2,3,1
+block_hint,CopyFastSmiOrObjectElements,12,13,1
+block_hint,CopyFastSmiOrObjectElements,18,19,1
+block_hint,CopyFastSmiOrObjectElements,9,10,0
+block_hint,CopyFastSmiOrObjectElements,23,24,1
+block_hint,CopyFastSmiOrObjectElements,21,22,1
+block_hint,CopyFastSmiOrObjectElements,15,16,0
+block_hint,GrowFastDoubleElements,18,19,0
+block_hint,GrowFastDoubleElements,20,21,0
+block_hint,GrowFastDoubleElements,14,15,0
+block_hint,GrowFastDoubleElements,16,17,1
+block_hint,GrowFastDoubleElements,28,29,0
+block_hint,GrowFastDoubleElements,6,7,0
+block_hint,GrowFastDoubleElements,26,27,0
+block_hint,GrowFastSmiOrObjectElements,16,17,0
+block_hint,GrowFastSmiOrObjectElements,18,19,0
+block_hint,GrowFastSmiOrObjectElements,14,15,0
+block_hint,GrowFastSmiOrObjectElements,22,23,1
+block_hint,GrowFastSmiOrObjectElements,6,7,0
+block_hint,GrowFastSmiOrObjectElements,12,13,0
+block_hint,ToNumber,3,4,1
+block_hint,ToNumber,5,6,0
+block_hint,ToNumber,18,19,0
+block_hint,ToNumber,15,16,1
+block_hint,ToNumber_Baseline,24,25,0
+block_hint,ToNumber_Baseline,22,23,1
+block_hint,ToNumber_Baseline,3,4,1
+block_hint,ToNumeric_Baseline,7,8,0
+block_hint,ToNumeric_Baseline,9,10,1
+block_hint,ToNumeric_Baseline,3,4,1
+block_hint,ToNumberConvertBigInt,3,4,1
+block_hint,ToNumberConvertBigInt,5,6,0
+block_hint,ToNumberConvertBigInt,20,21,0
+block_hint,ToNumberConvertBigInt,17,18,1
+block_hint,ToNumberConvertBigInt,9,10,1
+block_hint,Typeof,15,16,0
+block_hint,Typeof,17,18,0
+block_hint,Typeof,9,10,0
+block_hint,Typeof,13,14,1
+block_hint,KeyedLoadIC_PolymorphicName,247,248,1
+block_hint,KeyedLoadIC_PolymorphicName,96,97,1
+block_hint,KeyedLoadIC_PolymorphicName,263,264,0
+block_hint,KeyedLoadIC_PolymorphicName,60,61,0
+block_hint,KeyedLoadIC_PolymorphicName,133,134,1
+block_hint,KeyedLoadIC_PolymorphicName,303,304,0
+block_hint,KeyedLoadIC_PolymorphicName,333,334,1
+block_hint,KeyedLoadIC_PolymorphicName,98,99,0
+block_hint,KeyedLoadIC_PolymorphicName,284,285,1
+block_hint,KeyedLoadIC_PolymorphicName,24,25,1
+block_hint,KeyedLoadIC_PolymorphicName,165,166,0
+block_hint,KeyedLoadIC_PolymorphicName,122,123,1
+block_hint,KeyedLoadIC_PolymorphicName,335,336,1
+block_hint,KeyedLoadIC_PolymorphicName,110,111,0
+block_hint,KeyedLoadIC_PolymorphicName,175,176,0
+block_hint,KeyedLoadIC_PolymorphicName,45,46,1
+block_hint,KeyedLoadIC_PolymorphicName,74,75,0
+block_hint,KeyedLoadIC_PolymorphicName,253,254,0
+block_hint,KeyedLoadIC_PolymorphicName,292,293,1
+block_hint,KeyedLoadIC_PolymorphicName,28,29,0
+block_hint,KeyedLoadIC_PolymorphicName,26,27,0
+block_hint,KeyedStoreIC_Megamorphic,379,380,1
+block_hint,KeyedStoreIC_Megamorphic,381,382,0
+block_hint,KeyedStoreIC_Megamorphic,1234,1235,0
+block_hint,KeyedStoreIC_Megamorphic,1215,1216,1
+block_hint,KeyedStoreIC_Megamorphic,1149,1150,0
+block_hint,KeyedStoreIC_Megamorphic,918,919,1
+block_hint,KeyedStoreIC_Megamorphic,383,384,1
+block_hint,KeyedStoreIC_Megamorphic,1244,1245,0
+block_hint,KeyedStoreIC_Megamorphic,1223,1224,0
+block_hint,KeyedStoreIC_Megamorphic,601,602,0
+block_hint,KeyedStoreIC_Megamorphic,746,747,1
+block_hint,KeyedStoreIC_Megamorphic,603,604,0
+block_hint,KeyedStoreIC_Megamorphic,1203,1204,0
+block_hint,KeyedStoreIC_Megamorphic,1038,1039,0
+block_hint,KeyedStoreIC_Megamorphic,1177,1178,0
+block_hint,KeyedStoreIC_Megamorphic,192,193,1
+block_hint,KeyedStoreIC_Megamorphic,194,195,1
+block_hint,KeyedStoreIC_Megamorphic,539,540,0
+block_hint,KeyedStoreIC_Megamorphic,541,542,0
+block_hint,KeyedStoreIC_Megamorphic,1042,1043,0
+block_hint,KeyedStoreIC_Megamorphic,547,548,1
+block_hint,KeyedStoreIC_Megamorphic,1068,1069,0
+block_hint,KeyedStoreIC_Megamorphic,606,607,0
+block_hint,KeyedStoreIC_Megamorphic,1205,1206,0
+block_hint,KeyedStoreIC_Megamorphic,549,550,0
+block_hint,KeyedStoreIC_Megamorphic,1044,1045,0
+block_hint,KeyedStoreIC_Megamorphic,200,201,1
+block_hint,KeyedStoreIC_Megamorphic,553,554,0
+block_hint,KeyedStoreIC_Megamorphic,202,203,0
+block_hint,KeyedStoreIC_Megamorphic,204,205,0
+block_hint,KeyedStoreIC_Megamorphic,953,954,0
+block_hint,KeyedStoreIC_Megamorphic,555,556,1
+block_hint,KeyedStoreIC_Megamorphic,557,558,0
+block_hint,KeyedStoreIC_Megamorphic,559,560,1
+block_hint,KeyedStoreIC_Megamorphic,561,562,0
+block_hint,KeyedStoreIC_Megamorphic,1157,1158,0
+block_hint,KeyedStoreIC_Megamorphic,563,564,1
+block_hint,KeyedStoreIC_Megamorphic,905,906,0
+block_hint,KeyedStoreIC_Megamorphic,1159,1160,0
+block_hint,KeyedStoreIC_Megamorphic,565,566,1
+block_hint,KeyedStoreIC_Megamorphic,571,572,1
+block_hint,KeyedStoreIC_Megamorphic,573,574,0
+block_hint,KeyedStoreIC_Megamorphic,575,576,0
+block_hint,KeyedStoreIC_Megamorphic,577,578,1
+block_hint,KeyedStoreIC_Megamorphic,960,961,1
+block_hint,KeyedStoreIC_Megamorphic,569,570,1
+block_hint,KeyedStoreIC_Megamorphic,567,568,0
+block_hint,KeyedStoreIC_Megamorphic,1232,1233,0
+block_hint,KeyedStoreIC_Megamorphic,1247,1248,1
+block_hint,KeyedStoreIC_Megamorphic,1240,1241,1
+block_hint,KeyedStoreIC_Megamorphic,1139,1140,1
+block_hint,KeyedStoreIC_Megamorphic,978,979,1
+block_hint,KeyedStoreIC_Megamorphic,206,207,0
+block_hint,KeyedStoreIC_Megamorphic,362,363,0
+block_hint,KeyedStoreIC_Megamorphic,1143,1144,0
+block_hint,KeyedStoreIC_Megamorphic,1152,1153,0
+block_hint,KeyedStoreIC_Megamorphic,930,931,0
+block_hint,KeyedStoreIC_Megamorphic,491,492,0
+block_hint,KeyedStoreIC_Megamorphic,898,899,0
+block_hint,KeyedStoreIC_Megamorphic,934,935,0
+block_hint,KeyedStoreIC_Megamorphic,932,933,1
+block_hint,KeyedStoreIC_Megamorphic,493,494,1
+block_hint,KeyedStoreIC_Megamorphic,499,500,1
+block_hint,KeyedStoreIC_Megamorphic,501,502,0
+block_hint,KeyedStoreIC_Megamorphic,938,939,1
+block_hint,KeyedStoreIC_Megamorphic,503,504,0
+block_hint,KeyedStoreIC_Megamorphic,505,506,1
+block_hint,KeyedStoreIC_Megamorphic,936,937,1
+block_hint,KeyedStoreIC_Megamorphic,497,498,1
+block_hint,KeyedStoreIC_Megamorphic,495,496,0
+block_hint,KeyedStoreIC_Megamorphic,1124,1125,1
+block_hint,KeyedStoreIC_Megamorphic,1189,1190,1
+block_hint,KeyedStoreIC_Megamorphic,896,897,0
+block_hint,KeyedStoreIC_Megamorphic,350,351,1
+block_hint,KeyedStoreIC_Megamorphic,336,337,1
+block_hint,KeyedStoreIC_Megamorphic,1122,1123,1
+block_hint,KeyedStoreIC_Megamorphic,683,684,0
+block_hint,KeyedStoreIC_Megamorphic,980,981,1
+block_hint,KeyedStoreIC_Megamorphic,214,215,0
+block_hint,KeyedStoreIC_Megamorphic,1024,1025,0
+block_hint,KeyedStoreIC_Megamorphic,693,694,0
+block_hint,KeyedStoreIC_Megamorphic,579,580,0
+block_hint,KeyedStoreIC_Megamorphic,167,168,1
+block_hint,KeyedStoreIC_Megamorphic,581,582,0
+block_hint,KeyedStoreIC_Megamorphic,583,584,0
+block_hint,KeyedStoreIC_Megamorphic,1051,1052,0
+block_hint,KeyedStoreIC_Megamorphic,585,586,1
+block_hint,KeyedStoreIC_Megamorphic,966,967,0
+block_hint,KeyedStoreIC_Megamorphic,1183,1184,0
+block_hint,KeyedStoreIC_Megamorphic,1053,1054,1
+block_hint,KeyedStoreIC_Megamorphic,759,760,1
+block_hint,KeyedStoreIC_Megamorphic,612,613,0
+block_hint,KeyedStoreIC_Megamorphic,1208,1209,0
+block_hint,KeyedStoreIC_Megamorphic,1055,1056,0
+block_hint,KeyedStoreIC_Megamorphic,1181,1182,0
+block_hint,KeyedStoreIC_Megamorphic,224,225,1
+block_hint,KeyedStoreIC_Megamorphic,761,762,0
+block_hint,KeyedStoreIC_Megamorphic,593,594,0
+block_hint,KeyedStoreIC_Megamorphic,1145,1146,0
+block_hint,KeyedStoreIC_Megamorphic,1192,1193,0
+block_hint,KeyedStoreIC_Megamorphic,909,910,0
+block_hint,KeyedStoreIC_Megamorphic,173,174,1
+block_hint,KeyedStoreIC_Megamorphic,175,176,1
+block_hint,KeyedStoreIC_Megamorphic,373,374,0
+block_hint,KeyedStoreIC_Megamorphic,177,178,1
+block_hint,KeyedStoreIC_Megamorphic,375,376,0
+block_hint,KeyedStoreIC_Megamorphic,179,180,1
+block_hint,KeyedStoreIC_Megamorphic,234,235,0
+block_hint,KeyedStoreIC_Megamorphic,236,237,0
+block_hint,KeyedStoreIC_Megamorphic,181,182,1
+block_hint,KeyedStoreIC_Megamorphic,183,184,1
+block_hint,KeyedStoreIC_Megamorphic,1029,1030,0
+block_hint,KeyedStoreIC_Megamorphic,185,186,1
+block_hint,KeyedStoreIC_Megamorphic,928,929,1
+block_hint,KeyedStoreIC_Megamorphic,485,486,1
+block_hint,KeyedStoreIC_Megamorphic,733,734,0
+block_hint,KeyedStoreIC_Megamorphic,922,923,1
+block_hint,KeyedStoreIC_Megamorphic,413,414,0
+block_hint,KeyedStoreIC_Megamorphic,415,416,0
+block_hint,KeyedStoreIC_Megamorphic,254,255,1
+block_hint,KeyedStoreIC_Megamorphic,417,418,0
+block_hint,KeyedStoreIC_Megamorphic,630,631,1
+block_hint,KeyedStoreIC_Megamorphic,92,93,1
+block_hint,KeyedStoreIC_Megamorphic,94,95,0
+block_hint,KeyedStoreIC_Megamorphic,771,772,1
+block_hint,KeyedStoreIC_Megamorphic,387,388,0
+block_hint,KeyedStoreIC_Megamorphic,639,640,1
+block_hint,KeyedStoreIC_Megamorphic,64,65,1
+block_hint,KeyedStoreIC_Megamorphic,66,67,0
+block_hint,DefineKeyedOwnIC_Megamorphic,312,313,1
+block_hint,DefineKeyedOwnIC_Megamorphic,314,315,0
+block_hint,DefineKeyedOwnIC_Megamorphic,899,900,0
+block_hint,DefineKeyedOwnIC_Megamorphic,420,421,0
+block_hint,DefineKeyedOwnIC_Megamorphic,418,419,1
+block_hint,DefineKeyedOwnIC_Megamorphic,800,801,0
+block_hint,DefineKeyedOwnIC_Megamorphic,575,576,1
+block_hint,DefineKeyedOwnIC_Megamorphic,603,604,1
+block_hint,DefineKeyedOwnIC_Megamorphic,232,233,0
+block_hint,DefineKeyedOwnIC_Megamorphic,53,54,1
+block_hint,DefineKeyedOwnIC_Megamorphic,55,56,0
+block_hint,LoadGlobalIC_NoFeedback,41,42,1
+block_hint,LoadGlobalIC_NoFeedback,6,7,1
+block_hint,LoadGlobalIC_NoFeedback,8,9,1
+block_hint,LoadGlobalIC_NoFeedback,10,11,1
+block_hint,LoadGlobalIC_NoFeedback,12,13,1
+block_hint,LoadGlobalIC_NoFeedback,31,32,1
+block_hint,LoadGlobalIC_NoFeedback,49,50,1
+block_hint,LoadGlobalIC_NoFeedback,18,19,1
+block_hint,LoadGlobalIC_NoFeedback,27,28,0
+block_hint,LoadGlobalIC_NoFeedback,14,15,1
+block_hint,LoadGlobalIC_NoFeedback,33,34,0
+block_hint,LoadGlobalIC_NoFeedback,16,17,1
+block_hint,LoadGlobalIC_NoFeedback,20,21,1
+block_hint,LoadGlobalIC_NoFeedback,22,23,0
+block_hint,LoadGlobalIC_NoFeedback,24,25,1
+block_hint,LoadIC_FunctionPrototype,2,3,0
+block_hint,LoadIC_FunctionPrototype,4,5,1
+block_hint,LoadIC_NoFeedback,97,98,1
+block_hint,LoadIC_NoFeedback,99,100,0
+block_hint,LoadIC_NoFeedback,306,307,1
+block_hint,LoadIC_NoFeedback,226,227,0
+block_hint,LoadIC_NoFeedback,141,142,0
+block_hint,LoadIC_NoFeedback,320,321,0
+block_hint,LoadIC_NoFeedback,287,288,0
+block_hint,LoadIC_NoFeedback,302,303,0
+block_hint,LoadIC_NoFeedback,53,54,1
+block_hint,LoadIC_NoFeedback,289,290,0
+block_hint,LoadIC_NoFeedback,55,56,1
+block_hint,LoadIC_NoFeedback,324,325,1
+block_hint,LoadIC_NoFeedback,272,273,0
+block_hint,LoadIC_NoFeedback,295,296,1
+block_hint,LoadIC_NoFeedback,247,248,1
+block_hint,LoadIC_NoFeedback,59,60,0
+block_hint,LoadIC_NoFeedback,22,23,1
+block_hint,LoadIC_NoFeedback,113,114,0
+block_hint,LoadIC_NoFeedback,35,36,1
+block_hint,LoadIC_NoFeedback,130,131,1
+block_hint,LoadIC_NoFeedback,145,146,0
+block_hint,LoadIC_NoFeedback,125,126,0
+block_hint,LoadIC_NoFeedback,261,262,0
+block_hint,LoadIC_NoFeedback,250,251,0
+block_hint,LoadIC_NoFeedback,149,150,1
+block_hint,LoadIC_NoFeedback,167,168,0
+block_hint,LoadIC_NoFeedback,322,323,0
+block_hint,LoadIC_NoFeedback,151,152,0
+block_hint,LoadIC_NoFeedback,291,292,0
+block_hint,LoadIC_NoFeedback,70,71,1
+block_hint,LoadIC_NoFeedback,155,156,0
+block_hint,LoadIC_NoFeedback,72,73,1
+block_hint,LoadIC_NoFeedback,254,255,1
+block_hint,LoadIC_NoFeedback,76,77,0
+block_hint,LoadIC_NoFeedback,326,327,1
+block_hint,LoadIC_NoFeedback,278,279,0
+block_hint,LoadIC_NoFeedback,276,277,0
+block_hint,LoadIC_NoFeedback,24,25,1
+block_hint,LoadIC_NoFeedback,242,243,1
+block_hint,LoadIC_NoFeedback,135,136,1
+block_hint,LoadIC_NoFeedback,93,94,0
+block_hint,StoreIC_NoFeedback,147,148,1
+block_hint,StoreIC_NoFeedback,149,150,0
+block_hint,StoreIC_NoFeedback,259,260,0
+block_hint,StoreIC_NoFeedback,549,550,0
+block_hint,StoreIC_NoFeedback,443,444,0
+block_hint,StoreIC_NoFeedback,527,528,0
+block_hint,StoreIC_NoFeedback,58,59,1
+block_hint,StoreIC_NoFeedback,60,61,1
+block_hint,StoreIC_NoFeedback,199,200,0
+block_hint,StoreIC_NoFeedback,201,202,0
+block_hint,StoreIC_NoFeedback,447,448,0
+block_hint,StoreIC_NoFeedback,207,208,1
+block_hint,StoreIC_NoFeedback,473,474,0
+block_hint,StoreIC_NoFeedback,262,263,0
+block_hint,StoreIC_NoFeedback,551,552,0
+block_hint,StoreIC_NoFeedback,209,210,0
+block_hint,StoreIC_NoFeedback,449,450,0
+block_hint,StoreIC_NoFeedback,66,67,1
+block_hint,StoreIC_NoFeedback,213,214,0
+block_hint,StoreIC_NoFeedback,68,69,0
+block_hint,StoreIC_NoFeedback,390,391,0
+block_hint,StoreIC_NoFeedback,215,216,1
+block_hint,StoreIC_NoFeedback,217,218,0
+block_hint,StoreIC_NoFeedback,219,220,1
+block_hint,StoreIC_NoFeedback,221,222,0
+block_hint,StoreIC_NoFeedback,509,510,0
+block_hint,StoreIC_NoFeedback,223,224,1
+block_hint,StoreIC_NoFeedback,356,357,0
+block_hint,StoreIC_NoFeedback,511,512,0
+block_hint,StoreIC_NoFeedback,393,394,1
+block_hint,StoreIC_NoFeedback,231,232,1
+block_hint,StoreIC_NoFeedback,233,234,0
+block_hint,StoreIC_NoFeedback,235,236,0
+block_hint,StoreIC_NoFeedback,237,238,1
+block_hint,StoreIC_NoFeedback,227,228,0
+block_hint,StoreIC_NoFeedback,564,565,0
+block_hint,StoreIC_NoFeedback,494,495,1
+block_hint,StoreIC_NoFeedback,413,414,1
+block_hint,StoreIC_NoFeedback,72,73,0
+block_hint,StoreIC_NoFeedback,78,79,0
+block_hint,StoreIC_NoFeedback,130,131,0
+block_hint,StoreIC_NoFeedback,498,499,0
+block_hint,StoreIC_NoFeedback,367,368,0
+block_hint,StoreIC_NoFeedback,151,152,0
+block_hint,StoreIC_NoFeedback,349,350,0
+block_hint,StoreIC_NoFeedback,153,154,1
+block_hint,StoreIC_NoFeedback,159,160,1
+block_hint,StoreIC_NoFeedback,161,162,0
+block_hint,StoreIC_NoFeedback,163,164,0
+block_hint,StoreIC_NoFeedback,157,158,1
+block_hint,StoreIC_NoFeedback,155,156,0
+block_hint,StoreIC_NoFeedback,536,537,1
+block_hint,StoreIC_NoFeedback,385,386,1
+block_hint,StoreIC_NoFeedback,193,194,0
+block_hint,StoreIC_NoFeedback,381,382,1
+block_hint,StoreIC_NoFeedback,179,180,0
+block_hint,StoreIC_NoFeedback,519,520,1
+block_hint,StoreIC_NoFeedback,415,416,1
+block_hint,StoreIC_NoFeedback,80,81,0
+block_hint,StoreIC_NoFeedback,82,83,0
+block_hint,StoreIC_NoFeedback,241,242,0
+block_hint,StoreIC_NoFeedback,243,244,0
+block_hint,StoreIC_NoFeedback,456,457,0
+block_hint,StoreIC_NoFeedback,245,246,1
+block_hint,StoreIC_NoFeedback,513,514,0
+block_hint,StoreIC_NoFeedback,403,404,0
+block_hint,StoreIC_NoFeedback,458,459,1
+block_hint,StoreIC_NoFeedback,268,269,0
+block_hint,StoreIC_NoFeedback,553,554,0
+block_hint,StoreIC_NoFeedback,460,461,0
+block_hint,StoreIC_NoFeedback,531,532,0
+block_hint,StoreIC_NoFeedback,90,91,1
+block_hint,StoreIC_NoFeedback,332,333,0
+block_hint,StoreIC_NoFeedback,420,421,1
+block_hint,StoreIC_NoFeedback,94,95,0
+block_hint,StoreIC_NoFeedback,96,97,0
+block_hint,StoreIC_NoFeedback,253,254,0
+block_hint,StoreIC_NoFeedback,255,256,1
+block_hint,StoreIC_NoFeedback,362,363,0
+block_hint,StoreIC_NoFeedback,40,41,1
+block_hint,StoreIC_NoFeedback,42,43,1
+block_hint,StoreIC_NoFeedback,141,142,0
+block_hint,StoreIC_NoFeedback,44,45,1
+block_hint,StoreIC_NoFeedback,143,144,0
+block_hint,StoreIC_NoFeedback,46,47,1
+block_hint,StoreIC_NoFeedback,100,101,0
+block_hint,StoreIC_NoFeedback,102,103,0
+block_hint,StoreIC_NoFeedback,48,49,1
+block_hint,StoreIC_NoFeedback,50,51,1
+block_hint,StoreIC_NoFeedback,439,440,0
+block_hint,StoreIC_NoFeedback,52,53,1
+block_hint,DefineNamedOwnIC_NoFeedback,80,81,1
+block_hint,DefineNamedOwnIC_NoFeedback,82,83,0
+block_hint,DefineNamedOwnIC_NoFeedback,236,237,0
+block_hint,DefineNamedOwnIC_NoFeedback,210,211,1
+block_hint,DefineNamedOwnIC_NoFeedback,136,137,0
+block_hint,DefineNamedOwnIC_NoFeedback,239,240,0
+block_hint,DefineNamedOwnIC_NoFeedback,212,213,0
+block_hint,DefineNamedOwnIC_NoFeedback,234,235,0
+block_hint,DefineNamedOwnIC_NoFeedback,157,158,1
+block_hint,DefineNamedOwnIC_NoFeedback,36,37,1
+block_hint,DefineNamedOwnIC_NoFeedback,86,87,0
+block_hint,DefineNamedOwnIC_NoFeedback,38,39,1
+block_hint,DefineNamedOwnIC_NoFeedback,40,41,1
+block_hint,KeyedLoadIC_SloppyArguments,12,13,0
+block_hint,KeyedLoadIC_SloppyArguments,14,15,1
+block_hint,KeyedLoadIC_SloppyArguments,4,5,1
+block_hint,KeyedLoadIC_SloppyArguments,22,23,0
+block_hint,KeyedLoadIC_SloppyArguments,6,7,1
+block_hint,KeyedLoadIC_SloppyArguments,16,17,0
+block_hint,KeyedLoadIC_SloppyArguments,18,19,0
+block_hint,KeyedLoadIC_SloppyArguments,8,9,1
+block_hint,KeyedLoadIC_SloppyArguments,10,11,0
+block_hint,StoreFastElementIC_Standard,340,341,0
+block_hint,StoreFastElementIC_Standard,826,827,0
+block_hint,StoreFastElementIC_Standard,346,347,0
+block_hint,StoreFastElementIC_Standard,966,967,1
+block_hint,StoreFastElementIC_Standard,348,349,1
+block_hint,StoreFastElementIC_Standard,40,41,1
+block_hint,StoreFastElementIC_Standard,350,351,0
+block_hint,StoreFastElementIC_Standard,828,829,0
+block_hint,StoreFastElementIC_Standard,356,357,0
+block_hint,StoreFastElementIC_Standard,968,969,1
+block_hint,StoreFastElementIC_Standard,358,359,1
+block_hint,StoreFastElementIC_Standard,42,43,1
+block_hint,StoreFastElementIC_Standard,360,361,0
+block_hint,StoreFastElementIC_Standard,830,831,0
+block_hint,StoreFastElementIC_Standard,970,971,1
+block_hint,StoreFastElementIC_Standard,366,367,1
+block_hint,StoreFastElementIC_Standard,44,45,1
+block_hint,StoreFastElementIC_Standard,392,393,0
+block_hint,StoreFastElementIC_Standard,838,839,0
+block_hint,StoreFastElementIC_Standard,978,979,1
+block_hint,StoreFastElementIC_Standard,398,399,1
+block_hint,StoreFastElementIC_Standard,52,53,1
+block_hint,StoreFastElementIC_Standard,844,845,0
+block_hint,StoreFastElementIC_Standard,420,421,1
+block_hint,StoreFastElementIC_Standard,985,986,1
+block_hint,StoreFastElementIC_Standard,422,423,1
+block_hint,StoreFastElementIC_Standard,58,59,1
+block_hint,StoreFastElementIC_Standard,848,849,0
+block_hint,StoreFastElementIC_Standard,428,429,1
+block_hint,StoreFastElementIC_Standard,988,989,1
+block_hint,StoreFastElementIC_Standard,430,431,1
+block_hint,StoreFastElementIC_Standard,60,61,1
+block_hint,StoreFastElementIC_Standard,600,601,0
+block_hint,StoreFastElementIC_Standard,1072,1073,0
+block_hint,StoreFastElementIC_Standard,669,670,0
+block_hint,StoreFastElementIC_Standard,300,301,1
+block_hint,StoreFastElementIC_Standard,596,597,0
+block_hint,StoreFastElementIC_Standard,1074,1075,0
+block_hint,StoreFastElementIC_Standard,671,672,0
+block_hint,StoreFastElementIC_Standard,302,303,1
+block_hint,StoreFastElementIC_Standard,592,593,0
+block_hint,StoreFastElementIC_Standard,1076,1077,0
+block_hint,StoreFastElementIC_Standard,673,674,0
+block_hint,StoreFastElementIC_Standard,304,305,1
+block_hint,StoreFastElementIC_Standard,588,589,0
+block_hint,StoreFastElementIC_Standard,1078,1079,0
+block_hint,StoreFastElementIC_Standard,675,676,0
+block_hint,StoreFastElementIC_Standard,306,307,1
+block_hint,StoreFastElementIC_Standard,584,585,0
+block_hint,StoreFastElementIC_Standard,931,932,1
+block_hint,StoreFastElementIC_Standard,770,771,0
+block_hint,StoreFastElementIC_Standard,308,309,1
+block_hint,StoreFastElementIC_Standard,580,581,0
+block_hint,StoreFastElementIC_Standard,929,930,1
+block_hint,StoreFastElementIC_Standard,772,773,0
+block_hint,StoreFastElementIC_Standard,310,311,1
+block_hint,StoreFastElementIC_Standard,576,577,0
+block_hint,StoreFastElementIC_Standard,927,928,1
+block_hint,StoreFastElementIC_Standard,774,775,0
+block_hint,StoreFastElementIC_Standard,312,313,1
+block_hint,StoreFastElementIC_Standard,572,573,0
+block_hint,StoreFastElementIC_Standard,776,777,0
+block_hint,StoreFastElementIC_Standard,314,315,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,469,470,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,263,264,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,647,648,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,472,473,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,563,564,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,435,436,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,214,215,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,541,542,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,198,199,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,204,205,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,629,630,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,437,438,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,34,35,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,474,475,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,277,278,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,653,654,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,283,284,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,567,568,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,439,440,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,219,220,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,537,538,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,182,183,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,184,185,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,631,632,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,441,442,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,36,37,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,479,480,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,659,660,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,295,296,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,571,572,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,443,444,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,224,225,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,533,534,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,166,167,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,633,634,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,445,446,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,38,39,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,492,493,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,665,666,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,331,332,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,581,582,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,453,454,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,238,239,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,523,524,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,126,127,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,637,638,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,455,456,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,46,47,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,501,502,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,359,360,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,669,670,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,365,366,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,590,591,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,461,462,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,249,250,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,251,252,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,603,604,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,102,103,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,517,518,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,463,464,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,56,57,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,508,509,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,371,372,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,673,674,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,377,378,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,96,97,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,100,101,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,467,468,1
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,58,59,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,335,336,0
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,185,186,0
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,393,394,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,187,188,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,22,23,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,339,340,0
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,397,398,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,205,206,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,207,208,0
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,160,161,0
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,375,376,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,130,131,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,134,135,0
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,26,27,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,355,356,0
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,265,266,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,412,413,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,267,268,1
+block_hint,StoreFastElementIC_NoTransitionHandleCOW,44,45,1
+block_hint,ElementsTransitionAndStore_Standard,433,434,1
+block_hint,ElementsTransitionAndStore_Standard,435,436,0
+block_hint,ElementsTransitionAndStore_Standard,543,544,1
+block_hint,ElementsTransitionAndStore_Standard,431,432,0
+block_hint,ElementsTransitionAndStore_Standard,187,188,0
+block_hint,ElementsTransitionAndStore_Standard,189,190,0
+block_hint,ElementsTransitionAndStore_Standard,334,335,0
+block_hint,ElementsTransitionAndStore_Standard,437,438,1
+block_hint,ElementsTransitionAndStore_Standard,195,196,1
+block_hint,ElementsTransitionAndStore_Standard,28,29,1
+block_hint,ElementsTransitionAndStore_Standard,481,482,1
+block_hint,ElementsTransitionAndStore_Standard,483,484,0
+block_hint,ElementsTransitionAndStore_Standard,477,478,1
+block_hint,ElementsTransitionAndStore_Standard,479,480,0
+block_hint,ElementsTransitionAndStore_Standard,245,246,0
+block_hint,ElementsTransitionAndStore_Standard,349,350,0
+block_hint,ElementsTransitionAndStore_Standard,485,486,1
+block_hint,ElementsTransitionAndStore_Standard,251,252,1
+block_hint,ElementsTransitionAndStore_Standard,38,39,1
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,739,740,0
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,1119,1120,1
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,742,743,1
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,896,897,0
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,684,685,0
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,324,325,0
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,830,831,1
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,237,238,0
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,241,242,1
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,1063,1064,1
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,686,687,0
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,62,63,1
+block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,95,96,0
+block_hint,KeyedHasIC_PolymorphicName,69,70,1
+block_hint,KeyedHasIC_PolymorphicName,28,29,1
+block_hint,KeyedHasIC_PolymorphicName,24,25,0
+block_hint,KeyedHasIC_PolymorphicName,26,27,0
+block_hint,KeyedHasIC_PolymorphicName,55,56,1
+block_hint,KeyedHasIC_PolymorphicName,89,90,0
+block_hint,KeyedHasIC_PolymorphicName,93,94,1
+block_hint,KeyedHasIC_PolymorphicName,30,31,0
+block_hint,KeyedHasIC_PolymorphicName,78,79,1
+block_hint,KeyedHasIC_PolymorphicName,14,15,1
+block_hint,KeyedHasIC_PolymorphicName,16,17,1
+block_hint,EnqueueMicrotask,4,5,1
+block_hint,EnqueueMicrotask,2,3,0
+block_hint,RunMicrotasks,18,19,1
+block_hint,RunMicrotasks,31,32,1
+block_hint,RunMicrotasks,65,66,0
+block_hint,RunMicrotasks,36,37,1
+block_hint,RunMicrotasks,85,86,0
+block_hint,RunMicrotasks,67,68,0
+block_hint,RunMicrotasks,38,39,1
+block_hint,HasProperty,137,138,1
+block_hint,HasProperty,139,140,1
+block_hint,HasProperty,261,262,0
+block_hint,HasProperty,211,212,1
+block_hint,HasProperty,254,255,0
+block_hint,HasProperty,97,98,0
+block_hint,HasProperty,234,235,1
+block_hint,HasProperty,123,124,1
+block_hint,HasProperty,141,142,1
+block_hint,HasProperty,199,200,0
+block_hint,HasProperty,201,202,0
+block_hint,HasProperty,101,102,0
+block_hint,HasProperty,99,100,0
+block_hint,HasProperty,250,251,0
+block_hint,HasProperty,268,269,0
+block_hint,HasProperty,257,258,1
+block_hint,HasProperty,106,107,0
+block_hint,HasProperty,275,276,0
+block_hint,HasProperty,280,281,0
+block_hint,HasProperty,266,267,0
+block_hint,HasProperty,203,204,1
+block_hint,HasProperty,42,43,1
+block_hint,HasProperty,65,66,0
+block_hint,HasProperty,44,45,1
+block_hint,HasProperty,239,240,1
+block_hint,HasProperty,48,49,0
+block_hint,HasProperty,270,271,0
+block_hint,HasProperty,228,229,0
+block_hint,HasProperty,38,39,0
+block_hint,DeleteProperty,38,39,1
+block_hint,DeleteProperty,62,63,0
+block_hint,DeleteProperty,40,41,0
+block_hint,DeleteProperty,66,67,1
+block_hint,DeleteProperty,80,81,0
+block_hint,DeleteProperty,73,74,0
+block_hint,DeleteProperty,64,65,1
+block_hint,DeleteProperty,56,57,1
+block_hint,DeleteProperty,42,43,1
+block_hint,DeleteProperty,83,84,0
+block_hint,DeleteProperty,85,86,0
+block_hint,DeleteProperty,77,78,0
+block_hint,DeleteProperty,75,76,0
+block_hint,DeleteProperty,47,48,0
+block_hint,DeleteProperty,49,50,0
+block_hint,DeleteProperty,87,88,0
+block_hint,DeleteProperty,71,72,1
+block_hint,DeleteProperty,20,21,0
+block_hint,DeleteProperty,54,55,0
+block_hint,DeleteProperty,7,8,1
+block_hint,DeleteProperty,9,10,1
+block_hint,DeleteProperty,11,12,1
+block_hint,DeleteProperty,13,14,1
+block_hint,DeleteProperty,15,16,1
+block_hint,SetDataProperties,136,137,1
+block_hint,SetDataProperties,263,264,1
+block_hint,SetDataProperties,261,262,1
+block_hint,SetDataProperties,144,145,0
+block_hint,SetDataProperties,316,317,0
+block_hint,SetDataProperties,146,147,0
+block_hint,SetDataProperties,59,60,0
+block_hint,SetDataProperties,341,342,0
+block_hint,SetDataProperties,267,268,0
+block_hint,SetDataProperties,385,386,1
+block_hint,SetDataProperties,277,278,0
+block_hint,SetDataProperties,752,753,0
+block_hint,SetDataProperties,762,763,1
+block_hint,SetDataProperties,750,751,0
+block_hint,SetDataProperties,748,749,0
+block_hint,SetDataProperties,659,660,0
+block_hint,SetDataProperties,451,452,1
+block_hint,SetDataProperties,221,222,1
+block_hint,SetDataProperties,87,88,1
+block_hint,SetDataProperties,223,224,0
+block_hint,SetDataProperties,513,514,0
+block_hint,SetDataProperties,515,516,0
+block_hint,SetDataProperties,519,520,1
+block_hint,SetDataProperties,449,450,0
+block_hint,SetDataProperties,329,330,1
+block_hint,SetDataProperties,326,327,0
+block_hint,SetDataProperties,158,159,0
+block_hint,SetDataProperties,399,400,0
+block_hint,SetDataProperties,447,448,0
+block_hint,SetDataProperties,352,353,0
+block_hint,SetDataProperties,226,227,1
+block_hint,SetDataProperties,93,94,1
+block_hint,SetDataProperties,521,522,0
+block_hint,SetDataProperties,95,96,0
+block_hint,SetDataProperties,97,98,0
+block_hint,SetDataProperties,617,618,0
+block_hint,SetDataProperties,523,524,1
+block_hint,SetDataProperties,525,526,0
+block_hint,SetDataProperties,527,528,1
+block_hint,SetDataProperties,529,530,0
+block_hint,SetDataProperties,673,674,0
+block_hint,SetDataProperties,531,532,1
+block_hint,SetDataProperties,577,578,0
+block_hint,SetDataProperties,675,676,0
+block_hint,SetDataProperties,620,621,1
+block_hint,SetDataProperties,539,540,1
+block_hint,SetDataProperties,541,542,0
+block_hint,SetDataProperties,543,544,0
+block_hint,SetDataProperties,545,546,1
+block_hint,SetDataProperties,535,536,0
+block_hint,SetDataProperties,657,658,0
+block_hint,SetDataProperties,555,556,1
+block_hint,SetDataProperties,292,293,1
+block_hint,SetDataProperties,99,100,0
+block_hint,SetDataProperties,437,438,0
+block_hint,SetDataProperties,241,242,0
+block_hint,SetDataProperties,279,280,1
+block_hint,SetDataProperties,204,205,0
+block_hint,SetDataProperties,61,62,0
+block_hint,ReturnReceiver,3,4,1
+block_hint,ArrayConstructorImpl,9,10,0
+block_hint,ArrayConstructorImpl,13,14,1
+block_hint,ArrayConstructorImpl,40,41,1
+block_hint,ArrayConstructorImpl,15,16,1
+block_hint,ArrayConstructorImpl,19,20,0
+block_hint,ArrayConstructorImpl,23,24,0
+block_hint,ArrayConstructorImpl,25,26,1
+block_hint,ArrayConstructorImpl,27,28,1
+block_hint,ArrayConstructorImpl,29,30,1
+block_hint,ArrayNoArgumentConstructor_PackedSmi_DontOverride,3,4,1
+block_hint,ArrayNoArgumentConstructor_PackedSmi_DontOverride,5,6,1
+block_hint,ArrayNoArgumentConstructor_HoleySmi_DontOverride,3,4,1
+block_hint,ArrayNoArgumentConstructor_HoleySmi_DontOverride,5,6,1
+block_hint,ArrayNoArgumentConstructor_Packed_DisableAllocationSites,3,4,1
+block_hint,ArrayNoArgumentConstructor_Packed_DisableAllocationSites,5,6,1
+block_hint,ArrayNoArgumentConstructor_Holey_DisableAllocationSites,3,4,1
+block_hint,ArrayNoArgumentConstructor_Holey_DisableAllocationSites,5,6,1
+block_hint,ArrayNoArgumentConstructor_PackedDouble_DisableAllocationSites,3,4,1
+block_hint,ArrayNoArgumentConstructor_PackedDouble_DisableAllocationSites,5,6,1
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DontOverride,5,6,1
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DontOverride,14,15,0
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DontOverride,16,17,0
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DontOverride,23,24,1
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DontOverride,8,9,0
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,5,6,1
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,14,15,0
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,16,17,0
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,21,22,1
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,23,24,1
+block_hint,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,8,9,0
+block_hint,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,5,6,1
+block_hint,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,14,15,0
+block_hint,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,25,26,1
+block_hint,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,23,24,1
+block_hint,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,12,13,1
+block_hint,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,8,9,0
+block_hint,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,10,11,0
+block_hint,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,5,6,1
+block_hint,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,14,15,0
+block_hint,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,16,17,0
+block_hint,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,25,26,1
+block_hint,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,23,24,1
+block_hint,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,12,13,1
+block_hint,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,8,9,0
+block_hint,ArrayIncludesSmi,120,121,0
+block_hint,ArrayIncludesSmi,43,44,1
+block_hint,ArrayIncludesSmi,108,109,1
+block_hint,ArrayIncludesSmi,75,76,1
+block_hint,ArrayIncludesSmi,122,123,0
+block_hint,ArrayIncludesSmiOrObject,113,114,1
+block_hint,ArrayIncludesSmiOrObject,38,39,0
+block_hint,ArrayIncludesSmiOrObject,107,108,0
+block_hint,ArrayIncludesSmiOrObject,28,29,1
+block_hint,ArrayIncludesSmiOrObject,84,85,1
+block_hint,ArrayIncludesSmiOrObject,86,87,1
+block_hint,ArrayIncludesSmiOrObject,117,118,0
+block_hint,ArrayIncludesSmiOrObject,131,132,1
+block_hint,ArrayIncludesSmiOrObject,125,126,0
+block_hint,ArrayIncludesSmiOrObject,98,99,0
+block_hint,ArrayIncludes,52,53,1
+block_hint,ArrayIncludes,49,50,0
+block_hint,ArrayIncludes,42,43,1
+block_hint,ArrayIncludes,44,45,1
+block_hint,ArrayIncludes,25,26,1
+block_hint,ArrayIncludes,17,18,1
+block_hint,ArrayIncludes,3,4,1
+block_hint,ArrayIncludes,47,48,1
+block_hint,ArrayIncludes,38,39,0
+block_hint,ArrayIncludes,27,28,1
+block_hint,ArrayIncludes,13,14,0
+block_hint,ArrayIncludes,19,20,1
+block_hint,ArrayIndexOfSmiOrObject,96,97,1
+block_hint,ArrayIndexOfSmiOrObject,88,89,0
+block_hint,ArrayIndexOfSmiOrObject,23,24,0
+block_hint,ArrayIndexOfSmiOrObject,37,38,0
+block_hint,ArrayIndexOfSmiOrObject,69,70,1
+block_hint,ArrayIndexOfSmiOrObject,43,44,0
+block_hint,ArrayIndexOfSmiOrObject,71,72,1
+block_hint,ArrayIndexOfSmiOrObject,110,111,1
+block_hint,ArrayIndexOfSmiOrObject,100,101,0
+block_hint,ArrayIndexOfSmiOrObject,77,78,0
+block_hint,ArrayIndexOfSmiOrObject,102,103,0
+block_hint,ArrayIndexOfSmiOrObject,79,80,0
+block_hint,ArrayIndexOfSmiOrObject,49,50,0
+block_hint,ArrayIndexOfSmiOrObject,29,30,0
+block_hint,ArrayIndexOfSmiOrObject,106,107,0
+block_hint,ArrayIndexOfSmiOrObject,83,84,0
+block_hint,ArrayIndexOfSmiOrObject,35,36,1
+block_hint,ArrayIndexOfSmiOrObject,94,95,1
+block_hint,ArrayIndexOfSmiOrObject,86,87,0
+block_hint,ArrayIndexOf,52,53,1
+block_hint,ArrayIndexOf,49,50,0
+block_hint,ArrayIndexOf,42,43,1
+block_hint,ArrayIndexOf,44,45,1
+block_hint,ArrayIndexOf,25,26,1
+block_hint,ArrayIndexOf,17,18,1
+block_hint,ArrayIndexOf,3,4,1
+block_hint,ArrayIndexOf,47,48,1
+block_hint,ArrayIndexOf,38,39,0
+block_hint,ArrayIndexOf,27,28,1
+block_hint,ArrayIndexOf,13,14,0
+block_hint,ArrayIndexOf,7,8,0
+block_hint,ArrayIndexOf,19,20,1
+block_hint,ArrayIndexOf,22,23,1
+block_hint,ArrayPrototypePop,49,50,1
+block_hint,ArrayPrototypePop,42,43,1
+block_hint,ArrayPrototypePop,47,48,1
+block_hint,ArrayPrototypePop,36,37,1
+block_hint,ArrayPrototypePop,26,27,1
+block_hint,ArrayPrototypePop,5,6,1
+block_hint,ArrayPrototypePop,45,46,1
+block_hint,ArrayPrototypePop,39,40,0
+block_hint,ArrayPrototypePop,20,21,1
+block_hint,ArrayPrototypePop,28,29,0
+block_hint,ArrayPrototypePop,7,8,1
+block_hint,ArrayPrototypePop,33,34,0
+block_hint,ArrayPrototypePop,16,17,1
+block_hint,ArrayPrototypePop,22,23,0
+block_hint,ArrayPrototypePop,30,31,1
+block_hint,ArrayPrototypePop,18,19,0
+block_hint,ArrayPrototypePop,14,15,1
+block_hint,ArrayPrototypePop,9,10,1
+block_hint,ArrayPrototypePop,11,12,0
+block_hint,ArrayPrototypePush,171,172,1
+block_hint,ArrayPrototypePush,151,152,1
+block_hint,ArrayPrototypePush,167,168,1
+block_hint,ArrayPrototypePush,136,137,1
+block_hint,ArrayPrototypePush,92,93,1
+block_hint,ArrayPrototypePush,17,18,1
+block_hint,ArrayPrototypePush,161,162,1
+block_hint,ArrayPrototypePush,140,141,0
+block_hint,ArrayPrototypePush,77,78,1
+block_hint,ArrayPrototypePush,79,80,1
+block_hint,ArrayPrototypePush,94,95,0
+block_hint,ArrayPrototypePush,19,20,1
+block_hint,ArrayPrototypePush,99,100,0
+block_hint,ArrayPrototypePush,116,117,0
+block_hint,ArrayPrototypePush,105,106,0
+block_hint,ArrayPrototypePush,68,69,0
+block_hint,ArrayPrototypePush,114,115,1
+block_hint,ArrayPrototypePush,28,29,0
+block_hint,ArrayPrototypePush,30,31,0
+block_hint,ArrayPrototypePush,34,35,0
+block_hint,ArrayPrototypePush,36,37,0
+block_hint,ArrayPrototypePush,96,97,0
+block_hint,ArrayPrototypePush,21,22,1
+block_hint,ArrayPrototypePush,38,39,1
+block_hint,ArrayPrototypePush,126,127,1
+block_hint,ArrayPrototypePush,128,129,0
+block_hint,ArrayPrototypePush,163,164,0
+block_hint,ArrayPrototypePush,165,166,0
+block_hint,ArrayPrototypePush,109,110,0
+block_hint,ArrayPrototypePush,72,73,0
+block_hint,ArrayPrototypePush,74,75,1
+block_hint,ArrayPrototypePush,142,143,0
+block_hint,ArrayPrototypePush,40,41,0
+block_hint,ArrayPrototypePush,118,119,0
+block_hint,ArrayPrototypePush,48,49,0
+block_hint,ArrayPrototypePush,158,159,1
+block_hint,ArrayPrototypePush,25,26,1
+block_hint,ArrayPrototypePush,50,51,1
+block_hint,ArrayPrototypePush,107,108,0
+block_hint,ArrayPrototypePush,70,71,0
+block_hint,ArrayPrototypePush,122,123,1
+block_hint,ArrayPrototypePush,52,53,0
+block_hint,ArrayPrototypePush,58,59,0
+block_hint,ArrayPrototypePush,60,61,0
+block_hint,ArrayPrototypePush,23,24,1
+block_hint,CloneFastJSArray,10,11,0
+block_hint,CloneFastJSArray,38,39,1
+block_hint,CloneFastJSArray,34,35,1
+block_hint,CloneFastJSArray,19,20,0
+block_hint,CloneFastJSArray,8,9,0
+block_hint,CloneFastJSArray,12,13,0
+block_hint,CloneFastJSArray,14,15,1
+block_hint,CloneFastJSArray,41,42,1
+block_hint,CloneFastJSArray,48,49,0
+block_hint,CloneFastJSArray,43,44,0
+block_hint,CloneFastJSArray,45,46,1
+block_hint,CloneFastJSArray,25,26,1
+block_hint,CloneFastJSArray,4,5,1
+block_hint,CloneFastJSArray,17,18,1
+block_hint,CloneFastJSArrayFillingHoles,76,77,0
+block_hint,CloneFastJSArrayFillingHoles,78,79,0
+block_hint,CloneFastJSArrayFillingHoles,91,92,0
+block_hint,CloneFastJSArrayFillingHoles,46,47,0
+block_hint,CloneFastJSArrayFillingHoles,95,96,1
+block_hint,CloneFastJSArrayFillingHoles,83,84,1
+block_hint,CloneFastJSArrayFillingHoles,16,17,0
+block_hint,CloneFastJSArrayFillingHoles,20,21,0
+block_hint,CloneFastJSArrayFillingHoles,85,86,0
+block_hint,CloneFastJSArrayFillingHoles,117,118,0
+block_hint,CloneFastJSArrayFillingHoles,80,81,1
+block_hint,CloneFastJSArrayFillingHoles,10,11,1
+block_hint,CloneFastJSArrayFillingHoles,55,56,1
+block_hint,ExtractFastJSArray,4,5,1
+block_hint,ExtractFastJSArray,27,28,0
+block_hint,ExtractFastJSArray,10,11,0
+block_hint,ExtractFastJSArray,42,43,1
+block_hint,ExtractFastJSArray,34,35,1
+block_hint,ExtractFastJSArray,20,21,0
+block_hint,ExtractFastJSArray,6,7,0
+block_hint,ExtractFastJSArray,12,13,0
+block_hint,ExtractFastJSArray,14,15,1
+block_hint,ExtractFastJSArray,36,37,1
+block_hint,ExtractFastJSArray,38,39,0
+block_hint,ExtractFastJSArray,16,17,1
+block_hint,ArrayPrototypeValues,14,15,1
+block_hint,ArrayPrototypeValues,11,12,1
+block_hint,ArrayPrototypeValues,8,9,1
+block_hint,ArrayPrototypeValues,3,4,1
+block_hint,ArrayPrototypeValues,6,7,1
+block_hint,ArrayIteratorPrototypeNext,140,141,1
+block_hint,ArrayIteratorPrototypeNext,88,89,1
+block_hint,ArrayIteratorPrototypeNext,90,91,1
+block_hint,ArrayIteratorPrototypeNext,196,197,0
+block_hint,ArrayIteratorPrototypeNext,255,256,0
+block_hint,ArrayIteratorPrototypeNext,224,225,0
+block_hint,ArrayIteratorPrototypeNext,206,207,0
+block_hint,ArrayIteratorPrototypeNext,164,165,0
+block_hint,ArrayIteratorPrototypeNext,118,119,1
+block_hint,ArrayIteratorPrototypeNext,268,269,0
+block_hint,ArrayIteratorPrototypeNext,248,249,0
+block_hint,ArrayIteratorPrototypeNext,159,160,0
+block_hint,ArrayIteratorPrototypeNext,109,110,1
+block_hint,ArrayIteratorPrototypeNext,6,7,1
+block_hint,ArrayIteratorPrototypeNext,8,9,1
+block_hint,ArrayIteratorPrototypeNext,142,143,0
+block_hint,ArrayIteratorPrototypeNext,124,125,1
+block_hint,ArrayIteratorPrototypeNext,60,61,1
+block_hint,ArrayIteratorPrototypeNext,80,81,1
+block_hint,AsyncFunctionEnter,41,42,1
+block_hint,AsyncFunctionEnter,28,29,0
+block_hint,AsyncFunctionEnter,13,14,0
+block_hint,AsyncFunctionEnter,33,34,1
+block_hint,AsyncFunctionEnter,26,27,1
+block_hint,AsyncFunctionEnter,9,10,0
+block_hint,AsyncFunctionEnter,3,4,1
+block_hint,AsyncFunctionEnter,36,37,1
+block_hint,AsyncFunctionEnter,22,23,0
+block_hint,AsyncFunctionEnter,5,6,1
+block_hint,AsyncFunctionEnter,24,25,1
+block_hint,AsyncFunctionEnter,7,8,0
+block_hint,AsyncFunctionResolve,2,3,0
+block_hint,AsyncFunctionAwaitCaught,24,25,1
+block_hint,AsyncFunctionAwaitCaught,19,20,1
+block_hint,AsyncFunctionAwaitCaught,2,3,1
+block_hint,AsyncFunctionAwaitCaught,30,31,1
+block_hint,AsyncFunctionAwaitCaught,32,33,0
+block_hint,AsyncFunctionAwaitCaught,28,29,1
+block_hint,AsyncFunctionAwaitCaught,8,9,1
+block_hint,AsyncFunctionAwaitCaught,10,11,1
+block_hint,AsyncFunctionAwaitCaught,12,13,1
+block_hint,AsyncFunctionAwaitCaught,14,15,1
+block_hint,AsyncFunctionAwaitCaught,22,23,0
+block_hint,AsyncFunctionAwaitUncaught,24,25,1
+block_hint,AsyncFunctionAwaitUncaught,19,20,1
+block_hint,AsyncFunctionAwaitUncaught,2,3,1
+block_hint,AsyncFunctionAwaitUncaught,30,31,1
+block_hint,AsyncFunctionAwaitUncaught,32,33,0
+block_hint,AsyncFunctionAwaitUncaught,28,29,1
+block_hint,AsyncFunctionAwaitUncaught,8,9,1
+block_hint,AsyncFunctionAwaitUncaught,10,11,1
+block_hint,AsyncFunctionAwaitUncaught,12,13,1
+block_hint,AsyncFunctionAwaitUncaught,14,15,1
+block_hint,AsyncFunctionAwaitUncaught,22,23,0
+block_hint,AsyncFunctionAwaitResolveClosure,8,9,1
+block_hint,AsyncFunctionAwaitResolveClosure,2,3,1
+block_hint,AsyncFunctionAwaitResolveClosure,6,7,0
+block_hint,DatePrototypeGetDate,10,11,1
+block_hint,DatePrototypeGetDate,7,8,1
+block_hint,DatePrototypeGetDate,5,6,1
+block_hint,DatePrototypeGetDate,2,3,1
+block_hint,DatePrototypeGetDay,10,11,1
+block_hint,DatePrototypeGetDay,7,8,1
+block_hint,DatePrototypeGetDay,5,6,1
+block_hint,DatePrototypeGetDay,2,3,1
+block_hint,DatePrototypeGetFullYear,10,11,1
+block_hint,DatePrototypeGetFullYear,7,8,1
+block_hint,DatePrototypeGetFullYear,5,6,1
+block_hint,DatePrototypeGetHours,10,11,1
+block_hint,DatePrototypeGetHours,7,8,1
+block_hint,DatePrototypeGetHours,5,6,1
+block_hint,DatePrototypeGetHours,2,3,1
+block_hint,DatePrototypeGetMinutes,10,11,1
+block_hint,DatePrototypeGetMinutes,7,8,1
+block_hint,DatePrototypeGetMinutes,5,6,1
+block_hint,DatePrototypeGetMinutes,2,3,1
+block_hint,DatePrototypeGetMonth,10,11,1
+block_hint,DatePrototypeGetMonth,7,8,1
+block_hint,DatePrototypeGetMonth,5,6,1
+block_hint,DatePrototypeGetMonth,2,3,1
+block_hint,DatePrototypeGetSeconds,10,11,1
+block_hint,DatePrototypeGetSeconds,7,8,1
+block_hint,DatePrototypeGetSeconds,5,6,1
+block_hint,DatePrototypeGetSeconds,2,3,1
+block_hint,DatePrototypeGetTime,8,9,1
+block_hint,DatePrototypeGetTime,5,6,1
+block_hint,DatePrototypeGetTime,2,3,1
+block_hint,CreateIterResultObject,4,5,1
+block_hint,CreateIterResultObject,11,12,1
+block_hint,CreateIterResultObject,6,7,0
+block_hint,CreateGeneratorObject,32,33,1
+block_hint,CreateGeneratorObject,34,35,1
+block_hint,CreateGeneratorObject,57,58,1
+block_hint,CreateGeneratorObject,54,55,0
+block_hint,CreateGeneratorObject,43,44,1
+block_hint,CreateGeneratorObject,24,25,0
+block_hint,CreateGeneratorObject,47,48,1
+block_hint,CreateGeneratorObject,40,41,1
+block_hint,CreateGeneratorObject,8,9,0
+block_hint,CreateGeneratorObject,51,52,1
+block_hint,CreateGeneratorObject,37,38,0
+block_hint,CreateGeneratorObject,12,13,0
+block_hint,GeneratorPrototypeNext,19,20,1
+block_hint,GeneratorPrototypeNext,11,12,1
+block_hint,GeneratorPrototypeNext,13,14,1
+block_hint,GeneratorPrototypeNext,5,6,0
+block_hint,GeneratorPrototypeNext,7,8,0
+block_hint,SuspendGeneratorBaseline,19,20,1
+block_hint,SuspendGeneratorBaseline,5,6,1
+block_hint,SuspendGeneratorBaseline,11,12,1
+block_hint,SuspendGeneratorBaseline,7,8,1
+block_hint,SuspendGeneratorBaseline,13,14,0
+block_hint,ResumeGeneratorBaseline,11,12,1
+block_hint,ResumeGeneratorBaseline,4,5,1
+block_hint,ResumeGeneratorBaseline,6,7,0
+block_hint,GlobalIsFinite,9,10,1
+block_hint,GlobalIsNaN,9,10,1
+block_hint,GlobalIsNaN,11,12,1
+block_hint,LoadIC,373,374,1
+block_hint,LoadIC,139,140,0
+block_hint,LoadIC,61,62,0
+block_hint,LoadIC,233,234,0
+block_hint,LoadIC,350,351,1
+block_hint,LoadIC,235,236,0
+block_hint,LoadIC,399,400,1
+block_hint,LoadIC,396,397,0
+block_hint,LoadIC,388,389,1
+block_hint,LoadIC,295,296,1
+block_hint,LoadIC,100,101,1
+block_hint,LoadIC,281,282,0
+block_hint,LoadIC,324,325,0
+block_hint,LoadIC,141,142,1
+block_hint,LoadIC,361,362,1
+block_hint,LoadIC,102,103,0
+block_hint,LoadIC,21,22,1
+block_hint,LoadIC,64,65,0
+block_hint,LoadIC,143,144,0
+block_hint,LoadIC,313,314,1
+block_hint,LoadIC,23,24,1
+block_hint,LoadIC,173,174,0
+block_hint,LoadIC,367,368,0
+block_hint,LoadIC,369,370,0
+block_hint,LoadIC,322,323,0
+block_hint,LoadIC,129,130,0
+block_hint,LoadIC,51,52,1
+block_hint,LoadIC,209,210,0
+block_hint,LoadIC,84,85,0
+block_hint,LoadIC,46,47,0
+block_hint,LoadIC,363,364,1
+block_hint,LoadIC,114,115,0
+block_hint,LoadIC,183,184,0
+block_hint,LoadIC,44,45,1
+block_hint,LoadIC,76,77,0
+block_hint,LoadIC,271,272,0
+block_hint,LoadIC,315,316,1
+block_hint,LoadIC,27,28,0
+block_hint,LoadIC,179,180,1
+block_hint,LoadIC,181,182,1
+block_hint,LoadIC,175,176,1
+block_hint,LoadIC,177,178,1
+block_hint,LoadIC,133,134,1
+block_hint,LoadIC,135,136,0
+block_hint,LoadIC_Megamorphic,367,368,1
+block_hint,LoadIC_Megamorphic,364,365,0
+block_hint,LoadIC_Megamorphic,356,357,1
+block_hint,LoadIC_Megamorphic,260,261,1
+block_hint,LoadIC_Megamorphic,262,263,1
+block_hint,LoadIC_Megamorphic,258,259,0
+block_hint,LoadIC_Megamorphic,58,59,0
+block_hint,LoadIC_Megamorphic,299,300,0
+block_hint,LoadIC_Megamorphic,130,131,1
+block_hint,LoadIC_Megamorphic,285,286,0
+block_hint,LoadIC_Megamorphic,331,332,1
+block_hint,LoadIC_Megamorphic,95,96,0
+block_hint,LoadIC_Megamorphic,132,133,0
+block_hint,LoadIC_Megamorphic,287,288,1
+block_hint,LoadIC_Megamorphic,22,23,1
+block_hint,LoadIC_Megamorphic,162,163,0
+block_hint,LoadIC_Megamorphic,292,293,0
+block_hint,LoadIC_Megamorphic,252,253,1
+block_hint,LoadIC_Megamorphic,337,338,0
+block_hint,LoadIC_Megamorphic,339,340,0
+block_hint,LoadIC_Megamorphic,296,297,0
+block_hint,LoadIC_Megamorphic,122,123,0
+block_hint,LoadIC_Megamorphic,50,51,1
+block_hint,LoadIC_Megamorphic,45,46,0
+block_hint,LoadIC_Megamorphic,248,249,0
+block_hint,LoadIC_Megamorphic,289,290,1
+block_hint,LoadIC_Megamorphic,26,27,0
+block_hint,LoadIC_Megamorphic,24,25,0
+block_hint,LoadIC_Megamorphic,164,165,1
+block_hint,LoadIC_Megamorphic,166,167,1
+block_hint,LoadIC_Megamorphic,126,127,1
+block_hint,LoadIC_Noninlined,376,377,1
+block_hint,LoadIC_Noninlined,132,133,0
+block_hint,LoadIC_Noninlined,384,385,1
+block_hint,LoadIC_Noninlined,381,382,0
+block_hint,LoadIC_Noninlined,371,372,1
+block_hint,LoadIC_Noninlined,270,271,0
+block_hint,LoadIC_Noninlined,58,59,0
+block_hint,LoadIC_Noninlined,313,314,0
+block_hint,LoadIC_Noninlined,142,143,1
+block_hint,LoadIC_Noninlined,297,298,0
+block_hint,LoadIC_Noninlined,22,23,1
+block_hint,LoadIC_Noninlined,174,175,0
+block_hint,LoadIC_Noninlined,39,40,1
+block_hint,LoadIC_Noninlined,260,261,0
+block_hint,LoadIC_Noninlined,301,302,1
+block_hint,LoadIC_Noninlined,26,27,0
+block_hint,LoadIC_Noninlined,24,25,0
+block_hint,LoadICTrampoline,3,4,1
+block_hint,LoadICTrampoline_Megamorphic,3,4,1
+block_hint,LoadSuperIC,533,534,0
+block_hint,LoadSuperIC,253,254,0
+block_hint,LoadSuperIC,569,570,1
+block_hint,LoadSuperIC,443,444,0
+block_hint,LoadSuperIC,77,78,0
+block_hint,LoadSuperIC,545,546,0
+block_hint,LoadSuperIC,255,256,1
+block_hint,LoadSuperIC,520,521,0
+block_hint,LoadSuperIC,43,44,1
+block_hint,LoadSuperIC,555,556,0
+block_hint,LoadSuperIC,287,288,0
+block_hint,LoadSuperIC,62,63,1
+block_hint,LoadSuperIC,432,433,0
+block_hint,LoadSuperIC,430,431,0
+block_hint,LoadSuperIC,524,525,1
+block_hint,LoadSuperIC,47,48,0
+block_hint,LoadSuperIC,681,682,0
+block_hint,KeyedLoadIC,636,637,1
+block_hint,KeyedLoadIC,258,259,0
+block_hint,KeyedLoadIC,250,251,0
+block_hint,KeyedLoadIC,384,385,0
+block_hint,KeyedLoadIC,501,502,1
+block_hint,KeyedLoadIC,650,651,0
+block_hint,KeyedLoadIC,630,631,0
+block_hint,KeyedLoadIC,585,586,1
+block_hint,KeyedLoadIC,390,391,1
+block_hint,KeyedLoadIC,388,389,1
+block_hint,KeyedLoadIC,669,670,0
+block_hint,KeyedLoadIC,671,672,0
+block_hint,KeyedLoadIC,634,635,0
+block_hint,KeyedLoadIC,587,588,1
+block_hint,KeyedLoadIC,152,153,1
+block_hint,KeyedLoadIC,628,629,0
+block_hint,KeyedLoadIC,482,483,0
+block_hint,KeyedLoadIC,106,107,1
+block_hint,KeyedLoadIC,685,686,0
+block_hint,KeyedLoadIC,687,688,0
+block_hint,KeyedLoadIC,642,643,1
+block_hint,KeyedLoadIC,294,295,1
+block_hint,KeyedLoadIC,296,297,0
+block_hint,KeyedLoadIC,681,682,1
+block_hint,KeyedLoadIC,528,529,1
+block_hint,KeyedLoadIC,626,627,0
+block_hint,KeyedLoadIC,615,616,0
+block_hint,KeyedLoadIC,565,566,1
+block_hint,KeyedLoadIC,316,317,1
+block_hint,KeyedLoadIC,68,69,0
+block_hint,KeyedLoadIC,306,307,0
+block_hint,KeyedLoadIC,532,533,1
+block_hint,KeyedLoadIC,308,309,1
+block_hint,KeyedLoadIC,222,223,0
+block_hint,KeyedLoadIC,178,179,0
+block_hint,KeyedLoadIC,567,568,0
+block_hint,KeyedLoadIC,457,458,1
+block_hint,KeyedLoadIC,118,119,0
+block_hint,KeyedLoadIC,120,121,0
+block_hint,KeyedLoadIC,405,406,1
+block_hint,KeyedLoadIC,618,619,1
+block_hint,KeyedLoadIC,246,247,1
+block_hint,KeyedLoadIC,569,570,0
+block_hint,KeyedLoadIC,519,520,0
+block_hint,KeyedLoadIC,443,444,1
+block_hint,KeyedLoadIC,690,691,0
+block_hint,KeyedLoadIC,122,123,1
+block_hint,KeyedLoadIC,322,323,0
+block_hint,KeyedLoadIC,324,325,1
+block_hint,KeyedLoadIC,70,71,0
+block_hint,KeyedLoadIC_Megamorphic,497,498,1
+block_hint,KeyedLoadIC_Megamorphic,499,500,0
+block_hint,KeyedLoadIC_Megamorphic,1245,1246,0
+block_hint,KeyedLoadIC_Megamorphic,1217,1218,1
+block_hint,KeyedLoadIC_Megamorphic,1169,1170,0
+block_hint,KeyedLoadIC_Megamorphic,1241,1242,1
+block_hint,KeyedLoadIC_Megamorphic,1247,1248,1
+block_hint,KeyedLoadIC_Megamorphic,1219,1220,1
+block_hint,KeyedLoadIC_Megamorphic,1243,1244,0
+block_hint,KeyedLoadIC_Megamorphic,1129,1130,0
+block_hint,KeyedLoadIC_Megamorphic,940,941,1
+block_hint,KeyedLoadIC_Megamorphic,938,939,1
+block_hint,KeyedLoadIC_Megamorphic,529,530,1
+block_hint,KeyedLoadIC_Megamorphic,1211,1212,0
+block_hint,KeyedLoadIC_Megamorphic,1213,1214,0
+block_hint,KeyedLoadIC_Megamorphic,1179,1180,0
+block_hint,KeyedLoadIC_Megamorphic,1177,1178,1
+block_hint,KeyedLoadIC_Megamorphic,1207,1208,0
+block_hint,KeyedLoadIC_Megamorphic,1173,1174,0
+block_hint,KeyedLoadIC_Megamorphic,942,943,1
+block_hint,KeyedLoadIC_Megamorphic,533,534,1
+block_hint,KeyedLoadIC_Megamorphic,952,953,0
+block_hint,KeyedLoadIC_Megamorphic,649,650,0
+block_hint,KeyedLoadIC_Megamorphic,1197,1198,0
+block_hint,KeyedLoadIC_Megamorphic,1103,1104,0
+block_hint,KeyedLoadIC_Megamorphic,1155,1156,0
+block_hint,KeyedLoadIC_Megamorphic,234,235,1
+block_hint,KeyedLoadIC_Megamorphic,1105,1106,0
+block_hint,KeyedLoadIC_Megamorphic,236,237,1
+block_hint,KeyedLoadIC_Megamorphic,1085,1086,0
+block_hint,KeyedLoadIC_Megamorphic,1231,1232,1
+block_hint,KeyedLoadIC_Megamorphic,1083,1084,0
+block_hint,KeyedLoadIC_Megamorphic,1081,1082,0
+block_hint,KeyedLoadIC_Megamorphic,991,992,1
+block_hint,KeyedLoadIC_Megamorphic,240,241,0
+block_hint,KeyedLoadIC_Megamorphic,126,127,1
+block_hint,KeyedLoadIC_Megamorphic,198,199,0
+block_hint,KeyedLoadIC_Megamorphic,653,654,0
+block_hint,KeyedLoadIC_Megamorphic,559,560,0
+block_hint,KeyedLoadIC_Megamorphic,1054,1055,0
+block_hint,KeyedLoadIC_Megamorphic,994,995,0
+block_hint,KeyedLoadIC_Megamorphic,657,658,1
+block_hint,KeyedLoadIC_Megamorphic,675,676,0
+block_hint,KeyedLoadIC_Megamorphic,1199,1200,0
+block_hint,KeyedLoadIC_Megamorphic,659,660,0
+block_hint,KeyedLoadIC_Megamorphic,1107,1108,0
+block_hint,KeyedLoadIC_Megamorphic,661,662,1
+block_hint,KeyedLoadIC_Megamorphic,251,252,1
+block_hint,KeyedLoadIC_Megamorphic,663,664,0
+block_hint,KeyedLoadIC_Megamorphic,253,254,1
+block_hint,KeyedLoadIC_Megamorphic,855,856,0
+block_hint,KeyedLoadIC_Megamorphic,998,999,1
+block_hint,KeyedLoadIC_Megamorphic,257,258,0
+block_hint,KeyedLoadIC_Megamorphic,665,666,0
+block_hint,KeyedLoadIC_Megamorphic,1091,1092,0
+block_hint,KeyedLoadIC_Megamorphic,1193,1194,0
+block_hint,KeyedLoadIC_Megamorphic,1233,1234,1
+block_hint,KeyedLoadIC_Megamorphic,1089,1090,0
+block_hint,KeyedLoadIC_Megamorphic,128,129,1
+block_hint,KeyedLoadIC_Megamorphic,206,207,0
+block_hint,KeyedLoadIC_Megamorphic,936,937,0
+block_hint,KeyedLoadIC_Megamorphic,684,685,0
+block_hint,KeyedLoadIC_Megamorphic,1201,1202,0
+block_hint,KeyedLoadIC_Megamorphic,1237,1238,0
+block_hint,KeyedLoadIC_Megamorphic,1159,1160,0
+block_hint,KeyedLoadIC_Megamorphic,857,858,1
+block_hint,KeyedLoadIC_Megamorphic,269,270,1
+block_hint,KeyedLoadIC_Megamorphic,1227,1228,0
+block_hint,KeyedLoadIC_Megamorphic,271,272,1
+block_hint,KeyedLoadIC_Megamorphic,1125,1126,0
+block_hint,KeyedLoadIC_Megamorphic,1239,1240,0
+block_hint,KeyedLoadIC_Megamorphic,1119,1120,1
+block_hint,KeyedLoadIC_Megamorphic,749,750,1
+block_hint,KeyedLoadIC_Megamorphic,1028,1029,1
+block_hint,KeyedLoadIC_Megamorphic,745,746,0
+block_hint,KeyedLoadIC_Megamorphic,117,118,0
+block_hint,KeyedLoadIC_Megamorphic,890,891,0
+block_hint,KeyedLoadIC_Megamorphic,339,340,1
+block_hint,KeyedLoadIC_Megamorphic,876,877,0
+block_hint,KeyedLoadIC_Megamorphic,81,82,1
+block_hint,KeyedLoadIC_Megamorphic,369,370,0
+block_hint,KeyedLoadIC_Megamorphic,737,738,0
+block_hint,KeyedLoadIC_Megamorphic,98,99,1
+block_hint,KeyedLoadIC_Megamorphic,1071,1072,0
+block_hint,KeyedLoadIC_Megamorphic,1225,1226,1
+block_hint,KeyedLoadIC_Megamorphic,1069,1070,0
+block_hint,KeyedLoadIC_Megamorphic,1137,1138,1
+block_hint,KeyedLoadIC_Megamorphic,1009,1010,1
+block_hint,KeyedLoadIC_Megamorphic,295,296,0
+block_hint,KeyedLoadIC_Megamorphic,120,121,1
+block_hint,KeyedLoadIC_Megamorphic,182,183,0
+block_hint,KeyedLoadIC_Megamorphic,971,972,0
+block_hint,KeyedLoadIC_Megamorphic,828,829,1
+block_hint,KeyedLoadIC_Megamorphic,186,187,1
+block_hint,KeyedLoadIC_Megamorphic,690,691,0
+block_hint,KeyedLoadIC_Megamorphic,525,526,0
+block_hint,KeyedLoadIC_Megamorphic,1042,1043,0
+block_hint,KeyedLoadIC_Megamorphic,1012,1013,0
+block_hint,KeyedLoadIC_Megamorphic,694,695,1
+block_hint,KeyedLoadIC_Megamorphic,869,870,1
+block_hint,KeyedLoadIC_Megamorphic,1203,1204,0
+block_hint,KeyedLoadIC_Megamorphic,308,309,1
+block_hint,KeyedLoadIC_Megamorphic,871,872,0
+block_hint,KeyedLoadIC_Megamorphic,1077,1078,0
+block_hint,KeyedLoadIC_Megamorphic,1229,1230,1
+block_hint,KeyedLoadIC_Megamorphic,1075,1076,0
+block_hint,KeyedLoadIC_Megamorphic,190,191,0
+block_hint,KeyedLoadIC_Megamorphic,960,961,0
+block_hint,KeyedLoadIC_Megamorphic,1166,1167,0
+block_hint,KeyedLoadIC_Megamorphic,918,919,1
+block_hint,KeyedLoadIC_Megamorphic,132,133,0
+block_hint,KeyedLoadIC_Megamorphic,727,728,0
+block_hint,KeyedLoadIC_Megamorphic,1037,1038,0
+block_hint,KeyedLoadIC_Megamorphic,563,564,1
+block_hint,KeyedLoadIC_Megamorphic,322,323,0
+block_hint,KeyedLoadIC_Megamorphic,723,724,0
+block_hint,KeyedLoadIC_Megamorphic,565,566,0
+block_hint,KeyedLoadIC_Megamorphic,134,135,1
+block_hint,KeyedLoadIC_Megamorphic,573,574,0
+block_hint,KeyedLoadIC_Megamorphic,922,923,1
+block_hint,KeyedLoadIC_Megamorphic,493,494,0
+block_hint,KeyedLoadIC_Megamorphic,958,959,0
+block_hint,KeyedLoadIC_Megamorphic,731,732,1
+block_hint,KeyedLoadIC_Megamorphic,581,582,0
+block_hint,KeyedLoadIC_Megamorphic,216,217,0
+block_hint,KeyedLoadIC_Megamorphic,491,492,1
+block_hint,KeyedLoadIC_Megamorphic,583,584,1
+block_hint,KeyedLoadIC_Megamorphic,150,151,1
+block_hint,KeyedLoadICTrampoline,3,4,1
+block_hint,KeyedLoadICTrampoline_Megamorphic,3,4,1
+block_hint,StoreGlobalIC,72,73,0
+block_hint,StoreGlobalIC,229,230,1
+block_hint,StoreGlobalIC,268,269,0
+block_hint,StoreGlobalIC,144,145,0
+block_hint,StoreGlobalIC,205,206,0
+block_hint,StoreGlobalIC,92,93,0
+block_hint,StoreGlobalIC,146,147,1
+block_hint,StoreGlobalIC,94,95,1
+block_hint,StoreGlobalIC,15,16,1
+block_hint,StoreGlobalICTrampoline,3,4,1
+block_hint,StoreIC,338,339,1
+block_hint,StoreIC,144,145,0
+block_hint,StoreIC,69,70,0
+block_hint,StoreIC,208,209,0
+block_hint,StoreIC,210,211,1
+block_hint,StoreIC,395,396,1
+block_hint,StoreIC,386,387,0
+block_hint,StoreIC,240,241,1
+block_hint,StoreIC,242,243,1
+block_hint,StoreIC,74,75,1
+block_hint,StoreIC,250,251,1
+block_hint,StoreIC,108,109,0
+block_hint,StoreIC,35,36,0
+block_hint,StoreIC,316,317,1
+block_hint,StoreIC,92,93,0
+block_hint,StoreIC,146,147,0
+block_hint,StoreIC,94,95,1
+block_hint,StoreIC,150,151,0
+block_hint,StoreIC,16,17,1
+block_hint,StoreIC,96,97,0
+block_hint,StoreIC,18,19,0
+block_hint,StoreIC,359,360,0
+block_hint,StoreIC,160,161,1
+block_hint,StoreIC,162,163,1
+block_hint,StoreIC,327,328,1
+block_hint,StoreIC,164,165,0
+block_hint,StoreIC,105,106,0
+block_hint,StoreIC,103,104,1
+block_hint,StoreIC,320,321,1
+block_hint,StoreIC,23,24,0
+block_hint,StoreIC,152,153,1
+block_hint,StoreIC,287,288,0
+block_hint,StoreIC,154,155,0
+block_hint,StoreIC,156,157,1
+block_hint,StoreIC,323,324,1
+block_hint,StoreIC,25,26,1
+block_hint,StoreIC,158,159,0
+block_hint,StoreIC,325,326,1
+block_hint,StoreIC,31,32,0
+block_hint,StoreIC,29,30,1
+block_hint,StoreIC,227,228,1
+block_hint,StoreIC,63,64,0
+block_hint,StoreIC,291,292,0
+block_hint,StoreIC,166,167,1
+block_hint,StoreIC,293,294,0
+block_hint,StoreIC,312,313,1
+block_hint,StoreIC,76,77,0
+block_hint,StoreIC,246,247,0
+block_hint,StoreIC,176,177,0
+block_hint,StoreIC,43,44,1
+block_hint,StoreIC,112,113,0
+block_hint,StoreIC,178,179,0
+block_hint,StoreIC,271,272,0
+block_hint,StoreIC,125,126,1
+block_hint,StoreIC,371,372,0
+block_hint,StoreIC,267,268,1
+block_hint,StoreIC,45,46,1
+block_hint,StoreIC,47,48,1
+block_hint,StoreIC,121,122,0
+block_hint,StoreIC,49,50,1
+block_hint,StoreIC,123,124,0
+block_hint,StoreIC,51,52,1
+block_hint,StoreIC,80,81,0
+block_hint,StoreIC,53,54,1
+block_hint,StoreIC,55,56,1
+block_hint,StoreIC,333,334,0
+block_hint,StoreIC,57,58,1
+block_hint,StoreIC,184,185,0
+block_hint,StoreIC,186,187,0
+block_hint,StoreIC,229,230,0
+block_hint,StoreIC,133,134,0
+block_hint,StoreIC,299,300,0
+block_hint,StoreIC,190,191,1
+block_hint,StoreIC,192,193,0
+block_hint,StoreIC,281,282,0
+block_hint,StoreIC,365,366,0
+block_hint,StoreIC,301,302,1
+block_hint,StoreIC,194,195,1
+block_hint,StoreIC,200,201,1
+block_hint,StoreIC,202,203,0
+block_hint,StoreIC,204,205,0
+block_hint,StoreIC,206,207,1
+block_hint,StoreIC,198,199,1
+block_hint,StoreIC,196,197,0
+block_hint,StoreIC,384,385,0
+block_hint,StoreIC,388,389,1
+block_hint,StoreIC,357,358,1
+block_hint,StoreIC,314,315,1
+block_hint,StoreIC,84,85,0
+block_hint,StoreIC,139,140,0
+block_hint,StoreIC,231,232,1
+block_hint,StoreICTrampoline,3,4,1
+block_hint,DefineNamedOwnIC,329,330,1
+block_hint,DefineNamedOwnIC,145,146,0
+block_hint,DefineNamedOwnIC,300,301,1
+block_hint,DefineNamedOwnIC,203,204,0
+block_hint,DefineNamedOwnIC,69,70,0
+block_hint,DefineNamedOwnIC,205,206,0
+block_hint,DefineNamedOwnIC,326,327,0
+block_hint,DefineNamedOwnIC,243,244,1
+block_hint,DefineNamedOwnIC,93,94,0
+block_hint,DefineNamedOwnIC,17,18,0
+block_hint,DefineNamedOwnIC,350,351,0
+block_hint,DefineNamedOwnIC,282,283,1
+block_hint,DefineNamedOwnIC,157,158,1
+block_hint,DefineNamedOwnIC,159,160,1
+block_hint,DefineNamedOwnIC,254,255,1
+block_hint,DefineNamedOwnIC,32,33,0
+block_hint,DefineNamedOwnIC,246,247,1
+block_hint,DefineNamedOwnIC,22,23,0
+block_hint,DefineNamedOwnIC,149,150,1
+block_hint,DefineNamedOwnIC,352,353,0
+block_hint,DefineNamedOwnIC,280,281,0
+block_hint,DefineNamedOwnIC,151,152,0
+block_hint,DefineNamedOwnIC,153,154,1
+block_hint,DefineNamedOwnIC,248,249,1
+block_hint,DefineNamedOwnIC,26,27,0
+block_hint,DefineNamedOwnIC,155,156,0
+block_hint,DefineNamedOwnIC,250,251,1
+block_hint,DefineNamedOwnIC,30,31,0
+block_hint,KeyedStoreIC,401,402,1
+block_hint,KeyedStoreIC,173,174,0
+block_hint,KeyedStoreIC,169,170,0
+block_hint,KeyedStoreIC,239,240,0
+block_hint,KeyedStoreIC,171,172,1
+block_hint,KeyedStoreIC,87,88,1
+block_hint,KeyedStoreIC,398,399,1
+block_hint,KeyedStoreIC,109,110,0
+block_hint,KeyedStoreIC,22,23,0
+block_hint,KeyedStoreIC,428,429,0
+block_hint,KeyedStoreIC,181,182,1
+block_hint,KeyedStoreIC,430,431,0
+block_hint,KeyedStoreIC,351,352,0
+block_hint,KeyedStoreIC,298,299,1
+block_hint,KeyedStoreIC,31,32,0
+block_hint,KeyedStoreIC,272,273,0
+block_hint,KeyedStoreIC,355,356,0
+block_hint,KeyedStoreIC,195,196,1
+block_hint,KeyedStoreIC,260,261,1
+block_hint,KeyedStoreIC,432,433,0
+block_hint,KeyedStoreIC,329,330,0
+block_hint,KeyedStoreIC,137,138,1
+block_hint,KeyedStoreIC,45,46,1
+block_hint,KeyedStoreIC,197,198,0
+block_hint,KeyedStoreIC,47,48,0
+block_hint,KeyedStoreIC,215,216,0
+block_hint,KeyedStoreIC,361,362,1
+block_hint,KeyedStoreIC,363,364,0
+block_hint,KeyedStoreIC,221,222,1
+block_hint,KeyedStoreIC,223,224,0
+block_hint,KeyedStoreIC,345,346,0
+block_hint,KeyedStoreIC,367,368,0
+block_hint,KeyedStoreIC,434,435,0
+block_hint,KeyedStoreIC,365,366,1
+block_hint,KeyedStoreIC,231,232,1
+block_hint,KeyedStoreIC,233,234,0
+block_hint,KeyedStoreIC,235,236,0
+block_hint,KeyedStoreIC,237,238,1
+block_hint,KeyedStoreIC,449,450,0
+block_hint,KeyedStoreIC,426,427,1
+block_hint,KeyedStoreIC,278,279,0
+block_hint,KeyedStoreIC,377,378,1
+block_hint,KeyedStoreIC,97,98,0
+block_hint,KeyedStoreIC,164,165,0
+block_hint,KeyedStoreICTrampoline,3,4,1
+block_hint,DefineKeyedOwnIC,392,393,1
+block_hint,DefineKeyedOwnIC,174,175,0
+block_hint,DefineKeyedOwnIC,170,171,1
+block_hint,StoreInArrayLiteralIC,30,31,1
+block_hint,StoreInArrayLiteralIC,19,20,0
+block_hint,StoreInArrayLiteralIC,23,24,0
+block_hint,StoreInArrayLiteralIC,14,15,1
+block_hint,StoreInArrayLiteralIC,16,17,1
+block_hint,StoreInArrayLiteralIC,8,9,1
+block_hint,StoreInArrayLiteralIC,4,5,1
+block_hint,LoadGlobalIC,62,63,0
+block_hint,LoadGlobalIC,16,17,1
+block_hint,LoadGlobalIC,18,19,1
+block_hint,LoadGlobalIC,20,21,1
+block_hint,LoadGlobalIC,194,195,0
+block_hint,LoadGlobalIC,14,15,0
+block_hint,LoadGlobalIC,111,112,1
+block_hint,LoadGlobalICInsideTypeof,62,63,0
+block_hint,LoadGlobalICInsideTypeof,196,197,1
+block_hint,LoadGlobalICInsideTypeof,14,15,0
+block_hint,LoadGlobalICInsideTypeof,111,112,0
+block_hint,LoadGlobalICInsideTypeof,22,23,1
+block_hint,LoadGlobalICInsideTypeof,24,25,1
+block_hint,LoadGlobalICInsideTypeof,257,258,1
+block_hint,LoadGlobalICInsideTypeof,211,212,0
+block_hint,LoadGlobalICInsideTypeof,60,61,0
+block_hint,LoadGlobalICInsideTypeof,225,226,0
+block_hint,LoadGlobalICInsideTypeof,113,114,1
+block_hint,LoadGlobalICInsideTypeof,26,27,1
+block_hint,LoadGlobalICInsideTypeof,234,235,1
+block_hint,LoadGlobalICInsideTypeof,202,203,0
+block_hint,LoadGlobalICInsideTypeof,45,46,0
+block_hint,LoadGlobalICInsideTypeof,43,44,1
+block_hint,LoadGlobalICTrampoline,3,4,1
+block_hint,LoadGlobalICInsideTypeofTrampoline,3,4,1
+block_hint,LookupGlobalICBaseline,3,4,1
+block_hint,LookupGlobalICBaseline,14,15,1
+block_hint,LookupGlobalICBaseline,5,6,1
+block_hint,LookupGlobalICBaseline,11,12,1
+block_hint,LookupGlobalICBaseline,7,8,1
+block_hint,LookupGlobalICBaseline,9,10,0
+block_hint,KeyedHasIC,261,262,1
+block_hint,KeyedHasIC,125,126,0
+block_hint,KeyedHasIC,117,118,0
+block_hint,KeyedHasIC,239,240,0
+block_hint,KeyedHasIC,165,166,0
+block_hint,KeyedHasIC,77,78,0
+block_hint,KeyedHasIC,119,120,1
+block_hint,KeyedHasIC,167,168,0
+block_hint,KeyedHasIC,123,124,1
+block_hint,KeyedHasIC,79,80,1
+block_hint,KeyedHasIC,197,198,0
+block_hint,KeyedHasIC,221,222,0
+block_hint,KeyedHasIC,281,282,0
+block_hint,KeyedHasIC,279,280,0
+block_hint,KeyedHasIC,161,162,1
+block_hint,KeyedHasIC,61,62,0
+block_hint,KeyedHasIC_Megamorphic,137,138,1
+block_hint,KeyedHasIC_Megamorphic,139,140,1
+block_hint,KeyedHasIC_Megamorphic,261,262,0
+block_hint,KeyedHasIC_Megamorphic,211,212,1
+block_hint,KeyedHasIC_Megamorphic,254,255,0
+block_hint,KeyedHasIC_Megamorphic,97,98,0
+block_hint,KeyedHasIC_Megamorphic,234,235,1
+block_hint,KeyedHasIC_Megamorphic,123,124,1
+block_hint,KeyedHasIC_Megamorphic,141,142,1
+block_hint,KeyedHasIC_Megamorphic,199,200,0
+block_hint,KeyedHasIC_Megamorphic,201,202,0
+block_hint,KeyedHasIC_Megamorphic,101,102,0
+block_hint,KeyedHasIC_Megamorphic,99,100,0
+block_hint,KeyedHasIC_Megamorphic,250,251,0
+block_hint,KeyedHasIC_Megamorphic,268,269,0
+block_hint,KeyedHasIC_Megamorphic,106,107,0
+block_hint,KeyedHasIC_Megamorphic,275,276,0
+block_hint,KeyedHasIC_Megamorphic,280,281,0
+block_hint,KeyedHasIC_Megamorphic,266,267,0
+block_hint,KeyedHasIC_Megamorphic,203,204,0
+block_hint,KeyedHasIC_Megamorphic,44,45,1
+block_hint,KeyedHasIC_Megamorphic,63,64,0
+block_hint,KeyedHasIC_Megamorphic,239,240,1
+block_hint,KeyedHasIC_Megamorphic,48,49,0
+block_hint,KeyedHasIC_Megamorphic,270,271,0
+block_hint,KeyedHasIC_Megamorphic,228,229,0
+block_hint,KeyedHasIC_Megamorphic,87,88,0
+block_hint,KeyedHasIC_Megamorphic,155,156,0
+block_hint,KeyedHasIC_Megamorphic,196,197,0
+block_hint,KeyedHasIC_Megamorphic,59,60,0
+block_hint,KeyedHasIC_Megamorphic,222,223,0
+block_hint,KeyedHasIC_Megamorphic,57,58,1
+block_hint,IterableToList,42,43,1
+block_hint,IterableToList,44,45,1
+block_hint,IterableToList,46,47,1
+block_hint,IterableToList,36,37,1
+block_hint,IterableToList,48,49,1
+block_hint,IterableToList,50,51,1
+block_hint,IterableToList,98,99,1
+block_hint,IterableToList,107,108,0
+block_hint,IterableToList,109,110,0
+block_hint,IterableToList,100,101,0
+block_hint,IterableToList,74,75,0
+block_hint,IterableToList,58,59,1
+block_hint,IterableToList,96,97,0
+block_hint,IterableToList,52,53,0
+block_hint,IterableToList,93,94,1
+block_hint,IterableToList,82,83,1
+block_hint,IterableToList,17,18,0
+block_hint,IterableToList,61,62,0
+block_hint,IterableToList,14,15,1
+block_hint,IterableToList,90,91,0
+block_hint,IterableToList,103,104,1
+block_hint,IterableToList,88,89,0
+block_hint,IterableToList,32,33,0
+block_hint,IterableToList,113,114,1
+block_hint,IterableToList,111,112,1
+block_hint,IterableToList,63,64,0
+block_hint,IterableToList,34,35,1
+block_hint,IterableToListWithSymbolLookup,39,40,0
+block_hint,IterableToListWithSymbolLookup,96,97,1
+block_hint,IterableToListWithSymbolLookup,94,95,0
+block_hint,IterableToListWithSymbolLookup,82,83,1
+block_hint,IterableToListWithSymbolLookup,55,56,1
+block_hint,IterableToListWithSymbolLookup,25,26,1
+block_hint,IterableToListWithSymbolLookup,2,3,1
+block_hint,IterableToListWithSymbolLookup,99,100,1
+block_hint,IterableToListWithSymbolLookup,92,93,0
+block_hint,IterableToListWithSymbolLookup,71,72,1
+block_hint,IterableToListWithSymbolLookup,78,79,0
+block_hint,IterableToListWithSymbolLookup,84,85,1
+block_hint,IterableToListWithSymbolLookup,57,58,1
+block_hint,IterableToListWithSymbolLookup,27,28,1
+block_hint,IterableToListWithSymbolLookup,4,5,1
+block_hint,IterableToListWithSymbolLookup,80,81,1
+block_hint,IterableToListWithSymbolLookup,62,63,0
+block_hint,IterableToListWithSymbolLookup,17,18,1
+block_hint,IterableToListMayPreserveHoles,8,9,1
+block_hint,IterableToListMayPreserveHoles,15,16,0
+block_hint,IterableToListMayPreserveHoles,20,21,1
+block_hint,IterableToListMayPreserveHoles,17,18,1
+block_hint,IterableToListMayPreserveHoles,11,12,1
+block_hint,IterableToListMayPreserveHoles,3,4,1
+block_hint,IterableToListMayPreserveHoles,13,14,1
+block_hint,IterableToListMayPreserveHoles,5,6,0
+block_hint,FindOrderedHashMapEntry,26,27,1
+block_hint,FindOrderedHashMapEntry,64,65,0
+block_hint,FindOrderedHashMapEntry,24,25,0
+block_hint,FindOrderedHashMapEntry,22,23,0
+block_hint,FindOrderedHashMapEntry,68,69,0
+block_hint,FindOrderedHashMapEntry,58,59,1
+block_hint,FindOrderedHashMapEntry,60,61,1
+block_hint,MapConstructor,328,329,1
+block_hint,MapConstructor,248,249,1
+block_hint,MapConstructor,105,106,0
+block_hint,MapConstructor,13,14,1
+block_hint,MapConstructor,270,271,1
+block_hint,MapConstructor,211,212,1
+block_hint,MapConstructor,86,87,0
+block_hint,MapConstructor,88,89,1
+block_hint,MapConstructor,272,273,1
+block_hint,MapConstructor,308,309,0
+block_hint,MapConstructor,319,320,0
+block_hint,MapConstructor,220,221,0
+block_hint,MapConstructor,109,110,0
+block_hint,MapConstructor,238,239,1
+block_hint,MapConstructor,103,104,1
+block_hint,MapPrototypeSet,98,99,1
+block_hint,MapPrototypeSet,62,63,1
+block_hint,MapPrototypeSet,64,65,1
+block_hint,MapPrototypeSet,88,89,1
+block_hint,MapPrototypeSet,90,91,0
+block_hint,MapPrototypeSet,26,27,1
+block_hint,MapPrototypeSet,94,95,0
+block_hint,MapPrototypeSet,56,57,0
+block_hint,MapPrototypeSet,24,25,0
+block_hint,MapPrototypeSet,22,23,0
+block_hint,MapPrototypeSet,31,32,1
+block_hint,MapPrototypeSet,66,67,0
+block_hint,MapPrototypeSet,47,48,0
+block_hint,MapPrototypeSet,49,50,1
+block_hint,MapPrototypeSet,51,52,1
+block_hint,MapPrototypeSet,53,54,0
+block_hint,MapPrototypeSet,17,18,1
+block_hint,MapPrototypeSet,29,30,1
+block_hint,MapPrototypeDelete,98,99,1
+block_hint,MapPrototypeDelete,77,78,1
+block_hint,MapPrototypeDelete,79,80,1
+block_hint,MapPrototypeDelete,15,16,0
+block_hint,MapPrototypeDelete,89,90,1
+block_hint,MapPrototypeDelete,63,64,0
+block_hint,MapPrototypeDelete,40,41,0
+block_hint,MapPrototypeDelete,65,66,1
+block_hint,MapPrototypeDelete,67,68,1
+block_hint,MapPrototypeDelete,19,20,1
+block_hint,MapPrototypeDelete,21,22,1
+block_hint,MapPrototypeDelete,23,24,1
+block_hint,MapPrototypeGet,12,13,1
+block_hint,MapPrototypeGet,7,8,1
+block_hint,MapPrototypeGet,9,10,1
+block_hint,MapPrototypeGet,3,4,1
+block_hint,MapPrototypeHas,10,11,1
+block_hint,MapPrototypeHas,5,6,1
+block_hint,MapPrototypeHas,7,8,1
+block_hint,MapPrototypeEntries,13,14,1
+block_hint,MapPrototypeEntries,8,9,1
+block_hint,MapPrototypeEntries,10,11,1
+block_hint,MapPrototypeEntries,4,5,1
+block_hint,MapPrototypeEntries,6,7,1
+block_hint,MapPrototypeGetSize,8,9,1
+block_hint,MapPrototypeGetSize,5,6,1
+block_hint,MapPrototypeGetSize,3,4,1
+block_hint,MapPrototypeForEach,33,34,1
+block_hint,MapPrototypeForEach,30,31,0
+block_hint,MapPrototypeForEach,27,28,1
+block_hint,MapPrototypeForEach,20,21,1
+block_hint,MapPrototypeForEach,22,23,1
+block_hint,MapPrototypeForEach,24,25,1
+block_hint,MapPrototypeForEach,12,13,1
+block_hint,MapPrototypeForEach,14,15,0
+block_hint,MapPrototypeValues,13,14,1
+block_hint,MapPrototypeValues,8,9,1
+block_hint,MapPrototypeValues,10,11,1
+block_hint,MapPrototypeValues,4,5,1
+block_hint,MapPrototypeValues,6,7,1
+block_hint,MapIteratorPrototypeNext,47,48,1
+block_hint,MapIteratorPrototypeNext,30,31,1
+block_hint,MapIteratorPrototypeNext,32,33,1
+block_hint,MapIteratorPrototypeNext,19,20,0
+block_hint,MapIteratorPrototypeNext,21,22,0
+block_hint,MapIteratorPrototypeNext,34,35,0
+block_hint,MapIteratorPrototypeNext,7,8,1
+block_hint,MapIteratorPrototypeNext,39,40,1
+block_hint,MapIteratorPrototypeNext,9,10,1
+block_hint,MapIteratorPrototypeNext,11,12,1
+block_hint,MapIteratorPrototypeNext,13,14,1
+block_hint,MapIteratorPrototypeNext,15,16,1
+block_hint,MapIteratorPrototypeNext,17,18,1
+block_hint,MapIteratorPrototypeNext,25,26,1
+block_hint,SameValueNumbersOnly,4,5,1
+block_hint,Add_Baseline,32,33,0
+block_hint,Add_Baseline,21,22,0
+block_hint,Add_Baseline,8,9,1
+block_hint,Add_Baseline,58,59,0
+block_hint,Add_Baseline,35,36,1
+block_hint,Add_Baseline,47,48,0
+block_hint,Add_Baseline,17,18,1
+block_hint,Add_Baseline,53,54,1
+block_hint,Add_Baseline,19,20,1
+block_hint,Add_Baseline,26,27,1
+block_hint,Add_Baseline,10,11,1
+block_hint,AddSmi_Baseline,32,33,0
+block_hint,AddSmi_Baseline,21,22,0
+block_hint,AddSmi_Baseline,8,9,1
+block_hint,AddSmi_Baseline,49,50,1
+block_hint,AddSmi_Baseline,26,27,1
+block_hint,AddSmi_Baseline,10,11,1
+block_hint,Subtract_Baseline,21,22,0
+block_hint,Subtract_Baseline,8,9,1
+block_hint,Subtract_Baseline,46,47,1
+block_hint,Subtract_Baseline,56,57,1
+block_hint,Subtract_Baseline,54,55,0
+block_hint,Subtract_Baseline,42,43,0
+block_hint,Subtract_Baseline,48,49,1
+block_hint,Subtract_Baseline,17,18,1
+block_hint,Subtract_Baseline,23,24,1
+block_hint,Subtract_Baseline,10,11,1
+block_hint,SubtractSmi_Baseline,21,22,0
+block_hint,SubtractSmi_Baseline,8,9,1
+block_hint,SubtractSmi_Baseline,38,39,1
+block_hint,SubtractSmi_Baseline,23,24,1
+block_hint,SubtractSmi_Baseline,10,11,1
+block_hint,Multiply_Baseline,69,70,0
+block_hint,Multiply_Baseline,47,48,0
+block_hint,Multiply_Baseline,55,56,0
+block_hint,Multiply_Baseline,61,62,1
+block_hint,Multiply_Baseline,57,58,1
+block_hint,Multiply_Baseline,10,11,1
+block_hint,Multiply_Baseline,49,50,1
+block_hint,Multiply_Baseline,67,68,1
+block_hint,Multiply_Baseline,51,52,1
+block_hint,Multiply_Baseline,24,25,1
+block_hint,Multiply_Baseline,12,13,1
+block_hint,MultiplySmi_Baseline,61,62,0
+block_hint,MultiplySmi_Baseline,47,48,0
+block_hint,MultiplySmi_Baseline,49,50,0
+block_hint,MultiplySmi_Baseline,51,52,1
+block_hint,MultiplySmi_Baseline,22,23,0
+block_hint,MultiplySmi_Baseline,10,11,1
+block_hint,MultiplySmi_Baseline,38,39,1
+block_hint,MultiplySmi_Baseline,24,25,1
+block_hint,MultiplySmi_Baseline,12,13,1
+block_hint,Divide_Baseline,59,60,0
+block_hint,Divide_Baseline,61,62,0
+block_hint,Divide_Baseline,48,49,0
+block_hint,Divide_Baseline,31,32,1
+block_hint,Divide_Baseline,10,11,1
+block_hint,Divide_Baseline,52,53,1
+block_hint,Divide_Baseline,67,68,1
+block_hint,Divide_Baseline,54,55,1
+block_hint,Divide_Baseline,38,39,0
+block_hint,Divide_Baseline,19,20,1
+block_hint,Divide_Baseline,25,26,1
+block_hint,Divide_Baseline,12,13,1
+block_hint,DivideSmi_Baseline,53,54,0
+block_hint,DivideSmi_Baseline,61,62,0
+block_hint,DivideSmi_Baseline,55,56,0
+block_hint,DivideSmi_Baseline,48,49,0
+block_hint,DivideSmi_Baseline,31,32,1
+block_hint,DivideSmi_Baseline,10,11,1
+block_hint,DivideSmi_Baseline,40,41,1
+block_hint,DivideSmi_Baseline,25,26,1
+block_hint,DivideSmi_Baseline,12,13,1
+block_hint,Modulus_Baseline,61,62,0
+block_hint,Modulus_Baseline,57,58,0
+block_hint,Modulus_Baseline,43,44,1
+block_hint,Modulus_Baseline,38,39,1
+block_hint,Modulus_Baseline,17,18,0
+block_hint,Modulus_Baseline,6,7,1
+block_hint,ModulusSmi_Baseline,43,44,1
+block_hint,ModulusSmi_Baseline,38,39,1
+block_hint,ModulusSmi_Baseline,17,18,0
+block_hint,ModulusSmi_Baseline,6,7,1
+block_hint,ModulusSmi_Baseline,32,33,1
+block_hint,ModulusSmi_Baseline,19,20,1
+block_hint,ModulusSmi_Baseline,8,9,1
+block_hint,BitwiseAnd_Baseline,35,36,0
+block_hint,BitwiseAnd_Baseline,23,24,1
+block_hint,BitwiseAnd_Baseline,8,9,0
+block_hint,BitwiseAnd_Baseline,33,34,0
+block_hint,BitwiseAnd_Baseline,27,28,1
+block_hint,BitwiseAnd_Baseline,12,13,0
+block_hint,BitwiseAnd_Baseline,50,51,1
+block_hint,BitwiseAnd_Baseline,14,15,1
+block_hint,BitwiseAndSmi_Baseline,18,19,0
+block_hint,BitwiseAndSmi_Baseline,16,17,1
+block_hint,BitwiseAndSmi_Baseline,7,8,0
+block_hint,BitwiseAndSmi_Baseline,26,27,0
+block_hint,BitwiseAndSmi_Baseline,20,21,0
+block_hint,BitwiseAndSmi_Baseline,9,10,1
+block_hint,BitwiseOr_Baseline,35,36,0
+block_hint,BitwiseOr_Baseline,23,24,1
+block_hint,BitwiseOr_Baseline,8,9,1
+block_hint,BitwiseOr_Baseline,48,49,1
+block_hint,BitwiseOr_Baseline,50,51,1
+block_hint,BitwiseOr_Baseline,14,15,1
+block_hint,BitwiseOrSmi_Baseline,5,6,0
+block_hint,BitwiseOrSmi_Baseline,18,19,0
+block_hint,BitwiseOrSmi_Baseline,16,17,0
+block_hint,BitwiseOrSmi_Baseline,28,29,1
+block_hint,BitwiseOrSmi_Baseline,9,10,1
+block_hint,BitwiseXor_Baseline,25,26,1
+block_hint,BitwiseXor_Baseline,35,36,0
+block_hint,BitwiseXor_Baseline,23,24,1
+block_hint,BitwiseXor_Baseline,48,49,1
+block_hint,BitwiseXor_Baseline,33,34,0
+block_hint,BitwiseXor_Baseline,27,28,1
+block_hint,BitwiseXor_Baseline,50,51,1
+block_hint,BitwiseXor_Baseline,14,15,1
+block_hint,BitwiseXorSmi_Baseline,18,19,0
+block_hint,BitwiseXorSmi_Baseline,16,17,1
+block_hint,BitwiseXorSmi_Baseline,7,8,1
+block_hint,BitwiseXorSmi_Baseline,9,10,1
+block_hint,ShiftLeft_Baseline,25,26,1
+block_hint,ShiftLeft_Baseline,10,11,0
+block_hint,ShiftLeft_Baseline,50,51,1
+block_hint,ShiftLeft_Baseline,14,15,1
+block_hint,ShiftLeftSmi_Baseline,35,36,1
+block_hint,ShiftLeftSmi_Baseline,25,26,1
+block_hint,ShiftLeftSmi_Baseline,37,38,1
+block_hint,ShiftLeftSmi_Baseline,9,10,1
+block_hint,ShiftRight_Baseline,6,7,0
+block_hint,ShiftRight_Baseline,10,11,0
+block_hint,ShiftRight_Baseline,46,47,0
+block_hint,ShiftRight_Baseline,29,30,0
+block_hint,ShiftRight_Baseline,14,15,1
+block_hint,ShiftRightSmi_Baseline,5,6,0
+block_hint,ShiftRightSmi_Baseline,22,23,1
+block_hint,ShiftRightSmi_Baseline,26,27,0
+block_hint,ShiftRightSmi_Baseline,20,21,0
+block_hint,ShiftRightSmi_Baseline,9,10,1
+block_hint,ShiftRightLogical_Baseline,25,26,1
+block_hint,ShiftRightLogical_Baseline,10,11,0
+block_hint,ShiftRightLogical_Baseline,46,47,0
+block_hint,ShiftRightLogical_Baseline,29,30,0
+block_hint,ShiftRightLogical_Baseline,14,15,1
+block_hint,ShiftRightLogicalSmi_Baseline,35,36,1
+block_hint,ShiftRightLogicalSmi_Baseline,25,26,1
+block_hint,ShiftRightLogicalSmi_Baseline,33,34,0
+block_hint,ShiftRightLogicalSmi_Baseline,23,24,0
+block_hint,ShiftRightLogicalSmi_Baseline,9,10,1
+block_hint,Add_WithFeedback,49,50,1
+block_hint,Add_WithFeedback,60,61,0
+block_hint,Add_WithFeedback,58,59,0
+block_hint,Add_WithFeedback,45,46,1
+block_hint,Add_WithFeedback,35,36,1
+block_hint,Add_WithFeedback,28,29,0
+block_hint,Add_WithFeedback,19,20,1
+block_hint,Subtract_WithFeedback,52,53,1
+block_hint,Subtract_WithFeedback,56,57,0
+block_hint,Subtract_WithFeedback,54,55,0
+block_hint,Subtract_WithFeedback,42,43,0
+block_hint,Subtract_WithFeedback,17,18,1
+block_hint,Modulus_WithFeedback,61,62,0
+block_hint,Modulus_WithFeedback,57,58,0
+block_hint,Modulus_WithFeedback,43,44,1
+block_hint,Modulus_WithFeedback,38,39,1
+block_hint,Modulus_WithFeedback,17,18,0
+block_hint,Modulus_WithFeedback,6,7,1
+block_hint,BitwiseOr_WithFeedback,6,7,1
+block_hint,BitwiseOr_WithFeedback,35,36,0
+block_hint,BitwiseOr_WithFeedback,23,24,0
+block_hint,BitwiseOr_WithFeedback,10,11,0
+block_hint,BitwiseOr_WithFeedback,46,47,0
+block_hint,BitwiseOr_WithFeedback,29,30,0
+block_hint,BitwiseOr_WithFeedback,14,15,1
+block_hint,Equal_Baseline,48,49,0
+block_hint,Equal_Baseline,18,19,1
+block_hint,Equal_Baseline,101,102,0
+block_hint,Equal_Baseline,14,15,1
+block_hint,Equal_Baseline,39,40,0
+block_hint,Equal_Baseline,26,27,0
+block_hint,Equal_Baseline,28,29,1
+block_hint,Equal_Baseline,45,46,0
+block_hint,Equal_Baseline,32,33,0
+block_hint,Equal_Baseline,24,25,1
+block_hint,Equal_Baseline,77,78,0
+block_hint,Equal_Baseline,75,76,0
+block_hint,Equal_Baseline,83,84,0
+block_hint,Equal_Baseline,85,86,0
+block_hint,Equal_Baseline,59,60,0
+block_hint,Equal_Baseline,109,110,0
+block_hint,Equal_Baseline,65,66,0
+block_hint,Equal_Baseline,69,70,1
+block_hint,Equal_Baseline,98,99,0
+block_hint,Equal_Baseline,71,72,1
+block_hint,Equal_Baseline,6,7,1
+block_hint,StrictEqual_Baseline,37,38,0
+block_hint,StrictEqual_Baseline,76,77,0
+block_hint,StrictEqual_Baseline,47,48,1
+block_hint,StrictEqual_Baseline,60,61,0
+block_hint,StrictEqual_Baseline,51,52,0
+block_hint,StrictEqual_Baseline,53,54,1
+block_hint,StrictEqual_Baseline,35,36,1
+block_hint,StrictEqual_Baseline,33,34,0
+block_hint,StrictEqual_Baseline,55,56,0
+block_hint,StrictEqual_Baseline,29,30,1
+block_hint,StrictEqual_Baseline,31,32,1
+block_hint,StrictEqual_Baseline,49,50,1
+block_hint,StrictEqual_Baseline,41,42,0
+block_hint,StrictEqual_Baseline,45,46,0
+block_hint,StrictEqual_Baseline,66,67,0
+block_hint,StrictEqual_Baseline,13,14,0
+block_hint,StrictEqual_Baseline,43,44,0
+block_hint,StrictEqual_Baseline,3,4,1
+block_hint,LessThan_Baseline,44,45,0
+block_hint,LessThan_Baseline,23,24,1
+block_hint,LessThan_Baseline,25,26,1
+block_hint,LessThan_Baseline,10,11,0
+block_hint,LessThan_Baseline,56,57,0
+block_hint,LessThan_Baseline,12,13,0
+block_hint,LessThan_Baseline,5,6,1
+block_hint,GreaterThan_Baseline,44,45,0
+block_hint,GreaterThan_Baseline,10,11,0
+block_hint,GreaterThan_Baseline,48,49,1
+block_hint,GreaterThan_Baseline,12,13,0
+block_hint,GreaterThan_Baseline,5,6,1
+block_hint,LessThanOrEqual_Baseline,44,45,0
+block_hint,LessThanOrEqual_Baseline,23,24,1
+block_hint,LessThanOrEqual_Baseline,25,26,1
+block_hint,LessThanOrEqual_Baseline,56,57,0
+block_hint,LessThanOrEqual_Baseline,58,59,1
+block_hint,LessThanOrEqual_Baseline,37,38,1
+block_hint,LessThanOrEqual_Baseline,27,28,1
+block_hint,LessThanOrEqual_Baseline,5,6,1
+block_hint,GreaterThanOrEqual_Baseline,44,45,0
+block_hint,GreaterThanOrEqual_Baseline,23,24,1
+block_hint,GreaterThanOrEqual_Baseline,25,26,1
+block_hint,GreaterThanOrEqual_Baseline,56,57,0
+block_hint,GreaterThanOrEqual_Baseline,27,28,1
+block_hint,GreaterThanOrEqual_Baseline,5,6,1
+block_hint,Equal_WithFeedback,103,104,0
+block_hint,Equal_WithFeedback,81,82,1
+block_hint,Equal_WithFeedback,37,38,0
+block_hint,Equal_WithFeedback,48,49,0
+block_hint,Equal_WithFeedback,18,19,1
+block_hint,Equal_WithFeedback,8,9,0
+block_hint,Equal_WithFeedback,95,96,0
+block_hint,Equal_WithFeedback,101,102,0
+block_hint,Equal_WithFeedback,20,21,0
+block_hint,Equal_WithFeedback,39,40,0
+block_hint,Equal_WithFeedback,26,27,0
+block_hint,Equal_WithFeedback,28,29,1
+block_hint,Equal_WithFeedback,45,46,0
+block_hint,Equal_WithFeedback,32,33,0
+block_hint,Equal_WithFeedback,75,76,0
+block_hint,Equal_WithFeedback,83,84,0
+block_hint,Equal_WithFeedback,85,86,0
+block_hint,Equal_WithFeedback,87,88,0
+block_hint,Equal_WithFeedback,79,80,0
+block_hint,Equal_WithFeedback,89,90,0
+block_hint,Equal_WithFeedback,117,118,0
+block_hint,Equal_WithFeedback,109,110,0
+block_hint,Equal_WithFeedback,107,108,0
+block_hint,Equal_WithFeedback,67,68,0
+block_hint,Equal_WithFeedback,105,106,0
+block_hint,Equal_WithFeedback,65,66,0
+block_hint,Equal_WithFeedback,6,7,1
+block_hint,StrictEqual_WithFeedback,37,38,0
+block_hint,StrictEqual_WithFeedback,72,73,0
+block_hint,StrictEqual_WithFeedback,47,48,1
+block_hint,StrictEqual_WithFeedback,60,61,0
+block_hint,StrictEqual_WithFeedback,53,54,1
+block_hint,StrictEqual_WithFeedback,35,36,1
+block_hint,StrictEqual_WithFeedback,57,58,1
+block_hint,StrictEqual_WithFeedback,55,56,0
+block_hint,StrictEqual_WithFeedback,31,32,1
+block_hint,StrictEqual_WithFeedback,41,42,0
+block_hint,StrictEqual_WithFeedback,70,71,1
+block_hint,StrictEqual_WithFeedback,45,46,0
+block_hint,StrictEqual_WithFeedback,21,22,1
+block_hint,StrictEqual_WithFeedback,66,67,0
+block_hint,StrictEqual_WithFeedback,15,16,0
+block_hint,StrictEqual_WithFeedback,13,14,0
+block_hint,StrictEqual_WithFeedback,43,44,0
+block_hint,StrictEqual_WithFeedback,3,4,1
+block_hint,LessThan_WithFeedback,44,45,1
+block_hint,LessThan_WithFeedback,23,24,1
+block_hint,LessThan_WithFeedback,46,47,1
+block_hint,LessThan_WithFeedback,48,49,1
+block_hint,LessThan_WithFeedback,56,57,0
+block_hint,LessThan_WithFeedback,54,55,0
+block_hint,LessThan_WithFeedback,18,19,1
+block_hint,LessThan_WithFeedback,31,32,0
+block_hint,LessThan_WithFeedback,16,17,1
+block_hint,LessThan_WithFeedback,12,13,0
+block_hint,LessThan_WithFeedback,39,40,1
+block_hint,LessThan_WithFeedback,5,6,1
+block_hint,GreaterThan_WithFeedback,60,61,1
+block_hint,GreaterThan_WithFeedback,23,24,1
+block_hint,GreaterThan_WithFeedback,25,26,1
+block_hint,GreaterThan_WithFeedback,48,49,1
+block_hint,GreaterThan_WithFeedback,56,57,0
+block_hint,GreaterThan_WithFeedback,58,59,0
+block_hint,GreaterThan_WithFeedback,54,55,1
+block_hint,GreaterThan_WithFeedback,50,51,1
+block_hint,GreaterThan_WithFeedback,18,19,0
+block_hint,GreaterThan_WithFeedback,12,13,0
+block_hint,GreaterThan_WithFeedback,5,6,1
+block_hint,GreaterThanOrEqual_WithFeedback,60,61,1
+block_hint,GreaterThanOrEqual_WithFeedback,46,47,1
+block_hint,GreaterThanOrEqual_WithFeedback,48,49,0
+block_hint,GreaterThanOrEqual_WithFeedback,56,57,0
+block_hint,GreaterThanOrEqual_WithFeedback,54,55,0
+block_hint,GreaterThanOrEqual_WithFeedback,18,19,1
+block_hint,GreaterThanOrEqual_WithFeedback,31,32,0
+block_hint,GreaterThanOrEqual_WithFeedback,16,17,1
+block_hint,GreaterThanOrEqual_WithFeedback,5,6,1
+block_hint,BitwiseNot_Baseline,19,20,0
+block_hint,BitwiseNot_Baseline,15,16,1
+block_hint,BitwiseNot_Baseline,7,8,1
+block_hint,BitwiseNot_Baseline,27,28,1
+block_hint,BitwiseNot_Baseline,9,10,1
+block_hint,Decrement_Baseline,19,20,0
+block_hint,Decrement_Baseline,17,18,1
+block_hint,Decrement_Baseline,13,14,0
+block_hint,Decrement_Baseline,15,16,1
+block_hint,Decrement_Baseline,5,6,1
+block_hint,Increment_Baseline,19,20,0
+block_hint,Increment_Baseline,17,18,1
+block_hint,Increment_Baseline,13,14,0
+block_hint,Increment_Baseline,15,16,1
+block_hint,Increment_Baseline,5,6,1
+block_hint,Negate_Baseline,20,21,1
+block_hint,Negate_Baseline,14,15,0
+block_hint,Negate_Baseline,18,19,1
+block_hint,Negate_Baseline,5,6,1
+block_hint,ObjectAssign,21,22,1
+block_hint,ObjectAssign,18,19,0
+block_hint,ObjectAssign,15,16,1
+block_hint,ObjectAssign,12,13,1
+block_hint,ObjectAssign,9,10,0
+block_hint,ObjectAssign,5,6,0
+block_hint,ObjectCreate,78,79,1
+block_hint,ObjectCreate,75,76,0
+block_hint,ObjectCreate,33,34,1
+block_hint,ObjectCreate,35,36,1
+block_hint,ObjectCreate,37,38,1
+block_hint,ObjectCreate,39,40,0
+block_hint,ObjectCreate,41,42,1
+block_hint,ObjectCreate,43,44,0
+block_hint,ObjectCreate,45,46,1
+block_hint,ObjectCreate,17,18,1
+block_hint,ObjectCreate,69,70,0
+block_hint,ObjectCreate,55,56,0
+block_hint,ObjectCreate,59,60,1
+block_hint,ObjectCreate,47,48,0
+block_hint,ObjectCreate,49,50,0
+block_hint,ObjectCreate,5,6,1
+block_hint,ObjectCreate,52,53,1
+block_hint,ObjectCreate,7,8,1
+block_hint,ObjectCreate,9,10,1
+block_hint,ObjectCreate,11,12,1
+block_hint,ObjectCreate,13,14,1
+block_hint,ObjectCreate,15,16,1
+block_hint,ObjectCreate,20,21,0
+block_hint,ObjectCreate,61,62,1
+block_hint,ObjectGetOwnPropertyDescriptor,517,518,1
+block_hint,ObjectGetOwnPropertyDescriptor,514,515,0
+block_hint,ObjectGetOwnPropertyDescriptor,511,512,0
+block_hint,ObjectGetOwnPropertyDescriptor,503,504,1
+block_hint,ObjectGetOwnPropertyDescriptor,490,491,1
+block_hint,ObjectGetOwnPropertyDescriptor,408,409,0
+block_hint,ObjectGetOwnPropertyDescriptor,470,471,1
+block_hint,ObjectGetOwnPropertyDescriptor,488,489,0
+block_hint,ObjectGetOwnPropertyDescriptor,434,435,0
+block_hint,ObjectGetOwnPropertyDescriptor,467,468,1
+block_hint,ObjectGetOwnPropertyDescriptor,410,411,1
+block_hint,ObjectGetOwnPropertyDescriptor,462,463,0
+block_hint,ObjectGetOwnPropertyDescriptor,464,465,0
+block_hint,ObjectGetOwnPropertyDescriptor,436,437,0
+block_hint,ObjectGetOwnPropertyDescriptor,406,407,0
+block_hint,ObjectGetOwnPropertyDescriptor,331,332,0
+block_hint,ObjectGetOwnPropertyDescriptor,197,198,1
+block_hint,ObjectGetOwnPropertyDescriptor,307,308,1
+block_hint,ObjectGetOwnPropertyDescriptor,138,139,1
+block_hint,ObjectGetOwnPropertyDescriptor,497,498,0
+block_hint,ObjectGetOwnPropertyDescriptor,505,506,1
+block_hint,ObjectGetOwnPropertyDescriptor,493,494,0
+block_hint,ObjectGetOwnPropertyDescriptor,426,427,0
+block_hint,ObjectGetOwnPropertyDescriptor,329,330,0
+block_hint,ObjectGetOwnPropertyDescriptor,31,32,1
+block_hint,ObjectGetOwnPropertyDescriptor,361,362,1
+block_hint,ObjectGetOwnPropertyDescriptor,150,151,0
+block_hint,ObjectGetOwnPropertyDescriptor,474,475,0
+block_hint,ObjectGetOwnPropertyDescriptor,390,391,0
+block_hint,ObjectGetOwnPropertyDescriptor,264,265,0
+block_hint,ObjectGetOwnPropertyDescriptor,260,261,0
+block_hint,ObjectGetOwnPropertyDescriptor,282,283,0
+block_hint,ObjectGetOwnPropertyDescriptor,284,285,1
+block_hint,ObjectGetOwnPropertyDescriptor,36,37,1
+block_hint,ObjectGetOwnPropertyDescriptor,365,366,1
+block_hint,ObjectGetOwnPropertyDescriptor,186,187,0
+block_hint,ObjectGetOwnPropertyDescriptor,268,269,1
+block_hint,ObjectKeys,32,33,1
+block_hint,ObjectKeys,27,28,1
+block_hint,ObjectKeys,23,24,1
+block_hint,ObjectKeys,25,26,0
+block_hint,ObjectKeys,17,18,1
+block_hint,ObjectKeys,5,6,1
+block_hint,ObjectKeys,21,22,1
+block_hint,ObjectKeys,9,10,0
+block_hint,ObjectKeys,7,8,1
+block_hint,ObjectKeys,14,15,1
+block_hint,ObjectPrototypeHasOwnProperty,230,231,1
+block_hint,ObjectPrototypeHasOwnProperty,205,206,1
+block_hint,ObjectPrototypeHasOwnProperty,222,223,1
+block_hint,ObjectPrototypeHasOwnProperty,239,240,0
+block_hint,ObjectPrototypeHasOwnProperty,219,220,0
+block_hint,ObjectPrototypeHasOwnProperty,209,210,1
+block_hint,ObjectPrototypeHasOwnProperty,163,164,1
+block_hint,ObjectPrototypeHasOwnProperty,235,236,0
+block_hint,ObjectPrototypeHasOwnProperty,237,238,0
+block_hint,ObjectPrototypeHasOwnProperty,233,234,0
+block_hint,ObjectPrototypeHasOwnProperty,228,229,0
+block_hint,ObjectPrototypeHasOwnProperty,192,193,1
+block_hint,ObjectPrototypeHasOwnProperty,137,138,0
+block_hint,ObjectPrototypeHasOwnProperty,211,212,0
+block_hint,ObjectPrototypeHasOwnProperty,175,176,1
+block_hint,ObjectPrototypeHasOwnProperty,141,142,0
+block_hint,ObjectPrototypeHasOwnProperty,226,227,0
+block_hint,ObjectPrototypeHasOwnProperty,76,77,0
+block_hint,ObjectPrototypeHasOwnProperty,203,204,0
+block_hint,ObjectPrototypeHasOwnProperty,34,35,1
+block_hint,ObjectPrototypeHasOwnProperty,52,53,0
+block_hint,ObjectPrototypeHasOwnProperty,36,37,1
+block_hint,ObjectPrototypeHasOwnProperty,197,198,1
+block_hint,ObjectPrototypeHasOwnProperty,40,41,0
+block_hint,ObjectPrototypeHasOwnProperty,171,172,0
+block_hint,ObjectPrototypeHasOwnProperty,178,179,1
+block_hint,ObjectPrototypeHasOwnProperty,58,59,0
+block_hint,ObjectToString,42,43,0
+block_hint,ObjectToString,57,58,0
+block_hint,ObjectToString,65,66,0
+block_hint,ObjectToString,52,53,0
+block_hint,ObjectToString,7,8,1
+block_hint,ObjectToString,5,6,1
+block_hint,ObjectToString,11,12,1
+block_hint,ObjectToString,19,20,0
+block_hint,InstanceOf_WithFeedback,50,51,1
+block_hint,InstanceOf_WithFeedback,52,53,0
+block_hint,InstanceOf_WithFeedback,54,55,1
+block_hint,InstanceOf_WithFeedback,32,33,1
+block_hint,InstanceOf_WithFeedback,34,35,1
+block_hint,InstanceOf_WithFeedback,5,6,1
+block_hint,InstanceOf_WithFeedback,14,15,1
+block_hint,InstanceOf_Baseline,50,51,1
+block_hint,InstanceOf_Baseline,54,55,1
+block_hint,InstanceOf_Baseline,32,33,1
+block_hint,InstanceOf_Baseline,34,35,1
+block_hint,InstanceOf_Baseline,5,6,1
+block_hint,InstanceOf_Baseline,14,15,1
+block_hint,ForInEnumerate,34,35,1
+block_hint,ForInEnumerate,36,37,0
+block_hint,ForInEnumerate,30,31,0
+block_hint,ForInEnumerate,32,33,1
+block_hint,ForInEnumerate,5,6,1
+block_hint,ForInEnumerate,38,39,1
+block_hint,ForInEnumerate,9,10,1
+block_hint,ForInPrepare,7,8,1
+block_hint,ForInPrepare,12,13,1
+block_hint,ForInPrepare,5,6,1
+block_hint,ForInFilter,232,233,1
+block_hint,ForInFilter,234,235,1
+block_hint,ForInFilter,225,226,0
+block_hint,ForInFilter,117,118,1
+block_hint,ForInFilter,217,218,0
+block_hint,ForInFilter,62,63,0
+block_hint,ForInFilter,129,130,1
+block_hint,ForInFilter,219,220,1
+block_hint,ForInFilter,103,104,0
+block_hint,ForInFilter,105,106,0
+block_hint,ForInFilter,66,67,0
+block_hint,ForInFilter,64,65,0
+block_hint,ForInFilter,268,269,0
+block_hint,ForInFilter,223,224,1
+block_hint,ForInFilter,109,110,1
+block_hint,ForInFilter,71,72,0
+block_hint,ForInFilter,264,265,0
+block_hint,ForInFilter,262,263,0
+block_hint,ForInFilter,249,250,0
+block_hint,ForInFilter,107,108,1
+block_hint,ForInFilter,40,41,1
+block_hint,ForInFilter,201,202,0
+block_hint,ForInFilter,42,43,1
+block_hint,ForInFilter,144,145,1
+block_hint,ForInFilter,46,47,0
+block_hint,ForInFilter,113,114,0
+block_hint,ForInFilter,131,132,0
+block_hint,ForInFilter,36,37,0
+block_hint,ForInFilter,246,247,0
+block_hint,ForInFilter,253,254,1
+block_hint,ForInFilter,189,190,0
+block_hint,ForInFilter,33,34,1
+block_hint,RegExpConstructor,55,56,1
+block_hint,RegExpConstructor,7,8,1
+block_hint,RegExpConstructor,131,132,1
+block_hint,RegExpConstructor,133,134,1
+block_hint,RegExpConstructor,70,71,0
+block_hint,RegExpConstructor,106,107,1
+block_hint,RegExpConstructor,127,128,0
+block_hint,RegExpConstructor,108,109,0
+block_hint,RegExpConstructor,82,83,1
+block_hint,RegExpConstructor,67,68,1
+block_hint,RegExpConstructor,40,41,0
+block_hint,RegExpConstructor,76,77,0
+block_hint,RegExpConstructor,104,105,1
+block_hint,RegExpConstructor,86,87,1
+block_hint,RegExpConstructor,78,79,1
+block_hint,RegExpConstructor,63,64,1
+block_hint,RegExpExecInternal,20,21,0
+block_hint,RegExpExecInternal,22,23,0
+block_hint,RegExpExecInternal,36,37,0
+block_hint,RegExpExecInternal,12,13,0
+block_hint,RegExpExecInternal,49,50,0
+block_hint,RegExpExecInternal,52,53,1
+block_hint,RegExpExecInternal,40,41,1
+block_hint,RegExpExecInternal,54,55,1
+block_hint,RegExpExecInternal,44,45,0
+block_hint,RegExpExecInternal,24,25,0
+block_hint,FindOrderedHashSetEntry,26,27,1
+block_hint,FindOrderedHashSetEntry,34,35,0
+block_hint,FindOrderedHashSetEntry,24,25,0
+block_hint,FindOrderedHashSetEntry,22,23,0
+block_hint,FindOrderedHashSetEntry,42,43,1
+block_hint,FindOrderedHashSetEntry,68,69,0
+block_hint,FindOrderedHashSetEntry,58,59,1
+block_hint,FindOrderedHashSetEntry,60,61,1
+block_hint,SetConstructor,202,203,1
+block_hint,SetConstructor,74,75,0
+block_hint,SetConstructor,11,12,1
+block_hint,SetConstructor,172,173,1
+block_hint,SetConstructor,135,136,1
+block_hint,SetConstructor,56,57,0
+block_hint,SetConstructor,58,59,1
+block_hint,SetConstructor,218,219,1
+block_hint,SetConstructor,210,211,0
+block_hint,SetConstructor,79,80,1
+block_hint,SetConstructor,23,24,1
+block_hint,SetConstructor,222,223,1
+block_hint,SetConstructor,214,215,0
+block_hint,SetConstructor,150,151,1
+block_hint,SetConstructor,25,26,1
+block_hint,SetConstructor,178,179,1
+block_hint,SetConstructor,143,144,1
+block_hint,SetConstructor,83,84,1
+block_hint,SetConstructor,85,86,1
+block_hint,SetConstructor,87,88,1
+block_hint,SetConstructor,89,90,1
+block_hint,SetConstructor,91,92,1
+block_hint,SetConstructor,93,94,1
+block_hint,SetConstructor,34,35,1
+block_hint,SetConstructor,95,96,1
+block_hint,SetConstructor,146,147,1
+block_hint,SetConstructor,152,153,1
+block_hint,SetConstructor,190,191,0
+block_hint,SetConstructor,183,184,0
+block_hint,SetConstructor,154,155,0
+block_hint,SetConstructor,105,106,0
+block_hint,SetConstructor,137,138,1
+block_hint,SetConstructor,27,28,1
+block_hint,SetConstructor,62,63,1
+block_hint,SetConstructor,176,177,0
+block_hint,SetConstructor,66,67,1
+block_hint,SetPrototypeHas,10,11,1
+block_hint,SetPrototypeHas,5,6,1
+block_hint,SetPrototypeHas,7,8,1
+block_hint,SetPrototypeAdd,98,99,1
+block_hint,SetPrototypeAdd,62,63,1
+block_hint,SetPrototypeAdd,64,65,1
+block_hint,SetPrototypeAdd,88,89,1
+block_hint,SetPrototypeAdd,90,91,0
+block_hint,SetPrototypeAdd,27,28,1
+block_hint,SetPrototypeAdd,79,80,0
+block_hint,SetPrototypeAdd,25,26,0
+block_hint,SetPrototypeAdd,23,24,0
+block_hint,SetPrototypeAdd,35,36,1
+block_hint,SetPrototypeAdd,66,67,0
+block_hint,SetPrototypeAdd,51,52,1
+block_hint,SetPrototypeAdd,53,54,1
+block_hint,SetPrototypeAdd,33,34,1
+block_hint,SetPrototypeDelete,96,97,1
+block_hint,SetPrototypeDelete,75,76,1
+block_hint,SetPrototypeDelete,77,78,1
+block_hint,SetPrototypeDelete,15,16,0
+block_hint,SetPrototypeDelete,32,33,1
+block_hint,SetPrototypeDelete,87,88,0
+block_hint,SetPrototypeDelete,30,31,0
+block_hint,SetPrototypeDelete,28,29,0
+block_hint,SetPrototypeDelete,45,46,1
+block_hint,SetPrototypeDelete,83,84,0
+block_hint,SetPrototypeDelete,79,80,0
+block_hint,SetPrototypeDelete,19,20,1
+block_hint,SetPrototypeDelete,21,22,1
+block_hint,SetPrototypeGetSize,8,9,1
+block_hint,SetPrototypeGetSize,5,6,1
+block_hint,SetPrototypeGetSize,3,4,1
+block_hint,SetPrototypeValues,13,14,1
+block_hint,SetPrototypeValues,8,9,1
+block_hint,SetPrototypeValues,10,11,1
+block_hint,SetPrototypeValues,4,5,1
+block_hint,SetPrototypeValues,6,7,1
+block_hint,SetIteratorPrototypeNext,41,42,1
+block_hint,SetIteratorPrototypeNext,28,29,1
+block_hint,SetIteratorPrototypeNext,39,40,1
+block_hint,SetIteratorPrototypeNext,17,18,0
+block_hint,SetIteratorPrototypeNext,19,20,0
+block_hint,SetIteratorPrototypeNext,37,38,1
+block_hint,SetIteratorPrototypeNext,15,16,1
+block_hint,SetIteratorPrototypeNext,23,24,1
+block_hint,SetOrSetIteratorToList,33,34,1
+block_hint,SetOrSetIteratorToList,8,9,1
+block_hint,SetOrSetIteratorToList,43,44,1
+block_hint,SetOrSetIteratorToList,31,32,1
+block_hint,SetOrSetIteratorToList,47,48,1
+block_hint,SetOrSetIteratorToList,14,15,0
+block_hint,SetOrSetIteratorToList,19,20,0
+block_hint,SetOrSetIteratorToList,24,25,1
+block_hint,StringFromCharCode,87,88,1
+block_hint,StringFromCharCode,53,54,1
+block_hint,StringFromCharCode,11,12,0
+block_hint,StringFromCharCode,81,82,1
+block_hint,StringFromCharCode,77,78,1
+block_hint,StringFromCharCode,19,20,0
+block_hint,StringFromCharCode,23,24,0
+block_hint,StringFromCharCode,58,59,0
+block_hint,StringFromCharCode,21,22,0
+block_hint,StringFromCharCode,29,30,0
+block_hint,StringFromCharCode,35,36,0
+block_hint,StringFromCharCode,33,34,0
+block_hint,StringFromCharCode,75,76,0
+block_hint,StringFromCharCode,41,42,0
+block_hint,StringFromCharCode,17,18,1
+block_hint,StringFromCharCode,44,45,1
+block_hint,StringPrototypeReplace,36,37,1
+block_hint,StringPrototypeReplace,8,9,0
+block_hint,StringPrototypeReplace,55,56,1
+block_hint,StringPrototypeReplace,51,52,1
+block_hint,StringPrototypeReplace,38,39,1
+block_hint,StringPrototypeReplace,22,23,0
+block_hint,StringPrototypeReplace,3,4,1
+block_hint,StringPrototypeReplace,24,25,0
+block_hint,StringPrototypeReplace,5,6,1
+block_hint,StringPrototypeReplace,28,29,1
+block_hint,StringPrototypeReplace,10,11,1
+block_hint,StringPrototypeReplace,57,58,0
+block_hint,StringPrototypeReplace,30,31,1
+block_hint,StringPrototypeReplace,92,93,1
+block_hint,StringPrototypeReplace,87,88,1
+block_hint,StringPrototypeReplace,80,81,1
+block_hint,StringPrototypeReplace,73,74,1
+block_hint,StringPrototypeReplace,59,60,1
+block_hint,StringPrototypeReplace,61,62,0
+block_hint,StringPrototypeReplace,63,64,1
+block_hint,StringPrototypeReplace,53,54,1
+block_hint,StringPrototypeReplace,42,43,1
+block_hint,StringPrototypeReplace,14,15,1
+block_hint,StringPrototypeReplace,90,91,1
+block_hint,StringPrototypeReplace,82,83,1
+block_hint,StringPrototypeReplace,76,77,0
+block_hint,StringPrototypeReplace,78,79,1
+block_hint,StringPrototypeReplace,70,71,1
+block_hint,StringPrototypeReplace,49,50,1
+block_hint,StringPrototypeReplace,16,17,1
+block_hint,StringPrototypeReplace,18,19,0
+block_hint,StringPrototypeReplace,26,27,1
+block_hint,StringPrototypeSplit,125,126,1
+block_hint,StringPrototypeSplit,112,113,0
+block_hint,StringPrototypeSplit,92,93,1
+block_hint,StringPrototypeSplit,35,36,0
+block_hint,StringPrototypeSplit,114,115,1
+block_hint,StringPrototypeSplit,105,106,1
+block_hint,StringPrototypeSplit,94,95,1
+block_hint,StringPrototypeSplit,64,65,0
+block_hint,StringPrototypeSplit,8,9,1
+block_hint,StringPrototypeSplit,66,67,0
+block_hint,StringPrototypeSplit,10,11,1
+block_hint,StringPrototypeSplit,77,78,1
+block_hint,StringPrototypeSplit,37,38,1
+block_hint,StringPrototypeSplit,116,117,0
+block_hint,StringPrototypeSplit,79,80,1
+block_hint,StringPrototypeSplit,168,169,1
+block_hint,StringPrototypeSplit,152,153,1
+block_hint,StringPrototypeSplit,128,129,1
+block_hint,StringPrototypeSplit,122,123,1
+block_hint,StringPrototypeSplit,107,108,1
+block_hint,StringPrototypeSplit,83,84,0
+block_hint,StringPrototypeSplit,68,69,0
+block_hint,StringPrototypeSplit,85,86,1
+block_hint,StringPrototypeSplit,70,71,1
+block_hint,StringPrototypeSplit,88,89,1
+block_hint,StringPrototypeSplit,25,26,0
+block_hint,StringPrototypeSplit,72,73,1
+block_hint,StringPrototypeSplit,42,43,0
+block_hint,StringPrototypeSplit,110,111,1
+block_hint,StringPrototypeSplit,90,91,0
+block_hint,StringPrototypeSplit,27,28,1
+block_hint,StringPrototypeSplit,16,17,1
+block_hint,StringPrototypeSplit,18,19,1
+block_hint,StringPrototypeSplit,20,21,1
+block_hint,StringPrototypeSplit,50,51,1
+block_hint,TypedArrayConstructor,14,15,1
+block_hint,TypedArrayConstructor,11,12,0
+block_hint,TypedArrayConstructor,2,3,0
+block_hint,TypedArrayPrototypeByteLength,69,70,1
+block_hint,TypedArrayPrototypeByteLength,43,44,1
+block_hint,TypedArrayPrototypeByteLength,45,46,1
+block_hint,TypedArrayPrototypeByteLength,71,72,0
+block_hint,TypedArrayPrototypeByteLength,73,74,0
+block_hint,TypedArrayPrototypeByteLength,65,66,0
+block_hint,TypedArrayPrototypeByteLength,33,34,0
+block_hint,TypedArrayPrototypeLength,50,51,1
+block_hint,TypedArrayPrototypeLength,33,34,1
+block_hint,TypedArrayPrototypeLength,35,36,1
+block_hint,TypedArrayPrototypeLength,52,53,0
+block_hint,TypedArrayPrototypeLength,44,45,0
+block_hint,TypedArrayPrototypeLength,28,29,0
+block_hint,TypedArrayPrototypeLength,19,20,0
+block_hint,WeakMapConstructor,351,352,1
+block_hint,WeakMapConstructor,271,272,1
+block_hint,WeakMapConstructor,119,120,0
+block_hint,WeakMapConstructor,14,15,1
+block_hint,WeakMapConstructor,293,294,1
+block_hint,WeakMapConstructor,230,231,1
+block_hint,WeakMapConstructor,93,94,0
+block_hint,WeakMapConstructor,95,96,1
+block_hint,WeakMapConstructor,295,296,1
+block_hint,WeakMapConstructor,331,332,0
+block_hint,WeakMapConstructor,342,343,0
+block_hint,WeakMapConstructor,239,240,0
+block_hint,WeakMapConstructor,123,124,0
+block_hint,WeakMapConstructor,241,242,0
+block_hint,WeakMapConstructor,109,110,0
+block_hint,WeakMapConstructor,243,244,1
+block_hint,WeakMapConstructor,211,212,1
+block_hint,WeakMapConstructor,28,29,1
+block_hint,WeakMapConstructor,30,31,1
+block_hint,WeakMapConstructor,32,33,1
+block_hint,WeakMapConstructor,98,99,0
+block_hint,WeakMapConstructor,117,118,1
+block_hint,WeakMapLookupHashIndex,9,10,1
+block_hint,WeakMapLookupHashIndex,31,32,1
+block_hint,WeakMapLookupHashIndex,11,12,0
+block_hint,WeakMapLookupHashIndex,13,14,0
+block_hint,WeakMapLookupHashIndex,25,26,1
+block_hint,WeakMapLookupHashIndex,33,34,1
+block_hint,WeakMapLookupHashIndex,27,28,0
+block_hint,WeakMapLookupHashIndex,23,24,0
+block_hint,WeakMapGet,12,13,1
+block_hint,WeakMapGet,7,8,1
+block_hint,WeakMapGet,9,10,1
+block_hint,WeakMapGet,3,4,1
+block_hint,WeakMapPrototypeHas,10,11,1
+block_hint,WeakMapPrototypeHas,5,6,1
+block_hint,WeakMapPrototypeHas,7,8,1
+block_hint,WeakMapPrototypeSet,24,25,1
+block_hint,WeakMapPrototypeSet,5,6,1
+block_hint,WeakMapPrototypeSet,7,8,1
+block_hint,WeakMapPrototypeSet,13,14,1
+block_hint,WeakMapPrototypeSet,22,23,1
+block_hint,WeakMapPrototypeSet,15,16,0
+block_hint,WeakMapPrototypeSet,9,10,0
+block_hint,WeakCollectionSet,17,18,1
+block_hint,WeakCollectionSet,20,21,0
+block_hint,WeakCollectionSet,7,8,1
+block_hint,WeakCollectionSet,13,14,0
+block_hint,AsyncGeneratorResolve,9,10,1
+block_hint,AsyncGeneratorResolve,3,4,1
+block_hint,AsyncGeneratorResolve,11,12,0
+block_hint,AsyncGeneratorResolve,7,8,0
+block_hint,AsyncGeneratorYieldWithAwait,24,25,1
+block_hint,AsyncGeneratorYieldWithAwait,19,20,0
+block_hint,AsyncGeneratorYieldWithAwait,6,7,1
+block_hint,AsyncGeneratorYieldWithAwait,42,43,1
+block_hint,AsyncGeneratorYieldWithAwait,37,38,0
+block_hint,AsyncGeneratorYieldWithAwait,28,29,1
+block_hint,AsyncGeneratorYieldWithAwait,8,9,1
+block_hint,AsyncGeneratorYieldWithAwait,10,11,1
+block_hint,AsyncGeneratorYieldWithAwait,12,13,1
+block_hint,AsyncGeneratorYieldWithAwait,14,15,1
+block_hint,AsyncGeneratorYieldWithAwait,22,23,0
+block_hint,AsyncGeneratorResumeNext,18,19,0
+block_hint,AsyncGeneratorResumeNext,14,15,0
+block_hint,AsyncGeneratorPrototypeNext,27,28,1
+block_hint,AsyncGeneratorPrototypeNext,16,17,1
+block_hint,AsyncGeneratorPrototypeNext,4,5,1
+block_hint,AsyncGeneratorPrototypeNext,34,35,1
+block_hint,AsyncGeneratorPrototypeNext,29,30,0
+block_hint,AsyncGeneratorPrototypeNext,18,19,1
+block_hint,AsyncGeneratorPrototypeNext,20,21,1
+block_hint,AsyncGeneratorPrototypeNext,22,23,1
+block_hint,AsyncGeneratorPrototypeNext,6,7,1
+block_hint,AsyncGeneratorPrototypeNext,11,12,0
+block_hint,AsyncGeneratorAwaitUncaught,24,25,1
+block_hint,AsyncGeneratorAwaitUncaught,19,20,1
+block_hint,AsyncGeneratorAwaitUncaught,2,3,1
+block_hint,AsyncGeneratorAwaitUncaught,30,31,1
+block_hint,AsyncGeneratorAwaitUncaught,32,33,0
+block_hint,AsyncGeneratorAwaitUncaught,28,29,1
+block_hint,AsyncGeneratorAwaitUncaught,8,9,1
+block_hint,AsyncGeneratorAwaitUncaught,10,11,1
+block_hint,AsyncGeneratorAwaitUncaught,12,13,1
+block_hint,AsyncGeneratorAwaitUncaught,14,15,1
+block_hint,AsyncGeneratorAwaitUncaught,22,23,0
+block_hint,AsyncGeneratorAwaitResolveClosure,8,9,1
+block_hint,AsyncGeneratorAwaitResolveClosure,2,3,1
+block_hint,AsyncGeneratorAwaitResolveClosure,6,7,0
+block_hint,AsyncGeneratorYieldWithAwaitResolveClosure,5,6,1
+block_hint,AsyncGeneratorYieldWithAwaitResolveClosure,2,3,1
+block_hint,StringAdd_CheckNone,19,20,1
+block_hint,StringAdd_CheckNone,58,59,0
+block_hint,StringAdd_CheckNone,78,79,1
+block_hint,StringAdd_CheckNone,42,43,1
+block_hint,StringAdd_CheckNone,60,61,0
+block_hint,StringAdd_CheckNone,94,95,0
+block_hint,StringAdd_CheckNone,84,85,0
+block_hint,StringAdd_CheckNone,88,89,0
+block_hint,StringAdd_CheckNone,64,65,1
+block_hint,StringAdd_CheckNone,76,77,1
+block_hint,StringAdd_CheckNone,55,56,1
+block_hint,StringAdd_CheckNone,13,14,0
+block_hint,StringAdd_CheckNone,15,16,0
+block_hint,StringAdd_CheckNone,92,93,1
+block_hint,StringAdd_CheckNone,82,83,1
+block_hint,StringAdd_CheckNone,34,35,0
+block_hint,StringAdd_CheckNone,38,39,0
+block_hint,StringAdd_CheckNone,40,41,1
+block_hint,StringAdd_CheckNone,53,54,1
+block_hint,StringAdd_CheckNone,11,12,0
+block_hint,StringAdd_CheckNone,90,91,1
+block_hint,StringAdd_CheckNone,80,81,1
+block_hint,StringAdd_CheckNone,26,27,0
+block_hint,StringAdd_CheckNone,30,31,0
+block_hint,SubString,63,64,1
+block_hint,SubString,97,98,1
+block_hint,SubString,58,59,1
+block_hint,SubString,56,57,1
+block_hint,SubString,110,111,0
+block_hint,SubString,19,20,0
+block_hint,SubString,21,22,0
+block_hint,SubString,114,115,1
+block_hint,SubString,102,103,1
+block_hint,SubString,38,39,0
+block_hint,SubString,17,18,0
+block_hint,SubString,116,117,1
+block_hint,SubString,104,105,1
+block_hint,SubString,42,43,0
+block_hint,SubString,75,76,1
+block_hint,SubString,127,128,0
+block_hint,SubString,99,100,1
+block_hint,SubString,34,35,1
+block_hint,SubString,31,32,0
+block_hint,GetProperty,56,57,1
+block_hint,GetProperty,101,102,0
+block_hint,GetProperty,175,176,1
+block_hint,GetProperty,205,206,0
+block_hint,GetProperty,165,166,1
+block_hint,GetProperty,133,134,1
+block_hint,GetProperty,60,61,1
+block_hint,GetProperty,139,140,0
+block_hint,GetProperty,141,142,0
+block_hint,GetProperty,110,111,0
+block_hint,GetProperty,62,63,0
+block_hint,GetProperty,167,168,0
+block_hint,GetProperty,218,219,0
+block_hint,GetProperty,208,209,1
+block_hint,GetProperty,112,113,0
+block_hint,GetProperty,229,230,0
+block_hint,GetProperty,220,221,0
+block_hint,GetProperty,216,217,0
+block_hint,GetProperty,35,36,1
+block_hint,GetProperty,222,223,0
+block_hint,GetProperty,37,38,1
+block_hint,GetProperty,147,148,0
+block_hint,GetProperty,187,188,1
+block_hint,GetProperty,41,42,0
+block_hint,GetProperty,43,44,0
+block_hint,GetProperty,157,158,0
+block_hint,GetProperty,161,162,1
+block_hint,GetProperty,151,152,0
+block_hint,GetProperty,47,48,0
+block_hint,GetProperty,231,232,0
+block_hint,GetProperty,196,197,1
+block_hint,GetProperty,92,93,0
+block_hint,GetProperty,94,95,0
+block_hint,GetProperty,96,97,0
+block_hint,GetProperty,163,164,0
+block_hint,GetProperty,98,99,1
+block_hint,GetProperty,203,204,0
+block_hint,GetProperty,226,227,0
+block_hint,GetProperty,233,234,1
+block_hint,GetProperty,201,202,0
+block_hint,GetProperty,199,200,0
+block_hint,GetProperty,22,23,0
+block_hint,GetProperty,182,183,1
+block_hint,GetProperty,104,105,1
+block_hint,GetPropertyWithReceiver,58,59,1
+block_hint,GetPropertyWithReceiver,60,61,1
+block_hint,GetPropertyWithReceiver,203,204,0
+block_hint,GetPropertyWithReceiver,174,175,1
+block_hint,GetPropertyWithReceiver,211,212,0
+block_hint,GetPropertyWithReceiver,112,113,0
+block_hint,GetPropertyWithReceiver,162,163,1
+block_hint,GetPropertyWithReceiver,138,139,1
+block_hint,GetPropertyWithReceiver,62,63,1
+block_hint,GetPropertyWithReceiver,144,145,0
+block_hint,GetPropertyWithReceiver,146,147,0
+block_hint,GetPropertyWithReceiver,114,115,0
+block_hint,GetPropertyWithReceiver,64,65,0
+block_hint,GetPropertyWithReceiver,164,165,0
+block_hint,GetPropertyWithReceiver,215,216,1
+block_hint,GetPropertyWithReceiver,117,118,0
+block_hint,GetPropertyWithReceiver,236,237,0
+block_hint,GetPropertyWithReceiver,232,233,0
+block_hint,GetPropertyWithReceiver,223,224,0
+block_hint,GetPropertyWithReceiver,148,149,1
+block_hint,GetPropertyWithReceiver,38,39,1
+block_hint,GetPropertyWithReceiver,234,235,0
+block_hint,GetPropertyWithReceiver,40,41,1
+block_hint,GetPropertyWithReceiver,183,184,0
+block_hint,GetPropertyWithReceiver,34,35,0
+block_hint,GetPropertyWithReceiver,229,230,1
+block_hint,GetPropertyWithReceiver,205,206,0
+block_hint,SetProperty,379,380,1
+block_hint,SetProperty,381,382,0
+block_hint,SetProperty,1213,1214,0
+block_hint,SetProperty,928,929,1
+block_hint,SetProperty,1031,1032,1
+block_hint,SetProperty,1033,1034,0
+block_hint,SetProperty,733,734,0
+block_hint,SetProperty,922,923,1
+block_hint,SetProperty,413,414,0
+block_hint,SetProperty,415,416,0
+block_hint,SetProperty,256,257,1
+block_hint,SetProperty,417,418,0
+block_hint,SetProperty,630,631,1
+block_hint,SetProperty,92,93,1
+block_hint,SetProperty,94,95,1
+block_hint,SetProperty,1098,1099,0
+block_hint,SetProperty,811,812,0
+block_hint,SetProperty,813,814,1
+block_hint,SetProperty,815,816,0
+block_hint,SetProperty,104,105,1
+block_hint,SetProperty,108,109,1
+block_hint,SetProperty,429,430,1
+block_hint,SetProperty,110,111,1
+block_hint,SetProperty,106,107,1
+block_hint,CreateDataProperty,319,320,1
+block_hint,CreateDataProperty,321,322,0
+block_hint,CreateDataProperty,990,991,0
+block_hint,CreateDataProperty,782,783,1
+block_hint,CreateDataProperty,865,866,1
+block_hint,CreateDataProperty,539,540,1
+block_hint,CreateDataProperty,648,649,1
+block_hint,CreateDataProperty,650,651,0
+block_hint,CreateDataProperty,912,913,1
+block_hint,CreateDataProperty,333,334,0
+block_hint,CreateDataProperty,55,56,1
+block_hint,CreateDataProperty,543,544,1
+block_hint,CreateDataProperty,57,58,1
+block_hint,ArrayPrototypeConcat,79,80,1
+block_hint,ArrayPrototypeConcat,54,55,1
+block_hint,ArrayPrototypeConcat,63,64,1
+block_hint,ArrayPrototypeConcat,74,75,0
+block_hint,ArrayPrototypeConcat,81,82,0
+block_hint,ArrayPrototypeConcat,70,71,1
+block_hint,ArrayPrototypeConcat,37,38,1
+block_hint,ArrayPrototypeConcat,16,17,1
+block_hint,ArrayPrototypeConcat,3,4,1
+block_hint,ArrayPrototypeConcat,25,26,1
+block_hint,ArrayPrototypeConcat,9,10,0
+block_hint,ArrayPrototypeConcat,20,21,1
+block_hint,ArrayPrototypeConcat,30,31,0
+block_hint,ArrayPrototypeConcat,42,43,0
+block_hint,ArrayPrototypeConcat,72,73,1
+block_hint,ArrayPrototypeConcat,39,40,1
+block_hint,ArrayPrototypeConcat,18,19,1
+block_hint,ArrayPrototypeConcat,5,6,1
+block_hint,ArrayPrototypeConcat,57,58,1
+block_hint,ArrayPrototypeConcat,59,60,0
+block_hint,ArrayPrototypeConcat,66,67,0
+block_hint,ArrayPrototypeConcat,33,34,1
+block_hint,ArrayPrototypeConcat,68,69,0
+block_hint,ArrayPrototypeConcat,35,36,1
+block_hint,ArrayPrototypeConcat,27,28,1
+block_hint,ArrayPrototypeConcat,11,12,1
+block_hint,ArrayEvery,73,74,1
+block_hint,ArrayEvery,31,32,0
+block_hint,ArrayEvery,125,126,1
+block_hint,ArrayEvery,117,118,1
+block_hint,ArrayEvery,91,92,1
+block_hint,ArrayEvery,93,94,1
+block_hint,ArrayEvery,99,100,1
+block_hint,ArrayEvery,121,122,0
+block_hint,ArrayEvery,105,106,1
+block_hint,ArrayEvery,107,108,1
+block_hint,ArrayEvery,97,98,1
+block_hint,ArrayEvery,49,50,0
+block_hint,ArrayEvery,102,103,1
+block_hint,ArrayEvery,66,67,1
+block_hint,ArrayEvery,45,46,1
+block_hint,ArrayEvery,12,13,1
+block_hint,ArrayEvery,57,58,1
+block_hint,ArrayEvery,28,29,0
+block_hint,ArrayEvery,68,69,1
+block_hint,ArrayEvery,70,71,0
+block_hint,ArrayEvery,51,52,0
+block_hint,ArrayEvery,47,48,0
+block_hint,ArrayEvery,18,19,0
+block_hint,ArrayEvery,20,21,1
+block_hint,ArrayEvery,61,62,0
+block_hint,ArrayEvery,109,110,1
+block_hint,ArrayEvery,87,88,0
+block_hint,ArrayEvery,89,90,0
+block_hint,ArrayEvery,111,112,0
+block_hint,ArrayEvery,79,80,0
+block_hint,ArrayFilter,194,195,1
+block_hint,ArrayFilter,84,85,0
+block_hint,ArrayFilter,304,305,1
+block_hint,ArrayFilter,293,294,1
+block_hint,ArrayFilter,228,229,1
+block_hint,ArrayFilter,230,231,1
+block_hint,ArrayFilter,249,250,1
+block_hint,ArrayFilter,302,303,0
+block_hint,ArrayFilter,274,275,1
+block_hint,ArrayFilter,276,277,1
+block_hint,ArrayFilter,242,243,0
+block_hint,ArrayFilter,280,281,1
+block_hint,ArrayFilter,196,197,1
+block_hint,ArrayFilter,123,124,1
+block_hint,ArrayFilter,22,23,1
+block_hint,ArrayFilter,198,199,1
+block_hint,ArrayFilter,125,126,0
+block_hint,ArrayFilter,24,25,1
+block_hint,ArrayFilter,271,272,1
+block_hint,ArrayFilter,167,168,0
+block_hint,ArrayFilter,282,283,1
+block_hint,ArrayFilter,200,201,1
+block_hint,ArrayFilter,127,128,1
+block_hint,ArrayFilter,26,27,1
+block_hint,ArrayFilter,210,211,1
+block_hint,ArrayFilter,212,213,0
+block_hint,ArrayFilter,287,288,1
+block_hint,ArrayFilter,214,215,1
+block_hint,ArrayFilter,216,217,1
+block_hint,ArrayFilter,218,219,1
+block_hint,ArrayFilter,202,203,1
+block_hint,ArrayFilter,129,130,0
+block_hint,ArrayFilter,28,29,1
+block_hint,ArrayFilter,172,173,0
+block_hint,ArrayFilter,103,104,0
+block_hint,ArrayFilter,245,246,1
+block_hint,ArrayFilter,247,248,0
+block_hint,ArrayFilter,204,205,0
+block_hint,ArrayFilter,131,132,0
+block_hint,ArrayFilter,42,43,0
+block_hint,ArrayFilter,44,45,1
+block_hint,ArrayFilter,149,150,0
+block_hint,ArrayFilter,252,253,1
+block_hint,ArrayFilter,178,179,0
+block_hint,ArrayFilter,180,181,0
+block_hint,ArrayFilter,254,255,0
+block_hint,ArrayFilter,256,257,0
+block_hint,ArrayFilter,258,259,1
+block_hint,ArrayFilter,260,261,0
+block_hint,ArrayFilter,262,263,1
+block_hint,ArrayFilter,284,285,0
+block_hint,ArrayFilter,240,241,0
+block_hint,ArrayFilter,162,163,0
+block_hint,ArrayFilter,95,96,0
+block_hint,ArrayFilter,188,189,1
+block_hint,ArrayFilter,60,61,0
+block_hint,ArrayFilter,64,65,1
+block_hint,ArrayFilter,50,51,1
+block_hint,ArrayForEach,70,71,1
+block_hint,ArrayForEach,29,30,0
+block_hint,ArrayForEach,102,103,1
+block_hint,ArrayForEach,96,97,1
+block_hint,ArrayForEach,76,77,1
+block_hint,ArrayForEach,78,79,1
+block_hint,ArrayForEach,84,85,1
+block_hint,ArrayForEach,100,101,0
+block_hint,ArrayForEach,90,91,1
+block_hint,ArrayForEach,92,93,1
+block_hint,ArrayForEach,47,48,0
+block_hint,ArrayForEach,87,88,1
+block_hint,ArrayForEach,63,64,1
+block_hint,ArrayForEach,43,44,1
+block_hint,ArrayForEach,12,13,1
+block_hint,ArrayForEach,53,54,1
+block_hint,ArrayForEach,26,27,0
+block_hint,ArrayForEach,65,66,1
+block_hint,ArrayForEach,67,68,0
+block_hint,ArrayForEach,49,50,0
+block_hint,ArrayForEach,45,46,0
+block_hint,ArrayForEach,18,19,0
+block_hint,ArrayForEach,20,21,1
+block_hint,ArrayForEach,58,59,0
+block_hint,ArrayFrom,225,226,1
+block_hint,ArrayFrom,76,77,1
+block_hint,ArrayFrom,78,79,1
+block_hint,ArrayFrom,8,9,1
+block_hint,ArrayFrom,342,343,1
+block_hint,ArrayFrom,338,339,0
+block_hint,ArrayFrom,327,328,0
+block_hint,ArrayFrom,311,312,1
+block_hint,ArrayFrom,309,310,0
+block_hint,ArrayFrom,80,81,1
+block_hint,ArrayFrom,10,11,1
+block_hint,ArrayFrom,322,323,1
+block_hint,ArrayFrom,305,306,0
+block_hint,ArrayFrom,245,246,1
+block_hint,ArrayFrom,266,267,0
+block_hint,ArrayFrom,82,83,1
+block_hint,ArrayFrom,12,13,1
+block_hint,ArrayFrom,268,269,1
+block_hint,ArrayFrom,213,214,0
+block_hint,ArrayFrom,290,291,1
+block_hint,ArrayFrom,248,249,0
+block_hint,ArrayFrom,285,286,1
+block_hint,ArrayFrom,281,282,0
+block_hint,ArrayFrom,188,189,1
+block_hint,ArrayFrom,88,89,1
+block_hint,ArrayFrom,18,19,1
+block_hint,ArrayFrom,215,216,1
+block_hint,ArrayFrom,72,73,1
+block_hint,ArrayIsArray,13,14,1
+block_hint,ArrayIsArray,9,10,1
+block_hint,ArrayIsArray,7,8,0
+block_hint,LoadJoinElement_FastSmiOrObjectElements_0,2,3,1
+block_hint,LoadJoinElement_FastSmiOrObjectElements_0,4,5,0
+block_hint,LoadJoinElement_FastDoubleElements_0,3,4,1
+block_hint,LoadJoinElement_FastDoubleElements_0,5,6,0
+block_hint,LoadJoinElement_FastDoubleElements_0,7,8,1
+block_hint,JoinStackPush,28,29,1
+block_hint,JoinStackPush,6,7,1
+block_hint,JoinStackPush,10,11,0
+block_hint,JoinStackPop,9,10,1
+block_hint,JoinStackPop,4,5,1
+block_hint,ArrayPrototypeJoin,512,513,1
+block_hint,ArrayPrototypeJoin,450,451,1
+block_hint,ArrayPrototypeJoin,417,418,1
+block_hint,ArrayPrototypeJoin,330,331,1
+block_hint,ArrayPrototypeJoin,332,333,1
+block_hint,ArrayPrototypeJoin,363,364,1
+block_hint,ArrayPrototypeJoin,336,337,0
+block_hint,ArrayPrototypeJoin,179,180,0
+block_hint,ArrayPrototypeJoin,468,469,1
+block_hint,ArrayPrototypeJoin,434,435,1
+block_hint,ArrayPrototypeJoin,324,325,0
+block_hint,ArrayPrototypeJoin,226,227,1
+block_hint,ArrayPrototypeJoin,30,31,1
+block_hint,ArrayPrototypeJoin,181,182,0
+block_hint,ArrayPrototypeJoin,32,33,1
+block_hint,ArrayPrototypeJoin,385,386,1
+block_hint,ArrayPrototypeJoin,321,322,0
+block_hint,ArrayPrototypeJoin,143,144,1
+block_hint,ArrayPrototypeJoin,487,488,1
+block_hint,ArrayPrototypeJoin,452,453,0
+block_hint,ArrayPrototypeJoin,421,422,0
+block_hint,ArrayPrototypeJoin,365,366,1
+block_hint,ArrayPrototypeJoin,183,184,1
+block_hint,ArrayPrototypeJoin,38,39,1
+block_hint,ArrayPrototypeJoin,454,455,1
+block_hint,ArrayPrototypeJoin,423,424,0
+block_hint,ArrayPrototypeJoin,293,294,1
+block_hint,ArrayPrototypeJoin,426,427,0
+block_hint,ArrayPrototypeJoin,341,342,0
+block_hint,ArrayPrototypeJoin,189,190,0
+block_hint,ArrayPrototypeJoin,230,231,1
+block_hint,ArrayPrototypeJoin,145,146,1
+block_hint,ArrayPrototypeJoin,477,478,0
+block_hint,ArrayPrototypeJoin,481,482,1
+block_hint,ArrayPrototypeJoin,519,520,0
+block_hint,ArrayPrototypeJoin,515,516,0
+block_hint,ArrayPrototypeJoin,508,509,1
+block_hint,ArrayPrototypeJoin,483,484,1
+block_hint,ArrayPrototypeJoin,479,480,0
+block_hint,ArrayPrototypeJoin,147,148,0
+block_hint,ArrayPrototypeJoin,149,150,0
+block_hint,ArrayPrototypeJoin,463,464,0
+block_hint,ArrayPrototypeJoin,465,466,0
+block_hint,ArrayPrototypeJoin,448,449,1
+block_hint,ArrayPrototypeJoin,405,406,1
+block_hint,ArrayPrototypeJoin,407,408,1
+block_hint,ArrayPrototypeJoin,409,410,1
+block_hint,ArrayPrototypeJoin,411,412,1
+block_hint,ArrayPrototypeJoin,197,198,1
+block_hint,ArrayPrototypeJoin,252,253,0
+block_hint,ArrayPrototypeJoin,254,255,0
+block_hint,ArrayPrototypeJoin,300,301,0
+block_hint,ArrayPrototypeJoin,260,261,0
+block_hint,ArrayPrototypeJoin,262,263,0
+block_hint,ArrayPrototypeJoin,203,204,1
+block_hint,ArrayPrototypeJoin,72,73,1
+block_hint,ArrayPrototypeJoin,377,378,0
+block_hint,ArrayPrototypeJoin,303,304,1
+block_hint,ArrayPrototypeJoin,207,208,1
+block_hint,ArrayPrototypeJoin,268,269,0
+block_hint,ArrayPrototypeJoin,270,271,0
+block_hint,ArrayPrototypeJoin,209,210,1
+block_hint,ArrayPrototypeJoin,86,87,1
+block_hint,ArrayPrototypeJoin,305,306,1
+block_hint,ArrayPrototypeJoin,102,103,0
+block_hint,ArrayPrototypeJoin,104,105,0
+block_hint,ArrayPrototypeJoin,401,402,1
+block_hint,ArrayPrototypeJoin,383,384,1
+block_hint,ArrayPrototypeJoin,100,101,0
+block_hint,ArrayPrototypeJoin,399,400,1
+block_hint,ArrayPrototypeJoin,381,382,1
+block_hint,ArrayPrototypeJoin,96,97,1
+block_hint,ArrayPrototypeJoin,348,349,1
+block_hint,ArrayPrototypeJoin,307,308,0
+block_hint,ArrayPrototypeJoin,215,216,0
+block_hint,ArrayPrototypeJoin,106,107,1
+block_hint,ArrayPrototypeJoin,108,109,0
+block_hint,ArrayPrototypeJoin,110,111,1
+block_hint,ArrayPrototypeJoin,282,283,1
+block_hint,ArrayPrototypeJoin,139,140,1
+block_hint,ArrayPrototypeToString,14,15,1
+block_hint,ArrayPrototypeToString,11,12,1
+block_hint,ArrayPrototypeToString,8,9,1
+block_hint,ArrayPrototypeToString,5,6,1
+block_hint,ArrayPrototypeToString,3,4,1
+block_hint,ArrayPrototypeLastIndexOf,279,280,1
+block_hint,ArrayPrototypeLastIndexOf,261,262,1
+block_hint,ArrayPrototypeLastIndexOf,245,246,1
+block_hint,ArrayPrototypeLastIndexOf,175,176,1
+block_hint,ArrayPrototypeLastIndexOf,177,178,1
+block_hint,ArrayPrototypeLastIndexOf,91,92,0
+block_hint,ArrayPrototypeLastIndexOf,41,42,1
+block_hint,ArrayPrototypeLastIndexOf,375,376,0
+block_hint,ArrayPrototypeLastIndexOf,361,362,0
+block_hint,ArrayPrototypeLastIndexOf,367,368,0
+block_hint,ArrayPrototypeLastIndexOf,358,359,0
+block_hint,ArrayPrototypeLastIndexOf,335,336,0
+block_hint,ArrayPrototypeLastIndexOf,324,325,1
+block_hint,ArrayPrototypeLastIndexOf,338,339,0
+block_hint,ArrayPrototypeLastIndexOf,328,329,0
+block_hint,ArrayPrototypeLastIndexOf,315,316,0
+block_hint,ArrayPrototypeLastIndexOf,300,301,0
+block_hint,ArrayPrototypeLastIndexOf,313,314,0
+block_hint,ArrayPrototypeLastIndexOf,298,299,0
+block_hint,ArrayPrototypeLastIndexOf,281,282,1
+block_hint,ArrayPrototypeLastIndexOf,252,253,0
+block_hint,ArrayPrototypeLastIndexOf,194,195,1
+block_hint,ArrayPrototypeLastIndexOf,83,84,1
+block_hint,ArrayPrototypeLastIndexOf,73,74,1
+block_hint,ArrayPrototypeLastIndexOf,21,22,1
+block_hint,ArrayPrototypeLastIndexOf,85,86,1
+block_hint,ArrayPrototypeLastIndexOf,77,78,0
+block_hint,ArrayPrototypeLastIndexOf,29,30,1
+block_hint,ArrayPrototypeLastIndexOf,60,61,0
+block_hint,ArrayPrototypeLastIndexOf,98,99,1
+block_hint,ArrayPrototypeLastIndexOf,56,57,0
+block_hint,ArrayPrototypeLastIndexOf,23,24,1
+block_hint,ArrayPrototypeLastIndexOf,58,59,0
+block_hint,ArrayPrototypeLastIndexOf,214,215,0
+block_hint,ArrayPrototypeLastIndexOf,220,221,1
+block_hint,ArrayPrototypeLastIndexOf,239,240,0
+block_hint,ArrayPrototypeLastIndexOf,212,213,0
+block_hint,ArrayPrototypeLastIndexOf,145,146,0
+block_hint,ArrayPrototypeLastIndexOf,129,130,1
+block_hint,ArrayPrototypeLastIndexOf,31,32,0
+block_hint,ArrayMap,163,164,1
+block_hint,ArrayMap,72,73,0
+block_hint,ArrayMap,270,271,1
+block_hint,ArrayMap,249,250,1
+block_hint,ArrayMap,194,195,1
+block_hint,ArrayMap,196,197,1
+block_hint,ArrayMap,215,216,1
+block_hint,ArrayMap,268,269,0
+block_hint,ArrayMap,229,230,1
+block_hint,ArrayMap,231,232,1
+block_hint,ArrayMap,258,259,1
+block_hint,ArrayMap,212,213,0
+block_hint,ArrayMap,226,227,1
+block_hint,ArrayMap,233,234,1
+block_hint,ArrayMap,165,166,1
+block_hint,ArrayMap,114,115,1
+block_hint,ArrayMap,23,24,1
+block_hint,ArrayMap,241,242,1
+block_hint,ArrayMap,217,218,0
+block_hint,ArrayMap,161,162,0
+block_hint,ArrayMap,74,75,0
+block_hint,ArrayMap,180,181,1
+block_hint,ArrayMap,159,160,1
+block_hint,ArrayMap,55,56,0
+block_hint,ArrayMap,283,284,1
+block_hint,ArrayMap,280,281,0
+block_hint,ArrayMap,261,262,0
+block_hint,ArrayMap,235,236,0
+block_hint,ArrayMap,201,202,0
+block_hint,ArrayMap,116,117,0
+block_hint,ArrayMap,29,30,0
+block_hint,ArrayMap,31,32,1
+block_hint,ArrayMap,132,133,0
+block_hint,ArrayMap,33,34,1
+block_hint,ArrayMap,120,121,0
+block_hint,ArrayMap,37,38,1
+block_hint,ArrayMap,35,36,1
+block_hint,ArrayMap,266,267,0
+block_hint,ArrayMap,209,210,0
+block_hint,ArrayMap,151,152,0
+block_hint,ArrayMap,45,46,1
+block_hint,ArrayMap,153,154,0
+block_hint,ArrayMap,89,90,1
+block_hint,ArrayMap,83,84,0
+block_hint,ArrayMap,85,86,1
+block_hint,ArrayMap,182,183,1
+block_hint,ArrayMap,184,185,0
+block_hint,ArrayMap,62,63,0
+block_hint,ArrayMap,64,65,1
+block_hint,ArrayMap,96,97,1
+block_hint,ArrayMap,47,48,1
+block_hint,ArrayMap,155,156,1
+block_hint,ArrayMap,98,99,1
+block_hint,ArrayMap,49,50,1
+block_hint,ArrayMap,136,137,1
+block_hint,ArrayReduce,81,82,1
+block_hint,ArrayReduce,30,31,0
+block_hint,ArrayReduce,127,128,1
+block_hint,ArrayReduce,121,122,1
+block_hint,ArrayReduce,89,90,1
+block_hint,ArrayReduce,91,92,1
+block_hint,ArrayReduce,101,102,1
+block_hint,ArrayReduce,125,126,0
+block_hint,ArrayReduce,111,112,1
+block_hint,ArrayReduce,113,114,1
+block_hint,ArrayReduce,95,96,1
+block_hint,ArrayReduce,104,105,0
+block_hint,ArrayReduce,49,50,0
+block_hint,ArrayReduce,106,107,1
+block_hint,ArrayReduce,65,66,1
+block_hint,ArrayReduce,45,46,1
+block_hint,ArrayReduce,12,13,1
+block_hint,ArrayReduce,53,54,1
+block_hint,ArrayReduce,26,27,0
+block_hint,ArrayReduce,99,100,0
+block_hint,ArrayReduce,67,68,1
+block_hint,ArrayReduce,69,70,0
+block_hint,ArrayReduce,117,118,0
+block_hint,ArrayReduce,97,98,0
+block_hint,ArrayReduce,71,72,0
+block_hint,ArrayReduce,47,48,0
+block_hint,ArrayReduce,18,19,0
+block_hint,ArrayReduce,20,21,1
+block_hint,ArrayReduce,57,58,0
+block_hint,ArrayReduce,59,60,0
+block_hint,ArrayReduce,23,24,0
+block_hint,ArrayPrototypeReverse,236,237,1
+block_hint,ArrayPrototypeReverse,210,211,1
+block_hint,ArrayPrototypeReverse,190,191,1
+block_hint,ArrayPrototypeReverse,152,153,1
+block_hint,ArrayPrototypeReverse,103,104,1
+block_hint,ArrayPrototypeReverse,18,19,1
+block_hint,ArrayPrototypeReverse,192,193,1
+block_hint,ArrayPrototypeReverse,169,170,0
+block_hint,ArrayPrototypeReverse,140,141,1
+block_hint,ArrayPrototypeReverse,118,119,1
+block_hint,ArrayPrototypeReverse,89,90,0
+block_hint,ArrayPrototypeShift,237,238,1
+block_hint,ArrayPrototypeShift,205,206,1
+block_hint,ArrayPrototypeShift,185,186,1
+block_hint,ArrayPrototypeShift,132,133,1
+block_hint,ArrayPrototypeShift,81,82,1
+block_hint,ArrayPrototypeShift,11,12,1
+block_hint,ArrayPrototypeShift,196,197,1
+block_hint,ArrayPrototypeShift,168,169,0
+block_hint,ArrayPrototypeShift,134,135,1
+block_hint,ArrayPrototypeShift,83,84,0
+block_hint,ArrayPrototypeShift,13,14,1
+block_hint,ArrayPrototypeShift,136,137,0
+block_hint,ArrayPrototypeShift,85,86,0
+block_hint,ArrayPrototypeShift,68,69,0
+block_hint,ArrayPrototypeShift,87,88,0
+block_hint,ArrayPrototypeShift,27,28,0
+block_hint,ArrayPrototypeShift,29,30,1
+block_hint,ArrayPrototypeShift,170,171,0
+block_hint,ArrayPrototypeShift,89,90,0
+block_hint,ArrayPrototypeShift,33,34,0
+block_hint,ArrayPrototypeShift,148,149,0
+block_hint,ArrayPrototypeShift,111,112,0
+block_hint,ArrayPrototypeShift,91,92,0
+block_hint,ArrayPrototypeShift,39,40,0
+block_hint,ArrayPrototypeShift,41,42,1
+block_hint,ArrayPrototypeSlice,288,289,1
+block_hint,ArrayPrototypeSlice,267,268,1
+block_hint,ArrayPrototypeSlice,245,246,1
+block_hint,ArrayPrototypeSlice,182,183,1
+block_hint,ArrayPrototypeSlice,81,82,1
+block_hint,ArrayPrototypeSlice,12,13,1
+block_hint,ArrayPrototypeSlice,83,84,1
+block_hint,ArrayPrototypeSlice,14,15,1
+block_hint,ArrayPrototypeSlice,16,17,1
+block_hint,ArrayPrototypeSlice,87,88,1
+block_hint,ArrayPrototypeSlice,511,512,0
+block_hint,ArrayPrototypeSlice,509,510,0
+block_hint,ArrayPrototypeSlice,485,486,0
+block_hint,ArrayPrototypeSlice,448,449,0
+block_hint,ArrayPrototypeSlice,428,429,0
+block_hint,ArrayPrototypeSlice,405,406,0
+block_hint,ArrayPrototypeSlice,446,447,0
+block_hint,ArrayPrototypeSlice,426,427,0
+block_hint,ArrayPrototypeSlice,401,402,1
+block_hint,ArrayPrototypeSlice,479,480,0
+block_hint,ArrayPrototypeSlice,465,466,0
+block_hint,ArrayPrototypeSlice,454,455,0
+block_hint,ArrayPrototypeSlice,424,425,0
+block_hint,ArrayPrototypeSlice,422,423,0
+block_hint,ArrayPrototypeSlice,393,394,1
+block_hint,ArrayPrototypeSlice,332,333,0
+block_hint,ArrayPrototypeSlice,277,278,1
+block_hint,ArrayPrototypeSlice,257,258,0
+block_hint,ArrayPrototypeSlice,89,90,1
+block_hint,ArrayPrototypeSlice,20,21,1
+block_hint,ArrayPrototypeSlice,128,129,1
+block_hint,ArrayPrototypeSlice,66,67,0
+block_hint,ArrayPrototypeSlice,443,444,0
+block_hint,ArrayPrototypeSlice,386,387,0
+block_hint,ArrayPrototypeSlice,364,365,0
+block_hint,ArrayPrototypeSlice,384,385,0
+block_hint,ArrayPrototypeSlice,362,363,0
+block_hint,ArrayPrototypeSlice,344,345,1
+block_hint,ArrayPrototypeSlice,437,438,0
+block_hint,ArrayPrototypeSlice,413,414,0
+block_hint,ArrayPrototypeSlice,388,389,0
+block_hint,ArrayPrototypeSlice,360,361,0
+block_hint,ArrayPrototypeSlice,340,341,1
+block_hint,ArrayPrototypeSlice,309,310,0
+block_hint,ArrayPrototypeSlice,296,297,0
+block_hint,ArrayPrototypeSlice,284,285,0
+block_hint,ArrayPrototypeSlice,261,262,0
+block_hint,ArrayPrototypeSlice,238,239,1
+block_hint,ArrayPrototypeSlice,141,142,0
+block_hint,ArrayPrototypeSlice,143,144,0
+block_hint,ArrayPrototypeSlice,190,191,1
+block_hint,ArrayPrototypeSlice,211,212,0
+block_hint,ArrayPrototypeSlice,91,92,1
+block_hint,ArrayPrototypeSlice,22,23,1
+block_hint,ArrayPrototypeSlice,197,198,1
+block_hint,ArrayPrototypeSlice,134,135,0
+block_hint,ArrayPrototypeSlice,69,70,0
+block_hint,ArrayPrototypeSlice,93,94,1
+block_hint,ArrayPrototypeSlice,24,25,1
+block_hint,ArrayPrototypeSlice,95,96,1
+block_hint,ArrayPrototypeSlice,26,27,1
+block_hint,ArrayPrototypeSlice,28,29,1
+block_hint,ArrayPrototypeSlice,99,100,1
+block_hint,ArrayPrototypeSlice,42,43,1
+block_hint,ArrayPrototypeSlice,145,146,1
+block_hint,ArrayPrototypeSlice,174,175,0
+block_hint,ArrayPrototypeSlice,176,177,1
+block_hint,ArrayPrototypeSlice,157,158,0
+block_hint,ArrayPrototypeSlice,101,102,0
+block_hint,ArrayPrototypeSlice,32,33,1
+block_hint,ArrayPrototypeSlice,250,251,1
+block_hint,ArrayPrototypeSlice,221,222,1
+block_hint,ArrayPrototypeSlice,118,119,1
+block_hint,ArrayPrototypeSlice,57,58,0
+block_hint,ArrayPrototypeSlice,59,60,1
+block_hint,ArrayPrototypeSlice,75,76,1
+block_hint,ArrayPrototypeSlice,103,104,0
+block_hint,ArrayPrototypeSlice,232,233,0
+block_hint,ArrayPrototypeSlice,164,165,1
+block_hint,ArrayPrototypeSlice,71,72,0
+block_hint,ArrayPrototypeSlice,178,179,0
+block_hint,ArrayPrototypeSlice,160,161,0
+block_hint,ArrayPrototypeSlice,109,110,0
+block_hint,ArrayPrototypeSlice,44,45,1
+block_hint,ArrayPrototypeSlice,248,249,1
+block_hint,ArrayPrototypeSlice,217,218,1
+block_hint,ArrayPrototypeSlice,116,117,1
+block_hint,ArrayPrototypeSlice,49,50,0
+block_hint,ArrayPrototypeSlice,136,137,0
+block_hint,ArrayPrototypeSlice,73,74,0
+block_hint,ArraySome,88,89,1
+block_hint,ArraySome,31,32,0
+block_hint,ArraySome,122,123,1
+block_hint,ArraySome,116,117,1
+block_hint,ArraySome,93,94,1
+block_hint,ArraySome,95,96,1
+block_hint,ArraySome,101,102,1
+block_hint,ArraySome,120,121,0
+block_hint,ArraySome,108,109,1
+block_hint,ArraySome,110,111,1
+block_hint,ArraySome,99,100,1
+block_hint,ArraySome,56,57,0
+block_hint,ArraySome,105,106,1
+block_hint,ArraySome,77,78,1
+block_hint,ArraySome,52,53,1
+block_hint,ArraySome,13,14,1
+block_hint,ArraySome,62,63,1
+block_hint,ArraySome,27,28,0
+block_hint,ArraySome,79,80,1
+block_hint,ArraySome,81,82,0
+block_hint,ArraySome,58,59,0
+block_hint,ArraySome,54,55,0
+block_hint,ArraySome,19,20,0
+block_hint,ArraySome,21,22,1
+block_hint,ArraySome,66,67,0
+block_hint,ArrayPrototypeSplice,605,606,1
+block_hint,ArrayPrototypeSplice,450,451,1
+block_hint,ArrayPrototypeSplice,452,453,1
+block_hint,ArrayPrototypeSplice,1201,1202,0
+block_hint,ArrayPrototypeSplice,1183,1184,0
+block_hint,ArrayPrototypeSplice,1159,1160,0
+block_hint,ArrayPrototypeSplice,1138,1139,0
+block_hint,ArrayPrototypeSplice,1104,1105,0
+block_hint,ArrayPrototypeSplice,1072,1073,0
+block_hint,ArrayPrototypeSplice,1031,1032,0
+block_hint,ArrayPrototypeSplice,1102,1103,0
+block_hint,ArrayPrototypeSplice,1070,1071,0
+block_hint,ArrayPrototypeSplice,1027,1028,1
+block_hint,ArrayPrototypeSplice,940,941,1
+block_hint,ArrayPrototypeSplice,1093,1094,0
+block_hint,ArrayPrototypeSplice,1226,1227,0
+block_hint,ArrayPrototypeSplice,1218,1219,0
+block_hint,ArrayPrototypeSplice,1205,1206,0
+block_hint,ArrayPrototypeSplice,1193,1194,1
+block_hint,ArrayPrototypeSplice,1162,1163,0
+block_hint,ArrayPrototypeSplice,1142,1143,0
+block_hint,ArrayPrototypeSplice,1121,1122,0
+block_hint,ArrayPrototypeSplice,1078,1079,0
+block_hint,ArrayPrototypeSplice,1038,1039,0
+block_hint,ArrayPrototypeSplice,1076,1077,0
+block_hint,ArrayPrototypeSplice,1036,1037,0
+block_hint,ArrayPrototypeSplice,987,988,1
+block_hint,ArrayPrototypeSplice,877,878,0
+block_hint,ArrayPrototypeSplice,842,843,0
+block_hint,ArrayPrototypeSplice,810,811,0
+block_hint,ArrayPrototypeSplice,731,732,0
+block_hint,ArrayPrototypeSplice,677,678,0
+block_hint,ArrayPrototypeSplice,607,608,0
+block_hint,ArrayPrototypeSplice,511,512,1
+block_hint,ArrayPrototypeSplice,456,457,0
+block_hint,ArrayPrototypeSplice,223,224,0
+block_hint,ArrayPrototypeSplice,332,333,0
+block_hint,ArrayPrototypeSplice,334,335,0
+block_hint,ArrayPrototypeSplice,336,337,0
+block_hint,ArrayPrototypeSplice,225,226,1
+block_hint,ArrayPrototypeSplice,51,52,1
+block_hint,ArrayPrototypeSplice,338,339,1
+block_hint,ArrayPrototypeSplice,340,341,0
+block_hint,ArrayPrototypeSplice,342,343,0
+block_hint,ArrayPrototypeSplice,387,388,1
+block_hint,ArrayPrototypeSplice,227,228,0
+block_hint,ArrayPrototypeSplice,53,54,1
+block_hint,ArrayPrototypeSplice,244,245,0
+block_hint,ArrayPrototypeSplice,93,94,1
+block_hint,ArrayPrototypeSplice,556,557,0
+block_hint,ArrayPrototypeSplice,400,401,0
+block_hint,ArrayPrototypeSplice,590,591,0
+block_hint,ArrayPrototypeSplice,528,529,1
+block_hint,ArrayPrototypeSplice,345,346,0
+block_hint,ArrayPrototypeSplice,347,348,1
+block_hint,ArrayPrototypeSplice,235,236,0
+block_hint,ArrayPrototypeSplice,258,259,1
+block_hint,ArrayPrototypeSplice,105,106,0
+block_hint,ArrayPrototypeSplice,229,230,0
+block_hint,ArrayPrototypeSplice,329,330,0
+block_hint,ArrayPrototypeSplice,327,328,0
+block_hint,ArrayPrototypeSplice,391,392,1
+block_hint,ArrayPrototypeSplice,65,66,1
+block_hint,ArrayPrototypeSplice,294,295,1
+block_hint,ArrayPrototypeSplice,143,144,0
+block_hint,ArrayPrototypeSplice,67,68,0
+block_hint,ArrayPrototypeSplice,69,70,0
+block_hint,ArrayPrototypeSplice,263,264,1
+block_hint,ArrayPrototypeSplice,178,179,1
+block_hint,ArrayPrototypeSplice,325,326,0
+block_hint,ArrayPrototypeSplice,425,426,1
+block_hint,ArrayPrototypeSplice,265,266,0
+block_hint,ArrayPrototypeSplice,111,112,0
+block_hint,ArrayPrototypeSplice,427,428,0
+block_hint,ArrayPrototypeSplice,267,268,0
+block_hint,ArrayPrototypeSplice,113,114,0
+block_hint,ArrayPrototypeSplice,115,116,0
+block_hint,ArrayPrototypeSplice,182,183,0
+block_hint,ArrayPrototypeSplice,63,64,1
+block_hint,ArrayPrototypeSplice,131,132,1
+block_hint,ArrayPrototypeSplice,296,297,0
+block_hint,ArrayPrototypeSplice,71,72,1
+block_hint,ArrayPrototypeUnshift,186,187,1
+block_hint,ArrayPrototypeUnshift,157,158,1
+block_hint,ArrayPrototypeUnshift,141,142,1
+block_hint,ArrayPrototypeUnshift,96,97,1
+block_hint,ArrayPrototypeUnshift,55,56,1
+block_hint,ArrayPrototypeUnshift,10,11,1
+block_hint,ArrayPrototypeUnshift,128,129,1
+block_hint,ArrayPrototypeUnshift,98,99,0
+block_hint,ArrayPrototypeUnshift,57,58,0
+block_hint,ArrayPrototypeUnshift,100,101,1
+block_hint,ArrayPrototypeUnshift,59,60,0
+block_hint,ArrayPrototypeUnshift,20,21,1
+block_hint,ArrayPrototypeUnshift,22,23,0
+block_hint,ArrayBufferPrototypeGetByteLength,15,16,1
+block_hint,ArrayBufferPrototypeGetByteLength,10,11,1
+block_hint,ArrayBufferPrototypeGetByteLength,12,13,1
+block_hint,ArrayBufferPrototypeGetByteLength,6,7,0
+block_hint,ArrayBufferPrototypeGetByteLength,4,5,0
+block_hint,ArrayBufferIsView,8,9,1
+block_hint,ArrayBufferIsView,5,6,1
+block_hint,ArrayBufferIsView,3,4,1
+block_hint,ToInteger,4,5,1
+block_hint,ToInteger,6,7,0
+block_hint,BooleanConstructor,81,82,1
+block_hint,BooleanConstructor,74,75,0
+block_hint,BooleanConstructor,57,58,0
+block_hint,BooleanConstructor,68,69,1
+block_hint,BooleanConstructor,59,60,0
+block_hint,BooleanConstructor,70,71,0
+block_hint,BooleanConstructor,51,52,0
+block_hint,BooleanConstructor,7,8,1
+block_hint,ToString,20,21,0
+block_hint,ToString,34,35,0
+block_hint,ToString,67,68,0
+block_hint,ToString,83,84,0
+block_hint,ToString,25,26,1
+block_hint,ToString,50,51,1
+block_hint,ToString,54,55,0
+block_hint,StringPrototypeToString,9,10,1
+block_hint,StringPrototypeToString,11,12,1
+block_hint,StringPrototypeToString,7,8,0
+block_hint,StringPrototypeToString,5,6,1
+block_hint,StringPrototypeValueOf,9,10,1
+block_hint,StringPrototypeValueOf,11,12,1
+block_hint,StringPrototypeValueOf,5,6,1
+block_hint,StringPrototypeCharAt,51,52,1
+block_hint,StringPrototypeCharAt,37,38,1
+block_hint,StringPrototypeCharAt,28,29,1
+block_hint,StringPrototypeCharAt,33,34,0
+block_hint,StringPrototypeCharAt,12,13,0
+block_hint,StringPrototypeCharAt,14,15,0
+block_hint,StringPrototypeCharAt,19,20,1
+block_hint,StringPrototypeCharAt,43,44,0
+block_hint,StringPrototypeCharAt,6,7,1
+block_hint,StringPrototypeCharCodeAt,46,47,1
+block_hint,StringPrototypeCharCodeAt,41,42,1
+block_hint,StringPrototypeCharCodeAt,28,29,1
+block_hint,StringPrototypeCharCodeAt,39,40,0
+block_hint,StringPrototypeCharCodeAt,13,14,0
+block_hint,StringPrototypeCharCodeAt,15,16,0
+block_hint,StringPrototypeCharCodeAt,17,18,1
+block_hint,StringPrototypeCharCodeAt,32,33,0
+block_hint,StringPrototypeCodePointAt,79,80,1
+block_hint,StringPrototypeCodePointAt,53,54,1
+block_hint,StringPrototypeCodePointAt,43,44,1
+block_hint,StringPrototypeCodePointAt,51,52,0
+block_hint,StringPrototypeCodePointAt,20,21,0
+block_hint,StringPrototypeCodePointAt,22,23,0
+block_hint,StringPrototypeCodePointAt,8,9,0
+block_hint,StringPrototypeCodePointAt,65,66,0
+block_hint,StringPrototypeCodePointAt,45,46,0
+block_hint,StringPrototypeCodePointAt,14,15,1
+block_hint,StringPrototypeCodePointAt,16,17,1
+block_hint,StringPrototypeCodePointAt,10,11,0
+block_hint,StringPrototypeCodePointAt,72,73,0
+block_hint,StringPrototypeCodePointAt,48,49,0
+block_hint,StringPrototypeCodePointAt,18,19,1
+block_hint,StringConstructor,65,66,1
+block_hint,StringConstructor,49,50,1
+block_hint,StringConstructor,63,64,0
+block_hint,StringConstructor,36,37,0
+block_hint,StringConstructor,78,79,0
+block_hint,StringConstructor,83,84,1
+block_hint,StringConstructor,81,82,1
+block_hint,StringConstructor,75,76,1
+block_hint,StringConstructor,59,60,0
+block_hint,StringConstructor,61,62,1
+block_hint,StringConstructor,45,46,0
+block_hint,StringConstructor,24,25,0
+block_hint,StringConstructor,26,27,1
+block_hint,StringAddConvertLeft,47,48,1
+block_hint,StringAddConvertLeft,49,50,0
+block_hint,StringAddConvertLeft,82,83,1
+block_hint,StringAddConvertLeft,64,65,0
+block_hint,StringAddConvertLeft,43,44,0
+block_hint,StringAddConvertLeft,62,63,1
+block_hint,StringAddConvertRight,47,48,1
+block_hint,StringAddConvertRight,82,83,1
+block_hint,StringAddConvertRight,64,65,0
+block_hint,StringAddConvertRight,43,44,0
+block_hint,StringAddConvertRight,86,87,0
+block_hint,StringAddConvertRight,79,80,1
+block_hint,StringCharAt,27,28,0
+block_hint,StringCharAt,20,21,1
+block_hint,StringCharAt,5,6,1
+block_hint,FastNewFunctionContextFunction,11,12,1
+block_hint,FastNewFunctionContextFunction,4,5,1
+block_hint,FastNewFunctionContextFunction,6,7,0
+block_hint,CreateRegExpLiteral,6,7,0
+block_hint,CreateRegExpLiteral,8,9,1
+block_hint,CreateRegExpLiteral,10,11,1
+block_hint,CreateRegExpLiteral,2,3,1
+block_hint,CreateShallowArrayLiteral,20,21,1
+block_hint,CreateShallowArrayLiteral,22,23,1
+block_hint,CreateShallowArrayLiteral,35,36,1
+block_hint,CreateShallowArrayLiteral,11,12,0
+block_hint,CreateShallowArrayLiteral,43,44,1
+block_hint,CreateShallowArrayLiteral,39,40,1
+block_hint,CreateShallowArrayLiteral,24,25,0
+block_hint,CreateShallowArrayLiteral,13,14,0
+block_hint,CreateShallowArrayLiteral,15,16,1
+block_hint,CreateShallowArrayLiteral,46,47,1
+block_hint,CreateShallowArrayLiteral,48,49,0
+block_hint,CreateShallowArrayLiteral,30,31,1
+block_hint,CreateShallowArrayLiteral,5,6,1
+block_hint,CreateShallowArrayLiteral,18,19,1
+block_hint,CreateEmptyArrayLiteral,9,10,1
+block_hint,CreateEmptyArrayLiteral,3,4,1
+block_hint,CreateEmptyArrayLiteral,6,7,1
+block_hint,CreateShallowObjectLiteral,53,54,1
+block_hint,CreateShallowObjectLiteral,61,62,1
+block_hint,CreateShallowObjectLiteral,63,64,0
+block_hint,CreateShallowObjectLiteral,110,111,0
+block_hint,CreateShallowObjectLiteral,99,100,1
+block_hint,CreateShallowObjectLiteral,67,68,1
+block_hint,CreateShallowObjectLiteral,106,107,1
+block_hint,CreateShallowObjectLiteral,81,82,1
+block_hint,CreateShallowObjectLiteral,34,35,0
+block_hint,CreateShallowObjectLiteral,71,72,0
+block_hint,CreateShallowObjectLiteral,38,39,0
+block_hint,CreateShallowObjectLiteral,42,43,0
+block_hint,CreateShallowObjectLiteral,85,86,1
+block_hint,CreateShallowObjectLiteral,93,94,1
+block_hint,ObjectConstructor,27,28,1
+block_hint,ObjectConstructor,19,20,1
+block_hint,ObjectConstructor,29,30,0
+block_hint,ObjectConstructor,23,24,0
+block_hint,ObjectConstructor,17,18,0
+block_hint,ObjectConstructor,11,12,0
+block_hint,ObjectConstructor,4,5,1
+block_hint,ObjectConstructor,21,22,1
+block_hint,ObjectConstructor,6,7,0
+block_hint,CreateEmptyLiteralObject,4,5,1
+block_hint,CreateEmptyLiteralObject,11,12,1
+block_hint,CreateEmptyLiteralObject,6,7,0
+block_hint,NumberConstructor,18,19,1
+block_hint,NumberConstructor,6,7,1
+block_hint,NumberConstructor,28,29,0
+block_hint,NumberConstructor,12,13,0
+block_hint,NumberConstructor,34,35,0
+block_hint,NumberConstructor,32,33,1
+block_hint,NumberConstructor,30,31,1
+block_hint,NumberConstructor,2,3,1
+block_hint,NonNumberToNumber,14,15,0
+block_hint,NonNumberToNumber,3,4,1
+block_hint,NonNumberToNumeric,17,18,0
+block_hint,NonNumberToNumeric,14,15,0
+block_hint,NonNumberToNumeric,5,6,1
+block_hint,ToNumeric,5,6,1
+block_hint,ToNumeric,3,4,1
+block_hint,NumberToString,69,70,0
+block_hint,NumberToString,20,21,1
+block_hint,NumberToString,45,46,1
+block_hint,NumberToString,41,42,1
+block_hint,ToBoolean,18,19,1
+block_hint,ToBoolean,14,15,0
+block_hint,ToBoolean,20,21,0
+block_hint,ToBoolean,6,7,0
+block_hint,ToBooleanForBaselineJump,14,15,0
+block_hint,ToBooleanForBaselineJump,20,21,0
+block_hint,ToBooleanForBaselineJump,6,7,0
+block_hint,ToLength,19,20,0
+block_hint,ToLength,5,6,0
+block_hint,ToName,40,41,1
+block_hint,ToName,48,49,0
+block_hint,ToName,20,21,0
+block_hint,ToName,22,23,0
+block_hint,ToName,67,68,0
+block_hint,ToName,27,28,1
+block_hint,ToObject,45,46,1
+block_hint,ToObject,7,8,0
+block_hint,ToObject,38,39,1
+block_hint,ToObject,9,10,1
+block_hint,ToObject,53,54,0
+block_hint,ToObject,55,56,1
+block_hint,ToObject,48,49,0
+block_hint,ToObject,26,27,0
+block_hint,ToObject,28,29,1
+block_hint,NonPrimitiveToPrimitive_Default,5,6,1
+block_hint,NonPrimitiveToPrimitive_Number,5,6,1
+block_hint,NonPrimitiveToPrimitive_String,5,6,1
+block_hint,OrdinaryToPrimitive_Number,56,57,1
+block_hint,OrdinaryToPrimitive_Number,53,54,1
+block_hint,OrdinaryToPrimitive_Number,40,41,1
+block_hint,OrdinaryToPrimitive_Number,42,43,0
+block_hint,OrdinaryToPrimitive_Number,28,29,0
+block_hint,OrdinaryToPrimitive_Number,12,13,0
+block_hint,OrdinaryToPrimitive_Number,30,31,0
+block_hint,OrdinaryToPrimitive_Number,32,33,0
+block_hint,OrdinaryToPrimitive_Number,14,15,0
+block_hint,OrdinaryToPrimitive_Number,16,17,0
+block_hint,OrdinaryToPrimitive_Number,44,45,1
+block_hint,OrdinaryToPrimitive_Number,46,47,1
+block_hint,OrdinaryToPrimitive_Number,48,49,1
+block_hint,OrdinaryToPrimitive_Number,50,51,0
+block_hint,OrdinaryToPrimitive_Number,34,35,0
+block_hint,OrdinaryToPrimitive_Number,20,21,0
+block_hint,OrdinaryToPrimitive_String,56,57,1
+block_hint,OrdinaryToPrimitive_String,53,54,1
+block_hint,OrdinaryToPrimitive_String,40,41,1
+block_hint,OrdinaryToPrimitive_String,42,43,0
+block_hint,OrdinaryToPrimitive_String,28,29,0
+block_hint,OrdinaryToPrimitive_String,10,11,0
+block_hint,DataViewPrototypeGetByteLength,37,38,1
+block_hint,DataViewPrototypeGetByteLength,19,20,1
+block_hint,DataViewPrototypeGetByteLength,21,22,1
+block_hint,DataViewPrototypeGetByteLength,39,40,0
+block_hint,DataViewPrototypeGetByteLength,33,34,0
+block_hint,DataViewPrototypeGetByteLength,12,13,0
+block_hint,DataViewPrototypeGetByteLength,10,11,0
+block_hint,DataViewPrototypeGetFloat64,101,102,1
+block_hint,DataViewPrototypeGetFloat64,87,88,0
+block_hint,DataViewPrototypeGetFloat64,56,57,0
+block_hint,DataViewPrototypeGetFloat64,17,18,1
+block_hint,DataViewPrototypeGetFloat64,19,20,1
+block_hint,DataViewPrototypeGetFloat64,95,96,0
+block_hint,DataViewPrototypeGetFloat64,99,100,0
+block_hint,DataViewPrototypeGetFloat64,78,79,0
+block_hint,DataViewPrototypeGetFloat64,49,50,0
+block_hint,DataViewPrototypeGetFloat64,70,71,0
+block_hint,DataViewPrototypeGetFloat64,89,90,1
+block_hint,DataViewPrototypeGetFloat64,72,73,0
+block_hint,DataViewPrototypeGetFloat64,74,75,0
+block_hint,DataViewPrototypeGetFloat64,91,92,0
+block_hint,DataViewPrototypeGetFloat64,64,65,0
+block_hint,DataViewPrototypeGetFloat64,21,22,0
+block_hint,DataViewPrototypeGetFloat64,97,98,0
+block_hint,DataViewPrototypeGetFloat64,82,83,0
+block_hint,DataViewPrototypeGetFloat64,47,48,0
+block_hint,DataViewPrototypeGetFloat64,35,36,0
+block_hint,DataViewPrototypeGetFloat64,37,38,0
+block_hint,DataViewPrototypeGetFloat64,85,86,1
+block_hint,DataViewPrototypeGetFloat64,54,55,0
+block_hint,DataViewPrototypeGetFloat64,14,15,1
+block_hint,DataViewPrototypeSetFloat64,116,117,1
+block_hint,DataViewPrototypeSetFloat64,104,105,0
+block_hint,DataViewPrototypeSetFloat64,82,83,0
+block_hint,DataViewPrototypeSetFloat64,49,50,0
+block_hint,DataViewPrototypeSetFloat64,16,17,1
+block_hint,DataViewPrototypeSetFloat64,18,19,1
+block_hint,DataViewPrototypeSetFloat64,106,107,0
+block_hint,DataViewPrototypeSetFloat64,95,96,0
+block_hint,DataViewPrototypeSetFloat64,71,72,0
+block_hint,DataViewPrototypeSetFloat64,42,43,0
+block_hint,DataViewPrototypeSetFloat64,84,85,1
+block_hint,DataViewPrototypeSetFloat64,86,87,1
+block_hint,DataViewPrototypeSetFloat64,59,60,1
+block_hint,DataViewPrototypeSetFloat64,10,11,0
+block_hint,DataViewPrototypeSetFloat64,93,94,0
+block_hint,DataViewPrototypeSetFloat64,79,80,0
+block_hint,DataViewPrototypeSetFloat64,40,41,0
+block_hint,DataViewPrototypeSetFloat64,34,35,0
+block_hint,DataViewPrototypeSetFloat64,36,37,0
+block_hint,DataViewPrototypeSetFloat64,47,48,1
+block_hint,DataViewPrototypeSetFloat64,14,15,0
+block_hint,FunctionPrototypeHasInstance,35,36,1
+block_hint,FunctionPrototypeHasInstance,15,16,1
+block_hint,FunctionPrototypeHasInstance,17,18,1
+block_hint,FunctionPrototypeHasInstance,19,20,1
+block_hint,FunctionPrototypeHasInstance,33,34,1
+block_hint,FunctionPrototypeHasInstance,23,24,0
+block_hint,FunctionPrototypeHasInstance,13,14,0
+block_hint,FunctionPrototypeHasInstance,31,32,0
+block_hint,FunctionPrototypeHasInstance,25,26,0
+block_hint,FunctionPrototypeHasInstance,27,28,0
+block_hint,FastFunctionPrototypeBind,91,92,1
+block_hint,FastFunctionPrototypeBind,88,89,1
+block_hint,FastFunctionPrototypeBind,75,76,0
+block_hint,FastFunctionPrototypeBind,29,30,0
+block_hint,FastFunctionPrototypeBind,31,32,0
+block_hint,FastFunctionPrototypeBind,7,8,1
+block_hint,FastFunctionPrototypeBind,53,54,1
+block_hint,FastFunctionPrototypeBind,65,66,0
+block_hint,FastFunctionPrototypeBind,69,70,1
+block_hint,FastFunctionPrototypeBind,41,42,1
+block_hint,FastFunctionPrototypeBind,9,10,1
+block_hint,FastFunctionPrototypeBind,56,57,1
+block_hint,FastFunctionPrototypeBind,67,68,0
+block_hint,FastFunctionPrototypeBind,79,80,1
+block_hint,FastFunctionPrototypeBind,71,72,1
+block_hint,FastFunctionPrototypeBind,43,44,1
+block_hint,FastFunctionPrototypeBind,11,12,1
+block_hint,FastFunctionPrototypeBind,35,36,1
+block_hint,FastFunctionPrototypeBind,81,82,1
+block_hint,FastFunctionPrototypeBind,73,74,0
+block_hint,FastFunctionPrototypeBind,27,28,1
+block_hint,ForInNext,2,3,1
+block_hint,ForInNext,7,8,1
+block_hint,CallIteratorWithFeedback,56,57,1
+block_hint,CallIteratorWithFeedback,58,59,1
+block_hint,CallIteratorWithFeedback,26,27,1
+block_hint,CallIteratorWithFeedback,28,29,1
+block_hint,CallIteratorWithFeedback,30,31,1
+block_hint,CallIteratorWithFeedback,10,11,1
+block_hint,MathAbs,14,15,1
+block_hint,MathAbs,16,17,1
+block_hint,MathAbs,23,24,0
+block_hint,MathAbs,9,10,0
+block_hint,MathAbs,11,12,1
+block_hint,MathCeil,12,13,1
+block_hint,MathFloor,12,13,1
+block_hint,MathFloor,14,15,1
+block_hint,MathFloor,35,36,1
+block_hint,MathFloor,25,26,0
+block_hint,MathFloor,21,22,1
+block_hint,MathFloor,19,20,0
+block_hint,MathFloor,7,8,0
+block_hint,MathRound,12,13,1
+block_hint,MathRound,14,15,1
+block_hint,MathRound,32,33,0
+block_hint,MathRound,36,37,0
+block_hint,MathRound,28,29,0
+block_hint,MathRound,21,22,1
+block_hint,MathRound,7,8,0
+block_hint,MathRound,9,10,1
+block_hint,MathPow,12,13,1
+block_hint,MathPow,14,15,1
+block_hint,MathPow,18,19,1
+block_hint,MathPow,23,24,0
+block_hint,MathPow,7,8,0
+block_hint,MathPow,9,10,1
+block_hint,MathMax,13,14,1
+block_hint,MathMax,19,20,0
+block_hint,MathMax,17,18,1
+block_hint,MathMax,24,25,0
+block_hint,MathMax,8,9,0
+block_hint,MathMax,10,11,1
+block_hint,MathMin,13,14,1
+block_hint,MathMin,19,20,0
+block_hint,MathMin,17,18,1
+block_hint,MathMin,24,25,0
+block_hint,MathMin,8,9,0
+block_hint,MathMin,10,11,1
+block_hint,MathAtan2,34,35,1
+block_hint,MathAtan2,32,33,1
+block_hint,MathAtan2,23,24,1
+block_hint,MathAtan2,5,6,1
+block_hint,MathCos,25,26,1
+block_hint,MathCos,23,24,1
+block_hint,MathCos,9,10,1
+block_hint,MathCos,3,4,0
+block_hint,MathCos,5,6,1
+block_hint,MathExp,25,26,1
+block_hint,MathExp,20,21,1
+block_hint,MathExp,23,24,1
+block_hint,MathExp,16,17,1
+block_hint,MathExp,13,14,0
+block_hint,MathExp,5,6,1
+block_hint,MathFround,25,26,1
+block_hint,MathFround,23,24,1
+block_hint,MathFround,5,6,1
+block_hint,MathLog,25,26,1
+block_hint,MathLog,23,24,1
+block_hint,MathLog,13,14,0
+block_hint,MathLog,5,6,1
+block_hint,MathSin,25,26,1
+block_hint,MathSin,23,24,1
+block_hint,MathSin,9,10,0
+block_hint,MathSin,11,12,0
+block_hint,MathSin,3,4,0
+block_hint,MathSin,5,6,1
+block_hint,MathSign,16,17,1
+block_hint,MathSign,11,12,0
+block_hint,MathSign,7,8,0
+block_hint,MathSign,2,3,0
+block_hint,MathSign,4,5,1
+block_hint,MathSqrt,25,26,1
+block_hint,MathSqrt,23,24,1
+block_hint,MathSqrt,11,12,0
+block_hint,MathSqrt,3,4,0
+block_hint,MathSqrt,5,6,1
+block_hint,MathTan,25,26,1
+block_hint,MathTan,20,21,0
+block_hint,MathTan,16,17,0
+block_hint,MathTanh,25,26,1
+block_hint,MathTanh,20,21,1
+block_hint,MathTanh,23,24,1
+block_hint,MathTanh,16,17,1
+block_hint,MathTanh,13,14,0
+block_hint,MathTanh,5,6,1
+block_hint,MathRandom,15,16,1
+block_hint,MathRandom,3,4,1
+block_hint,MathRandom,17,18,1
+block_hint,MathRandom,5,6,1
+block_hint,MathRandom,7,8,1
+block_hint,MathRandom,9,10,1
+block_hint,MathRandom,13,14,1
+block_hint,NumberPrototypeToString,71,72,1
+block_hint,NumberPrototypeToString,113,114,0
+block_hint,NumberPrototypeToString,51,52,0
+block_hint,NumberPrototypeToString,59,60,1
+block_hint,NumberPrototypeToString,183,184,0
+block_hint,NumberPrototypeToString,154,155,0
+block_hint,NumberPrototypeToString,121,122,0
+block_hint,NumberPrototypeToString,180,181,0
+block_hint,NumberPrototypeToString,167,168,0
+block_hint,NumberPrototypeToString,85,86,0
+block_hint,NumberPrototypeToString,176,177,0
+block_hint,NumberPrototypeToString,97,98,0
+block_hint,NumberPrototypeToString,171,172,0
+block_hint,NumberPrototypeToString,129,130,0
+block_hint,NumberPrototypeToString,109,110,1
+block_hint,NumberPrototypeToString,42,43,1
+block_hint,NumberPrototypeToString,49,50,1
+block_hint,NumberPrototypeToString,73,74,0
+block_hint,NumberPrototypeToString,27,28,0
+block_hint,NumberPrototypeToString,116,117,1
+block_hint,NumberPrototypeToString,75,76,1
+block_hint,NumberPrototypeToString,29,30,1
+block_hint,NumberPrototypeToString,95,96,0
+block_hint,NumberPrototypeToString,111,112,0
+block_hint,NumberPrototypeToString,35,36,1
+block_hint,NumberPrototypeToString,132,133,1
+block_hint,NumberPrototypeToString,37,38,0
+block_hint,NumberPrototypeToString,134,135,1
+block_hint,NumberPrototypeToString,39,40,0
+block_hint,NumberPrototypeToString,162,163,1
+block_hint,NumberPrototypeToString,164,165,0
+block_hint,NumberPrototypeToString,139,140,0
+block_hint,NumberPrototypeToString,105,106,1
+block_hint,NumberIsInteger,13,14,1
+block_hint,NumberParseFloat,14,15,1
+block_hint,NumberParseFloat,2,3,1
+block_hint,NumberParseFloat,12,13,0
+block_hint,NumberParseFloat,17,18,0
+block_hint,NumberParseFloat,4,5,1
+block_hint,ParseInt,27,28,1
+block_hint,ParseInt,13,14,0
+block_hint,ParseInt,6,7,1
+block_hint,ParseInt,31,32,0
+block_hint,ParseInt,25,26,1
+block_hint,ParseInt,23,24,1
+block_hint,ParseInt,10,11,0
+block_hint,NumberParseInt,3,4,1
+block_hint,Add,66,67,1
+block_hint,Add,24,25,0
+block_hint,Add,52,53,1
+block_hint,Add,68,69,0
+block_hint,Add,35,36,0
+block_hint,Add,40,41,0
+block_hint,Add,70,71,1
+block_hint,Add,26,27,0
+block_hint,Add,29,30,1
+block_hint,Subtract,24,25,0
+block_hint,Subtract,9,10,0
+block_hint,Subtract,22,23,0
+block_hint,Subtract,7,8,0
+block_hint,Divide,50,51,0
+block_hint,Divide,23,24,0
+block_hint,Divide,9,10,0
+block_hint,Divide,44,45,1
+block_hint,Divide,48,49,1
+block_hint,Divide,33,34,0
+block_hint,Divide,7,8,1
+block_hint,CreateObjectWithoutProperties,52,53,1
+block_hint,CreateObjectWithoutProperties,42,43,1
+block_hint,CreateObjectWithoutProperties,34,35,0
+block_hint,CreateObjectWithoutProperties,17,18,1
+block_hint,CreateObjectWithoutProperties,56,57,0
+block_hint,CreateObjectWithoutProperties,44,45,0
+block_hint,CreateObjectWithoutProperties,48,49,1
+block_hint,CreateObjectWithoutProperties,36,37,0
+block_hint,CreateObjectWithoutProperties,38,39,0
+block_hint,CreateObjectWithoutProperties,5,6,1
+block_hint,CreateObjectWithoutProperties,40,41,1
+block_hint,CreateObjectWithoutProperties,7,8,1
+block_hint,CreateObjectWithoutProperties,9,10,1
+block_hint,CreateObjectWithoutProperties,11,12,1
+block_hint,CreateObjectWithoutProperties,13,14,1
+block_hint,CreateObjectWithoutProperties,15,16,1
+block_hint,CreateObjectWithoutProperties,20,21,0
+block_hint,CreateObjectWithoutProperties,50,51,1
+block_hint,ObjectGetPrototypeOf,11,12,1
+block_hint,ObjectGetPrototypeOf,8,9,1
+block_hint,ObjectGetPrototypeOf,5,6,1
+block_hint,ObjectGetPrototypeOf,2,3,0
+block_hint,ObjectSetPrototypeOf,18,19,1
+block_hint,ObjectSetPrototypeOf,4,5,0
+block_hint,ObjectSetPrototypeOf,13,14,1
+block_hint,ObjectSetPrototypeOf,20,21,0
+block_hint,ObjectSetPrototypeOf,15,16,0
+block_hint,ObjectSetPrototypeOf,6,7,1
+block_hint,ObjectSetPrototypeOf,8,9,0
+block_hint,ObjectSetPrototypeOf,10,11,0
+block_hint,ObjectPrototypeToString,3,4,1
+block_hint,ObjectPrototypeValueOf,8,9,1
+block_hint,ObjectPrototypeValueOf,5,6,1
+block_hint,ObjectPrototypeValueOf,2,3,1
+block_hint,FulfillPromise,32,33,1
+block_hint,FulfillPromise,15,16,0
+block_hint,FulfillPromise,34,35,1
+block_hint,FulfillPromise,17,18,0
+block_hint,FulfillPromise,19,20,1
+block_hint,FulfillPromise,21,22,0
+block_hint,PerformPromiseThen,101,102,1
+block_hint,PerformPromiseThen,57,58,0
+block_hint,PerformPromiseThen,103,104,1
+block_hint,PerformPromiseThen,59,60,0
+block_hint,PerformPromiseThen,61,62,1
+block_hint,PerformPromiseThen,63,64,0
+block_hint,PerformPromiseThen,18,19,1
+block_hint,PerformPromiseThen,72,73,1
+block_hint,PerformPromiseThen,25,26,1
+block_hint,PerformPromiseThen,93,94,1
+block_hint,PerformPromiseThen,45,46,0
+block_hint,PerformPromiseThen,95,96,1
+block_hint,PerformPromiseThen,47,48,0
+block_hint,PerformPromiseThen,49,50,1
+block_hint,PerformPromiseThen,51,52,0
+block_hint,PerformPromiseThen,20,21,1
+block_hint,PerformPromiseThen,115,116,1
+block_hint,PromiseFulfillReactionJob,22,23,0
+block_hint,PromiseFulfillReactionJob,2,3,1
+block_hint,ResolvePromise,29,30,0
+block_hint,ResolvePromise,31,32,0
+block_hint,ResolvePromise,15,16,1
+block_hint,ResolvePromise,47,48,0
+block_hint,ResolvePromise,33,34,0
+block_hint,ResolvePromise,6,7,1
+block_hint,ResolvePromise,17,18,0
+block_hint,ResolvePromise,19,20,1
+block_hint,ResolvePromise,53,54,1
+block_hint,ResolvePromise,49,50,0
+block_hint,ResolvePromise,23,24,0
+block_hint,ProxyConstructor,30,31,1
+block_hint,ProxyConstructor,10,11,0
+block_hint,ProxyConstructor,22,23,1
+block_hint,ProxyConstructor,24,25,0
+block_hint,ProxyConstructor,26,27,1
+block_hint,ProxyConstructor,28,29,0
+block_hint,ProxyConstructor,7,8,1
+block_hint,ProxyConstructor,17,18,1
+block_hint,ProxyConstructor,5,6,1
+block_hint,ProxyConstructor,12,13,1
+block_hint,ProxyGetProperty,153,154,1
+block_hint,ProxyGetProperty,34,35,0
+block_hint,ProxyGetProperty,10,11,0
+block_hint,ProxyGetProperty,89,90,0
+block_hint,ProxyGetProperty,91,92,0
+block_hint,ProxyGetProperty,85,86,1
+block_hint,ProxyGetProperty,87,88,1
+block_hint,ProxyGetProperty,176,177,1
+block_hint,ProxyGetProperty,180,181,0
+block_hint,ProxyGetProperty,118,119,0
+block_hint,ProxyGetProperty,40,41,1
+block_hint,ProxyGetProperty,114,115,1
+block_hint,ProxyGetProperty,24,25,1
+block_hint,ProxyGetProperty,26,27,0
+block_hint,ProxyGetProperty,208,209,1
+block_hint,ProxyGetProperty,198,199,0
+block_hint,ProxyGetProperty,149,150,1
+block_hint,ProxyGetProperty,28,29,0
+block_hint,ProxyGetProperty,167,168,0
+block_hint,ProxyGetProperty,187,188,1
+block_hint,ProxyGetProperty,131,132,1
+block_hint,ProxyGetProperty,169,170,1
+block_hint,ProxyGetProperty,171,172,0
+block_hint,ProxyGetProperty,60,61,0
+block_hint,ReflectGet,20,21,1
+block_hint,ReflectGet,15,16,0
+block_hint,ReflectGet,5,6,1
+block_hint,ReflectGet,7,8,0
+block_hint,ReflectGet,18,19,0
+block_hint,ReflectGet,9,10,0
+block_hint,ReflectHas,8,9,1
+block_hint,ReflectHas,5,6,1
+block_hint,ReflectHas,3,4,0
+block_hint,RegExpPrototypeExec,204,205,1
+block_hint,RegExpPrototypeExec,130,131,1
+block_hint,RegExpPrototypeExec,132,133,1
+block_hint,RegExpPrototypeExec,206,207,1
+block_hint,RegExpPrototypeExec,166,167,1
+block_hint,RegExpPrototypeExec,16,17,1
+block_hint,RegExpPrototypeExec,148,149,1
+block_hint,RegExpPrototypeExec,150,151,0
+block_hint,RegExpPrototypeExec,152,153,0
+block_hint,RegExpPrototypeExec,227,228,0
+block_hint,RegExpPrototypeExec,213,214,0
+block_hint,RegExpPrototypeExec,154,155,0
+block_hint,RegExpPrototypeExec,18,19,1
+block_hint,RegExpPrototypeExec,185,186,0
+block_hint,RegExpPrototypeExec,134,135,0
+block_hint,RegExpPrototypeExec,159,160,0
+block_hint,RegExpPrototypeExec,118,119,1
+block_hint,RegExpPrototypeExec,242,243,0
+block_hint,RegExpPrototypeExec,257,258,1
+block_hint,RegExpPrototypeExec,233,234,1
+block_hint,RegExpPrototypeExec,222,223,1
+block_hint,RegExpPrototypeExec,171,172,0
+block_hint,RegExpPrototypeExec,161,162,0
+block_hint,RegExpPrototypeExec,73,74,1
+block_hint,RegExpPrototypeExec,24,25,1
+block_hint,RegExpPrototypeExec,138,139,0
+block_hint,RegExpPrototypeExec,26,27,1
+block_hint,RegExpPrototypeExec,190,191,1
+block_hint,RegExpPrototypeExec,140,141,1
+block_hint,RegExpPrototypeExec,248,249,1
+block_hint,RegExpPrototypeExec,217,218,0
+block_hint,RegExpPrototypeExec,179,180,0
+block_hint,RegExpPrototypeExec,77,78,0
+block_hint,RegExpPrototypeExec,34,35,1
+block_hint,RegExpPrototypeExec,144,145,1
+block_hint,RegExpPrototypeExec,116,117,0
+block_hint,RegExpPrototypeExec,156,157,0
+block_hint,RegExpMatchFast,359,360,0
+block_hint,RegExpMatchFast,289,290,0
+block_hint,RegExpMatchFast,32,33,1
+block_hint,RegExpMatchFast,326,327,0
+block_hint,RegExpMatchFast,234,235,0
+block_hint,RegExpMatchFast,283,284,0
+block_hint,RegExpMatchFast,460,461,0
+block_hint,RegExpMatchFast,442,443,1
+block_hint,RegExpMatchFast,415,416,1
+block_hint,RegExpMatchFast,291,292,0
+block_hint,RegExpMatchFast,285,286,0
+block_hint,RegExpMatchFast,129,130,1
+block_hint,RegExpMatchFast,236,237,0
+block_hint,RegExpMatchFast,238,239,0
+block_hint,RegExpMatchFast,40,41,1
+block_hint,RegExpMatchFast,331,332,1
+block_hint,RegExpMatchFast,240,241,1
+block_hint,RegExpMatchFast,468,469,1
+block_hint,RegExpMatchFast,396,397,0
+block_hint,RegExpMatchFast,320,321,0
+block_hint,RegExpMatchFast,133,134,0
+block_hint,RegExpMatchFast,48,49,1
+block_hint,RegExpMatchFast,244,245,1
+block_hint,RegExpMatchFast,180,181,0
+block_hint,RegExpMatchFast,259,260,0
+block_hint,RegExpMatchFast,297,298,0
+block_hint,RegExpMatchFast,82,83,1
+block_hint,RegExpMatchFast,84,85,1
+block_hint,RegExpMatchFast,301,302,1
+block_hint,RegExpMatchFast,346,347,0
+block_hint,RegExpMatchFast,444,445,0
+block_hint,RegExpMatchFast,401,402,0
+block_hint,RegExpMatchFast,299,300,0
+block_hint,RegExpMatchFast,86,87,1
+block_hint,RegExpMatchFast,340,341,0
+block_hint,RegExpMatchFast,248,249,0
+block_hint,RegExpMatchFast,275,276,0
+block_hint,RegExpMatchFast,190,191,1
+block_hint,RegExpMatchFast,462,463,0
+block_hint,RegExpMatchFast,480,481,1
+block_hint,RegExpMatchFast,448,449,1
+block_hint,RegExpMatchFast,413,414,1
+block_hint,RegExpMatchFast,303,304,0
+block_hint,RegExpMatchFast,277,278,0
+block_hint,RegExpMatchFast,117,118,1
+block_hint,RegExpMatchFast,342,343,0
+block_hint,RegExpMatchFast,250,251,1
+block_hint,RegExpMatchFast,92,93,1
+block_hint,RegExpMatchFast,366,367,1
+block_hint,RegExpMatchFast,252,253,0
+block_hint,RegExpMatchFast,102,103,1
+block_hint,RegExpMatchFast,306,307,1
+block_hint,RegExpMatchFast,177,178,0
+block_hint,RegExpMatchFast,104,105,0
+block_hint,RegExpMatchFast,106,107,0
+block_hint,RegExpMatchFast,198,199,1
+block_hint,RegExpMatchFast,317,318,0
+block_hint,RegExpMatchFast,108,109,1
+block_hint,RegExpMatchFast,187,188,1
+block_hint,RegExpMatchFast,348,349,1
+block_hint,RegExpMatchFast,94,95,1
+block_hint,RegExpMatchFast,96,97,1
+block_hint,RegExpMatchFast,175,176,0
+block_hint,RegExpMatchFast,98,99,0
+block_hint,RegExpMatchFast,100,101,0
+block_hint,RegExpMatchFast,218,219,1
+block_hint,RegExpMatchFast,309,310,0
+block_hint,RegExpMatchFast,220,221,0
+block_hint,RegExpReplace,263,264,1
+block_hint,RegExpReplace,298,299,1
+block_hint,RegExpReplace,251,252,1
+block_hint,RegExpReplace,149,150,0
+block_hint,RegExpReplace,22,23,1
+block_hint,RegExpReplace,209,210,1
+block_hint,RegExpReplace,151,152,0
+block_hint,RegExpReplace,24,25,1
+block_hint,RegExpReplace,211,212,1
+block_hint,RegExpReplace,213,214,1
+block_hint,RegExpReplace,172,173,1
+block_hint,RegExpReplace,179,180,0
+block_hint,RegExpReplace,259,260,0
+block_hint,RegExpReplace,349,350,0
+block_hint,RegExpReplace,50,51,1
+block_hint,RegExpReplace,229,230,0
+block_hint,RegExpReplace,163,164,0
+block_hint,RegExpReplace,183,184,0
+block_hint,RegExpReplace,109,110,1
+block_hint,RegExpReplace,381,382,0
+block_hint,RegExpReplace,386,387,1
+block_hint,RegExpReplace,353,354,1
+block_hint,RegExpReplace,317,318,1
+block_hint,RegExpReplace,203,204,0
+block_hint,RegExpReplace,185,186,0
+block_hint,RegExpReplace,81,82,1
+block_hint,RegExpReplace,56,57,1
+block_hint,RegExpReplace,58,59,1
+block_hint,RegExpReplace,60,61,1
+block_hint,RegExpReplace,167,168,0
+block_hint,RegExpReplace,62,63,1
+block_hint,RegExpReplace,233,234,1
+block_hint,RegExpReplace,169,170,0
+block_hint,RegExpReplace,64,65,1
+block_hint,RegExpReplace,388,389,1
+block_hint,RegExpReplace,378,379,1
+block_hint,RegExpReplace,330,331,0
+block_hint,RegExpReplace,286,287,0
+block_hint,RegExpReplace,218,219,0
+block_hint,RegExpReplace,100,101,1
+block_hint,RegExpReplace,26,27,1
+block_hint,RegExpReplace,28,29,1
+block_hint,RegExpReplace,102,103,1
+block_hint,RegExpReplace,30,31,0
+block_hint,RegExpReplace,32,33,1
+block_hint,RegExpReplace,34,35,1
+block_hint,RegExpReplace,72,73,1
+block_hint,RegExpReplace,44,45,1
+block_hint,RegExpReplace,161,162,1
+block_hint,RegExpReplace,46,47,1
+block_hint,RegExpReplace,48,49,1
+block_hint,RegExpReplace,236,237,1
+block_hint,RegExpReplace,176,177,1
+block_hint,RegExpReplace,153,154,1
+block_hint,RegExpReplace,36,37,1
+block_hint,RegExpReplace,155,156,1
+block_hint,RegExpReplace,40,41,0
+block_hint,RegExpReplace,254,255,1
+block_hint,RegExpReplace,196,197,1
+block_hint,RegExpReplace,42,43,1
+block_hint,RegExpSearchFast,50,51,0
+block_hint,RegExpSearchFast,6,7,1
+block_hint,RegExpSearchFast,56,57,0
+block_hint,RegExpSearchFast,36,37,0
+block_hint,RegExpSearchFast,46,47,0
+block_hint,RegExpSearchFast,84,85,0
+block_hint,RegExpSearchFast,81,82,1
+block_hint,RegExpSearchFast,73,74,1
+block_hint,RegExpSearchFast,62,63,0
+block_hint,RegExpSearchFast,52,53,0
+block_hint,RegExpSearchFast,58,59,1
+block_hint,RegExpSearchFast,44,45,0
+block_hint,RegExpPrototypeSourceGetter,12,13,1
+block_hint,RegExpPrototypeSourceGetter,9,10,1
+block_hint,RegExpPrototypeSourceGetter,4,5,1
+block_hint,RegExpSplit,179,180,1
+block_hint,RegExpSplit,88,89,0
+block_hint,RegExpSplit,22,23,1
+block_hint,RegExpSplit,149,150,1
+block_hint,RegExpSplit,40,41,1
+block_hint,RegExpSplit,24,25,1
+block_hint,RegExpSplit,185,186,1
+block_hint,RegExpSplit,101,102,1
+block_hint,RegExpSplit,136,137,0
+block_hint,RegExpSplit,26,27,1
+block_hint,RegExpSplit,205,206,0
+block_hint,RegExpSplit,138,139,0
+block_hint,RegExpSplit,162,163,0
+block_hint,RegExpSplit,108,109,1
+block_hint,RegExpSplit,327,328,0
+block_hint,RegExpSplit,322,323,1
+block_hint,RegExpSplit,314,315,1
+block_hint,RegExpSplit,287,288,1
+block_hint,RegExpSplit,181,182,0
+block_hint,RegExpSplit,225,226,0
+block_hint,RegExpSplit,164,165,0
+block_hint,RegExpSplit,46,47,1
+block_hint,RegExpSplit,307,308,0
+block_hint,RegExpSplit,263,264,1
+block_hint,RegExpSplit,207,208,0
+block_hint,RegExpSplit,92,93,0
+block_hint,RegExpSplit,227,228,1
+block_hint,RegExpSplit,194,195,1
+block_hint,RegExpSplit,50,51,0
+block_hint,RegExpSplit,167,168,0
+block_hint,RegExpSplit,141,142,0
+block_hint,RegExpSplit,32,33,1
+block_hint,RegExpSplit,58,59,0
+block_hint,RegExpSplit,280,281,0
+block_hint,RegExpSplit,246,247,0
+block_hint,RegExpSplit,151,152,0
+block_hint,RegExpSplit,241,242,1
+block_hint,RegExpSplit,212,213,0
+block_hint,RegExpSplit,96,97,0
+block_hint,RegExpSplit,232,233,1
+block_hint,RegExpSplit,201,202,1
+block_hint,RegExpSplit,74,75,0
+block_hint,RegExpSplit,175,176,0
+block_hint,RegExpSplit,38,39,1
+block_hint,RegExpSplit,219,220,0
+block_hint,RegExpSplit,244,245,1
+block_hint,RegExpSplit,217,218,0
+block_hint,RegExpSplit,99,100,0
+block_hint,RegExpSplit,277,278,1
+block_hint,RegExpSplit,260,261,1
+block_hint,RegExpSplit,177,178,0
+block_hint,RegExpSplit,103,104,1
+block_hint,RegExpPrototypeTest,112,113,1
+block_hint,RegExpPrototypeTest,50,51,1
+block_hint,RegExpPrototypeTest,52,53,0
+block_hint,RegExpPrototypeTest,137,138,1
+block_hint,RegExpPrototypeTest,54,55,0
+block_hint,RegExpPrototypeTest,8,9,1
+block_hint,RegExpPrototypeTest,93,94,1
+block_hint,RegExpPrototypeTest,56,57,0
+block_hint,RegExpPrototypeTest,10,11,1
+block_hint,RegExpPrototypeTest,145,146,1
+block_hint,RegExpPrototypeTest,127,128,1
+block_hint,RegExpPrototypeTest,85,86,0
+block_hint,RegExpPrototypeTest,14,15,1
+block_hint,RegExpPrototypeTest,99,100,0
+block_hint,RegExpPrototypeTest,59,60,0
+block_hint,RegExpPrototypeTest,73,74,0
+block_hint,RegExpPrototypeTest,42,43,0
+block_hint,RegExpPrototypeTest,161,162,0
+block_hint,RegExpPrototypeTest,164,165,1
+block_hint,RegExpPrototypeTest,151,152,1
+block_hint,RegExpPrototypeTest,143,144,1
+block_hint,RegExpPrototypeTest,87,88,0
+block_hint,RegExpPrototypeTest,75,76,0
+block_hint,RegExpPrototypeTest,29,30,1
+block_hint,RegExpPrototypeTest,37,38,0
+block_hint,RegExpPrototypeTest,65,66,0
+block_hint,RegExpPrototypeTestFast,48,49,0
+block_hint,RegExpPrototypeTestFast,7,8,1
+block_hint,RegExpPrototypeTestFast,56,57,0
+block_hint,RegExpPrototypeTestFast,36,37,0
+block_hint,RegExpPrototypeTestFast,44,45,0
+block_hint,RegExpPrototypeTestFast,82,83,0
+block_hint,RegExpPrototypeTestFast,85,86,1
+block_hint,RegExpPrototypeTestFast,79,80,1
+block_hint,RegExpPrototypeTestFast,73,74,1
+block_hint,RegExpPrototypeTestFast,50,51,0
+block_hint,RegExpPrototypeTestFast,46,47,0
+block_hint,RegExpPrototypeTestFast,19,20,1
+block_hint,RegExpPrototypeTestFast,26,27,0
+block_hint,RegExpPrototypeTestFast,42,43,0
+block_hint,StringPrototypeEndsWith,288,289,1
+block_hint,StringPrototypeEndsWith,271,272,0
+block_hint,StringPrototypeEndsWith,251,252,1
+block_hint,StringPrototypeEndsWith,235,236,1
+block_hint,StringPrototypeEndsWith,174,175,1
+block_hint,StringPrototypeEndsWith,278,279,1
+block_hint,StringPrototypeEndsWith,267,268,1
+block_hint,StringPrototypeEndsWith,253,254,1
+block_hint,StringPrototypeEndsWith,244,245,1
+block_hint,StringPrototypeEndsWith,179,180,1
+block_hint,StringPrototypeEndsWith,29,30,0
+block_hint,StringPrototypeEndsWith,68,69,0
+block_hint,StringPrototypeEndsWith,70,71,0
+block_hint,StringPrototypeEndsWith,185,186,1
+block_hint,StringPrototypeEndsWith,84,85,0
+block_hint,StringPrototypeEndsWith,86,87,0
+block_hint,StringPrototypeEndsWith,164,165,0
+block_hint,StringPrototypeEndsWith,47,48,0
+block_hint,StringPrototypeEndsWith,144,145,0
+block_hint,StringPrototypeEndsWith,35,36,0
+block_hint,StringPrototypeEndsWith,49,50,0
+block_hint,StringPrototypeEndsWith,116,117,0
+block_hint,StringPrototypeIndexOf,39,40,1
+block_hint,StringPrototypeIndexOf,36,37,0
+block_hint,StringPrototypeIndexOf,19,20,1
+block_hint,StringPrototypeIndexOf,8,9,1
+block_hint,StringPrototypeIndexOf,28,29,1
+block_hint,StringPrototypeIndexOf,21,22,1
+block_hint,StringPrototypeIndexOf,33,34,0
+block_hint,StringPrototypeIndexOf,24,25,0
+block_hint,StringPrototypeIndexOf,11,12,0
+block_hint,StringPrototypeIterator,15,16,1
+block_hint,StringPrototypeIterator,12,13,1
+block_hint,StringPrototypeIterator,10,11,1
+block_hint,StringPrototypeIterator,3,4,1
+block_hint,StringPrototypeIterator,8,9,1
+block_hint,StringIteratorPrototypeNext,56,57,1
+block_hint,StringIteratorPrototypeNext,38,39,1
+block_hint,StringIteratorPrototypeNext,40,41,1
+block_hint,StringIteratorPrototypeNext,13,14,0
+block_hint,StringIteratorPrototypeNext,74,75,0
+block_hint,StringIteratorPrototypeNext,64,65,1
+block_hint,StringIteratorPrototypeNext,54,55,0
+block_hint,StringIteratorPrototypeNext,61,62,1
+block_hint,StringIteratorPrototypeNext,50,51,1
+block_hint,StringIteratorPrototypeNext,11,12,1
+block_hint,StringIteratorPrototypeNext,20,21,1
+block_hint,StringIteratorPrototypeNext,9,10,1
+block_hint,StringIteratorPrototypeNext,17,18,1
+block_hint,StringPrototypeMatch,67,68,1
+block_hint,StringPrototypeMatch,39,40,0
+block_hint,StringPrototypeMatch,99,100,1
+block_hint,StringPrototypeMatch,88,89,0
+block_hint,StringPrototypeMatch,69,70,1
+block_hint,StringPrototypeMatch,49,50,0
+block_hint,StringPrototypeMatch,6,7,1
+block_hint,StringPrototypeMatch,71,72,1
+block_hint,StringPrototypeMatch,51,52,0
+block_hint,StringPrototypeMatch,8,9,1
+block_hint,StringPrototypeMatch,83,84,1
+block_hint,StringPrototypeMatch,75,76,1
+block_hint,StringPrototypeMatch,43,44,1
+block_hint,StringPrototypeSearch,67,68,1
+block_hint,StringPrototypeSearch,39,40,0
+block_hint,StringPrototypeSearch,99,100,1
+block_hint,StringPrototypeSearch,88,89,0
+block_hint,StringPrototypeSearch,69,70,1
+block_hint,StringPrototypeSearch,49,50,0
+block_hint,StringPrototypeSearch,6,7,1
+block_hint,StringPrototypeSearch,71,72,1
+block_hint,StringPrototypeSearch,51,52,0
+block_hint,StringPrototypeSearch,8,9,1
+block_hint,StringPrototypeSearch,83,84,1
+block_hint,StringPrototypeSearch,75,76,1
+block_hint,StringPrototypeSearch,43,44,1
+block_hint,StringPrototypeSlice,167,168,1
+block_hint,StringPrototypeSlice,136,137,1
+block_hint,StringPrototypeSlice,103,104,1
+block_hint,StringPrototypeSlice,189,190,0
+block_hint,StringPrototypeSlice,175,176,0
+block_hint,StringPrototypeSlice,199,200,0
+block_hint,StringPrototypeSlice,196,197,0
+block_hint,StringPrototypeSlice,183,184,1
+block_hint,StringPrototypeSlice,179,180,1
+block_hint,StringPrototypeSlice,187,188,0
+block_hint,StringPrototypeSlice,170,171,0
+block_hint,StringPrototypeSlice,138,139,1
+block_hint,StringPrototypeSlice,31,32,0
+block_hint,StringPrototypeSlice,68,69,1
+block_hint,StringPrototypeSlice,63,64,1
+block_hint,StringPrototypeSlice,61,62,1
+block_hint,StringPrototypeSlice,124,125,0
+block_hint,StringPrototypeSlice,21,22,0
+block_hint,StringPrototypeSlice,23,24,0
+block_hint,StringPrototypeSlice,128,129,1
+block_hint,StringPrototypeSlice,115,116,1
+block_hint,StringPrototypeSlice,40,41,0
+block_hint,StringPrototypeSlice,19,20,0
+block_hint,StringPrototypeSlice,130,131,1
+block_hint,StringPrototypeSlice,117,118,1
+block_hint,StringPrototypeSlice,44,45,0
+block_hint,StringPrototypeSlice,154,155,0
+block_hint,StringPrototypeSlice,148,149,0
+block_hint,StringPrototypeSlice,36,37,1
+block_hint,StringPrototypeSlice,33,34,0
+block_hint,StringPrototypeStartsWith,288,289,1
+block_hint,StringPrototypeStartsWith,271,272,0
+block_hint,StringPrototypeStartsWith,251,252,1
+block_hint,StringPrototypeStartsWith,235,236,1
+block_hint,StringPrototypeStartsWith,174,175,1
+block_hint,StringPrototypeStartsWith,278,279,1
+block_hint,StringPrototypeStartsWith,267,268,1
+block_hint,StringPrototypeStartsWith,253,254,1
+block_hint,StringPrototypeStartsWith,244,245,1
+block_hint,StringPrototypeStartsWith,179,180,1
+block_hint,StringPrototypeStartsWith,29,30,0
+block_hint,StringPrototypeStartsWith,68,69,0
+block_hint,StringPrototypeStartsWith,70,71,0
+block_hint,StringPrototypeStartsWith,185,186,1
+block_hint,StringPrototypeStartsWith,84,85,0
+block_hint,StringPrototypeStartsWith,86,87,0
+block_hint,StringPrototypeStartsWith,164,165,0
+block_hint,StringPrototypeStartsWith,47,48,0
+block_hint,StringPrototypeStartsWith,35,36,0
+block_hint,StringPrototypeStartsWith,49,50,1
+block_hint,StringPrototypeStartsWith,116,117,1
+block_hint,StringPrototypeSubstr,163,164,1
+block_hint,StringPrototypeSubstr,141,142,1
+block_hint,StringPrototypeSubstr,103,104,1
+block_hint,StringPrototypeSubstr,182,183,0
+block_hint,StringPrototypeSubstr,171,172,0
+block_hint,StringPrototypeSubstr,192,193,0
+block_hint,StringPrototypeSubstr,189,190,0
+block_hint,StringPrototypeSubstr,166,167,0
+block_hint,StringPrototypeSubstr,148,149,0
+block_hint,StringPrototypeSubstr,120,121,0
+block_hint,StringPrototypeSubstr,31,32,0
+block_hint,StringPrototypeSubstr,61,62,1
+block_hint,StringPrototypeSubstr,129,130,0
+block_hint,StringPrototypeSubstr,19,20,0
+block_hint,StringPrototypeSubstr,135,136,1
+block_hint,StringPrototypeSubstr,114,115,1
+block_hint,StringPrototypeSubstr,44,45,0
+block_hint,StringPrototypeSubstr,153,154,0
+block_hint,StringPrototypeSubstr,36,37,1
+block_hint,StringPrototypeSubstr,33,34,0
+block_hint,StringPrototypeSubstring,147,148,1
+block_hint,StringPrototypeSubstring,127,128,1
+block_hint,StringPrototypeSubstring,99,100,1
+block_hint,StringPrototypeSubstring,182,183,0
+block_hint,StringPrototypeSubstring,169,170,0
+block_hint,StringPrototypeSubstring,186,187,0
+block_hint,StringPrototypeSubstring,180,181,0
+block_hint,StringPrototypeSubstring,171,172,0
+block_hint,StringPrototypeSubstring,167,168,0
+block_hint,StringPrototypeSubstring,160,161,0
+block_hint,StringPrototypeSubstring,151,152,0
+block_hint,StringPrototypeSubstring,131,132,0
+block_hint,StringPrototypeSubstring,89,90,0
+block_hint,StringPrototypeSubstring,65,66,1
+block_hint,StringPrototypeSubstring,101,102,1
+block_hint,StringPrototypeSubstring,58,59,1
+block_hint,StringPrototypeSubstring,115,116,0
+block_hint,StringPrototypeSubstring,85,86,1
+block_hint,StringPrototypeSubstring,17,18,0
+block_hint,StringPrototypeSubstring,121,122,1
+block_hint,StringPrototypeSubstring,109,110,1
+block_hint,StringPrototypeSubstring,42,43,0
+block_hint,StringPrototypeSubstring,54,55,0
+block_hint,StringPrototypeSubstring,138,139,0
+block_hint,StringPrototypeSubstring,104,105,1
+block_hint,StringPrototypeSubstring,34,35,1
+block_hint,StringPrototypeTrim,462,463,1
+block_hint,StringPrototypeTrim,263,264,1
+block_hint,StringPrototypeTrim,186,187,1
+block_hint,StringPrototypeTrim,188,189,0
+block_hint,StringPrototypeTrim,436,437,0
+block_hint,StringPrototypeTrim,265,266,1
+block_hint,StringPrototypeTrim,156,157,0
+block_hint,StringPrototypeTrim,158,159,0
+block_hint,StringPrototypeTrim,247,248,0
+block_hint,StringPrototypeTrim,63,64,1
+block_hint,StringPrototypeTrim,362,363,1
+block_hint,StringPrototypeTrim,83,84,0
+block_hint,StringPrototypeTrim,249,250,0
+block_hint,StringPrototypeTrim,65,66,1
+block_hint,StringPrototypeTrim,388,389,0
+block_hint,StringPrototypeTrim,390,391,1
+block_hint,StringPrototypeTrim,128,129,0
+block_hint,StringPrototypeTrim,85,86,0
+block_hint,StringPrototypeTrim,92,93,0
+block_hint,StringPrototypeTrim,285,286,0
+block_hint,StringPrototypeTrim,178,179,1
+block_hint,StringPrototypeTrim,430,431,0
+block_hint,StringPrototypeTrim,251,252,0
+block_hint,StringPrototypeTrim,69,70,0
+block_hint,StringPrototypeTrim,71,72,0
+block_hint,StringPrototypeTrim,446,447,1
+block_hint,StringPrototypeTrim,416,417,1
+block_hint,StringPrototypeTrim,132,133,0
+block_hint,StringPrototypeTrim,152,153,0
+block_hint,StringPrototypeTrim,154,155,0
+block_hint,StringPrototypeTrim,239,240,0
+block_hint,StringPrototypeTrim,47,48,1
+block_hint,StringPrototypeTrim,298,299,1
+block_hint,StringPrototypeTrim,241,242,0
+block_hint,StringPrototypeTrim,49,50,1
+block_hint,StringPrototypeTrim,326,327,1
+block_hint,StringPrototypeTrim,81,82,0
+block_hint,StringPrototypeTrim,87,88,0
+block_hint,StringPrototypeTrim,283,284,1
+block_hint,StringPrototypeTrim,172,173,1
+block_hint,StringPrototypeTrim,428,429,0
+block_hint,StringPrototypeTrim,243,244,1
+block_hint,StringPrototypeTrim,51,52,0
+block_hint,StringPrototypeTrim,440,441,1
+block_hint,StringPrototypeTrim,354,355,1
+block_hint,StringPrototypeTrim,112,113,0
+block_hint,StringPrototypeTrim,466,467,0
+block_hint,StringPrototypeTrim,287,288,1
+block_hint,StringPrototypeTrim,97,98,1
+block_hint,StringPrototypeTrim,89,90,0
+block_hint,SymbolPrototypeToString,9,10,1
+block_hint,SymbolPrototypeToString,11,12,1
+block_hint,SymbolPrototypeToString,5,6,0
+block_hint,SymbolPrototypeToString,7,8,1
+block_hint,CreateTypedArray,567,568,0
+block_hint,CreateTypedArray,597,598,0
+block_hint,CreateTypedArray,540,541,0
+block_hint,CreateTypedArray,454,455,0
+block_hint,CreateTypedArray,333,334,1
+block_hint,CreateTypedArray,335,336,1
+block_hint,CreateTypedArray,640,641,0
+block_hint,CreateTypedArray,489,490,1
+block_hint,CreateTypedArray,487,488,1
+block_hint,CreateTypedArray,385,386,1
+block_hint,CreateTypedArray,546,547,0
+block_hint,CreateTypedArray,621,622,0
+block_hint,CreateTypedArray,544,545,0
+block_hint,CreateTypedArray,458,459,0
+block_hint,CreateTypedArray,396,397,0
+block_hint,CreateTypedArray,398,399,0
+block_hint,CreateTypedArray,388,389,0
+block_hint,CreateTypedArray,104,105,1
+block_hint,CreateTypedArray,106,107,1
+block_hint,CreateTypedArray,648,649,1
+block_hint,CreateTypedArray,600,601,1
+block_hint,CreateTypedArray,646,647,1
+block_hint,CreateTypedArray,618,619,1
+block_hint,CreateTypedArray,491,492,0
+block_hint,CreateTypedArray,523,524,1
+block_hint,CreateTypedArray,362,363,0
+block_hint,CreateTypedArray,236,237,0
+block_hint,CreateTypedArray,301,302,0
+block_hint,CreateTypedArray,281,282,1
+block_hint,CreateTypedArray,283,284,1
+block_hint,CreateTypedArray,493,494,0
+block_hint,CreateTypedArray,525,526,1
+block_hint,CreateTypedArray,364,365,0
+block_hint,CreateTypedArray,252,253,0
+block_hint,CreateTypedArray,303,304,0
+block_hint,CreateTypedArray,480,481,0
+block_hint,CreateTypedArray,482,483,0
+block_hint,CreateTypedArray,634,635,0
+block_hint,CreateTypedArray,498,499,1
+block_hint,CreateTypedArray,496,497,1
+block_hint,CreateTypedArray,400,401,1
+block_hint,CreateTypedArray,506,507,0
+block_hint,CreateTypedArray,500,501,0
+block_hint,CreateTypedArray,403,404,0
+block_hint,CreateTypedArray,152,153,1
+block_hint,CreateTypedArray,342,343,0
+block_hint,CreateTypedArray,154,155,1
+block_hint,CreateTypedArray,652,653,1
+block_hint,CreateTypedArray,607,608,1
+block_hint,CreateTypedArray,650,651,1
+block_hint,CreateTypedArray,624,625,1
+block_hint,CreateTypedArray,502,503,0
+block_hint,CreateTypedArray,519,520,1
+block_hint,CreateTypedArray,358,359,0
+block_hint,CreateTypedArray,204,205,0
+block_hint,CreateTypedArray,627,628,0
+block_hint,CreateTypedArray,166,167,1
+block_hint,CreateTypedArray,291,292,1
+block_hint,CreateTypedArray,293,294,1
+block_hint,CreateTypedArray,504,505,0
+block_hint,CreateTypedArray,521,522,1
+block_hint,CreateTypedArray,360,361,0
+block_hint,CreateTypedArray,220,221,0
+block_hint,CreateTypedArray,629,630,0
+block_hint,CreateTypedArray,513,514,0
+block_hint,CreateTypedArray,508,509,0
+block_hint,CreateTypedArray,465,466,0
+block_hint,CreateTypedArray,348,349,0
+block_hint,CreateTypedArray,419,420,1
+block_hint,CreateTypedArray,352,353,1
+block_hint,CreateTypedArray,350,351,1
+block_hint,CreateTypedArray,421,422,0
+block_hint,CreateTypedArray,656,657,0
+block_hint,CreateTypedArray,609,610,0
+block_hint,CreateTypedArray,529,530,1
+block_hint,CreateTypedArray,527,528,1
+block_hint,CreateTypedArray,433,434,1
+block_hint,CreateTypedArray,613,614,0
+block_hint,CreateTypedArray,537,538,0
+block_hint,CreateTypedArray,447,448,0
+block_hint,CreateTypedArray,316,317,0
+block_hint,CreateTypedArray,611,612,0
+block_hint,CreateTypedArray,535,536,0
+block_hint,CreateTypedArray,443,444,0
+block_hint,CreateTypedArray,265,266,0
+block_hint,CreateTypedArray,592,593,0
+block_hint,CreateTypedArray,323,324,0
+block_hint,CreateTypedArray,325,326,0
+block_hint,CreateTypedArray,372,373,0
+block_hint,CreateTypedArray,374,375,0
+block_hint,CreateTypedArray,318,319,0
+block_hint,CreateTypedArray,328,329,0
+block_hint,CreateTypedArray,321,322,0
+block_hint,CreateTypedArray,474,475,0
+block_hint,CreateTypedArray,517,518,1
+block_hint,CreateTypedArray,356,357,0
+block_hint,CreateTypedArray,188,189,0
+block_hint,CreateTypedArray,451,452,0
+block_hint,CreateTypedArray,273,274,0
+block_hint,TypedArrayFrom,168,169,1
+block_hint,TypedArrayFrom,151,152,0
+block_hint,TypedArrayFrom,131,132,1
+block_hint,TypedArrayFrom,100,101,1
+block_hint,TypedArrayFrom,58,59,1
+block_hint,TypedArrayFrom,60,61,1
+block_hint,TypedArrayFrom,124,125,1
+block_hint,TypedArrayFrom,115,116,0
+block_hint,TypedArrayFrom,92,93,0
+block_hint,TypedArrayFrom,71,72,1
+block_hint,TypedArrayFrom,73,74,1
+block_hint,TypedArrayFrom,175,176,1
+block_hint,TypedArrayFrom,177,178,0
+block_hint,TypedArrayFrom,179,180,0
+block_hint,TypedArrayFrom,186,187,1
+block_hint,TypedArrayFrom,181,182,0
+block_hint,TypedArrayFrom,183,184,1
+block_hint,TypedArrayFrom,173,174,1
+block_hint,TypedArrayFrom,165,166,0
+block_hint,TypedArrayFrom,156,157,1
+block_hint,TypedArrayFrom,118,119,0
+block_hint,TypedArrayFrom,75,76,1
+block_hint,TypedArrayFrom,77,78,1
+block_hint,TypedArrayFrom,26,27,0
+block_hint,TypedArrayFrom,96,97,0
+block_hint,TypedArrayFrom,28,29,0
+block_hint,TypedArrayFrom,86,87,1
+block_hint,TypedArrayFrom,30,31,1
+block_hint,TypedArrayPrototypeSet,196,197,1
+block_hint,TypedArrayPrototypeSet,104,105,1
+block_hint,TypedArrayPrototypeSet,106,107,1
+block_hint,TypedArrayPrototypeSet,249,250,1
+block_hint,TypedArrayPrototypeSet,282,283,0
+block_hint,TypedArrayPrototypeSet,268,269,0
+block_hint,TypedArrayPrototypeSet,256,257,0
+block_hint,TypedArrayPrototypeSet,223,224,0
+block_hint,TypedArrayPrototypeSet,155,156,0
+block_hint,TypedArrayPrototypeSet,198,199,0
+block_hint,TypedArrayPrototypeSet,200,201,0
+block_hint,TypedArrayPrototypeSet,167,168,0
+block_hint,TypedArrayPrototypeSet,278,279,0
+block_hint,TypedArrayPrototypeSet,265,266,1
+block_hint,TypedArrayPrototypeSet,244,245,1
+block_hint,TypedArrayPrototypeSet,211,212,0
+block_hint,TypedArrayPrototypeSet,213,214,0
+block_hint,TypedArrayPrototypeSet,171,172,0
+block_hint,TypedArrayPrototypeSet,159,160,0
+block_hint,TypedArrayPrototypeSet,179,180,0
+block_hint,TypedArrayPrototypeSet,123,124,0
+block_hint,TypedArrayPrototypeSet,185,186,1
+block_hint,TypedArrayPrototypeSet,91,92,1
+block_hint,TypedArrayPrototypeSet,81,82,0
+block_hint,TypedArrayPrototypeSet,83,84,0
+block_hint,TypedArrayPrototypeSet,85,86,0
+block_hint,TypedArrayPrototypeSet,87,88,0
+block_hint,TypedArrayPrototypeSet,187,188,0
+block_hint,TypedArrayPrototypeSet,146,147,0
+block_hint,TypedArrayPrototypeSubArray,129,130,1
+block_hint,TypedArrayPrototypeSubArray,82,83,1
+block_hint,TypedArrayPrototypeSubArray,84,85,1
+block_hint,TypedArrayPrototypeSubArray,159,160,1
+block_hint,TypedArrayPrototypeSubArray,151,152,0
+block_hint,TypedArrayPrototypeSubArray,131,132,0
+block_hint,TypedArrayPrototypeSubArray,133,134,0
+block_hint,TypedArrayPrototypeSubArray,210,211,0
+block_hint,TypedArrayPrototypeSubArray,190,191,0
+block_hint,TypedArrayPrototypeSubArray,170,171,0
+block_hint,TypedArrayPrototypeSubArray,218,219,0
+block_hint,TypedArrayPrototypeSubArray,205,206,0
+block_hint,TypedArrayPrototypeSubArray,196,197,0
+block_hint,TypedArrayPrototypeSubArray,186,187,1
+block_hint,TypedArrayPrototypeSubArray,154,155,0
+block_hint,TypedArrayPrototypeSubArray,137,138,0
+block_hint,TypedArrayPrototypeSubArray,165,166,0
+block_hint,TypedArrayPrototypeSubArray,216,217,0
+block_hint,TypedArrayPrototypeSubArray,203,204,0
+block_hint,TypedArrayPrototypeSubArray,192,193,0
+block_hint,TypedArrayPrototypeSubArray,149,150,1
+block_hint,TypedArrayPrototypeSubArray,124,125,0
+block_hint,TypedArrayPrototypeSubArray,102,103,0
+block_hint,TypedArrayPrototypeSubArray,104,105,0
+block_hint,TypedArrayPrototypeSubArray,115,116,0
+block_hint,TypedArrayPrototypeSubArray,63,64,1
+block_hint,TypedArrayPrototypeSubArray,65,66,1
+block_hint,TypedArrayPrototypeSubArray,145,146,1
+block_hint,TypedArrayPrototypeSubArray,80,81,0
+block_hint,TypedArrayPrototypeSubArray,117,118,0
+block_hint,TypedArrayPrototypeSubArray,90,91,1
+block_hint,TypedArrayPrototypeSubArray,92,93,1
+block_hint,TypedArrayPrototypeSubArray,119,120,0
+block_hint,TypedArrayPrototypeSubArray,94,95,1
+block_hint,TypedArrayPrototypeSubArray,96,97,1
+block_hint,TypedArrayPrototypeSubArray,69,70,1
+block_hint,TypedArrayPrototypeSubArray,98,99,1
+block_hint,TypedArrayPrototypeSubArray,100,101,1
+block_hint,TypedArrayPrototypeSubArray,73,74,0
+block_hint,NewSloppyArgumentsElements,44,45,1
+block_hint,NewSloppyArgumentsElements,24,25,1
+block_hint,NewSloppyArgumentsElements,33,34,0
+block_hint,NewSloppyArgumentsElements,14,15,0
+block_hint,NewSloppyArgumentsElements,16,17,0
+block_hint,NewSloppyArgumentsElements,46,47,1
+block_hint,NewSloppyArgumentsElements,36,37,1
+block_hint,NewSloppyArgumentsElements,18,19,0
+block_hint,NewSloppyArgumentsElements,48,49,0
+block_hint,NewStrictArgumentsElements,9,10,0
+block_hint,NewStrictArgumentsElements,20,21,0
+block_hint,NewRestArgumentsElements,25,26,0
+block_hint,NewRestArgumentsElements,11,12,1
+block_hint,NewRestArgumentsElements,16,17,0
+block_hint,NewRestArgumentsElements,5,6,0
+block_hint,NewRestArgumentsElements,7,8,0
+block_hint,NewRestArgumentsElements,23,24,1
+block_hint,NewRestArgumentsElements,19,20,1
+block_hint,NewRestArgumentsElements,9,10,0
+block_hint,NewRestArgumentsElements,21,22,0
+block_hint,FastNewSloppyArguments,41,42,1
+block_hint,FastNewSloppyArguments,43,44,0
+block_hint,FastNewSloppyArguments,101,102,1
+block_hint,FastNewSloppyArguments,45,46,0
+block_hint,FastNewSloppyArguments,13,14,0
+block_hint,FastNewSloppyArguments,15,16,0
+block_hint,FastNewSloppyArguments,75,76,1
+block_hint,FastNewSloppyArguments,59,60,1
+block_hint,FastNewSloppyArguments,17,18,0
+block_hint,FastNewSloppyArguments,61,62,0
+block_hint,FastNewSloppyArguments,81,82,1
+block_hint,FastNewSloppyArguments,47,48,0
+block_hint,FastNewSloppyArguments,19,20,0
+block_hint,FastNewSloppyArguments,21,22,0
+block_hint,FastNewSloppyArguments,71,72,1
+block_hint,FastNewSloppyArguments,55,56,1
+block_hint,FastNewSloppyArguments,23,24,0
+block_hint,FastNewSloppyArguments,73,74,0
+block_hint,FastNewSloppyArguments,25,26,1
+block_hint,FastNewSloppyArguments,51,52,1
+block_hint,FastNewSloppyArguments,27,28,1
+block_hint,FastNewSloppyArguments,29,30,0
+block_hint,FastNewSloppyArguments,31,32,0
+block_hint,FastNewSloppyArguments,77,78,1
+block_hint,FastNewSloppyArguments,63,64,1
+block_hint,FastNewSloppyArguments,33,34,0
+block_hint,FastNewSloppyArguments,35,36,1
+block_hint,FastNewSloppyArguments,53,54,1
+block_hint,FastNewStrictArguments,16,17,1
+block_hint,FastNewStrictArguments,18,19,0
+block_hint,FastNewStrictArguments,20,21,0
+block_hint,FastNewStrictArguments,7,8,0
+block_hint,FastNewStrictArguments,9,10,0
+block_hint,FastNewStrictArguments,31,32,1
+block_hint,FastNewStrictArguments,25,26,1
+block_hint,FastNewStrictArguments,11,12,0
+block_hint,FastNewStrictArguments,27,28,0
+block_hint,FastNewStrictArguments,13,14,1
+block_hint,FastNewStrictArguments,23,24,1
+block_hint,FastNewRestArguments,16,17,1
+block_hint,FastNewRestArguments,18,19,0
+block_hint,FastNewRestArguments,34,35,1
+block_hint,FastNewRestArguments,7,8,1
+block_hint,FastNewRestArguments,21,22,0
+block_hint,FastNewRestArguments,9,10,0
+block_hint,FastNewRestArguments,11,12,0
+block_hint,FastNewRestArguments,32,33,1
+block_hint,FastNewRestArguments,25,26,1
+block_hint,FastNewRestArguments,13,14,0
+block_hint,FastNewRestArguments,27,28,0
+block_hint,FastNewRestArguments,23,24,1
+block_hint,StringSlowFlatten,35,36,1
+block_hint,StringSlowFlatten,20,21,1
+block_hint,StringSlowFlatten,4,5,0
+block_hint,StringSlowFlatten,30,31,1
+block_hint,StringSlowFlatten,22,23,1
+block_hint,StringIndexOf,160,161,0
+block_hint,StringIndexOf,112,113,1
+block_hint,StringIndexOf,125,126,1
+block_hint,StringIndexOf,91,92,0
+block_hint,StringIndexOf,117,118,1
+block_hint,StringIndexOf,136,137,0
+block_hint,StringIndexOf,44,45,0
+block_hint,StringIndexOf,46,47,0
+block_hint,StringIndexOf,133,134,0
+block_hint,StringIndexOf,76,77,0
+block_hint,StringIndexOf,78,79,0
+block_hint,StringIndexOf,72,73,0
+block_hint,StringIndexOf,74,75,0
+block_hint,StringIndexOf,40,41,0
+block_hint,StringIndexOf,42,43,0
+block_hint,StringIndexOf,127,128,1
+block_hint,StringIndexOf,56,57,0
+block_hint,StringIndexOf,58,59,0
+block_hint,Load_FastSmiElements_0,2,3,1
+block_hint,Load_FastObjectElements_0,2,3,1
+block_hint,Store_FastSmiElements_0,2,3,1
+block_hint,Store_FastObjectElements_0,2,3,1
+block_hint,SortCompareDefault,8,9,1
+block_hint,SortCompareDefault,20,21,1
+block_hint,SortCompareDefault,17,18,1
+block_hint,SortCompareDefault,14,15,1
+block_hint,SortCompareDefault,11,12,1
+block_hint,SortCompareDefault,6,7,1
+block_hint,SortCompareUserFn,9,10,0
+block_hint,SortCompareUserFn,5,6,0
+block_hint,Copy,17,18,1
+block_hint,Copy,9,10,1
+block_hint,Copy,11,12,1
+block_hint,Copy,5,6,1
+block_hint,Copy,7,8,1
+block_hint,MergeAt,13,14,1
+block_hint,MergeAt,15,16,1
+block_hint,MergeAt,17,18,1
+block_hint,MergeAt,19,20,1
+block_hint,MergeAt,140,141,0
+block_hint,MergeAt,29,30,1
+block_hint,MergeAt,31,32,0
+block_hint,MergeAt,33,34,1
+block_hint,MergeAt,35,36,1
+block_hint,MergeAt,123,124,0
+block_hint,MergeAt,236,237,1
+block_hint,MergeAt,225,226,1
+block_hint,MergeAt,69,70,1
+block_hint,MergeAt,71,72,1
+block_hint,MergeAt,150,151,1
+block_hint,MergeAt,103,104,0
+block_hint,MergeAt,73,74,1
+block_hint,MergeAt,75,76,1
+block_hint,MergeAt,227,228,0
+block_hint,MergeAt,81,82,1
+block_hint,MergeAt,83,84,1
+block_hint,MergeAt,198,199,0
+block_hint,MergeAt,134,135,0
+block_hint,MergeAt,77,78,1
+block_hint,MergeAt,79,80,1
+block_hint,MergeAt,196,197,1
+block_hint,MergeAt,132,133,0
+block_hint,MergeAt,152,153,0
+block_hint,MergeAt,182,183,1
+block_hint,MergeAt,85,86,1
+block_hint,MergeAt,87,88,1
+block_hint,MergeAt,89,90,1
+block_hint,MergeAt,147,148,0
+block_hint,MergeAt,91,92,1
+block_hint,MergeAt,93,94,1
+block_hint,MergeAt,95,96,1
+block_hint,MergeAt,107,108,1
+block_hint,MergeAt,194,195,1
+block_hint,MergeAt,97,98,1
+block_hint,MergeAt,99,100,1
+block_hint,MergeAt,230,231,1
+block_hint,MergeAt,116,117,0
+block_hint,MergeAt,232,233,1
+block_hint,MergeAt,220,221,1
+block_hint,MergeAt,37,38,1
+block_hint,MergeAt,39,40,1
+block_hint,MergeAt,154,155,1
+block_hint,MergeAt,109,110,0
+block_hint,MergeAt,41,42,1
+block_hint,MergeAt,43,44,1
+block_hint,MergeAt,222,223,0
+block_hint,MergeAt,49,50,1
+block_hint,MergeAt,51,52,1
+block_hint,MergeAt,202,203,0
+block_hint,MergeAt,138,139,0
+block_hint,MergeAt,45,46,1
+block_hint,MergeAt,47,48,1
+block_hint,MergeAt,200,201,1
+block_hint,MergeAt,136,137,0
+block_hint,MergeAt,111,112,0
+block_hint,MergeAt,165,166,1
+block_hint,MergeAt,53,54,1
+block_hint,MergeAt,207,208,0
+block_hint,MergeAt,169,170,0
+block_hint,MergeAt,55,56,1
+block_hint,MergeAt,57,58,1
+block_hint,MergeAt,143,144,1
+block_hint,MergeAt,59,60,1
+block_hint,MergeAt,173,174,0
+block_hint,MergeAt,61,62,1
+block_hint,MergeAt,63,64,1
+block_hint,MergeAt,113,114,0
+block_hint,MergeAt,192,193,1
+block_hint,MergeAt,65,66,1
+block_hint,MergeAt,67,68,1
+block_hint,GallopLeft,11,12,1
+block_hint,GallopLeft,47,48,0
+block_hint,GallopLeft,15,16,1
+block_hint,GallopLeft,63,64,0
+block_hint,GallopLeft,29,30,0
+block_hint,GallopLeft,41,42,0
+block_hint,GallopLeft,13,14,1
+block_hint,GallopLeft,65,66,0
+block_hint,GallopLeft,31,32,0
+block_hint,GallopLeft,39,40,0
+block_hint,GallopLeft,17,18,1
+block_hint,GallopLeft,61,62,0
+block_hint,GallopRight,11,12,1
+block_hint,GallopRight,47,48,0
+block_hint,GallopRight,35,36,1
+block_hint,GallopRight,15,16,1
+block_hint,GallopRight,63,64,0
+block_hint,GallopRight,29,30,0
+block_hint,GallopRight,41,42,0
+block_hint,GallopRight,13,14,1
+block_hint,GallopRight,65,66,0
+block_hint,GallopRight,31,32,0
+block_hint,GallopRight,39,40,0
+block_hint,GallopRight,17,18,1
+block_hint,GallopRight,61,62,0
+block_hint,ArrayTimSort,120,121,0
+block_hint,ArrayTimSort,240,241,0
+block_hint,ArrayTimSort,227,228,0
+block_hint,ArrayTimSort,122,123,0
+block_hint,ArrayTimSort,163,164,0
+block_hint,ArrayTimSort,140,141,0
+block_hint,ArrayTimSort,33,34,1
+block_hint,ArrayTimSort,93,94,0
+block_hint,ArrayTimSort,95,96,0
+block_hint,ArrayTimSort,143,144,0
+block_hint,ArrayTimSort,35,36,1
+block_hint,ArrayTimSort,37,38,1
+block_hint,ArrayTimSort,214,215,0
+block_hint,ArrayTimSort,145,146,1
+block_hint,ArrayTimSort,39,40,1
+block_hint,ArrayTimSort,218,219,0
+block_hint,ArrayTimSort,216,217,0
+block_hint,ArrayTimSort,41,42,1
+block_hint,ArrayTimSort,43,44,1
+block_hint,ArrayTimSort,45,46,1
+block_hint,ArrayTimSort,134,135,0
+block_hint,ArrayTimSort,47,48,1
+block_hint,ArrayTimSort,49,50,1
+block_hint,ArrayTimSort,222,223,0
+block_hint,ArrayTimSort,51,52,1
+block_hint,ArrayTimSort,53,54,1
+block_hint,ArrayTimSort,55,56,1
+block_hint,ArrayTimSort,57,58,1
+block_hint,ArrayTimSort,59,60,1
+block_hint,ArrayTimSort,61,62,1
+block_hint,ArrayTimSort,63,64,1
+block_hint,ArrayTimSort,65,66,1
+block_hint,ArrayTimSort,67,68,1
+block_hint,ArrayTimSort,69,70,1
+block_hint,ArrayTimSort,71,72,1
+block_hint,ArrayTimSort,157,158,1
+block_hint,ArrayTimSort,73,74,1
+block_hint,ArrayTimSort,75,76,1
+block_hint,ArrayTimSort,204,205,0
+block_hint,ArrayTimSort,77,78,1
+block_hint,ArrayTimSort,79,80,1
+block_hint,ArrayTimSort,209,210,0
+block_hint,ArrayTimSort,81,82,1
+block_hint,ArrayTimSort,83,84,1
+block_hint,ArrayTimSort,186,187,0
+block_hint,ArrayTimSort,236,237,1
+block_hint,ArrayTimSort,238,239,1
+block_hint,ArrayTimSort,211,212,1
+block_hint,ArrayTimSort,161,162,1
+block_hint,ArrayTimSort,85,86,1
+block_hint,ArrayTimSort,243,244,1
+block_hint,ArrayTimSort,230,231,0
+block_hint,ArrayTimSort,188,189,1
+block_hint,ArrayTimSort,138,139,0
+block_hint,ArrayTimSort,87,88,1
+block_hint,ArrayTimSort,113,114,0
+block_hint,ArrayTimSort,89,90,0
+block_hint,ArrayPrototypeSort,106,107,1
+block_hint,ArrayPrototypeSort,80,81,0
+block_hint,ArrayPrototypeSort,39,40,1
+block_hint,ArrayPrototypeSort,70,71,0
+block_hint,ArrayPrototypeSort,41,42,1
+block_hint,ArrayPrototypeSort,82,83,1
+block_hint,ArrayPrototypeSort,84,85,1
+block_hint,ArrayPrototypeSort,63,64,0
+block_hint,ArrayPrototypeSort,27,28,0
+block_hint,ArrayPrototypeSort,121,122,0
+block_hint,ArrayPrototypeSort,101,102,1
+block_hint,ArrayPrototypeSort,73,74,1
+block_hint,ArrayPrototypeSort,51,52,1
+block_hint,ArrayPrototypeSort,15,16,1
+block_hint,ArrayPrototypeSort,95,96,1
+block_hint,ArrayPrototypeSort,75,76,0
+block_hint,ArrayPrototypeSort,53,54,0
+block_hint,ArrayPrototypeSort,139,140,0
+block_hint,ArrayPrototypeSort,142,143,0
+block_hint,ArrayPrototypeSort,132,133,0
+block_hint,ArrayPrototypeSort,128,129,0
+block_hint,ArrayPrototypeSort,103,104,0
+block_hint,ArrayPrototypeSort,114,115,1
+block_hint,ArrayPrototypeSort,118,119,1
+block_hint,ArrayPrototypeSort,77,78,1
+block_hint,ArrayPrototypeSort,33,34,0
+block_hint,ArrayPrototypeSort,98,99,1
+block_hint,ArrayPrototypeSort,91,92,1
+block_hint,ArrayPrototypeSort,56,57,1
+block_hint,StringFastLocaleCompare,315,316,1
+block_hint,StringFastLocaleCompare,239,240,0
+block_hint,StringFastLocaleCompare,303,304,1
+block_hint,StringFastLocaleCompare,156,157,0
+block_hint,StringFastLocaleCompare,158,159,0
+block_hint,StringFastLocaleCompare,267,268,1
+block_hint,StringFastLocaleCompare,106,107,0
+block_hint,StringFastLocaleCompare,307,308,1
+block_hint,StringFastLocaleCompare,172,173,0
+block_hint,StringFastLocaleCompare,174,175,0
+block_hint,StringFastLocaleCompare,109,110,0
+block_hint,StringFastLocaleCompare,211,212,1
+block_hint,StringFastLocaleCompare,271,272,1
+block_hint,StringFastLocaleCompare,276,277,0
+block_hint,StringFastLocaleCompare,253,254,1
+block_hint,StringFastLocaleCompare,73,74,0
+block_hint,StringFastLocaleCompare,274,275,1
+block_hint,StringFastLocaleCompare,116,117,0
+block_hint,StringFastLocaleCompare,77,78,1
+block_hint,CanUseSameAccessor_FastObjectElements_0,2,3,1
+block_hint,CanUseSameAccessor_FastObjectElements_0,4,5,1
+block_hint,StringPrototypeToLowerCaseIntl,10,11,1
+block_hint,StringPrototypeToLowerCaseIntl,7,8,1
+block_hint,StringPrototypeToLowerCaseIntl,5,6,1
+block_hint,StringToLowerCaseIntl,23,24,1
+block_hint,StringToLowerCaseIntl,25,26,0
+block_hint,StringToLowerCaseIntl,34,35,1
+block_hint,StringToLowerCaseIntl,7,8,0
+block_hint,StringToLowerCaseIntl,43,44,1
+block_hint,StringToLowerCaseIntl,41,42,1
+block_hint,StringToLowerCaseIntl,19,20,0
+block_hint,StringToLowerCaseIntl,39,40,0
+block_hint,StringToLowerCaseIntl,14,15,0
+block_hint,LdaContextSlotHandler,3,4,1
+block_hint,LdaContextSlotHandler,5,6,1
+block_hint,LdaImmutableContextSlotHandler,3,4,1
+block_hint,LdaImmutableContextSlotHandler,5,6,1
+block_hint,LdaCurrentContextSlotHandler,2,3,1
+block_hint,LdaImmutableCurrentContextSlotHandler,2,3,1
+block_hint,TestTypeOfHandler,7,8,1
+block_hint,TestTypeOfHandler,15,16,0
+block_hint,TestTypeOfHandler,23,24,0
+block_hint,TestTypeOfHandler,27,28,1
+block_hint,TestTypeOfHandler,31,32,1
+block_hint,TestTypeOfHandler,50,51,0
+block_hint,TestTypeOfHandler,35,36,0
+block_hint,LdaGlobalHandler,7,8,1
+block_hint,LdaGlobalHandler,9,10,1
+block_hint,LdaGlobalHandler,11,12,1
+block_hint,LdaGlobalHandler,13,14,1
+block_hint,LdaGlobalHandler,183,184,0
+block_hint,LdaGlobalHandler,105,106,0
+block_hint,LdaGlobalHandler,109,110,1
+block_hint,StaContextSlotHandler,5,6,1
+block_hint,StaCurrentContextSlotHandler,2,3,1
+block_hint,GetNamedPropertyHandler,379,380,1
+block_hint,GetNamedPropertyHandler,219,220,0
+block_hint,GetNamedPropertyHandler,77,78,0
+block_hint,GetNamedPropertyHandler,35,36,1
+block_hint,GetNamedPropertyHandler,318,319,0
+block_hint,GetNamedPropertyHandler,342,343,0
+block_hint,GetNamedPropertyHandler,221,222,1
+block_hint,GetNamedPropertyHandler,293,294,1
+block_hint,GetNamedPropertyHandler,39,40,0
+block_hint,GetNamedPropertyHandler,223,224,0
+block_hint,GetNamedPropertyHandler,297,298,1
+block_hint,GetNamedPropertyHandler,98,99,1
+block_hint,GetNamedPropertyHandler,350,351,0
+block_hint,GetNamedPropertyHandler,245,246,0
+block_hint,GetNamedPropertyHandler,154,155,0
+block_hint,GetNamedPropertyHandler,122,123,1
+block_hint,GetNamedPropertyHandler,49,50,0
+block_hint,GetNamedPropertyHandler,87,88,0
+block_hint,GetNamedPropertyHandler,25,26,1
+block_hint,GetNamedPropertyHandler,144,145,0
+block_hint,GetNamedPropertyHandler,65,66,0
+block_hint,GetNamedPropertyHandler,306,307,1
+block_hint,GetNamedPropertyHandler,102,103,0
+block_hint,GetNamedPropertyHandler,251,252,1
+block_hint,GetNamedPropertyHandler,253,254,1
+block_hint,GetNamedPropertyHandler,247,248,1
+block_hint,GetNamedPropertyHandler,249,250,1
+block_hint,GetNamedPropertyHandler,164,165,1
+block_hint,AddHandler,53,54,0
+block_hint,AddHandler,37,38,0
+block_hint,AddHandler,28,29,1
+block_hint,AddHandler,80,81,0
+block_hint,AddHandler,60,61,1
+block_hint,AddHandler,40,41,1
+block_hint,AddHandler,74,75,1
+block_hint,AddHandler,43,44,1
+block_hint,AddHandler,56,57,1
+block_hint,AddHandler,22,23,1
+block_hint,SubHandler,35,36,0
+block_hint,SubHandler,23,24,1
+block_hint,SubHandler,64,65,1
+block_hint,SubHandler,75,76,1
+block_hint,SubHandler,66,67,1
+block_hint,SubHandler,45,46,1
+block_hint,SubHandler,19,20,1
+block_hint,MulHandler,79,80,1
+block_hint,MulHandler,75,76,1
+block_hint,MulHandler,26,27,1
+block_hint,MulHandler,85,86,1
+block_hint,MulHandler,69,70,1
+block_hint,MulHandler,47,48,1
+block_hint,MulHandler,21,22,1
+block_hint,DivHandler,81,82,0
+block_hint,DivHandler,75,76,0
+block_hint,DivHandler,64,65,0
+block_hint,DivHandler,43,44,1
+block_hint,DivHandler,23,24,1
+block_hint,DivHandler,83,84,1
+block_hint,DivHandler,70,71,1
+block_hint,DivHandler,46,47,1
+block_hint,DivHandler,17,18,1
+block_hint,ModHandler,77,78,1
+block_hint,ModHandler,74,75,0
+block_hint,ModHandler,70,71,0
+block_hint,ModHandler,56,57,1
+block_hint,ModHandler,51,52,1
+block_hint,ModHandler,28,29,0
+block_hint,ModHandler,8,9,0
+block_hint,ModHandler,15,16,1
+block_hint,BitwiseOrHandler,42,43,0
+block_hint,BitwiseOrHandler,30,31,1
+block_hint,BitwiseOrHandler,8,9,1
+block_hint,BitwiseOrHandler,56,57,1
+block_hint,BitwiseOrHandler,60,61,1
+block_hint,BitwiseOrHandler,24,25,1
+block_hint,BitwiseXorHandler,32,33,1
+block_hint,BitwiseXorHandler,56,57,1
+block_hint,BitwiseXorHandler,60,61,1
+block_hint,BitwiseXorHandler,24,25,1
+block_hint,BitwiseAndHandler,32,33,1
+block_hint,BitwiseAndHandler,56,57,1
+block_hint,BitwiseAndHandler,60,61,1
+block_hint,BitwiseAndHandler,24,25,1
+block_hint,ShiftLeftHandler,10,11,0
+block_hint,ShiftLeftHandler,60,61,1
+block_hint,ShiftLeftHandler,24,25,1
+block_hint,ShiftRightHandler,32,33,1
+block_hint,ShiftRightHandler,10,11,0
+block_hint,ShiftRightHandler,58,59,0
+block_hint,ShiftRightHandler,39,40,0
+block_hint,ShiftRightHandler,24,25,1
+block_hint,ShiftRightLogicalHandler,10,11,0
+block_hint,ShiftRightLogicalHandler,58,59,0
+block_hint,ShiftRightLogicalHandler,39,40,0
+block_hint,AddSmiHandler,53,54,0
+block_hint,AddSmiHandler,37,38,0
+block_hint,AddSmiHandler,28,29,1
+block_hint,SubSmiHandler,35,36,0
+block_hint,SubSmiHandler,23,24,1
+block_hint,SubSmiHandler,19,20,1
+block_hint,MulSmiHandler,78,79,0
+block_hint,MulSmiHandler,63,64,0
+block_hint,MulSmiHandler,65,66,0
+block_hint,MulSmiHandler,34,35,0
+block_hint,MulSmiHandler,23,24,1
+block_hint,DivSmiHandler,69,70,0
+block_hint,DivSmiHandler,78,79,0
+block_hint,DivSmiHandler,64,65,0
+block_hint,DivSmiHandler,43,44,1
+block_hint,DivSmiHandler,15,16,0
+block_hint,DivSmiHandler,23,24,1
+block_hint,ModSmiHandler,56,57,1
+block_hint,ModSmiHandler,51,52,1
+block_hint,ModSmiHandler,28,29,0
+block_hint,ModSmiHandler,15,16,1
+block_hint,BitwiseOrSmiHandler,31,32,1
+block_hint,BitwiseOrSmiHandler,37,38,1
+block_hint,BitwiseAndSmiHandler,6,7,0
+block_hint,BitwiseAndSmiHandler,18,19,1
+block_hint,ShiftLeftSmiHandler,44,45,1
+block_hint,ShiftLeftSmiHandler,34,35,1
+block_hint,ShiftLeftSmiHandler,46,47,1
+block_hint,ShiftLeftSmiHandler,18,19,1
+block_hint,ShiftRightSmiHandler,31,32,1
+block_hint,ShiftRightSmiHandler,35,36,0
+block_hint,ShiftRightSmiHandler,29,30,0
+block_hint,ShiftRightSmiHandler,18,19,1
+block_hint,ShiftRightLogicalSmiHandler,40,41,0
+block_hint,ShiftRightLogicalSmiHandler,30,31,0
+block_hint,ShiftRightLogicalSmiHandler,34,35,1
+block_hint,ShiftRightLogicalSmiHandler,42,43,0
+block_hint,ShiftRightLogicalSmiHandler,32,33,0
+block_hint,ShiftRightLogicalSmiHandler,18,19,1
+block_hint,IncHandler,27,28,0
+block_hint,IncHandler,23,24,0
+block_hint,IncHandler,18,19,1
+block_hint,DecHandler,27,28,0
+block_hint,DecHandler,23,24,0
+block_hint,DecHandler,18,19,1
+block_hint,NegateHandler,26,27,1
+block_hint,NegateHandler,24,25,1
+block_hint,ToBooleanLogicalNotHandler,15,16,0
+block_hint,ToBooleanLogicalNotHandler,21,22,0
+block_hint,ToBooleanLogicalNotHandler,7,8,0
+block_hint,TypeOfHandler,20,21,0
+block_hint,CallAnyReceiverHandler,21,22,1
+block_hint,CallProperty0Handler,7,8,1
+block_hint,CallProperty0Handler,62,63,0
+block_hint,CallProperty0Handler,14,15,1
+block_hint,CallProperty0Handler,16,17,0
+block_hint,CallProperty0Handler,72,73,0
+block_hint,CallProperty0Handler,55,56,1
+block_hint,CallProperty1Handler,86,87,0
+block_hint,CallProperty1Handler,83,84,0
+block_hint,CallProperty1Handler,64,65,0
+block_hint,CallProperty1Handler,35,36,0
+block_hint,CallProperty1Handler,70,71,1
+block_hint,CallProperty1Handler,51,52,0
+block_hint,CallProperty1Handler,7,8,1
+block_hint,CallProperty1Handler,62,63,0
+block_hint,CallProperty1Handler,14,15,1
+block_hint,CallProperty1Handler,16,17,0
+block_hint,CallProperty1Handler,72,73,0
+block_hint,CallProperty1Handler,55,56,1
+block_hint,CallProperty2Handler,23,24,0
+block_hint,CallProperty2Handler,86,87,0
+block_hint,CallProperty2Handler,83,84,0
+block_hint,CallProperty2Handler,64,65,0
+block_hint,CallProperty2Handler,5,6,1
+block_hint,CallProperty2Handler,47,48,1
+block_hint,CallProperty2Handler,25,26,1
+block_hint,CallProperty2Handler,7,8,1
+block_hint,CallProperty2Handler,14,15,1
+block_hint,CallProperty2Handler,16,17,0
+block_hint,CallProperty2Handler,72,73,0
+block_hint,CallProperty2Handler,55,56,1
+block_hint,CallUndefinedReceiverHandler,86,87,0
+block_hint,CallUndefinedReceiverHandler,83,84,0
+block_hint,CallUndefinedReceiverHandler,64,65,0
+block_hint,CallUndefinedReceiverHandler,35,36,0
+block_hint,CallUndefinedReceiverHandler,70,71,1
+block_hint,CallUndefinedReceiverHandler,51,52,0
+block_hint,CallUndefinedReceiverHandler,29,30,1
+block_hint,CallUndefinedReceiver0Handler,86,87,0
+block_hint,CallUndefinedReceiver0Handler,83,84,0
+block_hint,CallUndefinedReceiver0Handler,64,65,0
+block_hint,CallUndefinedReceiver0Handler,35,36,0
+block_hint,CallUndefinedReceiver0Handler,70,71,1
+block_hint,CallUndefinedReceiver0Handler,51,52,0
+block_hint,CallUndefinedReceiver0Handler,29,30,1
+block_hint,CallUndefinedReceiver1Handler,86,87,0
+block_hint,CallUndefinedReceiver1Handler,83,84,0
+block_hint,CallUndefinedReceiver1Handler,64,65,0
+block_hint,CallUndefinedReceiver1Handler,35,36,0
+block_hint,CallUndefinedReceiver1Handler,70,71,1
+block_hint,CallUndefinedReceiver1Handler,51,52,0
+block_hint,CallUndefinedReceiver1Handler,29,30,1
+block_hint,CallUndefinedReceiver1Handler,7,8,1
+block_hint,CallUndefinedReceiver1Handler,62,63,0
+block_hint,CallUndefinedReceiver1Handler,14,15,1
+block_hint,CallUndefinedReceiver1Handler,16,17,0
+block_hint,CallUndefinedReceiver1Handler,72,73,0
+block_hint,CallUndefinedReceiver1Handler,55,56,1
+block_hint,CallUndefinedReceiver2Handler,23,24,0
+block_hint,CallUndefinedReceiver2Handler,86,87,0
+block_hint,CallUndefinedReceiver2Handler,83,84,0
+block_hint,CallUndefinedReceiver2Handler,64,65,0
+block_hint,CallUndefinedReceiver2Handler,35,36,0
+block_hint,CallUndefinedReceiver2Handler,70,71,1
+block_hint,CallUndefinedReceiver2Handler,51,52,0
+block_hint,CallUndefinedReceiver2Handler,29,30,1
+block_hint,CallUndefinedReceiver2Handler,7,8,1
+block_hint,CallUndefinedReceiver2Handler,62,63,0
+block_hint,CallUndefinedReceiver2Handler,14,15,1
+block_hint,CallUndefinedReceiver2Handler,16,17,0
+block_hint,CallUndefinedReceiver2Handler,72,73,0
+block_hint,CallUndefinedReceiver2Handler,55,56,1
+block_hint,CallWithSpreadHandler,23,24,1
+block_hint,ConstructHandler,52,53,0
+block_hint,ConstructHandler,41,42,1
+block_hint,ConstructHandler,24,25,1
+block_hint,ConstructHandler,15,16,1
+block_hint,ConstructHandler,3,4,1
+block_hint,ConstructHandler,39,40,1
+block_hint,TestEqualHandler,103,104,0
+block_hint,TestEqualHandler,25,26,1
+block_hint,TestEqualHandler,72,73,0
+block_hint,TestEqualHandler,79,80,1
+block_hint,TestEqualHandler,27,28,1
+block_hint,TestEqualHandler,85,86,0
+block_hint,TestEqualHandler,114,115,0
+block_hint,TestEqualHandler,19,20,1
+block_hint,TestEqualStrictHandler,82,83,0
+block_hint,TestEqualStrictHandler,53,54,1
+block_hint,TestEqualStrictHandler,66,67,0
+block_hint,TestEqualStrictHandler,59,60,1
+block_hint,TestEqualStrictHandler,41,42,1
+block_hint,TestEqualStrictHandler,61,62,0
+block_hint,TestEqualStrictHandler,55,56,1
+block_hint,TestEqualStrictHandler,47,48,0
+block_hint,TestEqualStrictHandler,72,73,0
+block_hint,TestEqualStrictHandler,49,50,0
+block_hint,TestEqualStrictHandler,7,8,1
+block_hint,TestLessThanHandler,41,42,0
+block_hint,TestLessThanHandler,63,64,0
+block_hint,TestLessThanHandler,65,66,1
+block_hint,TestLessThanHandler,49,50,1
+block_hint,TestLessThanHandler,9,10,1
+block_hint,TestGreaterThanHandler,41,42,0
+block_hint,TestGreaterThanHandler,45,46,1
+block_hint,TestGreaterThanHandler,9,10,1
+block_hint,TestLessThanOrEqualHandler,41,42,0
+block_hint,TestLessThanOrEqualHandler,9,10,1
+block_hint,TestGreaterThanOrEqualHandler,61,62,0
+block_hint,TestGreaterThanOrEqualHandler,41,42,0
+block_hint,TestGreaterThanOrEqualHandler,63,64,0
+block_hint,TestGreaterThanOrEqualHandler,9,10,1
+block_hint,TestInstanceOfHandler,17,18,1
+block_hint,TestInstanceOfHandler,19,20,1
+block_hint,TestInstanceOfHandler,4,5,1
+block_hint,TestInstanceOfHandler,21,22,1
+block_hint,ToNumericHandler,12,13,0
+block_hint,ToNumericHandler,7,8,1
+block_hint,ToStringHandler,3,4,1
+block_hint,CreateRegExpLiteralHandler,7,8,1
+block_hint,CreateRegExpLiteralHandler,3,4,1
+block_hint,CreateArrayLiteralHandler,38,39,1
+block_hint,CreateArrayLiteralHandler,41,42,1
+block_hint,CreateArrayLiteralHandler,13,14,0
+block_hint,CreateArrayLiteralHandler,50,51,1
+block_hint,CreateArrayLiteralHandler,46,47,1
+block_hint,CreateArrayLiteralHandler,22,23,0
+block_hint,CreateArrayLiteralHandler,28,29,1
+block_hint,CreateArrayLiteralHandler,3,4,1
+block_hint,CreateArrayLiteralHandler,30,31,1
+block_hint,CreateArrayLiteralHandler,5,6,1
+block_hint,CreateEmptyArrayLiteralHandler,3,4,1
+block_hint,CreateEmptyArrayLiteralHandler,13,14,1
+block_hint,CreateEmptyArrayLiteralHandler,5,6,1
+block_hint,CreateEmptyArrayLiteralHandler,15,16,1
+block_hint,CreateObjectLiteralHandler,88,89,0
+block_hint,CreateObjectLiteralHandler,122,123,0
+block_hint,CreateObjectLiteralHandler,116,117,1
+block_hint,CreateObjectLiteralHandler,92,93,1
+block_hint,CreateObjectLiteralHandler,108,109,1
+block_hint,CreateObjectLiteralHandler,72,73,1
+block_hint,CreateObjectLiteralHandler,34,35,0
+block_hint,CreateObjectLiteralHandler,74,75,1
+block_hint,CreateObjectLiteralHandler,64,65,0
+block_hint,CreateEmptyObjectLiteralHandler,4,5,1
+block_hint,CreateEmptyObjectLiteralHandler,11,12,1
+block_hint,CreateEmptyObjectLiteralHandler,6,7,0
+block_hint,CreateClosureHandler,2,3,1
+block_hint,CreateFunctionContextHandler,11,12,1
+block_hint,CreateFunctionContextHandler,4,5,1
+block_hint,CreateFunctionContextHandler,6,7,0
+block_hint,CreateMappedArgumentsHandler,52,53,0
+block_hint,CreateMappedArgumentsHandler,42,43,1
+block_hint,CreateMappedArgumentsHandler,44,45,0
+block_hint,CreateMappedArgumentsHandler,104,105,1
+block_hint,CreateMappedArgumentsHandler,46,47,0
+block_hint,CreateMappedArgumentsHandler,12,13,0
+block_hint,CreateMappedArgumentsHandler,14,15,0
+block_hint,CreateMappedArgumentsHandler,78,79,1
+block_hint,CreateMappedArgumentsHandler,58,59,1
+block_hint,CreateMappedArgumentsHandler,16,17,0
+block_hint,CreateMappedArgumentsHandler,60,61,0
+block_hint,CreateMappedArgumentsHandler,24,25,1
+block_hint,CreateMappedArgumentsHandler,70,71,1
+block_hint,CreateUnmappedArgumentsHandler,16,17,1
+block_hint,CreateUnmappedArgumentsHandler,18,19,0
+block_hint,CreateUnmappedArgumentsHandler,20,21,0
+block_hint,CreateUnmappedArgumentsHandler,7,8,0
+block_hint,CreateUnmappedArgumentsHandler,9,10,0
+block_hint,CreateUnmappedArgumentsHandler,31,32,1
+block_hint,CreateUnmappedArgumentsHandler,25,26,1
+block_hint,CreateUnmappedArgumentsHandler,11,12,0
+block_hint,CreateUnmappedArgumentsHandler,27,28,0
+block_hint,CreateUnmappedArgumentsHandler,13,14,1
+block_hint,CreateUnmappedArgumentsHandler,23,24,1
+block_hint,CreateRestParameterHandler,13,14,0
+block_hint,CreateRestParameterHandler,27,28,0
+block_hint,JumpLoopHandler,34,35,1
+block_hint,JumpLoopHandler,23,24,0
+block_hint,JumpLoopHandler,9,10,1
+block_hint,JumpIfToBooleanTrueConstantHandler,20,21,0
+block_hint,JumpIfToBooleanTrueConstantHandler,6,7,0
+block_hint,JumpIfToBooleanFalseConstantHandler,14,15,0
+block_hint,JumpIfToBooleanFalseConstantHandler,20,21,0
+block_hint,JumpIfToBooleanFalseConstantHandler,6,7,0
+block_hint,JumpIfToBooleanTrueHandler,14,15,0
+block_hint,JumpIfToBooleanTrueHandler,6,7,0
+block_hint,JumpIfToBooleanTrueHandler,8,9,1
+block_hint,JumpIfToBooleanFalseHandler,14,15,0
+block_hint,JumpIfToBooleanFalseHandler,20,21,0
+block_hint,JumpIfToBooleanFalseHandler,6,7,0
+block_hint,JumpIfUndefinedOrNullHandler,3,4,0
+block_hint,JumpIfJSReceiverHandler,5,6,1
+block_hint,JumpIfJSReceiverHandler,3,4,1
+block_hint,SwitchOnSmiNoFeedbackHandler,3,4,0
+block_hint,ForInEnumerateHandler,34,35,1
+block_hint,ForInPrepareHandler,18,19,1
+block_hint,ForInNextHandler,2,3,1
+block_hint,ForInNextHandler,13,14,1
+block_hint,ReturnHandler,3,4,1
+block_hint,ThrowReferenceErrorIfHoleHandler,4,5,0
+block_hint,ThrowSuperNotCalledIfHoleHandler,2,3,0
+block_hint,ThrowSuperAlreadyCalledIfNotHoleHandler,2,3,1
+block_hint,ThrowIfNotSuperConstructorHandler,2,3,1
+block_hint,SuspendGeneratorHandler,14,15,1
+block_hint,SuspendGeneratorHandler,8,9,1
+block_hint,SuspendGeneratorHandler,12,13,1
+block_hint,ResumeGeneratorHandler,10,11,1
+block_hint,ResumeGeneratorHandler,4,5,1
+block_hint,ResumeGeneratorHandler,6,7,1
+block_hint,LdaImmutableContextSlotWideHandler,3,4,1
+block_hint,LdaImmutableContextSlotWideHandler,9,10,0
+block_hint,LdaImmutableContextSlotWideHandler,5,6,1
+block_hint,LdaImmutableCurrentContextSlotWideHandler,2,3,1
+block_hint,LdaGlobalWideHandler,265,266,0
+block_hint,LdaGlobalWideHandler,110,111,1
+block_hint,StaGlobalWideHandler,3,4,0
+block_hint,StaCurrentContextSlotWideHandler,2,3,1
+block_hint,GetNamedPropertyWideHandler,334,335,0
+block_hint,GetNamedPropertyWideHandler,140,141,1
+block_hint,GetKeyedPropertyWideHandler,3,4,0
+block_hint,SetNamedPropertyWideHandler,3,4,0
+block_hint,DefineNamedOwnPropertyWideHandler,3,4,0
+block_hint,SetKeyedPropertyWideHandler,3,4,0
+block_hint,DefineKeyedOwnPropertyWideHandler,3,4,0
+block_hint,StaInArrayLiteralWideHandler,3,4,0
+block_hint,AddWideHandler,82,83,0
+block_hint,AddWideHandler,49,50,0
+block_hint,AddWideHandler,35,36,0
+block_hint,AddWideHandler,78,79,0
+block_hint,AddWideHandler,64,65,1
+block_hint,AddWideHandler,45,46,1
+block_hint,AddWideHandler,27,28,1
+block_hint,AddWideHandler,43,44,1
+block_hint,AddWideHandler,16,17,1
+block_hint,SubWideHandler,75,76,0
+block_hint,SubWideHandler,53,54,0
+block_hint,SubWideHandler,33,34,0
+block_hint,SubWideHandler,13,14,1
+block_hint,MulWideHandler,90,91,0
+block_hint,MulWideHandler,83,84,1
+block_hint,MulWideHandler,69,70,1
+block_hint,MulWideHandler,67,68,1
+block_hint,MulWideHandler,36,37,1
+block_hint,MulWideHandler,17,18,1
+block_hint,BitwiseOrWideHandler,28,29,0
+block_hint,BitwiseOrWideHandler,20,21,1
+block_hint,AddSmiWideHandler,49,50,0
+block_hint,AddSmiWideHandler,35,36,0
+block_hint,MulSmiWideHandler,78,79,0
+block_hint,MulSmiWideHandler,65,66,0
+block_hint,MulSmiWideHandler,34,35,0
+block_hint,MulSmiWideHandler,54,55,1
+block_hint,MulSmiWideHandler,36,37,0
+block_hint,MulSmiWideHandler,42,43,1
+block_hint,MulSmiWideHandler,17,18,1
+block_hint,ModSmiWideHandler,67,68,1
+block_hint,ModSmiWideHandler,60,61,0
+block_hint,ModSmiWideHandler,56,57,1
+block_hint,ModSmiWideHandler,51,52,1
+block_hint,ModSmiWideHandler,28,29,0
+block_hint,ModSmiWideHandler,8,9,0
+block_hint,ModSmiWideHandler,15,16,1
+block_hint,BitwiseOrSmiWideHandler,23,24,0
+block_hint,BitwiseOrSmiWideHandler,6,7,0
+block_hint,BitwiseOrSmiWideHandler,11,12,1
+block_hint,BitwiseAndSmiWideHandler,6,7,0
+block_hint,BitwiseAndSmiWideHandler,18,19,1
+block_hint,ShiftLeftSmiWideHandler,24,25,0
+block_hint,ShiftLeftSmiWideHandler,6,7,0
+block_hint,ShiftLeftSmiWideHandler,40,41,0
+block_hint,ShiftLeftSmiWideHandler,30,31,0
+block_hint,ShiftLeftSmiWideHandler,11,12,1
+block_hint,ShiftRightSmiWideHandler,23,24,0
+block_hint,ShiftRightSmiWideHandler,6,7,0
+block_hint,ShiftRightSmiWideHandler,11,12,1
+block_hint,IncWideHandler,9,10,0
+block_hint,IncWideHandler,25,26,0
+block_hint,IncWideHandler,19,20,0
+block_hint,IncWideHandler,7,8,1
+block_hint,CallPropertyWideHandler,68,69,0
+block_hint,CallPropertyWideHandler,19,20,0
+block_hint,CallProperty0WideHandler,68,69,0
+block_hint,CallProperty0WideHandler,19,20,0
+block_hint,CallProperty1WideHandler,68,69,0
+block_hint,CallProperty1WideHandler,19,20,0
+block_hint,CallProperty2WideHandler,68,69,0
+block_hint,CallProperty2WideHandler,19,20,0
+block_hint,CallUndefinedReceiverWideHandler,68,69,0
+block_hint,CallUndefinedReceiverWideHandler,19,20,0
+block_hint,CallUndefinedReceiver0WideHandler,68,69,0
+block_hint,CallUndefinedReceiver0WideHandler,19,20,0
+block_hint,CallUndefinedReceiver1WideHandler,68,69,0
+block_hint,CallUndefinedReceiver1WideHandler,19,20,0
+block_hint,CallUndefinedReceiver2WideHandler,68,69,0
+block_hint,CallUndefinedReceiver2WideHandler,19,20,0
+block_hint,ConstructWideHandler,49,50,0
+block_hint,ConstructWideHandler,22,23,0
+block_hint,TestEqualWideHandler,103,104,0
+block_hint,TestEqualWideHandler,95,96,0
+block_hint,TestEqualWideHandler,47,48,0
+block_hint,TestEqualWideHandler,7,8,1
+block_hint,TestEqualStrictWideHandler,82,83,0
+block_hint,TestEqualStrictWideHandler,53,54,1
+block_hint,TestEqualStrictWideHandler,55,56,1
+block_hint,TestEqualStrictWideHandler,47,48,0
+block_hint,TestEqualStrictWideHandler,9,10,0
+block_hint,TestEqualStrictWideHandler,4,5,1
+block_hint,TestGreaterThanWideHandler,24,25,0
+block_hint,TestGreaterThanWideHandler,6,7,1
+block_hint,CreateRegExpLiteralWideHandler,14,15,0
+block_hint,CreateRegExpLiteralWideHandler,9,10,1
+block_hint,CreateArrayLiteralWideHandler,42,43,0
+block_hint,CreateArrayLiteralWideHandler,20,21,1
+block_hint,CreateEmptyArrayLiteralWideHandler,22,23,0
+block_hint,CreateEmptyArrayLiteralWideHandler,11,12,1
+block_hint,CreateEmptyArrayLiteralWideHandler,5,6,1
+block_hint,CreateEmptyArrayLiteralWideHandler,15,16,1
+block_hint,CreateObjectLiteralWideHandler,99,100,0
+block_hint,CreateObjectLiteralWideHandler,58,59,1
+block_hint,CreateClosureWideHandler,9,10,1
+block_hint,CreateClosureWideHandler,2,3,1
+block_hint,CreateFunctionContextWideHandler,8,9,0
+block_hint,JumpLoopWideHandler,34,35,1
+block_hint,JumpLoopWideHandler,9,10,1
+block_hint,JumpIfToBooleanTrueWideHandler,18,19,1
+block_hint,JumpIfToBooleanTrueWideHandler,14,15,0
+block_hint,JumpIfToBooleanFalseWideHandler,18,19,1
+block_hint,JumpIfToBooleanFalseWideHandler,14,15,0
+block_hint,JumpIfToBooleanFalseWideHandler,20,21,0
+block_hint,JumpIfToBooleanFalseWideHandler,6,7,0
+block_hint,SwitchOnSmiNoFeedbackWideHandler,5,6,0
+block_hint,SwitchOnSmiNoFeedbackWideHandler,3,4,0
+block_hint,ForInNextWideHandler,11,12,0
+block_hint,ForInNextWideHandler,2,3,1
+block_hint,ForInNextWideHandler,4,5,0
+block_hint,ForInNextWideHandler,9,10,1
+block_hint,LdaGlobalExtraWideHandler,265,266,0
+block_hint,LdaGlobalExtraWideHandler,110,111,1
+block_hint,AddSmiExtraWideHandler,69,70,1
+block_hint,AddSmiExtraWideHandler,43,44,0
+block_hint,AddSmiExtraWideHandler,52,53,1
+block_hint,AddSmiExtraWideHandler,16,17,1
+block_hint,DivSmiExtraWideHandler,73,74,0
+block_hint,DivSmiExtraWideHandler,69,70,0
+block_hint,DivSmiExtraWideHandler,78,79,0
+block_hint,DivSmiExtraWideHandler,64,65,0
+block_hint,DivSmiExtraWideHandler,35,36,0
+block_hint,DivSmiExtraWideHandler,43,44,1
+block_hint,DivSmiExtraWideHandler,23,24,1
+block_hint,BitwiseAndSmiExtraWideHandler,31,32,1
+block_hint,BitwiseAndSmiExtraWideHandler,35,36,0
+block_hint,BitwiseAndSmiExtraWideHandler,29,30,0
+block_hint,BitwiseAndSmiExtraWideHandler,18,19,1
+block_hint,CallUndefinedReceiver1ExtraWideHandler,68,69,0
+block_hint,CallUndefinedReceiver1ExtraWideHandler,19,20,0
+builtin_hash,RecordWriteSaveFP,626390513
+builtin_hash,RecordWriteIgnoreFP,626390513
+builtin_hash,EphemeronKeyBarrierSaveFP,-719755886
+builtin_hash,AdaptorWithBuiltinExitFrame,-506288945
+builtin_hash,Call_ReceiverIsNullOrUndefined_Baseline_Compact,-634465027
+builtin_hash,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,-585445450
+builtin_hash,Call_ReceiverIsAny_Baseline_Compact,-585445450
+builtin_hash,CallProxy,690784589
+builtin_hash,CallWithSpread,-1022926733
+builtin_hash,CallWithSpread_Baseline,-849069302
+builtin_hash,CallWithArrayLike,459945534
+builtin_hash,ConstructWithSpread,872318319
+builtin_hash,ConstructWithSpread_Baseline,-872100778
+builtin_hash,Construct_Baseline,-106849933
+builtin_hash,FastNewObject,-1018095454
+builtin_hash,FastNewClosure,-910014514
+builtin_hash,StringEqual,-711928119
+builtin_hash,StringGreaterThan,-416690019
+builtin_hash,StringGreaterThanOrEqual,-1054396153
+builtin_hash,StringLessThan,-1054396153
+builtin_hash,StringLessThanOrEqual,-416690019
+builtin_hash,StringSubstring,358251310
+builtin_hash,OrderedHashTableHealIndex,725955381
+builtin_hash,CompileLazy,504995397
+builtin_hash,CompileLazyDeoptimizedCode,748068919
+builtin_hash,InstantiateAsmJs,-697690741
+builtin_hash,AllocateInYoungGeneration,214124693
+builtin_hash,AllocateRegularInYoungGeneration,-141910266
+builtin_hash,AllocateRegularInOldGeneration,-141910266
+builtin_hash,CopyFastSmiOrObjectElements,-883587649
+builtin_hash,GrowFastDoubleElements,-1000340886
+builtin_hash,GrowFastSmiOrObjectElements,36929045
+builtin_hash,ToNumber,-151588116
+builtin_hash,ToNumber_Baseline,435851851
+builtin_hash,ToNumeric_Baseline,15745649
+builtin_hash,ToNumberConvertBigInt,251501190
+builtin_hash,Typeof,-685026400
+builtin_hash,KeyedLoadIC_PolymorphicName,59242921
+builtin_hash,KeyedStoreIC_Megamorphic,283484746
+builtin_hash,DefineKeyedOwnIC_Megamorphic,969546395
+builtin_hash,LoadGlobalIC_NoFeedback,-412177004
+builtin_hash,LoadIC_FunctionPrototype,-696483123
+builtin_hash,LoadIC_StringLength,695888016
+builtin_hash,LoadIC_StringWrapperLength,-366408146
+builtin_hash,LoadIC_NoFeedback,529908718
+builtin_hash,StoreIC_NoFeedback,519102631
+builtin_hash,DefineNamedOwnIC_NoFeedback,-983253079
+builtin_hash,KeyedLoadIC_SloppyArguments,-578047658
+builtin_hash,StoreFastElementIC_Standard,856806958
+builtin_hash,StoreFastElementIC_GrowNoTransitionHandleCOW,295024286
+builtin_hash,StoreFastElementIC_NoTransitionHandleCOW,825368452
+builtin_hash,ElementsTransitionAndStore_Standard,-891826531
+builtin_hash,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,-562086358
+builtin_hash,ElementsTransitionAndStore_NoTransitionHandleCOW,154727773
+builtin_hash,KeyedHasIC_PolymorphicName,681066279
+builtin_hash,EnqueueMicrotask,997834086
+builtin_hash,RunMicrotasks,835697778
+builtin_hash,HasProperty,325671088
+builtin_hash,DeleteProperty,362124331
+builtin_hash,SetDataProperties,649615472
+builtin_hash,ReturnReceiver,-720171624
+builtin_hash,ArrayConstructor,-709634836
+builtin_hash,ArrayConstructorImpl,106723908
+builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DontOverride,-22521131
+builtin_hash,ArrayNoArgumentConstructor_HoleySmi_DontOverride,-22521131
+builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DisableAllocationSites,-1046128045
+builtin_hash,ArrayNoArgumentConstructor_Packed_DisableAllocationSites,-1046128045
+builtin_hash,ArrayNoArgumentConstructor_Holey_DisableAllocationSites,-1046128045
+builtin_hash,ArrayNoArgumentConstructor_PackedDouble_DisableAllocationSites,-89922726
+builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DontOverride,-249912913
+builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,452895553
+builtin_hash,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,452895553
+builtin_hash,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,97007850
+builtin_hash,ArrayIncludesSmi,52014377
+builtin_hash,ArrayIncludesSmiOrObject,194648631
+builtin_hash,ArrayIncludes,-547277433
+builtin_hash,ArrayIndexOfSmi,-203639532
+builtin_hash,ArrayIndexOfSmiOrObject,547347825
+builtin_hash,ArrayIndexOf,917956553
+builtin_hash,ArrayPrototypePop,-480442047
+builtin_hash,ArrayPrototypePush,879036958
+builtin_hash,CloneFastJSArray,330965023
+builtin_hash,CloneFastJSArrayFillingHoles,356661348
+builtin_hash,ExtractFastJSArray,-420221067
+builtin_hash,ArrayPrototypeEntries,138422158
+builtin_hash,ArrayPrototypeKeys,-3226360
+builtin_hash,ArrayPrototypeValues,138422158
+builtin_hash,ArrayIteratorPrototypeNext,957293662
+builtin_hash,AsyncFunctionEnter,-1043254273
+builtin_hash,AsyncFunctionResolve,847009948
+builtin_hash,AsyncFunctionAwaitCaught,-616846371
+builtin_hash,AsyncFunctionAwaitUncaught,-616846371
+builtin_hash,AsyncFunctionAwaitResolveClosure,518113046
+builtin_hash,DatePrototypeGetDate,517103214
+builtin_hash,DatePrototypeGetDay,517103214
+builtin_hash,DatePrototypeGetFullYear,517103214
+builtin_hash,DatePrototypeGetHours,517103214
+builtin_hash,DatePrototypeGetMilliseconds,402424200
+builtin_hash,DatePrototypeGetMinutes,517103214
+builtin_hash,DatePrototypeGetMonth,517103214
+builtin_hash,DatePrototypeGetSeconds,517103214
+builtin_hash,DatePrototypeGetTime,-634509018
+builtin_hash,DatePrototypeGetTimezoneOffset,402424200
+builtin_hash,DatePrototypeValueOf,-634509018
+builtin_hash,DatePrototypeToPrimitive,601732193
+builtin_hash,CreateIterResultObject,277090833
+builtin_hash,CreateGeneratorObject,-109733150
+builtin_hash,GeneratorPrototypeNext,-337770274
+builtin_hash,GeneratorPrototypeReturn,-356725560
+builtin_hash,SuspendGeneratorBaseline,877095808
+builtin_hash,ResumeGeneratorBaseline,263125026
+builtin_hash,GlobalIsFinite,-487573831
+builtin_hash,GlobalIsNaN,-507424666
+builtin_hash,LoadIC,1072966044
+builtin_hash,LoadIC_Megamorphic,132390484
+builtin_hash,LoadIC_Noninlined,-1003101269
+builtin_hash,LoadICTrampoline,709645727
+builtin_hash,LoadICBaseline,150897937
+builtin_hash,LoadICTrampoline_Megamorphic,709645727
+builtin_hash,LoadSuperIC,-323552047
+builtin_hash,LoadSuperICBaseline,489833039
+builtin_hash,KeyedLoadIC,166545115
+builtin_hash,KeyedLoadIC_Megamorphic,483505882
+builtin_hash,KeyedLoadICTrampoline,709645727
+builtin_hash,KeyedLoadICBaseline,150897937
+builtin_hash,KeyedLoadICTrampoline_Megamorphic,709645727
+builtin_hash,StoreGlobalIC,-192111648
+builtin_hash,StoreGlobalICTrampoline,709645727
+builtin_hash,StoreGlobalICBaseline,150897937
+builtin_hash,StoreIC,1060265796
+builtin_hash,StoreICTrampoline,1046844053
+builtin_hash,StoreICBaseline,489833039
+builtin_hash,DefineNamedOwnIC,-883359916
+builtin_hash,DefineNamedOwnICBaseline,489833039
+builtin_hash,KeyedStoreIC,-187772846
+builtin_hash,KeyedStoreICTrampoline,1046844053
+builtin_hash,KeyedStoreICBaseline,489833039
+builtin_hash,DefineKeyedOwnIC,229093376
+builtin_hash,StoreInArrayLiteralIC,84243524
+builtin_hash,StoreInArrayLiteralICBaseline,489833039
+builtin_hash,LoadGlobalIC,443237854
+builtin_hash,LoadGlobalICInsideTypeof,34880284
+builtin_hash,LoadGlobalICTrampoline,-306966323
+builtin_hash,LoadGlobalICBaseline,162605878
+builtin_hash,LoadGlobalICInsideTypeofTrampoline,-306966323
+builtin_hash,LoadGlobalICInsideTypeofBaseline,162605878
+builtin_hash,LookupGlobalICBaseline,658263603
+builtin_hash,LookupGlobalICInsideTypeofBaseline,658263603
+builtin_hash,KeyedHasIC,-184159247
+builtin_hash,KeyedHasICBaseline,150897937
+builtin_hash,KeyedHasIC_Megamorphic,325671088
+builtin_hash,IterableToList,-927449562
+builtin_hash,IterableToListWithSymbolLookup,-708423733
+builtin_hash,IterableToListMayPreserveHoles,-1051869903
+builtin_hash,FindOrderedHashMapEntry,-320047027
+builtin_hash,MapConstructor,-273849543
+builtin_hash,MapPrototypeSet,-438010061
+builtin_hash,MapPrototypeDelete,-650460231
+builtin_hash,MapPrototypeGet,-169555850
+builtin_hash,MapPrototypeHas,801403049
+builtin_hash,MapPrototypeEntries,-1013383243
+builtin_hash,MapPrototypeGetSize,-643608746
+builtin_hash,MapPrototypeForEach,397971331
+builtin_hash,MapPrototypeKeys,-1013383243
+builtin_hash,MapPrototypeValues,-1013383243
+builtin_hash,MapIteratorPrototypeNext,-58230590
+builtin_hash,MapIteratorToList,-500405827
+builtin_hash,SameValueNumbersOnly,225193452
+builtin_hash,Add_Baseline,986710997
+builtin_hash,AddSmi_Baseline,422902597
+builtin_hash,Subtract_Baseline,515924102
+builtin_hash,SubtractSmi_Baseline,-270105773
+builtin_hash,Multiply_Baseline,1010707471
+builtin_hash,MultiplySmi_Baseline,-436355449
+builtin_hash,Divide_Baseline,-545594124
+builtin_hash,DivideSmi_Baseline,-730711433
+builtin_hash,Modulus_Baseline,368591854
+builtin_hash,ModulusSmi_Baseline,-170655443
+builtin_hash,Exponentiate_Baseline,957426187
+builtin_hash,BitwiseAnd_Baseline,354476460
+builtin_hash,BitwiseAndSmi_Baseline,828880803
+builtin_hash,BitwiseOr_Baseline,-583084875
+builtin_hash,BitwiseOrSmi_Baseline,-795226409
+builtin_hash,BitwiseXor_Baseline,1012539154
+builtin_hash,BitwiseXorSmi_Baseline,-392216447
+builtin_hash,ShiftLeft_Baseline,361604397
+builtin_hash,ShiftLeftSmi_Baseline,5007264
+builtin_hash,ShiftRight_Baseline,-420303545
+builtin_hash,ShiftRightSmi_Baseline,-112240434
+builtin_hash,ShiftRightLogical_Baseline,540201589
+builtin_hash,ShiftRightLogicalSmi_Baseline,788439127
+builtin_hash,Add_WithFeedback,-229648387
+builtin_hash,Subtract_WithFeedback,376218593
+builtin_hash,Modulus_WithFeedback,-94506121
+builtin_hash,BitwiseOr_WithFeedback,468043323
+builtin_hash,Equal_Baseline,124000003
+builtin_hash,StrictEqual_Baseline,-1036096086
+builtin_hash,LessThan_Baseline,215883171
+builtin_hash,GreaterThan_Baseline,-830551473
+builtin_hash,LessThanOrEqual_Baseline,580468296
+builtin_hash,GreaterThanOrEqual_Baseline,146507237
+builtin_hash,Equal_WithFeedback,-1006818792
+builtin_hash,StrictEqual_WithFeedback,-600679172
+builtin_hash,LessThan_WithFeedback,-280032142
+builtin_hash,GreaterThan_WithFeedback,-753289225
+builtin_hash,GreaterThanOrEqual_WithFeedback,-99952431
+builtin_hash,BitwiseNot_Baseline,-805521700
+builtin_hash,Decrement_Baseline,-802142449
+builtin_hash,Increment_Baseline,-165792101
+builtin_hash,Negate_Baseline,-490529739
+builtin_hash,ObjectAssign,-223190746
+builtin_hash,ObjectCreate,-412976913
+builtin_hash,ObjectEntries,-161513173
+builtin_hash,ObjectGetOwnPropertyDescriptor,-318975900
+builtin_hash,ObjectGetOwnPropertyNames,-771378931
+builtin_hash,ObjectIs,754529791
+builtin_hash,ObjectKeys,868266099
+builtin_hash,ObjectPrototypeHasOwnProperty,368139529
+builtin_hash,ObjectToString,-682499204
+builtin_hash,InstanceOf_WithFeedback,-1073126021
+builtin_hash,InstanceOf_Baseline,-322167849
+builtin_hash,ForInEnumerate,-155288347
+builtin_hash,ForInPrepare,-765799522
+builtin_hash,ForInFilter,562291169
+builtin_hash,RegExpConstructor,646833247
+builtin_hash,RegExpExecAtom,345347095
+builtin_hash,RegExpExecInternal,1011835160
+builtin_hash,FindOrderedHashSetEntry,-610957306
+builtin_hash,SetConstructor,-240775710
+builtin_hash,SetPrototypeHas,801403049
+builtin_hash,SetPrototypeAdd,173213477
+builtin_hash,SetPrototypeDelete,-593129092
+builtin_hash,SetPrototypeEntries,-1013383243
+builtin_hash,SetPrototypeGetSize,-643608746
+builtin_hash,SetPrototypeForEach,335951491
+builtin_hash,SetPrototypeValues,-1013383243
+builtin_hash,SetIteratorPrototypeNext,-665998715
+builtin_hash,SetOrSetIteratorToList,-885447300
+builtin_hash,StringFromCharCode,-912540455
+builtin_hash,StringPrototypeReplace,66129801
+builtin_hash,StringPrototypeSplit,-362413227
+builtin_hash,TypedArrayConstructor,784903226
+builtin_hash,TypedArrayPrototypeByteLength,-727961620
+builtin_hash,TypedArrayPrototypeLength,733765018
+builtin_hash,WeakMapConstructor,1062092506
+builtin_hash,WeakMapLookupHashIndex,-142601393
+builtin_hash,WeakMapGet,294891847
+builtin_hash,WeakMapPrototypeHas,849790636
+builtin_hash,WeakMapPrototypeSet,345042088
+builtin_hash,WeakSetConstructor,105581429
+builtin_hash,WeakSetPrototypeHas,849790636
+builtin_hash,WeakSetPrototypeAdd,617138317
+builtin_hash,WeakCollectionSet,166987452
+builtin_hash,AsyncGeneratorResolve,249154931
+builtin_hash,AsyncGeneratorYieldWithAwait,295024719
+builtin_hash,AsyncGeneratorResumeNext,-291585996
+builtin_hash,AsyncGeneratorPrototypeNext,-917251663
+builtin_hash,AsyncGeneratorAwaitUncaught,-475035157
+builtin_hash,AsyncGeneratorAwaitResolveClosure,252907365
+builtin_hash,AsyncGeneratorYieldWithAwaitResolveClosure,523444337
+builtin_hash,StringAdd_CheckNone,122784498
+builtin_hash,SubString,42338335
+builtin_hash,GetProperty,244104330
+builtin_hash,GetPropertyWithReceiver,-361896834
+builtin_hash,SetProperty,-14606917
+builtin_hash,CreateDataProperty,56144293
+builtin_hash,ArrayPrototypeConcat,-629648509
+builtin_hash,ArrayEvery,420214237
+builtin_hash,ArrayFilterLoopLazyDeoptContinuation,784278374
+builtin_hash,ArrayFilterLoopContinuation,-537020475
+builtin_hash,ArrayFilter,1060321948
+builtin_hash,ArrayPrototypeFind,-585495057
+builtin_hash,ArrayForEachLoopLazyDeoptContinuation,-696710490
+builtin_hash,ArrayForEachLoopContinuation,168795773
+builtin_hash,ArrayForEach,707321002
+builtin_hash,ArrayFrom,-659188931
+builtin_hash,ArrayIsArray,232602198
+builtin_hash,LoadJoinElement_FastSmiOrObjectElements_0,680814132
+builtin_hash,LoadJoinElement_FastDoubleElements_0,-901304444
+builtin_hash,JoinStackPush,-686648212
+builtin_hash,JoinStackPop,190013026
+builtin_hash,ArrayPrototypeJoin,-35537300
+builtin_hash,ArrayPrototypeToString,-918592343
+builtin_hash,ArrayPrototypeLastIndexOf,17251424
+builtin_hash,ArrayMapLoopLazyDeoptContinuation,571271309
+builtin_hash,ArrayMapLoopContinuation,323522123
+builtin_hash,ArrayMap,301006305
+builtin_hash,ArrayReduceLoopLazyDeoptContinuation,802810816
+builtin_hash,ArrayReduceLoopContinuation,90909940
+builtin_hash,ArrayReduce,-82429841
+builtin_hash,ArrayPrototypeReverse,419566432
+builtin_hash,ArrayPrototypeShift,70747297
+builtin_hash,ArrayPrototypeSlice,-52082583
+builtin_hash,ArraySome,793025165
+builtin_hash,ArrayPrototypeSplice,-778396927
+builtin_hash,ArrayPrototypeUnshift,874971167
+builtin_hash,ArrayBufferPrototypeGetByteLength,856452822
+builtin_hash,ArrayBufferIsView,1032022175
+builtin_hash,ToInteger,571151444
+builtin_hash,FastCreateDataProperty,870096873
+builtin_hash,BooleanConstructor,404195496
+builtin_hash,BooleanPrototypeToString,238471687
+builtin_hash,ToString,-884108556
+builtin_hash,StringPrototypeToString,-772653609
+builtin_hash,StringPrototypeValueOf,-772653609
+builtin_hash,StringPrototypeCharAt,888809448
+builtin_hash,StringPrototypeCharCodeAt,-227472234
+builtin_hash,StringPrototypeCodePointAt,61946543
+builtin_hash,StringPrototypeConcat,861254127
+builtin_hash,StringConstructor,-918118629
+builtin_hash,StringAddConvertLeft,-219299649
+builtin_hash,StringAddConvertRight,616228664
+builtin_hash,StringCharAt,-4884031
+builtin_hash,FastNewClosureBaseline,-52998587
+builtin_hash,FastNewFunctionContextFunction,-1009868545
+builtin_hash,CreateRegExpLiteral,1052197216
+builtin_hash,CreateShallowArrayLiteral,-964230745
+builtin_hash,CreateEmptyArrayLiteral,223771159
+builtin_hash,CreateShallowObjectLiteral,608722722
+builtin_hash,ObjectConstructor,964183658
+builtin_hash,CreateEmptyLiteralObject,-604735671
+builtin_hash,NumberConstructor,71247802
+builtin_hash,StringToNumber,338191864
+builtin_hash,NonNumberToNumber,-935639762
+builtin_hash,NonNumberToNumeric,772033950
+builtin_hash,ToNumeric,1038000251
+builtin_hash,NumberToString,349605053
+builtin_hash,ToBoolean,-651891533
+builtin_hash,ToBooleanForBaselineJump,-345306524
+builtin_hash,ToLength,334926030
+builtin_hash,ToName,-958704264
+builtin_hash,ToObject,466844704
+builtin_hash,NonPrimitiveToPrimitive_Default,-135149567
+builtin_hash,NonPrimitiveToPrimitive_Number,-135149567
+builtin_hash,NonPrimitiveToPrimitive_String,-135149567
+builtin_hash,OrdinaryToPrimitive_Number,977211335
+builtin_hash,OrdinaryToPrimitive_String,977211335
+builtin_hash,DataViewPrototypeGetByteLength,-813425866
+builtin_hash,DataViewPrototypeGetFloat64,-154734323
+builtin_hash,DataViewPrototypeSetUint32,816035861
+builtin_hash,DataViewPrototypeSetFloat64,779399418
+builtin_hash,FunctionPrototypeHasInstance,-95071236
+builtin_hash,FastFunctionPrototypeBind,-731291747
+builtin_hash,ForInNext,-935081187
+builtin_hash,GetIteratorWithFeedback,952367600
+builtin_hash,GetIteratorBaseline,-428929310
+builtin_hash,CallIteratorWithFeedback,-997498631
+builtin_hash,MathAbs,791053705
+builtin_hash,MathCeil,479583478
+builtin_hash,MathFloor,843767669
+builtin_hash,MathRound,679517696
+builtin_hash,MathPow,315117335
+builtin_hash,MathMax,170958432
+builtin_hash,MathMin,-697028591
+builtin_hash,MathAsin,546404306
+builtin_hash,MathAtan2,-509511765
+builtin_hash,MathCos,907147156
+builtin_hash,MathExp,-622287064
+builtin_hash,MathFround,951312971
+builtin_hash,MathImul,750440578
+builtin_hash,MathLog,-240154692
+builtin_hash,MathSin,-666255595
+builtin_hash,MathSign,358296598
+builtin_hash,MathSqrt,376524398
+builtin_hash,MathTan,509900921
+builtin_hash,MathTanh,-99681025
+builtin_hash,MathRandom,761144822
+builtin_hash,NumberPrototypeToString,-379708910
+builtin_hash,NumberIsInteger,-216955149
+builtin_hash,NumberIsNaN,-901582353
+builtin_hash,NumberParseFloat,-608188050
+builtin_hash,ParseInt,-160264841
+builtin_hash,NumberParseInt,-548370817
+builtin_hash,Add,564570422
+builtin_hash,Subtract,638154168
+builtin_hash,Multiply,492896985
+builtin_hash,Divide,-323417562
+builtin_hash,Modulus,-1073163320
+builtin_hash,CreateObjectWithoutProperties,-847663210
+builtin_hash,ObjectIsExtensible,152531438
+builtin_hash,ObjectPreventExtensions,-713378297
+builtin_hash,ObjectGetPrototypeOf,-270542452
+builtin_hash,ObjectSetPrototypeOf,-46279001
+builtin_hash,ObjectPrototypeToString,799867293
+builtin_hash,ObjectPrototypeValueOf,681014822
+builtin_hash,FulfillPromise,-157790719
+builtin_hash,NewPromiseCapability,-849832514
+builtin_hash,PromiseCapabilityDefaultResolve,198574955
+builtin_hash,PerformPromiseThen,-1003545837
+builtin_hash,PromiseAll,172257811
+builtin_hash,PromiseAllResolveElementClosure,-429070847
+builtin_hash,PromiseConstructor,-813002504
+builtin_hash,PromisePrototypeCatch,881185065
+builtin_hash,PromiseFulfillReactionJob,1069906663
+builtin_hash,PromiseResolveTrampoline,584305889
+builtin_hash,PromiseResolve,774376525
+builtin_hash,ResolvePromise,-348045499
+builtin_hash,PromisePrototypeThen,972876029
+builtin_hash,PromiseResolveThenableJob,-24601962
+builtin_hash,ProxyConstructor,462534935
+builtin_hash,ProxyGetProperty,-1026339756
+builtin_hash,ProxyIsExtensible,-863573816
+builtin_hash,ProxyPreventExtensions,139876653
+builtin_hash,ReflectGet,-917044458
+builtin_hash,ReflectHas,584305889
+builtin_hash,RegExpPrototypeExec,-1050512290
+builtin_hash,RegExpMatchFast,794780294
+builtin_hash,RegExpReplace,-599615598
+builtin_hash,RegExpPrototypeReplace,985947001
+builtin_hash,RegExpSearchFast,-655744379
+builtin_hash,RegExpPrototypeSourceGetter,-842127011
+builtin_hash,RegExpSplit,882917446
+builtin_hash,RegExpPrototypeTest,36603632
+builtin_hash,RegExpPrototypeTestFast,170577886
+builtin_hash,RegExpPrototypeGlobalGetter,-787799554
+builtin_hash,RegExpPrototypeIgnoreCaseGetter,198844413
+builtin_hash,RegExpPrototypeMultilineGetter,-910406363
+builtin_hash,RegExpPrototypeHasIndicesGetter,738086388
+builtin_hash,RegExpPrototypeDotAllGetter,334669429
+builtin_hash,RegExpPrototypeStickyGetter,800064458
+builtin_hash,RegExpPrototypeUnicodeGetter,489690780
+builtin_hash,RegExpPrototypeFlagsGetter,-224095936
+builtin_hash,StringPrototypeEndsWith,-987712417
+builtin_hash,StringPrototypeIncludes,-217252393
+builtin_hash,StringPrototypeIndexOf,633191246
+builtin_hash,StringPrototypeIterator,836933598
+builtin_hash,StringIteratorPrototypeNext,-913259598
+builtin_hash,StringPrototypeMatch,634725082
+builtin_hash,StringPrototypeSearch,634725082
+builtin_hash,StringRepeat,146146790
+builtin_hash,StringPrototypeSlice,-354759606
+builtin_hash,StringPrototypeStartsWith,-27064544
+builtin_hash,StringPrototypeSubstr,-580369335
+builtin_hash,StringPrototypeSubstring,432057087
+builtin_hash,StringPrototypeTrim,413903909
+builtin_hash,SymbolPrototypeToString,-299401864
+builtin_hash,CreateTypedArray,680205708
+builtin_hash,TypedArrayFrom,-1010794576
+builtin_hash,TypedArrayPrototypeSet,908791947
+builtin_hash,TypedArrayPrototypeSubArray,-259511191
+builtin_hash,NewSloppyArgumentsElements,987039656
+builtin_hash,NewStrictArgumentsElements,811685066
+builtin_hash,NewRestArgumentsElements,506972005
+builtin_hash,FastNewSloppyArguments,266310136
+builtin_hash,FastNewStrictArguments,292190921
+builtin_hash,FastNewRestArguments,757900916
+builtin_hash,StringSlowFlatten,-1052562445
+builtin_hash,StringIndexOf,257386893
+builtin_hash,Load_FastSmiElements_0,1073407008
+builtin_hash,Load_FastObjectElements_0,1073407008
+builtin_hash,Store_FastSmiElements_0,30666818
+builtin_hash,Store_FastObjectElements_0,951821143
+builtin_hash,SortCompareDefault,367817675
+builtin_hash,SortCompareUserFn,713062731
+builtin_hash,Copy,314823270
+builtin_hash,MergeAt,238953995
+builtin_hash,GallopLeft,-902489773
+builtin_hash,GallopRight,-89876014
+builtin_hash,ArrayTimSort,241000486
+builtin_hash,ArrayPrototypeSort,304686317
+builtin_hash,StringFastLocaleCompare,805312292
+builtin_hash,WasmInt32ToHeapNumber,-952774935
+builtin_hash,WasmTaggedNonSmiToInt32,-293378356
+builtin_hash,WasmTriggerTierUp,429384824
+builtin_hash,WasmStackGuard,1062523926
+builtin_hash,CanUseSameAccessor_FastSmiElements_0,185432218
+builtin_hash,CanUseSameAccessor_FastObjectElements_0,185432218
+builtin_hash,StringPrototypeToLowerCaseIntl,-318663010
+builtin_hash,StringToLowerCaseIntl,545745188
+builtin_hash,WideHandler,-1007335397
+builtin_hash,ExtraWideHandler,-1007335397
+builtin_hash,LdarHandler,-107846222
+builtin_hash,LdaZeroHandler,-1049743757
+builtin_hash,LdaSmiHandler,578097911
+builtin_hash,LdaUndefinedHandler,929864141
+builtin_hash,LdaNullHandler,929864141
+builtin_hash,LdaTheHoleHandler,929864141
+builtin_hash,LdaTrueHandler,-722702248
+builtin_hash,LdaFalseHandler,-722702248
+builtin_hash,LdaConstantHandler,16269541
+builtin_hash,LdaContextSlotHandler,-824239973
+builtin_hash,LdaImmutableContextSlotHandler,-824239973
+builtin_hash,LdaCurrentContextSlotHandler,797490234
+builtin_hash,LdaImmutableCurrentContextSlotHandler,797490234
+builtin_hash,StarHandler,833251632
+builtin_hash,MovHandler,154956537
+builtin_hash,PushContextHandler,-12168674
+builtin_hash,PopContextHandler,-245935867
+builtin_hash,TestReferenceEqualHandler,149010419
+builtin_hash,TestUndetectableHandler,-14656053
+builtin_hash,TestNullHandler,231206083
+builtin_hash,TestUndefinedHandler,231206083
+builtin_hash,TestTypeOfHandler,811742421
+builtin_hash,LdaGlobalHandler,-713975577
+builtin_hash,LdaGlobalInsideTypeofHandler,-1036637473
+builtin_hash,StaGlobalHandler,860070325
+builtin_hash,StaContextSlotHandler,506961255
+builtin_hash,StaCurrentContextSlotHandler,-476609776
+builtin_hash,LdaLookupGlobalSlotHandler,-579647044
+builtin_hash,LdaLookupGlobalSlotInsideTypeofHandler,-981566026
+builtin_hash,StaLookupSlotHandler,-26776709
+builtin_hash,GetNamedPropertyHandler,12677554
+builtin_hash,GetNamedPropertyFromSuperHandler,266004833
+builtin_hash,GetKeyedPropertyHandler,886814234
+builtin_hash,SetNamedPropertyHandler,535113985
+builtin_hash,DefineNamedOwnPropertyHandler,535113985
+builtin_hash,SetKeyedPropertyHandler,-966762662
+builtin_hash,DefineKeyedOwnPropertyHandler,-966762662
+builtin_hash,StaInArrayLiteralHandler,-966762662
+builtin_hash,DefineKeyedOwnPropertyInLiteralHandler,587951803
+builtin_hash,AddHandler,-1005617859
+builtin_hash,SubHandler,-392643217
+builtin_hash,MulHandler,774043098
+builtin_hash,DivHandler,-851134889
+builtin_hash,ModHandler,-974972127
+builtin_hash,ExpHandler,315906749
+builtin_hash,BitwiseOrHandler,-743595958
+builtin_hash,BitwiseXorHandler,250559085
+builtin_hash,BitwiseAndHandler,-517136702
+builtin_hash,ShiftLeftHandler,96191474
+builtin_hash,ShiftRightHandler,527145177
+builtin_hash,ShiftRightLogicalHandler,-262573075
+builtin_hash,AddSmiHandler,80685265
+builtin_hash,SubSmiHandler,3480492
+builtin_hash,MulSmiHandler,125802928
+builtin_hash,DivSmiHandler,639417969
+builtin_hash,ModSmiHandler,725314466
+builtin_hash,BitwiseOrSmiHandler,-982449315
+builtin_hash,BitwiseXorSmiHandler,-243744730
+builtin_hash,BitwiseAndSmiHandler,-177147003
+builtin_hash,ShiftLeftSmiHandler,-1064587438
+builtin_hash,ShiftRightSmiHandler,1063683921
+builtin_hash,ShiftRightLogicalSmiHandler,-471648394
+builtin_hash,IncHandler,-827986722
+builtin_hash,DecHandler,-353459880
+builtin_hash,NegateHandler,-400765437
+builtin_hash,BitwiseNotHandler,70967995
+builtin_hash,ToBooleanLogicalNotHandler,907700753
+builtin_hash,LogicalNotHandler,-207609416
+builtin_hash,TypeOfHandler,953802635
+builtin_hash,DeletePropertyStrictHandler,-316449707
+builtin_hash,DeletePropertySloppyHandler,808036376
+builtin_hash,GetSuperConstructorHandler,251341877
+builtin_hash,CallAnyReceiverHandler,439143156
+builtin_hash,CallPropertyHandler,439143156
+builtin_hash,CallProperty0Handler,-534603169
+builtin_hash,CallProperty1Handler,498249779
+builtin_hash,CallProperty2Handler,-819411032
+builtin_hash,CallUndefinedReceiverHandler,594463859
+builtin_hash,CallUndefinedReceiver0Handler,-846775891
+builtin_hash,CallUndefinedReceiver1Handler,-295634644
+builtin_hash,CallUndefinedReceiver2Handler,-184450155
+builtin_hash,CallWithSpreadHandler,439143156
+builtin_hash,CallRuntimeHandler,577184417
+builtin_hash,CallJSRuntimeHandler,611687015
+builtin_hash,InvokeIntrinsicHandler,-984127378
+builtin_hash,ConstructHandler,-721343708
+builtin_hash,ConstructWithSpreadHandler,-306460848
+builtin_hash,TestEqualHandler,808271421
+builtin_hash,TestEqualStrictHandler,329888735
+builtin_hash,TestLessThanHandler,470012740
+builtin_hash,TestGreaterThanHandler,-1062728522
+builtin_hash,TestLessThanOrEqualHandler,567090722
+builtin_hash,TestGreaterThanOrEqualHandler,386329922
+builtin_hash,TestInstanceOfHandler,490446195
+builtin_hash,TestInHandler,839610057
+builtin_hash,ToNameHandler,-725569033
+builtin_hash,ToNumberHandler,1020792744
+builtin_hash,ToNumericHandler,157199207
+builtin_hash,ToObjectHandler,-725569033
+builtin_hash,ToStringHandler,-98710919
+builtin_hash,CreateRegExpLiteralHandler,-121212255
+builtin_hash,CreateArrayLiteralHandler,266431889
+builtin_hash,CreateArrayFromIterableHandler,52334283
+builtin_hash,CreateEmptyArrayLiteralHandler,115537807
+builtin_hash,CreateObjectLiteralHandler,618199371
+builtin_hash,CreateEmptyObjectLiteralHandler,740591432
+builtin_hash,CreateClosureHandler,2501418
+builtin_hash,CreateBlockContextHandler,666399130
+builtin_hash,CreateCatchContextHandler,22630037
+builtin_hash,CreateFunctionContextHandler,-865490982
+builtin_hash,CreateMappedArgumentsHandler,697758196
+builtin_hash,CreateUnmappedArgumentsHandler,-1055788256
+builtin_hash,CreateRestParameterHandler,-320411861
+builtin_hash,JumpLoopHandler,-662751978
+builtin_hash,JumpHandler,182907248
+builtin_hash,JumpConstantHandler,736061566
+builtin_hash,JumpIfUndefinedConstantHandler,-462384230
+builtin_hash,JumpIfNotUndefinedConstantHandler,148504964
+builtin_hash,JumpIfUndefinedOrNullConstantHandler,444469070
+builtin_hash,JumpIfTrueConstantHandler,-462384230
+builtin_hash,JumpIfFalseConstantHandler,-462384230
+builtin_hash,JumpIfToBooleanTrueConstantHandler,-247852105
+builtin_hash,JumpIfToBooleanFalseConstantHandler,-525508881
+builtin_hash,JumpIfToBooleanTrueHandler,725690453
+builtin_hash,JumpIfToBooleanFalseHandler,-413432567
+builtin_hash,JumpIfTrueHandler,2511228
+builtin_hash,JumpIfFalseHandler,2511228
+builtin_hash,JumpIfNullHandler,2511228
+builtin_hash,JumpIfNotNullHandler,-489824053
+builtin_hash,JumpIfUndefinedHandler,2511228
+builtin_hash,JumpIfNotUndefinedHandler,-489824053
+builtin_hash,JumpIfUndefinedOrNullHandler,-718321269
+builtin_hash,JumpIfJSReceiverHandler,-171543406
+builtin_hash,SwitchOnSmiNoFeedbackHandler,-188066699
+builtin_hash,ForInEnumerateHandler,-998219819
+builtin_hash,ForInPrepareHandler,480083331
+builtin_hash,ForInContinueHandler,829644977
+builtin_hash,ForInNextHandler,-132478305
+builtin_hash,ForInStepHandler,115172731
+builtin_hash,SetPendingMessageHandler,962212923
+builtin_hash,ThrowHandler,781858395
+builtin_hash,ReThrowHandler,781858395
+builtin_hash,ReturnHandler,557919322
+builtin_hash,ThrowReferenceErrorIfHoleHandler,-516587462
+builtin_hash,ThrowSuperNotCalledIfHoleHandler,-773024801
+builtin_hash,ThrowSuperAlreadyCalledIfNotHoleHandler,357828706
+builtin_hash,ThrowIfNotSuperConstructorHandler,-125687893
+builtin_hash,SwitchOnGeneratorStateHandler,-423602269
+builtin_hash,SuspendGeneratorHandler,-380438202
+builtin_hash,ResumeGeneratorHandler,-518827895
+builtin_hash,GetIteratorHandler,-378048438
+builtin_hash,ShortStarHandler,368091777
+builtin_hash,LdarWideHandler,-405004763
+builtin_hash,LdaSmiWideHandler,976476814
+builtin_hash,LdaConstantWideHandler,-171575655
+builtin_hash,LdaContextSlotWideHandler,679792213
+builtin_hash,LdaImmutableContextSlotWideHandler,679792213
+builtin_hash,LdaImmutableCurrentContextSlotWideHandler,796095575
+builtin_hash,StarWideHandler,728945870
+builtin_hash,MovWideHandler,-483424163
+builtin_hash,PushContextWideHandler,325978832
+builtin_hash,PopContextWideHandler,1044899411
+builtin_hash,TestReferenceEqualWideHandler,-444014273
+builtin_hash,LdaGlobalWideHandler,976796507
+builtin_hash,LdaGlobalInsideTypeofWideHandler,-19868457
+builtin_hash,StaGlobalWideHandler,-216106571
+builtin_hash,StaContextSlotWideHandler,-553577385
+builtin_hash,StaCurrentContextSlotWideHandler,-429895179
+builtin_hash,LdaLookupGlobalSlotWideHandler,-291087637
+builtin_hash,GetNamedPropertyWideHandler,-241439423
+builtin_hash,GetKeyedPropertyWideHandler,364433897
+builtin_hash,SetNamedPropertyWideHandler,-31139520
+builtin_hash,DefineNamedOwnPropertyWideHandler,-31139520
+builtin_hash,SetKeyedPropertyWideHandler,-363367368
+builtin_hash,DefineKeyedOwnPropertyWideHandler,-363367368
+builtin_hash,StaInArrayLiteralWideHandler,-363367368
+builtin_hash,AddWideHandler,-667096135
+builtin_hash,SubWideHandler,-383279960
+builtin_hash,MulWideHandler,1029076402
+builtin_hash,DivWideHandler,-547887104
+builtin_hash,BitwiseOrWideHandler,9634898
+builtin_hash,BitwiseAndWideHandler,498024986
+builtin_hash,ShiftLeftWideHandler,-839529705
+builtin_hash,AddSmiWideHandler,-930183091
+builtin_hash,SubSmiWideHandler,-150212329
+builtin_hash,MulSmiWideHandler,591583886
+builtin_hash,DivSmiWideHandler,343395191
+builtin_hash,ModSmiWideHandler,-801743696
+builtin_hash,BitwiseOrSmiWideHandler,-944128869
+builtin_hash,BitwiseXorSmiWideHandler,-944761076
+builtin_hash,BitwiseAndSmiWideHandler,512282363
+builtin_hash,ShiftLeftSmiWideHandler,895748637
+builtin_hash,ShiftRightSmiWideHandler,-526800833
+builtin_hash,ShiftRightLogicalSmiWideHandler,306897250
+builtin_hash,IncWideHandler,243851885
+builtin_hash,DecWideHandler,573422516
+builtin_hash,NegateWideHandler,-256119499
+builtin_hash,CallPropertyWideHandler,899629797
+builtin_hash,CallProperty0WideHandler,649245559
+builtin_hash,CallProperty1WideHandler,-508092594
+builtin_hash,CallProperty2WideHandler,375883648
+builtin_hash,CallUndefinedReceiverWideHandler,-544740528
+builtin_hash,CallUndefinedReceiver0WideHandler,-908716826
+builtin_hash,CallUndefinedReceiver1WideHandler,-63091942
+builtin_hash,CallUndefinedReceiver2WideHandler,332968542
+builtin_hash,CallWithSpreadWideHandler,899629797
+builtin_hash,ConstructWideHandler,-133823750
+builtin_hash,TestEqualWideHandler,-560396321
+builtin_hash,TestEqualStrictWideHandler,-723086528
+builtin_hash,TestLessThanWideHandler,-954086139
+builtin_hash,TestGreaterThanWideHandler,8081046
+builtin_hash,TestLessThanOrEqualWideHandler,-869672701
+builtin_hash,TestGreaterThanOrEqualWideHandler,915149033
+builtin_hash,TestInstanceOfWideHandler,-907585471
+builtin_hash,TestInWideHandler,952743861
+builtin_hash,ToNumericWideHandler,848961913
+builtin_hash,CreateRegExpLiteralWideHandler,-434410141
+builtin_hash,CreateArrayLiteralWideHandler,-5646835
+builtin_hash,CreateEmptyArrayLiteralWideHandler,-585282797
+builtin_hash,CreateObjectLiteralWideHandler,484880724
+builtin_hash,CreateClosureWideHandler,158285856
+builtin_hash,CreateBlockContextWideHandler,63996092
+builtin_hash,CreateFunctionContextWideHandler,-965079469
+builtin_hash,JumpLoopWideHandler,999208902
+builtin_hash,JumpWideHandler,182907248
+builtin_hash,JumpIfToBooleanTrueWideHandler,592062439
+builtin_hash,JumpIfToBooleanFalseWideHandler,-182416778
+builtin_hash,JumpIfTrueWideHandler,675926914
+builtin_hash,JumpIfFalseWideHandler,675926914
+builtin_hash,SwitchOnSmiNoFeedbackWideHandler,438009109
+builtin_hash,ForInPrepareWideHandler,4093040
+builtin_hash,ForInNextWideHandler,1049458669
+builtin_hash,ThrowReferenceErrorIfHoleWideHandler,269750921
+builtin_hash,GetIteratorWideHandler,-359333408
+builtin_hash,LdaSmiExtraWideHandler,976476814
+builtin_hash,LdaGlobalExtraWideHandler,-300848501
+builtin_hash,AddSmiExtraWideHandler,-986018015
+builtin_hash,SubSmiExtraWideHandler,-1056721725
+builtin_hash,MulSmiExtraWideHandler,-437583101
+builtin_hash,DivSmiExtraWideHandler,91019683
+builtin_hash,BitwiseOrSmiExtraWideHandler,-280647725
+builtin_hash,BitwiseXorSmiExtraWideHandler,945663448
+builtin_hash,BitwiseAndSmiExtraWideHandler,764701867
+builtin_hash,CallUndefinedReceiverExtraWideHandler,-252891433
+builtin_hash,CallUndefinedReceiver1ExtraWideHandler,984557820
+builtin_hash,CallUndefinedReceiver2ExtraWideHandler,-972056227
diff --git a/deps/v8/tools/builtins-pgo/arm64.profile b/deps/v8/tools/builtins-pgo/arm64.profile
index 15b5393b017c13..1173d8ab94dc67 100644
--- a/deps/v8/tools/builtins-pgo/arm64.profile
+++ b/deps/v8/tools/builtins-pgo/arm64.profile
@@ -245,290 +245,328 @@ block_hint,ToNumberConvertBigInt,9,10,1
 block_hint,Typeof,17,18,0
 block_hint,Typeof,9,10,0
 block_hint,Typeof,13,14,1
-block_hint,KeyedLoadIC_PolymorphicName,238,239,1
-block_hint,KeyedLoadIC_PolymorphicName,98,99,1
-block_hint,KeyedLoadIC_PolymorphicName,256,257,0
-block_hint,KeyedLoadIC_PolymorphicName,60,61,0
-block_hint,KeyedLoadIC_PolymorphicName,129,130,1
-block_hint,KeyedLoadIC_PolymorphicName,292,293,1
-block_hint,KeyedLoadIC_PolymorphicName,240,241,1
-block_hint,KeyedLoadIC_PolymorphicName,24,25,1
-block_hint,KeyedLoadIC_PolymorphicName,161,162,0
-block_hint,KeyedLoadIC_PolymorphicName,118,119,1
-block_hint,KeyedLoadIC_PolymorphicName,242,243,1
-block_hint,KeyedLoadIC_PolymorphicName,171,172,0
-block_hint,KeyedLoadIC_PolymorphicName,45,46,1
-block_hint,KeyedLoadIC_PolymorphicName,76,77,0
-block_hint,KeyedLoadIC_PolymorphicName,246,247,0
-block_hint,KeyedLoadIC_PolymorphicName,281,282,1
-block_hint,KeyedLoadIC_PolymorphicName,28,29,0
+block_hint,KeyedLoadIC_PolymorphicName,244,245,1
+block_hint,KeyedLoadIC_PolymorphicName,96,97,1
+block_hint,KeyedLoadIC_PolymorphicName,260,261,0
+block_hint,KeyedLoadIC_PolymorphicName,58,59,0
+block_hint,KeyedLoadIC_PolymorphicName,133,134,1
+block_hint,KeyedLoadIC_PolymorphicName,298,299,1
+block_hint,KeyedLoadIC_PolymorphicName,330,331,1
+block_hint,KeyedLoadIC_PolymorphicName,98,99,0
+block_hint,KeyedLoadIC_PolymorphicName,100,101,0
+block_hint,KeyedLoadIC_PolymorphicName,22,23,1
+block_hint,KeyedLoadIC_PolymorphicName,165,166,0
+block_hint,KeyedLoadIC_PolymorphicName,122,123,1
+block_hint,KeyedLoadIC_PolymorphicName,332,333,1
+block_hint,KeyedLoadIC_PolymorphicName,110,111,0
+block_hint,KeyedLoadIC_PolymorphicName,175,176,0
+block_hint,KeyedLoadIC_PolymorphicName,43,44,1
+block_hint,KeyedLoadIC_PolymorphicName,74,75,0
+block_hint,KeyedLoadIC_PolymorphicName,250,251,0
+block_hint,KeyedLoadIC_PolymorphicName,287,288,1
 block_hint,KeyedLoadIC_PolymorphicName,26,27,0
-block_hint,KeyedStoreIC_Megamorphic,375,376,1
-block_hint,KeyedStoreIC_Megamorphic,377,378,0
-block_hint,KeyedStoreIC_Megamorphic,1175,1176,0
-block_hint,KeyedStoreIC_Megamorphic,1177,1178,1
-block_hint,KeyedStoreIC_Megamorphic,1161,1162,1
-block_hint,KeyedStoreIC_Megamorphic,1110,1111,0
-block_hint,KeyedStoreIC_Megamorphic,905,906,1
+block_hint,KeyedLoadIC_PolymorphicName,24,25,0
 block_hint,KeyedStoreIC_Megamorphic,379,380,1
-block_hint,KeyedStoreIC_Megamorphic,1169,1170,0
-block_hint,KeyedStoreIC_Megamorphic,1154,1155,0
-block_hint,KeyedStoreIC_Megamorphic,597,598,0
-block_hint,KeyedStoreIC_Megamorphic,191,192,1
-block_hint,KeyedStoreIC_Megamorphic,1025,1026,0
-block_hint,KeyedStoreIC_Megamorphic,195,196,1
-block_hint,KeyedStoreIC_Megamorphic,197,198,0
-block_hint,KeyedStoreIC_Megamorphic,1104,1105,0
-block_hint,KeyedStoreIC_Megamorphic,1113,1114,0
-block_hint,KeyedStoreIC_Megamorphic,917,918,0
-block_hint,KeyedStoreIC_Megamorphic,487,488,0
-block_hint,KeyedStoreIC_Megamorphic,887,888,0
-block_hint,KeyedStoreIC_Megamorphic,921,922,0
-block_hint,KeyedStoreIC_Megamorphic,919,920,1
-block_hint,KeyedStoreIC_Megamorphic,489,490,1
-block_hint,KeyedStoreIC_Megamorphic,495,496,1
-block_hint,KeyedStoreIC_Megamorphic,497,498,0
-block_hint,KeyedStoreIC_Megamorphic,925,926,1
-block_hint,KeyedStoreIC_Megamorphic,499,500,0
-block_hint,KeyedStoreIC_Megamorphic,501,502,1
-block_hint,KeyedStoreIC_Megamorphic,923,924,1
-block_hint,KeyedStoreIC_Megamorphic,493,494,1
+block_hint,KeyedStoreIC_Megamorphic,381,382,0
+block_hint,KeyedStoreIC_Megamorphic,1216,1217,0
+block_hint,KeyedStoreIC_Megamorphic,1218,1219,1
+block_hint,KeyedStoreIC_Megamorphic,1203,1204,1
+block_hint,KeyedStoreIC_Megamorphic,1140,1141,0
+block_hint,KeyedStoreIC_Megamorphic,915,916,1
+block_hint,KeyedStoreIC_Megamorphic,383,384,1
+block_hint,KeyedStoreIC_Megamorphic,1228,1229,0
+block_hint,KeyedStoreIC_Megamorphic,1211,1212,0
+block_hint,KeyedStoreIC_Megamorphic,601,602,0
+block_hint,KeyedStoreIC_Megamorphic,746,747,1
+block_hint,KeyedStoreIC_Megamorphic,603,604,0
+block_hint,KeyedStoreIC_Megamorphic,1191,1192,0
+block_hint,KeyedStoreIC_Megamorphic,1041,1042,0
+block_hint,KeyedStoreIC_Megamorphic,1168,1169,0
+block_hint,KeyedStoreIC_Megamorphic,192,193,1
+block_hint,KeyedStoreIC_Megamorphic,194,195,0
+block_hint,KeyedStoreIC_Megamorphic,1134,1135,0
+block_hint,KeyedStoreIC_Megamorphic,1143,1144,0
+block_hint,KeyedStoreIC_Megamorphic,927,928,0
 block_hint,KeyedStoreIC_Megamorphic,491,492,0
-block_hint,KeyedStoreIC_Megamorphic,1087,1088,1
-block_hint,KeyedStoreIC_Megamorphic,1140,1141,1
-block_hint,KeyedStoreIC_Megamorphic,885,886,0
-block_hint,KeyedStoreIC_Megamorphic,347,348,1
-block_hint,KeyedStoreIC_Megamorphic,333,334,1
-block_hint,KeyedStoreIC_Megamorphic,1085,1086,1
-block_hint,KeyedStoreIC_Megamorphic,678,679,0
-block_hint,KeyedStoreIC_Megamorphic,535,536,0
-block_hint,KeyedStoreIC_Megamorphic,537,538,0
-block_hint,KeyedStoreIC_Megamorphic,1029,1030,0
-block_hint,KeyedStoreIC_Megamorphic,543,544,1
-block_hint,KeyedStoreIC_Megamorphic,600,601,0
-block_hint,KeyedStoreIC_Megamorphic,545,546,0
+block_hint,KeyedStoreIC_Megamorphic,895,896,0
+block_hint,KeyedStoreIC_Megamorphic,931,932,0
+block_hint,KeyedStoreIC_Megamorphic,929,930,1
+block_hint,KeyedStoreIC_Megamorphic,493,494,1
+block_hint,KeyedStoreIC_Megamorphic,499,500,1
+block_hint,KeyedStoreIC_Megamorphic,501,502,0
+block_hint,KeyedStoreIC_Megamorphic,935,936,1
+block_hint,KeyedStoreIC_Megamorphic,503,504,0
+block_hint,KeyedStoreIC_Megamorphic,505,506,1
+block_hint,KeyedStoreIC_Megamorphic,933,934,1
+block_hint,KeyedStoreIC_Megamorphic,497,498,1
+block_hint,KeyedStoreIC_Megamorphic,495,496,0
+block_hint,KeyedStoreIC_Megamorphic,1115,1116,1
+block_hint,KeyedStoreIC_Megamorphic,1177,1178,1
+block_hint,KeyedStoreIC_Megamorphic,893,894,0
+block_hint,KeyedStoreIC_Megamorphic,350,351,1
+block_hint,KeyedStoreIC_Megamorphic,336,337,1
+block_hint,KeyedStoreIC_Megamorphic,1113,1114,1
+block_hint,KeyedStoreIC_Megamorphic,683,684,0
+block_hint,KeyedStoreIC_Megamorphic,539,540,0
+block_hint,KeyedStoreIC_Megamorphic,541,542,0
+block_hint,KeyedStoreIC_Megamorphic,1045,1046,0
 block_hint,KeyedStoreIC_Megamorphic,547,548,1
-block_hint,KeyedStoreIC_Megamorphic,203,204,1
+block_hint,KeyedStoreIC_Megamorphic,1071,1072,0
+block_hint,KeyedStoreIC_Megamorphic,606,607,0
+block_hint,KeyedStoreIC_Megamorphic,1193,1194,0
 block_hint,KeyedStoreIC_Megamorphic,549,550,0
-block_hint,KeyedStoreIC_Megamorphic,205,206,0
-block_hint,KeyedStoreIC_Megamorphic,207,208,0
-block_hint,KeyedStoreIC_Megamorphic,940,941,0
+block_hint,KeyedStoreIC_Megamorphic,1047,1048,0
 block_hint,KeyedStoreIC_Megamorphic,551,552,1
+block_hint,KeyedStoreIC_Megamorphic,200,201,1
 block_hint,KeyedStoreIC_Megamorphic,553,554,0
+block_hint,KeyedStoreIC_Megamorphic,202,203,0
+block_hint,KeyedStoreIC_Megamorphic,204,205,0
+block_hint,KeyedStoreIC_Megamorphic,950,951,0
 block_hint,KeyedStoreIC_Megamorphic,555,556,1
 block_hint,KeyedStoreIC_Megamorphic,557,558,0
-block_hint,KeyedStoreIC_Megamorphic,1118,1119,0
 block_hint,KeyedStoreIC_Megamorphic,559,560,1
-block_hint,KeyedStoreIC_Megamorphic,894,895,0
-block_hint,KeyedStoreIC_Megamorphic,1120,1121,0
-block_hint,KeyedStoreIC_Megamorphic,561,562,1
-block_hint,KeyedStoreIC_Megamorphic,567,568,1
-block_hint,KeyedStoreIC_Megamorphic,569,570,0
-block_hint,KeyedStoreIC_Megamorphic,571,572,0
-block_hint,KeyedStoreIC_Megamorphic,573,574,1
-block_hint,KeyedStoreIC_Megamorphic,947,948,1
+block_hint,KeyedStoreIC_Megamorphic,561,562,0
+block_hint,KeyedStoreIC_Megamorphic,1148,1149,0
+block_hint,KeyedStoreIC_Megamorphic,563,564,1
+block_hint,KeyedStoreIC_Megamorphic,902,903,0
+block_hint,KeyedStoreIC_Megamorphic,1150,1151,0
 block_hint,KeyedStoreIC_Megamorphic,565,566,1
-block_hint,KeyedStoreIC_Megamorphic,563,564,0
-block_hint,KeyedStoreIC_Megamorphic,1173,1174,0
-block_hint,KeyedStoreIC_Megamorphic,1186,1187,1
-block_hint,KeyedStoreIC_Megamorphic,1183,1184,1
-block_hint,KeyedStoreIC_Megamorphic,1102,1103,1
-block_hint,KeyedStoreIC_Megamorphic,964,965,1
-block_hint,KeyedStoreIC_Megamorphic,209,210,0
-block_hint,KeyedStoreIC_Megamorphic,359,360,0
-block_hint,KeyedStoreIC_Megamorphic,605,606,1
-block_hint,KeyedStoreIC_Megamorphic,1013,1014,0
-block_hint,KeyedStoreIC_Megamorphic,688,689,0
+block_hint,KeyedStoreIC_Megamorphic,571,572,1
+block_hint,KeyedStoreIC_Megamorphic,573,574,0
 block_hint,KeyedStoreIC_Megamorphic,575,576,0
-block_hint,KeyedStoreIC_Megamorphic,168,169,1
-block_hint,KeyedStoreIC_Megamorphic,577,578,0
+block_hint,KeyedStoreIC_Megamorphic,577,578,1
+block_hint,KeyedStoreIC_Megamorphic,957,958,1
+block_hint,KeyedStoreIC_Megamorphic,569,570,1
+block_hint,KeyedStoreIC_Megamorphic,567,568,0
+block_hint,KeyedStoreIC_Megamorphic,1214,1215,0
+block_hint,KeyedStoreIC_Megamorphic,1231,1232,1
+block_hint,KeyedStoreIC_Megamorphic,1224,1225,1
+block_hint,KeyedStoreIC_Megamorphic,1130,1131,1
+block_hint,KeyedStoreIC_Megamorphic,975,976,1
+block_hint,KeyedStoreIC_Megamorphic,206,207,0
+block_hint,KeyedStoreIC_Megamorphic,362,363,0
+block_hint,KeyedStoreIC_Megamorphic,977,978,1
+block_hint,KeyedStoreIC_Megamorphic,214,215,0
+block_hint,KeyedStoreIC_Megamorphic,1027,1028,0
+block_hint,KeyedStoreIC_Megamorphic,693,694,0
 block_hint,KeyedStoreIC_Megamorphic,579,580,0
-block_hint,KeyedStoreIC_Megamorphic,1034,1035,0
-block_hint,KeyedStoreIC_Megamorphic,581,582,1
-block_hint,KeyedStoreIC_Megamorphic,953,954,0
-block_hint,KeyedStoreIC_Megamorphic,970,971,0
-block_hint,KeyedStoreIC_Megamorphic,749,750,1
-block_hint,KeyedStoreIC_Megamorphic,221,222,1
-block_hint,KeyedStoreIC_Megamorphic,1036,1037,0
-block_hint,KeyedStoreIC_Megamorphic,227,228,0
-block_hint,KeyedStoreIC_Megamorphic,753,754,0
-block_hint,KeyedStoreIC_Megamorphic,589,590,0
-block_hint,KeyedStoreIC_Megamorphic,1106,1107,0
-block_hint,KeyedStoreIC_Megamorphic,1143,1144,0
-block_hint,KeyedStoreIC_Megamorphic,896,897,0
-block_hint,KeyedStoreIC_Megamorphic,174,175,1
-block_hint,KeyedStoreIC_Megamorphic,176,177,1
-block_hint,KeyedStoreIC_Megamorphic,369,370,0
-block_hint,KeyedStoreIC_Megamorphic,178,179,1
-block_hint,KeyedStoreIC_Megamorphic,371,372,0
-block_hint,KeyedStoreIC_Megamorphic,180,181,1
-block_hint,KeyedStoreIC_Megamorphic,233,234,0
-block_hint,KeyedStoreIC_Megamorphic,182,183,1
-block_hint,KeyedStoreIC_Megamorphic,184,185,1
-block_hint,KeyedStoreIC_Megamorphic,1018,1019,0
-block_hint,KeyedStoreIC_Megamorphic,186,187,1
-block_hint,KeyedStoreIC_Megamorphic,915,916,1
-block_hint,KeyedStoreIC_Megamorphic,481,482,1
-block_hint,KeyedStoreIC_Megamorphic,728,729,0
-block_hint,KeyedStoreIC_Megamorphic,909,910,1
-block_hint,KeyedStoreIC_Megamorphic,409,410,0
-block_hint,KeyedStoreIC_Megamorphic,411,412,0
-block_hint,KeyedStoreIC_Megamorphic,251,252,1
+block_hint,KeyedStoreIC_Megamorphic,167,168,1
+block_hint,KeyedStoreIC_Megamorphic,581,582,0
+block_hint,KeyedStoreIC_Megamorphic,583,584,0
+block_hint,KeyedStoreIC_Megamorphic,1054,1055,0
+block_hint,KeyedStoreIC_Megamorphic,585,586,1
+block_hint,KeyedStoreIC_Megamorphic,963,964,0
+block_hint,KeyedStoreIC_Megamorphic,1174,1175,0
+block_hint,KeyedStoreIC_Megamorphic,1056,1057,1
+block_hint,KeyedStoreIC_Megamorphic,759,760,1
+block_hint,KeyedStoreIC_Megamorphic,612,613,0
+block_hint,KeyedStoreIC_Megamorphic,1196,1197,0
+block_hint,KeyedStoreIC_Megamorphic,1058,1059,0
+block_hint,KeyedStoreIC_Megamorphic,1172,1173,0
+block_hint,KeyedStoreIC_Megamorphic,224,225,0
+block_hint,KeyedStoreIC_Megamorphic,761,762,0
+block_hint,KeyedStoreIC_Megamorphic,593,594,0
+block_hint,KeyedStoreIC_Megamorphic,1136,1137,0
+block_hint,KeyedStoreIC_Megamorphic,1180,1181,0
+block_hint,KeyedStoreIC_Megamorphic,906,907,0
+block_hint,KeyedStoreIC_Megamorphic,173,174,1
+block_hint,KeyedStoreIC_Megamorphic,175,176,1
+block_hint,KeyedStoreIC_Megamorphic,373,374,0
+block_hint,KeyedStoreIC_Megamorphic,177,178,1
+block_hint,KeyedStoreIC_Megamorphic,375,376,0
+block_hint,KeyedStoreIC_Megamorphic,179,180,1
+block_hint,KeyedStoreIC_Megamorphic,234,235,0
+block_hint,KeyedStoreIC_Megamorphic,236,237,0
+block_hint,KeyedStoreIC_Megamorphic,181,182,1
+block_hint,KeyedStoreIC_Megamorphic,183,184,1
+block_hint,KeyedStoreIC_Megamorphic,1032,1033,0
+block_hint,KeyedStoreIC_Megamorphic,185,186,1
+block_hint,KeyedStoreIC_Megamorphic,925,926,1
+block_hint,KeyedStoreIC_Megamorphic,485,486,1
+block_hint,KeyedStoreIC_Megamorphic,733,734,0
+block_hint,KeyedStoreIC_Megamorphic,919,920,1
 block_hint,KeyedStoreIC_Megamorphic,413,414,0
-block_hint,KeyedStoreIC_Megamorphic,625,626,1
-block_hint,KeyedStoreIC_Megamorphic,93,94,1
-block_hint,KeyedStoreIC_Megamorphic,95,96,0
-block_hint,KeyedStoreIC_Megamorphic,761,762,1
-block_hint,KeyedStoreIC_Megamorphic,383,384,0
-block_hint,KeyedStoreIC_Megamorphic,634,635,1
-block_hint,KeyedStoreIC_Megamorphic,65,66,1
-block_hint,KeyedStoreIC_Megamorphic,67,68,0
-block_hint,DefineKeyedOwnIC_Megamorphic,310,311,1
-block_hint,DefineKeyedOwnIC_Megamorphic,312,313,0
-block_hint,DefineKeyedOwnIC_Megamorphic,865,866,0
-block_hint,DefineKeyedOwnIC_Megamorphic,418,419,0
-block_hint,DefineKeyedOwnIC_Megamorphic,416,417,1
-block_hint,DefineKeyedOwnIC_Megamorphic,794,795,0
-block_hint,DefineKeyedOwnIC_Megamorphic,570,571,1
-block_hint,DefineKeyedOwnIC_Megamorphic,593,594,1
-block_hint,DefineKeyedOwnIC_Megamorphic,230,231,0
+block_hint,KeyedStoreIC_Megamorphic,415,416,0
+block_hint,KeyedStoreIC_Megamorphic,254,255,1
+block_hint,KeyedStoreIC_Megamorphic,417,418,0
+block_hint,KeyedStoreIC_Megamorphic,630,631,1
+block_hint,KeyedStoreIC_Megamorphic,92,93,1
+block_hint,KeyedStoreIC_Megamorphic,94,95,0
+block_hint,KeyedStoreIC_Megamorphic,769,770,1
+block_hint,KeyedStoreIC_Megamorphic,387,388,0
+block_hint,KeyedStoreIC_Megamorphic,639,640,1
+block_hint,KeyedStoreIC_Megamorphic,64,65,1
+block_hint,KeyedStoreIC_Megamorphic,66,67,0
+block_hint,DefineKeyedOwnIC_Megamorphic,312,313,1
+block_hint,DefineKeyedOwnIC_Megamorphic,314,315,0
+block_hint,DefineKeyedOwnIC_Megamorphic,887,888,0
+block_hint,DefineKeyedOwnIC_Megamorphic,420,421,0
+block_hint,DefineKeyedOwnIC_Megamorphic,418,419,1
+block_hint,DefineKeyedOwnIC_Megamorphic,803,804,0
+block_hint,DefineKeyedOwnIC_Megamorphic,575,576,1
+block_hint,DefineKeyedOwnIC_Megamorphic,601,602,1
+block_hint,DefineKeyedOwnIC_Megamorphic,232,233,0
 block_hint,DefineKeyedOwnIC_Megamorphic,53,54,1
 block_hint,DefineKeyedOwnIC_Megamorphic,55,56,0
-block_hint,LoadGlobalIC_NoFeedback,39,40,1
+block_hint,LoadGlobalIC_NoFeedback,41,42,1
 block_hint,LoadGlobalIC_NoFeedback,6,7,1
 block_hint,LoadGlobalIC_NoFeedback,8,9,1
 block_hint,LoadGlobalIC_NoFeedback,10,11,1
 block_hint,LoadGlobalIC_NoFeedback,12,13,1
-block_hint,LoadGlobalIC_NoFeedback,28,29,1
-block_hint,LoadGlobalIC_NoFeedback,43,44,1
+block_hint,LoadGlobalIC_NoFeedback,31,32,1
+block_hint,LoadGlobalIC_NoFeedback,49,50,1
 block_hint,LoadGlobalIC_NoFeedback,18,19,1
+block_hint,LoadGlobalIC_NoFeedback,27,28,0
 block_hint,LoadGlobalIC_NoFeedback,14,15,1
-block_hint,LoadGlobalIC_NoFeedback,30,31,0
+block_hint,LoadGlobalIC_NoFeedback,33,34,0
 block_hint,LoadGlobalIC_NoFeedback,16,17,1
 block_hint,LoadGlobalIC_NoFeedback,20,21,1
 block_hint,LoadGlobalIC_NoFeedback,22,23,0
 block_hint,LoadGlobalIC_NoFeedback,24,25,1
 block_hint,LoadIC_FunctionPrototype,2,3,0
 block_hint,LoadIC_FunctionPrototype,4,5,1
-block_hint,LoadIC_NoFeedback,93,94,1
-block_hint,LoadIC_NoFeedback,95,96,0
-block_hint,LoadIC_NoFeedback,277,278,1
-block_hint,LoadIC_NoFeedback,212,213,0
-block_hint,LoadIC_NoFeedback,201,202,1
-block_hint,LoadIC_NoFeedback,265,266,0
-block_hint,LoadIC_NoFeedback,56,57,1
-block_hint,LoadIC_NoFeedback,267,268,0
-block_hint,LoadIC_NoFeedback,58,59,0
-block_hint,LoadIC_NoFeedback,291,292,1
-block_hint,LoadIC_NoFeedback,253,254,0
-block_hint,LoadIC_NoFeedback,270,271,1
-block_hint,LoadIC_NoFeedback,138,139,1
-block_hint,LoadIC_NoFeedback,23,24,1
-block_hint,LoadIC_NoFeedback,36,37,1
-block_hint,LoadIC_NoFeedback,126,127,1
-block_hint,LoadIC_NoFeedback,140,141,0
-block_hint,LoadIC_NoFeedback,121,122,0
-block_hint,LoadIC_NoFeedback,242,243,0
-block_hint,LoadIC_NoFeedback,235,236,0
-block_hint,LoadIC_NoFeedback,144,145,1
-block_hint,LoadIC_NoFeedback,146,147,0
-block_hint,LoadIC_NoFeedback,73,74,1
-block_hint,LoadIC_NoFeedback,150,151,0
-block_hint,LoadIC_NoFeedback,75,76,0
-block_hint,LoadIC_NoFeedback,159,160,1
-block_hint,LoadIC_NoFeedback,293,294,1
-block_hint,LoadIC_NoFeedback,259,260,0
-block_hint,LoadIC_NoFeedback,257,258,0
-block_hint,LoadIC_NoFeedback,228,229,1
-block_hint,LoadIC_NoFeedback,131,132,1
-block_hint,LoadIC_NoFeedback,89,90,0
-block_hint,StoreIC_NoFeedback,143,144,1
-block_hint,StoreIC_NoFeedback,145,146,0
-block_hint,StoreIC_NoFeedback,427,428,0
-block_hint,StoreIC_NoFeedback,61,62,1
-block_hint,StoreIC_NoFeedback,63,64,0
-block_hint,StoreIC_NoFeedback,467,468,0
-block_hint,StoreIC_NoFeedback,357,358,0
-block_hint,StoreIC_NoFeedback,147,148,0
-block_hint,StoreIC_NoFeedback,341,342,0
-block_hint,StoreIC_NoFeedback,149,150,1
-block_hint,StoreIC_NoFeedback,155,156,1
-block_hint,StoreIC_NoFeedback,157,158,0
-block_hint,StoreIC_NoFeedback,159,160,0
-block_hint,StoreIC_NoFeedback,153,154,1
+block_hint,LoadIC_NoFeedback,97,98,1
+block_hint,LoadIC_NoFeedback,99,100,0
+block_hint,LoadIC_NoFeedback,306,307,1
+block_hint,LoadIC_NoFeedback,226,227,0
+block_hint,LoadIC_NoFeedback,285,286,1
+block_hint,LoadIC_NoFeedback,141,142,0
+block_hint,LoadIC_NoFeedback,320,321,0
+block_hint,LoadIC_NoFeedback,287,288,0
+block_hint,LoadIC_NoFeedback,302,303,0
+block_hint,LoadIC_NoFeedback,53,54,1
+block_hint,LoadIC_NoFeedback,289,290,0
+block_hint,LoadIC_NoFeedback,55,56,0
+block_hint,LoadIC_NoFeedback,324,325,1
+block_hint,LoadIC_NoFeedback,272,273,0
+block_hint,LoadIC_NoFeedback,295,296,1
+block_hint,LoadIC_NoFeedback,247,248,1
+block_hint,LoadIC_NoFeedback,59,60,0
+block_hint,LoadIC_NoFeedback,22,23,1
+block_hint,LoadIC_NoFeedback,35,36,1
+block_hint,LoadIC_NoFeedback,130,131,1
+block_hint,LoadIC_NoFeedback,145,146,0
+block_hint,LoadIC_NoFeedback,125,126,0
+block_hint,LoadIC_NoFeedback,261,262,0
+block_hint,LoadIC_NoFeedback,250,251,0
+block_hint,LoadIC_NoFeedback,149,150,1
+block_hint,LoadIC_NoFeedback,167,168,0
+block_hint,LoadIC_NoFeedback,322,323,0
+block_hint,LoadIC_NoFeedback,151,152,0
+block_hint,LoadIC_NoFeedback,291,292,0
+block_hint,LoadIC_NoFeedback,70,71,1
+block_hint,LoadIC_NoFeedback,155,156,0
+block_hint,LoadIC_NoFeedback,72,73,0
+block_hint,LoadIC_NoFeedback,254,255,1
+block_hint,LoadIC_NoFeedback,76,77,0
+block_hint,LoadIC_NoFeedback,326,327,1
+block_hint,LoadIC_NoFeedback,278,279,0
+block_hint,LoadIC_NoFeedback,276,277,0
+block_hint,LoadIC_NoFeedback,242,243,1
+block_hint,LoadIC_NoFeedback,135,136,1
+block_hint,LoadIC_NoFeedback,93,94,0
+block_hint,StoreIC_NoFeedback,147,148,1
+block_hint,StoreIC_NoFeedback,149,150,0
+block_hint,StoreIC_NoFeedback,259,260,0
+block_hint,StoreIC_NoFeedback,549,550,0
+block_hint,StoreIC_NoFeedback,443,444,0
+block_hint,StoreIC_NoFeedback,527,528,0
+block_hint,StoreIC_NoFeedback,58,59,1
+block_hint,StoreIC_NoFeedback,60,61,0
+block_hint,StoreIC_NoFeedback,498,499,0
+block_hint,StoreIC_NoFeedback,367,368,0
 block_hint,StoreIC_NoFeedback,151,152,0
-block_hint,StoreIC_NoFeedback,497,498,1
-block_hint,StoreIC_NoFeedback,371,372,1
-block_hint,StoreIC_NoFeedback,175,176,0
-block_hint,StoreIC_NoFeedback,488,489,1
-block_hint,StoreIC_NoFeedback,195,196,0
-block_hint,StoreIC_NoFeedback,197,198,0
-block_hint,StoreIC_NoFeedback,431,432,0
-block_hint,StoreIC_NoFeedback,203,204,1
-block_hint,StoreIC_NoFeedback,256,257,0
-block_hint,StoreIC_NoFeedback,205,206,0
-block_hint,StoreIC_NoFeedback,69,70,1
+block_hint,StoreIC_NoFeedback,349,350,0
+block_hint,StoreIC_NoFeedback,153,154,1
+block_hint,StoreIC_NoFeedback,159,160,1
+block_hint,StoreIC_NoFeedback,161,162,0
+block_hint,StoreIC_NoFeedback,163,164,0
+block_hint,StoreIC_NoFeedback,157,158,1
+block_hint,StoreIC_NoFeedback,155,156,0
+block_hint,StoreIC_NoFeedback,536,537,1
+block_hint,StoreIC_NoFeedback,381,382,1
+block_hint,StoreIC_NoFeedback,179,180,0
+block_hint,StoreIC_NoFeedback,519,520,1
+block_hint,StoreIC_NoFeedback,199,200,0
+block_hint,StoreIC_NoFeedback,201,202,0
+block_hint,StoreIC_NoFeedback,447,448,0
+block_hint,StoreIC_NoFeedback,207,208,1
+block_hint,StoreIC_NoFeedback,473,474,0
+block_hint,StoreIC_NoFeedback,262,263,0
+block_hint,StoreIC_NoFeedback,551,552,0
 block_hint,StoreIC_NoFeedback,209,210,0
-block_hint,StoreIC_NoFeedback,71,72,0
-block_hint,StoreIC_NoFeedback,380,381,0
-block_hint,StoreIC_NoFeedback,211,212,1
+block_hint,StoreIC_NoFeedback,449,450,0
+block_hint,StoreIC_NoFeedback,66,67,1
 block_hint,StoreIC_NoFeedback,213,214,0
+block_hint,StoreIC_NoFeedback,68,69,0
+block_hint,StoreIC_NoFeedback,390,391,0
 block_hint,StoreIC_NoFeedback,215,216,1
 block_hint,StoreIC_NoFeedback,217,218,0
-block_hint,StoreIC_NoFeedback,478,479,0
 block_hint,StoreIC_NoFeedback,219,220,1
-block_hint,StoreIC_NoFeedback,348,349,0
-block_hint,StoreIC_NoFeedback,480,481,0
-block_hint,StoreIC_NoFeedback,383,384,1
-block_hint,StoreIC_NoFeedback,227,228,1
-block_hint,StoreIC_NoFeedback,229,230,0
-block_hint,StoreIC_NoFeedback,231,232,0
-block_hint,StoreIC_NoFeedback,233,234,1
-block_hint,StoreIC_NoFeedback,223,224,0
-block_hint,StoreIC_NoFeedback,519,520,0
-block_hint,StoreIC_NoFeedback,465,466,1
-block_hint,StoreIC_NoFeedback,402,403,1
-block_hint,StoreIC_NoFeedback,75,76,0
-block_hint,StoreIC_NoFeedback,81,82,0
-block_hint,StoreIC_NoFeedback,127,128,0
-block_hint,StoreIC_NoFeedback,261,262,1
-block_hint,StoreIC_NoFeedback,83,84,0
-block_hint,StoreIC_NoFeedback,237,238,0
-block_hint,StoreIC_NoFeedback,239,240,0
-block_hint,StoreIC_NoFeedback,436,437,0
-block_hint,StoreIC_NoFeedback,241,242,1
-block_hint,StoreIC_NoFeedback,482,483,0
-block_hint,StoreIC_NoFeedback,393,394,0
-block_hint,StoreIC_NoFeedback,320,321,1
-block_hint,StoreIC_NoFeedback,438,439,0
-block_hint,StoreIC_NoFeedback,93,94,0
-block_hint,StoreIC_NoFeedback,324,325,0
-block_hint,StoreIC_NoFeedback,264,265,1
-block_hint,StoreIC_NoFeedback,97,98,0
-block_hint,StoreIC_NoFeedback,249,250,0
-block_hint,StoreIC_NoFeedback,251,252,1
-block_hint,StoreIC_NoFeedback,352,353,0
-block_hint,StoreIC_NoFeedback,41,42,1
-block_hint,StoreIC_NoFeedback,43,44,1
-block_hint,StoreIC_NoFeedback,137,138,0
-block_hint,StoreIC_NoFeedback,45,46,1
-block_hint,StoreIC_NoFeedback,139,140,0
-block_hint,StoreIC_NoFeedback,47,48,1
-block_hint,StoreIC_NoFeedback,99,100,0
-block_hint,StoreIC_NoFeedback,49,50,1
-block_hint,StoreIC_NoFeedback,51,52,1
-block_hint,StoreIC_NoFeedback,425,426,0
-block_hint,StoreIC_NoFeedback,53,54,1
-block_hint,DefineNamedOwnIC_NoFeedback,78,79,1
-block_hint,DefineNamedOwnIC_NoFeedback,80,81,0
-block_hint,DefineNamedOwnIC_NoFeedback,195,196,0
-block_hint,DefineNamedOwnIC_NoFeedback,150,151,1
-block_hint,DefineNamedOwnIC_NoFeedback,201,202,0
-block_hint,DefineNamedOwnIC_NoFeedback,152,153,1
-block_hint,DefineNamedOwnIC_NoFeedback,38,39,1
-block_hint,DefineNamedOwnIC_NoFeedback,84,85,0
+block_hint,StoreIC_NoFeedback,221,222,0
+block_hint,StoreIC_NoFeedback,509,510,0
+block_hint,StoreIC_NoFeedback,223,224,1
+block_hint,StoreIC_NoFeedback,356,357,0
+block_hint,StoreIC_NoFeedback,511,512,0
+block_hint,StoreIC_NoFeedback,393,394,1
+block_hint,StoreIC_NoFeedback,231,232,1
+block_hint,StoreIC_NoFeedback,233,234,0
+block_hint,StoreIC_NoFeedback,235,236,0
+block_hint,StoreIC_NoFeedback,237,238,1
+block_hint,StoreIC_NoFeedback,227,228,0
+block_hint,StoreIC_NoFeedback,564,565,0
+block_hint,StoreIC_NoFeedback,494,495,1
+block_hint,StoreIC_NoFeedback,413,414,1
+block_hint,StoreIC_NoFeedback,72,73,0
+block_hint,StoreIC_NoFeedback,78,79,0
+block_hint,StoreIC_NoFeedback,130,131,0
+block_hint,StoreIC_NoFeedback,415,416,1
+block_hint,StoreIC_NoFeedback,80,81,0
+block_hint,StoreIC_NoFeedback,82,83,0
+block_hint,StoreIC_NoFeedback,241,242,0
+block_hint,StoreIC_NoFeedback,243,244,0
+block_hint,StoreIC_NoFeedback,456,457,0
+block_hint,StoreIC_NoFeedback,245,246,1
+block_hint,StoreIC_NoFeedback,513,514,0
+block_hint,StoreIC_NoFeedback,403,404,0
+block_hint,StoreIC_NoFeedback,458,459,1
+block_hint,StoreIC_NoFeedback,268,269,0
+block_hint,StoreIC_NoFeedback,553,554,0
+block_hint,StoreIC_NoFeedback,460,461,0
+block_hint,StoreIC_NoFeedback,531,532,0
+block_hint,StoreIC_NoFeedback,90,91,0
+block_hint,StoreIC_NoFeedback,332,333,0
+block_hint,StoreIC_NoFeedback,420,421,1
+block_hint,StoreIC_NoFeedback,94,95,0
+block_hint,StoreIC_NoFeedback,96,97,0
+block_hint,StoreIC_NoFeedback,253,254,0
+block_hint,StoreIC_NoFeedback,255,256,1
+block_hint,StoreIC_NoFeedback,362,363,0
+block_hint,StoreIC_NoFeedback,40,41,1
+block_hint,StoreIC_NoFeedback,42,43,1
+block_hint,StoreIC_NoFeedback,141,142,0
+block_hint,StoreIC_NoFeedback,44,45,1
+block_hint,StoreIC_NoFeedback,143,144,0
+block_hint,StoreIC_NoFeedback,46,47,1
+block_hint,StoreIC_NoFeedback,100,101,0
+block_hint,StoreIC_NoFeedback,102,103,0
+block_hint,StoreIC_NoFeedback,48,49,1
+block_hint,StoreIC_NoFeedback,50,51,1
+block_hint,StoreIC_NoFeedback,439,440,0
+block_hint,StoreIC_NoFeedback,52,53,1
+block_hint,DefineNamedOwnIC_NoFeedback,80,81,1
+block_hint,DefineNamedOwnIC_NoFeedback,82,83,0
+block_hint,DefineNamedOwnIC_NoFeedback,236,237,0
+block_hint,DefineNamedOwnIC_NoFeedback,210,211,1
+block_hint,DefineNamedOwnIC_NoFeedback,136,137,0
+block_hint,DefineNamedOwnIC_NoFeedback,239,240,0
+block_hint,DefineNamedOwnIC_NoFeedback,212,213,0
+block_hint,DefineNamedOwnIC_NoFeedback,234,235,0
+block_hint,DefineNamedOwnIC_NoFeedback,157,158,1
+block_hint,DefineNamedOwnIC_NoFeedback,36,37,1
+block_hint,DefineNamedOwnIC_NoFeedback,86,87,0
+block_hint,DefineNamedOwnIC_NoFeedback,38,39,0
 block_hint,DefineNamedOwnIC_NoFeedback,40,41,0
-block_hint,DefineNamedOwnIC_NoFeedback,42,43,0
 block_hint,KeyedLoadIC_SloppyArguments,12,13,0
 block_hint,KeyedLoadIC_SloppyArguments,14,15,1
 block_hint,KeyedLoadIC_SloppyArguments,4,5,1
@@ -623,6 +661,7 @@ block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,459,460,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,219,220,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,561,562,1
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,182,183,0
+block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,184,185,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,645,646,1
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,461,462,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,36,37,1
@@ -720,15 +759,17 @@ block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,1059,1060,1
 block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,703,704,0
 block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,62,63,1
 block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,95,96,0
-block_hint,KeyedHasIC_PolymorphicName,61,62,1
-block_hint,KeyedHasIC_PolymorphicName,32,33,1
-block_hint,KeyedHasIC_PolymorphicName,28,29,0
+block_hint,KeyedHasIC_PolymorphicName,69,70,1
+block_hint,KeyedHasIC_PolymorphicName,28,29,1
+block_hint,KeyedHasIC_PolymorphicName,24,25,0
+block_hint,KeyedHasIC_PolymorphicName,26,27,0
+block_hint,KeyedHasIC_PolymorphicName,55,56,1
+block_hint,KeyedHasIC_PolymorphicName,89,90,1
+block_hint,KeyedHasIC_PolymorphicName,93,94,1
 block_hint,KeyedHasIC_PolymorphicName,30,31,0
-block_hint,KeyedHasIC_PolymorphicName,47,48,1
-block_hint,KeyedHasIC_PolymorphicName,83,84,1
-block_hint,KeyedHasIC_PolymorphicName,63,64,1
+block_hint,KeyedHasIC_PolymorphicName,32,33,0
+block_hint,KeyedHasIC_PolymorphicName,14,15,1
 block_hint,KeyedHasIC_PolymorphicName,16,17,1
-block_hint,KeyedHasIC_PolymorphicName,18,19,1
 block_hint,EnqueueMicrotask,4,5,0
 block_hint,EnqueueMicrotask,2,3,0
 block_hint,RunMicrotasks,18,19,0
@@ -738,110 +779,120 @@ block_hint,RunMicrotasks,36,37,1
 block_hint,RunMicrotasks,85,86,0
 block_hint,RunMicrotasks,67,68,0
 block_hint,RunMicrotasks,38,39,1
-block_hint,HasProperty,133,134,1
-block_hint,HasProperty,135,136,1
-block_hint,HasProperty,253,254,0
-block_hint,HasProperty,207,208,1
-block_hint,HasProperty,245,246,0
-block_hint,HasProperty,93,94,0
-block_hint,HasProperty,228,229,1
-block_hint,HasProperty,119,120,1
 block_hint,HasProperty,137,138,1
-block_hint,HasProperty,195,196,0
-block_hint,HasProperty,197,198,0
+block_hint,HasProperty,139,140,1
+block_hint,HasProperty,263,264,0
+block_hint,HasProperty,211,212,1
+block_hint,HasProperty,254,255,0
 block_hint,HasProperty,97,98,0
-block_hint,HasProperty,95,96,0
-block_hint,HasProperty,241,242,0
-block_hint,HasProperty,232,233,0
-block_hint,HasProperty,199,200,1
-block_hint,HasProperty,249,250,0
-block_hint,HasProperty,201,202,1
-block_hint,HasProperty,45,46,1
-block_hint,HasProperty,63,64,0
-block_hint,HasProperty,47,48,0
-block_hint,HasProperty,103,104,1
-block_hint,HasProperty,258,259,0
-block_hint,HasProperty,222,223,0
-block_hint,HasProperty,39,40,0
-block_hint,DeleteProperty,35,36,1
-block_hint,DeleteProperty,60,61,0
-block_hint,DeleteProperty,37,38,0
-block_hint,DeleteProperty,64,65,1
-block_hint,DeleteProperty,86,87,0
-block_hint,DeleteProperty,69,70,0
-block_hint,DeleteProperty,62,63,1
-block_hint,DeleteProperty,54,55,1
-block_hint,DeleteProperty,39,40,1
-block_hint,DeleteProperty,82,83,0
-block_hint,DeleteProperty,84,85,0
+block_hint,HasProperty,234,235,1
+block_hint,HasProperty,123,124,1
+block_hint,HasProperty,141,142,1
+block_hint,HasProperty,199,200,0
+block_hint,HasProperty,201,202,0
+block_hint,HasProperty,101,102,0
+block_hint,HasProperty,99,100,0
+block_hint,HasProperty,250,251,0
+block_hint,HasProperty,270,271,0
+block_hint,HasProperty,259,260,1
+block_hint,HasProperty,106,107,0
+block_hint,HasProperty,277,278,0
+block_hint,HasProperty,282,283,0
+block_hint,HasProperty,268,269,0
+block_hint,HasProperty,203,204,1
+block_hint,HasProperty,42,43,1
+block_hint,HasProperty,65,66,0
+block_hint,HasProperty,44,45,0
+block_hint,HasProperty,239,240,1
+block_hint,HasProperty,48,49,0
+block_hint,HasProperty,207,208,1
+block_hint,HasProperty,272,273,0
+block_hint,HasProperty,228,229,0
+block_hint,HasProperty,38,39,0
+block_hint,DeleteProperty,38,39,1
+block_hint,DeleteProperty,62,63,0
+block_hint,DeleteProperty,40,41,0
+block_hint,DeleteProperty,66,67,1
+block_hint,DeleteProperty,91,92,0
 block_hint,DeleteProperty,73,74,0
-block_hint,DeleteProperty,71,72,0
-block_hint,DeleteProperty,44,45,0
-block_hint,DeleteProperty,46,47,0
+block_hint,DeleteProperty,64,65,1
+block_hint,DeleteProperty,56,57,1
+block_hint,DeleteProperty,42,43,1
+block_hint,DeleteProperty,83,84,0
+block_hint,DeleteProperty,85,86,0
+block_hint,DeleteProperty,77,78,0
 block_hint,DeleteProperty,75,76,0
-block_hint,DeleteProperty,50,51,1
-block_hint,DeleteProperty,52,53,0
-block_hint,DeleteProperty,8,9,1
-block_hint,DeleteProperty,10,11,1
-block_hint,DeleteProperty,12,13,1
-block_hint,DeleteProperty,14,15,1
-block_hint,DeleteProperty,16,17,1
-block_hint,SetDataProperties,132,133,1
-block_hint,SetDataProperties,253,254,1
-block_hint,SetDataProperties,251,252,1
-block_hint,SetDataProperties,140,141,0
-block_hint,SetDataProperties,298,299,0
-block_hint,SetDataProperties,142,143,0
-block_hint,SetDataProperties,60,61,0
-block_hint,SetDataProperties,317,318,0
-block_hint,SetDataProperties,257,258,0
-block_hint,SetDataProperties,322,323,1
-block_hint,SetDataProperties,263,264,0
-block_hint,SetDataProperties,681,682,0
-block_hint,SetDataProperties,703,704,1
-block_hint,SetDataProperties,679,680,0
-block_hint,SetDataProperties,677,678,0
+block_hint,DeleteProperty,47,48,0
+block_hint,DeleteProperty,49,50,0
+block_hint,DeleteProperty,87,88,0
+block_hint,DeleteProperty,71,72,1
+block_hint,DeleteProperty,20,21,0
+block_hint,DeleteProperty,54,55,0
+block_hint,DeleteProperty,7,8,1
+block_hint,DeleteProperty,9,10,1
+block_hint,DeleteProperty,11,12,1
+block_hint,DeleteProperty,13,14,1
+block_hint,DeleteProperty,15,16,1
+block_hint,SetDataProperties,136,137,1
+block_hint,SetDataProperties,263,264,1
+block_hint,SetDataProperties,261,262,1
+block_hint,SetDataProperties,144,145,0
+block_hint,SetDataProperties,316,317,0
+block_hint,SetDataProperties,146,147,0
+block_hint,SetDataProperties,59,60,0
+block_hint,SetDataProperties,341,342,0
+block_hint,SetDataProperties,267,268,0
+block_hint,SetDataProperties,385,386,1
+block_hint,SetDataProperties,277,278,0
+block_hint,SetDataProperties,752,753,0
+block_hint,SetDataProperties,762,763,1
+block_hint,SetDataProperties,750,751,0
+block_hint,SetDataProperties,748,749,0
+block_hint,SetDataProperties,659,660,0
+block_hint,SetDataProperties,451,452,1
+block_hint,SetDataProperties,221,222,1
+block_hint,SetDataProperties,87,88,0
+block_hint,SetDataProperties,223,224,0
+block_hint,SetDataProperties,513,514,0
+block_hint,SetDataProperties,515,516,0
+block_hint,SetDataProperties,519,520,1
+block_hint,SetDataProperties,449,450,0
+block_hint,SetDataProperties,329,330,1
+block_hint,SetDataProperties,326,327,0
+block_hint,SetDataProperties,158,159,0
+block_hint,SetDataProperties,399,400,0
+block_hint,SetDataProperties,447,448,0
+block_hint,SetDataProperties,352,353,0
+block_hint,SetDataProperties,226,227,1
+block_hint,SetDataProperties,93,94,1
+block_hint,SetDataProperties,521,522,0
+block_hint,SetDataProperties,95,96,0
+block_hint,SetDataProperties,97,98,0
+block_hint,SetDataProperties,617,618,0
+block_hint,SetDataProperties,523,524,1
+block_hint,SetDataProperties,525,526,0
+block_hint,SetDataProperties,527,528,1
 block_hint,SetDataProperties,529,530,0
-block_hint,SetDataProperties,327,328,1
-block_hint,SetDataProperties,84,85,1
-block_hint,SetDataProperties,90,91,0
-block_hint,SetDataProperties,217,218,0
-block_hint,SetDataProperties,457,458,0
-block_hint,SetDataProperties,459,460,0
-block_hint,SetDataProperties,463,464,1
-block_hint,SetDataProperties,398,399,0
-block_hint,SetDataProperties,308,309,1
-block_hint,SetDataProperties,151,152,0
-block_hint,SetDataProperties,306,307,0
-block_hint,SetDataProperties,219,220,1
-block_hint,SetDataProperties,96,97,1
-block_hint,SetDataProperties,465,466,0
-block_hint,SetDataProperties,98,99,0
-block_hint,SetDataProperties,100,101,0
-block_hint,SetDataProperties,566,567,0
-block_hint,SetDataProperties,467,468,1
-block_hint,SetDataProperties,469,470,0
-block_hint,SetDataProperties,471,472,1
-block_hint,SetDataProperties,473,474,0
-block_hint,SetDataProperties,643,644,0
-block_hint,SetDataProperties,475,476,1
-block_hint,SetDataProperties,522,523,0
-block_hint,SetDataProperties,645,646,0
-block_hint,SetDataProperties,569,570,1
-block_hint,SetDataProperties,483,484,1
-block_hint,SetDataProperties,485,486,0
-block_hint,SetDataProperties,487,488,0
-block_hint,SetDataProperties,489,490,1
-block_hint,SetDataProperties,479,480,0
-block_hint,SetDataProperties,627,628,0
-block_hint,SetDataProperties,499,500,1
-block_hint,SetDataProperties,275,276,1
-block_hint,SetDataProperties,102,103,0
-block_hint,SetDataProperties,390,391,0
-block_hint,SetDataProperties,234,235,0
-block_hint,SetDataProperties,265,266,1
-block_hint,SetDataProperties,198,199,0
-block_hint,SetDataProperties,62,63,0
+block_hint,SetDataProperties,673,674,0
+block_hint,SetDataProperties,531,532,1
+block_hint,SetDataProperties,577,578,0
+block_hint,SetDataProperties,675,676,0
+block_hint,SetDataProperties,620,621,1
+block_hint,SetDataProperties,539,540,1
+block_hint,SetDataProperties,541,542,0
+block_hint,SetDataProperties,543,544,0
+block_hint,SetDataProperties,545,546,1
+block_hint,SetDataProperties,535,536,0
+block_hint,SetDataProperties,657,658,0
+block_hint,SetDataProperties,555,556,1
+block_hint,SetDataProperties,292,293,1
+block_hint,SetDataProperties,99,100,0
+block_hint,SetDataProperties,437,438,0
+block_hint,SetDataProperties,241,242,0
+block_hint,SetDataProperties,129,130,0
+block_hint,SetDataProperties,279,280,1
+block_hint,SetDataProperties,204,205,0
+block_hint,SetDataProperties,61,62,0
 block_hint,ReturnReceiver,3,4,1
 block_hint,ArrayConstructorImpl,40,41,0
 block_hint,ArrayConstructorImpl,15,16,1
@@ -1170,448 +1221,474 @@ block_hint,ResumeGeneratorBaseline,6,7,0
 block_hint,GlobalIsFinite,9,10,1
 block_hint,GlobalIsNaN,9,10,1
 block_hint,GlobalIsNaN,11,12,1
-block_hint,LoadIC,360,361,1
-block_hint,LoadIC,135,136,0
-block_hint,LoadIC,61,62,0
-block_hint,LoadIC,227,228,0
-block_hint,LoadIC,339,340,1
-block_hint,LoadIC,229,230,0
-block_hint,LoadIC,374,375,1
-block_hint,LoadIC,371,372,1
-block_hint,LoadIC,288,289,1
-block_hint,LoadIC,102,103,1
-block_hint,LoadIC,274,275,0
-block_hint,LoadIC,313,314,0
-block_hint,LoadIC,137,138,1
+block_hint,LoadIC,370,371,1
 block_hint,LoadIC,139,140,0
-block_hint,LoadIC,302,303,1
-block_hint,LoadIC,258,259,1
+block_hint,LoadIC,59,60,0
+block_hint,LoadIC,233,234,0
+block_hint,LoadIC,345,346,1
+block_hint,LoadIC,235,236,0
+block_hint,LoadIC,387,388,1
+block_hint,LoadIC,384,385,0
+block_hint,LoadIC,381,382,1
+block_hint,LoadIC,292,293,1
+block_hint,LoadIC,100,101,1
+block_hint,LoadIC,278,279,0
+block_hint,LoadIC,319,320,0
+block_hint,LoadIC,141,142,1
+block_hint,LoadIC,143,144,0
+block_hint,LoadIC,308,309,1
+block_hint,LoadIC,358,359,1
+block_hint,LoadIC,102,103,0
+block_hint,LoadIC,19,20,1
+block_hint,LoadIC,62,63,0
 block_hint,LoadIC,21,22,1
-block_hint,LoadIC,64,65,0
-block_hint,LoadIC,23,24,1
-block_hint,LoadIC,169,170,0
-block_hint,LoadIC,354,355,0
-block_hint,LoadIC,356,357,0
-block_hint,LoadIC,311,312,0
-block_hint,LoadIC,125,126,0
-block_hint,LoadIC,51,52,1
-block_hint,LoadIC,203,204,0
-block_hint,LoadIC,86,87,0
-block_hint,LoadIC,46,47,0
-block_hint,LoadIC,260,261,1
-block_hint,LoadIC,179,180,0
-block_hint,LoadIC,44,45,1
-block_hint,LoadIC,78,79,0
-block_hint,LoadIC,264,265,0
-block_hint,LoadIC,304,305,1
-block_hint,LoadIC,27,28,0
+block_hint,LoadIC,173,174,0
+block_hint,LoadIC,364,365,0
+block_hint,LoadIC,366,367,0
+block_hint,LoadIC,317,318,0
+block_hint,LoadIC,129,130,0
+block_hint,LoadIC,49,50,1
+block_hint,LoadIC,209,210,0
+block_hint,LoadIC,84,85,0
+block_hint,LoadIC,44,45,0
+block_hint,LoadIC,360,361,1
+block_hint,LoadIC,114,115,0
+block_hint,LoadIC,183,184,0
+block_hint,LoadIC,42,43,1
+block_hint,LoadIC,76,77,0
+block_hint,LoadIC,268,269,0
+block_hint,LoadIC,310,311,1
+block_hint,LoadIC,25,26,0
+block_hint,LoadIC,179,180,1
+block_hint,LoadIC,181,182,1
 block_hint,LoadIC,175,176,1
 block_hint,LoadIC,177,178,1
-block_hint,LoadIC,171,172,1
-block_hint,LoadIC,173,174,1
-block_hint,LoadIC,129,130,1
-block_hint,LoadIC,131,132,0
-block_hint,LoadIC_Megamorphic,342,343,1
-block_hint,LoadIC_Megamorphic,339,340,1
-block_hint,LoadIC_Megamorphic,253,254,1
-block_hint,LoadIC_Megamorphic,255,256,1
-block_hint,LoadIC_Megamorphic,251,252,0
-block_hint,LoadIC_Megamorphic,288,289,0
-block_hint,LoadIC_Megamorphic,126,127,1
-block_hint,LoadIC_Megamorphic,290,291,0
-block_hint,LoadIC_Megamorphic,128,129,0
-block_hint,LoadIC_Megamorphic,276,277,1
-block_hint,LoadIC_Megamorphic,235,236,1
-block_hint,LoadIC_Megamorphic,22,23,1
-block_hint,LoadIC_Megamorphic,158,159,0
-block_hint,LoadIC_Megamorphic,281,282,0
-block_hint,LoadIC_Megamorphic,245,246,1
-block_hint,LoadIC_Megamorphic,324,325,0
-block_hint,LoadIC_Megamorphic,326,327,0
-block_hint,LoadIC_Megamorphic,285,286,0
-block_hint,LoadIC_Megamorphic,118,119,0
-block_hint,LoadIC_Megamorphic,50,51,1
-block_hint,LoadIC_Megamorphic,45,46,0
-block_hint,LoadIC_Megamorphic,241,242,0
-block_hint,LoadIC_Megamorphic,278,279,1
-block_hint,LoadIC_Megamorphic,26,27,0
+block_hint,LoadIC,133,134,1
+block_hint,LoadIC,135,136,0
+block_hint,LoadIC_Megamorphic,355,356,1
+block_hint,LoadIC_Megamorphic,352,353,0
+block_hint,LoadIC_Megamorphic,349,350,1
+block_hint,LoadIC_Megamorphic,257,258,1
+block_hint,LoadIC_Megamorphic,259,260,1
+block_hint,LoadIC_Megamorphic,255,256,0
+block_hint,LoadIC_Megamorphic,56,57,0
+block_hint,LoadIC_Megamorphic,294,295,0
+block_hint,LoadIC_Megamorphic,130,131,1
+block_hint,LoadIC_Megamorphic,280,281,1
+block_hint,LoadIC_Megamorphic,132,133,0
+block_hint,LoadIC_Megamorphic,282,283,1
+block_hint,LoadIC_Megamorphic,328,329,1
+block_hint,LoadIC_Megamorphic,95,96,0
+block_hint,LoadIC_Megamorphic,20,21,1
+block_hint,LoadIC_Megamorphic,162,163,0
+block_hint,LoadIC_Megamorphic,287,288,0
+block_hint,LoadIC_Megamorphic,249,250,1
+block_hint,LoadIC_Megamorphic,334,335,0
+block_hint,LoadIC_Megamorphic,336,337,0
+block_hint,LoadIC_Megamorphic,291,292,0
+block_hint,LoadIC_Megamorphic,122,123,0
+block_hint,LoadIC_Megamorphic,48,49,1
+block_hint,LoadIC_Megamorphic,43,44,0
+block_hint,LoadIC_Megamorphic,245,246,0
+block_hint,LoadIC_Megamorphic,284,285,1
 block_hint,LoadIC_Megamorphic,24,25,0
-block_hint,LoadIC_Megamorphic,160,161,1
-block_hint,LoadIC_Megamorphic,162,163,1
-block_hint,LoadIC_Megamorphic,122,123,1
-block_hint,LoadIC_Noninlined,356,357,1
-block_hint,LoadIC_Noninlined,128,129,0
-block_hint,LoadIC_Noninlined,359,360,1
-block_hint,LoadIC_Noninlined,354,355,1
-block_hint,LoadIC_Noninlined,263,264,0
-block_hint,LoadIC_Noninlined,58,59,0
-block_hint,LoadIC_Noninlined,302,303,0
-block_hint,LoadIC_Noninlined,138,139,1
-block_hint,LoadIC_Noninlined,286,287,1
-block_hint,LoadIC_Noninlined,22,23,1
-block_hint,LoadIC_Noninlined,170,171,0
-block_hint,LoadIC_Noninlined,39,40,1
-block_hint,LoadIC_Noninlined,253,254,0
-block_hint,LoadIC_Noninlined,290,291,1
-block_hint,LoadIC_Noninlined,26,27,0
+block_hint,LoadIC_Megamorphic,22,23,0
+block_hint,LoadIC_Megamorphic,164,165,1
+block_hint,LoadIC_Megamorphic,166,167,1
+block_hint,LoadIC_Megamorphic,126,127,1
+block_hint,LoadIC_Noninlined,366,367,1
+block_hint,LoadIC_Noninlined,132,133,0
+block_hint,LoadIC_Noninlined,372,373,1
+block_hint,LoadIC_Noninlined,369,370,0
+block_hint,LoadIC_Noninlined,364,365,1
+block_hint,LoadIC_Noninlined,267,268,0
+block_hint,LoadIC_Noninlined,56,57,0
+block_hint,LoadIC_Noninlined,308,309,0
+block_hint,LoadIC_Noninlined,142,143,1
+block_hint,LoadIC_Noninlined,292,293,1
+block_hint,LoadIC_Noninlined,20,21,1
+block_hint,LoadIC_Noninlined,174,175,0
+block_hint,LoadIC_Noninlined,37,38,1
+block_hint,LoadIC_Noninlined,257,258,0
+block_hint,LoadIC_Noninlined,296,297,1
 block_hint,LoadIC_Noninlined,24,25,0
+block_hint,LoadIC_Noninlined,22,23,0
 block_hint,LoadICTrampoline,3,4,1
 block_hint,LoadICTrampoline_Megamorphic,3,4,1
-block_hint,LoadSuperIC,508,509,0
-block_hint,LoadSuperIC,245,246,0
-block_hint,LoadSuperIC,544,545,1
+block_hint,LoadSuperIC,528,529,0
+block_hint,LoadSuperIC,253,254,0
+block_hint,LoadSuperIC,564,565,1
+block_hint,LoadSuperIC,440,441,0
+block_hint,LoadSuperIC,75,76,0
+block_hint,LoadSuperIC,540,541,0
+block_hint,LoadSuperIC,255,256,1
+block_hint,LoadSuperIC,515,516,1
+block_hint,LoadSuperIC,41,42,1
+block_hint,LoadSuperIC,550,551,0
+block_hint,LoadSuperIC,287,288,0
+block_hint,LoadSuperIC,60,61,1
+block_hint,LoadSuperIC,429,430,0
 block_hint,LoadSuperIC,427,428,0
-block_hint,LoadSuperIC,78,79,0
-block_hint,LoadSuperIC,520,521,0
-block_hint,LoadSuperIC,247,248,1
-block_hint,LoadSuperIC,497,498,1
-block_hint,LoadSuperIC,44,45,1
-block_hint,LoadSuperIC,530,531,0
-block_hint,LoadSuperIC,279,280,0
-block_hint,LoadSuperIC,63,64,1
-block_hint,LoadSuperIC,416,417,0
-block_hint,LoadSuperIC,414,415,0
-block_hint,LoadSuperIC,501,502,1
-block_hint,LoadSuperIC,48,49,0
-block_hint,KeyedLoadIC,619,620,1
-block_hint,KeyedLoadIC,253,254,0
-block_hint,KeyedLoadIC,245,246,0
-block_hint,KeyedLoadIC,379,380,0
-block_hint,KeyedLoadIC,490,491,1
-block_hint,KeyedLoadIC,661,662,0
-block_hint,KeyedLoadIC,613,614,0
-block_hint,KeyedLoadIC,568,569,1
-block_hint,KeyedLoadIC,385,386,1
-block_hint,KeyedLoadIC,383,384,1
-block_hint,KeyedLoadIC,647,648,0
-block_hint,KeyedLoadIC,649,650,0
-block_hint,KeyedLoadIC,617,618,0
-block_hint,KeyedLoadIC,570,571,1
-block_hint,KeyedLoadIC,153,154,1
-block_hint,KeyedLoadIC,611,612,0
-block_hint,KeyedLoadIC,471,472,0
-block_hint,KeyedLoadIC,103,104,1
+block_hint,LoadSuperIC,519,520,1
+block_hint,LoadSuperIC,45,46,0
+block_hint,LoadSuperIC,671,672,0
+block_hint,KeyedLoadIC,629,630,1
+block_hint,KeyedLoadIC,257,258,0
+block_hint,KeyedLoadIC,249,250,0
+block_hint,KeyedLoadIC,385,386,0
+block_hint,KeyedLoadIC,494,495,1
+block_hint,KeyedLoadIC,671,672,0
+block_hint,KeyedLoadIC,623,624,0
+block_hint,KeyedLoadIC,574,575,1
+block_hint,KeyedLoadIC,391,392,1
+block_hint,KeyedLoadIC,389,390,1
 block_hint,KeyedLoadIC,657,658,0
 block_hint,KeyedLoadIC,659,660,0
-block_hint,KeyedLoadIC,625,626,1
-block_hint,KeyedLoadIC,627,628,1
-block_hint,KeyedLoadIC,289,290,1
-block_hint,KeyedLoadIC,291,292,0
-block_hint,KeyedLoadIC,653,654,1
-block_hint,KeyedLoadIC,511,512,1
-block_hint,KeyedLoadIC,609,610,0
-block_hint,KeyedLoadIC,596,597,0
-block_hint,KeyedLoadIC,548,549,1
-block_hint,KeyedLoadIC,311,312,1
-block_hint,KeyedLoadIC,65,66,0
-block_hint,KeyedLoadIC,301,302,0
-block_hint,KeyedLoadIC,515,516,1
-block_hint,KeyedLoadIC,303,304,1
-block_hint,KeyedLoadIC,218,219,0
-block_hint,KeyedLoadIC,175,176,1
-block_hint,KeyedLoadIC,550,551,0
-block_hint,KeyedLoadIC,446,447,1
+block_hint,KeyedLoadIC,627,628,0
+block_hint,KeyedLoadIC,576,577,1
+block_hint,KeyedLoadIC,151,152,1
+block_hint,KeyedLoadIC,621,622,0
+block_hint,KeyedLoadIC,475,476,0
+block_hint,KeyedLoadIC,101,102,1
+block_hint,KeyedLoadIC,667,668,0
+block_hint,KeyedLoadIC,669,670,0
+block_hint,KeyedLoadIC,635,636,1
+block_hint,KeyedLoadIC,637,638,1
+block_hint,KeyedLoadIC,293,294,1
+block_hint,KeyedLoadIC,295,296,0
+block_hint,KeyedLoadIC,663,664,1
+block_hint,KeyedLoadIC,517,518,1
+block_hint,KeyedLoadIC,619,620,0
+block_hint,KeyedLoadIC,606,607,0
+block_hint,KeyedLoadIC,554,555,1
+block_hint,KeyedLoadIC,315,316,1
+block_hint,KeyedLoadIC,63,64,0
+block_hint,KeyedLoadIC,305,306,0
+block_hint,KeyedLoadIC,521,522,1
+block_hint,KeyedLoadIC,307,308,1
+block_hint,KeyedLoadIC,221,222,0
+block_hint,KeyedLoadIC,177,178,1
+block_hint,KeyedLoadIC,556,557,0
+block_hint,KeyedLoadIC,450,451,1
+block_hint,KeyedLoadIC,113,114,0
 block_hint,KeyedLoadIC,115,116,0
-block_hint,KeyedLoadIC,117,118,0
-block_hint,KeyedLoadIC,400,401,1
-block_hint,KeyedLoadIC,599,600,1
-block_hint,KeyedLoadIC,241,242,1
-block_hint,KeyedLoadIC,552,553,0
-block_hint,KeyedLoadIC,504,505,0
-block_hint,KeyedLoadIC,432,433,1
-block_hint,KeyedLoadIC,663,664,0
-block_hint,KeyedLoadIC,121,122,1
-block_hint,KeyedLoadIC,319,320,1
-block_hint,KeyedLoadIC,321,322,1
-block_hint,KeyedLoadIC,67,68,0
-block_hint,KeyedLoadIC_Megamorphic,482,483,1
-block_hint,KeyedLoadIC_Megamorphic,484,485,0
-block_hint,KeyedLoadIC_Megamorphic,1139,1140,0
-block_hint,KeyedLoadIC_Megamorphic,1141,1142,1
-block_hint,KeyedLoadIC_Megamorphic,1117,1118,1
-block_hint,KeyedLoadIC_Megamorphic,1078,1079,0
-block_hint,KeyedLoadIC_Megamorphic,1133,1134,1
-block_hint,KeyedLoadIC_Megamorphic,1143,1144,1
-block_hint,KeyedLoadIC_Megamorphic,1119,1120,1
-block_hint,KeyedLoadIC_Megamorphic,1135,1136,0
-block_hint,KeyedLoadIC_Megamorphic,1053,1054,0
-block_hint,KeyedLoadIC_Megamorphic,893,894,1
-block_hint,KeyedLoadIC_Megamorphic,891,892,1
-block_hint,KeyedLoadIC_Megamorphic,514,515,1
+block_hint,KeyedLoadIC,406,407,1
+block_hint,KeyedLoadIC,609,610,1
+block_hint,KeyedLoadIC,245,246,1
+block_hint,KeyedLoadIC,558,559,0
+block_hint,KeyedLoadIC,508,509,0
+block_hint,KeyedLoadIC,436,437,1
+block_hint,KeyedLoadIC,673,674,0
+block_hint,KeyedLoadIC,119,120,1
+block_hint,KeyedLoadIC,323,324,1
+block_hint,KeyedLoadIC,325,326,1
+block_hint,KeyedLoadIC,65,66,0
+block_hint,KeyedLoadIC_Megamorphic,496,497,1
+block_hint,KeyedLoadIC_Megamorphic,498,499,0
+block_hint,KeyedLoadIC_Megamorphic,1218,1219,0
+block_hint,KeyedLoadIC_Megamorphic,1220,1221,1
+block_hint,KeyedLoadIC_Megamorphic,1192,1193,1
+block_hint,KeyedLoadIC_Megamorphic,1145,1146,0
+block_hint,KeyedLoadIC_Megamorphic,1212,1213,1
+block_hint,KeyedLoadIC_Megamorphic,1222,1223,1
+block_hint,KeyedLoadIC_Megamorphic,1194,1195,1
+block_hint,KeyedLoadIC_Megamorphic,1214,1215,0
 block_hint,KeyedLoadIC_Megamorphic,1111,1112,0
-block_hint,KeyedLoadIC_Megamorphic,1113,1114,0
-block_hint,KeyedLoadIC_Megamorphic,1088,1089,0
-block_hint,KeyedLoadIC_Megamorphic,1086,1087,1
-block_hint,KeyedLoadIC_Megamorphic,1107,1108,0
-block_hint,KeyedLoadIC_Megamorphic,1082,1083,0
-block_hint,KeyedLoadIC_Megamorphic,895,896,1
-block_hint,KeyedLoadIC_Megamorphic,905,906,0
-block_hint,KeyedLoadIC_Megamorphic,1034,1035,0
-block_hint,KeyedLoadIC_Megamorphic,239,240,1
-block_hint,KeyedLoadIC_Megamorphic,1036,1037,0
-block_hint,KeyedLoadIC_Megamorphic,241,242,0
-block_hint,KeyedLoadIC_Megamorphic,1022,1023,0
-block_hint,KeyedLoadIC_Megamorphic,1129,1130,1
-block_hint,KeyedLoadIC_Megamorphic,1020,1021,0
-block_hint,KeyedLoadIC_Megamorphic,1018,1019,0
-block_hint,KeyedLoadIC_Megamorphic,627,628,1
-block_hint,KeyedLoadIC_Megamorphic,125,126,1
-block_hint,KeyedLoadIC_Megamorphic,199,200,0
-block_hint,KeyedLoadIC_Megamorphic,629,630,0
-block_hint,KeyedLoadIC_Megamorphic,544,545,0
-block_hint,KeyedLoadIC_Megamorphic,995,996,0
-block_hint,KeyedLoadIC_Megamorphic,948,949,0
-block_hint,KeyedLoadIC_Megamorphic,633,634,1
-block_hint,KeyedLoadIC_Megamorphic,635,636,0
-block_hint,KeyedLoadIC_Megamorphic,637,638,1
-block_hint,KeyedLoadIC_Megamorphic,256,257,1
-block_hint,KeyedLoadIC_Megamorphic,639,640,0
-block_hint,KeyedLoadIC_Megamorphic,258,259,0
-block_hint,KeyedLoadIC_Megamorphic,817,818,0
+block_hint,KeyedLoadIC_Megamorphic,927,928,1
+block_hint,KeyedLoadIC_Megamorphic,925,926,1
+block_hint,KeyedLoadIC_Megamorphic,528,529,1
+block_hint,KeyedLoadIC_Megamorphic,1186,1187,0
+block_hint,KeyedLoadIC_Megamorphic,1188,1189,0
+block_hint,KeyedLoadIC_Megamorphic,1155,1156,0
+block_hint,KeyedLoadIC_Megamorphic,1153,1154,1
+block_hint,KeyedLoadIC_Megamorphic,1182,1183,0
+block_hint,KeyedLoadIC_Megamorphic,1149,1150,0
+block_hint,KeyedLoadIC_Megamorphic,929,930,1
+block_hint,KeyedLoadIC_Megamorphic,939,940,0
+block_hint,KeyedLoadIC_Megamorphic,640,641,0
+block_hint,KeyedLoadIC_Megamorphic,1172,1173,0
+block_hint,KeyedLoadIC_Megamorphic,1085,1086,0
+block_hint,KeyedLoadIC_Megamorphic,1131,1132,0
+block_hint,KeyedLoadIC_Megamorphic,233,234,1
+block_hint,KeyedLoadIC_Megamorphic,1087,1088,0
+block_hint,KeyedLoadIC_Megamorphic,235,236,0
+block_hint,KeyedLoadIC_Megamorphic,1070,1071,0
+block_hint,KeyedLoadIC_Megamorphic,1204,1205,1
+block_hint,KeyedLoadIC_Megamorphic,1068,1069,0
+block_hint,KeyedLoadIC_Megamorphic,1066,1067,0
+block_hint,KeyedLoadIC_Megamorphic,980,981,1
+block_hint,KeyedLoadIC_Megamorphic,239,240,0
+block_hint,KeyedLoadIC_Megamorphic,121,122,1
+block_hint,KeyedLoadIC_Megamorphic,195,196,0
+block_hint,KeyedLoadIC_Megamorphic,644,645,0
+block_hint,KeyedLoadIC_Megamorphic,558,559,0
+block_hint,KeyedLoadIC_Megamorphic,1043,1044,0
+block_hint,KeyedLoadIC_Megamorphic,983,984,0
 block_hint,KeyedLoadIC_Megamorphic,648,649,1
-block_hint,KeyedLoadIC_Megamorphic,641,642,0
-block_hint,KeyedLoadIC_Megamorphic,1028,1029,0
-block_hint,KeyedLoadIC_Megamorphic,1102,1103,0
-block_hint,KeyedLoadIC_Megamorphic,1131,1132,1
+block_hint,KeyedLoadIC_Megamorphic,666,667,0
+block_hint,KeyedLoadIC_Megamorphic,1174,1175,0
+block_hint,KeyedLoadIC_Megamorphic,650,651,0
+block_hint,KeyedLoadIC_Megamorphic,1089,1090,0
+block_hint,KeyedLoadIC_Megamorphic,652,653,1
+block_hint,KeyedLoadIC_Megamorphic,250,251,1
+block_hint,KeyedLoadIC_Megamorphic,654,655,0
+block_hint,KeyedLoadIC_Megamorphic,252,253,0
+block_hint,KeyedLoadIC_Megamorphic,842,843,0
+block_hint,KeyedLoadIC_Megamorphic,987,988,1
+block_hint,KeyedLoadIC_Megamorphic,256,257,0
+block_hint,KeyedLoadIC_Megamorphic,656,657,0
+block_hint,KeyedLoadIC_Megamorphic,258,259,1
+block_hint,KeyedLoadIC_Megamorphic,1076,1077,0
+block_hint,KeyedLoadIC_Megamorphic,1169,1170,0
+block_hint,KeyedLoadIC_Megamorphic,1206,1207,1
+block_hint,KeyedLoadIC_Megamorphic,1074,1075,0
+block_hint,KeyedLoadIC_Megamorphic,123,124,1
+block_hint,KeyedLoadIC_Megamorphic,203,204,0
+block_hint,KeyedLoadIC_Megamorphic,923,924,0
+block_hint,KeyedLoadIC_Megamorphic,675,676,0
+block_hint,KeyedLoadIC_Megamorphic,1176,1177,0
+block_hint,KeyedLoadIC_Megamorphic,1208,1209,0
+block_hint,KeyedLoadIC_Megamorphic,1135,1136,0
+block_hint,KeyedLoadIC_Megamorphic,844,845,1
+block_hint,KeyedLoadIC_Megamorphic,268,269,1
+block_hint,KeyedLoadIC_Megamorphic,1200,1201,0
+block_hint,KeyedLoadIC_Megamorphic,270,271,0
+block_hint,KeyedLoadIC_Megamorphic,1056,1057,0
+block_hint,KeyedLoadIC_Megamorphic,1198,1199,1
+block_hint,KeyedLoadIC_Megamorphic,1054,1055,0
+block_hint,KeyedLoadIC_Megamorphic,1116,1117,1
+block_hint,KeyedLoadIC_Megamorphic,1107,1108,0
+block_hint,KeyedLoadIC_Megamorphic,1210,1211,0
+block_hint,KeyedLoadIC_Megamorphic,1101,1102,1
+block_hint,KeyedLoadIC_Megamorphic,740,741,1
+block_hint,KeyedLoadIC_Megamorphic,1017,1018,1
+block_hint,KeyedLoadIC_Megamorphic,736,737,0
+block_hint,KeyedLoadIC_Megamorphic,112,113,0
+block_hint,KeyedLoadIC_Megamorphic,877,878,0
+block_hint,KeyedLoadIC_Megamorphic,338,339,1
+block_hint,KeyedLoadIC_Megamorphic,863,864,1
+block_hint,KeyedLoadIC_Megamorphic,76,77,1
+block_hint,KeyedLoadIC_Megamorphic,368,369,0
+block_hint,KeyedLoadIC_Megamorphic,728,729,0
+block_hint,KeyedLoadIC_Megamorphic,93,94,1
+block_hint,KeyedLoadIC_Megamorphic,998,999,1
+block_hint,KeyedLoadIC_Megamorphic,294,295,0
+block_hint,KeyedLoadIC_Megamorphic,115,116,1
+block_hint,KeyedLoadIC_Megamorphic,179,180,0
+block_hint,KeyedLoadIC_Megamorphic,960,961,0
+block_hint,KeyedLoadIC_Megamorphic,817,818,1
+block_hint,KeyedLoadIC_Megamorphic,183,184,1
+block_hint,KeyedLoadIC_Megamorphic,681,682,0
+block_hint,KeyedLoadIC_Megamorphic,524,525,0
+block_hint,KeyedLoadIC_Megamorphic,1031,1032,0
+block_hint,KeyedLoadIC_Megamorphic,1001,1002,0
+block_hint,KeyedLoadIC_Megamorphic,685,686,1
+block_hint,KeyedLoadIC_Megamorphic,856,857,1
+block_hint,KeyedLoadIC_Megamorphic,1178,1179,0
+block_hint,KeyedLoadIC_Megamorphic,307,308,0
+block_hint,KeyedLoadIC_Megamorphic,858,859,0
+block_hint,KeyedLoadIC_Megamorphic,1062,1063,0
+block_hint,KeyedLoadIC_Megamorphic,187,188,0
+block_hint,KeyedLoadIC_Megamorphic,947,948,0
+block_hint,KeyedLoadIC_Megamorphic,1142,1143,0
+block_hint,KeyedLoadIC_Megamorphic,905,906,1
+block_hint,KeyedLoadIC_Megamorphic,127,128,0
+block_hint,KeyedLoadIC_Megamorphic,718,719,0
 block_hint,KeyedLoadIC_Megamorphic,1026,1027,0
-block_hint,KeyedLoadIC_Megamorphic,127,128,1
-block_hint,KeyedLoadIC_Megamorphic,207,208,0
-block_hint,KeyedLoadIC_Megamorphic,889,890,0
-block_hint,KeyedLoadIC_Megamorphic,1038,1039,0
-block_hint,KeyedLoadIC_Megamorphic,821,822,1
-block_hint,KeyedLoadIC_Megamorphic,272,273,1
-block_hint,KeyedLoadIC_Megamorphic,1125,1126,0
-block_hint,KeyedLoadIC_Megamorphic,274,275,0
-block_hint,KeyedLoadIC_Megamorphic,1008,1009,0
-block_hint,KeyedLoadIC_Megamorphic,1123,1124,1
-block_hint,KeyedLoadIC_Megamorphic,1006,1007,0
-block_hint,KeyedLoadIC_Megamorphic,1058,1059,1
-block_hint,KeyedLoadIC_Megamorphic,1049,1050,0
-block_hint,KeyedLoadIC_Megamorphic,1043,1044,1
-block_hint,KeyedLoadIC_Megamorphic,718,719,1
-block_hint,KeyedLoadIC_Megamorphic,969,970,1
+block_hint,KeyedLoadIC_Megamorphic,562,563,1
+block_hint,KeyedLoadIC_Megamorphic,321,322,0
 block_hint,KeyedLoadIC_Megamorphic,714,715,0
-block_hint,KeyedLoadIC_Megamorphic,116,117,0
-block_hint,KeyedLoadIC_Megamorphic,847,848,0
-block_hint,KeyedLoadIC_Megamorphic,332,333,1
-block_hint,KeyedLoadIC_Megamorphic,833,834,1
-block_hint,KeyedLoadIC_Megamorphic,80,81,1
-block_hint,KeyedLoadIC_Megamorphic,362,363,0
-block_hint,KeyedLoadIC_Megamorphic,706,707,0
-block_hint,KeyedLoadIC_Megamorphic,97,98,1
-block_hint,KeyedLoadIC_Megamorphic,661,662,1
-block_hint,KeyedLoadIC_Megamorphic,119,120,1
-block_hint,KeyedLoadIC_Megamorphic,183,184,0
-block_hint,KeyedLoadIC_Megamorphic,926,927,0
-block_hint,KeyedLoadIC_Megamorphic,795,796,1
-block_hint,KeyedLoadIC_Megamorphic,187,188,1
-block_hint,KeyedLoadIC_Megamorphic,663,664,0
-block_hint,KeyedLoadIC_Megamorphic,510,511,0
-block_hint,KeyedLoadIC_Megamorphic,983,984,0
-block_hint,KeyedLoadIC_Megamorphic,957,958,0
-block_hint,KeyedLoadIC_Megamorphic,667,668,1
-block_hint,KeyedLoadIC_Megamorphic,301,302,1
-block_hint,KeyedLoadIC_Megamorphic,307,308,0
-block_hint,KeyedLoadIC_Megamorphic,830,831,0
-block_hint,KeyedLoadIC_Megamorphic,1014,1015,0
-block_hint,KeyedLoadIC_Megamorphic,191,192,0
-block_hint,KeyedLoadIC_Megamorphic,913,914,0
-block_hint,KeyedLoadIC_Megamorphic,1075,1076,0
-block_hint,KeyedLoadIC_Megamorphic,871,872,1
-block_hint,KeyedLoadIC_Megamorphic,131,132,0
-block_hint,KeyedLoadIC_Megamorphic,696,697,0
-block_hint,KeyedLoadIC_Megamorphic,978,979,0
-block_hint,KeyedLoadIC_Megamorphic,548,549,1
-block_hint,KeyedLoadIC_Megamorphic,317,318,0
-block_hint,KeyedLoadIC_Megamorphic,692,693,0
-block_hint,KeyedLoadIC_Megamorphic,550,551,0
-block_hint,KeyedLoadIC_Megamorphic,133,134,1
-block_hint,KeyedLoadIC_Megamorphic,558,559,0
-block_hint,KeyedLoadIC_Megamorphic,875,876,1
-block_hint,KeyedLoadIC_Megamorphic,478,479,0
-block_hint,KeyedLoadIC_Megamorphic,911,912,0
-block_hint,KeyedLoadIC_Megamorphic,700,701,1
-block_hint,KeyedLoadIC_Megamorphic,566,567,0
-block_hint,KeyedLoadIC_Megamorphic,217,218,0
-block_hint,KeyedLoadIC_Megamorphic,476,477,1
-block_hint,KeyedLoadIC_Megamorphic,568,569,1
-block_hint,KeyedLoadIC_Megamorphic,149,150,1
+block_hint,KeyedLoadIC_Megamorphic,564,565,0
+block_hint,KeyedLoadIC_Megamorphic,129,130,1
+block_hint,KeyedLoadIC_Megamorphic,572,573,0
+block_hint,KeyedLoadIC_Megamorphic,909,910,1
+block_hint,KeyedLoadIC_Megamorphic,492,493,0
+block_hint,KeyedLoadIC_Megamorphic,945,946,0
+block_hint,KeyedLoadIC_Megamorphic,722,723,1
+block_hint,KeyedLoadIC_Megamorphic,580,581,0
+block_hint,KeyedLoadIC_Megamorphic,213,214,0
+block_hint,KeyedLoadIC_Megamorphic,490,491,1
+block_hint,KeyedLoadIC_Megamorphic,582,583,1
+block_hint,KeyedLoadIC_Megamorphic,145,146,1
 block_hint,KeyedLoadICTrampoline,3,4,1
 block_hint,KeyedLoadICTrampoline_Megamorphic,3,4,1
-block_hint,StoreGlobalIC,73,74,0
-block_hint,StoreGlobalIC,224,225,1
-block_hint,StoreGlobalIC,263,264,0
-block_hint,StoreGlobalIC,141,142,0
-block_hint,StoreGlobalIC,201,202,0
-block_hint,StoreGlobalIC,89,90,0
-block_hint,StoreGlobalIC,143,144,1
-block_hint,StoreGlobalIC,91,92,1
-block_hint,StoreGlobalIC,16,17,1
+block_hint,StoreGlobalIC,72,73,0
+block_hint,StoreGlobalIC,229,230,1
+block_hint,StoreGlobalIC,268,269,0
+block_hint,StoreGlobalIC,144,145,0
+block_hint,StoreGlobalIC,205,206,0
+block_hint,StoreGlobalIC,92,93,0
+block_hint,StoreGlobalIC,146,147,1
+block_hint,StoreGlobalIC,94,95,1
+block_hint,StoreGlobalIC,15,16,1
 block_hint,StoreGlobalICTrampoline,3,4,1
-block_hint,StoreIC,328,329,1
-block_hint,StoreIC,140,141,0
-block_hint,StoreIC,71,72,0
-block_hint,StoreIC,202,203,0
-block_hint,StoreIC,204,205,1
-block_hint,StoreIC,374,375,1
-block_hint,StoreIC,234,235,1
-block_hint,StoreIC,236,237,1
-block_hint,StoreIC,76,77,1
-block_hint,StoreIC,244,245,1
-block_hint,StoreIC,104,105,0
-block_hint,StoreIC,37,38,0
-block_hint,StoreIC,210,211,1
-block_hint,StoreIC,142,143,0
+block_hint,StoreIC,338,339,1
 block_hint,StoreIC,144,145,0
-block_hint,StoreIC,18,19,1
+block_hint,StoreIC,69,70,0
+block_hint,StoreIC,208,209,0
+block_hint,StoreIC,210,211,1
+block_hint,StoreIC,395,396,1
+block_hint,StoreIC,386,387,0
+block_hint,StoreIC,240,241,1
+block_hint,StoreIC,242,243,1
+block_hint,StoreIC,74,75,1
+block_hint,StoreIC,250,251,1
+block_hint,StoreIC,108,109,0
+block_hint,StoreIC,35,36,0
+block_hint,StoreIC,316,317,1
 block_hint,StoreIC,92,93,0
-block_hint,StoreIC,20,21,0
-block_hint,StoreIC,347,348,0
-block_hint,StoreIC,154,155,1
+block_hint,StoreIC,146,147,0
+block_hint,StoreIC,150,151,0
+block_hint,StoreIC,16,17,1
+block_hint,StoreIC,96,97,0
+block_hint,StoreIC,18,19,0
+block_hint,StoreIC,359,360,0
+block_hint,StoreIC,160,161,1
+block_hint,StoreIC,162,163,1
+block_hint,StoreIC,327,328,1
+block_hint,StoreIC,164,165,0
+block_hint,StoreIC,105,106,0
+block_hint,StoreIC,103,104,1
+block_hint,StoreIC,320,321,1
+block_hint,StoreIC,23,24,0
+block_hint,StoreIC,152,153,1
+block_hint,StoreIC,287,288,0
+block_hint,StoreIC,154,155,0
 block_hint,StoreIC,156,157,1
-block_hint,StoreIC,317,318,1
+block_hint,StoreIC,323,324,1
+block_hint,StoreIC,25,26,1
 block_hint,StoreIC,158,159,0
-block_hint,StoreIC,101,102,0
-block_hint,StoreIC,99,100,1
-block_hint,StoreIC,310,311,1
-block_hint,StoreIC,25,26,0
-block_hint,StoreIC,146,147,1
-block_hint,StoreIC,281,282,0
-block_hint,StoreIC,148,149,0
-block_hint,StoreIC,150,151,1
-block_hint,StoreIC,313,314,1
-block_hint,StoreIC,27,28,1
-block_hint,StoreIC,152,153,0
-block_hint,StoreIC,315,316,1
-block_hint,StoreIC,33,34,0
-block_hint,StoreIC,31,32,1
-block_hint,StoreIC,223,224,1
-block_hint,StoreIC,65,66,0
-block_hint,StoreIC,285,286,0
-block_hint,StoreIC,160,161,1
-block_hint,StoreIC,287,288,1
-block_hint,StoreIC,206,207,1
-block_hint,StoreIC,240,241,0
-block_hint,StoreIC,170,171,0
+block_hint,StoreIC,325,326,1
+block_hint,StoreIC,31,32,0
+block_hint,StoreIC,29,30,1
+block_hint,StoreIC,227,228,1
+block_hint,StoreIC,63,64,0
+block_hint,StoreIC,291,292,0
+block_hint,StoreIC,166,167,1
+block_hint,StoreIC,293,294,1
+block_hint,StoreIC,312,313,1
+block_hint,StoreIC,76,77,0
+block_hint,StoreIC,176,177,0
+block_hint,StoreIC,43,44,1
+block_hint,StoreIC,112,113,0
+block_hint,StoreIC,178,179,0
+block_hint,StoreIC,271,272,0
+block_hint,StoreIC,125,126,1
+block_hint,StoreIC,371,372,0
+block_hint,StoreIC,267,268,1
 block_hint,StoreIC,45,46,1
-block_hint,StoreIC,108,109,0
-block_hint,StoreIC,172,173,0
-block_hint,StoreIC,265,266,0
-block_hint,StoreIC,121,122,1
-block_hint,StoreIC,359,360,0
-block_hint,StoreIC,261,262,1
 block_hint,StoreIC,47,48,1
+block_hint,StoreIC,121,122,0
 block_hint,StoreIC,49,50,1
-block_hint,StoreIC,117,118,0
+block_hint,StoreIC,123,124,0
 block_hint,StoreIC,51,52,1
-block_hint,StoreIC,119,120,0
+block_hint,StoreIC,80,81,0
 block_hint,StoreIC,53,54,1
 block_hint,StoreIC,55,56,1
+block_hint,StoreIC,333,334,0
 block_hint,StoreIC,57,58,1
-block_hint,StoreIC,323,324,0
-block_hint,StoreIC,59,60,1
-block_hint,StoreIC,178,179,0
-block_hint,StoreIC,180,181,0
-block_hint,StoreIC,225,226,0
-block_hint,StoreIC,129,130,0
-block_hint,StoreIC,293,294,0
-block_hint,StoreIC,184,185,1
+block_hint,StoreIC,184,185,0
 block_hint,StoreIC,186,187,0
-block_hint,StoreIC,275,276,0
-block_hint,StoreIC,353,354,0
-block_hint,StoreIC,295,296,1
-block_hint,StoreIC,188,189,1
+block_hint,StoreIC,229,230,0
+block_hint,StoreIC,133,134,0
+block_hint,StoreIC,299,300,0
+block_hint,StoreIC,190,191,1
+block_hint,StoreIC,192,193,0
+block_hint,StoreIC,281,282,0
+block_hint,StoreIC,365,366,0
+block_hint,StoreIC,301,302,1
 block_hint,StoreIC,194,195,1
-block_hint,StoreIC,196,197,0
-block_hint,StoreIC,198,199,0
 block_hint,StoreIC,200,201,1
-block_hint,StoreIC,192,193,1
-block_hint,StoreIC,190,191,0
-block_hint,StoreIC,372,373,0
-block_hint,StoreIC,376,377,1
-block_hint,StoreIC,345,346,1
-block_hint,StoreIC,306,307,1
-block_hint,StoreIC,82,83,0
-block_hint,StoreIC,135,136,0
-block_hint,StoreIC,227,228,1
+block_hint,StoreIC,202,203,0
+block_hint,StoreIC,204,205,0
+block_hint,StoreIC,206,207,1
+block_hint,StoreIC,198,199,1
+block_hint,StoreIC,196,197,0
+block_hint,StoreIC,384,385,0
+block_hint,StoreIC,388,389,1
+block_hint,StoreIC,357,358,1
+block_hint,StoreIC,314,315,1
+block_hint,StoreIC,84,85,0
+block_hint,StoreIC,139,140,0
+block_hint,StoreIC,231,232,1
 block_hint,StoreICTrampoline,3,4,1
-block_hint,DefineNamedOwnIC,320,321,1
-block_hint,DefineNamedOwnIC,139,140,0
-block_hint,DefineNamedOwnIC,295,296,1
-block_hint,DefineNamedOwnIC,197,198,0
-block_hint,DefineNamedOwnIC,71,72,0
-block_hint,DefineNamedOwnIC,199,200,0
-block_hint,DefineNamedOwnIC,317,318,0
-block_hint,DefineNamedOwnIC,238,239,1
-block_hint,DefineNamedOwnIC,89,90,0
-block_hint,DefineNamedOwnIC,19,20,0
-block_hint,DefineNamedOwnIC,339,340,0
-block_hint,DefineNamedOwnIC,277,278,1
-block_hint,DefineNamedOwnIC,151,152,1
-block_hint,DefineNamedOwnIC,153,154,1
-block_hint,DefineNamedOwnIC,249,250,1
-block_hint,DefineNamedOwnIC,34,35,0
-block_hint,DefineNamedOwnIC,241,242,1
-block_hint,DefineNamedOwnIC,24,25,0
-block_hint,DefineNamedOwnIC,143,144,1
-block_hint,DefineNamedOwnIC,341,342,0
-block_hint,DefineNamedOwnIC,275,276,0
+block_hint,DefineNamedOwnIC,329,330,1
 block_hint,DefineNamedOwnIC,145,146,0
-block_hint,DefineNamedOwnIC,147,148,1
+block_hint,DefineNamedOwnIC,300,301,1
+block_hint,DefineNamedOwnIC,203,204,0
+block_hint,DefineNamedOwnIC,69,70,0
+block_hint,DefineNamedOwnIC,205,206,0
+block_hint,DefineNamedOwnIC,326,327,0
 block_hint,DefineNamedOwnIC,243,244,1
-block_hint,DefineNamedOwnIC,28,29,0
-block_hint,DefineNamedOwnIC,149,150,0
-block_hint,DefineNamedOwnIC,245,246,1
+block_hint,DefineNamedOwnIC,93,94,0
+block_hint,DefineNamedOwnIC,17,18,0
+block_hint,DefineNamedOwnIC,350,351,0
+block_hint,DefineNamedOwnIC,282,283,1
+block_hint,DefineNamedOwnIC,157,158,1
+block_hint,DefineNamedOwnIC,159,160,1
+block_hint,DefineNamedOwnIC,254,255,1
 block_hint,DefineNamedOwnIC,32,33,0
-block_hint,KeyedStoreIC,391,392,1
+block_hint,DefineNamedOwnIC,246,247,1
+block_hint,DefineNamedOwnIC,22,23,0
+block_hint,DefineNamedOwnIC,149,150,1
+block_hint,DefineNamedOwnIC,352,353,0
+block_hint,DefineNamedOwnIC,280,281,0
+block_hint,DefineNamedOwnIC,151,152,0
+block_hint,DefineNamedOwnIC,153,154,1
+block_hint,DefineNamedOwnIC,248,249,1
+block_hint,DefineNamedOwnIC,26,27,0
+block_hint,DefineNamedOwnIC,155,156,0
+block_hint,DefineNamedOwnIC,250,251,1
+block_hint,DefineNamedOwnIC,30,31,0
+block_hint,KeyedStoreIC,401,402,1
+block_hint,KeyedStoreIC,173,174,0
 block_hint,KeyedStoreIC,169,170,0
-block_hint,KeyedStoreIC,165,166,0
-block_hint,KeyedStoreIC,233,234,0
-block_hint,KeyedStoreIC,167,168,1
-block_hint,KeyedStoreIC,85,86,1
-block_hint,KeyedStoreIC,89,90,1
-block_hint,KeyedStoreIC,388,389,1
-block_hint,KeyedStoreIC,105,106,0
-block_hint,KeyedStoreIC,24,25,0
-block_hint,KeyedStoreIC,420,421,0
-block_hint,KeyedStoreIC,175,176,1
-block_hint,KeyedStoreIC,422,423,0
+block_hint,KeyedStoreIC,239,240,0
+block_hint,KeyedStoreIC,171,172,1
+block_hint,KeyedStoreIC,83,84,1
+block_hint,KeyedStoreIC,87,88,1
+block_hint,KeyedStoreIC,398,399,1
+block_hint,KeyedStoreIC,109,110,0
+block_hint,KeyedStoreIC,22,23,0
+block_hint,KeyedStoreIC,432,433,0
+block_hint,KeyedStoreIC,181,182,1
+block_hint,KeyedStoreIC,434,435,0
+block_hint,KeyedStoreIC,351,352,0
+block_hint,KeyedStoreIC,298,299,1
+block_hint,KeyedStoreIC,31,32,0
+block_hint,KeyedStoreIC,272,273,0
+block_hint,KeyedStoreIC,355,356,0
+block_hint,KeyedStoreIC,195,196,1
+block_hint,KeyedStoreIC,260,261,1
+block_hint,KeyedStoreIC,436,437,1
+block_hint,KeyedStoreIC,329,330,0
+block_hint,KeyedStoreIC,137,138,1
+block_hint,KeyedStoreIC,45,46,1
+block_hint,KeyedStoreIC,197,198,0
+block_hint,KeyedStoreIC,47,48,0
+block_hint,KeyedStoreIC,215,216,0
+block_hint,KeyedStoreIC,361,362,1
+block_hint,KeyedStoreIC,363,364,0
+block_hint,KeyedStoreIC,221,222,1
+block_hint,KeyedStoreIC,223,224,0
 block_hint,KeyedStoreIC,345,346,0
-block_hint,KeyedStoreIC,292,293,1
-block_hint,KeyedStoreIC,33,34,0
-block_hint,KeyedStoreIC,268,269,0
-block_hint,KeyedStoreIC,349,350,0
-block_hint,KeyedStoreIC,189,190,1
-block_hint,KeyedStoreIC,256,257,1
-block_hint,KeyedStoreIC,424,425,1
-block_hint,KeyedStoreIC,323,324,0
-block_hint,KeyedStoreIC,133,134,1
-block_hint,KeyedStoreIC,47,48,1
-block_hint,KeyedStoreIC,191,192,0
-block_hint,KeyedStoreIC,49,50,0
-block_hint,KeyedStoreIC,209,210,0
-block_hint,KeyedStoreIC,355,356,1
-block_hint,KeyedStoreIC,357,358,0
-block_hint,KeyedStoreIC,215,216,1
-block_hint,KeyedStoreIC,217,218,0
-block_hint,KeyedStoreIC,339,340,0
-block_hint,KeyedStoreIC,361,362,0
-block_hint,KeyedStoreIC,426,427,0
-block_hint,KeyedStoreIC,359,360,1
-block_hint,KeyedStoreIC,225,226,1
-block_hint,KeyedStoreIC,227,228,0
-block_hint,KeyedStoreIC,229,230,0
+block_hint,KeyedStoreIC,367,368,0
+block_hint,KeyedStoreIC,438,439,0
+block_hint,KeyedStoreIC,365,366,1
 block_hint,KeyedStoreIC,231,232,1
-block_hint,KeyedStoreIC,441,442,0
-block_hint,KeyedStoreIC,418,419,1
-block_hint,KeyedStoreIC,274,275,0
-block_hint,KeyedStoreIC,369,370,1
-block_hint,KeyedStoreIC,95,96,0
-block_hint,KeyedStoreIC,160,161,0
+block_hint,KeyedStoreIC,233,234,0
+block_hint,KeyedStoreIC,235,236,0
+block_hint,KeyedStoreIC,237,238,1
+block_hint,KeyedStoreIC,453,454,0
+block_hint,KeyedStoreIC,430,431,1
+block_hint,KeyedStoreIC,278,279,0
+block_hint,KeyedStoreIC,377,378,1
+block_hint,KeyedStoreIC,97,98,0
+block_hint,KeyedStoreIC,164,165,0
 block_hint,KeyedStoreICTrampoline,3,4,1
-block_hint,DefineKeyedOwnIC,383,384,1
-block_hint,DefineKeyedOwnIC,168,169,0
-block_hint,DefineKeyedOwnIC,164,165,1
+block_hint,DefineKeyedOwnIC,392,393,1
+block_hint,DefineKeyedOwnIC,174,175,0
+block_hint,DefineKeyedOwnIC,170,171,1
 block_hint,StoreInArrayLiteralIC,30,31,1
 block_hint,StoreInArrayLiteralIC,19,20,0
 block_hint,StoreInArrayLiteralIC,23,24,0
@@ -1619,29 +1696,29 @@ block_hint,StoreInArrayLiteralIC,14,15,1
 block_hint,StoreInArrayLiteralIC,16,17,1
 block_hint,StoreInArrayLiteralIC,8,9,1
 block_hint,StoreInArrayLiteralIC,4,5,1
-block_hint,LoadGlobalIC,61,62,0
-block_hint,LoadGlobalIC,15,16,1
-block_hint,LoadGlobalIC,17,18,1
-block_hint,LoadGlobalIC,19,20,1
-block_hint,LoadGlobalIC,188,189,0
-block_hint,LoadGlobalIC,13,14,0
-block_hint,LoadGlobalIC,109,110,1
-block_hint,LoadGlobalICInsideTypeof,61,62,0
-block_hint,LoadGlobalICInsideTypeof,190,191,1
-block_hint,LoadGlobalICInsideTypeof,13,14,0
-block_hint,LoadGlobalICInsideTypeof,109,110,0
-block_hint,LoadGlobalICInsideTypeof,21,22,1
-block_hint,LoadGlobalICInsideTypeof,23,24,1
-block_hint,LoadGlobalICInsideTypeof,249,250,1
-block_hint,LoadGlobalICInsideTypeof,205,206,0
-block_hint,LoadGlobalICInsideTypeof,59,60,0
-block_hint,LoadGlobalICInsideTypeof,217,218,0
-block_hint,LoadGlobalICInsideTypeof,111,112,1
-block_hint,LoadGlobalICInsideTypeof,25,26,1
-block_hint,LoadGlobalICInsideTypeof,226,227,1
-block_hint,LoadGlobalICInsideTypeof,196,197,0
-block_hint,LoadGlobalICInsideTypeof,44,45,0
-block_hint,LoadGlobalICInsideTypeof,42,43,1
+block_hint,LoadGlobalIC,60,61,0
+block_hint,LoadGlobalIC,14,15,1
+block_hint,LoadGlobalIC,16,17,1
+block_hint,LoadGlobalIC,18,19,1
+block_hint,LoadGlobalIC,191,192,0
+block_hint,LoadGlobalIC,12,13,0
+block_hint,LoadGlobalIC,111,112,1
+block_hint,LoadGlobalICInsideTypeof,60,61,0
+block_hint,LoadGlobalICInsideTypeof,193,194,1
+block_hint,LoadGlobalICInsideTypeof,12,13,0
+block_hint,LoadGlobalICInsideTypeof,111,112,0
+block_hint,LoadGlobalICInsideTypeof,20,21,1
+block_hint,LoadGlobalICInsideTypeof,22,23,1
+block_hint,LoadGlobalICInsideTypeof,254,255,1
+block_hint,LoadGlobalICInsideTypeof,208,209,0
+block_hint,LoadGlobalICInsideTypeof,58,59,0
+block_hint,LoadGlobalICInsideTypeof,220,221,0
+block_hint,LoadGlobalICInsideTypeof,113,114,1
+block_hint,LoadGlobalICInsideTypeof,24,25,1
+block_hint,LoadGlobalICInsideTypeof,229,230,1
+block_hint,LoadGlobalICInsideTypeof,199,200,0
+block_hint,LoadGlobalICInsideTypeof,43,44,0
+block_hint,LoadGlobalICInsideTypeof,41,42,1
 block_hint,LoadGlobalICTrampoline,3,4,1
 block_hint,LoadGlobalICInsideTypeofTrampoline,3,4,1
 block_hint,LookupGlobalICBaseline,3,4,1
@@ -1650,50 +1727,54 @@ block_hint,LookupGlobalICBaseline,5,6,1
 block_hint,LookupGlobalICBaseline,11,12,1
 block_hint,LookupGlobalICBaseline,7,8,1
 block_hint,LookupGlobalICBaseline,9,10,0
-block_hint,KeyedHasIC,251,252,1
+block_hint,KeyedHasIC,261,262,1
+block_hint,KeyedHasIC,125,126,0
 block_hint,KeyedHasIC,117,118,0
-block_hint,KeyedHasIC,109,110,0
-block_hint,KeyedHasIC,233,234,0
-block_hint,KeyedHasIC,157,158,0
-block_hint,KeyedHasIC,81,82,0
-block_hint,KeyedHasIC,111,112,1
-block_hint,KeyedHasIC,159,160,0
-block_hint,KeyedHasIC,115,116,1
-block_hint,KeyedHasIC,83,84,1
-block_hint,KeyedHasIC,193,194,0
-block_hint,KeyedHasIC,215,216,0
-block_hint,KeyedHasIC,273,274,0
-block_hint,KeyedHasIC,271,272,0
-block_hint,KeyedHasIC,153,154,1
-block_hint,KeyedHasIC,63,64,0
-block_hint,KeyedHasIC_Megamorphic,133,134,1
-block_hint,KeyedHasIC_Megamorphic,135,136,1
-block_hint,KeyedHasIC_Megamorphic,253,254,0
-block_hint,KeyedHasIC_Megamorphic,207,208,1
-block_hint,KeyedHasIC_Megamorphic,245,246,0
-block_hint,KeyedHasIC_Megamorphic,93,94,0
-block_hint,KeyedHasIC_Megamorphic,228,229,1
-block_hint,KeyedHasIC_Megamorphic,119,120,1
+block_hint,KeyedHasIC,239,240,0
+block_hint,KeyedHasIC,165,166,0
+block_hint,KeyedHasIC,77,78,0
+block_hint,KeyedHasIC,119,120,1
+block_hint,KeyedHasIC,167,168,0
+block_hint,KeyedHasIC,123,124,1
+block_hint,KeyedHasIC,79,80,1
+block_hint,KeyedHasIC,197,198,0
+block_hint,KeyedHasIC,221,222,0
+block_hint,KeyedHasIC,283,284,0
+block_hint,KeyedHasIC,281,282,0
+block_hint,KeyedHasIC,161,162,1
+block_hint,KeyedHasIC,61,62,0
 block_hint,KeyedHasIC_Megamorphic,137,138,1
-block_hint,KeyedHasIC_Megamorphic,195,196,0
-block_hint,KeyedHasIC_Megamorphic,197,198,0
+block_hint,KeyedHasIC_Megamorphic,139,140,1
+block_hint,KeyedHasIC_Megamorphic,263,264,0
+block_hint,KeyedHasIC_Megamorphic,211,212,1
+block_hint,KeyedHasIC_Megamorphic,254,255,0
 block_hint,KeyedHasIC_Megamorphic,97,98,0
-block_hint,KeyedHasIC_Megamorphic,95,96,0
-block_hint,KeyedHasIC_Megamorphic,241,242,0
-block_hint,KeyedHasIC_Megamorphic,232,233,0
-block_hint,KeyedHasIC_Megamorphic,249,250,0
+block_hint,KeyedHasIC_Megamorphic,234,235,1
+block_hint,KeyedHasIC_Megamorphic,123,124,1
+block_hint,KeyedHasIC_Megamorphic,141,142,1
+block_hint,KeyedHasIC_Megamorphic,199,200,0
 block_hint,KeyedHasIC_Megamorphic,201,202,0
-block_hint,KeyedHasIC_Megamorphic,47,48,0
-block_hint,KeyedHasIC_Megamorphic,61,62,0
-block_hint,KeyedHasIC_Megamorphic,103,104,1
-block_hint,KeyedHasIC_Megamorphic,258,259,0
+block_hint,KeyedHasIC_Megamorphic,101,102,0
+block_hint,KeyedHasIC_Megamorphic,99,100,0
+block_hint,KeyedHasIC_Megamorphic,250,251,0
+block_hint,KeyedHasIC_Megamorphic,270,271,0
+block_hint,KeyedHasIC_Megamorphic,106,107,0
+block_hint,KeyedHasIC_Megamorphic,277,278,0
+block_hint,KeyedHasIC_Megamorphic,282,283,0
+block_hint,KeyedHasIC_Megamorphic,268,269,0
+block_hint,KeyedHasIC_Megamorphic,203,204,0
+block_hint,KeyedHasIC_Megamorphic,44,45,0
+block_hint,KeyedHasIC_Megamorphic,63,64,0
+block_hint,KeyedHasIC_Megamorphic,239,240,1
+block_hint,KeyedHasIC_Megamorphic,48,49,0
+block_hint,KeyedHasIC_Megamorphic,272,273,0
+block_hint,KeyedHasIC_Megamorphic,228,229,0
+block_hint,KeyedHasIC_Megamorphic,87,88,0
+block_hint,KeyedHasIC_Megamorphic,155,156,0
+block_hint,KeyedHasIC_Megamorphic,196,197,0
+block_hint,KeyedHasIC_Megamorphic,59,60,0
 block_hint,KeyedHasIC_Megamorphic,222,223,0
-block_hint,KeyedHasIC_Megamorphic,83,84,0
-block_hint,KeyedHasIC_Megamorphic,151,152,0
-block_hint,KeyedHasIC_Megamorphic,192,193,0
-block_hint,KeyedHasIC_Megamorphic,58,59,0
-block_hint,KeyedHasIC_Megamorphic,216,217,0
-block_hint,KeyedHasIC_Megamorphic,56,57,1
+block_hint,KeyedHasIC_Megamorphic,57,58,1
 block_hint,IterableToList,42,43,1
 block_hint,IterableToList,44,45,1
 block_hint,IterableToList,46,47,1
@@ -1754,21 +1835,21 @@ block_hint,FindOrderedHashMapEntry,22,23,0
 block_hint,FindOrderedHashMapEntry,68,69,0
 block_hint,FindOrderedHashMapEntry,58,59,1
 block_hint,FindOrderedHashMapEntry,60,61,1
-block_hint,MapConstructor,323,324,1
-block_hint,MapConstructor,243,244,1
-block_hint,MapConstructor,100,101,0
+block_hint,MapConstructor,328,329,1
+block_hint,MapConstructor,248,249,1
+block_hint,MapConstructor,105,106,0
 block_hint,MapConstructor,13,14,1
-block_hint,MapConstructor,265,266,1
-block_hint,MapConstructor,205,206,1
-block_hint,MapConstructor,83,84,0
-block_hint,MapConstructor,85,86,1
-block_hint,MapConstructor,267,268,1
-block_hint,MapConstructor,300,301,0
-block_hint,MapConstructor,314,315,0
-block_hint,MapConstructor,215,216,0
-block_hint,MapConstructor,104,105,0
-block_hint,MapConstructor,233,234,1
-block_hint,MapConstructor,98,99,1
+block_hint,MapConstructor,270,271,1
+block_hint,MapConstructor,211,212,1
+block_hint,MapConstructor,86,87,0
+block_hint,MapConstructor,88,89,1
+block_hint,MapConstructor,272,273,1
+block_hint,MapConstructor,308,309,0
+block_hint,MapConstructor,319,320,0
+block_hint,MapConstructor,220,221,0
+block_hint,MapConstructor,109,110,0
+block_hint,MapConstructor,238,239,1
+block_hint,MapConstructor,103,104,1
 block_hint,MapPrototypeSet,98,99,1
 block_hint,MapPrototypeSet,62,63,1
 block_hint,MapPrototypeSet,64,65,1
@@ -1842,91 +1923,91 @@ block_hint,MapIteratorPrototypeNext,15,16,1
 block_hint,MapIteratorPrototypeNext,17,18,1
 block_hint,MapIteratorPrototypeNext,25,26,1
 block_hint,SameValueNumbersOnly,4,5,1
-block_hint,Add_Baseline,32,33,0
-block_hint,Add_Baseline,21,22,0
-block_hint,Add_Baseline,8,9,1
-block_hint,Add_Baseline,58,59,0
-block_hint,Add_Baseline,35,36,1
-block_hint,Add_Baseline,47,48,0
-block_hint,Add_Baseline,17,18,1
-block_hint,Add_Baseline,53,54,1
-block_hint,Add_Baseline,19,20,1
-block_hint,Add_Baseline,26,27,1
-block_hint,Add_Baseline,10,11,1
-block_hint,AddSmi_Baseline,32,33,0
-block_hint,AddSmi_Baseline,21,22,0
-block_hint,AddSmi_Baseline,8,9,1
-block_hint,AddSmi_Baseline,49,50,1
-block_hint,AddSmi_Baseline,26,27,1
-block_hint,AddSmi_Baseline,10,11,1
-block_hint,Subtract_Baseline,21,22,0
-block_hint,Subtract_Baseline,8,9,1
-block_hint,Subtract_Baseline,46,47,1
-block_hint,Subtract_Baseline,56,57,1
-block_hint,Subtract_Baseline,54,55,0
-block_hint,Subtract_Baseline,42,43,0
-block_hint,Subtract_Baseline,48,49,1
-block_hint,Subtract_Baseline,17,18,1
+block_hint,Add_Baseline,39,40,0
+block_hint,Add_Baseline,25,26,0
+block_hint,Add_Baseline,9,10,1
+block_hint,Add_Baseline,84,85,0
+block_hint,Add_Baseline,46,47,1
+block_hint,Add_Baseline,56,57,0
+block_hint,Add_Baseline,20,21,1
+block_hint,Add_Baseline,64,65,1
+block_hint,Add_Baseline,23,24,1
+block_hint,Add_Baseline,31,32,1
+block_hint,Add_Baseline,11,12,1
+block_hint,AddSmi_Baseline,39,40,0
+block_hint,AddSmi_Baseline,25,26,0
+block_hint,AddSmi_Baseline,9,10,1
+block_hint,AddSmi_Baseline,60,61,1
+block_hint,AddSmi_Baseline,31,32,1
+block_hint,AddSmi_Baseline,11,12,1
+block_hint,Subtract_Baseline,31,32,0
+block_hint,Subtract_Baseline,11,12,1
+block_hint,Subtract_Baseline,60,61,1
+block_hint,Subtract_Baseline,82,83,1
+block_hint,Subtract_Baseline,76,77,0
+block_hint,Subtract_Baseline,53,54,0
+block_hint,Subtract_Baseline,62,63,1
 block_hint,Subtract_Baseline,23,24,1
-block_hint,Subtract_Baseline,10,11,1
-block_hint,SubtractSmi_Baseline,21,22,0
-block_hint,SubtractSmi_Baseline,8,9,1
-block_hint,SubtractSmi_Baseline,38,39,1
-block_hint,SubtractSmi_Baseline,23,24,1
-block_hint,SubtractSmi_Baseline,10,11,1
-block_hint,Multiply_Baseline,62,63,0
-block_hint,Multiply_Baseline,40,41,0
-block_hint,Multiply_Baseline,48,49,0
-block_hint,Multiply_Baseline,54,55,1
-block_hint,Multiply_Baseline,50,51,1
-block_hint,Multiply_Baseline,6,7,1
-block_hint,Multiply_Baseline,42,43,1
-block_hint,Multiply_Baseline,60,61,1
-block_hint,Multiply_Baseline,44,45,1
-block_hint,Multiply_Baseline,19,20,1
-block_hint,Multiply_Baseline,8,9,1
-block_hint,MultiplySmi_Baseline,54,55,0
-block_hint,MultiplySmi_Baseline,40,41,0
-block_hint,MultiplySmi_Baseline,42,43,0
-block_hint,MultiplySmi_Baseline,44,45,1
-block_hint,MultiplySmi_Baseline,17,18,0
-block_hint,MultiplySmi_Baseline,6,7,1
-block_hint,MultiplySmi_Baseline,33,34,1
-block_hint,MultiplySmi_Baseline,19,20,1
-block_hint,MultiplySmi_Baseline,8,9,1
-block_hint,Divide_Baseline,52,53,0
-block_hint,Divide_Baseline,54,55,0
-block_hint,Divide_Baseline,41,42,0
-block_hint,Divide_Baseline,26,27,1
-block_hint,Divide_Baseline,6,7,1
-block_hint,Divide_Baseline,45,46,1
-block_hint,Divide_Baseline,60,61,1
-block_hint,Divide_Baseline,47,48,1
-block_hint,Divide_Baseline,33,34,0
-block_hint,Divide_Baseline,14,15,1
-block_hint,Divide_Baseline,20,21,1
-block_hint,Divide_Baseline,8,9,1
-block_hint,DivideSmi_Baseline,46,47,0
-block_hint,DivideSmi_Baseline,54,55,0
-block_hint,DivideSmi_Baseline,48,49,0
-block_hint,DivideSmi_Baseline,41,42,0
-block_hint,DivideSmi_Baseline,26,27,1
-block_hint,DivideSmi_Baseline,6,7,1
-block_hint,DivideSmi_Baseline,35,36,1
-block_hint,DivideSmi_Baseline,20,21,1
-block_hint,DivideSmi_Baseline,8,9,1
-block_hint,Modulus_Baseline,61,62,0
-block_hint,Modulus_Baseline,57,58,0
-block_hint,Modulus_Baseline,43,44,1
-block_hint,Modulus_Baseline,38,39,1
-block_hint,Modulus_Baseline,17,18,0
+block_hint,Subtract_Baseline,33,34,1
+block_hint,Subtract_Baseline,13,14,1
+block_hint,SubtractSmi_Baseline,31,32,0
+block_hint,SubtractSmi_Baseline,11,12,1
+block_hint,SubtractSmi_Baseline,51,52,1
+block_hint,SubtractSmi_Baseline,33,34,1
+block_hint,SubtractSmi_Baseline,13,14,1
+block_hint,Multiply_Baseline,100,101,0
+block_hint,Multiply_Baseline,61,62,0
+block_hint,Multiply_Baseline,77,78,0
+block_hint,Multiply_Baseline,87,88,1
+block_hint,Multiply_Baseline,79,80,1
+block_hint,Multiply_Baseline,13,14,1
+block_hint,Multiply_Baseline,63,64,1
+block_hint,Multiply_Baseline,93,94,1
+block_hint,Multiply_Baseline,65,66,1
+block_hint,Multiply_Baseline,34,35,1
+block_hint,Multiply_Baseline,15,16,1
+block_hint,MultiplySmi_Baseline,92,93,0
+block_hint,MultiplySmi_Baseline,61,62,0
+block_hint,MultiplySmi_Baseline,71,72,0
+block_hint,MultiplySmi_Baseline,73,74,1
+block_hint,MultiplySmi_Baseline,32,33,0
+block_hint,MultiplySmi_Baseline,13,14,1
+block_hint,MultiplySmi_Baseline,51,52,1
+block_hint,MultiplySmi_Baseline,34,35,1
+block_hint,MultiplySmi_Baseline,15,16,1
+block_hint,Divide_Baseline,69,70,0
+block_hint,Divide_Baseline,71,72,0
+block_hint,Divide_Baseline,50,51,0
+block_hint,Divide_Baseline,31,32,1
+block_hint,Divide_Baseline,10,11,1
+block_hint,Divide_Baseline,54,55,1
+block_hint,Divide_Baseline,79,80,1
+block_hint,Divide_Baseline,56,57,1
+block_hint,Divide_Baseline,39,40,0
+block_hint,Divide_Baseline,19,20,1
+block_hint,Divide_Baseline,25,26,1
+block_hint,Divide_Baseline,12,13,1
+block_hint,DivideSmi_Baseline,63,64,0
+block_hint,DivideSmi_Baseline,76,77,0
+block_hint,DivideSmi_Baseline,65,66,0
+block_hint,DivideSmi_Baseline,50,51,0
+block_hint,DivideSmi_Baseline,31,32,1
+block_hint,DivideSmi_Baseline,10,11,1
+block_hint,DivideSmi_Baseline,41,42,1
+block_hint,DivideSmi_Baseline,25,26,1
+block_hint,DivideSmi_Baseline,12,13,1
+block_hint,Modulus_Baseline,76,77,0
+block_hint,Modulus_Baseline,72,73,0
+block_hint,Modulus_Baseline,55,56,1
+block_hint,Modulus_Baseline,50,51,1
+block_hint,Modulus_Baseline,18,19,0
 block_hint,Modulus_Baseline,6,7,1
-block_hint,ModulusSmi_Baseline,43,44,1
-block_hint,ModulusSmi_Baseline,38,39,1
-block_hint,ModulusSmi_Baseline,17,18,0
+block_hint,ModulusSmi_Baseline,55,56,1
+block_hint,ModulusSmi_Baseline,50,51,1
+block_hint,ModulusSmi_Baseline,18,19,0
 block_hint,ModulusSmi_Baseline,6,7,1
-block_hint,ModulusSmi_Baseline,32,33,1
-block_hint,ModulusSmi_Baseline,19,20,1
+block_hint,ModulusSmi_Baseline,40,41,1
+block_hint,ModulusSmi_Baseline,20,21,1
 block_hint,ModulusSmi_Baseline,8,9,1
 block_hint,BitwiseAnd_Baseline,35,36,0
 block_hint,BitwiseAnd_Baseline,23,24,1
@@ -1984,31 +2065,29 @@ block_hint,ShiftRightSmi_Baseline,20,21,0
 block_hint,ShiftRightSmi_Baseline,9,10,1
 block_hint,ShiftRightLogical_Baseline,25,26,1
 block_hint,ShiftRightLogical_Baseline,10,11,0
-block_hint,ShiftRightLogical_Baseline,46,47,0
-block_hint,ShiftRightLogical_Baseline,29,30,0
 block_hint,ShiftRightLogical_Baseline,14,15,1
 block_hint,ShiftRightLogicalSmi_Baseline,35,36,1
 block_hint,ShiftRightLogicalSmi_Baseline,25,26,1
 block_hint,ShiftRightLogicalSmi_Baseline,33,34,0
 block_hint,ShiftRightLogicalSmi_Baseline,23,24,0
 block_hint,ShiftRightLogicalSmi_Baseline,9,10,1
-block_hint,Add_WithFeedback,49,50,1
-block_hint,Add_WithFeedback,60,61,0
-block_hint,Add_WithFeedback,58,59,0
-block_hint,Add_WithFeedback,45,46,1
-block_hint,Add_WithFeedback,35,36,1
-block_hint,Add_WithFeedback,28,29,0
-block_hint,Add_WithFeedback,19,20,1
-block_hint,Subtract_WithFeedback,52,53,1
-block_hint,Subtract_WithFeedback,56,57,0
-block_hint,Subtract_WithFeedback,54,55,0
-block_hint,Subtract_WithFeedback,42,43,0
-block_hint,Subtract_WithFeedback,17,18,1
-block_hint,Modulus_WithFeedback,61,62,0
-block_hint,Modulus_WithFeedback,57,58,0
-block_hint,Modulus_WithFeedback,43,44,1
-block_hint,Modulus_WithFeedback,38,39,1
-block_hint,Modulus_WithFeedback,17,18,0
+block_hint,Add_WithFeedback,60,61,1
+block_hint,Add_WithFeedback,86,87,0
+block_hint,Add_WithFeedback,84,85,0
+block_hint,Add_WithFeedback,54,55,1
+block_hint,Add_WithFeedback,46,47,1
+block_hint,Add_WithFeedback,33,34,0
+block_hint,Add_WithFeedback,23,24,1
+block_hint,Subtract_WithFeedback,74,75,1
+block_hint,Subtract_WithFeedback,82,83,0
+block_hint,Subtract_WithFeedback,76,77,0
+block_hint,Subtract_WithFeedback,53,54,0
+block_hint,Subtract_WithFeedback,23,24,1
+block_hint,Modulus_WithFeedback,76,77,0
+block_hint,Modulus_WithFeedback,72,73,0
+block_hint,Modulus_WithFeedback,55,56,1
+block_hint,Modulus_WithFeedback,50,51,1
+block_hint,Modulus_WithFeedback,18,19,0
 block_hint,Modulus_WithFeedback,6,7,1
 block_hint,BitwiseOr_WithFeedback,6,7,1
 block_hint,BitwiseOr_WithFeedback,35,36,0
@@ -2213,43 +2292,43 @@ block_hint,ObjectCreate,13,14,1
 block_hint,ObjectCreate,15,16,1
 block_hint,ObjectCreate,20,21,0
 block_hint,ObjectCreate,61,62,1
-block_hint,ObjectGetOwnPropertyDescriptor,493,494,1
-block_hint,ObjectGetOwnPropertyDescriptor,490,491,0
-block_hint,ObjectGetOwnPropertyDescriptor,487,488,0
-block_hint,ObjectGetOwnPropertyDescriptor,479,480,1
-block_hint,ObjectGetOwnPropertyDescriptor,466,467,1
-block_hint,ObjectGetOwnPropertyDescriptor,384,385,0
-block_hint,ObjectGetOwnPropertyDescriptor,444,445,1
+block_hint,ObjectGetOwnPropertyDescriptor,519,520,1
+block_hint,ObjectGetOwnPropertyDescriptor,516,517,0
+block_hint,ObjectGetOwnPropertyDescriptor,513,514,0
+block_hint,ObjectGetOwnPropertyDescriptor,505,506,1
+block_hint,ObjectGetOwnPropertyDescriptor,492,493,1
+block_hint,ObjectGetOwnPropertyDescriptor,408,409,0
+block_hint,ObjectGetOwnPropertyDescriptor,470,471,1
+block_hint,ObjectGetOwnPropertyDescriptor,488,489,0
+block_hint,ObjectGetOwnPropertyDescriptor,434,435,0
+block_hint,ObjectGetOwnPropertyDescriptor,467,468,1
+block_hint,ObjectGetOwnPropertyDescriptor,410,411,1
 block_hint,ObjectGetOwnPropertyDescriptor,462,463,0
-block_hint,ObjectGetOwnPropertyDescriptor,410,411,0
-block_hint,ObjectGetOwnPropertyDescriptor,441,442,1
-block_hint,ObjectGetOwnPropertyDescriptor,386,387,1
+block_hint,ObjectGetOwnPropertyDescriptor,464,465,0
 block_hint,ObjectGetOwnPropertyDescriptor,436,437,0
-block_hint,ObjectGetOwnPropertyDescriptor,438,439,0
-block_hint,ObjectGetOwnPropertyDescriptor,412,413,0
-block_hint,ObjectGetOwnPropertyDescriptor,382,383,0
-block_hint,ObjectGetOwnPropertyDescriptor,312,313,0
-block_hint,ObjectGetOwnPropertyDescriptor,184,185,1
-block_hint,ObjectGetOwnPropertyDescriptor,134,135,1
-block_hint,ObjectGetOwnPropertyDescriptor,140,141,0
-block_hint,ObjectGetOwnPropertyDescriptor,473,474,0
-block_hint,ObjectGetOwnPropertyDescriptor,481,482,1
-block_hint,ObjectGetOwnPropertyDescriptor,469,470,0
-block_hint,ObjectGetOwnPropertyDescriptor,402,403,0
-block_hint,ObjectGetOwnPropertyDescriptor,310,311,0
+block_hint,ObjectGetOwnPropertyDescriptor,406,407,0
+block_hint,ObjectGetOwnPropertyDescriptor,331,332,0
+block_hint,ObjectGetOwnPropertyDescriptor,197,198,1
+block_hint,ObjectGetOwnPropertyDescriptor,307,308,1
+block_hint,ObjectGetOwnPropertyDescriptor,138,139,0
+block_hint,ObjectGetOwnPropertyDescriptor,499,500,0
+block_hint,ObjectGetOwnPropertyDescriptor,507,508,1
+block_hint,ObjectGetOwnPropertyDescriptor,495,496,0
+block_hint,ObjectGetOwnPropertyDescriptor,426,427,0
+block_hint,ObjectGetOwnPropertyDescriptor,329,330,0
 block_hint,ObjectGetOwnPropertyDescriptor,31,32,1
-block_hint,ObjectGetOwnPropertyDescriptor,340,341,1
+block_hint,ObjectGetOwnPropertyDescriptor,361,362,1
 block_hint,ObjectGetOwnPropertyDescriptor,150,151,0
-block_hint,ObjectGetOwnPropertyDescriptor,448,449,0
-block_hint,ObjectGetOwnPropertyDescriptor,367,368,0
-block_hint,ObjectGetOwnPropertyDescriptor,249,250,0
-block_hint,ObjectGetOwnPropertyDescriptor,245,246,0
-block_hint,ObjectGetOwnPropertyDescriptor,265,266,0
-block_hint,ObjectGetOwnPropertyDescriptor,267,268,1
+block_hint,ObjectGetOwnPropertyDescriptor,474,475,0
+block_hint,ObjectGetOwnPropertyDescriptor,390,391,0
+block_hint,ObjectGetOwnPropertyDescriptor,264,265,0
+block_hint,ObjectGetOwnPropertyDescriptor,260,261,0
+block_hint,ObjectGetOwnPropertyDescriptor,282,283,0
+block_hint,ObjectGetOwnPropertyDescriptor,284,285,1
 block_hint,ObjectGetOwnPropertyDescriptor,36,37,1
-block_hint,ObjectGetOwnPropertyDescriptor,344,345,1
-block_hint,ObjectGetOwnPropertyDescriptor,174,175,0
-block_hint,ObjectGetOwnPropertyDescriptor,253,254,1
+block_hint,ObjectGetOwnPropertyDescriptor,365,366,1
+block_hint,ObjectGetOwnPropertyDescriptor,186,187,0
+block_hint,ObjectGetOwnPropertyDescriptor,268,269,1
 block_hint,ObjectKeys,32,33,1
 block_hint,ObjectKeys,27,28,1
 block_hint,ObjectKeys,23,24,1
@@ -2260,29 +2339,33 @@ block_hint,ObjectKeys,21,22,1
 block_hint,ObjectKeys,9,10,0
 block_hint,ObjectKeys,7,8,1
 block_hint,ObjectKeys,14,15,1
-block_hint,ObjectPrototypeHasOwnProperty,212,213,1
-block_hint,ObjectPrototypeHasOwnProperty,190,191,1
-block_hint,ObjectPrototypeHasOwnProperty,206,207,1
-block_hint,ObjectPrototypeHasOwnProperty,223,224,0
-block_hint,ObjectPrototypeHasOwnProperty,203,204,0
-block_hint,ObjectPrototypeHasOwnProperty,194,195,1
-block_hint,ObjectPrototypeHasOwnProperty,156,157,1
-block_hint,ObjectPrototypeHasOwnProperty,217,218,0
+block_hint,ObjectPrototypeHasOwnProperty,230,231,1
+block_hint,ObjectPrototypeHasOwnProperty,205,206,1
+block_hint,ObjectPrototypeHasOwnProperty,222,223,1
+block_hint,ObjectPrototypeHasOwnProperty,241,242,0
 block_hint,ObjectPrototypeHasOwnProperty,219,220,0
-block_hint,ObjectPrototypeHasOwnProperty,215,216,0
-block_hint,ObjectPrototypeHasOwnProperty,210,211,0
-block_hint,ObjectPrototypeHasOwnProperty,183,184,1
-block_hint,ObjectPrototypeHasOwnProperty,131,132,0
-block_hint,ObjectPrototypeHasOwnProperty,196,197,0
-block_hint,ObjectPrototypeHasOwnProperty,33,34,1
-block_hint,ObjectPrototypeHasOwnProperty,72,73,0
-block_hint,ObjectPrototypeHasOwnProperty,37,38,1
-block_hint,ObjectPrototypeHasOwnProperty,50,51,0
-block_hint,ObjectPrototypeHasOwnProperty,39,40,0
-block_hint,ObjectPrototypeHasOwnProperty,136,137,1
-block_hint,ObjectPrototypeHasOwnProperty,164,165,0
-block_hint,ObjectPrototypeHasOwnProperty,169,170,1
-block_hint,ObjectPrototypeHasOwnProperty,54,55,0
+block_hint,ObjectPrototypeHasOwnProperty,209,210,1
+block_hint,ObjectPrototypeHasOwnProperty,163,164,1
+block_hint,ObjectPrototypeHasOwnProperty,235,236,0
+block_hint,ObjectPrototypeHasOwnProperty,237,238,0
+block_hint,ObjectPrototypeHasOwnProperty,233,234,0
+block_hint,ObjectPrototypeHasOwnProperty,228,229,0
+block_hint,ObjectPrototypeHasOwnProperty,192,193,1
+block_hint,ObjectPrototypeHasOwnProperty,137,138,0
+block_hint,ObjectPrototypeHasOwnProperty,211,212,0
+block_hint,ObjectPrototypeHasOwnProperty,175,176,1
+block_hint,ObjectPrototypeHasOwnProperty,141,142,0
+block_hint,ObjectPrototypeHasOwnProperty,226,227,0
+block_hint,ObjectPrototypeHasOwnProperty,76,77,0
+block_hint,ObjectPrototypeHasOwnProperty,203,204,0
+block_hint,ObjectPrototypeHasOwnProperty,34,35,1
+block_hint,ObjectPrototypeHasOwnProperty,52,53,0
+block_hint,ObjectPrototypeHasOwnProperty,36,37,0
+block_hint,ObjectPrototypeHasOwnProperty,197,198,1
+block_hint,ObjectPrototypeHasOwnProperty,40,41,0
+block_hint,ObjectPrototypeHasOwnProperty,171,172,0
+block_hint,ObjectPrototypeHasOwnProperty,178,179,1
+block_hint,ObjectPrototypeHasOwnProperty,58,59,0
 block_hint,ObjectToString,42,43,0
 block_hint,ObjectToString,57,58,0
 block_hint,ObjectToString,65,66,0
@@ -2307,6 +2390,7 @@ block_hint,InstanceOf_Baseline,14,15,1
 block_hint,ForInEnumerate,34,35,1
 block_hint,ForInEnumerate,36,37,0
 block_hint,ForInEnumerate,30,31,0
+block_hint,ForInEnumerate,22,23,1
 block_hint,ForInEnumerate,32,33,1
 block_hint,ForInEnumerate,5,6,1
 block_hint,ForInEnumerate,38,39,1
@@ -2314,34 +2398,38 @@ block_hint,ForInEnumerate,9,10,1
 block_hint,ForInPrepare,7,8,1
 block_hint,ForInPrepare,12,13,1
 block_hint,ForInPrepare,5,6,1
-block_hint,ForInFilter,226,227,1
-block_hint,ForInFilter,228,229,1
-block_hint,ForInFilter,219,220,0
-block_hint,ForInFilter,115,116,1
-block_hint,ForInFilter,210,211,0
-block_hint,ForInFilter,60,61,0
-block_hint,ForInFilter,125,126,1
-block_hint,ForInFilter,214,215,1
-block_hint,ForInFilter,101,102,0
+block_hint,ForInFilter,234,235,1
+block_hint,ForInFilter,236,237,1
+block_hint,ForInFilter,227,228,0
+block_hint,ForInFilter,117,118,1
+block_hint,ForInFilter,217,218,0
+block_hint,ForInFilter,62,63,0
+block_hint,ForInFilter,129,130,1
+block_hint,ForInFilter,221,222,1
 block_hint,ForInFilter,103,104,0
+block_hint,ForInFilter,105,106,0
+block_hint,ForInFilter,66,67,0
 block_hint,ForInFilter,64,65,0
-block_hint,ForInFilter,62,63,0
-block_hint,ForInFilter,241,242,0
-block_hint,ForInFilter,105,106,1
-block_hint,ForInFilter,39,40,1
-block_hint,ForInFilter,217,218,0
+block_hint,ForInFilter,270,271,0
+block_hint,ForInFilter,225,226,1
+block_hint,ForInFilter,109,110,1
+block_hint,ForInFilter,71,72,0
+block_hint,ForInFilter,266,267,0
+block_hint,ForInFilter,264,265,0
+block_hint,ForInFilter,251,252,0
 block_hint,ForInFilter,107,108,1
-block_hint,ForInFilter,43,44,1
-block_hint,ForInFilter,196,197,0
-block_hint,ForInFilter,45,46,0
-block_hint,ForInFilter,70,71,1
-block_hint,ForInFilter,111,112,0
-block_hint,ForInFilter,127,128,0
-block_hint,ForInFilter,37,38,0
-block_hint,ForInFilter,238,239,0
-block_hint,ForInFilter,243,244,1
-block_hint,ForInFilter,184,185,0
-block_hint,ForInFilter,34,35,1
+block_hint,ForInFilter,40,41,1
+block_hint,ForInFilter,201,202,0
+block_hint,ForInFilter,42,43,0
+block_hint,ForInFilter,144,145,1
+block_hint,ForInFilter,46,47,0
+block_hint,ForInFilter,113,114,0
+block_hint,ForInFilter,131,132,0
+block_hint,ForInFilter,36,37,0
+block_hint,ForInFilter,248,249,0
+block_hint,ForInFilter,255,256,1
+block_hint,ForInFilter,189,190,0
+block_hint,ForInFilter,33,34,1
 block_hint,RegExpConstructor,55,56,1
 block_hint,RegExpConstructor,7,8,1
 block_hint,RegExpConstructor,131,132,1
@@ -2375,42 +2463,42 @@ block_hint,FindOrderedHashSetEntry,42,43,1
 block_hint,FindOrderedHashSetEntry,68,69,0
 block_hint,FindOrderedHashSetEntry,58,59,1
 block_hint,FindOrderedHashSetEntry,60,61,1
-block_hint,SetConstructor,193,194,1
-block_hint,SetConstructor,71,72,0
+block_hint,SetConstructor,202,203,1
+block_hint,SetConstructor,74,75,0
 block_hint,SetConstructor,11,12,1
-block_hint,SetConstructor,168,169,1
-block_hint,SetConstructor,130,131,1
-block_hint,SetConstructor,54,55,0
-block_hint,SetConstructor,56,57,1
-block_hint,SetConstructor,207,208,1
-block_hint,SetConstructor,199,200,0
-block_hint,SetConstructor,76,77,1
+block_hint,SetConstructor,172,173,1
+block_hint,SetConstructor,135,136,1
+block_hint,SetConstructor,56,57,0
+block_hint,SetConstructor,58,59,1
+block_hint,SetConstructor,218,219,1
+block_hint,SetConstructor,210,211,0
+block_hint,SetConstructor,79,80,1
 block_hint,SetConstructor,23,24,1
-block_hint,SetConstructor,211,212,1
-block_hint,SetConstructor,203,204,0
-block_hint,SetConstructor,144,145,1
+block_hint,SetConstructor,222,223,1
+block_hint,SetConstructor,214,215,0
+block_hint,SetConstructor,150,151,1
 block_hint,SetConstructor,25,26,1
-block_hint,SetConstructor,172,173,1
-block_hint,SetConstructor,137,138,1
-block_hint,SetConstructor,80,81,1
-block_hint,SetConstructor,82,83,1
-block_hint,SetConstructor,84,85,1
-block_hint,SetConstructor,86,87,1
-block_hint,SetConstructor,88,89,1
-block_hint,SetConstructor,90,91,1
-block_hint,SetConstructor,32,33,1
-block_hint,SetConstructor,92,93,1
-block_hint,SetConstructor,140,141,1
+block_hint,SetConstructor,178,179,1
+block_hint,SetConstructor,143,144,1
+block_hint,SetConstructor,83,84,1
+block_hint,SetConstructor,85,86,1
+block_hint,SetConstructor,87,88,1
+block_hint,SetConstructor,89,90,1
+block_hint,SetConstructor,91,92,1
+block_hint,SetConstructor,93,94,1
+block_hint,SetConstructor,34,35,1
+block_hint,SetConstructor,95,96,1
 block_hint,SetConstructor,146,147,1
+block_hint,SetConstructor,152,153,1
+block_hint,SetConstructor,190,191,0
 block_hint,SetConstructor,183,184,0
-block_hint,SetConstructor,176,177,0
-block_hint,SetConstructor,148,149,0
-block_hint,SetConstructor,102,103,0
-block_hint,SetConstructor,132,133,1
+block_hint,SetConstructor,154,155,0
+block_hint,SetConstructor,105,106,0
+block_hint,SetConstructor,137,138,1
 block_hint,SetConstructor,27,28,1
-block_hint,SetConstructor,60,61,1
-block_hint,SetConstructor,159,160,0
-block_hint,SetConstructor,64,65,1
+block_hint,SetConstructor,62,63,1
+block_hint,SetConstructor,176,177,0
+block_hint,SetConstructor,66,67,1
 block_hint,SetPrototypeHas,10,11,1
 block_hint,SetPrototypeHas,5,6,1
 block_hint,SetPrototypeHas,7,8,1
@@ -2565,35 +2653,36 @@ block_hint,TypedArrayPrototypeLength,52,53,0
 block_hint,TypedArrayPrototypeLength,44,45,0
 block_hint,TypedArrayPrototypeLength,28,29,0
 block_hint,TypedArrayPrototypeLength,19,20,0
-block_hint,WeakMapConstructor,346,347,1
-block_hint,WeakMapConstructor,266,267,1
-block_hint,WeakMapConstructor,115,116,0
-block_hint,WeakMapConstructor,14,15,1
-block_hint,WeakMapConstructor,288,289,1
-block_hint,WeakMapConstructor,226,227,1
-block_hint,WeakMapConstructor,90,91,0
-block_hint,WeakMapConstructor,92,93,1
-block_hint,WeakMapConstructor,290,291,1
-block_hint,WeakMapConstructor,323,324,0
-block_hint,WeakMapConstructor,337,338,0
-block_hint,WeakMapConstructor,236,237,0
+block_hint,WeakMapConstructor,351,352,1
+block_hint,WeakMapConstructor,271,272,1
 block_hint,WeakMapConstructor,119,120,0
-block_hint,WeakMapConstructor,238,239,0
-block_hint,WeakMapConstructor,106,107,0
-block_hint,WeakMapConstructor,240,241,1
-block_hint,WeakMapConstructor,207,208,1
+block_hint,WeakMapConstructor,14,15,1
+block_hint,WeakMapConstructor,293,294,1
+block_hint,WeakMapConstructor,230,231,1
+block_hint,WeakMapConstructor,93,94,0
+block_hint,WeakMapConstructor,95,96,1
+block_hint,WeakMapConstructor,295,296,1
+block_hint,WeakMapConstructor,331,332,0
+block_hint,WeakMapConstructor,342,343,0
+block_hint,WeakMapConstructor,239,240,0
+block_hint,WeakMapConstructor,123,124,0
+block_hint,WeakMapConstructor,241,242,0
+block_hint,WeakMapConstructor,109,110,0
+block_hint,WeakMapConstructor,243,244,1
+block_hint,WeakMapConstructor,211,212,1
 block_hint,WeakMapConstructor,28,29,1
 block_hint,WeakMapConstructor,30,31,1
 block_hint,WeakMapConstructor,32,33,1
-block_hint,WeakMapConstructor,95,96,0
-block_hint,WeakMapConstructor,113,114,1
-block_hint,WeakMapLookupHashIndex,10,11,1
-block_hint,WeakMapLookupHashIndex,12,13,1
-block_hint,WeakMapLookupHashIndex,14,15,0
-block_hint,WeakMapLookupHashIndex,16,17,0
+block_hint,WeakMapConstructor,98,99,0
+block_hint,WeakMapConstructor,117,118,1
+block_hint,WeakMapLookupHashIndex,9,10,1
+block_hint,WeakMapLookupHashIndex,31,32,1
+block_hint,WeakMapLookupHashIndex,11,12,0
+block_hint,WeakMapLookupHashIndex,13,14,0
 block_hint,WeakMapLookupHashIndex,25,26,1
-block_hint,WeakMapLookupHashIndex,21,22,0
-block_hint,WeakMapLookupHashIndex,18,19,0
+block_hint,WeakMapLookupHashIndex,33,34,1
+block_hint,WeakMapLookupHashIndex,27,28,0
+block_hint,WeakMapLookupHashIndex,23,24,0
 block_hint,WeakMapGet,12,13,1
 block_hint,WeakMapGet,7,8,1
 block_hint,WeakMapGet,9,10,1
@@ -2601,31 +2690,32 @@ block_hint,WeakMapGet,3,4,1
 block_hint,WeakMapPrototypeHas,10,11,1
 block_hint,WeakMapPrototypeHas,5,6,1
 block_hint,WeakMapPrototypeHas,7,8,1
-block_hint,WeakMapPrototypeSet,17,18,1
-block_hint,WeakMapPrototypeSet,6,7,1
-block_hint,WeakMapPrototypeSet,8,9,1
-block_hint,WeakMapPrototypeSet,10,11,1
-block_hint,WeakMapPrototypeSet,12,13,1
-block_hint,WeakMapPrototypeSet,14,15,0
-block_hint,WeakMapPrototypeSet,4,5,0
-block_hint,WeakCollectionSet,18,19,0
-block_hint,WeakCollectionSet,6,7,1
-block_hint,WeakCollectionSet,14,15,0
+block_hint,WeakMapPrototypeSet,24,25,1
+block_hint,WeakMapPrototypeSet,5,6,1
+block_hint,WeakMapPrototypeSet,7,8,1
+block_hint,WeakMapPrototypeSet,13,14,1
+block_hint,WeakMapPrototypeSet,22,23,1
+block_hint,WeakMapPrototypeSet,15,16,0
+block_hint,WeakMapPrototypeSet,9,10,0
+block_hint,WeakCollectionSet,17,18,1
+block_hint,WeakCollectionSet,20,21,0
+block_hint,WeakCollectionSet,7,8,1
+block_hint,WeakCollectionSet,13,14,0
 block_hint,AsyncGeneratorResolve,9,10,1
 block_hint,AsyncGeneratorResolve,3,4,1
 block_hint,AsyncGeneratorResolve,11,12,0
 block_hint,AsyncGeneratorResolve,7,8,0
-block_hint,AsyncGeneratorYield,24,25,1
-block_hint,AsyncGeneratorYield,19,20,0
-block_hint,AsyncGeneratorYield,6,7,1
-block_hint,AsyncGeneratorYield,42,43,1
-block_hint,AsyncGeneratorYield,37,38,0
-block_hint,AsyncGeneratorYield,28,29,1
-block_hint,AsyncGeneratorYield,8,9,1
-block_hint,AsyncGeneratorYield,10,11,1
-block_hint,AsyncGeneratorYield,12,13,1
-block_hint,AsyncGeneratorYield,14,15,1
-block_hint,AsyncGeneratorYield,22,23,0
+block_hint,AsyncGeneratorYieldWithAwait,24,25,1
+block_hint,AsyncGeneratorYieldWithAwait,19,20,0
+block_hint,AsyncGeneratorYieldWithAwait,6,7,1
+block_hint,AsyncGeneratorYieldWithAwait,42,43,1
+block_hint,AsyncGeneratorYieldWithAwait,37,38,0
+block_hint,AsyncGeneratorYieldWithAwait,28,29,1
+block_hint,AsyncGeneratorYieldWithAwait,8,9,1
+block_hint,AsyncGeneratorYieldWithAwait,10,11,1
+block_hint,AsyncGeneratorYieldWithAwait,12,13,1
+block_hint,AsyncGeneratorYieldWithAwait,14,15,1
+block_hint,AsyncGeneratorYieldWithAwait,22,23,0
 block_hint,AsyncGeneratorResumeNext,18,19,0
 block_hint,AsyncGeneratorResumeNext,14,15,0
 block_hint,AsyncGeneratorPrototypeNext,27,28,1
@@ -2652,8 +2742,8 @@ block_hint,AsyncGeneratorAwaitUncaught,22,23,0
 block_hint,AsyncGeneratorAwaitResolveClosure,8,9,1
 block_hint,AsyncGeneratorAwaitResolveClosure,2,3,1
 block_hint,AsyncGeneratorAwaitResolveClosure,6,7,0
-block_hint,AsyncGeneratorYieldResolveClosure,5,6,1
-block_hint,AsyncGeneratorYieldResolveClosure,2,3,1
+block_hint,AsyncGeneratorYieldWithAwaitResolveClosure,5,6,1
+block_hint,AsyncGeneratorYieldWithAwaitResolveClosure,2,3,1
 block_hint,StringAdd_CheckNone,19,20,1
 block_hint,StringAdd_CheckNone,58,59,0
 block_hint,StringAdd_CheckNone,78,79,1
@@ -2699,108 +2789,115 @@ block_hint,SubString,139,140,0
 block_hint,SubString,103,104,1
 block_hint,SubString,34,35,1
 block_hint,SubString,31,32,0
-block_hint,GetProperty,53,54,1
-block_hint,GetProperty,98,99,0
-block_hint,GetProperty,168,169,1
-block_hint,GetProperty,195,196,0
-block_hint,GetProperty,158,159,1
-block_hint,GetProperty,130,131,1
-block_hint,GetProperty,57,58,1
-block_hint,GetProperty,136,137,0
-block_hint,GetProperty,138,139,0
-block_hint,GetProperty,107,108,0
-block_hint,GetProperty,59,60,0
-block_hint,GetProperty,160,161,0
-block_hint,GetProperty,179,180,0
-block_hint,GetProperty,140,141,1
-block_hint,GetProperty,199,200,0
-block_hint,GetProperty,38,39,1
-block_hint,GetProperty,207,208,0
-block_hint,GetProperty,40,41,0
-block_hint,GetProperty,144,145,0
-block_hint,GetProperty,110,111,1
-block_hint,GetProperty,146,147,1
-block_hint,GetProperty,150,151,0
-block_hint,GetProperty,154,155,1
-block_hint,GetProperty,148,149,0
-block_hint,GetProperty,46,47,0
-block_hint,GetProperty,214,215,0
-block_hint,GetProperty,186,187,1
-block_hint,GetProperty,89,90,0
-block_hint,GetProperty,91,92,0
-block_hint,GetProperty,93,94,0
-block_hint,GetProperty,156,157,0
-block_hint,GetProperty,95,96,1
-block_hint,GetProperty,193,194,0
-block_hint,GetProperty,211,212,0
-block_hint,GetProperty,216,217,1
-block_hint,GetProperty,191,192,0
-block_hint,GetProperty,189,190,0
-block_hint,GetProperty,23,24,0
+block_hint,GetProperty,56,57,1
+block_hint,GetProperty,101,102,0
 block_hint,GetProperty,175,176,1
-block_hint,GetProperty,101,102,1
-block_hint,GetPropertyWithReceiver,55,56,1
-block_hint,GetPropertyWithReceiver,57,58,1
-block_hint,GetPropertyWithReceiver,193,194,0
-block_hint,GetPropertyWithReceiver,167,168,1
-block_hint,GetPropertyWithReceiver,201,202,0
-block_hint,GetPropertyWithReceiver,109,110,0
-block_hint,GetPropertyWithReceiver,155,156,1
-block_hint,GetPropertyWithReceiver,135,136,1
-block_hint,GetPropertyWithReceiver,59,60,1
-block_hint,GetPropertyWithReceiver,141,142,0
-block_hint,GetPropertyWithReceiver,143,144,0
-block_hint,GetPropertyWithReceiver,111,112,0
-block_hint,GetPropertyWithReceiver,61,62,0
-block_hint,GetPropertyWithReceiver,157,158,0
-block_hint,GetPropertyWithReceiver,145,146,1
-block_hint,GetPropertyWithReceiver,206,207,0
-block_hint,GetPropertyWithReceiver,147,148,1
-block_hint,GetPropertyWithReceiver,41,42,1
-block_hint,GetPropertyWithReceiver,219,220,0
-block_hint,GetPropertyWithReceiver,43,44,0
-block_hint,GetPropertyWithReceiver,176,177,0
-block_hint,GetPropertyWithReceiver,35,36,0
-block_hint,GetPropertyWithReceiver,216,217,1
-block_hint,GetPropertyWithReceiver,195,196,0
+block_hint,GetProperty,205,206,0
+block_hint,GetProperty,165,166,1
+block_hint,GetProperty,133,134,1
+block_hint,GetProperty,60,61,1
+block_hint,GetProperty,139,140,0
+block_hint,GetProperty,141,142,0
+block_hint,GetProperty,110,111,0
+block_hint,GetProperty,62,63,0
+block_hint,GetProperty,167,168,0
+block_hint,GetProperty,220,221,0
+block_hint,GetProperty,210,211,1
+block_hint,GetProperty,112,113,0
+block_hint,GetProperty,231,232,0
+block_hint,GetProperty,222,223,0
+block_hint,GetProperty,218,219,0
+block_hint,GetProperty,35,36,1
+block_hint,GetProperty,224,225,0
+block_hint,GetProperty,37,38,0
+block_hint,GetProperty,147,148,0
+block_hint,GetProperty,187,188,1
+block_hint,GetProperty,41,42,0
+block_hint,GetProperty,149,150,1
+block_hint,GetProperty,157,158,0
+block_hint,GetProperty,161,162,1
+block_hint,GetProperty,151,152,0
+block_hint,GetProperty,47,48,0
+block_hint,GetProperty,233,234,0
+block_hint,GetProperty,196,197,1
+block_hint,GetProperty,92,93,0
+block_hint,GetProperty,94,95,0
+block_hint,GetProperty,96,97,0
+block_hint,GetProperty,163,164,0
+block_hint,GetProperty,98,99,1
+block_hint,GetProperty,203,204,0
+block_hint,GetProperty,228,229,0
+block_hint,GetProperty,235,236,1
+block_hint,GetProperty,201,202,0
+block_hint,GetProperty,199,200,0
+block_hint,GetProperty,22,23,0
+block_hint,GetProperty,182,183,1
+block_hint,GetProperty,104,105,1
+block_hint,GetPropertyWithReceiver,58,59,1
+block_hint,GetPropertyWithReceiver,60,61,1
+block_hint,GetPropertyWithReceiver,203,204,0
 block_hint,GetPropertyWithReceiver,174,175,1
-block_hint,GetPropertyWithReceiver,105,106,1
-block_hint,SetProperty,375,376,1
-block_hint,SetProperty,377,378,0
-block_hint,SetProperty,1159,1160,0
-block_hint,SetProperty,915,916,1
-block_hint,SetProperty,1020,1021,1
-block_hint,SetProperty,1022,1023,0
-block_hint,SetProperty,728,729,0
-block_hint,SetProperty,909,910,1
-block_hint,SetProperty,409,410,0
-block_hint,SetProperty,411,412,0
-block_hint,SetProperty,253,254,1
+block_hint,GetPropertyWithReceiver,211,212,0
+block_hint,GetPropertyWithReceiver,112,113,0
+block_hint,GetPropertyWithReceiver,162,163,1
+block_hint,GetPropertyWithReceiver,138,139,1
+block_hint,GetPropertyWithReceiver,62,63,1
+block_hint,GetPropertyWithReceiver,144,145,0
+block_hint,GetPropertyWithReceiver,146,147,0
+block_hint,GetPropertyWithReceiver,114,115,0
+block_hint,GetPropertyWithReceiver,64,65,0
+block_hint,GetPropertyWithReceiver,164,165,0
+block_hint,GetPropertyWithReceiver,217,218,1
+block_hint,GetPropertyWithReceiver,117,118,0
+block_hint,GetPropertyWithReceiver,238,239,0
+block_hint,GetPropertyWithReceiver,234,235,0
+block_hint,GetPropertyWithReceiver,225,226,0
+block_hint,GetPropertyWithReceiver,148,149,1
+block_hint,GetPropertyWithReceiver,38,39,1
+block_hint,GetPropertyWithReceiver,236,237,0
+block_hint,GetPropertyWithReceiver,40,41,0
+block_hint,GetPropertyWithReceiver,183,184,0
+block_hint,GetPropertyWithReceiver,34,35,0
+block_hint,GetPropertyWithReceiver,231,232,1
+block_hint,GetPropertyWithReceiver,205,206,0
+block_hint,GetPropertyWithReceiver,181,182,1
+block_hint,GetPropertyWithReceiver,108,109,1
+block_hint,SetProperty,379,380,1
+block_hint,SetProperty,381,382,0
+block_hint,SetProperty,1201,1202,0
+block_hint,SetProperty,925,926,1
+block_hint,SetProperty,1034,1035,1
+block_hint,SetProperty,1036,1037,0
+block_hint,SetProperty,733,734,0
+block_hint,SetProperty,919,920,1
 block_hint,SetProperty,413,414,0
-block_hint,SetProperty,625,626,1
-block_hint,SetProperty,93,94,1
-block_hint,SetProperty,95,96,1
-block_hint,SetProperty,1061,1062,0
-block_hint,SetProperty,800,801,1
-block_hint,SetProperty,802,803,1
-block_hint,SetProperty,804,805,0
-block_hint,SetProperty,105,106,1
-block_hint,SetProperty,109,110,1
-block_hint,SetProperty,425,426,1
-block_hint,SetProperty,111,112,1
-block_hint,SetProperty,107,108,1
-block_hint,CreateDataProperty,317,318,1
-block_hint,CreateDataProperty,319,320,0
-block_hint,CreateDataProperty,955,956,0
-block_hint,CreateDataProperty,772,773,1
-block_hint,CreateDataProperty,860,861,1
-block_hint,CreateDataProperty,536,537,1
-block_hint,CreateDataProperty,638,639,0
-block_hint,CreateDataProperty,640,641,1
-block_hint,CreateDataProperty,886,887,1
-block_hint,CreateDataProperty,331,332,0
+block_hint,SetProperty,415,416,0
+block_hint,SetProperty,256,257,1
+block_hint,SetProperty,417,418,0
+block_hint,SetProperty,630,631,1
+block_hint,SetProperty,92,93,1
+block_hint,SetProperty,94,95,1
+block_hint,SetProperty,1089,1090,0
+block_hint,SetProperty,808,809,1
+block_hint,SetProperty,810,811,1
+block_hint,SetProperty,812,813,0
+block_hint,SetProperty,104,105,1
+block_hint,SetProperty,108,109,1
+block_hint,SetProperty,429,430,1
+block_hint,SetProperty,110,111,1
+block_hint,SetProperty,106,107,1
+block_hint,CreateDataProperty,319,320,1
+block_hint,CreateDataProperty,321,322,0
+block_hint,CreateDataProperty,978,979,0
+block_hint,CreateDataProperty,779,780,1
+block_hint,CreateDataProperty,868,869,1
+block_hint,CreateDataProperty,539,540,1
+block_hint,CreateDataProperty,645,646,0
+block_hint,CreateDataProperty,647,648,1
+block_hint,CreateDataProperty,903,904,1
+block_hint,CreateDataProperty,333,334,0
 block_hint,CreateDataProperty,55,56,1
-block_hint,CreateDataProperty,540,541,1
+block_hint,CreateDataProperty,543,544,1
 block_hint,CreateDataProperty,57,58,1
 block_hint,ArrayPrototypeConcat,79,80,1
 block_hint,ArrayPrototypeConcat,54,55,0
@@ -3730,7 +3827,6 @@ block_hint,FunctionPrototypeHasInstance,19,20,1
 block_hint,FunctionPrototypeHasInstance,33,34,1
 block_hint,FunctionPrototypeHasInstance,23,24,0
 block_hint,FunctionPrototypeHasInstance,13,14,0
-block_hint,FunctionPrototypeHasInstance,31,32,0
 block_hint,FunctionPrototypeHasInstance,25,26,0
 block_hint,FunctionPrototypeHasInstance,27,28,0
 block_hint,FastFunctionPrototypeBind,91,92,1
@@ -3984,16 +4080,17 @@ block_hint,PerformPromiseThen,20,21,1
 block_hint,PerformPromiseThen,115,116,1
 block_hint,PromiseFulfillReactionJob,22,23,0
 block_hint,PromiseFulfillReactionJob,2,3,1
-block_hint,ResolvePromise,27,28,0
 block_hint,ResolvePromise,29,30,0
-block_hint,ResolvePromise,15,16,1
-block_hint,ResolvePromise,45,46,0
 block_hint,ResolvePromise,31,32,0
+block_hint,ResolvePromise,15,16,1
+block_hint,ResolvePromise,47,48,0
+block_hint,ResolvePromise,33,34,0
 block_hint,ResolvePromise,6,7,1
 block_hint,ResolvePromise,17,18,0
-block_hint,ResolvePromise,51,52,1
-block_hint,ResolvePromise,47,48,0
-block_hint,ResolvePromise,21,22,0
+block_hint,ResolvePromise,19,20,1
+block_hint,ResolvePromise,53,54,1
+block_hint,ResolvePromise,49,50,0
+block_hint,ResolvePromise,23,24,0
 block_hint,ProxyConstructor,30,31,1
 block_hint,ProxyConstructor,10,11,0
 block_hint,ProxyConstructor,22,23,1
@@ -4004,29 +4101,31 @@ block_hint,ProxyConstructor,7,8,1
 block_hint,ProxyConstructor,17,18,1
 block_hint,ProxyConstructor,5,6,1
 block_hint,ProxyConstructor,12,13,1
-block_hint,ProxyGetProperty,139,140,1
-block_hint,ProxyGetProperty,33,34,0
-block_hint,ProxyGetProperty,11,12,0
-block_hint,ProxyGetProperty,82,83,0
-block_hint,ProxyGetProperty,84,85,0
-block_hint,ProxyGetProperty,78,79,1
-block_hint,ProxyGetProperty,80,81,1
-block_hint,ProxyGetProperty,160,161,1
-block_hint,ProxyGetProperty,163,164,0
-block_hint,ProxyGetProperty,108,109,0
-block_hint,ProxyGetProperty,37,38,1
-block_hint,ProxyGetProperty,21,22,1
-block_hint,ProxyGetProperty,27,28,0
-block_hint,ProxyGetProperty,29,30,1
-block_hint,ProxyGetProperty,189,190,1
-block_hint,ProxyGetProperty,179,180,0
-block_hint,ProxyGetProperty,69,70,1
-block_hint,ProxyGetProperty,151,152,0
-block_hint,ProxyGetProperty,170,171,1
-block_hint,ProxyGetProperty,121,122,1
 block_hint,ProxyGetProperty,153,154,1
-block_hint,ProxyGetProperty,155,156,0
-block_hint,ProxyGetProperty,53,54,0
+block_hint,ProxyGetProperty,34,35,0
+block_hint,ProxyGetProperty,10,11,0
+block_hint,ProxyGetProperty,89,90,0
+block_hint,ProxyGetProperty,91,92,0
+block_hint,ProxyGetProperty,85,86,1
+block_hint,ProxyGetProperty,87,88,1
+block_hint,ProxyGetProperty,176,177,1
+block_hint,ProxyGetProperty,180,181,0
+block_hint,ProxyGetProperty,118,119,0
+block_hint,ProxyGetProperty,40,41,1
+block_hint,ProxyGetProperty,114,115,1
+block_hint,ProxyGetProperty,24,25,0
+block_hint,ProxyGetProperty,26,27,1
+block_hint,ProxyGetProperty,208,209,1
+block_hint,ProxyGetProperty,198,199,0
+block_hint,ProxyGetProperty,149,150,1
+block_hint,ProxyGetProperty,28,29,0
+block_hint,ProxyGetProperty,48,49,1
+block_hint,ProxyGetProperty,167,168,0
+block_hint,ProxyGetProperty,187,188,1
+block_hint,ProxyGetProperty,131,132,1
+block_hint,ProxyGetProperty,169,170,1
+block_hint,ProxyGetProperty,171,172,0
+block_hint,ProxyGetProperty,60,61,0
 block_hint,ReflectGet,20,21,1
 block_hint,ReflectGet,15,16,0
 block_hint,ReflectGet,5,6,1
@@ -4036,162 +4135,164 @@ block_hint,ReflectGet,9,10,0
 block_hint,ReflectHas,8,9,1
 block_hint,ReflectHas,5,6,1
 block_hint,ReflectHas,3,4,0
-block_hint,RegExpPrototypeExec,200,201,1
-block_hint,RegExpPrototypeExec,128,129,1
-block_hint,RegExpPrototypeExec,130,131,1
 block_hint,RegExpPrototypeExec,202,203,1
-block_hint,RegExpPrototypeExec,164,165,1
+block_hint,RegExpPrototypeExec,130,131,1
+block_hint,RegExpPrototypeExec,132,133,1
+block_hint,RegExpPrototypeExec,204,205,1
+block_hint,RegExpPrototypeExec,166,167,1
 block_hint,RegExpPrototypeExec,16,17,1
-block_hint,RegExpPrototypeExec,146,147,1
-block_hint,RegExpPrototypeExec,148,149,0
+block_hint,RegExpPrototypeExec,148,149,1
 block_hint,RegExpPrototypeExec,150,151,0
-block_hint,RegExpPrototypeExec,206,207,0
 block_hint,RegExpPrototypeExec,152,153,0
+block_hint,RegExpPrototypeExec,208,209,0
+block_hint,RegExpPrototypeExec,154,155,0
 block_hint,RegExpPrototypeExec,18,19,1
-block_hint,RegExpPrototypeExec,183,184,0
-block_hint,RegExpPrototypeExec,132,133,0
-block_hint,RegExpPrototypeExec,157,158,0
-block_hint,RegExpPrototypeExec,234,235,0
-block_hint,RegExpPrototypeExec,225,226,1
-block_hint,RegExpPrototypeExec,210,211,1
-block_hint,RegExpPrototypeExec,169,170,1
+block_hint,RegExpPrototypeExec,185,186,0
+block_hint,RegExpPrototypeExec,134,135,0
 block_hint,RegExpPrototypeExec,159,160,0
+block_hint,RegExpPrototypeExec,236,237,0
+block_hint,RegExpPrototypeExec,227,228,1
+block_hint,RegExpPrototypeExec,212,213,1
+block_hint,RegExpPrototypeExec,171,172,1
+block_hint,RegExpPrototypeExec,161,162,0
 block_hint,RegExpPrototypeExec,73,74,0
 block_hint,RegExpPrototypeExec,24,25,1
-block_hint,RegExpPrototypeExec,136,137,1
-block_hint,RegExpPrototypeExec,26,27,1
-block_hint,RegExpPrototypeExec,188,189,0
 block_hint,RegExpPrototypeExec,138,139,1
-block_hint,RegExpPrototypeExec,240,241,1
-block_hint,RegExpPrototypeExec,212,213,0
-block_hint,RegExpPrototypeExec,177,178,1
+block_hint,RegExpPrototypeExec,26,27,1
+block_hint,RegExpPrototypeExec,190,191,0
+block_hint,RegExpPrototypeExec,140,141,1
+block_hint,RegExpPrototypeExec,242,243,1
+block_hint,RegExpPrototypeExec,214,215,0
+block_hint,RegExpPrototypeExec,179,180,1
 block_hint,RegExpPrototypeExec,77,78,0
 block_hint,RegExpPrototypeExec,34,35,1
-block_hint,RegExpPrototypeExec,142,143,1
-block_hint,RegExpPrototypeExec,114,115,1
-block_hint,RegExpPrototypeExec,154,155,1
-block_hint,RegExpMatchFast,251,252,0
-block_hint,RegExpMatchFast,292,293,1
+block_hint,RegExpPrototypeExec,144,145,1
+block_hint,RegExpPrototypeExec,116,117,1
+block_hint,RegExpPrototypeExec,156,157,1
+block_hint,RegExpMatchFast,363,364,0
+block_hint,RegExpMatchFast,293,294,1
 block_hint,RegExpMatchFast,34,35,1
-block_hint,RegExpMatchFast,328,329,0
-block_hint,RegExpMatchFast,237,238,0
-block_hint,RegExpMatchFast,286,287,0
-block_hint,RegExpMatchFast,449,450,0
-block_hint,RegExpMatchFast,392,393,1
-block_hint,RegExpMatchFast,294,295,1
-block_hint,RegExpMatchFast,288,289,0
+block_hint,RegExpMatchFast,331,332,0
+block_hint,RegExpMatchFast,240,241,0
+block_hint,RegExpMatchFast,287,288,0
+block_hint,RegExpMatchFast,454,455,0
+block_hint,RegExpMatchFast,397,398,1
+block_hint,RegExpMatchFast,295,296,1
+block_hint,RegExpMatchFast,289,290,0
 block_hint,RegExpMatchFast,127,128,0
-block_hint,RegExpMatchFast,239,240,1
-block_hint,RegExpMatchFast,241,242,1
+block_hint,RegExpMatchFast,242,243,1
+block_hint,RegExpMatchFast,244,245,1
 block_hint,RegExpMatchFast,42,43,1
-block_hint,RegExpMatchFast,333,334,0
-block_hint,RegExpMatchFast,243,244,1
-block_hint,RegExpMatchFast,457,458,1
-block_hint,RegExpMatchFast,394,395,0
-block_hint,RegExpMatchFast,322,323,1
+block_hint,RegExpMatchFast,336,337,0
+block_hint,RegExpMatchFast,246,247,1
+block_hint,RegExpMatchFast,462,463,1
+block_hint,RegExpMatchFast,399,400,0
+block_hint,RegExpMatchFast,325,326,1
 block_hint,RegExpMatchFast,131,132,0
 block_hint,RegExpMatchFast,50,51,1
-block_hint,RegExpMatchFast,247,248,1
-block_hint,RegExpMatchFast,183,184,1
-block_hint,RegExpMatchFast,262,263,1
+block_hint,RegExpMatchFast,250,251,1
+block_hint,RegExpMatchFast,186,187,1
+block_hint,RegExpMatchFast,263,264,1
+block_hint,RegExpMatchFast,301,302,0
 block_hint,RegExpMatchFast,84,85,1
 block_hint,RegExpMatchFast,86,87,1
-block_hint,RegExpMatchFast,302,303,0
-block_hint,RegExpMatchFast,347,348,0
-block_hint,RegExpMatchFast,378,379,0
-block_hint,RegExpMatchFast,300,301,0
+block_hint,RegExpMatchFast,305,306,0
+block_hint,RegExpMatchFast,350,351,0
+block_hint,RegExpMatchFast,383,384,0
+block_hint,RegExpMatchFast,303,304,0
 block_hint,RegExpMatchFast,88,89,1
-block_hint,RegExpMatchFast,342,343,0
-block_hint,RegExpMatchFast,253,254,0
-block_hint,RegExpMatchFast,278,279,0
-block_hint,RegExpMatchFast,193,194,1
-block_hint,RegExpMatchFast,451,452,0
-block_hint,RegExpMatchFast,437,438,1
-block_hint,RegExpMatchFast,390,391,1
-block_hint,RegExpMatchFast,304,305,1
-block_hint,RegExpMatchFast,280,281,0
+block_hint,RegExpMatchFast,345,346,0
+block_hint,RegExpMatchFast,254,255,0
+block_hint,RegExpMatchFast,279,280,0
+block_hint,RegExpMatchFast,196,197,1
+block_hint,RegExpMatchFast,456,457,0
+block_hint,RegExpMatchFast,442,443,1
+block_hint,RegExpMatchFast,395,396,1
+block_hint,RegExpMatchFast,307,308,1
+block_hint,RegExpMatchFast,281,282,0
 block_hint,RegExpMatchFast,115,116,0
-block_hint,RegExpMatchFast,344,345,0
-block_hint,RegExpMatchFast,255,256,0
+block_hint,RegExpMatchFast,347,348,0
+block_hint,RegExpMatchFast,256,257,0
 block_hint,RegExpMatchFast,94,95,1
-block_hint,RegExpMatchFast,382,383,1
-block_hint,RegExpMatchFast,306,307,0
-block_hint,RegExpMatchFast,178,179,1
-block_hint,RegExpMatchFast,176,177,1
-block_hint,RegExpMatchFast,308,309,0
-block_hint,RegExpMatchFast,180,181,0
+block_hint,RegExpMatchFast,387,388,1
+block_hint,RegExpMatchFast,309,310,0
+block_hint,RegExpMatchFast,181,182,1
+block_hint,RegExpMatchFast,179,180,1
+block_hint,RegExpMatchFast,311,312,0
+block_hint,RegExpMatchFast,183,184,0
 block_hint,RegExpMatchFast,102,103,0
 block_hint,RegExpMatchFast,104,105,0
-block_hint,RegExpMatchFast,201,202,1
-block_hint,RegExpMatchFast,319,320,0
+block_hint,RegExpMatchFast,204,205,1
+block_hint,RegExpMatchFast,322,323,0
 block_hint,RegExpMatchFast,106,107,1
-block_hint,RegExpMatchFast,190,191,1
-block_hint,RegExpMatchFast,349,350,0
+block_hint,RegExpMatchFast,193,194,1
+block_hint,RegExpMatchFast,352,353,0
 block_hint,RegExpMatchFast,96,97,1
-block_hint,RegExpMatchFast,172,173,1
-block_hint,RegExpMatchFast,170,171,1
-block_hint,RegExpMatchFast,174,175,0
+block_hint,RegExpMatchFast,175,176,1
+block_hint,RegExpMatchFast,173,174,1
+block_hint,RegExpMatchFast,177,178,0
 block_hint,RegExpMatchFast,98,99,0
 block_hint,RegExpMatchFast,100,101,0
-block_hint,RegExpMatchFast,221,222,1
-block_hint,RegExpMatchFast,311,312,0
-block_hint,RegExpMatchFast,223,224,0
-block_hint,RegExpReplace,258,259,1
-block_hint,RegExpReplace,296,297,1
-block_hint,RegExpReplace,248,249,1
-block_hint,RegExpReplace,148,149,0
+block_hint,RegExpMatchFast,224,225,1
+block_hint,RegExpMatchFast,314,315,0
+block_hint,RegExpMatchFast,226,227,0
+block_hint,RegExpReplace,261,262,1
+block_hint,RegExpReplace,299,300,1
+block_hint,RegExpReplace,251,252,1
+block_hint,RegExpReplace,149,150,0
 block_hint,RegExpReplace,22,23,1
-block_hint,RegExpReplace,206,207,1
-block_hint,RegExpReplace,150,151,0
+block_hint,RegExpReplace,209,210,1
+block_hint,RegExpReplace,151,152,0
 block_hint,RegExpReplace,24,25,1
-block_hint,RegExpReplace,208,209,1
-block_hint,RegExpReplace,210,211,1
-block_hint,RegExpReplace,171,172,1
-block_hint,RegExpReplace,254,255,0
+block_hint,RegExpReplace,211,212,1
+block_hint,RegExpReplace,213,214,1
+block_hint,RegExpReplace,172,173,1
+block_hint,RegExpReplace,179,180,0
+block_hint,RegExpReplace,257,258,0
 block_hint,RegExpReplace,50,51,1
-block_hint,RegExpReplace,226,227,0
-block_hint,RegExpReplace,162,163,0
-block_hint,RegExpReplace,180,181,0
-block_hint,RegExpReplace,108,109,1
-block_hint,RegExpReplace,372,373,0
-block_hint,RegExpReplace,356,357,1
-block_hint,RegExpReplace,290,291,1
-block_hint,RegExpReplace,200,201,1
-block_hint,RegExpReplace,182,183,0
-block_hint,RegExpReplace,80,81,0
+block_hint,RegExpReplace,229,230,0
+block_hint,RegExpReplace,163,164,0
+block_hint,RegExpReplace,183,184,0
+block_hint,RegExpReplace,109,110,1
+block_hint,RegExpReplace,375,376,0
+block_hint,RegExpReplace,359,360,1
+block_hint,RegExpReplace,293,294,1
+block_hint,RegExpReplace,203,204,1
+block_hint,RegExpReplace,185,186,0
+block_hint,RegExpReplace,81,82,0
 block_hint,RegExpReplace,56,57,1
 block_hint,RegExpReplace,58,59,1
 block_hint,RegExpReplace,60,61,1
-block_hint,RegExpReplace,166,167,0
+block_hint,RegExpReplace,167,168,0
 block_hint,RegExpReplace,62,63,1
-block_hint,RegExpReplace,230,231,1
-block_hint,RegExpReplace,168,169,0
+block_hint,RegExpReplace,233,234,1
+block_hint,RegExpReplace,169,170,0
 block_hint,RegExpReplace,64,65,1
-block_hint,RegExpReplace,377,378,1
-block_hint,RegExpReplace,368,369,1
-block_hint,RegExpReplace,323,324,0
-block_hint,RegExpReplace,282,283,0
-block_hint,RegExpReplace,215,216,0
-block_hint,RegExpReplace,99,100,1
+block_hint,RegExpReplace,380,381,1
+block_hint,RegExpReplace,371,372,1
+block_hint,RegExpReplace,326,327,0
+block_hint,RegExpReplace,285,286,0
+block_hint,RegExpReplace,218,219,0
+block_hint,RegExpReplace,100,101,1
 block_hint,RegExpReplace,26,27,1
 block_hint,RegExpReplace,28,29,1
-block_hint,RegExpReplace,101,102,1
+block_hint,RegExpReplace,102,103,1
 block_hint,RegExpReplace,30,31,0
 block_hint,RegExpReplace,32,33,1
 block_hint,RegExpReplace,34,35,1
 block_hint,RegExpReplace,72,73,1
 block_hint,RegExpReplace,44,45,1
-block_hint,RegExpReplace,160,161,1
+block_hint,RegExpReplace,161,162,1
 block_hint,RegExpReplace,46,47,1
 block_hint,RegExpReplace,48,49,1
-block_hint,RegExpReplace,233,234,1
-block_hint,RegExpReplace,175,176,1
-block_hint,RegExpReplace,152,153,1
+block_hint,RegExpReplace,236,237,1
+block_hint,RegExpReplace,176,177,1
+block_hint,RegExpReplace,153,154,1
 block_hint,RegExpReplace,36,37,1
-block_hint,RegExpReplace,154,155,1
+block_hint,RegExpReplace,155,156,1
 block_hint,RegExpReplace,40,41,0
-block_hint,RegExpReplace,251,252,1
-block_hint,RegExpReplace,193,194,1
+block_hint,RegExpReplace,254,255,1
+block_hint,RegExpReplace,196,197,1
 block_hint,RegExpReplace,42,43,1
 block_hint,RegExpSearchFast,50,51,1
 block_hint,RegExpSearchFast,6,7,1
@@ -4529,106 +4630,120 @@ block_hint,SymbolPrototypeToString,9,10,1
 block_hint,SymbolPrototypeToString,11,12,1
 block_hint,SymbolPrototypeToString,5,6,0
 block_hint,SymbolPrototypeToString,7,8,1
-block_hint,CreateTypedArray,567,568,0
-block_hint,CreateTypedArray,593,594,0
-block_hint,CreateTypedArray,540,541,0
-block_hint,CreateTypedArray,451,452,0
-block_hint,CreateTypedArray,331,332,1
-block_hint,CreateTypedArray,333,334,1
-block_hint,CreateTypedArray,635,636,0
-block_hint,CreateTypedArray,487,488,1
-block_hint,CreateTypedArray,485,486,1
-block_hint,CreateTypedArray,382,383,1
-block_hint,CreateTypedArray,546,547,0
-block_hint,CreateTypedArray,616,617,0
-block_hint,CreateTypedArray,544,545,0
-block_hint,CreateTypedArray,455,456,0
-block_hint,CreateTypedArray,393,394,0
-block_hint,CreateTypedArray,395,396,0
-block_hint,CreateTypedArray,385,386,0
-block_hint,CreateTypedArray,104,105,1
-block_hint,CreateTypedArray,106,107,1
-block_hint,CreateTypedArray,645,646,1
-block_hint,CreateTypedArray,596,597,0
-block_hint,CreateTypedArray,643,644,1
-block_hint,CreateTypedArray,613,614,1
-block_hint,CreateTypedArray,489,490,0
-block_hint,CreateTypedArray,523,524,1
-block_hint,CreateTypedArray,361,362,0
-block_hint,CreateTypedArray,236,237,0
-block_hint,CreateTypedArray,299,300,0
-block_hint,CreateTypedArray,279,280,1
-block_hint,CreateTypedArray,281,282,1
+block_hint,CreateTypedArray,610,611,0
+block_hint,CreateTypedArray,638,639,0
+block_hint,CreateTypedArray,576,577,0
+block_hint,CreateTypedArray,485,486,0
+block_hint,CreateTypedArray,356,357,1
+block_hint,CreateTypedArray,358,359,1
+block_hint,CreateTypedArray,677,678,0
+block_hint,CreateTypedArray,520,521,1
+block_hint,CreateTypedArray,518,519,1
+block_hint,CreateTypedArray,407,408,1
+block_hint,CreateTypedArray,586,587,0
+block_hint,CreateTypedArray,662,663,0
+block_hint,CreateTypedArray,584,585,0
 block_hint,CreateTypedArray,491,492,0
-block_hint,CreateTypedArray,525,526,1
-block_hint,CreateTypedArray,363,364,0
-block_hint,CreateTypedArray,252,253,0
-block_hint,CreateTypedArray,301,302,0
-block_hint,CreateTypedArray,479,480,0
-block_hint,CreateTypedArray,481,482,0
-block_hint,CreateTypedArray,629,630,0
-block_hint,CreateTypedArray,496,497,1
-block_hint,CreateTypedArray,494,495,1
-block_hint,CreateTypedArray,397,398,1
-block_hint,CreateTypedArray,504,505,0
-block_hint,CreateTypedArray,498,499,0
-block_hint,CreateTypedArray,400,401,0
-block_hint,CreateTypedArray,152,153,1
-block_hint,CreateTypedArray,340,341,0
-block_hint,CreateTypedArray,154,155,1
-block_hint,CreateTypedArray,650,651,1
-block_hint,CreateTypedArray,603,604,0
-block_hint,CreateTypedArray,648,649,1
-block_hint,CreateTypedArray,619,620,1
-block_hint,CreateTypedArray,500,501,0
-block_hint,CreateTypedArray,519,520,1
-block_hint,CreateTypedArray,357,358,0
-block_hint,CreateTypedArray,204,205,0
-block_hint,CreateTypedArray,622,623,0
-block_hint,CreateTypedArray,166,167,1
-block_hint,CreateTypedArray,289,290,1
-block_hint,CreateTypedArray,291,292,1
-block_hint,CreateTypedArray,502,503,0
-block_hint,CreateTypedArray,521,522,1
-block_hint,CreateTypedArray,359,360,0
-block_hint,CreateTypedArray,220,221,0
-block_hint,CreateTypedArray,624,625,0
-block_hint,CreateTypedArray,511,512,0
-block_hint,CreateTypedArray,506,507,0
-block_hint,CreateTypedArray,462,463,0
-block_hint,CreateTypedArray,346,347,0
-block_hint,CreateTypedArray,416,417,1
-block_hint,CreateTypedArray,350,351,1
-block_hint,CreateTypedArray,465,466,0
-block_hint,CreateTypedArray,348,349,1
-block_hint,CreateTypedArray,418,419,0
-block_hint,CreateTypedArray,654,655,0
-block_hint,CreateTypedArray,605,606,0
+block_hint,CreateTypedArray,424,425,0
+block_hint,CreateTypedArray,426,427,0
+block_hint,CreateTypedArray,410,411,0
+block_hint,CreateTypedArray,105,106,1
+block_hint,CreateTypedArray,107,108,1
+block_hint,CreateTypedArray,412,413,1
+block_hint,CreateTypedArray,109,110,1
+block_hint,CreateTypedArray,111,112,1
+block_hint,CreateTypedArray,641,642,0
+block_hint,CreateTypedArray,683,684,1
+block_hint,CreateTypedArray,660,661,1
+block_hint,CreateTypedArray,522,523,0
+block_hint,CreateTypedArray,558,559,1
+block_hint,CreateTypedArray,384,385,0
+block_hint,CreateTypedArray,261,262,0
+block_hint,CreateTypedArray,416,417,0
+block_hint,CreateTypedArray,123,124,1
+block_hint,CreateTypedArray,125,126,1
+block_hint,CreateTypedArray,305,306,1
+block_hint,CreateTypedArray,307,308,1
+block_hint,CreateTypedArray,525,526,0
+block_hint,CreateTypedArray,560,561,1
+block_hint,CreateTypedArray,386,387,0
+block_hint,CreateTypedArray,277,278,0
+block_hint,CreateTypedArray,420,421,0
+block_hint,CreateTypedArray,137,138,1
+block_hint,CreateTypedArray,139,140,1
+block_hint,CreateTypedArray,512,513,0
+block_hint,CreateTypedArray,514,515,0
+block_hint,CreateTypedArray,671,672,0
+block_hint,CreateTypedArray,531,532,1
 block_hint,CreateTypedArray,529,530,1
-block_hint,CreateTypedArray,527,528,1
-block_hint,CreateTypedArray,431,432,1
-block_hint,CreateTypedArray,609,610,0
-block_hint,CreateTypedArray,537,538,0
-block_hint,CreateTypedArray,445,446,0
-block_hint,CreateTypedArray,314,315,1
-block_hint,CreateTypedArray,607,608,0
+block_hint,CreateTypedArray,428,429,1
+block_hint,CreateTypedArray,541,542,0
+block_hint,CreateTypedArray,533,534,0
+block_hint,CreateTypedArray,431,432,0
+block_hint,CreateTypedArray,165,166,1
+block_hint,CreateTypedArray,365,366,0
+block_hint,CreateTypedArray,167,168,1
+block_hint,CreateTypedArray,433,434,1
+block_hint,CreateTypedArray,169,170,1
+block_hint,CreateTypedArray,171,172,1
+block_hint,CreateTypedArray,648,649,0
+block_hint,CreateTypedArray,686,687,1
+block_hint,CreateTypedArray,665,666,1
 block_hint,CreateTypedArray,535,536,0
+block_hint,CreateTypedArray,554,555,1
+block_hint,CreateTypedArray,380,381,0
+block_hint,CreateTypedArray,229,230,0
+block_hint,CreateTypedArray,437,438,0
+block_hint,CreateTypedArray,183,184,1
+block_hint,CreateTypedArray,185,186,1
+block_hint,CreateTypedArray,187,188,1
+block_hint,CreateTypedArray,318,319,1
+block_hint,CreateTypedArray,320,321,1
+block_hint,CreateTypedArray,538,539,0
+block_hint,CreateTypedArray,556,557,1
+block_hint,CreateTypedArray,382,383,0
+block_hint,CreateTypedArray,245,246,0
 block_hint,CreateTypedArray,441,442,0
-block_hint,CreateTypedArray,265,266,0
-block_hint,CreateTypedArray,588,589,0
-block_hint,CreateTypedArray,321,322,0
-block_hint,CreateTypedArray,323,324,0
+block_hint,CreateTypedArray,199,200,1
+block_hint,CreateTypedArray,201,202,1
+block_hint,CreateTypedArray,548,549,0
+block_hint,CreateTypedArray,543,544,0
+block_hint,CreateTypedArray,500,501,0
 block_hint,CreateTypedArray,371,372,0
-block_hint,CreateTypedArray,373,374,0
-block_hint,CreateTypedArray,316,317,1
-block_hint,CreateTypedArray,326,327,0
-block_hint,CreateTypedArray,319,320,0
-block_hint,CreateTypedArray,473,474,0
-block_hint,CreateTypedArray,517,518,1
-block_hint,CreateTypedArray,355,356,0
-block_hint,CreateTypedArray,188,189,0
-block_hint,CreateTypedArray,449,450,0
-block_hint,CreateTypedArray,273,274,0
+block_hint,CreateTypedArray,453,454,1
+block_hint,CreateTypedArray,375,376,1
+block_hint,CreateTypedArray,503,504,0
+block_hint,CreateTypedArray,373,374,1
+block_hint,CreateTypedArray,455,456,0
+block_hint,CreateTypedArray,688,689,0
+block_hint,CreateTypedArray,650,651,0
+block_hint,CreateTypedArray,564,565,1
+block_hint,CreateTypedArray,562,563,1
+block_hint,CreateTypedArray,466,467,1
+block_hint,CreateTypedArray,656,657,0
+block_hint,CreateTypedArray,574,575,0
+block_hint,CreateTypedArray,481,482,0
+block_hint,CreateTypedArray,340,341,1
+block_hint,CreateTypedArray,654,655,0
+block_hint,CreateTypedArray,572,573,0
+block_hint,CreateTypedArray,477,478,0
+block_hint,CreateTypedArray,290,291,0
+block_hint,CreateTypedArray,634,635,0
+block_hint,CreateTypedArray,347,348,0
+block_hint,CreateTypedArray,349,350,0
+block_hint,CreateTypedArray,396,397,0
+block_hint,CreateTypedArray,398,399,0
+block_hint,CreateTypedArray,342,343,1
+block_hint,CreateTypedArray,352,353,0
+block_hint,CreateTypedArray,345,346,0
+block_hint,CreateTypedArray,507,508,0
+block_hint,CreateTypedArray,552,553,1
+block_hint,CreateTypedArray,378,379,0
+block_hint,CreateTypedArray,213,214,0
+block_hint,CreateTypedArray,567,568,0
+block_hint,CreateTypedArray,391,392,0
+block_hint,CreateTypedArray,60,61,1
+block_hint,CreateTypedArray,62,63,1
 block_hint,TypedArrayFrom,156,157,1
 block_hint,TypedArrayFrom,140,141,0
 block_hint,TypedArrayFrom,124,125,1
@@ -4866,6 +4981,11 @@ block_hint,MergeAt,182,183,1
 block_hint,MergeAt,85,86,1
 block_hint,MergeAt,87,88,1
 block_hint,MergeAt,89,90,1
+block_hint,MergeAt,147,148,0
+block_hint,MergeAt,91,92,1
+block_hint,MergeAt,93,94,1
+block_hint,MergeAt,95,96,1
+block_hint,MergeAt,107,108,1
 block_hint,MergeAt,194,195,1
 block_hint,MergeAt,97,98,1
 block_hint,MergeAt,99,100,1
@@ -5060,82 +5180,82 @@ block_hint,TestTypeOfHandler,23,24,0
 block_hint,TestTypeOfHandler,31,32,1
 block_hint,TestTypeOfHandler,50,51,0
 block_hint,TestTypeOfHandler,35,36,0
-block_hint,LdaGlobalHandler,8,9,1
-block_hint,LdaGlobalHandler,10,11,1
-block_hint,LdaGlobalHandler,12,13,1
-block_hint,LdaGlobalHandler,14,15,1
-block_hint,LdaGlobalHandler,180,181,0
-block_hint,LdaGlobalHandler,104,105,0
-block_hint,LdaGlobalHandler,108,109,1
+block_hint,LdaGlobalHandler,7,8,1
+block_hint,LdaGlobalHandler,9,10,1
+block_hint,LdaGlobalHandler,11,12,1
+block_hint,LdaGlobalHandler,13,14,1
+block_hint,LdaGlobalHandler,183,184,0
+block_hint,LdaGlobalHandler,105,106,0
+block_hint,LdaGlobalHandler,109,110,1
 block_hint,StaContextSlotHandler,5,6,1
 block_hint,StaCurrentContextSlotHandler,2,3,1
-block_hint,LdaLookupGlobalSlotHandler,14,15,1
-block_hint,LdaLookupGlobalSlotHandler,124,125,0
-block_hint,LdaLookupGlobalSlotHandler,16,17,1
-block_hint,GetNamedPropertyHandler,362,363,1
-block_hint,GetNamedPropertyHandler,210,211,0
-block_hint,GetNamedPropertyHandler,75,76,0
-block_hint,GetNamedPropertyHandler,37,38,1
-block_hint,GetNamedPropertyHandler,303,304,0
-block_hint,GetNamedPropertyHandler,329,330,0
-block_hint,GetNamedPropertyHandler,212,213,1
-block_hint,GetNamedPropertyHandler,112,113,0
-block_hint,GetNamedPropertyHandler,214,215,0
-block_hint,GetNamedPropertyHandler,286,287,1
-block_hint,GetNamedPropertyHandler,39,40,0
-block_hint,GetNamedPropertyHandler,92,93,1
-block_hint,GetNamedPropertyHandler,337,338,0
-block_hint,GetNamedPropertyHandler,236,237,0
-block_hint,GetNamedPropertyHandler,148,149,0
-block_hint,GetNamedPropertyHandler,59,60,1
-block_hint,GetNamedPropertyHandler,85,86,0
-block_hint,GetNamedPropertyHandler,27,28,1
-block_hint,GetNamedPropertyHandler,138,139,0
-block_hint,GetNamedPropertyHandler,63,64,0
-block_hint,GetNamedPropertyHandler,293,294,1
-block_hint,GetNamedPropertyHandler,96,97,0
-block_hint,GetNamedPropertyHandler,242,243,1
+block_hint,LdaLookupGlobalSlotHandler,13,14,1
+block_hint,LdaLookupGlobalSlotHandler,125,126,0
+block_hint,LdaLookupGlobalSlotHandler,15,16,1
+block_hint,GetNamedPropertyHandler,372,373,1
+block_hint,GetNamedPropertyHandler,216,217,0
+block_hint,GetNamedPropertyHandler,77,78,0
+block_hint,GetNamedPropertyHandler,35,36,1
+block_hint,GetNamedPropertyHandler,313,314,0
+block_hint,GetNamedPropertyHandler,339,340,0
+block_hint,GetNamedPropertyHandler,218,219,1
+block_hint,GetNamedPropertyHandler,290,291,0
+block_hint,GetNamedPropertyHandler,220,221,0
+block_hint,GetNamedPropertyHandler,294,295,1
+block_hint,GetNamedPropertyHandler,98,99,1
+block_hint,GetNamedPropertyHandler,347,348,0
+block_hint,GetNamedPropertyHandler,242,243,0
+block_hint,GetNamedPropertyHandler,154,155,0
+block_hint,GetNamedPropertyHandler,120,121,1
+block_hint,GetNamedPropertyHandler,49,50,0
+block_hint,GetNamedPropertyHandler,87,88,0
+block_hint,GetNamedPropertyHandler,25,26,1
+block_hint,GetNamedPropertyHandler,144,145,0
+block_hint,GetNamedPropertyHandler,65,66,0
+block_hint,GetNamedPropertyHandler,303,304,1
+block_hint,GetNamedPropertyHandler,102,103,0
+block_hint,GetNamedPropertyHandler,248,249,1
+block_hint,GetNamedPropertyHandler,250,251,1
 block_hint,GetNamedPropertyHandler,244,245,1
-block_hint,GetNamedPropertyHandler,238,239,1
-block_hint,GetNamedPropertyHandler,240,241,1
-block_hint,GetNamedPropertyHandler,158,159,1
-block_hint,AddHandler,53,54,0
-block_hint,AddHandler,37,38,0
-block_hint,AddHandler,28,29,1
-block_hint,AddHandler,80,81,0
-block_hint,AddHandler,60,61,1
-block_hint,AddHandler,40,41,1
-block_hint,AddHandler,74,75,1
-block_hint,AddHandler,43,44,1
-block_hint,AddHandler,56,57,1
-block_hint,AddHandler,22,23,1
-block_hint,SubHandler,35,36,0
-block_hint,SubHandler,23,24,1
-block_hint,SubHandler,64,65,1
-block_hint,SubHandler,75,76,1
-block_hint,SubHandler,66,67,1
-block_hint,SubHandler,45,46,1
-block_hint,SubHandler,19,20,1
-block_hint,MulHandler,69,70,1
-block_hint,MulHandler,65,66,1
-block_hint,MulHandler,17,18,1
-block_hint,MulHandler,75,76,1
+block_hint,GetNamedPropertyHandler,246,247,1
+block_hint,GetNamedPropertyHandler,164,165,1
+block_hint,AddHandler,72,73,0
+block_hint,AddHandler,45,46,0
+block_hint,AddHandler,32,33,1
+block_hint,AddHandler,118,119,0
+block_hint,AddHandler,81,82,1
+block_hint,AddHandler,48,49,1
+block_hint,AddHandler,103,104,1
+block_hint,AddHandler,52,53,1
+block_hint,AddHandler,75,76,1
+block_hint,AddHandler,24,25,1
+block_hint,SubHandler,42,43,0
+block_hint,SubHandler,27,28,1
+block_hint,SubHandler,78,79,1
+block_hint,SubHandler,98,99,1
+block_hint,SubHandler,80,81,1
+block_hint,SubHandler,56,57,1
+block_hint,SubHandler,21,22,1
+block_hint,MulHandler,106,107,1
+block_hint,MulHandler,98,99,1
+block_hint,MulHandler,30,31,1
+block_hint,MulHandler,112,113,1
+block_hint,MulHandler,91,92,1
 block_hint,MulHandler,59,60,1
-block_hint,MulHandler,39,40,1
-block_hint,MulHandler,12,13,1
-block_hint,DivHandler,65,66,0
-block_hint,DivHandler,54,55,0
-block_hint,DivHandler,37,38,1
-block_hint,DivHandler,15,16,1
-block_hint,DivHandler,73,74,1
-block_hint,DivHandler,60,61,1
-block_hint,DivHandler,40,41,1
-block_hint,DivHandler,10,11,1
-block_hint,ModHandler,74,75,0
-block_hint,ModHandler,70,71,0
-block_hint,ModHandler,56,57,1
-block_hint,ModHandler,51,52,1
-block_hint,ModHandler,28,29,0
+block_hint,MulHandler,23,24,1
+block_hint,DivHandler,85,86,0
+block_hint,DivHandler,66,67,0
+block_hint,DivHandler,43,44,1
+block_hint,DivHandler,23,24,1
+block_hint,DivHandler,95,96,1
+block_hint,DivHandler,72,73,1
+block_hint,DivHandler,46,47,1
+block_hint,DivHandler,17,18,1
+block_hint,ModHandler,89,90,0
+block_hint,ModHandler,85,86,0
+block_hint,ModHandler,68,69,1
+block_hint,ModHandler,63,64,1
+block_hint,ModHandler,29,30,0
 block_hint,ModHandler,15,16,1
 block_hint,BitwiseOrHandler,42,43,0
 block_hint,BitwiseOrHandler,30,31,1
@@ -5421,37 +5541,37 @@ block_hint,LdaImmutableContextSlotWideHandler,3,4,1
 block_hint,LdaImmutableContextSlotWideHandler,9,10,0
 block_hint,LdaImmutableContextSlotWideHandler,5,6,1
 block_hint,LdaImmutableCurrentContextSlotWideHandler,2,3,1
-block_hint,LdaGlobalWideHandler,257,258,0
-block_hint,LdaGlobalWideHandler,108,109,1
+block_hint,LdaGlobalWideHandler,262,263,0
+block_hint,LdaGlobalWideHandler,110,111,1
 block_hint,StaGlobalWideHandler,3,4,0
 block_hint,StaCurrentContextSlotWideHandler,2,3,1
-block_hint,GetNamedPropertyWideHandler,323,324,0
-block_hint,GetNamedPropertyWideHandler,138,139,1
+block_hint,GetNamedPropertyWideHandler,331,332,0
+block_hint,GetNamedPropertyWideHandler,140,141,1
 block_hint,GetKeyedPropertyWideHandler,3,4,0
 block_hint,SetNamedPropertyWideHandler,3,4,0
 block_hint,DefineNamedOwnPropertyWideHandler,3,4,0
 block_hint,SetKeyedPropertyWideHandler,3,4,0
 block_hint,DefineKeyedOwnPropertyWideHandler,3,4,0
 block_hint,StaInArrayLiteralWideHandler,3,4,0
-block_hint,AddWideHandler,82,83,0
-block_hint,AddWideHandler,49,50,0
-block_hint,AddWideHandler,35,36,0
-block_hint,AddWideHandler,78,79,0
-block_hint,AddWideHandler,64,65,1
-block_hint,AddWideHandler,45,46,1
-block_hint,AddWideHandler,27,28,1
-block_hint,AddWideHandler,43,44,1
-block_hint,AddWideHandler,16,17,1
-block_hint,SubWideHandler,75,76,0
-block_hint,SubWideHandler,53,54,0
-block_hint,SubWideHandler,33,34,0
-block_hint,SubWideHandler,13,14,1
-block_hint,MulWideHandler,80,81,0
-block_hint,MulWideHandler,73,74,1
-block_hint,MulWideHandler,59,60,1
-block_hint,MulWideHandler,57,58,1
-block_hint,MulWideHandler,30,31,1
-block_hint,MulWideHandler,10,11,1
+block_hint,AddWideHandler,120,121,0
+block_hint,AddWideHandler,60,61,0
+block_hint,AddWideHandler,42,43,0
+block_hint,AddWideHandler,107,108,0
+block_hint,AddWideHandler,76,77,1
+block_hint,AddWideHandler,53,54,1
+block_hint,AddWideHandler,31,32,1
+block_hint,AddWideHandler,51,52,1
+block_hint,AddWideHandler,18,19,1
+block_hint,SubWideHandler,108,109,0
+block_hint,SubWideHandler,65,66,0
+block_hint,SubWideHandler,40,41,0
+block_hint,SubWideHandler,15,16,1
+block_hint,MulWideHandler,128,129,0
+block_hint,MulWideHandler,106,107,1
+block_hint,MulWideHandler,83,84,1
+block_hint,MulWideHandler,81,82,1
+block_hint,MulWideHandler,43,44,1
+block_hint,MulWideHandler,19,20,1
 block_hint,BitwiseOrWideHandler,28,29,0
 block_hint,BitwiseOrWideHandler,20,21,1
 block_hint,AddSmiWideHandler,25,26,0
@@ -5544,8 +5664,8 @@ block_hint,ForInNextWideHandler,11,12,0
 block_hint,ForInNextWideHandler,2,3,1
 block_hint,ForInNextWideHandler,4,5,0
 block_hint,ForInNextWideHandler,9,10,1
-block_hint,LdaGlobalExtraWideHandler,257,258,0
-block_hint,LdaGlobalExtraWideHandler,108,109,1
+block_hint,LdaGlobalExtraWideHandler,262,263,0
+block_hint,LdaGlobalExtraWideHandler,110,111,1
 block_hint,AddSmiExtraWideHandler,33,34,1
 block_hint,AddSmiExtraWideHandler,23,24,0
 block_hint,AddSmiExtraWideHandler,28,29,1
@@ -5563,720 +5683,720 @@ block_hint,BitwiseAndSmiExtraWideHandler,29,30,0
 block_hint,BitwiseAndSmiExtraWideHandler,18,19,1
 block_hint,CallUndefinedReceiver1ExtraWideHandler,68,69,0
 block_hint,CallUndefinedReceiver1ExtraWideHandler,19,20,0
-builtin_hash,RecordWriteSaveFP,925153714
-builtin_hash,RecordWriteIgnoreFP,925153714
-builtin_hash,EphemeronKeyBarrierSaveFP,576191782
-builtin_hash,AdaptorWithBuiltinExitFrame,354449226
-builtin_hash,Call_ReceiverIsNullOrUndefined_Baseline_Compact,184201450
-builtin_hash,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,-622040840
-builtin_hash,Call_ReceiverIsAny_Baseline_Compact,-622040840
-builtin_hash,CallProxy,431038095
-builtin_hash,CallWithSpread,114885228
-builtin_hash,CallWithSpread_Baseline,-764009345
-builtin_hash,CallWithArrayLike,-906554997
-builtin_hash,ConstructWithSpread,-608478575
-builtin_hash,ConstructWithSpread_Baseline,633800479
-builtin_hash,Construct_Baseline,-357225391
-builtin_hash,FastNewObject,-181970843
-builtin_hash,FastNewClosure,-175349459
-builtin_hash,StringEqual,706401832
-builtin_hash,StringGreaterThan,-613733034
-builtin_hash,StringGreaterThanOrEqual,-355204059
-builtin_hash,StringLessThan,-355204059
-builtin_hash,StringLessThanOrEqual,-613733034
-builtin_hash,StringSubstring,293726114
-builtin_hash,OrderedHashTableHealIndex,320211480
-builtin_hash,CompileLazy,-48838662
-builtin_hash,CompileLazyDeoptimizedCode,1029930506
-builtin_hash,InstantiateAsmJs,-487292373
-builtin_hash,AllocateInYoungGeneration,669322182
-builtin_hash,AllocateRegularInYoungGeneration,-197165802
-builtin_hash,AllocateRegularInOldGeneration,-197165802
-builtin_hash,CopyFastSmiOrObjectElements,-974669866
-builtin_hash,GrowFastDoubleElements,633375032
-builtin_hash,GrowFastSmiOrObjectElements,55014026
-builtin_hash,ToNumber,1056900683
-builtin_hash,ToNumber_Baseline,-255970856
-builtin_hash,ToNumeric_Baseline,-150297448
-builtin_hash,ToNumberConvertBigInt,-115864776
-builtin_hash,Typeof,455002258
-builtin_hash,KeyedLoadIC_PolymorphicName,-147363616
-builtin_hash,KeyedStoreIC_Megamorphic,-766812467
-builtin_hash,DefineKeyedOwnIC_Megamorphic,-98359717
-builtin_hash,LoadGlobalIC_NoFeedback,-751542491
-builtin_hash,LoadIC_FunctionPrototype,-456945758
-builtin_hash,LoadIC_StringLength,708277321
-builtin_hash,LoadIC_StringWrapperLength,813299235
-builtin_hash,LoadIC_NoFeedback,203476084
-builtin_hash,StoreIC_NoFeedback,-1067800910
-builtin_hash,DefineNamedOwnIC_NoFeedback,-679825540
-builtin_hash,KeyedLoadIC_SloppyArguments,-451779601
-builtin_hash,StoreFastElementIC_Standard,-723267640
-builtin_hash,StoreFastElementIC_GrowNoTransitionHandleCOW,-981655461
-builtin_hash,StoreFastElementIC_NoTransitionHandleCOW,516590767
-builtin_hash,ElementsTransitionAndStore_Standard,-764902427
-builtin_hash,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,403149715
-builtin_hash,ElementsTransitionAndStore_NoTransitionHandleCOW,995918993
-builtin_hash,KeyedHasIC_PolymorphicName,-165442496
-builtin_hash,EnqueueMicrotask,7595399
-builtin_hash,RunMicrotasks,-338691087
-builtin_hash,HasProperty,508450008
-builtin_hash,DeleteProperty,-838129578
-builtin_hash,SetDataProperties,-464632524
-builtin_hash,ReturnReceiver,312434521
-builtin_hash,ArrayConstructor,-319898279
-builtin_hash,ArrayConstructorImpl,412703549
-builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DontOverride,850144068
-builtin_hash,ArrayNoArgumentConstructor_HoleySmi_DontOverride,850144068
-builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DisableAllocationSites,1070673895
-builtin_hash,ArrayNoArgumentConstructor_Packed_DisableAllocationSites,1070673895
-builtin_hash,ArrayNoArgumentConstructor_Holey_DisableAllocationSites,1070673895
-builtin_hash,ArrayNoArgumentConstructor_PackedDouble_DisableAllocationSites,-336123958
-builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DontOverride,227053212
-builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,873893
-builtin_hash,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,873893
-builtin_hash,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,-847176062
-builtin_hash,ArrayIncludesSmi,536907331
-builtin_hash,ArrayIncludesSmiOrObject,1001204729
-builtin_hash,ArrayIncludes,561561276
-builtin_hash,ArrayIndexOfSmi,-663968987
-builtin_hash,ArrayIndexOfSmiOrObject,-876114200
-builtin_hash,ArrayIndexOf,-253950356
-builtin_hash,ArrayPrototypePop,-292344596
-builtin_hash,ArrayPrototypePush,-675294835
-builtin_hash,CloneFastJSArray,-172971657
-builtin_hash,CloneFastJSArrayFillingHoles,-284975194
-builtin_hash,ExtractFastJSArray,-471066963
-builtin_hash,ArrayPrototypeEntries,829416546
-builtin_hash,ArrayPrototypeKeys,162456650
-builtin_hash,ArrayPrototypeValues,829416546
-builtin_hash,ArrayIteratorPrototypeNext,1046841582
-builtin_hash,AsyncFunctionEnter,608034084
-builtin_hash,AsyncFunctionResolve,-196767509
-builtin_hash,AsyncFunctionAwaitCaught,861277429
-builtin_hash,AsyncFunctionAwaitUncaught,861277429
-builtin_hash,AsyncFunctionAwaitResolveClosure,-342974575
-builtin_hash,DatePrototypeGetDate,799986656
-builtin_hash,DatePrototypeGetDay,799986656
-builtin_hash,DatePrototypeGetFullYear,799986656
-builtin_hash,DatePrototypeGetHours,799986656
-builtin_hash,DatePrototypeGetMilliseconds,-1015935702
-builtin_hash,DatePrototypeGetMinutes,799986656
-builtin_hash,DatePrototypeGetMonth,799986656
-builtin_hash,DatePrototypeGetSeconds,799986656
-builtin_hash,DatePrototypeGetTime,604056264
-builtin_hash,DatePrototypeGetTimezoneOffset,-1015935702
-builtin_hash,DatePrototypeValueOf,604056264
-builtin_hash,DatePrototypeToPrimitive,83647064
-builtin_hash,CreateIterResultObject,-837586211
-builtin_hash,CreateGeneratorObject,-731927520
-builtin_hash,GeneratorPrototypeNext,24056276
-builtin_hash,GeneratorPrototypeReturn,704697656
-builtin_hash,SuspendGeneratorBaseline,-772427084
-builtin_hash,ResumeGeneratorBaseline,-1024670400
-builtin_hash,GlobalIsFinite,98040433
-builtin_hash,GlobalIsNaN,-131926158
-builtin_hash,LoadIC,758731508
-builtin_hash,LoadIC_Megamorphic,485927514
-builtin_hash,LoadIC_Noninlined,-900550790
-builtin_hash,LoadICTrampoline,279586909
-builtin_hash,LoadICBaseline,378721791
-builtin_hash,LoadICTrampoline_Megamorphic,279586909
-builtin_hash,LoadSuperIC,-700275115
-builtin_hash,LoadSuperICBaseline,-779741774
-builtin_hash,KeyedLoadIC,-932282799
-builtin_hash,KeyedLoadIC_Megamorphic,-52322939
-builtin_hash,KeyedLoadICTrampoline,279586909
-builtin_hash,KeyedLoadICBaseline,378721791
-builtin_hash,KeyedLoadICTrampoline_Megamorphic,279586909
-builtin_hash,StoreGlobalIC,-593770272
-builtin_hash,StoreGlobalICTrampoline,279586909
-builtin_hash,StoreGlobalICBaseline,378721791
-builtin_hash,StoreIC,-725198793
-builtin_hash,StoreICTrampoline,853716338
-builtin_hash,StoreICBaseline,-779741774
-builtin_hash,DefineNamedOwnIC,407070464
-builtin_hash,DefineNamedOwnICBaseline,-779741774
-builtin_hash,KeyedStoreIC,-781537170
-builtin_hash,KeyedStoreICTrampoline,853716338
-builtin_hash,KeyedStoreICBaseline,-779741774
-builtin_hash,DefineKeyedOwnIC,-368740640
-builtin_hash,StoreInArrayLiteralIC,870478079
-builtin_hash,StoreInArrayLiteralICBaseline,-779741774
-builtin_hash,LoadGlobalIC,-629815841
-builtin_hash,LoadGlobalICInsideTypeof,-681620395
-builtin_hash,LoadGlobalICTrampoline,742678434
-builtin_hash,LoadGlobalICBaseline,-376594265
-builtin_hash,LoadGlobalICInsideTypeofTrampoline,742678434
-builtin_hash,LoadGlobalICInsideTypeofBaseline,-376594265
-builtin_hash,LookupGlobalICBaseline,318821975
-builtin_hash,LookupGlobalICInsideTypeofBaseline,318821975
-builtin_hash,KeyedHasIC,-1007842062
-builtin_hash,KeyedHasICBaseline,378721791
-builtin_hash,KeyedHasIC_Megamorphic,508450008
-builtin_hash,IterableToList,444610848
-builtin_hash,IterableToListWithSymbolLookup,-721120479
-builtin_hash,IterableToListMayPreserveHoles,907505763
-builtin_hash,FindOrderedHashMapEntry,-772719645
-builtin_hash,MapConstructor,328612162
-builtin_hash,MapPrototypeSet,-740571272
-builtin_hash,MapPrototypeDelete,815676314
-builtin_hash,MapPrototypeGet,-99464800
-builtin_hash,MapPrototypeHas,417921745
-builtin_hash,MapPrototypeEntries,-250935376
-builtin_hash,MapPrototypeGetSize,1035731846
-builtin_hash,MapPrototypeForEach,-11074084
-builtin_hash,MapPrototypeKeys,-250935376
-builtin_hash,MapPrototypeValues,-250935376
-builtin_hash,MapIteratorPrototypeNext,-513700577
-builtin_hash,MapIteratorToList,788737747
-builtin_hash,SameValueNumbersOnly,-715209
-builtin_hash,Add_Baseline,239982805
-builtin_hash,AddSmi_Baseline,890570719
-builtin_hash,Subtract_Baseline,984085983
-builtin_hash,SubtractSmi_Baseline,745275517
-builtin_hash,Multiply_Baseline,363197242
-builtin_hash,MultiplySmi_Baseline,-291668426
-builtin_hash,Divide_Baseline,41207474
-builtin_hash,DivideSmi_Baseline,-228110709
-builtin_hash,Modulus_Baseline,895869986
-builtin_hash,ModulusSmi_Baseline,1052037814
-builtin_hash,Exponentiate_Baseline,525497385
-builtin_hash,BitwiseAnd_Baseline,834157251
-builtin_hash,BitwiseAndSmi_Baseline,-224843182
-builtin_hash,BitwiseOr_Baseline,-1000862579
-builtin_hash,BitwiseOrSmi_Baseline,-175921720
-builtin_hash,BitwiseXor_Baseline,451693864
-builtin_hash,BitwiseXorSmi_Baseline,1072796926
-builtin_hash,ShiftLeft_Baseline,-1059182958
-builtin_hash,ShiftLeftSmi_Baseline,180208819
-builtin_hash,ShiftRight_Baseline,8908966
-builtin_hash,ShiftRightSmi_Baseline,-553470248
-builtin_hash,ShiftRightLogical_Baseline,-771447674
-builtin_hash,ShiftRightLogicalSmi_Baseline,524787408
-builtin_hash,Add_WithFeedback,-726025304
-builtin_hash,Subtract_WithFeedback,82634219
-builtin_hash,Modulus_WithFeedback,-14646246
-builtin_hash,BitwiseOr_WithFeedback,-345564281
-builtin_hash,Equal_Baseline,-851425691
-builtin_hash,StrictEqual_Baseline,609264081
-builtin_hash,LessThan_Baseline,-250082751
-builtin_hash,GreaterThan_Baseline,442646997
-builtin_hash,LessThanOrEqual_Baseline,278491596
-builtin_hash,GreaterThanOrEqual_Baseline,-526555932
-builtin_hash,Equal_WithFeedback,470211465
-builtin_hash,StrictEqual_WithFeedback,-720033793
-builtin_hash,LessThan_WithFeedback,555433500
-builtin_hash,GreaterThan_WithFeedback,-13794951
-builtin_hash,GreaterThanOrEqual_WithFeedback,38912741
-builtin_hash,BitwiseNot_Baseline,-63143721
-builtin_hash,Decrement_Baseline,-491402242
-builtin_hash,Increment_Baseline,379465907
-builtin_hash,Negate_Baseline,984080569
-builtin_hash,ObjectAssign,72200033
-builtin_hash,ObjectCreate,-611788064
-builtin_hash,ObjectEntries,-669410235
-builtin_hash,ObjectGetOwnPropertyDescriptor,671274362
-builtin_hash,ObjectGetOwnPropertyNames,12658690
-builtin_hash,ObjectIs,-340387257
-builtin_hash,ObjectKeys,-12925872
-builtin_hash,ObjectPrototypeHasOwnProperty,156674900
-builtin_hash,ObjectToString,-633754100
-builtin_hash,InstanceOf_WithFeedback,411449225
-builtin_hash,InstanceOf_Baseline,486598742
-builtin_hash,ForInEnumerate,-1069244956
-builtin_hash,ForInPrepare,362202805
-builtin_hash,ForInFilter,-306829682
-builtin_hash,RegExpConstructor,-10164395
-builtin_hash,RegExpExecAtom,-1073379799
-builtin_hash,RegExpExecInternal,891768236
-builtin_hash,FindOrderedHashSetEntry,705655709
-builtin_hash,SetConstructor,-575472839
-builtin_hash,SetPrototypeHas,417921745
-builtin_hash,SetPrototypeAdd,-541161428
-builtin_hash,SetPrototypeDelete,851985022
-builtin_hash,SetPrototypeEntries,-250935376
-builtin_hash,SetPrototypeGetSize,1035731846
-builtin_hash,SetPrototypeForEach,-130012968
-builtin_hash,SetPrototypeValues,-250935376
-builtin_hash,SetIteratorPrototypeNext,-958421279
-builtin_hash,SetOrSetIteratorToList,144945576
-builtin_hash,StringFromCharCode,-225080952
-builtin_hash,StringPrototypeReplace,-894056994
-builtin_hash,StringPrototypeSplit,52285085
-builtin_hash,TypedArrayConstructor,536725208
-builtin_hash,TypedArrayPrototypeByteLength,667117445
-builtin_hash,TypedArrayPrototypeLength,423335186
-builtin_hash,WeakMapConstructor,211573517
-builtin_hash,WeakMapLookupHashIndex,449726121
-builtin_hash,WeakMapGet,-388873308
-builtin_hash,WeakMapPrototypeHas,-407398312
-builtin_hash,WeakMapPrototypeSet,795326571
-builtin_hash,WeakSetConstructor,-100066523
-builtin_hash,WeakSetPrototypeHas,-407398312
-builtin_hash,WeakSetPrototypeAdd,-116381667
-builtin_hash,WeakCollectionSet,-319283680
-builtin_hash,AsyncGeneratorResolve,69898511
-builtin_hash,AsyncGeneratorYield,444077127
-builtin_hash,AsyncGeneratorResumeNext,-495744369
-builtin_hash,AsyncGeneratorPrototypeNext,95683089
-builtin_hash,AsyncGeneratorAwaitUncaught,-291001587
-builtin_hash,AsyncGeneratorAwaitResolveClosure,1023878839
-builtin_hash,AsyncGeneratorYieldResolveClosure,783335474
-builtin_hash,StringAdd_CheckNone,313254412
-builtin_hash,SubString,992908207
-builtin_hash,GetProperty,-151131763
-builtin_hash,GetPropertyWithReceiver,-145418645
-builtin_hash,SetProperty,877836229
-builtin_hash,CreateDataProperty,-606450676
-builtin_hash,ArrayPrototypeConcat,841497445
-builtin_hash,ArrayEvery,-992635840
-builtin_hash,ArrayFilterLoopLazyDeoptContinuation,923422735
-builtin_hash,ArrayFilterLoopContinuation,-871404088
-builtin_hash,ArrayFilter,135589144
-builtin_hash,ArrayPrototypeFind,-52246620
-builtin_hash,ArrayForEachLoopLazyDeoptContinuation,-87111692
-builtin_hash,ArrayForEachLoopContinuation,-432571379
-builtin_hash,ArrayForEach,1063323906
-builtin_hash,ArrayFrom,403114949
-builtin_hash,ArrayIsArray,421541474
-builtin_hash,LoadJoinElement_FastSmiOrObjectElements_0,-931014688
-builtin_hash,LoadJoinElement_FastDoubleElements_0,668207359
-builtin_hash,JoinStackPush,1045985488
-builtin_hash,JoinStackPop,294613228
-builtin_hash,ArrayPrototypeJoin,-591790002
-builtin_hash,ArrayPrototypeToString,254788114
-builtin_hash,ArrayPrototypeLastIndexOf,-623388518
-builtin_hash,ArrayMapLoopLazyDeoptContinuation,527144862
-builtin_hash,ArrayMapLoopContinuation,-248361443
-builtin_hash,ArrayMap,-977984343
-builtin_hash,ArrayReduceLoopLazyDeoptContinuation,641128240
-builtin_hash,ArrayReduceLoopContinuation,601284012
-builtin_hash,ArrayReduce,-918238503
-builtin_hash,ArrayPrototypeReverse,-50777013
-builtin_hash,ArrayPrototypeShift,763658583
-builtin_hash,ArrayPrototypeSlice,132491105
-builtin_hash,ArraySome,46741703
-builtin_hash,ArrayPrototypeSplice,532432423
-builtin_hash,ArrayPrototypeUnshift,285400235
-builtin_hash,ArrayBufferPrototypeGetByteLength,904301424
-builtin_hash,ArrayBufferIsView,-1007526052
-builtin_hash,ToInteger,488762220
-builtin_hash,FastCreateDataProperty,-709822671
-builtin_hash,BooleanConstructor,-990386327
-builtin_hash,BooleanPrototypeToString,-439668236
-builtin_hash,ToString,-945769269
-builtin_hash,StringPrototypeToString,-494656392
-builtin_hash,StringPrototypeValueOf,-494656392
-builtin_hash,StringPrototypeCharAt,-1053868658
-builtin_hash,StringPrototypeCharCodeAt,228833317
-builtin_hash,StringPrototypeCodePointAt,-570719484
-builtin_hash,StringPrototypeConcat,408689273
-builtin_hash,StringConstructor,259187035
-builtin_hash,StringAddConvertLeft,-940497411
-builtin_hash,StringAddConvertRight,262934773
-builtin_hash,StringCharAt,40686160
-builtin_hash,FastNewClosureBaseline,274645735
-builtin_hash,FastNewFunctionContextFunction,-198047187
-builtin_hash,CreateRegExpLiteral,-338674408
-builtin_hash,CreateShallowArrayLiteral,-564919299
-builtin_hash,CreateEmptyArrayLiteral,643763718
-builtin_hash,CreateShallowObjectLiteral,1034845855
-builtin_hash,ObjectConstructor,-400745906
-builtin_hash,CreateEmptyLiteralObject,-942901622
-builtin_hash,NumberConstructor,287129549
-builtin_hash,StringToNumber,831842981
-builtin_hash,NonNumberToNumber,-93280944
-builtin_hash,NonNumberToNumeric,773024939
-builtin_hash,ToNumeric,-142083210
-builtin_hash,NumberToString,882645046
-builtin_hash,ToBoolean,303836147
-builtin_hash,ToBooleanForBaselineJump,-629829779
-builtin_hash,ToLength,824030765
-builtin_hash,ToName,1027768228
-builtin_hash,ToObject,71126311
-builtin_hash,NonPrimitiveToPrimitive_Default,847969156
-builtin_hash,NonPrimitiveToPrimitive_Number,847969156
-builtin_hash,NonPrimitiveToPrimitive_String,847969156
-builtin_hash,OrdinaryToPrimitive_Number,424204202
-builtin_hash,OrdinaryToPrimitive_String,424204202
-builtin_hash,DataViewPrototypeGetByteLength,480775435
-builtin_hash,DataViewPrototypeGetFloat64,1003024607
-builtin_hash,DataViewPrototypeSetUint32,229410881
-builtin_hash,DataViewPrototypeSetFloat64,-938786777
-builtin_hash,FunctionPrototypeHasInstance,505391038
-builtin_hash,FastFunctionPrototypeBind,-508566393
-builtin_hash,ForInNext,-1021384217
-builtin_hash,GetIteratorWithFeedback,51240002
-builtin_hash,GetIteratorBaseline,-216059576
-builtin_hash,CallIteratorWithFeedback,581894736
-builtin_hash,MathAbs,-187735218
-builtin_hash,MathCeil,-338453010
-builtin_hash,MathFloor,506568824
-builtin_hash,MathRound,-849255534
-builtin_hash,MathPow,-187693750
-builtin_hash,MathMax,897170464
-builtin_hash,MathMin,213295587
-builtin_hash,MathAsin,788026272
-builtin_hash,MathAtan2,-181481861
-builtin_hash,MathCos,-681373097
-builtin_hash,MathExp,-410231589
-builtin_hash,MathFround,415902182
-builtin_hash,MathImul,-715703335
-builtin_hash,MathLog,941930077
-builtin_hash,MathSin,855471515
-builtin_hash,MathSign,539035638
-builtin_hash,MathSqrt,-650867412
-builtin_hash,MathTan,85134160
-builtin_hash,MathTanh,-321274619
-builtin_hash,MathRandom,827257341
-builtin_hash,NumberPrototypeToString,-583893270
-builtin_hash,NumberIsInteger,795757762
-builtin_hash,NumberIsNaN,-189048659
-builtin_hash,NumberParseFloat,-439771973
-builtin_hash,ParseInt,-192026072
-builtin_hash,NumberParseInt,82296249
-builtin_hash,Add,325215303
-builtin_hash,Subtract,52083078
-builtin_hash,Multiply,-317381366
-builtin_hash,Divide,750482944
-builtin_hash,Modulus,328987036
-builtin_hash,CreateObjectWithoutProperties,596134857
-builtin_hash,ObjectIsExtensible,-930811057
-builtin_hash,ObjectPreventExtensions,858037175
-builtin_hash,ObjectGetPrototypeOf,-202287704
-builtin_hash,ObjectSetPrototypeOf,-524999648
-builtin_hash,ObjectPrototypeToString,169720373
-builtin_hash,ObjectPrototypeValueOf,-28430309
-builtin_hash,FulfillPromise,21355213
-builtin_hash,NewPromiseCapability,-218729781
-builtin_hash,PromiseCapabilityDefaultResolve,336354486
-builtin_hash,PerformPromiseThen,278993520
-builtin_hash,PromiseAll,-190868023
-builtin_hash,PromiseAllResolveElementClosure,-452068448
-builtin_hash,PromiseConstructor,-93257640
-builtin_hash,PromisePrototypeCatch,-895785401
-builtin_hash,PromiseFulfillReactionJob,-249420439
-builtin_hash,PromiseResolveTrampoline,-927707015
-builtin_hash,PromiseResolve,557472834
-builtin_hash,ResolvePromise,-983952394
-builtin_hash,PromisePrototypeThen,866384223
-builtin_hash,PromiseResolveThenableJob,-536493053
-builtin_hash,ProxyConstructor,-754644599
-builtin_hash,ProxyGetProperty,213230890
-builtin_hash,ProxyIsExtensible,-484311481
-builtin_hash,ProxyPreventExtensions,297316441
-builtin_hash,ReflectGet,-1068630269
-builtin_hash,ReflectHas,-927707015
-builtin_hash,RegExpPrototypeExec,-1008377217
-builtin_hash,RegExpMatchFast,470663647
-builtin_hash,RegExpReplace,-181940551
-builtin_hash,RegExpPrototypeReplace,39784472
-builtin_hash,RegExpSearchFast,-745723781
-builtin_hash,RegExpPrototypeSourceGetter,-712979884
-builtin_hash,RegExpSplit,881747508
-builtin_hash,RegExpPrototypeTest,-1044390149
-builtin_hash,RegExpPrototypeTestFast,381723041
-builtin_hash,RegExpPrototypeGlobalGetter,-937075195
-builtin_hash,RegExpPrototypeIgnoreCaseGetter,-369470981
-builtin_hash,RegExpPrototypeMultilineGetter,-760493777
-builtin_hash,RegExpPrototypeHasIndicesGetter,260570818
-builtin_hash,RegExpPrototypeDotAllGetter,260570818
-builtin_hash,RegExpPrototypeStickyGetter,-823365333
-builtin_hash,RegExpPrototypeUnicodeGetter,-823365333
-builtin_hash,RegExpPrototypeFlagsGetter,-334954319
-builtin_hash,StringPrototypeEndsWith,-178713286
-builtin_hash,StringPrototypeIncludes,482244051
-builtin_hash,StringPrototypeIndexOf,-130883228
-builtin_hash,StringPrototypeIterator,287346997
-builtin_hash,StringIteratorPrototypeNext,-1032793009
-builtin_hash,StringPrototypeMatch,-984631220
-builtin_hash,StringPrototypeSearch,-984631220
-builtin_hash,StringRepeat,407848752
-builtin_hash,StringPrototypeSlice,538867513
-builtin_hash,StringPrototypeStartsWith,-490931141
-builtin_hash,StringPrototypeSubstr,-1042470347
-builtin_hash,StringPrototypeSubstring,283811647
-builtin_hash,StringPrototypeTrim,509891784
-builtin_hash,SymbolPrototypeToString,477000612
-builtin_hash,CreateTypedArray,255685378
-builtin_hash,TypedArrayFrom,-527855119
-builtin_hash,TypedArrayPrototypeSet,-1042496168
-builtin_hash,TypedArrayPrototypeSubArray,-873399896
-builtin_hash,NewSloppyArgumentsElements,840136606
-builtin_hash,NewStrictArgumentsElements,-701611224
-builtin_hash,NewRestArgumentsElements,450207936
-builtin_hash,FastNewSloppyArguments,427487705
-builtin_hash,FastNewStrictArguments,940012797
-builtin_hash,FastNewRestArguments,408066435
-builtin_hash,StringSlowFlatten,200237548
-builtin_hash,StringIndexOf,506557026
-builtin_hash,Load_FastSmiElements_0,653973042
-builtin_hash,Load_FastObjectElements_0,653973042
-builtin_hash,Store_FastSmiElements_0,418112357
-builtin_hash,Store_FastObjectElements_0,-800846888
-builtin_hash,SortCompareDefault,304655245
-builtin_hash,SortCompareUserFn,-618954695
-builtin_hash,Copy,144972358
-builtin_hash,MergeAt,425921460
-builtin_hash,GallopLeft,-851568101
-builtin_hash,GallopRight,-1027593577
-builtin_hash,ArrayTimSort,-833804402
-builtin_hash,ArrayPrototypeSort,-985590788
-builtin_hash,StringFastLocaleCompare,-984642925
-builtin_hash,WasmInt32ToHeapNumber,-560703743
-builtin_hash,WasmTaggedNonSmiToInt32,-977713892
-builtin_hash,WasmTriggerTierUp,248716051
-builtin_hash,WasmStackGuard,534090893
-builtin_hash,CanUseSameAccessor_FastSmiElements_0,302023388
-builtin_hash,CanUseSameAccessor_FastObjectElements_0,302023388
-builtin_hash,StringPrototypeToLowerCaseIntl,525980093
-builtin_hash,StringToLowerCaseIntl,-870512333
-builtin_hash,WideHandler,964339339
-builtin_hash,ExtraWideHandler,964339339
-builtin_hash,LdarHandler,-1051441899
-builtin_hash,LdaZeroHandler,-361600616
-builtin_hash,LdaSmiHandler,-168991530
-builtin_hash,LdaUndefinedHandler,-638450171
-builtin_hash,LdaNullHandler,-638450171
-builtin_hash,LdaTheHoleHandler,-638450171
-builtin_hash,LdaTrueHandler,-1021965256
-builtin_hash,LdaFalseHandler,-1021965256
-builtin_hash,LdaConstantHandler,356409883
-builtin_hash,LdaContextSlotHandler,943881063
-builtin_hash,LdaImmutableContextSlotHandler,943881063
-builtin_hash,LdaCurrentContextSlotHandler,-382503010
-builtin_hash,LdaImmutableCurrentContextSlotHandler,-382503010
-builtin_hash,StarHandler,87231384
-builtin_hash,MovHandler,83265050
-builtin_hash,PushContextHandler,-240552696
-builtin_hash,PopContextHandler,112490181
-builtin_hash,TestReferenceEqualHandler,-82232472
-builtin_hash,TestUndetectableHandler,-510593553
-builtin_hash,TestNullHandler,68435121
-builtin_hash,TestUndefinedHandler,68435121
-builtin_hash,TestTypeOfHandler,112039968
-builtin_hash,LdaGlobalHandler,-710429991
-builtin_hash,LdaGlobalInsideTypeofHandler,449865173
-builtin_hash,StaGlobalHandler,431419910
-builtin_hash,StaContextSlotHandler,-317790092
-builtin_hash,StaCurrentContextSlotHandler,-425140012
-builtin_hash,LdaLookupGlobalSlotHandler,-213340191
-builtin_hash,LdaLookupGlobalSlotInsideTypeofHandler,841482473
-builtin_hash,StaLookupSlotHandler,712075677
-builtin_hash,GetNamedPropertyHandler,-731343419
-builtin_hash,GetNamedPropertyFromSuperHandler,-238764505
-builtin_hash,GetKeyedPropertyHandler,533315167
-builtin_hash,SetNamedPropertyHandler,-228269698
-builtin_hash,DefineNamedOwnPropertyHandler,-228269698
-builtin_hash,SetKeyedPropertyHandler,-286024195
-builtin_hash,DefineKeyedOwnPropertyHandler,-286024195
-builtin_hash,StaInArrayLiteralHandler,-286024195
-builtin_hash,DefineKeyedOwnPropertyInLiteralHandler,816417950
-builtin_hash,AddHandler,436623080
-builtin_hash,SubHandler,828723569
-builtin_hash,MulHandler,-316424498
-builtin_hash,DivHandler,515954740
-builtin_hash,ModHandler,-366411552
-builtin_hash,ExpHandler,841779190
-builtin_hash,BitwiseOrHandler,-654281787
-builtin_hash,BitwiseXorHandler,-535984936
-builtin_hash,BitwiseAndHandler,-787882211
-builtin_hash,ShiftLeftHandler,-843937923
-builtin_hash,ShiftRightHandler,212674128
-builtin_hash,ShiftRightLogicalHandler,46895009
-builtin_hash,AddSmiHandler,445675964
-builtin_hash,SubSmiHandler,888105299
-builtin_hash,MulSmiHandler,75879268
-builtin_hash,DivSmiHandler,-1048906096
-builtin_hash,ModSmiHandler,844716305
-builtin_hash,BitwiseOrSmiHandler,950867671
-builtin_hash,BitwiseXorSmiHandler,667017295
-builtin_hash,BitwiseAndSmiHandler,16303015
-builtin_hash,ShiftLeftSmiHandler,-243955085
-builtin_hash,ShiftRightSmiHandler,247609496
-builtin_hash,ShiftRightLogicalSmiHandler,-992904191
-builtin_hash,IncHandler,-790806177
-builtin_hash,DecHandler,395099716
-builtin_hash,NegateHandler,773570671
-builtin_hash,BitwiseNotHandler,-30220634
-builtin_hash,ToBooleanLogicalNotHandler,-99917552
-builtin_hash,LogicalNotHandler,-229756855
-builtin_hash,TypeOfHandler,872105570
-builtin_hash,DeletePropertyStrictHandler,986048046
-builtin_hash,DeletePropertySloppyHandler,-712291966
-builtin_hash,GetSuperConstructorHandler,728738893
-builtin_hash,CallAnyReceiverHandler,-851436429
-builtin_hash,CallPropertyHandler,-851436429
-builtin_hash,CallProperty0Handler,250813033
-builtin_hash,CallProperty1Handler,-121823545
-builtin_hash,CallProperty2Handler,370258853
-builtin_hash,CallUndefinedReceiverHandler,-986912746
-builtin_hash,CallUndefinedReceiver0Handler,-202732647
-builtin_hash,CallUndefinedReceiver1Handler,565224727
-builtin_hash,CallUndefinedReceiver2Handler,387553770
-builtin_hash,CallWithSpreadHandler,-851436429
-builtin_hash,CallRuntimeHandler,-170619637
-builtin_hash,CallJSRuntimeHandler,409704029
-builtin_hash,InvokeIntrinsicHandler,715377671
-builtin_hash,ConstructHandler,-131706767
-builtin_hash,ConstructWithSpreadHandler,364942391
-builtin_hash,TestEqualHandler,-837108372
-builtin_hash,TestEqualStrictHandler,894153483
-builtin_hash,TestLessThanHandler,-203533412
-builtin_hash,TestGreaterThanHandler,-62684313
-builtin_hash,TestLessThanOrEqualHandler,200710478
-builtin_hash,TestGreaterThanOrEqualHandler,-469101728
-builtin_hash,TestInstanceOfHandler,-340407472
-builtin_hash,TestInHandler,-632047176
-builtin_hash,ToNameHandler,751533885
-builtin_hash,ToNumberHandler,242489604
-builtin_hash,ToNumericHandler,839640143
-builtin_hash,ToObjectHandler,751533885
-builtin_hash,ToStringHandler,-825940301
-builtin_hash,CreateRegExpLiteralHandler,774985654
-builtin_hash,CreateArrayLiteralHandler,440763826
-builtin_hash,CreateArrayFromIterableHandler,-751073497
-builtin_hash,CreateEmptyArrayLiteralHandler,825438818
-builtin_hash,CreateObjectLiteralHandler,-380204898
-builtin_hash,CreateEmptyObjectLiteralHandler,-480083872
-builtin_hash,CreateClosureHandler,877654061
-builtin_hash,CreateBlockContextHandler,88550400
-builtin_hash,CreateCatchContextHandler,-353230330
-builtin_hash,CreateFunctionContextHandler,159733033
-builtin_hash,CreateMappedArgumentsHandler,427483474
-builtin_hash,CreateUnmappedArgumentsHandler,-700097820
-builtin_hash,CreateRestParameterHandler,-443936485
-builtin_hash,JumpLoopHandler,-343051033
-builtin_hash,JumpHandler,930291898
-builtin_hash,JumpConstantHandler,30595851
-builtin_hash,JumpIfUndefinedConstantHandler,643859045
-builtin_hash,JumpIfNotUndefinedConstantHandler,-579153610
-builtin_hash,JumpIfUndefinedOrNullConstantHandler,407521228
-builtin_hash,JumpIfTrueConstantHandler,643859045
-builtin_hash,JumpIfFalseConstantHandler,643859045
-builtin_hash,JumpIfToBooleanTrueConstantHandler,696724860
-builtin_hash,JumpIfToBooleanFalseConstantHandler,-179848636
-builtin_hash,JumpIfToBooleanTrueHandler,690028724
-builtin_hash,JumpIfToBooleanFalseHandler,-185041964
-builtin_hash,JumpIfTrueHandler,-843949956
-builtin_hash,JumpIfFalseHandler,-843949956
-builtin_hash,JumpIfNullHandler,-843949956
-builtin_hash,JumpIfNotNullHandler,1010847017
-builtin_hash,JumpIfUndefinedHandler,-843949956
-builtin_hash,JumpIfNotUndefinedHandler,1010847017
-builtin_hash,JumpIfUndefinedOrNullHandler,-517586474
-builtin_hash,JumpIfJSReceiverHandler,-9297690
-builtin_hash,SwitchOnSmiNoFeedbackHandler,-716989037
-builtin_hash,ForInEnumerateHandler,61176991
-builtin_hash,ForInPrepareHandler,748762980
-builtin_hash,ForInContinueHandler,-714020166
-builtin_hash,ForInNextHandler,1029822774
-builtin_hash,ForInStepHandler,776836572
-builtin_hash,SetPendingMessageHandler,-975756024
-builtin_hash,ThrowHandler,644164630
-builtin_hash,ReThrowHandler,644164630
-builtin_hash,ReturnHandler,258099816
-builtin_hash,ThrowReferenceErrorIfHoleHandler,-638014566
-builtin_hash,ThrowSuperNotCalledIfHoleHandler,-464286245
-builtin_hash,ThrowSuperAlreadyCalledIfNotHoleHandler,398738172
-builtin_hash,ThrowIfNotSuperConstructorHandler,405467231
-builtin_hash,SwitchOnGeneratorStateHandler,-1026917452
-builtin_hash,SuspendGeneratorHandler,-1054903459
-builtin_hash,ResumeGeneratorHandler,31675678
-builtin_hash,GetIteratorHandler,-711157277
-builtin_hash,ShortStarHandler,-568713113
-builtin_hash,LdarWideHandler,756831261
-builtin_hash,LdaSmiWideHandler,-782553530
-builtin_hash,LdaConstantWideHandler,-1037025209
-builtin_hash,LdaContextSlotWideHandler,1063635436
-builtin_hash,LdaImmutableContextSlotWideHandler,1063635436
-builtin_hash,LdaImmutableCurrentContextSlotWideHandler,847312619
-builtin_hash,StarWideHandler,40106091
-builtin_hash,MovWideHandler,-754864487
-builtin_hash,PushContextWideHandler,-948084621
-builtin_hash,PopContextWideHandler,245106357
-builtin_hash,TestReferenceEqualWideHandler,335478736
-builtin_hash,LdaGlobalWideHandler,-1010718236
-builtin_hash,LdaGlobalInsideTypeofWideHandler,-149141203
-builtin_hash,StaGlobalWideHandler,723033359
-builtin_hash,StaContextSlotWideHandler,731461442
-builtin_hash,StaCurrentContextSlotWideHandler,824213038
-builtin_hash,LdaLookupGlobalSlotWideHandler,-311844471
-builtin_hash,GetNamedPropertyWideHandler,-251017711
-builtin_hash,GetKeyedPropertyWideHandler,-256173219
-builtin_hash,SetNamedPropertyWideHandler,137651840
-builtin_hash,DefineNamedOwnPropertyWideHandler,137651840
-builtin_hash,SetKeyedPropertyWideHandler,-232580858
-builtin_hash,DefineKeyedOwnPropertyWideHandler,-232580858
-builtin_hash,StaInArrayLiteralWideHandler,-232580858
-builtin_hash,AddWideHandler,40447064
-builtin_hash,SubWideHandler,563692284
-builtin_hash,MulWideHandler,42508558
-builtin_hash,DivWideHandler,-844098316
-builtin_hash,BitwiseOrWideHandler,-328979788
-builtin_hash,BitwiseAndWideHandler,-469583662
-builtin_hash,ShiftLeftWideHandler,-954698376
-builtin_hash,AddSmiWideHandler,683295664
-builtin_hash,SubSmiWideHandler,-413733930
-builtin_hash,MulSmiWideHandler,-838301803
-builtin_hash,DivSmiWideHandler,527308360
-builtin_hash,ModSmiWideHandler,1034309589
-builtin_hash,BitwiseOrSmiWideHandler,492037335
-builtin_hash,BitwiseXorSmiWideHandler,-42936112
-builtin_hash,BitwiseAndSmiWideHandler,-477429885
-builtin_hash,ShiftLeftSmiWideHandler,672571321
-builtin_hash,ShiftRightSmiWideHandler,-67772744
-builtin_hash,ShiftRightLogicalSmiWideHandler,127757354
-builtin_hash,IncWideHandler,-922639629
-builtin_hash,DecWideHandler,-907897874
-builtin_hash,NegateWideHandler,-988497568
-builtin_hash,CallPropertyWideHandler,-698600283
-builtin_hash,CallProperty0WideHandler,1057782406
-builtin_hash,CallProperty1WideHandler,166979495
-builtin_hash,CallProperty2WideHandler,-58239499
-builtin_hash,CallUndefinedReceiverWideHandler,-121494034
-builtin_hash,CallUndefinedReceiver0WideHandler,-36365251
-builtin_hash,CallUndefinedReceiver1WideHandler,-1052313758
-builtin_hash,CallUndefinedReceiver2WideHandler,-469182582
-builtin_hash,CallWithSpreadWideHandler,-698600283
-builtin_hash,ConstructWideHandler,411540742
-builtin_hash,TestEqualWideHandler,-902995058
-builtin_hash,TestEqualStrictWideHandler,852452310
-builtin_hash,TestLessThanWideHandler,814869973
-builtin_hash,TestGreaterThanWideHandler,18887871
-builtin_hash,TestLessThanOrEqualWideHandler,34488528
-builtin_hash,TestGreaterThanOrEqualWideHandler,702527286
-builtin_hash,TestInstanceOfWideHandler,577442592
-builtin_hash,TestInWideHandler,469604978
-builtin_hash,ToNumericWideHandler,-933767737
-builtin_hash,CreateRegExpLiteralWideHandler,-286224018
-builtin_hash,CreateArrayLiteralWideHandler,925645732
-builtin_hash,CreateEmptyArrayLiteralWideHandler,556344123
-builtin_hash,CreateObjectLiteralWideHandler,-878578517
-builtin_hash,CreateClosureWideHandler,-102315205
-builtin_hash,CreateBlockContextWideHandler,392513921
-builtin_hash,CreateFunctionContextWideHandler,179338975
-builtin_hash,JumpLoopWideHandler,-949183832
-builtin_hash,JumpWideHandler,930291898
-builtin_hash,JumpIfToBooleanTrueWideHandler,-205748918
-builtin_hash,JumpIfToBooleanFalseWideHandler,1069905826
-builtin_hash,JumpIfTrueWideHandler,948634550
-builtin_hash,JumpIfFalseWideHandler,948634550
-builtin_hash,SwitchOnSmiNoFeedbackWideHandler,633155127
-builtin_hash,ForInPrepareWideHandler,-215451327
-builtin_hash,ForInNextWideHandler,372934797
-builtin_hash,ThrowReferenceErrorIfHoleWideHandler,298664482
-builtin_hash,GetIteratorWideHandler,43434708
-builtin_hash,LdaSmiExtraWideHandler,-892533764
-builtin_hash,LdaGlobalExtraWideHandler,661412585
-builtin_hash,AddSmiExtraWideHandler,-692969189
-builtin_hash,SubSmiExtraWideHandler,435863200
-builtin_hash,MulSmiExtraWideHandler,1072184980
-builtin_hash,DivSmiExtraWideHandler,-704989643
-builtin_hash,BitwiseOrSmiExtraWideHandler,-957712250
-builtin_hash,BitwiseXorSmiExtraWideHandler,44753591
-builtin_hash,BitwiseAndSmiExtraWideHandler,-563032786
-builtin_hash,CallUndefinedReceiverExtraWideHandler,-267336492
-builtin_hash,CallUndefinedReceiver1ExtraWideHandler,93448265
-builtin_hash,CallUndefinedReceiver2ExtraWideHandler,11673012
+builtin_hash,RecordWriteSaveFP,-613048523
+builtin_hash,RecordWriteIgnoreFP,-613048523
+builtin_hash,EphemeronKeyBarrierSaveFP,-874028499
+builtin_hash,AdaptorWithBuiltinExitFrame,-50443338
+builtin_hash,Call_ReceiverIsNullOrUndefined_Baseline_Compact,277963652
+builtin_hash,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,739975018
+builtin_hash,Call_ReceiverIsAny_Baseline_Compact,739975018
+builtin_hash,CallProxy,265720458
+builtin_hash,CallWithSpread,690518666
+builtin_hash,CallWithSpread_Baseline,14944167
+builtin_hash,CallWithArrayLike,-463192950
+builtin_hash,ConstructWithSpread,1026222363
+builtin_hash,ConstructWithSpread_Baseline,-954447059
+builtin_hash,Construct_Baseline,242132798
+builtin_hash,FastNewObject,812115752
+builtin_hash,FastNewClosure,-22842529
+builtin_hash,StringEqual,552928703
+builtin_hash,StringGreaterThan,814990350
+builtin_hash,StringGreaterThanOrEqual,-931415038
+builtin_hash,StringLessThan,-931415038
+builtin_hash,StringLessThanOrEqual,814990350
+builtin_hash,StringSubstring,679034293
+builtin_hash,OrderedHashTableHealIndex,-480837431
+builtin_hash,CompileLazy,-913572652
+builtin_hash,CompileLazyDeoptimizedCode,797435305
+builtin_hash,InstantiateAsmJs,-824208537
+builtin_hash,AllocateInYoungGeneration,-589367571
+builtin_hash,AllocateRegularInYoungGeneration,549206964
+builtin_hash,AllocateRegularInOldGeneration,549206964
+builtin_hash,CopyFastSmiOrObjectElements,-664166620
+builtin_hash,GrowFastDoubleElements,-794207344
+builtin_hash,GrowFastSmiOrObjectElements,-727031326
+builtin_hash,ToNumber,87194511
+builtin_hash,ToNumber_Baseline,-245107362
+builtin_hash,ToNumeric_Baseline,765738096
+builtin_hash,ToNumberConvertBigInt,-809735249
+builtin_hash,Typeof,554300746
+builtin_hash,KeyedLoadIC_PolymorphicName,808866465
+builtin_hash,KeyedStoreIC_Megamorphic,355428822
+builtin_hash,DefineKeyedOwnIC_Megamorphic,-254774567
+builtin_hash,LoadGlobalIC_NoFeedback,567497889
+builtin_hash,LoadIC_FunctionPrototype,440547932
+builtin_hash,LoadIC_StringLength,631981109
+builtin_hash,LoadIC_StringWrapperLength,957410129
+builtin_hash,LoadIC_NoFeedback,-673925088
+builtin_hash,StoreIC_NoFeedback,599149807
+builtin_hash,DefineNamedOwnIC_NoFeedback,-684443605
+builtin_hash,KeyedLoadIC_SloppyArguments,732273933
+builtin_hash,StoreFastElementIC_Standard,-310030150
+builtin_hash,StoreFastElementIC_GrowNoTransitionHandleCOW,-894353505
+builtin_hash,StoreFastElementIC_NoTransitionHandleCOW,-684092303
+builtin_hash,ElementsTransitionAndStore_Standard,-313637466
+builtin_hash,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,887654385
+builtin_hash,ElementsTransitionAndStore_NoTransitionHandleCOW,-730942180
+builtin_hash,KeyedHasIC_PolymorphicName,-900991969
+builtin_hash,EnqueueMicrotask,-201594324
+builtin_hash,RunMicrotasks,226014440
+builtin_hash,HasProperty,-179991880
+builtin_hash,DeleteProperty,-417791504
+builtin_hash,SetDataProperties,-676389083
+builtin_hash,ReturnReceiver,-253986889
+builtin_hash,ArrayConstructor,-132723945
+builtin_hash,ArrayConstructorImpl,-940010648
+builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DontOverride,-419508170
+builtin_hash,ArrayNoArgumentConstructor_HoleySmi_DontOverride,-419508170
+builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DisableAllocationSites,605372040
+builtin_hash,ArrayNoArgumentConstructor_Packed_DisableAllocationSites,605372040
+builtin_hash,ArrayNoArgumentConstructor_Holey_DisableAllocationSites,605372040
+builtin_hash,ArrayNoArgumentConstructor_PackedDouble_DisableAllocationSites,-118459699
+builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DontOverride,-533026482
+builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,276667194
+builtin_hash,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,276667194
+builtin_hash,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,-533601049
+builtin_hash,ArrayIncludesSmi,-836179006
+builtin_hash,ArrayIncludesSmiOrObject,162670788
+builtin_hash,ArrayIncludes,508610041
+builtin_hash,ArrayIndexOfSmi,-144958716
+builtin_hash,ArrayIndexOfSmiOrObject,-560665373
+builtin_hash,ArrayIndexOf,659016893
+builtin_hash,ArrayPrototypePop,-672159034
+builtin_hash,ArrayPrototypePush,-828516926
+builtin_hash,CloneFastJSArray,330962956
+builtin_hash,CloneFastJSArrayFillingHoles,-114093580
+builtin_hash,ExtractFastJSArray,-899029625
+builtin_hash,ArrayPrototypeEntries,-846534049
+builtin_hash,ArrayPrototypeKeys,-432117890
+builtin_hash,ArrayPrototypeValues,-846534049
+builtin_hash,ArrayIteratorPrototypeNext,167355436
+builtin_hash,AsyncFunctionEnter,-860415031
+builtin_hash,AsyncFunctionResolve,910332485
+builtin_hash,AsyncFunctionAwaitCaught,-619125883
+builtin_hash,AsyncFunctionAwaitUncaught,-619125883
+builtin_hash,AsyncFunctionAwaitResolveClosure,-441313583
+builtin_hash,DatePrototypeGetDate,596885245
+builtin_hash,DatePrototypeGetDay,596885245
+builtin_hash,DatePrototypeGetFullYear,596885245
+builtin_hash,DatePrototypeGetHours,596885245
+builtin_hash,DatePrototypeGetMilliseconds,-147735130
+builtin_hash,DatePrototypeGetMinutes,596885245
+builtin_hash,DatePrototypeGetMonth,596885245
+builtin_hash,DatePrototypeGetSeconds,596885245
+builtin_hash,DatePrototypeGetTime,842589209
+builtin_hash,DatePrototypeGetTimezoneOffset,-147735130
+builtin_hash,DatePrototypeValueOf,842589209
+builtin_hash,DatePrototypeToPrimitive,-469261030
+builtin_hash,CreateIterResultObject,-236239497
+builtin_hash,CreateGeneratorObject,-989601020
+builtin_hash,GeneratorPrototypeNext,-532167070
+builtin_hash,GeneratorPrototypeReturn,204056688
+builtin_hash,SuspendGeneratorBaseline,-716242694
+builtin_hash,ResumeGeneratorBaseline,600643426
+builtin_hash,GlobalIsFinite,-28742852
+builtin_hash,GlobalIsNaN,-414427038
+builtin_hash,LoadIC,-1028921753
+builtin_hash,LoadIC_Megamorphic,604208967
+builtin_hash,LoadIC_Noninlined,-411987614
+builtin_hash,LoadICTrampoline,800274028
+builtin_hash,LoadICBaseline,470944725
+builtin_hash,LoadICTrampoline_Megamorphic,800274028
+builtin_hash,LoadSuperIC,-145652312
+builtin_hash,LoadSuperICBaseline,-463763660
+builtin_hash,KeyedLoadIC,-400473566
+builtin_hash,KeyedLoadIC_Megamorphic,41817838
+builtin_hash,KeyedLoadICTrampoline,800274028
+builtin_hash,KeyedLoadICBaseline,470944725
+builtin_hash,KeyedLoadICTrampoline_Megamorphic,800274028
+builtin_hash,StoreGlobalIC,-985598929
+builtin_hash,StoreGlobalICTrampoline,800274028
+builtin_hash,StoreGlobalICBaseline,470944725
+builtin_hash,StoreIC,107868822
+builtin_hash,StoreICTrampoline,515324941
+builtin_hash,StoreICBaseline,-463763660
+builtin_hash,DefineNamedOwnIC,293425336
+builtin_hash,DefineNamedOwnICBaseline,-463763660
+builtin_hash,KeyedStoreIC,-634858106
+builtin_hash,KeyedStoreICTrampoline,515324941
+builtin_hash,KeyedStoreICBaseline,-463763660
+builtin_hash,DefineKeyedOwnIC,-567510982
+builtin_hash,StoreInArrayLiteralIC,336733574
+builtin_hash,StoreInArrayLiteralICBaseline,-463763660
+builtin_hash,LoadGlobalIC,-994002095
+builtin_hash,LoadGlobalICInsideTypeof,131610143
+builtin_hash,LoadGlobalICTrampoline,-356577892
+builtin_hash,LoadGlobalICBaseline,-87390287
+builtin_hash,LoadGlobalICInsideTypeofTrampoline,-356577892
+builtin_hash,LoadGlobalICInsideTypeofBaseline,-87390287
+builtin_hash,LookupGlobalICBaseline,195819709
+builtin_hash,LookupGlobalICInsideTypeofBaseline,195819709
+builtin_hash,KeyedHasIC,-581893205
+builtin_hash,KeyedHasICBaseline,470944725
+builtin_hash,KeyedHasIC_Megamorphic,-179991880
+builtin_hash,IterableToList,-847583682
+builtin_hash,IterableToListWithSymbolLookup,639766325
+builtin_hash,IterableToListMayPreserveHoles,915672519
+builtin_hash,FindOrderedHashMapEntry,257985360
+builtin_hash,MapConstructor,173900465
+builtin_hash,MapPrototypeSet,-909373880
+builtin_hash,MapPrototypeDelete,-182536468
+builtin_hash,MapPrototypeGet,-10028336
+builtin_hash,MapPrototypeHas,-139761843
+builtin_hash,MapPrototypeEntries,-344495525
+builtin_hash,MapPrototypeGetSize,1002199563
+builtin_hash,MapPrototypeForEach,666422496
+builtin_hash,MapPrototypeKeys,-344495525
+builtin_hash,MapPrototypeValues,-344495525
+builtin_hash,MapIteratorPrototypeNext,824163271
+builtin_hash,MapIteratorToList,-171739571
+builtin_hash,SameValueNumbersOnly,-385008716
+builtin_hash,Add_Baseline,-279802821
+builtin_hash,AddSmi_Baseline,-180294218
+builtin_hash,Subtract_Baseline,422911741
+builtin_hash,SubtractSmi_Baseline,593938918
+builtin_hash,Multiply_Baseline,-390820476
+builtin_hash,MultiplySmi_Baseline,325873812
+builtin_hash,Divide_Baseline,-303206156
+builtin_hash,DivideSmi_Baseline,-760734875
+builtin_hash,Modulus_Baseline,-56419644
+builtin_hash,ModulusSmi_Baseline,-723448
+builtin_hash,Exponentiate_Baseline,-897267514
+builtin_hash,BitwiseAnd_Baseline,368212144
+builtin_hash,BitwiseAndSmi_Baseline,-1040430105
+builtin_hash,BitwiseOr_Baseline,-468458668
+builtin_hash,BitwiseOrSmi_Baseline,688726246
+builtin_hash,BitwiseXor_Baseline,-113074811
+builtin_hash,BitwiseXorSmi_Baseline,601401020
+builtin_hash,ShiftLeft_Baseline,-775732772
+builtin_hash,ShiftLeftSmi_Baseline,-78665210
+builtin_hash,ShiftRight_Baseline,748634885
+builtin_hash,ShiftRightSmi_Baseline,886941283
+builtin_hash,ShiftRightLogical_Baseline,561208446
+builtin_hash,ShiftRightLogicalSmi_Baseline,-31850172
+builtin_hash,Add_WithFeedback,-713508648
+builtin_hash,Subtract_WithFeedback,-1006518356
+builtin_hash,Modulus_WithFeedback,673708690
+builtin_hash,BitwiseOr_WithFeedback,-71811840
+builtin_hash,Equal_Baseline,-449571287
+builtin_hash,StrictEqual_Baseline,-311709296
+builtin_hash,LessThan_Baseline,-1041710075
+builtin_hash,GreaterThan_Baseline,763769306
+builtin_hash,LessThanOrEqual_Baseline,-289600196
+builtin_hash,GreaterThanOrEqual_Baseline,-964000144
+builtin_hash,Equal_WithFeedback,-804822195
+builtin_hash,StrictEqual_WithFeedback,316409561
+builtin_hash,LessThan_WithFeedback,-1041748847
+builtin_hash,GreaterThan_WithFeedback,208079969
+builtin_hash,GreaterThanOrEqual_WithFeedback,50039232
+builtin_hash,BitwiseNot_Baseline,574212378
+builtin_hash,Decrement_Baseline,740961552
+builtin_hash,Increment_Baseline,-482954167
+builtin_hash,Negate_Baseline,257429052
+builtin_hash,ObjectAssign,415745977
+builtin_hash,ObjectCreate,152352347
+builtin_hash,ObjectEntries,-267361188
+builtin_hash,ObjectGetOwnPropertyDescriptor,-1005546404
+builtin_hash,ObjectGetOwnPropertyNames,-10249982
+builtin_hash,ObjectIs,947042700
+builtin_hash,ObjectKeys,276395735
+builtin_hash,ObjectPrototypeHasOwnProperty,-366540189
+builtin_hash,ObjectToString,-680252272
+builtin_hash,InstanceOf_WithFeedback,-814385450
+builtin_hash,InstanceOf_Baseline,-567095434
+builtin_hash,ForInEnumerate,329908035
+builtin_hash,ForInPrepare,731557174
+builtin_hash,ForInFilter,884185984
+builtin_hash,RegExpConstructor,-1029370119
+builtin_hash,RegExpExecAtom,181372809
+builtin_hash,RegExpExecInternal,317900879
+builtin_hash,FindOrderedHashSetEntry,482436035
+builtin_hash,SetConstructor,692235107
+builtin_hash,SetPrototypeHas,-139761843
+builtin_hash,SetPrototypeAdd,-596680080
+builtin_hash,SetPrototypeDelete,331633635
+builtin_hash,SetPrototypeEntries,-344495525
+builtin_hash,SetPrototypeGetSize,1002199563
+builtin_hash,SetPrototypeForEach,97244170
+builtin_hash,SetPrototypeValues,-344495525
+builtin_hash,SetIteratorPrototypeNext,-441725951
+builtin_hash,SetOrSetIteratorToList,623342942
+builtin_hash,StringFromCharCode,-123751380
+builtin_hash,StringPrototypeReplace,-921072145
+builtin_hash,StringPrototypeSplit,415613472
+builtin_hash,TypedArrayConstructor,32466415
+builtin_hash,TypedArrayPrototypeByteLength,864895308
+builtin_hash,TypedArrayPrototypeLength,539604699
+builtin_hash,WeakMapConstructor,814764494
+builtin_hash,WeakMapLookupHashIndex,-464287185
+builtin_hash,WeakMapGet,925651553
+builtin_hash,WeakMapPrototypeHas,947465532
+builtin_hash,WeakMapPrototypeSet,-976760951
+builtin_hash,WeakSetConstructor,694246453
+builtin_hash,WeakSetPrototypeHas,947465532
+builtin_hash,WeakSetPrototypeAdd,-160318733
+builtin_hash,WeakCollectionSet,578996244
+builtin_hash,AsyncGeneratorResolve,-83028412
+builtin_hash,AsyncGeneratorYieldWithAwait,-366463177
+builtin_hash,AsyncGeneratorResumeNext,220127321
+builtin_hash,AsyncGeneratorPrototypeNext,1069549757
+builtin_hash,AsyncGeneratorAwaitUncaught,-628599896
+builtin_hash,AsyncGeneratorAwaitResolveClosure,1062097477
+builtin_hash,AsyncGeneratorYieldWithAwaitResolveClosure,793122606
+builtin_hash,StringAdd_CheckNone,113370168
+builtin_hash,SubString,895503589
+builtin_hash,GetProperty,1052862169
+builtin_hash,GetPropertyWithReceiver,1045827042
+builtin_hash,SetProperty,908643608
+builtin_hash,CreateDataProperty,-314133834
+builtin_hash,ArrayPrototypeConcat,-557766770
+builtin_hash,ArrayEvery,-740699383
+builtin_hash,ArrayFilterLoopLazyDeoptContinuation,-463893516
+builtin_hash,ArrayFilterLoopContinuation,-636224543
+builtin_hash,ArrayFilter,-1006837550
+builtin_hash,ArrayPrototypeFind,358067331
+builtin_hash,ArrayForEachLoopLazyDeoptContinuation,-227856192
+builtin_hash,ArrayForEachLoopContinuation,498815593
+builtin_hash,ArrayForEach,-465472618
+builtin_hash,ArrayFrom,559791774
+builtin_hash,ArrayIsArray,556045869
+builtin_hash,LoadJoinElement_FastSmiOrObjectElements_0,4464260
+builtin_hash,LoadJoinElement_FastDoubleElements_0,-669389930
+builtin_hash,JoinStackPush,932509525
+builtin_hash,JoinStackPop,97051696
+builtin_hash,ArrayPrototypeJoin,638420418
+builtin_hash,ArrayPrototypeToString,571363693
+builtin_hash,ArrayPrototypeLastIndexOf,-262998450
+builtin_hash,ArrayMapLoopLazyDeoptContinuation,992596139
+builtin_hash,ArrayMapLoopContinuation,852679435
+builtin_hash,ArrayMap,237015696
+builtin_hash,ArrayReduceLoopLazyDeoptContinuation,-1021360101
+builtin_hash,ArrayReduceLoopContinuation,736239909
+builtin_hash,ArrayReduce,550306639
+builtin_hash,ArrayPrototypeReverse,-848939503
+builtin_hash,ArrayPrototypeShift,510698980
+builtin_hash,ArrayPrototypeSlice,-226926113
+builtin_hash,ArraySome,616986483
+builtin_hash,ArrayPrototypeSplice,318122997
+builtin_hash,ArrayPrototypeUnshift,942293281
+builtin_hash,ArrayBufferPrototypeGetByteLength,8155127
+builtin_hash,ArrayBufferIsView,-92420774
+builtin_hash,ToInteger,114221870
+builtin_hash,FastCreateDataProperty,683077437
+builtin_hash,BooleanConstructor,104847507
+builtin_hash,BooleanPrototypeToString,496844333
+builtin_hash,ToString,-492204321
+builtin_hash,StringPrototypeToString,232130928
+builtin_hash,StringPrototypeValueOf,232130928
+builtin_hash,StringPrototypeCharAt,-493882295
+builtin_hash,StringPrototypeCharCodeAt,-70476469
+builtin_hash,StringPrototypeCodePointAt,958343749
+builtin_hash,StringPrototypeConcat,122908250
+builtin_hash,StringConstructor,36941296
+builtin_hash,StringAddConvertLeft,895631940
+builtin_hash,StringAddConvertRight,620894196
+builtin_hash,StringCharAt,-771156702
+builtin_hash,FastNewClosureBaseline,-345301780
+builtin_hash,FastNewFunctionContextFunction,393493853
+builtin_hash,CreateRegExpLiteral,1052274841
+builtin_hash,CreateShallowArrayLiteral,758569216
+builtin_hash,CreateEmptyArrayLiteral,-244361805
+builtin_hash,CreateShallowObjectLiteral,429596211
+builtin_hash,ObjectConstructor,792071103
+builtin_hash,CreateEmptyLiteralObject,792021411
+builtin_hash,NumberConstructor,-545912408
+builtin_hash,StringToNumber,-567475001
+builtin_hash,NonNumberToNumber,-75339598
+builtin_hash,NonNumberToNumeric,-163611573
+builtin_hash,ToNumeric,1067114169
+builtin_hash,NumberToString,808056721
+builtin_hash,ToBoolean,474893826
+builtin_hash,ToBooleanForBaselineJump,-1000387172
+builtin_hash,ToLength,-752062439
+builtin_hash,ToName,-893589751
+builtin_hash,ToObject,-995611522
+builtin_hash,NonPrimitiveToPrimitive_Default,-741936834
+builtin_hash,NonPrimitiveToPrimitive_Number,-741936834
+builtin_hash,NonPrimitiveToPrimitive_String,-741936834
+builtin_hash,OrdinaryToPrimitive_Number,940682530
+builtin_hash,OrdinaryToPrimitive_String,940682530
+builtin_hash,DataViewPrototypeGetByteLength,-344862281
+builtin_hash,DataViewPrototypeGetFloat64,-710736378
+builtin_hash,DataViewPrototypeSetUint32,561326289
+builtin_hash,DataViewPrototypeSetFloat64,224815643
+builtin_hash,FunctionPrototypeHasInstance,-159239165
+builtin_hash,FastFunctionPrototypeBind,-835190429
+builtin_hash,ForInNext,-628108871
+builtin_hash,GetIteratorWithFeedback,412632852
+builtin_hash,GetIteratorBaseline,878549031
+builtin_hash,CallIteratorWithFeedback,-173921836
+builtin_hash,MathAbs,-418374171
+builtin_hash,MathCeil,466763348
+builtin_hash,MathFloor,471221640
+builtin_hash,MathRound,-989099866
+builtin_hash,MathPow,510691647
+builtin_hash,MathMax,45115699
+builtin_hash,MathMin,-996382942
+builtin_hash,MathAsin,261451622
+builtin_hash,MathAtan2,605332815
+builtin_hash,MathCos,515079504
+builtin_hash,MathExp,551351922
+builtin_hash,MathFround,564706237
+builtin_hash,MathImul,685265173
+builtin_hash,MathLog,-553256829
+builtin_hash,MathSin,302395292
+builtin_hash,MathSign,611819739
+builtin_hash,MathSqrt,55107225
+builtin_hash,MathTan,-332405887
+builtin_hash,MathTanh,939045985
+builtin_hash,MathRandom,-504157126
+builtin_hash,NumberPrototypeToString,145247584
+builtin_hash,NumberIsInteger,910409330
+builtin_hash,NumberIsNaN,343619286
+builtin_hash,NumberParseFloat,-745268146
+builtin_hash,ParseInt,423449565
+builtin_hash,NumberParseInt,348325306
+builtin_hash,Add,-712082634
+builtin_hash,Subtract,860006498
+builtin_hash,Multiply,966938552
+builtin_hash,Divide,501339465
+builtin_hash,Modulus,556264773
+builtin_hash,CreateObjectWithoutProperties,911390056
+builtin_hash,ObjectIsExtensible,-376770424
+builtin_hash,ObjectPreventExtensions,-675757061
+builtin_hash,ObjectGetPrototypeOf,-694816240
+builtin_hash,ObjectSetPrototypeOf,-335823538
+builtin_hash,ObjectPrototypeToString,158685312
+builtin_hash,ObjectPrototypeValueOf,-993024104
+builtin_hash,FulfillPromise,-68874675
+builtin_hash,NewPromiseCapability,-880232666
+builtin_hash,PromiseCapabilityDefaultResolve,694927325
+builtin_hash,PerformPromiseThen,-238303189
+builtin_hash,PromiseAll,-121414633
+builtin_hash,PromiseAllResolveElementClosure,797273436
+builtin_hash,PromiseConstructor,-424149894
+builtin_hash,PromisePrototypeCatch,235262026
+builtin_hash,PromiseFulfillReactionJob,927825363
+builtin_hash,PromiseResolveTrampoline,-549629094
+builtin_hash,PromiseResolve,-366429795
+builtin_hash,ResolvePromise,526061379
+builtin_hash,PromisePrototypeThen,959282415
+builtin_hash,PromiseResolveThenableJob,-977786068
+builtin_hash,ProxyConstructor,-54504231
+builtin_hash,ProxyGetProperty,-692505715
+builtin_hash,ProxyIsExtensible,-120987472
+builtin_hash,ProxyPreventExtensions,739592105
+builtin_hash,ReflectGet,1006327680
+builtin_hash,ReflectHas,-549629094
+builtin_hash,RegExpPrototypeExec,866694176
+builtin_hash,RegExpMatchFast,556779044
+builtin_hash,RegExpReplace,1037671691
+builtin_hash,RegExpPrototypeReplace,-488505709
+builtin_hash,RegExpSearchFast,744647901
+builtin_hash,RegExpPrototypeSourceGetter,-69902772
+builtin_hash,RegExpSplit,418335022
+builtin_hash,RegExpPrototypeTest,-893509849
+builtin_hash,RegExpPrototypeTestFast,-541676085
+builtin_hash,RegExpPrototypeGlobalGetter,612394650
+builtin_hash,RegExpPrototypeIgnoreCaseGetter,-595775382
+builtin_hash,RegExpPrototypeMultilineGetter,368200363
+builtin_hash,RegExpPrototypeHasIndicesGetter,99570183
+builtin_hash,RegExpPrototypeDotAllGetter,99570183
+builtin_hash,RegExpPrototypeStickyGetter,471291660
+builtin_hash,RegExpPrototypeUnicodeGetter,471291660
+builtin_hash,RegExpPrototypeFlagsGetter,-493351549
+builtin_hash,StringPrototypeEndsWith,-140669855
+builtin_hash,StringPrototypeIncludes,-538712449
+builtin_hash,StringPrototypeIndexOf,-279080867
+builtin_hash,StringPrototypeIterator,-906814404
+builtin_hash,StringIteratorPrototypeNext,-459023719
+builtin_hash,StringPrototypeMatch,950777323
+builtin_hash,StringPrototypeSearch,950777323
+builtin_hash,StringRepeat,333496990
+builtin_hash,StringPrototypeSlice,147923310
+builtin_hash,StringPrototypeStartsWith,-916453690
+builtin_hash,StringPrototypeSubstr,93046303
+builtin_hash,StringPrototypeSubstring,-486167723
+builtin_hash,StringPrototypeTrim,-537839064
+builtin_hash,SymbolPrototypeToString,-331094885
+builtin_hash,CreateTypedArray,946007034
+builtin_hash,TypedArrayFrom,-383816322
+builtin_hash,TypedArrayPrototypeSet,183639399
+builtin_hash,TypedArrayPrototypeSubArray,-654743264
+builtin_hash,NewSloppyArgumentsElements,-733955106
+builtin_hash,NewStrictArgumentsElements,27861461
+builtin_hash,NewRestArgumentsElements,-158196826
+builtin_hash,FastNewSloppyArguments,701807193
+builtin_hash,FastNewStrictArguments,-400637158
+builtin_hash,FastNewRestArguments,771398605
+builtin_hash,StringSlowFlatten,758688335
+builtin_hash,StringIndexOf,893861646
+builtin_hash,Load_FastSmiElements_0,41377987
+builtin_hash,Load_FastObjectElements_0,41377987
+builtin_hash,Store_FastSmiElements_0,987491586
+builtin_hash,Store_FastObjectElements_0,-907039137
+builtin_hash,SortCompareDefault,-712046902
+builtin_hash,SortCompareUserFn,-498446944
+builtin_hash,Copy,1005972100
+builtin_hash,MergeAt,-238184884
+builtin_hash,GallopLeft,-228579918
+builtin_hash,GallopRight,508662767
+builtin_hash,ArrayTimSort,-584574007
+builtin_hash,ArrayPrototypeSort,-446345392
+builtin_hash,StringFastLocaleCompare,-805723901
+builtin_hash,WasmInt32ToHeapNumber,186218317
+builtin_hash,WasmTaggedNonSmiToInt32,644195797
+builtin_hash,WasmTriggerTierUp,-448026998
+builtin_hash,WasmStackGuard,929375954
+builtin_hash,CanUseSameAccessor_FastSmiElements_0,333215288
+builtin_hash,CanUseSameAccessor_FastObjectElements_0,333215288
+builtin_hash,StringPrototypeToLowerCaseIntl,325118773
+builtin_hash,StringToLowerCaseIntl,729618594
+builtin_hash,WideHandler,-985531040
+builtin_hash,ExtraWideHandler,-985531040
+builtin_hash,LdarHandler,1066069071
+builtin_hash,LdaZeroHandler,697098880
+builtin_hash,LdaSmiHandler,-92763154
+builtin_hash,LdaUndefinedHandler,94159659
+builtin_hash,LdaNullHandler,94159659
+builtin_hash,LdaTheHoleHandler,94159659
+builtin_hash,LdaTrueHandler,66190034
+builtin_hash,LdaFalseHandler,66190034
+builtin_hash,LdaConstantHandler,-234672240
+builtin_hash,LdaContextSlotHandler,999512170
+builtin_hash,LdaImmutableContextSlotHandler,999512170
+builtin_hash,LdaCurrentContextSlotHandler,-705029165
+builtin_hash,LdaImmutableCurrentContextSlotHandler,-705029165
+builtin_hash,StarHandler,-825981541
+builtin_hash,MovHandler,-222623368
+builtin_hash,PushContextHandler,239039195
+builtin_hash,PopContextHandler,663403390
+builtin_hash,TestReferenceEqualHandler,107959616
+builtin_hash,TestUndetectableHandler,768306054
+builtin_hash,TestNullHandler,317848228
+builtin_hash,TestUndefinedHandler,317848228
+builtin_hash,TestTypeOfHandler,-585531608
+builtin_hash,LdaGlobalHandler,680542536
+builtin_hash,LdaGlobalInsideTypeofHandler,-812384965
+builtin_hash,StaGlobalHandler,-849976646
+builtin_hash,StaContextSlotHandler,-642236485
+builtin_hash,StaCurrentContextSlotHandler,515612512
+builtin_hash,LdaLookupGlobalSlotHandler,328181263
+builtin_hash,LdaLookupGlobalSlotInsideTypeofHandler,-152487163
+builtin_hash,StaLookupSlotHandler,1043986971
+builtin_hash,GetNamedPropertyHandler,-918198086
+builtin_hash,GetNamedPropertyFromSuperHandler,-605958764
+builtin_hash,GetKeyedPropertyHandler,-368783501
+builtin_hash,SetNamedPropertyHandler,512867069
+builtin_hash,DefineNamedOwnPropertyHandler,512867069
+builtin_hash,SetKeyedPropertyHandler,-529790650
+builtin_hash,DefineKeyedOwnPropertyHandler,-529790650
+builtin_hash,StaInArrayLiteralHandler,-529790650
+builtin_hash,DefineKeyedOwnPropertyInLiteralHandler,519916231
+builtin_hash,AddHandler,-1014428769
+builtin_hash,SubHandler,-971645828
+builtin_hash,MulHandler,-1072793455
+builtin_hash,DivHandler,-162323805
+builtin_hash,ModHandler,-485795098
+builtin_hash,ExpHandler,795159955
+builtin_hash,BitwiseOrHandler,-974394049
+builtin_hash,BitwiseXorHandler,580834482
+builtin_hash,BitwiseAndHandler,614318128
+builtin_hash,ShiftLeftHandler,-423182377
+builtin_hash,ShiftRightHandler,-255081510
+builtin_hash,ShiftRightLogicalHandler,735938776
+builtin_hash,AddSmiHandler,107839307
+builtin_hash,SubSmiHandler,-363881533
+builtin_hash,MulSmiHandler,169761579
+builtin_hash,DivSmiHandler,-681265328
+builtin_hash,ModSmiHandler,861935655
+builtin_hash,BitwiseOrSmiHandler,-680303745
+builtin_hash,BitwiseXorSmiHandler,576458108
+builtin_hash,BitwiseAndSmiHandler,-994511503
+builtin_hash,ShiftLeftSmiHandler,-728693655
+builtin_hash,ShiftRightSmiHandler,975905832
+builtin_hash,ShiftRightLogicalSmiHandler,686146238
+builtin_hash,IncHandler,117772531
+builtin_hash,DecHandler,-691015839
+builtin_hash,NegateHandler,212889736
+builtin_hash,BitwiseNotHandler,-960473652
+builtin_hash,ToBooleanLogicalNotHandler,-997041363
+builtin_hash,LogicalNotHandler,-404436240
+builtin_hash,TypeOfHandler,-868029172
+builtin_hash,DeletePropertyStrictHandler,-310645655
+builtin_hash,DeletePropertySloppyHandler,-884621901
+builtin_hash,GetSuperConstructorHandler,-336144805
+builtin_hash,CallAnyReceiverHandler,-483788286
+builtin_hash,CallPropertyHandler,-483788286
+builtin_hash,CallProperty0Handler,234175094
+builtin_hash,CallProperty1Handler,354307341
+builtin_hash,CallProperty2Handler,968021051
+builtin_hash,CallUndefinedReceiverHandler,472718464
+builtin_hash,CallUndefinedReceiver0Handler,1020191467
+builtin_hash,CallUndefinedReceiver1Handler,785762305
+builtin_hash,CallUndefinedReceiver2Handler,-921863582
+builtin_hash,CallWithSpreadHandler,-483788286
+builtin_hash,CallRuntimeHandler,575543766
+builtin_hash,CallJSRuntimeHandler,-279970155
+builtin_hash,InvokeIntrinsicHandler,315814934
+builtin_hash,ConstructHandler,750653559
+builtin_hash,ConstructWithSpreadHandler,-950529667
+builtin_hash,TestEqualHandler,469957169
+builtin_hash,TestEqualStrictHandler,774972588
+builtin_hash,TestLessThanHandler,876731233
+builtin_hash,TestGreaterThanHandler,854370589
+builtin_hash,TestLessThanOrEqualHandler,-616820445
+builtin_hash,TestGreaterThanOrEqualHandler,128578007
+builtin_hash,TestInstanceOfHandler,437146777
+builtin_hash,TestInHandler,-595986293
+builtin_hash,ToNameHandler,-388837341
+builtin_hash,ToNumberHandler,172727215
+builtin_hash,ToNumericHandler,518340123
+builtin_hash,ToObjectHandler,-388837341
+builtin_hash,ToStringHandler,-736791596
+builtin_hash,CreateRegExpLiteralHandler,-387261303
+builtin_hash,CreateArrayLiteralHandler,544722821
+builtin_hash,CreateArrayFromIterableHandler,-590862374
+builtin_hash,CreateEmptyArrayLiteralHandler,-215104396
+builtin_hash,CreateObjectLiteralHandler,536615992
+builtin_hash,CreateEmptyObjectLiteralHandler,810635729
+builtin_hash,CreateClosureHandler,-899658211
+builtin_hash,CreateBlockContextHandler,-125556632
+builtin_hash,CreateCatchContextHandler,551209828
+builtin_hash,CreateFunctionContextHandler,-65684761
+builtin_hash,CreateMappedArgumentsHandler,67709625
+builtin_hash,CreateUnmappedArgumentsHandler,608258279
+builtin_hash,CreateRestParameterHandler,1042430952
+builtin_hash,JumpLoopHandler,77742379
+builtin_hash,JumpHandler,-420188660
+builtin_hash,JumpConstantHandler,-998825364
+builtin_hash,JumpIfUndefinedConstantHandler,-326209739
+builtin_hash,JumpIfNotUndefinedConstantHandler,37208057
+builtin_hash,JumpIfUndefinedOrNullConstantHandler,-104381115
+builtin_hash,JumpIfTrueConstantHandler,-326209739
+builtin_hash,JumpIfFalseConstantHandler,-326209739
+builtin_hash,JumpIfToBooleanTrueConstantHandler,-234142841
+builtin_hash,JumpIfToBooleanFalseConstantHandler,-602774868
+builtin_hash,JumpIfToBooleanTrueHandler,-297635325
+builtin_hash,JumpIfToBooleanFalseHandler,1015367976
+builtin_hash,JumpIfTrueHandler,862147447
+builtin_hash,JumpIfFalseHandler,862147447
+builtin_hash,JumpIfNullHandler,862147447
+builtin_hash,JumpIfNotNullHandler,-481058680
+builtin_hash,JumpIfUndefinedHandler,862147447
+builtin_hash,JumpIfNotUndefinedHandler,-481058680
+builtin_hash,JumpIfUndefinedOrNullHandler,14126870
+builtin_hash,JumpIfJSReceiverHandler,-723850389
+builtin_hash,SwitchOnSmiNoFeedbackHandler,-902670490
+builtin_hash,ForInEnumerateHandler,-322331924
+builtin_hash,ForInPrepareHandler,20034175
+builtin_hash,ForInContinueHandler,827732360
+builtin_hash,ForInNextHandler,119110335
+builtin_hash,ForInStepHandler,757646701
+builtin_hash,SetPendingMessageHandler,996401409
+builtin_hash,ThrowHandler,122680912
+builtin_hash,ReThrowHandler,122680912
+builtin_hash,ReturnHandler,47039723
+builtin_hash,ThrowReferenceErrorIfHoleHandler,-342650955
+builtin_hash,ThrowSuperNotCalledIfHoleHandler,-285583864
+builtin_hash,ThrowSuperAlreadyCalledIfNotHoleHandler,-827541184
+builtin_hash,ThrowIfNotSuperConstructorHandler,1018623070
+builtin_hash,SwitchOnGeneratorStateHandler,717471818
+builtin_hash,SuspendGeneratorHandler,547514791
+builtin_hash,ResumeGeneratorHandler,-860485588
+builtin_hash,GetIteratorHandler,-6630463
+builtin_hash,ShortStarHandler,721894508
+builtin_hash,LdarWideHandler,-978392409
+builtin_hash,LdaSmiWideHandler,-366656871
+builtin_hash,LdaConstantWideHandler,972813981
+builtin_hash,LdaContextSlotWideHandler,628329787
+builtin_hash,LdaImmutableContextSlotWideHandler,628329787
+builtin_hash,LdaImmutableCurrentContextSlotWideHandler,489858159
+builtin_hash,StarWideHandler,-1038662456
+builtin_hash,MovWideHandler,483803273
+builtin_hash,PushContextWideHandler,216419588
+builtin_hash,PopContextWideHandler,272986324
+builtin_hash,TestReferenceEqualWideHandler,-4739833
+builtin_hash,LdaGlobalWideHandler,-434470564
+builtin_hash,LdaGlobalInsideTypeofWideHandler,888730933
+builtin_hash,StaGlobalWideHandler,459118950
+builtin_hash,StaContextSlotWideHandler,888275701
+builtin_hash,StaCurrentContextSlotWideHandler,-317584552
+builtin_hash,LdaLookupGlobalSlotWideHandler,1026575020
+builtin_hash,GetNamedPropertyWideHandler,664403992
+builtin_hash,GetKeyedPropertyWideHandler,322108853
+builtin_hash,SetNamedPropertyWideHandler,784668777
+builtin_hash,DefineNamedOwnPropertyWideHandler,784668777
+builtin_hash,SetKeyedPropertyWideHandler,1015904043
+builtin_hash,DefineKeyedOwnPropertyWideHandler,1015904043
+builtin_hash,StaInArrayLiteralWideHandler,1015904043
+builtin_hash,AddWideHandler,1006647977
+builtin_hash,SubWideHandler,212325320
+builtin_hash,MulWideHandler,-922622067
+builtin_hash,DivWideHandler,145054418
+builtin_hash,BitwiseOrWideHandler,805505097
+builtin_hash,BitwiseAndWideHandler,563101073
+builtin_hash,ShiftLeftWideHandler,448918085
+builtin_hash,AddSmiWideHandler,-135072104
+builtin_hash,SubSmiWideHandler,-169078418
+builtin_hash,MulSmiWideHandler,793690226
+builtin_hash,DivSmiWideHandler,-657180043
+builtin_hash,ModSmiWideHandler,335754550
+builtin_hash,BitwiseOrSmiWideHandler,-1067934836
+builtin_hash,BitwiseXorSmiWideHandler,-668709153
+builtin_hash,BitwiseAndSmiWideHandler,-90084544
+builtin_hash,ShiftLeftSmiWideHandler,-381247703
+builtin_hash,ShiftRightSmiWideHandler,-38676513
+builtin_hash,ShiftRightLogicalSmiWideHandler,-1026231042
+builtin_hash,IncWideHandler,389395178
+builtin_hash,DecWideHandler,1062128797
+builtin_hash,NegateWideHandler,375542705
+builtin_hash,CallPropertyWideHandler,479651507
+builtin_hash,CallProperty0WideHandler,402451236
+builtin_hash,CallProperty1WideHandler,864866147
+builtin_hash,CallProperty2WideHandler,672960581
+builtin_hash,CallUndefinedReceiverWideHandler,633606056
+builtin_hash,CallUndefinedReceiver0WideHandler,-782323787
+builtin_hash,CallUndefinedReceiver1WideHandler,52355318
+builtin_hash,CallUndefinedReceiver2WideHandler,297430331
+builtin_hash,CallWithSpreadWideHandler,479651507
+builtin_hash,ConstructWideHandler,-923801363
+builtin_hash,TestEqualWideHandler,745861994
+builtin_hash,TestEqualStrictWideHandler,982796365
+builtin_hash,TestLessThanWideHandler,665221830
+builtin_hash,TestGreaterThanWideHandler,776130121
+builtin_hash,TestLessThanOrEqualWideHandler,-299580558
+builtin_hash,TestGreaterThanOrEqualWideHandler,-356242933
+builtin_hash,TestInstanceOfWideHandler,406240218
+builtin_hash,TestInWideHandler,-754759119
+builtin_hash,ToNumericWideHandler,1034444948
+builtin_hash,CreateRegExpLiteralWideHandler,1015965077
+builtin_hash,CreateArrayLiteralWideHandler,238187057
+builtin_hash,CreateEmptyArrayLiteralWideHandler,-21075025
+builtin_hash,CreateObjectLiteralWideHandler,570835533
+builtin_hash,CreateClosureWideHandler,912422636
+builtin_hash,CreateBlockContextWideHandler,499748521
+builtin_hash,CreateFunctionContextWideHandler,-887672919
+builtin_hash,JumpLoopWideHandler,714317010
+builtin_hash,JumpWideHandler,-420188660
+builtin_hash,JumpIfToBooleanTrueWideHandler,230302934
+builtin_hash,JumpIfToBooleanFalseWideHandler,237768975
+builtin_hash,JumpIfTrueWideHandler,814624851
+builtin_hash,JumpIfFalseWideHandler,814624851
+builtin_hash,SwitchOnSmiNoFeedbackWideHandler,623977068
+builtin_hash,ForInPrepareWideHandler,430965432
+builtin_hash,ForInNextWideHandler,-899950637
+builtin_hash,ThrowReferenceErrorIfHoleWideHandler,-575574526
+builtin_hash,GetIteratorWideHandler,-626454663
+builtin_hash,LdaSmiExtraWideHandler,465680004
+builtin_hash,LdaGlobalExtraWideHandler,1016564513
+builtin_hash,AddSmiExtraWideHandler,585533206
+builtin_hash,SubSmiExtraWideHandler,-88717151
+builtin_hash,MulSmiExtraWideHandler,-508453390
+builtin_hash,DivSmiExtraWideHandler,-542490757
+builtin_hash,BitwiseOrSmiExtraWideHandler,776661340
+builtin_hash,BitwiseXorSmiExtraWideHandler,276228867
+builtin_hash,BitwiseAndSmiExtraWideHandler,739058259
+builtin_hash,CallUndefinedReceiverExtraWideHandler,488508421
+builtin_hash,CallUndefinedReceiver1ExtraWideHandler,700320270
+builtin_hash,CallUndefinedReceiver2ExtraWideHandler,-7276189
diff --git a/deps/v8/tools/builtins-pgo/generate.py b/deps/v8/tools/builtins-pgo/generate.py
index 2a605fbed170ac..5eec3c15162784 100755
--- a/deps/v8/tools/builtins-pgo/generate.py
+++ b/deps/v8/tools/builtins-pgo/generate.py
@@ -19,6 +19,11 @@
     default=None,
     help='target cpu for V8 binary (for simulator builds), by default it\'s equal to `v8_target_cpu`'
 )
+parser.add_argument(
+    '--use-qemu',
+    default=False,
+    help='Use qemu for running cross-compiled V8 binary.',
+    action=argparse.BooleanOptionalAction)
 parser.add_argument(
     'benchmark_path',
     help='path to benchmark runner .js file, usually JetStream2\'s `cli.js`',
@@ -67,6 +72,15 @@ def build_d8(path, gn_args):
   exit(1)
 
 has_goma_str = "true" if try_start_goma() else "false"
+cmd_prefix = []
+if args.use_qemu:
+  if args.v8_target_cpu == "arm":
+    cmd_prefix = ["qemu-arm", "-L", "/usr/arm-linux-gnueabihf/"]
+  elif args.v8_target_cpu == "arm64":
+    cmd_prefix = ["qemu-aarch64", "-L", "/usr/aarch64-linux-gnu/"]
+  else:
+    print(f"{args.v8_target_cpu} binaries can't be run with qemu")
+    exit(1)
 
 GN_ARGS_TEMPLATE = f"""\
 is_debug = false
@@ -82,8 +96,10 @@ def build_d8(path, gn_args):
   benchmark_dir = args.benchmark_path.parent
   benchmark_file = args.benchmark_path.name
   log_path = (build_dir / "v8.builtins.pgo").absolute()
-  run([d8_path, f"--turbo-profiling-output={log_path}", benchmark_file],
-      cwd=benchmark_dir)
+  cmd = cmd_prefix + [
+      d8_path, f"--turbo-profiling-output={log_path}", benchmark_file
+  ]
+  run(cmd, cwd=benchmark_dir)
   get_hints_path = tools_pgo_dir / "get_hints.py"
   profile_path = tools_pgo_dir / f"{arch}.profile"
   run([get_hints_path, log_path, profile_path])
diff --git a/deps/v8/tools/builtins-pgo/x64.profile b/deps/v8/tools/builtins-pgo/x64.profile
index 8c44d60624bd07..d65ffe79e59dab 100644
--- a/deps/v8/tools/builtins-pgo/x64.profile
+++ b/deps/v8/tools/builtins-pgo/x64.profile
@@ -12,6 +12,7 @@ block_hint,RecordWriteIgnoreFP,6,7,0
 block_hint,RecordWriteIgnoreFP,19,20,0
 block_hint,RecordWriteIgnoreFP,9,10,0
 block_hint,RecordWriteIgnoreFP,25,26,0
+block_hint,RecordWriteIgnoreFP,15,16,1
 block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,19,20,1
 block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,43,44,0
 block_hint,Call_ReceiverIsNullOrUndefined_Baseline_Compact,83,84,0
@@ -245,291 +246,328 @@ block_hint,ToNumberConvertBigInt,9,10,1
 block_hint,Typeof,17,18,0
 block_hint,Typeof,9,10,0
 block_hint,Typeof,13,14,1
-block_hint,KeyedLoadIC_PolymorphicName,238,239,1
-block_hint,KeyedLoadIC_PolymorphicName,98,99,1
-block_hint,KeyedLoadIC_PolymorphicName,256,257,0
-block_hint,KeyedLoadIC_PolymorphicName,60,61,0
-block_hint,KeyedLoadIC_PolymorphicName,129,130,1
-block_hint,KeyedLoadIC_PolymorphicName,292,293,1
-block_hint,KeyedLoadIC_PolymorphicName,240,241,1
-block_hint,KeyedLoadIC_PolymorphicName,100,101,0
-block_hint,KeyedLoadIC_PolymorphicName,24,25,1
-block_hint,KeyedLoadIC_PolymorphicName,161,162,0
-block_hint,KeyedLoadIC_PolymorphicName,118,119,1
-block_hint,KeyedLoadIC_PolymorphicName,242,243,1
-block_hint,KeyedLoadIC_PolymorphicName,171,172,0
-block_hint,KeyedLoadIC_PolymorphicName,45,46,1
-block_hint,KeyedLoadIC_PolymorphicName,76,77,0
-block_hint,KeyedLoadIC_PolymorphicName,246,247,0
-block_hint,KeyedLoadIC_PolymorphicName,281,282,1
-block_hint,KeyedLoadIC_PolymorphicName,28,29,0
+block_hint,KeyedLoadIC_PolymorphicName,244,245,1
+block_hint,KeyedLoadIC_PolymorphicName,96,97,1
+block_hint,KeyedLoadIC_PolymorphicName,260,261,0
+block_hint,KeyedLoadIC_PolymorphicName,58,59,0
+block_hint,KeyedLoadIC_PolymorphicName,133,134,1
+block_hint,KeyedLoadIC_PolymorphicName,298,299,1
+block_hint,KeyedLoadIC_PolymorphicName,330,331,1
+block_hint,KeyedLoadIC_PolymorphicName,98,99,0
+block_hint,KeyedLoadIC_PolymorphicName,279,280,1
+block_hint,KeyedLoadIC_PolymorphicName,22,23,1
+block_hint,KeyedLoadIC_PolymorphicName,165,166,0
+block_hint,KeyedLoadIC_PolymorphicName,122,123,1
+block_hint,KeyedLoadIC_PolymorphicName,332,333,1
+block_hint,KeyedLoadIC_PolymorphicName,110,111,0
+block_hint,KeyedLoadIC_PolymorphicName,175,176,0
+block_hint,KeyedLoadIC_PolymorphicName,43,44,1
+block_hint,KeyedLoadIC_PolymorphicName,74,75,0
+block_hint,KeyedLoadIC_PolymorphicName,250,251,0
+block_hint,KeyedLoadIC_PolymorphicName,287,288,1
 block_hint,KeyedLoadIC_PolymorphicName,26,27,0
-block_hint,KeyedStoreIC_Megamorphic,375,376,1
-block_hint,KeyedStoreIC_Megamorphic,377,378,0
-block_hint,KeyedStoreIC_Megamorphic,1175,1176,0
-block_hint,KeyedStoreIC_Megamorphic,1177,1178,1
-block_hint,KeyedStoreIC_Megamorphic,1161,1162,1
-block_hint,KeyedStoreIC_Megamorphic,1110,1111,0
-block_hint,KeyedStoreIC_Megamorphic,905,906,1
+block_hint,KeyedLoadIC_PolymorphicName,24,25,0
 block_hint,KeyedStoreIC_Megamorphic,379,380,1
-block_hint,KeyedStoreIC_Megamorphic,1169,1170,0
-block_hint,KeyedStoreIC_Megamorphic,1154,1155,0
-block_hint,KeyedStoreIC_Megamorphic,597,598,0
-block_hint,KeyedStoreIC_Megamorphic,191,192,1
-block_hint,KeyedStoreIC_Megamorphic,1025,1026,0
-block_hint,KeyedStoreIC_Megamorphic,195,196,1
-block_hint,KeyedStoreIC_Megamorphic,197,198,0
-block_hint,KeyedStoreIC_Megamorphic,1104,1105,0
-block_hint,KeyedStoreIC_Megamorphic,1113,1114,0
-block_hint,KeyedStoreIC_Megamorphic,917,918,0
-block_hint,KeyedStoreIC_Megamorphic,487,488,0
-block_hint,KeyedStoreIC_Megamorphic,887,888,0
-block_hint,KeyedStoreIC_Megamorphic,921,922,0
-block_hint,KeyedStoreIC_Megamorphic,919,920,1
-block_hint,KeyedStoreIC_Megamorphic,489,490,1
-block_hint,KeyedStoreIC_Megamorphic,495,496,1
-block_hint,KeyedStoreIC_Megamorphic,497,498,0
-block_hint,KeyedStoreIC_Megamorphic,925,926,1
-block_hint,KeyedStoreIC_Megamorphic,499,500,0
-block_hint,KeyedStoreIC_Megamorphic,501,502,1
-block_hint,KeyedStoreIC_Megamorphic,923,924,1
-block_hint,KeyedStoreIC_Megamorphic,493,494,1
+block_hint,KeyedStoreIC_Megamorphic,381,382,0
+block_hint,KeyedStoreIC_Megamorphic,1216,1217,0
+block_hint,KeyedStoreIC_Megamorphic,1218,1219,1
+block_hint,KeyedStoreIC_Megamorphic,1203,1204,1
+block_hint,KeyedStoreIC_Megamorphic,1140,1141,0
+block_hint,KeyedStoreIC_Megamorphic,915,916,1
+block_hint,KeyedStoreIC_Megamorphic,383,384,1
+block_hint,KeyedStoreIC_Megamorphic,1228,1229,0
+block_hint,KeyedStoreIC_Megamorphic,1211,1212,0
+block_hint,KeyedStoreIC_Megamorphic,601,602,0
+block_hint,KeyedStoreIC_Megamorphic,746,747,1
+block_hint,KeyedStoreIC_Megamorphic,603,604,0
+block_hint,KeyedStoreIC_Megamorphic,1191,1192,0
+block_hint,KeyedStoreIC_Megamorphic,1041,1042,0
+block_hint,KeyedStoreIC_Megamorphic,1168,1169,0
+block_hint,KeyedStoreIC_Megamorphic,192,193,1
+block_hint,KeyedStoreIC_Megamorphic,194,195,0
+block_hint,KeyedStoreIC_Megamorphic,1134,1135,0
+block_hint,KeyedStoreIC_Megamorphic,1143,1144,0
+block_hint,KeyedStoreIC_Megamorphic,927,928,0
 block_hint,KeyedStoreIC_Megamorphic,491,492,0
-block_hint,KeyedStoreIC_Megamorphic,1087,1088,1
-block_hint,KeyedStoreIC_Megamorphic,1140,1141,1
-block_hint,KeyedStoreIC_Megamorphic,885,886,0
-block_hint,KeyedStoreIC_Megamorphic,347,348,1
-block_hint,KeyedStoreIC_Megamorphic,333,334,1
-block_hint,KeyedStoreIC_Megamorphic,1085,1086,1
-block_hint,KeyedStoreIC_Megamorphic,678,679,0
-block_hint,KeyedStoreIC_Megamorphic,535,536,0
-block_hint,KeyedStoreIC_Megamorphic,537,538,0
-block_hint,KeyedStoreIC_Megamorphic,1029,1030,0
-block_hint,KeyedStoreIC_Megamorphic,543,544,1
-block_hint,KeyedStoreIC_Megamorphic,600,601,0
-block_hint,KeyedStoreIC_Megamorphic,545,546,0
+block_hint,KeyedStoreIC_Megamorphic,895,896,0
+block_hint,KeyedStoreIC_Megamorphic,931,932,0
+block_hint,KeyedStoreIC_Megamorphic,929,930,1
+block_hint,KeyedStoreIC_Megamorphic,493,494,1
+block_hint,KeyedStoreIC_Megamorphic,499,500,1
+block_hint,KeyedStoreIC_Megamorphic,501,502,0
+block_hint,KeyedStoreIC_Megamorphic,935,936,1
+block_hint,KeyedStoreIC_Megamorphic,503,504,0
+block_hint,KeyedStoreIC_Megamorphic,505,506,1
+block_hint,KeyedStoreIC_Megamorphic,933,934,1
+block_hint,KeyedStoreIC_Megamorphic,497,498,1
+block_hint,KeyedStoreIC_Megamorphic,495,496,0
+block_hint,KeyedStoreIC_Megamorphic,1115,1116,1
+block_hint,KeyedStoreIC_Megamorphic,1177,1178,1
+block_hint,KeyedStoreIC_Megamorphic,893,894,0
+block_hint,KeyedStoreIC_Megamorphic,350,351,1
+block_hint,KeyedStoreIC_Megamorphic,336,337,1
+block_hint,KeyedStoreIC_Megamorphic,1113,1114,1
+block_hint,KeyedStoreIC_Megamorphic,683,684,0
+block_hint,KeyedStoreIC_Megamorphic,539,540,0
+block_hint,KeyedStoreIC_Megamorphic,541,542,0
+block_hint,KeyedStoreIC_Megamorphic,1045,1046,0
 block_hint,KeyedStoreIC_Megamorphic,547,548,1
-block_hint,KeyedStoreIC_Megamorphic,203,204,1
+block_hint,KeyedStoreIC_Megamorphic,1071,1072,0
+block_hint,KeyedStoreIC_Megamorphic,606,607,0
+block_hint,KeyedStoreIC_Megamorphic,1193,1194,0
 block_hint,KeyedStoreIC_Megamorphic,549,550,0
-block_hint,KeyedStoreIC_Megamorphic,205,206,0
-block_hint,KeyedStoreIC_Megamorphic,207,208,0
-block_hint,KeyedStoreIC_Megamorphic,940,941,0
+block_hint,KeyedStoreIC_Megamorphic,1047,1048,0
 block_hint,KeyedStoreIC_Megamorphic,551,552,1
+block_hint,KeyedStoreIC_Megamorphic,200,201,1
 block_hint,KeyedStoreIC_Megamorphic,553,554,0
+block_hint,KeyedStoreIC_Megamorphic,202,203,0
+block_hint,KeyedStoreIC_Megamorphic,204,205,0
+block_hint,KeyedStoreIC_Megamorphic,950,951,0
 block_hint,KeyedStoreIC_Megamorphic,555,556,1
 block_hint,KeyedStoreIC_Megamorphic,557,558,0
-block_hint,KeyedStoreIC_Megamorphic,1118,1119,0
 block_hint,KeyedStoreIC_Megamorphic,559,560,1
-block_hint,KeyedStoreIC_Megamorphic,894,895,0
-block_hint,KeyedStoreIC_Megamorphic,1120,1121,0
-block_hint,KeyedStoreIC_Megamorphic,561,562,1
-block_hint,KeyedStoreIC_Megamorphic,567,568,1
-block_hint,KeyedStoreIC_Megamorphic,569,570,0
-block_hint,KeyedStoreIC_Megamorphic,571,572,0
-block_hint,KeyedStoreIC_Megamorphic,573,574,1
-block_hint,KeyedStoreIC_Megamorphic,947,948,1
+block_hint,KeyedStoreIC_Megamorphic,561,562,0
+block_hint,KeyedStoreIC_Megamorphic,1148,1149,0
+block_hint,KeyedStoreIC_Megamorphic,563,564,1
+block_hint,KeyedStoreIC_Megamorphic,902,903,0
+block_hint,KeyedStoreIC_Megamorphic,1150,1151,0
 block_hint,KeyedStoreIC_Megamorphic,565,566,1
-block_hint,KeyedStoreIC_Megamorphic,563,564,0
-block_hint,KeyedStoreIC_Megamorphic,1173,1174,0
-block_hint,KeyedStoreIC_Megamorphic,1186,1187,1
-block_hint,KeyedStoreIC_Megamorphic,1183,1184,1
-block_hint,KeyedStoreIC_Megamorphic,1102,1103,1
-block_hint,KeyedStoreIC_Megamorphic,964,965,1
-block_hint,KeyedStoreIC_Megamorphic,209,210,0
-block_hint,KeyedStoreIC_Megamorphic,359,360,0
-block_hint,KeyedStoreIC_Megamorphic,605,606,1
-block_hint,KeyedStoreIC_Megamorphic,1013,1014,0
-block_hint,KeyedStoreIC_Megamorphic,688,689,0
+block_hint,KeyedStoreIC_Megamorphic,571,572,1
+block_hint,KeyedStoreIC_Megamorphic,573,574,0
 block_hint,KeyedStoreIC_Megamorphic,575,576,0
-block_hint,KeyedStoreIC_Megamorphic,168,169,1
-block_hint,KeyedStoreIC_Megamorphic,577,578,0
+block_hint,KeyedStoreIC_Megamorphic,577,578,1
+block_hint,KeyedStoreIC_Megamorphic,957,958,1
+block_hint,KeyedStoreIC_Megamorphic,569,570,1
+block_hint,KeyedStoreIC_Megamorphic,567,568,0
+block_hint,KeyedStoreIC_Megamorphic,1214,1215,0
+block_hint,KeyedStoreIC_Megamorphic,1231,1232,1
+block_hint,KeyedStoreIC_Megamorphic,1224,1225,1
+block_hint,KeyedStoreIC_Megamorphic,1130,1131,1
+block_hint,KeyedStoreIC_Megamorphic,975,976,1
+block_hint,KeyedStoreIC_Megamorphic,206,207,0
+block_hint,KeyedStoreIC_Megamorphic,362,363,0
+block_hint,KeyedStoreIC_Megamorphic,977,978,1
+block_hint,KeyedStoreIC_Megamorphic,214,215,0
+block_hint,KeyedStoreIC_Megamorphic,1027,1028,0
+block_hint,KeyedStoreIC_Megamorphic,693,694,0
 block_hint,KeyedStoreIC_Megamorphic,579,580,0
-block_hint,KeyedStoreIC_Megamorphic,1034,1035,0
-block_hint,KeyedStoreIC_Megamorphic,581,582,1
-block_hint,KeyedStoreIC_Megamorphic,953,954,0
-block_hint,KeyedStoreIC_Megamorphic,970,971,0
-block_hint,KeyedStoreIC_Megamorphic,749,750,1
-block_hint,KeyedStoreIC_Megamorphic,221,222,1
-block_hint,KeyedStoreIC_Megamorphic,1036,1037,0
-block_hint,KeyedStoreIC_Megamorphic,227,228,0
-block_hint,KeyedStoreIC_Megamorphic,753,754,0
-block_hint,KeyedStoreIC_Megamorphic,589,590,0
-block_hint,KeyedStoreIC_Megamorphic,1106,1107,0
-block_hint,KeyedStoreIC_Megamorphic,1143,1144,0
-block_hint,KeyedStoreIC_Megamorphic,896,897,0
-block_hint,KeyedStoreIC_Megamorphic,174,175,1
-block_hint,KeyedStoreIC_Megamorphic,176,177,1
-block_hint,KeyedStoreIC_Megamorphic,369,370,0
-block_hint,KeyedStoreIC_Megamorphic,178,179,1
-block_hint,KeyedStoreIC_Megamorphic,371,372,0
-block_hint,KeyedStoreIC_Megamorphic,180,181,1
-block_hint,KeyedStoreIC_Megamorphic,233,234,0
-block_hint,KeyedStoreIC_Megamorphic,182,183,1
-block_hint,KeyedStoreIC_Megamorphic,184,185,1
-block_hint,KeyedStoreIC_Megamorphic,1018,1019,0
-block_hint,KeyedStoreIC_Megamorphic,186,187,1
-block_hint,KeyedStoreIC_Megamorphic,915,916,1
-block_hint,KeyedStoreIC_Megamorphic,481,482,1
-block_hint,KeyedStoreIC_Megamorphic,728,729,0
-block_hint,KeyedStoreIC_Megamorphic,909,910,1
-block_hint,KeyedStoreIC_Megamorphic,409,410,0
-block_hint,KeyedStoreIC_Megamorphic,411,412,0
-block_hint,KeyedStoreIC_Megamorphic,251,252,1
+block_hint,KeyedStoreIC_Megamorphic,167,168,1
+block_hint,KeyedStoreIC_Megamorphic,581,582,0
+block_hint,KeyedStoreIC_Megamorphic,583,584,0
+block_hint,KeyedStoreIC_Megamorphic,1054,1055,0
+block_hint,KeyedStoreIC_Megamorphic,585,586,1
+block_hint,KeyedStoreIC_Megamorphic,963,964,0
+block_hint,KeyedStoreIC_Megamorphic,1174,1175,0
+block_hint,KeyedStoreIC_Megamorphic,1056,1057,1
+block_hint,KeyedStoreIC_Megamorphic,759,760,1
+block_hint,KeyedStoreIC_Megamorphic,612,613,0
+block_hint,KeyedStoreIC_Megamorphic,1196,1197,0
+block_hint,KeyedStoreIC_Megamorphic,1058,1059,0
+block_hint,KeyedStoreIC_Megamorphic,1172,1173,0
+block_hint,KeyedStoreIC_Megamorphic,224,225,0
+block_hint,KeyedStoreIC_Megamorphic,761,762,0
+block_hint,KeyedStoreIC_Megamorphic,593,594,0
+block_hint,KeyedStoreIC_Megamorphic,1136,1137,0
+block_hint,KeyedStoreIC_Megamorphic,1180,1181,0
+block_hint,KeyedStoreIC_Megamorphic,906,907,0
+block_hint,KeyedStoreIC_Megamorphic,173,174,1
+block_hint,KeyedStoreIC_Megamorphic,175,176,1
+block_hint,KeyedStoreIC_Megamorphic,373,374,0
+block_hint,KeyedStoreIC_Megamorphic,177,178,1
+block_hint,KeyedStoreIC_Megamorphic,375,376,0
+block_hint,KeyedStoreIC_Megamorphic,179,180,1
+block_hint,KeyedStoreIC_Megamorphic,234,235,0
+block_hint,KeyedStoreIC_Megamorphic,236,237,0
+block_hint,KeyedStoreIC_Megamorphic,181,182,1
+block_hint,KeyedStoreIC_Megamorphic,183,184,1
+block_hint,KeyedStoreIC_Megamorphic,1032,1033,0
+block_hint,KeyedStoreIC_Megamorphic,185,186,1
+block_hint,KeyedStoreIC_Megamorphic,925,926,1
+block_hint,KeyedStoreIC_Megamorphic,485,486,1
+block_hint,KeyedStoreIC_Megamorphic,733,734,0
+block_hint,KeyedStoreIC_Megamorphic,919,920,1
 block_hint,KeyedStoreIC_Megamorphic,413,414,0
-block_hint,KeyedStoreIC_Megamorphic,625,626,1
-block_hint,KeyedStoreIC_Megamorphic,93,94,1
-block_hint,KeyedStoreIC_Megamorphic,95,96,0
-block_hint,KeyedStoreIC_Megamorphic,761,762,1
-block_hint,KeyedStoreIC_Megamorphic,383,384,0
-block_hint,KeyedStoreIC_Megamorphic,634,635,1
-block_hint,KeyedStoreIC_Megamorphic,65,66,1
-block_hint,KeyedStoreIC_Megamorphic,67,68,0
-block_hint,DefineKeyedOwnIC_Megamorphic,310,311,1
-block_hint,DefineKeyedOwnIC_Megamorphic,312,313,0
-block_hint,DefineKeyedOwnIC_Megamorphic,865,866,0
-block_hint,DefineKeyedOwnIC_Megamorphic,418,419,0
-block_hint,DefineKeyedOwnIC_Megamorphic,416,417,1
-block_hint,DefineKeyedOwnIC_Megamorphic,794,795,0
-block_hint,DefineKeyedOwnIC_Megamorphic,570,571,1
-block_hint,DefineKeyedOwnIC_Megamorphic,593,594,1
-block_hint,DefineKeyedOwnIC_Megamorphic,230,231,0
+block_hint,KeyedStoreIC_Megamorphic,415,416,0
+block_hint,KeyedStoreIC_Megamorphic,254,255,1
+block_hint,KeyedStoreIC_Megamorphic,417,418,0
+block_hint,KeyedStoreIC_Megamorphic,630,631,1
+block_hint,KeyedStoreIC_Megamorphic,92,93,1
+block_hint,KeyedStoreIC_Megamorphic,94,95,0
+block_hint,KeyedStoreIC_Megamorphic,769,770,1
+block_hint,KeyedStoreIC_Megamorphic,387,388,0
+block_hint,KeyedStoreIC_Megamorphic,639,640,1
+block_hint,KeyedStoreIC_Megamorphic,64,65,1
+block_hint,KeyedStoreIC_Megamorphic,66,67,0
+block_hint,DefineKeyedOwnIC_Megamorphic,312,313,1
+block_hint,DefineKeyedOwnIC_Megamorphic,314,315,0
+block_hint,DefineKeyedOwnIC_Megamorphic,887,888,0
+block_hint,DefineKeyedOwnIC_Megamorphic,420,421,0
+block_hint,DefineKeyedOwnIC_Megamorphic,418,419,1
+block_hint,DefineKeyedOwnIC_Megamorphic,803,804,0
+block_hint,DefineKeyedOwnIC_Megamorphic,575,576,1
+block_hint,DefineKeyedOwnIC_Megamorphic,601,602,1
+block_hint,DefineKeyedOwnIC_Megamorphic,232,233,0
 block_hint,DefineKeyedOwnIC_Megamorphic,53,54,1
 block_hint,DefineKeyedOwnIC_Megamorphic,55,56,0
-block_hint,LoadGlobalIC_NoFeedback,39,40,1
+block_hint,LoadGlobalIC_NoFeedback,41,42,1
 block_hint,LoadGlobalIC_NoFeedback,6,7,1
 block_hint,LoadGlobalIC_NoFeedback,8,9,1
 block_hint,LoadGlobalIC_NoFeedback,10,11,1
 block_hint,LoadGlobalIC_NoFeedback,12,13,1
-block_hint,LoadGlobalIC_NoFeedback,28,29,1
-block_hint,LoadGlobalIC_NoFeedback,43,44,1
+block_hint,LoadGlobalIC_NoFeedback,31,32,1
+block_hint,LoadGlobalIC_NoFeedback,49,50,1
 block_hint,LoadGlobalIC_NoFeedback,18,19,1
+block_hint,LoadGlobalIC_NoFeedback,27,28,0
 block_hint,LoadGlobalIC_NoFeedback,14,15,1
-block_hint,LoadGlobalIC_NoFeedback,30,31,0
+block_hint,LoadGlobalIC_NoFeedback,33,34,0
 block_hint,LoadGlobalIC_NoFeedback,16,17,1
 block_hint,LoadGlobalIC_NoFeedback,20,21,1
 block_hint,LoadGlobalIC_NoFeedback,22,23,0
 block_hint,LoadGlobalIC_NoFeedback,24,25,1
 block_hint,LoadIC_FunctionPrototype,2,3,0
 block_hint,LoadIC_FunctionPrototype,4,5,1
-block_hint,LoadIC_NoFeedback,93,94,1
-block_hint,LoadIC_NoFeedback,95,96,0
-block_hint,LoadIC_NoFeedback,277,278,1
-block_hint,LoadIC_NoFeedback,212,213,0
-block_hint,LoadIC_NoFeedback,201,202,1
-block_hint,LoadIC_NoFeedback,265,266,0
-block_hint,LoadIC_NoFeedback,56,57,1
-block_hint,LoadIC_NoFeedback,267,268,0
-block_hint,LoadIC_NoFeedback,58,59,0
-block_hint,LoadIC_NoFeedback,291,292,1
-block_hint,LoadIC_NoFeedback,253,254,0
-block_hint,LoadIC_NoFeedback,270,271,1
-block_hint,LoadIC_NoFeedback,138,139,1
-block_hint,LoadIC_NoFeedback,23,24,1
-block_hint,LoadIC_NoFeedback,36,37,1
-block_hint,LoadIC_NoFeedback,126,127,1
-block_hint,LoadIC_NoFeedback,140,141,0
-block_hint,LoadIC_NoFeedback,121,122,0
-block_hint,LoadIC_NoFeedback,242,243,0
-block_hint,LoadIC_NoFeedback,235,236,0
-block_hint,LoadIC_NoFeedback,144,145,1
-block_hint,LoadIC_NoFeedback,146,147,0
-block_hint,LoadIC_NoFeedback,73,74,1
-block_hint,LoadIC_NoFeedback,150,151,0
-block_hint,LoadIC_NoFeedback,75,76,0
-block_hint,LoadIC_NoFeedback,159,160,1
-block_hint,LoadIC_NoFeedback,293,294,1
-block_hint,LoadIC_NoFeedback,259,260,0
-block_hint,LoadIC_NoFeedback,257,258,0
-block_hint,LoadIC_NoFeedback,228,229,1
-block_hint,LoadIC_NoFeedback,131,132,1
-block_hint,LoadIC_NoFeedback,89,90,0
-block_hint,StoreIC_NoFeedback,143,144,1
-block_hint,StoreIC_NoFeedback,145,146,0
-block_hint,StoreIC_NoFeedback,427,428,0
-block_hint,StoreIC_NoFeedback,61,62,1
-block_hint,StoreIC_NoFeedback,63,64,0
-block_hint,StoreIC_NoFeedback,467,468,0
-block_hint,StoreIC_NoFeedback,357,358,0
-block_hint,StoreIC_NoFeedback,147,148,0
-block_hint,StoreIC_NoFeedback,341,342,0
-block_hint,StoreIC_NoFeedback,149,150,1
-block_hint,StoreIC_NoFeedback,155,156,1
-block_hint,StoreIC_NoFeedback,157,158,0
-block_hint,StoreIC_NoFeedback,159,160,0
-block_hint,StoreIC_NoFeedback,153,154,1
+block_hint,LoadIC_NoFeedback,97,98,1
+block_hint,LoadIC_NoFeedback,99,100,0
+block_hint,LoadIC_NoFeedback,306,307,1
+block_hint,LoadIC_NoFeedback,226,227,0
+block_hint,LoadIC_NoFeedback,285,286,1
+block_hint,LoadIC_NoFeedback,141,142,0
+block_hint,LoadIC_NoFeedback,320,321,0
+block_hint,LoadIC_NoFeedback,287,288,0
+block_hint,LoadIC_NoFeedback,302,303,0
+block_hint,LoadIC_NoFeedback,53,54,1
+block_hint,LoadIC_NoFeedback,289,290,0
+block_hint,LoadIC_NoFeedback,55,56,0
+block_hint,LoadIC_NoFeedback,324,325,1
+block_hint,LoadIC_NoFeedback,272,273,0
+block_hint,LoadIC_NoFeedback,295,296,1
+block_hint,LoadIC_NoFeedback,247,248,1
+block_hint,LoadIC_NoFeedback,59,60,0
+block_hint,LoadIC_NoFeedback,22,23,1
+block_hint,LoadIC_NoFeedback,35,36,1
+block_hint,LoadIC_NoFeedback,130,131,1
+block_hint,LoadIC_NoFeedback,145,146,0
+block_hint,LoadIC_NoFeedback,125,126,0
+block_hint,LoadIC_NoFeedback,261,262,0
+block_hint,LoadIC_NoFeedback,250,251,0
+block_hint,LoadIC_NoFeedback,149,150,1
+block_hint,LoadIC_NoFeedback,167,168,0
+block_hint,LoadIC_NoFeedback,322,323,0
+block_hint,LoadIC_NoFeedback,151,152,0
+block_hint,LoadIC_NoFeedback,291,292,0
+block_hint,LoadIC_NoFeedback,70,71,1
+block_hint,LoadIC_NoFeedback,155,156,0
+block_hint,LoadIC_NoFeedback,72,73,0
+block_hint,LoadIC_NoFeedback,254,255,1
+block_hint,LoadIC_NoFeedback,76,77,0
+block_hint,LoadIC_NoFeedback,326,327,1
+block_hint,LoadIC_NoFeedback,278,279,0
+block_hint,LoadIC_NoFeedback,276,277,0
+block_hint,LoadIC_NoFeedback,242,243,1
+block_hint,LoadIC_NoFeedback,135,136,1
+block_hint,LoadIC_NoFeedback,93,94,0
+block_hint,StoreIC_NoFeedback,147,148,1
+block_hint,StoreIC_NoFeedback,149,150,0
+block_hint,StoreIC_NoFeedback,259,260,0
+block_hint,StoreIC_NoFeedback,549,550,0
+block_hint,StoreIC_NoFeedback,443,444,0
+block_hint,StoreIC_NoFeedback,527,528,0
+block_hint,StoreIC_NoFeedback,58,59,1
+block_hint,StoreIC_NoFeedback,60,61,0
+block_hint,StoreIC_NoFeedback,498,499,0
+block_hint,StoreIC_NoFeedback,367,368,0
 block_hint,StoreIC_NoFeedback,151,152,0
-block_hint,StoreIC_NoFeedback,497,498,1
-block_hint,StoreIC_NoFeedback,371,372,1
-block_hint,StoreIC_NoFeedback,175,176,0
-block_hint,StoreIC_NoFeedback,488,489,1
-block_hint,StoreIC_NoFeedback,195,196,0
-block_hint,StoreIC_NoFeedback,197,198,0
-block_hint,StoreIC_NoFeedback,431,432,0
-block_hint,StoreIC_NoFeedback,203,204,1
-block_hint,StoreIC_NoFeedback,256,257,0
-block_hint,StoreIC_NoFeedback,205,206,0
-block_hint,StoreIC_NoFeedback,69,70,1
+block_hint,StoreIC_NoFeedback,349,350,0
+block_hint,StoreIC_NoFeedback,153,154,1
+block_hint,StoreIC_NoFeedback,159,160,1
+block_hint,StoreIC_NoFeedback,161,162,0
+block_hint,StoreIC_NoFeedback,163,164,0
+block_hint,StoreIC_NoFeedback,157,158,1
+block_hint,StoreIC_NoFeedback,155,156,0
+block_hint,StoreIC_NoFeedback,536,537,1
+block_hint,StoreIC_NoFeedback,381,382,1
+block_hint,StoreIC_NoFeedback,179,180,0
+block_hint,StoreIC_NoFeedback,519,520,1
+block_hint,StoreIC_NoFeedback,199,200,0
+block_hint,StoreIC_NoFeedback,201,202,0
+block_hint,StoreIC_NoFeedback,447,448,0
+block_hint,StoreIC_NoFeedback,207,208,1
+block_hint,StoreIC_NoFeedback,473,474,0
+block_hint,StoreIC_NoFeedback,262,263,0
+block_hint,StoreIC_NoFeedback,551,552,0
 block_hint,StoreIC_NoFeedback,209,210,0
-block_hint,StoreIC_NoFeedback,71,72,0
-block_hint,StoreIC_NoFeedback,380,381,0
-block_hint,StoreIC_NoFeedback,211,212,1
+block_hint,StoreIC_NoFeedback,449,450,0
+block_hint,StoreIC_NoFeedback,66,67,1
 block_hint,StoreIC_NoFeedback,213,214,0
+block_hint,StoreIC_NoFeedback,68,69,0
+block_hint,StoreIC_NoFeedback,390,391,0
 block_hint,StoreIC_NoFeedback,215,216,1
 block_hint,StoreIC_NoFeedback,217,218,0
-block_hint,StoreIC_NoFeedback,478,479,0
 block_hint,StoreIC_NoFeedback,219,220,1
-block_hint,StoreIC_NoFeedback,348,349,0
-block_hint,StoreIC_NoFeedback,480,481,0
-block_hint,StoreIC_NoFeedback,383,384,1
-block_hint,StoreIC_NoFeedback,227,228,1
-block_hint,StoreIC_NoFeedback,229,230,0
-block_hint,StoreIC_NoFeedback,231,232,0
-block_hint,StoreIC_NoFeedback,233,234,1
-block_hint,StoreIC_NoFeedback,223,224,0
-block_hint,StoreIC_NoFeedback,519,520,0
-block_hint,StoreIC_NoFeedback,465,466,1
-block_hint,StoreIC_NoFeedback,402,403,1
-block_hint,StoreIC_NoFeedback,75,76,0
-block_hint,StoreIC_NoFeedback,81,82,0
-block_hint,StoreIC_NoFeedback,127,128,0
-block_hint,StoreIC_NoFeedback,261,262,1
-block_hint,StoreIC_NoFeedback,83,84,0
-block_hint,StoreIC_NoFeedback,237,238,0
-block_hint,StoreIC_NoFeedback,239,240,0
-block_hint,StoreIC_NoFeedback,436,437,0
-block_hint,StoreIC_NoFeedback,241,242,1
-block_hint,StoreIC_NoFeedback,482,483,0
-block_hint,StoreIC_NoFeedback,393,394,0
-block_hint,StoreIC_NoFeedback,320,321,1
-block_hint,StoreIC_NoFeedback,438,439,0
-block_hint,StoreIC_NoFeedback,93,94,0
-block_hint,StoreIC_NoFeedback,324,325,0
-block_hint,StoreIC_NoFeedback,264,265,1
-block_hint,StoreIC_NoFeedback,97,98,0
-block_hint,StoreIC_NoFeedback,249,250,0
-block_hint,StoreIC_NoFeedback,251,252,1
-block_hint,StoreIC_NoFeedback,352,353,0
-block_hint,StoreIC_NoFeedback,41,42,1
-block_hint,StoreIC_NoFeedback,43,44,1
-block_hint,StoreIC_NoFeedback,137,138,0
-block_hint,StoreIC_NoFeedback,45,46,1
-block_hint,StoreIC_NoFeedback,139,140,0
-block_hint,StoreIC_NoFeedback,47,48,1
-block_hint,StoreIC_NoFeedback,99,100,0
-block_hint,StoreIC_NoFeedback,49,50,1
-block_hint,StoreIC_NoFeedback,51,52,1
-block_hint,StoreIC_NoFeedback,425,426,0
-block_hint,StoreIC_NoFeedback,53,54,1
-block_hint,DefineNamedOwnIC_NoFeedback,78,79,1
-block_hint,DefineNamedOwnIC_NoFeedback,80,81,0
-block_hint,DefineNamedOwnIC_NoFeedback,195,196,0
-block_hint,DefineNamedOwnIC_NoFeedback,150,151,1
-block_hint,DefineNamedOwnIC_NoFeedback,201,202,0
-block_hint,DefineNamedOwnIC_NoFeedback,152,153,1
-block_hint,DefineNamedOwnIC_NoFeedback,38,39,1
-block_hint,DefineNamedOwnIC_NoFeedback,84,85,0
+block_hint,StoreIC_NoFeedback,221,222,0
+block_hint,StoreIC_NoFeedback,509,510,0
+block_hint,StoreIC_NoFeedback,223,224,1
+block_hint,StoreIC_NoFeedback,356,357,0
+block_hint,StoreIC_NoFeedback,511,512,0
+block_hint,StoreIC_NoFeedback,393,394,1
+block_hint,StoreIC_NoFeedback,231,232,1
+block_hint,StoreIC_NoFeedback,233,234,0
+block_hint,StoreIC_NoFeedback,235,236,0
+block_hint,StoreIC_NoFeedback,237,238,1
+block_hint,StoreIC_NoFeedback,227,228,0
+block_hint,StoreIC_NoFeedback,564,565,0
+block_hint,StoreIC_NoFeedback,494,495,1
+block_hint,StoreIC_NoFeedback,413,414,1
+block_hint,StoreIC_NoFeedback,72,73,0
+block_hint,StoreIC_NoFeedback,78,79,0
+block_hint,StoreIC_NoFeedback,130,131,0
+block_hint,StoreIC_NoFeedback,415,416,1
+block_hint,StoreIC_NoFeedback,80,81,0
+block_hint,StoreIC_NoFeedback,82,83,0
+block_hint,StoreIC_NoFeedback,241,242,0
+block_hint,StoreIC_NoFeedback,243,244,0
+block_hint,StoreIC_NoFeedback,456,457,0
+block_hint,StoreIC_NoFeedback,245,246,1
+block_hint,StoreIC_NoFeedback,513,514,0
+block_hint,StoreIC_NoFeedback,403,404,0
+block_hint,StoreIC_NoFeedback,458,459,1
+block_hint,StoreIC_NoFeedback,268,269,0
+block_hint,StoreIC_NoFeedback,553,554,0
+block_hint,StoreIC_NoFeedback,460,461,0
+block_hint,StoreIC_NoFeedback,531,532,0
+block_hint,StoreIC_NoFeedback,90,91,0
+block_hint,StoreIC_NoFeedback,332,333,0
+block_hint,StoreIC_NoFeedback,420,421,1
+block_hint,StoreIC_NoFeedback,94,95,0
+block_hint,StoreIC_NoFeedback,96,97,0
+block_hint,StoreIC_NoFeedback,253,254,0
+block_hint,StoreIC_NoFeedback,255,256,1
+block_hint,StoreIC_NoFeedback,362,363,0
+block_hint,StoreIC_NoFeedback,40,41,1
+block_hint,StoreIC_NoFeedback,42,43,1
+block_hint,StoreIC_NoFeedback,141,142,0
+block_hint,StoreIC_NoFeedback,44,45,1
+block_hint,StoreIC_NoFeedback,143,144,0
+block_hint,StoreIC_NoFeedback,46,47,1
+block_hint,StoreIC_NoFeedback,100,101,0
+block_hint,StoreIC_NoFeedback,102,103,0
+block_hint,StoreIC_NoFeedback,48,49,1
+block_hint,StoreIC_NoFeedback,50,51,1
+block_hint,StoreIC_NoFeedback,439,440,0
+block_hint,StoreIC_NoFeedback,52,53,1
+block_hint,DefineNamedOwnIC_NoFeedback,80,81,1
+block_hint,DefineNamedOwnIC_NoFeedback,82,83,0
+block_hint,DefineNamedOwnIC_NoFeedback,236,237,0
+block_hint,DefineNamedOwnIC_NoFeedback,210,211,1
+block_hint,DefineNamedOwnIC_NoFeedback,136,137,0
+block_hint,DefineNamedOwnIC_NoFeedback,239,240,0
+block_hint,DefineNamedOwnIC_NoFeedback,212,213,0
+block_hint,DefineNamedOwnIC_NoFeedback,234,235,0
+block_hint,DefineNamedOwnIC_NoFeedback,157,158,1
+block_hint,DefineNamedOwnIC_NoFeedback,36,37,1
+block_hint,DefineNamedOwnIC_NoFeedback,86,87,0
+block_hint,DefineNamedOwnIC_NoFeedback,38,39,0
 block_hint,DefineNamedOwnIC_NoFeedback,40,41,0
-block_hint,DefineNamedOwnIC_NoFeedback,42,43,0
 block_hint,KeyedLoadIC_SloppyArguments,12,13,0
 block_hint,KeyedLoadIC_SloppyArguments,14,15,1
 block_hint,KeyedLoadIC_SloppyArguments,4,5,1
@@ -606,7 +644,6 @@ block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,489,490,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,265,266,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,661,662,1
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,492,493,1
-block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,271,272,1
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,587,588,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,455,456,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,214,215,0
@@ -625,7 +662,6 @@ block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,459,460,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,219,220,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,561,562,1
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,182,183,0
-block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,184,185,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,645,646,1
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,461,462,0
 block_hint,StoreFastElementIC_GrowNoTransitionHandleCOW,36,37,1
@@ -723,16 +759,17 @@ block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,1059,1060,1
 block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,703,704,0
 block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,62,63,1
 block_hint,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,95,96,0
-block_hint,KeyedHasIC_PolymorphicName,61,62,1
-block_hint,KeyedHasIC_PolymorphicName,32,33,1
-block_hint,KeyedHasIC_PolymorphicName,28,29,0
+block_hint,KeyedHasIC_PolymorphicName,69,70,1
+block_hint,KeyedHasIC_PolymorphicName,28,29,1
+block_hint,KeyedHasIC_PolymorphicName,24,25,0
+block_hint,KeyedHasIC_PolymorphicName,26,27,0
+block_hint,KeyedHasIC_PolymorphicName,55,56,1
+block_hint,KeyedHasIC_PolymorphicName,89,90,1
+block_hint,KeyedHasIC_PolymorphicName,93,94,1
 block_hint,KeyedHasIC_PolymorphicName,30,31,0
-block_hint,KeyedHasIC_PolymorphicName,47,48,1
-block_hint,KeyedHasIC_PolymorphicName,83,84,1
-block_hint,KeyedHasIC_PolymorphicName,63,64,1
-block_hint,KeyedHasIC_PolymorphicName,14,15,0
+block_hint,KeyedHasIC_PolymorphicName,78,79,1
+block_hint,KeyedHasIC_PolymorphicName,14,15,1
 block_hint,KeyedHasIC_PolymorphicName,16,17,1
-block_hint,KeyedHasIC_PolymorphicName,18,19,1
 block_hint,EnqueueMicrotask,4,5,0
 block_hint,EnqueueMicrotask,2,3,0
 block_hint,RunMicrotasks,18,19,0
@@ -742,111 +779,118 @@ block_hint,RunMicrotasks,36,37,1
 block_hint,RunMicrotasks,85,86,0
 block_hint,RunMicrotasks,67,68,0
 block_hint,RunMicrotasks,38,39,1
-block_hint,HasProperty,133,134,1
-block_hint,HasProperty,135,136,1
-block_hint,HasProperty,253,254,0
-block_hint,HasProperty,207,208,1
-block_hint,HasProperty,245,246,0
-block_hint,HasProperty,93,94,0
-block_hint,HasProperty,228,229,1
-block_hint,HasProperty,119,120,1
 block_hint,HasProperty,137,138,1
-block_hint,HasProperty,195,196,0
-block_hint,HasProperty,197,198,0
+block_hint,HasProperty,139,140,1
+block_hint,HasProperty,263,264,0
+block_hint,HasProperty,211,212,1
+block_hint,HasProperty,254,255,0
 block_hint,HasProperty,97,98,0
-block_hint,HasProperty,95,96,0
-block_hint,HasProperty,241,242,0
-block_hint,HasProperty,232,233,0
-block_hint,HasProperty,199,200,1
-block_hint,HasProperty,249,250,0
-block_hint,HasProperty,201,202,1
-block_hint,HasProperty,45,46,1
-block_hint,HasProperty,63,64,0
-block_hint,HasProperty,47,48,0
-block_hint,HasProperty,103,104,1
-block_hint,HasProperty,51,52,0
-block_hint,HasProperty,258,259,0
-block_hint,HasProperty,222,223,0
-block_hint,HasProperty,39,40,0
-block_hint,DeleteProperty,35,36,1
-block_hint,DeleteProperty,60,61,0
-block_hint,DeleteProperty,37,38,0
-block_hint,DeleteProperty,64,65,1
-block_hint,DeleteProperty,86,87,0
-block_hint,DeleteProperty,69,70,0
-block_hint,DeleteProperty,62,63,1
-block_hint,DeleteProperty,54,55,1
-block_hint,DeleteProperty,39,40,1
-block_hint,DeleteProperty,82,83,0
-block_hint,DeleteProperty,84,85,0
+block_hint,HasProperty,234,235,1
+block_hint,HasProperty,123,124,1
+block_hint,HasProperty,141,142,1
+block_hint,HasProperty,199,200,0
+block_hint,HasProperty,201,202,0
+block_hint,HasProperty,101,102,0
+block_hint,HasProperty,99,100,0
+block_hint,HasProperty,250,251,0
+block_hint,HasProperty,270,271,0
+block_hint,HasProperty,259,260,1
+block_hint,HasProperty,106,107,0
+block_hint,HasProperty,277,278,0
+block_hint,HasProperty,282,283,0
+block_hint,HasProperty,268,269,0
+block_hint,HasProperty,203,204,1
+block_hint,HasProperty,42,43,1
+block_hint,HasProperty,65,66,0
+block_hint,HasProperty,44,45,0
+block_hint,HasProperty,239,240,1
+block_hint,HasProperty,48,49,0
+block_hint,HasProperty,272,273,0
+block_hint,HasProperty,228,229,0
+block_hint,HasProperty,38,39,0
+block_hint,DeleteProperty,38,39,1
+block_hint,DeleteProperty,62,63,0
+block_hint,DeleteProperty,40,41,0
+block_hint,DeleteProperty,66,67,1
+block_hint,DeleteProperty,91,92,0
 block_hint,DeleteProperty,73,74,0
-block_hint,DeleteProperty,71,72,0
-block_hint,DeleteProperty,44,45,0
-block_hint,DeleteProperty,46,47,0
+block_hint,DeleteProperty,64,65,1
+block_hint,DeleteProperty,56,57,1
+block_hint,DeleteProperty,42,43,1
+block_hint,DeleteProperty,83,84,0
+block_hint,DeleteProperty,85,86,0
+block_hint,DeleteProperty,77,78,0
 block_hint,DeleteProperty,75,76,0
-block_hint,DeleteProperty,50,51,1
-block_hint,DeleteProperty,52,53,0
-block_hint,DeleteProperty,8,9,1
-block_hint,DeleteProperty,10,11,1
-block_hint,DeleteProperty,12,13,1
-block_hint,DeleteProperty,14,15,1
-block_hint,DeleteProperty,16,17,1
-block_hint,SetDataProperties,132,133,1
-block_hint,SetDataProperties,253,254,1
-block_hint,SetDataProperties,251,252,1
-block_hint,SetDataProperties,140,141,0
-block_hint,SetDataProperties,298,299,0
-block_hint,SetDataProperties,142,143,0
-block_hint,SetDataProperties,60,61,0
-block_hint,SetDataProperties,317,318,0
-block_hint,SetDataProperties,257,258,0
-block_hint,SetDataProperties,322,323,1
-block_hint,SetDataProperties,263,264,0
-block_hint,SetDataProperties,681,682,0
-block_hint,SetDataProperties,703,704,1
-block_hint,SetDataProperties,679,680,0
-block_hint,SetDataProperties,677,678,0
+block_hint,DeleteProperty,47,48,0
+block_hint,DeleteProperty,49,50,0
+block_hint,DeleteProperty,87,88,0
+block_hint,DeleteProperty,71,72,1
+block_hint,DeleteProperty,20,21,0
+block_hint,DeleteProperty,54,55,0
+block_hint,DeleteProperty,7,8,1
+block_hint,DeleteProperty,9,10,1
+block_hint,DeleteProperty,11,12,1
+block_hint,DeleteProperty,13,14,1
+block_hint,DeleteProperty,15,16,1
+block_hint,SetDataProperties,136,137,1
+block_hint,SetDataProperties,263,264,1
+block_hint,SetDataProperties,261,262,1
+block_hint,SetDataProperties,144,145,0
+block_hint,SetDataProperties,316,317,0
+block_hint,SetDataProperties,146,147,0
+block_hint,SetDataProperties,59,60,0
+block_hint,SetDataProperties,341,342,0
+block_hint,SetDataProperties,267,268,0
+block_hint,SetDataProperties,385,386,1
+block_hint,SetDataProperties,277,278,0
+block_hint,SetDataProperties,752,753,0
+block_hint,SetDataProperties,762,763,1
+block_hint,SetDataProperties,750,751,0
+block_hint,SetDataProperties,748,749,0
+block_hint,SetDataProperties,659,660,0
+block_hint,SetDataProperties,451,452,1
+block_hint,SetDataProperties,221,222,1
+block_hint,SetDataProperties,87,88,0
+block_hint,SetDataProperties,223,224,0
+block_hint,SetDataProperties,513,514,0
+block_hint,SetDataProperties,515,516,0
+block_hint,SetDataProperties,519,520,1
+block_hint,SetDataProperties,449,450,0
+block_hint,SetDataProperties,329,330,1
+block_hint,SetDataProperties,326,327,0
+block_hint,SetDataProperties,158,159,0
+block_hint,SetDataProperties,399,400,0
+block_hint,SetDataProperties,447,448,0
+block_hint,SetDataProperties,352,353,0
+block_hint,SetDataProperties,226,227,1
+block_hint,SetDataProperties,93,94,1
+block_hint,SetDataProperties,521,522,0
+block_hint,SetDataProperties,95,96,0
+block_hint,SetDataProperties,97,98,0
+block_hint,SetDataProperties,617,618,0
+block_hint,SetDataProperties,523,524,1
+block_hint,SetDataProperties,525,526,0
+block_hint,SetDataProperties,527,528,1
 block_hint,SetDataProperties,529,530,0
-block_hint,SetDataProperties,327,328,1
-block_hint,SetDataProperties,84,85,1
-block_hint,SetDataProperties,90,91,0
-block_hint,SetDataProperties,217,218,0
-block_hint,SetDataProperties,457,458,0
-block_hint,SetDataProperties,459,460,0
-block_hint,SetDataProperties,463,464,1
-block_hint,SetDataProperties,398,399,0
-block_hint,SetDataProperties,308,309,1
-block_hint,SetDataProperties,151,152,0
-block_hint,SetDataProperties,306,307,0
-block_hint,SetDataProperties,219,220,1
-block_hint,SetDataProperties,96,97,1
-block_hint,SetDataProperties,465,466,0
-block_hint,SetDataProperties,98,99,0
-block_hint,SetDataProperties,100,101,0
-block_hint,SetDataProperties,566,567,0
-block_hint,SetDataProperties,467,468,1
-block_hint,SetDataProperties,469,470,0
-block_hint,SetDataProperties,471,472,1
-block_hint,SetDataProperties,473,474,0
-block_hint,SetDataProperties,643,644,0
-block_hint,SetDataProperties,475,476,1
-block_hint,SetDataProperties,522,523,0
-block_hint,SetDataProperties,645,646,0
-block_hint,SetDataProperties,569,570,1
-block_hint,SetDataProperties,483,484,1
-block_hint,SetDataProperties,485,486,0
-block_hint,SetDataProperties,487,488,0
-block_hint,SetDataProperties,489,490,1
-block_hint,SetDataProperties,479,480,0
-block_hint,SetDataProperties,627,628,0
-block_hint,SetDataProperties,499,500,1
-block_hint,SetDataProperties,275,276,1
-block_hint,SetDataProperties,102,103,0
-block_hint,SetDataProperties,390,391,0
-block_hint,SetDataProperties,234,235,0
-block_hint,SetDataProperties,265,266,1
-block_hint,SetDataProperties,198,199,0
-block_hint,SetDataProperties,62,63,0
+block_hint,SetDataProperties,673,674,0
+block_hint,SetDataProperties,531,532,1
+block_hint,SetDataProperties,577,578,0
+block_hint,SetDataProperties,675,676,0
+block_hint,SetDataProperties,620,621,1
+block_hint,SetDataProperties,539,540,1
+block_hint,SetDataProperties,541,542,0
+block_hint,SetDataProperties,543,544,0
+block_hint,SetDataProperties,545,546,1
+block_hint,SetDataProperties,535,536,0
+block_hint,SetDataProperties,657,658,0
+block_hint,SetDataProperties,555,556,1
+block_hint,SetDataProperties,292,293,1
+block_hint,SetDataProperties,99,100,0
+block_hint,SetDataProperties,437,438,0
+block_hint,SetDataProperties,241,242,0
+block_hint,SetDataProperties,279,280,1
+block_hint,SetDataProperties,204,205,0
+block_hint,SetDataProperties,61,62,0
 block_hint,ReturnReceiver,3,4,1
 block_hint,ArrayConstructorImpl,40,41,0
 block_hint,ArrayConstructorImpl,15,16,1
@@ -1046,6 +1090,7 @@ block_hint,ExtractFastJSArray,10,11,0
 block_hint,ExtractFastJSArray,39,40,1
 block_hint,ExtractFastJSArray,35,36,1
 block_hint,ExtractFastJSArray,20,21,1
+block_hint,ExtractFastJSArray,8,9,0
 block_hint,ExtractFastJSArray,12,13,0
 block_hint,ExtractFastJSArray,14,15,1
 block_hint,ExtractFastJSArray,37,38,1
@@ -1174,452 +1219,476 @@ block_hint,ResumeGeneratorBaseline,6,7,0
 block_hint,GlobalIsFinite,9,10,1
 block_hint,GlobalIsNaN,9,10,1
 block_hint,GlobalIsNaN,11,12,1
-block_hint,LoadIC,360,361,1
-block_hint,LoadIC,135,136,0
-block_hint,LoadIC,61,62,0
-block_hint,LoadIC,227,228,0
-block_hint,LoadIC,339,340,1
-block_hint,LoadIC,229,230,0
-block_hint,LoadIC,374,375,1
-block_hint,LoadIC,371,372,1
-block_hint,LoadIC,288,289,1
-block_hint,LoadIC,102,103,1
-block_hint,LoadIC,274,275,0
-block_hint,LoadIC,313,314,0
-block_hint,LoadIC,137,138,1
+block_hint,LoadIC,370,371,1
 block_hint,LoadIC,139,140,0
-block_hint,LoadIC,302,303,1
-block_hint,LoadIC,258,259,1
+block_hint,LoadIC,59,60,0
+block_hint,LoadIC,233,234,0
+block_hint,LoadIC,345,346,1
+block_hint,LoadIC,235,236,0
+block_hint,LoadIC,387,388,1
+block_hint,LoadIC,384,385,0
+block_hint,LoadIC,381,382,1
+block_hint,LoadIC,292,293,1
+block_hint,LoadIC,100,101,1
+block_hint,LoadIC,278,279,0
+block_hint,LoadIC,319,320,0
+block_hint,LoadIC,141,142,1
+block_hint,LoadIC,143,144,0
+block_hint,LoadIC,308,309,1
+block_hint,LoadIC,358,359,1
+block_hint,LoadIC,102,103,0
+block_hint,LoadIC,19,20,1
+block_hint,LoadIC,62,63,0
 block_hint,LoadIC,21,22,1
-block_hint,LoadIC,64,65,0
-block_hint,LoadIC,23,24,1
-block_hint,LoadIC,169,170,0
-block_hint,LoadIC,354,355,0
-block_hint,LoadIC,356,357,0
-block_hint,LoadIC,311,312,0
-block_hint,LoadIC,125,126,0
-block_hint,LoadIC,51,52,1
-block_hint,LoadIC,203,204,0
-block_hint,LoadIC,86,87,0
-block_hint,LoadIC,46,47,0
-block_hint,LoadIC,260,261,1
-block_hint,LoadIC,179,180,0
-block_hint,LoadIC,44,45,1
-block_hint,LoadIC,78,79,0
-block_hint,LoadIC,264,265,0
-block_hint,LoadIC,304,305,1
-block_hint,LoadIC,27,28,0
+block_hint,LoadIC,173,174,0
+block_hint,LoadIC,364,365,0
+block_hint,LoadIC,366,367,0
+block_hint,LoadIC,317,318,0
+block_hint,LoadIC,129,130,0
+block_hint,LoadIC,49,50,1
+block_hint,LoadIC,209,210,0
+block_hint,LoadIC,84,85,0
+block_hint,LoadIC,44,45,0
+block_hint,LoadIC,360,361,1
+block_hint,LoadIC,114,115,0
+block_hint,LoadIC,183,184,0
+block_hint,LoadIC,42,43,1
+block_hint,LoadIC,76,77,0
+block_hint,LoadIC,268,269,0
+block_hint,LoadIC,310,311,1
+block_hint,LoadIC,25,26,0
+block_hint,LoadIC,179,180,1
+block_hint,LoadIC,181,182,1
 block_hint,LoadIC,175,176,1
 block_hint,LoadIC,177,178,1
-block_hint,LoadIC,171,172,1
-block_hint,LoadIC,173,174,1
-block_hint,LoadIC,129,130,1
-block_hint,LoadIC,131,132,0
-block_hint,LoadIC_Megamorphic,342,343,1
-block_hint,LoadIC_Megamorphic,339,340,1
-block_hint,LoadIC_Megamorphic,253,254,1
-block_hint,LoadIC_Megamorphic,255,256,1
-block_hint,LoadIC_Megamorphic,251,252,0
-block_hint,LoadIC_Megamorphic,58,59,0
-block_hint,LoadIC_Megamorphic,288,289,0
-block_hint,LoadIC_Megamorphic,126,127,1
-block_hint,LoadIC_Megamorphic,274,275,1
-block_hint,LoadIC_Megamorphic,128,129,0
-block_hint,LoadIC_Megamorphic,276,277,1
-block_hint,LoadIC_Megamorphic,235,236,1
-block_hint,LoadIC_Megamorphic,97,98,0
-block_hint,LoadIC_Megamorphic,22,23,1
-block_hint,LoadIC_Megamorphic,158,159,0
-block_hint,LoadIC_Megamorphic,281,282,0
-block_hint,LoadIC_Megamorphic,245,246,1
-block_hint,LoadIC_Megamorphic,324,325,0
-block_hint,LoadIC_Megamorphic,326,327,0
-block_hint,LoadIC_Megamorphic,285,286,0
-block_hint,LoadIC_Megamorphic,118,119,0
-block_hint,LoadIC_Megamorphic,50,51,1
-block_hint,LoadIC_Megamorphic,45,46,0
-block_hint,LoadIC_Megamorphic,241,242,0
-block_hint,LoadIC_Megamorphic,278,279,1
-block_hint,LoadIC_Megamorphic,26,27,0
+block_hint,LoadIC,133,134,1
+block_hint,LoadIC,135,136,0
+block_hint,LoadIC_Megamorphic,355,356,1
+block_hint,LoadIC_Megamorphic,352,353,0
+block_hint,LoadIC_Megamorphic,349,350,1
+block_hint,LoadIC_Megamorphic,257,258,1
+block_hint,LoadIC_Megamorphic,259,260,1
+block_hint,LoadIC_Megamorphic,255,256,0
+block_hint,LoadIC_Megamorphic,56,57,0
+block_hint,LoadIC_Megamorphic,294,295,0
+block_hint,LoadIC_Megamorphic,130,131,1
+block_hint,LoadIC_Megamorphic,280,281,1
+block_hint,LoadIC_Megamorphic,132,133,0
+block_hint,LoadIC_Megamorphic,282,283,1
+block_hint,LoadIC_Megamorphic,328,329,1
+block_hint,LoadIC_Megamorphic,95,96,0
+block_hint,LoadIC_Megamorphic,20,21,1
+block_hint,LoadIC_Megamorphic,162,163,0
+block_hint,LoadIC_Megamorphic,287,288,0
+block_hint,LoadIC_Megamorphic,249,250,1
+block_hint,LoadIC_Megamorphic,334,335,0
+block_hint,LoadIC_Megamorphic,336,337,0
+block_hint,LoadIC_Megamorphic,291,292,0
+block_hint,LoadIC_Megamorphic,122,123,0
+block_hint,LoadIC_Megamorphic,48,49,1
+block_hint,LoadIC_Megamorphic,43,44,0
+block_hint,LoadIC_Megamorphic,245,246,0
+block_hint,LoadIC_Megamorphic,284,285,1
 block_hint,LoadIC_Megamorphic,24,25,0
-block_hint,LoadIC_Megamorphic,160,161,1
-block_hint,LoadIC_Megamorphic,162,163,1
-block_hint,LoadIC_Megamorphic,122,123,1
-block_hint,LoadIC_Noninlined,356,357,1
-block_hint,LoadIC_Noninlined,128,129,0
-block_hint,LoadIC_Noninlined,359,360,1
-block_hint,LoadIC_Noninlined,354,355,1
-block_hint,LoadIC_Noninlined,263,264,0
-block_hint,LoadIC_Noninlined,58,59,0
-block_hint,LoadIC_Noninlined,302,303,0
-block_hint,LoadIC_Noninlined,138,139,1
-block_hint,LoadIC_Noninlined,286,287,1
-block_hint,LoadIC_Noninlined,22,23,1
-block_hint,LoadIC_Noninlined,170,171,0
-block_hint,LoadIC_Noninlined,39,40,1
-block_hint,LoadIC_Noninlined,253,254,0
-block_hint,LoadIC_Noninlined,290,291,1
-block_hint,LoadIC_Noninlined,26,27,0
+block_hint,LoadIC_Megamorphic,22,23,0
+block_hint,LoadIC_Megamorphic,164,165,1
+block_hint,LoadIC_Megamorphic,166,167,1
+block_hint,LoadIC_Megamorphic,126,127,1
+block_hint,LoadIC_Noninlined,366,367,1
+block_hint,LoadIC_Noninlined,132,133,0
+block_hint,LoadIC_Noninlined,372,373,1
+block_hint,LoadIC_Noninlined,369,370,0
+block_hint,LoadIC_Noninlined,364,365,1
+block_hint,LoadIC_Noninlined,267,268,0
+block_hint,LoadIC_Noninlined,56,57,0
+block_hint,LoadIC_Noninlined,308,309,0
+block_hint,LoadIC_Noninlined,142,143,1
+block_hint,LoadIC_Noninlined,292,293,1
+block_hint,LoadIC_Noninlined,20,21,1
+block_hint,LoadIC_Noninlined,174,175,0
+block_hint,LoadIC_Noninlined,37,38,1
+block_hint,LoadIC_Noninlined,257,258,0
+block_hint,LoadIC_Noninlined,296,297,1
 block_hint,LoadIC_Noninlined,24,25,0
+block_hint,LoadIC_Noninlined,22,23,0
 block_hint,LoadICTrampoline,3,4,1
 block_hint,LoadICTrampoline_Megamorphic,3,4,1
-block_hint,LoadSuperIC,508,509,0
-block_hint,LoadSuperIC,245,246,0
-block_hint,LoadSuperIC,544,545,1
+block_hint,LoadSuperIC,528,529,0
+block_hint,LoadSuperIC,253,254,0
+block_hint,LoadSuperIC,564,565,1
+block_hint,LoadSuperIC,440,441,0
+block_hint,LoadSuperIC,75,76,0
+block_hint,LoadSuperIC,540,541,0
+block_hint,LoadSuperIC,255,256,1
+block_hint,LoadSuperIC,515,516,1
+block_hint,LoadSuperIC,41,42,1
+block_hint,LoadSuperIC,550,551,0
+block_hint,LoadSuperIC,287,288,0
+block_hint,LoadSuperIC,60,61,1
+block_hint,LoadSuperIC,429,430,0
 block_hint,LoadSuperIC,427,428,0
-block_hint,LoadSuperIC,78,79,0
-block_hint,LoadSuperIC,520,521,0
-block_hint,LoadSuperIC,247,248,1
-block_hint,LoadSuperIC,497,498,1
-block_hint,LoadSuperIC,44,45,1
-block_hint,LoadSuperIC,530,531,0
-block_hint,LoadSuperIC,279,280,0
-block_hint,LoadSuperIC,63,64,1
-block_hint,LoadSuperIC,416,417,0
-block_hint,LoadSuperIC,414,415,0
-block_hint,LoadSuperIC,501,502,1
-block_hint,LoadSuperIC,48,49,0
-block_hint,KeyedLoadIC,619,620,1
-block_hint,KeyedLoadIC,253,254,0
-block_hint,KeyedLoadIC,245,246,0
-block_hint,KeyedLoadIC,379,380,0
-block_hint,KeyedLoadIC,490,491,1
-block_hint,KeyedLoadIC,661,662,0
-block_hint,KeyedLoadIC,613,614,0
-block_hint,KeyedLoadIC,568,569,1
-block_hint,KeyedLoadIC,385,386,1
-block_hint,KeyedLoadIC,383,384,1
-block_hint,KeyedLoadIC,647,648,0
-block_hint,KeyedLoadIC,649,650,0
-block_hint,KeyedLoadIC,617,618,0
-block_hint,KeyedLoadIC,570,571,1
-block_hint,KeyedLoadIC,153,154,1
-block_hint,KeyedLoadIC,611,612,0
-block_hint,KeyedLoadIC,471,472,0
-block_hint,KeyedLoadIC,103,104,1
+block_hint,LoadSuperIC,519,520,1
+block_hint,LoadSuperIC,45,46,0
+block_hint,LoadSuperIC,671,672,0
+block_hint,KeyedLoadIC,629,630,1
+block_hint,KeyedLoadIC,257,258,0
+block_hint,KeyedLoadIC,249,250,0
+block_hint,KeyedLoadIC,385,386,0
+block_hint,KeyedLoadIC,494,495,1
+block_hint,KeyedLoadIC,671,672,0
+block_hint,KeyedLoadIC,623,624,0
+block_hint,KeyedLoadIC,574,575,1
+block_hint,KeyedLoadIC,391,392,1
+block_hint,KeyedLoadIC,389,390,1
 block_hint,KeyedLoadIC,657,658,0
 block_hint,KeyedLoadIC,659,660,0
-block_hint,KeyedLoadIC,625,626,1
-block_hint,KeyedLoadIC,627,628,1
-block_hint,KeyedLoadIC,289,290,1
-block_hint,KeyedLoadIC,291,292,0
-block_hint,KeyedLoadIC,653,654,1
-block_hint,KeyedLoadIC,511,512,1
-block_hint,KeyedLoadIC,609,610,0
-block_hint,KeyedLoadIC,596,597,0
-block_hint,KeyedLoadIC,548,549,1
-block_hint,KeyedLoadIC,311,312,1
-block_hint,KeyedLoadIC,65,66,0
-block_hint,KeyedLoadIC,301,302,0
-block_hint,KeyedLoadIC,515,516,1
-block_hint,KeyedLoadIC,303,304,1
-block_hint,KeyedLoadIC,218,219,0
-block_hint,KeyedLoadIC,175,176,1
-block_hint,KeyedLoadIC,550,551,0
-block_hint,KeyedLoadIC,446,447,1
+block_hint,KeyedLoadIC,627,628,0
+block_hint,KeyedLoadIC,576,577,1
+block_hint,KeyedLoadIC,151,152,1
+block_hint,KeyedLoadIC,621,622,0
+block_hint,KeyedLoadIC,475,476,0
+block_hint,KeyedLoadIC,101,102,1
+block_hint,KeyedLoadIC,667,668,0
+block_hint,KeyedLoadIC,669,670,0
+block_hint,KeyedLoadIC,635,636,1
+block_hint,KeyedLoadIC,637,638,1
+block_hint,KeyedLoadIC,293,294,1
+block_hint,KeyedLoadIC,295,296,0
+block_hint,KeyedLoadIC,663,664,1
+block_hint,KeyedLoadIC,517,518,1
+block_hint,KeyedLoadIC,619,620,0
+block_hint,KeyedLoadIC,606,607,0
+block_hint,KeyedLoadIC,554,555,1
+block_hint,KeyedLoadIC,315,316,1
+block_hint,KeyedLoadIC,63,64,0
+block_hint,KeyedLoadIC,305,306,0
+block_hint,KeyedLoadIC,521,522,1
+block_hint,KeyedLoadIC,307,308,1
+block_hint,KeyedLoadIC,221,222,0
+block_hint,KeyedLoadIC,177,178,1
+block_hint,KeyedLoadIC,556,557,0
+block_hint,KeyedLoadIC,450,451,1
+block_hint,KeyedLoadIC,113,114,0
 block_hint,KeyedLoadIC,115,116,0
-block_hint,KeyedLoadIC,117,118,0
-block_hint,KeyedLoadIC,400,401,1
-block_hint,KeyedLoadIC,599,600,1
-block_hint,KeyedLoadIC,241,242,1
-block_hint,KeyedLoadIC,552,553,0
-block_hint,KeyedLoadIC,504,505,0
-block_hint,KeyedLoadIC,432,433,1
-block_hint,KeyedLoadIC,663,664,0
-block_hint,KeyedLoadIC,121,122,1
-block_hint,KeyedLoadIC,319,320,1
-block_hint,KeyedLoadIC,321,322,1
-block_hint,KeyedLoadIC,67,68,0
-block_hint,KeyedLoadIC_Megamorphic,482,483,1
-block_hint,KeyedLoadIC_Megamorphic,484,485,0
-block_hint,KeyedLoadIC_Megamorphic,1139,1140,0
-block_hint,KeyedLoadIC_Megamorphic,1141,1142,1
-block_hint,KeyedLoadIC_Megamorphic,1117,1118,1
-block_hint,KeyedLoadIC_Megamorphic,1078,1079,0
-block_hint,KeyedLoadIC_Megamorphic,1133,1134,1
-block_hint,KeyedLoadIC_Megamorphic,1143,1144,1
-block_hint,KeyedLoadIC_Megamorphic,1119,1120,1
-block_hint,KeyedLoadIC_Megamorphic,1135,1136,0
-block_hint,KeyedLoadIC_Megamorphic,1053,1054,0
-block_hint,KeyedLoadIC_Megamorphic,893,894,1
-block_hint,KeyedLoadIC_Megamorphic,891,892,1
-block_hint,KeyedLoadIC_Megamorphic,514,515,1
+block_hint,KeyedLoadIC,406,407,1
+block_hint,KeyedLoadIC,609,610,1
+block_hint,KeyedLoadIC,245,246,1
+block_hint,KeyedLoadIC,558,559,0
+block_hint,KeyedLoadIC,508,509,0
+block_hint,KeyedLoadIC,436,437,1
+block_hint,KeyedLoadIC,673,674,0
+block_hint,KeyedLoadIC,119,120,1
+block_hint,KeyedLoadIC,323,324,1
+block_hint,KeyedLoadIC,325,326,1
+block_hint,KeyedLoadIC,65,66,0
+block_hint,KeyedLoadIC_Megamorphic,496,497,1
+block_hint,KeyedLoadIC_Megamorphic,498,499,0
+block_hint,KeyedLoadIC_Megamorphic,1218,1219,0
+block_hint,KeyedLoadIC_Megamorphic,1220,1221,1
+block_hint,KeyedLoadIC_Megamorphic,1192,1193,1
+block_hint,KeyedLoadIC_Megamorphic,1145,1146,0
+block_hint,KeyedLoadIC_Megamorphic,1212,1213,1
+block_hint,KeyedLoadIC_Megamorphic,1222,1223,1
+block_hint,KeyedLoadIC_Megamorphic,1194,1195,1
+block_hint,KeyedLoadIC_Megamorphic,1214,1215,0
 block_hint,KeyedLoadIC_Megamorphic,1111,1112,0
-block_hint,KeyedLoadIC_Megamorphic,1113,1114,0
-block_hint,KeyedLoadIC_Megamorphic,1088,1089,0
-block_hint,KeyedLoadIC_Megamorphic,1086,1087,1
-block_hint,KeyedLoadIC_Megamorphic,1107,1108,0
-block_hint,KeyedLoadIC_Megamorphic,1082,1083,0
-block_hint,KeyedLoadIC_Megamorphic,895,896,1
-block_hint,KeyedLoadIC_Megamorphic,905,906,0
-block_hint,KeyedLoadIC_Megamorphic,1034,1035,0
-block_hint,KeyedLoadIC_Megamorphic,239,240,1
-block_hint,KeyedLoadIC_Megamorphic,1036,1037,0
-block_hint,KeyedLoadIC_Megamorphic,241,242,0
-block_hint,KeyedLoadIC_Megamorphic,1022,1023,0
-block_hint,KeyedLoadIC_Megamorphic,1129,1130,1
-block_hint,KeyedLoadIC_Megamorphic,1020,1021,0
-block_hint,KeyedLoadIC_Megamorphic,1018,1019,0
-block_hint,KeyedLoadIC_Megamorphic,627,628,1
-block_hint,KeyedLoadIC_Megamorphic,125,126,1
-block_hint,KeyedLoadIC_Megamorphic,199,200,0
-block_hint,KeyedLoadIC_Megamorphic,629,630,0
-block_hint,KeyedLoadIC_Megamorphic,544,545,0
-block_hint,KeyedLoadIC_Megamorphic,995,996,0
-block_hint,KeyedLoadIC_Megamorphic,948,949,0
-block_hint,KeyedLoadIC_Megamorphic,633,634,1
-block_hint,KeyedLoadIC_Megamorphic,635,636,0
-block_hint,KeyedLoadIC_Megamorphic,637,638,1
-block_hint,KeyedLoadIC_Megamorphic,256,257,1
-block_hint,KeyedLoadIC_Megamorphic,639,640,0
-block_hint,KeyedLoadIC_Megamorphic,258,259,0
-block_hint,KeyedLoadIC_Megamorphic,817,818,0
+block_hint,KeyedLoadIC_Megamorphic,927,928,1
+block_hint,KeyedLoadIC_Megamorphic,925,926,1
+block_hint,KeyedLoadIC_Megamorphic,528,529,1
+block_hint,KeyedLoadIC_Megamorphic,1186,1187,0
+block_hint,KeyedLoadIC_Megamorphic,1188,1189,0
+block_hint,KeyedLoadIC_Megamorphic,1155,1156,0
+block_hint,KeyedLoadIC_Megamorphic,1153,1154,1
+block_hint,KeyedLoadIC_Megamorphic,1182,1183,0
+block_hint,KeyedLoadIC_Megamorphic,1149,1150,0
+block_hint,KeyedLoadIC_Megamorphic,929,930,1
+block_hint,KeyedLoadIC_Megamorphic,939,940,0
+block_hint,KeyedLoadIC_Megamorphic,640,641,0
+block_hint,KeyedLoadIC_Megamorphic,1172,1173,0
+block_hint,KeyedLoadIC_Megamorphic,1085,1086,0
+block_hint,KeyedLoadIC_Megamorphic,1131,1132,0
+block_hint,KeyedLoadIC_Megamorphic,233,234,1
+block_hint,KeyedLoadIC_Megamorphic,1087,1088,0
+block_hint,KeyedLoadIC_Megamorphic,235,236,0
+block_hint,KeyedLoadIC_Megamorphic,1070,1071,0
+block_hint,KeyedLoadIC_Megamorphic,1204,1205,1
+block_hint,KeyedLoadIC_Megamorphic,1068,1069,0
+block_hint,KeyedLoadIC_Megamorphic,1066,1067,0
+block_hint,KeyedLoadIC_Megamorphic,980,981,1
+block_hint,KeyedLoadIC_Megamorphic,239,240,0
+block_hint,KeyedLoadIC_Megamorphic,121,122,1
+block_hint,KeyedLoadIC_Megamorphic,195,196,0
+block_hint,KeyedLoadIC_Megamorphic,644,645,0
+block_hint,KeyedLoadIC_Megamorphic,558,559,0
+block_hint,KeyedLoadIC_Megamorphic,1043,1044,0
+block_hint,KeyedLoadIC_Megamorphic,983,984,0
 block_hint,KeyedLoadIC_Megamorphic,648,649,1
-block_hint,KeyedLoadIC_Megamorphic,641,642,0
-block_hint,KeyedLoadIC_Megamorphic,1028,1029,0
-block_hint,KeyedLoadIC_Megamorphic,1102,1103,0
-block_hint,KeyedLoadIC_Megamorphic,1131,1132,1
+block_hint,KeyedLoadIC_Megamorphic,666,667,0
+block_hint,KeyedLoadIC_Megamorphic,1174,1175,0
+block_hint,KeyedLoadIC_Megamorphic,650,651,0
+block_hint,KeyedLoadIC_Megamorphic,1089,1090,0
+block_hint,KeyedLoadIC_Megamorphic,652,653,1
+block_hint,KeyedLoadIC_Megamorphic,250,251,1
+block_hint,KeyedLoadIC_Megamorphic,654,655,0
+block_hint,KeyedLoadIC_Megamorphic,252,253,0
+block_hint,KeyedLoadIC_Megamorphic,842,843,0
+block_hint,KeyedLoadIC_Megamorphic,987,988,1
+block_hint,KeyedLoadIC_Megamorphic,256,257,0
+block_hint,KeyedLoadIC_Megamorphic,656,657,0
+block_hint,KeyedLoadIC_Megamorphic,258,259,1
+block_hint,KeyedLoadIC_Megamorphic,1076,1077,0
+block_hint,KeyedLoadIC_Megamorphic,1169,1170,0
+block_hint,KeyedLoadIC_Megamorphic,1206,1207,1
+block_hint,KeyedLoadIC_Megamorphic,1074,1075,0
+block_hint,KeyedLoadIC_Megamorphic,123,124,1
+block_hint,KeyedLoadIC_Megamorphic,203,204,0
+block_hint,KeyedLoadIC_Megamorphic,923,924,0
+block_hint,KeyedLoadIC_Megamorphic,675,676,0
+block_hint,KeyedLoadIC_Megamorphic,1176,1177,0
+block_hint,KeyedLoadIC_Megamorphic,1208,1209,0
+block_hint,KeyedLoadIC_Megamorphic,1135,1136,0
+block_hint,KeyedLoadIC_Megamorphic,844,845,1
+block_hint,KeyedLoadIC_Megamorphic,268,269,1
+block_hint,KeyedLoadIC_Megamorphic,1200,1201,0
+block_hint,KeyedLoadIC_Megamorphic,270,271,0
+block_hint,KeyedLoadIC_Megamorphic,1056,1057,0
+block_hint,KeyedLoadIC_Megamorphic,1198,1199,1
+block_hint,KeyedLoadIC_Megamorphic,1054,1055,0
+block_hint,KeyedLoadIC_Megamorphic,1116,1117,1
+block_hint,KeyedLoadIC_Megamorphic,1107,1108,0
+block_hint,KeyedLoadIC_Megamorphic,1210,1211,0
+block_hint,KeyedLoadIC_Megamorphic,1101,1102,1
+block_hint,KeyedLoadIC_Megamorphic,740,741,1
+block_hint,KeyedLoadIC_Megamorphic,1017,1018,1
+block_hint,KeyedLoadIC_Megamorphic,736,737,0
+block_hint,KeyedLoadIC_Megamorphic,112,113,0
+block_hint,KeyedLoadIC_Megamorphic,877,878,0
+block_hint,KeyedLoadIC_Megamorphic,338,339,1
+block_hint,KeyedLoadIC_Megamorphic,863,864,1
+block_hint,KeyedLoadIC_Megamorphic,76,77,1
+block_hint,KeyedLoadIC_Megamorphic,368,369,0
+block_hint,KeyedLoadIC_Megamorphic,728,729,0
+block_hint,KeyedLoadIC_Megamorphic,93,94,1
+block_hint,KeyedLoadIC_Megamorphic,998,999,1
+block_hint,KeyedLoadIC_Megamorphic,294,295,0
+block_hint,KeyedLoadIC_Megamorphic,115,116,1
+block_hint,KeyedLoadIC_Megamorphic,179,180,0
+block_hint,KeyedLoadIC_Megamorphic,960,961,0
+block_hint,KeyedLoadIC_Megamorphic,817,818,1
+block_hint,KeyedLoadIC_Megamorphic,183,184,1
+block_hint,KeyedLoadIC_Megamorphic,681,682,0
+block_hint,KeyedLoadIC_Megamorphic,524,525,0
+block_hint,KeyedLoadIC_Megamorphic,1031,1032,0
+block_hint,KeyedLoadIC_Megamorphic,1001,1002,0
+block_hint,KeyedLoadIC_Megamorphic,685,686,1
+block_hint,KeyedLoadIC_Megamorphic,856,857,1
+block_hint,KeyedLoadIC_Megamorphic,1178,1179,0
+block_hint,KeyedLoadIC_Megamorphic,307,308,0
+block_hint,KeyedLoadIC_Megamorphic,858,859,0
+block_hint,KeyedLoadIC_Megamorphic,1062,1063,0
+block_hint,KeyedLoadIC_Megamorphic,187,188,0
+block_hint,KeyedLoadIC_Megamorphic,947,948,0
+block_hint,KeyedLoadIC_Megamorphic,1142,1143,0
+block_hint,KeyedLoadIC_Megamorphic,905,906,1
+block_hint,KeyedLoadIC_Megamorphic,127,128,0
+block_hint,KeyedLoadIC_Megamorphic,718,719,0
 block_hint,KeyedLoadIC_Megamorphic,1026,1027,0
-block_hint,KeyedLoadIC_Megamorphic,127,128,1
-block_hint,KeyedLoadIC_Megamorphic,207,208,0
-block_hint,KeyedLoadIC_Megamorphic,889,890,0
-block_hint,KeyedLoadIC_Megamorphic,1038,1039,0
-block_hint,KeyedLoadIC_Megamorphic,821,822,1
-block_hint,KeyedLoadIC_Megamorphic,272,273,1
-block_hint,KeyedLoadIC_Megamorphic,1125,1126,0
-block_hint,KeyedLoadIC_Megamorphic,274,275,0
-block_hint,KeyedLoadIC_Megamorphic,1008,1009,0
-block_hint,KeyedLoadIC_Megamorphic,1123,1124,1
-block_hint,KeyedLoadIC_Megamorphic,1006,1007,0
-block_hint,KeyedLoadIC_Megamorphic,1058,1059,1
-block_hint,KeyedLoadIC_Megamorphic,1049,1050,0
-block_hint,KeyedLoadIC_Megamorphic,1043,1044,1
-block_hint,KeyedLoadIC_Megamorphic,718,719,1
-block_hint,KeyedLoadIC_Megamorphic,969,970,1
+block_hint,KeyedLoadIC_Megamorphic,562,563,1
+block_hint,KeyedLoadIC_Megamorphic,321,322,0
 block_hint,KeyedLoadIC_Megamorphic,714,715,0
-block_hint,KeyedLoadIC_Megamorphic,116,117,0
-block_hint,KeyedLoadIC_Megamorphic,847,848,0
-block_hint,KeyedLoadIC_Megamorphic,332,333,1
-block_hint,KeyedLoadIC_Megamorphic,833,834,1
-block_hint,KeyedLoadIC_Megamorphic,80,81,1
-block_hint,KeyedLoadIC_Megamorphic,362,363,0
-block_hint,KeyedLoadIC_Megamorphic,706,707,0
-block_hint,KeyedLoadIC_Megamorphic,97,98,1
-block_hint,KeyedLoadIC_Megamorphic,661,662,1
-block_hint,KeyedLoadIC_Megamorphic,119,120,1
-block_hint,KeyedLoadIC_Megamorphic,183,184,0
-block_hint,KeyedLoadIC_Megamorphic,926,927,0
-block_hint,KeyedLoadIC_Megamorphic,795,796,1
-block_hint,KeyedLoadIC_Megamorphic,187,188,1
-block_hint,KeyedLoadIC_Megamorphic,663,664,0
-block_hint,KeyedLoadIC_Megamorphic,510,511,0
-block_hint,KeyedLoadIC_Megamorphic,983,984,0
-block_hint,KeyedLoadIC_Megamorphic,957,958,0
-block_hint,KeyedLoadIC_Megamorphic,667,668,1
-block_hint,KeyedLoadIC_Megamorphic,301,302,1
-block_hint,KeyedLoadIC_Megamorphic,307,308,0
-block_hint,KeyedLoadIC_Megamorphic,830,831,0
-block_hint,KeyedLoadIC_Megamorphic,1014,1015,0
-block_hint,KeyedLoadIC_Megamorphic,191,192,0
-block_hint,KeyedLoadIC_Megamorphic,913,914,0
-block_hint,KeyedLoadIC_Megamorphic,1075,1076,0
-block_hint,KeyedLoadIC_Megamorphic,871,872,1
-block_hint,KeyedLoadIC_Megamorphic,131,132,0
-block_hint,KeyedLoadIC_Megamorphic,696,697,0
-block_hint,KeyedLoadIC_Megamorphic,978,979,0
-block_hint,KeyedLoadIC_Megamorphic,548,549,1
-block_hint,KeyedLoadIC_Megamorphic,317,318,0
-block_hint,KeyedLoadIC_Megamorphic,692,693,0
-block_hint,KeyedLoadIC_Megamorphic,550,551,0
-block_hint,KeyedLoadIC_Megamorphic,133,134,1
-block_hint,KeyedLoadIC_Megamorphic,558,559,0
-block_hint,KeyedLoadIC_Megamorphic,875,876,1
-block_hint,KeyedLoadIC_Megamorphic,478,479,0
-block_hint,KeyedLoadIC_Megamorphic,911,912,0
-block_hint,KeyedLoadIC_Megamorphic,700,701,1
-block_hint,KeyedLoadIC_Megamorphic,566,567,0
-block_hint,KeyedLoadIC_Megamorphic,217,218,0
-block_hint,KeyedLoadIC_Megamorphic,476,477,1
-block_hint,KeyedLoadIC_Megamorphic,568,569,1
-block_hint,KeyedLoadIC_Megamorphic,149,150,1
+block_hint,KeyedLoadIC_Megamorphic,564,565,0
+block_hint,KeyedLoadIC_Megamorphic,129,130,1
+block_hint,KeyedLoadIC_Megamorphic,572,573,0
+block_hint,KeyedLoadIC_Megamorphic,909,910,1
+block_hint,KeyedLoadIC_Megamorphic,492,493,0
+block_hint,KeyedLoadIC_Megamorphic,945,946,0
+block_hint,KeyedLoadIC_Megamorphic,722,723,1
+block_hint,KeyedLoadIC_Megamorphic,580,581,0
+block_hint,KeyedLoadIC_Megamorphic,213,214,0
+block_hint,KeyedLoadIC_Megamorphic,490,491,1
+block_hint,KeyedLoadIC_Megamorphic,582,583,1
+block_hint,KeyedLoadIC_Megamorphic,145,146,1
 block_hint,KeyedLoadICTrampoline,3,4,1
 block_hint,KeyedLoadICTrampoline_Megamorphic,3,4,1
-block_hint,StoreGlobalIC,73,74,0
-block_hint,StoreGlobalIC,224,225,1
-block_hint,StoreGlobalIC,263,264,0
-block_hint,StoreGlobalIC,141,142,0
-block_hint,StoreGlobalIC,201,202,0
-block_hint,StoreGlobalIC,87,88,0
-block_hint,StoreGlobalIC,89,90,0
-block_hint,StoreGlobalIC,143,144,1
-block_hint,StoreGlobalIC,91,92,1
-block_hint,StoreGlobalIC,16,17,1
+block_hint,StoreGlobalIC,72,73,0
+block_hint,StoreGlobalIC,229,230,1
+block_hint,StoreGlobalIC,268,269,0
+block_hint,StoreGlobalIC,144,145,0
+block_hint,StoreGlobalIC,205,206,0
+block_hint,StoreGlobalIC,92,93,0
+block_hint,StoreGlobalIC,146,147,1
+block_hint,StoreGlobalIC,94,95,1
+block_hint,StoreGlobalIC,15,16,1
 block_hint,StoreGlobalICTrampoline,3,4,1
-block_hint,StoreIC,328,329,1
-block_hint,StoreIC,140,141,0
-block_hint,StoreIC,71,72,0
-block_hint,StoreIC,202,203,0
-block_hint,StoreIC,204,205,1
-block_hint,StoreIC,374,375,1
-block_hint,StoreIC,357,358,1
-block_hint,StoreIC,234,235,1
-block_hint,StoreIC,236,237,1
-block_hint,StoreIC,76,77,1
-block_hint,StoreIC,244,245,1
-block_hint,StoreIC,104,105,0
-block_hint,StoreIC,37,38,0
-block_hint,StoreIC,210,211,1
-block_hint,StoreIC,142,143,0
+block_hint,StoreIC,338,339,1
 block_hint,StoreIC,144,145,0
-block_hint,StoreIC,18,19,1
+block_hint,StoreIC,69,70,0
+block_hint,StoreIC,208,209,0
+block_hint,StoreIC,210,211,1
+block_hint,StoreIC,395,396,1
+block_hint,StoreIC,386,387,0
+block_hint,StoreIC,240,241,1
+block_hint,StoreIC,242,243,1
+block_hint,StoreIC,74,75,1
+block_hint,StoreIC,250,251,1
+block_hint,StoreIC,108,109,0
+block_hint,StoreIC,35,36,0
+block_hint,StoreIC,316,317,1
 block_hint,StoreIC,92,93,0
-block_hint,StoreIC,20,21,0
-block_hint,StoreIC,347,348,0
-block_hint,StoreIC,154,155,1
+block_hint,StoreIC,146,147,0
+block_hint,StoreIC,94,95,1
+block_hint,StoreIC,150,151,0
+block_hint,StoreIC,16,17,1
+block_hint,StoreIC,96,97,0
+block_hint,StoreIC,18,19,0
+block_hint,StoreIC,359,360,0
+block_hint,StoreIC,160,161,1
+block_hint,StoreIC,162,163,1
+block_hint,StoreIC,327,328,1
+block_hint,StoreIC,164,165,0
+block_hint,StoreIC,105,106,0
+block_hint,StoreIC,103,104,1
+block_hint,StoreIC,320,321,1
+block_hint,StoreIC,23,24,0
+block_hint,StoreIC,152,153,1
+block_hint,StoreIC,287,288,0
+block_hint,StoreIC,154,155,0
 block_hint,StoreIC,156,157,1
-block_hint,StoreIC,317,318,1
+block_hint,StoreIC,323,324,1
+block_hint,StoreIC,25,26,1
 block_hint,StoreIC,158,159,0
-block_hint,StoreIC,101,102,0
-block_hint,StoreIC,99,100,1
-block_hint,StoreIC,310,311,1
-block_hint,StoreIC,25,26,0
-block_hint,StoreIC,146,147,1
-block_hint,StoreIC,281,282,0
-block_hint,StoreIC,148,149,0
-block_hint,StoreIC,150,151,1
-block_hint,StoreIC,313,314,1
-block_hint,StoreIC,27,28,1
-block_hint,StoreIC,152,153,0
-block_hint,StoreIC,315,316,1
-block_hint,StoreIC,33,34,0
-block_hint,StoreIC,31,32,1
-block_hint,StoreIC,223,224,1
-block_hint,StoreIC,65,66,0
-block_hint,StoreIC,285,286,0
-block_hint,StoreIC,160,161,1
-block_hint,StoreIC,287,288,1
-block_hint,StoreIC,206,207,1
-block_hint,StoreIC,240,241,0
-block_hint,StoreIC,170,171,0
+block_hint,StoreIC,325,326,1
+block_hint,StoreIC,31,32,0
+block_hint,StoreIC,29,30,1
+block_hint,StoreIC,227,228,1
+block_hint,StoreIC,63,64,0
+block_hint,StoreIC,291,292,0
+block_hint,StoreIC,166,167,1
+block_hint,StoreIC,293,294,1
+block_hint,StoreIC,312,313,1
+block_hint,StoreIC,76,77,0
+block_hint,StoreIC,246,247,0
+block_hint,StoreIC,176,177,0
+block_hint,StoreIC,43,44,1
+block_hint,StoreIC,112,113,0
+block_hint,StoreIC,178,179,0
+block_hint,StoreIC,271,272,0
+block_hint,StoreIC,125,126,1
+block_hint,StoreIC,371,372,0
+block_hint,StoreIC,267,268,1
 block_hint,StoreIC,45,46,1
-block_hint,StoreIC,108,109,0
-block_hint,StoreIC,172,173,0
-block_hint,StoreIC,265,266,0
-block_hint,StoreIC,121,122,1
-block_hint,StoreIC,359,360,0
-block_hint,StoreIC,261,262,1
 block_hint,StoreIC,47,48,1
+block_hint,StoreIC,121,122,0
 block_hint,StoreIC,49,50,1
-block_hint,StoreIC,117,118,0
+block_hint,StoreIC,123,124,0
 block_hint,StoreIC,51,52,1
-block_hint,StoreIC,119,120,0
+block_hint,StoreIC,80,81,0
 block_hint,StoreIC,53,54,1
 block_hint,StoreIC,55,56,1
+block_hint,StoreIC,333,334,0
 block_hint,StoreIC,57,58,1
-block_hint,StoreIC,323,324,0
-block_hint,StoreIC,59,60,1
-block_hint,StoreIC,178,179,0
-block_hint,StoreIC,180,181,0
-block_hint,StoreIC,225,226,0
-block_hint,StoreIC,129,130,0
-block_hint,StoreIC,293,294,0
-block_hint,StoreIC,184,185,1
+block_hint,StoreIC,184,185,0
 block_hint,StoreIC,186,187,0
-block_hint,StoreIC,275,276,0
-block_hint,StoreIC,353,354,0
-block_hint,StoreIC,295,296,1
-block_hint,StoreIC,188,189,1
+block_hint,StoreIC,229,230,0
+block_hint,StoreIC,133,134,0
+block_hint,StoreIC,299,300,0
+block_hint,StoreIC,190,191,1
+block_hint,StoreIC,192,193,0
+block_hint,StoreIC,281,282,0
+block_hint,StoreIC,365,366,0
+block_hint,StoreIC,301,302,1
 block_hint,StoreIC,194,195,1
-block_hint,StoreIC,196,197,0
-block_hint,StoreIC,198,199,0
 block_hint,StoreIC,200,201,1
-block_hint,StoreIC,192,193,1
-block_hint,StoreIC,190,191,0
-block_hint,StoreIC,372,373,0
-block_hint,StoreIC,376,377,1
-block_hint,StoreIC,345,346,1
-block_hint,StoreIC,306,307,1
-block_hint,StoreIC,82,83,0
-block_hint,StoreIC,135,136,0
-block_hint,StoreIC,227,228,1
+block_hint,StoreIC,202,203,0
+block_hint,StoreIC,204,205,0
+block_hint,StoreIC,206,207,1
+block_hint,StoreIC,198,199,1
+block_hint,StoreIC,196,197,0
+block_hint,StoreIC,384,385,0
+block_hint,StoreIC,388,389,1
+block_hint,StoreIC,357,358,1
+block_hint,StoreIC,314,315,1
+block_hint,StoreIC,84,85,0
+block_hint,StoreIC,139,140,0
+block_hint,StoreIC,231,232,1
 block_hint,StoreICTrampoline,3,4,1
-block_hint,DefineNamedOwnIC,320,321,1
-block_hint,DefineNamedOwnIC,139,140,0
-block_hint,DefineNamedOwnIC,295,296,1
-block_hint,DefineNamedOwnIC,197,198,0
-block_hint,DefineNamedOwnIC,71,72,0
-block_hint,DefineNamedOwnIC,199,200,0
-block_hint,DefineNamedOwnIC,317,318,0
-block_hint,DefineNamedOwnIC,238,239,1
-block_hint,DefineNamedOwnIC,89,90,0
-block_hint,DefineNamedOwnIC,19,20,0
-block_hint,DefineNamedOwnIC,339,340,0
-block_hint,DefineNamedOwnIC,277,278,1
-block_hint,DefineNamedOwnIC,151,152,1
-block_hint,DefineNamedOwnIC,153,154,1
-block_hint,DefineNamedOwnIC,249,250,1
-block_hint,DefineNamedOwnIC,34,35,0
-block_hint,DefineNamedOwnIC,241,242,1
-block_hint,DefineNamedOwnIC,24,25,0
-block_hint,DefineNamedOwnIC,143,144,1
-block_hint,DefineNamedOwnIC,341,342,0
-block_hint,DefineNamedOwnIC,275,276,0
+block_hint,DefineNamedOwnIC,329,330,1
 block_hint,DefineNamedOwnIC,145,146,0
-block_hint,DefineNamedOwnIC,147,148,1
+block_hint,DefineNamedOwnIC,300,301,1
+block_hint,DefineNamedOwnIC,203,204,0
+block_hint,DefineNamedOwnIC,69,70,0
+block_hint,DefineNamedOwnIC,205,206,0
+block_hint,DefineNamedOwnIC,326,327,0
 block_hint,DefineNamedOwnIC,243,244,1
-block_hint,DefineNamedOwnIC,28,29,0
-block_hint,DefineNamedOwnIC,149,150,0
-block_hint,DefineNamedOwnIC,245,246,1
+block_hint,DefineNamedOwnIC,93,94,0
+block_hint,DefineNamedOwnIC,17,18,0
+block_hint,DefineNamedOwnIC,350,351,0
+block_hint,DefineNamedOwnIC,282,283,1
+block_hint,DefineNamedOwnIC,157,158,1
+block_hint,DefineNamedOwnIC,159,160,1
+block_hint,DefineNamedOwnIC,254,255,1
 block_hint,DefineNamedOwnIC,32,33,0
-block_hint,KeyedStoreIC,391,392,1
+block_hint,DefineNamedOwnIC,246,247,1
+block_hint,DefineNamedOwnIC,22,23,0
+block_hint,DefineNamedOwnIC,149,150,1
+block_hint,DefineNamedOwnIC,352,353,0
+block_hint,DefineNamedOwnIC,280,281,0
+block_hint,DefineNamedOwnIC,151,152,0
+block_hint,DefineNamedOwnIC,153,154,1
+block_hint,DefineNamedOwnIC,248,249,1
+block_hint,DefineNamedOwnIC,26,27,0
+block_hint,DefineNamedOwnIC,155,156,0
+block_hint,DefineNamedOwnIC,250,251,1
+block_hint,DefineNamedOwnIC,30,31,0
+block_hint,KeyedStoreIC,401,402,1
+block_hint,KeyedStoreIC,173,174,0
 block_hint,KeyedStoreIC,169,170,0
-block_hint,KeyedStoreIC,165,166,0
-block_hint,KeyedStoreIC,233,234,0
-block_hint,KeyedStoreIC,167,168,1
-block_hint,KeyedStoreIC,85,86,1
-block_hint,KeyedStoreIC,89,90,1
-block_hint,KeyedStoreIC,388,389,1
-block_hint,KeyedStoreIC,105,106,0
-block_hint,KeyedStoreIC,24,25,0
-block_hint,KeyedStoreIC,420,421,0
-block_hint,KeyedStoreIC,175,176,1
-block_hint,KeyedStoreIC,422,423,0
+block_hint,KeyedStoreIC,239,240,0
+block_hint,KeyedStoreIC,171,172,1
+block_hint,KeyedStoreIC,83,84,1
+block_hint,KeyedStoreIC,87,88,1
+block_hint,KeyedStoreIC,398,399,1
+block_hint,KeyedStoreIC,109,110,0
+block_hint,KeyedStoreIC,22,23,0
+block_hint,KeyedStoreIC,432,433,0
+block_hint,KeyedStoreIC,181,182,1
+block_hint,KeyedStoreIC,434,435,0
+block_hint,KeyedStoreIC,351,352,0
+block_hint,KeyedStoreIC,298,299,1
+block_hint,KeyedStoreIC,31,32,0
+block_hint,KeyedStoreIC,272,273,0
+block_hint,KeyedStoreIC,355,356,0
+block_hint,KeyedStoreIC,195,196,1
+block_hint,KeyedStoreIC,260,261,1
+block_hint,KeyedStoreIC,436,437,1
+block_hint,KeyedStoreIC,329,330,0
+block_hint,KeyedStoreIC,137,138,1
+block_hint,KeyedStoreIC,45,46,1
+block_hint,KeyedStoreIC,197,198,0
+block_hint,KeyedStoreIC,47,48,0
+block_hint,KeyedStoreIC,215,216,0
+block_hint,KeyedStoreIC,361,362,1
+block_hint,KeyedStoreIC,363,364,0
+block_hint,KeyedStoreIC,221,222,1
+block_hint,KeyedStoreIC,223,224,0
 block_hint,KeyedStoreIC,345,346,0
-block_hint,KeyedStoreIC,292,293,1
-block_hint,KeyedStoreIC,33,34,0
-block_hint,KeyedStoreIC,268,269,0
-block_hint,KeyedStoreIC,349,350,0
-block_hint,KeyedStoreIC,189,190,1
-block_hint,KeyedStoreIC,256,257,1
-block_hint,KeyedStoreIC,424,425,1
-block_hint,KeyedStoreIC,323,324,0
-block_hint,KeyedStoreIC,133,134,1
-block_hint,KeyedStoreIC,47,48,1
-block_hint,KeyedStoreIC,191,192,0
-block_hint,KeyedStoreIC,49,50,0
-block_hint,KeyedStoreIC,209,210,0
-block_hint,KeyedStoreIC,355,356,1
-block_hint,KeyedStoreIC,357,358,0
-block_hint,KeyedStoreIC,215,216,1
-block_hint,KeyedStoreIC,217,218,0
-block_hint,KeyedStoreIC,339,340,0
-block_hint,KeyedStoreIC,361,362,0
-block_hint,KeyedStoreIC,426,427,0
-block_hint,KeyedStoreIC,359,360,1
-block_hint,KeyedStoreIC,225,226,1
-block_hint,KeyedStoreIC,227,228,0
-block_hint,KeyedStoreIC,229,230,0
+block_hint,KeyedStoreIC,367,368,0
+block_hint,KeyedStoreIC,438,439,0
+block_hint,KeyedStoreIC,365,366,1
 block_hint,KeyedStoreIC,231,232,1
-block_hint,KeyedStoreIC,441,442,0
-block_hint,KeyedStoreIC,418,419,1
-block_hint,KeyedStoreIC,274,275,0
-block_hint,KeyedStoreIC,369,370,1
-block_hint,KeyedStoreIC,95,96,0
-block_hint,KeyedStoreIC,160,161,0
+block_hint,KeyedStoreIC,233,234,0
+block_hint,KeyedStoreIC,235,236,0
+block_hint,KeyedStoreIC,237,238,1
+block_hint,KeyedStoreIC,453,454,0
+block_hint,KeyedStoreIC,430,431,1
+block_hint,KeyedStoreIC,278,279,0
+block_hint,KeyedStoreIC,377,378,1
+block_hint,KeyedStoreIC,97,98,0
+block_hint,KeyedStoreIC,164,165,0
 block_hint,KeyedStoreICTrampoline,3,4,1
-block_hint,DefineKeyedOwnIC,383,384,1
-block_hint,DefineKeyedOwnIC,168,169,0
-block_hint,DefineKeyedOwnIC,164,165,1
+block_hint,DefineKeyedOwnIC,392,393,1
+block_hint,DefineKeyedOwnIC,174,175,0
+block_hint,DefineKeyedOwnIC,170,171,1
 block_hint,StoreInArrayLiteralIC,30,31,1
 block_hint,StoreInArrayLiteralIC,19,20,0
 block_hint,StoreInArrayLiteralIC,23,24,0
@@ -1627,29 +1696,29 @@ block_hint,StoreInArrayLiteralIC,14,15,1
 block_hint,StoreInArrayLiteralIC,16,17,1
 block_hint,StoreInArrayLiteralIC,8,9,1
 block_hint,StoreInArrayLiteralIC,4,5,1
-block_hint,LoadGlobalIC,61,62,0
-block_hint,LoadGlobalIC,15,16,1
-block_hint,LoadGlobalIC,17,18,1
-block_hint,LoadGlobalIC,19,20,1
-block_hint,LoadGlobalIC,188,189,0
-block_hint,LoadGlobalIC,13,14,0
-block_hint,LoadGlobalIC,109,110,1
-block_hint,LoadGlobalICInsideTypeof,61,62,0
-block_hint,LoadGlobalICInsideTypeof,190,191,1
-block_hint,LoadGlobalICInsideTypeof,13,14,0
-block_hint,LoadGlobalICInsideTypeof,109,110,0
-block_hint,LoadGlobalICInsideTypeof,21,22,1
-block_hint,LoadGlobalICInsideTypeof,23,24,1
-block_hint,LoadGlobalICInsideTypeof,249,250,1
-block_hint,LoadGlobalICInsideTypeof,205,206,0
-block_hint,LoadGlobalICInsideTypeof,59,60,0
-block_hint,LoadGlobalICInsideTypeof,217,218,0
-block_hint,LoadGlobalICInsideTypeof,111,112,1
-block_hint,LoadGlobalICInsideTypeof,25,26,1
-block_hint,LoadGlobalICInsideTypeof,226,227,1
-block_hint,LoadGlobalICInsideTypeof,196,197,0
-block_hint,LoadGlobalICInsideTypeof,44,45,0
-block_hint,LoadGlobalICInsideTypeof,42,43,1
+block_hint,LoadGlobalIC,60,61,0
+block_hint,LoadGlobalIC,14,15,1
+block_hint,LoadGlobalIC,16,17,1
+block_hint,LoadGlobalIC,18,19,1
+block_hint,LoadGlobalIC,191,192,0
+block_hint,LoadGlobalIC,12,13,0
+block_hint,LoadGlobalIC,111,112,1
+block_hint,LoadGlobalICInsideTypeof,60,61,0
+block_hint,LoadGlobalICInsideTypeof,193,194,1
+block_hint,LoadGlobalICInsideTypeof,12,13,0
+block_hint,LoadGlobalICInsideTypeof,111,112,0
+block_hint,LoadGlobalICInsideTypeof,20,21,1
+block_hint,LoadGlobalICInsideTypeof,22,23,1
+block_hint,LoadGlobalICInsideTypeof,254,255,1
+block_hint,LoadGlobalICInsideTypeof,208,209,0
+block_hint,LoadGlobalICInsideTypeof,58,59,0
+block_hint,LoadGlobalICInsideTypeof,220,221,0
+block_hint,LoadGlobalICInsideTypeof,113,114,1
+block_hint,LoadGlobalICInsideTypeof,24,25,1
+block_hint,LoadGlobalICInsideTypeof,229,230,1
+block_hint,LoadGlobalICInsideTypeof,199,200,0
+block_hint,LoadGlobalICInsideTypeof,43,44,0
+block_hint,LoadGlobalICInsideTypeof,41,42,1
 block_hint,LoadGlobalICTrampoline,3,4,1
 block_hint,LoadGlobalICInsideTypeofTrampoline,3,4,1
 block_hint,LookupGlobalICBaseline,3,4,1
@@ -1658,50 +1727,54 @@ block_hint,LookupGlobalICBaseline,5,6,1
 block_hint,LookupGlobalICBaseline,11,12,1
 block_hint,LookupGlobalICBaseline,7,8,1
 block_hint,LookupGlobalICBaseline,9,10,0
-block_hint,KeyedHasIC,251,252,1
+block_hint,KeyedHasIC,261,262,1
+block_hint,KeyedHasIC,125,126,0
 block_hint,KeyedHasIC,117,118,0
-block_hint,KeyedHasIC,109,110,0
-block_hint,KeyedHasIC,233,234,0
-block_hint,KeyedHasIC,157,158,0
-block_hint,KeyedHasIC,81,82,0
-block_hint,KeyedHasIC,111,112,1
-block_hint,KeyedHasIC,159,160,0
-block_hint,KeyedHasIC,115,116,1
-block_hint,KeyedHasIC,83,84,1
-block_hint,KeyedHasIC,193,194,0
-block_hint,KeyedHasIC,215,216,0
-block_hint,KeyedHasIC,273,274,0
-block_hint,KeyedHasIC,271,272,0
-block_hint,KeyedHasIC,153,154,1
-block_hint,KeyedHasIC,63,64,0
-block_hint,KeyedHasIC_Megamorphic,133,134,1
-block_hint,KeyedHasIC_Megamorphic,135,136,1
-block_hint,KeyedHasIC_Megamorphic,253,254,0
-block_hint,KeyedHasIC_Megamorphic,207,208,1
-block_hint,KeyedHasIC_Megamorphic,245,246,0
-block_hint,KeyedHasIC_Megamorphic,93,94,0
-block_hint,KeyedHasIC_Megamorphic,228,229,1
-block_hint,KeyedHasIC_Megamorphic,119,120,1
+block_hint,KeyedHasIC,239,240,0
+block_hint,KeyedHasIC,165,166,0
+block_hint,KeyedHasIC,77,78,0
+block_hint,KeyedHasIC,119,120,1
+block_hint,KeyedHasIC,167,168,0
+block_hint,KeyedHasIC,123,124,1
+block_hint,KeyedHasIC,79,80,1
+block_hint,KeyedHasIC,197,198,0
+block_hint,KeyedHasIC,221,222,0
+block_hint,KeyedHasIC,283,284,0
+block_hint,KeyedHasIC,281,282,0
+block_hint,KeyedHasIC,161,162,1
+block_hint,KeyedHasIC,61,62,0
 block_hint,KeyedHasIC_Megamorphic,137,138,1
-block_hint,KeyedHasIC_Megamorphic,195,196,0
-block_hint,KeyedHasIC_Megamorphic,197,198,0
+block_hint,KeyedHasIC_Megamorphic,139,140,1
+block_hint,KeyedHasIC_Megamorphic,263,264,0
+block_hint,KeyedHasIC_Megamorphic,211,212,1
+block_hint,KeyedHasIC_Megamorphic,254,255,0
 block_hint,KeyedHasIC_Megamorphic,97,98,0
-block_hint,KeyedHasIC_Megamorphic,95,96,0
-block_hint,KeyedHasIC_Megamorphic,241,242,0
-block_hint,KeyedHasIC_Megamorphic,232,233,0
-block_hint,KeyedHasIC_Megamorphic,249,250,0
+block_hint,KeyedHasIC_Megamorphic,234,235,1
+block_hint,KeyedHasIC_Megamorphic,123,124,1
+block_hint,KeyedHasIC_Megamorphic,141,142,1
+block_hint,KeyedHasIC_Megamorphic,199,200,0
 block_hint,KeyedHasIC_Megamorphic,201,202,0
-block_hint,KeyedHasIC_Megamorphic,47,48,0
-block_hint,KeyedHasIC_Megamorphic,61,62,0
-block_hint,KeyedHasIC_Megamorphic,103,104,1
-block_hint,KeyedHasIC_Megamorphic,258,259,0
+block_hint,KeyedHasIC_Megamorphic,101,102,0
+block_hint,KeyedHasIC_Megamorphic,99,100,0
+block_hint,KeyedHasIC_Megamorphic,250,251,0
+block_hint,KeyedHasIC_Megamorphic,270,271,0
+block_hint,KeyedHasIC_Megamorphic,106,107,0
+block_hint,KeyedHasIC_Megamorphic,277,278,0
+block_hint,KeyedHasIC_Megamorphic,282,283,0
+block_hint,KeyedHasIC_Megamorphic,268,269,0
+block_hint,KeyedHasIC_Megamorphic,203,204,0
+block_hint,KeyedHasIC_Megamorphic,44,45,0
+block_hint,KeyedHasIC_Megamorphic,63,64,0
+block_hint,KeyedHasIC_Megamorphic,239,240,1
+block_hint,KeyedHasIC_Megamorphic,48,49,0
+block_hint,KeyedHasIC_Megamorphic,272,273,0
+block_hint,KeyedHasIC_Megamorphic,228,229,0
+block_hint,KeyedHasIC_Megamorphic,87,88,0
+block_hint,KeyedHasIC_Megamorphic,155,156,0
+block_hint,KeyedHasIC_Megamorphic,196,197,0
+block_hint,KeyedHasIC_Megamorphic,59,60,0
 block_hint,KeyedHasIC_Megamorphic,222,223,0
-block_hint,KeyedHasIC_Megamorphic,83,84,0
-block_hint,KeyedHasIC_Megamorphic,151,152,0
-block_hint,KeyedHasIC_Megamorphic,192,193,0
-block_hint,KeyedHasIC_Megamorphic,58,59,0
-block_hint,KeyedHasIC_Megamorphic,216,217,0
-block_hint,KeyedHasIC_Megamorphic,56,57,1
+block_hint,KeyedHasIC_Megamorphic,57,58,1
 block_hint,IterableToList,42,43,1
 block_hint,IterableToList,44,45,1
 block_hint,IterableToList,46,47,1
@@ -1762,21 +1835,21 @@ block_hint,FindOrderedHashMapEntry,22,23,0
 block_hint,FindOrderedHashMapEntry,68,69,0
 block_hint,FindOrderedHashMapEntry,58,59,1
 block_hint,FindOrderedHashMapEntry,60,61,1
-block_hint,MapConstructor,323,324,1
-block_hint,MapConstructor,243,244,1
-block_hint,MapConstructor,100,101,0
+block_hint,MapConstructor,328,329,1
+block_hint,MapConstructor,248,249,1
+block_hint,MapConstructor,105,106,0
 block_hint,MapConstructor,13,14,1
-block_hint,MapConstructor,265,266,1
-block_hint,MapConstructor,205,206,1
-block_hint,MapConstructor,83,84,0
-block_hint,MapConstructor,85,86,1
-block_hint,MapConstructor,267,268,1
-block_hint,MapConstructor,300,301,0
-block_hint,MapConstructor,314,315,0
-block_hint,MapConstructor,215,216,0
-block_hint,MapConstructor,104,105,0
-block_hint,MapConstructor,233,234,1
-block_hint,MapConstructor,98,99,1
+block_hint,MapConstructor,270,271,1
+block_hint,MapConstructor,211,212,1
+block_hint,MapConstructor,86,87,0
+block_hint,MapConstructor,88,89,1
+block_hint,MapConstructor,272,273,1
+block_hint,MapConstructor,308,309,0
+block_hint,MapConstructor,319,320,0
+block_hint,MapConstructor,220,221,0
+block_hint,MapConstructor,109,110,0
+block_hint,MapConstructor,238,239,1
+block_hint,MapConstructor,103,104,1
 block_hint,MapPrototypeSet,98,99,1
 block_hint,MapPrototypeSet,62,63,1
 block_hint,MapPrototypeSet,64,65,1
@@ -1849,91 +1922,91 @@ block_hint,MapIteratorPrototypeNext,15,16,1
 block_hint,MapIteratorPrototypeNext,17,18,1
 block_hint,MapIteratorPrototypeNext,25,26,1
 block_hint,SameValueNumbersOnly,4,5,1
-block_hint,Add_Baseline,32,33,0
-block_hint,Add_Baseline,21,22,0
-block_hint,Add_Baseline,8,9,1
-block_hint,Add_Baseline,58,59,0
-block_hint,Add_Baseline,35,36,1
-block_hint,Add_Baseline,47,48,0
-block_hint,Add_Baseline,17,18,1
-block_hint,Add_Baseline,53,54,1
-block_hint,Add_Baseline,19,20,1
-block_hint,Add_Baseline,26,27,1
-block_hint,Add_Baseline,10,11,1
-block_hint,AddSmi_Baseline,32,33,0
-block_hint,AddSmi_Baseline,21,22,0
-block_hint,AddSmi_Baseline,8,9,1
-block_hint,AddSmi_Baseline,49,50,1
-block_hint,AddSmi_Baseline,26,27,1
-block_hint,AddSmi_Baseline,10,11,1
-block_hint,Subtract_Baseline,21,22,0
-block_hint,Subtract_Baseline,8,9,1
-block_hint,Subtract_Baseline,46,47,1
-block_hint,Subtract_Baseline,56,57,1
-block_hint,Subtract_Baseline,54,55,0
-block_hint,Subtract_Baseline,42,43,0
-block_hint,Subtract_Baseline,48,49,1
-block_hint,Subtract_Baseline,17,18,1
+block_hint,Add_Baseline,39,40,0
+block_hint,Add_Baseline,25,26,0
+block_hint,Add_Baseline,9,10,1
+block_hint,Add_Baseline,84,85,0
+block_hint,Add_Baseline,46,47,1
+block_hint,Add_Baseline,56,57,0
+block_hint,Add_Baseline,20,21,1
+block_hint,Add_Baseline,64,65,1
+block_hint,Add_Baseline,23,24,1
+block_hint,Add_Baseline,31,32,1
+block_hint,Add_Baseline,11,12,1
+block_hint,AddSmi_Baseline,39,40,0
+block_hint,AddSmi_Baseline,25,26,0
+block_hint,AddSmi_Baseline,9,10,1
+block_hint,AddSmi_Baseline,60,61,1
+block_hint,AddSmi_Baseline,31,32,1
+block_hint,AddSmi_Baseline,11,12,1
+block_hint,Subtract_Baseline,31,32,0
+block_hint,Subtract_Baseline,11,12,1
+block_hint,Subtract_Baseline,60,61,1
+block_hint,Subtract_Baseline,82,83,1
+block_hint,Subtract_Baseline,76,77,0
+block_hint,Subtract_Baseline,53,54,0
+block_hint,Subtract_Baseline,62,63,1
 block_hint,Subtract_Baseline,23,24,1
-block_hint,Subtract_Baseline,10,11,1
-block_hint,SubtractSmi_Baseline,21,22,0
-block_hint,SubtractSmi_Baseline,8,9,1
-block_hint,SubtractSmi_Baseline,38,39,1
-block_hint,SubtractSmi_Baseline,23,24,1
-block_hint,SubtractSmi_Baseline,10,11,1
-block_hint,Multiply_Baseline,62,63,0
-block_hint,Multiply_Baseline,40,41,0
-block_hint,Multiply_Baseline,48,49,0
-block_hint,Multiply_Baseline,54,55,1
-block_hint,Multiply_Baseline,50,51,1
-block_hint,Multiply_Baseline,6,7,1
-block_hint,Multiply_Baseline,42,43,1
-block_hint,Multiply_Baseline,60,61,1
-block_hint,Multiply_Baseline,44,45,1
-block_hint,Multiply_Baseline,19,20,1
-block_hint,Multiply_Baseline,8,9,1
-block_hint,MultiplySmi_Baseline,54,55,0
-block_hint,MultiplySmi_Baseline,40,41,0
-block_hint,MultiplySmi_Baseline,42,43,0
-block_hint,MultiplySmi_Baseline,44,45,1
-block_hint,MultiplySmi_Baseline,17,18,0
-block_hint,MultiplySmi_Baseline,6,7,1
-block_hint,MultiplySmi_Baseline,33,34,1
-block_hint,MultiplySmi_Baseline,19,20,1
-block_hint,MultiplySmi_Baseline,8,9,1
-block_hint,Divide_Baseline,52,53,0
-block_hint,Divide_Baseline,54,55,0
-block_hint,Divide_Baseline,41,42,0
-block_hint,Divide_Baseline,26,27,1
-block_hint,Divide_Baseline,6,7,1
-block_hint,Divide_Baseline,45,46,1
-block_hint,Divide_Baseline,60,61,1
-block_hint,Divide_Baseline,47,48,1
-block_hint,Divide_Baseline,33,34,0
-block_hint,Divide_Baseline,14,15,1
-block_hint,Divide_Baseline,20,21,1
-block_hint,Divide_Baseline,8,9,1
-block_hint,DivideSmi_Baseline,46,47,0
-block_hint,DivideSmi_Baseline,54,55,0
-block_hint,DivideSmi_Baseline,48,49,0
-block_hint,DivideSmi_Baseline,41,42,0
-block_hint,DivideSmi_Baseline,26,27,1
-block_hint,DivideSmi_Baseline,6,7,1
-block_hint,DivideSmi_Baseline,35,36,1
-block_hint,DivideSmi_Baseline,20,21,1
-block_hint,DivideSmi_Baseline,8,9,1
-block_hint,Modulus_Baseline,61,62,0
-block_hint,Modulus_Baseline,57,58,0
-block_hint,Modulus_Baseline,43,44,1
-block_hint,Modulus_Baseline,38,39,1
-block_hint,Modulus_Baseline,17,18,0
+block_hint,Subtract_Baseline,33,34,1
+block_hint,Subtract_Baseline,13,14,1
+block_hint,SubtractSmi_Baseline,31,32,0
+block_hint,SubtractSmi_Baseline,11,12,1
+block_hint,SubtractSmi_Baseline,51,52,1
+block_hint,SubtractSmi_Baseline,33,34,1
+block_hint,SubtractSmi_Baseline,13,14,1
+block_hint,Multiply_Baseline,100,101,0
+block_hint,Multiply_Baseline,61,62,0
+block_hint,Multiply_Baseline,77,78,0
+block_hint,Multiply_Baseline,87,88,1
+block_hint,Multiply_Baseline,79,80,1
+block_hint,Multiply_Baseline,13,14,1
+block_hint,Multiply_Baseline,63,64,1
+block_hint,Multiply_Baseline,93,94,1
+block_hint,Multiply_Baseline,65,66,1
+block_hint,Multiply_Baseline,34,35,1
+block_hint,Multiply_Baseline,15,16,1
+block_hint,MultiplySmi_Baseline,92,93,0
+block_hint,MultiplySmi_Baseline,61,62,0
+block_hint,MultiplySmi_Baseline,71,72,0
+block_hint,MultiplySmi_Baseline,73,74,1
+block_hint,MultiplySmi_Baseline,32,33,0
+block_hint,MultiplySmi_Baseline,13,14,1
+block_hint,MultiplySmi_Baseline,51,52,1
+block_hint,MultiplySmi_Baseline,34,35,1
+block_hint,MultiplySmi_Baseline,15,16,1
+block_hint,Divide_Baseline,69,70,0
+block_hint,Divide_Baseline,71,72,0
+block_hint,Divide_Baseline,50,51,0
+block_hint,Divide_Baseline,31,32,1
+block_hint,Divide_Baseline,10,11,1
+block_hint,Divide_Baseline,54,55,1
+block_hint,Divide_Baseline,79,80,1
+block_hint,Divide_Baseline,56,57,1
+block_hint,Divide_Baseline,39,40,0
+block_hint,Divide_Baseline,19,20,1
+block_hint,Divide_Baseline,25,26,1
+block_hint,Divide_Baseline,12,13,1
+block_hint,DivideSmi_Baseline,63,64,0
+block_hint,DivideSmi_Baseline,76,77,0
+block_hint,DivideSmi_Baseline,65,66,0
+block_hint,DivideSmi_Baseline,50,51,0
+block_hint,DivideSmi_Baseline,31,32,1
+block_hint,DivideSmi_Baseline,10,11,1
+block_hint,DivideSmi_Baseline,41,42,1
+block_hint,DivideSmi_Baseline,25,26,1
+block_hint,DivideSmi_Baseline,12,13,1
+block_hint,Modulus_Baseline,76,77,0
+block_hint,Modulus_Baseline,72,73,0
+block_hint,Modulus_Baseline,55,56,1
+block_hint,Modulus_Baseline,50,51,1
+block_hint,Modulus_Baseline,18,19,0
 block_hint,Modulus_Baseline,6,7,1
-block_hint,ModulusSmi_Baseline,43,44,1
-block_hint,ModulusSmi_Baseline,38,39,1
-block_hint,ModulusSmi_Baseline,17,18,0
+block_hint,ModulusSmi_Baseline,55,56,1
+block_hint,ModulusSmi_Baseline,50,51,1
+block_hint,ModulusSmi_Baseline,18,19,0
 block_hint,ModulusSmi_Baseline,6,7,1
-block_hint,ModulusSmi_Baseline,32,33,1
-block_hint,ModulusSmi_Baseline,19,20,1
+block_hint,ModulusSmi_Baseline,40,41,1
+block_hint,ModulusSmi_Baseline,20,21,1
 block_hint,ModulusSmi_Baseline,8,9,1
 block_hint,BitwiseAnd_Baseline,35,36,0
 block_hint,BitwiseAnd_Baseline,23,24,1
@@ -2000,23 +2073,23 @@ block_hint,ShiftRightLogicalSmi_Baseline,25,26,1
 block_hint,ShiftRightLogicalSmi_Baseline,33,34,0
 block_hint,ShiftRightLogicalSmi_Baseline,23,24,0
 block_hint,ShiftRightLogicalSmi_Baseline,9,10,1
-block_hint,Add_WithFeedback,49,50,1
-block_hint,Add_WithFeedback,60,61,0
-block_hint,Add_WithFeedback,58,59,0
-block_hint,Add_WithFeedback,45,46,1
-block_hint,Add_WithFeedback,35,36,1
-block_hint,Add_WithFeedback,28,29,0
-block_hint,Add_WithFeedback,19,20,1
-block_hint,Subtract_WithFeedback,52,53,1
-block_hint,Subtract_WithFeedback,56,57,0
-block_hint,Subtract_WithFeedback,54,55,0
-block_hint,Subtract_WithFeedback,42,43,0
-block_hint,Subtract_WithFeedback,17,18,1
-block_hint,Modulus_WithFeedback,61,62,0
-block_hint,Modulus_WithFeedback,57,58,0
-block_hint,Modulus_WithFeedback,43,44,1
-block_hint,Modulus_WithFeedback,38,39,1
-block_hint,Modulus_WithFeedback,17,18,0
+block_hint,Add_WithFeedback,60,61,1
+block_hint,Add_WithFeedback,86,87,0
+block_hint,Add_WithFeedback,84,85,0
+block_hint,Add_WithFeedback,54,55,1
+block_hint,Add_WithFeedback,46,47,1
+block_hint,Add_WithFeedback,33,34,0
+block_hint,Add_WithFeedback,23,24,1
+block_hint,Subtract_WithFeedback,74,75,1
+block_hint,Subtract_WithFeedback,82,83,0
+block_hint,Subtract_WithFeedback,76,77,0
+block_hint,Subtract_WithFeedback,53,54,0
+block_hint,Subtract_WithFeedback,23,24,1
+block_hint,Modulus_WithFeedback,76,77,0
+block_hint,Modulus_WithFeedback,72,73,0
+block_hint,Modulus_WithFeedback,55,56,1
+block_hint,Modulus_WithFeedback,50,51,1
+block_hint,Modulus_WithFeedback,18,19,0
 block_hint,Modulus_WithFeedback,6,7,1
 block_hint,BitwiseOr_WithFeedback,6,7,1
 block_hint,BitwiseOr_WithFeedback,35,36,0
@@ -2227,43 +2300,43 @@ block_hint,ObjectCreate,13,14,1
 block_hint,ObjectCreate,15,16,1
 block_hint,ObjectCreate,20,21,0
 block_hint,ObjectCreate,61,62,1
-block_hint,ObjectGetOwnPropertyDescriptor,493,494,1
-block_hint,ObjectGetOwnPropertyDescriptor,490,491,0
-block_hint,ObjectGetOwnPropertyDescriptor,487,488,0
-block_hint,ObjectGetOwnPropertyDescriptor,479,480,1
-block_hint,ObjectGetOwnPropertyDescriptor,466,467,1
-block_hint,ObjectGetOwnPropertyDescriptor,384,385,0
-block_hint,ObjectGetOwnPropertyDescriptor,444,445,1
+block_hint,ObjectGetOwnPropertyDescriptor,519,520,1
+block_hint,ObjectGetOwnPropertyDescriptor,516,517,0
+block_hint,ObjectGetOwnPropertyDescriptor,513,514,0
+block_hint,ObjectGetOwnPropertyDescriptor,505,506,1
+block_hint,ObjectGetOwnPropertyDescriptor,492,493,1
+block_hint,ObjectGetOwnPropertyDescriptor,408,409,0
+block_hint,ObjectGetOwnPropertyDescriptor,470,471,1
+block_hint,ObjectGetOwnPropertyDescriptor,488,489,0
+block_hint,ObjectGetOwnPropertyDescriptor,434,435,0
+block_hint,ObjectGetOwnPropertyDescriptor,467,468,1
+block_hint,ObjectGetOwnPropertyDescriptor,410,411,1
 block_hint,ObjectGetOwnPropertyDescriptor,462,463,0
-block_hint,ObjectGetOwnPropertyDescriptor,410,411,0
-block_hint,ObjectGetOwnPropertyDescriptor,441,442,1
-block_hint,ObjectGetOwnPropertyDescriptor,386,387,1
+block_hint,ObjectGetOwnPropertyDescriptor,464,465,0
 block_hint,ObjectGetOwnPropertyDescriptor,436,437,0
-block_hint,ObjectGetOwnPropertyDescriptor,438,439,0
-block_hint,ObjectGetOwnPropertyDescriptor,412,413,0
-block_hint,ObjectGetOwnPropertyDescriptor,382,383,0
-block_hint,ObjectGetOwnPropertyDescriptor,312,313,0
-block_hint,ObjectGetOwnPropertyDescriptor,184,185,1
-block_hint,ObjectGetOwnPropertyDescriptor,134,135,1
-block_hint,ObjectGetOwnPropertyDescriptor,140,141,0
-block_hint,ObjectGetOwnPropertyDescriptor,473,474,0
-block_hint,ObjectGetOwnPropertyDescriptor,481,482,1
-block_hint,ObjectGetOwnPropertyDescriptor,469,470,0
-block_hint,ObjectGetOwnPropertyDescriptor,402,403,0
-block_hint,ObjectGetOwnPropertyDescriptor,310,311,0
+block_hint,ObjectGetOwnPropertyDescriptor,406,407,0
+block_hint,ObjectGetOwnPropertyDescriptor,331,332,0
+block_hint,ObjectGetOwnPropertyDescriptor,197,198,1
+block_hint,ObjectGetOwnPropertyDescriptor,307,308,1
+block_hint,ObjectGetOwnPropertyDescriptor,138,139,0
+block_hint,ObjectGetOwnPropertyDescriptor,499,500,0
+block_hint,ObjectGetOwnPropertyDescriptor,507,508,1
+block_hint,ObjectGetOwnPropertyDescriptor,495,496,0
+block_hint,ObjectGetOwnPropertyDescriptor,426,427,0
+block_hint,ObjectGetOwnPropertyDescriptor,329,330,0
 block_hint,ObjectGetOwnPropertyDescriptor,31,32,1
-block_hint,ObjectGetOwnPropertyDescriptor,340,341,1
+block_hint,ObjectGetOwnPropertyDescriptor,361,362,1
 block_hint,ObjectGetOwnPropertyDescriptor,150,151,0
-block_hint,ObjectGetOwnPropertyDescriptor,448,449,0
-block_hint,ObjectGetOwnPropertyDescriptor,367,368,0
-block_hint,ObjectGetOwnPropertyDescriptor,249,250,0
-block_hint,ObjectGetOwnPropertyDescriptor,245,246,0
-block_hint,ObjectGetOwnPropertyDescriptor,265,266,0
-block_hint,ObjectGetOwnPropertyDescriptor,267,268,1
+block_hint,ObjectGetOwnPropertyDescriptor,474,475,0
+block_hint,ObjectGetOwnPropertyDescriptor,390,391,0
+block_hint,ObjectGetOwnPropertyDescriptor,264,265,0
+block_hint,ObjectGetOwnPropertyDescriptor,260,261,0
+block_hint,ObjectGetOwnPropertyDescriptor,282,283,0
+block_hint,ObjectGetOwnPropertyDescriptor,284,285,1
 block_hint,ObjectGetOwnPropertyDescriptor,36,37,1
-block_hint,ObjectGetOwnPropertyDescriptor,344,345,1
-block_hint,ObjectGetOwnPropertyDescriptor,174,175,0
-block_hint,ObjectGetOwnPropertyDescriptor,253,254,1
+block_hint,ObjectGetOwnPropertyDescriptor,365,366,1
+block_hint,ObjectGetOwnPropertyDescriptor,186,187,0
+block_hint,ObjectGetOwnPropertyDescriptor,268,269,1
 block_hint,ObjectKeys,32,33,1
 block_hint,ObjectKeys,27,28,1
 block_hint,ObjectKeys,23,24,1
@@ -2274,29 +2347,33 @@ block_hint,ObjectKeys,21,22,1
 block_hint,ObjectKeys,9,10,0
 block_hint,ObjectKeys,7,8,1
 block_hint,ObjectKeys,14,15,1
-block_hint,ObjectPrototypeHasOwnProperty,212,213,1
-block_hint,ObjectPrototypeHasOwnProperty,190,191,1
-block_hint,ObjectPrototypeHasOwnProperty,206,207,1
-block_hint,ObjectPrototypeHasOwnProperty,223,224,0
-block_hint,ObjectPrototypeHasOwnProperty,203,204,0
-block_hint,ObjectPrototypeHasOwnProperty,194,195,1
-block_hint,ObjectPrototypeHasOwnProperty,156,157,1
-block_hint,ObjectPrototypeHasOwnProperty,217,218,0
+block_hint,ObjectPrototypeHasOwnProperty,230,231,1
+block_hint,ObjectPrototypeHasOwnProperty,205,206,1
+block_hint,ObjectPrototypeHasOwnProperty,222,223,1
+block_hint,ObjectPrototypeHasOwnProperty,241,242,0
 block_hint,ObjectPrototypeHasOwnProperty,219,220,0
-block_hint,ObjectPrototypeHasOwnProperty,215,216,0
-block_hint,ObjectPrototypeHasOwnProperty,210,211,0
-block_hint,ObjectPrototypeHasOwnProperty,183,184,1
-block_hint,ObjectPrototypeHasOwnProperty,131,132,0
-block_hint,ObjectPrototypeHasOwnProperty,196,197,0
-block_hint,ObjectPrototypeHasOwnProperty,33,34,1
-block_hint,ObjectPrototypeHasOwnProperty,72,73,0
-block_hint,ObjectPrototypeHasOwnProperty,37,38,1
-block_hint,ObjectPrototypeHasOwnProperty,50,51,0
-block_hint,ObjectPrototypeHasOwnProperty,39,40,0
-block_hint,ObjectPrototypeHasOwnProperty,136,137,1
-block_hint,ObjectPrototypeHasOwnProperty,164,165,0
-block_hint,ObjectPrototypeHasOwnProperty,169,170,1
-block_hint,ObjectPrototypeHasOwnProperty,54,55,0
+block_hint,ObjectPrototypeHasOwnProperty,209,210,1
+block_hint,ObjectPrototypeHasOwnProperty,163,164,1
+block_hint,ObjectPrototypeHasOwnProperty,235,236,0
+block_hint,ObjectPrototypeHasOwnProperty,237,238,0
+block_hint,ObjectPrototypeHasOwnProperty,233,234,0
+block_hint,ObjectPrototypeHasOwnProperty,228,229,0
+block_hint,ObjectPrototypeHasOwnProperty,192,193,1
+block_hint,ObjectPrototypeHasOwnProperty,137,138,0
+block_hint,ObjectPrototypeHasOwnProperty,211,212,0
+block_hint,ObjectPrototypeHasOwnProperty,175,176,1
+block_hint,ObjectPrototypeHasOwnProperty,141,142,0
+block_hint,ObjectPrototypeHasOwnProperty,226,227,0
+block_hint,ObjectPrototypeHasOwnProperty,76,77,0
+block_hint,ObjectPrototypeHasOwnProperty,203,204,0
+block_hint,ObjectPrototypeHasOwnProperty,34,35,1
+block_hint,ObjectPrototypeHasOwnProperty,52,53,0
+block_hint,ObjectPrototypeHasOwnProperty,36,37,0
+block_hint,ObjectPrototypeHasOwnProperty,197,198,1
+block_hint,ObjectPrototypeHasOwnProperty,40,41,0
+block_hint,ObjectPrototypeHasOwnProperty,171,172,0
+block_hint,ObjectPrototypeHasOwnProperty,178,179,1
+block_hint,ObjectPrototypeHasOwnProperty,58,59,0
 block_hint,ObjectToString,42,43,0
 block_hint,ObjectToString,57,58,0
 block_hint,ObjectToString,65,66,0
@@ -2329,34 +2406,38 @@ block_hint,ForInEnumerate,9,10,1
 block_hint,ForInPrepare,7,8,1
 block_hint,ForInPrepare,12,13,1
 block_hint,ForInPrepare,5,6,1
-block_hint,ForInFilter,226,227,1
-block_hint,ForInFilter,228,229,1
-block_hint,ForInFilter,219,220,0
-block_hint,ForInFilter,115,116,1
-block_hint,ForInFilter,210,211,0
-block_hint,ForInFilter,60,61,0
-block_hint,ForInFilter,125,126,1
-block_hint,ForInFilter,214,215,1
-block_hint,ForInFilter,101,102,0
+block_hint,ForInFilter,234,235,1
+block_hint,ForInFilter,236,237,1
+block_hint,ForInFilter,227,228,0
+block_hint,ForInFilter,117,118,1
+block_hint,ForInFilter,217,218,0
+block_hint,ForInFilter,62,63,0
+block_hint,ForInFilter,129,130,1
+block_hint,ForInFilter,221,222,1
 block_hint,ForInFilter,103,104,0
+block_hint,ForInFilter,105,106,0
+block_hint,ForInFilter,66,67,0
 block_hint,ForInFilter,64,65,0
-block_hint,ForInFilter,62,63,0
-block_hint,ForInFilter,241,242,0
-block_hint,ForInFilter,105,106,1
-block_hint,ForInFilter,39,40,1
-block_hint,ForInFilter,217,218,0
+block_hint,ForInFilter,270,271,0
+block_hint,ForInFilter,225,226,1
+block_hint,ForInFilter,109,110,1
+block_hint,ForInFilter,71,72,0
+block_hint,ForInFilter,266,267,0
+block_hint,ForInFilter,264,265,0
+block_hint,ForInFilter,251,252,0
 block_hint,ForInFilter,107,108,1
-block_hint,ForInFilter,43,44,1
-block_hint,ForInFilter,196,197,0
-block_hint,ForInFilter,45,46,0
-block_hint,ForInFilter,70,71,1
-block_hint,ForInFilter,111,112,0
-block_hint,ForInFilter,127,128,0
-block_hint,ForInFilter,37,38,0
-block_hint,ForInFilter,238,239,0
-block_hint,ForInFilter,243,244,1
-block_hint,ForInFilter,184,185,0
-block_hint,ForInFilter,34,35,1
+block_hint,ForInFilter,40,41,1
+block_hint,ForInFilter,201,202,0
+block_hint,ForInFilter,42,43,0
+block_hint,ForInFilter,144,145,1
+block_hint,ForInFilter,46,47,0
+block_hint,ForInFilter,113,114,0
+block_hint,ForInFilter,131,132,0
+block_hint,ForInFilter,36,37,0
+block_hint,ForInFilter,248,249,0
+block_hint,ForInFilter,255,256,1
+block_hint,ForInFilter,189,190,0
+block_hint,ForInFilter,33,34,1
 block_hint,RegExpConstructor,55,56,1
 block_hint,RegExpConstructor,7,8,1
 block_hint,RegExpConstructor,131,132,1
@@ -2390,42 +2471,42 @@ block_hint,FindOrderedHashSetEntry,42,43,1
 block_hint,FindOrderedHashSetEntry,68,69,0
 block_hint,FindOrderedHashSetEntry,58,59,1
 block_hint,FindOrderedHashSetEntry,60,61,1
-block_hint,SetConstructor,193,194,1
-block_hint,SetConstructor,71,72,0
+block_hint,SetConstructor,202,203,1
+block_hint,SetConstructor,74,75,0
 block_hint,SetConstructor,11,12,1
-block_hint,SetConstructor,168,169,1
-block_hint,SetConstructor,130,131,1
-block_hint,SetConstructor,54,55,0
-block_hint,SetConstructor,56,57,1
-block_hint,SetConstructor,207,208,1
-block_hint,SetConstructor,199,200,0
-block_hint,SetConstructor,76,77,1
+block_hint,SetConstructor,172,173,1
+block_hint,SetConstructor,135,136,1
+block_hint,SetConstructor,56,57,0
+block_hint,SetConstructor,58,59,1
+block_hint,SetConstructor,218,219,1
+block_hint,SetConstructor,210,211,0
+block_hint,SetConstructor,79,80,1
 block_hint,SetConstructor,23,24,1
-block_hint,SetConstructor,211,212,1
-block_hint,SetConstructor,203,204,0
-block_hint,SetConstructor,144,145,1
+block_hint,SetConstructor,222,223,1
+block_hint,SetConstructor,214,215,0
+block_hint,SetConstructor,150,151,1
 block_hint,SetConstructor,25,26,1
-block_hint,SetConstructor,172,173,1
-block_hint,SetConstructor,137,138,1
-block_hint,SetConstructor,80,81,1
-block_hint,SetConstructor,82,83,1
-block_hint,SetConstructor,84,85,1
-block_hint,SetConstructor,86,87,1
-block_hint,SetConstructor,88,89,1
-block_hint,SetConstructor,90,91,1
-block_hint,SetConstructor,32,33,1
-block_hint,SetConstructor,92,93,1
-block_hint,SetConstructor,140,141,1
+block_hint,SetConstructor,178,179,1
+block_hint,SetConstructor,143,144,1
+block_hint,SetConstructor,83,84,1
+block_hint,SetConstructor,85,86,1
+block_hint,SetConstructor,87,88,1
+block_hint,SetConstructor,89,90,1
+block_hint,SetConstructor,91,92,1
+block_hint,SetConstructor,93,94,1
+block_hint,SetConstructor,34,35,1
+block_hint,SetConstructor,95,96,1
 block_hint,SetConstructor,146,147,1
+block_hint,SetConstructor,152,153,1
+block_hint,SetConstructor,190,191,0
 block_hint,SetConstructor,183,184,0
-block_hint,SetConstructor,176,177,0
-block_hint,SetConstructor,148,149,0
-block_hint,SetConstructor,102,103,0
-block_hint,SetConstructor,132,133,1
+block_hint,SetConstructor,154,155,0
+block_hint,SetConstructor,105,106,0
+block_hint,SetConstructor,137,138,1
 block_hint,SetConstructor,27,28,1
-block_hint,SetConstructor,60,61,1
-block_hint,SetConstructor,159,160,0
-block_hint,SetConstructor,64,65,1
+block_hint,SetConstructor,62,63,1
+block_hint,SetConstructor,176,177,0
+block_hint,SetConstructor,66,67,1
 block_hint,SetPrototypeHas,10,11,1
 block_hint,SetPrototypeHas,5,6,1
 block_hint,SetPrototypeHas,7,8,1
@@ -2580,35 +2661,36 @@ block_hint,TypedArrayPrototypeLength,52,53,0
 block_hint,TypedArrayPrototypeLength,44,45,0
 block_hint,TypedArrayPrototypeLength,28,29,0
 block_hint,TypedArrayPrototypeLength,19,20,0
-block_hint,WeakMapConstructor,346,347,1
-block_hint,WeakMapConstructor,266,267,1
-block_hint,WeakMapConstructor,115,116,0
-block_hint,WeakMapConstructor,14,15,1
-block_hint,WeakMapConstructor,288,289,1
-block_hint,WeakMapConstructor,226,227,1
-block_hint,WeakMapConstructor,90,91,0
-block_hint,WeakMapConstructor,92,93,1
-block_hint,WeakMapConstructor,290,291,1
-block_hint,WeakMapConstructor,323,324,0
-block_hint,WeakMapConstructor,337,338,0
-block_hint,WeakMapConstructor,236,237,0
+block_hint,WeakMapConstructor,351,352,1
+block_hint,WeakMapConstructor,271,272,1
 block_hint,WeakMapConstructor,119,120,0
-block_hint,WeakMapConstructor,238,239,0
-block_hint,WeakMapConstructor,106,107,0
-block_hint,WeakMapConstructor,240,241,1
-block_hint,WeakMapConstructor,207,208,1
+block_hint,WeakMapConstructor,14,15,1
+block_hint,WeakMapConstructor,293,294,1
+block_hint,WeakMapConstructor,230,231,1
+block_hint,WeakMapConstructor,93,94,0
+block_hint,WeakMapConstructor,95,96,1
+block_hint,WeakMapConstructor,295,296,1
+block_hint,WeakMapConstructor,331,332,0
+block_hint,WeakMapConstructor,342,343,0
+block_hint,WeakMapConstructor,239,240,0
+block_hint,WeakMapConstructor,123,124,0
+block_hint,WeakMapConstructor,241,242,0
+block_hint,WeakMapConstructor,109,110,0
+block_hint,WeakMapConstructor,243,244,1
+block_hint,WeakMapConstructor,211,212,1
 block_hint,WeakMapConstructor,28,29,1
 block_hint,WeakMapConstructor,30,31,1
 block_hint,WeakMapConstructor,32,33,1
-block_hint,WeakMapConstructor,95,96,0
-block_hint,WeakMapConstructor,113,114,1
-block_hint,WeakMapLookupHashIndex,10,11,1
-block_hint,WeakMapLookupHashIndex,12,13,1
-block_hint,WeakMapLookupHashIndex,14,15,0
-block_hint,WeakMapLookupHashIndex,16,17,0
+block_hint,WeakMapConstructor,98,99,0
+block_hint,WeakMapConstructor,117,118,1
+block_hint,WeakMapLookupHashIndex,9,10,1
+block_hint,WeakMapLookupHashIndex,31,32,1
+block_hint,WeakMapLookupHashIndex,11,12,0
+block_hint,WeakMapLookupHashIndex,13,14,0
 block_hint,WeakMapLookupHashIndex,25,26,1
-block_hint,WeakMapLookupHashIndex,21,22,0
-block_hint,WeakMapLookupHashIndex,18,19,0
+block_hint,WeakMapLookupHashIndex,33,34,1
+block_hint,WeakMapLookupHashIndex,27,28,0
+block_hint,WeakMapLookupHashIndex,23,24,0
 block_hint,WeakMapGet,12,13,1
 block_hint,WeakMapGet,7,8,1
 block_hint,WeakMapGet,9,10,1
@@ -2616,31 +2698,32 @@ block_hint,WeakMapGet,3,4,1
 block_hint,WeakMapPrototypeHas,10,11,1
 block_hint,WeakMapPrototypeHas,5,6,1
 block_hint,WeakMapPrototypeHas,7,8,1
-block_hint,WeakMapPrototypeSet,17,18,1
-block_hint,WeakMapPrototypeSet,6,7,1
-block_hint,WeakMapPrototypeSet,8,9,1
-block_hint,WeakMapPrototypeSet,10,11,1
-block_hint,WeakMapPrototypeSet,12,13,1
-block_hint,WeakMapPrototypeSet,14,15,0
-block_hint,WeakMapPrototypeSet,4,5,0
-block_hint,WeakCollectionSet,18,19,0
-block_hint,WeakCollectionSet,6,7,1
-block_hint,WeakCollectionSet,14,15,0
+block_hint,WeakMapPrototypeSet,24,25,1
+block_hint,WeakMapPrototypeSet,5,6,1
+block_hint,WeakMapPrototypeSet,7,8,1
+block_hint,WeakMapPrototypeSet,13,14,1
+block_hint,WeakMapPrototypeSet,22,23,1
+block_hint,WeakMapPrototypeSet,15,16,0
+block_hint,WeakMapPrototypeSet,9,10,0
+block_hint,WeakCollectionSet,17,18,1
+block_hint,WeakCollectionSet,20,21,0
+block_hint,WeakCollectionSet,7,8,1
+block_hint,WeakCollectionSet,13,14,0
 block_hint,AsyncGeneratorResolve,9,10,1
 block_hint,AsyncGeneratorResolve,3,4,1
 block_hint,AsyncGeneratorResolve,11,12,0
 block_hint,AsyncGeneratorResolve,7,8,0
-block_hint,AsyncGeneratorYield,24,25,1
-block_hint,AsyncGeneratorYield,19,20,0
-block_hint,AsyncGeneratorYield,6,7,1
-block_hint,AsyncGeneratorYield,42,43,1
-block_hint,AsyncGeneratorYield,37,38,0
-block_hint,AsyncGeneratorYield,28,29,1
-block_hint,AsyncGeneratorYield,8,9,1
-block_hint,AsyncGeneratorYield,10,11,1
-block_hint,AsyncGeneratorYield,12,13,1
-block_hint,AsyncGeneratorYield,14,15,1
-block_hint,AsyncGeneratorYield,22,23,0
+block_hint,AsyncGeneratorYieldWithAwait,24,25,1
+block_hint,AsyncGeneratorYieldWithAwait,19,20,0
+block_hint,AsyncGeneratorYieldWithAwait,6,7,1
+block_hint,AsyncGeneratorYieldWithAwait,42,43,1
+block_hint,AsyncGeneratorYieldWithAwait,37,38,0
+block_hint,AsyncGeneratorYieldWithAwait,28,29,1
+block_hint,AsyncGeneratorYieldWithAwait,8,9,1
+block_hint,AsyncGeneratorYieldWithAwait,10,11,1
+block_hint,AsyncGeneratorYieldWithAwait,12,13,1
+block_hint,AsyncGeneratorYieldWithAwait,14,15,1
+block_hint,AsyncGeneratorYieldWithAwait,22,23,0
 block_hint,AsyncGeneratorResumeNext,18,19,0
 block_hint,AsyncGeneratorResumeNext,14,15,0
 block_hint,AsyncGeneratorPrototypeNext,27,28,1
@@ -2667,8 +2750,8 @@ block_hint,AsyncGeneratorAwaitUncaught,22,23,0
 block_hint,AsyncGeneratorAwaitResolveClosure,8,9,1
 block_hint,AsyncGeneratorAwaitResolveClosure,2,3,1
 block_hint,AsyncGeneratorAwaitResolveClosure,6,7,0
-block_hint,AsyncGeneratorYieldResolveClosure,5,6,1
-block_hint,AsyncGeneratorYieldResolveClosure,2,3,1
+block_hint,AsyncGeneratorYieldWithAwaitResolveClosure,5,6,1
+block_hint,AsyncGeneratorYieldWithAwaitResolveClosure,2,3,1
 block_hint,StringAdd_CheckNone,19,20,1
 block_hint,StringAdd_CheckNone,58,59,0
 block_hint,StringAdd_CheckNone,78,79,1
@@ -2714,108 +2797,113 @@ block_hint,SubString,139,140,0
 block_hint,SubString,103,104,1
 block_hint,SubString,34,35,1
 block_hint,SubString,31,32,0
-block_hint,GetProperty,53,54,1
-block_hint,GetProperty,98,99,0
-block_hint,GetProperty,168,169,1
-block_hint,GetProperty,195,196,0
-block_hint,GetProperty,158,159,1
-block_hint,GetProperty,130,131,1
-block_hint,GetProperty,57,58,1
-block_hint,GetProperty,136,137,0
-block_hint,GetProperty,138,139,0
-block_hint,GetProperty,107,108,0
-block_hint,GetProperty,59,60,0
-block_hint,GetProperty,160,161,0
-block_hint,GetProperty,179,180,0
-block_hint,GetProperty,140,141,1
-block_hint,GetProperty,199,200,0
-block_hint,GetProperty,38,39,1
-block_hint,GetProperty,207,208,0
-block_hint,GetProperty,40,41,0
-block_hint,GetProperty,144,145,0
-block_hint,GetProperty,110,111,1
-block_hint,GetProperty,44,45,0
-block_hint,GetProperty,150,151,0
-block_hint,GetProperty,154,155,1
-block_hint,GetProperty,148,149,0
-block_hint,GetProperty,46,47,0
-block_hint,GetProperty,214,215,0
-block_hint,GetProperty,186,187,1
-block_hint,GetProperty,89,90,0
-block_hint,GetProperty,91,92,0
-block_hint,GetProperty,93,94,0
-block_hint,GetProperty,156,157,0
-block_hint,GetProperty,95,96,1
-block_hint,GetProperty,193,194,0
-block_hint,GetProperty,211,212,0
-block_hint,GetProperty,216,217,1
-block_hint,GetProperty,191,192,0
-block_hint,GetProperty,189,190,0
-block_hint,GetProperty,23,24,0
+block_hint,GetProperty,56,57,1
+block_hint,GetProperty,101,102,0
 block_hint,GetProperty,175,176,1
-block_hint,GetProperty,101,102,1
-block_hint,GetPropertyWithReceiver,55,56,1
-block_hint,GetPropertyWithReceiver,57,58,1
-block_hint,GetPropertyWithReceiver,193,194,0
-block_hint,GetPropertyWithReceiver,167,168,1
-block_hint,GetPropertyWithReceiver,201,202,0
-block_hint,GetPropertyWithReceiver,109,110,0
-block_hint,GetPropertyWithReceiver,155,156,1
-block_hint,GetPropertyWithReceiver,135,136,1
-block_hint,GetPropertyWithReceiver,59,60,1
-block_hint,GetPropertyWithReceiver,141,142,0
-block_hint,GetPropertyWithReceiver,143,144,0
-block_hint,GetPropertyWithReceiver,111,112,0
-block_hint,GetPropertyWithReceiver,61,62,0
-block_hint,GetPropertyWithReceiver,157,158,0
-block_hint,GetPropertyWithReceiver,145,146,1
-block_hint,GetPropertyWithReceiver,206,207,0
-block_hint,GetPropertyWithReceiver,147,148,1
-block_hint,GetPropertyWithReceiver,41,42,1
-block_hint,GetPropertyWithReceiver,219,220,0
-block_hint,GetPropertyWithReceiver,43,44,0
-block_hint,GetPropertyWithReceiver,176,177,0
-block_hint,GetPropertyWithReceiver,35,36,0
-block_hint,GetPropertyWithReceiver,216,217,1
-block_hint,GetPropertyWithReceiver,195,196,0
+block_hint,GetProperty,205,206,0
+block_hint,GetProperty,165,166,1
+block_hint,GetProperty,133,134,1
+block_hint,GetProperty,60,61,1
+block_hint,GetProperty,139,140,0
+block_hint,GetProperty,141,142,0
+block_hint,GetProperty,110,111,0
+block_hint,GetProperty,62,63,0
+block_hint,GetProperty,167,168,0
+block_hint,GetProperty,220,221,0
+block_hint,GetProperty,210,211,1
+block_hint,GetProperty,112,113,0
+block_hint,GetProperty,231,232,0
+block_hint,GetProperty,222,223,0
+block_hint,GetProperty,218,219,0
+block_hint,GetProperty,35,36,1
+block_hint,GetProperty,224,225,0
+block_hint,GetProperty,37,38,0
+block_hint,GetProperty,147,148,0
+block_hint,GetProperty,187,188,1
+block_hint,GetProperty,41,42,0
+block_hint,GetProperty,43,44,0
+block_hint,GetProperty,157,158,0
+block_hint,GetProperty,161,162,1
+block_hint,GetProperty,151,152,0
+block_hint,GetProperty,47,48,0
+block_hint,GetProperty,233,234,0
+block_hint,GetProperty,196,197,1
+block_hint,GetProperty,92,93,0
+block_hint,GetProperty,94,95,0
+block_hint,GetProperty,96,97,0
+block_hint,GetProperty,163,164,0
+block_hint,GetProperty,98,99,1
+block_hint,GetProperty,203,204,0
+block_hint,GetProperty,228,229,0
+block_hint,GetProperty,235,236,1
+block_hint,GetProperty,201,202,0
+block_hint,GetProperty,199,200,0
+block_hint,GetProperty,22,23,0
+block_hint,GetProperty,182,183,1
+block_hint,GetProperty,104,105,1
+block_hint,GetPropertyWithReceiver,58,59,1
+block_hint,GetPropertyWithReceiver,60,61,1
+block_hint,GetPropertyWithReceiver,203,204,0
 block_hint,GetPropertyWithReceiver,174,175,1
-block_hint,GetPropertyWithReceiver,105,106,1
-block_hint,SetProperty,375,376,1
-block_hint,SetProperty,377,378,0
-block_hint,SetProperty,1159,1160,0
-block_hint,SetProperty,915,916,1
-block_hint,SetProperty,1020,1021,1
-block_hint,SetProperty,1022,1023,0
-block_hint,SetProperty,728,729,0
-block_hint,SetProperty,909,910,1
-block_hint,SetProperty,409,410,0
-block_hint,SetProperty,411,412,0
-block_hint,SetProperty,253,254,1
+block_hint,GetPropertyWithReceiver,211,212,0
+block_hint,GetPropertyWithReceiver,112,113,0
+block_hint,GetPropertyWithReceiver,162,163,1
+block_hint,GetPropertyWithReceiver,138,139,1
+block_hint,GetPropertyWithReceiver,62,63,1
+block_hint,GetPropertyWithReceiver,144,145,0
+block_hint,GetPropertyWithReceiver,146,147,0
+block_hint,GetPropertyWithReceiver,114,115,0
+block_hint,GetPropertyWithReceiver,64,65,0
+block_hint,GetPropertyWithReceiver,164,165,0
+block_hint,GetPropertyWithReceiver,217,218,1
+block_hint,GetPropertyWithReceiver,117,118,0
+block_hint,GetPropertyWithReceiver,238,239,0
+block_hint,GetPropertyWithReceiver,234,235,0
+block_hint,GetPropertyWithReceiver,225,226,0
+block_hint,GetPropertyWithReceiver,148,149,1
+block_hint,GetPropertyWithReceiver,38,39,1
+block_hint,GetPropertyWithReceiver,236,237,0
+block_hint,GetPropertyWithReceiver,40,41,0
+block_hint,GetPropertyWithReceiver,183,184,0
+block_hint,GetPropertyWithReceiver,34,35,0
+block_hint,GetPropertyWithReceiver,231,232,1
+block_hint,GetPropertyWithReceiver,205,206,0
+block_hint,SetProperty,379,380,1
+block_hint,SetProperty,381,382,0
+block_hint,SetProperty,1201,1202,0
+block_hint,SetProperty,925,926,1
+block_hint,SetProperty,1034,1035,1
+block_hint,SetProperty,1036,1037,0
+block_hint,SetProperty,733,734,0
+block_hint,SetProperty,919,920,1
 block_hint,SetProperty,413,414,0
-block_hint,SetProperty,625,626,1
-block_hint,SetProperty,93,94,1
-block_hint,SetProperty,95,96,1
-block_hint,SetProperty,1061,1062,0
-block_hint,SetProperty,800,801,1
-block_hint,SetProperty,802,803,1
-block_hint,SetProperty,804,805,0
-block_hint,SetProperty,105,106,1
-block_hint,SetProperty,109,110,1
-block_hint,SetProperty,425,426,1
-block_hint,SetProperty,111,112,1
-block_hint,SetProperty,107,108,1
-block_hint,CreateDataProperty,317,318,1
-block_hint,CreateDataProperty,319,320,0
-block_hint,CreateDataProperty,955,956,0
-block_hint,CreateDataProperty,772,773,1
-block_hint,CreateDataProperty,860,861,1
-block_hint,CreateDataProperty,536,537,1
-block_hint,CreateDataProperty,638,639,0
-block_hint,CreateDataProperty,640,641,1
-block_hint,CreateDataProperty,886,887,1
-block_hint,CreateDataProperty,331,332,0
+block_hint,SetProperty,415,416,0
+block_hint,SetProperty,256,257,1
+block_hint,SetProperty,417,418,0
+block_hint,SetProperty,630,631,1
+block_hint,SetProperty,92,93,1
+block_hint,SetProperty,94,95,1
+block_hint,SetProperty,1089,1090,0
+block_hint,SetProperty,808,809,1
+block_hint,SetProperty,810,811,1
+block_hint,SetProperty,812,813,0
+block_hint,SetProperty,104,105,1
+block_hint,SetProperty,108,109,1
+block_hint,SetProperty,429,430,1
+block_hint,SetProperty,110,111,1
+block_hint,SetProperty,106,107,1
+block_hint,CreateDataProperty,319,320,1
+block_hint,CreateDataProperty,321,322,0
+block_hint,CreateDataProperty,978,979,0
+block_hint,CreateDataProperty,779,780,1
+block_hint,CreateDataProperty,868,869,1
+block_hint,CreateDataProperty,539,540,1
+block_hint,CreateDataProperty,645,646,0
+block_hint,CreateDataProperty,647,648,1
+block_hint,CreateDataProperty,903,904,1
+block_hint,CreateDataProperty,333,334,0
 block_hint,CreateDataProperty,55,56,1
-block_hint,CreateDataProperty,540,541,1
+block_hint,CreateDataProperty,543,544,1
 block_hint,CreateDataProperty,57,58,1
 block_hint,ArrayPrototypeConcat,79,80,1
 block_hint,ArrayPrototypeConcat,54,55,0
@@ -3928,9 +4016,11 @@ block_hint,ParseInt,10,11,0
 block_hint,NumberParseInt,3,4,1
 block_hint,Add,66,67,1
 block_hint,Add,24,25,0
+block_hint,Add,52,53,1
 block_hint,Add,68,69,0
 block_hint,Add,35,36,0
 block_hint,Add,40,41,0
+block_hint,Add,29,30,1
 block_hint,Subtract,24,25,0
 block_hint,Subtract,9,10,0
 block_hint,Subtract,22,23,0
@@ -4001,16 +4091,17 @@ block_hint,PerformPromiseThen,20,21,1
 block_hint,PerformPromiseThen,115,116,1
 block_hint,PromiseFulfillReactionJob,22,23,0
 block_hint,PromiseFulfillReactionJob,2,3,1
-block_hint,ResolvePromise,27,28,0
 block_hint,ResolvePromise,29,30,0
-block_hint,ResolvePromise,15,16,1
-block_hint,ResolvePromise,45,46,0
 block_hint,ResolvePromise,31,32,0
+block_hint,ResolvePromise,15,16,1
+block_hint,ResolvePromise,47,48,0
+block_hint,ResolvePromise,33,34,0
 block_hint,ResolvePromise,6,7,1
 block_hint,ResolvePromise,17,18,0
-block_hint,ResolvePromise,51,52,1
-block_hint,ResolvePromise,47,48,0
-block_hint,ResolvePromise,21,22,0
+block_hint,ResolvePromise,19,20,1
+block_hint,ResolvePromise,53,54,1
+block_hint,ResolvePromise,49,50,0
+block_hint,ResolvePromise,23,24,0
 block_hint,ProxyConstructor,30,31,1
 block_hint,ProxyConstructor,10,11,0
 block_hint,ProxyConstructor,22,23,1
@@ -4021,30 +4112,30 @@ block_hint,ProxyConstructor,7,8,1
 block_hint,ProxyConstructor,17,18,1
 block_hint,ProxyConstructor,5,6,1
 block_hint,ProxyConstructor,12,13,1
-block_hint,ProxyGetProperty,139,140,1
-block_hint,ProxyGetProperty,33,34,0
-block_hint,ProxyGetProperty,11,12,0
-block_hint,ProxyGetProperty,82,83,0
-block_hint,ProxyGetProperty,84,85,0
-block_hint,ProxyGetProperty,78,79,1
-block_hint,ProxyGetProperty,80,81,1
-block_hint,ProxyGetProperty,160,161,1
-block_hint,ProxyGetProperty,163,164,0
-block_hint,ProxyGetProperty,108,109,0
-block_hint,ProxyGetProperty,37,38,1
-block_hint,ProxyGetProperty,21,22,1
-block_hint,ProxyGetProperty,27,28,0
-block_hint,ProxyGetProperty,29,30,1
-block_hint,ProxyGetProperty,189,190,1
-block_hint,ProxyGetProperty,179,180,0
-block_hint,ProxyGetProperty,69,70,1
-block_hint,ProxyGetProperty,31,32,0
-block_hint,ProxyGetProperty,151,152,0
-block_hint,ProxyGetProperty,170,171,1
-block_hint,ProxyGetProperty,121,122,1
 block_hint,ProxyGetProperty,153,154,1
-block_hint,ProxyGetProperty,155,156,0
-block_hint,ProxyGetProperty,53,54,0
+block_hint,ProxyGetProperty,34,35,0
+block_hint,ProxyGetProperty,10,11,0
+block_hint,ProxyGetProperty,89,90,0
+block_hint,ProxyGetProperty,91,92,0
+block_hint,ProxyGetProperty,85,86,1
+block_hint,ProxyGetProperty,87,88,1
+block_hint,ProxyGetProperty,176,177,1
+block_hint,ProxyGetProperty,180,181,0
+block_hint,ProxyGetProperty,118,119,0
+block_hint,ProxyGetProperty,40,41,1
+block_hint,ProxyGetProperty,114,115,1
+block_hint,ProxyGetProperty,24,25,0
+block_hint,ProxyGetProperty,26,27,1
+block_hint,ProxyGetProperty,208,209,1
+block_hint,ProxyGetProperty,198,199,0
+block_hint,ProxyGetProperty,149,150,1
+block_hint,ProxyGetProperty,28,29,0
+block_hint,ProxyGetProperty,167,168,0
+block_hint,ProxyGetProperty,187,188,1
+block_hint,ProxyGetProperty,131,132,1
+block_hint,ProxyGetProperty,169,170,1
+block_hint,ProxyGetProperty,171,172,0
+block_hint,ProxyGetProperty,60,61,0
 block_hint,ReflectGet,20,21,1
 block_hint,ReflectGet,15,16,0
 block_hint,ReflectGet,5,6,1
@@ -4054,162 +4145,164 @@ block_hint,ReflectGet,9,10,0
 block_hint,ReflectHas,8,9,1
 block_hint,ReflectHas,5,6,1
 block_hint,ReflectHas,3,4,0
-block_hint,RegExpPrototypeExec,200,201,1
-block_hint,RegExpPrototypeExec,128,129,1
-block_hint,RegExpPrototypeExec,130,131,1
 block_hint,RegExpPrototypeExec,202,203,1
-block_hint,RegExpPrototypeExec,164,165,1
+block_hint,RegExpPrototypeExec,130,131,1
+block_hint,RegExpPrototypeExec,132,133,1
+block_hint,RegExpPrototypeExec,204,205,1
+block_hint,RegExpPrototypeExec,166,167,1
 block_hint,RegExpPrototypeExec,16,17,1
-block_hint,RegExpPrototypeExec,146,147,1
-block_hint,RegExpPrototypeExec,148,149,0
+block_hint,RegExpPrototypeExec,148,149,1
 block_hint,RegExpPrototypeExec,150,151,0
-block_hint,RegExpPrototypeExec,206,207,0
 block_hint,RegExpPrototypeExec,152,153,0
+block_hint,RegExpPrototypeExec,208,209,0
+block_hint,RegExpPrototypeExec,154,155,0
 block_hint,RegExpPrototypeExec,18,19,1
-block_hint,RegExpPrototypeExec,183,184,0
-block_hint,RegExpPrototypeExec,132,133,0
-block_hint,RegExpPrototypeExec,157,158,0
-block_hint,RegExpPrototypeExec,234,235,0
-block_hint,RegExpPrototypeExec,225,226,1
-block_hint,RegExpPrototypeExec,210,211,1
-block_hint,RegExpPrototypeExec,169,170,1
+block_hint,RegExpPrototypeExec,185,186,0
+block_hint,RegExpPrototypeExec,134,135,0
 block_hint,RegExpPrototypeExec,159,160,0
+block_hint,RegExpPrototypeExec,236,237,0
+block_hint,RegExpPrototypeExec,227,228,1
+block_hint,RegExpPrototypeExec,212,213,1
+block_hint,RegExpPrototypeExec,171,172,1
+block_hint,RegExpPrototypeExec,161,162,0
 block_hint,RegExpPrototypeExec,73,74,0
 block_hint,RegExpPrototypeExec,24,25,1
-block_hint,RegExpPrototypeExec,136,137,1
-block_hint,RegExpPrototypeExec,26,27,1
-block_hint,RegExpPrototypeExec,188,189,0
 block_hint,RegExpPrototypeExec,138,139,1
-block_hint,RegExpPrototypeExec,240,241,1
-block_hint,RegExpPrototypeExec,212,213,0
-block_hint,RegExpPrototypeExec,177,178,1
+block_hint,RegExpPrototypeExec,26,27,1
+block_hint,RegExpPrototypeExec,190,191,0
+block_hint,RegExpPrototypeExec,140,141,1
+block_hint,RegExpPrototypeExec,242,243,1
+block_hint,RegExpPrototypeExec,214,215,0
+block_hint,RegExpPrototypeExec,179,180,1
 block_hint,RegExpPrototypeExec,77,78,0
 block_hint,RegExpPrototypeExec,34,35,1
-block_hint,RegExpPrototypeExec,142,143,1
-block_hint,RegExpPrototypeExec,114,115,1
-block_hint,RegExpPrototypeExec,154,155,1
-block_hint,RegExpMatchFast,251,252,0
-block_hint,RegExpMatchFast,292,293,1
+block_hint,RegExpPrototypeExec,144,145,1
+block_hint,RegExpPrototypeExec,116,117,1
+block_hint,RegExpPrototypeExec,156,157,1
+block_hint,RegExpMatchFast,363,364,0
+block_hint,RegExpMatchFast,293,294,1
 block_hint,RegExpMatchFast,34,35,1
-block_hint,RegExpMatchFast,328,329,0
-block_hint,RegExpMatchFast,237,238,0
-block_hint,RegExpMatchFast,286,287,0
-block_hint,RegExpMatchFast,449,450,0
-block_hint,RegExpMatchFast,392,393,1
-block_hint,RegExpMatchFast,294,295,1
-block_hint,RegExpMatchFast,288,289,0
+block_hint,RegExpMatchFast,331,332,0
+block_hint,RegExpMatchFast,240,241,0
+block_hint,RegExpMatchFast,287,288,0
+block_hint,RegExpMatchFast,454,455,0
+block_hint,RegExpMatchFast,397,398,1
+block_hint,RegExpMatchFast,295,296,1
+block_hint,RegExpMatchFast,289,290,0
 block_hint,RegExpMatchFast,127,128,0
-block_hint,RegExpMatchFast,239,240,1
-block_hint,RegExpMatchFast,241,242,1
+block_hint,RegExpMatchFast,242,243,1
+block_hint,RegExpMatchFast,244,245,1
 block_hint,RegExpMatchFast,42,43,1
-block_hint,RegExpMatchFast,333,334,0
-block_hint,RegExpMatchFast,243,244,1
-block_hint,RegExpMatchFast,457,458,1
-block_hint,RegExpMatchFast,394,395,0
-block_hint,RegExpMatchFast,322,323,1
+block_hint,RegExpMatchFast,336,337,0
+block_hint,RegExpMatchFast,246,247,1
+block_hint,RegExpMatchFast,462,463,1
+block_hint,RegExpMatchFast,399,400,0
+block_hint,RegExpMatchFast,325,326,1
 block_hint,RegExpMatchFast,131,132,0
 block_hint,RegExpMatchFast,50,51,1
-block_hint,RegExpMatchFast,247,248,1
-block_hint,RegExpMatchFast,183,184,1
-block_hint,RegExpMatchFast,262,263,1
+block_hint,RegExpMatchFast,250,251,1
+block_hint,RegExpMatchFast,186,187,1
+block_hint,RegExpMatchFast,263,264,1
+block_hint,RegExpMatchFast,301,302,0
 block_hint,RegExpMatchFast,84,85,1
 block_hint,RegExpMatchFast,86,87,1
-block_hint,RegExpMatchFast,302,303,0
-block_hint,RegExpMatchFast,347,348,0
-block_hint,RegExpMatchFast,378,379,0
-block_hint,RegExpMatchFast,300,301,0
+block_hint,RegExpMatchFast,305,306,0
+block_hint,RegExpMatchFast,350,351,0
+block_hint,RegExpMatchFast,383,384,0
+block_hint,RegExpMatchFast,303,304,0
 block_hint,RegExpMatchFast,88,89,1
-block_hint,RegExpMatchFast,342,343,0
-block_hint,RegExpMatchFast,253,254,0
-block_hint,RegExpMatchFast,278,279,0
-block_hint,RegExpMatchFast,193,194,1
-block_hint,RegExpMatchFast,451,452,0
-block_hint,RegExpMatchFast,437,438,1
-block_hint,RegExpMatchFast,390,391,1
-block_hint,RegExpMatchFast,304,305,1
-block_hint,RegExpMatchFast,280,281,0
+block_hint,RegExpMatchFast,345,346,0
+block_hint,RegExpMatchFast,254,255,0
+block_hint,RegExpMatchFast,279,280,0
+block_hint,RegExpMatchFast,196,197,1
+block_hint,RegExpMatchFast,456,457,0
+block_hint,RegExpMatchFast,442,443,1
+block_hint,RegExpMatchFast,395,396,1
+block_hint,RegExpMatchFast,307,308,1
+block_hint,RegExpMatchFast,281,282,0
 block_hint,RegExpMatchFast,115,116,0
-block_hint,RegExpMatchFast,344,345,0
-block_hint,RegExpMatchFast,255,256,0
+block_hint,RegExpMatchFast,347,348,0
+block_hint,RegExpMatchFast,256,257,0
 block_hint,RegExpMatchFast,94,95,1
-block_hint,RegExpMatchFast,382,383,1
-block_hint,RegExpMatchFast,306,307,0
-block_hint,RegExpMatchFast,178,179,1
-block_hint,RegExpMatchFast,176,177,1
-block_hint,RegExpMatchFast,308,309,0
-block_hint,RegExpMatchFast,180,181,0
+block_hint,RegExpMatchFast,387,388,1
+block_hint,RegExpMatchFast,309,310,0
+block_hint,RegExpMatchFast,181,182,1
+block_hint,RegExpMatchFast,179,180,1
+block_hint,RegExpMatchFast,311,312,0
+block_hint,RegExpMatchFast,183,184,0
 block_hint,RegExpMatchFast,102,103,0
 block_hint,RegExpMatchFast,104,105,0
-block_hint,RegExpMatchFast,201,202,1
-block_hint,RegExpMatchFast,319,320,0
+block_hint,RegExpMatchFast,204,205,1
+block_hint,RegExpMatchFast,322,323,0
 block_hint,RegExpMatchFast,106,107,1
-block_hint,RegExpMatchFast,190,191,1
-block_hint,RegExpMatchFast,349,350,0
+block_hint,RegExpMatchFast,193,194,1
+block_hint,RegExpMatchFast,352,353,0
 block_hint,RegExpMatchFast,96,97,1
-block_hint,RegExpMatchFast,172,173,1
-block_hint,RegExpMatchFast,170,171,1
-block_hint,RegExpMatchFast,174,175,0
+block_hint,RegExpMatchFast,175,176,1
+block_hint,RegExpMatchFast,173,174,1
+block_hint,RegExpMatchFast,177,178,0
 block_hint,RegExpMatchFast,98,99,0
 block_hint,RegExpMatchFast,100,101,0
-block_hint,RegExpMatchFast,221,222,1
-block_hint,RegExpMatchFast,311,312,0
-block_hint,RegExpMatchFast,223,224,0
-block_hint,RegExpReplace,258,259,1
-block_hint,RegExpReplace,296,297,1
-block_hint,RegExpReplace,248,249,1
-block_hint,RegExpReplace,148,149,0
+block_hint,RegExpMatchFast,224,225,1
+block_hint,RegExpMatchFast,314,315,0
+block_hint,RegExpMatchFast,226,227,0
+block_hint,RegExpReplace,261,262,1
+block_hint,RegExpReplace,299,300,1
+block_hint,RegExpReplace,251,252,1
+block_hint,RegExpReplace,149,150,0
 block_hint,RegExpReplace,22,23,1
-block_hint,RegExpReplace,206,207,1
-block_hint,RegExpReplace,150,151,0
+block_hint,RegExpReplace,209,210,1
+block_hint,RegExpReplace,151,152,0
 block_hint,RegExpReplace,24,25,1
-block_hint,RegExpReplace,208,209,1
-block_hint,RegExpReplace,210,211,1
-block_hint,RegExpReplace,171,172,1
-block_hint,RegExpReplace,254,255,0
+block_hint,RegExpReplace,211,212,1
+block_hint,RegExpReplace,213,214,1
+block_hint,RegExpReplace,172,173,1
+block_hint,RegExpReplace,179,180,0
+block_hint,RegExpReplace,257,258,0
 block_hint,RegExpReplace,50,51,1
-block_hint,RegExpReplace,226,227,0
-block_hint,RegExpReplace,162,163,0
-block_hint,RegExpReplace,180,181,0
-block_hint,RegExpReplace,108,109,1
-block_hint,RegExpReplace,372,373,0
-block_hint,RegExpReplace,356,357,1
-block_hint,RegExpReplace,290,291,1
-block_hint,RegExpReplace,200,201,1
-block_hint,RegExpReplace,182,183,0
-block_hint,RegExpReplace,80,81,0
+block_hint,RegExpReplace,229,230,0
+block_hint,RegExpReplace,163,164,0
+block_hint,RegExpReplace,183,184,0
+block_hint,RegExpReplace,109,110,1
+block_hint,RegExpReplace,375,376,0
+block_hint,RegExpReplace,359,360,1
+block_hint,RegExpReplace,293,294,1
+block_hint,RegExpReplace,203,204,1
+block_hint,RegExpReplace,185,186,0
+block_hint,RegExpReplace,81,82,0
 block_hint,RegExpReplace,56,57,1
 block_hint,RegExpReplace,58,59,1
 block_hint,RegExpReplace,60,61,1
-block_hint,RegExpReplace,166,167,0
+block_hint,RegExpReplace,167,168,0
 block_hint,RegExpReplace,62,63,1
-block_hint,RegExpReplace,230,231,1
-block_hint,RegExpReplace,168,169,0
+block_hint,RegExpReplace,233,234,1
+block_hint,RegExpReplace,169,170,0
 block_hint,RegExpReplace,64,65,1
-block_hint,RegExpReplace,377,378,1
-block_hint,RegExpReplace,368,369,1
-block_hint,RegExpReplace,323,324,0
-block_hint,RegExpReplace,282,283,0
-block_hint,RegExpReplace,215,216,0
-block_hint,RegExpReplace,99,100,1
+block_hint,RegExpReplace,380,381,1
+block_hint,RegExpReplace,371,372,1
+block_hint,RegExpReplace,326,327,0
+block_hint,RegExpReplace,285,286,0
+block_hint,RegExpReplace,218,219,0
+block_hint,RegExpReplace,100,101,1
 block_hint,RegExpReplace,26,27,1
 block_hint,RegExpReplace,28,29,1
-block_hint,RegExpReplace,101,102,1
+block_hint,RegExpReplace,102,103,1
 block_hint,RegExpReplace,30,31,0
 block_hint,RegExpReplace,32,33,1
 block_hint,RegExpReplace,34,35,1
 block_hint,RegExpReplace,72,73,1
 block_hint,RegExpReplace,44,45,1
-block_hint,RegExpReplace,160,161,1
+block_hint,RegExpReplace,161,162,1
 block_hint,RegExpReplace,46,47,1
 block_hint,RegExpReplace,48,49,1
-block_hint,RegExpReplace,233,234,1
-block_hint,RegExpReplace,175,176,1
-block_hint,RegExpReplace,152,153,1
+block_hint,RegExpReplace,236,237,1
+block_hint,RegExpReplace,176,177,1
+block_hint,RegExpReplace,153,154,1
 block_hint,RegExpReplace,36,37,1
-block_hint,RegExpReplace,154,155,1
+block_hint,RegExpReplace,155,156,1
 block_hint,RegExpReplace,40,41,0
-block_hint,RegExpReplace,251,252,1
-block_hint,RegExpReplace,193,194,1
+block_hint,RegExpReplace,254,255,1
+block_hint,RegExpReplace,196,197,1
 block_hint,RegExpReplace,42,43,1
 block_hint,RegExpSearchFast,50,51,1
 block_hint,RegExpSearchFast,6,7,1
@@ -4547,106 +4640,120 @@ block_hint,SymbolPrototypeToString,9,10,1
 block_hint,SymbolPrototypeToString,11,12,1
 block_hint,SymbolPrototypeToString,5,6,0
 block_hint,SymbolPrototypeToString,7,8,1
-block_hint,CreateTypedArray,567,568,0
-block_hint,CreateTypedArray,593,594,0
-block_hint,CreateTypedArray,540,541,0
-block_hint,CreateTypedArray,451,452,0
-block_hint,CreateTypedArray,331,332,1
-block_hint,CreateTypedArray,333,334,1
-block_hint,CreateTypedArray,635,636,0
-block_hint,CreateTypedArray,487,488,1
-block_hint,CreateTypedArray,485,486,1
-block_hint,CreateTypedArray,382,383,1
-block_hint,CreateTypedArray,546,547,0
-block_hint,CreateTypedArray,616,617,0
-block_hint,CreateTypedArray,544,545,0
-block_hint,CreateTypedArray,455,456,0
-block_hint,CreateTypedArray,393,394,0
-block_hint,CreateTypedArray,395,396,0
-block_hint,CreateTypedArray,385,386,0
-block_hint,CreateTypedArray,104,105,1
-block_hint,CreateTypedArray,106,107,1
-block_hint,CreateTypedArray,645,646,1
-block_hint,CreateTypedArray,596,597,0
-block_hint,CreateTypedArray,643,644,1
-block_hint,CreateTypedArray,613,614,1
-block_hint,CreateTypedArray,489,490,0
-block_hint,CreateTypedArray,523,524,1
-block_hint,CreateTypedArray,361,362,0
-block_hint,CreateTypedArray,236,237,0
-block_hint,CreateTypedArray,299,300,0
-block_hint,CreateTypedArray,279,280,1
-block_hint,CreateTypedArray,281,282,1
+block_hint,CreateTypedArray,610,611,0
+block_hint,CreateTypedArray,638,639,0
+block_hint,CreateTypedArray,576,577,0
+block_hint,CreateTypedArray,485,486,0
+block_hint,CreateTypedArray,356,357,1
+block_hint,CreateTypedArray,358,359,1
+block_hint,CreateTypedArray,677,678,0
+block_hint,CreateTypedArray,520,521,1
+block_hint,CreateTypedArray,518,519,1
+block_hint,CreateTypedArray,407,408,1
+block_hint,CreateTypedArray,586,587,0
+block_hint,CreateTypedArray,662,663,0
+block_hint,CreateTypedArray,584,585,0
 block_hint,CreateTypedArray,491,492,0
-block_hint,CreateTypedArray,525,526,1
-block_hint,CreateTypedArray,363,364,0
-block_hint,CreateTypedArray,252,253,0
-block_hint,CreateTypedArray,301,302,0
-block_hint,CreateTypedArray,479,480,0
-block_hint,CreateTypedArray,481,482,0
-block_hint,CreateTypedArray,629,630,0
-block_hint,CreateTypedArray,496,497,1
-block_hint,CreateTypedArray,494,495,1
-block_hint,CreateTypedArray,397,398,1
-block_hint,CreateTypedArray,504,505,0
-block_hint,CreateTypedArray,498,499,0
-block_hint,CreateTypedArray,400,401,0
-block_hint,CreateTypedArray,152,153,1
-block_hint,CreateTypedArray,340,341,0
-block_hint,CreateTypedArray,154,155,1
-block_hint,CreateTypedArray,650,651,1
-block_hint,CreateTypedArray,603,604,0
-block_hint,CreateTypedArray,648,649,1
-block_hint,CreateTypedArray,619,620,1
-block_hint,CreateTypedArray,500,501,0
-block_hint,CreateTypedArray,519,520,1
-block_hint,CreateTypedArray,357,358,0
-block_hint,CreateTypedArray,204,205,0
-block_hint,CreateTypedArray,622,623,0
-block_hint,CreateTypedArray,166,167,1
-block_hint,CreateTypedArray,289,290,1
-block_hint,CreateTypedArray,291,292,1
-block_hint,CreateTypedArray,502,503,0
-block_hint,CreateTypedArray,521,522,1
-block_hint,CreateTypedArray,359,360,0
-block_hint,CreateTypedArray,220,221,0
-block_hint,CreateTypedArray,624,625,0
-block_hint,CreateTypedArray,511,512,0
-block_hint,CreateTypedArray,506,507,0
-block_hint,CreateTypedArray,462,463,0
-block_hint,CreateTypedArray,346,347,0
-block_hint,CreateTypedArray,416,417,1
-block_hint,CreateTypedArray,350,351,1
-block_hint,CreateTypedArray,465,466,0
-block_hint,CreateTypedArray,348,349,1
-block_hint,CreateTypedArray,418,419,0
-block_hint,CreateTypedArray,654,655,0
-block_hint,CreateTypedArray,605,606,0
+block_hint,CreateTypedArray,424,425,0
+block_hint,CreateTypedArray,426,427,0
+block_hint,CreateTypedArray,410,411,0
+block_hint,CreateTypedArray,105,106,1
+block_hint,CreateTypedArray,107,108,1
+block_hint,CreateTypedArray,412,413,1
+block_hint,CreateTypedArray,109,110,1
+block_hint,CreateTypedArray,111,112,1
+block_hint,CreateTypedArray,641,642,0
+block_hint,CreateTypedArray,683,684,1
+block_hint,CreateTypedArray,660,661,1
+block_hint,CreateTypedArray,522,523,0
+block_hint,CreateTypedArray,558,559,1
+block_hint,CreateTypedArray,384,385,0
+block_hint,CreateTypedArray,261,262,0
+block_hint,CreateTypedArray,416,417,0
+block_hint,CreateTypedArray,123,124,1
+block_hint,CreateTypedArray,125,126,1
+block_hint,CreateTypedArray,305,306,1
+block_hint,CreateTypedArray,307,308,1
+block_hint,CreateTypedArray,525,526,0
+block_hint,CreateTypedArray,560,561,1
+block_hint,CreateTypedArray,386,387,0
+block_hint,CreateTypedArray,277,278,0
+block_hint,CreateTypedArray,420,421,0
+block_hint,CreateTypedArray,137,138,1
+block_hint,CreateTypedArray,139,140,1
+block_hint,CreateTypedArray,512,513,0
+block_hint,CreateTypedArray,514,515,0
+block_hint,CreateTypedArray,671,672,0
+block_hint,CreateTypedArray,531,532,1
 block_hint,CreateTypedArray,529,530,1
-block_hint,CreateTypedArray,527,528,1
-block_hint,CreateTypedArray,431,432,1
-block_hint,CreateTypedArray,609,610,0
-block_hint,CreateTypedArray,537,538,0
-block_hint,CreateTypedArray,445,446,0
-block_hint,CreateTypedArray,314,315,1
-block_hint,CreateTypedArray,607,608,0
+block_hint,CreateTypedArray,428,429,1
+block_hint,CreateTypedArray,541,542,0
+block_hint,CreateTypedArray,533,534,0
+block_hint,CreateTypedArray,431,432,0
+block_hint,CreateTypedArray,165,166,1
+block_hint,CreateTypedArray,365,366,0
+block_hint,CreateTypedArray,167,168,1
+block_hint,CreateTypedArray,433,434,1
+block_hint,CreateTypedArray,169,170,1
+block_hint,CreateTypedArray,171,172,1
+block_hint,CreateTypedArray,648,649,0
+block_hint,CreateTypedArray,686,687,1
+block_hint,CreateTypedArray,665,666,1
 block_hint,CreateTypedArray,535,536,0
+block_hint,CreateTypedArray,554,555,1
+block_hint,CreateTypedArray,380,381,0
+block_hint,CreateTypedArray,229,230,0
+block_hint,CreateTypedArray,437,438,0
+block_hint,CreateTypedArray,183,184,1
+block_hint,CreateTypedArray,185,186,1
+block_hint,CreateTypedArray,187,188,1
+block_hint,CreateTypedArray,318,319,1
+block_hint,CreateTypedArray,320,321,1
+block_hint,CreateTypedArray,538,539,0
+block_hint,CreateTypedArray,556,557,1
+block_hint,CreateTypedArray,382,383,0
+block_hint,CreateTypedArray,245,246,0
 block_hint,CreateTypedArray,441,442,0
-block_hint,CreateTypedArray,265,266,0
-block_hint,CreateTypedArray,588,589,0
-block_hint,CreateTypedArray,321,322,0
-block_hint,CreateTypedArray,323,324,0
+block_hint,CreateTypedArray,199,200,1
+block_hint,CreateTypedArray,201,202,1
+block_hint,CreateTypedArray,548,549,0
+block_hint,CreateTypedArray,543,544,0
+block_hint,CreateTypedArray,500,501,0
 block_hint,CreateTypedArray,371,372,0
-block_hint,CreateTypedArray,373,374,0
-block_hint,CreateTypedArray,316,317,1
-block_hint,CreateTypedArray,326,327,0
-block_hint,CreateTypedArray,319,320,0
-block_hint,CreateTypedArray,473,474,0
-block_hint,CreateTypedArray,517,518,1
-block_hint,CreateTypedArray,355,356,0
-block_hint,CreateTypedArray,188,189,0
-block_hint,CreateTypedArray,449,450,0
-block_hint,CreateTypedArray,273,274,0
+block_hint,CreateTypedArray,453,454,1
+block_hint,CreateTypedArray,375,376,1
+block_hint,CreateTypedArray,503,504,0
+block_hint,CreateTypedArray,373,374,1
+block_hint,CreateTypedArray,455,456,0
+block_hint,CreateTypedArray,688,689,0
+block_hint,CreateTypedArray,650,651,0
+block_hint,CreateTypedArray,564,565,1
+block_hint,CreateTypedArray,562,563,1
+block_hint,CreateTypedArray,466,467,1
+block_hint,CreateTypedArray,656,657,0
+block_hint,CreateTypedArray,574,575,0
+block_hint,CreateTypedArray,481,482,0
+block_hint,CreateTypedArray,340,341,1
+block_hint,CreateTypedArray,654,655,0
+block_hint,CreateTypedArray,572,573,0
+block_hint,CreateTypedArray,477,478,0
+block_hint,CreateTypedArray,290,291,0
+block_hint,CreateTypedArray,634,635,0
+block_hint,CreateTypedArray,347,348,0
+block_hint,CreateTypedArray,349,350,0
+block_hint,CreateTypedArray,396,397,0
+block_hint,CreateTypedArray,398,399,0
+block_hint,CreateTypedArray,342,343,1
+block_hint,CreateTypedArray,352,353,0
+block_hint,CreateTypedArray,345,346,0
+block_hint,CreateTypedArray,507,508,0
+block_hint,CreateTypedArray,552,553,1
+block_hint,CreateTypedArray,378,379,0
+block_hint,CreateTypedArray,213,214,0
+block_hint,CreateTypedArray,567,568,0
+block_hint,CreateTypedArray,391,392,0
+block_hint,CreateTypedArray,60,61,1
+block_hint,CreateTypedArray,62,63,1
 block_hint,TypedArrayFrom,156,157,1
 block_hint,TypedArrayFrom,140,141,0
 block_hint,TypedArrayFrom,124,125,1
@@ -5083,82 +5190,83 @@ block_hint,TestTypeOfHandler,23,24,0
 block_hint,TestTypeOfHandler,31,32,1
 block_hint,TestTypeOfHandler,50,51,0
 block_hint,TestTypeOfHandler,35,36,0
-block_hint,LdaGlobalHandler,8,9,1
-block_hint,LdaGlobalHandler,10,11,1
-block_hint,LdaGlobalHandler,12,13,1
-block_hint,LdaGlobalHandler,14,15,1
-block_hint,LdaGlobalHandler,180,181,0
-block_hint,LdaGlobalHandler,104,105,0
-block_hint,LdaGlobalHandler,108,109,1
+block_hint,LdaGlobalHandler,7,8,1
+block_hint,LdaGlobalHandler,9,10,1
+block_hint,LdaGlobalHandler,11,12,1
+block_hint,LdaGlobalHandler,13,14,1
+block_hint,LdaGlobalHandler,183,184,0
+block_hint,LdaGlobalHandler,105,106,0
+block_hint,LdaGlobalHandler,109,110,1
 block_hint,StaContextSlotHandler,5,6,1
 block_hint,StaCurrentContextSlotHandler,2,3,1
-block_hint,LdaLookupGlobalSlotHandler,14,15,1
-block_hint,LdaLookupGlobalSlotHandler,124,125,0
-block_hint,LdaLookupGlobalSlotHandler,16,17,1
-block_hint,GetNamedPropertyHandler,362,363,1
-block_hint,GetNamedPropertyHandler,210,211,0
-block_hint,GetNamedPropertyHandler,75,76,0
-block_hint,GetNamedPropertyHandler,37,38,1
-block_hint,GetNamedPropertyHandler,303,304,0
-block_hint,GetNamedPropertyHandler,329,330,0
-block_hint,GetNamedPropertyHandler,212,213,1
-block_hint,GetNamedPropertyHandler,112,113,0
-block_hint,GetNamedPropertyHandler,214,215,0
-block_hint,GetNamedPropertyHandler,286,287,1
+block_hint,LdaLookupGlobalSlotHandler,13,14,1
+block_hint,LdaLookupGlobalSlotHandler,125,126,0
+block_hint,LdaLookupGlobalSlotHandler,15,16,1
+block_hint,GetNamedPropertyHandler,372,373,1
+block_hint,GetNamedPropertyHandler,216,217,0
+block_hint,GetNamedPropertyHandler,77,78,0
+block_hint,GetNamedPropertyHandler,35,36,1
+block_hint,GetNamedPropertyHandler,313,314,0
+block_hint,GetNamedPropertyHandler,339,340,0
+block_hint,GetNamedPropertyHandler,218,219,1
+block_hint,GetNamedPropertyHandler,290,291,0
+block_hint,GetNamedPropertyHandler,220,221,0
+block_hint,GetNamedPropertyHandler,294,295,1
 block_hint,GetNamedPropertyHandler,39,40,0
-block_hint,GetNamedPropertyHandler,92,93,1
-block_hint,GetNamedPropertyHandler,337,338,0
-block_hint,GetNamedPropertyHandler,236,237,0
-block_hint,GetNamedPropertyHandler,148,149,0
-block_hint,GetNamedPropertyHandler,59,60,1
-block_hint,GetNamedPropertyHandler,85,86,0
-block_hint,GetNamedPropertyHandler,27,28,1
-block_hint,GetNamedPropertyHandler,138,139,0
-block_hint,GetNamedPropertyHandler,63,64,0
-block_hint,GetNamedPropertyHandler,293,294,1
-block_hint,GetNamedPropertyHandler,96,97,0
-block_hint,GetNamedPropertyHandler,242,243,1
+block_hint,GetNamedPropertyHandler,98,99,1
+block_hint,GetNamedPropertyHandler,347,348,0
+block_hint,GetNamedPropertyHandler,242,243,0
+block_hint,GetNamedPropertyHandler,154,155,0
+block_hint,GetNamedPropertyHandler,120,121,1
+block_hint,GetNamedPropertyHandler,49,50,0
+block_hint,GetNamedPropertyHandler,87,88,0
+block_hint,GetNamedPropertyHandler,25,26,1
+block_hint,GetNamedPropertyHandler,144,145,0
+block_hint,GetNamedPropertyHandler,65,66,0
+block_hint,GetNamedPropertyHandler,303,304,1
+block_hint,GetNamedPropertyHandler,102,103,0
+block_hint,GetNamedPropertyHandler,248,249,1
+block_hint,GetNamedPropertyHandler,250,251,1
 block_hint,GetNamedPropertyHandler,244,245,1
-block_hint,GetNamedPropertyHandler,238,239,1
-block_hint,GetNamedPropertyHandler,240,241,1
-block_hint,GetNamedPropertyHandler,158,159,1
-block_hint,AddHandler,53,54,0
-block_hint,AddHandler,37,38,0
-block_hint,AddHandler,28,29,1
-block_hint,AddHandler,80,81,0
-block_hint,AddHandler,60,61,1
-block_hint,AddHandler,40,41,1
-block_hint,AddHandler,74,75,1
-block_hint,AddHandler,43,44,1
-block_hint,AddHandler,56,57,1
-block_hint,AddHandler,22,23,1
-block_hint,SubHandler,35,36,0
-block_hint,SubHandler,23,24,1
-block_hint,SubHandler,64,65,1
-block_hint,SubHandler,75,76,1
-block_hint,SubHandler,66,67,1
-block_hint,SubHandler,45,46,1
-block_hint,SubHandler,19,20,1
-block_hint,MulHandler,69,70,1
-block_hint,MulHandler,65,66,1
-block_hint,MulHandler,17,18,1
-block_hint,MulHandler,75,76,1
+block_hint,GetNamedPropertyHandler,246,247,1
+block_hint,GetNamedPropertyHandler,164,165,1
+block_hint,AddHandler,72,73,0
+block_hint,AddHandler,45,46,0
+block_hint,AddHandler,32,33,1
+block_hint,AddHandler,118,119,0
+block_hint,AddHandler,81,82,1
+block_hint,AddHandler,48,49,1
+block_hint,AddHandler,103,104,1
+block_hint,AddHandler,52,53,1
+block_hint,AddHandler,75,76,1
+block_hint,AddHandler,24,25,1
+block_hint,SubHandler,42,43,0
+block_hint,SubHandler,27,28,1
+block_hint,SubHandler,78,79,1
+block_hint,SubHandler,98,99,1
+block_hint,SubHandler,80,81,1
+block_hint,SubHandler,56,57,1
+block_hint,SubHandler,21,22,1
+block_hint,MulHandler,106,107,1
+block_hint,MulHandler,98,99,1
+block_hint,MulHandler,30,31,1
+block_hint,MulHandler,112,113,1
+block_hint,MulHandler,91,92,1
 block_hint,MulHandler,59,60,1
-block_hint,MulHandler,39,40,1
-block_hint,MulHandler,12,13,1
-block_hint,DivHandler,65,66,0
-block_hint,DivHandler,54,55,0
-block_hint,DivHandler,37,38,1
-block_hint,DivHandler,15,16,1
-block_hint,DivHandler,73,74,1
-block_hint,DivHandler,60,61,1
-block_hint,DivHandler,40,41,1
-block_hint,DivHandler,10,11,1
-block_hint,ModHandler,74,75,0
-block_hint,ModHandler,70,71,0
-block_hint,ModHandler,56,57,1
-block_hint,ModHandler,51,52,1
-block_hint,ModHandler,28,29,0
+block_hint,MulHandler,23,24,1
+block_hint,DivHandler,85,86,0
+block_hint,DivHandler,66,67,0
+block_hint,DivHandler,43,44,1
+block_hint,DivHandler,23,24,1
+block_hint,DivHandler,95,96,1
+block_hint,DivHandler,72,73,1
+block_hint,DivHandler,46,47,1
+block_hint,DivHandler,17,18,1
+block_hint,ModHandler,89,90,0
+block_hint,ModHandler,85,86,0
+block_hint,ModHandler,68,69,1
+block_hint,ModHandler,63,64,1
+block_hint,ModHandler,29,30,0
 block_hint,ModHandler,15,16,1
 block_hint,BitwiseOrHandler,42,43,0
 block_hint,BitwiseOrHandler,30,31,1
@@ -5233,6 +5341,7 @@ block_hint,DecHandler,23,24,0
 block_hint,DecHandler,18,19,1
 block_hint,NegateHandler,26,27,1
 block_hint,NegateHandler,24,25,1
+block_hint,NegateHandler,14,15,1
 block_hint,ToBooleanLogicalNotHandler,15,16,0
 block_hint,ToBooleanLogicalNotHandler,21,22,0
 block_hint,ToBooleanLogicalNotHandler,7,8,0
@@ -5444,37 +5553,37 @@ block_hint,LdaImmutableContextSlotWideHandler,3,4,1
 block_hint,LdaImmutableContextSlotWideHandler,9,10,0
 block_hint,LdaImmutableContextSlotWideHandler,5,6,1
 block_hint,LdaImmutableCurrentContextSlotWideHandler,2,3,1
-block_hint,LdaGlobalWideHandler,257,258,0
-block_hint,LdaGlobalWideHandler,108,109,1
+block_hint,LdaGlobalWideHandler,262,263,0
+block_hint,LdaGlobalWideHandler,110,111,1
 block_hint,StaGlobalWideHandler,3,4,0
 block_hint,StaCurrentContextSlotWideHandler,2,3,1
-block_hint,GetNamedPropertyWideHandler,323,324,0
-block_hint,GetNamedPropertyWideHandler,138,139,1
+block_hint,GetNamedPropertyWideHandler,331,332,0
+block_hint,GetNamedPropertyWideHandler,140,141,1
 block_hint,GetKeyedPropertyWideHandler,3,4,0
 block_hint,SetNamedPropertyWideHandler,3,4,0
 block_hint,DefineNamedOwnPropertyWideHandler,3,4,0
 block_hint,SetKeyedPropertyWideHandler,3,4,0
 block_hint,DefineKeyedOwnPropertyWideHandler,3,4,0
 block_hint,StaInArrayLiteralWideHandler,3,4,0
-block_hint,AddWideHandler,82,83,0
-block_hint,AddWideHandler,49,50,0
-block_hint,AddWideHandler,35,36,0
-block_hint,AddWideHandler,78,79,0
-block_hint,AddWideHandler,64,65,1
-block_hint,AddWideHandler,45,46,1
-block_hint,AddWideHandler,27,28,1
-block_hint,AddWideHandler,43,44,1
-block_hint,AddWideHandler,16,17,1
-block_hint,SubWideHandler,75,76,0
-block_hint,SubWideHandler,53,54,0
-block_hint,SubWideHandler,33,34,0
-block_hint,SubWideHandler,13,14,1
-block_hint,MulWideHandler,80,81,0
-block_hint,MulWideHandler,73,74,1
-block_hint,MulWideHandler,59,60,1
-block_hint,MulWideHandler,57,58,1
-block_hint,MulWideHandler,30,31,1
-block_hint,MulWideHandler,10,11,1
+block_hint,AddWideHandler,120,121,0
+block_hint,AddWideHandler,60,61,0
+block_hint,AddWideHandler,42,43,0
+block_hint,AddWideHandler,107,108,0
+block_hint,AddWideHandler,76,77,1
+block_hint,AddWideHandler,53,54,1
+block_hint,AddWideHandler,31,32,1
+block_hint,AddWideHandler,51,52,1
+block_hint,AddWideHandler,18,19,1
+block_hint,SubWideHandler,108,109,0
+block_hint,SubWideHandler,65,66,0
+block_hint,SubWideHandler,40,41,0
+block_hint,SubWideHandler,15,16,1
+block_hint,MulWideHandler,128,129,0
+block_hint,MulWideHandler,106,107,1
+block_hint,MulWideHandler,83,84,1
+block_hint,MulWideHandler,81,82,1
+block_hint,MulWideHandler,43,44,1
+block_hint,MulWideHandler,19,20,1
 block_hint,BitwiseOrWideHandler,28,29,0
 block_hint,BitwiseOrWideHandler,20,21,1
 block_hint,AddSmiWideHandler,25,26,0
@@ -5567,8 +5676,8 @@ block_hint,ForInNextWideHandler,11,12,0
 block_hint,ForInNextWideHandler,2,3,1
 block_hint,ForInNextWideHandler,4,5,0
 block_hint,ForInNextWideHandler,9,10,1
-block_hint,LdaGlobalExtraWideHandler,257,258,0
-block_hint,LdaGlobalExtraWideHandler,108,109,1
+block_hint,LdaGlobalExtraWideHandler,262,263,0
+block_hint,LdaGlobalExtraWideHandler,110,111,1
 block_hint,AddSmiExtraWideHandler,33,34,1
 block_hint,AddSmiExtraWideHandler,23,24,0
 block_hint,AddSmiExtraWideHandler,28,29,1
@@ -5586,720 +5695,720 @@ block_hint,BitwiseAndSmiExtraWideHandler,29,30,0
 block_hint,BitwiseAndSmiExtraWideHandler,18,19,1
 block_hint,CallUndefinedReceiver1ExtraWideHandler,68,69,0
 block_hint,CallUndefinedReceiver1ExtraWideHandler,19,20,0
-builtin_hash,RecordWriteSaveFP,925153714
-builtin_hash,RecordWriteIgnoreFP,925153714
-builtin_hash,EphemeronKeyBarrierSaveFP,576191782
-builtin_hash,AdaptorWithBuiltinExitFrame,354449226
-builtin_hash,Call_ReceiverIsNullOrUndefined_Baseline_Compact,184201450
-builtin_hash,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,-622040840
-builtin_hash,Call_ReceiverIsAny_Baseline_Compact,-622040840
-builtin_hash,CallProxy,431038095
-builtin_hash,CallWithSpread,114885228
-builtin_hash,CallWithSpread_Baseline,-764009345
-builtin_hash,CallWithArrayLike,-906554997
-builtin_hash,ConstructWithSpread,-608478575
-builtin_hash,ConstructWithSpread_Baseline,633800479
-builtin_hash,Construct_Baseline,-357225391
-builtin_hash,FastNewObject,-181970843
-builtin_hash,FastNewClosure,-175349459
-builtin_hash,StringEqual,706401832
-builtin_hash,StringGreaterThan,-613733034
-builtin_hash,StringGreaterThanOrEqual,-355204059
-builtin_hash,StringLessThan,-355204059
-builtin_hash,StringLessThanOrEqual,-613733034
-builtin_hash,StringSubstring,293726114
-builtin_hash,OrderedHashTableHealIndex,320211480
-builtin_hash,CompileLazy,-48838662
-builtin_hash,CompileLazyDeoptimizedCode,1029930506
-builtin_hash,InstantiateAsmJs,-487292373
-builtin_hash,AllocateInYoungGeneration,669322182
-builtin_hash,AllocateRegularInYoungGeneration,-197165802
-builtin_hash,AllocateRegularInOldGeneration,-197165802
-builtin_hash,CopyFastSmiOrObjectElements,-974669866
-builtin_hash,GrowFastDoubleElements,633375032
-builtin_hash,GrowFastSmiOrObjectElements,55014026
-builtin_hash,ToNumber,1056900683
-builtin_hash,ToNumber_Baseline,-255970856
-builtin_hash,ToNumeric_Baseline,-150297448
-builtin_hash,ToNumberConvertBigInt,-115864776
-builtin_hash,Typeof,455002258
-builtin_hash,KeyedLoadIC_PolymorphicName,-147363616
-builtin_hash,KeyedStoreIC_Megamorphic,-766812467
-builtin_hash,DefineKeyedOwnIC_Megamorphic,-98359717
-builtin_hash,LoadGlobalIC_NoFeedback,-751542491
-builtin_hash,LoadIC_FunctionPrototype,-456945758
-builtin_hash,LoadIC_StringLength,708277321
-builtin_hash,LoadIC_StringWrapperLength,813299235
-builtin_hash,LoadIC_NoFeedback,203476084
-builtin_hash,StoreIC_NoFeedback,-1067800910
-builtin_hash,DefineNamedOwnIC_NoFeedback,-679825540
-builtin_hash,KeyedLoadIC_SloppyArguments,-451779601
-builtin_hash,StoreFastElementIC_Standard,688605787
-builtin_hash,StoreFastElementIC_GrowNoTransitionHandleCOW,-981655461
-builtin_hash,StoreFastElementIC_NoTransitionHandleCOW,516590767
-builtin_hash,ElementsTransitionAndStore_Standard,-764902427
-builtin_hash,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,403149715
-builtin_hash,ElementsTransitionAndStore_NoTransitionHandleCOW,995918993
-builtin_hash,KeyedHasIC_PolymorphicName,-165442496
-builtin_hash,EnqueueMicrotask,7595399
-builtin_hash,RunMicrotasks,-338691087
-builtin_hash,HasProperty,508450008
-builtin_hash,DeleteProperty,-838129578
-builtin_hash,SetDataProperties,-464632524
-builtin_hash,ReturnReceiver,312434521
-builtin_hash,ArrayConstructor,-319898279
-builtin_hash,ArrayConstructorImpl,412703549
-builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DontOverride,850144068
-builtin_hash,ArrayNoArgumentConstructor_HoleySmi_DontOverride,850144068
-builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DisableAllocationSites,1070673895
-builtin_hash,ArrayNoArgumentConstructor_Packed_DisableAllocationSites,1070673895
-builtin_hash,ArrayNoArgumentConstructor_Holey_DisableAllocationSites,1070673895
-builtin_hash,ArrayNoArgumentConstructor_PackedDouble_DisableAllocationSites,-336123958
-builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DontOverride,227053212
-builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,873893
-builtin_hash,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,873893
-builtin_hash,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,-847176062
-builtin_hash,ArrayIncludesSmi,536907331
-builtin_hash,ArrayIncludesSmiOrObject,1001204729
-builtin_hash,ArrayIncludes,561561276
-builtin_hash,ArrayIndexOfSmi,-663968987
-builtin_hash,ArrayIndexOfSmiOrObject,-876114200
-builtin_hash,ArrayIndexOf,-253950356
-builtin_hash,ArrayPrototypePop,-292344596
-builtin_hash,ArrayPrototypePush,-675294835
-builtin_hash,CloneFastJSArray,-172971657
-builtin_hash,CloneFastJSArrayFillingHoles,-284975194
-builtin_hash,ExtractFastJSArray,-471066963
-builtin_hash,ArrayPrototypeEntries,829416546
-builtin_hash,ArrayPrototypeKeys,162456650
-builtin_hash,ArrayPrototypeValues,829416546
-builtin_hash,ArrayIteratorPrototypeNext,1046841582
-builtin_hash,AsyncFunctionEnter,608034084
-builtin_hash,AsyncFunctionResolve,-196767509
-builtin_hash,AsyncFunctionAwaitCaught,861277429
-builtin_hash,AsyncFunctionAwaitUncaught,861277429
-builtin_hash,AsyncFunctionAwaitResolveClosure,-342974575
-builtin_hash,DatePrototypeGetDate,799986656
-builtin_hash,DatePrototypeGetDay,799986656
-builtin_hash,DatePrototypeGetFullYear,799986656
-builtin_hash,DatePrototypeGetHours,799986656
-builtin_hash,DatePrototypeGetMilliseconds,-1015935702
-builtin_hash,DatePrototypeGetMinutes,799986656
-builtin_hash,DatePrototypeGetMonth,799986656
-builtin_hash,DatePrototypeGetSeconds,799986656
-builtin_hash,DatePrototypeGetTime,604056264
-builtin_hash,DatePrototypeGetTimezoneOffset,-1015935702
-builtin_hash,DatePrototypeValueOf,604056264
-builtin_hash,DatePrototypeToPrimitive,83647064
-builtin_hash,CreateIterResultObject,-837586211
-builtin_hash,CreateGeneratorObject,-731927520
-builtin_hash,GeneratorPrototypeNext,24056276
-builtin_hash,GeneratorPrototypeReturn,704697656
-builtin_hash,SuspendGeneratorBaseline,-772427084
-builtin_hash,ResumeGeneratorBaseline,-1024670400
-builtin_hash,GlobalIsFinite,98040433
-builtin_hash,GlobalIsNaN,-131926158
-builtin_hash,LoadIC,758731508
-builtin_hash,LoadIC_Megamorphic,485927514
-builtin_hash,LoadIC_Noninlined,-900550790
-builtin_hash,LoadICTrampoline,279586909
-builtin_hash,LoadICBaseline,378721791
-builtin_hash,LoadICTrampoline_Megamorphic,279586909
-builtin_hash,LoadSuperIC,-700275115
-builtin_hash,LoadSuperICBaseline,-779741774
-builtin_hash,KeyedLoadIC,-932282799
-builtin_hash,KeyedLoadIC_Megamorphic,-52322939
-builtin_hash,KeyedLoadICTrampoline,279586909
-builtin_hash,KeyedLoadICBaseline,378721791
-builtin_hash,KeyedLoadICTrampoline_Megamorphic,279586909
-builtin_hash,StoreGlobalIC,-593770272
-builtin_hash,StoreGlobalICTrampoline,279586909
-builtin_hash,StoreGlobalICBaseline,378721791
-builtin_hash,StoreIC,-725198793
-builtin_hash,StoreICTrampoline,853716338
-builtin_hash,StoreICBaseline,-779741774
-builtin_hash,DefineNamedOwnIC,407070464
-builtin_hash,DefineNamedOwnICBaseline,-779741774
-builtin_hash,KeyedStoreIC,-781537170
-builtin_hash,KeyedStoreICTrampoline,853716338
-builtin_hash,KeyedStoreICBaseline,-779741774
-builtin_hash,DefineKeyedOwnIC,-368740640
-builtin_hash,StoreInArrayLiteralIC,870478079
-builtin_hash,StoreInArrayLiteralICBaseline,-779741774
-builtin_hash,LoadGlobalIC,-629815841
-builtin_hash,LoadGlobalICInsideTypeof,-681620395
-builtin_hash,LoadGlobalICTrampoline,742678434
-builtin_hash,LoadGlobalICBaseline,-376594265
-builtin_hash,LoadGlobalICInsideTypeofTrampoline,742678434
-builtin_hash,LoadGlobalICInsideTypeofBaseline,-376594265
-builtin_hash,LookupGlobalICBaseline,318821975
-builtin_hash,LookupGlobalICInsideTypeofBaseline,318821975
-builtin_hash,KeyedHasIC,-1007842062
-builtin_hash,KeyedHasICBaseline,378721791
-builtin_hash,KeyedHasIC_Megamorphic,508450008
-builtin_hash,IterableToList,444610848
-builtin_hash,IterableToListWithSymbolLookup,-721120479
-builtin_hash,IterableToListMayPreserveHoles,907505763
-builtin_hash,FindOrderedHashMapEntry,-772719645
-builtin_hash,MapConstructor,328612162
-builtin_hash,MapPrototypeSet,-740571272
-builtin_hash,MapPrototypeDelete,815676314
-builtin_hash,MapPrototypeGet,-99464800
-builtin_hash,MapPrototypeHas,417921745
-builtin_hash,MapPrototypeEntries,-250935376
-builtin_hash,MapPrototypeGetSize,1035731846
-builtin_hash,MapPrototypeForEach,-11074084
-builtin_hash,MapPrototypeKeys,-250935376
-builtin_hash,MapPrototypeValues,-250935376
-builtin_hash,MapIteratorPrototypeNext,-513700577
-builtin_hash,MapIteratorToList,788737747
-builtin_hash,SameValueNumbersOnly,-715209
-builtin_hash,Add_Baseline,239982805
-builtin_hash,AddSmi_Baseline,890570719
-builtin_hash,Subtract_Baseline,984085983
-builtin_hash,SubtractSmi_Baseline,745275517
-builtin_hash,Multiply_Baseline,363197242
-builtin_hash,MultiplySmi_Baseline,-291668426
-builtin_hash,Divide_Baseline,41207474
-builtin_hash,DivideSmi_Baseline,-228110709
-builtin_hash,Modulus_Baseline,895869986
-builtin_hash,ModulusSmi_Baseline,1052037814
-builtin_hash,Exponentiate_Baseline,525497385
-builtin_hash,BitwiseAnd_Baseline,834157251
-builtin_hash,BitwiseAndSmi_Baseline,-224843182
-builtin_hash,BitwiseOr_Baseline,-1000862579
-builtin_hash,BitwiseOrSmi_Baseline,-175921720
-builtin_hash,BitwiseXor_Baseline,451693864
-builtin_hash,BitwiseXorSmi_Baseline,1072796926
-builtin_hash,ShiftLeft_Baseline,-1059182958
-builtin_hash,ShiftLeftSmi_Baseline,180208819
-builtin_hash,ShiftRight_Baseline,8908966
-builtin_hash,ShiftRightSmi_Baseline,-553470248
-builtin_hash,ShiftRightLogical_Baseline,-771447674
-builtin_hash,ShiftRightLogicalSmi_Baseline,524787408
-builtin_hash,Add_WithFeedback,-726025304
-builtin_hash,Subtract_WithFeedback,82634219
-builtin_hash,Modulus_WithFeedback,-14646246
-builtin_hash,BitwiseOr_WithFeedback,-345564281
-builtin_hash,Equal_Baseline,-851425691
-builtin_hash,StrictEqual_Baseline,609264081
-builtin_hash,LessThan_Baseline,-250082751
-builtin_hash,GreaterThan_Baseline,442646997
-builtin_hash,LessThanOrEqual_Baseline,278491596
-builtin_hash,GreaterThanOrEqual_Baseline,-526555932
-builtin_hash,Equal_WithFeedback,470211465
-builtin_hash,StrictEqual_WithFeedback,-720033793
-builtin_hash,LessThan_WithFeedback,555433500
-builtin_hash,GreaterThan_WithFeedback,-13794951
-builtin_hash,GreaterThanOrEqual_WithFeedback,38912741
-builtin_hash,BitwiseNot_Baseline,-63143721
-builtin_hash,Decrement_Baseline,-491402242
-builtin_hash,Increment_Baseline,379465907
-builtin_hash,Negate_Baseline,984080569
-builtin_hash,ObjectAssign,72200033
-builtin_hash,ObjectCreate,-611788064
-builtin_hash,ObjectEntries,-669410235
-builtin_hash,ObjectGetOwnPropertyDescriptor,671274362
-builtin_hash,ObjectGetOwnPropertyNames,12658690
-builtin_hash,ObjectIs,-340387257
-builtin_hash,ObjectKeys,-12925872
-builtin_hash,ObjectPrototypeHasOwnProperty,156674900
-builtin_hash,ObjectToString,-633754100
-builtin_hash,InstanceOf_WithFeedback,411449225
-builtin_hash,InstanceOf_Baseline,486598742
-builtin_hash,ForInEnumerate,-1069244956
-builtin_hash,ForInPrepare,362202805
-builtin_hash,ForInFilter,-306829682
-builtin_hash,RegExpConstructor,-10164395
-builtin_hash,RegExpExecAtom,-1073379799
-builtin_hash,RegExpExecInternal,891768236
-builtin_hash,FindOrderedHashSetEntry,705655709
-builtin_hash,SetConstructor,-575472839
-builtin_hash,SetPrototypeHas,417921745
-builtin_hash,SetPrototypeAdd,-541161428
-builtin_hash,SetPrototypeDelete,851985022
-builtin_hash,SetPrototypeEntries,-250935376
-builtin_hash,SetPrototypeGetSize,1035731846
-builtin_hash,SetPrototypeForEach,-130012968
-builtin_hash,SetPrototypeValues,-250935376
-builtin_hash,SetIteratorPrototypeNext,-958421279
-builtin_hash,SetOrSetIteratorToList,144945576
-builtin_hash,StringFromCharCode,-225080952
-builtin_hash,StringPrototypeReplace,-894056994
-builtin_hash,StringPrototypeSplit,-81652142
-builtin_hash,TypedArrayConstructor,536725208
-builtin_hash,TypedArrayPrototypeByteLength,667117445
-builtin_hash,TypedArrayPrototypeLength,423335186
-builtin_hash,WeakMapConstructor,211573517
-builtin_hash,WeakMapLookupHashIndex,449726121
-builtin_hash,WeakMapGet,-388873308
-builtin_hash,WeakMapPrototypeHas,-407398312
-builtin_hash,WeakMapPrototypeSet,795326571
-builtin_hash,WeakSetConstructor,-100066523
-builtin_hash,WeakSetPrototypeHas,-407398312
-builtin_hash,WeakSetPrototypeAdd,-116381667
-builtin_hash,WeakCollectionSet,-319283680
-builtin_hash,AsyncGeneratorResolve,69898511
-builtin_hash,AsyncGeneratorYield,444077127
-builtin_hash,AsyncGeneratorResumeNext,-495744369
-builtin_hash,AsyncGeneratorPrototypeNext,95683089
-builtin_hash,AsyncGeneratorAwaitUncaught,-291001587
-builtin_hash,AsyncGeneratorAwaitResolveClosure,1023878839
-builtin_hash,AsyncGeneratorYieldResolveClosure,783335474
-builtin_hash,StringAdd_CheckNone,313254412
-builtin_hash,SubString,992908207
-builtin_hash,GetProperty,-151131763
-builtin_hash,GetPropertyWithReceiver,-145418645
-builtin_hash,SetProperty,877836229
-builtin_hash,CreateDataProperty,-606450676
-builtin_hash,ArrayPrototypeConcat,841497445
-builtin_hash,ArrayEvery,-992635840
-builtin_hash,ArrayFilterLoopLazyDeoptContinuation,923422735
-builtin_hash,ArrayFilterLoopContinuation,-871404088
-builtin_hash,ArrayFilter,135589144
-builtin_hash,ArrayPrototypeFind,-52246620
-builtin_hash,ArrayForEachLoopLazyDeoptContinuation,-87111692
-builtin_hash,ArrayForEachLoopContinuation,-432571379
-builtin_hash,ArrayForEach,1063323906
-builtin_hash,ArrayFrom,403114949
-builtin_hash,ArrayIsArray,421541474
-builtin_hash,LoadJoinElement_FastSmiOrObjectElements_0,-931014688
-builtin_hash,LoadJoinElement_FastDoubleElements_0,668207359
-builtin_hash,JoinStackPush,1045985488
-builtin_hash,JoinStackPop,294613228
-builtin_hash,ArrayPrototypeJoin,-591790002
-builtin_hash,ArrayPrototypeToString,254788114
-builtin_hash,ArrayPrototypeLastIndexOf,-623388518
-builtin_hash,ArrayMapLoopLazyDeoptContinuation,527144862
-builtin_hash,ArrayMapLoopContinuation,-248361443
-builtin_hash,ArrayMap,-977984343
-builtin_hash,ArrayReduceLoopLazyDeoptContinuation,641128240
-builtin_hash,ArrayReduceLoopContinuation,601284012
-builtin_hash,ArrayReduce,-918238503
-builtin_hash,ArrayPrototypeReverse,-50777013
-builtin_hash,ArrayPrototypeShift,763658583
-builtin_hash,ArrayPrototypeSlice,132491105
-builtin_hash,ArraySome,46741703
-builtin_hash,ArrayPrototypeSplice,532432423
-builtin_hash,ArrayPrototypeUnshift,285400235
-builtin_hash,ArrayBufferPrototypeGetByteLength,904301424
-builtin_hash,ArrayBufferIsView,-1007526052
-builtin_hash,ToInteger,-164962161
-builtin_hash,FastCreateDataProperty,-709822671
-builtin_hash,BooleanConstructor,-990386327
-builtin_hash,BooleanPrototypeToString,-439668236
-builtin_hash,ToString,-945769269
-builtin_hash,StringPrototypeToString,-494656392
-builtin_hash,StringPrototypeValueOf,-494656392
-builtin_hash,StringPrototypeCharAt,-1053868658
-builtin_hash,StringPrototypeCharCodeAt,228833317
-builtin_hash,StringPrototypeCodePointAt,-570719484
-builtin_hash,StringPrototypeConcat,408689273
-builtin_hash,StringConstructor,259187035
-builtin_hash,StringAddConvertLeft,-940497411
-builtin_hash,StringAddConvertRight,262934773
-builtin_hash,StringCharAt,40686160
-builtin_hash,FastNewClosureBaseline,274645735
-builtin_hash,FastNewFunctionContextFunction,-198047187
-builtin_hash,CreateRegExpLiteral,-338674408
-builtin_hash,CreateShallowArrayLiteral,-564919299
-builtin_hash,CreateEmptyArrayLiteral,643763718
-builtin_hash,CreateShallowObjectLiteral,1034845855
-builtin_hash,ObjectConstructor,-400745906
-builtin_hash,CreateEmptyLiteralObject,-942901622
-builtin_hash,NumberConstructor,287129549
-builtin_hash,StringToNumber,831842981
-builtin_hash,NonNumberToNumber,-93280944
-builtin_hash,NonNumberToNumeric,773024939
-builtin_hash,ToNumeric,-142083210
-builtin_hash,NumberToString,882645046
-builtin_hash,ToBoolean,303836147
-builtin_hash,ToBooleanForBaselineJump,-629829779
-builtin_hash,ToLength,1015821828
-builtin_hash,ToName,1027768228
-builtin_hash,ToObject,71126311
-builtin_hash,NonPrimitiveToPrimitive_Default,847969156
-builtin_hash,NonPrimitiveToPrimitive_Number,847969156
-builtin_hash,NonPrimitiveToPrimitive_String,847969156
-builtin_hash,OrdinaryToPrimitive_Number,424204202
-builtin_hash,OrdinaryToPrimitive_String,424204202
-builtin_hash,DataViewPrototypeGetByteLength,480775435
-builtin_hash,DataViewPrototypeGetFloat64,1003024607
-builtin_hash,DataViewPrototypeSetUint32,229410881
-builtin_hash,DataViewPrototypeSetFloat64,-938786777
-builtin_hash,FunctionPrototypeHasInstance,505391038
-builtin_hash,FastFunctionPrototypeBind,-508566393
-builtin_hash,ForInNext,-1021384217
-builtin_hash,GetIteratorWithFeedback,51240002
-builtin_hash,GetIteratorBaseline,-216059576
-builtin_hash,CallIteratorWithFeedback,581894736
-builtin_hash,MathAbs,-187735218
-builtin_hash,MathCeil,468403420
-builtin_hash,MathFloor,824943398
-builtin_hash,MathRound,-67452399
-builtin_hash,MathPow,-187693750
-builtin_hash,MathMax,897170464
-builtin_hash,MathMin,213295587
-builtin_hash,MathAsin,788026272
-builtin_hash,MathAtan2,-181481861
-builtin_hash,MathCos,-681373097
-builtin_hash,MathExp,-410231589
-builtin_hash,MathFround,415902182
-builtin_hash,MathImul,-715703335
-builtin_hash,MathLog,941930077
-builtin_hash,MathSin,855471515
-builtin_hash,MathSign,539035638
-builtin_hash,MathSqrt,-650867412
-builtin_hash,MathTan,85134160
-builtin_hash,MathTanh,-321274619
-builtin_hash,MathRandom,827257341
-builtin_hash,NumberPrototypeToString,-583893270
-builtin_hash,NumberIsInteger,775270226
-builtin_hash,NumberIsNaN,-189048659
-builtin_hash,NumberParseFloat,-439771973
-builtin_hash,ParseInt,-192026072
-builtin_hash,NumberParseInt,82296249
-builtin_hash,Add,325215303
-builtin_hash,Subtract,52083078
-builtin_hash,Multiply,-317381366
-builtin_hash,Divide,750482944
-builtin_hash,Modulus,328987036
-builtin_hash,CreateObjectWithoutProperties,596134857
-builtin_hash,ObjectIsExtensible,-930811057
-builtin_hash,ObjectPreventExtensions,858037175
-builtin_hash,ObjectGetPrototypeOf,-202287704
-builtin_hash,ObjectSetPrototypeOf,-524999648
-builtin_hash,ObjectPrototypeToString,169720373
-builtin_hash,ObjectPrototypeValueOf,-28430309
-builtin_hash,FulfillPromise,21355213
-builtin_hash,NewPromiseCapability,-218729781
-builtin_hash,PromiseCapabilityDefaultResolve,336354486
-builtin_hash,PerformPromiseThen,278993520
-builtin_hash,PromiseAll,-190868023
-builtin_hash,PromiseAllResolveElementClosure,-452068448
-builtin_hash,PromiseConstructor,-93257640
-builtin_hash,PromisePrototypeCatch,-895785401
-builtin_hash,PromiseFulfillReactionJob,-249420439
-builtin_hash,PromiseResolveTrampoline,-927707015
-builtin_hash,PromiseResolve,557472834
-builtin_hash,ResolvePromise,-983952394
-builtin_hash,PromisePrototypeThen,866384223
-builtin_hash,PromiseResolveThenableJob,-536493053
-builtin_hash,ProxyConstructor,-754644599
-builtin_hash,ProxyGetProperty,213230890
-builtin_hash,ProxyIsExtensible,-484311481
-builtin_hash,ProxyPreventExtensions,297316441
-builtin_hash,ReflectGet,-1068630269
-builtin_hash,ReflectHas,-927707015
-builtin_hash,RegExpPrototypeExec,-1008377217
-builtin_hash,RegExpMatchFast,470663647
-builtin_hash,RegExpReplace,-181940551
-builtin_hash,RegExpPrototypeReplace,39784472
-builtin_hash,RegExpSearchFast,-745723781
-builtin_hash,RegExpPrototypeSourceGetter,-712979884
-builtin_hash,RegExpSplit,881747508
-builtin_hash,RegExpPrototypeTest,-1044390149
-builtin_hash,RegExpPrototypeTestFast,381723041
-builtin_hash,RegExpPrototypeGlobalGetter,-937075195
-builtin_hash,RegExpPrototypeIgnoreCaseGetter,-369470981
-builtin_hash,RegExpPrototypeMultilineGetter,-760493777
-builtin_hash,RegExpPrototypeHasIndicesGetter,260570818
-builtin_hash,RegExpPrototypeDotAllGetter,260570818
-builtin_hash,RegExpPrototypeStickyGetter,-823365333
-builtin_hash,RegExpPrototypeUnicodeGetter,-823365333
-builtin_hash,RegExpPrototypeFlagsGetter,-334954319
-builtin_hash,StringPrototypeEndsWith,-178713286
-builtin_hash,StringPrototypeIncludes,482244051
-builtin_hash,StringPrototypeIndexOf,-130883228
-builtin_hash,StringPrototypeIterator,287346997
-builtin_hash,StringIteratorPrototypeNext,-1032793009
-builtin_hash,StringPrototypeMatch,-984631220
-builtin_hash,StringPrototypeSearch,-984631220
-builtin_hash,StringRepeat,407848752
-builtin_hash,StringPrototypeSlice,538867513
-builtin_hash,StringPrototypeStartsWith,-490931141
-builtin_hash,StringPrototypeSubstr,-1042470347
-builtin_hash,StringPrototypeSubstring,283811647
-builtin_hash,StringPrototypeTrim,509891784
-builtin_hash,SymbolPrototypeToString,477000612
-builtin_hash,CreateTypedArray,255685378
-builtin_hash,TypedArrayFrom,-527855119
-builtin_hash,TypedArrayPrototypeSet,-1042496168
-builtin_hash,TypedArrayPrototypeSubArray,-873399896
-builtin_hash,NewSloppyArgumentsElements,840136606
-builtin_hash,NewStrictArgumentsElements,-701611224
-builtin_hash,NewRestArgumentsElements,450207936
-builtin_hash,FastNewSloppyArguments,427487705
-builtin_hash,FastNewStrictArguments,940012797
-builtin_hash,FastNewRestArguments,408066435
-builtin_hash,StringSlowFlatten,200237548
-builtin_hash,StringIndexOf,506557026
-builtin_hash,Load_FastSmiElements_0,653973042
-builtin_hash,Load_FastObjectElements_0,653973042
-builtin_hash,Store_FastSmiElements_0,418112357
-builtin_hash,Store_FastObjectElements_0,-800846888
-builtin_hash,SortCompareDefault,304655245
-builtin_hash,SortCompareUserFn,-618954695
-builtin_hash,Copy,144972358
-builtin_hash,MergeAt,425921460
-builtin_hash,GallopLeft,-851568101
-builtin_hash,GallopRight,-1027593577
-builtin_hash,ArrayTimSort,-833804402
-builtin_hash,ArrayPrototypeSort,-985590788
-builtin_hash,StringFastLocaleCompare,-984642925
-builtin_hash,WasmInt32ToHeapNumber,-560703743
-builtin_hash,WasmTaggedNonSmiToInt32,-977713892
-builtin_hash,WasmTriggerTierUp,248716051
-builtin_hash,WasmStackGuard,534090893
-builtin_hash,CanUseSameAccessor_FastSmiElements_0,302023388
-builtin_hash,CanUseSameAccessor_FastObjectElements_0,302023388
-builtin_hash,StringPrototypeToLowerCaseIntl,525980093
-builtin_hash,StringToLowerCaseIntl,-870512333
-builtin_hash,WideHandler,964339339
-builtin_hash,ExtraWideHandler,964339339
-builtin_hash,LdarHandler,-1051441899
-builtin_hash,LdaZeroHandler,-361600616
-builtin_hash,LdaSmiHandler,-168991530
-builtin_hash,LdaUndefinedHandler,-638450171
-builtin_hash,LdaNullHandler,-638450171
-builtin_hash,LdaTheHoleHandler,-638450171
-builtin_hash,LdaTrueHandler,-1021965256
-builtin_hash,LdaFalseHandler,-1021965256
-builtin_hash,LdaConstantHandler,356409883
-builtin_hash,LdaContextSlotHandler,943881063
-builtin_hash,LdaImmutableContextSlotHandler,943881063
-builtin_hash,LdaCurrentContextSlotHandler,-382503010
-builtin_hash,LdaImmutableCurrentContextSlotHandler,-382503010
-builtin_hash,StarHandler,87231384
-builtin_hash,MovHandler,83265050
-builtin_hash,PushContextHandler,-240552696
-builtin_hash,PopContextHandler,112490181
-builtin_hash,TestReferenceEqualHandler,-82232472
-builtin_hash,TestUndetectableHandler,-510593553
-builtin_hash,TestNullHandler,68435121
-builtin_hash,TestUndefinedHandler,68435121
-builtin_hash,TestTypeOfHandler,112039968
-builtin_hash,LdaGlobalHandler,-710429991
-builtin_hash,LdaGlobalInsideTypeofHandler,449865173
-builtin_hash,StaGlobalHandler,431419910
-builtin_hash,StaContextSlotHandler,-317790092
-builtin_hash,StaCurrentContextSlotHandler,-425140012
-builtin_hash,LdaLookupGlobalSlotHandler,-213340191
-builtin_hash,LdaLookupGlobalSlotInsideTypeofHandler,841482473
-builtin_hash,StaLookupSlotHandler,712075677
-builtin_hash,GetNamedPropertyHandler,-731343419
-builtin_hash,GetNamedPropertyFromSuperHandler,-238764505
-builtin_hash,GetKeyedPropertyHandler,533315167
-builtin_hash,SetNamedPropertyHandler,-228269698
-builtin_hash,DefineNamedOwnPropertyHandler,-228269698
-builtin_hash,SetKeyedPropertyHandler,-286024195
-builtin_hash,DefineKeyedOwnPropertyHandler,-286024195
-builtin_hash,StaInArrayLiteralHandler,-286024195
-builtin_hash,DefineKeyedOwnPropertyInLiteralHandler,816417950
-builtin_hash,AddHandler,436623080
-builtin_hash,SubHandler,828723569
-builtin_hash,MulHandler,-316424498
-builtin_hash,DivHandler,515954740
-builtin_hash,ModHandler,-366411552
-builtin_hash,ExpHandler,841779190
-builtin_hash,BitwiseOrHandler,-654281787
-builtin_hash,BitwiseXorHandler,-535984936
-builtin_hash,BitwiseAndHandler,-787882211
-builtin_hash,ShiftLeftHandler,-843937923
-builtin_hash,ShiftRightHandler,212674128
-builtin_hash,ShiftRightLogicalHandler,46895009
-builtin_hash,AddSmiHandler,445675964
-builtin_hash,SubSmiHandler,888105299
-builtin_hash,MulSmiHandler,75879268
-builtin_hash,DivSmiHandler,-1048906096
-builtin_hash,ModSmiHandler,844716305
-builtin_hash,BitwiseOrSmiHandler,950867671
-builtin_hash,BitwiseXorSmiHandler,667017295
-builtin_hash,BitwiseAndSmiHandler,16303015
-builtin_hash,ShiftLeftSmiHandler,-243955085
-builtin_hash,ShiftRightSmiHandler,247609496
-builtin_hash,ShiftRightLogicalSmiHandler,-992904191
-builtin_hash,IncHandler,-790806177
-builtin_hash,DecHandler,395099716
-builtin_hash,NegateHandler,773570671
-builtin_hash,BitwiseNotHandler,-30220634
-builtin_hash,ToBooleanLogicalNotHandler,-99917552
-builtin_hash,LogicalNotHandler,-229756855
-builtin_hash,TypeOfHandler,872105570
-builtin_hash,DeletePropertyStrictHandler,986048046
-builtin_hash,DeletePropertySloppyHandler,-712291966
-builtin_hash,GetSuperConstructorHandler,728738893
-builtin_hash,CallAnyReceiverHandler,-851436429
-builtin_hash,CallPropertyHandler,-851436429
-builtin_hash,CallProperty0Handler,250813033
-builtin_hash,CallProperty1Handler,-121823545
-builtin_hash,CallProperty2Handler,370258853
-builtin_hash,CallUndefinedReceiverHandler,-986912746
-builtin_hash,CallUndefinedReceiver0Handler,-202732647
-builtin_hash,CallUndefinedReceiver1Handler,565224727
-builtin_hash,CallUndefinedReceiver2Handler,387553770
-builtin_hash,CallWithSpreadHandler,-851436429
-builtin_hash,CallRuntimeHandler,-170619637
-builtin_hash,CallJSRuntimeHandler,409704029
-builtin_hash,InvokeIntrinsicHandler,715377671
-builtin_hash,ConstructHandler,-131706767
-builtin_hash,ConstructWithSpreadHandler,364942391
-builtin_hash,TestEqualHandler,-837108372
-builtin_hash,TestEqualStrictHandler,894153483
-builtin_hash,TestLessThanHandler,-203533412
-builtin_hash,TestGreaterThanHandler,-62684313
-builtin_hash,TestLessThanOrEqualHandler,200710478
-builtin_hash,TestGreaterThanOrEqualHandler,-469101728
-builtin_hash,TestInstanceOfHandler,-340407472
-builtin_hash,TestInHandler,-632047176
-builtin_hash,ToNameHandler,751533885
-builtin_hash,ToNumberHandler,242489604
-builtin_hash,ToNumericHandler,839640143
-builtin_hash,ToObjectHandler,751533885
-builtin_hash,ToStringHandler,-825940301
-builtin_hash,CreateRegExpLiteralHandler,774985654
-builtin_hash,CreateArrayLiteralHandler,440763826
-builtin_hash,CreateArrayFromIterableHandler,-751073497
-builtin_hash,CreateEmptyArrayLiteralHandler,825438818
-builtin_hash,CreateObjectLiteralHandler,-380204898
-builtin_hash,CreateEmptyObjectLiteralHandler,-480083872
-builtin_hash,CreateClosureHandler,877654061
-builtin_hash,CreateBlockContextHandler,88550400
-builtin_hash,CreateCatchContextHandler,-353230330
-builtin_hash,CreateFunctionContextHandler,159733033
-builtin_hash,CreateMappedArgumentsHandler,427483474
-builtin_hash,CreateUnmappedArgumentsHandler,-700097820
-builtin_hash,CreateRestParameterHandler,-443936485
-builtin_hash,JumpLoopHandler,-343051033
-builtin_hash,JumpHandler,930291898
-builtin_hash,JumpConstantHandler,30595851
-builtin_hash,JumpIfUndefinedConstantHandler,643859045
-builtin_hash,JumpIfNotUndefinedConstantHandler,-579153610
-builtin_hash,JumpIfUndefinedOrNullConstantHandler,407521228
-builtin_hash,JumpIfTrueConstantHandler,643859045
-builtin_hash,JumpIfFalseConstantHandler,643859045
-builtin_hash,JumpIfToBooleanTrueConstantHandler,696724860
-builtin_hash,JumpIfToBooleanFalseConstantHandler,-179848636
-builtin_hash,JumpIfToBooleanTrueHandler,690028724
-builtin_hash,JumpIfToBooleanFalseHandler,-185041964
-builtin_hash,JumpIfTrueHandler,-843949956
-builtin_hash,JumpIfFalseHandler,-843949956
-builtin_hash,JumpIfNullHandler,-843949956
-builtin_hash,JumpIfNotNullHandler,1010847017
-builtin_hash,JumpIfUndefinedHandler,-843949956
-builtin_hash,JumpIfNotUndefinedHandler,1010847017
-builtin_hash,JumpIfUndefinedOrNullHandler,-517586474
-builtin_hash,JumpIfJSReceiverHandler,-9297690
-builtin_hash,SwitchOnSmiNoFeedbackHandler,-716989037
-builtin_hash,ForInEnumerateHandler,61176991
-builtin_hash,ForInPrepareHandler,748762980
-builtin_hash,ForInContinueHandler,-714020166
-builtin_hash,ForInNextHandler,1029822774
-builtin_hash,ForInStepHandler,776836572
-builtin_hash,SetPendingMessageHandler,-975756024
-builtin_hash,ThrowHandler,644164630
-builtin_hash,ReThrowHandler,644164630
-builtin_hash,ReturnHandler,258099816
-builtin_hash,ThrowReferenceErrorIfHoleHandler,-638014566
-builtin_hash,ThrowSuperNotCalledIfHoleHandler,-464286245
-builtin_hash,ThrowSuperAlreadyCalledIfNotHoleHandler,398738172
-builtin_hash,ThrowIfNotSuperConstructorHandler,405467231
-builtin_hash,SwitchOnGeneratorStateHandler,-1026917452
-builtin_hash,SuspendGeneratorHandler,-1054903459
-builtin_hash,ResumeGeneratorHandler,31675678
-builtin_hash,GetIteratorHandler,-711157277
-builtin_hash,ShortStarHandler,-568713113
-builtin_hash,LdarWideHandler,756831261
-builtin_hash,LdaSmiWideHandler,-782553530
-builtin_hash,LdaConstantWideHandler,-1037025209
-builtin_hash,LdaContextSlotWideHandler,1063635436
-builtin_hash,LdaImmutableContextSlotWideHandler,1063635436
-builtin_hash,LdaImmutableCurrentContextSlotWideHandler,847312619
-builtin_hash,StarWideHandler,40106091
-builtin_hash,MovWideHandler,-754864487
-builtin_hash,PushContextWideHandler,-948084621
-builtin_hash,PopContextWideHandler,245106357
-builtin_hash,TestReferenceEqualWideHandler,335478736
-builtin_hash,LdaGlobalWideHandler,-1010718236
-builtin_hash,LdaGlobalInsideTypeofWideHandler,-149141203
-builtin_hash,StaGlobalWideHandler,723033359
-builtin_hash,StaContextSlotWideHandler,731461442
-builtin_hash,StaCurrentContextSlotWideHandler,824213038
-builtin_hash,LdaLookupGlobalSlotWideHandler,-311844471
-builtin_hash,GetNamedPropertyWideHandler,-251017711
-builtin_hash,GetKeyedPropertyWideHandler,-256173219
-builtin_hash,SetNamedPropertyWideHandler,137651840
-builtin_hash,DefineNamedOwnPropertyWideHandler,137651840
-builtin_hash,SetKeyedPropertyWideHandler,-232580858
-builtin_hash,DefineKeyedOwnPropertyWideHandler,-232580858
-builtin_hash,StaInArrayLiteralWideHandler,-232580858
-builtin_hash,AddWideHandler,40447064
-builtin_hash,SubWideHandler,563692284
-builtin_hash,MulWideHandler,42508558
-builtin_hash,DivWideHandler,-844098316
-builtin_hash,BitwiseOrWideHandler,-328979788
-builtin_hash,BitwiseAndWideHandler,-469583662
-builtin_hash,ShiftLeftWideHandler,-954698376
-builtin_hash,AddSmiWideHandler,683295664
-builtin_hash,SubSmiWideHandler,-413733930
-builtin_hash,MulSmiWideHandler,-838301803
-builtin_hash,DivSmiWideHandler,527308360
-builtin_hash,ModSmiWideHandler,1034309589
-builtin_hash,BitwiseOrSmiWideHandler,492037335
-builtin_hash,BitwiseXorSmiWideHandler,-42936112
-builtin_hash,BitwiseAndSmiWideHandler,-477429885
-builtin_hash,ShiftLeftSmiWideHandler,672571321
-builtin_hash,ShiftRightSmiWideHandler,-67772744
-builtin_hash,ShiftRightLogicalSmiWideHandler,127757354
-builtin_hash,IncWideHandler,-922639629
-builtin_hash,DecWideHandler,-907897874
-builtin_hash,NegateWideHandler,-988497568
-builtin_hash,CallPropertyWideHandler,-698600283
-builtin_hash,CallProperty0WideHandler,1057782406
-builtin_hash,CallProperty1WideHandler,166979495
-builtin_hash,CallProperty2WideHandler,-58239499
-builtin_hash,CallUndefinedReceiverWideHandler,-121494034
-builtin_hash,CallUndefinedReceiver0WideHandler,-36365251
-builtin_hash,CallUndefinedReceiver1WideHandler,-1052313758
-builtin_hash,CallUndefinedReceiver2WideHandler,-469182582
-builtin_hash,CallWithSpreadWideHandler,-698600283
-builtin_hash,ConstructWideHandler,411540742
-builtin_hash,TestEqualWideHandler,-902995058
-builtin_hash,TestEqualStrictWideHandler,852452310
-builtin_hash,TestLessThanWideHandler,814869973
-builtin_hash,TestGreaterThanWideHandler,18887871
-builtin_hash,TestLessThanOrEqualWideHandler,34488528
-builtin_hash,TestGreaterThanOrEqualWideHandler,702527286
-builtin_hash,TestInstanceOfWideHandler,577442592
-builtin_hash,TestInWideHandler,469604978
-builtin_hash,ToNumericWideHandler,-933767737
-builtin_hash,CreateRegExpLiteralWideHandler,-286224018
-builtin_hash,CreateArrayLiteralWideHandler,925645732
-builtin_hash,CreateEmptyArrayLiteralWideHandler,556344123
-builtin_hash,CreateObjectLiteralWideHandler,-878578517
-builtin_hash,CreateClosureWideHandler,-102315205
-builtin_hash,CreateBlockContextWideHandler,392513921
-builtin_hash,CreateFunctionContextWideHandler,179338975
-builtin_hash,JumpLoopWideHandler,-949183832
-builtin_hash,JumpWideHandler,930291898
-builtin_hash,JumpIfToBooleanTrueWideHandler,-205748918
-builtin_hash,JumpIfToBooleanFalseWideHandler,1069905826
-builtin_hash,JumpIfTrueWideHandler,948634550
-builtin_hash,JumpIfFalseWideHandler,948634550
-builtin_hash,SwitchOnSmiNoFeedbackWideHandler,633155127
-builtin_hash,ForInPrepareWideHandler,-215451327
-builtin_hash,ForInNextWideHandler,372934797
-builtin_hash,ThrowReferenceErrorIfHoleWideHandler,298664482
-builtin_hash,GetIteratorWideHandler,43434708
-builtin_hash,LdaSmiExtraWideHandler,-892533764
-builtin_hash,LdaGlobalExtraWideHandler,661412585
-builtin_hash,AddSmiExtraWideHandler,-692969189
-builtin_hash,SubSmiExtraWideHandler,435863200
-builtin_hash,MulSmiExtraWideHandler,1072184980
-builtin_hash,DivSmiExtraWideHandler,-704989643
-builtin_hash,BitwiseOrSmiExtraWideHandler,-957712250
-builtin_hash,BitwiseXorSmiExtraWideHandler,44753591
-builtin_hash,BitwiseAndSmiExtraWideHandler,-563032786
-builtin_hash,CallUndefinedReceiverExtraWideHandler,-267336492
-builtin_hash,CallUndefinedReceiver1ExtraWideHandler,93448265
-builtin_hash,CallUndefinedReceiver2ExtraWideHandler,11673012
+builtin_hash,RecordWriteSaveFP,-613048523
+builtin_hash,RecordWriteIgnoreFP,-613048523
+builtin_hash,EphemeronKeyBarrierSaveFP,-874028499
+builtin_hash,AdaptorWithBuiltinExitFrame,-50443338
+builtin_hash,Call_ReceiverIsNullOrUndefined_Baseline_Compact,277963652
+builtin_hash,Call_ReceiverIsNotNullOrUndefined_Baseline_Compact,739975018
+builtin_hash,Call_ReceiverIsAny_Baseline_Compact,739975018
+builtin_hash,CallProxy,265720458
+builtin_hash,CallWithSpread,690518666
+builtin_hash,CallWithSpread_Baseline,14944167
+builtin_hash,CallWithArrayLike,-463192950
+builtin_hash,ConstructWithSpread,1026222363
+builtin_hash,ConstructWithSpread_Baseline,-954447059
+builtin_hash,Construct_Baseline,242132798
+builtin_hash,FastNewObject,812115752
+builtin_hash,FastNewClosure,-22842529
+builtin_hash,StringEqual,552928703
+builtin_hash,StringGreaterThan,814990350
+builtin_hash,StringGreaterThanOrEqual,-931415038
+builtin_hash,StringLessThan,-931415038
+builtin_hash,StringLessThanOrEqual,814990350
+builtin_hash,StringSubstring,679034293
+builtin_hash,OrderedHashTableHealIndex,-480837431
+builtin_hash,CompileLazy,-913572652
+builtin_hash,CompileLazyDeoptimizedCode,797435305
+builtin_hash,InstantiateAsmJs,-824208537
+builtin_hash,AllocateInYoungGeneration,-589367571
+builtin_hash,AllocateRegularInYoungGeneration,549206964
+builtin_hash,AllocateRegularInOldGeneration,549206964
+builtin_hash,CopyFastSmiOrObjectElements,-664166620
+builtin_hash,GrowFastDoubleElements,-794207344
+builtin_hash,GrowFastSmiOrObjectElements,-727031326
+builtin_hash,ToNumber,87194511
+builtin_hash,ToNumber_Baseline,-245107362
+builtin_hash,ToNumeric_Baseline,765738096
+builtin_hash,ToNumberConvertBigInt,-809735249
+builtin_hash,Typeof,554300746
+builtin_hash,KeyedLoadIC_PolymorphicName,808866465
+builtin_hash,KeyedStoreIC_Megamorphic,355428822
+builtin_hash,DefineKeyedOwnIC_Megamorphic,-254774567
+builtin_hash,LoadGlobalIC_NoFeedback,567497889
+builtin_hash,LoadIC_FunctionPrototype,440547932
+builtin_hash,LoadIC_StringLength,631981109
+builtin_hash,LoadIC_StringWrapperLength,957410129
+builtin_hash,LoadIC_NoFeedback,-673925088
+builtin_hash,StoreIC_NoFeedback,599149807
+builtin_hash,DefineNamedOwnIC_NoFeedback,-684443605
+builtin_hash,KeyedLoadIC_SloppyArguments,732273933
+builtin_hash,StoreFastElementIC_Standard,301200009
+builtin_hash,StoreFastElementIC_GrowNoTransitionHandleCOW,-894353505
+builtin_hash,StoreFastElementIC_NoTransitionHandleCOW,-684092303
+builtin_hash,ElementsTransitionAndStore_Standard,-313637466
+builtin_hash,ElementsTransitionAndStore_GrowNoTransitionHandleCOW,887654385
+builtin_hash,ElementsTransitionAndStore_NoTransitionHandleCOW,-730942180
+builtin_hash,KeyedHasIC_PolymorphicName,-900991969
+builtin_hash,EnqueueMicrotask,-201594324
+builtin_hash,RunMicrotasks,226014440
+builtin_hash,HasProperty,-179991880
+builtin_hash,DeleteProperty,-417791504
+builtin_hash,SetDataProperties,-676389083
+builtin_hash,ReturnReceiver,-253986889
+builtin_hash,ArrayConstructor,-132723945
+builtin_hash,ArrayConstructorImpl,-940010648
+builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DontOverride,-419508170
+builtin_hash,ArrayNoArgumentConstructor_HoleySmi_DontOverride,-419508170
+builtin_hash,ArrayNoArgumentConstructor_PackedSmi_DisableAllocationSites,605372040
+builtin_hash,ArrayNoArgumentConstructor_Packed_DisableAllocationSites,605372040
+builtin_hash,ArrayNoArgumentConstructor_Holey_DisableAllocationSites,605372040
+builtin_hash,ArrayNoArgumentConstructor_PackedDouble_DisableAllocationSites,-118459699
+builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DontOverride,-533026482
+builtin_hash,ArraySingleArgumentConstructor_HoleySmi_DisableAllocationSites,276667194
+builtin_hash,ArraySingleArgumentConstructor_Holey_DisableAllocationSites,276667194
+builtin_hash,ArraySingleArgumentConstructor_HoleyDouble_DisableAllocationSites,-533601049
+builtin_hash,ArrayIncludesSmi,-836179006
+builtin_hash,ArrayIncludesSmiOrObject,162670788
+builtin_hash,ArrayIncludes,508610041
+builtin_hash,ArrayIndexOfSmi,-144958716
+builtin_hash,ArrayIndexOfSmiOrObject,-560665373
+builtin_hash,ArrayIndexOf,659016893
+builtin_hash,ArrayPrototypePop,-672159034
+builtin_hash,ArrayPrototypePush,-828516926
+builtin_hash,CloneFastJSArray,330962956
+builtin_hash,CloneFastJSArrayFillingHoles,-114093580
+builtin_hash,ExtractFastJSArray,-899029625
+builtin_hash,ArrayPrototypeEntries,-846534049
+builtin_hash,ArrayPrototypeKeys,-432117890
+builtin_hash,ArrayPrototypeValues,-846534049
+builtin_hash,ArrayIteratorPrototypeNext,167355436
+builtin_hash,AsyncFunctionEnter,-860415031
+builtin_hash,AsyncFunctionResolve,910332485
+builtin_hash,AsyncFunctionAwaitCaught,-619125883
+builtin_hash,AsyncFunctionAwaitUncaught,-619125883
+builtin_hash,AsyncFunctionAwaitResolveClosure,-441313583
+builtin_hash,DatePrototypeGetDate,596885245
+builtin_hash,DatePrototypeGetDay,596885245
+builtin_hash,DatePrototypeGetFullYear,596885245
+builtin_hash,DatePrototypeGetHours,596885245
+builtin_hash,DatePrototypeGetMilliseconds,-147735130
+builtin_hash,DatePrototypeGetMinutes,596885245
+builtin_hash,DatePrototypeGetMonth,596885245
+builtin_hash,DatePrototypeGetSeconds,596885245
+builtin_hash,DatePrototypeGetTime,842589209
+builtin_hash,DatePrototypeGetTimezoneOffset,-147735130
+builtin_hash,DatePrototypeValueOf,842589209
+builtin_hash,DatePrototypeToPrimitive,-469261030
+builtin_hash,CreateIterResultObject,-236239497
+builtin_hash,CreateGeneratorObject,-989601020
+builtin_hash,GeneratorPrototypeNext,-532167070
+builtin_hash,GeneratorPrototypeReturn,204056688
+builtin_hash,SuspendGeneratorBaseline,-716242694
+builtin_hash,ResumeGeneratorBaseline,600643426
+builtin_hash,GlobalIsFinite,-28742852
+builtin_hash,GlobalIsNaN,-414427038
+builtin_hash,LoadIC,-1028921753
+builtin_hash,LoadIC_Megamorphic,604208967
+builtin_hash,LoadIC_Noninlined,-411987614
+builtin_hash,LoadICTrampoline,800274028
+builtin_hash,LoadICBaseline,470944725
+builtin_hash,LoadICTrampoline_Megamorphic,800274028
+builtin_hash,LoadSuperIC,-145652312
+builtin_hash,LoadSuperICBaseline,-463763660
+builtin_hash,KeyedLoadIC,-400473566
+builtin_hash,KeyedLoadIC_Megamorphic,41817838
+builtin_hash,KeyedLoadICTrampoline,800274028
+builtin_hash,KeyedLoadICBaseline,470944725
+builtin_hash,KeyedLoadICTrampoline_Megamorphic,800274028
+builtin_hash,StoreGlobalIC,-985598929
+builtin_hash,StoreGlobalICTrampoline,800274028
+builtin_hash,StoreGlobalICBaseline,470944725
+builtin_hash,StoreIC,107868822
+builtin_hash,StoreICTrampoline,515324941
+builtin_hash,StoreICBaseline,-463763660
+builtin_hash,DefineNamedOwnIC,293425336
+builtin_hash,DefineNamedOwnICBaseline,-463763660
+builtin_hash,KeyedStoreIC,-634858106
+builtin_hash,KeyedStoreICTrampoline,515324941
+builtin_hash,KeyedStoreICBaseline,-463763660
+builtin_hash,DefineKeyedOwnIC,-567510982
+builtin_hash,StoreInArrayLiteralIC,336733574
+builtin_hash,StoreInArrayLiteralICBaseline,-463763660
+builtin_hash,LoadGlobalIC,-994002095
+builtin_hash,LoadGlobalICInsideTypeof,131610143
+builtin_hash,LoadGlobalICTrampoline,-356577892
+builtin_hash,LoadGlobalICBaseline,-87390287
+builtin_hash,LoadGlobalICInsideTypeofTrampoline,-356577892
+builtin_hash,LoadGlobalICInsideTypeofBaseline,-87390287
+builtin_hash,LookupGlobalICBaseline,195819709
+builtin_hash,LookupGlobalICInsideTypeofBaseline,195819709
+builtin_hash,KeyedHasIC,-581893205
+builtin_hash,KeyedHasICBaseline,470944725
+builtin_hash,KeyedHasIC_Megamorphic,-179991880
+builtin_hash,IterableToList,-847583682
+builtin_hash,IterableToListWithSymbolLookup,639766325
+builtin_hash,IterableToListMayPreserveHoles,915672519
+builtin_hash,FindOrderedHashMapEntry,257985360
+builtin_hash,MapConstructor,173900465
+builtin_hash,MapPrototypeSet,-909373880
+builtin_hash,MapPrototypeDelete,-182536468
+builtin_hash,MapPrototypeGet,-10028336
+builtin_hash,MapPrototypeHas,-139761843
+builtin_hash,MapPrototypeEntries,-344495525
+builtin_hash,MapPrototypeGetSize,1002199563
+builtin_hash,MapPrototypeForEach,666422496
+builtin_hash,MapPrototypeKeys,-344495525
+builtin_hash,MapPrototypeValues,-344495525
+builtin_hash,MapIteratorPrototypeNext,824163271
+builtin_hash,MapIteratorToList,-171739571
+builtin_hash,SameValueNumbersOnly,-385008716
+builtin_hash,Add_Baseline,-279802821
+builtin_hash,AddSmi_Baseline,-180294218
+builtin_hash,Subtract_Baseline,422911741
+builtin_hash,SubtractSmi_Baseline,593938918
+builtin_hash,Multiply_Baseline,-390820476
+builtin_hash,MultiplySmi_Baseline,325873812
+builtin_hash,Divide_Baseline,-303206156
+builtin_hash,DivideSmi_Baseline,-760734875
+builtin_hash,Modulus_Baseline,-56419644
+builtin_hash,ModulusSmi_Baseline,-723448
+builtin_hash,Exponentiate_Baseline,-897267514
+builtin_hash,BitwiseAnd_Baseline,368212144
+builtin_hash,BitwiseAndSmi_Baseline,-1040430105
+builtin_hash,BitwiseOr_Baseline,-468458668
+builtin_hash,BitwiseOrSmi_Baseline,688726246
+builtin_hash,BitwiseXor_Baseline,-113074811
+builtin_hash,BitwiseXorSmi_Baseline,601401020
+builtin_hash,ShiftLeft_Baseline,-775732772
+builtin_hash,ShiftLeftSmi_Baseline,-78665210
+builtin_hash,ShiftRight_Baseline,748634885
+builtin_hash,ShiftRightSmi_Baseline,886941283
+builtin_hash,ShiftRightLogical_Baseline,561208446
+builtin_hash,ShiftRightLogicalSmi_Baseline,-31850172
+builtin_hash,Add_WithFeedback,-713508648
+builtin_hash,Subtract_WithFeedback,-1006518356
+builtin_hash,Modulus_WithFeedback,673708690
+builtin_hash,BitwiseOr_WithFeedback,-71811840
+builtin_hash,Equal_Baseline,-449571287
+builtin_hash,StrictEqual_Baseline,-311709296
+builtin_hash,LessThan_Baseline,-1041710075
+builtin_hash,GreaterThan_Baseline,763769306
+builtin_hash,LessThanOrEqual_Baseline,-289600196
+builtin_hash,GreaterThanOrEqual_Baseline,-964000144
+builtin_hash,Equal_WithFeedback,-804822195
+builtin_hash,StrictEqual_WithFeedback,316409561
+builtin_hash,LessThan_WithFeedback,-1041748847
+builtin_hash,GreaterThan_WithFeedback,208079969
+builtin_hash,GreaterThanOrEqual_WithFeedback,50039232
+builtin_hash,BitwiseNot_Baseline,574212378
+builtin_hash,Decrement_Baseline,740961552
+builtin_hash,Increment_Baseline,-482954167
+builtin_hash,Negate_Baseline,257429052
+builtin_hash,ObjectAssign,415745977
+builtin_hash,ObjectCreate,152352347
+builtin_hash,ObjectEntries,-267361188
+builtin_hash,ObjectGetOwnPropertyDescriptor,-1005546404
+builtin_hash,ObjectGetOwnPropertyNames,-10249982
+builtin_hash,ObjectIs,947042700
+builtin_hash,ObjectKeys,276395735
+builtin_hash,ObjectPrototypeHasOwnProperty,-366540189
+builtin_hash,ObjectToString,-680252272
+builtin_hash,InstanceOf_WithFeedback,-814385450
+builtin_hash,InstanceOf_Baseline,-567095434
+builtin_hash,ForInEnumerate,329908035
+builtin_hash,ForInPrepare,731557174
+builtin_hash,ForInFilter,884185984
+builtin_hash,RegExpConstructor,-1029370119
+builtin_hash,RegExpExecAtom,181372809
+builtin_hash,RegExpExecInternal,317900879
+builtin_hash,FindOrderedHashSetEntry,482436035
+builtin_hash,SetConstructor,692235107
+builtin_hash,SetPrototypeHas,-139761843
+builtin_hash,SetPrototypeAdd,-596680080
+builtin_hash,SetPrototypeDelete,331633635
+builtin_hash,SetPrototypeEntries,-344495525
+builtin_hash,SetPrototypeGetSize,1002199563
+builtin_hash,SetPrototypeForEach,97244170
+builtin_hash,SetPrototypeValues,-344495525
+builtin_hash,SetIteratorPrototypeNext,-441725951
+builtin_hash,SetOrSetIteratorToList,623342942
+builtin_hash,StringFromCharCode,-123751380
+builtin_hash,StringPrototypeReplace,-921072145
+builtin_hash,StringPrototypeSplit,-419686814
+builtin_hash,TypedArrayConstructor,32466415
+builtin_hash,TypedArrayPrototypeByteLength,864895308
+builtin_hash,TypedArrayPrototypeLength,539604699
+builtin_hash,WeakMapConstructor,814764494
+builtin_hash,WeakMapLookupHashIndex,-464287185
+builtin_hash,WeakMapGet,925651553
+builtin_hash,WeakMapPrototypeHas,947465532
+builtin_hash,WeakMapPrototypeSet,-976760951
+builtin_hash,WeakSetConstructor,694246453
+builtin_hash,WeakSetPrototypeHas,947465532
+builtin_hash,WeakSetPrototypeAdd,-160318733
+builtin_hash,WeakCollectionSet,578996244
+builtin_hash,AsyncGeneratorResolve,-83028412
+builtin_hash,AsyncGeneratorYieldWithAwait,-366463177
+builtin_hash,AsyncGeneratorResumeNext,220127321
+builtin_hash,AsyncGeneratorPrototypeNext,1069549757
+builtin_hash,AsyncGeneratorAwaitUncaught,-628599896
+builtin_hash,AsyncGeneratorAwaitResolveClosure,1062097477
+builtin_hash,AsyncGeneratorYieldWithAwaitResolveClosure,793122606
+builtin_hash,StringAdd_CheckNone,113370168
+builtin_hash,SubString,895503589
+builtin_hash,GetProperty,1052862169
+builtin_hash,GetPropertyWithReceiver,1045827042
+builtin_hash,SetProperty,908643608
+builtin_hash,CreateDataProperty,-314133834
+builtin_hash,ArrayPrototypeConcat,-557766770
+builtin_hash,ArrayEvery,-740699383
+builtin_hash,ArrayFilterLoopLazyDeoptContinuation,-463893516
+builtin_hash,ArrayFilterLoopContinuation,-636224543
+builtin_hash,ArrayFilter,-1006837550
+builtin_hash,ArrayPrototypeFind,358067331
+builtin_hash,ArrayForEachLoopLazyDeoptContinuation,-227856192
+builtin_hash,ArrayForEachLoopContinuation,498815593
+builtin_hash,ArrayForEach,-465472618
+builtin_hash,ArrayFrom,559791774
+builtin_hash,ArrayIsArray,556045869
+builtin_hash,LoadJoinElement_FastSmiOrObjectElements_0,4464260
+builtin_hash,LoadJoinElement_FastDoubleElements_0,-669389930
+builtin_hash,JoinStackPush,932509525
+builtin_hash,JoinStackPop,97051696
+builtin_hash,ArrayPrototypeJoin,638420418
+builtin_hash,ArrayPrototypeToString,571363693
+builtin_hash,ArrayPrototypeLastIndexOf,-262998450
+builtin_hash,ArrayMapLoopLazyDeoptContinuation,992596139
+builtin_hash,ArrayMapLoopContinuation,852679435
+builtin_hash,ArrayMap,237015696
+builtin_hash,ArrayReduceLoopLazyDeoptContinuation,-1021360101
+builtin_hash,ArrayReduceLoopContinuation,736239909
+builtin_hash,ArrayReduce,550306639
+builtin_hash,ArrayPrototypeReverse,-848939503
+builtin_hash,ArrayPrototypeShift,510698980
+builtin_hash,ArrayPrototypeSlice,-226926113
+builtin_hash,ArraySome,616986483
+builtin_hash,ArrayPrototypeSplice,318122997
+builtin_hash,ArrayPrototypeUnshift,942293281
+builtin_hash,ArrayBufferPrototypeGetByteLength,8155127
+builtin_hash,ArrayBufferIsView,-92420774
+builtin_hash,ToInteger,-772950786
+builtin_hash,FastCreateDataProperty,683077437
+builtin_hash,BooleanConstructor,104847507
+builtin_hash,BooleanPrototypeToString,496844333
+builtin_hash,ToString,-492204321
+builtin_hash,StringPrototypeToString,232130928
+builtin_hash,StringPrototypeValueOf,232130928
+builtin_hash,StringPrototypeCharAt,-493882295
+builtin_hash,StringPrototypeCharCodeAt,-70476469
+builtin_hash,StringPrototypeCodePointAt,958343749
+builtin_hash,StringPrototypeConcat,122908250
+builtin_hash,StringConstructor,36941296
+builtin_hash,StringAddConvertLeft,895631940
+builtin_hash,StringAddConvertRight,620894196
+builtin_hash,StringCharAt,-771156702
+builtin_hash,FastNewClosureBaseline,-345301780
+builtin_hash,FastNewFunctionContextFunction,393493853
+builtin_hash,CreateRegExpLiteral,1052274841
+builtin_hash,CreateShallowArrayLiteral,758569216
+builtin_hash,CreateEmptyArrayLiteral,-244361805
+builtin_hash,CreateShallowObjectLiteral,429596211
+builtin_hash,ObjectConstructor,792071103
+builtin_hash,CreateEmptyLiteralObject,792021411
+builtin_hash,NumberConstructor,-545912408
+builtin_hash,StringToNumber,-567475001
+builtin_hash,NonNumberToNumber,-75339598
+builtin_hash,NonNumberToNumeric,-163611573
+builtin_hash,ToNumeric,1067114169
+builtin_hash,NumberToString,808056721
+builtin_hash,ToBoolean,474893826
+builtin_hash,ToBooleanForBaselineJump,-1000387172
+builtin_hash,ToLength,-1031135247
+builtin_hash,ToName,-893589751
+builtin_hash,ToObject,-995611522
+builtin_hash,NonPrimitiveToPrimitive_Default,-741936834
+builtin_hash,NonPrimitiveToPrimitive_Number,-741936834
+builtin_hash,NonPrimitiveToPrimitive_String,-741936834
+builtin_hash,OrdinaryToPrimitive_Number,940682530
+builtin_hash,OrdinaryToPrimitive_String,940682530
+builtin_hash,DataViewPrototypeGetByteLength,-344862281
+builtin_hash,DataViewPrototypeGetFloat64,-710736378
+builtin_hash,DataViewPrototypeSetUint32,561326289
+builtin_hash,DataViewPrototypeSetFloat64,224815643
+builtin_hash,FunctionPrototypeHasInstance,-159239165
+builtin_hash,FastFunctionPrototypeBind,-835190429
+builtin_hash,ForInNext,-628108871
+builtin_hash,GetIteratorWithFeedback,412632852
+builtin_hash,GetIteratorBaseline,878549031
+builtin_hash,CallIteratorWithFeedback,-173921836
+builtin_hash,MathAbs,-418374171
+builtin_hash,MathCeil,-83433093
+builtin_hash,MathFloor,963617939
+builtin_hash,MathRound,739741009
+builtin_hash,MathPow,510691647
+builtin_hash,MathMax,45115699
+builtin_hash,MathMin,-996382942
+builtin_hash,MathAsin,261451622
+builtin_hash,MathAtan2,605332815
+builtin_hash,MathCos,515079504
+builtin_hash,MathExp,551351922
+builtin_hash,MathFround,564706237
+builtin_hash,MathImul,685265173
+builtin_hash,MathLog,-553256829
+builtin_hash,MathSin,302395292
+builtin_hash,MathSign,611819739
+builtin_hash,MathSqrt,55107225
+builtin_hash,MathTan,-332405887
+builtin_hash,MathTanh,939045985
+builtin_hash,MathRandom,-504157126
+builtin_hash,NumberPrototypeToString,145247584
+builtin_hash,NumberIsInteger,632098621
+builtin_hash,NumberIsNaN,343619286
+builtin_hash,NumberParseFloat,-745268146
+builtin_hash,ParseInt,423449565
+builtin_hash,NumberParseInt,348325306
+builtin_hash,Add,-712082634
+builtin_hash,Subtract,860006498
+builtin_hash,Multiply,966938552
+builtin_hash,Divide,501339465
+builtin_hash,Modulus,556264773
+builtin_hash,CreateObjectWithoutProperties,911390056
+builtin_hash,ObjectIsExtensible,-376770424
+builtin_hash,ObjectPreventExtensions,-675757061
+builtin_hash,ObjectGetPrototypeOf,-694816240
+builtin_hash,ObjectSetPrototypeOf,-335823538
+builtin_hash,ObjectPrototypeToString,158685312
+builtin_hash,ObjectPrototypeValueOf,-993024104
+builtin_hash,FulfillPromise,-68874675
+builtin_hash,NewPromiseCapability,-880232666
+builtin_hash,PromiseCapabilityDefaultResolve,694927325
+builtin_hash,PerformPromiseThen,-238303189
+builtin_hash,PromiseAll,-121414633
+builtin_hash,PromiseAllResolveElementClosure,797273436
+builtin_hash,PromiseConstructor,-424149894
+builtin_hash,PromisePrototypeCatch,235262026
+builtin_hash,PromiseFulfillReactionJob,927825363
+builtin_hash,PromiseResolveTrampoline,-549629094
+builtin_hash,PromiseResolve,-366429795
+builtin_hash,ResolvePromise,526061379
+builtin_hash,PromisePrototypeThen,959282415
+builtin_hash,PromiseResolveThenableJob,-977786068
+builtin_hash,ProxyConstructor,-54504231
+builtin_hash,ProxyGetProperty,-692505715
+builtin_hash,ProxyIsExtensible,-120987472
+builtin_hash,ProxyPreventExtensions,739592105
+builtin_hash,ReflectGet,1006327680
+builtin_hash,ReflectHas,-549629094
+builtin_hash,RegExpPrototypeExec,866694176
+builtin_hash,RegExpMatchFast,556779044
+builtin_hash,RegExpReplace,1037671691
+builtin_hash,RegExpPrototypeReplace,-488505709
+builtin_hash,RegExpSearchFast,744647901
+builtin_hash,RegExpPrototypeSourceGetter,-69902772
+builtin_hash,RegExpSplit,418335022
+builtin_hash,RegExpPrototypeTest,-893509849
+builtin_hash,RegExpPrototypeTestFast,-541676085
+builtin_hash,RegExpPrototypeGlobalGetter,612394650
+builtin_hash,RegExpPrototypeIgnoreCaseGetter,-595775382
+builtin_hash,RegExpPrototypeMultilineGetter,368200363
+builtin_hash,RegExpPrototypeHasIndicesGetter,99570183
+builtin_hash,RegExpPrototypeDotAllGetter,99570183
+builtin_hash,RegExpPrototypeStickyGetter,471291660
+builtin_hash,RegExpPrototypeUnicodeGetter,471291660
+builtin_hash,RegExpPrototypeFlagsGetter,-493351549
+builtin_hash,StringPrototypeEndsWith,-140669855
+builtin_hash,StringPrototypeIncludes,-538712449
+builtin_hash,StringPrototypeIndexOf,-279080867
+builtin_hash,StringPrototypeIterator,-906814404
+builtin_hash,StringIteratorPrototypeNext,-459023719
+builtin_hash,StringPrototypeMatch,950777323
+builtin_hash,StringPrototypeSearch,950777323
+builtin_hash,StringRepeat,333496990
+builtin_hash,StringPrototypeSlice,147923310
+builtin_hash,StringPrototypeStartsWith,-916453690
+builtin_hash,StringPrototypeSubstr,93046303
+builtin_hash,StringPrototypeSubstring,-486167723
+builtin_hash,StringPrototypeTrim,-537839064
+builtin_hash,SymbolPrototypeToString,-331094885
+builtin_hash,CreateTypedArray,946007034
+builtin_hash,TypedArrayFrom,-383816322
+builtin_hash,TypedArrayPrototypeSet,183639399
+builtin_hash,TypedArrayPrototypeSubArray,-654743264
+builtin_hash,NewSloppyArgumentsElements,-733955106
+builtin_hash,NewStrictArgumentsElements,27861461
+builtin_hash,NewRestArgumentsElements,-158196826
+builtin_hash,FastNewSloppyArguments,701807193
+builtin_hash,FastNewStrictArguments,-400637158
+builtin_hash,FastNewRestArguments,771398605
+builtin_hash,StringSlowFlatten,758688335
+builtin_hash,StringIndexOf,893861646
+builtin_hash,Load_FastSmiElements_0,41377987
+builtin_hash,Load_FastObjectElements_0,41377987
+builtin_hash,Store_FastSmiElements_0,987491586
+builtin_hash,Store_FastObjectElements_0,-907039137
+builtin_hash,SortCompareDefault,-712046902
+builtin_hash,SortCompareUserFn,-498446944
+builtin_hash,Copy,1005972100
+builtin_hash,MergeAt,-238184884
+builtin_hash,GallopLeft,-228579918
+builtin_hash,GallopRight,508662767
+builtin_hash,ArrayTimSort,-584574007
+builtin_hash,ArrayPrototypeSort,-446345392
+builtin_hash,StringFastLocaleCompare,-805723901
+builtin_hash,WasmInt32ToHeapNumber,186218317
+builtin_hash,WasmTaggedNonSmiToInt32,644195797
+builtin_hash,WasmTriggerTierUp,-448026998
+builtin_hash,WasmStackGuard,929375954
+builtin_hash,CanUseSameAccessor_FastSmiElements_0,333215288
+builtin_hash,CanUseSameAccessor_FastObjectElements_0,333215288
+builtin_hash,StringPrototypeToLowerCaseIntl,325118773
+builtin_hash,StringToLowerCaseIntl,729618594
+builtin_hash,WideHandler,-985531040
+builtin_hash,ExtraWideHandler,-985531040
+builtin_hash,LdarHandler,1066069071
+builtin_hash,LdaZeroHandler,697098880
+builtin_hash,LdaSmiHandler,-92763154
+builtin_hash,LdaUndefinedHandler,94159659
+builtin_hash,LdaNullHandler,94159659
+builtin_hash,LdaTheHoleHandler,94159659
+builtin_hash,LdaTrueHandler,66190034
+builtin_hash,LdaFalseHandler,66190034
+builtin_hash,LdaConstantHandler,-234672240
+builtin_hash,LdaContextSlotHandler,999512170
+builtin_hash,LdaImmutableContextSlotHandler,999512170
+builtin_hash,LdaCurrentContextSlotHandler,-705029165
+builtin_hash,LdaImmutableCurrentContextSlotHandler,-705029165
+builtin_hash,StarHandler,-825981541
+builtin_hash,MovHandler,-222623368
+builtin_hash,PushContextHandler,239039195
+builtin_hash,PopContextHandler,663403390
+builtin_hash,TestReferenceEqualHandler,107959616
+builtin_hash,TestUndetectableHandler,768306054
+builtin_hash,TestNullHandler,317848228
+builtin_hash,TestUndefinedHandler,317848228
+builtin_hash,TestTypeOfHandler,-585531608
+builtin_hash,LdaGlobalHandler,680542536
+builtin_hash,LdaGlobalInsideTypeofHandler,-812384965
+builtin_hash,StaGlobalHandler,-849976646
+builtin_hash,StaContextSlotHandler,-642236485
+builtin_hash,StaCurrentContextSlotHandler,515612512
+builtin_hash,LdaLookupGlobalSlotHandler,328181263
+builtin_hash,LdaLookupGlobalSlotInsideTypeofHandler,-152487163
+builtin_hash,StaLookupSlotHandler,1043986971
+builtin_hash,GetNamedPropertyHandler,-918198086
+builtin_hash,GetNamedPropertyFromSuperHandler,-605958764
+builtin_hash,GetKeyedPropertyHandler,-368783501
+builtin_hash,SetNamedPropertyHandler,512867069
+builtin_hash,DefineNamedOwnPropertyHandler,512867069
+builtin_hash,SetKeyedPropertyHandler,-529790650
+builtin_hash,DefineKeyedOwnPropertyHandler,-529790650
+builtin_hash,StaInArrayLiteralHandler,-529790650
+builtin_hash,DefineKeyedOwnPropertyInLiteralHandler,519916231
+builtin_hash,AddHandler,-1014428769
+builtin_hash,SubHandler,-971645828
+builtin_hash,MulHandler,-1072793455
+builtin_hash,DivHandler,-162323805
+builtin_hash,ModHandler,-485795098
+builtin_hash,ExpHandler,795159955
+builtin_hash,BitwiseOrHandler,-974394049
+builtin_hash,BitwiseXorHandler,580834482
+builtin_hash,BitwiseAndHandler,614318128
+builtin_hash,ShiftLeftHandler,-423182377
+builtin_hash,ShiftRightHandler,-255081510
+builtin_hash,ShiftRightLogicalHandler,735938776
+builtin_hash,AddSmiHandler,107839307
+builtin_hash,SubSmiHandler,-363881533
+builtin_hash,MulSmiHandler,169761579
+builtin_hash,DivSmiHandler,-681265328
+builtin_hash,ModSmiHandler,861935655
+builtin_hash,BitwiseOrSmiHandler,-680303745
+builtin_hash,BitwiseXorSmiHandler,576458108
+builtin_hash,BitwiseAndSmiHandler,-994511503
+builtin_hash,ShiftLeftSmiHandler,-728693655
+builtin_hash,ShiftRightSmiHandler,975905832
+builtin_hash,ShiftRightLogicalSmiHandler,686146238
+builtin_hash,IncHandler,117772531
+builtin_hash,DecHandler,-691015839
+builtin_hash,NegateHandler,212889736
+builtin_hash,BitwiseNotHandler,-960473652
+builtin_hash,ToBooleanLogicalNotHandler,-997041363
+builtin_hash,LogicalNotHandler,-404436240
+builtin_hash,TypeOfHandler,-868029172
+builtin_hash,DeletePropertyStrictHandler,-310645655
+builtin_hash,DeletePropertySloppyHandler,-884621901
+builtin_hash,GetSuperConstructorHandler,-336144805
+builtin_hash,CallAnyReceiverHandler,-483788286
+builtin_hash,CallPropertyHandler,-483788286
+builtin_hash,CallProperty0Handler,234175094
+builtin_hash,CallProperty1Handler,354307341
+builtin_hash,CallProperty2Handler,968021051
+builtin_hash,CallUndefinedReceiverHandler,472718464
+builtin_hash,CallUndefinedReceiver0Handler,1020191467
+builtin_hash,CallUndefinedReceiver1Handler,785762305
+builtin_hash,CallUndefinedReceiver2Handler,-921863582
+builtin_hash,CallWithSpreadHandler,-483788286
+builtin_hash,CallRuntimeHandler,575543766
+builtin_hash,CallJSRuntimeHandler,-279970155
+builtin_hash,InvokeIntrinsicHandler,315814934
+builtin_hash,ConstructHandler,750653559
+builtin_hash,ConstructWithSpreadHandler,-950529667
+builtin_hash,TestEqualHandler,469957169
+builtin_hash,TestEqualStrictHandler,774972588
+builtin_hash,TestLessThanHandler,876731233
+builtin_hash,TestGreaterThanHandler,854370589
+builtin_hash,TestLessThanOrEqualHandler,-616820445
+builtin_hash,TestGreaterThanOrEqualHandler,128578007
+builtin_hash,TestInstanceOfHandler,437146777
+builtin_hash,TestInHandler,-595986293
+builtin_hash,ToNameHandler,-388837341
+builtin_hash,ToNumberHandler,172727215
+builtin_hash,ToNumericHandler,518340123
+builtin_hash,ToObjectHandler,-388837341
+builtin_hash,ToStringHandler,-736791596
+builtin_hash,CreateRegExpLiteralHandler,-387261303
+builtin_hash,CreateArrayLiteralHandler,544722821
+builtin_hash,CreateArrayFromIterableHandler,-590862374
+builtin_hash,CreateEmptyArrayLiteralHandler,-215104396
+builtin_hash,CreateObjectLiteralHandler,536615992
+builtin_hash,CreateEmptyObjectLiteralHandler,810635729
+builtin_hash,CreateClosureHandler,-899658211
+builtin_hash,CreateBlockContextHandler,-125556632
+builtin_hash,CreateCatchContextHandler,551209828
+builtin_hash,CreateFunctionContextHandler,-65684761
+builtin_hash,CreateMappedArgumentsHandler,67709625
+builtin_hash,CreateUnmappedArgumentsHandler,608258279
+builtin_hash,CreateRestParameterHandler,1042430952
+builtin_hash,JumpLoopHandler,77742379
+builtin_hash,JumpHandler,-420188660
+builtin_hash,JumpConstantHandler,-998825364
+builtin_hash,JumpIfUndefinedConstantHandler,-326209739
+builtin_hash,JumpIfNotUndefinedConstantHandler,37208057
+builtin_hash,JumpIfUndefinedOrNullConstantHandler,-104381115
+builtin_hash,JumpIfTrueConstantHandler,-326209739
+builtin_hash,JumpIfFalseConstantHandler,-326209739
+builtin_hash,JumpIfToBooleanTrueConstantHandler,-234142841
+builtin_hash,JumpIfToBooleanFalseConstantHandler,-602774868
+builtin_hash,JumpIfToBooleanTrueHandler,-297635325
+builtin_hash,JumpIfToBooleanFalseHandler,1015367976
+builtin_hash,JumpIfTrueHandler,862147447
+builtin_hash,JumpIfFalseHandler,862147447
+builtin_hash,JumpIfNullHandler,862147447
+builtin_hash,JumpIfNotNullHandler,-481058680
+builtin_hash,JumpIfUndefinedHandler,862147447
+builtin_hash,JumpIfNotUndefinedHandler,-481058680
+builtin_hash,JumpIfUndefinedOrNullHandler,14126870
+builtin_hash,JumpIfJSReceiverHandler,-723850389
+builtin_hash,SwitchOnSmiNoFeedbackHandler,-902670490
+builtin_hash,ForInEnumerateHandler,-322331924
+builtin_hash,ForInPrepareHandler,20034175
+builtin_hash,ForInContinueHandler,827732360
+builtin_hash,ForInNextHandler,119110335
+builtin_hash,ForInStepHandler,757646701
+builtin_hash,SetPendingMessageHandler,996401409
+builtin_hash,ThrowHandler,122680912
+builtin_hash,ReThrowHandler,122680912
+builtin_hash,ReturnHandler,47039723
+builtin_hash,ThrowReferenceErrorIfHoleHandler,-342650955
+builtin_hash,ThrowSuperNotCalledIfHoleHandler,-285583864
+builtin_hash,ThrowSuperAlreadyCalledIfNotHoleHandler,-827541184
+builtin_hash,ThrowIfNotSuperConstructorHandler,1018623070
+builtin_hash,SwitchOnGeneratorStateHandler,717471818
+builtin_hash,SuspendGeneratorHandler,547514791
+builtin_hash,ResumeGeneratorHandler,-860485588
+builtin_hash,GetIteratorHandler,-6630463
+builtin_hash,ShortStarHandler,721894508
+builtin_hash,LdarWideHandler,-978392409
+builtin_hash,LdaSmiWideHandler,-366656871
+builtin_hash,LdaConstantWideHandler,972813981
+builtin_hash,LdaContextSlotWideHandler,628329787
+builtin_hash,LdaImmutableContextSlotWideHandler,628329787
+builtin_hash,LdaImmutableCurrentContextSlotWideHandler,489858159
+builtin_hash,StarWideHandler,-1038662456
+builtin_hash,MovWideHandler,483803273
+builtin_hash,PushContextWideHandler,216419588
+builtin_hash,PopContextWideHandler,272986324
+builtin_hash,TestReferenceEqualWideHandler,-4739833
+builtin_hash,LdaGlobalWideHandler,-434470564
+builtin_hash,LdaGlobalInsideTypeofWideHandler,888730933
+builtin_hash,StaGlobalWideHandler,459118950
+builtin_hash,StaContextSlotWideHandler,888275701
+builtin_hash,StaCurrentContextSlotWideHandler,-317584552
+builtin_hash,LdaLookupGlobalSlotWideHandler,1026575020
+builtin_hash,GetNamedPropertyWideHandler,664403992
+builtin_hash,GetKeyedPropertyWideHandler,322108853
+builtin_hash,SetNamedPropertyWideHandler,784668777
+builtin_hash,DefineNamedOwnPropertyWideHandler,784668777
+builtin_hash,SetKeyedPropertyWideHandler,1015904043
+builtin_hash,DefineKeyedOwnPropertyWideHandler,1015904043
+builtin_hash,StaInArrayLiteralWideHandler,1015904043
+builtin_hash,AddWideHandler,1006647977
+builtin_hash,SubWideHandler,212325320
+builtin_hash,MulWideHandler,-922622067
+builtin_hash,DivWideHandler,145054418
+builtin_hash,BitwiseOrWideHandler,805505097
+builtin_hash,BitwiseAndWideHandler,563101073
+builtin_hash,ShiftLeftWideHandler,448918085
+builtin_hash,AddSmiWideHandler,-135072104
+builtin_hash,SubSmiWideHandler,-169078418
+builtin_hash,MulSmiWideHandler,793690226
+builtin_hash,DivSmiWideHandler,-657180043
+builtin_hash,ModSmiWideHandler,335754550
+builtin_hash,BitwiseOrSmiWideHandler,-1067934836
+builtin_hash,BitwiseXorSmiWideHandler,-668709153
+builtin_hash,BitwiseAndSmiWideHandler,-90084544
+builtin_hash,ShiftLeftSmiWideHandler,-381247703
+builtin_hash,ShiftRightSmiWideHandler,-38676513
+builtin_hash,ShiftRightLogicalSmiWideHandler,-1026231042
+builtin_hash,IncWideHandler,389395178
+builtin_hash,DecWideHandler,1062128797
+builtin_hash,NegateWideHandler,375542705
+builtin_hash,CallPropertyWideHandler,479651507
+builtin_hash,CallProperty0WideHandler,402451236
+builtin_hash,CallProperty1WideHandler,864866147
+builtin_hash,CallProperty2WideHandler,672960581
+builtin_hash,CallUndefinedReceiverWideHandler,633606056
+builtin_hash,CallUndefinedReceiver0WideHandler,-782323787
+builtin_hash,CallUndefinedReceiver1WideHandler,52355318
+builtin_hash,CallUndefinedReceiver2WideHandler,297430331
+builtin_hash,CallWithSpreadWideHandler,479651507
+builtin_hash,ConstructWideHandler,-923801363
+builtin_hash,TestEqualWideHandler,745861994
+builtin_hash,TestEqualStrictWideHandler,982796365
+builtin_hash,TestLessThanWideHandler,665221830
+builtin_hash,TestGreaterThanWideHandler,776130121
+builtin_hash,TestLessThanOrEqualWideHandler,-299580558
+builtin_hash,TestGreaterThanOrEqualWideHandler,-356242933
+builtin_hash,TestInstanceOfWideHandler,406240218
+builtin_hash,TestInWideHandler,-754759119
+builtin_hash,ToNumericWideHandler,1034444948
+builtin_hash,CreateRegExpLiteralWideHandler,1015965077
+builtin_hash,CreateArrayLiteralWideHandler,238187057
+builtin_hash,CreateEmptyArrayLiteralWideHandler,-21075025
+builtin_hash,CreateObjectLiteralWideHandler,570835533
+builtin_hash,CreateClosureWideHandler,912422636
+builtin_hash,CreateBlockContextWideHandler,499748521
+builtin_hash,CreateFunctionContextWideHandler,-887672919
+builtin_hash,JumpLoopWideHandler,714317010
+builtin_hash,JumpWideHandler,-420188660
+builtin_hash,JumpIfToBooleanTrueWideHandler,230302934
+builtin_hash,JumpIfToBooleanFalseWideHandler,237768975
+builtin_hash,JumpIfTrueWideHandler,814624851
+builtin_hash,JumpIfFalseWideHandler,814624851
+builtin_hash,SwitchOnSmiNoFeedbackWideHandler,623977068
+builtin_hash,ForInPrepareWideHandler,430965432
+builtin_hash,ForInNextWideHandler,-899950637
+builtin_hash,ThrowReferenceErrorIfHoleWideHandler,-575574526
+builtin_hash,GetIteratorWideHandler,-626454663
+builtin_hash,LdaSmiExtraWideHandler,465680004
+builtin_hash,LdaGlobalExtraWideHandler,1016564513
+builtin_hash,AddSmiExtraWideHandler,585533206
+builtin_hash,SubSmiExtraWideHandler,-88717151
+builtin_hash,MulSmiExtraWideHandler,-508453390
+builtin_hash,DivSmiExtraWideHandler,-542490757
+builtin_hash,BitwiseOrSmiExtraWideHandler,776661340
+builtin_hash,BitwiseXorSmiExtraWideHandler,276228867
+builtin_hash,BitwiseAndSmiExtraWideHandler,739058259
+builtin_hash,CallUndefinedReceiverExtraWideHandler,488508421
+builtin_hash,CallUndefinedReceiver1ExtraWideHandler,700320270
+builtin_hash,CallUndefinedReceiver2ExtraWideHandler,-7276189
diff --git a/deps/v8/tools/callstats.py.vpython b/deps/v8/tools/callstats.py.vpython
deleted file mode 100644
index 11e3f34ef6f9c9..00000000000000
--- a/deps/v8/tools/callstats.py.vpython
+++ /dev/null
@@ -1,43 +0,0 @@
-# This is a vpython "spec" file.
-#
-# It describes patterns for python wheel dependencies of the python scripts in
-# the callstats.py, particularly for dependencies that have compiled components
-# (since pure-python dependencies can be easily vendored into third_party).
-#
-# When vpython is invoked, it finds this file and builds a python VirtualEnv,
-# containing all of the dependencies described in this file, fetching them from
-# CIPD (the "Chrome Infrastructure Package Deployer" service). Unlike `pip`,
-# this never requires the end-user machine to have a working python extension
-# compilation environment. All of these packages are built using:
-#   https://chromium.googlesource.com/infra/infra/+/master/infra/tools/dockerbuild/
-#
-# All python scripts in the repo share this same spec, to avoid dependency
-# fragmentation.
-#
-# If you have depot_tools installed in your $PATH, you can invoke python scripts
-# in this repo by running them as you normally would run them, except
-# substituting `vpython` instead of `python` on the command line, e.g.:
-#   vpython path/to/script.py some --arguments
-#
-# Read more about `vpython` and how to modify this file here:
-#   https://chromium.googlesource.com/infra/infra/+/master/doc/users/vpython.md
-
-python_version: "2.7"
-
-wheel: <
-  name: "infra/python/wheels/numpy/${vpython_platform}"
-  version: "version:1.11.3"
->
-
-wheel: <
-  name: "infra/python/wheels/scipy/${vpython_platform}"
-  version: "version:0.19.0"
-  match_tag: <
-    abi: "cp27mu"
-    platform: "manylinux1_i686"
-  >
-  match_tag: <
-    abi: "cp27mu"
-    platform: "manylinux1_x86_64"
-  >
->
diff --git a/deps/v8/tools/clusterfuzz/foozzie/v8_mock.js b/deps/v8/tools/clusterfuzz/foozzie/v8_mock.js
index e6fd63da3613f2..d2dc9e27b1d55b 100644
--- a/deps/v8/tools/clusterfuzz/foozzie/v8_mock.js
+++ b/deps/v8/tools/clusterfuzz/foozzie/v8_mock.js
@@ -85,6 +85,8 @@ var prettyPrinted = function prettyPrinted(msg) { return msg; };
 
 // Mock performance methods.
 performance.now = function() { return 1.2; };
+performance.mark = function() { return undefined; };
+performance.measure = function() { return undefined; };
 performance.measureMemory = function() { return []; };
 
 // Mock readline so that test cases don't hang.
diff --git a/deps/v8/tools/debug_helper/debug-helper-internal.cc b/deps/v8/tools/debug_helper/debug-helper-internal.cc
index 51c8da6f278aea..d13ed9f973da0a 100644
--- a/deps/v8/tools/debug_helper/debug-helper-internal.cc
+++ b/deps/v8/tools/debug_helper/debug-helper-internal.cc
@@ -23,8 +23,10 @@ bool IsPointerCompressed(uintptr_t address) {
 uintptr_t EnsureDecompressed(uintptr_t address,
                              uintptr_t any_uncompressed_ptr) {
   if (!COMPRESS_POINTERS_BOOL || !IsPointerCompressed(address)) return address;
-  return i::DecompressTaggedAny(any_uncompressed_ptr,
-                                static_cast<i::Tagged_t>(address));
+  // TODO(v8:11880): ExternalCodeCompressionScheme might be needed here for
+  // decompressing Code pointers from external code space.
+  return i::V8HeapCompressionScheme::DecompressTaggedAny(
+      any_uncompressed_ptr, static_cast<i::Tagged_t>(address));
 }
 
 d::PropertyKind GetArrayKind(d::MemoryAccessResult mem_result) {
diff --git a/deps/v8/tools/debug_helper/gen-heap-constants.py b/deps/v8/tools/debug_helper/gen-heap-constants.py
index 3ea5be68210573..d78276a86f625a 100644
--- a/deps/v8/tools/debug_helper/gen-heap-constants.py
+++ b/deps/v8/tools/debug_helper/gen-heap-constants.py
@@ -64,13 +64,16 @@ def iterate_maps(target_space, camel_space_name):
   out = out + '  if (heap_addresses->any_heap_pointer == 0) {\n'
   out = out + '    heap_addresses->any_heap_pointer = any_uncompressed_ptr;\n'
   out = out + '  }\n'
+  # If we ever try to apply this to CodeSpace we might need to use
+  # ExternalCodeCompressionScheme instead of V8HeapCompressionScheme for
+  # decompressing external code pointers below.
   expected_spaces = set(['map_space', 'read_only_space', 'old_space'])
   for offset, space_name in v8heapconst.HEAP_FIRST_PAGES.items():
     if (space_name in expected_spaces):
       out = out + '  if (heap_addresses->' + space_name + '_first_page == 0) {\n'
       out = out + '    heap_addresses->' + space_name + \
-          '_first_page = i::DecompressTaggedPointer(any_uncompressed_ptr, ' + \
-          str(offset) + ');\n'
+          '_first_page = i::V8HeapCompressionScheme::DecompressTaggedPointer(' + \
+          'any_uncompressed_ptr, ' + str(offset) + ');\n'
       out = out + '  }\n'
 out = out + '}\n'
 
diff --git a/deps/v8/tools/dev/gm.py b/deps/v8/tools/dev/gm.py
index 58a729045aecd9..245a05389e0ad2 100755
--- a/deps/v8/tools/dev/gm.py
+++ b/deps/v8/tools/dev/gm.py
@@ -46,6 +46,7 @@
 ]
 # Arches that get built/run when you don't specify any.
 DEFAULT_ARCHES = ["ia32", "x64", "arm", "arm64"]
+SANDBOX_SUPPORTED_ARCHES = ["x64", "arm64"]
 # Modes that this script understands.
 MODES = {
     "release": "release",
@@ -345,12 +346,18 @@ def GetSpecialCompiler(self):
       return ["clang_base_path = \"/usr\"", "clang_use_chrome_plugins = false"]
     return []
 
+  def GetSandboxFlag(self):
+    if self.arch in SANDBOX_SUPPORTED_ARCHES:
+      return ["v8_enable_sandbox = true"]
+    return []
+
   def GetGnArgs(self):
     # Use only substring before first '-' as the actual mode
     mode = re.match("([^-]+)", self.mode).group(1)
     template = ARGS_TEMPLATES[mode]
-    arch_specific = (self.GetTargetCpu() + self.GetV8TargetCpu() +
-                     self.GetTargetOS() + self.GetSpecialCompiler())
+    arch_specific = (
+        self.GetTargetCpu() + self.GetV8TargetCpu() + self.GetTargetOS() +
+        self.GetSpecialCompiler() + self.GetSandboxFlag())
     return template % "\n".join(arch_specific)
 
   def Build(self):
diff --git a/deps/v8/tools/gdbinit b/deps/v8/tools/gdbinit
index f45c4165d61fb8..fee237b5372d2d 100644
--- a/deps/v8/tools/gdbinit
+++ b/deps/v8/tools/gdbinit
@@ -259,3 +259,64 @@ gdb.events.new_objfile.connect(newobj_handler)
 gdb.execute("set environment V8_GDBINIT_SOURCED=1")
 
 end
+
+### CppGC helpers.
+
+# Print compressed pointer.
+define cpcp
+call _cppgc_internal_Decompress_Compressed_Pointer((unsigned)($arg0))
+end
+document cpcp
+Prints compressed pointer (raw value) after decompression.
+Usage: cpcp compressed_pointer
+end
+
+# Print member.
+define cpm
+call _cppgc_internal_Print_Member((cppgc::internal::MemberBase*)(&$arg0))
+end
+document cpm
+Prints member, compressed or not.
+Usage: cpm member
+end
+
+# Pretty printer for cppgc::Member.
+python
+
+import re
+
+
+class CppGCMemberPrinter(object):
+  """Print cppgc Member types."""
+
+  def __init__(self, val, category, pointee_type):
+    self.val = val
+    self.category = category
+    self.pointee_type = pointee_type
+
+  def to_string(self):
+    pointer = gdb.parse_and_eval(
+        "_cppgc_internal_Print_Member((cppgc::internal::MemberBase*){})".format(
+            self.val.address))
+    return "{}Member<{}> pointing to {}".format(
+        '' if self.category is None else self.category, self.pointee_type,
+        pointer)
+
+  def display_hint(self):
+    return "{}Member<{}>".format('' if self.category is None else self.category,
+                                 self.pointee_type)
+
+
+def cppgc_pretty_printers(val):
+  typename = val.type.name or val.type.tag or str(val.type)
+  regex = re.compile("^(cppgc|blink)::(Weak|Untraced)?Member<(.*)>$")
+  match = regex.match(typename)
+  if match is None:
+    return None
+  return CppGCMemberPrinter(
+      val, category=match.group(2), pointee_type=match.group(3))
+
+
+gdb.pretty_printers.append(cppgc_pretty_printers)
+
+end
diff --git a/deps/v8/tools/gen-postmortem-metadata.py b/deps/v8/tools/gen-postmortem-metadata.py
index 4ffa36560e7a57..7f5f7864ae7316 100644
--- a/deps/v8/tools/gen-postmortem-metadata.py
+++ b/deps/v8/tools/gen-postmortem-metadata.py
@@ -94,6 +94,17 @@
     { 'name': 'CodeKindFieldMask',      'value': 'Code::KindField::kMask' },
     { 'name': 'CodeKindFieldShift',     'value': 'Code::KindField::kShift' },
 
+    { 'name': 'DeoptimizationDataInlinedFunctionCountIndex',
+  'value': 'DeoptimizationData::kInlinedFunctionCountIndex' },
+    { 'name': 'DeoptimizationDataLiteralArrayIndex',
+  'value': 'DeoptimizationData::kLiteralArrayIndex' },
+    { 'name': 'DeoptimizationDataOptimizationIdIndex',
+  'value': 'DeoptimizationData::kOptimizationIdIndex' },
+    { 'name': 'DeoptimizationDataSharedFunctionInfoIndex',
+  'value': 'DeoptimizationData::kSharedFunctionInfoIndex' },
+    { 'name': 'DeoptimizationDataInliningPositionsIndex',
+  'value': 'DeoptimizationData::kInliningPositionsIndex' },
+
     { 'name': 'CodeKindBytecodeHandler',
       'value': 'static_cast<int>(CodeKind::BYTECODE_HANDLER)' },
     { 'name': 'CodeKindInterpretedFunction',
@@ -266,13 +277,13 @@
     'FixedArray, data, uintptr_t, kHeaderSize',
     'BytecodeArray, data, uintptr_t, kHeaderSize',
     'JSArrayBuffer, backing_store, uintptr_t, kBackingStoreOffset',
-    'JSArrayBuffer, byte_length, size_t, kByteLengthOffset',
-    'JSArrayBufferView, byte_length, size_t, kByteLengthOffset',
-    'JSArrayBufferView, byte_offset, size_t, kByteOffsetOffset',
+    'JSArrayBuffer, byte_length, size_t, kRawByteLengthOffset',
+    'JSArrayBufferView, byte_length, size_t, kRawByteLengthOffset',
+    'JSArrayBufferView, byte_offset, size_t, kRawByteOffsetOffset',
     'JSDate, value, Object, kValueOffset',
     'JSRegExp, source, Object, kSourceOffset',
     'JSTypedArray, external_pointer, uintptr_t, kExternalPointerOffset',
-    'JSTypedArray, length, Object, kLengthOffset',
+    'JSTypedArray, length, Object, kRawLengthOffset',
     'Map, instance_size_in_words, char, kInstanceSizeInWordsOffset',
     'Map, inobject_properties_start_or_constructor_function_index, char, kInobjectPropertiesStartOrConstructorFunctionIndexOffset',
     'Map, instance_type, uint16_t, kInstanceTypeOffset',
@@ -299,6 +310,7 @@
     'Code, flags, uint32_t, kFlagsOffset',
     'Code, instruction_start, uintptr_t, kHeaderSize',
     'Code, instruction_size, int, kInstructionSizeOffset',
+    'Code, deoptimization_data, FixedArray, kDeoptimizationDataOrInterpreterDataOffset',
     'String, length, int32_t, kLengthOffset',
     'DescriptorArray, header_size, uintptr_t, kHeaderSize',
     'ConsString, first, String, kFirstOffset',
@@ -307,7 +319,7 @@
     'ThinString, actual, String, kActualOffset',
     'Symbol, name, Object, kDescriptionOffset',
     'FixedArrayBase, length, SMI, kLengthOffset',
-];
+]
 
 #
 # The following is a whitelist of classes we expect to find when scanning the
diff --git a/deps/v8/tools/heap-stats/categories.js b/deps/v8/tools/heap-stats/categories.js
index e4e570c4b40bd0..24f880cd264890 100644
--- a/deps/v8/tools/heap-stats/categories.js
+++ b/deps/v8/tools/heap-stats/categories.js
@@ -53,6 +53,7 @@ export const CATEGORIES = new Map([
       'JS_COLLATOR_TYPE',
       'JS_DATE_TIME_FORMAT_TYPE',
       'JS_DISPLAY_NAMES_TYPE',
+      'JS_DURATION_FORMAT_TYPE',
       'JS_LIST_FORMAT_TYPE',
       'JS_LOCALE_TYPE',
       'JS_NUMBER_FORMAT_TYPE',
diff --git a/deps/v8/tools/release/mergeinfo.py b/deps/v8/tools/release/mergeinfo.py
index d824f4738a98fe..7136463afb2659 100755
--- a/deps/v8/tools/release/mergeinfo.py
+++ b/deps/v8/tools/release/mergeinfo.py
@@ -25,9 +25,9 @@ def git_execute(working_dir, args, verbose=False):
     print("Executing git command:" + str(command))
   p = Popen(args=command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
   output, err = p.communicate()
-  rc = p.returncode
-  if rc != 0:
+  if p.returncode != 0:
     raise Exception(err)
+  output = output.decode('utf-8')
   if verbose:
     print("Git return value: " + output)
   return output
@@ -74,7 +74,8 @@ def get_branches_for_commit(git_working_dir, hash_to_search):
                                            hash_to_search,
                                            '-a']).strip()
   branches = branches.splitlines()
-  return map(str.strip, branches)
+  return {branch.strip() for branch in branches}
+
 
 def is_lkgr(branches):
   return 'remotes/origin/lkgr' in branches
@@ -89,7 +90,7 @@ def get_first_canary(branches):
 
 def get_first_v8_version(branches):
   version_re = re.compile("remotes/origin/[0-9]+\.[0-9]+\.[0-9]+")
-  versions = filter(lambda branch: version_re.match(branch), branches)
+  versions = [branch for branch in branches if version_re.match(branch)]
   if len(versions) == 0:
     return "--"
   version = versions[0].split("/")[-1]
diff --git a/deps/v8/tools/testrunner/local/variants.py b/deps/v8/tools/testrunner/local/variants.py
index bbd76e1b55e67a..f44e445eca46a1 100644
--- a/deps/v8/tools/testrunner/local/variants.py
+++ b/deps/v8/tools/testrunner/local/variants.py
@@ -80,7 +80,7 @@
     ],
     "sparkplug": ["--jitless", "--no-sparkplug"],
     "concurrent_sparkplug": ["--jitless"],
-    "maglev": ["--jitless"],
+    "maglev": ["--jitless", "--no-maglev"],
     "stress_maglev": ["--jitless"],
     "always_sparkplug": ["--jitless", "--no-sparkplug"],
     "code_serializer": [
diff --git a/deps/v8/tools/testrunner/num_fuzzer.py b/deps/v8/tools/testrunner/num_fuzzer.py
index 9265e32e1293ba..68f85c9466fa35 100755
--- a/deps/v8/tools/testrunner/num_fuzzer.py
+++ b/deps/v8/tools/testrunner/num_fuzzer.py
@@ -77,9 +77,6 @@ def _add_parser_options(self, parser):
     parser.add_option("--stress-deopt", default=0, type="int",
                       help="probability [0-10] of adding --deopt-every-n-times "
                            "flag to the test")
-    parser.add_option("--stress-deopt-min", default=1, type="int",
-                      help="extends --stress-deopt to have minimum interval "
-                           "between deopt points")
     parser.add_option("--stress-interrupt-budget", default=0, type="int",
                       help="probability [0-10] of adding the --interrupt-budget "
                            "flag to the test")
diff --git a/deps/v8/tools/testrunner/objects/testcase.py b/deps/v8/tools/testrunner/objects/testcase.py
index 1463f474ff5745..58780913792252 100644
--- a/deps/v8/tools/testrunner/objects/testcase.py
+++ b/deps/v8/tools/testrunner/objects/testcase.py
@@ -447,9 +447,13 @@ def cmp(x, y):
         (other.suite.name, other.name, other.variant)
     )
 
-  def __str__(self):
+  @property
+  def full_name(self):
     return self.suite.name + '/' + self.name
 
+  def __str__(self):
+    return self.full_name
+
 
 class D8TestCase(TestCase):
   def get_shell(self):
diff --git a/deps/v8/tools/testrunner/standard_runner_test.py b/deps/v8/tools/testrunner/standard_runner_test.py
index 5254b90041ff0d..64154e018248a8 100644
--- a/deps/v8/tools/testrunner/standard_runner_test.py
+++ b/deps/v8/tools/testrunner/standard_runner_test.py
@@ -28,6 +28,8 @@
 sys.path.append(TOOLS_ROOT)
 from testrunner import standard_runner
 from testrunner import num_fuzzer
+from testrunner.testproc import base
+from testrunner.testproc import fuzzer
 from testrunner.utils.test_utils import (
     temp_base,
     TestRunnerTest,
@@ -511,17 +513,60 @@ def testRunnerFlags(self):
     result.has_returncode(0)
 
 
+class FakeTimeoutProc(base.TestProcObserver):
+  """Fake of the total-timeout observer that just stops after counting
+  "count" number of test or result events.
+  """
+  def __init__(self, count):
+    super(FakeTimeoutProc, self).__init__()
+    self._n = 0
+    self._count = count
+
+  def _on_next_test(self, test):
+    self.__on_event()
+
+  def _on_result_for(self, test, result):
+    self.__on_event()
+
+  def __on_event(self):
+    if self._n >= self._count:
+      self.stop()
+    self._n += 1
+
+
 class NumFuzzerTest(TestRunnerTest):
   def get_runner_class(self):
     return num_fuzzer.NumFuzzer
 
   def testNumFuzzer(self):
-    result = self.run_tests(
-      '--command-prefix', sys.executable,
-      '--outdir', 'out/build',
-    )
-    result.has_returncode(0)
-    result.stdout_includes('>>> Autodetected')
+    fuzz_flags = [
+      f'{flag}=1' for flag in self.get_runner_options()
+      if flag.startswith('--stress-')
+    ]
+    self.assertEqual(len(fuzz_flags), len(fuzzer.FUZZERS))
+    for fuzz_flag in fuzz_flags:
+      # The fake timeout observer above will stop after proessing the 10th
+      # test. This still executes an 11th. Each test causes a test- and a
+      # result event internally. We test both paths here.
+      for event_count in (19, 20):
+        with self.subTest(f'fuzz_flag={fuzz_flag} event_count={event_count}'):
+          with patch(
+              'testrunner.testproc.timeout.TimeoutProc.create',
+              lambda x: FakeTimeoutProc(event_count)):
+            result = self.run_tests(
+              '--command-prefix', sys.executable,
+              '--outdir', 'out/build',
+              '--variants=default',
+              '--fuzzer-random-seed=12345',
+              '--total-timeout-sec=60',
+              fuzz_flag,
+              '--progress=verbose',
+              'sweet/bananas',
+            )
+            result.has_returncode(0)
+            result.stdout_includes('>>> Autodetected')
+            result.stdout_includes('11 tests ran')
+
 
 class OtherTest(TestRunnerTest):
   def testStatusFilePresubmit(self):
@@ -531,5 +576,6 @@ def testStatusFilePresubmit(self):
       self.assertTrue(statusfile.PresubmitCheck(
           os.path.join(basedir, 'test', 'sweet', 'sweet.status')))
 
+
 if __name__ == '__main__':
   unittest.main()
diff --git a/deps/v8/tools/testrunner/testdata/testroot1/out/build/d8_mocked.py b/deps/v8/tools/testrunner/testdata/testroot1/out/build/d8_mocked.py
index d67e0304f63932..67f2f8ec5e4e42 100644
--- a/deps/v8/tools/testrunner/testdata/testroot1/out/build/d8_mocked.py
+++ b/deps/v8/tools/testrunner/testdata/testroot1/out/build/d8_mocked.py
@@ -13,7 +13,18 @@
 
 args = ' '.join(sys.argv[1:])
 print(args)
+
 # Let all berries fail.
 if 'berries' in args:
   sys.exit(1)
+
+# Dummy results if some analysis flags for numfuzz are present.
+if '--print-deopt-stress' in args:
+  print('=== Stress deopt counter: 12345')
+
+if '--fuzzer-gc-analysis' in args:
+  print('### Maximum marking limit reached = 3.70')
+  print('### Maximum new space size reached = 7.30')
+  print('### Allocations = 9107, hash = 0x0000001b')
+
 sys.exit(0)
diff --git a/deps/v8/tools/testrunner/testproc/fuzzer.py b/deps/v8/tools/testrunner/testproc/fuzzer.py
index 2d7fab6653a6c5..ca7f3b71b9c296 100644
--- a/deps/v8/tools/testrunner/testproc/fuzzer.py
+++ b/deps/v8/tools/testrunner/testproc/fuzzer.py
@@ -17,8 +17,7 @@
     (0.1, '--force-slow-path'),
     (0.2, '--future'),
     (0.1, '--interrupt-budget=100'),
-    # TODO(almuthanna): enable again when the FYI bots are greener
-    # (0.1, '--interrupt-budget-for-maglev=100'),
+    (0.1, '--interrupt-budget-for-maglev=100'),
     (0.1, '--liftoff'),
     (0.1, '--maglev'),
     (0.1, '--minor-mc'),
@@ -54,6 +53,9 @@
     (0.1, '--turbo-force-mid-tier-regalloc'),
 ]
 
+MIN_DEOPT = 1
+MAX_DEOPT = 10**9
+
 
 def random_extra_flags(rng):
   """Returns a random list of flags chosen from the configurations in
@@ -194,7 +196,7 @@ def _create_analysis_subtest(self, test):
 
   def _result_for(self, test, subtest, result):
     if not self._disable_analysis:
-      if result is not None:
+      if result is not None and subtest.procid.endswith('Fuzzer-analysis'):
         # Analysis phase, for fuzzing we drop the result.
         if result.has_unexpected_output:
           self._send_result(test, None)
@@ -356,21 +358,15 @@ def create_flags_generator(self, rng, test, analysis_value):
 
 
 class DeoptAnalyzer(Analyzer):
-  MAX_DEOPT=1000000000
-
-  def __init__(self, min_interval):
-    super(DeoptAnalyzer, self).__init__()
-    self._min = min_interval
-
   def get_analysis_flags(self):
-    return ['--deopt-every-n-times=%d' % self.MAX_DEOPT,
+    return ['--deopt-every-n-times=%d' % MAX_DEOPT,
             '--print-deopt-stress']
 
   def do_analysis(self, result):
     for line in reversed(result.output.stdout.splitlines()):
       if line.startswith('=== Stress deopt counter: '):
-        counter = self.MAX_DEOPT - int(line.split(' ')[-1])
-        if counter < self._min:
+        counter = MAX_DEOPT - int(line.split(' ')[-1])
+        if counter < MIN_DEOPT:
           # Skip this test since we won't generate any meaningful interval with
           # given minimum.
           return None
@@ -378,17 +374,13 @@ def do_analysis(self, result):
 
 
 class DeoptFuzzer(Fuzzer):
-  def __init__(self, min_interval):
-    super(DeoptFuzzer, self).__init__()
-    self._min = min_interval
-
   def create_flags_generator(self, rng, test, analysis_value):
     while True:
       if analysis_value:
         value = analysis_value // 2
       else:
         value = 10000
-      interval = rng.randint(self._min, max(value, self._min))
+      interval = rng.randint(MIN_DEOPT, max(value, MIN_DEOPT))
       yield ['--deopt-every-n-times=%d' % interval]
 
 
diff --git a/deps/v8/tools/testrunner/testproc/indicators.py b/deps/v8/tools/testrunner/testproc/indicators.py
index 394742fc6b10f3..1ae04a64c486f9 100644
--- a/deps/v8/tools/testrunner/testproc/indicators.py
+++ b/deps/v8/tools/testrunner/testproc/indicators.py
@@ -14,7 +14,7 @@
 
 
 def print_failure_header(test, is_flaky=False):
-  text = [str(test)]
+  text = [test.full_name]
   if test.output_proc.negative:
     text.append('[negative]')
   if is_flaky:
@@ -24,6 +24,23 @@ def print_failure_header(test, is_flaky=False):
   print(output.encode(encoding, errors='replace').decode(encoding))
 
 
+def formatted_result_output(result):
+  lines = []
+  if result.output.stderr:
+    lines.append("--- stderr ---")
+    lines.append(result.output.stderr.strip())
+  if result.output.stdout:
+    lines.append("--- stdout ---")
+    lines.append(result.output.stdout.strip())
+  lines.append("Command: %s" % result.cmd.to_string())
+  if result.output.HasCrashed():
+    lines.append("exit code: %s" % result.output.exit_code_string)
+    lines.append("--- CRASHED ---")
+  if result.output.HasTimedOut():
+    lines.append("--- TIMEOUT ---")
+  return '\n'.join(lines)
+
+
 class ProgressIndicator():
 
   def __init__(self, context, options, test_count):
@@ -68,19 +85,7 @@ def finished(self):
     for test, result, is_flaky in self._failed:
       flaky += int(is_flaky)
       print_failure_header(test, is_flaky=is_flaky)
-      if result.output.stderr:
-        print("--- stderr ---")
-        print(result.output.stderr.strip())
-      if result.output.stdout:
-        print("--- stdout ---")
-        print(result.output.stdout.strip())
-      print("Command: %s" % result.cmd.to_string())
-      if result.output.HasCrashed():
-        print("exit code: %s" % result.output.exit_code_string)
-        print("--- CRASHED ---")
-        crashed += 1
-      if result.output.HasTimedOut():
-        print("--- TIMEOUT ---")
+      print(formatted_result_output(result))
     if len(self._failed) == 0:
       print("===")
       print("=== All tests succeeded")
@@ -230,7 +235,7 @@ def on_test_result(self, test, result):
     else:
       self._passed += 1
 
-    self._print_progress(str(test))
+    self._print_progress(test.full_name)
     if result.has_unexpected_output:
       output = result.output
       stdout = output.stdout.strip()
@@ -358,10 +363,7 @@ def __init__(self, context, options, test_count, framework_name):
     self.test_count = 0
 
   def on_test_result(self, test, result):
-    if result.is_rerun:
-      self.process_results(test, result.results)
-    else:
-      self.process_results(test, [result])
+    self.process_results(test, result.as_list)
 
   def process_results(self, test, results):
     for run, result in enumerate(results):
@@ -376,7 +378,7 @@ def process_results(self, test, results):
       if not result.has_unexpected_output and run == 0:
         continue
 
-      record = self._test_record(test, result, output, run)
+      record = self._test_record(test, result, run)
       record.update({
           "result": test.output_proc.get_outcome(output),
           "stdout": output.stdout,
@@ -392,30 +394,22 @@ def result_value(test, result, output):
         return ""
       return test.output_proc.get_outcome(output)
 
-    record = self._test_record(test, result, output, run)
-    record.update({
-        "result": result_value(test, result, output),
-        "marked_slow": test.is_slow,
-    })
+    record = self._test_record(test, result, run)
+    record.update(
+        result=result_value(test, result, output),
+        marked_slow=test.is_slow,
+    )
     self.tests.add(record)
     self.duration_sum += record['duration']
     self.test_count += 1
 
-  def _test_record(self, test, result, output, run):
-    return {
-        "name": str(test),
-        "flags": result.cmd.args,
-        "command": result.cmd.to_string(relative=True),
-        "run": run + 1,
-        "exit_code": output.exit_code,
-        "expected": test.expected_outcomes,
-        "duration": output.duration,
-        "random_seed": test.random_seed,
-        "target_name": test.get_shell(),
-        "variant": test.variant,
-        "variant_flags": test.variant_flags,
-        "framework_name": self.framework_name,
-    }
+  def _test_record(self, test, result, run):
+    record = util.base_test_record(test, result, run)
+    record.update(
+        framework_name=self.framework_name,
+        command=result.cmd.to_string(relative=True),
+    )
+    return record
 
   def finished(self):
     duration_mean = None
@@ -423,10 +417,10 @@ def finished(self):
       duration_mean = self.duration_sum / self.test_count
 
     result = {
-        "results": self.results,
-        "slowest_tests": self.tests.as_list(),
-        "duration_mean": duration_mean,
-        "test_total": self.test_count,
+        'results': self.results,
+        'slowest_tests': self.tests.as_list(),
+        'duration_mean': duration_mean,
+        'test_total': self.test_count,
     }
 
     with open(self.options.json_test_results, "w") as f:
diff --git a/deps/v8/tools/testrunner/testproc/progress.py b/deps/v8/tools/testrunner/testproc/progress.py
index 789adf053f1c28..319cfa1af1b671 100644
--- a/deps/v8/tools/testrunner/testproc/progress.py
+++ b/deps/v8/tools/testrunner/testproc/progress.py
@@ -6,6 +6,7 @@
 from . import base
 from testrunner.local import utils
 from testrunner.testproc.indicators import JsonTestProgressIndicator, PROGRESS_INDICATORS
+from testrunner.testproc.resultdb import ResultDBIndicator
 
 
 class ResultsTracker(base.TestProcObserver):
@@ -66,7 +67,7 @@ def __init__(self, context, options, framework_name, test_count):
           0,
           JsonTestProgressIndicator(context, options, test_count,
                                     framework_name))
-
+    self.procs.append(ResultDBIndicator(context, options, test_count))
     self._requirement = max(proc._requirement for proc in self.procs)
 
   def _on_result_for(self, test, result):
diff --git a/deps/v8/tools/testrunner/testproc/result.py b/deps/v8/tools/testrunner/testproc/result.py
index 18983d418083e7..5436e48be7d097 100644
--- a/deps/v8/tools/testrunner/testproc/result.py
+++ b/deps/v8/tools/testrunner/testproc/result.py
@@ -16,6 +16,10 @@ def is_grouped(self):
   def is_rerun(self):
     return False
 
+  @property
+  def as_list(self):
+    return [self]
+
 
 class Result(ResultBase):
   """Result created by the output processor."""
@@ -112,5 +116,9 @@ def __init__(self, results):
   def is_rerun(self):
     return True
 
+  @property
+  def as_list(self):
+    return self.results
+
   def status(self):
     return ' '.join(r.status() for r in self.results)
diff --git a/deps/v8/tools/testrunner/testproc/resultdb.py b/deps/v8/tools/testrunner/testproc/resultdb.py
new file mode 100644
index 00000000000000..c01d2591506480
--- /dev/null
+++ b/deps/v8/tools/testrunner/testproc/resultdb.py
@@ -0,0 +1,95 @@
+# Copyright 2022 the V8 project authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+import logging
+import pprint
+import requests
+import os
+
+from . import base
+from .indicators import (
+    formatted_result_output,
+    ProgressIndicator,
+)
+from .util import (
+    base_test_record,
+    extract_tags,
+    strip_ascii_control_characters,
+)
+
+
+class ResultDBIndicator(ProgressIndicator):
+
+  def __init__(self, context, options, test_count):
+    super(ResultDBIndicator, self).__init__(context, options, test_count)
+    self._requirement = base.DROP_PASS_OUTPUT
+    self.rpc = ResultDB_RPC()
+
+  def on_test_result(self, test, result):
+    for run, sub_result in enumerate(result.as_list):
+      self.send_result(test, sub_result, run)
+
+  def send_result(self, test, result, run):
+    # We need to recalculate the observed (but lost) test behaviour.
+    # `result.has_unexpected_output` indicates that the run behaviour of the
+    # test matches the expected behaviour irrespective of passing or failing.
+    result_expected = not result.has_unexpected_output
+    test_should_pass = not test.is_fail
+    run_passed = (result_expected == test_should_pass)
+    rdb_result = {
+        'testId': strip_ascii_control_characters(test.full_name),
+        'status': 'PASS' if run_passed else 'FAIL',
+        'expected': result_expected,
+    }
+
+    if result.output and result.output.duration:
+      rdb_result.update(duration=f'{result.output.duration}ms')
+    if result.has_unexpected_output:
+      formated_output = formatted_result_output(result)
+      sanitized = strip_ascii_control_characters(formated_output)
+      # TODO(liviurau): do we have a better presentation data for this?
+      # Protobuf strings can have len == 2**32.
+      rdb_result.update(summaryHtml=f'<pre>{sanitized}</pre>')
+    record = base_test_record(test, result, run)
+    rdb_result.update(tags=extract_tags(record))
+    self.rpc.send(rdb_result)
+
+
+class ResultDB_RPC:
+
+  def __init__(self):
+    self.session = None
+    luci_context = os.environ.get('LUCI_CONTEXT')
+    # TODO(liviurau): use a factory method and return None in absence of
+    # necessary context.
+    if not luci_context:
+      logging.warning(
+          f'No LUCI_CONTEXT found. No results will be sent to ResutDB.')
+      return
+    with open(luci_context, mode="r", encoding="utf-8") as f:
+      config = json.load(f)
+    sink = config.get('result_sink', None)
+    if not sink:
+      logging.warning(
+          f'No ResultDB sink found. No results will be sent to ResutDB.')
+      return
+    self.session = requests.Session()
+    self.session.headers = {
+        'Authorization': f'ResultSink {sink.get("auth_token")}',
+    }
+    self.url = f'http://{sink.get("address")}/prpc/luci.resultsink.v1.Sink/ReportTestResults'
+
+  def send(self, result):
+    if self.session:
+      payload = dict(testResults=[result])
+      try:
+        self.session.post(self.url, json=payload).raise_for_status()
+      except Exception as e:
+        logging.error(f'Request failed: {payload}')
+        raise e
+
+  def __del__(self):
+    if self.session:
+      self.session.close()
diff --git a/deps/v8/tools/testrunner/testproc/util.py b/deps/v8/tools/testrunner/testproc/util.py
index 316c5ba3d8e086..5e6b8fd2c7cca5 100644
--- a/deps/v8/tools/testrunner/testproc/util.py
+++ b/deps/v8/tools/testrunner/testproc/util.py
@@ -7,6 +7,7 @@
 import logging
 import os
 import platform
+import re
 import signal
 import subprocess
 
@@ -53,6 +54,43 @@ def kill_processes_linux():
       logging.exception('Failed to kill process')
 
 
+def strip_ascii_control_characters(unicode_string):
+  return re.sub(r'[^\x20-\x7E]', '?', str(unicode_string))
+
+
+def base_test_record(test, result, run):
+  record = {
+      'name': test.full_name,
+      'flags': result.cmd.args,
+      'run': run + 1,
+      'expected': test.expected_outcomes,
+      'random_seed': test.random_seed,
+      'target_name': test.get_shell(),
+      'variant': test.variant,
+      'variant_flags': test.variant_flags,
+  }
+  if result.output:
+    record.update(
+        exit_code=result.output.exit_code,
+        duration=result.output.duration,
+    )
+  return record
+
+
+def extract_tags(record):
+  tags = []
+  for k, v in record.items():
+    if type(v) == list:
+      tags += [sanitized_kv_dict(k, e) for e in v]
+    else:
+      tags.append(sanitized_kv_dict(k, v))
+  return tags
+
+
+def sanitized_kv_dict(k, v):
+  return dict(key=k, value=strip_ascii_control_characters(v))
+
+
 class FixedSizeTopList():
   """Utility collection for gathering a fixed number of elements with the
   biggest value for the given key. It employs a heap from which we pop the
diff --git a/deps/v8/tools/testrunner/utils/augmented_options.py b/deps/v8/tools/testrunner/utils/augmented_options.py
index db6aef4b5e79f6..0af04031c5ece0 100644
--- a/deps/v8/tools/testrunner/utils/augmented_options.py
+++ b/deps/v8/tools/testrunner/utils/augmented_options.py
@@ -57,9 +57,9 @@ def shard_info(self):
 
   def fuzzer_configs(self):
     fuzzers = []
-    def add(name, prob, *args):
+    def add(name, prob):
       if prob:
-        fuzzers.append(fuzzer.create_fuzzer_config(name, prob, *args))
+        fuzzers.append(fuzzer.create_fuzzer_config(name, prob))
 
     add('compaction', self.stress_compaction)
     add('interrupt', self.stress_interrupt_budget)
@@ -69,7 +69,7 @@ def add(name, prob, *args):
     add('stack', self.stress_stack_size)
     add('threads', self.stress_thread_pool_size)
     add('delay', self.stress_delay_tasks)
-    add('deopt', self.stress_deopt, self.stress_deopt_min)
+    add('deopt', self.stress_deopt)
     return fuzzers
 
   def fuzzer_tests_count(self):
diff --git a/deps/v8/tools/testrunner/utils/test_utils.py b/deps/v8/tools/testrunner/utils/test_utils.py
index 4891d07266ad5b..f61beaa4fdb18a 100644
--- a/deps/v8/tools/testrunner/utils/test_utils.py
+++ b/deps/v8/tools/testrunner/utils/test_utils.py
@@ -183,9 +183,16 @@ def resolve_arg(arg):
         json_out = clean_json_output(json_out_path, basedir)
         return TestResult(stdout.getvalue(), stderr.getvalue(), code, json_out, self)
 
-    def get_runner_class():
-      """Implement to return the runner class"""
-      return None
+  def get_runner_options(self, baseroot='testroot1'):
+    """Returns a list of all flags parsed by the test runner."""
+    with temp_base(baseroot=baseroot) as basedir:
+      runner = self.get_runner_class()(basedir=basedir)
+      parser = runner._create_parser()
+      return [i.get_opt_string() for i in parser.option_list]
+
+  def get_runner_class():
+    """Implement to return the runner class"""
+    return None
 
 
 class FakeOSContext(DefaultOSContext):
diff --git a/deps/v8/tools/v8heapconst.py b/deps/v8/tools/v8heapconst.py
index 34bcad23fe343f..6009e736ff22a0 100644
--- a/deps/v8/tools/v8heapconst.py
+++ b/deps/v8/tools/v8heapconst.py
@@ -241,347 +241,350 @@
   2111: "JS_DATE_TYPE",
   2112: "JS_DATE_TIME_FORMAT_TYPE",
   2113: "JS_DISPLAY_NAMES_TYPE",
-  2114: "JS_ERROR_TYPE",
-  2115: "JS_EXTERNAL_OBJECT_TYPE",
-  2116: "JS_FINALIZATION_REGISTRY_TYPE",
-  2117: "JS_LIST_FORMAT_TYPE",
-  2118: "JS_LOCALE_TYPE",
-  2119: "JS_MESSAGE_OBJECT_TYPE",
-  2120: "JS_NUMBER_FORMAT_TYPE",
-  2121: "JS_PLURAL_RULES_TYPE",
-  2122: "JS_REG_EXP_TYPE",
-  2123: "JS_REG_EXP_STRING_ITERATOR_TYPE",
-  2124: "JS_RELATIVE_TIME_FORMAT_TYPE",
-  2125: "JS_SEGMENT_ITERATOR_TYPE",
-  2126: "JS_SEGMENTER_TYPE",
-  2127: "JS_SEGMENTS_TYPE",
-  2128: "JS_SHADOW_REALM_TYPE",
-  2129: "JS_SHARED_ARRAY_TYPE",
-  2130: "JS_SHARED_STRUCT_TYPE",
-  2131: "JS_STRING_ITERATOR_TYPE",
-  2132: "JS_TEMPORAL_CALENDAR_TYPE",
-  2133: "JS_TEMPORAL_DURATION_TYPE",
-  2134: "JS_TEMPORAL_INSTANT_TYPE",
-  2135: "JS_TEMPORAL_PLAIN_DATE_TYPE",
-  2136: "JS_TEMPORAL_PLAIN_DATE_TIME_TYPE",
-  2137: "JS_TEMPORAL_PLAIN_MONTH_DAY_TYPE",
-  2138: "JS_TEMPORAL_PLAIN_TIME_TYPE",
-  2139: "JS_TEMPORAL_PLAIN_YEAR_MONTH_TYPE",
-  2140: "JS_TEMPORAL_TIME_ZONE_TYPE",
-  2141: "JS_TEMPORAL_ZONED_DATE_TIME_TYPE",
-  2142: "JS_V8_BREAK_ITERATOR_TYPE",
-  2143: "JS_WEAK_REF_TYPE",
-  2144: "WASM_EXCEPTION_PACKAGE_TYPE",
-  2145: "WASM_GLOBAL_OBJECT_TYPE",
-  2146: "WASM_INSTANCE_OBJECT_TYPE",
-  2147: "WASM_MEMORY_OBJECT_TYPE",
-  2148: "WASM_MODULE_OBJECT_TYPE",
-  2149: "WASM_SUSPENDER_OBJECT_TYPE",
-  2150: "WASM_TABLE_OBJECT_TYPE",
-  2151: "WASM_TAG_OBJECT_TYPE",
-  2152: "WASM_VALUE_OBJECT_TYPE",
+  2114: "JS_DURATION_FORMAT_TYPE",
+  2115: "JS_ERROR_TYPE",
+  2116: "JS_EXTERNAL_OBJECT_TYPE",
+  2117: "JS_FINALIZATION_REGISTRY_TYPE",
+  2118: "JS_LIST_FORMAT_TYPE",
+  2119: "JS_LOCALE_TYPE",
+  2120: "JS_MESSAGE_OBJECT_TYPE",
+  2121: "JS_NUMBER_FORMAT_TYPE",
+  2122: "JS_PLURAL_RULES_TYPE",
+  2123: "JS_RAW_JSON_TYPE",
+  2124: "JS_REG_EXP_TYPE",
+  2125: "JS_REG_EXP_STRING_ITERATOR_TYPE",
+  2126: "JS_RELATIVE_TIME_FORMAT_TYPE",
+  2127: "JS_SEGMENT_ITERATOR_TYPE",
+  2128: "JS_SEGMENTER_TYPE",
+  2129: "JS_SEGMENTS_TYPE",
+  2130: "JS_SHADOW_REALM_TYPE",
+  2131: "JS_SHARED_ARRAY_TYPE",
+  2132: "JS_SHARED_STRUCT_TYPE",
+  2133: "JS_STRING_ITERATOR_TYPE",
+  2134: "JS_TEMPORAL_CALENDAR_TYPE",
+  2135: "JS_TEMPORAL_DURATION_TYPE",
+  2136: "JS_TEMPORAL_INSTANT_TYPE",
+  2137: "JS_TEMPORAL_PLAIN_DATE_TYPE",
+  2138: "JS_TEMPORAL_PLAIN_DATE_TIME_TYPE",
+  2139: "JS_TEMPORAL_PLAIN_MONTH_DAY_TYPE",
+  2140: "JS_TEMPORAL_PLAIN_TIME_TYPE",
+  2141: "JS_TEMPORAL_PLAIN_YEAR_MONTH_TYPE",
+  2142: "JS_TEMPORAL_TIME_ZONE_TYPE",
+  2143: "JS_TEMPORAL_ZONED_DATE_TIME_TYPE",
+  2144: "JS_V8_BREAK_ITERATOR_TYPE",
+  2145: "JS_WEAK_REF_TYPE",
+  2146: "WASM_EXCEPTION_PACKAGE_TYPE",
+  2147: "WASM_GLOBAL_OBJECT_TYPE",
+  2148: "WASM_INSTANCE_OBJECT_TYPE",
+  2149: "WASM_MEMORY_OBJECT_TYPE",
+  2150: "WASM_MODULE_OBJECT_TYPE",
+  2151: "WASM_SUSPENDER_OBJECT_TYPE",
+  2152: "WASM_TABLE_OBJECT_TYPE",
+  2153: "WASM_TAG_OBJECT_TYPE",
+  2154: "WASM_VALUE_OBJECT_TYPE",
 }
 
 # List of known V8 maps.
 KNOWN_MAPS = {
-    ("read_only_space", 0x02139): (247, "MetaMap"),
-    ("read_only_space", 0x02161): (131, "NullMap"),
-    ("read_only_space", 0x02189): (229, "StrongDescriptorArrayMap"),
-    ("read_only_space", 0x021b1): (265, "WeakArrayListMap"),
-    ("read_only_space", 0x021f5): (155, "EnumCacheMap"),
-    ("read_only_space", 0x02229): (176, "FixedArrayMap"),
-    ("read_only_space", 0x02275): (8, "OneByteInternalizedStringMap"),
-    ("read_only_space", 0x022c1): (244, "FreeSpaceMap"),
-    ("read_only_space", 0x022e9): (243, "OnePointerFillerMap"),
-    ("read_only_space", 0x02311): (243, "TwoPointerFillerMap"),
-    ("read_only_space", 0x02339): (131, "UninitializedMap"),
-    ("read_only_space", 0x023b1): (131, "UndefinedMap"),
-    ("read_only_space", 0x023f5): (130, "HeapNumberMap"),
-    ("read_only_space", 0x02429): (131, "TheHoleMap"),
-    ("read_only_space", 0x02489): (131, "BooleanMap"),
-    ("read_only_space", 0x0252d): (191, "ByteArrayMap"),
-    ("read_only_space", 0x02555): (176, "FixedCOWArrayMap"),
-    ("read_only_space", 0x0257d): (177, "HashTableMap"),
-    ("read_only_space", 0x025a5): (128, "SymbolMap"),
-    ("read_only_space", 0x025cd): (40, "OneByteStringMap"),
-    ("read_only_space", 0x025f5): (253, "ScopeInfoMap"),
-    ("read_only_space", 0x0261d): (254, "SharedFunctionInfoMap"),
-    ("read_only_space", 0x02645): (237, "CodeMap"),
-    ("read_only_space", 0x0266d): (236, "CellMap"),
-    ("read_only_space", 0x02695): (252, "GlobalPropertyCellMap"),
-    ("read_only_space", 0x026bd): (204, "ForeignMap"),
-    ("read_only_space", 0x026e5): (233, "TransitionArrayMap"),
-    ("read_only_space", 0x0270d): (45, "ThinOneByteStringMap"),
-    ("read_only_space", 0x02735): (242, "FeedbackVectorMap"),
-    ("read_only_space", 0x0276d): (131, "ArgumentsMarkerMap"),
-    ("read_only_space", 0x027cd): (131, "ExceptionMap"),
-    ("read_only_space", 0x02829): (131, "TerminationExceptionMap"),
-    ("read_only_space", 0x02891): (131, "OptimizedOutMap"),
-    ("read_only_space", 0x028f1): (131, "StaleRegisterMap"),
-    ("read_only_space", 0x02951): (190, "ScriptContextTableMap"),
-    ("read_only_space", 0x02979): (188, "ClosureFeedbackCellArrayMap"),
-    ("read_only_space", 0x029a1): (241, "FeedbackMetadataArrayMap"),
-    ("read_only_space", 0x029c9): (176, "ArrayListMap"),
-    ("read_only_space", 0x029f1): (129, "BigIntMap"),
-    ("read_only_space", 0x02a19): (189, "ObjectBoilerplateDescriptionMap"),
-    ("read_only_space", 0x02a41): (192, "BytecodeArrayMap"),
-    ("read_only_space", 0x02a69): (238, "CodeDataContainerMap"),
-    ("read_only_space", 0x02a91): (239, "CoverageInfoMap"),
-    ("read_only_space", 0x02ab9): (193, "FixedDoubleArrayMap"),
-    ("read_only_space", 0x02ae1): (179, "GlobalDictionaryMap"),
-    ("read_only_space", 0x02b09): (157, "ManyClosuresCellMap"),
-    ("read_only_space", 0x02b31): (248, "MegaDomHandlerMap"),
-    ("read_only_space", 0x02b59): (176, "ModuleInfoMap"),
-    ("read_only_space", 0x02b81): (180, "NameDictionaryMap"),
-    ("read_only_space", 0x02ba9): (157, "NoClosuresCellMap"),
-    ("read_only_space", 0x02bd1): (182, "NumberDictionaryMap"),
-    ("read_only_space", 0x02bf9): (157, "OneClosureCellMap"),
-    ("read_only_space", 0x02c21): (183, "OrderedHashMapMap"),
-    ("read_only_space", 0x02c49): (184, "OrderedHashSetMap"),
-    ("read_only_space", 0x02c71): (181, "NameToIndexHashTableMap"),
-    ("read_only_space", 0x02c99): (186, "RegisteredSymbolTableMap"),
-    ("read_only_space", 0x02cc1): (185, "OrderedNameDictionaryMap"),
-    ("read_only_space", 0x02ce9): (250, "PreparseDataMap"),
-    ("read_only_space", 0x02d11): (251, "PropertyArrayMap"),
-    ("read_only_space", 0x02d39): (234, "AccessorInfoMap"),
-    ("read_only_space", 0x02d61): (235, "SideEffectCallHandlerInfoMap"),
-    ("read_only_space", 0x02d89): (235, "SideEffectFreeCallHandlerInfoMap"),
-    ("read_only_space", 0x02db1): (235, "NextCallSideEffectFreeCallHandlerInfoMap"),
-    ("read_only_space", 0x02dd9): (187, "SimpleNumberDictionaryMap"),
-    ("read_only_space", 0x02e01): (223, "SmallOrderedHashMapMap"),
-    ("read_only_space", 0x02e29): (224, "SmallOrderedHashSetMap"),
-    ("read_only_space", 0x02e51): (225, "SmallOrderedNameDictionaryMap"),
-    ("read_only_space", 0x02e79): (230, "SourceTextModuleMap"),
-    ("read_only_space", 0x02ea1): (258, "SwissNameDictionaryMap"),
-    ("read_only_space", 0x02ec9): (231, "SyntheticModuleMap"),
-    ("read_only_space", 0x02ef1): (259, "WasmApiFunctionRefMap"),
-    ("read_only_space", 0x02f19): (220, "WasmCapiFunctionDataMap"),
-    ("read_only_space", 0x02f41): (221, "WasmExportedFunctionDataMap"),
-    ("read_only_space", 0x02f69): (261, "WasmInternalFunctionMap"),
-    ("read_only_space", 0x02f91): (222, "WasmJSFunctionDataMap"),
-    ("read_only_space", 0x02fb9): (262, "WasmResumeDataMap"),
-    ("read_only_space", 0x02fe1): (264, "WasmTypeInfoMap"),
-    ("read_only_space", 0x03009): (260, "WasmContinuationObjectMap"),
-    ("read_only_space", 0x03031): (232, "WeakFixedArrayMap"),
-    ("read_only_space", 0x03059): (178, "EphemeronHashTableMap"),
-    ("read_only_space", 0x03081): (240, "EmbedderDataArrayMap"),
-    ("read_only_space", 0x030a9): (266, "WeakCellMap"),
-    ("read_only_space", 0x030d1): (32, "StringMap"),
-    ("read_only_space", 0x030f9): (41, "ConsOneByteStringMap"),
-    ("read_only_space", 0x03121): (33, "ConsStringMap"),
-    ("read_only_space", 0x03149): (37, "ThinStringMap"),
-    ("read_only_space", 0x03171): (35, "SlicedStringMap"),
-    ("read_only_space", 0x03199): (43, "SlicedOneByteStringMap"),
-    ("read_only_space", 0x031c1): (34, "ExternalStringMap"),
-    ("read_only_space", 0x031e9): (42, "ExternalOneByteStringMap"),
-    ("read_only_space", 0x03211): (50, "UncachedExternalStringMap"),
-    ("read_only_space", 0x03239): (0, "InternalizedStringMap"),
-    ("read_only_space", 0x03261): (2, "ExternalInternalizedStringMap"),
-    ("read_only_space", 0x03289): (10, "ExternalOneByteInternalizedStringMap"),
-    ("read_only_space", 0x032b1): (18, "UncachedExternalInternalizedStringMap"),
-    ("read_only_space", 0x032d9): (26, "UncachedExternalOneByteInternalizedStringMap"),
-    ("read_only_space", 0x03301): (58, "UncachedExternalOneByteStringMap"),
-    ("read_only_space", 0x03329): (104, "SharedOneByteStringMap"),
-    ("read_only_space", 0x03351): (96, "SharedStringMap"),
-    ("read_only_space", 0x03379): (106, "SharedExternalOneByteStringMap"),
-    ("read_only_space", 0x033a1): (98, "SharedExternalStringMap"),
-    ("read_only_space", 0x033c9): (122, "SharedUncachedExternalOneByteStringMap"),
-    ("read_only_space", 0x033f1): (114, "SharedUncachedExternalStringMap"),
-    ("read_only_space", 0x03419): (109, "SharedThinOneByteStringMap"),
-    ("read_only_space", 0x03441): (101, "SharedThinStringMap"),
-    ("read_only_space", 0x03469): (131, "SelfReferenceMarkerMap"),
-    ("read_only_space", 0x03491): (131, "BasicBlockCountersMarkerMap"),
-    ("read_only_space", 0x034d5): (146, "ArrayBoilerplateDescriptionMap"),
-    ("read_only_space", 0x035d5): (159, "InterceptorInfoMap"),
-    ("read_only_space", 0x07455): (132, "PromiseFulfillReactionJobTaskMap"),
-    ("read_only_space", 0x0747d): (133, "PromiseRejectReactionJobTaskMap"),
-    ("read_only_space", 0x074a5): (134, "CallableTaskMap"),
-    ("read_only_space", 0x074cd): (135, "CallbackTaskMap"),
-    ("read_only_space", 0x074f5): (136, "PromiseResolveThenableJobTaskMap"),
-    ("read_only_space", 0x0751d): (139, "FunctionTemplateInfoMap"),
-    ("read_only_space", 0x07545): (140, "ObjectTemplateInfoMap"),
-    ("read_only_space", 0x0756d): (141, "AccessCheckInfoMap"),
-    ("read_only_space", 0x07595): (142, "AccessorPairMap"),
-    ("read_only_space", 0x075bd): (143, "AliasedArgumentsEntryMap"),
-    ("read_only_space", 0x075e5): (144, "AllocationMementoMap"),
-    ("read_only_space", 0x0760d): (147, "AsmWasmDataMap"),
-    ("read_only_space", 0x07635): (148, "AsyncGeneratorRequestMap"),
-    ("read_only_space", 0x0765d): (149, "BreakPointMap"),
-    ("read_only_space", 0x07685): (150, "BreakPointInfoMap"),
-    ("read_only_space", 0x076ad): (151, "CachedTemplateObjectMap"),
-    ("read_only_space", 0x076d5): (152, "CallSiteInfoMap"),
-    ("read_only_space", 0x076fd): (153, "ClassPositionsMap"),
-    ("read_only_space", 0x07725): (154, "DebugInfoMap"),
-    ("read_only_space", 0x0774d): (156, "ErrorStackDataMap"),
-    ("read_only_space", 0x07775): (158, "FunctionTemplateRareDataMap"),
-    ("read_only_space", 0x0779d): (160, "InterpreterDataMap"),
-    ("read_only_space", 0x077c5): (161, "ModuleRequestMap"),
-    ("read_only_space", 0x077ed): (162, "PromiseCapabilityMap"),
-    ("read_only_space", 0x07815): (163, "PromiseOnStackMap"),
-    ("read_only_space", 0x0783d): (164, "PromiseReactionMap"),
-    ("read_only_space", 0x07865): (165, "PropertyDescriptorObjectMap"),
-    ("read_only_space", 0x0788d): (166, "PrototypeInfoMap"),
-    ("read_only_space", 0x078b5): (167, "RegExpBoilerplateDescriptionMap"),
-    ("read_only_space", 0x078dd): (168, "ScriptMap"),
-    ("read_only_space", 0x07905): (169, "ScriptOrModuleMap"),
-    ("read_only_space", 0x0792d): (170, "SourceTextModuleInfoEntryMap"),
-    ("read_only_space", 0x07955): (171, "StackFrameInfoMap"),
-    ("read_only_space", 0x0797d): (172, "TemplateObjectDescriptionMap"),
-    ("read_only_space", 0x079a5): (173, "Tuple2Map"),
-    ("read_only_space", 0x079cd): (174, "WasmExceptionTagMap"),
-    ("read_only_space", 0x079f5): (175, "WasmIndirectFunctionTableMap"),
-    ("read_only_space", 0x07a1d): (195, "SloppyArgumentsElementsMap"),
-    ("read_only_space", 0x07a45): (228, "DescriptorArrayMap"),
-    ("read_only_space", 0x07a6d): (217, "UncompiledDataWithoutPreparseDataMap"),
-    ("read_only_space", 0x07a95): (215, "UncompiledDataWithPreparseDataMap"),
-    ("read_only_space", 0x07abd): (218, "UncompiledDataWithoutPreparseDataWithJobMap"),
-    ("read_only_space", 0x07ae5): (216, "UncompiledDataWithPreparseDataAndJobMap"),
-    ("read_only_space", 0x07b0d): (249, "OnHeapBasicBlockProfilerDataMap"),
-    ("read_only_space", 0x07b35): (196, "TurbofanBitsetTypeMap"),
-    ("read_only_space", 0x07b5d): (200, "TurbofanUnionTypeMap"),
-    ("read_only_space", 0x07b85): (199, "TurbofanRangeTypeMap"),
-    ("read_only_space", 0x07bad): (197, "TurbofanHeapConstantTypeMap"),
-    ("read_only_space", 0x07bd5): (198, "TurbofanOtherNumberConstantTypeMap"),
-    ("read_only_space", 0x07bfd): (245, "InternalClassMap"),
-    ("read_only_space", 0x07c25): (256, "SmiPairMap"),
-    ("read_only_space", 0x07c4d): (255, "SmiBoxMap"),
-    ("read_only_space", 0x07c75): (201, "ExportedSubClassBaseMap"),
-    ("read_only_space", 0x07c9d): (202, "ExportedSubClassMap"),
-    ("read_only_space", 0x07cc5): (226, "AbstractInternalClassSubclass1Map"),
-    ("read_only_space", 0x07ced): (227, "AbstractInternalClassSubclass2Map"),
-    ("read_only_space", 0x07d15): (194, "InternalClassWithSmiElementsMap"),
-    ("read_only_space", 0x07d3d): (246, "InternalClassWithStructElementsMap"),
-    ("read_only_space", 0x07d65): (203, "ExportedSubClass2Map"),
-    ("read_only_space", 0x07d8d): (257, "SortStateMap"),
-    ("read_only_space", 0x07db5): (263, "WasmStringViewIterMap"),
-    ("read_only_space", 0x07ddd): (145, "AllocationSiteWithWeakNextMap"),
-    ("read_only_space", 0x07e05): (145, "AllocationSiteWithoutWeakNextMap"),
-    ("read_only_space", 0x07ed1): (137, "LoadHandler1Map"),
-    ("read_only_space", 0x07ef9): (137, "LoadHandler2Map"),
-    ("read_only_space", 0x07f21): (137, "LoadHandler3Map"),
-    ("read_only_space", 0x07f49): (138, "StoreHandler0Map"),
-    ("read_only_space", 0x07f71): (138, "StoreHandler1Map"),
-    ("read_only_space", 0x07f99): (138, "StoreHandler2Map"),
-    ("read_only_space", 0x07fc1): (138, "StoreHandler3Map"),
-    ("map_space", 0x02139): (2115, "ExternalMap"),
-    ("map_space", 0x02161): (2119, "JSMessageObjectMap"),
+    ("read_only_space", 0x02141): (247, "MetaMap"),
+    ("read_only_space", 0x02169): (131, "NullMap"),
+    ("read_only_space", 0x02191): (229, "StrongDescriptorArrayMap"),
+    ("read_only_space", 0x021b9): (265, "WeakArrayListMap"),
+    ("read_only_space", 0x021fd): (155, "EnumCacheMap"),
+    ("read_only_space", 0x02231): (176, "FixedArrayMap"),
+    ("read_only_space", 0x0227d): (8, "OneByteInternalizedStringMap"),
+    ("read_only_space", 0x022c9): (244, "FreeSpaceMap"),
+    ("read_only_space", 0x022f1): (243, "OnePointerFillerMap"),
+    ("read_only_space", 0x02319): (243, "TwoPointerFillerMap"),
+    ("read_only_space", 0x02341): (131, "UninitializedMap"),
+    ("read_only_space", 0x023b9): (131, "UndefinedMap"),
+    ("read_only_space", 0x023fd): (130, "HeapNumberMap"),
+    ("read_only_space", 0x02431): (131, "TheHoleMap"),
+    ("read_only_space", 0x02491): (131, "BooleanMap"),
+    ("read_only_space", 0x02535): (191, "ByteArrayMap"),
+    ("read_only_space", 0x0255d): (176, "FixedCOWArrayMap"),
+    ("read_only_space", 0x02585): (177, "HashTableMap"),
+    ("read_only_space", 0x025ad): (128, "SymbolMap"),
+    ("read_only_space", 0x025d5): (40, "OneByteStringMap"),
+    ("read_only_space", 0x025fd): (253, "ScopeInfoMap"),
+    ("read_only_space", 0x02625): (254, "SharedFunctionInfoMap"),
+    ("read_only_space", 0x0264d): (237, "CodeMap"),
+    ("read_only_space", 0x02675): (236, "CellMap"),
+    ("read_only_space", 0x0269d): (252, "GlobalPropertyCellMap"),
+    ("read_only_space", 0x026c5): (204, "ForeignMap"),
+    ("read_only_space", 0x026ed): (233, "TransitionArrayMap"),
+    ("read_only_space", 0x02715): (45, "ThinOneByteStringMap"),
+    ("read_only_space", 0x0273d): (242, "FeedbackVectorMap"),
+    ("read_only_space", 0x02775): (131, "ArgumentsMarkerMap"),
+    ("read_only_space", 0x027d5): (131, "ExceptionMap"),
+    ("read_only_space", 0x02831): (131, "TerminationExceptionMap"),
+    ("read_only_space", 0x02899): (131, "OptimizedOutMap"),
+    ("read_only_space", 0x028f9): (131, "StaleRegisterMap"),
+    ("read_only_space", 0x02959): (190, "ScriptContextTableMap"),
+    ("read_only_space", 0x02981): (188, "ClosureFeedbackCellArrayMap"),
+    ("read_only_space", 0x029a9): (241, "FeedbackMetadataArrayMap"),
+    ("read_only_space", 0x029d1): (176, "ArrayListMap"),
+    ("read_only_space", 0x029f9): (129, "BigIntMap"),
+    ("read_only_space", 0x02a21): (189, "ObjectBoilerplateDescriptionMap"),
+    ("read_only_space", 0x02a49): (192, "BytecodeArrayMap"),
+    ("read_only_space", 0x02a71): (238, "CodeDataContainerMap"),
+    ("read_only_space", 0x02a99): (239, "CoverageInfoMap"),
+    ("read_only_space", 0x02ac1): (193, "FixedDoubleArrayMap"),
+    ("read_only_space", 0x02ae9): (179, "GlobalDictionaryMap"),
+    ("read_only_space", 0x02b11): (157, "ManyClosuresCellMap"),
+    ("read_only_space", 0x02b39): (248, "MegaDomHandlerMap"),
+    ("read_only_space", 0x02b61): (176, "ModuleInfoMap"),
+    ("read_only_space", 0x02b89): (180, "NameDictionaryMap"),
+    ("read_only_space", 0x02bb1): (157, "NoClosuresCellMap"),
+    ("read_only_space", 0x02bd9): (182, "NumberDictionaryMap"),
+    ("read_only_space", 0x02c01): (157, "OneClosureCellMap"),
+    ("read_only_space", 0x02c29): (183, "OrderedHashMapMap"),
+    ("read_only_space", 0x02c51): (184, "OrderedHashSetMap"),
+    ("read_only_space", 0x02c79): (181, "NameToIndexHashTableMap"),
+    ("read_only_space", 0x02ca1): (186, "RegisteredSymbolTableMap"),
+    ("read_only_space", 0x02cc9): (185, "OrderedNameDictionaryMap"),
+    ("read_only_space", 0x02cf1): (250, "PreparseDataMap"),
+    ("read_only_space", 0x02d19): (251, "PropertyArrayMap"),
+    ("read_only_space", 0x02d41): (234, "AccessorInfoMap"),
+    ("read_only_space", 0x02d69): (235, "SideEffectCallHandlerInfoMap"),
+    ("read_only_space", 0x02d91): (235, "SideEffectFreeCallHandlerInfoMap"),
+    ("read_only_space", 0x02db9): (235, "NextCallSideEffectFreeCallHandlerInfoMap"),
+    ("read_only_space", 0x02de1): (187, "SimpleNumberDictionaryMap"),
+    ("read_only_space", 0x02e09): (223, "SmallOrderedHashMapMap"),
+    ("read_only_space", 0x02e31): (224, "SmallOrderedHashSetMap"),
+    ("read_only_space", 0x02e59): (225, "SmallOrderedNameDictionaryMap"),
+    ("read_only_space", 0x02e81): (230, "SourceTextModuleMap"),
+    ("read_only_space", 0x02ea9): (258, "SwissNameDictionaryMap"),
+    ("read_only_space", 0x02ed1): (231, "SyntheticModuleMap"),
+    ("read_only_space", 0x02ef9): (259, "WasmApiFunctionRefMap"),
+    ("read_only_space", 0x02f21): (220, "WasmCapiFunctionDataMap"),
+    ("read_only_space", 0x02f49): (221, "WasmExportedFunctionDataMap"),
+    ("read_only_space", 0x02f71): (261, "WasmInternalFunctionMap"),
+    ("read_only_space", 0x02f99): (222, "WasmJSFunctionDataMap"),
+    ("read_only_space", 0x02fc1): (262, "WasmResumeDataMap"),
+    ("read_only_space", 0x02fe9): (264, "WasmTypeInfoMap"),
+    ("read_only_space", 0x03011): (260, "WasmContinuationObjectMap"),
+    ("read_only_space", 0x03039): (232, "WeakFixedArrayMap"),
+    ("read_only_space", 0x03061): (178, "EphemeronHashTableMap"),
+    ("read_only_space", 0x03089): (240, "EmbedderDataArrayMap"),
+    ("read_only_space", 0x030b1): (266, "WeakCellMap"),
+    ("read_only_space", 0x030d9): (32, "StringMap"),
+    ("read_only_space", 0x03101): (41, "ConsOneByteStringMap"),
+    ("read_only_space", 0x03129): (33, "ConsStringMap"),
+    ("read_only_space", 0x03151): (37, "ThinStringMap"),
+    ("read_only_space", 0x03179): (35, "SlicedStringMap"),
+    ("read_only_space", 0x031a1): (43, "SlicedOneByteStringMap"),
+    ("read_only_space", 0x031c9): (34, "ExternalStringMap"),
+    ("read_only_space", 0x031f1): (42, "ExternalOneByteStringMap"),
+    ("read_only_space", 0x03219): (50, "UncachedExternalStringMap"),
+    ("read_only_space", 0x03241): (0, "InternalizedStringMap"),
+    ("read_only_space", 0x03269): (2, "ExternalInternalizedStringMap"),
+    ("read_only_space", 0x03291): (10, "ExternalOneByteInternalizedStringMap"),
+    ("read_only_space", 0x032b9): (18, "UncachedExternalInternalizedStringMap"),
+    ("read_only_space", 0x032e1): (26, "UncachedExternalOneByteInternalizedStringMap"),
+    ("read_only_space", 0x03309): (58, "UncachedExternalOneByteStringMap"),
+    ("read_only_space", 0x03331): (104, "SharedOneByteStringMap"),
+    ("read_only_space", 0x03359): (96, "SharedStringMap"),
+    ("read_only_space", 0x03381): (106, "SharedExternalOneByteStringMap"),
+    ("read_only_space", 0x033a9): (98, "SharedExternalStringMap"),
+    ("read_only_space", 0x033d1): (122, "SharedUncachedExternalOneByteStringMap"),
+    ("read_only_space", 0x033f9): (114, "SharedUncachedExternalStringMap"),
+    ("read_only_space", 0x03421): (109, "SharedThinOneByteStringMap"),
+    ("read_only_space", 0x03449): (101, "SharedThinStringMap"),
+    ("read_only_space", 0x03471): (131, "SelfReferenceMarkerMap"),
+    ("read_only_space", 0x03499): (131, "BasicBlockCountersMarkerMap"),
+    ("read_only_space", 0x034dd): (146, "ArrayBoilerplateDescriptionMap"),
+    ("read_only_space", 0x035dd): (159, "InterceptorInfoMap"),
+    ("read_only_space", 0x075c9): (132, "PromiseFulfillReactionJobTaskMap"),
+    ("read_only_space", 0x075f1): (133, "PromiseRejectReactionJobTaskMap"),
+    ("read_only_space", 0x07619): (134, "CallableTaskMap"),
+    ("read_only_space", 0x07641): (135, "CallbackTaskMap"),
+    ("read_only_space", 0x07669): (136, "PromiseResolveThenableJobTaskMap"),
+    ("read_only_space", 0x07691): (139, "FunctionTemplateInfoMap"),
+    ("read_only_space", 0x076b9): (140, "ObjectTemplateInfoMap"),
+    ("read_only_space", 0x076e1): (141, "AccessCheckInfoMap"),
+    ("read_only_space", 0x07709): (142, "AccessorPairMap"),
+    ("read_only_space", 0x07731): (143, "AliasedArgumentsEntryMap"),
+    ("read_only_space", 0x07759): (144, "AllocationMementoMap"),
+    ("read_only_space", 0x07781): (147, "AsmWasmDataMap"),
+    ("read_only_space", 0x077a9): (148, "AsyncGeneratorRequestMap"),
+    ("read_only_space", 0x077d1): (149, "BreakPointMap"),
+    ("read_only_space", 0x077f9): (150, "BreakPointInfoMap"),
+    ("read_only_space", 0x07821): (151, "CachedTemplateObjectMap"),
+    ("read_only_space", 0x07849): (152, "CallSiteInfoMap"),
+    ("read_only_space", 0x07871): (153, "ClassPositionsMap"),
+    ("read_only_space", 0x07899): (154, "DebugInfoMap"),
+    ("read_only_space", 0x078c1): (156, "ErrorStackDataMap"),
+    ("read_only_space", 0x078e9): (158, "FunctionTemplateRareDataMap"),
+    ("read_only_space", 0x07911): (160, "InterpreterDataMap"),
+    ("read_only_space", 0x07939): (161, "ModuleRequestMap"),
+    ("read_only_space", 0x07961): (162, "PromiseCapabilityMap"),
+    ("read_only_space", 0x07989): (163, "PromiseOnStackMap"),
+    ("read_only_space", 0x079b1): (164, "PromiseReactionMap"),
+    ("read_only_space", 0x079d9): (165, "PropertyDescriptorObjectMap"),
+    ("read_only_space", 0x07a01): (166, "PrototypeInfoMap"),
+    ("read_only_space", 0x07a29): (167, "RegExpBoilerplateDescriptionMap"),
+    ("read_only_space", 0x07a51): (168, "ScriptMap"),
+    ("read_only_space", 0x07a79): (169, "ScriptOrModuleMap"),
+    ("read_only_space", 0x07aa1): (170, "SourceTextModuleInfoEntryMap"),
+    ("read_only_space", 0x07ac9): (171, "StackFrameInfoMap"),
+    ("read_only_space", 0x07af1): (172, "TemplateObjectDescriptionMap"),
+    ("read_only_space", 0x07b19): (173, "Tuple2Map"),
+    ("read_only_space", 0x07b41): (174, "WasmExceptionTagMap"),
+    ("read_only_space", 0x07b69): (175, "WasmIndirectFunctionTableMap"),
+    ("read_only_space", 0x07b91): (195, "SloppyArgumentsElementsMap"),
+    ("read_only_space", 0x07bb9): (228, "DescriptorArrayMap"),
+    ("read_only_space", 0x07be1): (217, "UncompiledDataWithoutPreparseDataMap"),
+    ("read_only_space", 0x07c09): (215, "UncompiledDataWithPreparseDataMap"),
+    ("read_only_space", 0x07c31): (218, "UncompiledDataWithoutPreparseDataWithJobMap"),
+    ("read_only_space", 0x07c59): (216, "UncompiledDataWithPreparseDataAndJobMap"),
+    ("read_only_space", 0x07c81): (249, "OnHeapBasicBlockProfilerDataMap"),
+    ("read_only_space", 0x07ca9): (196, "TurbofanBitsetTypeMap"),
+    ("read_only_space", 0x07cd1): (200, "TurbofanUnionTypeMap"),
+    ("read_only_space", 0x07cf9): (199, "TurbofanRangeTypeMap"),
+    ("read_only_space", 0x07d21): (197, "TurbofanHeapConstantTypeMap"),
+    ("read_only_space", 0x07d49): (198, "TurbofanOtherNumberConstantTypeMap"),
+    ("read_only_space", 0x07d71): (245, "InternalClassMap"),
+    ("read_only_space", 0x07d99): (256, "SmiPairMap"),
+    ("read_only_space", 0x07dc1): (255, "SmiBoxMap"),
+    ("read_only_space", 0x07de9): (201, "ExportedSubClassBaseMap"),
+    ("read_only_space", 0x07e11): (202, "ExportedSubClassMap"),
+    ("read_only_space", 0x07e39): (226, "AbstractInternalClassSubclass1Map"),
+    ("read_only_space", 0x07e61): (227, "AbstractInternalClassSubclass2Map"),
+    ("read_only_space", 0x07e89): (194, "InternalClassWithSmiElementsMap"),
+    ("read_only_space", 0x07eb1): (246, "InternalClassWithStructElementsMap"),
+    ("read_only_space", 0x07ed9): (203, "ExportedSubClass2Map"),
+    ("read_only_space", 0x07f01): (257, "SortStateMap"),
+    ("read_only_space", 0x07f29): (263, "WasmStringViewIterMap"),
+    ("read_only_space", 0x07f51): (145, "AllocationSiteWithWeakNextMap"),
+    ("read_only_space", 0x07f79): (145, "AllocationSiteWithoutWeakNextMap"),
+    ("read_only_space", 0x08045): (137, "LoadHandler1Map"),
+    ("read_only_space", 0x0806d): (137, "LoadHandler2Map"),
+    ("read_only_space", 0x08095): (137, "LoadHandler3Map"),
+    ("read_only_space", 0x080bd): (138, "StoreHandler0Map"),
+    ("read_only_space", 0x080e5): (138, "StoreHandler1Map"),
+    ("read_only_space", 0x0810d): (138, "StoreHandler2Map"),
+    ("read_only_space", 0x08135): (138, "StoreHandler3Map"),
+    ("old_space", 0x043a5): (2116, "ExternalMap"),
+    ("old_space", 0x043d5): (2120, "JSMessageObjectMap"),
 }
 
 # List of known V8 objects.
 KNOWN_OBJECTS = {
-  ("read_only_space", 0x021d9): "EmptyWeakArrayList",
-  ("read_only_space", 0x021e5): "EmptyDescriptorArray",
-  ("read_only_space", 0x0221d): "EmptyEnumCache",
-  ("read_only_space", 0x02251): "EmptyFixedArray",
-  ("read_only_space", 0x02259): "NullValue",
-  ("read_only_space", 0x02361): "UninitializedValue",
-  ("read_only_space", 0x023d9): "UndefinedValue",
-  ("read_only_space", 0x0241d): "NanValue",
-  ("read_only_space", 0x02451): "TheHoleValue",
-  ("read_only_space", 0x0247d): "HoleNanValue",
-  ("read_only_space", 0x024b1): "TrueValue",
-  ("read_only_space", 0x024f1): "FalseValue",
-  ("read_only_space", 0x02521): "empty_string",
-  ("read_only_space", 0x0275d): "EmptyScopeInfo",
-  ("read_only_space", 0x02795): "ArgumentsMarker",
-  ("read_only_space", 0x027f5): "Exception",
-  ("read_only_space", 0x02851): "TerminationException",
-  ("read_only_space", 0x028b9): "OptimizedOut",
-  ("read_only_space", 0x02919): "StaleRegister",
-  ("read_only_space", 0x034b9): "EmptyPropertyArray",
-  ("read_only_space", 0x034c1): "EmptyByteArray",
-  ("read_only_space", 0x034c9): "EmptyObjectBoilerplateDescription",
-  ("read_only_space", 0x034fd): "EmptyArrayBoilerplateDescription",
-  ("read_only_space", 0x03509): "EmptyClosureFeedbackCellArray",
-  ("read_only_space", 0x03511): "EmptySlowElementDictionary",
-  ("read_only_space", 0x03535): "EmptyOrderedHashMap",
-  ("read_only_space", 0x03549): "EmptyOrderedHashSet",
-  ("read_only_space", 0x0355d): "EmptyFeedbackMetadata",
-  ("read_only_space", 0x03569): "EmptyPropertyDictionary",
-  ("read_only_space", 0x03591): "EmptyOrderedPropertyDictionary",
-  ("read_only_space", 0x035a9): "EmptySwissPropertyDictionary",
-  ("read_only_space", 0x035fd): "NoOpInterceptorInfo",
-  ("read_only_space", 0x03625): "EmptyArrayList",
-  ("read_only_space", 0x03631): "EmptyWeakFixedArray",
-  ("read_only_space", 0x03639): "InfinityValue",
-  ("read_only_space", 0x03645): "MinusZeroValue",
-  ("read_only_space", 0x03651): "MinusInfinityValue",
-  ("read_only_space", 0x0365d): "SingleCharacterStringTable",
-  ("read_only_space", 0x04a65): "SelfReferenceMarker",
-  ("read_only_space", 0x04aa5): "BasicBlockCountersMarker",
-  ("read_only_space", 0x04ae9): "OffHeapTrampolineRelocationInfo",
-  ("read_only_space", 0x04af5): "GlobalThisBindingScopeInfo",
-  ("read_only_space", 0x04b25): "EmptyFunctionScopeInfo",
-  ("read_only_space", 0x04b49): "NativeScopeInfo",
-  ("read_only_space", 0x04b61): "HashSeed",
-  ("old_space", 0x04235): "ArgumentsIteratorAccessor",
-  ("old_space", 0x0424d): "ArrayLengthAccessor",
-  ("old_space", 0x04265): "BoundFunctionLengthAccessor",
-  ("old_space", 0x0427d): "BoundFunctionNameAccessor",
-  ("old_space", 0x04295): "ErrorStackAccessor",
-  ("old_space", 0x042ad): "FunctionArgumentsAccessor",
-  ("old_space", 0x042c5): "FunctionCallerAccessor",
-  ("old_space", 0x042dd): "FunctionNameAccessor",
-  ("old_space", 0x042f5): "FunctionLengthAccessor",
-  ("old_space", 0x0430d): "FunctionPrototypeAccessor",
-  ("old_space", 0x04325): "SharedArrayLengthAccessor",
-  ("old_space", 0x0433d): "StringLengthAccessor",
-  ("old_space", 0x04355): "ValueUnavailableAccessor",
-  ("old_space", 0x0436d): "WrappedFunctionLengthAccessor",
-  ("old_space", 0x04385): "WrappedFunctionNameAccessor",
-  ("old_space", 0x0439d): "InvalidPrototypeValidityCell",
-  ("old_space", 0x043a5): "EmptyScript",
-  ("old_space", 0x043e9): "ManyClosuresCell",
-  ("old_space", 0x043f5): "ArrayConstructorProtector",
-  ("old_space", 0x04409): "NoElementsProtector",
-  ("old_space", 0x0441d): "MegaDOMProtector",
-  ("old_space", 0x04431): "IsConcatSpreadableProtector",
-  ("old_space", 0x04445): "ArraySpeciesProtector",
-  ("old_space", 0x04459): "TypedArraySpeciesProtector",
-  ("old_space", 0x0446d): "PromiseSpeciesProtector",
-  ("old_space", 0x04481): "RegExpSpeciesProtector",
-  ("old_space", 0x04495): "StringLengthProtector",
-  ("old_space", 0x044a9): "ArrayIteratorProtector",
-  ("old_space", 0x044bd): "ArrayBufferDetachingProtector",
-  ("old_space", 0x044d1): "PromiseHookProtector",
-  ("old_space", 0x044e5): "PromiseResolveProtector",
-  ("old_space", 0x044f9): "MapIteratorProtector",
-  ("old_space", 0x0450d): "PromiseThenProtector",
-  ("old_space", 0x04521): "SetIteratorProtector",
-  ("old_space", 0x04535): "StringIteratorProtector",
-  ("old_space", 0x04549): "StringSplitCache",
-  ("old_space", 0x04951): "RegExpMultipleCache",
-  ("old_space", 0x04d59): "BuiltinsConstantsTable",
-  ("old_space", 0x051ad): "AsyncFunctionAwaitRejectSharedFun",
-  ("old_space", 0x051d1): "AsyncFunctionAwaitResolveSharedFun",
-  ("old_space", 0x051f5): "AsyncGeneratorAwaitRejectSharedFun",
-  ("old_space", 0x05219): "AsyncGeneratorAwaitResolveSharedFun",
-  ("old_space", 0x0523d): "AsyncGeneratorYieldResolveSharedFun",
-  ("old_space", 0x05261): "AsyncGeneratorReturnResolveSharedFun",
-  ("old_space", 0x05285): "AsyncGeneratorReturnClosedRejectSharedFun",
-  ("old_space", 0x052a9): "AsyncGeneratorReturnClosedResolveSharedFun",
-  ("old_space", 0x052cd): "AsyncIteratorValueUnwrapSharedFun",
-  ("old_space", 0x052f1): "PromiseAllResolveElementSharedFun",
-  ("old_space", 0x05315): "PromiseAllSettledResolveElementSharedFun",
-  ("old_space", 0x05339): "PromiseAllSettledRejectElementSharedFun",
-  ("old_space", 0x0535d): "PromiseAnyRejectElementSharedFun",
-  ("old_space", 0x05381): "PromiseCapabilityDefaultRejectSharedFun",
-  ("old_space", 0x053a5): "PromiseCapabilityDefaultResolveSharedFun",
-  ("old_space", 0x053c9): "PromiseCatchFinallySharedFun",
-  ("old_space", 0x053ed): "PromiseGetCapabilitiesExecutorSharedFun",
-  ("old_space", 0x05411): "PromiseThenFinallySharedFun",
-  ("old_space", 0x05435): "PromiseThrowerFinallySharedFun",
-  ("old_space", 0x05459): "PromiseValueThunkFinallySharedFun",
-  ("old_space", 0x0547d): "ProxyRevokeSharedFun",
-  ("old_space", 0x054a1): "ShadowRealmImportValueFulfilledSFI",
-  ("old_space", 0x054c5): "SourceTextModuleExecuteAsyncModuleFulfilledSFI",
-  ("old_space", 0x054e9): "SourceTextModuleExecuteAsyncModuleRejectedSFI",
+  ("read_only_space", 0x021e1): "EmptyWeakArrayList",
+  ("read_only_space", 0x021ed): "EmptyDescriptorArray",
+  ("read_only_space", 0x02225): "EmptyEnumCache",
+  ("read_only_space", 0x02259): "EmptyFixedArray",
+  ("read_only_space", 0x02261): "NullValue",
+  ("read_only_space", 0x02369): "UninitializedValue",
+  ("read_only_space", 0x023e1): "UndefinedValue",
+  ("read_only_space", 0x02425): "NanValue",
+  ("read_only_space", 0x02459): "TheHoleValue",
+  ("read_only_space", 0x02485): "HoleNanValue",
+  ("read_only_space", 0x024b9): "TrueValue",
+  ("read_only_space", 0x024f9): "FalseValue",
+  ("read_only_space", 0x02529): "empty_string",
+  ("read_only_space", 0x02765): "EmptyScopeInfo",
+  ("read_only_space", 0x0279d): "ArgumentsMarker",
+  ("read_only_space", 0x027fd): "Exception",
+  ("read_only_space", 0x02859): "TerminationException",
+  ("read_only_space", 0x028c1): "OptimizedOut",
+  ("read_only_space", 0x02921): "StaleRegister",
+  ("read_only_space", 0x034c1): "EmptyPropertyArray",
+  ("read_only_space", 0x034c9): "EmptyByteArray",
+  ("read_only_space", 0x034d1): "EmptyObjectBoilerplateDescription",
+  ("read_only_space", 0x03505): "EmptyArrayBoilerplateDescription",
+  ("read_only_space", 0x03511): "EmptyClosureFeedbackCellArray",
+  ("read_only_space", 0x03519): "EmptySlowElementDictionary",
+  ("read_only_space", 0x0353d): "EmptyOrderedHashMap",
+  ("read_only_space", 0x03551): "EmptyOrderedHashSet",
+  ("read_only_space", 0x03565): "EmptyFeedbackMetadata",
+  ("read_only_space", 0x03571): "EmptyPropertyDictionary",
+  ("read_only_space", 0x03599): "EmptyOrderedPropertyDictionary",
+  ("read_only_space", 0x035b1): "EmptySwissPropertyDictionary",
+  ("read_only_space", 0x03605): "NoOpInterceptorInfo",
+  ("read_only_space", 0x0362d): "EmptyArrayList",
+  ("read_only_space", 0x03639): "EmptyWeakFixedArray",
+  ("read_only_space", 0x03641): "InfinityValue",
+  ("read_only_space", 0x0364d): "MinusZeroValue",
+  ("read_only_space", 0x03659): "MinusInfinityValue",
+  ("read_only_space", 0x03665): "SingleCharacterStringTable",
+  ("read_only_space", 0x04a6d): "SelfReferenceMarker",
+  ("read_only_space", 0x04aad): "BasicBlockCountersMarker",
+  ("read_only_space", 0x04af1): "OffHeapTrampolineRelocationInfo",
+  ("read_only_space", 0x04afd): "GlobalThisBindingScopeInfo",
+  ("read_only_space", 0x04b2d): "EmptyFunctionScopeInfo",
+  ("read_only_space", 0x04b51): "NativeScopeInfo",
+  ("read_only_space", 0x04b69): "HashSeed",
+  ("old_space", 0x0423d): "ArgumentsIteratorAccessor",
+  ("old_space", 0x04255): "ArrayLengthAccessor",
+  ("old_space", 0x0426d): "BoundFunctionLengthAccessor",
+  ("old_space", 0x04285): "BoundFunctionNameAccessor",
+  ("old_space", 0x0429d): "ErrorStackAccessor",
+  ("old_space", 0x042b5): "FunctionArgumentsAccessor",
+  ("old_space", 0x042cd): "FunctionCallerAccessor",
+  ("old_space", 0x042e5): "FunctionNameAccessor",
+  ("old_space", 0x042fd): "FunctionLengthAccessor",
+  ("old_space", 0x04315): "FunctionPrototypeAccessor",
+  ("old_space", 0x0432d): "SharedArrayLengthAccessor",
+  ("old_space", 0x04345): "StringLengthAccessor",
+  ("old_space", 0x0435d): "ValueUnavailableAccessor",
+  ("old_space", 0x04375): "WrappedFunctionLengthAccessor",
+  ("old_space", 0x0438d): "WrappedFunctionNameAccessor",
+  ("old_space", 0x043a5): "ExternalMap",
+  ("old_space", 0x043cd): "InvalidPrototypeValidityCell",
+  ("old_space", 0x043d5): "JSMessageObjectMap",
+  ("old_space", 0x043fd): "EmptyScript",
+  ("old_space", 0x04441): "ManyClosuresCell",
+  ("old_space", 0x0444d): "ArrayConstructorProtector",
+  ("old_space", 0x04461): "NoElementsProtector",
+  ("old_space", 0x04475): "MegaDOMProtector",
+  ("old_space", 0x04489): "IsConcatSpreadableProtector",
+  ("old_space", 0x0449d): "ArraySpeciesProtector",
+  ("old_space", 0x044b1): "TypedArraySpeciesProtector",
+  ("old_space", 0x044c5): "PromiseSpeciesProtector",
+  ("old_space", 0x044d9): "RegExpSpeciesProtector",
+  ("old_space", 0x044ed): "StringLengthProtector",
+  ("old_space", 0x04501): "ArrayIteratorProtector",
+  ("old_space", 0x04515): "ArrayBufferDetachingProtector",
+  ("old_space", 0x04529): "PromiseHookProtector",
+  ("old_space", 0x0453d): "PromiseResolveProtector",
+  ("old_space", 0x04551): "MapIteratorProtector",
+  ("old_space", 0x04565): "PromiseThenProtector",
+  ("old_space", 0x04579): "SetIteratorProtector",
+  ("old_space", 0x0458d): "StringIteratorProtector",
+  ("old_space", 0x045a1): "StringSplitCache",
+  ("old_space", 0x049a9): "RegExpMultipleCache",
+  ("old_space", 0x04db1): "BuiltinsConstantsTable",
+  ("old_space", 0x05211): "AsyncFunctionAwaitRejectSharedFun",
+  ("old_space", 0x05235): "AsyncFunctionAwaitResolveSharedFun",
+  ("old_space", 0x05259): "AsyncGeneratorAwaitRejectSharedFun",
+  ("old_space", 0x0527d): "AsyncGeneratorAwaitResolveSharedFun",
+  ("old_space", 0x052a1): "AsyncGeneratorYieldWithAwaitResolveSharedFun",
+  ("old_space", 0x052c5): "AsyncGeneratorReturnResolveSharedFun",
+  ("old_space", 0x052e9): "AsyncGeneratorReturnClosedRejectSharedFun",
+  ("old_space", 0x0530d): "AsyncGeneratorReturnClosedResolveSharedFun",
+  ("old_space", 0x05331): "AsyncIteratorValueUnwrapSharedFun",
+  ("old_space", 0x05355): "PromiseAllResolveElementSharedFun",
+  ("old_space", 0x05379): "PromiseAllSettledResolveElementSharedFun",
+  ("old_space", 0x0539d): "PromiseAllSettledRejectElementSharedFun",
+  ("old_space", 0x053c1): "PromiseAnyRejectElementSharedFun",
+  ("old_space", 0x053e5): "PromiseCapabilityDefaultRejectSharedFun",
+  ("old_space", 0x05409): "PromiseCapabilityDefaultResolveSharedFun",
+  ("old_space", 0x0542d): "PromiseCatchFinallySharedFun",
+  ("old_space", 0x05451): "PromiseGetCapabilitiesExecutorSharedFun",
+  ("old_space", 0x05475): "PromiseThenFinallySharedFun",
+  ("old_space", 0x05499): "PromiseThrowerFinallySharedFun",
+  ("old_space", 0x054bd): "PromiseValueThunkFinallySharedFun",
+  ("old_space", 0x054e1): "ProxyRevokeSharedFun",
+  ("old_space", 0x05505): "ShadowRealmImportValueFulfilledSFI",
+  ("old_space", 0x05529): "SourceTextModuleExecuteAsyncModuleFulfilledSFI",
+  ("old_space", 0x0554d): "SourceTextModuleExecuteAsyncModuleRejectedSFI",
 }
 
 # Lower 32 bits of first page addresses for various heap spaces.
 HEAP_FIRST_PAGES = {
   0x000c0000: "old_space",
-  0x00100000: "map_space",
   0x00000000: "read_only_space",
 }
 
diff --git a/deps/v8/tools/wasm/module-inspector.cc b/deps/v8/tools/wasm/module-inspector.cc
index a31de1446ca76a..267542b24ed76d 100644
--- a/deps/v8/tools/wasm/module-inspector.cc
+++ b/deps/v8/tools/wasm/module-inspector.cc
@@ -9,7 +9,6 @@
 
 #include "include/libplatform/libplatform.h"
 #include "include/v8-initialization.h"
-#include "src/wasm/function-body-decoder-impl.h"
 #include "src/wasm/module-decoder-impl.h"
 #include "src/wasm/names-provider.h"
 #include "src/wasm/string-builder-multiline.h"
@@ -235,7 +234,6 @@ class ExtendedFunctionDis : public FunctionBodyDisassembler {
 
     // Decode and print locals.
     uint32_t locals_length;
-    InitializeLocalsFromSig();
     DecodeLocals(pc_, &locals_length);
     if (failed()) {
       // TODO(jkummerow): Better error handling.
diff --git a/deps/v8/tools/whitespace.txt b/deps/v8/tools/whitespace.txt
index 60b58be703c2d3..34d64218ba44b4 100644
--- a/deps/v8/tools/whitespace.txt
+++ b/deps/v8/tools/whitespace.txt
@@ -7,7 +7,7 @@ A Smi balks into a war and says:
 The doubles heard this and started to unbox.
 The Smi looked at them when a crazy v8-autoroll account showed up...
 The autoroller bought a round of Himbeerbrause. Suddenly.......
-The bartender starts to shake the bottles............................
+The bartender starts to shake the bottles.............................
 I can't add trailing whitespaces, so I'm adding this line............
 I'm starting to think that just adding trailing whitespaces might not be bad.
 
diff --git a/deps/zlib/BUILD.gn b/deps/zlib/BUILD.gn
index 5f8873357d35d1..b85067a12bd86d 100644
--- a/deps/zlib/BUILD.gn
+++ b/deps/zlib/BUILD.gn
@@ -1,9 +1,13 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Copyright 2013 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
 import("//build/config/compiler/compiler.gni")
 
+if (build_with_chromium) {
+  import("//testing/test.gni")
+}
+
 if (current_cpu == "arm" || current_cpu == "arm64") {
   import("//build/config/arm.gni")
 }
@@ -14,10 +18,49 @@ config("zlib_config") {
 
 config("zlib_internal_config") {
   defines = [ "ZLIB_IMPLEMENTATION" ]
+
+  if (!is_debug) {
+    # Build code using -O3, see: crbug.com/1084371.
+    configs = [ "//build/config/compiler:optimize_speed" ]
+  }
+  if (is_debug || use_libfuzzer) {
+    # Enable zlib's asserts in debug and fuzzer builds.
+    defines += [ "ZLIB_DEBUG" ]
+  }
+
+  if (is_win && !is_clang) {
+    # V8 supports building with msvc, these silence some warnings that
+    # causes compilation to fail (https://crbug.com/1255096).
+    cflags = [
+      "/wd4244",
+      "/wd4100",
+      "/wd4702",
+      "/wd4127",
+    ]
+  }
+}
+
+source_set("zlib_common_headers") {
+  visibility = [ ":*" ]
+
+  sources = [
+    "chromeconf.h",
+    "deflate.h",
+    "inffast.h",
+    "inffixed.h",
+    "inflate.h",
+    "inftrees.h",
+    "zconf.h",
+    "zlib.h",
+    "zutil.h",
+  ]
 }
 
 use_arm_neon_optimizations = false
-if (current_cpu == "arm" || current_cpu == "arm64") {
+if ((current_cpu == "arm" || current_cpu == "arm64") &&
+    !(is_win && !is_clang)) {
+  # TODO(richard.townsend@arm.com): Optimizations temporarily disabled for
+  # Windows on Arm MSVC builds, see http://crbug.com/v8/10012.
   if (arm_use_neon) {
     use_arm_neon_optimizations = true
   }
@@ -29,6 +72,11 @@ use_x86_x64_optimizations =
 config("zlib_adler32_simd_config") {
   if (use_x86_x64_optimizations) {
     defines = [ "ADLER32_SIMD_SSSE3" ]
+    if (is_win) {
+      defines += [ "X86_WINDOWS" ]
+    } else {
+      defines += [ "X86_NOT_WINDOWS" ]
+    }
   }
 
   if (use_arm_neon_optimizations) {
@@ -55,16 +103,13 @@ source_set("zlib_adler32_simd") {
       "adler32_simd.c",
       "adler32_simd.h",
     ]
-    if (!is_debug) {
-      # Use optimize_speed (-O3) to output the _smallest_ code.
-      configs -= [ "//build/config/compiler:default_optimization" ]
-      configs += [ "//build/config/compiler:optimize_speed" ]
-    }
   }
 
   configs += [ ":zlib_internal_config" ]
 
   public_configs = [ ":zlib_adler32_simd_config" ]
+
+  public_deps = [ ":zlib_common_headers" ]
 }
 
 if (use_arm_neon_optimizations) {
@@ -78,6 +123,8 @@ if (use_arm_neon_optimizations) {
         defines += [ "ARMV8_OS_ANDROID" ]
       } else if (is_linux || is_chromeos) {
         defines += [ "ARMV8_OS_LINUX" ]
+      } else if (is_mac) {
+        defines += [ "ARMV8_OS_MACOS" ]
       } else if (is_fuchsia) {
         defines += [ "ARMV8_OS_FUCHSIA" ]
       } else if (is_win) {
@@ -94,37 +141,23 @@ if (use_arm_neon_optimizations) {
     if (!is_ios) {
       include_dirs = [ "." ]
 
-      if (is_android) {
-        import("//build/config/android/config.gni")
-        if (defined(android_ndk_root) && android_ndk_root != "") {
-          deps = [
-            "//third_party/android_ndk:cpu_features",
-          ]
-        } else {
-          assert(false, "CPU detection requires the Android NDK")
-        }
-      } else if (!is_win && !is_clang) {
+      if (!is_win && !is_clang) {
         assert(!use_thin_lto,
                "ThinLTO fails mixing different module-level targets")
-        cflags_c = [ "-march=armv8-a+crc" ]
+        cflags_c = [ "-march=armv8-a+aes+crc" ]
       }
 
       sources = [
-        "arm_features.c",
-        "arm_features.h",
         "crc32_simd.c",
         "crc32_simd.h",
       ]
-
-      if (!is_debug) {
-        configs -= [ "//build/config/compiler:default_optimization" ]
-        configs += [ "//build/config/compiler:optimize_speed" ]
-      }
     }
 
     configs += [ ":zlib_internal_config" ]
 
     public_configs = [ ":zlib_arm_crc32_config" ]
+
+    public_deps = [ ":zlib_common_headers" ]
   }
 }
 
@@ -139,6 +172,7 @@ config("zlib_inflate_chunk_simd_config") {
 
   if (use_arm_neon_optimizations) {
     defines = [ "INFLATE_CHUNK_SIMD_NEON" ]
+
     if (current_cpu == "arm64") {
       defines += [ "INFLATE_CHUNK_READ_64LE" ]
     }
@@ -157,22 +191,19 @@ source_set("zlib_inflate_chunk_simd") {
       "contrib/optimizations/inffast_chunk.h",
       "contrib/optimizations/inflate.c",
     ]
-
-    if (use_arm_neon_optimizations && !is_debug) {
-      # Here we trade better performance on newer/bigger ARMv8 cores
-      # for less perf on ARMv7, per crbug.com/772870#c40
-      configs -= [ "//build/config/compiler:default_optimization" ]
-      configs += [ "//build/config/compiler:optimize_speed" ]
-    }
   }
 
+  configs += [ ":zlib_internal_config" ]
+
+  # Needed for MSVC, which is still supported by V8 and PDFium. zlib uses K&R C
+  # style function declarations, which triggers warning C4131.
   configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [
-    ":zlib_internal_config",
-    "//build/config/compiler:no_chromium_code",
-  ]
+  configs += [ "//build/config/compiler:no_chromium_code" ]
+  configs += [ ":zlib_warnings" ]
 
   public_configs = [ ":zlib_inflate_chunk_simd_config" ]
+
+  public_deps = [ ":zlib_common_headers" ]
 }
 
 config("zlib_crc32_simd_config") {
@@ -188,6 +219,7 @@ source_set("zlib_crc32_simd") {
     sources = [
       "crc32_simd.c",
       "crc32_simd.h",
+      "crc_folding.c",
     ]
 
     if (!is_win || is_clang) {
@@ -201,39 +233,45 @@ source_set("zlib_crc32_simd") {
   configs += [ ":zlib_internal_config" ]
 
   public_configs = [ ":zlib_crc32_simd_config" ]
+
+  public_deps = [ ":zlib_common_headers" ]
 }
 
-source_set("zlib_x86_simd") {
+config("zlib_slide_hash_simd_config") {
+  if (use_x86_x64_optimizations) {
+    defines = [ "DEFLATE_SLIDE_HASH_SSE2" ]
+  }
+
+  if (use_arm_neon_optimizations) {
+    defines = [ "DEFLATE_SLIDE_HASH_NEON" ]
+  }
+}
+
+source_set("zlib_slide_hash_simd") {
   visibility = [ ":*" ]
 
   if (use_x86_x64_optimizations) {
-    sources = [
-      "crc_folding.c",
-      "fill_window_sse.c",
-    ]
+    sources = [ "slide_hash_simd.h" ]
+  }
 
-    if (!is_win || is_clang) {
-      cflags = [
-        "-msse4.2",
-        "-mpclmul",
-      ]
-    }
-  } else {
-    sources = [
-      "simd_stub.c",
-    ]
+  if (use_arm_neon_optimizations) {
+    sources = [ "slide_hash_simd.h" ]
   }
 
-  configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [
-    ":zlib_internal_config",
-    "//build/config/compiler:no_chromium_code",
-  ]
+  configs += [ ":zlib_internal_config" ]
+
+  public_configs = [ ":zlib_slide_hash_simd_config" ]
+
+  public_deps = [ ":zlib_common_headers" ]
 }
 
 config("zlib_warnings") {
-  if (is_clang && use_x86_x64_optimizations) {
-    cflags = [ "-Wno-incompatible-pointer-types" ]
+  if (is_clang) {
+    cflags = [
+      "-Wno-deprecated-non-prototype",
+      "-Wno-incompatible-pointer-types",
+      "-Wunused-variable",
+    ]
   }
 }
 
@@ -248,6 +286,8 @@ component("zlib") {
     "chromeconf.h",
     "compress.c",
     "contrib/optimizations/insert_string.h",
+    "cpu_features.c",
+    "cpu_features.h",
     "crc32.c",
     "crc32.h",
     "deflate.c",
@@ -267,7 +307,6 @@ component("zlib") {
     "trees.c",
     "trees.h",
     "uncompr.c",
-    "x86.h",
     "zconf.h",
     "zlib.h",
     "zutil.c",
@@ -277,35 +316,57 @@ component("zlib") {
   defines = []
   deps = []
 
+  if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {
+    # Apparently android_cronet bot builds with NEON disabled and
+    # we also should disable optimizations for iOS@x86 (a.k.a. simulator).
+    defines += [ "CPU_NO_SIMD" ]
+  }
+
+  if (is_ios) {
+    # iOS@ARM is a special case where we always have NEON but don't check
+    # for crypto extensions.
+    # TODO(cavalcantii): verify what is the current state of CPU features
+    # shipped on latest iOS devices.
+    defines += [ "ARM_OS_IOS" ]
+  }
+
   if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
     deps += [
       ":zlib_adler32_simd",
       ":zlib_inflate_chunk_simd",
+      ":zlib_slide_hash_simd",
     ]
 
     if (use_x86_x64_optimizations) {
-      sources += [ "x86.c" ]
       deps += [ ":zlib_crc32_simd" ]
     } else if (use_arm_neon_optimizations) {
-      sources += [ "contrib/optimizations/slide_hash_neon.h" ]
       deps += [ ":zlib_arm_crc32" ]
     }
   } else {
     sources += [ "inflate.c" ]
   }
 
+  if (is_android) {
+    import("//build/config/android/config.gni")
+    if (defined(android_ndk_root) && android_ndk_root != "") {
+      deps += [ "//third_party/android_ndk:cpu_features" ]
+    } else {
+      assert(false, "CPU detection requires the Android NDK")
+    }
+  }
+
   configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [ "//build/config/compiler:no_chromium_code" ]
+
+  public_configs = [ ":zlib_config" ]
+
   configs += [
     ":zlib_internal_config",
-    "//build/config/compiler:no_chromium_code",
 
     # Must be after no_chromium_code for warning flags to be ordered correctly.
     ":zlib_warnings",
   ]
 
-  public_configs = [ ":zlib_config" ]
-
-  deps += [ ":zlib_x86_simd" ]
   allow_circular_includes_from = deps
 }
 
@@ -313,8 +374,11 @@ config("minizip_warnings") {
   visibility = [ ":*" ]
 
   if (is_clang) {
-    # zlib uses `if ((a == b))` for some reason.
-    cflags = [ "-Wno-parentheses-equality" ]
+    cflags = [
+      # zlib uses `if ((a == b))` for some reason.
+      "-Wno-parentheses-equality",
+      "-Wno-deprecated-non-prototype",
+    ]
   }
 }
 
@@ -337,43 +401,120 @@ static_library("minizip") {
     ]
   }
 
-  if (is_mac || is_ios || is_android || is_nacl) {
+  if (is_apple || is_android || is_nacl) {
     # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We
     # use fopen, ftell, and fseek instead on these systems.
     defines = [ "USE_FILE32API" ]
   }
 
-  deps = [
-    ":zlib",
-  ]
+  deps = [ ":zlib" ]
 
   configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [
-    "//build/config/compiler:no_chromium_code",
+  configs += [ "//build/config/compiler:no_chromium_code" ]
 
+  public_configs = [ ":zlib_config" ]
+
+  configs += [
     # Must be after no_chromium_code for warning flags to be ordered correctly.
     ":minizip_warnings",
   ]
-
-  public_configs = [ ":zlib_config" ]
 }
 
 executable("zlib_bench") {
   include_dirs = [ "." ]
 
-  sources = [
-    "contrib/bench/zlib_bench.cc",
-  ]
-
+  sources = [ "contrib/bench/zlib_bench.cc" ]
   if (!is_debug) {
     configs -= [ "//build/config/compiler:default_optimization" ]
     configs += [ "//build/config/compiler:optimize_speed" ]
   }
 
+  deps = [ ":zlib" ]
+
   configs -= [ "//build/config/compiler:chromium_code" ]
   configs += [ "//build/config/compiler:no_chromium_code" ]
+}
 
-  deps = [
-    ":zlib",
-  ]
+if (!is_win || target_os != "winuwp") {
+  executable("minizip_bin") {
+    include_dirs = [ "." ]
+
+    sources = [ "contrib/minizip/minizip.c" ]
+
+    if (is_clang) {
+      cflags = [
+        "-Wno-incompatible-pointer-types-discards-qualifiers",
+
+        "-Wno-deprecated-non-prototype",
+      ]
+    }
+
+    if (!is_debug) {
+      configs -= [ "//build/config/compiler:default_optimization" ]
+      configs += [ "//build/config/compiler:optimize_speed" ]
+    }
+
+    deps = [ ":minizip" ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+  }
+
+  executable("miniunz_bin") {
+    include_dirs = [ "." ]
+
+    sources = [ "contrib/minizip/miniunz.c" ]
+
+    if (is_clang) {
+      cflags = [
+        "-Wno-incompatible-pointer-types-discards-qualifiers",
+        "-Wno-deprecated-non-prototype",
+      ]
+    }
+
+    if (!is_debug) {
+      configs -= [ "//build/config/compiler:default_optimization" ]
+      configs += [ "//build/config/compiler:optimize_speed" ]
+    }
+
+    deps = [ ":minizip" ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+  }
+}
+
+if (build_with_chromium) {
+  test("zlib_unittests") {
+    testonly = true
+
+    sources = [
+      "contrib/tests/infcover.cc",
+      "contrib/tests/infcover.h",
+      "contrib/tests/run_all_unittests.cc",
+      "contrib/tests/utils_unittest.cc",
+      "google/compression_utils_unittest.cc",
+      "google/zip_reader_unittest.cc",
+      "google/zip_unittest.cc",
+    ]
+
+    data = [ "google/test/data/" ]
+
+    deps = [
+      ":zlib",
+      "google:compression_utils",
+      "google:zip",
+      "//base/test:test_support",
+      "//testing/gtest",
+    ]
+
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
+
+    include_dirs = [
+      "//third_party/googletest/src/googletest/include/gtest",
+      ".",
+      "google",
+    ]
+  }
 }
diff --git a/deps/zlib/DIR_METADATA b/deps/zlib/DIR_METADATA
new file mode 100644
index 00000000000000..d366dc732137cd
--- /dev/null
+++ b/deps/zlib/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail: {
+  component: "Internals"
+}
diff --git a/deps/zlib/LICENSE b/deps/zlib/LICENSE
index 9f056865b5719d..8aca25d8c7a133 100644
--- a/deps/zlib/LICENSE
+++ b/deps/zlib/LICENSE
@@ -1,6 +1,6 @@
-version 1.2.11, January 15th, 2017
+version 1.2.12, March 27th, 2022
 
-Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
 
 This software is provided 'as-is', without any express or implied
 warranty.  In no event will the authors be held liable for any damages
diff --git a/deps/zlib/OWNERS b/deps/zlib/OWNERS
index 069bcd8c2a1445..ecffb59f051501 100644
--- a/deps/zlib/OWNERS
+++ b/deps/zlib/OWNERS
@@ -1,7 +1,5 @@
 agl@chromium.org
 cavalcantii@chromium.org
 cblume@chromium.org
-mtklein@chromium.org
-scroggo@chromium.org
-
-# COMPONENT: Internals
+noel@chromium.org
+scroggo@google.com
diff --git a/deps/zlib/README.chromium b/deps/zlib/README.chromium
index 3d90f79be2ffc2..190430f5325ce6 100644
--- a/deps/zlib/README.chromium
+++ b/deps/zlib/README.chromium
@@ -1,7 +1,8 @@
 Name: zlib
 Short Name: zlib
 URL: http://zlib.net/
-Version: 1.2.11
+Version: 1.2.13
+CPEPrefix: cpe:/a:zlib:zlib:1.2.13
 Security Critical: yes
 License: Custom license
 License File: LICENSE
@@ -26,3 +27,6 @@ Local Modifications:
  - Plus the changes in 'patches' folder.
  - Code in contrib/ other than contrib/minizip was added to match zlib's
    contributor layout.
+ - In sync with 1.2.13 official release
+ - ZIP reader modified to allow for progress callbacks during extraction.
+ - ZIP reader modified to add detection of AES encrypted content.
diff --git a/deps/zlib/adler32.c b/deps/zlib/adler32.c
index a42f35fce2a2e0..8f8fbb904891ae 100644
--- a/deps/zlib/adler32.c
+++ b/deps/zlib/adler32.c
@@ -59,10 +59,8 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
 #  define MOD63(a) a %= BASE
 #endif
 
-#if defined(ADLER32_SIMD_SSSE3)
-#include "adler32_simd.h"
-#include "x86.h"
-#elif defined(ADLER32_SIMD_NEON)
+#include "cpu_features.h"
+#if defined(ADLER32_SIMD_SSSE3) || defined(ADLER32_SIMD_NEON)
 #include "adler32_simd.h"
 #endif
 
@@ -76,10 +74,10 @@ uLong ZEXPORT adler32_z(adler, buf, len)
     unsigned n;
 
 #if defined(ADLER32_SIMD_SSSE3)
-    if (x86_cpu_enable_ssse3 && buf && len >= 64)
+    if (buf != Z_NULL && len >= 64 && x86_cpu_enable_ssse3)
         return adler32_simd_(adler, buf, len);
 #elif defined(ADLER32_SIMD_NEON)
-    if (buf && len >= 64)
+    if (buf != Z_NULL && len >= 64)
         return adler32_simd_(adler, buf, len);
 #endif
 
@@ -108,7 +106,7 @@ uLong ZEXPORT adler32_z(adler, buf, len)
      */
     if (buf == Z_NULL) {
         if (!len) /* Assume user is calling adler32(0, NULL, 0); */
-            x86_check_features();
+            cpu_check_features();
         return 1L;
     }
 #else
diff --git a/deps/zlib/adler32_simd.c b/deps/zlib/adler32_simd.c
index f8b07297b93840..d79b3886a230a1 100644
--- a/deps/zlib/adler32_simd.c
+++ b/deps/zlib/adler32_simd.c
@@ -1,6 +1,6 @@
 /* adler32_simd.c
  *
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  *
diff --git a/deps/zlib/adler32_simd.h b/deps/zlib/adler32_simd.h
index 52bb14d16751c8..0b2361a5174f7a 100644
--- a/deps/zlib/adler32_simd.h
+++ b/deps/zlib/adler32_simd.h
@@ -1,6 +1,6 @@
 /* adler32_simd.h
  *
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
diff --git a/deps/zlib/arm_features.c b/deps/zlib/arm_features.c
deleted file mode 100644
index f5641c39bbce97..00000000000000
--- a/deps/zlib/arm_features.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* arm_features.c -- ARM processor features detection.
- *
- * Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the Chromium source repository LICENSE file.
- */
-
-#include "arm_features.h"
-#include "zutil.h"
-#include <stdint.h>
-
-int ZLIB_INTERNAL arm_cpu_enable_crc32 = 0;
-int ZLIB_INTERNAL arm_cpu_enable_pmull = 0;
-
-#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA)
-#include <pthread.h>
-#endif
-
-#if defined(ARMV8_OS_ANDROID)
-#include <cpu-features.h>
-#elif defined(ARMV8_OS_LINUX)
-#include <asm/hwcap.h>
-#include <sys/auxv.h>
-#elif defined(ARMV8_OS_FUCHSIA)
-#include <zircon/features.h>
-#include <zircon/syscalls.h>
-#include <zircon/types.h>
-#elif defined(ARMV8_OS_WINDOWS)
-#include <windows.h>
-#else
-#error arm_features.c ARM feature detection in not defined for your platform
-#endif
-
-static void _arm_check_features(void);
-
-#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA)
-static pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT;
-void ZLIB_INTERNAL arm_check_features(void)
-{
-    pthread_once(&cpu_check_inited_once, _arm_check_features);
-}
-#elif defined(ARMV8_OS_WINDOWS)
-static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT;
-static BOOL CALLBACK _arm_check_features_forwarder(PINIT_ONCE once, PVOID param, PVOID* context)
-{
-    _arm_check_features();
-    return TRUE;
-}
-void ZLIB_INTERNAL arm_check_features(void)
-{
-    InitOnceExecuteOnce(&cpu_check_inited_once, _arm_check_features_forwarder,
-                        NULL, NULL);
-}
-#endif
-
-/*
- * See http://bit.ly/2CcoEsr for run-time detection of ARM features and also
- * crbug.com/931275 for android_getCpuFeatures() use in the Android sandbox.
- */
-static void _arm_check_features(void)
-{
-#if defined(ARMV8_OS_ANDROID) && defined(__aarch64__)
-    uint64_t features = android_getCpuFeatures();
-    arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM64_FEATURE_CRC32);
-    arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM64_FEATURE_PMULL);
-#elif defined(ARMV8_OS_ANDROID) /* aarch32 */
-    uint64_t features = android_getCpuFeatures();
-    arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM_FEATURE_CRC32);
-    arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM_FEATURE_PMULL);
-#elif defined(ARMV8_OS_LINUX) && defined(__aarch64__)
-    unsigned long features = getauxval(AT_HWCAP);
-    arm_cpu_enable_crc32 = !!(features & HWCAP_CRC32);
-    arm_cpu_enable_pmull = !!(features & HWCAP_PMULL);
-#elif defined(ARMV8_OS_LINUX) && (defined(__ARM_NEON) || defined(__ARM_NEON__))
-    /* Query HWCAP2 for ARMV8-A SoCs running in aarch32 mode */
-    unsigned long features = getauxval(AT_HWCAP2);
-    arm_cpu_enable_crc32 = !!(features & HWCAP2_CRC32);
-    arm_cpu_enable_pmull = !!(features & HWCAP2_PMULL);
-#elif defined(ARMV8_OS_FUCHSIA)
-    uint32_t features;
-    zx_status_t rc = zx_system_get_features(ZX_FEATURE_KIND_CPU, &features);
-    if (rc != ZX_OK || (features & ZX_ARM64_FEATURE_ISA_ASIMD) == 0)
-        return;  /* Report nothing if ASIMD(NEON) is missing */
-    arm_cpu_enable_crc32 = !!(features & ZX_ARM64_FEATURE_ISA_CRC32);
-    arm_cpu_enable_pmull = !!(features & ZX_ARM64_FEATURE_ISA_PMULL);
-#elif defined(ARMV8_OS_WINDOWS)
-    arm_cpu_enable_crc32 = IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE);
-    arm_cpu_enable_pmull = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE);
-#endif
-}
diff --git a/deps/zlib/arm_features.h b/deps/zlib/arm_features.h
deleted file mode 100644
index 09fec259b1c924..00000000000000
--- a/deps/zlib/arm_features.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* arm_features.h -- ARM processor features detection.
- *
- * Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the Chromium source repository LICENSE file.
- */
-
-#include "zlib.h"
-
-extern int arm_cpu_enable_crc32;
-extern int arm_cpu_enable_pmull;
-
-void arm_check_features(void);
diff --git a/deps/zlib/chromeconf.h b/deps/zlib/chromeconf.h
index 666093d696a583..5b91c86442105a 100644
--- a/deps/zlib/chromeconf.h
+++ b/deps/zlib/chromeconf.h
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Chromium Authors. All rights reserved.
+/* Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
@@ -49,6 +49,9 @@
 #define crc32 Cr_z_crc32
 #define crc32_combine Cr_z_crc32_combine
 #define crc32_combine64 Cr_z_crc32_combine64
+#define crc32_combine_gen64 Cr_z_crc32_combine_gen64
+#define crc32_combine_gen Cr_z_crc32_combine_gen
+#define crc32_combine_op Cr_z_crc32_combine_op
 #define crc32_z Cr_z_crc32_z
 #define deflate Cr_z_deflate
 #define deflateBound Cr_z_deflateBound
@@ -191,5 +194,10 @@
 #define arm_cpu_enable_pmull Cr_z_arm_cpu_enable_pmull
 #define arm_check_features Cr_z_arm_check_features
 #define armv8_crc32_little Cr_z_armv8_crc32_little
+#define armv8_crc32_pmull_little Cr_z_armv8_crc32_pmull_little
+
+/* Symbols added by cpu_features.c */
+#define cpu_check_features Cr_z_cpu_check_features
+#define x86_cpu_enable_sse2 Cr_z_x86_cpu_enable_sse2
 
 #endif /* THIRD_PARTY_ZLIB_CHROMECONF_H_ */
diff --git a/deps/zlib/compress.c b/deps/zlib/compress.c
index 6e8517335da018..53f8d8d87f9b25 100644
--- a/deps/zlib/compress.c
+++ b/deps/zlib/compress.c
@@ -19,7 +19,7 @@
    memory, Z_BUF_ERROR if there was not enough room in the output buffer,
    Z_STREAM_ERROR if the level parameter is invalid.
 */
-int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
+int ZEXPORT compress2(dest, destLen, source, sourceLen, level)
     Bytef *dest;
     uLongf *destLen;
     const Bytef *source;
@@ -65,7 +65,7 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
 
 /* ===========================================================================
  */
-int ZEXPORT compress (dest, destLen, source, sourceLen)
+int ZEXPORT compress(dest, destLen, source, sourceLen)
     Bytef *dest;
     uLongf *destLen;
     const Bytef *source;
@@ -78,7 +78,7 @@ int ZEXPORT compress (dest, destLen, source, sourceLen)
      If the default memLevel or windowBits for deflateInit() is changed, then
    this function needs to be updated.
  */
-uLong ZEXPORT compressBound (sourceLen)
+uLong ZEXPORT compressBound(sourceLen)
     uLong sourceLen;
 {
     sourceLen = sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
diff --git a/deps/zlib/contrib/bench/check.sh b/deps/zlib/contrib/bench/check.sh
new file mode 100755
index 00000000000000..e6934605a4d4f5
--- /dev/null
+++ b/deps/zlib/contrib/bench/check.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+#
+# Copyright 2022 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the chromium source repository LICENSE file.
+#
+# Given a zlib_bench executable and some data files, run zlib_bench --check
+# over those data files, for all zlib types (gzip|zlib|raw) and compression
+# levels 1..9 for each type. Example:
+#
+#  check.sh ./out/Release/zlib_bench [--check-binary] ~/snappy/testdata/*
+#
+# The --check-binary option modifies --check output: the compressed data is
+# also written to the program output.
+
+ZLIB_BENCH="$1" && shift
+
+CHECK_TYPE="--check"
+if [[ "${1}" == "--check-binary" ]]; then
+  CHECK_TYPE="$1" && shift  # output compressed data too
+fi
+
+DATA_FILES="$*"
+
+echo ${ZLIB_BENCH} | grep -E "/(zlib_bench|a.out)$" > /dev/null
+if [[ $? != 0 ]] || [[ -z "${DATA_FILES}" ]]; then
+  echo "usage: check.sh zlib_bench [--check-binary] files ..." >&2
+  exit 1;
+fi
+
+for type in gzip zlib raw; do
+  for level in $(seq 1 9); do
+    ${ZLIB_BENCH} $type --compression $level ${CHECK_TYPE} ${DATA_FILES}
+  done
+done
diff --git a/deps/zlib/contrib/bench/zlib_bench.cc b/deps/zlib/contrib/bench/zlib_bench.cc
index 5dcdef09f36b76..8580319edf25bc 100644
--- a/deps/zlib/contrib/bench/zlib_bench.cc
+++ b/deps/zlib/contrib/bench/zlib_bench.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018 The Chromium Authors. All rights reserved.
+ * Copyright 2018 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  *
@@ -15,7 +15,7 @@
  * Note this code can be compiled outside of the Chromium build system against
  * the system zlib (-lz) with g++ or clang++ as follows:
  *
- *   g++|clang++ -O3 -Wall -std=c++11 -lstdc++ -lz zlib_bench.cc
+ *   g++|clang++ -O3 -Wall -std=c++11 zlib_bench.cc -lstdc++ -lz
  */
 
 #include <algorithm>
@@ -38,13 +38,14 @@ void error_exit(const char* error, int code) {
 }
 
 inline char* string_data(std::string* s) {
-  return s->empty() ? 0 : &*s->begin();
+  return s->empty() ? nullptr : &*s->begin();
 }
 
 struct Data {
   Data(size_t s) { data.reset(new (std::nothrow) char[size = s]); }
   std::unique_ptr<char[]> data;
   size_t size;
+  std::string name;
 };
 
 Data read_file_data_or_exit(const char* name) {
@@ -66,6 +67,7 @@ Data read_file_data_or_exit(const char* name) {
     exit(1);
   }
 
+  data.name = std::string(name);
   return data;
 }
 
@@ -99,10 +101,25 @@ const char* zlib_wrapper_name(zlib_wrapper type) {
   if (type == kWrapperZRAW)
     return "RAW";
   error_exit("bad wrapper type", int(type));
-  return 0;
+  return nullptr;
+}
+
+static int zlib_strategy = Z_DEFAULT_STRATEGY;
+
+const char* zlib_level_strategy_name(int compression_level) {
+  if (compression_level == 0)
+    return "";  // strategy is meaningless at level 0
+  if (zlib_strategy == Z_HUFFMAN_ONLY)
+    return "huffman ";
+  if (zlib_strategy == Z_RLE)
+    return "rle ";
+  if (zlib_strategy == Z_DEFAULT_STRATEGY)
+    return "";
+  error_exit("bad strategy", zlib_strategy);
+  return nullptr;
 }
 
-static int zlib_compression_level;
+static int zlib_compression_level = Z_DEFAULT_COMPRESSION;
 
 void zlib_compress(
     const zlib_wrapper type,
@@ -119,7 +136,7 @@ void zlib_compress(
   memset(&stream, 0, sizeof(stream));
 
   int result = deflateInit2(&stream, zlib_compression_level, Z_DEFLATED,
-      zlib_stream_wrapper_type(type), MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY);
+      zlib_stream_wrapper_type(type), MAX_MEM_LEVEL, zlib_strategy);
   if (result != Z_OK)
     error_exit("deflateInit2 failed", result);
 
@@ -129,6 +146,8 @@ void zlib_compress(
   stream.avail_in = (uInt)input_size;
 
   result = deflate(&stream, Z_FINISH);
+  if (stream.avail_in > 0)
+    error_exit("compress: input was not consumed", Z_DATA_ERROR);
   if (result == Z_STREAM_END)
     output_size = stream.total_out;
   result |= deflateEnd(&stream);
@@ -178,14 +197,67 @@ void verify_equal(const char* input, size_t size, std::string* output) {
   exit(3);
 }
 
-void zlib_file(const char* name, const zlib_wrapper type) {
+void check_file(const Data& file, zlib_wrapper type, int mode) {
+  printf("%s %d %s%s\n", zlib_wrapper_name(type), zlib_compression_level,
+    zlib_level_strategy_name(zlib_compression_level), file.name.c_str());
+
+  // Compress the file data.
+  std::string compressed;
+  zlib_compress(type, file.data.get(), file.size, &compressed, true);
+
+  // Output compressed data integrity check: the data crc32.
+  unsigned long check = crc32_z(0, Z_NULL, 0);
+  const Bytef* data = (const Bytef*)compressed.data();
+  static_assert(sizeof(z_size_t) == sizeof(size_t), "z_size_t size");
+  check = crc32_z(check, data, (z_size_t)compressed.size());
+
+  const size_t compressed_length = compressed.size();
+  printf("data crc32 %.8lx length %zu\n", check, compressed_length);
+
+  // Output gzip or zlib DEFLATE stream internal check data.
+  if (type == kWrapperGZIP) {
+    uint32_t prev_word, last_word;
+    data += compressed_length - 8;
+    prev_word = data[3] << 24 | data[2] << 16 | data[1] << 8 | data[0];
+    data += 4;  // last compressed data word
+    last_word = data[3] << 24 | data[2] << 16 | data[1] << 8 | data[0];
+    printf("gzip crc32 %.8x length %u\n", prev_word, last_word);
+  } else if (type == kWrapperZLIB) {
+    uint32_t last_word;
+    data += compressed_length - 4;
+    last_word = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
+    printf("zlib adler %.8x\n", last_word);
+  }
+
+  if (mode == 2)  // --check-binary: output compressed data.
+    fwrite(compressed.data(), compressed_length, 1, stdout);
+
+  if (fflush(stdout), ferror(stdout))
+    error_exit("check file: error writing output", 3);
+}
+
+void zlib_file(const char* name, zlib_wrapper type, int width, int check) {
   /*
    * Read the file data.
    */
-  const auto file = read_file_data_or_exit(name);
+  struct Data file = read_file_data_or_exit(name);
   const int length = static_cast<int>(file.size);
   const char* data = file.data.get();
-  printf("%-40s :\n", name);
+
+  /*
+   * Compress file: report output data checks and return.
+   */
+  if (check) {
+    file.name = file.name.substr(file.name.find_last_of("/\\") + 1);
+    check_file(file, type, check);
+    return;
+  }
+
+  /*
+   * Report compression strategy and file name.
+   */
+  const char* strategy = zlib_level_strategy_name(zlib_compression_level);
+  printf("%s%-40s :\n", strategy, name);
 
   /*
    * Chop the data into blocks.
@@ -263,9 +335,9 @@ void zlib_file(const char* name, const zlib_wrapper type) {
   double inflate_rate_max = length * repeats / mega_byte / utime[0];
 
   // type, block size, compression ratio, etc
-  printf("%s: [b %dM] bytes %6d -> %6u %4.1f%%",
-    zlib_wrapper_name(type), block_size / (1 << 20), length,
-    static_cast<unsigned>(output_length), output_length * 100.0 / length);
+  printf("%s: [b %dM] bytes %*d -> %*u %4.2f%%",
+    zlib_wrapper_name(type), block_size / (1 << 20), width, length, width,
+    unsigned(output_length), output_length * 100.0 / length);
 
   // compress / uncompress median (max) rates
   printf(" comp %5.1f (%5.1f) MB/s uncomp %5.1f (%5.1f) MB/s\n",
@@ -276,18 +348,25 @@ static int argn = 1;
 
 char* get_option(int argc, char* argv[], const char* option) {
   if (argn < argc)
-    return !strcmp(argv[argn], option) ? argv[argn++] : 0;
-  return 0;
+    return !strcmp(argv[argn], option) ? argv[argn++] : nullptr;
+  return nullptr;
 }
 
-bool get_compression(int argc, char* argv[], int* value) {
+bool get_compression(int argc, char* argv[], int& value) {
   if (argn < argc)
-    *value = atoi(argv[argn++]);
-  return *value >= 1 && *value <= 9;
+    value = isdigit(argv[argn][0]) ? atoi(argv[argn++]) : -1;
+  return value >= 0 && value <= 9;
+}
+
+void get_field_width(int argc, char* argv[], int& value) {
+  value = atoi(argv[argn++]);
 }
 
 void usage_exit(const char* program) {
-  printf("usage: %s gzip|zlib|raw [--compression 1:9] files...\n", program);
+  static auto* options = "gzip|zlib|raw"
+    " [--compression 0:9] [--huffman|--rle] [--field width] [--check]";
+  printf("usage: %s %s files ...\n", program, options);
+  printf("zlib version: %s\n", ZLIB_VERSION);
   exit(1);
 }
 
@@ -302,15 +381,35 @@ int main(int argc, char* argv[]) {
   else
     usage_exit(argv[0]);
 
-  if (!get_option(argc, argv, "--compression"))
-    zlib_compression_level = Z_DEFAULT_COMPRESSION;
-  else if (!get_compression(argc, argv, &zlib_compression_level))
-    usage_exit(argv[0]);
+  int size_field_width = 0;
+  int file_check = 0;
+
+  while (argn < argc && argv[argn][0] == '-') {
+    if (get_option(argc, argv, "--compression")) {
+      if (!get_compression(argc, argv, zlib_compression_level))
+        usage_exit(argv[0]);
+    } else if (get_option(argc, argv, "--huffman")) {
+      zlib_strategy = Z_HUFFMAN_ONLY;
+    } else if (get_option(argc, argv, "--rle")) {
+      zlib_strategy = Z_RLE;
+    } else if (get_option(argc, argv, "--check")) {
+      file_check = 1;
+    } else if (get_option(argc, argv, "--check-binary")) {
+      file_check = 2;
+    } else if (get_option(argc, argv, "--field")) {
+      get_field_width(argc, argv, size_field_width);
+    } else {
+      usage_exit(argv[0]);
+    }
+  }
 
   if (argn >= argc)
     usage_exit(argv[0]);
+
+  if (size_field_width < 6)
+    size_field_width = 6;
   while (argn < argc)
-    zlib_file(argv[argn++], type);
+    zlib_file(argv[argn++], type, size_field_width, file_check);
 
   return 0;
 }
diff --git a/deps/zlib/contrib/minizip/README.chromium b/deps/zlib/contrib/minizip/README.chromium
new file mode 100644
index 00000000000000..1ad489a6780db2
--- /dev/null
+++ b/deps/zlib/contrib/minizip/README.chromium
@@ -0,0 +1,15 @@
+Name: ZIP file API for reading file entries in a ZIP archive
+Short Name: minizip
+URL: https://github.com/madler/zlib/tree/master/contrib/minizip
+Version: 1.2.12
+License: Zlib
+Security Critical: yes
+
+Description:
+Minizip provides API on top of zlib that can enumerate and extract ZIP archive
+files. See minizip.md for chromium build instructions.
+
+Local Modifications:
+- Add parsing of the 'Info-ZIP Unicode Path Extra Field' as described in
+  https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT section 4.6.9.
+  (see crrev.com/1002476)
diff --git a/deps/zlib/contrib/minizip/iowin32.c b/deps/zlib/contrib/minizip/iowin32.c
index 246ceb91a13942..c6bc314b3c28af 100644
--- a/deps/zlib/contrib/minizip/iowin32.c
+++ b/deps/zlib/contrib/minizip/iowin32.c
@@ -31,14 +31,12 @@
 #define _WIN32_WINNT 0x601
 #endif
 
-#if _WIN32_WINNT >= _WIN32_WINNT_WIN8
-// see Include/shared/winapifamily.h in the Windows Kit
-#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
-#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
+#if !defined(IOWIN32_USING_WINRT_API)
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+// Windows Store or Universal Windows Platform
 #define IOWIN32_USING_WINRT_API 1
 #endif
 #endif
-#endif
 
 voidpf  ZCALLBACK win32_open_file_func  OF((voidpf opaque, const char* filename, int mode));
 uLong   ZCALLBACK win32_read_file_func  OF((voidpf opaque, voidpf stream, void* buf, uLong size));
diff --git a/deps/zlib/contrib/minizip/miniunz.c b/deps/zlib/contrib/minizip/miniunz.c
index 3d65401be5cdd7..08737f689a96f3 100644
--- a/deps/zlib/contrib/minizip/miniunz.c
+++ b/deps/zlib/contrib/minizip/miniunz.c
@@ -12,7 +12,7 @@
          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
 */
 
-#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
+#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!defined(__ANDROID_API__))
         #ifndef __USE_FILE_OFFSET64
                 #define __USE_FILE_OFFSET64
         #endif
@@ -27,7 +27,7 @@
         #endif
 #endif
 
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
 // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
 #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
 #define FTELLO_FUNC(stream) ftello(stream)
@@ -45,6 +45,7 @@
 #include <time.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <sys/stat.h>
 
 #ifdef _WIN32
 # include <direct.h>
@@ -97,7 +98,7 @@ void change_file_date(filename,dosdate,tmu_date)
   SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
   CloseHandle(hFile);
 #else
-#ifdef unix || __APPLE__
+#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
   struct utimbuf ut;
   struct tm newdate;
   newdate.tm_sec = tmu_date.tm_sec;
@@ -125,11 +126,9 @@ int mymkdir(dirname)
     const char* dirname;
 {
     int ret=0;
-#ifdef _WIN32
+#if defined(_WIN32)
     ret = _mkdir(dirname);
-#elif unix
-    ret = mkdir (dirname,0775);
-#elif __APPLE__
+#elif defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
     ret = mkdir (dirname,0775);
 #endif
     return ret;
diff --git a/deps/zlib/contrib/minizip/minizip.c b/deps/zlib/contrib/minizip/minizip.c
index 4288962ecef056..b794953c5c2393 100644
--- a/deps/zlib/contrib/minizip/minizip.c
+++ b/deps/zlib/contrib/minizip/minizip.c
@@ -12,8 +12,7 @@
          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
 */
 
-
-#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
+#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!defined(__ANDROID_API__))
         #ifndef __USE_FILE_OFFSET64
                 #define __USE_FILE_OFFSET64
         #endif
@@ -28,7 +27,7 @@
         #endif
 #endif
 
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
 // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
 #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
 #define FTELLO_FUNC(stream) ftello(stream)
@@ -94,7 +93,7 @@ uLong filetime(f, tmzip, dt)
   return ret;
 }
 #else
-#ifdef unix || __APPLE__
+#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
 uLong filetime(f, tmzip, dt)
     char *f;               /* name of file to get info on */
     tm_zip *tmzip;         /* return value: access, modific. and creation times */
diff --git a/deps/zlib/contrib/minizip/minizip.md b/deps/zlib/contrib/minizip/minizip.md
new file mode 100644
index 00000000000000..9f15dd23dec279
--- /dev/null
+++ b/deps/zlib/contrib/minizip/minizip.md
@@ -0,0 +1,9 @@
+Minizip is a library provided by //third_party/zlib [1]. Its zip and unzip
+tools can be built in a developer checkout for testing purposes with:
+
+```shell
+  autoninja -C out/Release minizip_bin
+  autoninja -C out/Release miniunz_bin
+```
+
+[1] Upstream is https://github.com/madler/zlib/tree/master/contrib/minizip
diff --git a/deps/zlib/contrib/minizip/unzip.c b/deps/zlib/contrib/minizip/unzip.c
index e8b2bc5c766c8a..0a1d8b4fe2cf78 100644
--- a/deps/zlib/contrib/minizip/unzip.c
+++ b/deps/zlib/contrib/minizip/unzip.c
@@ -1023,46 +1023,102 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
         while(acc < file_info.size_file_extra)
         {
             uLong headerId;
-                                                uLong dataSize;
+            uLong dataSize;
 
             if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK)
                 err=UNZ_ERRNO;
 
             if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK)
                 err=UNZ_ERRNO;
-
+            
             /* ZIP64 extra fields */
             if (headerId == 0x0001)
             {
-                                                        uLong uL;
-
-                                                                if(file_info.uncompressed_size == MAXU32)
-                                                                {
-                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
-                                                                                        err=UNZ_ERRNO;
-                                                                }
-
-                                                                if(file_info.compressed_size == MAXU32)
-                                                                {
-                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
-                                                                                  err=UNZ_ERRNO;
-                                                                }
-
-                                                                if(file_info_internal.offset_curfile == MAXU32)
-                                                                {
-                                                                        /* Relative Header offset */
-                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
-                                                                                err=UNZ_ERRNO;
-                                                                }
-
-                                                                if(file_info.disk_num_start == MAXU32)
-                                                                {
-                                                                        /* Disk Start Number */
-                                                                        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
-                                                                                err=UNZ_ERRNO;
-                                                                }
+                uLong uL;
+
+                if(file_info.uncompressed_size == MAXU32)
+                {
+                    if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
+                        err=UNZ_ERRNO;
+                }
+
+                if(file_info.compressed_size == MAXU32)
+                {
+                    if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
+                        err=UNZ_ERRNO;
+                }
+
+                if(file_info_internal.offset_curfile == MAXU32)
+                {
+                    /* Relative Header offset */
+                    if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
+                        err=UNZ_ERRNO;
+                }
+
+                if(file_info.disk_num_start == MAXU32)
+                {
+                    /* Disk Start Number */
+                    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
+                        err=UNZ_ERRNO;
+                }
 
             }
+            else if (headerId == 0x7075) /* Info-ZIP Unicode Path Extra Field */
+            {
+                int version = 0;
+
+                if (unz64local_getByte(&s->z_filefunc, s->filestream, &version) != UNZ_OK)
+                {
+                    err = UNZ_ERRNO;
+                }
+                if (version != 1)
+                {
+                    if (ZSEEK64(s->z_filefunc, s->filestream,dataSize - 1, ZLIB_FILEFUNC_SEEK_CUR) != 0)
+                    {
+                        err = UNZ_ERRNO;
+                    }
+                }
+                else
+                {
+                    uLong uCrc, uHeaderCrc, fileNameSize;
+
+                    if (unz64local_getLong(&s->z_filefunc, s->filestream, &uCrc) != UNZ_OK)
+                    {
+                        err = UNZ_ERRNO;
+                    }
+                    uHeaderCrc = crc32(0, (const unsigned char *)szFileName, file_info.size_filename);
+                    fileNameSize = dataSize - (2 * sizeof (short) + 1);
+                    /* Check CRC against file name in the header. */
+                    if (uHeaderCrc != uCrc)
+                    {
+                        if (ZSEEK64(s->z_filefunc, s->filestream, fileNameSize, ZLIB_FILEFUNC_SEEK_CUR) != 0)
+                        {
+                            err = UNZ_ERRNO;
+                        }
+                    }
+                    else
+                    {
+                        uLong uSizeRead;
+
+                        if (fileNameSize < fileNameBufferSize)
+                        {
+                             *(szFileName + fileNameSize) = '\0';
+                            uSizeRead = fileNameSize;
+                        }
+                        else
+                        {
+                            uSizeRead = fileNameBufferSize;
+                        }
+                        if ((fileNameSize > 0) && (fileNameBufferSize > 0))
+                        {
+                            if (ZREAD64(s->z_filefunc, s->filestream, szFileName, uSizeRead) != uSizeRead)
+                            {
+                                err = UNZ_ERRNO;
+                            }
+                        }
+                    }
+                }
+            }
             else
             {
                 if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0)
diff --git a/deps/zlib/contrib/optimizations/chunkcopy.h b/deps/zlib/contrib/optimizations/chunkcopy.h
index 8bcdadad05a817..db3c861ba4982a 100644
--- a/deps/zlib/contrib/optimizations/chunkcopy.h
+++ b/deps/zlib/contrib/optimizations/chunkcopy.h
@@ -1,6 +1,6 @@
 /* chunkcopy.h -- fast chunk copy and set operations
  * Copyright (C) 2017 ARM, Inc.
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
@@ -29,13 +29,23 @@
 #include <arm_neon.h>
 typedef uint8x16_t z_vec128i_t;
 #elif defined(INFLATE_CHUNK_SIMD_SSE2)
-#pragma GCC target ("sse2")
 #include <emmintrin.h>
 typedef __m128i z_vec128i_t;
 #else
 #error chunkcopy.h inflate chunk SIMD is not defined for your build target
 #endif
 
+/*
+ * Suppress MSan errors about copying uninitialized bytes (crbug.com/1376033).
+ */
+#define Z_DISABLE_MSAN
+#if defined(__has_feature)
+  #if __has_feature(memory_sanitizer)
+    #undef Z_DISABLE_MSAN
+    #define Z_DISABLE_MSAN __attribute__((no_sanitize("memory")))
+  #endif
+#endif
+
 /*
  * chunk copy type: the z_vec128i_t type size should be exactly 128-bits
  * and equal to CHUNKCOPY_CHUNK_SIZE.
@@ -83,7 +93,7 @@ static inline void storechunk(
 static inline unsigned char FAR* chunkcopy_core(
     unsigned char FAR* out,
     const unsigned char FAR* from,
-    unsigned len) {
+    unsigned len) Z_DISABLE_MSAN {
   const int bump = (--len % CHUNKCOPY_CHUNK_SIZE) + 1;
   storechunk(out, loadchunk(from));
   out += bump;
@@ -113,6 +123,10 @@ static inline unsigned char FAR* chunkcopy_core_safe(
   Assert(out + len <= limit, "chunk copy exceeds safety limit");
   if ((limit - out) < (ptrdiff_t)CHUNKCOPY_CHUNK_SIZE) {
     const unsigned char FAR* Z_RESTRICT rfrom = from;
+    Assert((uintptr_t)out - (uintptr_t)from >= len,
+           "invalid restrict in chunkcopy_core_safe");
+    Assert((uintptr_t)from - (uintptr_t)out >= len,
+           "invalid restrict in chunkcopy_core_safe");
     if (len & 8) {
       Z_BUILTIN_MEMCPY(out, rfrom, 8);
       out += 8;
@@ -149,7 +163,7 @@ static inline unsigned char FAR* chunkcopy_core_safe(
 static inline unsigned char FAR* chunkunroll_relaxed(
     unsigned char FAR* out,
     unsigned FAR* dist,
-    unsigned FAR* len) {
+    unsigned FAR* len) Z_DISABLE_MSAN {
   const unsigned char FAR* from = out - *dist;
   while (*dist < *len && *dist < CHUNKCOPY_CHUNK_SIZE) {
     storechunk(out, loadchunk(from));
@@ -339,6 +353,10 @@ static inline unsigned char FAR* chunkcopy_relaxed(
     unsigned char FAR* Z_RESTRICT out,
     const unsigned char FAR* Z_RESTRICT from,
     unsigned len) {
+  Assert((uintptr_t)out - (uintptr_t)from >= len,
+         "invalid restrict in chunkcopy_relaxed");
+  Assert((uintptr_t)from - (uintptr_t)out >= len,
+         "invalid restrict in chunkcopy_relaxed");
   return chunkcopy_core(out, from, len);
 }
 
@@ -361,6 +379,11 @@ static inline unsigned char FAR* chunkcopy_safe(
     unsigned len,
     unsigned char FAR* limit) {
   Assert(out + len <= limit, "chunk copy exceeds safety limit");
+  Assert((uintptr_t)out - (uintptr_t)from >= len,
+         "invalid restrict in chunkcopy_safe");
+  Assert((uintptr_t)from - (uintptr_t)out >= len,
+         "invalid restrict in chunkcopy_safe");
+
   return chunkcopy_core_safe(out, from, len, limit);
 }
 
@@ -407,6 +430,26 @@ static inline unsigned char FAR* chunkcopy_lapped_safe(
   return chunkcopy_lapped_relaxed(out, dist, len);
 }
 
+/* TODO(cavalcanti): see crbug.com/1110083. */
+static inline unsigned char FAR* chunkcopy_safe_ugly(unsigned char FAR* out,
+                                                     unsigned dist,
+                                                     unsigned len,
+                                                     unsigned char FAR* limit) {
+#if defined(__GNUC__) && !defined(__clang__)
+  /* Speed is the same as using chunkcopy_safe
+     w/ GCC on ARM (tested gcc 6.3 and 7.5) and avoids
+     undefined behavior.
+  */
+  return chunkcopy_core_safe(out, out - dist, len, limit);
+#elif defined(__clang__) && defined(ARMV8_OS_ANDROID) && !defined(__aarch64__)
+  /* Seems to perform better on 32bit (i.e. Android). */
+  return chunkcopy_core_safe(out, out - dist, len, limit);
+#else
+  /* Seems to perform better on 64bit. */
+  return chunkcopy_lapped_safe(out, dist, len, limit);
+#endif
+}
+
 /*
  * The chunk-copy code above deals with writing the decoded DEFLATE data to
  * the output with SIMD methods to increase decode speed. Reading the input
@@ -441,5 +484,6 @@ typedef unsigned long inflate_holder_t;
 #undef Z_STATIC_ASSERT
 #undef Z_RESTRICT
 #undef Z_BUILTIN_MEMCPY
+#undef Z_DISABLE_MSAN
 
 #endif /* CHUNKCOPY_H */
diff --git a/deps/zlib/contrib/optimizations/inffast_chunk.c b/deps/zlib/contrib/optimizations/inffast_chunk.c
index 4099edf3961d74..5b094873aeb97d 100644
--- a/deps/zlib/contrib/optimizations/inffast_chunk.c
+++ b/deps/zlib/contrib/optimizations/inffast_chunk.c
@@ -95,7 +95,7 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
     code const FAR *dcode;      /* local strm->distcode */
     unsigned lmask;             /* mask for first level of length codes */
     unsigned dmask;             /* mask for first level of distance codes */
-    code here;                  /* retrieved table entry */
+    code const *here;           /* retrieved table entry */
     unsigned op;                /* code bits, operation, extra bits, or */
                                 /*  window position, window bytes to copy */
     unsigned len;               /* match length, unused bytes */
@@ -139,20 +139,20 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
             bits += 8;
 #endif
         }
-        here = lcode[hold & lmask];
+        here = lcode + (hold & lmask);
       dolen:
-        op = (unsigned)(here.bits);
+        op = (unsigned)(here->bits);
         hold >>= op;
         bits -= op;
-        op = (unsigned)(here.op);
+        op = (unsigned)(here->op);
         if (op == 0) {                          /* literal */
-            Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+            Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ?
                     "inflate:         literal '%c'\n" :
-                    "inflate:         literal 0x%02x\n", here.val));
-            *out++ = (unsigned char)(here.val);
+                    "inflate:         literal 0x%02x\n", here->val));
+            *out++ = (unsigned char)(here->val);
         }
         else if (op & 16) {                     /* length base */
-            len = (unsigned)(here.val);
+            len = (unsigned)(here->val);
             op &= 15;                           /* number of extra bits */
             if (op) {
                 if (bits < op) {
@@ -182,14 +182,14 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
                 bits += 8;
 #endif
             }
-            here = dcode[hold & dmask];
+            here = dcode + (hold & dmask);
           dodist:
-            op = (unsigned)(here.bits);
+            op = (unsigned)(here->bits);
             hold >>= op;
             bits -= op;
-            op = (unsigned)(here.op);
+            op = (unsigned)(here->op);
             if (op & 16) {                      /* distance base */
-                dist = (unsigned)(here.val);
+                dist = (unsigned)(here->val);
                 op &= 15;                       /* number of extra bits */
                 if (bits < op) {
 #ifdef INFLATE_CHUNK_READ_64LE
@@ -276,7 +276,7 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
                            the main copy is near the end.
                           */
                         out = chunkunroll_relaxed(out, &dist, &len);
-                        out = chunkcopy_safe(out, out - dist, len, limit);
+                        out = chunkcopy_safe_ugly(out, dist, len, limit);
                     } else {
                         /* from points to window, so there is no risk of
                            overlapping pointers requiring memset-like behaviour
@@ -295,7 +295,7 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
                 }
             }
             else if ((op & 64) == 0) {          /* 2nd level distance code */
-                here = dcode[here.val + (hold & ((1U << op) - 1))];
+                here = dcode + here->val + (hold & ((1U << op) - 1));
                 goto dodist;
             }
             else {
@@ -305,7 +305,7 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
             }
         }
         else if ((op & 64) == 0) {              /* 2nd level length code */
-            here = lcode[here.val + (hold & ((1U << op) - 1))];
+            here = lcode + here->val + (hold & ((1U << op) - 1));
             goto dolen;
         }
         else if (op & 32) {                     /* end-of-block */
@@ -339,7 +339,6 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
     state->bits = bits;
 
     Assert((state->hold >> state->bits) == 0, "invalid input data state");
-    return;
 }
 
 /*
diff --git a/deps/zlib/contrib/optimizations/inflate.c b/deps/zlib/contrib/optimizations/inflate.c
index 81d558bd6ef5fa..f3dfba8b262852 100644
--- a/deps/zlib/contrib/optimizations/inflate.c
+++ b/deps/zlib/contrib/optimizations/inflate.c
@@ -1,5 +1,5 @@
 /* inflate.c -- zlib decompression
- * Copyright (C) 1995-2016 Mark Adler
+ * Copyright (C) 1995-2022 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -131,6 +131,7 @@ z_streamp strm;
     state->mode = HEAD;
     state->last = 0;
     state->havedict = 0;
+    state->flags = -1;
     state->dmax = 32768U;
     state->head = Z_NULL;
     state->hold = 0;
@@ -168,6 +169,8 @@ int windowBits;
 
     /* extract wrap request from windowBits parameter */
     if (windowBits < 0) {
+        if (windowBits < -15)
+            return Z_STREAM_ERROR;
         wrap = 0;
         windowBits = -windowBits;
     }
@@ -459,10 +462,10 @@ unsigned copy;
 
 /* check function to use adler32() for zlib or crc32() for gzip */
 #ifdef GUNZIP
-#  define UPDATE(check, buf, len) \
+#  define UPDATE_CHECK(check, buf, len) \
     (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
 #else
-#  define UPDATE(check, buf, len) adler32(check, buf, len)
+#  define UPDATE_CHECK(check, buf, len) adler32(check, buf, len)
 #endif
 
 /* check macros for header crc */
@@ -682,7 +685,6 @@ int flush;
                 state->mode = FLAGS;
                 break;
             }
-            state->flags = 0;           /* expect zlib header */
             if (state->head != Z_NULL)
                 state->head->done = -1;
             if (!(state->wrap & 1) ||   /* check if zlib header allowed */
@@ -709,6 +711,7 @@ int flush;
                 break;
             }
             state->dmax = 1U << len;
+            state->flags = 0;               /* indicate zlib header */
             Tracev((stderr, "inflate:   zlib header ok\n"));
             strm->adler = state->check = adler32(0L, Z_NULL, 0);
             state->mode = hold & 0x200 ? DICTID : TYPE;
@@ -734,6 +737,7 @@ int flush;
                 CRC2(state->check, hold);
             INITBITS();
             state->mode = TIME;
+                /* fallthrough */
         case TIME:
             NEEDBITS(32);
             if (state->head != Z_NULL)
@@ -742,6 +746,7 @@ int flush;
                 CRC4(state->check, hold);
             INITBITS();
             state->mode = OS;
+                /* fallthrough */
         case OS:
             NEEDBITS(16);
             if (state->head != Z_NULL) {
@@ -752,6 +757,7 @@ int flush;
                 CRC2(state->check, hold);
             INITBITS();
             state->mode = EXLEN;
+                /* fallthrough */
         case EXLEN:
             if (state->flags & 0x0400) {
                 NEEDBITS(16);
@@ -765,14 +771,16 @@ int flush;
             else if (state->head != Z_NULL)
                 state->head->extra = Z_NULL;
             state->mode = EXTRA;
+                /* fallthrough */
         case EXTRA:
             if (state->flags & 0x0400) {
                 copy = state->length;
                 if (copy > have) copy = have;
                 if (copy) {
                     if (state->head != Z_NULL &&
-                        state->head->extra != Z_NULL) {
-                        len = state->head->extra_len - state->length;
+                        state->head->extra != Z_NULL &&
+                        (len = state->head->extra_len - state->length) <
+                            state->head->extra_max) {
                         zmemcpy(state->head->extra + len, next,
                                 len + copy > state->head->extra_max ?
                                 state->head->extra_max - len : copy);
@@ -787,6 +795,7 @@ int flush;
             }
             state->length = 0;
             state->mode = NAME;
+                /* fallthrough */
         case NAME:
             if (state->flags & 0x0800) {
                 if (have == 0) goto inf_leave;
@@ -808,6 +817,7 @@ int flush;
                 state->head->name = Z_NULL;
             state->length = 0;
             state->mode = COMMENT;
+                /* fallthrough */
         case COMMENT:
             if (state->flags & 0x1000) {
                 if (have == 0) goto inf_leave;
@@ -828,6 +838,7 @@ int flush;
             else if (state->head != Z_NULL)
                 state->head->comment = Z_NULL;
             state->mode = HCRC;
+                /* fallthrough */
         case HCRC:
             if (state->flags & 0x0200) {
                 NEEDBITS(16);
@@ -851,6 +862,7 @@ int flush;
             strm->adler = state->check = ZSWAP32(hold);
             INITBITS();
             state->mode = DICT;
+                /* fallthrough */
         case DICT:
             if (state->havedict == 0) {
                 RESTORE();
@@ -858,8 +870,10 @@ int flush;
             }
             strm->adler = state->check = adler32(0L, Z_NULL, 0);
             state->mode = TYPE;
+                /* fallthrough */
         case TYPE:
             if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
+                /* fallthrough */
         case TYPEDO:
             if (state->last) {
                 BYTEBITS();
@@ -910,8 +924,10 @@ int flush;
             INITBITS();
             state->mode = COPY_;
             if (flush == Z_TREES) goto inf_leave;
+                /* fallthrough */
         case COPY_:
             state->mode = COPY;
+                /* fallthrough */
         case COPY:
             copy = state->length;
             if (copy) {
@@ -947,6 +963,7 @@ int flush;
             Tracev((stderr, "inflate:       table sizes ok\n"));
             state->have = 0;
             state->mode = LENLENS;
+                /* fallthrough */
         case LENLENS:
             while (state->have < state->ncode) {
                 NEEDBITS(3);
@@ -968,6 +985,7 @@ int flush;
             Tracev((stderr, "inflate:       code lengths ok\n"));
             state->have = 0;
             state->mode = CODELENS;
+                /* fallthrough */
         case CODELENS:
             while (state->have < state->nlen + state->ndist) {
                 for (;;) {
@@ -1027,11 +1045,11 @@ int flush;
             }
 
             /* build code tables -- note: do not change the lenbits or distbits
-               values here (9 and 6) without reading the comments in inftrees.h
+               values here (10 and 9) without reading the comments in inftrees.h
                concerning the ENOUGH constants, which depend on those values */
             state->next = state->codes;
             state->lencode = (const code FAR *)(state->next);
-            state->lenbits = 9;
+            state->lenbits = 10;
             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
                                 &(state->lenbits), state->work);
             if (ret) {
@@ -1040,7 +1058,7 @@ int flush;
                 break;
             }
             state->distcode = (const code FAR *)(state->next);
-            state->distbits = 6;
+            state->distbits = 9;
             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
                             &(state->next), &(state->distbits), state->work);
             if (ret) {
@@ -1051,8 +1069,10 @@ int flush;
             Tracev((stderr, "inflate:       codes ok\n"));
             state->mode = LEN_;
             if (flush == Z_TREES) goto inf_leave;
+                /* fallthrough */
         case LEN_:
             state->mode = LEN;
+                /* fallthrough */
         case LEN:
             if (have >= INFLATE_FAST_MIN_INPUT &&
                 left >= INFLATE_FAST_MIN_OUTPUT) {
@@ -1103,6 +1123,7 @@ int flush;
             }
             state->extra = (unsigned)(here.op) & 15;
             state->mode = LENEXT;
+                /* fallthrough */
         case LENEXT:
             if (state->extra) {
                 NEEDBITS(state->extra);
@@ -1113,6 +1134,7 @@ int flush;
             Tracevv((stderr, "inflate:         length %u\n", state->length));
             state->was = state->length;
             state->mode = DIST;
+                /* fallthrough */
         case DIST:
             for (;;) {
                 here = state->distcode[BITS(state->distbits)];
@@ -1140,6 +1162,7 @@ int flush;
             state->offset = (unsigned)here.val;
             state->extra = (unsigned)(here.op) & 15;
             state->mode = DISTEXT;
+                /* fallthrough */
         case DISTEXT:
             if (state->extra) {
                 NEEDBITS(state->extra);
@@ -1156,6 +1179,7 @@ int flush;
 #endif
             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
             state->mode = MATCH;
+                /* fallthrough */
         case MATCH:
             if (left == 0) goto inf_leave;
             copy = out - left;
@@ -1214,7 +1238,7 @@ int flush;
                 state->total += out;
                 if ((state->wrap & 4) && out)
                     strm->adler = state->check =
-                        UPDATE(state->check, put - out, out);
+                        UPDATE_CHECK(state->check, put - out, out);
                 out = left;
                 if ((state->wrap & 4) && (
 #ifdef GUNZIP
@@ -1230,10 +1254,11 @@ int flush;
             }
 #ifdef GUNZIP
             state->mode = LENGTH;
+                /* fallthrough */
         case LENGTH:
             if (state->wrap && state->flags) {
                 NEEDBITS(32);
-                if (hold != (state->total & 0xffffffffUL)) {
+                if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {
                     strm->msg = (char *)"incorrect length check";
                     state->mode = BAD;
                     break;
@@ -1243,6 +1268,7 @@ int flush;
             }
 #endif
             state->mode = DONE;
+                /* fallthrough */
         case DONE:
             ret = Z_STREAM_END;
             goto inf_leave;
@@ -1252,6 +1278,7 @@ int flush;
         case MEM:
             return Z_MEM_ERROR;
         case SYNC:
+                /* fallthrough */
         default:
             return Z_STREAM_ERROR;
         }
@@ -1263,16 +1290,29 @@ int flush;
        Note: a memory error from inflate() is non-recoverable.
      */
   inf_leave:
-   /* We write a defined value in the unused space to help mark
+#if defined(ZLIB_DEBUG)
+   /* XXX(cavalcantii): I put this in place back in 2017 to help debug faulty
+    * client code relying on undefined behavior when chunk_copy first landed.
+    *
+    * It is save to say after all these years that Chromium code is well
+    * behaved and works fine with the optimization, therefore we can enable
+    * this only for DEBUG builds.
+    *
+    * We write a defined value in the unused space to help mark
     * where the stream has ended. We don't use zeros as that can
     * mislead clients relying on undefined behavior (i.e. assuming
     * that the data is over when the buffer has a zero/null value).
+    *
+    * The basic idea is that if client code is not relying on the zlib context
+    * to inform the amount of decompressed data, but instead reads the output
+    * buffer until a zero/null is found, it will fail faster and harder
+    * when the remaining of the buffer is marked with a symbol (e.g. 0x55).
     */
    if (left >= CHUNKCOPY_CHUNK_SIZE)
       memset(put, 0x55, CHUNKCOPY_CHUNK_SIZE);
    else
       memset(put, 0x55, left);
-
+#endif
     RESTORE();
     if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
             (state->mode < CHECK || flush != Z_FINISH)))
@@ -1287,7 +1327,7 @@ int flush;
     state->total += out;
     if ((state->wrap & 4) && out)
         strm->adler = state->check =
-            UPDATE(state->check, strm->next_out - out, out);
+            UPDATE_CHECK(state->check, strm->next_out - out, out);
     strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
                       (state->mode == TYPE ? 128 : 0) +
                       (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
@@ -1423,6 +1463,7 @@ int ZEXPORT inflateSync(strm)
 z_streamp strm;
 {
     unsigned len;               /* number of bytes to look at or looked at */
+    int flags;                  /* temporary to save header status */
     unsigned long in, out;      /* temporary to save total_in and total_out */
     unsigned char buf[4];       /* to restore bit buffer to byte string */
     struct inflate_state FAR *state;
@@ -1455,9 +1496,15 @@ z_streamp strm;
 
     /* return no joy or set up to restart inflate() on a new block */
     if (state->have != 4) return Z_DATA_ERROR;
+    if (state->flags == -1)
+        state->wrap = 0;    /* if no header yet, treat as raw */
+    else
+        state->wrap &= ~4;  /* no point in computing a check value now */
+    flags = state->flags;
     in = strm->total_in;  out = strm->total_out;
     inflateReset(strm);
     strm->total_in = in;  strm->total_out = out;
+    state->flags = flags;
     state->mode = TYPE;
     return Z_OK;
 }
@@ -1553,7 +1600,7 @@ int check;
 
     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
     state = (struct inflate_state FAR *)strm->state;
-    if (check)
+    if (check && state->wrap)
         state->wrap |= 4;
     else
         state->wrap &= ~4;
diff --git a/deps/zlib/contrib/optimizations/insert_string.h b/deps/zlib/contrib/optimizations/insert_string.h
index 69eee3dc9e91fc..2a04f699349435 100644
--- a/deps/zlib/contrib/optimizations/insert_string.h
+++ b/deps/zlib/contrib/optimizations/insert_string.h
@@ -1,48 +1,61 @@
 /* insert_string.h
  *
- * Copyright 2019 The Chromium Authors. All rights reserved.
+ * Copyright 2019 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
-#ifdef _MSC_VER
+
+#ifndef INSERT_STRING_H
+#define INSERT_STRING_H
+
+#ifndef INLINE
+#if defined(_MSC_VER) && !defined(__clang__)
 #define INLINE __inline
 #else
 #define INLINE inline
 #endif
+#endif
+
+#include "cpu_features.h"
 
-/* Optimized insert_string block */
-#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32)
-#define TARGET_CPU_WITH_CRC
 // clang-format off
 #if defined(CRC32_SIMD_SSE42_PCLMUL)
-  /* Required to make MSVC bot build pass. */
-  #include <smmintrin.h>
-  #if defined(__GNUC__) || defined(__clang__)
-    #undef TARGET_CPU_WITH_CRC
+  #include <smmintrin.h>  /* Required to make MSVC bot build pass. */
+
+  #if defined(__clang__) || defined(__GNUC__)
     #define TARGET_CPU_WITH_CRC __attribute__((target("sse4.2")))
+  #else
+    #define TARGET_CPU_WITH_CRC
   #endif
 
-  #define _cpu_crc32_u32 _mm_crc32_u32
+  /* CRC32C uint32_t */
+  #define _cpu_crc32c_hash_u32 _mm_crc32_u32
 
 #elif defined(CRC32_ARMV8_CRC32)
-  #include "arm_features.h"
   #if defined(__clang__)
-    #undef TARGET_CPU_WITH_CRC
     #define __crc32cw __builtin_arm_crc32cw
+  #elif defined(__GNUC__)
+    #define __crc32cw __builtin_aarch64_crc32cw
   #endif
 
-  #define _cpu_crc32_u32 __crc32cw
-
-  #if defined(__aarch64__)
+  #if defined(__aarch64__) && defined(__clang__)
     #define TARGET_CPU_WITH_CRC __attribute__((target("crc")))
-  #else  // !defined(__aarch64__)
+  #elif defined(__aarch64__) && defined(__GNUC__)
+    #define TARGET_CPU_WITH_CRC __attribute__((target("+crc")))
+  #elif defined(__clang__) // !defined(__aarch64__)
     #define TARGET_CPU_WITH_CRC __attribute__((target("armv8-a,crc")))
   #endif  // defined(__aarch64__)
+
+  /* CRC32C uint32_t */
+  #define _cpu_crc32c_hash_u32 __crc32cw
+
 #endif
 // clang-format on
+
+#if defined(TARGET_CPU_WITH_CRC)
+
 TARGET_CPU_WITH_CRC
-local INLINE Pos insert_string_optimized(deflate_state* const s,
-                                         const Pos str) {
+local INLINE Pos insert_string_simd(deflate_state* const s, const Pos str) {
   Pos ret;
   unsigned *ip, val, h = 0;
 
@@ -52,22 +65,33 @@ local INLINE Pos insert_string_optimized(deflate_state* const s,
   if (s->level >= 6)
     val &= 0xFFFFFF;
 
-  /* Unlike the case of data integrity checks for GZIP format where the
-   * polynomial used is defined (https://tools.ietf.org/html/rfc1952#page-11),
-   * here it is just a hash function for the hash table used while
-   * performing compression.
-   */
-  h = _cpu_crc32_u32(h, val);
+  /* Compute hash from the CRC32C of |val|. */
+  h = _cpu_crc32c_hash_u32(h, val);
 
   ret = s->head[h & s->hash_mask];
   s->head[h & s->hash_mask] = str;
   s->prev[str & s->w_mask] = ret;
   return ret;
 }
-#endif /* Optimized insert_string block */
+
+#endif // TARGET_CPU_WITH_CRC
+
+/**
+ * Some applications need to match zlib DEFLATE output exactly [3]. Use the
+ * canonical zlib Rabin-Karp rolling hash [1,2] in that case.
+ *
+ *  [1] For a description of the Rabin and Karp algorithm, see "Algorithms"
+ *      book by R. Sedgewick, Addison-Wesley, p252.
+ *  [2] https://www.euccas.me/zlib/#zlib_rabin_karp and also "rolling hash"
+ *      https://en.wikipedia.org/wiki/Rolling_hash
+ *  [3] crbug.com/1316541 AOSP incremental client APK package OTA upgrades.
+ */
+#ifdef CHROMIUM_ZLIB_NO_CASTAGNOLI
+#define USE_ZLIB_RABIN_KARP_ROLLING_HASH
+#endif
 
 /* ===========================================================================
- * Update a hash value with the given input byte
+ * Update a hash value with the given input byte (Rabin-Karp rolling hash).
  * IN  assertion: all calls to UPDATE_HASH are made with consecutive input
  *    characters, so that a running hash key can be computed from the previous
  *    key instead of complete recalculation each time.
@@ -99,24 +123,24 @@ local INLINE Pos insert_string_c(deflate_state* const s, const Pos str) {
 }
 
 local INLINE Pos insert_string(deflate_state* const s, const Pos str) {
-/* String dictionary insertion: faster symbol hashing has a positive impact
- * on data compression speeds (around 20% on Intel and 36% on Arm Cortex big
- * cores).
- * A misfeature is that the generated compressed output will differ from
- * vanilla zlib (even though it is still valid 'DEFLATE-d' content).
+/* insert_string_simd string dictionary insertion: SIMD crc32c symbol hasher
+ * significantly improves data compression speed.
  *
- * We offer here a way to disable the optimization if there is the expectation
- * that compressed content should match when compared to vanilla zlib.
+ * Note: the generated compressed output is a valid DEFLATE stream, but will
+ * differ from canonical zlib output.
  */
-#if !defined(CHROMIUM_ZLIB_NO_CASTAGNOLI)
-  /* TODO(cavalcantii): unify CPU features code. */
-#if defined(CRC32_ARMV8_CRC32)
-  if (arm_cpu_enable_crc32)
-    return insert_string_optimized(s, str);
-#elif defined(CRC32_SIMD_SSE42_PCLMUL)
+#if defined(USE_ZLIB_RABIN_KARP_ROLLING_HASH)
+/* So this build-time option can be used to disable the crc32c hash, and use
+ * the Rabin-Karp hash instead.
+ */ /* FALLTHROUGH Rabin-Karp */
+#elif defined(TARGET_CPU_WITH_CRC) && defined(CRC32_SIMD_SSE42_PCLMUL)
   if (x86_cpu_enable_simd)
-    return insert_string_optimized(s, str);
-#endif
+    return insert_string_simd(s, str);
+#elif defined(TARGET_CPU_WITH_CRC) && defined(CRC32_ARMV8_CRC32)
+  if (arm_cpu_enable_crc32)
+    return insert_string_simd(s, str);
 #endif
-  return insert_string_c(s, str);
+  return insert_string_c(s, str); /* Rabin-Karp */
 }
+
+#endif /* INSERT_STRING_H */
diff --git a/deps/zlib/contrib/optimizations/slide_hash_neon.h b/deps/zlib/contrib/optimizations/slide_hash_neon.h
deleted file mode 100644
index 26995d70f709e7..00000000000000
--- a/deps/zlib/contrib/optimizations/slide_hash_neon.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Copyright 2018 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the Chromium source repository LICENSE file.
- */
-#ifndef __SLIDE_HASH__NEON__
-#define __SLIDE_HASH__NEON__
-
-#include "deflate.h"
-#include <arm_neon.h>
-
-inline static void ZLIB_INTERNAL neon_slide_hash_update(Posf *hash,
-                                                        const uInt hash_size,
-                                                        const ush w_size)
-{
-   /* NEON 'Q' registers allow to store 128 bits, so we can load 8x16-bits
-     * values. For further details, check:
-     * ARM DHT 0002A, section 1.3.2 NEON Registers.
-     */
-    const size_t chunk = sizeof(uint16x8_t) / sizeof(uint16_t);
-    /* Unrolling the operation yielded a compression performance boost in both
-     * ARMv7 (from 11.7% to 13.4%) and ARMv8 (from 3.7% to 7.5%) for HTML4
-     * content. For full benchmarking data, check: http://crbug.com/863257.
-     */
-    const size_t stride = 2*chunk;
-    const uint16x8_t v = vdupq_n_u16(w_size);
-
-    for (Posf *end = hash + hash_size; hash != end; hash += stride) {
-        uint16x8_t m_low = vld1q_u16(hash);
-        uint16x8_t m_high = vld1q_u16(hash + chunk);
-
-        /* The first 'q' in vqsubq_u16 makes these subtracts saturate to zero,
-         * replacing the ternary operator expression in the original code:
-         * (m >= wsize ? m - wsize : NIL).
-         */
-        m_low = vqsubq_u16(m_low, v);
-        m_high = vqsubq_u16(m_high, v);
-
-        vst1q_u16(hash, m_low);
-        vst1q_u16(hash + chunk, m_high);
-    }
-}
-
-
-inline static void ZLIB_INTERNAL neon_slide_hash(Posf *head, Posf *prev,
-                                                 const unsigned short w_size,
-                                                 const uInt hash_size)
-{
-    /*
-     * SIMD implementation for hash table rebase assumes:
-     * 1. hash chain offset (Pos) is 2 bytes.
-     * 2. hash table size is multiple of 32 bytes.
-     * #1 should be true as Pos is defined as "ush"
-     * #2 should be true as hash_bits are greater than 7
-     */
-    const size_t size = hash_size * sizeof(head[0]);
-    Assert(sizeof(Pos) == 2, "Wrong Pos size.");
-    Assert((size % sizeof(uint16x8_t) * 2) == 0, "Hash table size error.");
-
-    neon_slide_hash_update(head, hash_size, w_size);
-#ifndef FASTEST
-    neon_slide_hash_update(prev, w_size, w_size);
-#endif
-}
-
-#endif
diff --git a/deps/zlib/contrib/tests/DEPS b/deps/zlib/contrib/tests/DEPS
new file mode 100644
index 00000000000000..42751740686776
--- /dev/null
+++ b/deps/zlib/contrib/tests/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+    "+testing/gtest",
+    "+base",
+]
diff --git a/deps/zlib/contrib/tests/OWNERS b/deps/zlib/contrib/tests/OWNERS
index 9a2fb6fbdc6b3f..aa6a2d1bb3c041 100644
--- a/deps/zlib/contrib/tests/OWNERS
+++ b/deps/zlib/contrib/tests/OWNERS
@@ -1 +1,2 @@
 cblume@chromium.org
+cavalcantii@chromium.org
diff --git a/deps/zlib/contrib/tests/fuzzers/BUILD.gn b/deps/zlib/contrib/tests/fuzzers/BUILD.gn
index c46b66440073a5..16e918a720ece9 100644
--- a/deps/zlib/contrib/tests/fuzzers/BUILD.gn
+++ b/deps/zlib/contrib/tests/fuzzers/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
+# Copyright 2017 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
@@ -9,37 +9,32 @@ group("fuzzers") {
 }
 
 fuzzer_test("zlib_uncompress_fuzzer") {
-  sources = [
-    "uncompress_fuzzer.cc",
-  ]
-  deps = [
-    "../../../:zlib",
-  ]
+  sources = [ "uncompress_fuzzer.cc" ]
+  deps = [ "../../../:zlib" ]
 }
 
 fuzzer_test("zlib_inflate_fuzzer") {
-  sources = [
-    "inflate_fuzzer.cc",
-  ]
-  deps = [
-    "../../../:zlib",
-  ]
+  sources = [ "inflate_fuzzer.cc" ]
+  deps = [ "../../../:zlib" ]
+}
+
+fuzzer_test("zlib_inflate_with_header_fuzzer") {
+  sources = [ "inflate_with_header_fuzzer.cc" ]
+  deps = [ "../../../:zlib" ]
+}
+
+fuzzer_test("zlib_streaming_inflate_fuzzer") {
+  sources = [ "streaming_inflate_fuzzer.cc" ]
+  deps = [ "../../../:zlib" ]
+  libfuzzer_options = [ "max_len=256000" ]
 }
 
 fuzzer_test("zlib_deflate_set_dictionary_fuzzer") {
-  sources = [
-    "deflate_set_dictionary_fuzzer.cc",
-  ]
-  deps = [
-    "../../../:zlib",
-  ]
+  sources = [ "deflate_set_dictionary_fuzzer.cc" ]
+  deps = [ "../../../:zlib" ]
 }
 
 fuzzer_test("zlib_deflate_fuzzer") {
-  sources = [
-    "deflate_fuzzer.cc",
-  ]
-  deps = [
-    "../../../:zlib",
-  ]
+  sources = [ "deflate_fuzzer.cc" ]
+  deps = [ "../../../:zlib" ]
 }
diff --git a/deps/zlib/contrib/tests/fuzzers/OWNERS b/deps/zlib/contrib/tests/fuzzers/OWNERS
index 6397ce69c70649..0ae52574020a3d 100644
--- a/deps/zlib/contrib/tests/fuzzers/OWNERS
+++ b/deps/zlib/contrib/tests/fuzzers/OWNERS
@@ -1,2 +1,3 @@
 cblume@chromium.org
-mmoroz@chromium.org
+hans@chromium.org
+noel@chromium.org
diff --git a/deps/zlib/contrib/tests/fuzzers/deflate_fuzzer.cc b/deps/zlib/contrib/tests/fuzzers/deflate_fuzzer.cc
index 6098ff162ce1c0..cf1a9649591225 100644
--- a/deps/zlib/contrib/tests/fuzzers/deflate_fuzzer.cc
+++ b/deps/zlib/contrib/tests/fuzzers/deflate_fuzzer.cc
@@ -1,47 +1,74 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <fuzzer/FuzzedDataProvider.h>
 #include <stddef.h>
 #include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
-#include <cassert>
 #include <vector>
 
 #include "third_party/zlib/zlib.h"
 
-static Bytef buffer[256 * 1024] = {0};
+// Fuzzer builds often have NDEBUG set, so roll our own assert macro.
+#define ASSERT(cond)                                                           \
+  do {                                                                         \
+    if (!(cond)) {                                                             \
+      fprintf(stderr, "%s:%d Assert failed: %s\n", __FILE__, __LINE__, #cond); \
+      exit(1);                                                                 \
+    }                                                                          \
+  } while (0)
 
-// Entry point for LibFuzzer.
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  // zlib's deflate requires non-zero input sizes
-  if (!size)
-    return 0;
-
-  // We need to strip the 'const' for zlib.
-  std::vector<unsigned char> input_buffer{data, data+size};
-
-  uLongf buffer_length = static_cast<uLongf>(sizeof(buffer));
+  FuzzedDataProvider fdp(data, size);
+  int level = fdp.PickValueInArray({0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
+  int windowBits = fdp.PickValueInArray({9, 10, 11, 12, 13, 14, 15});
+  int memLevel = fdp.PickValueInArray({1, 2, 3, 4, 5, 6, 7, 8, 9});
+  int strategy = fdp.PickValueInArray(
+      {Z_DEFAULT_STRATEGY, Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED});
+  std::vector<uint8_t> src = fdp.ConsumeRemainingBytes<uint8_t>();
 
   z_stream stream;
-  stream.next_in = input_buffer.data();
-  stream.avail_in = size;
-  stream.total_in = size;
-  stream.next_out = buffer;
-  stream.avail_out = buffer_length;
-  stream.total_out = buffer_length;
   stream.zalloc = Z_NULL;
   stream.zfree = Z_NULL;
 
-  if (Z_OK != deflateInit(&stream, Z_DEFAULT_COMPRESSION)) {
-    deflateEnd(&stream);
-    assert(false);
+  // Compress the data one byte at a time to exercise the streaming code.
+  int ret =
+      deflateInit2(&stream, level, Z_DEFLATED, windowBits, memLevel, strategy);
+  ASSERT(ret == Z_OK);
+  std::vector<uint8_t> compressed(src.size() * 2 + 1000);
+  stream.next_out = compressed.data();
+  stream.avail_out = compressed.size();
+  for (uint8_t b : src) {
+    stream.next_in = &b;
+    stream.avail_in = 1;
+    ret = deflate(&stream, Z_NO_FLUSH);
+    ASSERT(ret == Z_OK);
   }
-
-  auto deflate_result = deflate(&stream, Z_NO_FLUSH);
+  stream.next_in = Z_NULL;
+  stream.avail_in = 0;
+  ret = deflate(&stream, Z_FINISH);
+  ASSERT(ret == Z_STREAM_END);
+  compressed.resize(compressed.size() - stream.avail_out);
   deflateEnd(&stream);
-  if (Z_OK != deflate_result)
-    assert(false);
+
+  // Verify that the data decompresses correctly.
+  ret = inflateInit2(&stream, windowBits);
+  ASSERT(ret == Z_OK);
+  // Make room for at least one byte so it's never empty.
+  std::vector<uint8_t> decompressed(src.size() + 1);
+  stream.next_in = compressed.data();
+  stream.avail_in = compressed.size();
+  stream.next_out = decompressed.data();
+  stream.avail_out = decompressed.size();
+  ret = inflate(&stream, Z_FINISH);
+  ASSERT(ret == Z_STREAM_END);
+  decompressed.resize(decompressed.size() - stream.avail_out);
+  inflateEnd(&stream);
+
+  ASSERT(decompressed == src);
 
   return 0;
 }
diff --git a/deps/zlib/contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc b/deps/zlib/contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc
index febbfcb86f0c3e..88511c14fe5ec9 100644
--- a/deps/zlib/contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc
+++ b/deps/zlib/contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/zlib/contrib/tests/fuzzers/inflate_fuzzer.cc b/deps/zlib/contrib/tests/fuzzers/inflate_fuzzer.cc
index 44f9c72c18df8a..836a4415fa7517 100644
--- a/deps/zlib/contrib/tests/fuzzers/inflate_fuzzer.cc
+++ b/deps/zlib/contrib/tests/fuzzers/inflate_fuzzer.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/zlib/contrib/tests/fuzzers/inflate_with_header_fuzzer.cc b/deps/zlib/contrib/tests/fuzzers/inflate_with_header_fuzzer.cc
new file mode 100644
index 00000000000000..f99220aee2c49c
--- /dev/null
+++ b/deps/zlib/contrib/tests/fuzzers/inflate_with_header_fuzzer.cc
@@ -0,0 +1,95 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <algorithm>
+#include <memory>
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <fuzzer/FuzzedDataProvider.h>
+
+#include "third_party/zlib/zlib.h"
+
+// Fuzzer builds often have NDEBUG set, so roll our own assert macro.
+#define ASSERT(cond)                                                           \
+  do {                                                                         \
+    if (!(cond)) {                                                             \
+      fprintf(stderr, "%s:%d Assert failed: %s\n", __FILE__, __LINE__, #cond); \
+      exit(1);                                                                 \
+    }                                                                          \
+  } while (0)
+
+static void chunked_inflate(gz_header* header,
+                            uint8_t* data,
+                            size_t size,
+                            size_t in_chunk_size,
+                            size_t out_chunk_size) {
+  z_stream stream;
+  stream.next_in = data;
+  stream.avail_in = 0;
+  stream.zalloc = Z_NULL;
+  stream.zfree = Z_NULL;
+
+  static const int kDefaultWindowBits = MAX_WBITS;
+  static const int kGzipOrZlibHeader = 32;
+  ASSERT(inflateInit2(&stream, kDefaultWindowBits + kGzipOrZlibHeader) == Z_OK);
+  ASSERT(inflateGetHeader(&stream, header) == Z_OK);
+
+  auto out_buffer = std::make_unique<uint8_t[]>(out_chunk_size);
+  while (true) {
+    stream.next_in = &data[stream.total_in];
+    stream.avail_in =
+        std::min(in_chunk_size, size - static_cast<size_t>(stream.total_in));
+    stream.next_out = out_buffer.get();
+    stream.avail_out = out_chunk_size;
+
+    if (inflate(&stream, stream.avail_in == 0 ? Z_SYNC_FLUSH : Z_NO_FLUSH) !=
+        Z_OK) {
+      break;
+    }
+  }
+
+  inflateEnd(&stream);
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  if (size > 250 * 1024) {
+    // Cap the input size so the fuzzer doesn't time out. For example,
+    // crbug.com/1362206 saw timeouts with 450 KB input, so use a limit that's
+    // well below that but still large enough to hit most code.
+    return 0;
+  }
+
+  FuzzedDataProvider fdp(data, size);
+
+  // Fuzz zlib's inflate() with inflateGetHeader() enabled, various sizes for
+  // the gz_header field sizes, and various-sized chunks for input/output. This
+  // would have found CVE-2022-37434 which was a heap buffer read overflow when
+  // filling in gz_header's extra field.
+
+  gz_header header;
+  header.extra_max = fdp.ConsumeIntegralInRange(0, 100000);
+  header.name_max = fdp.ConsumeIntegralInRange(0, 100000);
+  header.comm_max = fdp.ConsumeIntegralInRange(0, 100000);
+
+  auto extra_buf = std::make_unique<uint8_t[]>(header.extra_max);
+  auto name_buf = std::make_unique<uint8_t[]>(header.name_max);
+  auto comment_buf = std::make_unique<uint8_t[]>(header.comm_max);
+
+  header.extra = extra_buf.get();
+  header.name = name_buf.get();
+  header.comment = comment_buf.get();
+
+  size_t in_chunk_size = fdp.ConsumeIntegralInRange(1, 4097);
+  size_t out_chunk_size = fdp.ConsumeIntegralInRange(1, 4097);
+  std::vector<uint8_t> remaining_data = fdp.ConsumeRemainingBytes<uint8_t>();
+
+  chunked_inflate(&header, remaining_data.data(), remaining_data.size(),
+                  in_chunk_size, out_chunk_size);
+
+  return 0;
+}
diff --git a/deps/zlib/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc b/deps/zlib/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc
new file mode 100644
index 00000000000000..c054e984b807ce
--- /dev/null
+++ b/deps/zlib/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc
@@ -0,0 +1,74 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "third_party/zlib/zlib.h"
+
+// Fuzzer builds often have NDEBUG set, so roll our own assert macro.
+#define ASSERT(cond)                                                           \
+  do {                                                                         \
+    if (!(cond)) {                                                             \
+      fprintf(stderr, "%s:%d Assert failed: %s\n", __FILE__, __LINE__, #cond); \
+      exit(1);                                                                 \
+    }                                                                          \
+  } while (0)
+
+// Entry point for LibFuzzer.
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  // Deflate data.
+  z_stream comp_strm;
+  comp_strm.zalloc = Z_NULL;
+  comp_strm.zfree = Z_NULL;
+  comp_strm.opaque = Z_NULL;
+  int ret = deflateInit(&comp_strm, Z_DEFAULT_COMPRESSION);
+  ASSERT(ret == Z_OK);
+
+  size_t comp_buf_cap = deflateBound(&comp_strm, size);
+  uint8_t* comp_buf = (uint8_t*)malloc(comp_buf_cap);
+  ASSERT(comp_buf != nullptr);
+  comp_strm.next_out = comp_buf;
+  comp_strm.avail_out = comp_buf_cap;
+  comp_strm.next_in = (unsigned char*)data;
+  comp_strm.avail_in = size;
+  ret = deflate(&comp_strm, Z_FINISH);
+  ASSERT(ret == Z_STREAM_END);
+  size_t comp_sz = comp_buf_cap - comp_strm.avail_out;
+
+  // Inflate comp_buf one chunk at a time.
+  z_stream decomp_strm;
+  decomp_strm.zalloc = Z_NULL;
+  decomp_strm.zfree = Z_NULL;
+  decomp_strm.opaque = Z_NULL;
+  ret = inflateInit(&decomp_strm);
+  ASSERT(ret == Z_OK);
+  decomp_strm.next_in = comp_buf;
+  decomp_strm.avail_in = comp_sz;
+
+  while (decomp_strm.avail_in > 0) {
+    uint8_t decomp_buf[1024];
+    decomp_strm.next_out = decomp_buf;
+    decomp_strm.avail_out = sizeof(decomp_buf);
+    ret = inflate(&decomp_strm, Z_FINISH);
+    ASSERT(ret == Z_OK || ret == Z_STREAM_END || ret == Z_BUF_ERROR);
+
+    // Verify the output bytes.
+    size_t num_out = sizeof(decomp_buf) - decomp_strm.avail_out;
+    for (size_t i = 0; i < num_out; i++) {
+      ASSERT(decomp_buf[i] == data[decomp_strm.total_out - num_out + i]);
+    }
+  }
+
+  ret = deflateEnd(&comp_strm);
+  ASSERT(ret == Z_OK);
+  free(comp_buf);
+
+  inflateEnd(&decomp_strm);
+  ASSERT(ret == Z_OK);
+
+  return 0;
+}
diff --git a/deps/zlib/contrib/tests/fuzzers/uncompress_fuzzer.cc b/deps/zlib/contrib/tests/fuzzers/uncompress_fuzzer.cc
index bca5244e8b38b4..c41747a144c059 100644
--- a/deps/zlib/contrib/tests/fuzzers/uncompress_fuzzer.cc
+++ b/deps/zlib/contrib/tests/fuzzers/uncompress_fuzzer.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
+// Copyright 2015 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/deps/zlib/contrib/tests/infcover.cc b/deps/zlib/contrib/tests/infcover.cc
new file mode 100644
index 00000000000000..2ab0a4bec28b1d
--- /dev/null
+++ b/deps/zlib/contrib/tests/infcover.cc
@@ -0,0 +1,746 @@
+/* infcover.c -- test zlib's inflate routines with full code coverage
+ * Copyright (C) 2011, 2016 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* to use, do: ./configure --cover && make cover */
+// clang-format off
+#include "infcover.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "zlib.h"
+
+/* get definition of internal structure so we can mess with it (see pull()),
+   and so we can call inflate_trees() (see cover5()) */
+#define ZLIB_INTERNAL
+#include "inftrees.h"
+#include "inflate.h"
+
+/* XXX: use C++ streams instead of printf/fputs/etc due to portability
+ * as type sizes can vary between platforms.
+ */
+#include <iostream>
+#define local static
+
+/* XXX: hacking C assert and plugging into GTest. */
+#include "gtest.h"
+#if defined(assert)
+#undef assert
+#define assert EXPECT_TRUE
+#endif
+
+/* XXX: handle what is a reserved word in C++. */
+#define try try_f
+
+/* -- memory tracking routines -- */
+
+/*
+   These memory tracking routines are provided to zlib and track all of zlib's
+   allocations and deallocations, check for LIFO operations, keep a current
+   and high water mark of total bytes requested, optionally set a limit on the
+   total memory that can be allocated, and when done check for memory leaks.
+
+   They are used as follows:
+
+   z_stream strm;
+   mem_setup(&strm)         initializes the memory tracking and sets the
+                            zalloc, zfree, and opaque members of strm to use
+                            memory tracking for all zlib operations on strm
+   mem_limit(&strm, limit)  sets a limit on the total bytes requested -- a
+                            request that exceeds this limit will result in an
+                            allocation failure (returns NULL) -- setting the
+                            limit to zero means no limit, which is the default
+                            after mem_setup()
+   mem_used(&strm, "msg")   prints to stderr "msg" and the total bytes used
+   mem_high(&strm, "msg")   prints to stderr "msg" and the high water mark
+   mem_done(&strm, "msg")   ends memory tracking, releases all allocations
+                            for the tracking as well as leaked zlib blocks, if
+                            any.  If there was anything unusual, such as leaked
+                            blocks, non-FIFO frees, or frees of addresses not
+                            allocated, then "msg" and information about the
+                            problem is printed to stderr.  If everything is
+                            normal, nothing is printed. mem_done resets the
+                            strm members to Z_NULL to use the default memory
+                            allocation routines on the next zlib initialization
+                            using strm.
+ */
+
+/* these items are strung together in a linked list, one for each allocation */
+struct mem_item {
+    void *ptr;                  /* pointer to allocated memory */
+    size_t size;                /* requested size of allocation */
+    struct mem_item *next;      /* pointer to next item in list, or NULL */
+};
+
+/* this structure is at the root of the linked list, and tracks statistics */
+struct mem_zone {
+    struct mem_item *first;     /* pointer to first item in list, or NULL */
+    size_t total, highwater;    /* total allocations, and largest total */
+    size_t limit;               /* memory allocation limit, or 0 if no limit */
+    int notlifo, rogue;         /* counts of non-LIFO frees and rogue frees */
+};
+
+/* memory allocation routine to pass to zlib */
+local void *mem_alloc(void *mem, unsigned count, unsigned size)
+{
+    void *ptr;
+    struct mem_item *item;
+    struct mem_zone *zone = static_cast<struct mem_zone *>(mem);
+    size_t len = count * (size_t)size;
+
+    /* induced allocation failure */
+    if (zone == NULL || (zone->limit && zone->total + len > zone->limit))
+        return NULL;
+
+    /* perform allocation using the standard library, fill memory with a
+       non-zero value to make sure that the code isn't depending on zeros */
+    ptr = malloc(len);
+    if (ptr == NULL)
+        return NULL;
+    memset(ptr, 0xa5, len);
+
+    /* create a new item for the list */
+    item = static_cast<struct mem_item *>(malloc(sizeof(struct mem_item)));
+    if (item == NULL) {
+        free(ptr);
+        return NULL;
+    }
+    item->ptr = ptr;
+    item->size = len;
+
+    /* insert item at the beginning of the list */
+    item->next = zone->first;
+    zone->first = item;
+
+    /* update the statistics */
+    zone->total += item->size;
+    if (zone->total > zone->highwater)
+        zone->highwater = zone->total;
+
+    /* return the allocated memory */
+    return ptr;
+}
+
+/* memory free routine to pass to zlib */
+local void mem_free(void *mem, void *ptr)
+{
+    struct mem_item *item, *next;
+    struct mem_zone *zone = static_cast<struct mem_zone *>(mem);
+
+    /* if no zone, just do a free */
+    if (zone == NULL) {
+        free(ptr);
+        return;
+    }
+
+    /* point next to the item that matches ptr, or NULL if not found -- remove
+       the item from the linked list if found */
+    next = zone->first;
+    if (next) {
+        if (next->ptr == ptr)
+            zone->first = next->next;   /* first one is it, remove from list */
+        else {
+            do {                        /* search the linked list */
+                item = next;
+                next = item->next;
+            } while (next != NULL && next->ptr != ptr);
+            if (next) {                 /* if found, remove from linked list */
+                item->next = next->next;
+                zone->notlifo++;        /* not a LIFO free */
+            }
+
+        }
+    }
+
+    /* if found, update the statistics and free the item */
+    if (next) {
+        zone->total -= next->size;
+        free(next);
+    }
+
+    /* if not found, update the rogue count */
+    else
+        zone->rogue++;
+
+    /* in any case, do the requested free with the standard library function */
+    free(ptr);
+}
+
+/* set up a controlled memory allocation space for monitoring, set the stream
+   parameters to the controlled routines, with opaque pointing to the space */
+local void mem_setup(z_stream *strm)
+{
+    struct mem_zone *zone;
+
+    zone = static_cast<struct mem_zone *>(malloc(sizeof(struct mem_zone)));
+    assert(zone != NULL);
+    zone->first = NULL;
+    zone->total = 0;
+    zone->highwater = 0;
+    zone->limit = 0;
+    zone->notlifo = 0;
+    zone->rogue = 0;
+    strm->opaque = zone;
+    strm->zalloc = mem_alloc;
+    strm->zfree = mem_free;
+}
+
+/* set a limit on the total memory allocation, or 0 to remove the limit */
+local void mem_limit(z_stream *strm, size_t limit)
+{
+    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
+
+    zone->limit = limit;
+}
+
+/* show the current total requested allocations in bytes */
+local void mem_used(z_stream *strm, const char *prefix)
+{
+    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
+
+    std::cout << prefix << ": " << zone->total << " allocated" << std::endl;
+}
+
+/* show the high water allocation in bytes */
+local void mem_high(z_stream *strm, const char *prefix)
+{
+    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
+
+    std::cout << prefix << ": " << zone->highwater << " high water mark" << std::endl;
+}
+
+/* release the memory allocation zone -- if there are any surprises, notify */
+local void mem_done(z_stream *strm, const char *prefix)
+{
+    int count = 0;
+    struct mem_item *item, *next;
+    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
+
+    /* show high water mark */
+    mem_high(strm, prefix);
+
+    /* free leftover allocations and item structures, if any */
+    item = zone->first;
+    while (item != NULL) {
+        free(item->ptr);
+        next = item->next;
+        free(item);
+        item = next;
+        count++;
+    }
+
+    /* issue alerts about anything unexpected */
+    if (count || zone->total)
+        std::cout << "** " << prefix << ": "
+                  << zone->total << " bytes in "
+                  << count << " blocks not freed"
+                  << std::endl;
+
+    if (zone->notlifo)
+        std::cout << "** " << prefix << ": "
+                  << zone->notlifo << " frees not LIFO"
+                  << std::endl;
+
+    if (zone->rogue)
+        std::cout << "** " << prefix << ": "
+                  << zone->rogue << " frees not recognized"
+                  << std::endl;
+
+    /* free the zone and delete from the stream */
+    free(zone);
+    strm->opaque = Z_NULL;
+    strm->zalloc = Z_NULL;
+    strm->zfree = Z_NULL;
+}
+
+/* -- inflate test routines -- */
+
+/* Decode a hexadecimal string, set *len to length, in[] to the bytes.  This
+   decodes liberally, in that hex digits can be adjacent, in which case two in
+   a row writes a byte.  Or they can be delimited by any non-hex character,
+   where the delimiters are ignored except when a single hex digit is followed
+   by a delimiter, where that single digit writes a byte.  The returned data is
+   allocated and must eventually be freed.  NULL is returned if out of memory.
+   If the length is not needed, then len can be NULL. */
+local unsigned char *h2b(const char *hex, unsigned *len)
+{
+    unsigned char *in, *re;
+    unsigned next, val;
+
+    in = static_cast<unsigned char *>(malloc((strlen(hex) + 1) >> 1));
+    if (in == NULL)
+        return NULL;
+    next = 0;
+    val = 1;
+    do {
+        if (*hex >= '0' && *hex <= '9')
+            val = (val << 4) + *hex - '0';
+        else if (*hex >= 'A' && *hex <= 'F')
+            val = (val << 4) + *hex - 'A' + 10;
+        else if (*hex >= 'a' && *hex <= 'f')
+            val = (val << 4) + *hex - 'a' + 10;
+        else if (val != 1 && val < 32)  /* one digit followed by delimiter */
+            val += 240;                 /* make it look like two digits */
+        if (val > 255) {                /* have two digits */
+            in[next++] = val & 0xff;    /* save the decoded byte */
+            val = 1;                    /* start over */
+        }
+    } while (*hex++);       /* go through the loop with the terminating null */
+    if (len != NULL)
+        *len = next;
+    re = static_cast<unsigned char *>(realloc(in, next));
+    return re == NULL ? in : re;
+}
+
+/* generic inflate() run, where hex is the hexadecimal input data, what is the
+   text to include in an error message, step is how much input data to feed
+   inflate() on each call, or zero to feed it all, win is the window bits
+   parameter to inflateInit2(), len is the size of the output buffer, and err
+   is the error code expected from the first inflate() call (the second
+   inflate() call is expected to return Z_STREAM_END).  If win is 47, then
+   header information is collected with inflateGetHeader().  If a zlib stream
+   is looking for a dictionary, then an empty dictionary is provided.
+   inflate() is run until all of the input data is consumed. */
+local void inf(const char *hex, const char *what, unsigned step, int win, unsigned len,
+               int err)
+{
+    int ret;
+    unsigned have;
+    unsigned char *in, *out;
+    z_stream strm, copy;
+    gz_header head;
+
+    mem_setup(&strm);
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit2(&strm, win);
+    if (ret != Z_OK) {
+        mem_done(&strm, what);
+        return;
+    }
+    out = static_cast<unsigned char *>(malloc(len));                          assert(out != NULL);
+    if (win == 47) {
+        head.extra = out;
+        head.extra_max = len;
+        head.name = out;
+        head.name_max = len;
+        head.comment = out;
+        head.comm_max = len;
+        ret = inflateGetHeader(&strm, &head);   assert(ret == Z_OK);
+    }
+    in = h2b(hex, &have);                       assert(in != NULL);
+    if (step == 0 || step > have)
+        step = have;
+    strm.avail_in = step;
+    have -= step;
+    strm.next_in = in;
+    do {
+        strm.avail_out = len;
+        strm.next_out = out;
+        ret = inflate(&strm, Z_NO_FLUSH);       assert(err == 9 || ret == err);
+        if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT)
+            break;
+        if (ret == Z_NEED_DICT) {
+            ret = inflateSetDictionary(&strm, in, 1);
+                                                assert(ret == Z_DATA_ERROR);
+            mem_limit(&strm, 1);
+            ret = inflateSetDictionary(&strm, out, 0);
+                                                assert(ret == Z_MEM_ERROR);
+            mem_limit(&strm, 0);
+            ((struct inflate_state *)strm.state)->mode = DICT;
+            ret = inflateSetDictionary(&strm, out, 0);
+                                                assert(ret == Z_OK);
+            ret = inflate(&strm, Z_NO_FLUSH);   assert(ret == Z_BUF_ERROR);
+        }
+        ret = inflateCopy(&copy, &strm);        assert(ret == Z_OK);
+        ret = inflateEnd(&copy);                assert(ret == Z_OK);
+        err = 9;                        /* don't care next time around */
+        have += strm.avail_in;
+        strm.avail_in = step > have ? have : step;
+        have -= strm.avail_in;
+    } while (strm.avail_in);
+    free(in);
+    free(out);
+    ret = inflateReset2(&strm, -8);             assert(ret == Z_OK);
+    ret = inflateEnd(&strm);                    assert(ret == Z_OK);
+    mem_done(&strm, what);
+}
+
+/* cover all of the lines in inflate.c up to inflate() */
+void cover_support(void)
+{
+    int ret;
+    z_stream strm;
+
+    mem_setup(&strm);
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit(&strm);                   assert(ret == Z_OK);
+    mem_used(&strm, "inflate init");
+    ret = inflatePrime(&strm, 5, 31);           assert(ret == Z_OK);
+    ret = inflatePrime(&strm, -1, 0);           assert(ret == Z_OK);
+    ret = inflateSetDictionary(&strm, Z_NULL, 0);
+                                                assert(ret == Z_STREAM_ERROR);
+    ret = inflateEnd(&strm);                    assert(ret == Z_OK);
+    mem_done(&strm, "prime");
+
+    inf("63 0", "force window allocation", 0, -15, 1, Z_OK);
+    inf("63 18 5", "force window replacement", 0, -8, 259, Z_OK);
+    inf("63 18 68 30 d0 0 0", "force split window update", 4, -8, 259, Z_OK);
+    inf("3 0", "use fixed blocks", 0, -15, 1, Z_STREAM_END);
+    inf("", "bad window size", 0, 1, 0, Z_STREAM_ERROR);
+
+    mem_setup(&strm);
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    char versioncpy[] = ZLIB_VERSION;
+    versioncpy[0] -= 1;
+    ret = inflateInit_(&strm, versioncpy, (int)sizeof(z_stream));
+                                                assert(ret == Z_VERSION_ERROR);
+    mem_done(&strm, "wrong version");
+
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit(&strm);                   assert(ret == Z_OK);
+    ret = inflateEnd(&strm);                    assert(ret == Z_OK);
+    std::cout << "inflate built-in memory routines" << std::endl;;
+}
+
+/* cover all inflate() header and trailer cases and code after inflate() */
+void cover_wrap(void)
+{
+    int ret;
+    z_stream strm, copy;
+    unsigned char dict[257];
+
+    ret = inflate(Z_NULL, 0);                   assert(ret == Z_STREAM_ERROR);
+    ret = inflateEnd(Z_NULL);                   assert(ret == Z_STREAM_ERROR);
+    ret = inflateCopy(Z_NULL, Z_NULL);          assert(ret == Z_STREAM_ERROR);
+    std::cout << "inflate bad parameters" << std::endl;
+
+    inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR);
+    inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR);
+    inf("77 85", "bad zlib method", 0, 15, 0, Z_DATA_ERROR);
+    inf("8 99", "set window size from header", 0, 0, 0, Z_OK);
+    inf("78 9c", "bad zlib window size", 0, 8, 0, Z_DATA_ERROR);
+    inf("78 9c 63 0 0 0 1 0 1", "check adler32", 0, 15, 1, Z_STREAM_END);
+    inf("1f 8b 8 1e 0 0 0 0 0 0 1 0 0 0 0 0 0", "bad header crc", 0, 47, 1,
+        Z_DATA_ERROR);
+    inf("1f 8b 8 2 0 0 0 0 0 0 1d 26 3 0 0 0 0 0 0 0 0 0", "check gzip length",
+        0, 47, 0, Z_STREAM_END);
+    inf("78 90", "bad zlib header check", 0, 47, 0, Z_DATA_ERROR);
+    inf("8 b8 0 0 0 1", "need dictionary", 0, 8, 0, Z_NEED_DICT);
+    inf("78 9c 63 0", "compute adler32", 0, 15, 1, Z_OK);
+
+    mem_setup(&strm);
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit2(&strm, -8);
+    strm.avail_in = 2;
+    strm.next_in = (Bytef *)"\x63";
+    strm.avail_out = 1;
+    strm.next_out = (Bytef *)&ret;
+    mem_limit(&strm, 1);
+    ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_MEM_ERROR);
+    ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_MEM_ERROR);
+    mem_limit(&strm, 0);
+    memset(dict, 0, 257);
+    ret = inflateSetDictionary(&strm, dict, 257);
+                                                assert(ret == Z_OK);
+    mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256);
+    ret = inflatePrime(&strm, 16, 0);           assert(ret == Z_OK);
+    strm.avail_in = 2;
+    strm.next_in = (Bytef *)"\x80";
+    ret = inflateSync(&strm);                   assert(ret == Z_DATA_ERROR);
+    ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_STREAM_ERROR);
+    strm.avail_in = 4;
+    strm.next_in = (Bytef *)"\0\0\xff\xff";
+    ret = inflateSync(&strm);                   assert(ret == Z_OK);
+    (void)inflateSyncPoint(&strm);
+    ret = inflateCopy(&copy, &strm);            assert(ret == Z_MEM_ERROR);
+    mem_limit(&strm, 0);
+    ret = inflateUndermine(&strm, 1);           assert(ret == Z_DATA_ERROR);
+    (void)inflateMark(&strm);
+    ret = inflateEnd(&strm);                    assert(ret == Z_OK);
+    mem_done(&strm, "miscellaneous, force memory errors");
+}
+
+/* input and output functions for inflateBack() */
+local unsigned pull(void *desc, unsigned char **buf)
+{
+    static unsigned int next = 0;
+    static unsigned char dat[] = {0x63, 0, 2, 0};
+    struct inflate_state *state;
+
+    if (desc == Z_NULL) {
+        next = 0;
+        return 0;   /* no input (already provided at next_in) */
+    }
+    state = reinterpret_cast<struct inflate_state *>(((z_stream *)desc)->state);
+    if (state != Z_NULL)
+        state->mode = SYNC;     /* force an otherwise impossible situation */
+    return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0;
+}
+
+local int push(void *desc, unsigned char *buf, unsigned len)
+{
+    buf += len;
+    return desc != Z_NULL;      /* force error if desc not null */
+}
+
+/* cover inflateBack() up to common deflate data cases and after those */
+void cover_back(void)
+{
+    int ret;
+    z_stream strm;
+    unsigned char win[32768];
+
+    ret = inflateBackInit_(Z_NULL, 0, win, 0, 0);
+                                                assert(ret == Z_VERSION_ERROR);
+    ret = inflateBackInit(Z_NULL, 0, win);      assert(ret == Z_STREAM_ERROR);
+    ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL);
+                                                assert(ret == Z_STREAM_ERROR);
+    ret = inflateBackEnd(Z_NULL);               assert(ret == Z_STREAM_ERROR);
+    std::cout << "inflateBack bad parameters" << std::endl;;
+
+    mem_setup(&strm);
+    ret = inflateBackInit(&strm, 15, win);      assert(ret == Z_OK);
+    strm.avail_in = 2;
+    strm.next_in = (Bytef *)"\x03";
+    ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL);
+                                                assert(ret == Z_STREAM_END);
+        /* force output error */
+    strm.avail_in = 3;
+    strm.next_in = (Bytef *)"\x63\x00";
+    ret = inflateBack(&strm, pull, Z_NULL, push, &strm);
+                                                assert(ret == Z_BUF_ERROR);
+        /* force mode error by mucking with state */
+    ret = inflateBack(&strm, pull, &strm, push, Z_NULL);
+                                                assert(ret == Z_STREAM_ERROR);
+    ret = inflateBackEnd(&strm);                assert(ret == Z_OK);
+    mem_done(&strm, "inflateBack bad state");
+
+    ret = inflateBackInit(&strm, 15, win);      assert(ret == Z_OK);
+    ret = inflateBackEnd(&strm);                assert(ret == Z_OK);
+    std::cout << "inflateBack built-in memory routines" << std::endl;;
+}
+
+/* do a raw inflate of data in hexadecimal with both inflate and inflateBack */
+local int try(const char *hex, const char *id, int err)
+{
+    int ret;
+    unsigned len, size;
+    unsigned char *in, *out, *win;
+    char *prefix;
+    z_stream strm;
+
+    /* convert to hex */
+    in = h2b(hex, &len);
+    assert(in != NULL);
+
+    /* allocate work areas */
+    size = len << 3;
+    out = static_cast<unsigned char *>(malloc(size));
+    assert(out != NULL);
+    win = static_cast<unsigned char *>(malloc(32768));
+    assert(win != NULL);
+    prefix = static_cast<char *>(malloc(strlen(id) + 6));
+    assert(prefix != NULL);
+
+    /* first with inflate */
+    strcpy(prefix, id);
+    strcat(prefix, "-late");
+    mem_setup(&strm);
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit2(&strm, err < 0 ? 47 : -15);
+    assert(ret == Z_OK);
+    strm.avail_in = len;
+    strm.next_in = in;
+    do {
+        strm.avail_out = size;
+        strm.next_out = out;
+        ret = inflate(&strm, Z_TREES);
+        assert(ret != Z_STREAM_ERROR && ret != Z_MEM_ERROR);
+        if (ret == Z_DATA_ERROR || ret == Z_NEED_DICT)
+            break;
+    } while (strm.avail_in || strm.avail_out == 0);
+    if (err) {
+        assert(ret == Z_DATA_ERROR);
+        assert(strcmp(id, strm.msg) == 0);
+    }
+    inflateEnd(&strm);
+    mem_done(&strm, prefix);
+
+    /* then with inflateBack */
+    if (err >= 0) {
+        strcpy(prefix, id);
+        strcat(prefix, "-back");
+        mem_setup(&strm);
+        ret = inflateBackInit(&strm, 15, win);
+        assert(ret == Z_OK);
+        strm.avail_in = len;
+        strm.next_in = in;
+        ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL);
+        assert(ret != Z_STREAM_ERROR);
+        if (err) {
+            assert(ret == Z_DATA_ERROR);
+            assert(strcmp(id, strm.msg) == 0);
+        }
+        inflateBackEnd(&strm);
+        mem_done(&strm, prefix);
+    }
+
+    /* clean up */
+    free(prefix);
+    free(win);
+    free(out);
+    free(in);
+    return ret;
+}
+
+/* cover deflate data cases in both inflate() and inflateBack() */
+void cover_inflate(void)
+{
+    try("0 0 0 0 0", "invalid stored block lengths", 1);
+    try("3 0", "fixed", 0);
+    try("6", "invalid block type", 1);
+    try("1 1 0 fe ff 0", "stored", 0);
+    try("fc 0 0", "too many length or distance symbols", 1);
+    try("4 0 fe ff", "invalid code lengths set", 1);
+    try("4 0 24 49 0", "invalid bit length repeat", 1);
+    try("4 0 24 e9 ff ff", "invalid bit length repeat", 1);
+    try("4 0 24 e9 ff 6d", "invalid code -- missing end-of-block", 1);
+    try("4 80 49 92 24 49 92 24 71 ff ff 93 11 0",
+        "invalid literal/lengths set", 1);
+    try("4 80 49 92 24 49 92 24 f b4 ff ff c3 84", "invalid distances set", 1);
+    try("4 c0 81 8 0 0 0 0 20 7f eb b 0 0", "invalid literal/length code", 1);
+    try("2 7e ff ff", "invalid distance code", 1);
+    try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 1);
+
+    /* also trailer mismatch just in inflate() */
+    try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 1", "incorrect data check", -1);
+    try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1",
+        "incorrect length check", -1);
+    try("5 c0 21 d 0 0 0 80 b0 fe 6d 2f 91 6c", "pull 17", 0);
+    try("5 e0 81 91 24 cb b2 2c 49 e2 f 2e 8b 9a 47 56 9f fb fe ec d2 ff 1f",
+        "long code", 0);
+    try("ed c0 1 1 0 0 0 40 20 ff 57 1b 42 2c 4f", "length extra", 0);
+    try("ed cf c1 b1 2c 47 10 c4 30 fa 6f 35 1d 1 82 59 3d fb be 2e 2a fc f c",
+        "long distance and extra", 0);
+    try("ed c0 81 0 0 0 0 80 a0 fd a9 17 a9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
+        "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6", "window end", 0);
+    inf("2 8 20 80 0 3 0", "inflate_fast TYPE return", 0, -15, 258,
+        Z_STREAM_END);
+    inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK);
+}
+
+/* XXX(cavalcantii): fix linking error due inflate_table. */
+/* cover remaining lines in inftrees.c */
+/* void cover_trees(void) */
+/* { */
+/*     int ret; */
+/*     unsigned bits; */
+/*     unsigned short lens[16], work[16]; */
+/*     code *next, table[ENOUGH_DISTS]; */
+
+/*     /\* we need to call inflate_table() directly in order to manifest not- */
+/*        enough errors, since zlib insures that enough is always enough *\/ */
+/*     for (bits = 0; bits < 15; bits++) */
+/*         lens[bits] = (unsigned short)(bits + 1); */
+/*     lens[15] = 15; */
+/*     next = table; */
+/*     bits = 15; */
+/*     ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */
+/*                                                 assert(ret == 1); */
+/*     next = table; */
+/*     bits = 1; */
+/*     ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */
+/*                                                 assert(ret == 1); */
+/*     fputs("inflate_table not enough errors\n", stderr); */
+/* } */
+
+/* cover remaining inffast.c decoding and window copying */
+void cover_fast(void)
+{
+    inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68"
+        " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR);
+    inf("25 fd 81 b5 6d 59 b6 6a 49 ea af 35 6 34 eb 8c b9 f6 b9 1e ef 67 49"
+        " 50 fe ff ff 3f 0 0", "fast distance extra bits", 0, -8, 258,
+        Z_DATA_ERROR);
+    inf("3 7e 0 0 0 0 0", "fast invalid distance code", 0, -8, 258,
+        Z_DATA_ERROR);
+    inf("1b 7 0 0 0 0 0", "fast invalid literal/length code", 0, -8, 258,
+        Z_DATA_ERROR);
+    inf("d c7 1 ae eb 38 c 4 41 a0 87 72 de df fb 1f b8 36 b1 38 5d ff ff 0",
+        "fast 2nd level codes and too far back", 0, -8, 258, Z_DATA_ERROR);
+    inf("63 18 5 8c 10 8 0 0 0 0", "very common case", 0, -8, 259, Z_OK);
+    inf("63 60 60 18 c9 0 8 18 18 18 26 c0 28 0 29 0 0 0",
+        "contiguous and wrap around window", 6, -8, 259, Z_OK);
+    inf("63 0 3 0 0 0 0 0", "copy direct from output", 0, -8, 259,
+        Z_STREAM_END);
+}
+
+/* Adapted from Evgeny Legerov PoC (https://github.com/ivd38/zlib_overflow)
+ * this test case crashes in ASAN builds with the correct payload.
+ */
+local void inf_cve_2022_37434(char *hex, char *what, unsigned step, int win, unsigned len,
+                              int err)
+{
+    int ret;
+    unsigned have;
+    unsigned char *in, *out;
+    z_stream strm, copy;
+    gz_header head;
+
+    mem_setup(&strm);
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit2(&strm, win);
+    if (ret != Z_OK) {
+        mem_done(&strm, what);
+        return;
+    }
+    out = static_cast<unsigned char *>(malloc(len));                          assert(out != NULL);
+    if (win == 47) {
+        head.extra = out;
+        head.extra_max = len;
+        head.name = out;
+        head.name_max = len;
+        head.comment = out;
+        head.comm_max = len;
+        ret = inflateGetHeader(&strm, &head);   assert(ret == Z_OK);
+    }
+    in = h2b(hex, &have);                       assert(in != NULL);
+    if (step == 0 || step > have)
+        step = have;
+    strm.avail_in = step;
+    have -= step;
+    strm.next_in = in;
+    do {
+        strm.avail_out = len;
+        strm.next_out = out;
+        ret = inflate(&strm, Z_NO_FLUSH);
+        if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT)
+            break;
+        have += strm.avail_in;
+        strm.avail_in = step > have ? have : step;
+        have -= strm.avail_in;
+    } while (strm.avail_in);
+    free(in);
+    free(out);
+    ret = inflateReset2(&strm, -8);
+    ret = inflateEnd(&strm);
+    mem_done(&strm, what);
+}
+
+void cover_CVE_2022_37434(void)
+{
+    char payload[] = "1f 8b 08 04 61 62 63 64 61 62 52 51 1f 8b 08 04 61 62 63 64 61 62 52 51 1f 8b 08 04 61 62 63 64 61 62 52 51 1f 8b 08 04 61 62 63 64 61 62 52 51";
+    char cve[] = "wtf";
+    inf_cve_2022_37434(payload, cve, 13, 47, 12, Z_OK);
+}
+
+// clang-format on
diff --git a/deps/zlib/contrib/tests/infcover.h b/deps/zlib/contrib/tests/infcover.h
new file mode 100644
index 00000000000000..dbf67d7b4dd31c
--- /dev/null
+++ b/deps/zlib/contrib/tests/infcover.h
@@ -0,0 +1,12 @@
+#ifndef __INF_COVER_H__
+#define __INF_COVER_H__
+
+void cover_support(void);
+void cover_wrap(void);
+void cover_back(void);
+void cover_inflate(void);
+void cover_trees(void);
+void cover_fast(void);
+
+void cover_CVE_2022_37434(void);
+#endif
diff --git a/deps/zlib/contrib/tests/run_all_unittests.cc b/deps/zlib/contrib/tests/run_all_unittests.cc
new file mode 100644
index 00000000000000..af2ef5dfaa445d
--- /dev/null
+++ b/deps/zlib/contrib/tests/run_all_unittests.cc
@@ -0,0 +1,14 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/bind.h"
+#include "base/test/launcher/unit_test_launcher.h"
+#include "base/test/test_suite.h"
+
+int main(int argc, char** argv) {
+  base::TestSuite test_suite(argc, argv);
+  return base::LaunchUnitTests(
+      argc, argv,
+      base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
+}
diff --git a/deps/zlib/contrib/tests/utils_unittest.cc b/deps/zlib/contrib/tests/utils_unittest.cc
new file mode 100644
index 00000000000000..5745939f24f9d1
--- /dev/null
+++ b/deps/zlib/contrib/tests/utils_unittest.cc
@@ -0,0 +1,1017 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the Chromium source repository LICENSE file.
+
+#include "infcover.h"
+
+#include <cstddef>
+#include <vector>
+
+#include "compression_utils_portable.h"
+#include "gtest.h"
+#include "zlib.h"
+
+void TestPayloads(size_t input_size, zlib_internal::WrapperType type) {
+  std::vector<unsigned char> input;
+  input.reserve(input_size);
+  for (size_t i = 1; i <= input_size; ++i)
+    input.push_back(i & 0xff);
+
+  // If it is big enough for GZIP, will work for other wrappers.
+  std::vector<unsigned char> compressed(
+      zlib_internal::GzipExpectedCompressedSize(input.size()));
+  std::vector<unsigned char> decompressed(input.size());
+
+  // Libcores's java/util/zip/Deflater default settings: ZLIB,
+  // DEFAULT_COMPRESSION and DEFAULT_STRATEGY.
+  unsigned long compressed_size = static_cast<unsigned long>(compressed.size());
+  int result = zlib_internal::CompressHelper(
+      type, compressed.data(), &compressed_size, input.data(), input.size(),
+      Z_DEFAULT_COMPRESSION, nullptr, nullptr);
+  ASSERT_EQ(result, Z_OK);
+
+  unsigned long decompressed_size =
+      static_cast<unsigned long>(decompressed.size());
+  result = zlib_internal::UncompressHelper(type, decompressed.data(),
+                                           &decompressed_size,
+                                           compressed.data(), compressed_size);
+  ASSERT_EQ(result, Z_OK);
+  EXPECT_EQ(input, decompressed);
+}
+
+TEST(ZlibTest, ZlibWrapper) {
+  // Minimal ZLIB wrapped short stream size is about 8 bytes.
+  for (size_t i = 1; i < 1024; ++i)
+    TestPayloads(i, zlib_internal::WrapperType::ZLIB);
+}
+
+TEST(ZlibTest, GzipWrapper) {
+  // GZIP should be 12 bytes bigger than ZLIB wrapper.
+  for (size_t i = 1; i < 1024; ++i)
+    TestPayloads(i, zlib_internal::WrapperType::GZIP);
+}
+
+TEST(ZlibTest, RawWrapper) {
+  // RAW has no wrapper (V8 Blobs is a known user), size
+  // should be payload_size + 2 for short payloads.
+  for (size_t i = 1; i < 1024; ++i)
+    TestPayloads(i, zlib_internal::WrapperType::ZRAW);
+}
+
+TEST(ZlibTest, InflateCover) {
+  cover_support();
+  cover_wrap();
+  cover_back();
+  cover_inflate();
+  // TODO(cavalcantii): enable this last test.
+  // cover_trees();
+  cover_fast();
+}
+
+TEST(ZlibTest, InflateCVE) {
+  cover_CVE_2022_37434();
+}
+
+TEST(ZlibTest, DeflateStored) {
+  const int no_compression = 0;
+  const zlib_internal::WrapperType type = zlib_internal::WrapperType::GZIP;
+  std::vector<unsigned char> input(1 << 10, 42);
+  std::vector<unsigned char> compressed(
+      zlib_internal::GzipExpectedCompressedSize(input.size()));
+  std::vector<unsigned char> decompressed(input.size());
+  unsigned long compressed_size = static_cast<unsigned long>(compressed.size());
+  int result = zlib_internal::CompressHelper(
+      type, compressed.data(), &compressed_size, input.data(), input.size(),
+      no_compression, nullptr, nullptr);
+  ASSERT_EQ(result, Z_OK);
+
+  unsigned long decompressed_size =
+      static_cast<unsigned long>(decompressed.size());
+  result = zlib_internal::UncompressHelper(type, decompressed.data(),
+                                           &decompressed_size,
+                                           compressed.data(), compressed_size);
+  ASSERT_EQ(result, Z_OK);
+  EXPECT_EQ(input, decompressed);
+}
+
+TEST(ZlibTest, StreamingInflate) {
+  uint8_t comp_buf[4096], decomp_buf[4096];
+  z_stream comp_strm, decomp_strm;
+  int ret;
+
+  std::vector<uint8_t> src;
+  for (size_t i = 0; i < 1000; i++) {
+    for (size_t j = 0; j < 40; j++) {
+      src.push_back(j);
+    }
+  }
+
+  // Deflate src into comp_buf.
+  comp_strm.zalloc = Z_NULL;
+  comp_strm.zfree = Z_NULL;
+  comp_strm.opaque = Z_NULL;
+  ret = deflateInit(&comp_strm, Z_BEST_COMPRESSION);
+  ASSERT_EQ(ret, Z_OK);
+  comp_strm.next_out = comp_buf;
+  comp_strm.avail_out = sizeof(comp_buf);
+  comp_strm.next_in = src.data();
+  comp_strm.avail_in = src.size();
+  ret = deflate(&comp_strm, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  size_t comp_sz = sizeof(comp_buf) - comp_strm.avail_out;
+
+  // Inflate comp_buf one 4096-byte buffer at a time.
+  decomp_strm.zalloc = Z_NULL;
+  decomp_strm.zfree = Z_NULL;
+  decomp_strm.opaque = Z_NULL;
+  ret = inflateInit(&decomp_strm);
+  ASSERT_EQ(ret, Z_OK);
+  decomp_strm.next_in = comp_buf;
+  decomp_strm.avail_in = comp_sz;
+
+  while (decomp_strm.avail_in > 0) {
+    decomp_strm.next_out = decomp_buf;
+    decomp_strm.avail_out = sizeof(decomp_buf);
+    ret = inflate(&decomp_strm, Z_FINISH);
+    ASSERT_TRUE(ret == Z_OK || ret == Z_STREAM_END || ret == Z_BUF_ERROR);
+
+    // Verify the output bytes.
+    size_t num_out = sizeof(decomp_buf) - decomp_strm.avail_out;
+    for (size_t i = 0; i < num_out; i++) {
+      EXPECT_EQ(decomp_buf[i], src[decomp_strm.total_out - num_out + i]);
+    }
+  }
+
+  // Cleanup memory (i.e. makes ASAN bot happy).
+  ret = deflateEnd(&comp_strm);
+  EXPECT_EQ(ret, Z_OK);
+  ret = inflateEnd(&decomp_strm);
+  EXPECT_EQ(ret, Z_OK);
+}
+
+TEST(ZlibTest, CRCHashBitsCollision) {
+  // The CRC32c of the hex sequences 2a,14,14,14 and 2a,14,db,14 have the same
+  // lower 9 bits. Since longest_match doesn't check match[2], a bad match could
+  // be chosen when the number of hash bits is <= 9. For this reason, the number
+  // of hash bits must be set higher, regardless of the memlevel parameter, when
+  // using CRC32c hashing for string matching. See https://crbug.com/1113596
+
+  std::vector<uint8_t> src = {
+      // Random byte; zlib doesn't match at offset 0.
+      123,
+
+      // This will look like 5-byte match.
+      0x2a,
+      0x14,
+      0xdb,
+      0x14,
+      0x15,
+
+      // Offer a 4-byte match to bump the next expected match length to 5.
+      0x2a,
+      0x14,
+      0x14,
+      0x14,
+
+      0x2a,
+      0x14,
+      0x14,
+      0x14,
+      0x15,
+  };
+
+  z_stream stream;
+  stream.zalloc = nullptr;
+  stream.zfree = nullptr;
+
+  // Using a low memlevel to try to reduce the number of hash bits. Negative
+  // windowbits means raw deflate, i.e. without the zlib header.
+  int ret = deflateInit2(&stream, /*comp level*/ 2, /*method*/ Z_DEFLATED,
+                         /*windowbits*/ -15, /*memlevel*/ 2,
+                         /*strategy*/ Z_DEFAULT_STRATEGY);
+  ASSERT_EQ(ret, Z_OK);
+  std::vector<uint8_t> compressed(100, '\0');
+  stream.next_out = compressed.data();
+  stream.avail_out = compressed.size();
+  stream.next_in = src.data();
+  stream.avail_in = src.size();
+  ret = deflate(&stream, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  compressed.resize(compressed.size() - stream.avail_out);
+  deflateEnd(&stream);
+
+  ret = inflateInit2(&stream, /*windowbits*/ -15);
+  ASSERT_EQ(ret, Z_OK);
+  std::vector<uint8_t> decompressed(src.size(), '\0');
+  stream.next_in = compressed.data();
+  stream.avail_in = compressed.size();
+  stream.next_out = decompressed.data();
+  stream.avail_out = decompressed.size();
+  ret = inflate(&stream, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  EXPECT_EQ(0U, stream.avail_out);
+  inflateEnd(&stream);
+
+  EXPECT_EQ(src, decompressed);
+}
+
+TEST(ZlibTest, CRCHashAssert) {
+  // The CRC32c of the hex sequences ff,ff,5e,6f and ff,ff,13,ff have the same
+  // lower 15 bits. This means longest_match's assert that match[2] == scan[2]
+  // won't hold. However, such hash collisions are only possible when one of the
+  // other four bytes also mismatch. This tests that zlib's assert handles this
+  // case.
+
+  std::vector<uint8_t> src = {
+      // Random byte; zlib doesn't match at offset 0.
+      123,
+
+      // This has the same hash as the last byte sequence, and the first two and
+      // last two bytes match; though the third and the fourth don't.
+      0xff,
+      0xff,
+      0x5e,
+      0x6f,
+      0x12,
+      0x34,
+
+      // Offer a 5-byte match to bump the next expected match length to 6
+      // (because the two first and two last bytes need to match).
+      0xff,
+      0xff,
+      0x13,
+      0xff,
+      0x12,
+
+      0xff,
+      0xff,
+      0x13,
+      0xff,
+      0x12,
+      0x34,
+  };
+
+  z_stream stream;
+  stream.zalloc = nullptr;
+  stream.zfree = nullptr;
+
+  int ret = deflateInit2(&stream, /*comp level*/ 5, /*method*/ Z_DEFLATED,
+                         /*windowbits*/ -15, /*memlevel*/ 8,
+                         /*strategy*/ Z_DEFAULT_STRATEGY);
+  ASSERT_EQ(ret, Z_OK);
+  std::vector<uint8_t> compressed(100, '\0');
+  stream.next_out = compressed.data();
+  stream.avail_out = compressed.size();
+  stream.next_in = src.data();
+  stream.avail_in = src.size();
+  ret = deflate(&stream, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  compressed.resize(compressed.size() - stream.avail_out);
+  deflateEnd(&stream);
+
+  ret = inflateInit2(&stream, /*windowbits*/ -15);
+  ASSERT_EQ(ret, Z_OK);
+  std::vector<uint8_t> decompressed(src.size(), '\0');
+  stream.next_in = compressed.data();
+  stream.avail_in = compressed.size();
+  stream.next_out = decompressed.data();
+  stream.avail_out = decompressed.size();
+  ret = inflate(&stream, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  EXPECT_EQ(0U, stream.avail_out);
+  inflateEnd(&stream);
+
+  EXPECT_EQ(src, decompressed);
+}
+
+// Fuzzer generated.
+static const uint8_t checkMatchCrashData[] = {
+    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
+    0x6e, 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x01, 0x39, 0x6e, 0x6e,
+    0x00, 0x00, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6e,
+    0x00, 0x00, 0x0a, 0x9a, 0x00, 0x00, 0x6e, 0x6e, 0x6e, 0x2a, 0x00, 0x00,
+    0x00, 0xd5, 0xf0, 0x00, 0x81, 0x02, 0xf3, 0xfd, 0xff, 0xab, 0xf3, 0x6e,
+    0x7e, 0x04, 0x5b, 0xf6, 0x2a, 0x2c, 0xf8, 0x00, 0x54, 0xf3, 0xa5, 0x0e,
+    0xfd, 0x6e, 0xff, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xa4, 0x0b, 0xa5, 0x2a, 0x0d, 0x10, 0x01, 0x26, 0xf6, 0x04, 0x0e,
+    0xff, 0x6e, 0x6e, 0x6e, 0x76, 0x00, 0x00, 0x87, 0x01, 0xfe, 0x0d, 0xb6,
+    0x6e, 0x6e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xfd, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x9b,
+    0x02, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+    0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x6e, 0xff, 0xff, 0x00,
+    0x00, 0xd5, 0xf0, 0x00, 0xff, 0x40, 0x7e, 0x0b, 0xa5, 0x10, 0x67, 0x01,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x40, 0x7e, 0x0b, 0xa5, 0x10, 0x67,
+    0x7e, 0x32, 0x6e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x40, 0x0b, 0xa5,
+    0x10, 0x67, 0x01, 0xfe, 0x0d, 0xb6, 0x2a, 0x00, 0x00, 0x58, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x6e, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x3d, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xd6, 0x2d, 0x2d, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+    0x8a, 0x8a, 0x8a, 0x8a, 0x66, 0x8a, 0x8a, 0x8a, 0xee, 0x1d, 0x00, 0x00,
+    0x00, 0x02, 0x00, 0x00, 0x00, 0xee, 0x0a, 0x00, 0x00, 0x00, 0x54, 0x40,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x23, 0x7e, 0x00, 0x1e,
+    0x00, 0x00, 0xd5, 0xf0, 0x00, 0xff, 0x40, 0x0b, 0xa5, 0x10, 0x67, 0x01,
+    0xfe, 0x0d, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+    0x8a, 0x8a, 0x8a, 0x2d, 0x6e, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0e,
+    0xfb, 0x00, 0x10, 0x24, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xff, 0x1f,
+    0xb3, 0x00, 0x04, 0x3d, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+    0x01, 0x45, 0x3d, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x11, 0x21, 0x00, 0x1e,
+    0x00, 0x0c, 0xb3, 0xfe, 0x0e, 0xee, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6e, 0x00,
+    0x00, 0x87, 0x00, 0x33, 0x38, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x00, 0x00,
+    0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0xff, 0x04, 0x3f, 0xff, 0xff, 0xff,
+    0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x31, 0x13, 0x13, 0x13,
+    0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x30, 0x83, 0x33,
+    0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xff, 0x00, 0x01,
+    0x10, 0x0d, 0x2a, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x11,
+    0x21, 0x00, 0xa5, 0x00, 0x68, 0x68, 0x68, 0x67, 0x00, 0x00, 0xff, 0xff,
+    0x02, 0x00, 0x00, 0x68, 0x68, 0x68, 0x68, 0x00, 0x00, 0xfa, 0xff, 0xff,
+    0x03, 0x01, 0xff, 0x02, 0x00, 0x00, 0x68, 0x68, 0x68, 0x68, 0x0a, 0x10,
+    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+    0x06, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xfa, 0xff, 0xff, 0x08, 0xff, 0xff, 0xff, 0x00, 0x06, 0x04,
+    0x00, 0xf8, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
+    0x00, 0xff, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x78, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0x06, 0x04, 0x6e,
+    0x7e, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00,
+    0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x6e, 0x6e, 0x6e,
+    0x00, 0x01, 0x38, 0xd5, 0xf0, 0x00, 0x00, 0x2a, 0xfe, 0x04, 0x5b, 0x0d,
+    0xfd, 0x6e, 0x92, 0x28, 0xf9, 0xfb, 0xff, 0x07, 0xd2, 0xd6, 0x2d, 0x2d,
+    0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+    0x8a, 0x8a, 0xc2, 0x91, 0x00, 0x5b, 0xef, 0xde, 0xf2, 0x6e, 0x6e, 0xfd,
+    0x0c, 0x02, 0x91, 0x62, 0x91, 0xfd, 0x6e, 0x6e, 0xd3, 0x06, 0x00, 0x00,
+    0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00,
+    0xd5, 0xf0, 0x00, 0xff, 0x00, 0x00, 0x31, 0x13, 0x13, 0x13, 0x04, 0x00,
+    0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x04, 0x00, 0x13, 0x0a, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x6e, 0x00, 0x00, 0x01,
+    0x00, 0x00, 0x09, 0x00, 0x6a, 0x24, 0x26, 0x30, 0x01, 0x2e, 0x2a, 0xfe,
+    0x04, 0x5b, 0x0d, 0xfd, 0x6e, 0x6e, 0xd7, 0x06, 0x6e, 0x6e, 0x6e, 0x00,
+    0x00, 0xb1, 0xb1, 0xb1, 0xb1, 0x00, 0x00, 0x00, 0x6e, 0x5b, 0x00, 0x00,
+    0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x1e, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0b,
+    0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x24, 0x2a, 0x6e, 0x5c, 0x24,
+    0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+    0x05, 0x00, 0x00, 0x00, 0x5d, 0x10, 0x6e, 0x6e, 0xa5, 0x2f, 0x00, 0x00,
+    0x95, 0x87, 0x00, 0x6e};
+
+TEST(ZlibTest, CheckMatchCrash) {
+  // See https://crbug.com/1113142.
+  z_stream stream;
+  stream.zalloc = nullptr;
+  stream.zfree = nullptr;
+
+  // Low windowbits to hit window sliding also with a relatively small input.
+  int ret = deflateInit2(&stream, /*comp level*/ 5, /*method*/ Z_DEFLATED,
+                         /*windowbits*/ -9, /*memlevel*/ 8,
+                         /*strategy*/ Z_DEFAULT_STRATEGY);
+  ASSERT_EQ(ret, Z_OK);
+
+  uint8_t compressed[sizeof(checkMatchCrashData) * 2];
+  stream.next_out = compressed;
+  stream.avail_out = sizeof(compressed);
+
+  for (size_t i = 0; i < sizeof(checkMatchCrashData); i++) {
+    ASSERT_GT(stream.avail_out, 0U);
+    stream.next_in = (uint8_t*)&checkMatchCrashData[i];
+    stream.avail_in = 1;
+    ret = deflate(&stream, Z_NO_FLUSH);
+    ASSERT_EQ(ret, Z_OK);
+  }
+
+  stream.next_in = nullptr;
+  stream.avail_in = 0;
+  ASSERT_GT(stream.avail_out, 0U);
+  ret = deflate(&stream, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  size_t compressed_sz = sizeof(compressed) - stream.avail_out;
+  deflateEnd(&stream);
+
+  uint8_t decompressed[sizeof(checkMatchCrashData)];
+  ret = inflateInit2(&stream, -15);
+  ASSERT_EQ(ret, Z_OK);
+  stream.next_in = compressed;
+  stream.avail_in = compressed_sz;
+  stream.next_out = decompressed;
+  stream.avail_out = sizeof(decompressed);
+  ret = inflate(&stream, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  inflateEnd(&stream);
+  ASSERT_EQ(
+      memcmp(checkMatchCrashData, decompressed, sizeof(checkMatchCrashData)),
+      0);
+}
+
+TEST(ZlibTest, DeflateRLEUninitUse) {
+  // MSan would complain about use of uninitialized values in deflate_rle if the
+  // window isn't zero-initialized. See crbug.com/1137613. Similar problems
+  // exist in other places in zlib, e.g. longest_match (crbug.com/1144420) but
+  // we don't have as nice test cases.
+
+  int level = 9;
+  int windowBits = 9;
+  int memLevel = 8;
+  int strategy = Z_RLE;
+  const std::vector<uint8_t> src{
+      0x31, 0x64, 0x38, 0x32, 0x30, 0x32, 0x30, 0x36, 0x65, 0x35, 0x38, 0x35,
+      0x32, 0x61, 0x30, 0x36, 0x65, 0x35, 0x32, 0x66, 0x30, 0x34, 0x38, 0x37,
+      0x61, 0x31, 0x38, 0x36, 0x37, 0x37, 0x31, 0x39, 0x0a, 0x65, 0x62, 0x00,
+      0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff,
+      0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6,
+      0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0x95,
+      0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0e, 0x0a, 0x54, 0x52,
+      0x58, 0x56, 0xab, 0x26, 0x13, 0x53, 0x5a, 0xb5, 0x30, 0xbb, 0x96, 0x44,
+      0x80, 0xe6, 0xc5, 0x0a, 0xd0, 0x47, 0x7a, 0xa0, 0x4e, 0xbe, 0x30, 0xdc,
+      0xa1, 0x08, 0x54, 0xe1, 0x51, 0xd1, 0xea, 0xef, 0xdb, 0xa1, 0x2d, 0xb4,
+      0xb9, 0x58, 0xb1, 0x2f, 0xf0, 0xae, 0xbc, 0x07, 0xd1, 0xba, 0x7f, 0x14,
+      0xa4, 0xde, 0x99, 0x7f, 0x4d, 0x3e, 0x25, 0xd9, 0xef, 0xee, 0x4f, 0x38,
+      0x7b, 0xaf, 0x3f, 0x6b, 0x53, 0x5a, 0xcb, 0x1f, 0x97, 0xb5, 0x43, 0xa3,
+      0xe8, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff,
+      0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00,
+      0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00,
+      0x9f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3c,
+      0x73, 0x70, 0x23, 0x87, 0xec, 0xf8, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0xc1, 0x00, 0x00, 0x9f, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f,
+      0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+  };
+
+  z_stream stream;
+  stream.zalloc = Z_NULL;
+  stream.zfree = Z_NULL;
+
+  // Compress the data one byte at a time to exercise the streaming code.
+  int ret =
+      deflateInit2(&stream, level, Z_DEFLATED, windowBits, memLevel, strategy);
+  ASSERT_EQ(ret, Z_OK);
+  std::vector<uint8_t> compressed(src.size() * 2 + 1000);
+  stream.next_out = compressed.data();
+  stream.avail_out = compressed.size();
+  for (uint8_t b : src) {
+    stream.next_in = &b;
+    stream.avail_in = 1;
+    ret = deflate(&stream, Z_NO_FLUSH);
+    ASSERT_EQ(ret, Z_OK);
+  }
+  stream.next_in = Z_NULL;
+  stream.avail_in = 0;
+  ret = deflate(&stream, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  deflateEnd(&stream);
+}
+
+static const char zFixedCorruptionData[] =
+    "AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAAUAAVAAWAAXAAYA"
+    "AZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQABRABSABTABUABVABWABXABY"
+    "ABZACBACCACDACEACFACGACHACIACJACKACLACMACNACOACPACQACRACSACTACUACVACWACXAC"
+    "YACZADBADCADDADEADFADGADHADIADJADKADLADMADNADOADPADQADRADSADTADUADVADWADXA"
+    "DYADZAEBAECAEDAEEAEFAEGAEHAEIAEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEX"
+    "AEYAEZAFBAFCAFDAFEAFFAFGAFHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAF"
+    "XAFYAFZAGBAGCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWA"
+    "GXAGYAGZAHBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAHSAHTAHUAHVAHW"
+    "AHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOAIPAIQAIRAISAITAIUAIVAI"
+    "WAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMAJNAJOAJPAJQAJRAJSAJTAJUAJVA"
+    "JWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJAKKAKLAKMAKNAKOAKPAKQAKRAKSAKTAKUAKV"
+    "AKWAKXAKYAKZALBALCALDALEALFALGALHALIALJALKALLALMALNALOALPALQALRALSALTALUAL"
+    "VALWALXALYALZAMBAMCAMDAMEAMFAMGAMHAMIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUA"
+    "MVAMWAMXAMYAMZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANU"
+    "ANVANWANXANYANZAOBAOCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQAORAOSAOTAO"
+    "UAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAPNAPOAPPAPQAPRAPSAPTA"
+    "PUAPVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQLAQMAQNAQOAQPAQQAQRAQSAQT"
+    "AQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHARIARJARKARLARMARNAROARPARQARRARSAR"
+    "TARUARVARWARXARYARZASBASCASDASEASFASGASHASIASJASKASLASMASNASOASPASQASRASSA"
+    "STASUASVASWASXASYASZATBATCATDATEATFATGATHATIATJATKATLATMATNATOATPATQATRATS"
+    "ATTATUATVATWATXATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAU"
+    "SAUTAUUAUVAUWAUXAUYAUZAVBAVCAVDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOAVPAVQAVRA"
+    "VSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWLAWMAWNAWOAWPAWQAWR"
+    "AWSAWTAWUAWVAWWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJAXKAXLAXMAXNAXOAXPAXQAX"
+    "RAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAYGAYHAYIAYJAYKAYLAYMAYNAYOAYPAYQA"
+    "YRAYSAYTAYUAYVAYWAYXAYYAYZAZBAZCAZDAZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQ"
+    "AZRAZSAZTAZUAZVAZWAZXAZYAZZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBBLBBMBBNBBOBBPBBQB"
+    "BRBBSBBTBBUBBVBBWBBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCR"
+    "BCSBCTBCUBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBDHBDIBDJBDKBDLBDMBDNBDOBDPBDQBDRBD"
+    "SBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBENBEOBEPBEQBERBESB"
+    "ETBEUBEVBEWBEXBEYBEZBFCBFDBFEBFFBFGBFHBFIBFJBFKBFLBFMBFNBFOBFPBFQBFRBFSBFT"
+    "BFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBGKBGLBGMBGNBGOBGPBGQBGRBGSBGTBG"
+    "UBGVBGWBGXBGYBGZBHCBHDBHEBHFBHGBHHBHIBHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUB"
+    "HVBHWBHXBHYBHZBICBIDBIEBIFBIGBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBITBIUBIV"
+    "BIWBIXBIYBIZBJCBJDBJEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJ"
+    "WBJXBJYBJZBKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBKPBKQBKRBKSBKTBKUBKVBKWB"
+    "KXBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSBLTBLUBLVBLWBLX"
+    "BLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBMLBMMBMNBMOBMPBMQBMRBMSBMTBMUBMVBMWBMXBM"
+    "YBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNPBNQBNRBNSBNTBNUBNVBNWBNXBNYB"
+    "NZBOCBODBOEBOFBOGBOHBOIBOJBOKBOLBOMBONBOOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZ"
+    "BPCBPDBPEBPFBPGBPHBPIBPJBPKBPLBPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQ"
+    "CBQDBQEBQFBQGBQHBQIBQJBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCB"
+    "RDBREBRFBRGBRHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBRXBRYBRZBSCBSD"
+    "BSEBSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBSYBSZBTCBTDBT"
+    "EBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBTTBTUBTVBTWBTXBTYBTZBUCBUDBUEB"
+    "UFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUBUVBUWBUXBUYBUZBVCBVDBVEBVF"
+    "BVGBVHBVIBVJBVKBVLBVMBVNBVOBVPBVQBVRBVSBVTBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBW"
+    "GBWHBWIBWJBWKBWLBWMBWNBWOBWPBWQBWRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGB"
+    "XHBXIBXJBXKBXLBXMBXNBXOBXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYH"
+    "BYIBYJBYKBYLBYMBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBZHBZ"
+    "IBZJBZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCCGCCHCCICCJ"
+    "CCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDECDFCDGCDHCDICDJCDKCD"
+    "LCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEECEFCEGCEHCEICEJCEKCELCEMC"
+    "ENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZCFDCFECFFCFGCFHCFICFJCFKCFLCFMCFNCFO"
+    "CFPCFQCFRCFSCFTCFUCFVCFWCFXCFYCFZCGDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCG"
+    "QCGRCGSCGTCGUCGVCGWCGXCGYCGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRC"
+    "HSCHTCHUCHVCHWCHXCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCIT"
+    "CIUCIVCIWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJSCJTCJUCJ"
+    "VCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCKRCKSCKTCKUCKVCKWC"
+    "KXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCLRCLSCLTCLUCLVCLWCLXCLY"
+    "CLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPCMQCMRCMSCMTCMUCMVCMWCMXCMYCMZCN"
+    "DCNECNFCNGCNHCNICNJCNKCNLCNMCNNCNOCNPCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOEC"
+    "OFCOGCOHCOICOJCOKCOLCOMCONCOOCOPCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPG"
+    "CPHCPICPJCPKCPLCPMCPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQ"
+    "ICQJCQKCQLCQMCQNCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHCRICRJC"
+    "RKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSGCSHCSICSJCSKCSL"
+    "CSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTGCTHCTICTJCTKCTLCTMCT"
+    "NCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECUFCUGCUHCUICUJCUKCULCUMCUNCUOC"
+    "UPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZCVDCVECVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQ"
+    "CVRCVSCVTCVUCVVCVWCVXCVYCVZCWDCWECWFCWGCWHCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCW"
+    "SCWTCWUCWVCWWCWXCWYCWZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTC"
+    "XUCXVCXWCXXCXYCXZCYDCYECYFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCYUCYV"
+    "CYWCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSCZTCZUCZVCZWCZ"
+    "XCZYCZZDDDEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDTDDUDDVDDWDDXDDYDDZ"
+    "DEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDETDEUDEVDEWDEXDEYDEZDFEDFFDF"
+    "GDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFRDFSDFTDFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGID"
+    "GJDGKDGLDGMDGNDGODGPDGQDGRDGSDGTDGUDGVDGWDGXDGYDGZDHEDHFDHGDHHDHIDHJDHKDHL"
+    "DHMDHNDHODHPDHQDHRDHSDHTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDI"
+    "ODIPDIQDIRDISDITDIUDIVDIWDIXDIYDIZDJEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJQD"
+    "JRDJSDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPDKQDKRDKSDKT"
+    "DKUDKVDKWDKXDKYDKZDLEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQDLRDLSDLTDLUDLVDL"
+    "WDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQDMRDMSDMTDMUDMVDMWDMXDMYD"
+    "MZDNEDNFDNGDNHDNIDNJDNKDNLDNMDNNDNODNPDNQDNRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOF"
+    "DOGDOHDOIDOJDOKDOLDOMDONDOODOPDOQDORDOSDOTDOUDOVDOWDOXDOYDOZDPEDPFDPGDPHDP"
+    "IDPJDPKDPLDPMDPNDPODPPDPQDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKD"
+    "QLDQMDQNDQODQPDQQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDRFDRGDRHDRIDRJDRKDRLDRMDRN"
+    "DRODRPDRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDSNDSODSPDS"
+    "QDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDTFDTGDTHDTIDTJDTKDTLDTMDTNDTODTPDTQDTRDTSD"
+    "TTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUNDUODUPDUQDURDUSDUTDUUDUV"
+    "DUWDUXDUYDUZDVEDVFDVGDVHDVIDVJDVKDVLDVMDVNDVODVPDVQDVRDVSDVTDVUDVVDVWDVXDV"
+    "YDVZDWEDWFDWGDWHDWIDWJDWKDWLDWMDWNDWODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXED"
+    "XFDXGDXHDXIDXJDXKDXLDXMDXNDXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYH"
+    "DYIDYJDYKDYLDYMDYNDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDZFDZGDZHDZIDZJDZ"
+    "KDZLDZMDZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEELEEMEEN"
+    "EEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEFGEFHEFIEFJEFKEFLEFMEFNEFOEFPEFQEF"
+    "REFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNEGOEGPEGQEGREGSEGTEGUE"
+    "GVEGWEGXEGYEGZEHFEHGEHHEHIEHJEHKEHLEHMEHNEHOEHPEHQEHREHSEHTEHUEHVEHWEHXEHY"
+    "EHZEIFEIGEIHEIIEIJEIKEILEIMEINEIOEIPEIQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJ"
+    "HEJIEJJEJKEJLEJMEJNEJOEJPEJQEJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKE"
+    "KLEKMEKNEKOEKPEKQEKREKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLELMELNELO"
+    "ELPELQELRELSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQEMREM"
+    "SEMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNENOENPENQENRENSENTENUENVE"
+    "NWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEOTEOUEOVEOWEOXEOYEOZ"
+    "EPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPEPQEPREPSEPTEPUEPVEPWEPXEPYEPZEQFEQGEQHEQ"
+    "IEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQTEQUEQVEQWEQXEQYEQZERFERGERHERIERJERKERLE"
+    "RMERNEROERPERQERRERSERTERUERVERWERXERYERZESFESGESHESIESJESKESLESMESNESOESP"
+    "ESQESRESSESTESUESVESWESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSET"
+    "TETUETVETWETXETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVEUWE"
+    "UXEUYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEVWEVXEVYEVZEWF"
+    "EWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWYEWZEXFEXGEXHEXIEX"
+    "JEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXEXYEXZEYFEYGEYHEYIEYJEYKEYLEYME"
+    "YNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYYEYZEZFEZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQ"
+    "EZREZSEZTEZUEZVEZWEZXEZYEZZFFFGFFHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUF"
+    "FVFFWFFXFFYFFZFGGFGHFGIFGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZ"
+    "FHGFHHFHIFHJFHKFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJFI"
+    "KFILFIMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJLFJMFJNFJOF"
+    "JPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKOFKPFKQFKRFKSFKT"
+    "FKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFLQFLRFLSFLTFLUFLVFLWFLXFL"
+    "YFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQFMRFMSFMTFMUFMVFMWFMXFMYFMZFNGFNHFNIF"
+    "NJFNKFNLFNMFNNFNOFNPFNQFNRFNSFNTFNUFNVFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFON"
+    "FOOFOPFOQFORFOSFOTFOUFOVFOWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFP"
+    "SFPTFPUFPVFPWFPXFPYFPZFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWF"
+    "QXFQYFQZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYFRZFSGFSH"
+    "FSIFSJFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHFTIFTJFTKFTLFT"
+    "MFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJFUKFULFUMFUNFUOFUPFUQF"
+    "URFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJFVKFVLFVMFVNFVOFVPFVQFVRFVSFVTFVUFVV"
+    "FVWFVXFVYFVZFWGFWHFWIFWJFWKFWLFWMFWNFWOFWPFWQFWRFWSFWTFWUFWVFWWFWXFWYFWZFX"
+    "GFXHFXIFXJFXKFXLFXMFXNFXOFXPFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKF"
+    "YLFYMFYNFYOFYPFYQFYRFYSFYTFYUFYVFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZP"
+    "FZQFZRFZSFZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSGGTGGUG"
+    "GVGGWGGXGGYGGZGHHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWGHXGHYGHZGIH"
+    "GIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZGJHGJIGJJGJKGJLGJMGJ"
+    "NGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHGKIGKJGKKGKLGKMGKNGKOGKPGKQGKRGKSG"
+    "KTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLKGLLGLMGLNGLOGLPGLQGLRGLSGLTGLUGLVGLWGLXGLY"
+    "GLZGMHGMIGMJGMKGMLGMMGMNGMOGMPGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGN"
+    "LGNMGNNGNOGNPGNQGNRGNSGNTGNUGNVGNWGNXGNYGNZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQG"
+    "ORGOSGOTGOUGOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGPVGPW"
+    "GPXGPYGPZGQHGQIGQJGQKGQLGQMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQZGRHGRIGR"
+    "JGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIGSJGSKGSLGSMGSNGSOG"
+    "SPGSQGSRGSSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGTKGTLGTMGTNGTOGTPGTQGTRGTSGTTGTU"
+    "GTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMGUNGUOGUPGUQGURGUSGUTGUUGUVGUWGUXGUYGUZGV"
+    "HGVIGVJGVKGVLGVMGVNGVOGVPGVQGVRGVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMG"
+    "WNGWOGWPGWQGWRGWSGWTGWUGWVGWWGWXGWYGWZGXHGXIGXJGXKGXLGXMGXNGXOGXPGXQGXRGXS"
+    "GXTGXUGXVGXWGXXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYXGY"
+    "YGYZGZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZRGZSGZTGZUGZVGZWGZXGZYGZZHHHIHHJHHKHHL"
+    "HHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMHINHIOHIPHIQHIRHI"
+    "SHITHIUHIVHIWHIXHIYHIZHJIHJJHJKHJLHJMHJNHJOHJPHJQHJRHJSHJTHJUHJVHJWHJXHJYH"
+    "JZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSHKTHKUHKVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLN"
+    "HLOHLPHLQHLRHLSHLTHLUHLVHLWHLXHLYHLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHM"
+    "UHMVHMWHMXHMYHMZHNIHNJHNKHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHNXHNYHNZHOIH"
+    "OJHOKHOLHOMHONHOOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPP"
+    "HPQHPRHPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHQNHQOHQPHQQHQRHQSHQTHQUHQVHQ"
+    "WHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHRYHRZHSIHSJHSKH"
+    "SLHSMHSNHSOHSPHSQHSRHSSHSTHSUHSVHSWHSXHSYHSZHTIHTJHTKHTLHTMHTNHTOHTPHTQHTR"
+    "HTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHUMHUNHUOHUPHUQHURHUSHUTHUUHUVHUWHUXHU"
+    "YHUZHVIHVJHVKHVLHVMHVNHVOHVPHVQHVRHVSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMH"
+    "WNHWOHWPHWQHWRHWSHWTHWUHWVHWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHXT"
+    "HXUHXVHXWHXXHXYHXZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZ"
+    "IHZJHZKHZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJIIKIILIIMIINIIOIIP"
+    "IIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJTIJUIJVIJWIJ"
+    "XIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTIKUIKVIKWIKXIKYIKZILJILKILLILMILNI"
+    "LOILPILQILRILSILTILUILVILWILXILYILZIMJIMKIMLIMMIMNIMOIMPIMQIMRIMSIMTIMUIMV"
+    "IMWIMXIMYIMZINJINKINLINMINNINOINPINQINRINSINTINUINVINWINXINYINZIOJIOKIOLIO"
+    "MIONIOOIOPIOQIORIOSIOTIOUIOVIOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTI"
+    "PUIPVIPWIPXIPYIPZIQJIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRK"
+    "IRLIRMIRNIROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPISQISRIS"
+    "SISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITWITXITYITZI"
+    "UJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIVJIVKIVLIVMIVNIVOIVPIVQ"
+    "IVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWNIWOIWPIWQIWRIWSIWTIWUIWVIWWIWXIW"
+    "YIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIXSIXTIXUIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOI"
+    "YPIYQIYRIYSIYTIYUIYVIYWIYXIYYIYZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZW"
+    "IZXIZYIZZJJJKJJLJJMJJNJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJ"
+    "KPJKQJKRJKSJKTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLWJLX"
+    "JLYJLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNNJNOJNPJN"
+    "QJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJOTJOUJOVJOWJOXJOYJ"
+    "OZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPXJPYJPZJQKJQLJQMJQNJQOJQPJQQJQR"
+    "JQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJRNJROJRPJRQJRRJRSJRTJRUJRVJRWJRXJRYJRZJS"
+    "KJSLJSMJSNJSOJSPJSQJSRJSSJSTJSUJSVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJ"
+    "TTJTUJTVJTWJTXJTYJTZJUKJULJUMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVL"
+    "JVMJVNJVOJVPJVQJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJW"
+    "UJWVJWWJWXJWYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJYLJYMJ"
+    "YNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQJZRJZSJZTJZUJZV"
+    "JZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKVKKWKKXKKYKKZKLLKLMKLNKLOKLPK"
+    "LQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKMNKMOKMPKMQKMRKMSKMTKMUKMVKMWKMXKMYKMZ"
+    "KNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKNVKNWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKO"
+    "UKOVKOWKOXKOYKOZKPLKPMKPNKPOKPPKPQKPRKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOK"
+    "QPKQQKQRKQSKQTKQUKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRY"
+    "KRZKSLKSMKSNKSOKSPKSQKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRKTSKT"
+    "TKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUYKUZKVLKVMKVNK"
+    "VOKVPKVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOKWPKWQKWRKWSKWTKWUKWVKWWKWX"
+    "KWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXVKXWKXXKXYKXZKYLKYMKYNKYOKYPKYQKYRKY"
+    "SKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZOKZPKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLN"
+    "LLOLLPLLQLLRLLSLLTLLULLVLLWLLXLLYLLZLMMLMNLMOLMPLMQLMRLMSLMTLMULMVLMWLMXLM"
+    "YLMZLNMLNNLNOLNPLNQLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOUL"
+    "OVLOWLOXLOYLOZLPMLPNLPOLPPLPQLPRLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQLQR"
+    "LQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRYLRZLSMLSNLS"
+    "OLSPLSQLSRLSSLSTLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQLTRLTSLTTLTULTVLTWLTXLTYL"
+    "TZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUYLUZLVMLVNLVOLVPLVQLVRLVSLVTLVULVV"
+    "LVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWTLWULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLX"
+    "SLXTLXULXVLXWLXXLXYLXZLYMLYNLYOLYPLYQLYRLYSLYTLYULYVLYWLYXLYYLYZLZMLZNLZOL"
+    "ZPLZQLZRLZSLZTLZULZVLZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMN"
+    "NMNOMNPMNQMNRMNSMNTMNUMNVMNWMNXMNYMNZMONMOOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYM"
+    "OZMPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQUMQVMQWMQX"
+    "MQYMQZMRNMROMRPMRQMRRMRSMRTMRUMRVMRWMRXMRYMRZMSNMSOMSPMSQMSRMSSMSTMSUMSVMS"
+    "WMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTXMTYMTZMUNMUOMUPMUQMURMUSMUTMUUM"
+    "UVMUWMUXMUYMUZMVNMVOMVPMVQMVRMVSMVTMVUMVVMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWT"
+    "MWUMWVMWWMWXMWYMWZMXNMXOMXPMXQMXRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYQMYRMY"
+    "SMYTMYUMYVMYWMYXMYYMYZMZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNR"
+    "NNSNNTNNUNNVNNWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNOXNOYNOZNPONPPNPQNPRNP"
+    "SNPTNPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQNRRNRSN"
+    "RTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNSTNSUNSVNSWNSXNSYNSZNTONTPNTQNTRNTSNTT"
+    "NTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUWNUXNUYNUZNVONVPNVQNVRNVSNVTNV"
+    "UNVVNVWNVXNVYNVZNWONWPNWQNWRNWSNWTNWUNWVNWWNWXNWYNWZNXONXPNXQNXRNXSNXTNXUN"
+    "XVNXWNXXNXYNXZNYONYPNYQNYRNYSNYTNYUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZV"
+    "NZWNZXNZYNZZOOOPOOQOOROOSOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXO"
+    "PYOPZOQPOQQOQROQSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWORXORYORZOSP"
+    "OSQOSROSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQOUROU"
+    "SOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWOVXOVYOVZOWPOWQOWROWSOWTOWUO"
+    "WVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZOYPOYQOYROYSOYTOYUOYVOYWOYX"
+    "OYYOYZOZPOZQOZROZSOZTOZUOZVOZWOZXOZYOZZPPPQPPRPPSPPTPPUPPVPPWPPXPPYPPZPQQP"
+    "QRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRPRSPRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSV"
+    "PSWPSXPSYPSZPTQPTRPTSPTTPTUPTVTABUABVABWABXABYABZACBACCACDACEACFACGACHACIA"
+    "CJACKACLACMACNACOACPACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADI"
+    "ADJADKADLADMADAAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAA"
+    "UAAVAAWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQABRABSABHA"
+    "FIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAGBAGCAGDAGEAGFAGGAGH"
+    "AGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWAGXAGYAGZAHNADOADPADQADRADSAD"
+    "TADUADVADWADXADYADZAEBAECAEDAEEAEFAEGAEHAEIAEJAEKAELAEMAENAEOAEPAEQAERAESA"
+    "ETAEUAEVAEWAEXAEYAEZAFBAFCAFDAFEAFFAFGAFUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJG"
+    "AJHAJIAJJAJKAJLAJMAJNAJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAK"
+    "GAKHAKIAKJAKKAKLAKMAKNAKBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRA"
+    "HSAHTAHUAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOAIPAIQAIR"
+    "AISAITAIIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAMXAMYAMZANBANCANDANEAN"
+    "FANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUANVANWANXANYANZAOBAOOAKPAKQA"
+    "KRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEALFALGALHALIALJALKALLALMALNALOALPALQ"
+    "ALRALSALTALUALVALWALXALYALZAMBAMCAMDAMEAMFAMGAMHAMVAPWAPXAPYAPZAQBAQCAQDAQ"
+    "EAQFAQGAQHAQIAQJAQKAQLAQMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDA"
+    "REARFARGARHARIARJARKARLARMARNAROARCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOP"
+    "AOQAORAOSAOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAPNAPOAP"
+    "PAPQAPRAPSAPTAPUAPJATKATLATMATNATOATPATQATRATSATTATUATVATWATXATYATZAUBAUCA"
+    "UDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUTAUUAUVAUWAUXAUYAUZAVBAVC"
+    "AVPARQARRARSARTARUARVARWARXARYARZASBASCASDASEASFASGASHASIASJASKASLASMASNAS"
+    "OASPASQASRASSASTASUASVASWASXASYASZATBATCATDATEATFATGATHATIATWAWXAWYAWZAXBA"
+    "XCAXDAXEAXFAXGAXHAXIAXJAXKAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYB"
+    "AYCAYDAYEAYFAYGAYHAYIAYJAYKAYLAYMAYNAYOAYPAYDAVEAVFAVGAVHAVIAVJAVKAVLAVMAV"
+    "NAVOAVPAVQAVRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWLAWMA"
+    "WNAWOAWPAWQAWRAWSAWTAWUAWVAWBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVBBWBBXBBYBBZBC"
+    "CBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCTBCUBCVBCWBCXBCYBCZBDCB"
+    "DDBDEBDFBDGBQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZBAZCAZDAZEAZFAZGAZHAZIAZJAZKAZLA"
+    "ZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZXAZYAZZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBFDBF"
+    "EBFFBFGBFHBFIBFJBFKBFLBFMBFNBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEB"
+    "GFBGGBGHBGIBGJBGKBGLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBDHBDIBDJBDKBDLBDMBDN"
+    "BDOBDPBDQBDRBDSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBENBE"
+    "OBEPBEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBITBIUBIVBIWBIXBIYBIZBJCBJDBJEBJFBJGB"
+    "JHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYBJZBKCBKDBKEBKFBKGBKH"
+    "BKIBKJBKKBKLBKMBKNBKOBGXBGYBGZBHCBHDBHEBHFBHGBHHBHIBHJBHKBHLBHMBHNBHOBHPBH"
+    "QBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBIEBIFBIGBIHBIIBIJBIKBILBIMBINBIOBIPBIQB"
+    "IRBISBMLBMMBMNBMOBMPBMQBMRBMSBMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJ"
+    "BNKBNLBNMBNNBNOBNPBNQBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBKPBKQBKRBK"
+    "SBKTBKUBKVBKWBKXBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSB"
+    "LTBLUBLVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBQDBQEBQFBQGBQHBQIBQJBQKBQL"
+    "BQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBRGBRHBRIBRJBRKBRLBR"
+    "MBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBOHBOIBOJBOKBOLBOMBONBOOBOPBOQBORBOSBOTBOUB"
+    "OVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJBPKBPLBPMBPNBPOBPPBPQBPRBPSBPTBPUBPV"
+    "BPWBPXBPYBPZBQCBTTBTUBTVBTWBTXBTYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBU"
+    "OBUPBUQBURBUSBUTBUUBUVBUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOB"
+    "RXBRYBRZBSCBSDBSEBSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSX"
+    "BSYBSZBTCBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBXLBXMBXNBXOBXPBX"
+    "QBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYLBYMBYNBYOBYPBYQB"
+    "YRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBVPBVQBVRBVSBVTBVUBVVBVWBVXBVYBVZ"
+    "BWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOBWPBWQBWRBWSBWTBWUBWVBWWBWXBWYBWZBX"
+    "CBXDBXEBXFBXGBXHBXIBXJBXKBCDFCDGCDHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDU"
+    "CDVCDWCDXCDYCDZCEDCEECEFCEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCE"
+    "WCEXCEYCEZZHBZIBZJBZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCEC"
+    "CFCCGCCHCCICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDECGYCGZ"
+    "CHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHWCHXCHYCHZCIDCI"
+    "ECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCIVCFDCFECFFCFGCFHCFICFJC"
+    "FKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXCFYCFZCGDCGECGFCGGCGHCGICGJCGKCGL"
+    "CGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGWCGXCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICL"
+    "JCLKCLLCLMCLNCLOCLPCLQCLRCLSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKC"
+    "MLCMMCMNCMOCMPCMQCMRCIWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQ"
+    "CJRCJSCJTCJUCJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCKRCK"
+    "SCKTCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLCPMCPNCPOCPPC"
+    "PQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQKCQLCQMCQNCMSCMTCMUCMV"
+    "CMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCNNCNOCNPCNQCNRCNSCNTCNUCNVCNWCN"
+    "XCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLCOMCONCOOCOPCSMCSNCSOCSPCSQCSRCSSCSTCSUC"
+    "SVCSWCSXCSYCSZCTDCTECTFCTGCTHCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTW"
+    "CTXCTYCTZCUDCUECUFCUGCUHCUICUJCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECR"
+    "FCRGCRHCRICRJCRKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSGC"
+    "SHCSICSJCSKCSLCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCWYCWZCXDCXE"
+    "CXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWCXXCXYCXZCYDCYECYFCU"
+    "KCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZCVDCVECVFCVGCVHCVICVJCVKCVLC"
+    "VMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCVYCVZCWDCWECWFCWGCWHEDDFDDGDDHDDIDDJDD"
+    "KDDLDDMDDNDDODDPDDQDDRDDSDDTDDUDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMD"
+    "ENDEODEPDEQDERDESDETDEUDEVDEWDEXDEYDEZDFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQC"
+    "YRCYSCYTCYUCYVCYWCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZS"
+    "CZTCZUCZVCZWCZXCZYCZZDDDEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDHSDHTDHUD"
+    "HVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRDISDITDIUDIVDIWDIX"
+    "DIYDIZDJEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFRDFSDFTDFUDFVDFWDFXDFYDFZDG"
+    "EDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDGRDGSDGTDGUDGVDGWDGXDGYDGZDHEDLFDLGD"
+    "LHDLIDLJDLKDLLDLMDLNDLODLPDLQDLRDLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJ"
+    "DMKDMLDMMDMNDMODMPDMQDMRDMSDMTDMUDMVDMWDMXDMYDMZDNEDJFDJGDJHDJIDJJDJKDJLDJ"
+    "MDJNDJODJPDJQDJRDJSDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKOD"
+    "KPDKQDKRDKSDKTDKUDKVDKWDKXDKYDKZDLEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPPDPQDPR"
+    "DPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQPDQQDQRDQSDQTDQ"
+    "UDQVDQWDQXDQYDQZDREDNFDNGDNHDNIDNJDNKDNLDNMDNNDNODNPDNQDNRDNSDNTDNUDNVDNWD"
+    "NXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOODOPDOQDORDOSDOTDOUDOVDOWDOXDOYDOZ"
+    "DPEDTFDTGDTHDTIDTJDTKDTLDTMDTNDTODTPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDU"
+    "GDUHDUIDUJDUKDULDUMDUNDUODUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDRFDRGDRHDRID"
+    "RJDRKDRLDRMDRNDRODRPDRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSL"
+    "DSMDSNDSODSPDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDXFDXGDXHDXIDXJDXKDXLDXMDXNDX"
+    "ODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYMDYNDYODYPDYQD"
+    "YRDYSDYTDYUDYVDYWDYXDYYDYZDZEDVFDVGDVHDVIDVJDVKDVLDVMDVNDVODVPDVQDVRDVSDVT"
+    "DVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLDWMDWNDWODWPDWQDWRDWSDWTDWUDWVDW"
+    "WDWXDWYDWZDXFGEFHEFIEFJEFKEFLEFMEFNEFOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGF"
+    "EGGEGHEGIEGJEGKEGLEGMEGNEGOEGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEEDZF"
+    "DZGDZHDZIDZJDZKDZLDZMDZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIE"
+    "EJEEKEELEEMEENEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEJKEJLEJMEJNEJOEJPEJQ"
+    "EJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQEKREKSEKTEK"
+    "UEKVEKWEKXEKYEKZELFELGELHELIELJELKELLEHIEHJEHKEHLEHMEHNEHOEHPEHQEHREHSEHTE"
+    "HUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINEIOEIPEIQEIREISEITEIUEIVEIWEIX"
+    "EIYEIZEJFEJGEJHEJIEJJENOENPENQENRENSENTENUENVENWENXENYENZEOFEOGEOHEOIEOJEO"
+    "KEOLEOMEONEOOEOPEOQEOREOSEOTEOUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNE"
+    "POEPPELMELNELOELPELQELRELSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMN"
+    "EMOEMPEMQEMREMSEMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNERSERTERUER"
+    "VERWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVESWESXESYE"
+    "SZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTEPQEPREPSEPTEPUEPVEPWEPXEPY"
+    "EPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQTEQUEQVEQWEQXEQYEQZERFERGER"
+    "HERIERJERKERLERMERNEROERPERQERREVWEVXEVYEVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOE"
+    "WPEWQEWREWSEWTEWUEWVEWWEWXEWYEWZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXS"
+    "EXTEXUEXVEXWEXXETUETVETWETXETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREU"
+    "SEUTEUUEUVEUWEUXEUYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVE"
+    "FFGFFHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHFGIFGJFG"
+    "KFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJXYEXZEYFEYGEYHEY"
+    "IEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYYEYZEZFEZGEZHEZIEZJEZKEZLE"
+    "ZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZZFFJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJ"
+    "YFJZFKGFKHFKIFKJFKKFKLFKMFKNFKOFKPFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIF"
+    "LJFLKFLLFLMFLNFLOFLPFLQFLRFHKFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZ"
+    "FIGFIHFIIFIJFIKFILFIMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJ"
+    "KFJLFJMFJNFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFOVFOWF"
+    "OXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWFPXFPYFPZFLSFLT"
+    "FLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQFMRFMSFMTFMUFMVFMWFMXFM"
+    "YFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFNSFNTFNUFNVFSKFSLFSMFSNFSOFSPFSQF"
+    "SRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHFTIFTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTV"
+    "FTWFTXFTYFTZFUGFUHFUIFUJFUKFULFUMFUNFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQ"
+    "SFQTFQUFQVFQWFQXFQYFQZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWF"
+    "RXFRYFRZFSGFSHFSIFSJFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXOFXP"
+    "FXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFYQFYRFYSFYTFY"
+    "UFYVFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJFVKFVLFVMFVNFVOFVPFVQF"
+    "VRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWLFWMFWNFWOFWPFWQFWRHGHIGHJGHKGH"
+    "LGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWGHXGHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQG"
+    "IRGISGITGIUGIVGIWGIXGIYGIZGJHGJIGJJGJKGJLGJMGJFYWFYXFYYFYZFZGFZHFZIFZJFZKF"
+    "ZLFZMFZNFZOFZPFZQFZRFZSFZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGG"
+    "QGGRGGSGGTGGUGGVGGWGGXGGYGGZGHTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMOG"
+    "MPGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGNRGNSGNTGNU"
+    "GNVGNWGNXGNYGNNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHGKIGKJGKKGKLGKMGKNGK"
+    "OGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLKGLLGLMGLNGLOGLPGLQGLRGLSGLMG"
+    "QNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQZGRHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRS"
+    "GRTGRUGRVGRWGRXGRYGRZGSHGSIGSJGSKGSLGSMGSNGSOGSPGSQGSRGSZGOHGOIGOJGOKGOLGO"
+    "MGONGOOGOPGOQGORGOSGOTGOUGOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRG"
+    "PSGPTGPUGPVGPWGPXGPYGPZGQHGQIGQJGQKGQLGQYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQ"
+    "GVRGVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWTGWUGWVGW"
+    "WGWXGWYGWZGXHGXIGXJGXKGXSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGTKGTLGTMGTNGTOGTPG"
+    "TQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMGUNGUOGUPGUQGURGUSGUTGUUGUV"
+    "GUWGUXGURGZSGZTGZUGZVGZWGZXGZYGZZHHHIHHJHHKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUH"
+    "HVHHWHHXHHYHHZHIIHIJHIKHILHIMHINHIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHLGXMGXNG"
+    "XOGXPGXQGXRGXSGXTGXUGXVGXWGXXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYT"
+    "GYUGYVGYWGYXGYYGYZGZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZLPHLQHLRHLSHLTHLUHLVHLWH"
+    "LXHLYHLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJHNKHNL"
+    "HNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHIZHJIHJJHJKHJLHJMHJNHJOHJPHJQHJRHJSHJTHJ"
+    "UHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSHKTHKUHKVHKWHKXHKYHKZHLIH"
+    "LJHLKHLLHLMHLNHLOHQNHQOHQPHQQHQRHQSHQTHQUHQVHQWHQXHQYHQZHRIHRJHRKHRLHRMHRN"
+    "HROHRPHRQHRRHRSHRTHRUHRVHRWHRXHRYHRZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHS"
+    "UHNXHNYHNZHOIHOJHOKHOLHOMHONHOOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKH"
+    "PLHPMHPNHPOHPPHPQHPRHPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHVLHVMHVNHVOHVP"
+    "HVQHVRHVSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUHWVHW"
+    "WHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHSVHSWHSXHSYHSZHTIHTJHTKHTLHTMH"
+    "TNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHUMHUNHUOHUPHUQHURHUSHUT"
+    "HUUHUVHUWHUXHUYHUZHVIHVJHVKHIIKIILIIMIINIIOIIPIIQIIRIISIITIIUIIVIIWIIXIIYI"
+    "IZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJTIJUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKP"
+    "IKQIKRIKSIKTXTHXUHXVHXWHXXHXYHXZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYV"
+    "HYWHYXHYYHYZHZIHZJHZKHZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJINNI"
+    "NOINPINQINRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUIOV"
+    "IOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIKUIKVIKWIKXIKYIKZIL"
+    "JILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIMKIMLIMMIMNIMOIMPIMQI"
+    "MRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMISQISRISSISTISUISVISWISXISYISZITJITK"
+    "ITLITMITNITOITPITQITRITSITTITUITVITWITXITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIU"
+    "SIUTIUUIUVIUWIUXIUYIUZIPXIPYIPZIQJIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWI"
+    "QXIQYIQZIRJIRKIRLIRMIRNIROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISN"
+    "ISOISPIXTIXUIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIY"
+    "YIYZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJIVJIVKIVLI"
+    "VMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWNIWOIWPIWQIWRIWSIWT"
+    "IWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIXSYJLZJMKJMLJMMJMNJMOJMPJMQJ"
+    "MRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNNJNOJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZ"
+    "JOKJOLJOMJONJOOJOPJOQJORJOSJOTJOMJJNJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJK"
+    "KJKLJKMJKNJKOJKPJKQJKRJKSJKTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJ"
+    "LTJLUJLVJLWJLXJLQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJST"
+    "JSUJSVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJUKJULJU"
+    "UJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPXJPYJPZJQKJQLJQMJ"
+    "QNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJRNJROJRPJRYJWZJXKJXLJXMJXN"
+    "JXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJYLJYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJY"
+    "WJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQJZRJZSJZTJZMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJ"
+    "UXJUYJUZJVKJVLJVMJVNJVOJVPJVQJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWP"
+    "JWQJWRJWSJWTJWUJWVJWWJWXJWMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTK"
+    "NUKNVKNWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMKPNKPO"
+    "KPPKPQKPRKUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKVKKWKKXKKYKKZKL"
+    "LKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKMNKMOKMPKMQKMRKMSKSRKSSK"
+    "STKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRKTSKTTKTUKTVKTWKTXKTYKTZKULKUMKUN"
+    "KUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUYKUZKVLKVMKVNKVOKVPKPSKPTKPUKPVKPWKPXKPYKP"
+    "ZKQLKQMKQNKQOKQPKQQKQRKQSKQTKQUKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTK"
+    "RUKRVKRWKRXKRYKRZKSLKSMKSNKSOKSPKSQKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZM"
+    "KZNKZOKZPKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVLLWL"
+    "LXLLYLLZLMMLMNLMOLMPVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOKWPKWQKWRKWSK"
+    "WTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXVKXWKXXKXYKXZKYLKYMKYN"
+    "KYOKLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQLQRLQSLQTLQULQVLQWLQXLQYLQZLRML"
+    "RNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRYLRZLSMLSNLSOLSPLSQLSRLSSLSTLMQLMRLMSLMT"
+    "LMULMVLMWLMXLMYLMZLNMLNNLNOLNPLNQLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLO"
+    "QLORLOSLOTLOULOVLOWLOXLOYLOZLPMLPNLPOLPPLPQLPRLVWLVXLVYLVZLWMLWNLWOLWPLWQL"
+    "WRLWSLWTLWULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLYN"
+    "LYOLYPLYQLYRLYSLYTLYULYVLYWLYXLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQLTRLTSLTTLT"
+    "ULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUYLUZLVMLVNLVOLVPLVQL"
+    "VRLVSLVTLVULVVOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYMOZMPNMPOMPPMPQMPRMPSMPTMPUMP"
+    "VMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQUMQVMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRLY"
+    "YLYZLZMLZNLZOLZPLZQLZRLZSLZTLZULZVLZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMV"
+    "MMWMMXMMYMMZMNNMNOMNPMNQMNRMNSMNTMNUMNVMNWMNXMNYMNZMONMOYMUZMVNMVOMVPMVQMV"
+    "RMVSMVTMVUMVVMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPM"
+    "XQMXRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYTMRUMRVMRWMRXMRYMRZMSNMSOMSPMSQMSR"
+    "MSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTXMTYMTZMUNMUOMUPMU"
+    "QMURMUSMUTMUUMUVMUWMUXMUOXNOYNOZNPONPPNPQNPRNPSNPTNPUNPVNPWNPXNPYNPZNQONQP"
+    "NQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQNRRNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNS"
+    "QNSRNSSNQMYRMYSMYTMYUMYVMYWMYXMYYMYZMZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZ"
+    "ZNNNONNPNNQNNRNNSNNTNNUNNVNNWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNWPNWQNWR"
+    "NWSNWTNWUNWVNWWNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNY"
+    "SNYTNYUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNSTNSUNSVNSWNSXNSYNSZNTON"
+    "TPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUWNUXNUYNUZNVONVP"
+    "NVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONORXORYORZOSPOSQOSROSSOSTOSUOSVOSWOSXOSYO"
+    "SZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQOUROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQ"
+    "OVROVSOVTOVUOVVOVWZXNZYNZZOOOPOOQOOROOSOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOP"
+    "TOPUOPVOPWOPXOPYOPZOQPOQQOQROQSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVO"
+    "RWOZXOZYOZZPPPQPPRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPR"
+    "QPRRPRSPRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTOVXOVYOVZOWPOW"
+    "QOWROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZOYPOYQOYROYSO"
+    "YTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWQPTRPTSPTTPTUPTV";
+
+TEST(ZlibTest, DeflateZFixedCorruption) {
+  // Tavis's test case from
+  // https://www.openwall.com/lists/oss-security/2022/03/26/1
+  // The upstream fix,
+  // https://github.com/madler/zlib/commit/5c44459c3b28a9bd3283aaceab7c615f8020c531,
+  // was merged in Chromium in #583975.
+
+  z_stream stream;
+  stream.zalloc = Z_NULL;
+  stream.zfree = Z_NULL;
+
+  int level = Z_DEFAULT_COMPRESSION;
+  int windowBits = 15;
+  int memLevel = 1;
+  int strategy = Z_FIXED;
+
+  int ret =
+      deflateInit2(&stream, level, Z_DEFLATED, windowBits, memLevel, strategy);
+  ASSERT_EQ(ret, Z_OK);
+  std::vector<uint8_t> compressed(
+      deflateBound(&stream, strlen(zFixedCorruptionData)));
+  stream.next_out = compressed.data();
+  stream.avail_out = compressed.size();
+  stream.next_in = (uint8_t*)zFixedCorruptionData;
+  stream.avail_in = strlen(zFixedCorruptionData);
+  ret = deflate(&stream, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  size_t compressed_sz = compressed.size() - stream.avail_out;
+  deflateEnd(&stream);
+
+  std::vector<uint8_t> decompressed(strlen(zFixedCorruptionData));
+  ret = inflateInit2(&stream, windowBits);
+  ASSERT_EQ(ret, Z_OK);
+  stream.next_in = compressed.data();
+  stream.avail_in = compressed_sz;
+  stream.next_out = decompressed.data();
+  stream.avail_out = decompressed.size();
+  ret = inflate(&stream, Z_FINISH);
+  ASSERT_EQ(ret, Z_STREAM_END);
+  inflateEnd(&stream);
+
+  EXPECT_EQ(decompressed.size(), strlen(zFixedCorruptionData));
+  EXPECT_EQ(
+      memcmp(zFixedCorruptionData, decompressed.data(), decompressed.size()),
+      0);
+}
diff --git a/deps/zlib/cpu_features.c b/deps/zlib/cpu_features.c
new file mode 100644
index 00000000000000..877d5f23d0ceae
--- /dev/null
+++ b/deps/zlib/cpu_features.c
@@ -0,0 +1,170 @@
+/* cpu_features.c -- Processor features detection.
+ *
+ * Copyright 2018 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the Chromium source repository LICENSE file.
+ */
+
+#include "cpu_features.h"
+#include "zutil.h"
+
+#include <stdint.h>
+#if defined(_MSC_VER)
+#include <intrin.h>
+#elif defined(ADLER32_SIMD_SSSE3)
+#include <cpuid.h>
+#endif
+
+/* TODO(cavalcantii): remove checks for x86_flags on deflate.
+ */
+#if defined(ARMV8_OS_MACOS)
+/* Crypto extensions (crc32/pmull) are a baseline feature in ARMv8.1-A, and
+ * OSX running on arm64 is new enough that these can be assumed without
+ * runtime detection.
+ */
+int ZLIB_INTERNAL arm_cpu_enable_crc32 = 1;
+int ZLIB_INTERNAL arm_cpu_enable_pmull = 1;
+#else
+int ZLIB_INTERNAL arm_cpu_enable_crc32 = 0;
+int ZLIB_INTERNAL arm_cpu_enable_pmull = 0;
+#endif
+int ZLIB_INTERNAL x86_cpu_enable_sse2 = 0;
+int ZLIB_INTERNAL x86_cpu_enable_ssse3 = 0;
+int ZLIB_INTERNAL x86_cpu_enable_simd = 0;
+
+#ifndef CPU_NO_SIMD
+
+#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA)
+#include <pthread.h>
+#endif
+
+#if defined(ARMV8_OS_ANDROID)
+#include <cpu-features.h>
+#elif defined(ARMV8_OS_LINUX)
+#include <asm/hwcap.h>
+#include <sys/auxv.h>
+#elif defined(ARMV8_OS_FUCHSIA)
+#include <zircon/features.h>
+#include <zircon/syscalls.h>
+#include <zircon/types.h>
+#elif defined(ARMV8_OS_WINDOWS) || defined(X86_WINDOWS)
+#include <windows.h>
+#elif !defined(_MSC_VER)
+#include <pthread.h>
+#else
+#error cpu_features.c CPU feature detection in not defined for your platform
+#endif
+
+#if !defined(CPU_NO_SIMD) && !defined(ARMV8_OS_MACOS) && !defined(ARM_OS_IOS)
+static void _cpu_check_features(void);
+#endif
+
+#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_MACOS) || defined(ARMV8_OS_FUCHSIA) || defined(X86_NOT_WINDOWS)
+#if !defined(ARMV8_OS_MACOS)
+// _cpu_check_features() doesn't need to do anything on mac/arm since all
+// features are known at build time, so don't call it.
+// Do provide cpu_check_features() (with a no-op implementation) so that we
+// don't have to make all callers of it check for mac/arm.
+static pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT;
+#endif
+void ZLIB_INTERNAL cpu_check_features(void)
+{
+#if !defined(ARMV8_OS_MACOS)
+    pthread_once(&cpu_check_inited_once, _cpu_check_features);
+#endif
+}
+#elif defined(ARMV8_OS_WINDOWS) || defined(X86_WINDOWS)
+static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT;
+static BOOL CALLBACK _cpu_check_features_forwarder(PINIT_ONCE once, PVOID param, PVOID* context)
+{
+    _cpu_check_features();
+    return TRUE;
+}
+void ZLIB_INTERNAL cpu_check_features(void)
+{
+    InitOnceExecuteOnce(&cpu_check_inited_once, _cpu_check_features_forwarder,
+                        NULL, NULL);
+}
+#endif
+
+#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
+/*
+ * iOS@ARM is a special case where we always have NEON but don't check
+ * for crypto extensions.
+ */
+#if !defined(ARMV8_OS_MACOS) && !defined(ARM_OS_IOS)
+/*
+ * See http://bit.ly/2CcoEsr for run-time detection of ARM features and also
+ * crbug.com/931275 for android_getCpuFeatures() use in the Android sandbox.
+ */
+static void _cpu_check_features(void)
+{
+#if defined(ARMV8_OS_ANDROID) && defined(__aarch64__)
+    uint64_t features = android_getCpuFeatures();
+    arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM64_FEATURE_CRC32);
+    arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM64_FEATURE_PMULL);
+#elif defined(ARMV8_OS_ANDROID) /* aarch32 */
+    uint64_t features = android_getCpuFeatures();
+    arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM_FEATURE_CRC32);
+    arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM_FEATURE_PMULL);
+#elif defined(ARMV8_OS_LINUX) && defined(__aarch64__)
+    unsigned long features = getauxval(AT_HWCAP);
+    arm_cpu_enable_crc32 = !!(features & HWCAP_CRC32);
+    arm_cpu_enable_pmull = !!(features & HWCAP_PMULL);
+#elif defined(ARMV8_OS_LINUX) && (defined(__ARM_NEON) || defined(__ARM_NEON__))
+    /* Query HWCAP2 for ARMV8-A SoCs running in aarch32 mode */
+    unsigned long features = getauxval(AT_HWCAP2);
+    arm_cpu_enable_crc32 = !!(features & HWCAP2_CRC32);
+    arm_cpu_enable_pmull = !!(features & HWCAP2_PMULL);
+#elif defined(ARMV8_OS_FUCHSIA)
+    uint32_t features;
+    zx_status_t rc = zx_system_get_features(ZX_FEATURE_KIND_CPU, &features);
+    if (rc != ZX_OK || (features & ZX_ARM64_FEATURE_ISA_ASIMD) == 0)
+        return;  /* Report nothing if ASIMD(NEON) is missing */
+    arm_cpu_enable_crc32 = !!(features & ZX_ARM64_FEATURE_ISA_CRC32);
+    arm_cpu_enable_pmull = !!(features & ZX_ARM64_FEATURE_ISA_PMULL);
+#elif defined(ARMV8_OS_WINDOWS)
+    arm_cpu_enable_crc32 = IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE);
+    arm_cpu_enable_pmull = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE);
+#endif
+}
+#endif
+#elif defined(X86_NOT_WINDOWS) || defined(X86_WINDOWS)
+/*
+ * iOS@x86 (i.e. emulator) is another special case where we disable
+ * SIMD optimizations.
+ */
+#ifndef CPU_NO_SIMD
+/* On x86 we simply use a instruction to check the CPU features.
+ * (i.e. CPUID).
+ */
+static void _cpu_check_features(void)
+{
+    int x86_cpu_has_sse2;
+    int x86_cpu_has_ssse3;
+    int x86_cpu_has_sse42;
+    int x86_cpu_has_pclmulqdq;
+    int abcd[4];
+
+#ifdef _MSC_VER
+    __cpuid(abcd, 1);
+#else
+    __cpuid(1, abcd[0], abcd[1], abcd[2], abcd[3]);
+#endif
+
+    x86_cpu_has_sse2 = abcd[3] & 0x4000000;
+    x86_cpu_has_ssse3 = abcd[2] & 0x000200;
+    x86_cpu_has_sse42 = abcd[2] & 0x100000;
+    x86_cpu_has_pclmulqdq = abcd[2] & 0x2;
+
+    x86_cpu_enable_sse2 = x86_cpu_has_sse2;
+
+    x86_cpu_enable_ssse3 = x86_cpu_has_ssse3;
+
+    x86_cpu_enable_simd = x86_cpu_has_sse2 &&
+                          x86_cpu_has_sse42 &&
+                          x86_cpu_has_pclmulqdq;
+}
+#endif
+#endif
+#endif
diff --git a/deps/zlib/cpu_features.h b/deps/zlib/cpu_features.h
new file mode 100644
index 00000000000000..279246c859e87e
--- /dev/null
+++ b/deps/zlib/cpu_features.h
@@ -0,0 +1,18 @@
+/* cpu_features.h -- Processor features detection.
+ *
+ * Copyright 2018 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the Chromium source repository LICENSE file.
+ */
+
+#include "zlib.h"
+
+/* TODO(cavalcantii): remove checks for x86_flags on deflate.
+ */
+extern int arm_cpu_enable_crc32;
+extern int arm_cpu_enable_pmull;
+extern int x86_cpu_enable_sse2;
+extern int x86_cpu_enable_ssse3;
+extern int x86_cpu_enable_simd;
+
+void cpu_check_features(void);
diff --git a/deps/zlib/crc32.c b/deps/zlib/crc32.c
index e95b9087351c1a..4486098c7b3a1d 100644
--- a/deps/zlib/crc32.c
+++ b/deps/zlib/crc32.c
@@ -1,12 +1,10 @@
 /* crc32.c -- compute the CRC-32 of a data stream
- * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler
+ * Copyright (C) 1995-2022 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  *
- * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
- * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
- * tables for updating the shift register in one step with three exclusive-ors
- * instead of four steps with four exclusive-ors.  This results in about a
- * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
+ * This interleaved implementation of a CRC makes use of pipelined multiple
+ * arithmetic-logic units, commonly found in modern CPU cores. It is due to
+ * Kadatch and Jenkins (2010). See doc/crc-doc.1.0.pdf in this distribution.
  */
 
 /* @(#) $Id$ */
@@ -14,11 +12,12 @@
 /*
   Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
   protection on the static variables used to control the first-use generation
-  of the crc tables.  Therefore, if you #define DYNAMIC_CRC_TABLE, you should
+  of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
   first call get_crc_table() to initialize the tables before allowing more than
   one thread to use crc32().
 
-  DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
+  MAKECRCH can be #defined to write out crc32.h. A main() routine is also
+  produced, so that this one source file can be compiled to an executable.
  */
 
 #ifdef MAKECRCH
@@ -29,183 +28,727 @@
 #endif /* MAKECRCH */
 
 #include "deflate.h"
-#include "x86.h"
-#include "zutil.h"      /* for STDC and FAR definitions */
+#include "cpu_features.h"
+#include "zutil.h"      /* for Z_U4, Z_U8, z_crc_t, and FAR definitions */
 
-#if defined(CRC32_SIMD_SSE42_PCLMUL)
-#include "crc32_simd.h"
-#elif defined(CRC32_ARMV8_CRC32)
-#include "arm_features.h"
+#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32)
 #include "crc32_simd.h"
 #endif
 
-/* Definitions for doing the crc four data bytes at a time. */
-#if !defined(NOBYFOUR) && defined(Z_U4)
-#  define BYFOUR
+ /*
+  A CRC of a message is computed on N braids of words in the message, where
+  each word consists of W bytes (4 or 8). If N is 3, for example, then three
+  running sparse CRCs are calculated respectively on each braid, at these
+  indices in the array of words: 0, 3, 6, ..., 1, 4, 7, ..., and 2, 5, 8, ...
+  This is done starting at a word boundary, and continues until as many blocks
+  of N * W bytes as are available have been processed. The results are combined
+  into a single CRC at the end. For this code, N must be in the range 1..6 and
+  W must be 4 or 8. The upper limit on N can be increased if desired by adding
+  more #if blocks, extending the patterns apparent in the code. In addition,
+  crc32.h would need to be regenerated, if the maximum N value is increased.
+
+  N and W are chosen empirically by benchmarking the execution time on a given
+  processor. The choices for N and W below were based on testing on Intel Kaby
+  Lake i7, AMD Ryzen 7, ARM Cortex-A57, Sparc64-VII, PowerPC POWER9, and MIPS64
+  Octeon II processors. The Intel, AMD, and ARM processors were all fastest
+  with N=5, W=8. The Sparc, PowerPC, and MIPS64 were all fastest at N=5, W=4.
+  They were all tested with either gcc or clang, all using the -O3 optimization
+  level. Your mileage may vary.
+ */
+
+/* Define N */
+#ifdef Z_TESTN
+#  define N Z_TESTN
+#else
+#  define N 5
 #endif
-#ifdef BYFOUR
-   local unsigned long crc32_little OF((unsigned long,
-                        const unsigned char FAR *, z_size_t));
-   local unsigned long crc32_big OF((unsigned long,
-                        const unsigned char FAR *, z_size_t));
-#  define TBLS 8
+#if N < 1 || N > 6
+#  error N must be in 1..6
+#endif
+
+/*
+  z_crc_t must be at least 32 bits. z_word_t must be at least as long as
+  z_crc_t. It is assumed here that z_word_t is either 32 bits or 64 bits, and
+  that bytes are eight bits.
+ */
+
+/*
+  Define W and the associated z_word_t type. If W is not defined, then a
+  braided calculation is not used, and the associated tables and code are not
+  compiled.
+ */
+#ifdef Z_TESTW
+#  if Z_TESTW-1 != -1
+#    define W Z_TESTW
+#  endif
 #else
-#  define TBLS 1
-#endif /* BYFOUR */
+#  ifdef MAKECRCH
+#    define W 8         /* required for MAKECRCH */
+#  else
+#    if defined(__x86_64__) || defined(__aarch64__)
+#      define W 8
+#    else
+#      define W 4
+#    endif
+#  endif
+#endif
+#ifdef W
+#  if W == 8 && defined(Z_U8)
+     typedef Z_U8 z_word_t;
+#  elif defined(Z_U4)
+#    undef W
+#    define W 4
+     typedef Z_U4 z_word_t;
+#  else
+#    undef W
+#  endif
+#endif
+
+/* If available, use the ARM processor CRC32 instruction. */
+#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 \
+    && defined(USE_CANONICAL_ARMV8_CRC32)
+#  define ARMCRC32_CANONICAL_ZLIB
+#endif
 
-/* Local functions for crc concatenation */
-local unsigned long gf2_matrix_times OF((unsigned long *mat,
-                                         unsigned long vec));
-local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
-local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
+/* Local functions. */
+local z_crc_t multmodp OF((z_crc_t a, z_crc_t b));
+local z_crc_t x2nmodp OF((z_off64_t n, unsigned k));
 
+#if defined(W) && (!defined(ARMCRC32_CANONICAL_ZLIB) || defined(DYNAMIC_CRC_TABLE))
+    local z_word_t byte_swap OF((z_word_t word));
+#endif
+
+#if defined(W) && !defined(ARMCRC32_CANONICAL_ZLIB)
+    local z_crc_t crc_word OF((z_word_t data));
+    local z_word_t crc_word_big OF((z_word_t data));
+#endif
+
+#if defined(W) && (!defined(ARMCRC32_CANONICAL_ZLIB) || defined(DYNAMIC_CRC_TABLE))
+/*
+  Swap the bytes in a z_word_t to convert between little and big endian. Any
+  self-respecting compiler will optimize this to a single machine byte-swap
+  instruction, if one is available. This assumes that word_t is either 32 bits
+  or 64 bits.
+ */
+local z_word_t byte_swap(word)
+    z_word_t word;
+{
+#  if W == 8
+    return
+        (word & 0xff00000000000000) >> 56 |
+        (word & 0xff000000000000) >> 40 |
+        (word & 0xff0000000000) >> 24 |
+        (word & 0xff00000000) >> 8 |
+        (word & 0xff000000) << 8 |
+        (word & 0xff0000) << 24 |
+        (word & 0xff00) << 40 |
+        (word & 0xff) << 56;
+#  else   /* W == 4 */
+    return
+        (word & 0xff000000) >> 24 |
+        (word & 0xff0000) >> 8 |
+        (word & 0xff00) << 8 |
+        (word & 0xff) << 24;
+#  endif
+}
+#endif
+
+/* CRC polynomial. */
+#define POLY 0xedb88320         /* p(x) reflected, with x^32 implied */
 
 #ifdef DYNAMIC_CRC_TABLE
 
-local volatile int crc_table_empty = 1;
-local z_crc_t FAR crc_table[TBLS][256];
+local z_crc_t FAR crc_table[256];
+local z_crc_t FAR x2n_table[32];
 local void make_crc_table OF((void));
+#ifdef W
+   local z_word_t FAR crc_big_table[256];
+   local z_crc_t FAR crc_braid_table[W][256];
+   local z_word_t FAR crc_braid_big_table[W][256];
+   local void braid OF((z_crc_t [][256], z_word_t [][256], int, int));
+#endif
 #ifdef MAKECRCH
-   local void write_table OF((FILE *, const z_crc_t FAR *));
+   local void write_table OF((FILE *, const z_crc_t FAR *, int));
+   local void write_table32hi OF((FILE *, const z_word_t FAR *, int));
+   local void write_table64 OF((FILE *, const z_word_t FAR *, int));
 #endif /* MAKECRCH */
+
+/*
+  Define a once() function depending on the availability of atomics. If this is
+  compiled with DYNAMIC_CRC_TABLE defined, and if CRCs will be computed in
+  multiple threads, and if atomics are not available, then get_crc_table() must
+  be called to initialize the tables and must return before any threads are
+  allowed to compute or combine CRCs.
+ */
+
+/* Definition of once functionality. */
+typedef struct once_s once_t;
+local void once OF((once_t *, void (*)(void)));
+
+/* Check for the availability of atomics. */
+#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \
+    !defined(__STDC_NO_ATOMICS__)
+
+#include <stdatomic.h>
+
+/* Structure for once(), which must be initialized with ONCE_INIT. */
+struct once_s {
+    atomic_flag begun;
+    atomic_int done;
+};
+#define ONCE_INIT {ATOMIC_FLAG_INIT, 0}
+
+/*
+  Run the provided init() function exactly once, even if multiple threads
+  invoke once() at the same time. The state must be a once_t initialized with
+  ONCE_INIT.
+ */
+local void once(state, init)
+    once_t *state;
+    void (*init)(void);
+{
+    if (!atomic_load(&state->done)) {
+        if (atomic_flag_test_and_set(&state->begun))
+            while (!atomic_load(&state->done))
+                ;
+        else {
+            init();
+            atomic_store(&state->done, 1);
+        }
+    }
+}
+
+#else   /* no atomics */
+
+/* Structure for once(), which must be initialized with ONCE_INIT. */
+struct once_s {
+    volatile int begun;
+    volatile int done;
+};
+#define ONCE_INIT {0, 0}
+
+/* Test and set. Alas, not atomic, but tries to minimize the period of
+   vulnerability. */
+local int test_and_set OF((int volatile *));
+local int test_and_set(flag)
+    int volatile *flag;
+{
+    int was;
+
+    was = *flag;
+    *flag = 1;
+    return was;
+}
+
+/* Run the provided init() function once. This is not thread-safe. */
+local void once(state, init)
+    once_t *state;
+    void (*init)(void);
+{
+    if (!state->done) {
+        if (test_and_set(&state->begun))
+            while (!state->done)
+                ;
+        else {
+            init();
+            state->done = 1;
+        }
+    }
+}
+
+#endif
+
+/* State for once(). */
+local once_t made = ONCE_INIT;
+
 /*
   Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
   x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
 
   Polynomials over GF(2) are represented in binary, one bit per coefficient,
-  with the lowest powers in the most significant bit.  Then adding polynomials
+  with the lowest powers in the most significant bit. Then adding polynomials
   is just exclusive-or, and multiplying a polynomial by x is a right shift by
-  one.  If we call the above polynomial p, and represent a byte as the
+  one. If we call the above polynomial p, and represent a byte as the
   polynomial q, also with the lowest power in the most significant bit (so the
-  byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
+  byte 0xb1 is the polynomial x^7+x^3+x^2+1), then the CRC is (q*x^32) mod p,
   where a mod b means the remainder after dividing a by b.
 
   This calculation is done using the shift-register method of multiplying and
-  taking the remainder.  The register is initialized to zero, and for each
+  taking the remainder. The register is initialized to zero, and for each
   incoming bit, x^32 is added mod p to the register if the bit is a one (where
-  x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
-  x (which is shifting right by one and adding x^32 mod p if the bit shifted
-  out is a one).  We start with the highest power (least significant bit) of
-  q and repeat for all eight bits of q.
-
-  The first table is simply the CRC of all possible eight bit values.  This is
-  all the information needed to generate CRCs on data a byte at a time for all
-  combinations of CRC register values and incoming bytes.  The remaining tables
-  allow for word-at-a-time CRC calculation for both big-endian and little-
-  endian machines, where a word is four bytes.
-*/
+  x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x
+  (which is shifting right by one and adding x^32 mod p if the bit shifted out
+  is a one). We start with the highest power (least significant bit) of q and
+  repeat for all eight bits of q.
+
+  The table is simply the CRC of all possible eight bit values. This is all the
+  information needed to generate CRCs on data a byte at a time for all
+  combinations of CRC register values and incoming bytes.
+ */
 local void make_crc_table()
 {
-    z_crc_t c;
-    int n, k;
-    z_crc_t poly;                       /* polynomial exclusive-or pattern */
-    /* terms of polynomial defining this crc (except x^32): */
-    static volatile int first = 1;      /* flag to limit concurrent making */
-    static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
-
-    /* See if another task is already doing this (not thread-safe, but better
-       than nothing -- significantly reduces duration of vulnerability in
-       case the advice about DYNAMIC_CRC_TABLE is ignored) */
-    if (first) {
-        first = 0;
-
-        /* make exclusive-or pattern from polynomial (0xedb88320UL) */
-        poly = 0;
-        for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
-            poly |= (z_crc_t)1 << (31 - p[n]);
-
-        /* generate a crc for every 8-bit value */
-        for (n = 0; n < 256; n++) {
-            c = (z_crc_t)n;
-            for (k = 0; k < 8; k++)
-                c = c & 1 ? poly ^ (c >> 1) : c >> 1;
-            crc_table[0][n] = c;
-        }
+    unsigned i, j, n;
+    z_crc_t p;
+
+    /* initialize the CRC of bytes tables */
+    for (i = 0; i < 256; i++) {
+        p = i;
+        for (j = 0; j < 8; j++)
+            p = p & 1 ? (p >> 1) ^ POLY : p >> 1;
+        crc_table[i] = p;
+#ifdef W
+        crc_big_table[i] = byte_swap(p);
+#endif
+    }
 
-#ifdef BYFOUR
-        /* generate crc for each value followed by one, two, and three zeros,
-           and then the byte reversal of those as well as the first table */
-        for (n = 0; n < 256; n++) {
-            c = crc_table[0][n];
-            crc_table[4][n] = ZSWAP32(c);
-            for (k = 1; k < 4; k++) {
-                c = crc_table[0][c & 0xff] ^ (c >> 8);
-                crc_table[k][n] = c;
-                crc_table[k + 4][n] = ZSWAP32(c);
-            }
-        }
-#endif /* BYFOUR */
+    /* initialize the x^2^n mod p(x) table */
+    p = (z_crc_t)1 << 30;         /* x^1 */
+    x2n_table[0] = p;
+    for (n = 1; n < 32; n++)
+        x2n_table[n] = p = multmodp(p, p);
 
-        crc_table_empty = 0;
-    }
-    else {      /* not first */
-        /* wait for the other guy to finish (not efficient, but rare) */
-        while (crc_table_empty)
-            ;
-    }
+#ifdef W
+    /* initialize the braiding tables -- needs x2n_table[] */
+    braid(crc_braid_table, crc_braid_big_table, N, W);
+#endif
 
 #ifdef MAKECRCH
-    /* write out CRC tables to crc32.h */
     {
+        /*
+          The crc32.h header file contains tables for both 32-bit and 64-bit
+          z_word_t's, and so requires a 64-bit type be available. In that case,
+          z_word_t must be defined to be 64-bits. This code then also generates
+          and writes out the tables for the case that z_word_t is 32 bits.
+         */
+#if !defined(W) || W != 8
+#  error Need a 64-bit integer type in order to generate crc32.h.
+#endif
         FILE *out;
+        int k, n;
+        z_crc_t ltl[8][256];
+        z_word_t big[8][256];
 
         out = fopen("crc32.h", "w");
         if (out == NULL) return;
-        fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
-        fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
-        fprintf(out, "local const z_crc_t FAR ");
-        fprintf(out, "crc_table[TBLS][256] =\n{\n  {\n");
-        write_table(out, crc_table[0]);
-#  ifdef BYFOUR
-        fprintf(out, "#ifdef BYFOUR\n");
-        for (k = 1; k < 8; k++) {
-            fprintf(out, "  },\n  {\n");
-            write_table(out, crc_table[k]);
+
+        /* write out little-endian CRC table to crc32.h */
+        fprintf(out,
+            "/* crc32.h -- tables for rapid CRC calculation\n"
+            " * Generated automatically by crc32.c\n */\n"
+            "\n"
+            "local const z_crc_t FAR crc_table[] = {\n"
+            "    ");
+        write_table(out, crc_table, 256);
+        fprintf(out,
+            "};\n");
+
+        /* write out big-endian CRC table for 64-bit z_word_t to crc32.h */
+        fprintf(out,
+            "\n"
+            "#ifdef W\n"
+            "\n"
+            "#if W == 8\n"
+            "\n"
+            "local const z_word_t FAR crc_big_table[] = {\n"
+            "    ");
+        write_table64(out, crc_big_table, 256);
+        fprintf(out,
+            "};\n");
+
+        /* write out big-endian CRC table for 32-bit z_word_t to crc32.h */
+        fprintf(out,
+            "\n"
+            "#else /* W == 4 */\n"
+            "\n"
+            "local const z_word_t FAR crc_big_table[] = {\n"
+            "    ");
+        write_table32hi(out, crc_big_table, 256);
+        fprintf(out,
+            "};\n"
+            "\n"
+            "#endif\n");
+
+        /* write out braid tables for each value of N */
+        for (n = 1; n <= 6; n++) {
+            fprintf(out,
+            "\n"
+            "#if N == %d\n", n);
+
+            /* compute braid tables for this N and 64-bit word_t */
+            braid(ltl, big, n, 8);
+
+            /* write out braid tables for 64-bit z_word_t to crc32.h */
+            fprintf(out,
+            "\n"
+            "#if W == 8\n"
+            "\n"
+            "local const z_crc_t FAR crc_braid_table[][256] = {\n");
+            for (k = 0; k < 8; k++) {
+                fprintf(out, "   {");
+                write_table(out, ltl[k], 256);
+                fprintf(out, "}%s", k < 7 ? ",\n" : "");
+            }
+            fprintf(out,
+            "};\n"
+            "\n"
+            "local const z_word_t FAR crc_braid_big_table[][256] = {\n");
+            for (k = 0; k < 8; k++) {
+                fprintf(out, "   {");
+                write_table64(out, big[k], 256);
+                fprintf(out, "}%s", k < 7 ? ",\n" : "");
+            }
+            fprintf(out,
+            "};\n");
+
+            /* compute braid tables for this N and 32-bit word_t */
+            braid(ltl, big, n, 4);
+
+            /* write out braid tables for 32-bit z_word_t to crc32.h */
+            fprintf(out,
+            "\n"
+            "#else /* W == 4 */\n"
+            "\n"
+            "local const z_crc_t FAR crc_braid_table[][256] = {\n");
+            for (k = 0; k < 4; k++) {
+                fprintf(out, "   {");
+                write_table(out, ltl[k], 256);
+                fprintf(out, "}%s", k < 3 ? ",\n" : "");
+            }
+            fprintf(out,
+            "};\n"
+            "\n"
+            "local const z_word_t FAR crc_braid_big_table[][256] = {\n");
+            for (k = 0; k < 4; k++) {
+                fprintf(out, "   {");
+                write_table32hi(out, big[k], 256);
+                fprintf(out, "}%s", k < 3 ? ",\n" : "");
+            }
+            fprintf(out,
+            "};\n"
+            "\n"
+            "#endif\n"
+            "\n"
+            "#endif\n");
         }
-        fprintf(out, "#endif\n");
-#  endif /* BYFOUR */
-        fprintf(out, "  }\n};\n");
+        fprintf(out,
+            "\n"
+            "#endif\n");
+
+        /* write out zeros operator table to crc32.h */
+        fprintf(out,
+            "\n"
+            "local const z_crc_t FAR x2n_table[] = {\n"
+            "    ");
+        write_table(out, x2n_table, 32);
+        fprintf(out,
+            "};\n");
         fclose(out);
     }
 #endif /* MAKECRCH */
 }
 
 #ifdef MAKECRCH
-local void write_table(out, table)
+
+/*
+   Write the 32-bit values in table[0..k-1] to out, five per line in
+   hexadecimal separated by commas.
+ */
+local void write_table(out, table, k)
     FILE *out;
     const z_crc_t FAR *table;
+    int k;
 {
     int n;
 
-    for (n = 0; n < 256; n++)
-        fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : "    ",
+    for (n = 0; n < k; n++)
+        fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : "    ",
                 (unsigned long)(table[n]),
-                n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
+                n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", "));
+}
+
+/*
+   Write the high 32-bits of each value in table[0..k-1] to out, five per line
+   in hexadecimal separated by commas.
+ */
+local void write_table32hi(out, table, k)
+FILE *out;
+const z_word_t FAR *table;
+int k;
+{
+    int n;
+
+    for (n = 0; n < k; n++)
+        fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : "    ",
+                (unsigned long)(table[n] >> 32),
+                n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", "));
 }
+
+/*
+  Write the 64-bit values in table[0..k-1] to out, three per line in
+  hexadecimal separated by commas. This assumes that if there is a 64-bit
+  type, then there is also a long long integer type, and it is at least 64
+  bits. If not, then the type cast and format string can be adjusted
+  accordingly.
+ */
+local void write_table64(out, table, k)
+    FILE *out;
+    const z_word_t FAR *table;
+    int k;
+{
+    int n;
+
+    for (n = 0; n < k; n++)
+        fprintf(out, "%s0x%016llx%s", n == 0 || n % 3 ? "" : "    ",
+                (unsigned long long)(table[n]),
+                n == k - 1 ? "" : (n % 3 == 2 ? ",\n" : ", "));
+}
+
+/* Actually do the deed. */
+int main()
+{
+    make_crc_table();
+    return 0;
+}
+
 #endif /* MAKECRCH */
 
+#ifdef W
+/*
+  Generate the little and big-endian braid tables for the given n and z_word_t
+  size w. Each array must have room for w blocks of 256 elements.
+ */
+local void braid(ltl, big, n, w)
+    z_crc_t ltl[][256];
+    z_word_t big[][256];
+    int n;
+    int w;
+{
+    int k;
+    z_crc_t i, p, q;
+    for (k = 0; k < w; k++) {
+        p = x2nmodp((n * w + 3 - k) << 3, 0);
+        ltl[k][0] = 0;
+        big[w - 1 - k][0] = 0;
+        for (i = 1; i < 256; i++) {
+            ltl[k][i] = q = multmodp(i << 24, p);
+            big[w - 1 - k][i] = byte_swap(q);
+        }
+    }
+}
+#endif
+
 #else /* !DYNAMIC_CRC_TABLE */
 /* ========================================================================
- * Tables of CRC-32s of all single-byte values, made by make_crc_table().
+ * Tables for byte-wise and braided CRC-32 calculations, and a table of powers
+ * of x for combining CRC-32s, all made by make_crc_table().
  */
 #include "crc32.h"
 #endif /* DYNAMIC_CRC_TABLE */
 
+/* ========================================================================
+ * Routines used for CRC calculation. Some are also required for the table
+ * generation above.
+ */
+
+/*
+  Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
+  reflected. For speed, this requires that a not be zero.
+ */
+local z_crc_t multmodp(a, b)
+    z_crc_t a;
+    z_crc_t b;
+{
+    z_crc_t m, p;
+
+    m = (z_crc_t)1 << 31;
+    p = 0;
+    for (;;) {
+        if (a & m) {
+            p ^= b;
+            if ((a & (m - 1)) == 0)
+                break;
+        }
+        m >>= 1;
+        b = b & 1 ? (b >> 1) ^ POLY : b >> 1;
+    }
+    return p;
+}
+
+/*
+  Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
+  initialized.
+ */
+local z_crc_t x2nmodp(n, k)
+    z_off64_t n;
+    unsigned k;
+{
+    z_crc_t p;
+
+    p = (z_crc_t)1 << 31;           /* x^0 == 1 */
+    while (n) {
+        if (n & 1)
+            p = multmodp(x2n_table[k & 31], p);
+        n >>= 1;
+        k++;
+    }
+    return p;
+}
+
 /* =========================================================================
- * This function can be used by asm versions of crc32()
+ * This function can be used by asm versions of crc32(), and to force the
+ * generation of the CRC tables in a threaded application.
  */
 const z_crc_t FAR * ZEXPORT get_crc_table()
 {
 #ifdef DYNAMIC_CRC_TABLE
-    if (crc_table_empty)
-        make_crc_table();
+    once(&made, make_crc_table);
 #endif /* DYNAMIC_CRC_TABLE */
     return (const z_crc_t FAR *)crc_table;
 }
 
-/* ========================================================================= */
-#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
-#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
+/* =========================================================================
+ * Use ARM machine instructions if available. This will compute the CRC about
+ * ten times faster than the braided calculation. This code does not check for
+ * the presence of the CRC instruction at run time. __ARM_FEATURE_CRC32 will
+ * only be defined if the compilation specifies an ARM processor architecture
+ * that has the instructions. For example, compiling with -march=armv8.1-a or
+ * -march=armv8-a+crc, or -march=native if the compile machine has the crc32
+ * instructions.
+ */
+#if ARMCRC32_CANONICAL_ZLIB
+
+/*
+   Constants empirically determined to maximize speed. These values are from
+   measurements on a Cortex-A57. Your mileage may vary.
+ */
+#define Z_BATCH 3990                /* number of words in a batch */
+#define Z_BATCH_ZEROS 0xa10d3d0c    /* computed from Z_BATCH = 3990 */
+#define Z_BATCH_MIN 800             /* fewest words in a final batch */
+
+unsigned long ZEXPORT crc32_z(crc, buf, len)
+    unsigned long crc;
+    const unsigned char FAR *buf;
+    z_size_t len;
+{
+    z_crc_t val;
+    z_word_t crc1, crc2;
+    const z_word_t *word;
+    z_word_t val0, val1, val2;
+    z_size_t last, last2, i;
+    z_size_t num;
+
+    /* Return initial CRC, if requested. */
+    if (buf == Z_NULL) return 0;
+
+#ifdef DYNAMIC_CRC_TABLE
+    once(&made, make_crc_table);
+#endif /* DYNAMIC_CRC_TABLE */
+
+    /* Pre-condition the CRC */
+    crc = (~crc) & 0xffffffff;
+
+    /* Compute the CRC up to a word boundary. */
+    while (len && ((z_size_t)buf & 7) != 0) {
+        len--;
+        val = *buf++;
+        __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val));
+    }
+
+    /* Prepare to compute the CRC on full 64-bit words word[0..num-1]. */
+    word = (z_word_t const *)buf;
+    num = len >> 3;
+    len &= 7;
+
+    /* Do three interleaved CRCs to realize the throughput of one crc32x
+       instruction per cycle. Each CRC is calculated on Z_BATCH words. The
+       three CRCs are combined into a single CRC after each set of batches. */
+    while (num >= 3 * Z_BATCH) {
+        crc1 = 0;
+        crc2 = 0;
+        for (i = 0; i < Z_BATCH; i++) {
+            val0 = word[i];
+            val1 = word[i + Z_BATCH];
+            val2 = word[i + 2 * Z_BATCH];
+            __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0));
+            __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1));
+            __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2));
+        }
+        word += 3 * Z_BATCH;
+        num -= 3 * Z_BATCH;
+        crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc1;
+        crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc2;
+    }
+
+    /* Do one last smaller batch with the remaining words, if there are enough
+       to pay for the combination of CRCs. */
+    last = num / 3;
+    if (last >= Z_BATCH_MIN) {
+        last2 = last << 1;
+        crc1 = 0;
+        crc2 = 0;
+        for (i = 0; i < last; i++) {
+            val0 = word[i];
+            val1 = word[i + last];
+            val2 = word[i + last2];
+            __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0));
+            __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1));
+            __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2));
+        }
+        word += 3 * last;
+        num -= 3 * last;
+        val = x2nmodp(last, 6);
+        crc = multmodp(val, crc) ^ crc1;
+        crc = multmodp(val, crc) ^ crc2;
+    }
+
+    /* Compute the CRC on any remaining words. */
+    for (i = 0; i < num; i++) {
+        val0 = word[i];
+        __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0));
+    }
+    word += num;
+
+    /* Complete the CRC on any remaining bytes. */
+    buf = (const unsigned char FAR *)word;
+    while (len) {
+        len--;
+        val = *buf++;
+        __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val));
+    }
+
+    /* Return the CRC, post-conditioned. */
+    return crc ^ 0xffffffff;
+}
+
+#else
+
+#ifdef W
+
+/*
+  Return the CRC of the W bytes in the word_t data, taking the
+  least-significant byte of the word as the first byte of data, without any pre
+  or post conditioning. This is used to combine the CRCs of each braid.
+ */
+local z_crc_t crc_word(data)
+    z_word_t data;
+{
+    int k;
+    for (k = 0; k < W; k++)
+        data = (data >> 8) ^ crc_table[data & 0xff];
+    return (z_crc_t)data;
+}
+
+local z_word_t crc_word_big(data)
+    z_word_t data;
+{
+    int k;
+    for (k = 0; k < W; k++)
+        data = (data << 8) ^
+            crc_big_table[(data >> ((W - 1) << 3)) & 0xff];
+    return data;
+}
+
+#endif
 
 /* ========================================================================= */
 unsigned long ZEXPORT crc32_z(crc, buf, len)
@@ -219,17 +762,18 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
      * place to cache CPU features if needed for those later, more
      * interesting crc32() calls.
      */
-#if defined(CRC32_SIMD_SSE42_PCLMUL)
+#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32)
     /*
-     * Use x86 sse4.2+pclmul SIMD to compute the crc32. Since this
-     * routine can be freely used, check CPU features here.
+     * Since this routine can be freely used, check CPU features here.
      */
     if (buf == Z_NULL) {
         if (!len) /* Assume user is calling crc32(0, NULL, 0); */
-            x86_check_features();
+            cpu_check_features();
         return 0UL;
     }
 
+#endif
+#if defined(CRC32_SIMD_SSE42_PCLMUL)
     if (x86_cpu_enable_simd && len >= Z_CRC32_SSE42_MINIMUM_LENGTH) {
         /* crc32 16-byte chunks */
         z_size_t chunk_size = len & ~Z_CRC32_SSE42_CHUNKSIZE_MASK;
@@ -241,284 +785,461 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
         /* Fall into the default crc32 for the remaining data. */
         buf += chunk_size;
     }
+#elif defined(CRC32_ARMV8_CRC32)
+    if (arm_cpu_enable_crc32) {
+#if defined(__aarch64__)
+        /* PMULL is 64bit only, plus code needs at least a 64 bytes buffer. */
+        if (arm_cpu_enable_pmull && (len > Z_CRC32_PMULL_MINIMUM_LENGTH)) {
+            const size_t chunk_size = len & ~Z_CRC32_PMULL_CHUNKSIZE_MASK;
+            crc = ~armv8_crc32_pmull_little(buf, chunk_size, ~(uint32_t)crc);
+            /* Check remaining data. */
+            len -= chunk_size;
+            if (!len)
+                return crc;
+
+            /* Fall through for the remaining data. */
+            buf += chunk_size;
+        }
+#endif
+        return armv8_crc32_little(buf, len, crc); /* Armv8@32bit or tail. */
+    }
 #else
     if (buf == Z_NULL) {
         return 0UL;
     }
-#endif /* CRC32_SIMD_SSE42_PCLMUL */
+#endif /* CRC32_SIMD */
 
 #ifdef DYNAMIC_CRC_TABLE
-    if (crc_table_empty)
-        make_crc_table();
+    once(&made, make_crc_table);
 #endif /* DYNAMIC_CRC_TABLE */
+    /* Pre-condition the CRC */
+    crc = (~crc) & 0xffffffff;
+
+#ifdef W
+
+    /* If provided enough bytes, do a braided CRC calculation. */
+    if (len >= N * W + W - 1) {
+        z_size_t blks;
+        z_word_t const *words;
+        unsigned endian;
+        int k;
+
+        /* Compute the CRC up to a z_word_t boundary. */
+        while (len && ((z_size_t)buf & (W - 1)) != 0) {
+            len--;
+            crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
+        }
 
-#ifdef BYFOUR
-    if (sizeof(void *) == sizeof(ptrdiff_t)) {
-        z_crc_t endian;
+        /* Compute the CRC on as many N z_word_t blocks as are available. */
+        blks = len / (N * W);
+        len -= blks * N * W;
+        words = (z_word_t const *)buf;
 
+        /* Do endian check at execution time instead of compile time, since ARM
+           processors can change the endianess at execution time. If the
+           compiler knows what the endianess will be, it can optimize out the
+           check and the unused branch. */
         endian = 1;
-        if (*((unsigned char *)(&endian)))
-            return crc32_little(crc, buf, len);
-        else
-            return crc32_big(crc, buf, len);
-    }
-#endif /* BYFOUR */
-    crc = crc ^ 0xffffffffUL;
-    while (len >= 8) {
-        DO8;
-        len -= 8;
-    }
-    if (len) do {
-        DO1;
-    } while (--len);
-    return crc ^ 0xffffffffUL;
-}
+        if (*(unsigned char *)&endian) {
+            /* Little endian. */
+
+            z_crc_t crc0;
+            z_word_t word0;
+#if N > 1
+            z_crc_t crc1;
+            z_word_t word1;
+#if N > 2
+            z_crc_t crc2;
+            z_word_t word2;
+#if N > 3
+            z_crc_t crc3;
+            z_word_t word3;
+#if N > 4
+            z_crc_t crc4;
+            z_word_t word4;
+#if N > 5
+            z_crc_t crc5;
+            z_word_t word5;
+#endif
+#endif
+#endif
+#endif
+#endif
 
-/* ========================================================================= */
-unsigned long ZEXPORT crc32(crc, buf, len)
-    unsigned long crc;
-    const unsigned char FAR *buf;
-    uInt len;
-{
-#if defined(CRC32_ARMV8_CRC32)
-    /* We got to verify ARM CPU features, so exploit the common usage pattern
-     * of calling this function with Z_NULL for an initial valid crc value.
-     * This allows to cache the result of the feature check and avoid extraneous
-     * function calls.
-     * TODO: try to move this to crc32_z if we don't loose performance on ARM.
-     */
-    if (buf == Z_NULL) {
-        if (!len) /* Assume user is calling crc32(0, NULL, 0); */
-            arm_check_features();
-        return 0UL;
-    }
+            /* Initialize the CRC for each braid. */
+            crc0 = crc;
+#if N > 1
+            crc1 = 0;
+#if N > 2
+            crc2 = 0;
+#if N > 3
+            crc3 = 0;
+#if N > 4
+            crc4 = 0;
+#if N > 5
+            crc5 = 0;
+#endif
+#endif
+#endif
+#endif
+#endif
 
-    if (arm_cpu_enable_crc32)
-        return armv8_crc32_little(crc, buf, len);
+            /*
+              Process the first blks-1 blocks, computing the CRCs on each braid
+              independently.
+             */
+            while (--blks) {
+                /* Load the word for each braid into registers. */
+                word0 = crc0 ^ words[0];
+#if N > 1
+                word1 = crc1 ^ words[1];
+#if N > 2
+                word2 = crc2 ^ words[2];
+#if N > 3
+                word3 = crc3 ^ words[3];
+#if N > 4
+                word4 = crc4 ^ words[4];
+#if N > 5
+                word5 = crc5 ^ words[5];
 #endif
-    return crc32_z(crc, buf, len);
-}
+#endif
+#endif
+#endif
+#endif
+                words += N;
+
+                /* Compute and update the CRC for each word. The loop should
+                   get unrolled. */
+                crc0 = crc_braid_table[0][word0 & 0xff];
+#if N > 1
+                crc1 = crc_braid_table[0][word1 & 0xff];
+#if N > 2
+                crc2 = crc_braid_table[0][word2 & 0xff];
+#if N > 3
+                crc3 = crc_braid_table[0][word3 & 0xff];
+#if N > 4
+                crc4 = crc_braid_table[0][word4 & 0xff];
+#if N > 5
+                crc5 = crc_braid_table[0][word5 & 0xff];
+#endif
+#endif
+#endif
+#endif
+#endif
+                for (k = 1; k < W; k++) {
+                    crc0 ^= crc_braid_table[k][(word0 >> (k << 3)) & 0xff];
+#if N > 1
+                    crc1 ^= crc_braid_table[k][(word1 >> (k << 3)) & 0xff];
+#if N > 2
+                    crc2 ^= crc_braid_table[k][(word2 >> (k << 3)) & 0xff];
+#if N > 3
+                    crc3 ^= crc_braid_table[k][(word3 >> (k << 3)) & 0xff];
+#if N > 4
+                    crc4 ^= crc_braid_table[k][(word4 >> (k << 3)) & 0xff];
+#if N > 5
+                    crc5 ^= crc_braid_table[k][(word5 >> (k << 3)) & 0xff];
+#endif
+#endif
+#endif
+#endif
+#endif
+                }
+            }
 
-#ifdef BYFOUR
+            /*
+              Process the last block, combining the CRCs of the N braids at the
+              same time.
+             */
+            crc = crc_word(crc0 ^ words[0]);
+#if N > 1
+            crc = crc_word(crc1 ^ words[1] ^ crc);
+#if N > 2
+            crc = crc_word(crc2 ^ words[2] ^ crc);
+#if N > 3
+            crc = crc_word(crc3 ^ words[3] ^ crc);
+#if N > 4
+            crc = crc_word(crc4 ^ words[4] ^ crc);
+#if N > 5
+            crc = crc_word(crc5 ^ words[5] ^ crc);
+#endif
+#endif
+#endif
+#endif
+#endif
+            words += N;
+        }
+        else {
+            /* Big endian. */
+
+            z_word_t crc0, word0, comb;
+#if N > 1
+            z_word_t crc1, word1;
+#if N > 2
+            z_word_t crc2, word2;
+#if N > 3
+            z_word_t crc3, word3;
+#if N > 4
+            z_word_t crc4, word4;
+#if N > 5
+            z_word_t crc5, word5;
+#endif
+#endif
+#endif
+#endif
+#endif
 
-/*
-   This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit
-   integer pointer type. This violates the strict aliasing rule, where a
-   compiler can assume, for optimization purposes, that two pointers to
-   fundamentally different types won't ever point to the same memory. This can
-   manifest as a problem only if one of the pointers is written to. This code
-   only reads from those pointers. So long as this code remains isolated in
-   this compilation unit, there won't be a problem. For this reason, this code
-   should not be copied and pasted into a compilation unit in which other code
-   writes to the buffer that is passed to these routines.
- */
+            /* Initialize the CRC for each braid. */
+            crc0 = byte_swap(crc);
+#if N > 1
+            crc1 = 0;
+#if N > 2
+            crc2 = 0;
+#if N > 3
+            crc3 = 0;
+#if N > 4
+            crc4 = 0;
+#if N > 5
+            crc5 = 0;
+#endif
+#endif
+#endif
+#endif
+#endif
 
-/* ========================================================================= */
-#define DOLIT4 c ^= *buf4++; \
-        c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
-            crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
-#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
+            /*
+              Process the first blks-1 blocks, computing the CRCs on each braid
+              independently.
+             */
+            while (--blks) {
+                /* Load the word for each braid into registers. */
+                word0 = crc0 ^ words[0];
+#if N > 1
+                word1 = crc1 ^ words[1];
+#if N > 2
+                word2 = crc2 ^ words[2];
+#if N > 3
+                word3 = crc3 ^ words[3];
+#if N > 4
+                word4 = crc4 ^ words[4];
+#if N > 5
+                word5 = crc5 ^ words[5];
+#endif
+#endif
+#endif
+#endif
+#endif
+                words += N;
+
+                /* Compute and update the CRC for each word. The loop should
+                   get unrolled. */
+                crc0 = crc_braid_big_table[0][word0 & 0xff];
+#if N > 1
+                crc1 = crc_braid_big_table[0][word1 & 0xff];
+#if N > 2
+                crc2 = crc_braid_big_table[0][word2 & 0xff];
+#if N > 3
+                crc3 = crc_braid_big_table[0][word3 & 0xff];
+#if N > 4
+                crc4 = crc_braid_big_table[0][word4 & 0xff];
+#if N > 5
+                crc5 = crc_braid_big_table[0][word5 & 0xff];
+#endif
+#endif
+#endif
+#endif
+#endif
+                for (k = 1; k < W; k++) {
+                    crc0 ^= crc_braid_big_table[k][(word0 >> (k << 3)) & 0xff];
+#if N > 1
+                    crc1 ^= crc_braid_big_table[k][(word1 >> (k << 3)) & 0xff];
+#if N > 2
+                    crc2 ^= crc_braid_big_table[k][(word2 >> (k << 3)) & 0xff];
+#if N > 3
+                    crc3 ^= crc_braid_big_table[k][(word3 >> (k << 3)) & 0xff];
+#if N > 4
+                    crc4 ^= crc_braid_big_table[k][(word4 >> (k << 3)) & 0xff];
+#if N > 5
+                    crc5 ^= crc_braid_big_table[k][(word5 >> (k << 3)) & 0xff];
+#endif
+#endif
+#endif
+#endif
+#endif
+                }
+            }
 
-/* ========================================================================= */
-local unsigned long crc32_little(crc, buf, len)
-    unsigned long crc;
-    const unsigned char FAR *buf;
-    z_size_t len;
-{
-    register z_crc_t c;
-    register const z_crc_t FAR *buf4;
+            /*
+              Process the last block, combining the CRCs of the N braids at the
+              same time.
+             */
+            comb = crc_word_big(crc0 ^ words[0]);
+#if N > 1
+            comb = crc_word_big(crc1 ^ words[1] ^ comb);
+#if N > 2
+            comb = crc_word_big(crc2 ^ words[2] ^ comb);
+#if N > 3
+            comb = crc_word_big(crc3 ^ words[3] ^ comb);
+#if N > 4
+            comb = crc_word_big(crc4 ^ words[4] ^ comb);
+#if N > 5
+            comb = crc_word_big(crc5 ^ words[5] ^ comb);
+#endif
+#endif
+#endif
+#endif
+#endif
+            words += N;
+            crc = byte_swap(comb);
+        }
 
-    c = (z_crc_t)crc;
-    c = ~c;
-    while (len && ((ptrdiff_t)buf & 3)) {
-        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
-        len--;
+        /*
+          Update the pointer to the remaining bytes to process.
+         */
+        buf = (unsigned char const *)words;
     }
 
-    buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
-    while (len >= 32) {
-        DOLIT32;
-        len -= 32;
+#endif /* W */
+
+    /* Complete the computation of the CRC on any remaining bytes. */
+    while (len >= 8) {
+        len -= 8;
+        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
+        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
+        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
+        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
+        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
+        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
+        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
+        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
     }
-    while (len >= 4) {
-        DOLIT4;
-        len -= 4;
+    while (len) {
+        len--;
+        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
     }
-    buf = (const unsigned char FAR *)buf4;
 
-    if (len) do {
-        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
-    } while (--len);
-    c = ~c;
-    return (unsigned long)c;
+    /* Return the CRC, post-conditioned. */
+    return crc ^ 0xffffffff;
 }
 
-/* ========================================================================= */
-#define DOBIG4 c ^= *buf4++; \
-        c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
-            crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
-#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
+#endif
 
 /* ========================================================================= */
-local unsigned long crc32_big(crc, buf, len)
+unsigned long ZEXPORT crc32(crc, buf, len)
     unsigned long crc;
     const unsigned char FAR *buf;
-    z_size_t len;
+    uInt len;
 {
-    register z_crc_t c;
-    register const z_crc_t FAR *buf4;
-
-    c = ZSWAP32((z_crc_t)crc);
-    c = ~c;
-    while (len && ((ptrdiff_t)buf & 3)) {
-        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
-        len--;
+    /* Some bots compile with optimizations disabled, others will emulate
+     * ARM on x86 and other weird combinations.
+     */
+#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32)
+    /* We got to verify CPU features, so exploit the common usage pattern
+     * of calling this function with Z_NULL for an initial valid crc value.
+     * This allows to cache the result of the feature check and avoid extraneous
+     * function calls.
+     */
+    if (buf == Z_NULL) {
+        if (!len) /* Assume user is calling crc32(0, NULL, 0); */
+            cpu_check_features();
+        return 0UL;
     }
+#endif
 
-    buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
-    while (len >= 32) {
-        DOBIG32;
-        len -= 32;
-    }
-    while (len >= 4) {
-        DOBIG4;
-        len -= 4;
+#if defined(CRC32_ARMV8_CRC32)
+    if (arm_cpu_enable_crc32) {
+#if defined(__aarch64__)
+        /* PMULL is 64bit only, plus code needs at least a 64 bytes buffer. */
+        if (arm_cpu_enable_pmull && (len > Z_CRC32_PMULL_MINIMUM_LENGTH)) {
+            const size_t chunk_size = len & ~Z_CRC32_PMULL_CHUNKSIZE_MASK;
+            crc = ~armv8_crc32_pmull_little(buf, chunk_size, ~(uint32_t)crc);
+            /* Check remaining data. */
+            len -= chunk_size;
+            if (!len)
+                return crc;
+
+            /* Fall through for the remaining data. */
+            buf += chunk_size;
+        }
+#endif
+        return armv8_crc32_little(buf, len, crc); /* Armv8@32bit or tail. */
     }
-    buf = (const unsigned char FAR *)buf4;
-
-    if (len) do {
-        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
-    } while (--len);
-    c = ~c;
-    return (unsigned long)(ZSWAP32(c));
+#endif
+    return crc32_z(crc, buf, len); /* Armv7 or Armv8 w/o crypto extensions. */
 }
 
-#endif /* BYFOUR */
-
-#define GF2_DIM 32      /* dimension of GF(2) vectors (length of CRC) */
-
 /* ========================================================================= */
-local unsigned long gf2_matrix_times(mat, vec)
-    unsigned long *mat;
-    unsigned long vec;
+uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
+    uLong crc1;
+    uLong crc2;
+    z_off64_t len2;
 {
-    unsigned long sum;
-
-    sum = 0;
-    while (vec) {
-        if (vec & 1)
-            sum ^= *mat;
-        vec >>= 1;
-        mat++;
-    }
-    return sum;
+#ifdef DYNAMIC_CRC_TABLE
+    once(&made, make_crc_table);
+#endif /* DYNAMIC_CRC_TABLE */
+    return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff);
 }
 
 /* ========================================================================= */
-local void gf2_matrix_square(square, mat)
-    unsigned long *square;
-    unsigned long *mat;
+uLong ZEXPORT crc32_combine(crc1, crc2, len2)
+    uLong crc1;
+    uLong crc2;
+    z_off_t len2;
 {
-    int n;
-
-    for (n = 0; n < GF2_DIM; n++)
-        square[n] = gf2_matrix_times(mat, mat[n]);
+    return crc32_combine64(crc1, crc2, (z_off64_t)len2);
 }
-
 /* ========================================================================= */
-local uLong crc32_combine_(crc1, crc2, len2)
-    uLong crc1;
-    uLong crc2;
+uLong ZEXPORT crc32_combine_gen64(len2)
     z_off64_t len2;
 {
-    int n;
-    unsigned long row;
-    unsigned long even[GF2_DIM];    /* even-power-of-two zeros operator */
-    unsigned long odd[GF2_DIM];     /* odd-power-of-two zeros operator */
-
-    /* degenerate case (also disallow negative lengths) */
-    if (len2 <= 0)
-        return crc1;
-
-    /* put operator for one zero bit in odd */
-    odd[0] = 0xedb88320UL;          /* CRC-32 polynomial */
-    row = 1;
-    for (n = 1; n < GF2_DIM; n++) {
-        odd[n] = row;
-        row <<= 1;
-    }
-
-    /* put operator for two zero bits in even */
-    gf2_matrix_square(even, odd);
-
-    /* put operator for four zero bits in odd */
-    gf2_matrix_square(odd, even);
-
-    /* apply len2 zeros to crc1 (first square will put the operator for one
-       zero byte, eight zero bits, in even) */
-    do {
-        /* apply zeros operator for this bit of len2 */
-        gf2_matrix_square(even, odd);
-        if (len2 & 1)
-            crc1 = gf2_matrix_times(even, crc1);
-        len2 >>= 1;
-
-        /* if no more bits set, then done */
-        if (len2 == 0)
-            break;
-
-        /* another iteration of the loop with odd and even swapped */
-        gf2_matrix_square(odd, even);
-        if (len2 & 1)
-            crc1 = gf2_matrix_times(odd, crc1);
-        len2 >>= 1;
-
-        /* if no more bits set, then done */
-    } while (len2 != 0);
-
-    /* return combined crc */
-    crc1 ^= crc2;
-    return crc1;
+#ifdef DYNAMIC_CRC_TABLE
+    once(&made, make_crc_table);
+#endif /* DYNAMIC_CRC_TABLE */
+    return x2nmodp(len2, 3);
 }
 
 /* ========================================================================= */
-uLong ZEXPORT crc32_combine(crc1, crc2, len2)
-    uLong crc1;
-    uLong crc2;
+uLong ZEXPORT crc32_combine_gen(len2)
     z_off_t len2;
 {
-    return crc32_combine_(crc1, crc2, len2);
+    return crc32_combine_gen64((z_off64_t)len2);
 }
 
-uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
+/* ========================================================================= */
+uLong ZEXPORT crc32_combine_op(crc1, crc2, op)
     uLong crc1;
     uLong crc2;
-    z_off64_t len2;
+    uLong op;
 {
-    return crc32_combine_(crc1, crc2, len2);
+    return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
 }
 
 ZLIB_INTERNAL void crc_reset(deflate_state *const s)
 {
+#ifdef CRC32_SIMD_SSE42_PCLMUL
     if (x86_cpu_enable_simd) {
         crc_fold_init(s);
         return;
     }
+#endif
     s->strm->adler = crc32(0L, Z_NULL, 0);
 }
 
 ZLIB_INTERNAL void crc_finalize(deflate_state *const s)
 {
+#ifdef CRC32_SIMD_SSE42_PCLMUL
     if (x86_cpu_enable_simd)
         s->strm->adler = crc_fold_512to32(s);
+#endif
 }
 
 ZLIB_INTERNAL void copy_with_crc(z_streamp strm, Bytef *dst, long size)
 {
+#ifdef CRC32_SIMD_SSE42_PCLMUL
     if (x86_cpu_enable_simd) {
         crc_fold_copy(strm->state, dst, strm->next_in, size);
         return;
     }
+#endif
     zmemcpy(dst, strm->next_in, size);
     strm->adler = crc32(strm->adler, dst, size);
 }
diff --git a/deps/zlib/crc32.h b/deps/zlib/crc32.h
index 9e0c7781025148..137df68d616c5e 100644
--- a/deps/zlib/crc32.h
+++ b/deps/zlib/crc32.h
@@ -2,440 +2,9445 @@
  * Generated automatically by crc32.c
  */
 
-local const z_crc_t FAR crc_table[TBLS][256] =
-{
-  {
-    0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
-    0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
-    0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
-    0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
-    0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
-    0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
-    0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
-    0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
-    0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
-    0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
-    0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
-    0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
-    0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
-    0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
-    0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
-    0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
-    0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
-    0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
-    0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
-    0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
-    0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
-    0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
-    0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
-    0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
-    0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
-    0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
-    0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
-    0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
-    0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
-    0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
-    0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
-    0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
-    0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
-    0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
-    0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
-    0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
-    0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
-    0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
-    0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
-    0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
-    0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
-    0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
-    0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
-    0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
-    0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
-    0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
-    0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
-    0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
-    0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
-    0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
-    0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
-    0x2d02ef8dUL
-#ifdef BYFOUR
-  },
-  {
-    0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
-    0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
-    0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
-    0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
-    0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
-    0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
-    0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
-    0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
-    0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
-    0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
-    0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
-    0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
-    0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
-    0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
-    0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
-    0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
-    0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
-    0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
-    0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
-    0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
-    0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
-    0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
-    0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
-    0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
-    0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
-    0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
-    0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
-    0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
-    0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
-    0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
-    0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
-    0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
-    0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
-    0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
-    0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
-    0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
-    0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
-    0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
-    0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
-    0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
-    0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
-    0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
-    0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
-    0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
-    0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
-    0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
-    0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
-    0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
-    0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
-    0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
-    0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
-    0x9324fd72UL
-  },
-  {
-    0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
-    0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
-    0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
-    0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
-    0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
-    0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
-    0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
-    0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
-    0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
-    0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
-    0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
-    0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
-    0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
-    0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
-    0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
-    0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
-    0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
-    0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
-    0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
-    0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
-    0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
-    0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
-    0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
-    0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
-    0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
-    0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
-    0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
-    0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
-    0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
-    0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
-    0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
-    0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
-    0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
-    0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
-    0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
-    0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
-    0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
-    0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
-    0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
-    0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
-    0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
-    0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
-    0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
-    0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
-    0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
-    0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
-    0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
-    0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
-    0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
-    0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
-    0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
-    0xbe9834edUL
-  },
-  {
-    0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
-    0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
-    0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
-    0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
-    0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
-    0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
-    0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
-    0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
-    0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
-    0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
-    0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
-    0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
-    0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
-    0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
-    0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
-    0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
-    0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
-    0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
-    0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
-    0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
-    0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
-    0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
-    0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
-    0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
-    0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
-    0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
-    0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
-    0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
-    0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
-    0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
-    0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
-    0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
-    0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
-    0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
-    0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
-    0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
-    0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
-    0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
-    0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
-    0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
-    0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
-    0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
-    0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
-    0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
-    0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
-    0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
-    0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
-    0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
-    0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
-    0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
-    0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
-    0xde0506f1UL
-  },
-  {
-    0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,
-    0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,
-    0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,
-    0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,
-    0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,
-    0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,
-    0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,
-    0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,
-    0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,
-    0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,
-    0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,
-    0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,
-    0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,
-    0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,
-    0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,
-    0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,
-    0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,
-    0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,
-    0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,
-    0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,
-    0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,
-    0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,
-    0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,
-    0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,
-    0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,
-    0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,
-    0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,
-    0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,
-    0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,
-    0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,
-    0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,
-    0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,
-    0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,
-    0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,
-    0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,
-    0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,
-    0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,
-    0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,
-    0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,
-    0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,
-    0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,
-    0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,
-    0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,
-    0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,
-    0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,
-    0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,
-    0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,
-    0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,
-    0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,
-    0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,
-    0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,
-    0x8def022dUL
-  },
-  {
-    0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,
-    0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,
-    0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,
-    0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,
-    0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,
-    0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,
-    0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,
-    0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,
-    0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,
-    0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,
-    0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,
-    0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,
-    0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,
-    0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,
-    0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,
-    0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,
-    0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,
-    0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,
-    0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,
-    0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,
-    0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,
-    0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,
-    0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,
-    0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,
-    0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,
-    0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,
-    0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,
-    0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,
-    0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,
-    0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,
-    0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,
-    0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,
-    0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,
-    0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,
-    0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,
-    0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,
-    0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,
-    0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,
-    0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,
-    0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,
-    0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,
-    0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,
-    0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,
-    0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,
-    0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,
-    0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,
-    0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,
-    0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,
-    0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,
-    0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,
-    0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,
-    0x72fd2493UL
-  },
-  {
-    0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,
-    0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,
-    0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,
-    0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,
-    0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,
-    0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,
-    0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,
-    0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,
-    0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,
-    0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,
-    0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,
-    0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,
-    0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,
-    0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,
-    0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,
-    0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,
-    0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,
-    0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,
-    0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,
-    0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,
-    0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,
-    0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,
-    0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,
-    0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,
-    0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,
-    0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,
-    0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,
-    0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,
-    0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,
-    0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,
-    0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,
-    0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,
-    0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,
-    0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,
-    0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,
-    0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,
-    0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,
-    0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,
-    0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,
-    0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,
-    0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,
-    0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,
-    0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,
-    0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,
-    0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,
-    0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,
-    0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,
-    0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,
-    0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,
-    0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,
-    0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,
-    0xed3498beUL
-  },
-  {
-    0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,
-    0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,
-    0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,
-    0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,
-    0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,
-    0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,
-    0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,
-    0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,
-    0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,
-    0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,
-    0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,
-    0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,
-    0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,
-    0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,
-    0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,
-    0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,
-    0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,
-    0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,
-    0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,
-    0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,
-    0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,
-    0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,
-    0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,
-    0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,
-    0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,
-    0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,
-    0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,
-    0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,
-    0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,
-    0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,
-    0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,
-    0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,
-    0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,
-    0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,
-    0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,
-    0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,
-    0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,
-    0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,
-    0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,
-    0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,
-    0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,
-    0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,
-    0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,
-    0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,
-    0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,
-    0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,
-    0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,
-    0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,
-    0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,
-    0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,
-    0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,
-    0xf10605deUL
+local const z_crc_t FAR crc_table[] = {
+    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
+    0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
+    0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
+    0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
+    0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
+    0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
+    0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+    0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
+    0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
+    0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
+    0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
+    0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
+    0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
+    0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+    0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
+    0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
+    0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
+    0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
+    0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
+    0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
+    0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
+    0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
+    0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
+    0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
+    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
+    0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
+    0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+    0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
+    0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
+    0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
+    0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
+    0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
+    0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
+    0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+    0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
+    0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
+    0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
+    0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
+    0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
+    0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
+    0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
+    0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
+    0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
+    0x2d02ef8d};
+
+#ifdef W
+
+#if W == 8
+
+local const z_word_t FAR crc_big_table[] = {
+    0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000,
+    0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000,
+    0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000,
+    0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000,
+    0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000,
+    0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000,
+    0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000,
+    0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000,
+    0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000,
+    0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000,
+    0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000,
+    0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000,
+    0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000,
+    0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000,
+    0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000,
+    0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000,
+    0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000,
+    0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000,
+    0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000,
+    0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000,
+    0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000,
+    0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000,
+    0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000,
+    0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000,
+    0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000,
+    0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000,
+    0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000,
+    0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000,
+    0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000,
+    0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000,
+    0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000,
+    0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000,
+    0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000,
+    0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000,
+    0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000,
+    0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000,
+    0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000,
+    0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000,
+    0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000,
+    0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000,
+    0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000,
+    0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000,
+    0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000,
+    0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000,
+    0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000,
+    0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000,
+    0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000,
+    0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000,
+    0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000,
+    0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000,
+    0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000,
+    0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000,
+    0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000,
+    0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000,
+    0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000,
+    0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000,
+    0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000,
+    0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000,
+    0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000,
+    0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000,
+    0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000,
+    0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000,
+    0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000,
+    0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000,
+    0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000,
+    0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000,
+    0x8567077200000000, 0x1357000500000000, 0x824abf9500000000,
+    0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000,
+    0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000,
+    0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000,
+    0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000,
+    0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000,
+    0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000,
+    0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000,
+    0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000,
+    0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000,
+    0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000,
+    0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000,
+    0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000,
+    0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000,
+    0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000,
+    0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000,
+    0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000,
+    0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000,
+    0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000,
+    0x8def022d00000000};
+
+#else /* W == 4 */
+
+local const z_word_t FAR crc_big_table[] = {
+    0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07,
+    0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79,
+    0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7,
+    0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84,
+    0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13,
+    0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663,
+    0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5,
+    0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5,
+    0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832,
+    0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51,
+    0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf,
+    0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1,
+    0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76,
+    0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606,
+    0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996,
+    0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6,
+    0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c,
+    0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712,
+    0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c,
+    0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4,
+    0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943,
+    0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333,
+    0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe,
+    0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce,
+    0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359,
+    0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a,
+    0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04,
+    0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a,
+    0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0,
+    0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580,
+    0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10,
+    0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060,
+    0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1,
+    0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf,
+    0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31,
+    0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852,
+    0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5,
+    0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5,
+    0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75,
+    0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005,
+    0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292,
+    0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1,
+    0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f,
+    0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111,
+    0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0,
+    0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0,
+    0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40,
+    0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530,
+    0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba,
+    0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4,
+    0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a,
+    0x8def022d};
+
+#endif
+
+#if N == 1
+
+#if W == 8
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa,
+    0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b,
+    0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232,
+    0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8,
+    0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e,
+    0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa,
+    0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b,
+    0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f,
+    0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719,
+    0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3,
+    0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa,
+    0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b,
+    0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed,
+    0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89,
+    0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25,
+    0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041,
+    0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c,
+    0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed,
+    0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4,
+    0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758,
+    0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e,
+    0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a,
+    0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed,
+    0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889,
+    0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df,
+    0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544,
+    0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d,
+    0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c,
+    0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1,
+    0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95,
+    0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839,
+    0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d,
+    0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976,
+    0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7,
+    0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be,
+    0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144,
+    0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12,
+    0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376,
+    0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a,
+    0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e,
+    0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278,
+    0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682,
+    0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b,
+    0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a,
+    0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561,
+    0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05,
+    0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9,
+    0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd,
+    0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0,
+    0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61,
+    0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678,
+    0x264b06e6},
+   {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413,
+    0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3,
+    0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d,
+    0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653,
+    0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9,
+    0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e,
+    0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5,
+    0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712,
+    0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8,
+    0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6,
+    0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068,
+    0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8,
+    0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579,
+    0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade,
+    0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37,
+    0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590,
+    0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4,
+    0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64,
+    0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea,
+    0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678,
+    0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282,
+    0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25,
+    0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102,
+    0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5,
+    0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f,
+    0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146,
+    0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8,
+    0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08,
+    0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c,
+    0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b,
+    0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972,
+    0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5,
+    0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d,
+    0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd,
+    0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833,
+    0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d,
+    0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7,
+    0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60,
+    0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2,
+    0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105,
+    0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff,
+    0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1,
+    0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f,
+    0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf,
+    0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617,
+    0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0,
+    0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959,
+    0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe,
+    0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca,
+    0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a,
+    0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184,
+    0x92364a30},
+   {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216,
+    0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8,
+    0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170,
+    0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035,
+    0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6,
+    0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145,
+    0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d,
+    0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e,
+    0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d,
+    0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408,
+    0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0,
+    0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e,
+    0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c,
+    0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf,
+    0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a,
+    0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9,
+    0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1,
+    0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f,
+    0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987,
+    0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4,
+    0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37,
+    0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84,
+    0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca,
+    0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79,
+    0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba,
+    0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d,
+    0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5,
+    0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b,
+    0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643,
+    0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0,
+    0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525,
+    0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496,
+    0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8,
+    0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026,
+    0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e,
+    0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db,
+    0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118,
+    0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab,
+    0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf,
+    0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c,
+    0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf,
+    0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a,
+    0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32,
+    0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec,
+    0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82,
+    0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31,
+    0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4,
+    0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957,
+    0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f,
+    0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1,
+    0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869,
+    0xe4c4abcc},
+   {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0,
+    0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271,
+    0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61,
+    0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52,
+    0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43,
+    0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333,
+    0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64,
+    0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314,
+    0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205,
+    0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136,
+    0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26,
+    0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997,
+    0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849,
+    0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739,
+    0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8,
+    0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98,
+    0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b,
+    0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba,
+    0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa,
+    0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d,
+    0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c,
+    0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc,
+    0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af,
+    0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf,
+    0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce,
+    0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922,
+    0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532,
+    0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183,
+    0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710,
+    0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860,
+    0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1,
+    0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1,
+    0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956,
+    0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7,
+    0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7,
+    0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4,
+    0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5,
+    0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5,
+    0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb,
+    0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb,
+    0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da,
+    0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9,
+    0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9,
+    0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48,
+    0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df,
+    0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af,
+    0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e,
+    0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e,
+    0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d,
+    0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c,
+    0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c,
+    0xca64c78c},
+   {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757,
+    0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a,
+    0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733,
+    0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871,
+    0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70,
+    0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42,
+    0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5,
+    0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787,
+    0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086,
+    0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4,
+    0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d,
+    0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0,
+    0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d,
+    0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f,
+    0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859,
+    0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b,
+    0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5,
+    0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028,
+    0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891,
+    0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed,
+    0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec,
+    0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde,
+    0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817,
+    0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825,
+    0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24,
+    0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e,
+    0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7,
+    0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a,
+    0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4,
+    0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196,
+    0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0,
+    0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2,
+    0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52,
+    0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f,
+    0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36,
+    0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174,
+    0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675,
+    0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647,
+    0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d,
+    0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf,
+    0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be,
+    0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc,
+    0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645,
+    0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98,
+    0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138,
+    0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a,
+    0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c,
+    0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e,
+    0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0,
+    0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d,
+    0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194,
+    0xde0506f1},
+   {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc,
+    0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f,
+    0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a,
+    0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29,
+    0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8,
+    0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023,
+    0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e,
+    0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065,
+    0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84,
+    0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7,
+    0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922,
+    0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71,
+    0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0,
+    0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b,
+    0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816,
+    0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd,
+    0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c,
+    0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f,
+    0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba,
+    0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579,
+    0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98,
+    0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873,
+    0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e,
+    0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5,
+    0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134,
+    0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7,
+    0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732,
+    0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461,
+    0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0,
+    0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b,
+    0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26,
+    0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd,
+    0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc,
+    0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef,
+    0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a,
+    0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049,
+    0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8,
+    0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43,
+    0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e,
+    0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5,
+    0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24,
+    0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07,
+    0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982,
+    0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1,
+    0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0,
+    0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b,
+    0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576,
+    0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d,
+    0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c,
+    0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f,
+    0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda,
+    0xbe9834ed},
+   {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504,
+    0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49,
+    0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e,
+    0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192,
+    0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859,
+    0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c,
+    0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620,
+    0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265,
+    0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae,
+    0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2,
+    0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175,
+    0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38,
+    0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05,
+    0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40,
+    0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f,
+    0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca,
+    0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850,
+    0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d,
+    0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da,
+    0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864,
+    0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af,
+    0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea,
+    0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74,
+    0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31,
+    0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa,
+    0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a,
+    0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd,
+    0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180,
+    0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a,
+    0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f,
+    0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290,
+    0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5,
+    0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed,
+    0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0,
+    0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167,
+    0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b,
+    0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0,
+    0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5,
+    0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc,
+    0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189,
+    0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842,
+    0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e,
+    0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299,
+    0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4,
+    0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec,
+    0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9,
+    0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66,
+    0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23,
+    0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9,
+    0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4,
+    0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33,
+    0x9324fd72},
+   {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
+    0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
+    0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
+    0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
+    0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
+    0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
+    0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+    0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
+    0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
+    0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
+    0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
+    0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
+    0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
+    0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+    0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
+    0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
+    0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
+    0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
+    0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
+    0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
+    0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
+    0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
+    0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
+    0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
+    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
+    0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
+    0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+    0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
+    0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
+    0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
+    0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
+    0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
+    0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
+    0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+    0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
+    0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
+    0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
+    0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
+    0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
+    0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
+    0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
+    0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
+    0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
+    0x2d02ef8d}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000,
+    0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000,
+    0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000,
+    0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000,
+    0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000,
+    0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000,
+    0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000,
+    0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000,
+    0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000,
+    0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000,
+    0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000,
+    0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000,
+    0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000,
+    0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000,
+    0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000,
+    0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000,
+    0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000,
+    0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000,
+    0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000,
+    0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000,
+    0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000,
+    0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000,
+    0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000,
+    0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000,
+    0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000,
+    0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000,
+    0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000,
+    0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000,
+    0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000,
+    0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000,
+    0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000,
+    0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000,
+    0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000,
+    0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000,
+    0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000,
+    0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000,
+    0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000,
+    0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000,
+    0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000,
+    0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000,
+    0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000,
+    0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000,
+    0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000,
+    0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000,
+    0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000,
+    0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000,
+    0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000,
+    0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000,
+    0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000,
+    0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000,
+    0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000,
+    0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000,
+    0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000,
+    0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000,
+    0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000,
+    0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000,
+    0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000,
+    0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000,
+    0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000,
+    0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000,
+    0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000,
+    0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000,
+    0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000,
+    0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000,
+    0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000,
+    0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000,
+    0x8567077200000000, 0x1357000500000000, 0x824abf9500000000,
+    0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000,
+    0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000,
+    0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000,
+    0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000,
+    0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000,
+    0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000,
+    0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000,
+    0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000,
+    0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000,
+    0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000,
+    0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000,
+    0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000,
+    0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000,
+    0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000,
+    0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000,
+    0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000,
+    0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000,
+    0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000,
+    0x8def022d00000000},
+   {0x0000000000000000, 0x41311b1900000000, 0x8262363200000000,
+    0xc3532d2b00000000, 0x04c56c6400000000, 0x45f4777d00000000,
+    0x86a75a5600000000, 0xc796414f00000000, 0x088ad9c800000000,
+    0x49bbc2d100000000, 0x8ae8effa00000000, 0xcbd9f4e300000000,
+    0x0c4fb5ac00000000, 0x4d7eaeb500000000, 0x8e2d839e00000000,
+    0xcf1c988700000000, 0x5112c24a00000000, 0x1023d95300000000,
+    0xd370f47800000000, 0x9241ef6100000000, 0x55d7ae2e00000000,
+    0x14e6b53700000000, 0xd7b5981c00000000, 0x9684830500000000,
+    0x59981b8200000000, 0x18a9009b00000000, 0xdbfa2db000000000,
+    0x9acb36a900000000, 0x5d5d77e600000000, 0x1c6c6cff00000000,
+    0xdf3f41d400000000, 0x9e0e5acd00000000, 0xa224849500000000,
+    0xe3159f8c00000000, 0x2046b2a700000000, 0x6177a9be00000000,
+    0xa6e1e8f100000000, 0xe7d0f3e800000000, 0x2483dec300000000,
+    0x65b2c5da00000000, 0xaaae5d5d00000000, 0xeb9f464400000000,
+    0x28cc6b6f00000000, 0x69fd707600000000, 0xae6b313900000000,
+    0xef5a2a2000000000, 0x2c09070b00000000, 0x6d381c1200000000,
+    0xf33646df00000000, 0xb2075dc600000000, 0x715470ed00000000,
+    0x30656bf400000000, 0xf7f32abb00000000, 0xb6c231a200000000,
+    0x75911c8900000000, 0x34a0079000000000, 0xfbbc9f1700000000,
+    0xba8d840e00000000, 0x79dea92500000000, 0x38efb23c00000000,
+    0xff79f37300000000, 0xbe48e86a00000000, 0x7d1bc54100000000,
+    0x3c2ade5800000000, 0x054f79f000000000, 0x447e62e900000000,
+    0x872d4fc200000000, 0xc61c54db00000000, 0x018a159400000000,
+    0x40bb0e8d00000000, 0x83e823a600000000, 0xc2d938bf00000000,
+    0x0dc5a03800000000, 0x4cf4bb2100000000, 0x8fa7960a00000000,
+    0xce968d1300000000, 0x0900cc5c00000000, 0x4831d74500000000,
+    0x8b62fa6e00000000, 0xca53e17700000000, 0x545dbbba00000000,
+    0x156ca0a300000000, 0xd63f8d8800000000, 0x970e969100000000,
+    0x5098d7de00000000, 0x11a9ccc700000000, 0xd2fae1ec00000000,
+    0x93cbfaf500000000, 0x5cd7627200000000, 0x1de6796b00000000,
+    0xdeb5544000000000, 0x9f844f5900000000, 0x58120e1600000000,
+    0x1923150f00000000, 0xda70382400000000, 0x9b41233d00000000,
+    0xa76bfd6500000000, 0xe65ae67c00000000, 0x2509cb5700000000,
+    0x6438d04e00000000, 0xa3ae910100000000, 0xe29f8a1800000000,
+    0x21cca73300000000, 0x60fdbc2a00000000, 0xafe124ad00000000,
+    0xeed03fb400000000, 0x2d83129f00000000, 0x6cb2098600000000,
+    0xab2448c900000000, 0xea1553d000000000, 0x29467efb00000000,
+    0x687765e200000000, 0xf6793f2f00000000, 0xb748243600000000,
+    0x741b091d00000000, 0x352a120400000000, 0xf2bc534b00000000,
+    0xb38d485200000000, 0x70de657900000000, 0x31ef7e6000000000,
+    0xfef3e6e700000000, 0xbfc2fdfe00000000, 0x7c91d0d500000000,
+    0x3da0cbcc00000000, 0xfa368a8300000000, 0xbb07919a00000000,
+    0x7854bcb100000000, 0x3965a7a800000000, 0x4b98833b00000000,
+    0x0aa9982200000000, 0xc9fab50900000000, 0x88cbae1000000000,
+    0x4f5def5f00000000, 0x0e6cf44600000000, 0xcd3fd96d00000000,
+    0x8c0ec27400000000, 0x43125af300000000, 0x022341ea00000000,
+    0xc1706cc100000000, 0x804177d800000000, 0x47d7369700000000,
+    0x06e62d8e00000000, 0xc5b500a500000000, 0x84841bbc00000000,
+    0x1a8a417100000000, 0x5bbb5a6800000000, 0x98e8774300000000,
+    0xd9d96c5a00000000, 0x1e4f2d1500000000, 0x5f7e360c00000000,
+    0x9c2d1b2700000000, 0xdd1c003e00000000, 0x120098b900000000,
+    0x533183a000000000, 0x9062ae8b00000000, 0xd153b59200000000,
+    0x16c5f4dd00000000, 0x57f4efc400000000, 0x94a7c2ef00000000,
+    0xd596d9f600000000, 0xe9bc07ae00000000, 0xa88d1cb700000000,
+    0x6bde319c00000000, 0x2aef2a8500000000, 0xed796bca00000000,
+    0xac4870d300000000, 0x6f1b5df800000000, 0x2e2a46e100000000,
+    0xe136de6600000000, 0xa007c57f00000000, 0x6354e85400000000,
+    0x2265f34d00000000, 0xe5f3b20200000000, 0xa4c2a91b00000000,
+    0x6791843000000000, 0x26a09f2900000000, 0xb8aec5e400000000,
+    0xf99fdefd00000000, 0x3accf3d600000000, 0x7bfde8cf00000000,
+    0xbc6ba98000000000, 0xfd5ab29900000000, 0x3e099fb200000000,
+    0x7f3884ab00000000, 0xb0241c2c00000000, 0xf115073500000000,
+    0x32462a1e00000000, 0x7377310700000000, 0xb4e1704800000000,
+    0xf5d06b5100000000, 0x3683467a00000000, 0x77b25d6300000000,
+    0x4ed7facb00000000, 0x0fe6e1d200000000, 0xccb5ccf900000000,
+    0x8d84d7e000000000, 0x4a1296af00000000, 0x0b238db600000000,
+    0xc870a09d00000000, 0x8941bb8400000000, 0x465d230300000000,
+    0x076c381a00000000, 0xc43f153100000000, 0x850e0e2800000000,
+    0x42984f6700000000, 0x03a9547e00000000, 0xc0fa795500000000,
+    0x81cb624c00000000, 0x1fc5388100000000, 0x5ef4239800000000,
+    0x9da70eb300000000, 0xdc9615aa00000000, 0x1b0054e500000000,
+    0x5a314ffc00000000, 0x996262d700000000, 0xd85379ce00000000,
+    0x174fe14900000000, 0x567efa5000000000, 0x952dd77b00000000,
+    0xd41ccc6200000000, 0x138a8d2d00000000, 0x52bb963400000000,
+    0x91e8bb1f00000000, 0xd0d9a00600000000, 0xecf37e5e00000000,
+    0xadc2654700000000, 0x6e91486c00000000, 0x2fa0537500000000,
+    0xe836123a00000000, 0xa907092300000000, 0x6a54240800000000,
+    0x2b653f1100000000, 0xe479a79600000000, 0xa548bc8f00000000,
+    0x661b91a400000000, 0x272a8abd00000000, 0xe0bccbf200000000,
+    0xa18dd0eb00000000, 0x62defdc000000000, 0x23efe6d900000000,
+    0xbde1bc1400000000, 0xfcd0a70d00000000, 0x3f838a2600000000,
+    0x7eb2913f00000000, 0xb924d07000000000, 0xf815cb6900000000,
+    0x3b46e64200000000, 0x7a77fd5b00000000, 0xb56b65dc00000000,
+    0xf45a7ec500000000, 0x370953ee00000000, 0x763848f700000000,
+    0xb1ae09b800000000, 0xf09f12a100000000, 0x33cc3f8a00000000,
+    0x72fd249300000000},
+   {0x0000000000000000, 0x376ac20100000000, 0x6ed4840300000000,
+    0x59be460200000000, 0xdca8090700000000, 0xebc2cb0600000000,
+    0xb27c8d0400000000, 0x85164f0500000000, 0xb851130e00000000,
+    0x8f3bd10f00000000, 0xd685970d00000000, 0xe1ef550c00000000,
+    0x64f91a0900000000, 0x5393d80800000000, 0x0a2d9e0a00000000,
+    0x3d475c0b00000000, 0x70a3261c00000000, 0x47c9e41d00000000,
+    0x1e77a21f00000000, 0x291d601e00000000, 0xac0b2f1b00000000,
+    0x9b61ed1a00000000, 0xc2dfab1800000000, 0xf5b5691900000000,
+    0xc8f2351200000000, 0xff98f71300000000, 0xa626b11100000000,
+    0x914c731000000000, 0x145a3c1500000000, 0x2330fe1400000000,
+    0x7a8eb81600000000, 0x4de47a1700000000, 0xe0464d3800000000,
+    0xd72c8f3900000000, 0x8e92c93b00000000, 0xb9f80b3a00000000,
+    0x3cee443f00000000, 0x0b84863e00000000, 0x523ac03c00000000,
+    0x6550023d00000000, 0x58175e3600000000, 0x6f7d9c3700000000,
+    0x36c3da3500000000, 0x01a9183400000000, 0x84bf573100000000,
+    0xb3d5953000000000, 0xea6bd33200000000, 0xdd01113300000000,
+    0x90e56b2400000000, 0xa78fa92500000000, 0xfe31ef2700000000,
+    0xc95b2d2600000000, 0x4c4d622300000000, 0x7b27a02200000000,
+    0x2299e62000000000, 0x15f3242100000000, 0x28b4782a00000000,
+    0x1fdeba2b00000000, 0x4660fc2900000000, 0x710a3e2800000000,
+    0xf41c712d00000000, 0xc376b32c00000000, 0x9ac8f52e00000000,
+    0xada2372f00000000, 0xc08d9a7000000000, 0xf7e7587100000000,
+    0xae591e7300000000, 0x9933dc7200000000, 0x1c25937700000000,
+    0x2b4f517600000000, 0x72f1177400000000, 0x459bd57500000000,
+    0x78dc897e00000000, 0x4fb64b7f00000000, 0x16080d7d00000000,
+    0x2162cf7c00000000, 0xa474807900000000, 0x931e427800000000,
+    0xcaa0047a00000000, 0xfdcac67b00000000, 0xb02ebc6c00000000,
+    0x87447e6d00000000, 0xdefa386f00000000, 0xe990fa6e00000000,
+    0x6c86b56b00000000, 0x5bec776a00000000, 0x0252316800000000,
+    0x3538f36900000000, 0x087faf6200000000, 0x3f156d6300000000,
+    0x66ab2b6100000000, 0x51c1e96000000000, 0xd4d7a66500000000,
+    0xe3bd646400000000, 0xba03226600000000, 0x8d69e06700000000,
+    0x20cbd74800000000, 0x17a1154900000000, 0x4e1f534b00000000,
+    0x7975914a00000000, 0xfc63de4f00000000, 0xcb091c4e00000000,
+    0x92b75a4c00000000, 0xa5dd984d00000000, 0x989ac44600000000,
+    0xaff0064700000000, 0xf64e404500000000, 0xc124824400000000,
+    0x4432cd4100000000, 0x73580f4000000000, 0x2ae6494200000000,
+    0x1d8c8b4300000000, 0x5068f15400000000, 0x6702335500000000,
+    0x3ebc755700000000, 0x09d6b75600000000, 0x8cc0f85300000000,
+    0xbbaa3a5200000000, 0xe2147c5000000000, 0xd57ebe5100000000,
+    0xe839e25a00000000, 0xdf53205b00000000, 0x86ed665900000000,
+    0xb187a45800000000, 0x3491eb5d00000000, 0x03fb295c00000000,
+    0x5a456f5e00000000, 0x6d2fad5f00000000, 0x801b35e100000000,
+    0xb771f7e000000000, 0xeecfb1e200000000, 0xd9a573e300000000,
+    0x5cb33ce600000000, 0x6bd9fee700000000, 0x3267b8e500000000,
+    0x050d7ae400000000, 0x384a26ef00000000, 0x0f20e4ee00000000,
+    0x569ea2ec00000000, 0x61f460ed00000000, 0xe4e22fe800000000,
+    0xd388ede900000000, 0x8a36abeb00000000, 0xbd5c69ea00000000,
+    0xf0b813fd00000000, 0xc7d2d1fc00000000, 0x9e6c97fe00000000,
+    0xa90655ff00000000, 0x2c101afa00000000, 0x1b7ad8fb00000000,
+    0x42c49ef900000000, 0x75ae5cf800000000, 0x48e900f300000000,
+    0x7f83c2f200000000, 0x263d84f000000000, 0x115746f100000000,
+    0x944109f400000000, 0xa32bcbf500000000, 0xfa958df700000000,
+    0xcdff4ff600000000, 0x605d78d900000000, 0x5737bad800000000,
+    0x0e89fcda00000000, 0x39e33edb00000000, 0xbcf571de00000000,
+    0x8b9fb3df00000000, 0xd221f5dd00000000, 0xe54b37dc00000000,
+    0xd80c6bd700000000, 0xef66a9d600000000, 0xb6d8efd400000000,
+    0x81b22dd500000000, 0x04a462d000000000, 0x33cea0d100000000,
+    0x6a70e6d300000000, 0x5d1a24d200000000, 0x10fe5ec500000000,
+    0x27949cc400000000, 0x7e2adac600000000, 0x494018c700000000,
+    0xcc5657c200000000, 0xfb3c95c300000000, 0xa282d3c100000000,
+    0x95e811c000000000, 0xa8af4dcb00000000, 0x9fc58fca00000000,
+    0xc67bc9c800000000, 0xf1110bc900000000, 0x740744cc00000000,
+    0x436d86cd00000000, 0x1ad3c0cf00000000, 0x2db902ce00000000,
+    0x4096af9100000000, 0x77fc6d9000000000, 0x2e422b9200000000,
+    0x1928e99300000000, 0x9c3ea69600000000, 0xab54649700000000,
+    0xf2ea229500000000, 0xc580e09400000000, 0xf8c7bc9f00000000,
+    0xcfad7e9e00000000, 0x9613389c00000000, 0xa179fa9d00000000,
+    0x246fb59800000000, 0x1305779900000000, 0x4abb319b00000000,
+    0x7dd1f39a00000000, 0x3035898d00000000, 0x075f4b8c00000000,
+    0x5ee10d8e00000000, 0x698bcf8f00000000, 0xec9d808a00000000,
+    0xdbf7428b00000000, 0x8249048900000000, 0xb523c68800000000,
+    0x88649a8300000000, 0xbf0e588200000000, 0xe6b01e8000000000,
+    0xd1dadc8100000000, 0x54cc938400000000, 0x63a6518500000000,
+    0x3a18178700000000, 0x0d72d58600000000, 0xa0d0e2a900000000,
+    0x97ba20a800000000, 0xce0466aa00000000, 0xf96ea4ab00000000,
+    0x7c78ebae00000000, 0x4b1229af00000000, 0x12ac6fad00000000,
+    0x25c6adac00000000, 0x1881f1a700000000, 0x2feb33a600000000,
+    0x765575a400000000, 0x413fb7a500000000, 0xc429f8a000000000,
+    0xf3433aa100000000, 0xaafd7ca300000000, 0x9d97bea200000000,
+    0xd073c4b500000000, 0xe71906b400000000, 0xbea740b600000000,
+    0x89cd82b700000000, 0x0cdbcdb200000000, 0x3bb10fb300000000,
+    0x620f49b100000000, 0x55658bb000000000, 0x6822d7bb00000000,
+    0x5f4815ba00000000, 0x06f653b800000000, 0x319c91b900000000,
+    0xb48adebc00000000, 0x83e01cbd00000000, 0xda5e5abf00000000,
+    0xed3498be00000000},
+   {0x0000000000000000, 0x6567bcb800000000, 0x8bc809aa00000000,
+    0xeeafb51200000000, 0x5797628f00000000, 0x32f0de3700000000,
+    0xdc5f6b2500000000, 0xb938d79d00000000, 0xef28b4c500000000,
+    0x8a4f087d00000000, 0x64e0bd6f00000000, 0x018701d700000000,
+    0xb8bfd64a00000000, 0xddd86af200000000, 0x3377dfe000000000,
+    0x5610635800000000, 0x9f57195000000000, 0xfa30a5e800000000,
+    0x149f10fa00000000, 0x71f8ac4200000000, 0xc8c07bdf00000000,
+    0xada7c76700000000, 0x4308727500000000, 0x266fcecd00000000,
+    0x707fad9500000000, 0x1518112d00000000, 0xfbb7a43f00000000,
+    0x9ed0188700000000, 0x27e8cf1a00000000, 0x428f73a200000000,
+    0xac20c6b000000000, 0xc9477a0800000000, 0x3eaf32a000000000,
+    0x5bc88e1800000000, 0xb5673b0a00000000, 0xd00087b200000000,
+    0x6938502f00000000, 0x0c5fec9700000000, 0xe2f0598500000000,
+    0x8797e53d00000000, 0xd187866500000000, 0xb4e03add00000000,
+    0x5a4f8fcf00000000, 0x3f28337700000000, 0x8610e4ea00000000,
+    0xe377585200000000, 0x0dd8ed4000000000, 0x68bf51f800000000,
+    0xa1f82bf000000000, 0xc49f974800000000, 0x2a30225a00000000,
+    0x4f579ee200000000, 0xf66f497f00000000, 0x9308f5c700000000,
+    0x7da740d500000000, 0x18c0fc6d00000000, 0x4ed09f3500000000,
+    0x2bb7238d00000000, 0xc518969f00000000, 0xa07f2a2700000000,
+    0x1947fdba00000000, 0x7c20410200000000, 0x928ff41000000000,
+    0xf7e848a800000000, 0x3d58149b00000000, 0x583fa82300000000,
+    0xb6901d3100000000, 0xd3f7a18900000000, 0x6acf761400000000,
+    0x0fa8caac00000000, 0xe1077fbe00000000, 0x8460c30600000000,
+    0xd270a05e00000000, 0xb7171ce600000000, 0x59b8a9f400000000,
+    0x3cdf154c00000000, 0x85e7c2d100000000, 0xe0807e6900000000,
+    0x0e2fcb7b00000000, 0x6b4877c300000000, 0xa20f0dcb00000000,
+    0xc768b17300000000, 0x29c7046100000000, 0x4ca0b8d900000000,
+    0xf5986f4400000000, 0x90ffd3fc00000000, 0x7e5066ee00000000,
+    0x1b37da5600000000, 0x4d27b90e00000000, 0x284005b600000000,
+    0xc6efb0a400000000, 0xa3880c1c00000000, 0x1ab0db8100000000,
+    0x7fd7673900000000, 0x9178d22b00000000, 0xf41f6e9300000000,
+    0x03f7263b00000000, 0x66909a8300000000, 0x883f2f9100000000,
+    0xed58932900000000, 0x546044b400000000, 0x3107f80c00000000,
+    0xdfa84d1e00000000, 0xbacff1a600000000, 0xecdf92fe00000000,
+    0x89b82e4600000000, 0x67179b5400000000, 0x027027ec00000000,
+    0xbb48f07100000000, 0xde2f4cc900000000, 0x3080f9db00000000,
+    0x55e7456300000000, 0x9ca03f6b00000000, 0xf9c783d300000000,
+    0x176836c100000000, 0x720f8a7900000000, 0xcb375de400000000,
+    0xae50e15c00000000, 0x40ff544e00000000, 0x2598e8f600000000,
+    0x73888bae00000000, 0x16ef371600000000, 0xf840820400000000,
+    0x9d273ebc00000000, 0x241fe92100000000, 0x4178559900000000,
+    0xafd7e08b00000000, 0xcab05c3300000000, 0x3bb659ed00000000,
+    0x5ed1e55500000000, 0xb07e504700000000, 0xd519ecff00000000,
+    0x6c213b6200000000, 0x094687da00000000, 0xe7e932c800000000,
+    0x828e8e7000000000, 0xd49eed2800000000, 0xb1f9519000000000,
+    0x5f56e48200000000, 0x3a31583a00000000, 0x83098fa700000000,
+    0xe66e331f00000000, 0x08c1860d00000000, 0x6da63ab500000000,
+    0xa4e140bd00000000, 0xc186fc0500000000, 0x2f29491700000000,
+    0x4a4ef5af00000000, 0xf376223200000000, 0x96119e8a00000000,
+    0x78be2b9800000000, 0x1dd9972000000000, 0x4bc9f47800000000,
+    0x2eae48c000000000, 0xc001fdd200000000, 0xa566416a00000000,
+    0x1c5e96f700000000, 0x79392a4f00000000, 0x97969f5d00000000,
+    0xf2f123e500000000, 0x05196b4d00000000, 0x607ed7f500000000,
+    0x8ed162e700000000, 0xebb6de5f00000000, 0x528e09c200000000,
+    0x37e9b57a00000000, 0xd946006800000000, 0xbc21bcd000000000,
+    0xea31df8800000000, 0x8f56633000000000, 0x61f9d62200000000,
+    0x049e6a9a00000000, 0xbda6bd0700000000, 0xd8c101bf00000000,
+    0x366eb4ad00000000, 0x5309081500000000, 0x9a4e721d00000000,
+    0xff29cea500000000, 0x11867bb700000000, 0x74e1c70f00000000,
+    0xcdd9109200000000, 0xa8beac2a00000000, 0x4611193800000000,
+    0x2376a58000000000, 0x7566c6d800000000, 0x10017a6000000000,
+    0xfeaecf7200000000, 0x9bc973ca00000000, 0x22f1a45700000000,
+    0x479618ef00000000, 0xa939adfd00000000, 0xcc5e114500000000,
+    0x06ee4d7600000000, 0x6389f1ce00000000, 0x8d2644dc00000000,
+    0xe841f86400000000, 0x51792ff900000000, 0x341e934100000000,
+    0xdab1265300000000, 0xbfd69aeb00000000, 0xe9c6f9b300000000,
+    0x8ca1450b00000000, 0x620ef01900000000, 0x07694ca100000000,
+    0xbe519b3c00000000, 0xdb36278400000000, 0x3599929600000000,
+    0x50fe2e2e00000000, 0x99b9542600000000, 0xfcdee89e00000000,
+    0x12715d8c00000000, 0x7716e13400000000, 0xce2e36a900000000,
+    0xab498a1100000000, 0x45e63f0300000000, 0x208183bb00000000,
+    0x7691e0e300000000, 0x13f65c5b00000000, 0xfd59e94900000000,
+    0x983e55f100000000, 0x2106826c00000000, 0x44613ed400000000,
+    0xaace8bc600000000, 0xcfa9377e00000000, 0x38417fd600000000,
+    0x5d26c36e00000000, 0xb389767c00000000, 0xd6eecac400000000,
+    0x6fd61d5900000000, 0x0ab1a1e100000000, 0xe41e14f300000000,
+    0x8179a84b00000000, 0xd769cb1300000000, 0xb20e77ab00000000,
+    0x5ca1c2b900000000, 0x39c67e0100000000, 0x80fea99c00000000,
+    0xe599152400000000, 0x0b36a03600000000, 0x6e511c8e00000000,
+    0xa716668600000000, 0xc271da3e00000000, 0x2cde6f2c00000000,
+    0x49b9d39400000000, 0xf081040900000000, 0x95e6b8b100000000,
+    0x7b490da300000000, 0x1e2eb11b00000000, 0x483ed24300000000,
+    0x2d596efb00000000, 0xc3f6dbe900000000, 0xa691675100000000,
+    0x1fa9b0cc00000000, 0x7ace0c7400000000, 0x9461b96600000000,
+    0xf10605de00000000},
+   {0x0000000000000000, 0xb029603d00000000, 0x6053c07a00000000,
+    0xd07aa04700000000, 0xc0a680f500000000, 0x708fe0c800000000,
+    0xa0f5408f00000000, 0x10dc20b200000000, 0xc14b703000000000,
+    0x7162100d00000000, 0xa118b04a00000000, 0x1131d07700000000,
+    0x01edf0c500000000, 0xb1c490f800000000, 0x61be30bf00000000,
+    0xd197508200000000, 0x8297e06000000000, 0x32be805d00000000,
+    0xe2c4201a00000000, 0x52ed402700000000, 0x4231609500000000,
+    0xf21800a800000000, 0x2262a0ef00000000, 0x924bc0d200000000,
+    0x43dc905000000000, 0xf3f5f06d00000000, 0x238f502a00000000,
+    0x93a6301700000000, 0x837a10a500000000, 0x3353709800000000,
+    0xe329d0df00000000, 0x5300b0e200000000, 0x042fc1c100000000,
+    0xb406a1fc00000000, 0x647c01bb00000000, 0xd455618600000000,
+    0xc489413400000000, 0x74a0210900000000, 0xa4da814e00000000,
+    0x14f3e17300000000, 0xc564b1f100000000, 0x754dd1cc00000000,
+    0xa537718b00000000, 0x151e11b600000000, 0x05c2310400000000,
+    0xb5eb513900000000, 0x6591f17e00000000, 0xd5b8914300000000,
+    0x86b821a100000000, 0x3691419c00000000, 0xe6ebe1db00000000,
+    0x56c281e600000000, 0x461ea15400000000, 0xf637c16900000000,
+    0x264d612e00000000, 0x9664011300000000, 0x47f3519100000000,
+    0xf7da31ac00000000, 0x27a091eb00000000, 0x9789f1d600000000,
+    0x8755d16400000000, 0x377cb15900000000, 0xe706111e00000000,
+    0x572f712300000000, 0x4958f35800000000, 0xf971936500000000,
+    0x290b332200000000, 0x9922531f00000000, 0x89fe73ad00000000,
+    0x39d7139000000000, 0xe9adb3d700000000, 0x5984d3ea00000000,
+    0x8813836800000000, 0x383ae35500000000, 0xe840431200000000,
+    0x5869232f00000000, 0x48b5039d00000000, 0xf89c63a000000000,
+    0x28e6c3e700000000, 0x98cfa3da00000000, 0xcbcf133800000000,
+    0x7be6730500000000, 0xab9cd34200000000, 0x1bb5b37f00000000,
+    0x0b6993cd00000000, 0xbb40f3f000000000, 0x6b3a53b700000000,
+    0xdb13338a00000000, 0x0a84630800000000, 0xbaad033500000000,
+    0x6ad7a37200000000, 0xdafec34f00000000, 0xca22e3fd00000000,
+    0x7a0b83c000000000, 0xaa71238700000000, 0x1a5843ba00000000,
+    0x4d77329900000000, 0xfd5e52a400000000, 0x2d24f2e300000000,
+    0x9d0d92de00000000, 0x8dd1b26c00000000, 0x3df8d25100000000,
+    0xed82721600000000, 0x5dab122b00000000, 0x8c3c42a900000000,
+    0x3c15229400000000, 0xec6f82d300000000, 0x5c46e2ee00000000,
+    0x4c9ac25c00000000, 0xfcb3a26100000000, 0x2cc9022600000000,
+    0x9ce0621b00000000, 0xcfe0d2f900000000, 0x7fc9b2c400000000,
+    0xafb3128300000000, 0x1f9a72be00000000, 0x0f46520c00000000,
+    0xbf6f323100000000, 0x6f15927600000000, 0xdf3cf24b00000000,
+    0x0eaba2c900000000, 0xbe82c2f400000000, 0x6ef862b300000000,
+    0xded1028e00000000, 0xce0d223c00000000, 0x7e24420100000000,
+    0xae5ee24600000000, 0x1e77827b00000000, 0x92b0e6b100000000,
+    0x2299868c00000000, 0xf2e326cb00000000, 0x42ca46f600000000,
+    0x5216664400000000, 0xe23f067900000000, 0x3245a63e00000000,
+    0x826cc60300000000, 0x53fb968100000000, 0xe3d2f6bc00000000,
+    0x33a856fb00000000, 0x838136c600000000, 0x935d167400000000,
+    0x2374764900000000, 0xf30ed60e00000000, 0x4327b63300000000,
+    0x102706d100000000, 0xa00e66ec00000000, 0x7074c6ab00000000,
+    0xc05da69600000000, 0xd081862400000000, 0x60a8e61900000000,
+    0xb0d2465e00000000, 0x00fb266300000000, 0xd16c76e100000000,
+    0x614516dc00000000, 0xb13fb69b00000000, 0x0116d6a600000000,
+    0x11caf61400000000, 0xa1e3962900000000, 0x7199366e00000000,
+    0xc1b0565300000000, 0x969f277000000000, 0x26b6474d00000000,
+    0xf6cce70a00000000, 0x46e5873700000000, 0x5639a78500000000,
+    0xe610c7b800000000, 0x366a67ff00000000, 0x864307c200000000,
+    0x57d4574000000000, 0xe7fd377d00000000, 0x3787973a00000000,
+    0x87aef70700000000, 0x9772d7b500000000, 0x275bb78800000000,
+    0xf72117cf00000000, 0x470877f200000000, 0x1408c71000000000,
+    0xa421a72d00000000, 0x745b076a00000000, 0xc472675700000000,
+    0xd4ae47e500000000, 0x648727d800000000, 0xb4fd879f00000000,
+    0x04d4e7a200000000, 0xd543b72000000000, 0x656ad71d00000000,
+    0xb510775a00000000, 0x0539176700000000, 0x15e537d500000000,
+    0xa5cc57e800000000, 0x75b6f7af00000000, 0xc59f979200000000,
+    0xdbe815e900000000, 0x6bc175d400000000, 0xbbbbd59300000000,
+    0x0b92b5ae00000000, 0x1b4e951c00000000, 0xab67f52100000000,
+    0x7b1d556600000000, 0xcb34355b00000000, 0x1aa365d900000000,
+    0xaa8a05e400000000, 0x7af0a5a300000000, 0xcad9c59e00000000,
+    0xda05e52c00000000, 0x6a2c851100000000, 0xba56255600000000,
+    0x0a7f456b00000000, 0x597ff58900000000, 0xe95695b400000000,
+    0x392c35f300000000, 0x890555ce00000000, 0x99d9757c00000000,
+    0x29f0154100000000, 0xf98ab50600000000, 0x49a3d53b00000000,
+    0x983485b900000000, 0x281de58400000000, 0xf86745c300000000,
+    0x484e25fe00000000, 0x5892054c00000000, 0xe8bb657100000000,
+    0x38c1c53600000000, 0x88e8a50b00000000, 0xdfc7d42800000000,
+    0x6feeb41500000000, 0xbf94145200000000, 0x0fbd746f00000000,
+    0x1f6154dd00000000, 0xaf4834e000000000, 0x7f3294a700000000,
+    0xcf1bf49a00000000, 0x1e8ca41800000000, 0xaea5c42500000000,
+    0x7edf646200000000, 0xcef6045f00000000, 0xde2a24ed00000000,
+    0x6e0344d000000000, 0xbe79e49700000000, 0x0e5084aa00000000,
+    0x5d50344800000000, 0xed79547500000000, 0x3d03f43200000000,
+    0x8d2a940f00000000, 0x9df6b4bd00000000, 0x2ddfd48000000000,
+    0xfda574c700000000, 0x4d8c14fa00000000, 0x9c1b447800000000,
+    0x2c32244500000000, 0xfc48840200000000, 0x4c61e43f00000000,
+    0x5cbdc48d00000000, 0xec94a4b000000000, 0x3cee04f700000000,
+    0x8cc764ca00000000},
+   {0x0000000000000000, 0xa5d35ccb00000000, 0x0ba1c84d00000000,
+    0xae72948600000000, 0x1642919b00000000, 0xb391cd5000000000,
+    0x1de359d600000000, 0xb830051d00000000, 0x6d8253ec00000000,
+    0xc8510f2700000000, 0x66239ba100000000, 0xc3f0c76a00000000,
+    0x7bc0c27700000000, 0xde139ebc00000000, 0x70610a3a00000000,
+    0xd5b256f100000000, 0x9b02d60300000000, 0x3ed18ac800000000,
+    0x90a31e4e00000000, 0x3570428500000000, 0x8d40479800000000,
+    0x28931b5300000000, 0x86e18fd500000000, 0x2332d31e00000000,
+    0xf68085ef00000000, 0x5353d92400000000, 0xfd214da200000000,
+    0x58f2116900000000, 0xe0c2147400000000, 0x451148bf00000000,
+    0xeb63dc3900000000, 0x4eb080f200000000, 0x3605ac0700000000,
+    0x93d6f0cc00000000, 0x3da4644a00000000, 0x9877388100000000,
+    0x20473d9c00000000, 0x8594615700000000, 0x2be6f5d100000000,
+    0x8e35a91a00000000, 0x5b87ffeb00000000, 0xfe54a32000000000,
+    0x502637a600000000, 0xf5f56b6d00000000, 0x4dc56e7000000000,
+    0xe81632bb00000000, 0x4664a63d00000000, 0xe3b7faf600000000,
+    0xad077a0400000000, 0x08d426cf00000000, 0xa6a6b24900000000,
+    0x0375ee8200000000, 0xbb45eb9f00000000, 0x1e96b75400000000,
+    0xb0e423d200000000, 0x15377f1900000000, 0xc08529e800000000,
+    0x6556752300000000, 0xcb24e1a500000000, 0x6ef7bd6e00000000,
+    0xd6c7b87300000000, 0x7314e4b800000000, 0xdd66703e00000000,
+    0x78b52cf500000000, 0x6c0a580f00000000, 0xc9d904c400000000,
+    0x67ab904200000000, 0xc278cc8900000000, 0x7a48c99400000000,
+    0xdf9b955f00000000, 0x71e901d900000000, 0xd43a5d1200000000,
+    0x01880be300000000, 0xa45b572800000000, 0x0a29c3ae00000000,
+    0xaffa9f6500000000, 0x17ca9a7800000000, 0xb219c6b300000000,
+    0x1c6b523500000000, 0xb9b80efe00000000, 0xf7088e0c00000000,
+    0x52dbd2c700000000, 0xfca9464100000000, 0x597a1a8a00000000,
+    0xe14a1f9700000000, 0x4499435c00000000, 0xeaebd7da00000000,
+    0x4f388b1100000000, 0x9a8adde000000000, 0x3f59812b00000000,
+    0x912b15ad00000000, 0x34f8496600000000, 0x8cc84c7b00000000,
+    0x291b10b000000000, 0x8769843600000000, 0x22bad8fd00000000,
+    0x5a0ff40800000000, 0xffdca8c300000000, 0x51ae3c4500000000,
+    0xf47d608e00000000, 0x4c4d659300000000, 0xe99e395800000000,
+    0x47ecadde00000000, 0xe23ff11500000000, 0x378da7e400000000,
+    0x925efb2f00000000, 0x3c2c6fa900000000, 0x99ff336200000000,
+    0x21cf367f00000000, 0x841c6ab400000000, 0x2a6efe3200000000,
+    0x8fbda2f900000000, 0xc10d220b00000000, 0x64de7ec000000000,
+    0xcaacea4600000000, 0x6f7fb68d00000000, 0xd74fb39000000000,
+    0x729cef5b00000000, 0xdcee7bdd00000000, 0x793d271600000000,
+    0xac8f71e700000000, 0x095c2d2c00000000, 0xa72eb9aa00000000,
+    0x02fde56100000000, 0xbacde07c00000000, 0x1f1ebcb700000000,
+    0xb16c283100000000, 0x14bf74fa00000000, 0xd814b01e00000000,
+    0x7dc7ecd500000000, 0xd3b5785300000000, 0x7666249800000000,
+    0xce56218500000000, 0x6b857d4e00000000, 0xc5f7e9c800000000,
+    0x6024b50300000000, 0xb596e3f200000000, 0x1045bf3900000000,
+    0xbe372bbf00000000, 0x1be4777400000000, 0xa3d4726900000000,
+    0x06072ea200000000, 0xa875ba2400000000, 0x0da6e6ef00000000,
+    0x4316661d00000000, 0xe6c53ad600000000, 0x48b7ae5000000000,
+    0xed64f29b00000000, 0x5554f78600000000, 0xf087ab4d00000000,
+    0x5ef53fcb00000000, 0xfb26630000000000, 0x2e9435f100000000,
+    0x8b47693a00000000, 0x2535fdbc00000000, 0x80e6a17700000000,
+    0x38d6a46a00000000, 0x9d05f8a100000000, 0x33776c2700000000,
+    0x96a430ec00000000, 0xee111c1900000000, 0x4bc240d200000000,
+    0xe5b0d45400000000, 0x4063889f00000000, 0xf8538d8200000000,
+    0x5d80d14900000000, 0xf3f245cf00000000, 0x5621190400000000,
+    0x83934ff500000000, 0x2640133e00000000, 0x883287b800000000,
+    0x2de1db7300000000, 0x95d1de6e00000000, 0x300282a500000000,
+    0x9e70162300000000, 0x3ba34ae800000000, 0x7513ca1a00000000,
+    0xd0c096d100000000, 0x7eb2025700000000, 0xdb615e9c00000000,
+    0x63515b8100000000, 0xc682074a00000000, 0x68f093cc00000000,
+    0xcd23cf0700000000, 0x189199f600000000, 0xbd42c53d00000000,
+    0x133051bb00000000, 0xb6e30d7000000000, 0x0ed3086d00000000,
+    0xab0054a600000000, 0x0572c02000000000, 0xa0a19ceb00000000,
+    0xb41ee81100000000, 0x11cdb4da00000000, 0xbfbf205c00000000,
+    0x1a6c7c9700000000, 0xa25c798a00000000, 0x078f254100000000,
+    0xa9fdb1c700000000, 0x0c2eed0c00000000, 0xd99cbbfd00000000,
+    0x7c4fe73600000000, 0xd23d73b000000000, 0x77ee2f7b00000000,
+    0xcfde2a6600000000, 0x6a0d76ad00000000, 0xc47fe22b00000000,
+    0x61acbee000000000, 0x2f1c3e1200000000, 0x8acf62d900000000,
+    0x24bdf65f00000000, 0x816eaa9400000000, 0x395eaf8900000000,
+    0x9c8df34200000000, 0x32ff67c400000000, 0x972c3b0f00000000,
+    0x429e6dfe00000000, 0xe74d313500000000, 0x493fa5b300000000,
+    0xececf97800000000, 0x54dcfc6500000000, 0xf10fa0ae00000000,
+    0x5f7d342800000000, 0xfaae68e300000000, 0x821b441600000000,
+    0x27c818dd00000000, 0x89ba8c5b00000000, 0x2c69d09000000000,
+    0x9459d58d00000000, 0x318a894600000000, 0x9ff81dc000000000,
+    0x3a2b410b00000000, 0xef9917fa00000000, 0x4a4a4b3100000000,
+    0xe438dfb700000000, 0x41eb837c00000000, 0xf9db866100000000,
+    0x5c08daaa00000000, 0xf27a4e2c00000000, 0x57a912e700000000,
+    0x1919921500000000, 0xbccacede00000000, 0x12b85a5800000000,
+    0xb76b069300000000, 0x0f5b038e00000000, 0xaa885f4500000000,
+    0x04facbc300000000, 0xa129970800000000, 0x749bc1f900000000,
+    0xd1489d3200000000, 0x7f3a09b400000000, 0xdae9557f00000000,
+    0x62d9506200000000, 0xc70a0ca900000000, 0x6978982f00000000,
+    0xccabc4e400000000},
+   {0x0000000000000000, 0xb40b77a600000000, 0x29119f9700000000,
+    0x9d1ae83100000000, 0x13244ff400000000, 0xa72f385200000000,
+    0x3a35d06300000000, 0x8e3ea7c500000000, 0x674eef3300000000,
+    0xd345989500000000, 0x4e5f70a400000000, 0xfa54070200000000,
+    0x746aa0c700000000, 0xc061d76100000000, 0x5d7b3f5000000000,
+    0xe97048f600000000, 0xce9cde6700000000, 0x7a97a9c100000000,
+    0xe78d41f000000000, 0x5386365600000000, 0xddb8919300000000,
+    0x69b3e63500000000, 0xf4a90e0400000000, 0x40a279a200000000,
+    0xa9d2315400000000, 0x1dd946f200000000, 0x80c3aec300000000,
+    0x34c8d96500000000, 0xbaf67ea000000000, 0x0efd090600000000,
+    0x93e7e13700000000, 0x27ec969100000000, 0x9c39bdcf00000000,
+    0x2832ca6900000000, 0xb528225800000000, 0x012355fe00000000,
+    0x8f1df23b00000000, 0x3b16859d00000000, 0xa60c6dac00000000,
+    0x12071a0a00000000, 0xfb7752fc00000000, 0x4f7c255a00000000,
+    0xd266cd6b00000000, 0x666dbacd00000000, 0xe8531d0800000000,
+    0x5c586aae00000000, 0xc142829f00000000, 0x7549f53900000000,
+    0x52a563a800000000, 0xe6ae140e00000000, 0x7bb4fc3f00000000,
+    0xcfbf8b9900000000, 0x41812c5c00000000, 0xf58a5bfa00000000,
+    0x6890b3cb00000000, 0xdc9bc46d00000000, 0x35eb8c9b00000000,
+    0x81e0fb3d00000000, 0x1cfa130c00000000, 0xa8f164aa00000000,
+    0x26cfc36f00000000, 0x92c4b4c900000000, 0x0fde5cf800000000,
+    0xbbd52b5e00000000, 0x79750b4400000000, 0xcd7e7ce200000000,
+    0x506494d300000000, 0xe46fe37500000000, 0x6a5144b000000000,
+    0xde5a331600000000, 0x4340db2700000000, 0xf74bac8100000000,
+    0x1e3be47700000000, 0xaa3093d100000000, 0x372a7be000000000,
+    0x83210c4600000000, 0x0d1fab8300000000, 0xb914dc2500000000,
+    0x240e341400000000, 0x900543b200000000, 0xb7e9d52300000000,
+    0x03e2a28500000000, 0x9ef84ab400000000, 0x2af33d1200000000,
+    0xa4cd9ad700000000, 0x10c6ed7100000000, 0x8ddc054000000000,
+    0x39d772e600000000, 0xd0a73a1000000000, 0x64ac4db600000000,
+    0xf9b6a58700000000, 0x4dbdd22100000000, 0xc38375e400000000,
+    0x7788024200000000, 0xea92ea7300000000, 0x5e999dd500000000,
+    0xe54cb68b00000000, 0x5147c12d00000000, 0xcc5d291c00000000,
+    0x78565eba00000000, 0xf668f97f00000000, 0x42638ed900000000,
+    0xdf7966e800000000, 0x6b72114e00000000, 0x820259b800000000,
+    0x36092e1e00000000, 0xab13c62f00000000, 0x1f18b18900000000,
+    0x9126164c00000000, 0x252d61ea00000000, 0xb83789db00000000,
+    0x0c3cfe7d00000000, 0x2bd068ec00000000, 0x9fdb1f4a00000000,
+    0x02c1f77b00000000, 0xb6ca80dd00000000, 0x38f4271800000000,
+    0x8cff50be00000000, 0x11e5b88f00000000, 0xa5eecf2900000000,
+    0x4c9e87df00000000, 0xf895f07900000000, 0x658f184800000000,
+    0xd1846fee00000000, 0x5fbac82b00000000, 0xebb1bf8d00000000,
+    0x76ab57bc00000000, 0xc2a0201a00000000, 0xf2ea168800000000,
+    0x46e1612e00000000, 0xdbfb891f00000000, 0x6ff0feb900000000,
+    0xe1ce597c00000000, 0x55c52eda00000000, 0xc8dfc6eb00000000,
+    0x7cd4b14d00000000, 0x95a4f9bb00000000, 0x21af8e1d00000000,
+    0xbcb5662c00000000, 0x08be118a00000000, 0x8680b64f00000000,
+    0x328bc1e900000000, 0xaf9129d800000000, 0x1b9a5e7e00000000,
+    0x3c76c8ef00000000, 0x887dbf4900000000, 0x1567577800000000,
+    0xa16c20de00000000, 0x2f52871b00000000, 0x9b59f0bd00000000,
+    0x0643188c00000000, 0xb2486f2a00000000, 0x5b3827dc00000000,
+    0xef33507a00000000, 0x7229b84b00000000, 0xc622cfed00000000,
+    0x481c682800000000, 0xfc171f8e00000000, 0x610df7bf00000000,
+    0xd506801900000000, 0x6ed3ab4700000000, 0xdad8dce100000000,
+    0x47c234d000000000, 0xf3c9437600000000, 0x7df7e4b300000000,
+    0xc9fc931500000000, 0x54e67b2400000000, 0xe0ed0c8200000000,
+    0x099d447400000000, 0xbd9633d200000000, 0x208cdbe300000000,
+    0x9487ac4500000000, 0x1ab90b8000000000, 0xaeb27c2600000000,
+    0x33a8941700000000, 0x87a3e3b100000000, 0xa04f752000000000,
+    0x1444028600000000, 0x895eeab700000000, 0x3d559d1100000000,
+    0xb36b3ad400000000, 0x07604d7200000000, 0x9a7aa54300000000,
+    0x2e71d2e500000000, 0xc7019a1300000000, 0x730aedb500000000,
+    0xee10058400000000, 0x5a1b722200000000, 0xd425d5e700000000,
+    0x602ea24100000000, 0xfd344a7000000000, 0x493f3dd600000000,
+    0x8b9f1dcc00000000, 0x3f946a6a00000000, 0xa28e825b00000000,
+    0x1685f5fd00000000, 0x98bb523800000000, 0x2cb0259e00000000,
+    0xb1aacdaf00000000, 0x05a1ba0900000000, 0xecd1f2ff00000000,
+    0x58da855900000000, 0xc5c06d6800000000, 0x71cb1ace00000000,
+    0xfff5bd0b00000000, 0x4bfecaad00000000, 0xd6e4229c00000000,
+    0x62ef553a00000000, 0x4503c3ab00000000, 0xf108b40d00000000,
+    0x6c125c3c00000000, 0xd8192b9a00000000, 0x56278c5f00000000,
+    0xe22cfbf900000000, 0x7f3613c800000000, 0xcb3d646e00000000,
+    0x224d2c9800000000, 0x96465b3e00000000, 0x0b5cb30f00000000,
+    0xbf57c4a900000000, 0x3169636c00000000, 0x856214ca00000000,
+    0x1878fcfb00000000, 0xac738b5d00000000, 0x17a6a00300000000,
+    0xa3add7a500000000, 0x3eb73f9400000000, 0x8abc483200000000,
+    0x0482eff700000000, 0xb089985100000000, 0x2d93706000000000,
+    0x999807c600000000, 0x70e84f3000000000, 0xc4e3389600000000,
+    0x59f9d0a700000000, 0xedf2a70100000000, 0x63cc00c400000000,
+    0xd7c7776200000000, 0x4add9f5300000000, 0xfed6e8f500000000,
+    0xd93a7e6400000000, 0x6d3109c200000000, 0xf02be1f300000000,
+    0x4420965500000000, 0xca1e319000000000, 0x7e15463600000000,
+    0xe30fae0700000000, 0x5704d9a100000000, 0xbe74915700000000,
+    0x0a7fe6f100000000, 0x97650ec000000000, 0x236e796600000000,
+    0xad50dea300000000, 0x195ba90500000000, 0x8441413400000000,
+    0x304a369200000000},
+   {0x0000000000000000, 0x9e00aacc00000000, 0x7d07254200000000,
+    0xe3078f8e00000000, 0xfa0e4a8400000000, 0x640ee04800000000,
+    0x87096fc600000000, 0x1909c50a00000000, 0xb51be5d300000000,
+    0x2b1b4f1f00000000, 0xc81cc09100000000, 0x561c6a5d00000000,
+    0x4f15af5700000000, 0xd115059b00000000, 0x32128a1500000000,
+    0xac1220d900000000, 0x2b31bb7c00000000, 0xb53111b000000000,
+    0x56369e3e00000000, 0xc83634f200000000, 0xd13ff1f800000000,
+    0x4f3f5b3400000000, 0xac38d4ba00000000, 0x32387e7600000000,
+    0x9e2a5eaf00000000, 0x002af46300000000, 0xe32d7bed00000000,
+    0x7d2dd12100000000, 0x6424142b00000000, 0xfa24bee700000000,
+    0x1923316900000000, 0x87239ba500000000, 0x566276f900000000,
+    0xc862dc3500000000, 0x2b6553bb00000000, 0xb565f97700000000,
+    0xac6c3c7d00000000, 0x326c96b100000000, 0xd16b193f00000000,
+    0x4f6bb3f300000000, 0xe379932a00000000, 0x7d7939e600000000,
+    0x9e7eb66800000000, 0x007e1ca400000000, 0x1977d9ae00000000,
+    0x8777736200000000, 0x6470fcec00000000, 0xfa70562000000000,
+    0x7d53cd8500000000, 0xe353674900000000, 0x0054e8c700000000,
+    0x9e54420b00000000, 0x875d870100000000, 0x195d2dcd00000000,
+    0xfa5aa24300000000, 0x645a088f00000000, 0xc848285600000000,
+    0x5648829a00000000, 0xb54f0d1400000000, 0x2b4fa7d800000000,
+    0x324662d200000000, 0xac46c81e00000000, 0x4f41479000000000,
+    0xd141ed5c00000000, 0xedc29d2900000000, 0x73c237e500000000,
+    0x90c5b86b00000000, 0x0ec512a700000000, 0x17ccd7ad00000000,
+    0x89cc7d6100000000, 0x6acbf2ef00000000, 0xf4cb582300000000,
+    0x58d978fa00000000, 0xc6d9d23600000000, 0x25de5db800000000,
+    0xbbdef77400000000, 0xa2d7327e00000000, 0x3cd798b200000000,
+    0xdfd0173c00000000, 0x41d0bdf000000000, 0xc6f3265500000000,
+    0x58f38c9900000000, 0xbbf4031700000000, 0x25f4a9db00000000,
+    0x3cfd6cd100000000, 0xa2fdc61d00000000, 0x41fa499300000000,
+    0xdffae35f00000000, 0x73e8c38600000000, 0xede8694a00000000,
+    0x0eefe6c400000000, 0x90ef4c0800000000, 0x89e6890200000000,
+    0x17e623ce00000000, 0xf4e1ac4000000000, 0x6ae1068c00000000,
+    0xbba0ebd000000000, 0x25a0411c00000000, 0xc6a7ce9200000000,
+    0x58a7645e00000000, 0x41aea15400000000, 0xdfae0b9800000000,
+    0x3ca9841600000000, 0xa2a92eda00000000, 0x0ebb0e0300000000,
+    0x90bba4cf00000000, 0x73bc2b4100000000, 0xedbc818d00000000,
+    0xf4b5448700000000, 0x6ab5ee4b00000000, 0x89b261c500000000,
+    0x17b2cb0900000000, 0x909150ac00000000, 0x0e91fa6000000000,
+    0xed9675ee00000000, 0x7396df2200000000, 0x6a9f1a2800000000,
+    0xf49fb0e400000000, 0x17983f6a00000000, 0x899895a600000000,
+    0x258ab57f00000000, 0xbb8a1fb300000000, 0x588d903d00000000,
+    0xc68d3af100000000, 0xdf84fffb00000000, 0x4184553700000000,
+    0xa283dab900000000, 0x3c83707500000000, 0xda853b5300000000,
+    0x4485919f00000000, 0xa7821e1100000000, 0x3982b4dd00000000,
+    0x208b71d700000000, 0xbe8bdb1b00000000, 0x5d8c549500000000,
+    0xc38cfe5900000000, 0x6f9ede8000000000, 0xf19e744c00000000,
+    0x1299fbc200000000, 0x8c99510e00000000, 0x9590940400000000,
+    0x0b903ec800000000, 0xe897b14600000000, 0x76971b8a00000000,
+    0xf1b4802f00000000, 0x6fb42ae300000000, 0x8cb3a56d00000000,
+    0x12b30fa100000000, 0x0bbacaab00000000, 0x95ba606700000000,
+    0x76bdefe900000000, 0xe8bd452500000000, 0x44af65fc00000000,
+    0xdaafcf3000000000, 0x39a840be00000000, 0xa7a8ea7200000000,
+    0xbea12f7800000000, 0x20a185b400000000, 0xc3a60a3a00000000,
+    0x5da6a0f600000000, 0x8ce74daa00000000, 0x12e7e76600000000,
+    0xf1e068e800000000, 0x6fe0c22400000000, 0x76e9072e00000000,
+    0xe8e9ade200000000, 0x0bee226c00000000, 0x95ee88a000000000,
+    0x39fca87900000000, 0xa7fc02b500000000, 0x44fb8d3b00000000,
+    0xdafb27f700000000, 0xc3f2e2fd00000000, 0x5df2483100000000,
+    0xbef5c7bf00000000, 0x20f56d7300000000, 0xa7d6f6d600000000,
+    0x39d65c1a00000000, 0xdad1d39400000000, 0x44d1795800000000,
+    0x5dd8bc5200000000, 0xc3d8169e00000000, 0x20df991000000000,
+    0xbedf33dc00000000, 0x12cd130500000000, 0x8ccdb9c900000000,
+    0x6fca364700000000, 0xf1ca9c8b00000000, 0xe8c3598100000000,
+    0x76c3f34d00000000, 0x95c47cc300000000, 0x0bc4d60f00000000,
+    0x3747a67a00000000, 0xa9470cb600000000, 0x4a40833800000000,
+    0xd44029f400000000, 0xcd49ecfe00000000, 0x5349463200000000,
+    0xb04ec9bc00000000, 0x2e4e637000000000, 0x825c43a900000000,
+    0x1c5ce96500000000, 0xff5b66eb00000000, 0x615bcc2700000000,
+    0x7852092d00000000, 0xe652a3e100000000, 0x05552c6f00000000,
+    0x9b5586a300000000, 0x1c761d0600000000, 0x8276b7ca00000000,
+    0x6171384400000000, 0xff71928800000000, 0xe678578200000000,
+    0x7878fd4e00000000, 0x9b7f72c000000000, 0x057fd80c00000000,
+    0xa96df8d500000000, 0x376d521900000000, 0xd46add9700000000,
+    0x4a6a775b00000000, 0x5363b25100000000, 0xcd63189d00000000,
+    0x2e64971300000000, 0xb0643ddf00000000, 0x6125d08300000000,
+    0xff257a4f00000000, 0x1c22f5c100000000, 0x82225f0d00000000,
+    0x9b2b9a0700000000, 0x052b30cb00000000, 0xe62cbf4500000000,
+    0x782c158900000000, 0xd43e355000000000, 0x4a3e9f9c00000000,
+    0xa939101200000000, 0x3739bade00000000, 0x2e307fd400000000,
+    0xb030d51800000000, 0x53375a9600000000, 0xcd37f05a00000000,
+    0x4a146bff00000000, 0xd414c13300000000, 0x37134ebd00000000,
+    0xa913e47100000000, 0xb01a217b00000000, 0x2e1a8bb700000000,
+    0xcd1d043900000000, 0x531daef500000000, 0xff0f8e2c00000000,
+    0x610f24e000000000, 0x8208ab6e00000000, 0x1c0801a200000000,
+    0x0501c4a800000000, 0x9b016e6400000000, 0x7806e1ea00000000,
+    0xe6064b2600000000}};
+
+#else /* W == 4 */
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757,
+    0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a,
+    0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733,
+    0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871,
+    0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70,
+    0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42,
+    0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5,
+    0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787,
+    0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086,
+    0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4,
+    0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d,
+    0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0,
+    0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d,
+    0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f,
+    0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859,
+    0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b,
+    0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5,
+    0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028,
+    0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891,
+    0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed,
+    0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec,
+    0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde,
+    0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817,
+    0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825,
+    0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24,
+    0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e,
+    0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7,
+    0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a,
+    0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4,
+    0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196,
+    0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0,
+    0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2,
+    0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52,
+    0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f,
+    0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36,
+    0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174,
+    0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675,
+    0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647,
+    0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d,
+    0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf,
+    0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be,
+    0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc,
+    0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645,
+    0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98,
+    0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138,
+    0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a,
+    0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c,
+    0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e,
+    0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0,
+    0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d,
+    0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194,
+    0xde0506f1},
+   {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc,
+    0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f,
+    0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a,
+    0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29,
+    0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8,
+    0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023,
+    0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e,
+    0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065,
+    0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84,
+    0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7,
+    0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922,
+    0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71,
+    0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0,
+    0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b,
+    0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816,
+    0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd,
+    0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c,
+    0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f,
+    0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba,
+    0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579,
+    0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98,
+    0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873,
+    0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e,
+    0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5,
+    0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134,
+    0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7,
+    0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732,
+    0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461,
+    0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0,
+    0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b,
+    0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26,
+    0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd,
+    0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc,
+    0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef,
+    0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a,
+    0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049,
+    0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8,
+    0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43,
+    0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e,
+    0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5,
+    0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24,
+    0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07,
+    0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982,
+    0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1,
+    0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0,
+    0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b,
+    0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576,
+    0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d,
+    0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c,
+    0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f,
+    0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda,
+    0xbe9834ed},
+   {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504,
+    0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49,
+    0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e,
+    0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192,
+    0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859,
+    0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c,
+    0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620,
+    0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265,
+    0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae,
+    0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2,
+    0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175,
+    0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38,
+    0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05,
+    0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40,
+    0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f,
+    0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca,
+    0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850,
+    0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d,
+    0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da,
+    0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864,
+    0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af,
+    0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea,
+    0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74,
+    0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31,
+    0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa,
+    0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a,
+    0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd,
+    0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180,
+    0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a,
+    0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f,
+    0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290,
+    0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5,
+    0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed,
+    0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0,
+    0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167,
+    0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b,
+    0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0,
+    0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5,
+    0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc,
+    0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189,
+    0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842,
+    0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e,
+    0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299,
+    0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4,
+    0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec,
+    0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9,
+    0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66,
+    0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23,
+    0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9,
+    0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4,
+    0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33,
+    0x9324fd72},
+   {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
+    0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
+    0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
+    0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
+    0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
+    0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
+    0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+    0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
+    0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
+    0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
+    0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
+    0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
+    0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
+    0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+    0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
+    0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
+    0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
+    0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
+    0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
+    0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
+    0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
+    0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
+    0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
+    0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
+    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
+    0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
+    0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+    0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
+    0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
+    0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
+    0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
+    0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
+    0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
+    0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+    0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
+    0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
+    0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
+    0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
+    0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
+    0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
+    0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
+    0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
+    0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
+    0x2d02ef8d}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07,
+    0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79,
+    0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7,
+    0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84,
+    0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13,
+    0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663,
+    0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5,
+    0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5,
+    0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832,
+    0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51,
+    0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf,
+    0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1,
+    0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76,
+    0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606,
+    0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996,
+    0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6,
+    0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c,
+    0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712,
+    0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c,
+    0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4,
+    0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943,
+    0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333,
+    0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe,
+    0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce,
+    0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359,
+    0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a,
+    0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04,
+    0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a,
+    0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0,
+    0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580,
+    0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10,
+    0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060,
+    0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1,
+    0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf,
+    0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31,
+    0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852,
+    0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5,
+    0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5,
+    0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75,
+    0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005,
+    0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292,
+    0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1,
+    0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f,
+    0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111,
+    0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0,
+    0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0,
+    0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40,
+    0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530,
+    0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba,
+    0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4,
+    0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a,
+    0x8def022d},
+   {0x00000000, 0x41311b19, 0x82623632, 0xc3532d2b, 0x04c56c64,
+    0x45f4777d, 0x86a75a56, 0xc796414f, 0x088ad9c8, 0x49bbc2d1,
+    0x8ae8effa, 0xcbd9f4e3, 0x0c4fb5ac, 0x4d7eaeb5, 0x8e2d839e,
+    0xcf1c9887, 0x5112c24a, 0x1023d953, 0xd370f478, 0x9241ef61,
+    0x55d7ae2e, 0x14e6b537, 0xd7b5981c, 0x96848305, 0x59981b82,
+    0x18a9009b, 0xdbfa2db0, 0x9acb36a9, 0x5d5d77e6, 0x1c6c6cff,
+    0xdf3f41d4, 0x9e0e5acd, 0xa2248495, 0xe3159f8c, 0x2046b2a7,
+    0x6177a9be, 0xa6e1e8f1, 0xe7d0f3e8, 0x2483dec3, 0x65b2c5da,
+    0xaaae5d5d, 0xeb9f4644, 0x28cc6b6f, 0x69fd7076, 0xae6b3139,
+    0xef5a2a20, 0x2c09070b, 0x6d381c12, 0xf33646df, 0xb2075dc6,
+    0x715470ed, 0x30656bf4, 0xf7f32abb, 0xb6c231a2, 0x75911c89,
+    0x34a00790, 0xfbbc9f17, 0xba8d840e, 0x79dea925, 0x38efb23c,
+    0xff79f373, 0xbe48e86a, 0x7d1bc541, 0x3c2ade58, 0x054f79f0,
+    0x447e62e9, 0x872d4fc2, 0xc61c54db, 0x018a1594, 0x40bb0e8d,
+    0x83e823a6, 0xc2d938bf, 0x0dc5a038, 0x4cf4bb21, 0x8fa7960a,
+    0xce968d13, 0x0900cc5c, 0x4831d745, 0x8b62fa6e, 0xca53e177,
+    0x545dbbba, 0x156ca0a3, 0xd63f8d88, 0x970e9691, 0x5098d7de,
+    0x11a9ccc7, 0xd2fae1ec, 0x93cbfaf5, 0x5cd76272, 0x1de6796b,
+    0xdeb55440, 0x9f844f59, 0x58120e16, 0x1923150f, 0xda703824,
+    0x9b41233d, 0xa76bfd65, 0xe65ae67c, 0x2509cb57, 0x6438d04e,
+    0xa3ae9101, 0xe29f8a18, 0x21cca733, 0x60fdbc2a, 0xafe124ad,
+    0xeed03fb4, 0x2d83129f, 0x6cb20986, 0xab2448c9, 0xea1553d0,
+    0x29467efb, 0x687765e2, 0xf6793f2f, 0xb7482436, 0x741b091d,
+    0x352a1204, 0xf2bc534b, 0xb38d4852, 0x70de6579, 0x31ef7e60,
+    0xfef3e6e7, 0xbfc2fdfe, 0x7c91d0d5, 0x3da0cbcc, 0xfa368a83,
+    0xbb07919a, 0x7854bcb1, 0x3965a7a8, 0x4b98833b, 0x0aa99822,
+    0xc9fab509, 0x88cbae10, 0x4f5def5f, 0x0e6cf446, 0xcd3fd96d,
+    0x8c0ec274, 0x43125af3, 0x022341ea, 0xc1706cc1, 0x804177d8,
+    0x47d73697, 0x06e62d8e, 0xc5b500a5, 0x84841bbc, 0x1a8a4171,
+    0x5bbb5a68, 0x98e87743, 0xd9d96c5a, 0x1e4f2d15, 0x5f7e360c,
+    0x9c2d1b27, 0xdd1c003e, 0x120098b9, 0x533183a0, 0x9062ae8b,
+    0xd153b592, 0x16c5f4dd, 0x57f4efc4, 0x94a7c2ef, 0xd596d9f6,
+    0xe9bc07ae, 0xa88d1cb7, 0x6bde319c, 0x2aef2a85, 0xed796bca,
+    0xac4870d3, 0x6f1b5df8, 0x2e2a46e1, 0xe136de66, 0xa007c57f,
+    0x6354e854, 0x2265f34d, 0xe5f3b202, 0xa4c2a91b, 0x67918430,
+    0x26a09f29, 0xb8aec5e4, 0xf99fdefd, 0x3accf3d6, 0x7bfde8cf,
+    0xbc6ba980, 0xfd5ab299, 0x3e099fb2, 0x7f3884ab, 0xb0241c2c,
+    0xf1150735, 0x32462a1e, 0x73773107, 0xb4e17048, 0xf5d06b51,
+    0x3683467a, 0x77b25d63, 0x4ed7facb, 0x0fe6e1d2, 0xccb5ccf9,
+    0x8d84d7e0, 0x4a1296af, 0x0b238db6, 0xc870a09d, 0x8941bb84,
+    0x465d2303, 0x076c381a, 0xc43f1531, 0x850e0e28, 0x42984f67,
+    0x03a9547e, 0xc0fa7955, 0x81cb624c, 0x1fc53881, 0x5ef42398,
+    0x9da70eb3, 0xdc9615aa, 0x1b0054e5, 0x5a314ffc, 0x996262d7,
+    0xd85379ce, 0x174fe149, 0x567efa50, 0x952dd77b, 0xd41ccc62,
+    0x138a8d2d, 0x52bb9634, 0x91e8bb1f, 0xd0d9a006, 0xecf37e5e,
+    0xadc26547, 0x6e91486c, 0x2fa05375, 0xe836123a, 0xa9070923,
+    0x6a542408, 0x2b653f11, 0xe479a796, 0xa548bc8f, 0x661b91a4,
+    0x272a8abd, 0xe0bccbf2, 0xa18dd0eb, 0x62defdc0, 0x23efe6d9,
+    0xbde1bc14, 0xfcd0a70d, 0x3f838a26, 0x7eb2913f, 0xb924d070,
+    0xf815cb69, 0x3b46e642, 0x7a77fd5b, 0xb56b65dc, 0xf45a7ec5,
+    0x370953ee, 0x763848f7, 0xb1ae09b8, 0xf09f12a1, 0x33cc3f8a,
+    0x72fd2493},
+   {0x00000000, 0x376ac201, 0x6ed48403, 0x59be4602, 0xdca80907,
+    0xebc2cb06, 0xb27c8d04, 0x85164f05, 0xb851130e, 0x8f3bd10f,
+    0xd685970d, 0xe1ef550c, 0x64f91a09, 0x5393d808, 0x0a2d9e0a,
+    0x3d475c0b, 0x70a3261c, 0x47c9e41d, 0x1e77a21f, 0x291d601e,
+    0xac0b2f1b, 0x9b61ed1a, 0xc2dfab18, 0xf5b56919, 0xc8f23512,
+    0xff98f713, 0xa626b111, 0x914c7310, 0x145a3c15, 0x2330fe14,
+    0x7a8eb816, 0x4de47a17, 0xe0464d38, 0xd72c8f39, 0x8e92c93b,
+    0xb9f80b3a, 0x3cee443f, 0x0b84863e, 0x523ac03c, 0x6550023d,
+    0x58175e36, 0x6f7d9c37, 0x36c3da35, 0x01a91834, 0x84bf5731,
+    0xb3d59530, 0xea6bd332, 0xdd011133, 0x90e56b24, 0xa78fa925,
+    0xfe31ef27, 0xc95b2d26, 0x4c4d6223, 0x7b27a022, 0x2299e620,
+    0x15f32421, 0x28b4782a, 0x1fdeba2b, 0x4660fc29, 0x710a3e28,
+    0xf41c712d, 0xc376b32c, 0x9ac8f52e, 0xada2372f, 0xc08d9a70,
+    0xf7e75871, 0xae591e73, 0x9933dc72, 0x1c259377, 0x2b4f5176,
+    0x72f11774, 0x459bd575, 0x78dc897e, 0x4fb64b7f, 0x16080d7d,
+    0x2162cf7c, 0xa4748079, 0x931e4278, 0xcaa0047a, 0xfdcac67b,
+    0xb02ebc6c, 0x87447e6d, 0xdefa386f, 0xe990fa6e, 0x6c86b56b,
+    0x5bec776a, 0x02523168, 0x3538f369, 0x087faf62, 0x3f156d63,
+    0x66ab2b61, 0x51c1e960, 0xd4d7a665, 0xe3bd6464, 0xba032266,
+    0x8d69e067, 0x20cbd748, 0x17a11549, 0x4e1f534b, 0x7975914a,
+    0xfc63de4f, 0xcb091c4e, 0x92b75a4c, 0xa5dd984d, 0x989ac446,
+    0xaff00647, 0xf64e4045, 0xc1248244, 0x4432cd41, 0x73580f40,
+    0x2ae64942, 0x1d8c8b43, 0x5068f154, 0x67023355, 0x3ebc7557,
+    0x09d6b756, 0x8cc0f853, 0xbbaa3a52, 0xe2147c50, 0xd57ebe51,
+    0xe839e25a, 0xdf53205b, 0x86ed6659, 0xb187a458, 0x3491eb5d,
+    0x03fb295c, 0x5a456f5e, 0x6d2fad5f, 0x801b35e1, 0xb771f7e0,
+    0xeecfb1e2, 0xd9a573e3, 0x5cb33ce6, 0x6bd9fee7, 0x3267b8e5,
+    0x050d7ae4, 0x384a26ef, 0x0f20e4ee, 0x569ea2ec, 0x61f460ed,
+    0xe4e22fe8, 0xd388ede9, 0x8a36abeb, 0xbd5c69ea, 0xf0b813fd,
+    0xc7d2d1fc, 0x9e6c97fe, 0xa90655ff, 0x2c101afa, 0x1b7ad8fb,
+    0x42c49ef9, 0x75ae5cf8, 0x48e900f3, 0x7f83c2f2, 0x263d84f0,
+    0x115746f1, 0x944109f4, 0xa32bcbf5, 0xfa958df7, 0xcdff4ff6,
+    0x605d78d9, 0x5737bad8, 0x0e89fcda, 0x39e33edb, 0xbcf571de,
+    0x8b9fb3df, 0xd221f5dd, 0xe54b37dc, 0xd80c6bd7, 0xef66a9d6,
+    0xb6d8efd4, 0x81b22dd5, 0x04a462d0, 0x33cea0d1, 0x6a70e6d3,
+    0x5d1a24d2, 0x10fe5ec5, 0x27949cc4, 0x7e2adac6, 0x494018c7,
+    0xcc5657c2, 0xfb3c95c3, 0xa282d3c1, 0x95e811c0, 0xa8af4dcb,
+    0x9fc58fca, 0xc67bc9c8, 0xf1110bc9, 0x740744cc, 0x436d86cd,
+    0x1ad3c0cf, 0x2db902ce, 0x4096af91, 0x77fc6d90, 0x2e422b92,
+    0x1928e993, 0x9c3ea696, 0xab546497, 0xf2ea2295, 0xc580e094,
+    0xf8c7bc9f, 0xcfad7e9e, 0x9613389c, 0xa179fa9d, 0x246fb598,
+    0x13057799, 0x4abb319b, 0x7dd1f39a, 0x3035898d, 0x075f4b8c,
+    0x5ee10d8e, 0x698bcf8f, 0xec9d808a, 0xdbf7428b, 0x82490489,
+    0xb523c688, 0x88649a83, 0xbf0e5882, 0xe6b01e80, 0xd1dadc81,
+    0x54cc9384, 0x63a65185, 0x3a181787, 0x0d72d586, 0xa0d0e2a9,
+    0x97ba20a8, 0xce0466aa, 0xf96ea4ab, 0x7c78ebae, 0x4b1229af,
+    0x12ac6fad, 0x25c6adac, 0x1881f1a7, 0x2feb33a6, 0x765575a4,
+    0x413fb7a5, 0xc429f8a0, 0xf3433aa1, 0xaafd7ca3, 0x9d97bea2,
+    0xd073c4b5, 0xe71906b4, 0xbea740b6, 0x89cd82b7, 0x0cdbcdb2,
+    0x3bb10fb3, 0x620f49b1, 0x55658bb0, 0x6822d7bb, 0x5f4815ba,
+    0x06f653b8, 0x319c91b9, 0xb48adebc, 0x83e01cbd, 0xda5e5abf,
+    0xed3498be},
+   {0x00000000, 0x6567bcb8, 0x8bc809aa, 0xeeafb512, 0x5797628f,
+    0x32f0de37, 0xdc5f6b25, 0xb938d79d, 0xef28b4c5, 0x8a4f087d,
+    0x64e0bd6f, 0x018701d7, 0xb8bfd64a, 0xddd86af2, 0x3377dfe0,
+    0x56106358, 0x9f571950, 0xfa30a5e8, 0x149f10fa, 0x71f8ac42,
+    0xc8c07bdf, 0xada7c767, 0x43087275, 0x266fcecd, 0x707fad95,
+    0x1518112d, 0xfbb7a43f, 0x9ed01887, 0x27e8cf1a, 0x428f73a2,
+    0xac20c6b0, 0xc9477a08, 0x3eaf32a0, 0x5bc88e18, 0xb5673b0a,
+    0xd00087b2, 0x6938502f, 0x0c5fec97, 0xe2f05985, 0x8797e53d,
+    0xd1878665, 0xb4e03add, 0x5a4f8fcf, 0x3f283377, 0x8610e4ea,
+    0xe3775852, 0x0dd8ed40, 0x68bf51f8, 0xa1f82bf0, 0xc49f9748,
+    0x2a30225a, 0x4f579ee2, 0xf66f497f, 0x9308f5c7, 0x7da740d5,
+    0x18c0fc6d, 0x4ed09f35, 0x2bb7238d, 0xc518969f, 0xa07f2a27,
+    0x1947fdba, 0x7c204102, 0x928ff410, 0xf7e848a8, 0x3d58149b,
+    0x583fa823, 0xb6901d31, 0xd3f7a189, 0x6acf7614, 0x0fa8caac,
+    0xe1077fbe, 0x8460c306, 0xd270a05e, 0xb7171ce6, 0x59b8a9f4,
+    0x3cdf154c, 0x85e7c2d1, 0xe0807e69, 0x0e2fcb7b, 0x6b4877c3,
+    0xa20f0dcb, 0xc768b173, 0x29c70461, 0x4ca0b8d9, 0xf5986f44,
+    0x90ffd3fc, 0x7e5066ee, 0x1b37da56, 0x4d27b90e, 0x284005b6,
+    0xc6efb0a4, 0xa3880c1c, 0x1ab0db81, 0x7fd76739, 0x9178d22b,
+    0xf41f6e93, 0x03f7263b, 0x66909a83, 0x883f2f91, 0xed589329,
+    0x546044b4, 0x3107f80c, 0xdfa84d1e, 0xbacff1a6, 0xecdf92fe,
+    0x89b82e46, 0x67179b54, 0x027027ec, 0xbb48f071, 0xde2f4cc9,
+    0x3080f9db, 0x55e74563, 0x9ca03f6b, 0xf9c783d3, 0x176836c1,
+    0x720f8a79, 0xcb375de4, 0xae50e15c, 0x40ff544e, 0x2598e8f6,
+    0x73888bae, 0x16ef3716, 0xf8408204, 0x9d273ebc, 0x241fe921,
+    0x41785599, 0xafd7e08b, 0xcab05c33, 0x3bb659ed, 0x5ed1e555,
+    0xb07e5047, 0xd519ecff, 0x6c213b62, 0x094687da, 0xe7e932c8,
+    0x828e8e70, 0xd49eed28, 0xb1f95190, 0x5f56e482, 0x3a31583a,
+    0x83098fa7, 0xe66e331f, 0x08c1860d, 0x6da63ab5, 0xa4e140bd,
+    0xc186fc05, 0x2f294917, 0x4a4ef5af, 0xf3762232, 0x96119e8a,
+    0x78be2b98, 0x1dd99720, 0x4bc9f478, 0x2eae48c0, 0xc001fdd2,
+    0xa566416a, 0x1c5e96f7, 0x79392a4f, 0x97969f5d, 0xf2f123e5,
+    0x05196b4d, 0x607ed7f5, 0x8ed162e7, 0xebb6de5f, 0x528e09c2,
+    0x37e9b57a, 0xd9460068, 0xbc21bcd0, 0xea31df88, 0x8f566330,
+    0x61f9d622, 0x049e6a9a, 0xbda6bd07, 0xd8c101bf, 0x366eb4ad,
+    0x53090815, 0x9a4e721d, 0xff29cea5, 0x11867bb7, 0x74e1c70f,
+    0xcdd91092, 0xa8beac2a, 0x46111938, 0x2376a580, 0x7566c6d8,
+    0x10017a60, 0xfeaecf72, 0x9bc973ca, 0x22f1a457, 0x479618ef,
+    0xa939adfd, 0xcc5e1145, 0x06ee4d76, 0x6389f1ce, 0x8d2644dc,
+    0xe841f864, 0x51792ff9, 0x341e9341, 0xdab12653, 0xbfd69aeb,
+    0xe9c6f9b3, 0x8ca1450b, 0x620ef019, 0x07694ca1, 0xbe519b3c,
+    0xdb362784, 0x35999296, 0x50fe2e2e, 0x99b95426, 0xfcdee89e,
+    0x12715d8c, 0x7716e134, 0xce2e36a9, 0xab498a11, 0x45e63f03,
+    0x208183bb, 0x7691e0e3, 0x13f65c5b, 0xfd59e949, 0x983e55f1,
+    0x2106826c, 0x44613ed4, 0xaace8bc6, 0xcfa9377e, 0x38417fd6,
+    0x5d26c36e, 0xb389767c, 0xd6eecac4, 0x6fd61d59, 0x0ab1a1e1,
+    0xe41e14f3, 0x8179a84b, 0xd769cb13, 0xb20e77ab, 0x5ca1c2b9,
+    0x39c67e01, 0x80fea99c, 0xe5991524, 0x0b36a036, 0x6e511c8e,
+    0xa7166686, 0xc271da3e, 0x2cde6f2c, 0x49b9d394, 0xf0810409,
+    0x95e6b8b1, 0x7b490da3, 0x1e2eb11b, 0x483ed243, 0x2d596efb,
+    0xc3f6dbe9, 0xa6916751, 0x1fa9b0cc, 0x7ace0c74, 0x9461b966,
+    0xf10605de}};
+
+#endif
+
+#endif
+
+#if N == 2
+
+#if W == 8
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87,
+    0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede,
+    0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab,
+    0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c,
+    0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1,
+    0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7,
+    0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e,
+    0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308,
+    0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5,
+    0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472,
+    0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07,
+    0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e,
+    0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa,
+    0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec,
+    0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6,
+    0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0,
+    0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3,
+    0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba,
+    0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf,
+    0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975,
+    0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8,
+    0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde,
+    0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a,
+    0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c,
+    0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1,
+    0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65,
+    0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410,
+    0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649,
+    0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a,
+    0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c,
+    0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946,
+    0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450,
+    0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e,
+    0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857,
+    0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022,
+    0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5,
+    0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758,
+    0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e,
+    0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d,
+    0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b,
+    0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6,
+    0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401,
+    0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74,
+    0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d,
+    0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073,
+    0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65,
+    0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f,
+    0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749,
+    0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a,
+    0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033,
+    0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846,
+    0x0d7139d7},
+   {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563,
+    0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f,
+    0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875,
+    0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536,
+    0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8,
+    0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43,
+    0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f,
+    0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184,
+    0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a,
+    0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39,
+    0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523,
+    0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f,
+    0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d,
+    0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6,
+    0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b,
+    0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0,
+    0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151,
+    0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d,
+    0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47,
+    0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a,
+    0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964,
+    0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef,
+    0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d,
+    0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6,
+    0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348,
+    0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53,
+    0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449,
+    0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645,
+    0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4,
+    0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f,
+    0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2,
+    0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69,
+    0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46,
+    0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a,
+    0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650,
+    0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13,
+    0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded,
+    0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366,
+    0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57,
+    0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc,
+    0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222,
+    0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61,
+    0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b,
+    0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277,
+    0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558,
+    0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3,
+    0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e,
+    0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5,
+    0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74,
+    0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78,
+    0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262,
+    0x1c53e98a},
+   {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b,
+    0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40,
+    0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580,
+    0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7,
+    0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a,
+    0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37,
+    0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75,
+    0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218,
+    0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5,
+    0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2,
+    0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02,
+    0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59,
+    0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1,
+    0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c,
+    0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a,
+    0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307,
+    0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486,
+    0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd,
+    0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d,
+    0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2,
+    0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f,
+    0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72,
+    0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8,
+    0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985,
+    0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268,
+    0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94,
+    0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454,
+    0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f,
+    0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e,
+    0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3,
+    0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915,
+    0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778,
+    0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821,
+    0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a,
+    0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba,
+    0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d,
+    0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560,
+    0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d,
+    0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe,
+    0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3,
+    0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e,
+    0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509,
+    0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9,
+    0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92,
+    0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb,
+    0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6,
+    0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50,
+    0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d,
+    0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc,
+    0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7,
+    0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927,
+    0x3f88e851},
+   {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96,
+    0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8,
+    0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0,
+    0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14,
+    0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7,
+    0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4,
+    0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe,
+    0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad,
+    0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e,
+    0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa,
+    0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2,
+    0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c,
+    0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab,
+    0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8,
+    0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d,
+    0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e,
+    0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7,
+    0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99,
+    0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1,
+    0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690,
+    0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933,
+    0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20,
+    0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf,
+    0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc,
+    0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f,
+    0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92,
+    0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca,
+    0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4,
+    0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd,
+    0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de,
+    0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb,
+    0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8,
+    0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474,
+    0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a,
+    0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252,
+    0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6,
+    0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55,
+    0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846,
+    0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7,
+    0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4,
+    0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47,
+    0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3,
+    0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb,
+    0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5,
+    0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49,
+    0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a,
+    0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f,
+    0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c,
+    0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305,
+    0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b,
+    0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523,
+    0x3dee8ca6},
+   {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f,
+    0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91,
+    0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e,
+    0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c,
+    0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02,
+    0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12,
+    0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567,
+    0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277,
+    0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679,
+    0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b,
+    0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4,
+    0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a,
+    0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0,
+    0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0,
+    0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91,
+    0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881,
+    0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173,
+    0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d,
+    0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912,
+    0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8,
+    0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6,
+    0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6,
+    0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b,
+    0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b,
+    0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75,
+    0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f,
+    0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00,
+    0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee,
+    0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c,
+    0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c,
+    0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d,
+    0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d,
+    0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67,
+    0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89,
+    0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706,
+    0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14,
+    0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a,
+    0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a,
+    0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f,
+    0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f,
+    0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591,
+    0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983,
+    0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c,
+    0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2,
+    0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8,
+    0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8,
+    0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89,
+    0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99,
+    0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b,
+    0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485,
+    0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a,
+    0x36197165},
+   {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382,
+    0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85,
+    0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06,
+    0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca,
+    0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e,
+    0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc,
+    0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616,
+    0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54,
+    0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10,
+    0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc,
+    0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f,
+    0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58,
+    0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef,
+    0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad,
+    0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b,
+    0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29,
+    0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6,
+    0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1,
+    0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622,
+    0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039,
+    0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d,
+    0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f,
+    0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32,
+    0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770,
+    0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034,
+    0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f,
+    0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc,
+    0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db,
+    0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154,
+    0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16,
+    0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0,
+    0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592,
+    0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca,
+    0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd,
+    0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e,
+    0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882,
+    0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6,
+    0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384,
+    0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1,
+    0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3,
+    0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7,
+    0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b,
+    0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8,
+    0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff,
+    0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7,
+    0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5,
+    0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23,
+    0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761,
+    0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee,
+    0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9,
+    0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a,
+    0x1a3b93aa},
+   {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a,
+    0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca,
+    0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3,
+    0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb,
+    0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c,
+    0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58,
+    0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed,
+    0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9,
+    0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e,
+    0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906,
+    0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f,
+    0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf,
+    0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0,
+    0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4,
+    0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769,
+    0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d,
+    0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632,
+    0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82,
+    0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb,
+    0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73,
+    0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484,
+    0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0,
+    0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5,
+    0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1,
+    0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516,
+    0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f,
+    0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946,
+    0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6,
+    0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9,
+    0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad,
+    0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820,
+    0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364,
+    0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab,
+    0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b,
+    0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62,
+    0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a,
+    0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd,
+    0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089,
+    0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c,
+    0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8,
+    0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f,
+    0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477,
+    0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e,
+    0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be,
+    0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71,
+    0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635,
+    0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8,
+    0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc,
+    0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3,
+    0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753,
+    0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a,
+    0xe147d714},
+   {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c,
+    0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b,
+    0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92,
+    0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4,
+    0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069,
+    0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526,
+    0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25,
+    0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a,
+    0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7,
+    0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491,
+    0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958,
+    0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f,
+    0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307,
+    0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648,
+    0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999,
+    0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6,
+    0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a,
+    0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d,
+    0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4,
+    0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61,
+    0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc,
+    0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3,
+    0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53,
+    0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c,
+    0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1,
+    0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c,
+    0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5,
+    0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92,
+    0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e,
+    0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771,
+    0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0,
+    0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def,
+    0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0,
+    0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7,
+    0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e,
+    0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58,
+    0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285,
+    0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca,
+    0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce,
+    0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81,
+    0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c,
+    0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a,
+    0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3,
+    0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4,
+    0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb,
+    0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4,
+    0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75,
+    0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a,
+    0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296,
+    0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1,
+    0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808,
+    0x494f0c4b}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x0000000000000000, 0x43147b1700000000, 0x8628f62e00000000,
+    0xc53c8d3900000000, 0x0c51ec5d00000000, 0x4f45974a00000000,
+    0x8a791a7300000000, 0xc96d616400000000, 0x18a2d8bb00000000,
+    0x5bb6a3ac00000000, 0x9e8a2e9500000000, 0xdd9e558200000000,
+    0x14f334e600000000, 0x57e74ff100000000, 0x92dbc2c800000000,
+    0xd1cfb9df00000000, 0x7142c0ac00000000, 0x3256bbbb00000000,
+    0xf76a368200000000, 0xb47e4d9500000000, 0x7d132cf100000000,
+    0x3e0757e600000000, 0xfb3bdadf00000000, 0xb82fa1c800000000,
+    0x69e0181700000000, 0x2af4630000000000, 0xefc8ee3900000000,
+    0xacdc952e00000000, 0x65b1f44a00000000, 0x26a58f5d00000000,
+    0xe399026400000000, 0xa08d797300000000, 0xa382f18200000000,
+    0xe0968a9500000000, 0x25aa07ac00000000, 0x66be7cbb00000000,
+    0xafd31ddf00000000, 0xecc766c800000000, 0x29fbebf100000000,
+    0x6aef90e600000000, 0xbb20293900000000, 0xf834522e00000000,
+    0x3d08df1700000000, 0x7e1ca40000000000, 0xb771c56400000000,
+    0xf465be7300000000, 0x3159334a00000000, 0x724d485d00000000,
+    0xd2c0312e00000000, 0x91d44a3900000000, 0x54e8c70000000000,
+    0x17fcbc1700000000, 0xde91dd7300000000, 0x9d85a66400000000,
+    0x58b92b5d00000000, 0x1bad504a00000000, 0xca62e99500000000,
+    0x8976928200000000, 0x4c4a1fbb00000000, 0x0f5e64ac00000000,
+    0xc63305c800000000, 0x85277edf00000000, 0x401bf3e600000000,
+    0x030f88f100000000, 0x070392de00000000, 0x4417e9c900000000,
+    0x812b64f000000000, 0xc23f1fe700000000, 0x0b527e8300000000,
+    0x4846059400000000, 0x8d7a88ad00000000, 0xce6ef3ba00000000,
+    0x1fa14a6500000000, 0x5cb5317200000000, 0x9989bc4b00000000,
+    0xda9dc75c00000000, 0x13f0a63800000000, 0x50e4dd2f00000000,
+    0x95d8501600000000, 0xd6cc2b0100000000, 0x7641527200000000,
+    0x3555296500000000, 0xf069a45c00000000, 0xb37ddf4b00000000,
+    0x7a10be2f00000000, 0x3904c53800000000, 0xfc38480100000000,
+    0xbf2c331600000000, 0x6ee38ac900000000, 0x2df7f1de00000000,
+    0xe8cb7ce700000000, 0xabdf07f000000000, 0x62b2669400000000,
+    0x21a61d8300000000, 0xe49a90ba00000000, 0xa78eebad00000000,
+    0xa481635c00000000, 0xe795184b00000000, 0x22a9957200000000,
+    0x61bdee6500000000, 0xa8d08f0100000000, 0xebc4f41600000000,
+    0x2ef8792f00000000, 0x6dec023800000000, 0xbc23bbe700000000,
+    0xff37c0f000000000, 0x3a0b4dc900000000, 0x791f36de00000000,
+    0xb07257ba00000000, 0xf3662cad00000000, 0x365aa19400000000,
+    0x754eda8300000000, 0xd5c3a3f000000000, 0x96d7d8e700000000,
+    0x53eb55de00000000, 0x10ff2ec900000000, 0xd9924fad00000000,
+    0x9a8634ba00000000, 0x5fbab98300000000, 0x1caec29400000000,
+    0xcd617b4b00000000, 0x8e75005c00000000, 0x4b498d6500000000,
+    0x085df67200000000, 0xc130971600000000, 0x8224ec0100000000,
+    0x4718613800000000, 0x040c1a2f00000000, 0x4f00556600000000,
+    0x0c142e7100000000, 0xc928a34800000000, 0x8a3cd85f00000000,
+    0x4351b93b00000000, 0x0045c22c00000000, 0xc5794f1500000000,
+    0x866d340200000000, 0x57a28ddd00000000, 0x14b6f6ca00000000,
+    0xd18a7bf300000000, 0x929e00e400000000, 0x5bf3618000000000,
+    0x18e71a9700000000, 0xdddb97ae00000000, 0x9ecfecb900000000,
+    0x3e4295ca00000000, 0x7d56eedd00000000, 0xb86a63e400000000,
+    0xfb7e18f300000000, 0x3213799700000000, 0x7107028000000000,
+    0xb43b8fb900000000, 0xf72ff4ae00000000, 0x26e04d7100000000,
+    0x65f4366600000000, 0xa0c8bb5f00000000, 0xe3dcc04800000000,
+    0x2ab1a12c00000000, 0x69a5da3b00000000, 0xac99570200000000,
+    0xef8d2c1500000000, 0xec82a4e400000000, 0xaf96dff300000000,
+    0x6aaa52ca00000000, 0x29be29dd00000000, 0xe0d348b900000000,
+    0xa3c733ae00000000, 0x66fbbe9700000000, 0x25efc58000000000,
+    0xf4207c5f00000000, 0xb734074800000000, 0x72088a7100000000,
+    0x311cf16600000000, 0xf871900200000000, 0xbb65eb1500000000,
+    0x7e59662c00000000, 0x3d4d1d3b00000000, 0x9dc0644800000000,
+    0xded41f5f00000000, 0x1be8926600000000, 0x58fce97100000000,
+    0x9191881500000000, 0xd285f30200000000, 0x17b97e3b00000000,
+    0x54ad052c00000000, 0x8562bcf300000000, 0xc676c7e400000000,
+    0x034a4add00000000, 0x405e31ca00000000, 0x893350ae00000000,
+    0xca272bb900000000, 0x0f1ba68000000000, 0x4c0fdd9700000000,
+    0x4803c7b800000000, 0x0b17bcaf00000000, 0xce2b319600000000,
+    0x8d3f4a8100000000, 0x44522be500000000, 0x074650f200000000,
+    0xc27addcb00000000, 0x816ea6dc00000000, 0x50a11f0300000000,
+    0x13b5641400000000, 0xd689e92d00000000, 0x959d923a00000000,
+    0x5cf0f35e00000000, 0x1fe4884900000000, 0xdad8057000000000,
+    0x99cc7e6700000000, 0x3941071400000000, 0x7a557c0300000000,
+    0xbf69f13a00000000, 0xfc7d8a2d00000000, 0x3510eb4900000000,
+    0x7604905e00000000, 0xb3381d6700000000, 0xf02c667000000000,
+    0x21e3dfaf00000000, 0x62f7a4b800000000, 0xa7cb298100000000,
+    0xe4df529600000000, 0x2db233f200000000, 0x6ea648e500000000,
+    0xab9ac5dc00000000, 0xe88ebecb00000000, 0xeb81363a00000000,
+    0xa8954d2d00000000, 0x6da9c01400000000, 0x2ebdbb0300000000,
+    0xe7d0da6700000000, 0xa4c4a17000000000, 0x61f82c4900000000,
+    0x22ec575e00000000, 0xf323ee8100000000, 0xb037959600000000,
+    0x750b18af00000000, 0x361f63b800000000, 0xff7202dc00000000,
+    0xbc6679cb00000000, 0x795af4f200000000, 0x3a4e8fe500000000,
+    0x9ac3f69600000000, 0xd9d78d8100000000, 0x1ceb00b800000000,
+    0x5fff7baf00000000, 0x96921acb00000000, 0xd58661dc00000000,
+    0x10baece500000000, 0x53ae97f200000000, 0x82612e2d00000000,
+    0xc175553a00000000, 0x0449d80300000000, 0x475da31400000000,
+    0x8e30c27000000000, 0xcd24b96700000000, 0x0818345e00000000,
+    0x4b0c4f4900000000},
+   {0x0000000000000000, 0x3e6bc2ef00000000, 0x3dd0f50400000000,
+    0x03bb37eb00000000, 0x7aa0eb0900000000, 0x44cb29e600000000,
+    0x47701e0d00000000, 0x791bdce200000000, 0xf440d71300000000,
+    0xca2b15fc00000000, 0xc990221700000000, 0xf7fbe0f800000000,
+    0x8ee03c1a00000000, 0xb08bfef500000000, 0xb330c91e00000000,
+    0x8d5b0bf100000000, 0xe881ae2700000000, 0xd6ea6cc800000000,
+    0xd5515b2300000000, 0xeb3a99cc00000000, 0x9221452e00000000,
+    0xac4a87c100000000, 0xaff1b02a00000000, 0x919a72c500000000,
+    0x1cc1793400000000, 0x22aabbdb00000000, 0x21118c3000000000,
+    0x1f7a4edf00000000, 0x6661923d00000000, 0x580a50d200000000,
+    0x5bb1673900000000, 0x65daa5d600000000, 0xd0035d4f00000000,
+    0xee689fa000000000, 0xedd3a84b00000000, 0xd3b86aa400000000,
+    0xaaa3b64600000000, 0x94c874a900000000, 0x9773434200000000,
+    0xa91881ad00000000, 0x24438a5c00000000, 0x1a2848b300000000,
+    0x19937f5800000000, 0x27f8bdb700000000, 0x5ee3615500000000,
+    0x6088a3ba00000000, 0x6333945100000000, 0x5d5856be00000000,
+    0x3882f36800000000, 0x06e9318700000000, 0x0552066c00000000,
+    0x3b39c48300000000, 0x4222186100000000, 0x7c49da8e00000000,
+    0x7ff2ed6500000000, 0x41992f8a00000000, 0xccc2247b00000000,
+    0xf2a9e69400000000, 0xf112d17f00000000, 0xcf79139000000000,
+    0xb662cf7200000000, 0x88090d9d00000000, 0x8bb23a7600000000,
+    0xb5d9f89900000000, 0xa007ba9e00000000, 0x9e6c787100000000,
+    0x9dd74f9a00000000, 0xa3bc8d7500000000, 0xdaa7519700000000,
+    0xe4cc937800000000, 0xe777a49300000000, 0xd91c667c00000000,
+    0x54476d8d00000000, 0x6a2caf6200000000, 0x6997988900000000,
+    0x57fc5a6600000000, 0x2ee7868400000000, 0x108c446b00000000,
+    0x1337738000000000, 0x2d5cb16f00000000, 0x488614b900000000,
+    0x76edd65600000000, 0x7556e1bd00000000, 0x4b3d235200000000,
+    0x3226ffb000000000, 0x0c4d3d5f00000000, 0x0ff60ab400000000,
+    0x319dc85b00000000, 0xbcc6c3aa00000000, 0x82ad014500000000,
+    0x811636ae00000000, 0xbf7df44100000000, 0xc66628a300000000,
+    0xf80dea4c00000000, 0xfbb6dda700000000, 0xc5dd1f4800000000,
+    0x7004e7d100000000, 0x4e6f253e00000000, 0x4dd412d500000000,
+    0x73bfd03a00000000, 0x0aa40cd800000000, 0x34cfce3700000000,
+    0x3774f9dc00000000, 0x091f3b3300000000, 0x844430c200000000,
+    0xba2ff22d00000000, 0xb994c5c600000000, 0x87ff072900000000,
+    0xfee4dbcb00000000, 0xc08f192400000000, 0xc3342ecf00000000,
+    0xfd5fec2000000000, 0x988549f600000000, 0xa6ee8b1900000000,
+    0xa555bcf200000000, 0x9b3e7e1d00000000, 0xe225a2ff00000000,
+    0xdc4e601000000000, 0xdff557fb00000000, 0xe19e951400000000,
+    0x6cc59ee500000000, 0x52ae5c0a00000000, 0x51156be100000000,
+    0x6f7ea90e00000000, 0x166575ec00000000, 0x280eb70300000000,
+    0x2bb580e800000000, 0x15de420700000000, 0x010905e600000000,
+    0x3f62c70900000000, 0x3cd9f0e200000000, 0x02b2320d00000000,
+    0x7ba9eeef00000000, 0x45c22c0000000000, 0x46791beb00000000,
+    0x7812d90400000000, 0xf549d2f500000000, 0xcb22101a00000000,
+    0xc89927f100000000, 0xf6f2e51e00000000, 0x8fe939fc00000000,
+    0xb182fb1300000000, 0xb239ccf800000000, 0x8c520e1700000000,
+    0xe988abc100000000, 0xd7e3692e00000000, 0xd4585ec500000000,
+    0xea339c2a00000000, 0x932840c800000000, 0xad43822700000000,
+    0xaef8b5cc00000000, 0x9093772300000000, 0x1dc87cd200000000,
+    0x23a3be3d00000000, 0x201889d600000000, 0x1e734b3900000000,
+    0x676897db00000000, 0x5903553400000000, 0x5ab862df00000000,
+    0x64d3a03000000000, 0xd10a58a900000000, 0xef619a4600000000,
+    0xecdaadad00000000, 0xd2b16f4200000000, 0xabaab3a000000000,
+    0x95c1714f00000000, 0x967a46a400000000, 0xa811844b00000000,
+    0x254a8fba00000000, 0x1b214d5500000000, 0x189a7abe00000000,
+    0x26f1b85100000000, 0x5fea64b300000000, 0x6181a65c00000000,
+    0x623a91b700000000, 0x5c51535800000000, 0x398bf68e00000000,
+    0x07e0346100000000, 0x045b038a00000000, 0x3a30c16500000000,
+    0x432b1d8700000000, 0x7d40df6800000000, 0x7efbe88300000000,
+    0x40902a6c00000000, 0xcdcb219d00000000, 0xf3a0e37200000000,
+    0xf01bd49900000000, 0xce70167600000000, 0xb76bca9400000000,
+    0x8900087b00000000, 0x8abb3f9000000000, 0xb4d0fd7f00000000,
+    0xa10ebf7800000000, 0x9f657d9700000000, 0x9cde4a7c00000000,
+    0xa2b5889300000000, 0xdbae547100000000, 0xe5c5969e00000000,
+    0xe67ea17500000000, 0xd815639a00000000, 0x554e686b00000000,
+    0x6b25aa8400000000, 0x689e9d6f00000000, 0x56f55f8000000000,
+    0x2fee836200000000, 0x1185418d00000000, 0x123e766600000000,
+    0x2c55b48900000000, 0x498f115f00000000, 0x77e4d3b000000000,
+    0x745fe45b00000000, 0x4a3426b400000000, 0x332ffa5600000000,
+    0x0d4438b900000000, 0x0eff0f5200000000, 0x3094cdbd00000000,
+    0xbdcfc64c00000000, 0x83a404a300000000, 0x801f334800000000,
+    0xbe74f1a700000000, 0xc76f2d4500000000, 0xf904efaa00000000,
+    0xfabfd84100000000, 0xc4d41aae00000000, 0x710de23700000000,
+    0x4f6620d800000000, 0x4cdd173300000000, 0x72b6d5dc00000000,
+    0x0bad093e00000000, 0x35c6cbd100000000, 0x367dfc3a00000000,
+    0x08163ed500000000, 0x854d352400000000, 0xbb26f7cb00000000,
+    0xb89dc02000000000, 0x86f602cf00000000, 0xffedde2d00000000,
+    0xc1861cc200000000, 0xc23d2b2900000000, 0xfc56e9c600000000,
+    0x998c4c1000000000, 0xa7e78eff00000000, 0xa45cb91400000000,
+    0x9a377bfb00000000, 0xe32ca71900000000, 0xdd4765f600000000,
+    0xdefc521d00000000, 0xe09790f200000000, 0x6dcc9b0300000000,
+    0x53a759ec00000000, 0x501c6e0700000000, 0x6e77ace800000000,
+    0x176c700a00000000, 0x2907b2e500000000, 0x2abc850e00000000,
+    0x14d747e100000000},
+   {0x0000000000000000, 0xc0df8ec100000000, 0xc1b96c5800000000,
+    0x0166e29900000000, 0x8273d9b000000000, 0x42ac577100000000,
+    0x43cab5e800000000, 0x83153b2900000000, 0x45e1c3ba00000000,
+    0x853e4d7b00000000, 0x8458afe200000000, 0x4487212300000000,
+    0xc7921a0a00000000, 0x074d94cb00000000, 0x062b765200000000,
+    0xc6f4f89300000000, 0xcbc4f6ae00000000, 0x0b1b786f00000000,
+    0x0a7d9af600000000, 0xcaa2143700000000, 0x49b72f1e00000000,
+    0x8968a1df00000000, 0x880e434600000000, 0x48d1cd8700000000,
+    0x8e25351400000000, 0x4efabbd500000000, 0x4f9c594c00000000,
+    0x8f43d78d00000000, 0x0c56eca400000000, 0xcc89626500000000,
+    0xcdef80fc00000000, 0x0d300e3d00000000, 0xd78f9c8600000000,
+    0x1750124700000000, 0x1636f0de00000000, 0xd6e97e1f00000000,
+    0x55fc453600000000, 0x9523cbf700000000, 0x9445296e00000000,
+    0x549aa7af00000000, 0x926e5f3c00000000, 0x52b1d1fd00000000,
+    0x53d7336400000000, 0x9308bda500000000, 0x101d868c00000000,
+    0xd0c2084d00000000, 0xd1a4ead400000000, 0x117b641500000000,
+    0x1c4b6a2800000000, 0xdc94e4e900000000, 0xddf2067000000000,
+    0x1d2d88b100000000, 0x9e38b39800000000, 0x5ee73d5900000000,
+    0x5f81dfc000000000, 0x9f5e510100000000, 0x59aaa99200000000,
+    0x9975275300000000, 0x9813c5ca00000000, 0x58cc4b0b00000000,
+    0xdbd9702200000000, 0x1b06fee300000000, 0x1a601c7a00000000,
+    0xdabf92bb00000000, 0xef1948d600000000, 0x2fc6c61700000000,
+    0x2ea0248e00000000, 0xee7faa4f00000000, 0x6d6a916600000000,
+    0xadb51fa700000000, 0xacd3fd3e00000000, 0x6c0c73ff00000000,
+    0xaaf88b6c00000000, 0x6a2705ad00000000, 0x6b41e73400000000,
+    0xab9e69f500000000, 0x288b52dc00000000, 0xe854dc1d00000000,
+    0xe9323e8400000000, 0x29edb04500000000, 0x24ddbe7800000000,
+    0xe40230b900000000, 0xe564d22000000000, 0x25bb5ce100000000,
+    0xa6ae67c800000000, 0x6671e90900000000, 0x67170b9000000000,
+    0xa7c8855100000000, 0x613c7dc200000000, 0xa1e3f30300000000,
+    0xa085119a00000000, 0x605a9f5b00000000, 0xe34fa47200000000,
+    0x23902ab300000000, 0x22f6c82a00000000, 0xe22946eb00000000,
+    0x3896d45000000000, 0xf8495a9100000000, 0xf92fb80800000000,
+    0x39f036c900000000, 0xbae50de000000000, 0x7a3a832100000000,
+    0x7b5c61b800000000, 0xbb83ef7900000000, 0x7d7717ea00000000,
+    0xbda8992b00000000, 0xbcce7bb200000000, 0x7c11f57300000000,
+    0xff04ce5a00000000, 0x3fdb409b00000000, 0x3ebda20200000000,
+    0xfe622cc300000000, 0xf35222fe00000000, 0x338dac3f00000000,
+    0x32eb4ea600000000, 0xf234c06700000000, 0x7121fb4e00000000,
+    0xb1fe758f00000000, 0xb098971600000000, 0x704719d700000000,
+    0xb6b3e14400000000, 0x766c6f8500000000, 0x770a8d1c00000000,
+    0xb7d503dd00000000, 0x34c038f400000000, 0xf41fb63500000000,
+    0xf57954ac00000000, 0x35a6da6d00000000, 0x9f35e17700000000,
+    0x5fea6fb600000000, 0x5e8c8d2f00000000, 0x9e5303ee00000000,
+    0x1d4638c700000000, 0xdd99b60600000000, 0xdcff549f00000000,
+    0x1c20da5e00000000, 0xdad422cd00000000, 0x1a0bac0c00000000,
+    0x1b6d4e9500000000, 0xdbb2c05400000000, 0x58a7fb7d00000000,
+    0x987875bc00000000, 0x991e972500000000, 0x59c119e400000000,
+    0x54f117d900000000, 0x942e991800000000, 0x95487b8100000000,
+    0x5597f54000000000, 0xd682ce6900000000, 0x165d40a800000000,
+    0x173ba23100000000, 0xd7e42cf000000000, 0x1110d46300000000,
+    0xd1cf5aa200000000, 0xd0a9b83b00000000, 0x107636fa00000000,
+    0x93630dd300000000, 0x53bc831200000000, 0x52da618b00000000,
+    0x9205ef4a00000000, 0x48ba7df100000000, 0x8865f33000000000,
+    0x890311a900000000, 0x49dc9f6800000000, 0xcac9a44100000000,
+    0x0a162a8000000000, 0x0b70c81900000000, 0xcbaf46d800000000,
+    0x0d5bbe4b00000000, 0xcd84308a00000000, 0xcce2d21300000000,
+    0x0c3d5cd200000000, 0x8f2867fb00000000, 0x4ff7e93a00000000,
+    0x4e910ba300000000, 0x8e4e856200000000, 0x837e8b5f00000000,
+    0x43a1059e00000000, 0x42c7e70700000000, 0x821869c600000000,
+    0x010d52ef00000000, 0xc1d2dc2e00000000, 0xc0b43eb700000000,
+    0x006bb07600000000, 0xc69f48e500000000, 0x0640c62400000000,
+    0x072624bd00000000, 0xc7f9aa7c00000000, 0x44ec915500000000,
+    0x84331f9400000000, 0x8555fd0d00000000, 0x458a73cc00000000,
+    0x702ca9a100000000, 0xb0f3276000000000, 0xb195c5f900000000,
+    0x714a4b3800000000, 0xf25f701100000000, 0x3280fed000000000,
+    0x33e61c4900000000, 0xf339928800000000, 0x35cd6a1b00000000,
+    0xf512e4da00000000, 0xf474064300000000, 0x34ab888200000000,
+    0xb7beb3ab00000000, 0x77613d6a00000000, 0x7607dff300000000,
+    0xb6d8513200000000, 0xbbe85f0f00000000, 0x7b37d1ce00000000,
+    0x7a51335700000000, 0xba8ebd9600000000, 0x399b86bf00000000,
+    0xf944087e00000000, 0xf822eae700000000, 0x38fd642600000000,
+    0xfe099cb500000000, 0x3ed6127400000000, 0x3fb0f0ed00000000,
+    0xff6f7e2c00000000, 0x7c7a450500000000, 0xbca5cbc400000000,
+    0xbdc3295d00000000, 0x7d1ca79c00000000, 0xa7a3352700000000,
+    0x677cbbe600000000, 0x661a597f00000000, 0xa6c5d7be00000000,
+    0x25d0ec9700000000, 0xe50f625600000000, 0xe46980cf00000000,
+    0x24b60e0e00000000, 0xe242f69d00000000, 0x229d785c00000000,
+    0x23fb9ac500000000, 0xe324140400000000, 0x60312f2d00000000,
+    0xa0eea1ec00000000, 0xa188437500000000, 0x6157cdb400000000,
+    0x6c67c38900000000, 0xacb84d4800000000, 0xaddeafd100000000,
+    0x6d01211000000000, 0xee141a3900000000, 0x2ecb94f800000000,
+    0x2fad766100000000, 0xef72f8a000000000, 0x2986003300000000,
+    0xe9598ef200000000, 0xe83f6c6b00000000, 0x28e0e2aa00000000,
+    0xabf5d98300000000, 0x6b2a574200000000, 0x6a4cb5db00000000,
+    0xaa933b1a00000000},
+   {0x0000000000000000, 0x6f4ca59b00000000, 0x9f9e3bec00000000,
+    0xf0d29e7700000000, 0x7f3b060300000000, 0x1077a39800000000,
+    0xe0a53def00000000, 0x8fe9987400000000, 0xfe760c0600000000,
+    0x913aa99d00000000, 0x61e837ea00000000, 0x0ea4927100000000,
+    0x814d0a0500000000, 0xee01af9e00000000, 0x1ed331e900000000,
+    0x719f947200000000, 0xfced180c00000000, 0x93a1bd9700000000,
+    0x637323e000000000, 0x0c3f867b00000000, 0x83d61e0f00000000,
+    0xec9abb9400000000, 0x1c4825e300000000, 0x7304807800000000,
+    0x029b140a00000000, 0x6dd7b19100000000, 0x9d052fe600000000,
+    0xf2498a7d00000000, 0x7da0120900000000, 0x12ecb79200000000,
+    0xe23e29e500000000, 0x8d728c7e00000000, 0xf8db311800000000,
+    0x9797948300000000, 0x67450af400000000, 0x0809af6f00000000,
+    0x87e0371b00000000, 0xe8ac928000000000, 0x187e0cf700000000,
+    0x7732a96c00000000, 0x06ad3d1e00000000, 0x69e1988500000000,
+    0x993306f200000000, 0xf67fa36900000000, 0x79963b1d00000000,
+    0x16da9e8600000000, 0xe60800f100000000, 0x8944a56a00000000,
+    0x0436291400000000, 0x6b7a8c8f00000000, 0x9ba812f800000000,
+    0xf4e4b76300000000, 0x7b0d2f1700000000, 0x14418a8c00000000,
+    0xe49314fb00000000, 0x8bdfb16000000000, 0xfa40251200000000,
+    0x950c808900000000, 0x65de1efe00000000, 0x0a92bb6500000000,
+    0x857b231100000000, 0xea37868a00000000, 0x1ae518fd00000000,
+    0x75a9bd6600000000, 0xf0b7633000000000, 0x9ffbc6ab00000000,
+    0x6f2958dc00000000, 0x0065fd4700000000, 0x8f8c653300000000,
+    0xe0c0c0a800000000, 0x10125edf00000000, 0x7f5efb4400000000,
+    0x0ec16f3600000000, 0x618dcaad00000000, 0x915f54da00000000,
+    0xfe13f14100000000, 0x71fa693500000000, 0x1eb6ccae00000000,
+    0xee6452d900000000, 0x8128f74200000000, 0x0c5a7b3c00000000,
+    0x6316dea700000000, 0x93c440d000000000, 0xfc88e54b00000000,
+    0x73617d3f00000000, 0x1c2dd8a400000000, 0xecff46d300000000,
+    0x83b3e34800000000, 0xf22c773a00000000, 0x9d60d2a100000000,
+    0x6db24cd600000000, 0x02fee94d00000000, 0x8d17713900000000,
+    0xe25bd4a200000000, 0x12894ad500000000, 0x7dc5ef4e00000000,
+    0x086c522800000000, 0x6720f7b300000000, 0x97f269c400000000,
+    0xf8becc5f00000000, 0x7757542b00000000, 0x181bf1b000000000,
+    0xe8c96fc700000000, 0x8785ca5c00000000, 0xf61a5e2e00000000,
+    0x9956fbb500000000, 0x698465c200000000, 0x06c8c05900000000,
+    0x8921582d00000000, 0xe66dfdb600000000, 0x16bf63c100000000,
+    0x79f3c65a00000000, 0xf4814a2400000000, 0x9bcdefbf00000000,
+    0x6b1f71c800000000, 0x0453d45300000000, 0x8bba4c2700000000,
+    0xe4f6e9bc00000000, 0x142477cb00000000, 0x7b68d25000000000,
+    0x0af7462200000000, 0x65bbe3b900000000, 0x95697dce00000000,
+    0xfa25d85500000000, 0x75cc402100000000, 0x1a80e5ba00000000,
+    0xea527bcd00000000, 0x851ede5600000000, 0xe06fc76000000000,
+    0x8f2362fb00000000, 0x7ff1fc8c00000000, 0x10bd591700000000,
+    0x9f54c16300000000, 0xf01864f800000000, 0x00cafa8f00000000,
+    0x6f865f1400000000, 0x1e19cb6600000000, 0x71556efd00000000,
+    0x8187f08a00000000, 0xeecb551100000000, 0x6122cd6500000000,
+    0x0e6e68fe00000000, 0xfebcf68900000000, 0x91f0531200000000,
+    0x1c82df6c00000000, 0x73ce7af700000000, 0x831ce48000000000,
+    0xec50411b00000000, 0x63b9d96f00000000, 0x0cf57cf400000000,
+    0xfc27e28300000000, 0x936b471800000000, 0xe2f4d36a00000000,
+    0x8db876f100000000, 0x7d6ae88600000000, 0x12264d1d00000000,
+    0x9dcfd56900000000, 0xf28370f200000000, 0x0251ee8500000000,
+    0x6d1d4b1e00000000, 0x18b4f67800000000, 0x77f853e300000000,
+    0x872acd9400000000, 0xe866680f00000000, 0x678ff07b00000000,
+    0x08c355e000000000, 0xf811cb9700000000, 0x975d6e0c00000000,
+    0xe6c2fa7e00000000, 0x898e5fe500000000, 0x795cc19200000000,
+    0x1610640900000000, 0x99f9fc7d00000000, 0xf6b559e600000000,
+    0x0667c79100000000, 0x692b620a00000000, 0xe459ee7400000000,
+    0x8b154bef00000000, 0x7bc7d59800000000, 0x148b700300000000,
+    0x9b62e87700000000, 0xf42e4dec00000000, 0x04fcd39b00000000,
+    0x6bb0760000000000, 0x1a2fe27200000000, 0x756347e900000000,
+    0x85b1d99e00000000, 0xeafd7c0500000000, 0x6514e47100000000,
+    0x0a5841ea00000000, 0xfa8adf9d00000000, 0x95c67a0600000000,
+    0x10d8a45000000000, 0x7f9401cb00000000, 0x8f469fbc00000000,
+    0xe00a3a2700000000, 0x6fe3a25300000000, 0x00af07c800000000,
+    0xf07d99bf00000000, 0x9f313c2400000000, 0xeeaea85600000000,
+    0x81e20dcd00000000, 0x713093ba00000000, 0x1e7c362100000000,
+    0x9195ae5500000000, 0xfed90bce00000000, 0x0e0b95b900000000,
+    0x6147302200000000, 0xec35bc5c00000000, 0x837919c700000000,
+    0x73ab87b000000000, 0x1ce7222b00000000, 0x930eba5f00000000,
+    0xfc421fc400000000, 0x0c9081b300000000, 0x63dc242800000000,
+    0x1243b05a00000000, 0x7d0f15c100000000, 0x8ddd8bb600000000,
+    0xe2912e2d00000000, 0x6d78b65900000000, 0x023413c200000000,
+    0xf2e68db500000000, 0x9daa282e00000000, 0xe803954800000000,
+    0x874f30d300000000, 0x779daea400000000, 0x18d10b3f00000000,
+    0x9738934b00000000, 0xf87436d000000000, 0x08a6a8a700000000,
+    0x67ea0d3c00000000, 0x1675994e00000000, 0x79393cd500000000,
+    0x89eba2a200000000, 0xe6a7073900000000, 0x694e9f4d00000000,
+    0x06023ad600000000, 0xf6d0a4a100000000, 0x999c013a00000000,
+    0x14ee8d4400000000, 0x7ba228df00000000, 0x8b70b6a800000000,
+    0xe43c133300000000, 0x6bd58b4700000000, 0x04992edc00000000,
+    0xf44bb0ab00000000, 0x9b07153000000000, 0xea98814200000000,
+    0x85d424d900000000, 0x7506baae00000000, 0x1a4a1f3500000000,
+    0x95a3874100000000, 0xfaef22da00000000, 0x0a3dbcad00000000,
+    0x6571193600000000},
+   {0x0000000000000000, 0x85d996dd00000000, 0x4bb55c6000000000,
+    0xce6ccabd00000000, 0x966ab9c000000000, 0x13b32f1d00000000,
+    0xdddfe5a000000000, 0x5806737d00000000, 0x6dd3035a00000000,
+    0xe80a958700000000, 0x26665f3a00000000, 0xa3bfc9e700000000,
+    0xfbb9ba9a00000000, 0x7e602c4700000000, 0xb00ce6fa00000000,
+    0x35d5702700000000, 0xdaa607b400000000, 0x5f7f916900000000,
+    0x91135bd400000000, 0x14cacd0900000000, 0x4cccbe7400000000,
+    0xc91528a900000000, 0x0779e21400000000, 0x82a074c900000000,
+    0xb77504ee00000000, 0x32ac923300000000, 0xfcc0588e00000000,
+    0x7919ce5300000000, 0x211fbd2e00000000, 0xa4c62bf300000000,
+    0x6aaae14e00000000, 0xef73779300000000, 0xf54b7eb300000000,
+    0x7092e86e00000000, 0xbefe22d300000000, 0x3b27b40e00000000,
+    0x6321c77300000000, 0xe6f851ae00000000, 0x28949b1300000000,
+    0xad4d0dce00000000, 0x98987de900000000, 0x1d41eb3400000000,
+    0xd32d218900000000, 0x56f4b75400000000, 0x0ef2c42900000000,
+    0x8b2b52f400000000, 0x4547984900000000, 0xc09e0e9400000000,
+    0x2fed790700000000, 0xaa34efda00000000, 0x6458256700000000,
+    0xe181b3ba00000000, 0xb987c0c700000000, 0x3c5e561a00000000,
+    0xf2329ca700000000, 0x77eb0a7a00000000, 0x423e7a5d00000000,
+    0xc7e7ec8000000000, 0x098b263d00000000, 0x8c52b0e000000000,
+    0xd454c39d00000000, 0x518d554000000000, 0x9fe19ffd00000000,
+    0x1a38092000000000, 0xab918dbd00000000, 0x2e481b6000000000,
+    0xe024d1dd00000000, 0x65fd470000000000, 0x3dfb347d00000000,
+    0xb822a2a000000000, 0x764e681d00000000, 0xf397fec000000000,
+    0xc6428ee700000000, 0x439b183a00000000, 0x8df7d28700000000,
+    0x082e445a00000000, 0x5028372700000000, 0xd5f1a1fa00000000,
+    0x1b9d6b4700000000, 0x9e44fd9a00000000, 0x71378a0900000000,
+    0xf4ee1cd400000000, 0x3a82d66900000000, 0xbf5b40b400000000,
+    0xe75d33c900000000, 0x6284a51400000000, 0xace86fa900000000,
+    0x2931f97400000000, 0x1ce4895300000000, 0x993d1f8e00000000,
+    0x5751d53300000000, 0xd28843ee00000000, 0x8a8e309300000000,
+    0x0f57a64e00000000, 0xc13b6cf300000000, 0x44e2fa2e00000000,
+    0x5edaf30e00000000, 0xdb0365d300000000, 0x156faf6e00000000,
+    0x90b639b300000000, 0xc8b04ace00000000, 0x4d69dc1300000000,
+    0x830516ae00000000, 0x06dc807300000000, 0x3309f05400000000,
+    0xb6d0668900000000, 0x78bcac3400000000, 0xfd653ae900000000,
+    0xa563499400000000, 0x20badf4900000000, 0xeed615f400000000,
+    0x6b0f832900000000, 0x847cf4ba00000000, 0x01a5626700000000,
+    0xcfc9a8da00000000, 0x4a103e0700000000, 0x12164d7a00000000,
+    0x97cfdba700000000, 0x59a3111a00000000, 0xdc7a87c700000000,
+    0xe9aff7e000000000, 0x6c76613d00000000, 0xa21aab8000000000,
+    0x27c33d5d00000000, 0x7fc54e2000000000, 0xfa1cd8fd00000000,
+    0x3470124000000000, 0xb1a9849d00000000, 0x17256aa000000000,
+    0x92fcfc7d00000000, 0x5c9036c000000000, 0xd949a01d00000000,
+    0x814fd36000000000, 0x049645bd00000000, 0xcafa8f0000000000,
+    0x4f2319dd00000000, 0x7af669fa00000000, 0xff2fff2700000000,
+    0x3143359a00000000, 0xb49aa34700000000, 0xec9cd03a00000000,
+    0x694546e700000000, 0xa7298c5a00000000, 0x22f01a8700000000,
+    0xcd836d1400000000, 0x485afbc900000000, 0x8636317400000000,
+    0x03efa7a900000000, 0x5be9d4d400000000, 0xde30420900000000,
+    0x105c88b400000000, 0x95851e6900000000, 0xa0506e4e00000000,
+    0x2589f89300000000, 0xebe5322e00000000, 0x6e3ca4f300000000,
+    0x363ad78e00000000, 0xb3e3415300000000, 0x7d8f8bee00000000,
+    0xf8561d3300000000, 0xe26e141300000000, 0x67b782ce00000000,
+    0xa9db487300000000, 0x2c02deae00000000, 0x7404add300000000,
+    0xf1dd3b0e00000000, 0x3fb1f1b300000000, 0xba68676e00000000,
+    0x8fbd174900000000, 0x0a64819400000000, 0xc4084b2900000000,
+    0x41d1ddf400000000, 0x19d7ae8900000000, 0x9c0e385400000000,
+    0x5262f2e900000000, 0xd7bb643400000000, 0x38c813a700000000,
+    0xbd11857a00000000, 0x737d4fc700000000, 0xf6a4d91a00000000,
+    0xaea2aa6700000000, 0x2b7b3cba00000000, 0xe517f60700000000,
+    0x60ce60da00000000, 0x551b10fd00000000, 0xd0c2862000000000,
+    0x1eae4c9d00000000, 0x9b77da4000000000, 0xc371a93d00000000,
+    0x46a83fe000000000, 0x88c4f55d00000000, 0x0d1d638000000000,
+    0xbcb4e71d00000000, 0x396d71c000000000, 0xf701bb7d00000000,
+    0x72d82da000000000, 0x2ade5edd00000000, 0xaf07c80000000000,
+    0x616b02bd00000000, 0xe4b2946000000000, 0xd167e44700000000,
+    0x54be729a00000000, 0x9ad2b82700000000, 0x1f0b2efa00000000,
+    0x470d5d8700000000, 0xc2d4cb5a00000000, 0x0cb801e700000000,
+    0x8961973a00000000, 0x6612e0a900000000, 0xe3cb767400000000,
+    0x2da7bcc900000000, 0xa87e2a1400000000, 0xf078596900000000,
+    0x75a1cfb400000000, 0xbbcd050900000000, 0x3e1493d400000000,
+    0x0bc1e3f300000000, 0x8e18752e00000000, 0x4074bf9300000000,
+    0xc5ad294e00000000, 0x9dab5a3300000000, 0x1872ccee00000000,
+    0xd61e065300000000, 0x53c7908e00000000, 0x49ff99ae00000000,
+    0xcc260f7300000000, 0x024ac5ce00000000, 0x8793531300000000,
+    0xdf95206e00000000, 0x5a4cb6b300000000, 0x94207c0e00000000,
+    0x11f9ead300000000, 0x242c9af400000000, 0xa1f50c2900000000,
+    0x6f99c69400000000, 0xea40504900000000, 0xb246233400000000,
+    0x379fb5e900000000, 0xf9f37f5400000000, 0x7c2ae98900000000,
+    0x93599e1a00000000, 0x168008c700000000, 0xd8ecc27a00000000,
+    0x5d3554a700000000, 0x053327da00000000, 0x80eab10700000000,
+    0x4e867bba00000000, 0xcb5fed6700000000, 0xfe8a9d4000000000,
+    0x7b530b9d00000000, 0xb53fc12000000000, 0x30e657fd00000000,
+    0x68e0248000000000, 0xed39b25d00000000, 0x235578e000000000,
+    0xa68cee3d00000000},
+   {0x0000000000000000, 0x76e10f9d00000000, 0xadc46ee100000000,
+    0xdb25617c00000000, 0x1b8fac1900000000, 0x6d6ea38400000000,
+    0xb64bc2f800000000, 0xc0aacd6500000000, 0x361e593300000000,
+    0x40ff56ae00000000, 0x9bda37d200000000, 0xed3b384f00000000,
+    0x2d91f52a00000000, 0x5b70fab700000000, 0x80559bcb00000000,
+    0xf6b4945600000000, 0x6c3cb26600000000, 0x1addbdfb00000000,
+    0xc1f8dc8700000000, 0xb719d31a00000000, 0x77b31e7f00000000,
+    0x015211e200000000, 0xda77709e00000000, 0xac967f0300000000,
+    0x5a22eb5500000000, 0x2cc3e4c800000000, 0xf7e685b400000000,
+    0x81078a2900000000, 0x41ad474c00000000, 0x374c48d100000000,
+    0xec6929ad00000000, 0x9a88263000000000, 0xd87864cd00000000,
+    0xae996b5000000000, 0x75bc0a2c00000000, 0x035d05b100000000,
+    0xc3f7c8d400000000, 0xb516c74900000000, 0x6e33a63500000000,
+    0x18d2a9a800000000, 0xee663dfe00000000, 0x9887326300000000,
+    0x43a2531f00000000, 0x35435c8200000000, 0xf5e991e700000000,
+    0x83089e7a00000000, 0x582dff0600000000, 0x2eccf09b00000000,
+    0xb444d6ab00000000, 0xc2a5d93600000000, 0x1980b84a00000000,
+    0x6f61b7d700000000, 0xafcb7ab200000000, 0xd92a752f00000000,
+    0x020f145300000000, 0x74ee1bce00000000, 0x825a8f9800000000,
+    0xf4bb800500000000, 0x2f9ee17900000000, 0x597feee400000000,
+    0x99d5238100000000, 0xef342c1c00000000, 0x34114d6000000000,
+    0x42f042fd00000000, 0xf1f7b94100000000, 0x8716b6dc00000000,
+    0x5c33d7a000000000, 0x2ad2d83d00000000, 0xea78155800000000,
+    0x9c991ac500000000, 0x47bc7bb900000000, 0x315d742400000000,
+    0xc7e9e07200000000, 0xb108efef00000000, 0x6a2d8e9300000000,
+    0x1ccc810e00000000, 0xdc664c6b00000000, 0xaa8743f600000000,
+    0x71a2228a00000000, 0x07432d1700000000, 0x9dcb0b2700000000,
+    0xeb2a04ba00000000, 0x300f65c600000000, 0x46ee6a5b00000000,
+    0x8644a73e00000000, 0xf0a5a8a300000000, 0x2b80c9df00000000,
+    0x5d61c64200000000, 0xabd5521400000000, 0xdd345d8900000000,
+    0x06113cf500000000, 0x70f0336800000000, 0xb05afe0d00000000,
+    0xc6bbf19000000000, 0x1d9e90ec00000000, 0x6b7f9f7100000000,
+    0x298fdd8c00000000, 0x5f6ed21100000000, 0x844bb36d00000000,
+    0xf2aabcf000000000, 0x3200719500000000, 0x44e17e0800000000,
+    0x9fc41f7400000000, 0xe92510e900000000, 0x1f9184bf00000000,
+    0x69708b2200000000, 0xb255ea5e00000000, 0xc4b4e5c300000000,
+    0x041e28a600000000, 0x72ff273b00000000, 0xa9da464700000000,
+    0xdf3b49da00000000, 0x45b36fea00000000, 0x3352607700000000,
+    0xe877010b00000000, 0x9e960e9600000000, 0x5e3cc3f300000000,
+    0x28ddcc6e00000000, 0xf3f8ad1200000000, 0x8519a28f00000000,
+    0x73ad36d900000000, 0x054c394400000000, 0xde69583800000000,
+    0xa88857a500000000, 0x68229ac000000000, 0x1ec3955d00000000,
+    0xc5e6f42100000000, 0xb307fbbc00000000, 0xe2ef738300000000,
+    0x940e7c1e00000000, 0x4f2b1d6200000000, 0x39ca12ff00000000,
+    0xf960df9a00000000, 0x8f81d00700000000, 0x54a4b17b00000000,
+    0x2245bee600000000, 0xd4f12ab000000000, 0xa210252d00000000,
+    0x7935445100000000, 0x0fd44bcc00000000, 0xcf7e86a900000000,
+    0xb99f893400000000, 0x62bae84800000000, 0x145be7d500000000,
+    0x8ed3c1e500000000, 0xf832ce7800000000, 0x2317af0400000000,
+    0x55f6a09900000000, 0x955c6dfc00000000, 0xe3bd626100000000,
+    0x3898031d00000000, 0x4e790c8000000000, 0xb8cd98d600000000,
+    0xce2c974b00000000, 0x1509f63700000000, 0x63e8f9aa00000000,
+    0xa34234cf00000000, 0xd5a33b5200000000, 0x0e865a2e00000000,
+    0x786755b300000000, 0x3a97174e00000000, 0x4c7618d300000000,
+    0x975379af00000000, 0xe1b2763200000000, 0x2118bb5700000000,
+    0x57f9b4ca00000000, 0x8cdcd5b600000000, 0xfa3dda2b00000000,
+    0x0c894e7d00000000, 0x7a6841e000000000, 0xa14d209c00000000,
+    0xd7ac2f0100000000, 0x1706e26400000000, 0x61e7edf900000000,
+    0xbac28c8500000000, 0xcc23831800000000, 0x56aba52800000000,
+    0x204aaab500000000, 0xfb6fcbc900000000, 0x8d8ec45400000000,
+    0x4d24093100000000, 0x3bc506ac00000000, 0xe0e067d000000000,
+    0x9601684d00000000, 0x60b5fc1b00000000, 0x1654f38600000000,
+    0xcd7192fa00000000, 0xbb909d6700000000, 0x7b3a500200000000,
+    0x0ddb5f9f00000000, 0xd6fe3ee300000000, 0xa01f317e00000000,
+    0x1318cac200000000, 0x65f9c55f00000000, 0xbedca42300000000,
+    0xc83dabbe00000000, 0x089766db00000000, 0x7e76694600000000,
+    0xa553083a00000000, 0xd3b207a700000000, 0x250693f100000000,
+    0x53e79c6c00000000, 0x88c2fd1000000000, 0xfe23f28d00000000,
+    0x3e893fe800000000, 0x4868307500000000, 0x934d510900000000,
+    0xe5ac5e9400000000, 0x7f2478a400000000, 0x09c5773900000000,
+    0xd2e0164500000000, 0xa40119d800000000, 0x64abd4bd00000000,
+    0x124adb2000000000, 0xc96fba5c00000000, 0xbf8eb5c100000000,
+    0x493a219700000000, 0x3fdb2e0a00000000, 0xe4fe4f7600000000,
+    0x921f40eb00000000, 0x52b58d8e00000000, 0x2454821300000000,
+    0xff71e36f00000000, 0x8990ecf200000000, 0xcb60ae0f00000000,
+    0xbd81a19200000000, 0x66a4c0ee00000000, 0x1045cf7300000000,
+    0xd0ef021600000000, 0xa60e0d8b00000000, 0x7d2b6cf700000000,
+    0x0bca636a00000000, 0xfd7ef73c00000000, 0x8b9ff8a100000000,
+    0x50ba99dd00000000, 0x265b964000000000, 0xe6f15b2500000000,
+    0x901054b800000000, 0x4b3535c400000000, 0x3dd43a5900000000,
+    0xa75c1c6900000000, 0xd1bd13f400000000, 0x0a98728800000000,
+    0x7c797d1500000000, 0xbcd3b07000000000, 0xca32bfed00000000,
+    0x1117de9100000000, 0x67f6d10c00000000, 0x9142455a00000000,
+    0xe7a34ac700000000, 0x3c862bbb00000000, 0x4a67242600000000,
+    0x8acde94300000000, 0xfc2ce6de00000000, 0x270987a200000000,
+    0x51e8883f00000000},
+   {0x0000000000000000, 0xe8dbfbb900000000, 0x91b186a800000000,
+    0x796a7d1100000000, 0x63657c8a00000000, 0x8bbe873300000000,
+    0xf2d4fa2200000000, 0x1a0f019b00000000, 0x87cc89cf00000000,
+    0x6f17727600000000, 0x167d0f6700000000, 0xfea6f4de00000000,
+    0xe4a9f54500000000, 0x0c720efc00000000, 0x751873ed00000000,
+    0x9dc3885400000000, 0x4f9f624400000000, 0xa74499fd00000000,
+    0xde2ee4ec00000000, 0x36f51f5500000000, 0x2cfa1ece00000000,
+    0xc421e57700000000, 0xbd4b986600000000, 0x559063df00000000,
+    0xc853eb8b00000000, 0x2088103200000000, 0x59e26d2300000000,
+    0xb139969a00000000, 0xab36970100000000, 0x43ed6cb800000000,
+    0x3a8711a900000000, 0xd25cea1000000000, 0x9e3ec58800000000,
+    0x76e53e3100000000, 0x0f8f432000000000, 0xe754b89900000000,
+    0xfd5bb90200000000, 0x158042bb00000000, 0x6cea3faa00000000,
+    0x8431c41300000000, 0x19f24c4700000000, 0xf129b7fe00000000,
+    0x8843caef00000000, 0x6098315600000000, 0x7a9730cd00000000,
+    0x924ccb7400000000, 0xeb26b66500000000, 0x03fd4ddc00000000,
+    0xd1a1a7cc00000000, 0x397a5c7500000000, 0x4010216400000000,
+    0xa8cbdadd00000000, 0xb2c4db4600000000, 0x5a1f20ff00000000,
+    0x23755dee00000000, 0xcbaea65700000000, 0x566d2e0300000000,
+    0xbeb6d5ba00000000, 0xc7dca8ab00000000, 0x2f07531200000000,
+    0x3508528900000000, 0xddd3a93000000000, 0xa4b9d42100000000,
+    0x4c622f9800000000, 0x7d7bfbca00000000, 0x95a0007300000000,
+    0xecca7d6200000000, 0x041186db00000000, 0x1e1e874000000000,
+    0xf6c57cf900000000, 0x8faf01e800000000, 0x6774fa5100000000,
+    0xfab7720500000000, 0x126c89bc00000000, 0x6b06f4ad00000000,
+    0x83dd0f1400000000, 0x99d20e8f00000000, 0x7109f53600000000,
+    0x0863882700000000, 0xe0b8739e00000000, 0x32e4998e00000000,
+    0xda3f623700000000, 0xa3551f2600000000, 0x4b8ee49f00000000,
+    0x5181e50400000000, 0xb95a1ebd00000000, 0xc03063ac00000000,
+    0x28eb981500000000, 0xb528104100000000, 0x5df3ebf800000000,
+    0x249996e900000000, 0xcc426d5000000000, 0xd64d6ccb00000000,
+    0x3e96977200000000, 0x47fcea6300000000, 0xaf2711da00000000,
+    0xe3453e4200000000, 0x0b9ec5fb00000000, 0x72f4b8ea00000000,
+    0x9a2f435300000000, 0x802042c800000000, 0x68fbb97100000000,
+    0x1191c46000000000, 0xf94a3fd900000000, 0x6489b78d00000000,
+    0x8c524c3400000000, 0xf538312500000000, 0x1de3ca9c00000000,
+    0x07eccb0700000000, 0xef3730be00000000, 0x965d4daf00000000,
+    0x7e86b61600000000, 0xacda5c0600000000, 0x4401a7bf00000000,
+    0x3d6bdaae00000000, 0xd5b0211700000000, 0xcfbf208c00000000,
+    0x2764db3500000000, 0x5e0ea62400000000, 0xb6d55d9d00000000,
+    0x2b16d5c900000000, 0xc3cd2e7000000000, 0xbaa7536100000000,
+    0x527ca8d800000000, 0x4873a94300000000, 0xa0a852fa00000000,
+    0xd9c22feb00000000, 0x3119d45200000000, 0xbbf0874e00000000,
+    0x532b7cf700000000, 0x2a4101e600000000, 0xc29afa5f00000000,
+    0xd895fbc400000000, 0x304e007d00000000, 0x49247d6c00000000,
+    0xa1ff86d500000000, 0x3c3c0e8100000000, 0xd4e7f53800000000,
+    0xad8d882900000000, 0x4556739000000000, 0x5f59720b00000000,
+    0xb78289b200000000, 0xcee8f4a300000000, 0x26330f1a00000000,
+    0xf46fe50a00000000, 0x1cb41eb300000000, 0x65de63a200000000,
+    0x8d05981b00000000, 0x970a998000000000, 0x7fd1623900000000,
+    0x06bb1f2800000000, 0xee60e49100000000, 0x73a36cc500000000,
+    0x9b78977c00000000, 0xe212ea6d00000000, 0x0ac911d400000000,
+    0x10c6104f00000000, 0xf81debf600000000, 0x817796e700000000,
+    0x69ac6d5e00000000, 0x25ce42c600000000, 0xcd15b97f00000000,
+    0xb47fc46e00000000, 0x5ca43fd700000000, 0x46ab3e4c00000000,
+    0xae70c5f500000000, 0xd71ab8e400000000, 0x3fc1435d00000000,
+    0xa202cb0900000000, 0x4ad930b000000000, 0x33b34da100000000,
+    0xdb68b61800000000, 0xc167b78300000000, 0x29bc4c3a00000000,
+    0x50d6312b00000000, 0xb80dca9200000000, 0x6a51208200000000,
+    0x828adb3b00000000, 0xfbe0a62a00000000, 0x133b5d9300000000,
+    0x09345c0800000000, 0xe1efa7b100000000, 0x9885daa000000000,
+    0x705e211900000000, 0xed9da94d00000000, 0x054652f400000000,
+    0x7c2c2fe500000000, 0x94f7d45c00000000, 0x8ef8d5c700000000,
+    0x66232e7e00000000, 0x1f49536f00000000, 0xf792a8d600000000,
+    0xc68b7c8400000000, 0x2e50873d00000000, 0x573afa2c00000000,
+    0xbfe1019500000000, 0xa5ee000e00000000, 0x4d35fbb700000000,
+    0x345f86a600000000, 0xdc847d1f00000000, 0x4147f54b00000000,
+    0xa99c0ef200000000, 0xd0f673e300000000, 0x382d885a00000000,
+    0x222289c100000000, 0xcaf9727800000000, 0xb3930f6900000000,
+    0x5b48f4d000000000, 0x89141ec000000000, 0x61cfe57900000000,
+    0x18a5986800000000, 0xf07e63d100000000, 0xea71624a00000000,
+    0x02aa99f300000000, 0x7bc0e4e200000000, 0x931b1f5b00000000,
+    0x0ed8970f00000000, 0xe6036cb600000000, 0x9f6911a700000000,
+    0x77b2ea1e00000000, 0x6dbdeb8500000000, 0x8566103c00000000,
+    0xfc0c6d2d00000000, 0x14d7969400000000, 0x58b5b90c00000000,
+    0xb06e42b500000000, 0xc9043fa400000000, 0x21dfc41d00000000,
+    0x3bd0c58600000000, 0xd30b3e3f00000000, 0xaa61432e00000000,
+    0x42bab89700000000, 0xdf7930c300000000, 0x37a2cb7a00000000,
+    0x4ec8b66b00000000, 0xa6134dd200000000, 0xbc1c4c4900000000,
+    0x54c7b7f000000000, 0x2dadcae100000000, 0xc576315800000000,
+    0x172adb4800000000, 0xfff120f100000000, 0x869b5de000000000,
+    0x6e40a65900000000, 0x744fa7c200000000, 0x9c945c7b00000000,
+    0xe5fe216a00000000, 0x0d25dad300000000, 0x90e6528700000000,
+    0x783da93e00000000, 0x0157d42f00000000, 0xe98c2f9600000000,
+    0xf3832e0d00000000, 0x1b58d5b400000000, 0x6232a8a500000000,
+    0x8ae9531c00000000},
+   {0x0000000000000000, 0x919168ae00000000, 0x6325a08700000000,
+    0xf2b4c82900000000, 0x874c31d400000000, 0x16dd597a00000000,
+    0xe469915300000000, 0x75f8f9fd00000000, 0x4f9f137300000000,
+    0xde0e7bdd00000000, 0x2cbab3f400000000, 0xbd2bdb5a00000000,
+    0xc8d322a700000000, 0x59424a0900000000, 0xabf6822000000000,
+    0x3a67ea8e00000000, 0x9e3e27e600000000, 0x0faf4f4800000000,
+    0xfd1b876100000000, 0x6c8aefcf00000000, 0x1972163200000000,
+    0x88e37e9c00000000, 0x7a57b6b500000000, 0xebc6de1b00000000,
+    0xd1a1349500000000, 0x40305c3b00000000, 0xb284941200000000,
+    0x2315fcbc00000000, 0x56ed054100000000, 0xc77c6def00000000,
+    0x35c8a5c600000000, 0xa459cd6800000000, 0x7d7b3f1700000000,
+    0xecea57b900000000, 0x1e5e9f9000000000, 0x8fcff73e00000000,
+    0xfa370ec300000000, 0x6ba6666d00000000, 0x9912ae4400000000,
+    0x0883c6ea00000000, 0x32e42c6400000000, 0xa37544ca00000000,
+    0x51c18ce300000000, 0xc050e44d00000000, 0xb5a81db000000000,
+    0x2439751e00000000, 0xd68dbd3700000000, 0x471cd59900000000,
+    0xe34518f100000000, 0x72d4705f00000000, 0x8060b87600000000,
+    0x11f1d0d800000000, 0x6409292500000000, 0xf598418b00000000,
+    0x072c89a200000000, 0x96bde10c00000000, 0xacda0b8200000000,
+    0x3d4b632c00000000, 0xcfffab0500000000, 0x5e6ec3ab00000000,
+    0x2b963a5600000000, 0xba0752f800000000, 0x48b39ad100000000,
+    0xd922f27f00000000, 0xfaf67e2e00000000, 0x6b67168000000000,
+    0x99d3dea900000000, 0x0842b60700000000, 0x7dba4ffa00000000,
+    0xec2b275400000000, 0x1e9fef7d00000000, 0x8f0e87d300000000,
+    0xb5696d5d00000000, 0x24f805f300000000, 0xd64ccdda00000000,
+    0x47dda57400000000, 0x32255c8900000000, 0xa3b4342700000000,
+    0x5100fc0e00000000, 0xc09194a000000000, 0x64c859c800000000,
+    0xf559316600000000, 0x07edf94f00000000, 0x967c91e100000000,
+    0xe384681c00000000, 0x721500b200000000, 0x80a1c89b00000000,
+    0x1130a03500000000, 0x2b574abb00000000, 0xbac6221500000000,
+    0x4872ea3c00000000, 0xd9e3829200000000, 0xac1b7b6f00000000,
+    0x3d8a13c100000000, 0xcf3edbe800000000, 0x5eafb34600000000,
+    0x878d413900000000, 0x161c299700000000, 0xe4a8e1be00000000,
+    0x7539891000000000, 0x00c170ed00000000, 0x9150184300000000,
+    0x63e4d06a00000000, 0xf275b8c400000000, 0xc812524a00000000,
+    0x59833ae400000000, 0xab37f2cd00000000, 0x3aa69a6300000000,
+    0x4f5e639e00000000, 0xdecf0b3000000000, 0x2c7bc31900000000,
+    0xbdeaabb700000000, 0x19b366df00000000, 0x88220e7100000000,
+    0x7a96c65800000000, 0xeb07aef600000000, 0x9eff570b00000000,
+    0x0f6e3fa500000000, 0xfddaf78c00000000, 0x6c4b9f2200000000,
+    0x562c75ac00000000, 0xc7bd1d0200000000, 0x3509d52b00000000,
+    0xa498bd8500000000, 0xd160447800000000, 0x40f12cd600000000,
+    0xb245e4ff00000000, 0x23d48c5100000000, 0xf4edfd5c00000000,
+    0x657c95f200000000, 0x97c85ddb00000000, 0x0659357500000000,
+    0x73a1cc8800000000, 0xe230a42600000000, 0x10846c0f00000000,
+    0x811504a100000000, 0xbb72ee2f00000000, 0x2ae3868100000000,
+    0xd8574ea800000000, 0x49c6260600000000, 0x3c3edffb00000000,
+    0xadafb75500000000, 0x5f1b7f7c00000000, 0xce8a17d200000000,
+    0x6ad3daba00000000, 0xfb42b21400000000, 0x09f67a3d00000000,
+    0x9867129300000000, 0xed9feb6e00000000, 0x7c0e83c000000000,
+    0x8eba4be900000000, 0x1f2b234700000000, 0x254cc9c900000000,
+    0xb4dda16700000000, 0x4669694e00000000, 0xd7f801e000000000,
+    0xa200f81d00000000, 0x339190b300000000, 0xc125589a00000000,
+    0x50b4303400000000, 0x8996c24b00000000, 0x1807aae500000000,
+    0xeab362cc00000000, 0x7b220a6200000000, 0x0edaf39f00000000,
+    0x9f4b9b3100000000, 0x6dff531800000000, 0xfc6e3bb600000000,
+    0xc609d13800000000, 0x5798b99600000000, 0xa52c71bf00000000,
+    0x34bd191100000000, 0x4145e0ec00000000, 0xd0d4884200000000,
+    0x2260406b00000000, 0xb3f128c500000000, 0x17a8e5ad00000000,
+    0x86398d0300000000, 0x748d452a00000000, 0xe51c2d8400000000,
+    0x90e4d47900000000, 0x0175bcd700000000, 0xf3c174fe00000000,
+    0x62501c5000000000, 0x5837f6de00000000, 0xc9a69e7000000000,
+    0x3b12565900000000, 0xaa833ef700000000, 0xdf7bc70a00000000,
+    0x4eeaafa400000000, 0xbc5e678d00000000, 0x2dcf0f2300000000,
+    0x0e1b837200000000, 0x9f8aebdc00000000, 0x6d3e23f500000000,
+    0xfcaf4b5b00000000, 0x8957b2a600000000, 0x18c6da0800000000,
+    0xea72122100000000, 0x7be37a8f00000000, 0x4184900100000000,
+    0xd015f8af00000000, 0x22a1308600000000, 0xb330582800000000,
+    0xc6c8a1d500000000, 0x5759c97b00000000, 0xa5ed015200000000,
+    0x347c69fc00000000, 0x9025a49400000000, 0x01b4cc3a00000000,
+    0xf300041300000000, 0x62916cbd00000000, 0x1769954000000000,
+    0x86f8fdee00000000, 0x744c35c700000000, 0xe5dd5d6900000000,
+    0xdfbab7e700000000, 0x4e2bdf4900000000, 0xbc9f176000000000,
+    0x2d0e7fce00000000, 0x58f6863300000000, 0xc967ee9d00000000,
+    0x3bd326b400000000, 0xaa424e1a00000000, 0x7360bc6500000000,
+    0xe2f1d4cb00000000, 0x10451ce200000000, 0x81d4744c00000000,
+    0xf42c8db100000000, 0x65bde51f00000000, 0x97092d3600000000,
+    0x0698459800000000, 0x3cffaf1600000000, 0xad6ec7b800000000,
+    0x5fda0f9100000000, 0xce4b673f00000000, 0xbbb39ec200000000,
+    0x2a22f66c00000000, 0xd8963e4500000000, 0x490756eb00000000,
+    0xed5e9b8300000000, 0x7ccff32d00000000, 0x8e7b3b0400000000,
+    0x1fea53aa00000000, 0x6a12aa5700000000, 0xfb83c2f900000000,
+    0x09370ad000000000, 0x98a6627e00000000, 0xa2c188f000000000,
+    0x3350e05e00000000, 0xc1e4287700000000, 0x507540d900000000,
+    0x258db92400000000, 0xb41cd18a00000000, 0x46a819a300000000,
+    0xd739710d00000000}};
+
+#else /* W == 4 */
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa,
+    0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b,
+    0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232,
+    0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8,
+    0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e,
+    0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa,
+    0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b,
+    0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f,
+    0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719,
+    0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3,
+    0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa,
+    0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b,
+    0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed,
+    0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89,
+    0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25,
+    0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041,
+    0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c,
+    0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed,
+    0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4,
+    0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758,
+    0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e,
+    0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a,
+    0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed,
+    0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889,
+    0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df,
+    0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544,
+    0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d,
+    0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c,
+    0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1,
+    0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95,
+    0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839,
+    0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d,
+    0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976,
+    0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7,
+    0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be,
+    0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144,
+    0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12,
+    0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376,
+    0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a,
+    0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e,
+    0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278,
+    0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682,
+    0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b,
+    0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a,
+    0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561,
+    0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05,
+    0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9,
+    0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd,
+    0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0,
+    0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61,
+    0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678,
+    0x264b06e6},
+   {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413,
+    0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3,
+    0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d,
+    0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653,
+    0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9,
+    0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e,
+    0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5,
+    0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712,
+    0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8,
+    0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6,
+    0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068,
+    0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8,
+    0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579,
+    0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade,
+    0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37,
+    0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590,
+    0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4,
+    0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64,
+    0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea,
+    0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678,
+    0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282,
+    0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25,
+    0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102,
+    0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5,
+    0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f,
+    0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146,
+    0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8,
+    0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08,
+    0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c,
+    0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b,
+    0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972,
+    0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5,
+    0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d,
+    0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd,
+    0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833,
+    0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d,
+    0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7,
+    0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60,
+    0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2,
+    0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105,
+    0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff,
+    0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1,
+    0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f,
+    0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf,
+    0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617,
+    0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0,
+    0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959,
+    0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe,
+    0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca,
+    0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a,
+    0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184,
+    0x92364a30},
+   {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216,
+    0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8,
+    0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170,
+    0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035,
+    0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6,
+    0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145,
+    0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d,
+    0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e,
+    0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d,
+    0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408,
+    0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0,
+    0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e,
+    0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c,
+    0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf,
+    0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a,
+    0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9,
+    0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1,
+    0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f,
+    0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987,
+    0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4,
+    0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37,
+    0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84,
+    0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca,
+    0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79,
+    0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba,
+    0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d,
+    0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5,
+    0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b,
+    0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643,
+    0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0,
+    0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525,
+    0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496,
+    0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8,
+    0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026,
+    0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e,
+    0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db,
+    0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118,
+    0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab,
+    0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf,
+    0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c,
+    0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf,
+    0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a,
+    0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32,
+    0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec,
+    0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82,
+    0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31,
+    0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4,
+    0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957,
+    0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f,
+    0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1,
+    0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869,
+    0xe4c4abcc},
+   {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0,
+    0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271,
+    0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61,
+    0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52,
+    0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43,
+    0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333,
+    0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64,
+    0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314,
+    0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205,
+    0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136,
+    0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26,
+    0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997,
+    0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849,
+    0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739,
+    0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8,
+    0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98,
+    0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b,
+    0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba,
+    0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa,
+    0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d,
+    0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c,
+    0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc,
+    0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af,
+    0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf,
+    0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce,
+    0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922,
+    0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532,
+    0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183,
+    0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710,
+    0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860,
+    0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1,
+    0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1,
+    0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956,
+    0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7,
+    0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7,
+    0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4,
+    0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5,
+    0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5,
+    0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb,
+    0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb,
+    0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da,
+    0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9,
+    0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9,
+    0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48,
+    0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df,
+    0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af,
+    0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e,
+    0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e,
+    0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d,
+    0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c,
+    0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c,
+    0xca64c78c}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x00000000, 0xb029603d, 0x6053c07a, 0xd07aa047, 0xc0a680f5,
+    0x708fe0c8, 0xa0f5408f, 0x10dc20b2, 0xc14b7030, 0x7162100d,
+    0xa118b04a, 0x1131d077, 0x01edf0c5, 0xb1c490f8, 0x61be30bf,
+    0xd1975082, 0x8297e060, 0x32be805d, 0xe2c4201a, 0x52ed4027,
+    0x42316095, 0xf21800a8, 0x2262a0ef, 0x924bc0d2, 0x43dc9050,
+    0xf3f5f06d, 0x238f502a, 0x93a63017, 0x837a10a5, 0x33537098,
+    0xe329d0df, 0x5300b0e2, 0x042fc1c1, 0xb406a1fc, 0x647c01bb,
+    0xd4556186, 0xc4894134, 0x74a02109, 0xa4da814e, 0x14f3e173,
+    0xc564b1f1, 0x754dd1cc, 0xa537718b, 0x151e11b6, 0x05c23104,
+    0xb5eb5139, 0x6591f17e, 0xd5b89143, 0x86b821a1, 0x3691419c,
+    0xe6ebe1db, 0x56c281e6, 0x461ea154, 0xf637c169, 0x264d612e,
+    0x96640113, 0x47f35191, 0xf7da31ac, 0x27a091eb, 0x9789f1d6,
+    0x8755d164, 0x377cb159, 0xe706111e, 0x572f7123, 0x4958f358,
+    0xf9719365, 0x290b3322, 0x9922531f, 0x89fe73ad, 0x39d71390,
+    0xe9adb3d7, 0x5984d3ea, 0x88138368, 0x383ae355, 0xe8404312,
+    0x5869232f, 0x48b5039d, 0xf89c63a0, 0x28e6c3e7, 0x98cfa3da,
+    0xcbcf1338, 0x7be67305, 0xab9cd342, 0x1bb5b37f, 0x0b6993cd,
+    0xbb40f3f0, 0x6b3a53b7, 0xdb13338a, 0x0a846308, 0xbaad0335,
+    0x6ad7a372, 0xdafec34f, 0xca22e3fd, 0x7a0b83c0, 0xaa712387,
+    0x1a5843ba, 0x4d773299, 0xfd5e52a4, 0x2d24f2e3, 0x9d0d92de,
+    0x8dd1b26c, 0x3df8d251, 0xed827216, 0x5dab122b, 0x8c3c42a9,
+    0x3c152294, 0xec6f82d3, 0x5c46e2ee, 0x4c9ac25c, 0xfcb3a261,
+    0x2cc90226, 0x9ce0621b, 0xcfe0d2f9, 0x7fc9b2c4, 0xafb31283,
+    0x1f9a72be, 0x0f46520c, 0xbf6f3231, 0x6f159276, 0xdf3cf24b,
+    0x0eaba2c9, 0xbe82c2f4, 0x6ef862b3, 0xded1028e, 0xce0d223c,
+    0x7e244201, 0xae5ee246, 0x1e77827b, 0x92b0e6b1, 0x2299868c,
+    0xf2e326cb, 0x42ca46f6, 0x52166644, 0xe23f0679, 0x3245a63e,
+    0x826cc603, 0x53fb9681, 0xe3d2f6bc, 0x33a856fb, 0x838136c6,
+    0x935d1674, 0x23747649, 0xf30ed60e, 0x4327b633, 0x102706d1,
+    0xa00e66ec, 0x7074c6ab, 0xc05da696, 0xd0818624, 0x60a8e619,
+    0xb0d2465e, 0x00fb2663, 0xd16c76e1, 0x614516dc, 0xb13fb69b,
+    0x0116d6a6, 0x11caf614, 0xa1e39629, 0x7199366e, 0xc1b05653,
+    0x969f2770, 0x26b6474d, 0xf6cce70a, 0x46e58737, 0x5639a785,
+    0xe610c7b8, 0x366a67ff, 0x864307c2, 0x57d45740, 0xe7fd377d,
+    0x3787973a, 0x87aef707, 0x9772d7b5, 0x275bb788, 0xf72117cf,
+    0x470877f2, 0x1408c710, 0xa421a72d, 0x745b076a, 0xc4726757,
+    0xd4ae47e5, 0x648727d8, 0xb4fd879f, 0x04d4e7a2, 0xd543b720,
+    0x656ad71d, 0xb510775a, 0x05391767, 0x15e537d5, 0xa5cc57e8,
+    0x75b6f7af, 0xc59f9792, 0xdbe815e9, 0x6bc175d4, 0xbbbbd593,
+    0x0b92b5ae, 0x1b4e951c, 0xab67f521, 0x7b1d5566, 0xcb34355b,
+    0x1aa365d9, 0xaa8a05e4, 0x7af0a5a3, 0xcad9c59e, 0xda05e52c,
+    0x6a2c8511, 0xba562556, 0x0a7f456b, 0x597ff589, 0xe95695b4,
+    0x392c35f3, 0x890555ce, 0x99d9757c, 0x29f01541, 0xf98ab506,
+    0x49a3d53b, 0x983485b9, 0x281de584, 0xf86745c3, 0x484e25fe,
+    0x5892054c, 0xe8bb6571, 0x38c1c536, 0x88e8a50b, 0xdfc7d428,
+    0x6feeb415, 0xbf941452, 0x0fbd746f, 0x1f6154dd, 0xaf4834e0,
+    0x7f3294a7, 0xcf1bf49a, 0x1e8ca418, 0xaea5c425, 0x7edf6462,
+    0xcef6045f, 0xde2a24ed, 0x6e0344d0, 0xbe79e497, 0x0e5084aa,
+    0x5d503448, 0xed795475, 0x3d03f432, 0x8d2a940f, 0x9df6b4bd,
+    0x2ddfd480, 0xfda574c7, 0x4d8c14fa, 0x9c1b4478, 0x2c322445,
+    0xfc488402, 0x4c61e43f, 0x5cbdc48d, 0xec94a4b0, 0x3cee04f7,
+    0x8cc764ca},
+   {0x00000000, 0xa5d35ccb, 0x0ba1c84d, 0xae729486, 0x1642919b,
+    0xb391cd50, 0x1de359d6, 0xb830051d, 0x6d8253ec, 0xc8510f27,
+    0x66239ba1, 0xc3f0c76a, 0x7bc0c277, 0xde139ebc, 0x70610a3a,
+    0xd5b256f1, 0x9b02d603, 0x3ed18ac8, 0x90a31e4e, 0x35704285,
+    0x8d404798, 0x28931b53, 0x86e18fd5, 0x2332d31e, 0xf68085ef,
+    0x5353d924, 0xfd214da2, 0x58f21169, 0xe0c21474, 0x451148bf,
+    0xeb63dc39, 0x4eb080f2, 0x3605ac07, 0x93d6f0cc, 0x3da4644a,
+    0x98773881, 0x20473d9c, 0x85946157, 0x2be6f5d1, 0x8e35a91a,
+    0x5b87ffeb, 0xfe54a320, 0x502637a6, 0xf5f56b6d, 0x4dc56e70,
+    0xe81632bb, 0x4664a63d, 0xe3b7faf6, 0xad077a04, 0x08d426cf,
+    0xa6a6b249, 0x0375ee82, 0xbb45eb9f, 0x1e96b754, 0xb0e423d2,
+    0x15377f19, 0xc08529e8, 0x65567523, 0xcb24e1a5, 0x6ef7bd6e,
+    0xd6c7b873, 0x7314e4b8, 0xdd66703e, 0x78b52cf5, 0x6c0a580f,
+    0xc9d904c4, 0x67ab9042, 0xc278cc89, 0x7a48c994, 0xdf9b955f,
+    0x71e901d9, 0xd43a5d12, 0x01880be3, 0xa45b5728, 0x0a29c3ae,
+    0xaffa9f65, 0x17ca9a78, 0xb219c6b3, 0x1c6b5235, 0xb9b80efe,
+    0xf7088e0c, 0x52dbd2c7, 0xfca94641, 0x597a1a8a, 0xe14a1f97,
+    0x4499435c, 0xeaebd7da, 0x4f388b11, 0x9a8adde0, 0x3f59812b,
+    0x912b15ad, 0x34f84966, 0x8cc84c7b, 0x291b10b0, 0x87698436,
+    0x22bad8fd, 0x5a0ff408, 0xffdca8c3, 0x51ae3c45, 0xf47d608e,
+    0x4c4d6593, 0xe99e3958, 0x47ecadde, 0xe23ff115, 0x378da7e4,
+    0x925efb2f, 0x3c2c6fa9, 0x99ff3362, 0x21cf367f, 0x841c6ab4,
+    0x2a6efe32, 0x8fbda2f9, 0xc10d220b, 0x64de7ec0, 0xcaacea46,
+    0x6f7fb68d, 0xd74fb390, 0x729cef5b, 0xdcee7bdd, 0x793d2716,
+    0xac8f71e7, 0x095c2d2c, 0xa72eb9aa, 0x02fde561, 0xbacde07c,
+    0x1f1ebcb7, 0xb16c2831, 0x14bf74fa, 0xd814b01e, 0x7dc7ecd5,
+    0xd3b57853, 0x76662498, 0xce562185, 0x6b857d4e, 0xc5f7e9c8,
+    0x6024b503, 0xb596e3f2, 0x1045bf39, 0xbe372bbf, 0x1be47774,
+    0xa3d47269, 0x06072ea2, 0xa875ba24, 0x0da6e6ef, 0x4316661d,
+    0xe6c53ad6, 0x48b7ae50, 0xed64f29b, 0x5554f786, 0xf087ab4d,
+    0x5ef53fcb, 0xfb266300, 0x2e9435f1, 0x8b47693a, 0x2535fdbc,
+    0x80e6a177, 0x38d6a46a, 0x9d05f8a1, 0x33776c27, 0x96a430ec,
+    0xee111c19, 0x4bc240d2, 0xe5b0d454, 0x4063889f, 0xf8538d82,
+    0x5d80d149, 0xf3f245cf, 0x56211904, 0x83934ff5, 0x2640133e,
+    0x883287b8, 0x2de1db73, 0x95d1de6e, 0x300282a5, 0x9e701623,
+    0x3ba34ae8, 0x7513ca1a, 0xd0c096d1, 0x7eb20257, 0xdb615e9c,
+    0x63515b81, 0xc682074a, 0x68f093cc, 0xcd23cf07, 0x189199f6,
+    0xbd42c53d, 0x133051bb, 0xb6e30d70, 0x0ed3086d, 0xab0054a6,
+    0x0572c020, 0xa0a19ceb, 0xb41ee811, 0x11cdb4da, 0xbfbf205c,
+    0x1a6c7c97, 0xa25c798a, 0x078f2541, 0xa9fdb1c7, 0x0c2eed0c,
+    0xd99cbbfd, 0x7c4fe736, 0xd23d73b0, 0x77ee2f7b, 0xcfde2a66,
+    0x6a0d76ad, 0xc47fe22b, 0x61acbee0, 0x2f1c3e12, 0x8acf62d9,
+    0x24bdf65f, 0x816eaa94, 0x395eaf89, 0x9c8df342, 0x32ff67c4,
+    0x972c3b0f, 0x429e6dfe, 0xe74d3135, 0x493fa5b3, 0xececf978,
+    0x54dcfc65, 0xf10fa0ae, 0x5f7d3428, 0xfaae68e3, 0x821b4416,
+    0x27c818dd, 0x89ba8c5b, 0x2c69d090, 0x9459d58d, 0x318a8946,
+    0x9ff81dc0, 0x3a2b410b, 0xef9917fa, 0x4a4a4b31, 0xe438dfb7,
+    0x41eb837c, 0xf9db8661, 0x5c08daaa, 0xf27a4e2c, 0x57a912e7,
+    0x19199215, 0xbccacede, 0x12b85a58, 0xb76b0693, 0x0f5b038e,
+    0xaa885f45, 0x04facbc3, 0xa1299708, 0x749bc1f9, 0xd1489d32,
+    0x7f3a09b4, 0xdae9557f, 0x62d95062, 0xc70a0ca9, 0x6978982f,
+    0xccabc4e4},
+   {0x00000000, 0xb40b77a6, 0x29119f97, 0x9d1ae831, 0x13244ff4,
+    0xa72f3852, 0x3a35d063, 0x8e3ea7c5, 0x674eef33, 0xd3459895,
+    0x4e5f70a4, 0xfa540702, 0x746aa0c7, 0xc061d761, 0x5d7b3f50,
+    0xe97048f6, 0xce9cde67, 0x7a97a9c1, 0xe78d41f0, 0x53863656,
+    0xddb89193, 0x69b3e635, 0xf4a90e04, 0x40a279a2, 0xa9d23154,
+    0x1dd946f2, 0x80c3aec3, 0x34c8d965, 0xbaf67ea0, 0x0efd0906,
+    0x93e7e137, 0x27ec9691, 0x9c39bdcf, 0x2832ca69, 0xb5282258,
+    0x012355fe, 0x8f1df23b, 0x3b16859d, 0xa60c6dac, 0x12071a0a,
+    0xfb7752fc, 0x4f7c255a, 0xd266cd6b, 0x666dbacd, 0xe8531d08,
+    0x5c586aae, 0xc142829f, 0x7549f539, 0x52a563a8, 0xe6ae140e,
+    0x7bb4fc3f, 0xcfbf8b99, 0x41812c5c, 0xf58a5bfa, 0x6890b3cb,
+    0xdc9bc46d, 0x35eb8c9b, 0x81e0fb3d, 0x1cfa130c, 0xa8f164aa,
+    0x26cfc36f, 0x92c4b4c9, 0x0fde5cf8, 0xbbd52b5e, 0x79750b44,
+    0xcd7e7ce2, 0x506494d3, 0xe46fe375, 0x6a5144b0, 0xde5a3316,
+    0x4340db27, 0xf74bac81, 0x1e3be477, 0xaa3093d1, 0x372a7be0,
+    0x83210c46, 0x0d1fab83, 0xb914dc25, 0x240e3414, 0x900543b2,
+    0xb7e9d523, 0x03e2a285, 0x9ef84ab4, 0x2af33d12, 0xa4cd9ad7,
+    0x10c6ed71, 0x8ddc0540, 0x39d772e6, 0xd0a73a10, 0x64ac4db6,
+    0xf9b6a587, 0x4dbdd221, 0xc38375e4, 0x77880242, 0xea92ea73,
+    0x5e999dd5, 0xe54cb68b, 0x5147c12d, 0xcc5d291c, 0x78565eba,
+    0xf668f97f, 0x42638ed9, 0xdf7966e8, 0x6b72114e, 0x820259b8,
+    0x36092e1e, 0xab13c62f, 0x1f18b189, 0x9126164c, 0x252d61ea,
+    0xb83789db, 0x0c3cfe7d, 0x2bd068ec, 0x9fdb1f4a, 0x02c1f77b,
+    0xb6ca80dd, 0x38f42718, 0x8cff50be, 0x11e5b88f, 0xa5eecf29,
+    0x4c9e87df, 0xf895f079, 0x658f1848, 0xd1846fee, 0x5fbac82b,
+    0xebb1bf8d, 0x76ab57bc, 0xc2a0201a, 0xf2ea1688, 0x46e1612e,
+    0xdbfb891f, 0x6ff0feb9, 0xe1ce597c, 0x55c52eda, 0xc8dfc6eb,
+    0x7cd4b14d, 0x95a4f9bb, 0x21af8e1d, 0xbcb5662c, 0x08be118a,
+    0x8680b64f, 0x328bc1e9, 0xaf9129d8, 0x1b9a5e7e, 0x3c76c8ef,
+    0x887dbf49, 0x15675778, 0xa16c20de, 0x2f52871b, 0x9b59f0bd,
+    0x0643188c, 0xb2486f2a, 0x5b3827dc, 0xef33507a, 0x7229b84b,
+    0xc622cfed, 0x481c6828, 0xfc171f8e, 0x610df7bf, 0xd5068019,
+    0x6ed3ab47, 0xdad8dce1, 0x47c234d0, 0xf3c94376, 0x7df7e4b3,
+    0xc9fc9315, 0x54e67b24, 0xe0ed0c82, 0x099d4474, 0xbd9633d2,
+    0x208cdbe3, 0x9487ac45, 0x1ab90b80, 0xaeb27c26, 0x33a89417,
+    0x87a3e3b1, 0xa04f7520, 0x14440286, 0x895eeab7, 0x3d559d11,
+    0xb36b3ad4, 0x07604d72, 0x9a7aa543, 0x2e71d2e5, 0xc7019a13,
+    0x730aedb5, 0xee100584, 0x5a1b7222, 0xd425d5e7, 0x602ea241,
+    0xfd344a70, 0x493f3dd6, 0x8b9f1dcc, 0x3f946a6a, 0xa28e825b,
+    0x1685f5fd, 0x98bb5238, 0x2cb0259e, 0xb1aacdaf, 0x05a1ba09,
+    0xecd1f2ff, 0x58da8559, 0xc5c06d68, 0x71cb1ace, 0xfff5bd0b,
+    0x4bfecaad, 0xd6e4229c, 0x62ef553a, 0x4503c3ab, 0xf108b40d,
+    0x6c125c3c, 0xd8192b9a, 0x56278c5f, 0xe22cfbf9, 0x7f3613c8,
+    0xcb3d646e, 0x224d2c98, 0x96465b3e, 0x0b5cb30f, 0xbf57c4a9,
+    0x3169636c, 0x856214ca, 0x1878fcfb, 0xac738b5d, 0x17a6a003,
+    0xa3add7a5, 0x3eb73f94, 0x8abc4832, 0x0482eff7, 0xb0899851,
+    0x2d937060, 0x999807c6, 0x70e84f30, 0xc4e33896, 0x59f9d0a7,
+    0xedf2a701, 0x63cc00c4, 0xd7c77762, 0x4add9f53, 0xfed6e8f5,
+    0xd93a7e64, 0x6d3109c2, 0xf02be1f3, 0x44209655, 0xca1e3190,
+    0x7e154636, 0xe30fae07, 0x5704d9a1, 0xbe749157, 0x0a7fe6f1,
+    0x97650ec0, 0x236e7966, 0xad50dea3, 0x195ba905, 0x84414134,
+    0x304a3692},
+   {0x00000000, 0x9e00aacc, 0x7d072542, 0xe3078f8e, 0xfa0e4a84,
+    0x640ee048, 0x87096fc6, 0x1909c50a, 0xb51be5d3, 0x2b1b4f1f,
+    0xc81cc091, 0x561c6a5d, 0x4f15af57, 0xd115059b, 0x32128a15,
+    0xac1220d9, 0x2b31bb7c, 0xb53111b0, 0x56369e3e, 0xc83634f2,
+    0xd13ff1f8, 0x4f3f5b34, 0xac38d4ba, 0x32387e76, 0x9e2a5eaf,
+    0x002af463, 0xe32d7bed, 0x7d2dd121, 0x6424142b, 0xfa24bee7,
+    0x19233169, 0x87239ba5, 0x566276f9, 0xc862dc35, 0x2b6553bb,
+    0xb565f977, 0xac6c3c7d, 0x326c96b1, 0xd16b193f, 0x4f6bb3f3,
+    0xe379932a, 0x7d7939e6, 0x9e7eb668, 0x007e1ca4, 0x1977d9ae,
+    0x87777362, 0x6470fcec, 0xfa705620, 0x7d53cd85, 0xe3536749,
+    0x0054e8c7, 0x9e54420b, 0x875d8701, 0x195d2dcd, 0xfa5aa243,
+    0x645a088f, 0xc8482856, 0x5648829a, 0xb54f0d14, 0x2b4fa7d8,
+    0x324662d2, 0xac46c81e, 0x4f414790, 0xd141ed5c, 0xedc29d29,
+    0x73c237e5, 0x90c5b86b, 0x0ec512a7, 0x17ccd7ad, 0x89cc7d61,
+    0x6acbf2ef, 0xf4cb5823, 0x58d978fa, 0xc6d9d236, 0x25de5db8,
+    0xbbdef774, 0xa2d7327e, 0x3cd798b2, 0xdfd0173c, 0x41d0bdf0,
+    0xc6f32655, 0x58f38c99, 0xbbf40317, 0x25f4a9db, 0x3cfd6cd1,
+    0xa2fdc61d, 0x41fa4993, 0xdffae35f, 0x73e8c386, 0xede8694a,
+    0x0eefe6c4, 0x90ef4c08, 0x89e68902, 0x17e623ce, 0xf4e1ac40,
+    0x6ae1068c, 0xbba0ebd0, 0x25a0411c, 0xc6a7ce92, 0x58a7645e,
+    0x41aea154, 0xdfae0b98, 0x3ca98416, 0xa2a92eda, 0x0ebb0e03,
+    0x90bba4cf, 0x73bc2b41, 0xedbc818d, 0xf4b54487, 0x6ab5ee4b,
+    0x89b261c5, 0x17b2cb09, 0x909150ac, 0x0e91fa60, 0xed9675ee,
+    0x7396df22, 0x6a9f1a28, 0xf49fb0e4, 0x17983f6a, 0x899895a6,
+    0x258ab57f, 0xbb8a1fb3, 0x588d903d, 0xc68d3af1, 0xdf84fffb,
+    0x41845537, 0xa283dab9, 0x3c837075, 0xda853b53, 0x4485919f,
+    0xa7821e11, 0x3982b4dd, 0x208b71d7, 0xbe8bdb1b, 0x5d8c5495,
+    0xc38cfe59, 0x6f9ede80, 0xf19e744c, 0x1299fbc2, 0x8c99510e,
+    0x95909404, 0x0b903ec8, 0xe897b146, 0x76971b8a, 0xf1b4802f,
+    0x6fb42ae3, 0x8cb3a56d, 0x12b30fa1, 0x0bbacaab, 0x95ba6067,
+    0x76bdefe9, 0xe8bd4525, 0x44af65fc, 0xdaafcf30, 0x39a840be,
+    0xa7a8ea72, 0xbea12f78, 0x20a185b4, 0xc3a60a3a, 0x5da6a0f6,
+    0x8ce74daa, 0x12e7e766, 0xf1e068e8, 0x6fe0c224, 0x76e9072e,
+    0xe8e9ade2, 0x0bee226c, 0x95ee88a0, 0x39fca879, 0xa7fc02b5,
+    0x44fb8d3b, 0xdafb27f7, 0xc3f2e2fd, 0x5df24831, 0xbef5c7bf,
+    0x20f56d73, 0xa7d6f6d6, 0x39d65c1a, 0xdad1d394, 0x44d17958,
+    0x5dd8bc52, 0xc3d8169e, 0x20df9910, 0xbedf33dc, 0x12cd1305,
+    0x8ccdb9c9, 0x6fca3647, 0xf1ca9c8b, 0xe8c35981, 0x76c3f34d,
+    0x95c47cc3, 0x0bc4d60f, 0x3747a67a, 0xa9470cb6, 0x4a408338,
+    0xd44029f4, 0xcd49ecfe, 0x53494632, 0xb04ec9bc, 0x2e4e6370,
+    0x825c43a9, 0x1c5ce965, 0xff5b66eb, 0x615bcc27, 0x7852092d,
+    0xe652a3e1, 0x05552c6f, 0x9b5586a3, 0x1c761d06, 0x8276b7ca,
+    0x61713844, 0xff719288, 0xe6785782, 0x7878fd4e, 0x9b7f72c0,
+    0x057fd80c, 0xa96df8d5, 0x376d5219, 0xd46add97, 0x4a6a775b,
+    0x5363b251, 0xcd63189d, 0x2e649713, 0xb0643ddf, 0x6125d083,
+    0xff257a4f, 0x1c22f5c1, 0x82225f0d, 0x9b2b9a07, 0x052b30cb,
+    0xe62cbf45, 0x782c1589, 0xd43e3550, 0x4a3e9f9c, 0xa9391012,
+    0x3739bade, 0x2e307fd4, 0xb030d518, 0x53375a96, 0xcd37f05a,
+    0x4a146bff, 0xd414c133, 0x37134ebd, 0xa913e471, 0xb01a217b,
+    0x2e1a8bb7, 0xcd1d0439, 0x531daef5, 0xff0f8e2c, 0x610f24e0,
+    0x8208ab6e, 0x1c0801a2, 0x0501c4a8, 0x9b016e64, 0x7806e1ea,
+    0xe6064b26}};
+
 #endif
-  }
-};
+
+#endif
+
+#if N == 3
+
+#if W == 8
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f,
+    0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999,
+    0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee,
+    0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615,
+    0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383,
+    0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb,
+    0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275,
+    0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d,
+    0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b,
+    0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460,
+    0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317,
+    0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1,
+    0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5,
+    0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd,
+    0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04,
+    0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c,
+    0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7,
+    0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11,
+    0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66,
+    0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7,
+    0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871,
+    0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309,
+    0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd,
+    0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85,
+    0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913,
+    0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d,
+    0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a,
+    0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc,
+    0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57,
+    0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f,
+    0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6,
+    0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e,
+    0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f,
+    0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289,
+    0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe,
+    0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05,
+    0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893,
+    0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb,
+    0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0,
+    0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8,
+    0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e,
+    0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5,
+    0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2,
+    0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574,
+    0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5,
+    0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add,
+    0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114,
+    0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c,
+    0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7,
+    0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701,
+    0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076,
+    0x09cd8551},
+   {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193,
+    0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2,
+    0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c,
+    0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71,
+    0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a,
+    0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d,
+    0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71,
+    0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436,
+    0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d,
+    0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000,
+    0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae,
+    0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf,
+    0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930,
+    0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277,
+    0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff,
+    0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8,
+    0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef,
+    0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e,
+    0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20,
+    0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95,
+    0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e,
+    0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9,
+    0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d,
+    0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a,
+    0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151,
+    0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4,
+    0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a,
+    0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b,
+    0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c,
+    0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b,
+    0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3,
+    0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4,
+    0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b,
+    0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a,
+    0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4,
+    0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189,
+    0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92,
+    0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5,
+    0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9,
+    0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe,
+    0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5,
+    0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8,
+    0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66,
+    0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707,
+    0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8,
+    0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f,
+    0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707,
+    0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40,
+    0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017,
+    0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876,
+    0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8,
+    0x7bc97a0c},
+   {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300,
+    0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0,
+    0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80,
+    0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701,
+    0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41,
+    0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81,
+    0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43,
+    0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83,
+    0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3,
+    0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42,
+    0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202,
+    0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2,
+    0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7,
+    0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407,
+    0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47,
+    0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87,
+    0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86,
+    0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46,
+    0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506,
+    0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44,
+    0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704,
+    0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4,
+    0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5,
+    0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505,
+    0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45,
+    0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f,
+    0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f,
+    0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f,
+    0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e,
+    0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e,
+    0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e,
+    0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce,
+    0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c,
+    0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc,
+    0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c,
+    0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d,
+    0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d,
+    0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d,
+    0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88,
+    0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48,
+    0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708,
+    0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89,
+    0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9,
+    0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309,
+    0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb,
+    0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b,
+    0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b,
+    0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b,
+    0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a,
+    0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a,
+    0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a,
+    0x7851a2ca},
+   {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb,
+    0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8,
+    0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0,
+    0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f,
+    0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a,
+    0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf,
+    0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5,
+    0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380,
+    0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815,
+    0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa,
+    0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2,
+    0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1,
+    0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1,
+    0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4,
+    0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa,
+    0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df,
+    0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6,
+    0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5,
+    0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad,
+    0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca,
+    0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f,
+    0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a,
+    0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8,
+    0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d,
+    0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708,
+    0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d,
+    0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865,
+    0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636,
+    0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f,
+    0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a,
+    0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744,
+    0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061,
+    0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0,
+    0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293,
+    0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb,
+    0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874,
+    0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1,
+    0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4,
+    0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f,
+    0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a,
+    0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f,
+    0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120,
+    0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778,
+    0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b,
+    0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a,
+    0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af,
+    0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81,
+    0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4,
+    0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd,
+    0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e,
+    0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6,
+    0x566b6848},
+   {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59,
+    0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4,
+    0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67,
+    0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef,
+    0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97,
+    0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88,
+    0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687,
+    0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698,
+    0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0,
+    0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068,
+    0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb,
+    0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056,
+    0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016,
+    0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009,
+    0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028,
+    0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037,
+    0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a,
+    0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7,
+    0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054,
+    0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7,
+    0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af,
+    0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0,
+    0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4,
+    0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab,
+    0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3,
+    0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a,
+    0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9,
+    0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54,
+    0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09,
+    0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16,
+    0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37,
+    0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28,
+    0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e,
+    0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3,
+    0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40,
+    0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8,
+    0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0,
+    0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf,
+    0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6,
+    0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9,
+    0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1,
+    0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059,
+    0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca,
+    0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067,
+    0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031,
+    0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e,
+    0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f,
+    0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010,
+    0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d,
+    0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0,
+    0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073,
+    0xd8ac6b35},
+   {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2,
+    0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd,
+    0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696,
+    0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3,
+    0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f,
+    0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35,
+    0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5,
+    0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f,
+    0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673,
+    0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46,
+    0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d,
+    0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632,
+    0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28,
+    0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192,
+    0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c,
+    0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6,
+    0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0,
+    0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff,
+    0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4,
+    0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95,
+    0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9,
+    0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03,
+    0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7,
+    0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d,
+    0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151,
+    0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808,
+    0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343,
+    0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c,
+    0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a,
+    0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0,
+    0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e,
+    0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594,
+    0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6,
+    0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399,
+    0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2,
+    0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7,
+    0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb,
+    0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571,
+    0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289,
+    0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33,
+    0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f,
+    0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a,
+    0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461,
+    0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e,
+    0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c,
+    0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6,
+    0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918,
+    0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2,
+    0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484,
+    0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb,
+    0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0,
+    0xa140efa8},
+   {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706,
+    0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed,
+    0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289,
+    0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a,
+    0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214,
+    0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3,
+    0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3,
+    0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254,
+    0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a,
+    0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9,
+    0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad,
+    0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746,
+    0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060,
+    0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187,
+    0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef,
+    0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408,
+    0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e,
+    0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495,
+    0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1,
+    0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532,
+    0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c,
+    0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb,
+    0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb,
+    0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c,
+    0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42,
+    0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060,
+    0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04,
+    0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef,
+    0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99,
+    0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e,
+    0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16,
+    0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1,
+    0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7,
+    0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c,
+    0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38,
+    0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb,
+    0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5,
+    0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42,
+    0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62,
+    0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85,
+    0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb,
+    0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18,
+    0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c,
+    0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997,
+    0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1,
+    0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36,
+    0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e,
+    0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9,
+    0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf,
+    0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24,
+    0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040,
+    0x917cd6a1},
+   {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf,
+    0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd,
+    0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896,
+    0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9,
+    0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3,
+    0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f,
+    0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d,
+    0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1,
+    0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab,
+    0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4,
+    0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f,
+    0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d,
+    0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4,
+    0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978,
+    0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad,
+    0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621,
+    0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46,
+    0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854,
+    0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f,
+    0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a,
+    0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890,
+    0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c,
+    0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4,
+    0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238,
+    0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622,
+    0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab,
+    0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0,
+    0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2,
+    0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295,
+    0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19,
+    0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc,
+    0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140,
+    0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd,
+    0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf,
+    0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184,
+    0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb,
+    0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1,
+    0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d,
+    0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb,
+    0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257,
+    0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d,
+    0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22,
+    0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069,
+    0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b,
+    0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6,
+    0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a,
+    0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf,
+    0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33,
+    0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254,
+    0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146,
+    0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d,
+    0x18ba364e}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x0000000000000000, 0x43cba68700000000, 0xc7903cd400000000,
+    0x845b9a5300000000, 0xcf27087300000000, 0x8cecaef400000000,
+    0x08b734a700000000, 0x4b7c922000000000, 0x9e4f10e600000000,
+    0xdd84b66100000000, 0x59df2c3200000000, 0x1a148ab500000000,
+    0x5168189500000000, 0x12a3be1200000000, 0x96f8244100000000,
+    0xd53382c600000000, 0x7d99511700000000, 0x3e52f79000000000,
+    0xba096dc300000000, 0xf9c2cb4400000000, 0xb2be596400000000,
+    0xf175ffe300000000, 0x752e65b000000000, 0x36e5c33700000000,
+    0xe3d641f100000000, 0xa01de77600000000, 0x24467d2500000000,
+    0x678ddba200000000, 0x2cf1498200000000, 0x6f3aef0500000000,
+    0xeb61755600000000, 0xa8aad3d100000000, 0xfa32a32e00000000,
+    0xb9f905a900000000, 0x3da29ffa00000000, 0x7e69397d00000000,
+    0x3515ab5d00000000, 0x76de0dda00000000, 0xf285978900000000,
+    0xb14e310e00000000, 0x647db3c800000000, 0x27b6154f00000000,
+    0xa3ed8f1c00000000, 0xe026299b00000000, 0xab5abbbb00000000,
+    0xe8911d3c00000000, 0x6cca876f00000000, 0x2f0121e800000000,
+    0x87abf23900000000, 0xc46054be00000000, 0x403bceed00000000,
+    0x03f0686a00000000, 0x488cfa4a00000000, 0x0b475ccd00000000,
+    0x8f1cc69e00000000, 0xccd7601900000000, 0x19e4e2df00000000,
+    0x5a2f445800000000, 0xde74de0b00000000, 0x9dbf788c00000000,
+    0xd6c3eaac00000000, 0x95084c2b00000000, 0x1153d67800000000,
+    0x529870ff00000000, 0xf465465d00000000, 0xb7aee0da00000000,
+    0x33f57a8900000000, 0x703edc0e00000000, 0x3b424e2e00000000,
+    0x7889e8a900000000, 0xfcd272fa00000000, 0xbf19d47d00000000,
+    0x6a2a56bb00000000, 0x29e1f03c00000000, 0xadba6a6f00000000,
+    0xee71cce800000000, 0xa50d5ec800000000, 0xe6c6f84f00000000,
+    0x629d621c00000000, 0x2156c49b00000000, 0x89fc174a00000000,
+    0xca37b1cd00000000, 0x4e6c2b9e00000000, 0x0da78d1900000000,
+    0x46db1f3900000000, 0x0510b9be00000000, 0x814b23ed00000000,
+    0xc280856a00000000, 0x17b307ac00000000, 0x5478a12b00000000,
+    0xd0233b7800000000, 0x93e89dff00000000, 0xd8940fdf00000000,
+    0x9b5fa95800000000, 0x1f04330b00000000, 0x5ccf958c00000000,
+    0x0e57e57300000000, 0x4d9c43f400000000, 0xc9c7d9a700000000,
+    0x8a0c7f2000000000, 0xc170ed0000000000, 0x82bb4b8700000000,
+    0x06e0d1d400000000, 0x452b775300000000, 0x9018f59500000000,
+    0xd3d3531200000000, 0x5788c94100000000, 0x14436fc600000000,
+    0x5f3ffde600000000, 0x1cf45b6100000000, 0x98afc13200000000,
+    0xdb6467b500000000, 0x73ceb46400000000, 0x300512e300000000,
+    0xb45e88b000000000, 0xf7952e3700000000, 0xbce9bc1700000000,
+    0xff221a9000000000, 0x7b7980c300000000, 0x38b2264400000000,
+    0xed81a48200000000, 0xae4a020500000000, 0x2a11985600000000,
+    0x69da3ed100000000, 0x22a6acf100000000, 0x616d0a7600000000,
+    0xe536902500000000, 0xa6fd36a200000000, 0xe8cb8cba00000000,
+    0xab002a3d00000000, 0x2f5bb06e00000000, 0x6c9016e900000000,
+    0x27ec84c900000000, 0x6427224e00000000, 0xe07cb81d00000000,
+    0xa3b71e9a00000000, 0x76849c5c00000000, 0x354f3adb00000000,
+    0xb114a08800000000, 0xf2df060f00000000, 0xb9a3942f00000000,
+    0xfa6832a800000000, 0x7e33a8fb00000000, 0x3df80e7c00000000,
+    0x9552ddad00000000, 0xd6997b2a00000000, 0x52c2e17900000000,
+    0x110947fe00000000, 0x5a75d5de00000000, 0x19be735900000000,
+    0x9de5e90a00000000, 0xde2e4f8d00000000, 0x0b1dcd4b00000000,
+    0x48d66bcc00000000, 0xcc8df19f00000000, 0x8f46571800000000,
+    0xc43ac53800000000, 0x87f163bf00000000, 0x03aaf9ec00000000,
+    0x40615f6b00000000, 0x12f92f9400000000, 0x5132891300000000,
+    0xd569134000000000, 0x96a2b5c700000000, 0xddde27e700000000,
+    0x9e15816000000000, 0x1a4e1b3300000000, 0x5985bdb400000000,
+    0x8cb63f7200000000, 0xcf7d99f500000000, 0x4b2603a600000000,
+    0x08eda52100000000, 0x4391370100000000, 0x005a918600000000,
+    0x84010bd500000000, 0xc7caad5200000000, 0x6f607e8300000000,
+    0x2cabd80400000000, 0xa8f0425700000000, 0xeb3be4d000000000,
+    0xa04776f000000000, 0xe38cd07700000000, 0x67d74a2400000000,
+    0x241ceca300000000, 0xf12f6e6500000000, 0xb2e4c8e200000000,
+    0x36bf52b100000000, 0x7574f43600000000, 0x3e08661600000000,
+    0x7dc3c09100000000, 0xf9985ac200000000, 0xba53fc4500000000,
+    0x1caecae700000000, 0x5f656c6000000000, 0xdb3ef63300000000,
+    0x98f550b400000000, 0xd389c29400000000, 0x9042641300000000,
+    0x1419fe4000000000, 0x57d258c700000000, 0x82e1da0100000000,
+    0xc12a7c8600000000, 0x4571e6d500000000, 0x06ba405200000000,
+    0x4dc6d27200000000, 0x0e0d74f500000000, 0x8a56eea600000000,
+    0xc99d482100000000, 0x61379bf000000000, 0x22fc3d7700000000,
+    0xa6a7a72400000000, 0xe56c01a300000000, 0xae10938300000000,
+    0xeddb350400000000, 0x6980af5700000000, 0x2a4b09d000000000,
+    0xff788b1600000000, 0xbcb32d9100000000, 0x38e8b7c200000000,
+    0x7b23114500000000, 0x305f836500000000, 0x739425e200000000,
+    0xf7cfbfb100000000, 0xb404193600000000, 0xe69c69c900000000,
+    0xa557cf4e00000000, 0x210c551d00000000, 0x62c7f39a00000000,
+    0x29bb61ba00000000, 0x6a70c73d00000000, 0xee2b5d6e00000000,
+    0xade0fbe900000000, 0x78d3792f00000000, 0x3b18dfa800000000,
+    0xbf4345fb00000000, 0xfc88e37c00000000, 0xb7f4715c00000000,
+    0xf43fd7db00000000, 0x70644d8800000000, 0x33afeb0f00000000,
+    0x9b0538de00000000, 0xd8ce9e5900000000, 0x5c95040a00000000,
+    0x1f5ea28d00000000, 0x542230ad00000000, 0x17e9962a00000000,
+    0x93b20c7900000000, 0xd079aafe00000000, 0x054a283800000000,
+    0x46818ebf00000000, 0xc2da14ec00000000, 0x8111b26b00000000,
+    0xca6d204b00000000, 0x89a686cc00000000, 0x0dfd1c9f00000000,
+    0x4e36ba1800000000},
+   {0x0000000000000000, 0xe1b652ef00000000, 0x836bd40500000000,
+    0x62dd86ea00000000, 0x06d7a80b00000000, 0xe761fae400000000,
+    0x85bc7c0e00000000, 0x640a2ee100000000, 0x0cae511700000000,
+    0xed1803f800000000, 0x8fc5851200000000, 0x6e73d7fd00000000,
+    0x0a79f91c00000000, 0xebcfabf300000000, 0x89122d1900000000,
+    0x68a47ff600000000, 0x185ca32e00000000, 0xf9eaf1c100000000,
+    0x9b37772b00000000, 0x7a8125c400000000, 0x1e8b0b2500000000,
+    0xff3d59ca00000000, 0x9de0df2000000000, 0x7c568dcf00000000,
+    0x14f2f23900000000, 0xf544a0d600000000, 0x9799263c00000000,
+    0x762f74d300000000, 0x12255a3200000000, 0xf39308dd00000000,
+    0x914e8e3700000000, 0x70f8dcd800000000, 0x30b8465d00000000,
+    0xd10e14b200000000, 0xb3d3925800000000, 0x5265c0b700000000,
+    0x366fee5600000000, 0xd7d9bcb900000000, 0xb5043a5300000000,
+    0x54b268bc00000000, 0x3c16174a00000000, 0xdda045a500000000,
+    0xbf7dc34f00000000, 0x5ecb91a000000000, 0x3ac1bf4100000000,
+    0xdb77edae00000000, 0xb9aa6b4400000000, 0x581c39ab00000000,
+    0x28e4e57300000000, 0xc952b79c00000000, 0xab8f317600000000,
+    0x4a39639900000000, 0x2e334d7800000000, 0xcf851f9700000000,
+    0xad58997d00000000, 0x4ceecb9200000000, 0x244ab46400000000,
+    0xc5fce68b00000000, 0xa721606100000000, 0x4697328e00000000,
+    0x229d1c6f00000000, 0xc32b4e8000000000, 0xa1f6c86a00000000,
+    0x40409a8500000000, 0x60708dba00000000, 0x81c6df5500000000,
+    0xe31b59bf00000000, 0x02ad0b5000000000, 0x66a725b100000000,
+    0x8711775e00000000, 0xe5ccf1b400000000, 0x047aa35b00000000,
+    0x6cdedcad00000000, 0x8d688e4200000000, 0xefb508a800000000,
+    0x0e035a4700000000, 0x6a0974a600000000, 0x8bbf264900000000,
+    0xe962a0a300000000, 0x08d4f24c00000000, 0x782c2e9400000000,
+    0x999a7c7b00000000, 0xfb47fa9100000000, 0x1af1a87e00000000,
+    0x7efb869f00000000, 0x9f4dd47000000000, 0xfd90529a00000000,
+    0x1c26007500000000, 0x74827f8300000000, 0x95342d6c00000000,
+    0xf7e9ab8600000000, 0x165ff96900000000, 0x7255d78800000000,
+    0x93e3856700000000, 0xf13e038d00000000, 0x1088516200000000,
+    0x50c8cbe700000000, 0xb17e990800000000, 0xd3a31fe200000000,
+    0x32154d0d00000000, 0x561f63ec00000000, 0xb7a9310300000000,
+    0xd574b7e900000000, 0x34c2e50600000000, 0x5c669af000000000,
+    0xbdd0c81f00000000, 0xdf0d4ef500000000, 0x3ebb1c1a00000000,
+    0x5ab132fb00000000, 0xbb07601400000000, 0xd9dae6fe00000000,
+    0x386cb41100000000, 0x489468c900000000, 0xa9223a2600000000,
+    0xcbffbccc00000000, 0x2a49ee2300000000, 0x4e43c0c200000000,
+    0xaff5922d00000000, 0xcd2814c700000000, 0x2c9e462800000000,
+    0x443a39de00000000, 0xa58c6b3100000000, 0xc751eddb00000000,
+    0x26e7bf3400000000, 0x42ed91d500000000, 0xa35bc33a00000000,
+    0xc18645d000000000, 0x2030173f00000000, 0x81e66bae00000000,
+    0x6050394100000000, 0x028dbfab00000000, 0xe33bed4400000000,
+    0x8731c3a500000000, 0x6687914a00000000, 0x045a17a000000000,
+    0xe5ec454f00000000, 0x8d483ab900000000, 0x6cfe685600000000,
+    0x0e23eebc00000000, 0xef95bc5300000000, 0x8b9f92b200000000,
+    0x6a29c05d00000000, 0x08f446b700000000, 0xe942145800000000,
+    0x99bac88000000000, 0x780c9a6f00000000, 0x1ad11c8500000000,
+    0xfb674e6a00000000, 0x9f6d608b00000000, 0x7edb326400000000,
+    0x1c06b48e00000000, 0xfdb0e66100000000, 0x9514999700000000,
+    0x74a2cb7800000000, 0x167f4d9200000000, 0xf7c91f7d00000000,
+    0x93c3319c00000000, 0x7275637300000000, 0x10a8e59900000000,
+    0xf11eb77600000000, 0xb15e2df300000000, 0x50e87f1c00000000,
+    0x3235f9f600000000, 0xd383ab1900000000, 0xb78985f800000000,
+    0x563fd71700000000, 0x34e251fd00000000, 0xd554031200000000,
+    0xbdf07ce400000000, 0x5c462e0b00000000, 0x3e9ba8e100000000,
+    0xdf2dfa0e00000000, 0xbb27d4ef00000000, 0x5a91860000000000,
+    0x384c00ea00000000, 0xd9fa520500000000, 0xa9028edd00000000,
+    0x48b4dc3200000000, 0x2a695ad800000000, 0xcbdf083700000000,
+    0xafd526d600000000, 0x4e63743900000000, 0x2cbef2d300000000,
+    0xcd08a03c00000000, 0xa5acdfca00000000, 0x441a8d2500000000,
+    0x26c70bcf00000000, 0xc771592000000000, 0xa37b77c100000000,
+    0x42cd252e00000000, 0x2010a3c400000000, 0xc1a6f12b00000000,
+    0xe196e61400000000, 0x0020b4fb00000000, 0x62fd321100000000,
+    0x834b60fe00000000, 0xe7414e1f00000000, 0x06f71cf000000000,
+    0x642a9a1a00000000, 0x859cc8f500000000, 0xed38b70300000000,
+    0x0c8ee5ec00000000, 0x6e53630600000000, 0x8fe531e900000000,
+    0xebef1f0800000000, 0x0a594de700000000, 0x6884cb0d00000000,
+    0x893299e200000000, 0xf9ca453a00000000, 0x187c17d500000000,
+    0x7aa1913f00000000, 0x9b17c3d000000000, 0xff1ded3100000000,
+    0x1eabbfde00000000, 0x7c76393400000000, 0x9dc06bdb00000000,
+    0xf564142d00000000, 0x14d246c200000000, 0x760fc02800000000,
+    0x97b992c700000000, 0xf3b3bc2600000000, 0x1205eec900000000,
+    0x70d8682300000000, 0x916e3acc00000000, 0xd12ea04900000000,
+    0x3098f2a600000000, 0x5245744c00000000, 0xb3f326a300000000,
+    0xd7f9084200000000, 0x364f5aad00000000, 0x5492dc4700000000,
+    0xb5248ea800000000, 0xdd80f15e00000000, 0x3c36a3b100000000,
+    0x5eeb255b00000000, 0xbf5d77b400000000, 0xdb57595500000000,
+    0x3ae10bba00000000, 0x583c8d5000000000, 0xb98adfbf00000000,
+    0xc972036700000000, 0x28c4518800000000, 0x4a19d76200000000,
+    0xabaf858d00000000, 0xcfa5ab6c00000000, 0x2e13f98300000000,
+    0x4cce7f6900000000, 0xad782d8600000000, 0xc5dc527000000000,
+    0x246a009f00000000, 0x46b7867500000000, 0xa701d49a00000000,
+    0xc30bfa7b00000000, 0x22bda89400000000, 0x40602e7e00000000,
+    0xa1d67c9100000000},
+   {0x0000000000000000, 0x5880e2d700000000, 0xf106b47400000000,
+    0xa98656a300000000, 0xe20d68e900000000, 0xba8d8a3e00000000,
+    0x130bdc9d00000000, 0x4b8b3e4a00000000, 0x851da10900000000,
+    0xdd9d43de00000000, 0x741b157d00000000, 0x2c9bf7aa00000000,
+    0x6710c9e000000000, 0x3f902b3700000000, 0x96167d9400000000,
+    0xce969f4300000000, 0x0a3b421300000000, 0x52bba0c400000000,
+    0xfb3df66700000000, 0xa3bd14b000000000, 0xe8362afa00000000,
+    0xb0b6c82d00000000, 0x19309e8e00000000, 0x41b07c5900000000,
+    0x8f26e31a00000000, 0xd7a601cd00000000, 0x7e20576e00000000,
+    0x26a0b5b900000000, 0x6d2b8bf300000000, 0x35ab692400000000,
+    0x9c2d3f8700000000, 0xc4addd5000000000, 0x1476842600000000,
+    0x4cf666f100000000, 0xe570305200000000, 0xbdf0d28500000000,
+    0xf67beccf00000000, 0xaefb0e1800000000, 0x077d58bb00000000,
+    0x5ffdba6c00000000, 0x916b252f00000000, 0xc9ebc7f800000000,
+    0x606d915b00000000, 0x38ed738c00000000, 0x73664dc600000000,
+    0x2be6af1100000000, 0x8260f9b200000000, 0xdae01b6500000000,
+    0x1e4dc63500000000, 0x46cd24e200000000, 0xef4b724100000000,
+    0xb7cb909600000000, 0xfc40aedc00000000, 0xa4c04c0b00000000,
+    0x0d461aa800000000, 0x55c6f87f00000000, 0x9b50673c00000000,
+    0xc3d085eb00000000, 0x6a56d34800000000, 0x32d6319f00000000,
+    0x795d0fd500000000, 0x21dded0200000000, 0x885bbba100000000,
+    0xd0db597600000000, 0x28ec084d00000000, 0x706cea9a00000000,
+    0xd9eabc3900000000, 0x816a5eee00000000, 0xcae160a400000000,
+    0x9261827300000000, 0x3be7d4d000000000, 0x6367360700000000,
+    0xadf1a94400000000, 0xf5714b9300000000, 0x5cf71d3000000000,
+    0x0477ffe700000000, 0x4ffcc1ad00000000, 0x177c237a00000000,
+    0xbefa75d900000000, 0xe67a970e00000000, 0x22d74a5e00000000,
+    0x7a57a88900000000, 0xd3d1fe2a00000000, 0x8b511cfd00000000,
+    0xc0da22b700000000, 0x985ac06000000000, 0x31dc96c300000000,
+    0x695c741400000000, 0xa7caeb5700000000, 0xff4a098000000000,
+    0x56cc5f2300000000, 0x0e4cbdf400000000, 0x45c783be00000000,
+    0x1d47616900000000, 0xb4c137ca00000000, 0xec41d51d00000000,
+    0x3c9a8c6b00000000, 0x641a6ebc00000000, 0xcd9c381f00000000,
+    0x951cdac800000000, 0xde97e48200000000, 0x8617065500000000,
+    0x2f9150f600000000, 0x7711b22100000000, 0xb9872d6200000000,
+    0xe107cfb500000000, 0x4881991600000000, 0x10017bc100000000,
+    0x5b8a458b00000000, 0x030aa75c00000000, 0xaa8cf1ff00000000,
+    0xf20c132800000000, 0x36a1ce7800000000, 0x6e212caf00000000,
+    0xc7a77a0c00000000, 0x9f2798db00000000, 0xd4aca69100000000,
+    0x8c2c444600000000, 0x25aa12e500000000, 0x7d2af03200000000,
+    0xb3bc6f7100000000, 0xeb3c8da600000000, 0x42badb0500000000,
+    0x1a3a39d200000000, 0x51b1079800000000, 0x0931e54f00000000,
+    0xa0b7b3ec00000000, 0xf837513b00000000, 0x50d8119a00000000,
+    0x0858f34d00000000, 0xa1dea5ee00000000, 0xf95e473900000000,
+    0xb2d5797300000000, 0xea559ba400000000, 0x43d3cd0700000000,
+    0x1b532fd000000000, 0xd5c5b09300000000, 0x8d45524400000000,
+    0x24c304e700000000, 0x7c43e63000000000, 0x37c8d87a00000000,
+    0x6f483aad00000000, 0xc6ce6c0e00000000, 0x9e4e8ed900000000,
+    0x5ae3538900000000, 0x0263b15e00000000, 0xabe5e7fd00000000,
+    0xf365052a00000000, 0xb8ee3b6000000000, 0xe06ed9b700000000,
+    0x49e88f1400000000, 0x11686dc300000000, 0xdffef28000000000,
+    0x877e105700000000, 0x2ef846f400000000, 0x7678a42300000000,
+    0x3df39a6900000000, 0x657378be00000000, 0xccf52e1d00000000,
+    0x9475ccca00000000, 0x44ae95bc00000000, 0x1c2e776b00000000,
+    0xb5a821c800000000, 0xed28c31f00000000, 0xa6a3fd5500000000,
+    0xfe231f8200000000, 0x57a5492100000000, 0x0f25abf600000000,
+    0xc1b334b500000000, 0x9933d66200000000, 0x30b580c100000000,
+    0x6835621600000000, 0x23be5c5c00000000, 0x7b3ebe8b00000000,
+    0xd2b8e82800000000, 0x8a380aff00000000, 0x4e95d7af00000000,
+    0x1615357800000000, 0xbf9363db00000000, 0xe713810c00000000,
+    0xac98bf4600000000, 0xf4185d9100000000, 0x5d9e0b3200000000,
+    0x051ee9e500000000, 0xcb8876a600000000, 0x9308947100000000,
+    0x3a8ec2d200000000, 0x620e200500000000, 0x29851e4f00000000,
+    0x7105fc9800000000, 0xd883aa3b00000000, 0x800348ec00000000,
+    0x783419d700000000, 0x20b4fb0000000000, 0x8932ada300000000,
+    0xd1b24f7400000000, 0x9a39713e00000000, 0xc2b993e900000000,
+    0x6b3fc54a00000000, 0x33bf279d00000000, 0xfd29b8de00000000,
+    0xa5a95a0900000000, 0x0c2f0caa00000000, 0x54afee7d00000000,
+    0x1f24d03700000000, 0x47a432e000000000, 0xee22644300000000,
+    0xb6a2869400000000, 0x720f5bc400000000, 0x2a8fb91300000000,
+    0x8309efb000000000, 0xdb890d6700000000, 0x9002332d00000000,
+    0xc882d1fa00000000, 0x6104875900000000, 0x3984658e00000000,
+    0xf712facd00000000, 0xaf92181a00000000, 0x06144eb900000000,
+    0x5e94ac6e00000000, 0x151f922400000000, 0x4d9f70f300000000,
+    0xe419265000000000, 0xbc99c48700000000, 0x6c429df100000000,
+    0x34c27f2600000000, 0x9d44298500000000, 0xc5c4cb5200000000,
+    0x8e4ff51800000000, 0xd6cf17cf00000000, 0x7f49416c00000000,
+    0x27c9a3bb00000000, 0xe95f3cf800000000, 0xb1dfde2f00000000,
+    0x1859888c00000000, 0x40d96a5b00000000, 0x0b52541100000000,
+    0x53d2b6c600000000, 0xfa54e06500000000, 0xa2d402b200000000,
+    0x6679dfe200000000, 0x3ef93d3500000000, 0x977f6b9600000000,
+    0xcfff894100000000, 0x8474b70b00000000, 0xdcf455dc00000000,
+    0x7572037f00000000, 0x2df2e1a800000000, 0xe3647eeb00000000,
+    0xbbe49c3c00000000, 0x1262ca9f00000000, 0x4ae2284800000000,
+    0x0169160200000000, 0x59e9f4d500000000, 0xf06fa27600000000,
+    0xa8ef40a100000000},
+   {0x0000000000000000, 0x463b676500000000, 0x8c76ceca00000000,
+    0xca4da9af00000000, 0x59ebed4e00000000, 0x1fd08a2b00000000,
+    0xd59d238400000000, 0x93a644e100000000, 0xb2d6db9d00000000,
+    0xf4edbcf800000000, 0x3ea0155700000000, 0x789b723200000000,
+    0xeb3d36d300000000, 0xad0651b600000000, 0x674bf81900000000,
+    0x21709f7c00000000, 0x25abc6e000000000, 0x6390a18500000000,
+    0xa9dd082a00000000, 0xefe66f4f00000000, 0x7c402bae00000000,
+    0x3a7b4ccb00000000, 0xf036e56400000000, 0xb60d820100000000,
+    0x977d1d7d00000000, 0xd1467a1800000000, 0x1b0bd3b700000000,
+    0x5d30b4d200000000, 0xce96f03300000000, 0x88ad975600000000,
+    0x42e03ef900000000, 0x04db599c00000000, 0x0b50fc1a00000000,
+    0x4d6b9b7f00000000, 0x872632d000000000, 0xc11d55b500000000,
+    0x52bb115400000000, 0x1480763100000000, 0xdecddf9e00000000,
+    0x98f6b8fb00000000, 0xb986278700000000, 0xffbd40e200000000,
+    0x35f0e94d00000000, 0x73cb8e2800000000, 0xe06dcac900000000,
+    0xa656adac00000000, 0x6c1b040300000000, 0x2a20636600000000,
+    0x2efb3afa00000000, 0x68c05d9f00000000, 0xa28df43000000000,
+    0xe4b6935500000000, 0x7710d7b400000000, 0x312bb0d100000000,
+    0xfb66197e00000000, 0xbd5d7e1b00000000, 0x9c2de16700000000,
+    0xda16860200000000, 0x105b2fad00000000, 0x566048c800000000,
+    0xc5c60c2900000000, 0x83fd6b4c00000000, 0x49b0c2e300000000,
+    0x0f8ba58600000000, 0x16a0f83500000000, 0x509b9f5000000000,
+    0x9ad636ff00000000, 0xdced519a00000000, 0x4f4b157b00000000,
+    0x0970721e00000000, 0xc33ddbb100000000, 0x8506bcd400000000,
+    0xa47623a800000000, 0xe24d44cd00000000, 0x2800ed6200000000,
+    0x6e3b8a0700000000, 0xfd9dcee600000000, 0xbba6a98300000000,
+    0x71eb002c00000000, 0x37d0674900000000, 0x330b3ed500000000,
+    0x753059b000000000, 0xbf7df01f00000000, 0xf946977a00000000,
+    0x6ae0d39b00000000, 0x2cdbb4fe00000000, 0xe6961d5100000000,
+    0xa0ad7a3400000000, 0x81dde54800000000, 0xc7e6822d00000000,
+    0x0dab2b8200000000, 0x4b904ce700000000, 0xd836080600000000,
+    0x9e0d6f6300000000, 0x5440c6cc00000000, 0x127ba1a900000000,
+    0x1df0042f00000000, 0x5bcb634a00000000, 0x9186cae500000000,
+    0xd7bdad8000000000, 0x441be96100000000, 0x02208e0400000000,
+    0xc86d27ab00000000, 0x8e5640ce00000000, 0xaf26dfb200000000,
+    0xe91db8d700000000, 0x2350117800000000, 0x656b761d00000000,
+    0xf6cd32fc00000000, 0xb0f6559900000000, 0x7abbfc3600000000,
+    0x3c809b5300000000, 0x385bc2cf00000000, 0x7e60a5aa00000000,
+    0xb42d0c0500000000, 0xf2166b6000000000, 0x61b02f8100000000,
+    0x278b48e400000000, 0xedc6e14b00000000, 0xabfd862e00000000,
+    0x8a8d195200000000, 0xccb67e3700000000, 0x06fbd79800000000,
+    0x40c0b0fd00000000, 0xd366f41c00000000, 0x955d937900000000,
+    0x5f103ad600000000, 0x192b5db300000000, 0x2c40f16b00000000,
+    0x6a7b960e00000000, 0xa0363fa100000000, 0xe60d58c400000000,
+    0x75ab1c2500000000, 0x33907b4000000000, 0xf9ddd2ef00000000,
+    0xbfe6b58a00000000, 0x9e962af600000000, 0xd8ad4d9300000000,
+    0x12e0e43c00000000, 0x54db835900000000, 0xc77dc7b800000000,
+    0x8146a0dd00000000, 0x4b0b097200000000, 0x0d306e1700000000,
+    0x09eb378b00000000, 0x4fd050ee00000000, 0x859df94100000000,
+    0xc3a69e2400000000, 0x5000dac500000000, 0x163bbda000000000,
+    0xdc76140f00000000, 0x9a4d736a00000000, 0xbb3dec1600000000,
+    0xfd068b7300000000, 0x374b22dc00000000, 0x717045b900000000,
+    0xe2d6015800000000, 0xa4ed663d00000000, 0x6ea0cf9200000000,
+    0x289ba8f700000000, 0x27100d7100000000, 0x612b6a1400000000,
+    0xab66c3bb00000000, 0xed5da4de00000000, 0x7efbe03f00000000,
+    0x38c0875a00000000, 0xf28d2ef500000000, 0xb4b6499000000000,
+    0x95c6d6ec00000000, 0xd3fdb18900000000, 0x19b0182600000000,
+    0x5f8b7f4300000000, 0xcc2d3ba200000000, 0x8a165cc700000000,
+    0x405bf56800000000, 0x0660920d00000000, 0x02bbcb9100000000,
+    0x4480acf400000000, 0x8ecd055b00000000, 0xc8f6623e00000000,
+    0x5b5026df00000000, 0x1d6b41ba00000000, 0xd726e81500000000,
+    0x911d8f7000000000, 0xb06d100c00000000, 0xf656776900000000,
+    0x3c1bdec600000000, 0x7a20b9a300000000, 0xe986fd4200000000,
+    0xafbd9a2700000000, 0x65f0338800000000, 0x23cb54ed00000000,
+    0x3ae0095e00000000, 0x7cdb6e3b00000000, 0xb696c79400000000,
+    0xf0ada0f100000000, 0x630be41000000000, 0x2530837500000000,
+    0xef7d2ada00000000, 0xa9464dbf00000000, 0x8836d2c300000000,
+    0xce0db5a600000000, 0x04401c0900000000, 0x427b7b6c00000000,
+    0xd1dd3f8d00000000, 0x97e658e800000000, 0x5dabf14700000000,
+    0x1b90962200000000, 0x1f4bcfbe00000000, 0x5970a8db00000000,
+    0x933d017400000000, 0xd506661100000000, 0x46a022f000000000,
+    0x009b459500000000, 0xcad6ec3a00000000, 0x8ced8b5f00000000,
+    0xad9d142300000000, 0xeba6734600000000, 0x21ebdae900000000,
+    0x67d0bd8c00000000, 0xf476f96d00000000, 0xb24d9e0800000000,
+    0x780037a700000000, 0x3e3b50c200000000, 0x31b0f54400000000,
+    0x778b922100000000, 0xbdc63b8e00000000, 0xfbfd5ceb00000000,
+    0x685b180a00000000, 0x2e607f6f00000000, 0xe42dd6c000000000,
+    0xa216b1a500000000, 0x83662ed900000000, 0xc55d49bc00000000,
+    0x0f10e01300000000, 0x492b877600000000, 0xda8dc39700000000,
+    0x9cb6a4f200000000, 0x56fb0d5d00000000, 0x10c06a3800000000,
+    0x141b33a400000000, 0x522054c100000000, 0x986dfd6e00000000,
+    0xde569a0b00000000, 0x4df0deea00000000, 0x0bcbb98f00000000,
+    0xc186102000000000, 0x87bd774500000000, 0xa6cde83900000000,
+    0xe0f68f5c00000000, 0x2abb26f300000000, 0x6c80419600000000,
+    0xff26057700000000, 0xb91d621200000000, 0x7350cbbd00000000,
+    0x356bacd800000000},
+   {0x0000000000000000, 0x9e83da9f00000000, 0x7d01c4e400000000,
+    0xe3821e7b00000000, 0xbb04f91200000000, 0x2587238d00000000,
+    0xc6053df600000000, 0x5886e76900000000, 0x7609f22500000000,
+    0xe88a28ba00000000, 0x0b0836c100000000, 0x958bec5e00000000,
+    0xcd0d0b3700000000, 0x538ed1a800000000, 0xb00ccfd300000000,
+    0x2e8f154c00000000, 0xec12e44b00000000, 0x72913ed400000000,
+    0x911320af00000000, 0x0f90fa3000000000, 0x57161d5900000000,
+    0xc995c7c600000000, 0x2a17d9bd00000000, 0xb494032200000000,
+    0x9a1b166e00000000, 0x0498ccf100000000, 0xe71ad28a00000000,
+    0x7999081500000000, 0x211fef7c00000000, 0xbf9c35e300000000,
+    0x5c1e2b9800000000, 0xc29df10700000000, 0xd825c89700000000,
+    0x46a6120800000000, 0xa5240c7300000000, 0x3ba7d6ec00000000,
+    0x6321318500000000, 0xfda2eb1a00000000, 0x1e20f56100000000,
+    0x80a32ffe00000000, 0xae2c3ab200000000, 0x30afe02d00000000,
+    0xd32dfe5600000000, 0x4dae24c900000000, 0x1528c3a000000000,
+    0x8bab193f00000000, 0x6829074400000000, 0xf6aadddb00000000,
+    0x34372cdc00000000, 0xaab4f64300000000, 0x4936e83800000000,
+    0xd7b532a700000000, 0x8f33d5ce00000000, 0x11b00f5100000000,
+    0xf232112a00000000, 0x6cb1cbb500000000, 0x423edef900000000,
+    0xdcbd046600000000, 0x3f3f1a1d00000000, 0xa1bcc08200000000,
+    0xf93a27eb00000000, 0x67b9fd7400000000, 0x843be30f00000000,
+    0x1ab8399000000000, 0xf14de1f400000000, 0x6fce3b6b00000000,
+    0x8c4c251000000000, 0x12cfff8f00000000, 0x4a4918e600000000,
+    0xd4cac27900000000, 0x3748dc0200000000, 0xa9cb069d00000000,
+    0x874413d100000000, 0x19c7c94e00000000, 0xfa45d73500000000,
+    0x64c60daa00000000, 0x3c40eac300000000, 0xa2c3305c00000000,
+    0x41412e2700000000, 0xdfc2f4b800000000, 0x1d5f05bf00000000,
+    0x83dcdf2000000000, 0x605ec15b00000000, 0xfedd1bc400000000,
+    0xa65bfcad00000000, 0x38d8263200000000, 0xdb5a384900000000,
+    0x45d9e2d600000000, 0x6b56f79a00000000, 0xf5d52d0500000000,
+    0x1657337e00000000, 0x88d4e9e100000000, 0xd0520e8800000000,
+    0x4ed1d41700000000, 0xad53ca6c00000000, 0x33d010f300000000,
+    0x2968296300000000, 0xb7ebf3fc00000000, 0x5469ed8700000000,
+    0xcaea371800000000, 0x926cd07100000000, 0x0cef0aee00000000,
+    0xef6d149500000000, 0x71eece0a00000000, 0x5f61db4600000000,
+    0xc1e201d900000000, 0x22601fa200000000, 0xbce3c53d00000000,
+    0xe465225400000000, 0x7ae6f8cb00000000, 0x9964e6b000000000,
+    0x07e73c2f00000000, 0xc57acd2800000000, 0x5bf917b700000000,
+    0xb87b09cc00000000, 0x26f8d35300000000, 0x7e7e343a00000000,
+    0xe0fdeea500000000, 0x037ff0de00000000, 0x9dfc2a4100000000,
+    0xb3733f0d00000000, 0x2df0e59200000000, 0xce72fbe900000000,
+    0x50f1217600000000, 0x0877c61f00000000, 0x96f41c8000000000,
+    0x757602fb00000000, 0xebf5d86400000000, 0xa39db33200000000,
+    0x3d1e69ad00000000, 0xde9c77d600000000, 0x401fad4900000000,
+    0x18994a2000000000, 0x861a90bf00000000, 0x65988ec400000000,
+    0xfb1b545b00000000, 0xd594411700000000, 0x4b179b8800000000,
+    0xa89585f300000000, 0x36165f6c00000000, 0x6e90b80500000000,
+    0xf013629a00000000, 0x13917ce100000000, 0x8d12a67e00000000,
+    0x4f8f577900000000, 0xd10c8de600000000, 0x328e939d00000000,
+    0xac0d490200000000, 0xf48bae6b00000000, 0x6a0874f400000000,
+    0x898a6a8f00000000, 0x1709b01000000000, 0x3986a55c00000000,
+    0xa7057fc300000000, 0x448761b800000000, 0xda04bb2700000000,
+    0x82825c4e00000000, 0x1c0186d100000000, 0xff8398aa00000000,
+    0x6100423500000000, 0x7bb87ba500000000, 0xe53ba13a00000000,
+    0x06b9bf4100000000, 0x983a65de00000000, 0xc0bc82b700000000,
+    0x5e3f582800000000, 0xbdbd465300000000, 0x233e9ccc00000000,
+    0x0db1898000000000, 0x9332531f00000000, 0x70b04d6400000000,
+    0xee3397fb00000000, 0xb6b5709200000000, 0x2836aa0d00000000,
+    0xcbb4b47600000000, 0x55376ee900000000, 0x97aa9fee00000000,
+    0x0929457100000000, 0xeaab5b0a00000000, 0x7428819500000000,
+    0x2cae66fc00000000, 0xb22dbc6300000000, 0x51afa21800000000,
+    0xcf2c788700000000, 0xe1a36dcb00000000, 0x7f20b75400000000,
+    0x9ca2a92f00000000, 0x022173b000000000, 0x5aa794d900000000,
+    0xc4244e4600000000, 0x27a6503d00000000, 0xb9258aa200000000,
+    0x52d052c600000000, 0xcc53885900000000, 0x2fd1962200000000,
+    0xb1524cbd00000000, 0xe9d4abd400000000, 0x7757714b00000000,
+    0x94d56f3000000000, 0x0a56b5af00000000, 0x24d9a0e300000000,
+    0xba5a7a7c00000000, 0x59d8640700000000, 0xc75bbe9800000000,
+    0x9fdd59f100000000, 0x015e836e00000000, 0xe2dc9d1500000000,
+    0x7c5f478a00000000, 0xbec2b68d00000000, 0x20416c1200000000,
+    0xc3c3726900000000, 0x5d40a8f600000000, 0x05c64f9f00000000,
+    0x9b45950000000000, 0x78c78b7b00000000, 0xe64451e400000000,
+    0xc8cb44a800000000, 0x56489e3700000000, 0xb5ca804c00000000,
+    0x2b495ad300000000, 0x73cfbdba00000000, 0xed4c672500000000,
+    0x0ece795e00000000, 0x904da3c100000000, 0x8af59a5100000000,
+    0x147640ce00000000, 0xf7f45eb500000000, 0x6977842a00000000,
+    0x31f1634300000000, 0xaf72b9dc00000000, 0x4cf0a7a700000000,
+    0xd2737d3800000000, 0xfcfc687400000000, 0x627fb2eb00000000,
+    0x81fdac9000000000, 0x1f7e760f00000000, 0x47f8916600000000,
+    0xd97b4bf900000000, 0x3af9558200000000, 0xa47a8f1d00000000,
+    0x66e77e1a00000000, 0xf864a48500000000, 0x1be6bafe00000000,
+    0x8565606100000000, 0xdde3870800000000, 0x43605d9700000000,
+    0xa0e243ec00000000, 0x3e61997300000000, 0x10ee8c3f00000000,
+    0x8e6d56a000000000, 0x6def48db00000000, 0xf36c924400000000,
+    0xabea752d00000000, 0x3569afb200000000, 0xd6ebb1c900000000,
+    0x48686b5600000000},
+   {0x0000000000000000, 0xc064281700000000, 0x80c9502e00000000,
+    0x40ad783900000000, 0x0093a15c00000000, 0xc0f7894b00000000,
+    0x805af17200000000, 0x403ed96500000000, 0x002643b900000000,
+    0xc0426bae00000000, 0x80ef139700000000, 0x408b3b8000000000,
+    0x00b5e2e500000000, 0xc0d1caf200000000, 0x807cb2cb00000000,
+    0x40189adc00000000, 0x414af7a900000000, 0x812edfbe00000000,
+    0xc183a78700000000, 0x01e78f9000000000, 0x41d956f500000000,
+    0x81bd7ee200000000, 0xc11006db00000000, 0x01742ecc00000000,
+    0x416cb41000000000, 0x81089c0700000000, 0xc1a5e43e00000000,
+    0x01c1cc2900000000, 0x41ff154c00000000, 0x819b3d5b00000000,
+    0xc136456200000000, 0x01526d7500000000, 0xc3929f8800000000,
+    0x03f6b79f00000000, 0x435bcfa600000000, 0x833fe7b100000000,
+    0xc3013ed400000000, 0x036516c300000000, 0x43c86efa00000000,
+    0x83ac46ed00000000, 0xc3b4dc3100000000, 0x03d0f42600000000,
+    0x437d8c1f00000000, 0x8319a40800000000, 0xc3277d6d00000000,
+    0x0343557a00000000, 0x43ee2d4300000000, 0x838a055400000000,
+    0x82d8682100000000, 0x42bc403600000000, 0x0211380f00000000,
+    0xc275101800000000, 0x824bc97d00000000, 0x422fe16a00000000,
+    0x0282995300000000, 0xc2e6b14400000000, 0x82fe2b9800000000,
+    0x429a038f00000000, 0x02377bb600000000, 0xc25353a100000000,
+    0x826d8ac400000000, 0x4209a2d300000000, 0x02a4daea00000000,
+    0xc2c0f2fd00000000, 0xc7234eca00000000, 0x074766dd00000000,
+    0x47ea1ee400000000, 0x878e36f300000000, 0xc7b0ef9600000000,
+    0x07d4c78100000000, 0x4779bfb800000000, 0x871d97af00000000,
+    0xc7050d7300000000, 0x0761256400000000, 0x47cc5d5d00000000,
+    0x87a8754a00000000, 0xc796ac2f00000000, 0x07f2843800000000,
+    0x475ffc0100000000, 0x873bd41600000000, 0x8669b96300000000,
+    0x460d917400000000, 0x06a0e94d00000000, 0xc6c4c15a00000000,
+    0x86fa183f00000000, 0x469e302800000000, 0x0633481100000000,
+    0xc657600600000000, 0x864ffada00000000, 0x462bd2cd00000000,
+    0x0686aaf400000000, 0xc6e282e300000000, 0x86dc5b8600000000,
+    0x46b8739100000000, 0x06150ba800000000, 0xc67123bf00000000,
+    0x04b1d14200000000, 0xc4d5f95500000000, 0x8478816c00000000,
+    0x441ca97b00000000, 0x0422701e00000000, 0xc446580900000000,
+    0x84eb203000000000, 0x448f082700000000, 0x049792fb00000000,
+    0xc4f3baec00000000, 0x845ec2d500000000, 0x443aeac200000000,
+    0x040433a700000000, 0xc4601bb000000000, 0x84cd638900000000,
+    0x44a94b9e00000000, 0x45fb26eb00000000, 0x859f0efc00000000,
+    0xc53276c500000000, 0x05565ed200000000, 0x456887b700000000,
+    0x850cafa000000000, 0xc5a1d79900000000, 0x05c5ff8e00000000,
+    0x45dd655200000000, 0x85b94d4500000000, 0xc514357c00000000,
+    0x05701d6b00000000, 0x454ec40e00000000, 0x852aec1900000000,
+    0xc587942000000000, 0x05e3bc3700000000, 0xcf41ed4f00000000,
+    0x0f25c55800000000, 0x4f88bd6100000000, 0x8fec957600000000,
+    0xcfd24c1300000000, 0x0fb6640400000000, 0x4f1b1c3d00000000,
+    0x8f7f342a00000000, 0xcf67aef600000000, 0x0f0386e100000000,
+    0x4faefed800000000, 0x8fcad6cf00000000, 0xcff40faa00000000,
+    0x0f9027bd00000000, 0x4f3d5f8400000000, 0x8f59779300000000,
+    0x8e0b1ae600000000, 0x4e6f32f100000000, 0x0ec24ac800000000,
+    0xcea662df00000000, 0x8e98bbba00000000, 0x4efc93ad00000000,
+    0x0e51eb9400000000, 0xce35c38300000000, 0x8e2d595f00000000,
+    0x4e49714800000000, 0x0ee4097100000000, 0xce80216600000000,
+    0x8ebef80300000000, 0x4edad01400000000, 0x0e77a82d00000000,
+    0xce13803a00000000, 0x0cd372c700000000, 0xccb75ad000000000,
+    0x8c1a22e900000000, 0x4c7e0afe00000000, 0x0c40d39b00000000,
+    0xcc24fb8c00000000, 0x8c8983b500000000, 0x4cedaba200000000,
+    0x0cf5317e00000000, 0xcc91196900000000, 0x8c3c615000000000,
+    0x4c58494700000000, 0x0c66902200000000, 0xcc02b83500000000,
+    0x8cafc00c00000000, 0x4ccbe81b00000000, 0x4d99856e00000000,
+    0x8dfdad7900000000, 0xcd50d54000000000, 0x0d34fd5700000000,
+    0x4d0a243200000000, 0x8d6e0c2500000000, 0xcdc3741c00000000,
+    0x0da75c0b00000000, 0x4dbfc6d700000000, 0x8ddbeec000000000,
+    0xcd7696f900000000, 0x0d12beee00000000, 0x4d2c678b00000000,
+    0x8d484f9c00000000, 0xcde537a500000000, 0x0d811fb200000000,
+    0x0862a38500000000, 0xc8068b9200000000, 0x88abf3ab00000000,
+    0x48cfdbbc00000000, 0x08f102d900000000, 0xc8952ace00000000,
+    0x883852f700000000, 0x485c7ae000000000, 0x0844e03c00000000,
+    0xc820c82b00000000, 0x888db01200000000, 0x48e9980500000000,
+    0x08d7416000000000, 0xc8b3697700000000, 0x881e114e00000000,
+    0x487a395900000000, 0x4928542c00000000, 0x894c7c3b00000000,
+    0xc9e1040200000000, 0x09852c1500000000, 0x49bbf57000000000,
+    0x89dfdd6700000000, 0xc972a55e00000000, 0x09168d4900000000,
+    0x490e179500000000, 0x896a3f8200000000, 0xc9c747bb00000000,
+    0x09a36fac00000000, 0x499db6c900000000, 0x89f99ede00000000,
+    0xc954e6e700000000, 0x0930cef000000000, 0xcbf03c0d00000000,
+    0x0b94141a00000000, 0x4b396c2300000000, 0x8b5d443400000000,
+    0xcb639d5100000000, 0x0b07b54600000000, 0x4baacd7f00000000,
+    0x8bcee56800000000, 0xcbd67fb400000000, 0x0bb257a300000000,
+    0x4b1f2f9a00000000, 0x8b7b078d00000000, 0xcb45dee800000000,
+    0x0b21f6ff00000000, 0x4b8c8ec600000000, 0x8be8a6d100000000,
+    0x8abacba400000000, 0x4adee3b300000000, 0x0a739b8a00000000,
+    0xca17b39d00000000, 0x8a296af800000000, 0x4a4d42ef00000000,
+    0x0ae03ad600000000, 0xca8412c100000000, 0x8a9c881d00000000,
+    0x4af8a00a00000000, 0x0a55d83300000000, 0xca31f02400000000,
+    0x8a0f294100000000, 0x4a6b015600000000, 0x0ac6796f00000000,
+    0xcaa2517800000000},
+   {0x0000000000000000, 0xd4ea739b00000000, 0xe9d396ed00000000,
+    0x3d39e57600000000, 0x93a15c0000000000, 0x474b2f9b00000000,
+    0x7a72caed00000000, 0xae98b97600000000, 0x2643b90000000000,
+    0xf2a9ca9b00000000, 0xcf902fed00000000, 0x1b7a5c7600000000,
+    0xb5e2e50000000000, 0x6108969b00000000, 0x5c3173ed00000000,
+    0x88db007600000000, 0x4c86720100000000, 0x986c019a00000000,
+    0xa555e4ec00000000, 0x71bf977700000000, 0xdf272e0100000000,
+    0x0bcd5d9a00000000, 0x36f4b8ec00000000, 0xe21ecb7700000000,
+    0x6ac5cb0100000000, 0xbe2fb89a00000000, 0x83165dec00000000,
+    0x57fc2e7700000000, 0xf964970100000000, 0x2d8ee49a00000000,
+    0x10b701ec00000000, 0xc45d727700000000, 0x980ce50200000000,
+    0x4ce6969900000000, 0x71df73ef00000000, 0xa535007400000000,
+    0x0badb90200000000, 0xdf47ca9900000000, 0xe27e2fef00000000,
+    0x36945c7400000000, 0xbe4f5c0200000000, 0x6aa52f9900000000,
+    0x579ccaef00000000, 0x8376b97400000000, 0x2dee000200000000,
+    0xf904739900000000, 0xc43d96ef00000000, 0x10d7e57400000000,
+    0xd48a970300000000, 0x0060e49800000000, 0x3d5901ee00000000,
+    0xe9b3727500000000, 0x472bcb0300000000, 0x93c1b89800000000,
+    0xaef85dee00000000, 0x7a122e7500000000, 0xf2c92e0300000000,
+    0x26235d9800000000, 0x1b1ab8ee00000000, 0xcff0cb7500000000,
+    0x6168720300000000, 0xb582019800000000, 0x88bbe4ee00000000,
+    0x5c51977500000000, 0x3019ca0500000000, 0xe4f3b99e00000000,
+    0xd9ca5ce800000000, 0x0d202f7300000000, 0xa3b8960500000000,
+    0x7752e59e00000000, 0x4a6b00e800000000, 0x9e81737300000000,
+    0x165a730500000000, 0xc2b0009e00000000, 0xff89e5e800000000,
+    0x2b63967300000000, 0x85fb2f0500000000, 0x51115c9e00000000,
+    0x6c28b9e800000000, 0xb8c2ca7300000000, 0x7c9fb80400000000,
+    0xa875cb9f00000000, 0x954c2ee900000000, 0x41a65d7200000000,
+    0xef3ee40400000000, 0x3bd4979f00000000, 0x06ed72e900000000,
+    0xd207017200000000, 0x5adc010400000000, 0x8e36729f00000000,
+    0xb30f97e900000000, 0x67e5e47200000000, 0xc97d5d0400000000,
+    0x1d972e9f00000000, 0x20aecbe900000000, 0xf444b87200000000,
+    0xa8152f0700000000, 0x7cff5c9c00000000, 0x41c6b9ea00000000,
+    0x952cca7100000000, 0x3bb4730700000000, 0xef5e009c00000000,
+    0xd267e5ea00000000, 0x068d967100000000, 0x8e56960700000000,
+    0x5abce59c00000000, 0x678500ea00000000, 0xb36f737100000000,
+    0x1df7ca0700000000, 0xc91db99c00000000, 0xf4245cea00000000,
+    0x20ce2f7100000000, 0xe4935d0600000000, 0x30792e9d00000000,
+    0x0d40cbeb00000000, 0xd9aab87000000000, 0x7732010600000000,
+    0xa3d8729d00000000, 0x9ee197eb00000000, 0x4a0be47000000000,
+    0xc2d0e40600000000, 0x163a979d00000000, 0x2b0372eb00000000,
+    0xffe9017000000000, 0x5171b80600000000, 0x859bcb9d00000000,
+    0xb8a22eeb00000000, 0x6c485d7000000000, 0x6032940b00000000,
+    0xb4d8e79000000000, 0x89e102e600000000, 0x5d0b717d00000000,
+    0xf393c80b00000000, 0x2779bb9000000000, 0x1a405ee600000000,
+    0xceaa2d7d00000000, 0x46712d0b00000000, 0x929b5e9000000000,
+    0xafa2bbe600000000, 0x7b48c87d00000000, 0xd5d0710b00000000,
+    0x013a029000000000, 0x3c03e7e600000000, 0xe8e9947d00000000,
+    0x2cb4e60a00000000, 0xf85e959100000000, 0xc56770e700000000,
+    0x118d037c00000000, 0xbf15ba0a00000000, 0x6bffc99100000000,
+    0x56c62ce700000000, 0x822c5f7c00000000, 0x0af75f0a00000000,
+    0xde1d2c9100000000, 0xe324c9e700000000, 0x37ceba7c00000000,
+    0x9956030a00000000, 0x4dbc709100000000, 0x708595e700000000,
+    0xa46fe67c00000000, 0xf83e710900000000, 0x2cd4029200000000,
+    0x11ede7e400000000, 0xc507947f00000000, 0x6b9f2d0900000000,
+    0xbf755e9200000000, 0x824cbbe400000000, 0x56a6c87f00000000,
+    0xde7dc80900000000, 0x0a97bb9200000000, 0x37ae5ee400000000,
+    0xe3442d7f00000000, 0x4ddc940900000000, 0x9936e79200000000,
+    0xa40f02e400000000, 0x70e5717f00000000, 0xb4b8030800000000,
+    0x6052709300000000, 0x5d6b95e500000000, 0x8981e67e00000000,
+    0x27195f0800000000, 0xf3f32c9300000000, 0xcecac9e500000000,
+    0x1a20ba7e00000000, 0x92fbba0800000000, 0x4611c99300000000,
+    0x7b282ce500000000, 0xafc25f7e00000000, 0x015ae60800000000,
+    0xd5b0959300000000, 0xe88970e500000000, 0x3c63037e00000000,
+    0x502b5e0e00000000, 0x84c12d9500000000, 0xb9f8c8e300000000,
+    0x6d12bb7800000000, 0xc38a020e00000000, 0x1760719500000000,
+    0x2a5994e300000000, 0xfeb3e77800000000, 0x7668e70e00000000,
+    0xa282949500000000, 0x9fbb71e300000000, 0x4b51027800000000,
+    0xe5c9bb0e00000000, 0x3123c89500000000, 0x0c1a2de300000000,
+    0xd8f05e7800000000, 0x1cad2c0f00000000, 0xc8475f9400000000,
+    0xf57ebae200000000, 0x2194c97900000000, 0x8f0c700f00000000,
+    0x5be6039400000000, 0x66dfe6e200000000, 0xb235957900000000,
+    0x3aee950f00000000, 0xee04e69400000000, 0xd33d03e200000000,
+    0x07d7707900000000, 0xa94fc90f00000000, 0x7da5ba9400000000,
+    0x409c5fe200000000, 0x94762c7900000000, 0xc827bb0c00000000,
+    0x1ccdc89700000000, 0x21f42de100000000, 0xf51e5e7a00000000,
+    0x5b86e70c00000000, 0x8f6c949700000000, 0xb25571e100000000,
+    0x66bf027a00000000, 0xee64020c00000000, 0x3a8e719700000000,
+    0x07b794e100000000, 0xd35de77a00000000, 0x7dc55e0c00000000,
+    0xa92f2d9700000000, 0x9416c8e100000000, 0x40fcbb7a00000000,
+    0x84a1c90d00000000, 0x504bba9600000000, 0x6d725fe000000000,
+    0xb9982c7b00000000, 0x1700950d00000000, 0xc3eae69600000000,
+    0xfed303e000000000, 0x2a39707b00000000, 0xa2e2700d00000000,
+    0x7608039600000000, 0x4b31e6e000000000, 0x9fdb957b00000000,
+    0x31432c0d00000000, 0xe5a95f9600000000, 0xd890bae000000000,
+    0x0c7ac97b00000000},
+   {0x0000000000000000, 0x2765258100000000, 0x0fcc3bd900000000,
+    0x28a91e5800000000, 0x5f9e066900000000, 0x78fb23e800000000,
+    0x50523db000000000, 0x7737183100000000, 0xbe3c0dd200000000,
+    0x9959285300000000, 0xb1f0360b00000000, 0x9695138a00000000,
+    0xe1a20bbb00000000, 0xc6c72e3a00000000, 0xee6e306200000000,
+    0xc90b15e300000000, 0x3d7f6b7f00000000, 0x1a1a4efe00000000,
+    0x32b350a600000000, 0x15d6752700000000, 0x62e16d1600000000,
+    0x4584489700000000, 0x6d2d56cf00000000, 0x4a48734e00000000,
+    0x834366ad00000000, 0xa426432c00000000, 0x8c8f5d7400000000,
+    0xabea78f500000000, 0xdcdd60c400000000, 0xfbb8454500000000,
+    0xd3115b1d00000000, 0xf4747e9c00000000, 0x7afed6fe00000000,
+    0x5d9bf37f00000000, 0x7532ed2700000000, 0x5257c8a600000000,
+    0x2560d09700000000, 0x0205f51600000000, 0x2aaceb4e00000000,
+    0x0dc9cecf00000000, 0xc4c2db2c00000000, 0xe3a7fead00000000,
+    0xcb0ee0f500000000, 0xec6bc57400000000, 0x9b5cdd4500000000,
+    0xbc39f8c400000000, 0x9490e69c00000000, 0xb3f5c31d00000000,
+    0x4781bd8100000000, 0x60e4980000000000, 0x484d865800000000,
+    0x6f28a3d900000000, 0x181fbbe800000000, 0x3f7a9e6900000000,
+    0x17d3803100000000, 0x30b6a5b000000000, 0xf9bdb05300000000,
+    0xded895d200000000, 0xf6718b8a00000000, 0xd114ae0b00000000,
+    0xa623b63a00000000, 0x814693bb00000000, 0xa9ef8de300000000,
+    0x8e8aa86200000000, 0xb5fadc2600000000, 0x929ff9a700000000,
+    0xba36e7ff00000000, 0x9d53c27e00000000, 0xea64da4f00000000,
+    0xcd01ffce00000000, 0xe5a8e19600000000, 0xc2cdc41700000000,
+    0x0bc6d1f400000000, 0x2ca3f47500000000, 0x040aea2d00000000,
+    0x236fcfac00000000, 0x5458d79d00000000, 0x733df21c00000000,
+    0x5b94ec4400000000, 0x7cf1c9c500000000, 0x8885b75900000000,
+    0xafe092d800000000, 0x87498c8000000000, 0xa02ca90100000000,
+    0xd71bb13000000000, 0xf07e94b100000000, 0xd8d78ae900000000,
+    0xffb2af6800000000, 0x36b9ba8b00000000, 0x11dc9f0a00000000,
+    0x3975815200000000, 0x1e10a4d300000000, 0x6927bce200000000,
+    0x4e42996300000000, 0x66eb873b00000000, 0x418ea2ba00000000,
+    0xcf040ad800000000, 0xe8612f5900000000, 0xc0c8310100000000,
+    0xe7ad148000000000, 0x909a0cb100000000, 0xb7ff293000000000,
+    0x9f56376800000000, 0xb83312e900000000, 0x7138070a00000000,
+    0x565d228b00000000, 0x7ef43cd300000000, 0x5991195200000000,
+    0x2ea6016300000000, 0x09c324e200000000, 0x216a3aba00000000,
+    0x060f1f3b00000000, 0xf27b61a700000000, 0xd51e442600000000,
+    0xfdb75a7e00000000, 0xdad27fff00000000, 0xade567ce00000000,
+    0x8a80424f00000000, 0xa2295c1700000000, 0x854c799600000000,
+    0x4c476c7500000000, 0x6b2249f400000000, 0x438b57ac00000000,
+    0x64ee722d00000000, 0x13d96a1c00000000, 0x34bc4f9d00000000,
+    0x1c1551c500000000, 0x3b70744400000000, 0x6af5b94d00000000,
+    0x4d909ccc00000000, 0x6539829400000000, 0x425ca71500000000,
+    0x356bbf2400000000, 0x120e9aa500000000, 0x3aa784fd00000000,
+    0x1dc2a17c00000000, 0xd4c9b49f00000000, 0xf3ac911e00000000,
+    0xdb058f4600000000, 0xfc60aac700000000, 0x8b57b2f600000000,
+    0xac32977700000000, 0x849b892f00000000, 0xa3feacae00000000,
+    0x578ad23200000000, 0x70eff7b300000000, 0x5846e9eb00000000,
+    0x7f23cc6a00000000, 0x0814d45b00000000, 0x2f71f1da00000000,
+    0x07d8ef8200000000, 0x20bdca0300000000, 0xe9b6dfe000000000,
+    0xced3fa6100000000, 0xe67ae43900000000, 0xc11fc1b800000000,
+    0xb628d98900000000, 0x914dfc0800000000, 0xb9e4e25000000000,
+    0x9e81c7d100000000, 0x100b6fb300000000, 0x376e4a3200000000,
+    0x1fc7546a00000000, 0x38a271eb00000000, 0x4f9569da00000000,
+    0x68f04c5b00000000, 0x4059520300000000, 0x673c778200000000,
+    0xae37626100000000, 0x895247e000000000, 0xa1fb59b800000000,
+    0x869e7c3900000000, 0xf1a9640800000000, 0xd6cc418900000000,
+    0xfe655fd100000000, 0xd9007a5000000000, 0x2d7404cc00000000,
+    0x0a11214d00000000, 0x22b83f1500000000, 0x05dd1a9400000000,
+    0x72ea02a500000000, 0x558f272400000000, 0x7d26397c00000000,
+    0x5a431cfd00000000, 0x9348091e00000000, 0xb42d2c9f00000000,
+    0x9c8432c700000000, 0xbbe1174600000000, 0xccd60f7700000000,
+    0xebb32af600000000, 0xc31a34ae00000000, 0xe47f112f00000000,
+    0xdf0f656b00000000, 0xf86a40ea00000000, 0xd0c35eb200000000,
+    0xf7a67b3300000000, 0x8091630200000000, 0xa7f4468300000000,
+    0x8f5d58db00000000, 0xa8387d5a00000000, 0x613368b900000000,
+    0x46564d3800000000, 0x6eff536000000000, 0x499a76e100000000,
+    0x3ead6ed000000000, 0x19c84b5100000000, 0x3161550900000000,
+    0x1604708800000000, 0xe2700e1400000000, 0xc5152b9500000000,
+    0xedbc35cd00000000, 0xcad9104c00000000, 0xbdee087d00000000,
+    0x9a8b2dfc00000000, 0xb22233a400000000, 0x9547162500000000,
+    0x5c4c03c600000000, 0x7b29264700000000, 0x5380381f00000000,
+    0x74e51d9e00000000, 0x03d205af00000000, 0x24b7202e00000000,
+    0x0c1e3e7600000000, 0x2b7b1bf700000000, 0xa5f1b39500000000,
+    0x8294961400000000, 0xaa3d884c00000000, 0x8d58adcd00000000,
+    0xfa6fb5fc00000000, 0xdd0a907d00000000, 0xf5a38e2500000000,
+    0xd2c6aba400000000, 0x1bcdbe4700000000, 0x3ca89bc600000000,
+    0x1401859e00000000, 0x3364a01f00000000, 0x4453b82e00000000,
+    0x63369daf00000000, 0x4b9f83f700000000, 0x6cfaa67600000000,
+    0x988ed8ea00000000, 0xbfebfd6b00000000, 0x9742e33300000000,
+    0xb027c6b200000000, 0xc710de8300000000, 0xe075fb0200000000,
+    0xc8dce55a00000000, 0xefb9c0db00000000, 0x26b2d53800000000,
+    0x01d7f0b900000000, 0x297eeee100000000, 0x0e1bcb6000000000,
+    0x792cd35100000000, 0x5e49f6d000000000, 0x76e0e88800000000,
+    0x5185cd0900000000}};
+
+#else /* W == 4 */
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f,
+    0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91,
+    0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e,
+    0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c,
+    0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02,
+    0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12,
+    0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567,
+    0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277,
+    0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679,
+    0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b,
+    0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4,
+    0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a,
+    0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0,
+    0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0,
+    0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91,
+    0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881,
+    0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173,
+    0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d,
+    0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912,
+    0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8,
+    0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6,
+    0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6,
+    0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b,
+    0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b,
+    0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75,
+    0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f,
+    0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00,
+    0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee,
+    0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c,
+    0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c,
+    0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d,
+    0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d,
+    0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67,
+    0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89,
+    0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706,
+    0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14,
+    0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a,
+    0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a,
+    0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f,
+    0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f,
+    0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591,
+    0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983,
+    0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c,
+    0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2,
+    0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8,
+    0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8,
+    0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89,
+    0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99,
+    0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b,
+    0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485,
+    0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a,
+    0x36197165},
+   {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382,
+    0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85,
+    0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06,
+    0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca,
+    0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e,
+    0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc,
+    0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616,
+    0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54,
+    0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10,
+    0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc,
+    0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f,
+    0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58,
+    0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef,
+    0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad,
+    0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b,
+    0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29,
+    0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6,
+    0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1,
+    0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622,
+    0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039,
+    0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d,
+    0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f,
+    0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32,
+    0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770,
+    0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034,
+    0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f,
+    0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc,
+    0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db,
+    0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154,
+    0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16,
+    0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0,
+    0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592,
+    0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca,
+    0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd,
+    0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e,
+    0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882,
+    0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6,
+    0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384,
+    0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1,
+    0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3,
+    0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7,
+    0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b,
+    0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8,
+    0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff,
+    0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7,
+    0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5,
+    0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23,
+    0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761,
+    0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee,
+    0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9,
+    0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a,
+    0x1a3b93aa},
+   {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a,
+    0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca,
+    0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3,
+    0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb,
+    0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c,
+    0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58,
+    0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed,
+    0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9,
+    0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e,
+    0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906,
+    0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f,
+    0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf,
+    0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0,
+    0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4,
+    0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769,
+    0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d,
+    0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632,
+    0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82,
+    0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb,
+    0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73,
+    0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484,
+    0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0,
+    0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5,
+    0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1,
+    0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516,
+    0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f,
+    0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946,
+    0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6,
+    0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9,
+    0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad,
+    0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820,
+    0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364,
+    0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab,
+    0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b,
+    0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62,
+    0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a,
+    0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd,
+    0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089,
+    0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c,
+    0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8,
+    0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f,
+    0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477,
+    0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e,
+    0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be,
+    0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71,
+    0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635,
+    0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8,
+    0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc,
+    0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3,
+    0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753,
+    0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a,
+    0xe147d714},
+   {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c,
+    0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b,
+    0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92,
+    0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4,
+    0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069,
+    0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526,
+    0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25,
+    0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a,
+    0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7,
+    0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491,
+    0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958,
+    0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f,
+    0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307,
+    0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648,
+    0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999,
+    0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6,
+    0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a,
+    0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d,
+    0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4,
+    0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61,
+    0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc,
+    0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3,
+    0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53,
+    0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c,
+    0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1,
+    0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c,
+    0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5,
+    0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92,
+    0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e,
+    0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771,
+    0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0,
+    0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def,
+    0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0,
+    0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7,
+    0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e,
+    0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58,
+    0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285,
+    0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca,
+    0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce,
+    0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81,
+    0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c,
+    0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a,
+    0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3,
+    0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4,
+    0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb,
+    0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4,
+    0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75,
+    0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a,
+    0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296,
+    0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1,
+    0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808,
+    0x494f0c4b}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x00000000, 0x43147b17, 0x8628f62e, 0xc53c8d39, 0x0c51ec5d,
+    0x4f45974a, 0x8a791a73, 0xc96d6164, 0x18a2d8bb, 0x5bb6a3ac,
+    0x9e8a2e95, 0xdd9e5582, 0x14f334e6, 0x57e74ff1, 0x92dbc2c8,
+    0xd1cfb9df, 0x7142c0ac, 0x3256bbbb, 0xf76a3682, 0xb47e4d95,
+    0x7d132cf1, 0x3e0757e6, 0xfb3bdadf, 0xb82fa1c8, 0x69e01817,
+    0x2af46300, 0xefc8ee39, 0xacdc952e, 0x65b1f44a, 0x26a58f5d,
+    0xe3990264, 0xa08d7973, 0xa382f182, 0xe0968a95, 0x25aa07ac,
+    0x66be7cbb, 0xafd31ddf, 0xecc766c8, 0x29fbebf1, 0x6aef90e6,
+    0xbb202939, 0xf834522e, 0x3d08df17, 0x7e1ca400, 0xb771c564,
+    0xf465be73, 0x3159334a, 0x724d485d, 0xd2c0312e, 0x91d44a39,
+    0x54e8c700, 0x17fcbc17, 0xde91dd73, 0x9d85a664, 0x58b92b5d,
+    0x1bad504a, 0xca62e995, 0x89769282, 0x4c4a1fbb, 0x0f5e64ac,
+    0xc63305c8, 0x85277edf, 0x401bf3e6, 0x030f88f1, 0x070392de,
+    0x4417e9c9, 0x812b64f0, 0xc23f1fe7, 0x0b527e83, 0x48460594,
+    0x8d7a88ad, 0xce6ef3ba, 0x1fa14a65, 0x5cb53172, 0x9989bc4b,
+    0xda9dc75c, 0x13f0a638, 0x50e4dd2f, 0x95d85016, 0xd6cc2b01,
+    0x76415272, 0x35552965, 0xf069a45c, 0xb37ddf4b, 0x7a10be2f,
+    0x3904c538, 0xfc384801, 0xbf2c3316, 0x6ee38ac9, 0x2df7f1de,
+    0xe8cb7ce7, 0xabdf07f0, 0x62b26694, 0x21a61d83, 0xe49a90ba,
+    0xa78eebad, 0xa481635c, 0xe795184b, 0x22a99572, 0x61bdee65,
+    0xa8d08f01, 0xebc4f416, 0x2ef8792f, 0x6dec0238, 0xbc23bbe7,
+    0xff37c0f0, 0x3a0b4dc9, 0x791f36de, 0xb07257ba, 0xf3662cad,
+    0x365aa194, 0x754eda83, 0xd5c3a3f0, 0x96d7d8e7, 0x53eb55de,
+    0x10ff2ec9, 0xd9924fad, 0x9a8634ba, 0x5fbab983, 0x1caec294,
+    0xcd617b4b, 0x8e75005c, 0x4b498d65, 0x085df672, 0xc1309716,
+    0x8224ec01, 0x47186138, 0x040c1a2f, 0x4f005566, 0x0c142e71,
+    0xc928a348, 0x8a3cd85f, 0x4351b93b, 0x0045c22c, 0xc5794f15,
+    0x866d3402, 0x57a28ddd, 0x14b6f6ca, 0xd18a7bf3, 0x929e00e4,
+    0x5bf36180, 0x18e71a97, 0xdddb97ae, 0x9ecfecb9, 0x3e4295ca,
+    0x7d56eedd, 0xb86a63e4, 0xfb7e18f3, 0x32137997, 0x71070280,
+    0xb43b8fb9, 0xf72ff4ae, 0x26e04d71, 0x65f43666, 0xa0c8bb5f,
+    0xe3dcc048, 0x2ab1a12c, 0x69a5da3b, 0xac995702, 0xef8d2c15,
+    0xec82a4e4, 0xaf96dff3, 0x6aaa52ca, 0x29be29dd, 0xe0d348b9,
+    0xa3c733ae, 0x66fbbe97, 0x25efc580, 0xf4207c5f, 0xb7340748,
+    0x72088a71, 0x311cf166, 0xf8719002, 0xbb65eb15, 0x7e59662c,
+    0x3d4d1d3b, 0x9dc06448, 0xded41f5f, 0x1be89266, 0x58fce971,
+    0x91918815, 0xd285f302, 0x17b97e3b, 0x54ad052c, 0x8562bcf3,
+    0xc676c7e4, 0x034a4add, 0x405e31ca, 0x893350ae, 0xca272bb9,
+    0x0f1ba680, 0x4c0fdd97, 0x4803c7b8, 0x0b17bcaf, 0xce2b3196,
+    0x8d3f4a81, 0x44522be5, 0x074650f2, 0xc27addcb, 0x816ea6dc,
+    0x50a11f03, 0x13b56414, 0xd689e92d, 0x959d923a, 0x5cf0f35e,
+    0x1fe48849, 0xdad80570, 0x99cc7e67, 0x39410714, 0x7a557c03,
+    0xbf69f13a, 0xfc7d8a2d, 0x3510eb49, 0x7604905e, 0xb3381d67,
+    0xf02c6670, 0x21e3dfaf, 0x62f7a4b8, 0xa7cb2981, 0xe4df5296,
+    0x2db233f2, 0x6ea648e5, 0xab9ac5dc, 0xe88ebecb, 0xeb81363a,
+    0xa8954d2d, 0x6da9c014, 0x2ebdbb03, 0xe7d0da67, 0xa4c4a170,
+    0x61f82c49, 0x22ec575e, 0xf323ee81, 0xb0379596, 0x750b18af,
+    0x361f63b8, 0xff7202dc, 0xbc6679cb, 0x795af4f2, 0x3a4e8fe5,
+    0x9ac3f696, 0xd9d78d81, 0x1ceb00b8, 0x5fff7baf, 0x96921acb,
+    0xd58661dc, 0x10baece5, 0x53ae97f2, 0x82612e2d, 0xc175553a,
+    0x0449d803, 0x475da314, 0x8e30c270, 0xcd24b967, 0x0818345e,
+    0x4b0c4f49},
+   {0x00000000, 0x3e6bc2ef, 0x3dd0f504, 0x03bb37eb, 0x7aa0eb09,
+    0x44cb29e6, 0x47701e0d, 0x791bdce2, 0xf440d713, 0xca2b15fc,
+    0xc9902217, 0xf7fbe0f8, 0x8ee03c1a, 0xb08bfef5, 0xb330c91e,
+    0x8d5b0bf1, 0xe881ae27, 0xd6ea6cc8, 0xd5515b23, 0xeb3a99cc,
+    0x9221452e, 0xac4a87c1, 0xaff1b02a, 0x919a72c5, 0x1cc17934,
+    0x22aabbdb, 0x21118c30, 0x1f7a4edf, 0x6661923d, 0x580a50d2,
+    0x5bb16739, 0x65daa5d6, 0xd0035d4f, 0xee689fa0, 0xedd3a84b,
+    0xd3b86aa4, 0xaaa3b646, 0x94c874a9, 0x97734342, 0xa91881ad,
+    0x24438a5c, 0x1a2848b3, 0x19937f58, 0x27f8bdb7, 0x5ee36155,
+    0x6088a3ba, 0x63339451, 0x5d5856be, 0x3882f368, 0x06e93187,
+    0x0552066c, 0x3b39c483, 0x42221861, 0x7c49da8e, 0x7ff2ed65,
+    0x41992f8a, 0xccc2247b, 0xf2a9e694, 0xf112d17f, 0xcf791390,
+    0xb662cf72, 0x88090d9d, 0x8bb23a76, 0xb5d9f899, 0xa007ba9e,
+    0x9e6c7871, 0x9dd74f9a, 0xa3bc8d75, 0xdaa75197, 0xe4cc9378,
+    0xe777a493, 0xd91c667c, 0x54476d8d, 0x6a2caf62, 0x69979889,
+    0x57fc5a66, 0x2ee78684, 0x108c446b, 0x13377380, 0x2d5cb16f,
+    0x488614b9, 0x76edd656, 0x7556e1bd, 0x4b3d2352, 0x3226ffb0,
+    0x0c4d3d5f, 0x0ff60ab4, 0x319dc85b, 0xbcc6c3aa, 0x82ad0145,
+    0x811636ae, 0xbf7df441, 0xc66628a3, 0xf80dea4c, 0xfbb6dda7,
+    0xc5dd1f48, 0x7004e7d1, 0x4e6f253e, 0x4dd412d5, 0x73bfd03a,
+    0x0aa40cd8, 0x34cfce37, 0x3774f9dc, 0x091f3b33, 0x844430c2,
+    0xba2ff22d, 0xb994c5c6, 0x87ff0729, 0xfee4dbcb, 0xc08f1924,
+    0xc3342ecf, 0xfd5fec20, 0x988549f6, 0xa6ee8b19, 0xa555bcf2,
+    0x9b3e7e1d, 0xe225a2ff, 0xdc4e6010, 0xdff557fb, 0xe19e9514,
+    0x6cc59ee5, 0x52ae5c0a, 0x51156be1, 0x6f7ea90e, 0x166575ec,
+    0x280eb703, 0x2bb580e8, 0x15de4207, 0x010905e6, 0x3f62c709,
+    0x3cd9f0e2, 0x02b2320d, 0x7ba9eeef, 0x45c22c00, 0x46791beb,
+    0x7812d904, 0xf549d2f5, 0xcb22101a, 0xc89927f1, 0xf6f2e51e,
+    0x8fe939fc, 0xb182fb13, 0xb239ccf8, 0x8c520e17, 0xe988abc1,
+    0xd7e3692e, 0xd4585ec5, 0xea339c2a, 0x932840c8, 0xad438227,
+    0xaef8b5cc, 0x90937723, 0x1dc87cd2, 0x23a3be3d, 0x201889d6,
+    0x1e734b39, 0x676897db, 0x59035534, 0x5ab862df, 0x64d3a030,
+    0xd10a58a9, 0xef619a46, 0xecdaadad, 0xd2b16f42, 0xabaab3a0,
+    0x95c1714f, 0x967a46a4, 0xa811844b, 0x254a8fba, 0x1b214d55,
+    0x189a7abe, 0x26f1b851, 0x5fea64b3, 0x6181a65c, 0x623a91b7,
+    0x5c515358, 0x398bf68e, 0x07e03461, 0x045b038a, 0x3a30c165,
+    0x432b1d87, 0x7d40df68, 0x7efbe883, 0x40902a6c, 0xcdcb219d,
+    0xf3a0e372, 0xf01bd499, 0xce701676, 0xb76bca94, 0x8900087b,
+    0x8abb3f90, 0xb4d0fd7f, 0xa10ebf78, 0x9f657d97, 0x9cde4a7c,
+    0xa2b58893, 0xdbae5471, 0xe5c5969e, 0xe67ea175, 0xd815639a,
+    0x554e686b, 0x6b25aa84, 0x689e9d6f, 0x56f55f80, 0x2fee8362,
+    0x1185418d, 0x123e7666, 0x2c55b489, 0x498f115f, 0x77e4d3b0,
+    0x745fe45b, 0x4a3426b4, 0x332ffa56, 0x0d4438b9, 0x0eff0f52,
+    0x3094cdbd, 0xbdcfc64c, 0x83a404a3, 0x801f3348, 0xbe74f1a7,
+    0xc76f2d45, 0xf904efaa, 0xfabfd841, 0xc4d41aae, 0x710de237,
+    0x4f6620d8, 0x4cdd1733, 0x72b6d5dc, 0x0bad093e, 0x35c6cbd1,
+    0x367dfc3a, 0x08163ed5, 0x854d3524, 0xbb26f7cb, 0xb89dc020,
+    0x86f602cf, 0xffedde2d, 0xc1861cc2, 0xc23d2b29, 0xfc56e9c6,
+    0x998c4c10, 0xa7e78eff, 0xa45cb914, 0x9a377bfb, 0xe32ca719,
+    0xdd4765f6, 0xdefc521d, 0xe09790f2, 0x6dcc9b03, 0x53a759ec,
+    0x501c6e07, 0x6e77ace8, 0x176c700a, 0x2907b2e5, 0x2abc850e,
+    0x14d747e1},
+   {0x00000000, 0xc0df8ec1, 0xc1b96c58, 0x0166e299, 0x8273d9b0,
+    0x42ac5771, 0x43cab5e8, 0x83153b29, 0x45e1c3ba, 0x853e4d7b,
+    0x8458afe2, 0x44872123, 0xc7921a0a, 0x074d94cb, 0x062b7652,
+    0xc6f4f893, 0xcbc4f6ae, 0x0b1b786f, 0x0a7d9af6, 0xcaa21437,
+    0x49b72f1e, 0x8968a1df, 0x880e4346, 0x48d1cd87, 0x8e253514,
+    0x4efabbd5, 0x4f9c594c, 0x8f43d78d, 0x0c56eca4, 0xcc896265,
+    0xcdef80fc, 0x0d300e3d, 0xd78f9c86, 0x17501247, 0x1636f0de,
+    0xd6e97e1f, 0x55fc4536, 0x9523cbf7, 0x9445296e, 0x549aa7af,
+    0x926e5f3c, 0x52b1d1fd, 0x53d73364, 0x9308bda5, 0x101d868c,
+    0xd0c2084d, 0xd1a4ead4, 0x117b6415, 0x1c4b6a28, 0xdc94e4e9,
+    0xddf20670, 0x1d2d88b1, 0x9e38b398, 0x5ee73d59, 0x5f81dfc0,
+    0x9f5e5101, 0x59aaa992, 0x99752753, 0x9813c5ca, 0x58cc4b0b,
+    0xdbd97022, 0x1b06fee3, 0x1a601c7a, 0xdabf92bb, 0xef1948d6,
+    0x2fc6c617, 0x2ea0248e, 0xee7faa4f, 0x6d6a9166, 0xadb51fa7,
+    0xacd3fd3e, 0x6c0c73ff, 0xaaf88b6c, 0x6a2705ad, 0x6b41e734,
+    0xab9e69f5, 0x288b52dc, 0xe854dc1d, 0xe9323e84, 0x29edb045,
+    0x24ddbe78, 0xe40230b9, 0xe564d220, 0x25bb5ce1, 0xa6ae67c8,
+    0x6671e909, 0x67170b90, 0xa7c88551, 0x613c7dc2, 0xa1e3f303,
+    0xa085119a, 0x605a9f5b, 0xe34fa472, 0x23902ab3, 0x22f6c82a,
+    0xe22946eb, 0x3896d450, 0xf8495a91, 0xf92fb808, 0x39f036c9,
+    0xbae50de0, 0x7a3a8321, 0x7b5c61b8, 0xbb83ef79, 0x7d7717ea,
+    0xbda8992b, 0xbcce7bb2, 0x7c11f573, 0xff04ce5a, 0x3fdb409b,
+    0x3ebda202, 0xfe622cc3, 0xf35222fe, 0x338dac3f, 0x32eb4ea6,
+    0xf234c067, 0x7121fb4e, 0xb1fe758f, 0xb0989716, 0x704719d7,
+    0xb6b3e144, 0x766c6f85, 0x770a8d1c, 0xb7d503dd, 0x34c038f4,
+    0xf41fb635, 0xf57954ac, 0x35a6da6d, 0x9f35e177, 0x5fea6fb6,
+    0x5e8c8d2f, 0x9e5303ee, 0x1d4638c7, 0xdd99b606, 0xdcff549f,
+    0x1c20da5e, 0xdad422cd, 0x1a0bac0c, 0x1b6d4e95, 0xdbb2c054,
+    0x58a7fb7d, 0x987875bc, 0x991e9725, 0x59c119e4, 0x54f117d9,
+    0x942e9918, 0x95487b81, 0x5597f540, 0xd682ce69, 0x165d40a8,
+    0x173ba231, 0xd7e42cf0, 0x1110d463, 0xd1cf5aa2, 0xd0a9b83b,
+    0x107636fa, 0x93630dd3, 0x53bc8312, 0x52da618b, 0x9205ef4a,
+    0x48ba7df1, 0x8865f330, 0x890311a9, 0x49dc9f68, 0xcac9a441,
+    0x0a162a80, 0x0b70c819, 0xcbaf46d8, 0x0d5bbe4b, 0xcd84308a,
+    0xcce2d213, 0x0c3d5cd2, 0x8f2867fb, 0x4ff7e93a, 0x4e910ba3,
+    0x8e4e8562, 0x837e8b5f, 0x43a1059e, 0x42c7e707, 0x821869c6,
+    0x010d52ef, 0xc1d2dc2e, 0xc0b43eb7, 0x006bb076, 0xc69f48e5,
+    0x0640c624, 0x072624bd, 0xc7f9aa7c, 0x44ec9155, 0x84331f94,
+    0x8555fd0d, 0x458a73cc, 0x702ca9a1, 0xb0f32760, 0xb195c5f9,
+    0x714a4b38, 0xf25f7011, 0x3280fed0, 0x33e61c49, 0xf3399288,
+    0x35cd6a1b, 0xf512e4da, 0xf4740643, 0x34ab8882, 0xb7beb3ab,
+    0x77613d6a, 0x7607dff3, 0xb6d85132, 0xbbe85f0f, 0x7b37d1ce,
+    0x7a513357, 0xba8ebd96, 0x399b86bf, 0xf944087e, 0xf822eae7,
+    0x38fd6426, 0xfe099cb5, 0x3ed61274, 0x3fb0f0ed, 0xff6f7e2c,
+    0x7c7a4505, 0xbca5cbc4, 0xbdc3295d, 0x7d1ca79c, 0xa7a33527,
+    0x677cbbe6, 0x661a597f, 0xa6c5d7be, 0x25d0ec97, 0xe50f6256,
+    0xe46980cf, 0x24b60e0e, 0xe242f69d, 0x229d785c, 0x23fb9ac5,
+    0xe3241404, 0x60312f2d, 0xa0eea1ec, 0xa1884375, 0x6157cdb4,
+    0x6c67c389, 0xacb84d48, 0xaddeafd1, 0x6d012110, 0xee141a39,
+    0x2ecb94f8, 0x2fad7661, 0xef72f8a0, 0x29860033, 0xe9598ef2,
+    0xe83f6c6b, 0x28e0e2aa, 0xabf5d983, 0x6b2a5742, 0x6a4cb5db,
+    0xaa933b1a},
+   {0x00000000, 0x6f4ca59b, 0x9f9e3bec, 0xf0d29e77, 0x7f3b0603,
+    0x1077a398, 0xe0a53def, 0x8fe99874, 0xfe760c06, 0x913aa99d,
+    0x61e837ea, 0x0ea49271, 0x814d0a05, 0xee01af9e, 0x1ed331e9,
+    0x719f9472, 0xfced180c, 0x93a1bd97, 0x637323e0, 0x0c3f867b,
+    0x83d61e0f, 0xec9abb94, 0x1c4825e3, 0x73048078, 0x029b140a,
+    0x6dd7b191, 0x9d052fe6, 0xf2498a7d, 0x7da01209, 0x12ecb792,
+    0xe23e29e5, 0x8d728c7e, 0xf8db3118, 0x97979483, 0x67450af4,
+    0x0809af6f, 0x87e0371b, 0xe8ac9280, 0x187e0cf7, 0x7732a96c,
+    0x06ad3d1e, 0x69e19885, 0x993306f2, 0xf67fa369, 0x79963b1d,
+    0x16da9e86, 0xe60800f1, 0x8944a56a, 0x04362914, 0x6b7a8c8f,
+    0x9ba812f8, 0xf4e4b763, 0x7b0d2f17, 0x14418a8c, 0xe49314fb,
+    0x8bdfb160, 0xfa402512, 0x950c8089, 0x65de1efe, 0x0a92bb65,
+    0x857b2311, 0xea37868a, 0x1ae518fd, 0x75a9bd66, 0xf0b76330,
+    0x9ffbc6ab, 0x6f2958dc, 0x0065fd47, 0x8f8c6533, 0xe0c0c0a8,
+    0x10125edf, 0x7f5efb44, 0x0ec16f36, 0x618dcaad, 0x915f54da,
+    0xfe13f141, 0x71fa6935, 0x1eb6ccae, 0xee6452d9, 0x8128f742,
+    0x0c5a7b3c, 0x6316dea7, 0x93c440d0, 0xfc88e54b, 0x73617d3f,
+    0x1c2dd8a4, 0xecff46d3, 0x83b3e348, 0xf22c773a, 0x9d60d2a1,
+    0x6db24cd6, 0x02fee94d, 0x8d177139, 0xe25bd4a2, 0x12894ad5,
+    0x7dc5ef4e, 0x086c5228, 0x6720f7b3, 0x97f269c4, 0xf8becc5f,
+    0x7757542b, 0x181bf1b0, 0xe8c96fc7, 0x8785ca5c, 0xf61a5e2e,
+    0x9956fbb5, 0x698465c2, 0x06c8c059, 0x8921582d, 0xe66dfdb6,
+    0x16bf63c1, 0x79f3c65a, 0xf4814a24, 0x9bcdefbf, 0x6b1f71c8,
+    0x0453d453, 0x8bba4c27, 0xe4f6e9bc, 0x142477cb, 0x7b68d250,
+    0x0af74622, 0x65bbe3b9, 0x95697dce, 0xfa25d855, 0x75cc4021,
+    0x1a80e5ba, 0xea527bcd, 0x851ede56, 0xe06fc760, 0x8f2362fb,
+    0x7ff1fc8c, 0x10bd5917, 0x9f54c163, 0xf01864f8, 0x00cafa8f,
+    0x6f865f14, 0x1e19cb66, 0x71556efd, 0x8187f08a, 0xeecb5511,
+    0x6122cd65, 0x0e6e68fe, 0xfebcf689, 0x91f05312, 0x1c82df6c,
+    0x73ce7af7, 0x831ce480, 0xec50411b, 0x63b9d96f, 0x0cf57cf4,
+    0xfc27e283, 0x936b4718, 0xe2f4d36a, 0x8db876f1, 0x7d6ae886,
+    0x12264d1d, 0x9dcfd569, 0xf28370f2, 0x0251ee85, 0x6d1d4b1e,
+    0x18b4f678, 0x77f853e3, 0x872acd94, 0xe866680f, 0x678ff07b,
+    0x08c355e0, 0xf811cb97, 0x975d6e0c, 0xe6c2fa7e, 0x898e5fe5,
+    0x795cc192, 0x16106409, 0x99f9fc7d, 0xf6b559e6, 0x0667c791,
+    0x692b620a, 0xe459ee74, 0x8b154bef, 0x7bc7d598, 0x148b7003,
+    0x9b62e877, 0xf42e4dec, 0x04fcd39b, 0x6bb07600, 0x1a2fe272,
+    0x756347e9, 0x85b1d99e, 0xeafd7c05, 0x6514e471, 0x0a5841ea,
+    0xfa8adf9d, 0x95c67a06, 0x10d8a450, 0x7f9401cb, 0x8f469fbc,
+    0xe00a3a27, 0x6fe3a253, 0x00af07c8, 0xf07d99bf, 0x9f313c24,
+    0xeeaea856, 0x81e20dcd, 0x713093ba, 0x1e7c3621, 0x9195ae55,
+    0xfed90bce, 0x0e0b95b9, 0x61473022, 0xec35bc5c, 0x837919c7,
+    0x73ab87b0, 0x1ce7222b, 0x930eba5f, 0xfc421fc4, 0x0c9081b3,
+    0x63dc2428, 0x1243b05a, 0x7d0f15c1, 0x8ddd8bb6, 0xe2912e2d,
+    0x6d78b659, 0x023413c2, 0xf2e68db5, 0x9daa282e, 0xe8039548,
+    0x874f30d3, 0x779daea4, 0x18d10b3f, 0x9738934b, 0xf87436d0,
+    0x08a6a8a7, 0x67ea0d3c, 0x1675994e, 0x79393cd5, 0x89eba2a2,
+    0xe6a70739, 0x694e9f4d, 0x06023ad6, 0xf6d0a4a1, 0x999c013a,
+    0x14ee8d44, 0x7ba228df, 0x8b70b6a8, 0xe43c1333, 0x6bd58b47,
+    0x04992edc, 0xf44bb0ab, 0x9b071530, 0xea988142, 0x85d424d9,
+    0x7506baae, 0x1a4a1f35, 0x95a38741, 0xfaef22da, 0x0a3dbcad,
+    0x65711936}};
+
+#endif
+
+#endif
+
+#if N == 4
+
+#if W == 8
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0xf1da05aa, 0x38c50d15, 0xc91f08bf, 0x718a1a2a,
+    0x80501f80, 0x494f173f, 0xb8951295, 0xe3143454, 0x12ce31fe,
+    0xdbd13941, 0x2a0b3ceb, 0x929e2e7e, 0x63442bd4, 0xaa5b236b,
+    0x5b8126c1, 0x1d596ee9, 0xec836b43, 0x259c63fc, 0xd4466656,
+    0x6cd374c3, 0x9d097169, 0x541679d6, 0xa5cc7c7c, 0xfe4d5abd,
+    0x0f975f17, 0xc68857a8, 0x37525202, 0x8fc74097, 0x7e1d453d,
+    0xb7024d82, 0x46d84828, 0x3ab2ddd2, 0xcb68d878, 0x0277d0c7,
+    0xf3add56d, 0x4b38c7f8, 0xbae2c252, 0x73fdcaed, 0x8227cf47,
+    0xd9a6e986, 0x287cec2c, 0xe163e493, 0x10b9e139, 0xa82cf3ac,
+    0x59f6f606, 0x90e9feb9, 0x6133fb13, 0x27ebb33b, 0xd631b691,
+    0x1f2ebe2e, 0xeef4bb84, 0x5661a911, 0xa7bbacbb, 0x6ea4a404,
+    0x9f7ea1ae, 0xc4ff876f, 0x352582c5, 0xfc3a8a7a, 0x0de08fd0,
+    0xb5759d45, 0x44af98ef, 0x8db09050, 0x7c6a95fa, 0x7565bba4,
+    0x84bfbe0e, 0x4da0b6b1, 0xbc7ab31b, 0x04efa18e, 0xf535a424,
+    0x3c2aac9b, 0xcdf0a931, 0x96718ff0, 0x67ab8a5a, 0xaeb482e5,
+    0x5f6e874f, 0xe7fb95da, 0x16219070, 0xdf3e98cf, 0x2ee49d65,
+    0x683cd54d, 0x99e6d0e7, 0x50f9d858, 0xa123ddf2, 0x19b6cf67,
+    0xe86ccacd, 0x2173c272, 0xd0a9c7d8, 0x8b28e119, 0x7af2e4b3,
+    0xb3edec0c, 0x4237e9a6, 0xfaa2fb33, 0x0b78fe99, 0xc267f626,
+    0x33bdf38c, 0x4fd76676, 0xbe0d63dc, 0x77126b63, 0x86c86ec9,
+    0x3e5d7c5c, 0xcf8779f6, 0x06987149, 0xf74274e3, 0xacc35222,
+    0x5d195788, 0x94065f37, 0x65dc5a9d, 0xdd494808, 0x2c934da2,
+    0xe58c451d, 0x145640b7, 0x528e089f, 0xa3540d35, 0x6a4b058a,
+    0x9b910020, 0x230412b5, 0xd2de171f, 0x1bc11fa0, 0xea1b1a0a,
+    0xb19a3ccb, 0x40403961, 0x895f31de, 0x78853474, 0xc01026e1,
+    0x31ca234b, 0xf8d52bf4, 0x090f2e5e, 0xeacb7748, 0x1b1172e2,
+    0xd20e7a5d, 0x23d47ff7, 0x9b416d62, 0x6a9b68c8, 0xa3846077,
+    0x525e65dd, 0x09df431c, 0xf80546b6, 0x311a4e09, 0xc0c04ba3,
+    0x78555936, 0x898f5c9c, 0x40905423, 0xb14a5189, 0xf79219a1,
+    0x06481c0b, 0xcf5714b4, 0x3e8d111e, 0x8618038b, 0x77c20621,
+    0xbedd0e9e, 0x4f070b34, 0x14862df5, 0xe55c285f, 0x2c4320e0,
+    0xdd99254a, 0x650c37df, 0x94d63275, 0x5dc93aca, 0xac133f60,
+    0xd079aa9a, 0x21a3af30, 0xe8bca78f, 0x1966a225, 0xa1f3b0b0,
+    0x5029b51a, 0x9936bda5, 0x68ecb80f, 0x336d9ece, 0xc2b79b64,
+    0x0ba893db, 0xfa729671, 0x42e784e4, 0xb33d814e, 0x7a2289f1,
+    0x8bf88c5b, 0xcd20c473, 0x3cfac1d9, 0xf5e5c966, 0x043fcccc,
+    0xbcaade59, 0x4d70dbf3, 0x846fd34c, 0x75b5d6e6, 0x2e34f027,
+    0xdfeef58d, 0x16f1fd32, 0xe72bf898, 0x5fbeea0d, 0xae64efa7,
+    0x677be718, 0x96a1e2b2, 0x9faeccec, 0x6e74c946, 0xa76bc1f9,
+    0x56b1c453, 0xee24d6c6, 0x1ffed36c, 0xd6e1dbd3, 0x273bde79,
+    0x7cbaf8b8, 0x8d60fd12, 0x447ff5ad, 0xb5a5f007, 0x0d30e292,
+    0xfceae738, 0x35f5ef87, 0xc42fea2d, 0x82f7a205, 0x732da7af,
+    0xba32af10, 0x4be8aaba, 0xf37db82f, 0x02a7bd85, 0xcbb8b53a,
+    0x3a62b090, 0x61e39651, 0x903993fb, 0x59269b44, 0xa8fc9eee,
+    0x10698c7b, 0xe1b389d1, 0x28ac816e, 0xd97684c4, 0xa51c113e,
+    0x54c61494, 0x9dd91c2b, 0x6c031981, 0xd4960b14, 0x254c0ebe,
+    0xec530601, 0x1d8903ab, 0x4608256a, 0xb7d220c0, 0x7ecd287f,
+    0x8f172dd5, 0x37823f40, 0xc6583aea, 0x0f473255, 0xfe9d37ff,
+    0xb8457fd7, 0x499f7a7d, 0x808072c2, 0x715a7768, 0xc9cf65fd,
+    0x38156057, 0xf10a68e8, 0x00d06d42, 0x5b514b83, 0xaa8b4e29,
+    0x63944696, 0x924e433c, 0x2adb51a9, 0xdb015403, 0x121e5cbc,
+    0xe3c45916},
+   {0x00000000, 0x0ee7e8d1, 0x1dcfd1a2, 0x13283973, 0x3b9fa344,
+    0x35784b95, 0x265072e6, 0x28b79a37, 0x773f4688, 0x79d8ae59,
+    0x6af0972a, 0x64177ffb, 0x4ca0e5cc, 0x42470d1d, 0x516f346e,
+    0x5f88dcbf, 0xee7e8d10, 0xe09965c1, 0xf3b15cb2, 0xfd56b463,
+    0xd5e12e54, 0xdb06c685, 0xc82efff6, 0xc6c91727, 0x9941cb98,
+    0x97a62349, 0x848e1a3a, 0x8a69f2eb, 0xa2de68dc, 0xac39800d,
+    0xbf11b97e, 0xb1f651af, 0x078c1c61, 0x096bf4b0, 0x1a43cdc3,
+    0x14a42512, 0x3c13bf25, 0x32f457f4, 0x21dc6e87, 0x2f3b8656,
+    0x70b35ae9, 0x7e54b238, 0x6d7c8b4b, 0x639b639a, 0x4b2cf9ad,
+    0x45cb117c, 0x56e3280f, 0x5804c0de, 0xe9f29171, 0xe71579a0,
+    0xf43d40d3, 0xfadaa802, 0xd26d3235, 0xdc8adae4, 0xcfa2e397,
+    0xc1450b46, 0x9ecdd7f9, 0x902a3f28, 0x8302065b, 0x8de5ee8a,
+    0xa55274bd, 0xabb59c6c, 0xb89da51f, 0xb67a4dce, 0x0f1838c2,
+    0x01ffd013, 0x12d7e960, 0x1c3001b1, 0x34879b86, 0x3a607357,
+    0x29484a24, 0x27afa2f5, 0x78277e4a, 0x76c0969b, 0x65e8afe8,
+    0x6b0f4739, 0x43b8dd0e, 0x4d5f35df, 0x5e770cac, 0x5090e47d,
+    0xe166b5d2, 0xef815d03, 0xfca96470, 0xf24e8ca1, 0xdaf91696,
+    0xd41efe47, 0xc736c734, 0xc9d12fe5, 0x9659f35a, 0x98be1b8b,
+    0x8b9622f8, 0x8571ca29, 0xadc6501e, 0xa321b8cf, 0xb00981bc,
+    0xbeee696d, 0x089424a3, 0x0673cc72, 0x155bf501, 0x1bbc1dd0,
+    0x330b87e7, 0x3dec6f36, 0x2ec45645, 0x2023be94, 0x7fab622b,
+    0x714c8afa, 0x6264b389, 0x6c835b58, 0x4434c16f, 0x4ad329be,
+    0x59fb10cd, 0x571cf81c, 0xe6eaa9b3, 0xe80d4162, 0xfb257811,
+    0xf5c290c0, 0xdd750af7, 0xd392e226, 0xc0badb55, 0xce5d3384,
+    0x91d5ef3b, 0x9f3207ea, 0x8c1a3e99, 0x82fdd648, 0xaa4a4c7f,
+    0xa4ada4ae, 0xb7859ddd, 0xb962750c, 0x1e307184, 0x10d79955,
+    0x03ffa026, 0x0d1848f7, 0x25afd2c0, 0x2b483a11, 0x38600362,
+    0x3687ebb3, 0x690f370c, 0x67e8dfdd, 0x74c0e6ae, 0x7a270e7f,
+    0x52909448, 0x5c777c99, 0x4f5f45ea, 0x41b8ad3b, 0xf04efc94,
+    0xfea91445, 0xed812d36, 0xe366c5e7, 0xcbd15fd0, 0xc536b701,
+    0xd61e8e72, 0xd8f966a3, 0x8771ba1c, 0x899652cd, 0x9abe6bbe,
+    0x9459836f, 0xbcee1958, 0xb209f189, 0xa121c8fa, 0xafc6202b,
+    0x19bc6de5, 0x175b8534, 0x0473bc47, 0x0a945496, 0x2223cea1,
+    0x2cc42670, 0x3fec1f03, 0x310bf7d2, 0x6e832b6d, 0x6064c3bc,
+    0x734cfacf, 0x7dab121e, 0x551c8829, 0x5bfb60f8, 0x48d3598b,
+    0x4634b15a, 0xf7c2e0f5, 0xf9250824, 0xea0d3157, 0xe4ead986,
+    0xcc5d43b1, 0xc2baab60, 0xd1929213, 0xdf757ac2, 0x80fda67d,
+    0x8e1a4eac, 0x9d3277df, 0x93d59f0e, 0xbb620539, 0xb585ede8,
+    0xa6add49b, 0xa84a3c4a, 0x11284946, 0x1fcfa197, 0x0ce798e4,
+    0x02007035, 0x2ab7ea02, 0x245002d3, 0x37783ba0, 0x399fd371,
+    0x66170fce, 0x68f0e71f, 0x7bd8de6c, 0x753f36bd, 0x5d88ac8a,
+    0x536f445b, 0x40477d28, 0x4ea095f9, 0xff56c456, 0xf1b12c87,
+    0xe29915f4, 0xec7efd25, 0xc4c96712, 0xca2e8fc3, 0xd906b6b0,
+    0xd7e15e61, 0x886982de, 0x868e6a0f, 0x95a6537c, 0x9b41bbad,
+    0xb3f6219a, 0xbd11c94b, 0xae39f038, 0xa0de18e9, 0x16a45527,
+    0x1843bdf6, 0x0b6b8485, 0x058c6c54, 0x2d3bf663, 0x23dc1eb2,
+    0x30f427c1, 0x3e13cf10, 0x619b13af, 0x6f7cfb7e, 0x7c54c20d,
+    0x72b32adc, 0x5a04b0eb, 0x54e3583a, 0x47cb6149, 0x492c8998,
+    0xf8dad837, 0xf63d30e6, 0xe5150995, 0xebf2e144, 0xc3457b73,
+    0xcda293a2, 0xde8aaad1, 0xd06d4200, 0x8fe59ebf, 0x8102766e,
+    0x922a4f1d, 0x9ccda7cc, 0xb47a3dfb, 0xba9dd52a, 0xa9b5ec59,
+    0xa7520488},
+   {0x00000000, 0x3c60e308, 0x78c1c610, 0x44a12518, 0xf1838c20,
+    0xcde36f28, 0x89424a30, 0xb522a938, 0x38761e01, 0x0416fd09,
+    0x40b7d811, 0x7cd73b19, 0xc9f59221, 0xf5957129, 0xb1345431,
+    0x8d54b739, 0x70ec3c02, 0x4c8cdf0a, 0x082dfa12, 0x344d191a,
+    0x816fb022, 0xbd0f532a, 0xf9ae7632, 0xc5ce953a, 0x489a2203,
+    0x74fac10b, 0x305be413, 0x0c3b071b, 0xb919ae23, 0x85794d2b,
+    0xc1d86833, 0xfdb88b3b, 0xe1d87804, 0xddb89b0c, 0x9919be14,
+    0xa5795d1c, 0x105bf424, 0x2c3b172c, 0x689a3234, 0x54fad13c,
+    0xd9ae6605, 0xe5ce850d, 0xa16fa015, 0x9d0f431d, 0x282dea25,
+    0x144d092d, 0x50ec2c35, 0x6c8ccf3d, 0x91344406, 0xad54a70e,
+    0xe9f58216, 0xd595611e, 0x60b7c826, 0x5cd72b2e, 0x18760e36,
+    0x2416ed3e, 0xa9425a07, 0x9522b90f, 0xd1839c17, 0xede37f1f,
+    0x58c1d627, 0x64a1352f, 0x20001037, 0x1c60f33f, 0x18c1f649,
+    0x24a11541, 0x60003059, 0x5c60d351, 0xe9427a69, 0xd5229961,
+    0x9183bc79, 0xade35f71, 0x20b7e848, 0x1cd70b40, 0x58762e58,
+    0x6416cd50, 0xd1346468, 0xed548760, 0xa9f5a278, 0x95954170,
+    0x682dca4b, 0x544d2943, 0x10ec0c5b, 0x2c8cef53, 0x99ae466b,
+    0xa5cea563, 0xe16f807b, 0xdd0f6373, 0x505bd44a, 0x6c3b3742,
+    0x289a125a, 0x14faf152, 0xa1d8586a, 0x9db8bb62, 0xd9199e7a,
+    0xe5797d72, 0xf9198e4d, 0xc5796d45, 0x81d8485d, 0xbdb8ab55,
+    0x089a026d, 0x34fae165, 0x705bc47d, 0x4c3b2775, 0xc16f904c,
+    0xfd0f7344, 0xb9ae565c, 0x85ceb554, 0x30ec1c6c, 0x0c8cff64,
+    0x482dda7c, 0x744d3974, 0x89f5b24f, 0xb5955147, 0xf134745f,
+    0xcd549757, 0x78763e6f, 0x4416dd67, 0x00b7f87f, 0x3cd71b77,
+    0xb183ac4e, 0x8de34f46, 0xc9426a5e, 0xf5228956, 0x4000206e,
+    0x7c60c366, 0x38c1e67e, 0x04a10576, 0x3183ec92, 0x0de30f9a,
+    0x49422a82, 0x7522c98a, 0xc00060b2, 0xfc6083ba, 0xb8c1a6a2,
+    0x84a145aa, 0x09f5f293, 0x3595119b, 0x71343483, 0x4d54d78b,
+    0xf8767eb3, 0xc4169dbb, 0x80b7b8a3, 0xbcd75bab, 0x416fd090,
+    0x7d0f3398, 0x39ae1680, 0x05cef588, 0xb0ec5cb0, 0x8c8cbfb8,
+    0xc82d9aa0, 0xf44d79a8, 0x7919ce91, 0x45792d99, 0x01d80881,
+    0x3db8eb89, 0x889a42b1, 0xb4faa1b9, 0xf05b84a1, 0xcc3b67a9,
+    0xd05b9496, 0xec3b779e, 0xa89a5286, 0x94fab18e, 0x21d818b6,
+    0x1db8fbbe, 0x5919dea6, 0x65793dae, 0xe82d8a97, 0xd44d699f,
+    0x90ec4c87, 0xac8caf8f, 0x19ae06b7, 0x25cee5bf, 0x616fc0a7,
+    0x5d0f23af, 0xa0b7a894, 0x9cd74b9c, 0xd8766e84, 0xe4168d8c,
+    0x513424b4, 0x6d54c7bc, 0x29f5e2a4, 0x159501ac, 0x98c1b695,
+    0xa4a1559d, 0xe0007085, 0xdc60938d, 0x69423ab5, 0x5522d9bd,
+    0x1183fca5, 0x2de31fad, 0x29421adb, 0x1522f9d3, 0x5183dccb,
+    0x6de33fc3, 0xd8c196fb, 0xe4a175f3, 0xa00050eb, 0x9c60b3e3,
+    0x113404da, 0x2d54e7d2, 0x69f5c2ca, 0x559521c2, 0xe0b788fa,
+    0xdcd76bf2, 0x98764eea, 0xa416ade2, 0x59ae26d9, 0x65cec5d1,
+    0x216fe0c9, 0x1d0f03c1, 0xa82daaf9, 0x944d49f1, 0xd0ec6ce9,
+    0xec8c8fe1, 0x61d838d8, 0x5db8dbd0, 0x1919fec8, 0x25791dc0,
+    0x905bb4f8, 0xac3b57f0, 0xe89a72e8, 0xd4fa91e0, 0xc89a62df,
+    0xf4fa81d7, 0xb05ba4cf, 0x8c3b47c7, 0x3919eeff, 0x05790df7,
+    0x41d828ef, 0x7db8cbe7, 0xf0ec7cde, 0xcc8c9fd6, 0x882dbace,
+    0xb44d59c6, 0x016ff0fe, 0x3d0f13f6, 0x79ae36ee, 0x45ced5e6,
+    0xb8765edd, 0x8416bdd5, 0xc0b798cd, 0xfcd77bc5, 0x49f5d2fd,
+    0x759531f5, 0x313414ed, 0x0d54f7e5, 0x800040dc, 0xbc60a3d4,
+    0xf8c186cc, 0xc4a165c4, 0x7183ccfc, 0x4de32ff4, 0x09420aec,
+    0x3522e9e4},
+   {0x00000000, 0x6307d924, 0xc60fb248, 0xa5086b6c, 0x576e62d1,
+    0x3469bbf5, 0x9161d099, 0xf26609bd, 0xaedcc5a2, 0xcddb1c86,
+    0x68d377ea, 0x0bd4aece, 0xf9b2a773, 0x9ab57e57, 0x3fbd153b,
+    0x5cbacc1f, 0x86c88d05, 0xe5cf5421, 0x40c73f4d, 0x23c0e669,
+    0xd1a6efd4, 0xb2a136f0, 0x17a95d9c, 0x74ae84b8, 0x281448a7,
+    0x4b139183, 0xee1bfaef, 0x8d1c23cb, 0x7f7a2a76, 0x1c7df352,
+    0xb975983e, 0xda72411a, 0xd6e01c4b, 0xb5e7c56f, 0x10efae03,
+    0x73e87727, 0x818e7e9a, 0xe289a7be, 0x4781ccd2, 0x248615f6,
+    0x783cd9e9, 0x1b3b00cd, 0xbe336ba1, 0xdd34b285, 0x2f52bb38,
+    0x4c55621c, 0xe95d0970, 0x8a5ad054, 0x5028914e, 0x332f486a,
+    0x96272306, 0xf520fa22, 0x0746f39f, 0x64412abb, 0xc14941d7,
+    0xa24e98f3, 0xfef454ec, 0x9df38dc8, 0x38fbe6a4, 0x5bfc3f80,
+    0xa99a363d, 0xca9def19, 0x6f958475, 0x0c925d51, 0x76b13ed7,
+    0x15b6e7f3, 0xb0be8c9f, 0xd3b955bb, 0x21df5c06, 0x42d88522,
+    0xe7d0ee4e, 0x84d7376a, 0xd86dfb75, 0xbb6a2251, 0x1e62493d,
+    0x7d659019, 0x8f0399a4, 0xec044080, 0x490c2bec, 0x2a0bf2c8,
+    0xf079b3d2, 0x937e6af6, 0x3676019a, 0x5571d8be, 0xa717d103,
+    0xc4100827, 0x6118634b, 0x021fba6f, 0x5ea57670, 0x3da2af54,
+    0x98aac438, 0xfbad1d1c, 0x09cb14a1, 0x6acccd85, 0xcfc4a6e9,
+    0xacc37fcd, 0xa051229c, 0xc356fbb8, 0x665e90d4, 0x055949f0,
+    0xf73f404d, 0x94389969, 0x3130f205, 0x52372b21, 0x0e8de73e,
+    0x6d8a3e1a, 0xc8825576, 0xab858c52, 0x59e385ef, 0x3ae45ccb,
+    0x9fec37a7, 0xfcebee83, 0x2699af99, 0x459e76bd, 0xe0961dd1,
+    0x8391c4f5, 0x71f7cd48, 0x12f0146c, 0xb7f87f00, 0xd4ffa624,
+    0x88456a3b, 0xeb42b31f, 0x4e4ad873, 0x2d4d0157, 0xdf2b08ea,
+    0xbc2cd1ce, 0x1924baa2, 0x7a236386, 0xed627dae, 0x8e65a48a,
+    0x2b6dcfe6, 0x486a16c2, 0xba0c1f7f, 0xd90bc65b, 0x7c03ad37,
+    0x1f047413, 0x43beb80c, 0x20b96128, 0x85b10a44, 0xe6b6d360,
+    0x14d0dadd, 0x77d703f9, 0xd2df6895, 0xb1d8b1b1, 0x6baaf0ab,
+    0x08ad298f, 0xada542e3, 0xcea29bc7, 0x3cc4927a, 0x5fc34b5e,
+    0xfacb2032, 0x99ccf916, 0xc5763509, 0xa671ec2d, 0x03798741,
+    0x607e5e65, 0x921857d8, 0xf11f8efc, 0x5417e590, 0x37103cb4,
+    0x3b8261e5, 0x5885b8c1, 0xfd8dd3ad, 0x9e8a0a89, 0x6cec0334,
+    0x0febda10, 0xaae3b17c, 0xc9e46858, 0x955ea447, 0xf6597d63,
+    0x5351160f, 0x3056cf2b, 0xc230c696, 0xa1371fb2, 0x043f74de,
+    0x6738adfa, 0xbd4aece0, 0xde4d35c4, 0x7b455ea8, 0x1842878c,
+    0xea248e31, 0x89235715, 0x2c2b3c79, 0x4f2ce55d, 0x13962942,
+    0x7091f066, 0xd5999b0a, 0xb69e422e, 0x44f84b93, 0x27ff92b7,
+    0x82f7f9db, 0xe1f020ff, 0x9bd34379, 0xf8d49a5d, 0x5ddcf131,
+    0x3edb2815, 0xccbd21a8, 0xafbaf88c, 0x0ab293e0, 0x69b54ac4,
+    0x350f86db, 0x56085fff, 0xf3003493, 0x9007edb7, 0x6261e40a,
+    0x01663d2e, 0xa46e5642, 0xc7698f66, 0x1d1bce7c, 0x7e1c1758,
+    0xdb147c34, 0xb813a510, 0x4a75acad, 0x29727589, 0x8c7a1ee5,
+    0xef7dc7c1, 0xb3c70bde, 0xd0c0d2fa, 0x75c8b996, 0x16cf60b2,
+    0xe4a9690f, 0x87aeb02b, 0x22a6db47, 0x41a10263, 0x4d335f32,
+    0x2e348616, 0x8b3ced7a, 0xe83b345e, 0x1a5d3de3, 0x795ae4c7,
+    0xdc528fab, 0xbf55568f, 0xe3ef9a90, 0x80e843b4, 0x25e028d8,
+    0x46e7f1fc, 0xb481f841, 0xd7862165, 0x728e4a09, 0x1189932d,
+    0xcbfbd237, 0xa8fc0b13, 0x0df4607f, 0x6ef3b95b, 0x9c95b0e6,
+    0xff9269c2, 0x5a9a02ae, 0x399ddb8a, 0x65271795, 0x0620ceb1,
+    0xa328a5dd, 0xc02f7cf9, 0x32497544, 0x514eac60, 0xf446c70c,
+    0x97411e28},
+   {0x00000000, 0x01b5fd1d, 0x036bfa3a, 0x02de0727, 0x06d7f474,
+    0x07620969, 0x05bc0e4e, 0x0409f353, 0x0dafe8e8, 0x0c1a15f5,
+    0x0ec412d2, 0x0f71efcf, 0x0b781c9c, 0x0acde181, 0x0813e6a6,
+    0x09a61bbb, 0x1b5fd1d0, 0x1aea2ccd, 0x18342bea, 0x1981d6f7,
+    0x1d8825a4, 0x1c3dd8b9, 0x1ee3df9e, 0x1f562283, 0x16f03938,
+    0x1745c425, 0x159bc302, 0x142e3e1f, 0x1027cd4c, 0x11923051,
+    0x134c3776, 0x12f9ca6b, 0x36bfa3a0, 0x370a5ebd, 0x35d4599a,
+    0x3461a487, 0x306857d4, 0x31ddaac9, 0x3303adee, 0x32b650f3,
+    0x3b104b48, 0x3aa5b655, 0x387bb172, 0x39ce4c6f, 0x3dc7bf3c,
+    0x3c724221, 0x3eac4506, 0x3f19b81b, 0x2de07270, 0x2c558f6d,
+    0x2e8b884a, 0x2f3e7557, 0x2b378604, 0x2a827b19, 0x285c7c3e,
+    0x29e98123, 0x204f9a98, 0x21fa6785, 0x232460a2, 0x22919dbf,
+    0x26986eec, 0x272d93f1, 0x25f394d6, 0x244669cb, 0x6d7f4740,
+    0x6ccaba5d, 0x6e14bd7a, 0x6fa14067, 0x6ba8b334, 0x6a1d4e29,
+    0x68c3490e, 0x6976b413, 0x60d0afa8, 0x616552b5, 0x63bb5592,
+    0x620ea88f, 0x66075bdc, 0x67b2a6c1, 0x656ca1e6, 0x64d95cfb,
+    0x76209690, 0x77956b8d, 0x754b6caa, 0x74fe91b7, 0x70f762e4,
+    0x71429ff9, 0x739c98de, 0x722965c3, 0x7b8f7e78, 0x7a3a8365,
+    0x78e48442, 0x7951795f, 0x7d588a0c, 0x7ced7711, 0x7e337036,
+    0x7f868d2b, 0x5bc0e4e0, 0x5a7519fd, 0x58ab1eda, 0x591ee3c7,
+    0x5d171094, 0x5ca2ed89, 0x5e7ceaae, 0x5fc917b3, 0x566f0c08,
+    0x57daf115, 0x5504f632, 0x54b10b2f, 0x50b8f87c, 0x510d0561,
+    0x53d30246, 0x5266ff5b, 0x409f3530, 0x412ac82d, 0x43f4cf0a,
+    0x42413217, 0x4648c144, 0x47fd3c59, 0x45233b7e, 0x4496c663,
+    0x4d30ddd8, 0x4c8520c5, 0x4e5b27e2, 0x4feedaff, 0x4be729ac,
+    0x4a52d4b1, 0x488cd396, 0x49392e8b, 0xdafe8e80, 0xdb4b739d,
+    0xd99574ba, 0xd82089a7, 0xdc297af4, 0xdd9c87e9, 0xdf4280ce,
+    0xdef77dd3, 0xd7516668, 0xd6e49b75, 0xd43a9c52, 0xd58f614f,
+    0xd186921c, 0xd0336f01, 0xd2ed6826, 0xd358953b, 0xc1a15f50,
+    0xc014a24d, 0xc2caa56a, 0xc37f5877, 0xc776ab24, 0xc6c35639,
+    0xc41d511e, 0xc5a8ac03, 0xcc0eb7b8, 0xcdbb4aa5, 0xcf654d82,
+    0xced0b09f, 0xcad943cc, 0xcb6cbed1, 0xc9b2b9f6, 0xc80744eb,
+    0xec412d20, 0xedf4d03d, 0xef2ad71a, 0xee9f2a07, 0xea96d954,
+    0xeb232449, 0xe9fd236e, 0xe848de73, 0xe1eec5c8, 0xe05b38d5,
+    0xe2853ff2, 0xe330c2ef, 0xe73931bc, 0xe68ccca1, 0xe452cb86,
+    0xe5e7369b, 0xf71efcf0, 0xf6ab01ed, 0xf47506ca, 0xf5c0fbd7,
+    0xf1c90884, 0xf07cf599, 0xf2a2f2be, 0xf3170fa3, 0xfab11418,
+    0xfb04e905, 0xf9daee22, 0xf86f133f, 0xfc66e06c, 0xfdd31d71,
+    0xff0d1a56, 0xfeb8e74b, 0xb781c9c0, 0xb63434dd, 0xb4ea33fa,
+    0xb55fcee7, 0xb1563db4, 0xb0e3c0a9, 0xb23dc78e, 0xb3883a93,
+    0xba2e2128, 0xbb9bdc35, 0xb945db12, 0xb8f0260f, 0xbcf9d55c,
+    0xbd4c2841, 0xbf922f66, 0xbe27d27b, 0xacde1810, 0xad6be50d,
+    0xafb5e22a, 0xae001f37, 0xaa09ec64, 0xabbc1179, 0xa962165e,
+    0xa8d7eb43, 0xa171f0f8, 0xa0c40de5, 0xa21a0ac2, 0xa3aff7df,
+    0xa7a6048c, 0xa613f991, 0xa4cdfeb6, 0xa57803ab, 0x813e6a60,
+    0x808b977d, 0x8255905a, 0x83e06d47, 0x87e99e14, 0x865c6309,
+    0x8482642e, 0x85379933, 0x8c918288, 0x8d247f95, 0x8ffa78b2,
+    0x8e4f85af, 0x8a4676fc, 0x8bf38be1, 0x892d8cc6, 0x889871db,
+    0x9a61bbb0, 0x9bd446ad, 0x990a418a, 0x98bfbc97, 0x9cb64fc4,
+    0x9d03b2d9, 0x9fddb5fe, 0x9e6848e3, 0x97ce5358, 0x967bae45,
+    0x94a5a962, 0x9510547f, 0x9119a72c, 0x90ac5a31, 0x92725d16,
+    0x93c7a00b},
+   {0x00000000, 0x6e8c1b41, 0xdd183682, 0xb3942dc3, 0x61416b45,
+    0x0fcd7004, 0xbc595dc7, 0xd2d54686, 0xc282d68a, 0xac0ecdcb,
+    0x1f9ae008, 0x7116fb49, 0xa3c3bdcf, 0xcd4fa68e, 0x7edb8b4d,
+    0x1057900c, 0x5e74ab55, 0x30f8b014, 0x836c9dd7, 0xede08696,
+    0x3f35c010, 0x51b9db51, 0xe22df692, 0x8ca1edd3, 0x9cf67ddf,
+    0xf27a669e, 0x41ee4b5d, 0x2f62501c, 0xfdb7169a, 0x933b0ddb,
+    0x20af2018, 0x4e233b59, 0xbce956aa, 0xd2654deb, 0x61f16028,
+    0x0f7d7b69, 0xdda83def, 0xb32426ae, 0x00b00b6d, 0x6e3c102c,
+    0x7e6b8020, 0x10e79b61, 0xa373b6a2, 0xcdffade3, 0x1f2aeb65,
+    0x71a6f024, 0xc232dde7, 0xacbec6a6, 0xe29dfdff, 0x8c11e6be,
+    0x3f85cb7d, 0x5109d03c, 0x83dc96ba, 0xed508dfb, 0x5ec4a038,
+    0x3048bb79, 0x201f2b75, 0x4e933034, 0xfd071df7, 0x938b06b6,
+    0x415e4030, 0x2fd25b71, 0x9c4676b2, 0xf2ca6df3, 0xa2a3ab15,
+    0xcc2fb054, 0x7fbb9d97, 0x113786d6, 0xc3e2c050, 0xad6edb11,
+    0x1efaf6d2, 0x7076ed93, 0x60217d9f, 0x0ead66de, 0xbd394b1d,
+    0xd3b5505c, 0x016016da, 0x6fec0d9b, 0xdc782058, 0xb2f43b19,
+    0xfcd70040, 0x925b1b01, 0x21cf36c2, 0x4f432d83, 0x9d966b05,
+    0xf31a7044, 0x408e5d87, 0x2e0246c6, 0x3e55d6ca, 0x50d9cd8b,
+    0xe34de048, 0x8dc1fb09, 0x5f14bd8f, 0x3198a6ce, 0x820c8b0d,
+    0xec80904c, 0x1e4afdbf, 0x70c6e6fe, 0xc352cb3d, 0xadded07c,
+    0x7f0b96fa, 0x11878dbb, 0xa213a078, 0xcc9fbb39, 0xdcc82b35,
+    0xb2443074, 0x01d01db7, 0x6f5c06f6, 0xbd894070, 0xd3055b31,
+    0x609176f2, 0x0e1d6db3, 0x403e56ea, 0x2eb24dab, 0x9d266068,
+    0xf3aa7b29, 0x217f3daf, 0x4ff326ee, 0xfc670b2d, 0x92eb106c,
+    0x82bc8060, 0xec309b21, 0x5fa4b6e2, 0x3128ada3, 0xe3fdeb25,
+    0x8d71f064, 0x3ee5dda7, 0x5069c6e6, 0x9e36506b, 0xf0ba4b2a,
+    0x432e66e9, 0x2da27da8, 0xff773b2e, 0x91fb206f, 0x226f0dac,
+    0x4ce316ed, 0x5cb486e1, 0x32389da0, 0x81acb063, 0xef20ab22,
+    0x3df5eda4, 0x5379f6e5, 0xe0eddb26, 0x8e61c067, 0xc042fb3e,
+    0xaecee07f, 0x1d5acdbc, 0x73d6d6fd, 0xa103907b, 0xcf8f8b3a,
+    0x7c1ba6f9, 0x1297bdb8, 0x02c02db4, 0x6c4c36f5, 0xdfd81b36,
+    0xb1540077, 0x638146f1, 0x0d0d5db0, 0xbe997073, 0xd0156b32,
+    0x22df06c1, 0x4c531d80, 0xffc73043, 0x914b2b02, 0x439e6d84,
+    0x2d1276c5, 0x9e865b06, 0xf00a4047, 0xe05dd04b, 0x8ed1cb0a,
+    0x3d45e6c9, 0x53c9fd88, 0x811cbb0e, 0xef90a04f, 0x5c048d8c,
+    0x328896cd, 0x7cabad94, 0x1227b6d5, 0xa1b39b16, 0xcf3f8057,
+    0x1deac6d1, 0x7366dd90, 0xc0f2f053, 0xae7eeb12, 0xbe297b1e,
+    0xd0a5605f, 0x63314d9c, 0x0dbd56dd, 0xdf68105b, 0xb1e40b1a,
+    0x027026d9, 0x6cfc3d98, 0x3c95fb7e, 0x5219e03f, 0xe18dcdfc,
+    0x8f01d6bd, 0x5dd4903b, 0x33588b7a, 0x80cca6b9, 0xee40bdf8,
+    0xfe172df4, 0x909b36b5, 0x230f1b76, 0x4d830037, 0x9f5646b1,
+    0xf1da5df0, 0x424e7033, 0x2cc26b72, 0x62e1502b, 0x0c6d4b6a,
+    0xbff966a9, 0xd1757de8, 0x03a03b6e, 0x6d2c202f, 0xdeb80dec,
+    0xb03416ad, 0xa06386a1, 0xceef9de0, 0x7d7bb023, 0x13f7ab62,
+    0xc122ede4, 0xafaef6a5, 0x1c3adb66, 0x72b6c027, 0x807cadd4,
+    0xeef0b695, 0x5d649b56, 0x33e88017, 0xe13dc691, 0x8fb1ddd0,
+    0x3c25f013, 0x52a9eb52, 0x42fe7b5e, 0x2c72601f, 0x9fe64ddc,
+    0xf16a569d, 0x23bf101b, 0x4d330b5a, 0xfea72699, 0x902b3dd8,
+    0xde080681, 0xb0841dc0, 0x03103003, 0x6d9c2b42, 0xbf496dc4,
+    0xd1c57685, 0x62515b46, 0x0cdd4007, 0x1c8ad00b, 0x7206cb4a,
+    0xc192e689, 0xaf1efdc8, 0x7dcbbb4e, 0x1347a00f, 0xa0d38dcc,
+    0xce5f968d},
+   {0x00000000, 0xe71da697, 0x154a4b6f, 0xf257edf8, 0x2a9496de,
+    0xcd893049, 0x3fdeddb1, 0xd8c37b26, 0x55292dbc, 0xb2348b2b,
+    0x406366d3, 0xa77ec044, 0x7fbdbb62, 0x98a01df5, 0x6af7f00d,
+    0x8dea569a, 0xaa525b78, 0x4d4ffdef, 0xbf181017, 0x5805b680,
+    0x80c6cda6, 0x67db6b31, 0x958c86c9, 0x7291205e, 0xff7b76c4,
+    0x1866d053, 0xea313dab, 0x0d2c9b3c, 0xd5efe01a, 0x32f2468d,
+    0xc0a5ab75, 0x27b80de2, 0x8fd5b0b1, 0x68c81626, 0x9a9ffbde,
+    0x7d825d49, 0xa541266f, 0x425c80f8, 0xb00b6d00, 0x5716cb97,
+    0xdafc9d0d, 0x3de13b9a, 0xcfb6d662, 0x28ab70f5, 0xf0680bd3,
+    0x1775ad44, 0xe52240bc, 0x023fe62b, 0x2587ebc9, 0xc29a4d5e,
+    0x30cda0a6, 0xd7d00631, 0x0f137d17, 0xe80edb80, 0x1a593678,
+    0xfd4490ef, 0x70aec675, 0x97b360e2, 0x65e48d1a, 0x82f92b8d,
+    0x5a3a50ab, 0xbd27f63c, 0x4f701bc4, 0xa86dbd53, 0xc4da6723,
+    0x23c7c1b4, 0xd1902c4c, 0x368d8adb, 0xee4ef1fd, 0x0953576a,
+    0xfb04ba92, 0x1c191c05, 0x91f34a9f, 0x76eeec08, 0x84b901f0,
+    0x63a4a767, 0xbb67dc41, 0x5c7a7ad6, 0xae2d972e, 0x493031b9,
+    0x6e883c5b, 0x89959acc, 0x7bc27734, 0x9cdfd1a3, 0x441caa85,
+    0xa3010c12, 0x5156e1ea, 0xb64b477d, 0x3ba111e7, 0xdcbcb770,
+    0x2eeb5a88, 0xc9f6fc1f, 0x11358739, 0xf62821ae, 0x047fcc56,
+    0xe3626ac1, 0x4b0fd792, 0xac127105, 0x5e459cfd, 0xb9583a6a,
+    0x619b414c, 0x8686e7db, 0x74d10a23, 0x93ccacb4, 0x1e26fa2e,
+    0xf93b5cb9, 0x0b6cb141, 0xec7117d6, 0x34b26cf0, 0xd3afca67,
+    0x21f8279f, 0xc6e58108, 0xe15d8cea, 0x06402a7d, 0xf417c785,
+    0x130a6112, 0xcbc91a34, 0x2cd4bca3, 0xde83515b, 0x399ef7cc,
+    0xb474a156, 0x536907c1, 0xa13eea39, 0x46234cae, 0x9ee03788,
+    0x79fd911f, 0x8baa7ce7, 0x6cb7da70, 0x52c5c807, 0xb5d86e90,
+    0x478f8368, 0xa09225ff, 0x78515ed9, 0x9f4cf84e, 0x6d1b15b6,
+    0x8a06b321, 0x07ece5bb, 0xe0f1432c, 0x12a6aed4, 0xf5bb0843,
+    0x2d787365, 0xca65d5f2, 0x3832380a, 0xdf2f9e9d, 0xf897937f,
+    0x1f8a35e8, 0xedddd810, 0x0ac07e87, 0xd20305a1, 0x351ea336,
+    0xc7494ece, 0x2054e859, 0xadbebec3, 0x4aa31854, 0xb8f4f5ac,
+    0x5fe9533b, 0x872a281d, 0x60378e8a, 0x92606372, 0x757dc5e5,
+    0xdd1078b6, 0x3a0dde21, 0xc85a33d9, 0x2f47954e, 0xf784ee68,
+    0x109948ff, 0xe2cea507, 0x05d30390, 0x8839550a, 0x6f24f39d,
+    0x9d731e65, 0x7a6eb8f2, 0xa2adc3d4, 0x45b06543, 0xb7e788bb,
+    0x50fa2e2c, 0x774223ce, 0x905f8559, 0x620868a1, 0x8515ce36,
+    0x5dd6b510, 0xbacb1387, 0x489cfe7f, 0xaf8158e8, 0x226b0e72,
+    0xc576a8e5, 0x3721451d, 0xd03ce38a, 0x08ff98ac, 0xefe23e3b,
+    0x1db5d3c3, 0xfaa87554, 0x961faf24, 0x710209b3, 0x8355e44b,
+    0x644842dc, 0xbc8b39fa, 0x5b969f6d, 0xa9c17295, 0x4edcd402,
+    0xc3368298, 0x242b240f, 0xd67cc9f7, 0x31616f60, 0xe9a21446,
+    0x0ebfb2d1, 0xfce85f29, 0x1bf5f9be, 0x3c4df45c, 0xdb5052cb,
+    0x2907bf33, 0xce1a19a4, 0x16d96282, 0xf1c4c415, 0x039329ed,
+    0xe48e8f7a, 0x6964d9e0, 0x8e797f77, 0x7c2e928f, 0x9b333418,
+    0x43f04f3e, 0xa4ede9a9, 0x56ba0451, 0xb1a7a2c6, 0x19ca1f95,
+    0xfed7b902, 0x0c8054fa, 0xeb9df26d, 0x335e894b, 0xd4432fdc,
+    0x2614c224, 0xc10964b3, 0x4ce33229, 0xabfe94be, 0x59a97946,
+    0xbeb4dfd1, 0x6677a4f7, 0x816a0260, 0x733def98, 0x9420490f,
+    0xb39844ed, 0x5485e27a, 0xa6d20f82, 0x41cfa915, 0x990cd233,
+    0x7e1174a4, 0x8c46995c, 0x6b5b3fcb, 0xe6b16951, 0x01accfc6,
+    0xf3fb223e, 0x14e684a9, 0xcc25ff8f, 0x2b385918, 0xd96fb4e0,
+    0x3e721277},
+   {0x00000000, 0xa58b900e, 0x9066265d, 0x35edb653, 0xfbbd4afb,
+    0x5e36daf5, 0x6bdb6ca6, 0xce50fca8, 0x2c0b93b7, 0x898003b9,
+    0xbc6db5ea, 0x19e625e4, 0xd7b6d94c, 0x723d4942, 0x47d0ff11,
+    0xe25b6f1f, 0x5817276e, 0xfd9cb760, 0xc8710133, 0x6dfa913d,
+    0xa3aa6d95, 0x0621fd9b, 0x33cc4bc8, 0x9647dbc6, 0x741cb4d9,
+    0xd19724d7, 0xe47a9284, 0x41f1028a, 0x8fa1fe22, 0x2a2a6e2c,
+    0x1fc7d87f, 0xba4c4871, 0xb02e4edc, 0x15a5ded2, 0x20486881,
+    0x85c3f88f, 0x4b930427, 0xee189429, 0xdbf5227a, 0x7e7eb274,
+    0x9c25dd6b, 0x39ae4d65, 0x0c43fb36, 0xa9c86b38, 0x67989790,
+    0xc213079e, 0xf7feb1cd, 0x527521c3, 0xe83969b2, 0x4db2f9bc,
+    0x785f4fef, 0xddd4dfe1, 0x13842349, 0xb60fb347, 0x83e20514,
+    0x2669951a, 0xc432fa05, 0x61b96a0b, 0x5454dc58, 0xf1df4c56,
+    0x3f8fb0fe, 0x9a0420f0, 0xafe996a3, 0x0a6206ad, 0xbb2d9bf9,
+    0x1ea60bf7, 0x2b4bbda4, 0x8ec02daa, 0x4090d102, 0xe51b410c,
+    0xd0f6f75f, 0x757d6751, 0x9726084e, 0x32ad9840, 0x07402e13,
+    0xa2cbbe1d, 0x6c9b42b5, 0xc910d2bb, 0xfcfd64e8, 0x5976f4e6,
+    0xe33abc97, 0x46b12c99, 0x735c9aca, 0xd6d70ac4, 0x1887f66c,
+    0xbd0c6662, 0x88e1d031, 0x2d6a403f, 0xcf312f20, 0x6ababf2e,
+    0x5f57097d, 0xfadc9973, 0x348c65db, 0x9107f5d5, 0xa4ea4386,
+    0x0161d388, 0x0b03d525, 0xae88452b, 0x9b65f378, 0x3eee6376,
+    0xf0be9fde, 0x55350fd0, 0x60d8b983, 0xc553298d, 0x27084692,
+    0x8283d69c, 0xb76e60cf, 0x12e5f0c1, 0xdcb50c69, 0x793e9c67,
+    0x4cd32a34, 0xe958ba3a, 0x5314f24b, 0xf69f6245, 0xc372d416,
+    0x66f94418, 0xa8a9b8b0, 0x0d2228be, 0x38cf9eed, 0x9d440ee3,
+    0x7f1f61fc, 0xda94f1f2, 0xef7947a1, 0x4af2d7af, 0x84a22b07,
+    0x2129bb09, 0x14c40d5a, 0xb14f9d54, 0xad2a31b3, 0x08a1a1bd,
+    0x3d4c17ee, 0x98c787e0, 0x56977b48, 0xf31ceb46, 0xc6f15d15,
+    0x637acd1b, 0x8121a204, 0x24aa320a, 0x11478459, 0xb4cc1457,
+    0x7a9ce8ff, 0xdf1778f1, 0xeafacea2, 0x4f715eac, 0xf53d16dd,
+    0x50b686d3, 0x655b3080, 0xc0d0a08e, 0x0e805c26, 0xab0bcc28,
+    0x9ee67a7b, 0x3b6dea75, 0xd936856a, 0x7cbd1564, 0x4950a337,
+    0xecdb3339, 0x228bcf91, 0x87005f9f, 0xb2ede9cc, 0x176679c2,
+    0x1d047f6f, 0xb88fef61, 0x8d625932, 0x28e9c93c, 0xe6b93594,
+    0x4332a59a, 0x76df13c9, 0xd35483c7, 0x310fecd8, 0x94847cd6,
+    0xa169ca85, 0x04e25a8b, 0xcab2a623, 0x6f39362d, 0x5ad4807e,
+    0xff5f1070, 0x45135801, 0xe098c80f, 0xd5757e5c, 0x70feee52,
+    0xbeae12fa, 0x1b2582f4, 0x2ec834a7, 0x8b43a4a9, 0x6918cbb6,
+    0xcc935bb8, 0xf97eedeb, 0x5cf57de5, 0x92a5814d, 0x372e1143,
+    0x02c3a710, 0xa748371e, 0x1607aa4a, 0xb38c3a44, 0x86618c17,
+    0x23ea1c19, 0xedbae0b1, 0x483170bf, 0x7ddcc6ec, 0xd85756e2,
+    0x3a0c39fd, 0x9f87a9f3, 0xaa6a1fa0, 0x0fe18fae, 0xc1b17306,
+    0x643ae308, 0x51d7555b, 0xf45cc555, 0x4e108d24, 0xeb9b1d2a,
+    0xde76ab79, 0x7bfd3b77, 0xb5adc7df, 0x102657d1, 0x25cbe182,
+    0x8040718c, 0x621b1e93, 0xc7908e9d, 0xf27d38ce, 0x57f6a8c0,
+    0x99a65468, 0x3c2dc466, 0x09c07235, 0xac4be23b, 0xa629e496,
+    0x03a27498, 0x364fc2cb, 0x93c452c5, 0x5d94ae6d, 0xf81f3e63,
+    0xcdf28830, 0x6879183e, 0x8a227721, 0x2fa9e72f, 0x1a44517c,
+    0xbfcfc172, 0x719f3dda, 0xd414add4, 0xe1f91b87, 0x44728b89,
+    0xfe3ec3f8, 0x5bb553f6, 0x6e58e5a5, 0xcbd375ab, 0x05838903,
+    0xa008190d, 0x95e5af5e, 0x306e3f50, 0xd235504f, 0x77bec041,
+    0x42537612, 0xe7d8e61c, 0x29881ab4, 0x8c038aba, 0xb9ee3ce9,
+    0x1c65ace7}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x0000000000000000, 0x0e908ba500000000, 0x5d26669000000000,
+    0x53b6ed3500000000, 0xfb4abdfb00000000, 0xf5da365e00000000,
+    0xa66cdb6b00000000, 0xa8fc50ce00000000, 0xb7930b2c00000000,
+    0xb903808900000000, 0xeab56dbc00000000, 0xe425e61900000000,
+    0x4cd9b6d700000000, 0x42493d7200000000, 0x11ffd04700000000,
+    0x1f6f5be200000000, 0x6e27175800000000, 0x60b79cfd00000000,
+    0x330171c800000000, 0x3d91fa6d00000000, 0x956daaa300000000,
+    0x9bfd210600000000, 0xc84bcc3300000000, 0xc6db479600000000,
+    0xd9b41c7400000000, 0xd72497d100000000, 0x84927ae400000000,
+    0x8a02f14100000000, 0x22fea18f00000000, 0x2c6e2a2a00000000,
+    0x7fd8c71f00000000, 0x71484cba00000000, 0xdc4e2eb000000000,
+    0xd2dea51500000000, 0x8168482000000000, 0x8ff8c38500000000,
+    0x2704934b00000000, 0x299418ee00000000, 0x7a22f5db00000000,
+    0x74b27e7e00000000, 0x6bdd259c00000000, 0x654dae3900000000,
+    0x36fb430c00000000, 0x386bc8a900000000, 0x9097986700000000,
+    0x9e0713c200000000, 0xcdb1fef700000000, 0xc321755200000000,
+    0xb26939e800000000, 0xbcf9b24d00000000, 0xef4f5f7800000000,
+    0xe1dfd4dd00000000, 0x4923841300000000, 0x47b30fb600000000,
+    0x1405e28300000000, 0x1a95692600000000, 0x05fa32c400000000,
+    0x0b6ab96100000000, 0x58dc545400000000, 0x564cdff100000000,
+    0xfeb08f3f00000000, 0xf020049a00000000, 0xa396e9af00000000,
+    0xad06620a00000000, 0xf99b2dbb00000000, 0xf70ba61e00000000,
+    0xa4bd4b2b00000000, 0xaa2dc08e00000000, 0x02d1904000000000,
+    0x0c411be500000000, 0x5ff7f6d000000000, 0x51677d7500000000,
+    0x4e08269700000000, 0x4098ad3200000000, 0x132e400700000000,
+    0x1dbecba200000000, 0xb5429b6c00000000, 0xbbd210c900000000,
+    0xe864fdfc00000000, 0xe6f4765900000000, 0x97bc3ae300000000,
+    0x992cb14600000000, 0xca9a5c7300000000, 0xc40ad7d600000000,
+    0x6cf6871800000000, 0x62660cbd00000000, 0x31d0e18800000000,
+    0x3f406a2d00000000, 0x202f31cf00000000, 0x2ebfba6a00000000,
+    0x7d09575f00000000, 0x7399dcfa00000000, 0xdb658c3400000000,
+    0xd5f5079100000000, 0x8643eaa400000000, 0x88d3610100000000,
+    0x25d5030b00000000, 0x2b4588ae00000000, 0x78f3659b00000000,
+    0x7663ee3e00000000, 0xde9fbef000000000, 0xd00f355500000000,
+    0x83b9d86000000000, 0x8d2953c500000000, 0x9246082700000000,
+    0x9cd6838200000000, 0xcf606eb700000000, 0xc1f0e51200000000,
+    0x690cb5dc00000000, 0x679c3e7900000000, 0x342ad34c00000000,
+    0x3aba58e900000000, 0x4bf2145300000000, 0x45629ff600000000,
+    0x16d472c300000000, 0x1844f96600000000, 0xb0b8a9a800000000,
+    0xbe28220d00000000, 0xed9ecf3800000000, 0xe30e449d00000000,
+    0xfc611f7f00000000, 0xf2f194da00000000, 0xa14779ef00000000,
+    0xafd7f24a00000000, 0x072ba28400000000, 0x09bb292100000000,
+    0x5a0dc41400000000, 0x549d4fb100000000, 0xb3312aad00000000,
+    0xbda1a10800000000, 0xee174c3d00000000, 0xe087c79800000000,
+    0x487b975600000000, 0x46eb1cf300000000, 0x155df1c600000000,
+    0x1bcd7a6300000000, 0x04a2218100000000, 0x0a32aa2400000000,
+    0x5984471100000000, 0x5714ccb400000000, 0xffe89c7a00000000,
+    0xf17817df00000000, 0xa2cefaea00000000, 0xac5e714f00000000,
+    0xdd163df500000000, 0xd386b65000000000, 0x80305b6500000000,
+    0x8ea0d0c000000000, 0x265c800e00000000, 0x28cc0bab00000000,
+    0x7b7ae69e00000000, 0x75ea6d3b00000000, 0x6a8536d900000000,
+    0x6415bd7c00000000, 0x37a3504900000000, 0x3933dbec00000000,
+    0x91cf8b2200000000, 0x9f5f008700000000, 0xcce9edb200000000,
+    0xc279661700000000, 0x6f7f041d00000000, 0x61ef8fb800000000,
+    0x3259628d00000000, 0x3cc9e92800000000, 0x9435b9e600000000,
+    0x9aa5324300000000, 0xc913df7600000000, 0xc78354d300000000,
+    0xd8ec0f3100000000, 0xd67c849400000000, 0x85ca69a100000000,
+    0x8b5ae20400000000, 0x23a6b2ca00000000, 0x2d36396f00000000,
+    0x7e80d45a00000000, 0x70105fff00000000, 0x0158134500000000,
+    0x0fc898e000000000, 0x5c7e75d500000000, 0x52eefe7000000000,
+    0xfa12aebe00000000, 0xf482251b00000000, 0xa734c82e00000000,
+    0xa9a4438b00000000, 0xb6cb186900000000, 0xb85b93cc00000000,
+    0xebed7ef900000000, 0xe57df55c00000000, 0x4d81a59200000000,
+    0x43112e3700000000, 0x10a7c30200000000, 0x1e3748a700000000,
+    0x4aaa071600000000, 0x443a8cb300000000, 0x178c618600000000,
+    0x191cea2300000000, 0xb1e0baed00000000, 0xbf70314800000000,
+    0xecc6dc7d00000000, 0xe25657d800000000, 0xfd390c3a00000000,
+    0xf3a9879f00000000, 0xa01f6aaa00000000, 0xae8fe10f00000000,
+    0x0673b1c100000000, 0x08e33a6400000000, 0x5b55d75100000000,
+    0x55c55cf400000000, 0x248d104e00000000, 0x2a1d9beb00000000,
+    0x79ab76de00000000, 0x773bfd7b00000000, 0xdfc7adb500000000,
+    0xd157261000000000, 0x82e1cb2500000000, 0x8c71408000000000,
+    0x931e1b6200000000, 0x9d8e90c700000000, 0xce387df200000000,
+    0xc0a8f65700000000, 0x6854a69900000000, 0x66c42d3c00000000,
+    0x3572c00900000000, 0x3be24bac00000000, 0x96e429a600000000,
+    0x9874a20300000000, 0xcbc24f3600000000, 0xc552c49300000000,
+    0x6dae945d00000000, 0x633e1ff800000000, 0x3088f2cd00000000,
+    0x3e18796800000000, 0x2177228a00000000, 0x2fe7a92f00000000,
+    0x7c51441a00000000, 0x72c1cfbf00000000, 0xda3d9f7100000000,
+    0xd4ad14d400000000, 0x871bf9e100000000, 0x898b724400000000,
+    0xf8c33efe00000000, 0xf653b55b00000000, 0xa5e5586e00000000,
+    0xab75d3cb00000000, 0x0389830500000000, 0x0d1908a000000000,
+    0x5eafe59500000000, 0x503f6e3000000000, 0x4f5035d200000000,
+    0x41c0be7700000000, 0x1276534200000000, 0x1ce6d8e700000000,
+    0xb41a882900000000, 0xba8a038c00000000, 0xe93ceeb900000000,
+    0xe7ac651c00000000},
+   {0x0000000000000000, 0x97a61de700000000, 0x6f4b4a1500000000,
+    0xf8ed57f200000000, 0xde96942a00000000, 0x493089cd00000000,
+    0xb1ddde3f00000000, 0x267bc3d800000000, 0xbc2d295500000000,
+    0x2b8b34b200000000, 0xd366634000000000, 0x44c07ea700000000,
+    0x62bbbd7f00000000, 0xf51da09800000000, 0x0df0f76a00000000,
+    0x9a56ea8d00000000, 0x785b52aa00000000, 0xeffd4f4d00000000,
+    0x171018bf00000000, 0x80b6055800000000, 0xa6cdc68000000000,
+    0x316bdb6700000000, 0xc9868c9500000000, 0x5e20917200000000,
+    0xc4767bff00000000, 0x53d0661800000000, 0xab3d31ea00000000,
+    0x3c9b2c0d00000000, 0x1ae0efd500000000, 0x8d46f23200000000,
+    0x75aba5c000000000, 0xe20db82700000000, 0xb1b0d58f00000000,
+    0x2616c86800000000, 0xdefb9f9a00000000, 0x495d827d00000000,
+    0x6f2641a500000000, 0xf8805c4200000000, 0x006d0bb000000000,
+    0x97cb165700000000, 0x0d9dfcda00000000, 0x9a3be13d00000000,
+    0x62d6b6cf00000000, 0xf570ab2800000000, 0xd30b68f000000000,
+    0x44ad751700000000, 0xbc4022e500000000, 0x2be63f0200000000,
+    0xc9eb872500000000, 0x5e4d9ac200000000, 0xa6a0cd3000000000,
+    0x3106d0d700000000, 0x177d130f00000000, 0x80db0ee800000000,
+    0x7836591a00000000, 0xef9044fd00000000, 0x75c6ae7000000000,
+    0xe260b39700000000, 0x1a8de46500000000, 0x8d2bf98200000000,
+    0xab503a5a00000000, 0x3cf627bd00000000, 0xc41b704f00000000,
+    0x53bd6da800000000, 0x2367dac400000000, 0xb4c1c72300000000,
+    0x4c2c90d100000000, 0xdb8a8d3600000000, 0xfdf14eee00000000,
+    0x6a57530900000000, 0x92ba04fb00000000, 0x051c191c00000000,
+    0x9f4af39100000000, 0x08ecee7600000000, 0xf001b98400000000,
+    0x67a7a46300000000, 0x41dc67bb00000000, 0xd67a7a5c00000000,
+    0x2e972dae00000000, 0xb931304900000000, 0x5b3c886e00000000,
+    0xcc9a958900000000, 0x3477c27b00000000, 0xa3d1df9c00000000,
+    0x85aa1c4400000000, 0x120c01a300000000, 0xeae1565100000000,
+    0x7d474bb600000000, 0xe711a13b00000000, 0x70b7bcdc00000000,
+    0x885aeb2e00000000, 0x1ffcf6c900000000, 0x3987351100000000,
+    0xae2128f600000000, 0x56cc7f0400000000, 0xc16a62e300000000,
+    0x92d70f4b00000000, 0x057112ac00000000, 0xfd9c455e00000000,
+    0x6a3a58b900000000, 0x4c419b6100000000, 0xdbe7868600000000,
+    0x230ad17400000000, 0xb4accc9300000000, 0x2efa261e00000000,
+    0xb95c3bf900000000, 0x41b16c0b00000000, 0xd61771ec00000000,
+    0xf06cb23400000000, 0x67caafd300000000, 0x9f27f82100000000,
+    0x0881e5c600000000, 0xea8c5de100000000, 0x7d2a400600000000,
+    0x85c717f400000000, 0x12610a1300000000, 0x341ac9cb00000000,
+    0xa3bcd42c00000000, 0x5b5183de00000000, 0xccf79e3900000000,
+    0x56a174b400000000, 0xc107695300000000, 0x39ea3ea100000000,
+    0xae4c234600000000, 0x8837e09e00000000, 0x1f91fd7900000000,
+    0xe77caa8b00000000, 0x70dab76c00000000, 0x07c8c55200000000,
+    0x906ed8b500000000, 0x68838f4700000000, 0xff2592a000000000,
+    0xd95e517800000000, 0x4ef84c9f00000000, 0xb6151b6d00000000,
+    0x21b3068a00000000, 0xbbe5ec0700000000, 0x2c43f1e000000000,
+    0xd4aea61200000000, 0x4308bbf500000000, 0x6573782d00000000,
+    0xf2d565ca00000000, 0x0a38323800000000, 0x9d9e2fdf00000000,
+    0x7f9397f800000000, 0xe8358a1f00000000, 0x10d8dded00000000,
+    0x877ec00a00000000, 0xa10503d200000000, 0x36a31e3500000000,
+    0xce4e49c700000000, 0x59e8542000000000, 0xc3bebead00000000,
+    0x5418a34a00000000, 0xacf5f4b800000000, 0x3b53e95f00000000,
+    0x1d282a8700000000, 0x8a8e376000000000, 0x7263609200000000,
+    0xe5c57d7500000000, 0xb67810dd00000000, 0x21de0d3a00000000,
+    0xd9335ac800000000, 0x4e95472f00000000, 0x68ee84f700000000,
+    0xff48991000000000, 0x07a5cee200000000, 0x9003d30500000000,
+    0x0a55398800000000, 0x9df3246f00000000, 0x651e739d00000000,
+    0xf2b86e7a00000000, 0xd4c3ada200000000, 0x4365b04500000000,
+    0xbb88e7b700000000, 0x2c2efa5000000000, 0xce23427700000000,
+    0x59855f9000000000, 0xa168086200000000, 0x36ce158500000000,
+    0x10b5d65d00000000, 0x8713cbba00000000, 0x7ffe9c4800000000,
+    0xe85881af00000000, 0x720e6b2200000000, 0xe5a876c500000000,
+    0x1d45213700000000, 0x8ae33cd000000000, 0xac98ff0800000000,
+    0x3b3ee2ef00000000, 0xc3d3b51d00000000, 0x5475a8fa00000000,
+    0x24af1f9600000000, 0xb309027100000000, 0x4be4558300000000,
+    0xdc42486400000000, 0xfa398bbc00000000, 0x6d9f965b00000000,
+    0x9572c1a900000000, 0x02d4dc4e00000000, 0x988236c300000000,
+    0x0f242b2400000000, 0xf7c97cd600000000, 0x606f613100000000,
+    0x4614a2e900000000, 0xd1b2bf0e00000000, 0x295fe8fc00000000,
+    0xbef9f51b00000000, 0x5cf44d3c00000000, 0xcb5250db00000000,
+    0x33bf072900000000, 0xa4191ace00000000, 0x8262d91600000000,
+    0x15c4c4f100000000, 0xed29930300000000, 0x7a8f8ee400000000,
+    0xe0d9646900000000, 0x777f798e00000000, 0x8f922e7c00000000,
+    0x1834339b00000000, 0x3e4ff04300000000, 0xa9e9eda400000000,
+    0x5104ba5600000000, 0xc6a2a7b100000000, 0x951fca1900000000,
+    0x02b9d7fe00000000, 0xfa54800c00000000, 0x6df29deb00000000,
+    0x4b895e3300000000, 0xdc2f43d400000000, 0x24c2142600000000,
+    0xb36409c100000000, 0x2932e34c00000000, 0xbe94feab00000000,
+    0x4679a95900000000, 0xd1dfb4be00000000, 0xf7a4776600000000,
+    0x60026a8100000000, 0x98ef3d7300000000, 0x0f49209400000000,
+    0xed4498b300000000, 0x7ae2855400000000, 0x820fd2a600000000,
+    0x15a9cf4100000000, 0x33d20c9900000000, 0xa474117e00000000,
+    0x5c99468c00000000, 0xcb3f5b6b00000000, 0x5169b1e600000000,
+    0xc6cfac0100000000, 0x3e22fbf300000000, 0xa984e61400000000,
+    0x8fff25cc00000000, 0x1859382b00000000, 0xe0b46fd900000000,
+    0x7712723e00000000},
+   {0x0000000000000000, 0x411b8c6e00000000, 0x823618dd00000000,
+    0xc32d94b300000000, 0x456b416100000000, 0x0470cd0f00000000,
+    0xc75d59bc00000000, 0x8646d5d200000000, 0x8ad682c200000000,
+    0xcbcd0eac00000000, 0x08e09a1f00000000, 0x49fb167100000000,
+    0xcfbdc3a300000000, 0x8ea64fcd00000000, 0x4d8bdb7e00000000,
+    0x0c90571000000000, 0x55ab745e00000000, 0x14b0f83000000000,
+    0xd79d6c8300000000, 0x9686e0ed00000000, 0x10c0353f00000000,
+    0x51dbb95100000000, 0x92f62de200000000, 0xd3eda18c00000000,
+    0xdf7df69c00000000, 0x9e667af200000000, 0x5d4bee4100000000,
+    0x1c50622f00000000, 0x9a16b7fd00000000, 0xdb0d3b9300000000,
+    0x1820af2000000000, 0x593b234e00000000, 0xaa56e9bc00000000,
+    0xeb4d65d200000000, 0x2860f16100000000, 0x697b7d0f00000000,
+    0xef3da8dd00000000, 0xae2624b300000000, 0x6d0bb00000000000,
+    0x2c103c6e00000000, 0x20806b7e00000000, 0x619be71000000000,
+    0xa2b673a300000000, 0xe3adffcd00000000, 0x65eb2a1f00000000,
+    0x24f0a67100000000, 0xe7dd32c200000000, 0xa6c6beac00000000,
+    0xfffd9de200000000, 0xbee6118c00000000, 0x7dcb853f00000000,
+    0x3cd0095100000000, 0xba96dc8300000000, 0xfb8d50ed00000000,
+    0x38a0c45e00000000, 0x79bb483000000000, 0x752b1f2000000000,
+    0x3430934e00000000, 0xf71d07fd00000000, 0xb6068b9300000000,
+    0x30405e4100000000, 0x715bd22f00000000, 0xb276469c00000000,
+    0xf36dcaf200000000, 0x15aba3a200000000, 0x54b02fcc00000000,
+    0x979dbb7f00000000, 0xd686371100000000, 0x50c0e2c300000000,
+    0x11db6ead00000000, 0xd2f6fa1e00000000, 0x93ed767000000000,
+    0x9f7d216000000000, 0xde66ad0e00000000, 0x1d4b39bd00000000,
+    0x5c50b5d300000000, 0xda16600100000000, 0x9b0dec6f00000000,
+    0x582078dc00000000, 0x193bf4b200000000, 0x4000d7fc00000000,
+    0x011b5b9200000000, 0xc236cf2100000000, 0x832d434f00000000,
+    0x056b969d00000000, 0x44701af300000000, 0x875d8e4000000000,
+    0xc646022e00000000, 0xcad6553e00000000, 0x8bcdd95000000000,
+    0x48e04de300000000, 0x09fbc18d00000000, 0x8fbd145f00000000,
+    0xcea6983100000000, 0x0d8b0c8200000000, 0x4c9080ec00000000,
+    0xbffd4a1e00000000, 0xfee6c67000000000, 0x3dcb52c300000000,
+    0x7cd0dead00000000, 0xfa960b7f00000000, 0xbb8d871100000000,
+    0x78a013a200000000, 0x39bb9fcc00000000, 0x352bc8dc00000000,
+    0x743044b200000000, 0xb71dd00100000000, 0xf6065c6f00000000,
+    0x704089bd00000000, 0x315b05d300000000, 0xf276916000000000,
+    0xb36d1d0e00000000, 0xea563e4000000000, 0xab4db22e00000000,
+    0x6860269d00000000, 0x297baaf300000000, 0xaf3d7f2100000000,
+    0xee26f34f00000000, 0x2d0b67fc00000000, 0x6c10eb9200000000,
+    0x6080bc8200000000, 0x219b30ec00000000, 0xe2b6a45f00000000,
+    0xa3ad283100000000, 0x25ebfde300000000, 0x64f0718d00000000,
+    0xa7dde53e00000000, 0xe6c6695000000000, 0x6b50369e00000000,
+    0x2a4bbaf000000000, 0xe9662e4300000000, 0xa87da22d00000000,
+    0x2e3b77ff00000000, 0x6f20fb9100000000, 0xac0d6f2200000000,
+    0xed16e34c00000000, 0xe186b45c00000000, 0xa09d383200000000,
+    0x63b0ac8100000000, 0x22ab20ef00000000, 0xa4edf53d00000000,
+    0xe5f6795300000000, 0x26dbede000000000, 0x67c0618e00000000,
+    0x3efb42c000000000, 0x7fe0ceae00000000, 0xbccd5a1d00000000,
+    0xfdd6d67300000000, 0x7b9003a100000000, 0x3a8b8fcf00000000,
+    0xf9a61b7c00000000, 0xb8bd971200000000, 0xb42dc00200000000,
+    0xf5364c6c00000000, 0x361bd8df00000000, 0x770054b100000000,
+    0xf146816300000000, 0xb05d0d0d00000000, 0x737099be00000000,
+    0x326b15d000000000, 0xc106df2200000000, 0x801d534c00000000,
+    0x4330c7ff00000000, 0x022b4b9100000000, 0x846d9e4300000000,
+    0xc576122d00000000, 0x065b869e00000000, 0x47400af000000000,
+    0x4bd05de000000000, 0x0acbd18e00000000, 0xc9e6453d00000000,
+    0x88fdc95300000000, 0x0ebb1c8100000000, 0x4fa090ef00000000,
+    0x8c8d045c00000000, 0xcd96883200000000, 0x94adab7c00000000,
+    0xd5b6271200000000, 0x169bb3a100000000, 0x57803fcf00000000,
+    0xd1c6ea1d00000000, 0x90dd667300000000, 0x53f0f2c000000000,
+    0x12eb7eae00000000, 0x1e7b29be00000000, 0x5f60a5d000000000,
+    0x9c4d316300000000, 0xdd56bd0d00000000, 0x5b1068df00000000,
+    0x1a0be4b100000000, 0xd926700200000000, 0x983dfc6c00000000,
+    0x7efb953c00000000, 0x3fe0195200000000, 0xfccd8de100000000,
+    0xbdd6018f00000000, 0x3b90d45d00000000, 0x7a8b583300000000,
+    0xb9a6cc8000000000, 0xf8bd40ee00000000, 0xf42d17fe00000000,
+    0xb5369b9000000000, 0x761b0f2300000000, 0x3700834d00000000,
+    0xb146569f00000000, 0xf05ddaf100000000, 0x33704e4200000000,
+    0x726bc22c00000000, 0x2b50e16200000000, 0x6a4b6d0c00000000,
+    0xa966f9bf00000000, 0xe87d75d100000000, 0x6e3ba00300000000,
+    0x2f202c6d00000000, 0xec0db8de00000000, 0xad1634b000000000,
+    0xa18663a000000000, 0xe09defce00000000, 0x23b07b7d00000000,
+    0x62abf71300000000, 0xe4ed22c100000000, 0xa5f6aeaf00000000,
+    0x66db3a1c00000000, 0x27c0b67200000000, 0xd4ad7c8000000000,
+    0x95b6f0ee00000000, 0x569b645d00000000, 0x1780e83300000000,
+    0x91c63de100000000, 0xd0ddb18f00000000, 0x13f0253c00000000,
+    0x52eba95200000000, 0x5e7bfe4200000000, 0x1f60722c00000000,
+    0xdc4de69f00000000, 0x9d566af100000000, 0x1b10bf2300000000,
+    0x5a0b334d00000000, 0x9926a7fe00000000, 0xd83d2b9000000000,
+    0x810608de00000000, 0xc01d84b000000000, 0x0330100300000000,
+    0x422b9c6d00000000, 0xc46d49bf00000000, 0x8576c5d100000000,
+    0x465b516200000000, 0x0740dd0c00000000, 0x0bd08a1c00000000,
+    0x4acb067200000000, 0x89e692c100000000, 0xc8fd1eaf00000000,
+    0x4ebbcb7d00000000, 0x0fa0471300000000, 0xcc8dd3a000000000,
+    0x8d965fce00000000},
+   {0x0000000000000000, 0x1dfdb50100000000, 0x3afa6b0300000000,
+    0x2707de0200000000, 0x74f4d70600000000, 0x6909620700000000,
+    0x4e0ebc0500000000, 0x53f3090400000000, 0xe8e8af0d00000000,
+    0xf5151a0c00000000, 0xd212c40e00000000, 0xcfef710f00000000,
+    0x9c1c780b00000000, 0x81e1cd0a00000000, 0xa6e6130800000000,
+    0xbb1ba60900000000, 0xd0d15f1b00000000, 0xcd2cea1a00000000,
+    0xea2b341800000000, 0xf7d6811900000000, 0xa425881d00000000,
+    0xb9d83d1c00000000, 0x9edfe31e00000000, 0x8322561f00000000,
+    0x3839f01600000000, 0x25c4451700000000, 0x02c39b1500000000,
+    0x1f3e2e1400000000, 0x4ccd271000000000, 0x5130921100000000,
+    0x76374c1300000000, 0x6bcaf91200000000, 0xa0a3bf3600000000,
+    0xbd5e0a3700000000, 0x9a59d43500000000, 0x87a4613400000000,
+    0xd457683000000000, 0xc9aadd3100000000, 0xeead033300000000,
+    0xf350b63200000000, 0x484b103b00000000, 0x55b6a53a00000000,
+    0x72b17b3800000000, 0x6f4cce3900000000, 0x3cbfc73d00000000,
+    0x2142723c00000000, 0x0645ac3e00000000, 0x1bb8193f00000000,
+    0x7072e02d00000000, 0x6d8f552c00000000, 0x4a888b2e00000000,
+    0x57753e2f00000000, 0x0486372b00000000, 0x197b822a00000000,
+    0x3e7c5c2800000000, 0x2381e92900000000, 0x989a4f2000000000,
+    0x8567fa2100000000, 0xa260242300000000, 0xbf9d912200000000,
+    0xec6e982600000000, 0xf1932d2700000000, 0xd694f32500000000,
+    0xcb69462400000000, 0x40477f6d00000000, 0x5dbaca6c00000000,
+    0x7abd146e00000000, 0x6740a16f00000000, 0x34b3a86b00000000,
+    0x294e1d6a00000000, 0x0e49c36800000000, 0x13b4766900000000,
+    0xa8afd06000000000, 0xb552656100000000, 0x9255bb6300000000,
+    0x8fa80e6200000000, 0xdc5b076600000000, 0xc1a6b26700000000,
+    0xe6a16c6500000000, 0xfb5cd96400000000, 0x9096207600000000,
+    0x8d6b957700000000, 0xaa6c4b7500000000, 0xb791fe7400000000,
+    0xe462f77000000000, 0xf99f427100000000, 0xde989c7300000000,
+    0xc365297200000000, 0x787e8f7b00000000, 0x65833a7a00000000,
+    0x4284e47800000000, 0x5f79517900000000, 0x0c8a587d00000000,
+    0x1177ed7c00000000, 0x3670337e00000000, 0x2b8d867f00000000,
+    0xe0e4c05b00000000, 0xfd19755a00000000, 0xda1eab5800000000,
+    0xc7e31e5900000000, 0x9410175d00000000, 0x89eda25c00000000,
+    0xaeea7c5e00000000, 0xb317c95f00000000, 0x080c6f5600000000,
+    0x15f1da5700000000, 0x32f6045500000000, 0x2f0bb15400000000,
+    0x7cf8b85000000000, 0x61050d5100000000, 0x4602d35300000000,
+    0x5bff665200000000, 0x30359f4000000000, 0x2dc82a4100000000,
+    0x0acff44300000000, 0x1732414200000000, 0x44c1484600000000,
+    0x593cfd4700000000, 0x7e3b234500000000, 0x63c6964400000000,
+    0xd8dd304d00000000, 0xc520854c00000000, 0xe2275b4e00000000,
+    0xffdaee4f00000000, 0xac29e74b00000000, 0xb1d4524a00000000,
+    0x96d38c4800000000, 0x8b2e394900000000, 0x808efeda00000000,
+    0x9d734bdb00000000, 0xba7495d900000000, 0xa78920d800000000,
+    0xf47a29dc00000000, 0xe9879cdd00000000, 0xce8042df00000000,
+    0xd37df7de00000000, 0x686651d700000000, 0x759be4d600000000,
+    0x529c3ad400000000, 0x4f618fd500000000, 0x1c9286d100000000,
+    0x016f33d000000000, 0x2668edd200000000, 0x3b9558d300000000,
+    0x505fa1c100000000, 0x4da214c000000000, 0x6aa5cac200000000,
+    0x77587fc300000000, 0x24ab76c700000000, 0x3956c3c600000000,
+    0x1e511dc400000000, 0x03aca8c500000000, 0xb8b70ecc00000000,
+    0xa54abbcd00000000, 0x824d65cf00000000, 0x9fb0d0ce00000000,
+    0xcc43d9ca00000000, 0xd1be6ccb00000000, 0xf6b9b2c900000000,
+    0xeb4407c800000000, 0x202d41ec00000000, 0x3dd0f4ed00000000,
+    0x1ad72aef00000000, 0x072a9fee00000000, 0x54d996ea00000000,
+    0x492423eb00000000, 0x6e23fde900000000, 0x73de48e800000000,
+    0xc8c5eee100000000, 0xd5385be000000000, 0xf23f85e200000000,
+    0xefc230e300000000, 0xbc3139e700000000, 0xa1cc8ce600000000,
+    0x86cb52e400000000, 0x9b36e7e500000000, 0xf0fc1ef700000000,
+    0xed01abf600000000, 0xca0675f400000000, 0xd7fbc0f500000000,
+    0x8408c9f100000000, 0x99f57cf000000000, 0xbef2a2f200000000,
+    0xa30f17f300000000, 0x1814b1fa00000000, 0x05e904fb00000000,
+    0x22eedaf900000000, 0x3f136ff800000000, 0x6ce066fc00000000,
+    0x711dd3fd00000000, 0x561a0dff00000000, 0x4be7b8fe00000000,
+    0xc0c981b700000000, 0xdd3434b600000000, 0xfa33eab400000000,
+    0xe7ce5fb500000000, 0xb43d56b100000000, 0xa9c0e3b000000000,
+    0x8ec73db200000000, 0x933a88b300000000, 0x28212eba00000000,
+    0x35dc9bbb00000000, 0x12db45b900000000, 0x0f26f0b800000000,
+    0x5cd5f9bc00000000, 0x41284cbd00000000, 0x662f92bf00000000,
+    0x7bd227be00000000, 0x1018deac00000000, 0x0de56bad00000000,
+    0x2ae2b5af00000000, 0x371f00ae00000000, 0x64ec09aa00000000,
+    0x7911bcab00000000, 0x5e1662a900000000, 0x43ebd7a800000000,
+    0xf8f071a100000000, 0xe50dc4a000000000, 0xc20a1aa200000000,
+    0xdff7afa300000000, 0x8c04a6a700000000, 0x91f913a600000000,
+    0xb6fecda400000000, 0xab0378a500000000, 0x606a3e8100000000,
+    0x7d978b8000000000, 0x5a90558200000000, 0x476de08300000000,
+    0x149ee98700000000, 0x09635c8600000000, 0x2e64828400000000,
+    0x3399378500000000, 0x8882918c00000000, 0x957f248d00000000,
+    0xb278fa8f00000000, 0xaf854f8e00000000, 0xfc76468a00000000,
+    0xe18bf38b00000000, 0xc68c2d8900000000, 0xdb71988800000000,
+    0xb0bb619a00000000, 0xad46d49b00000000, 0x8a410a9900000000,
+    0x97bcbf9800000000, 0xc44fb69c00000000, 0xd9b2039d00000000,
+    0xfeb5dd9f00000000, 0xe348689e00000000, 0x5853ce9700000000,
+    0x45ae7b9600000000, 0x62a9a59400000000, 0x7f54109500000000,
+    0x2ca7199100000000, 0x315aac9000000000, 0x165d729200000000,
+    0x0ba0c79300000000},
+   {0x0000000000000000, 0x24d9076300000000, 0x48b20fc600000000,
+    0x6c6b08a500000000, 0xd1626e5700000000, 0xf5bb693400000000,
+    0x99d0619100000000, 0xbd0966f200000000, 0xa2c5dcae00000000,
+    0x861cdbcd00000000, 0xea77d36800000000, 0xceaed40b00000000,
+    0x73a7b2f900000000, 0x577eb59a00000000, 0x3b15bd3f00000000,
+    0x1fccba5c00000000, 0x058dc88600000000, 0x2154cfe500000000,
+    0x4d3fc74000000000, 0x69e6c02300000000, 0xd4efa6d100000000,
+    0xf036a1b200000000, 0x9c5da91700000000, 0xb884ae7400000000,
+    0xa748142800000000, 0x8391134b00000000, 0xeffa1bee00000000,
+    0xcb231c8d00000000, 0x762a7a7f00000000, 0x52f37d1c00000000,
+    0x3e9875b900000000, 0x1a4172da00000000, 0x4b1ce0d600000000,
+    0x6fc5e7b500000000, 0x03aeef1000000000, 0x2777e87300000000,
+    0x9a7e8e8100000000, 0xbea789e200000000, 0xd2cc814700000000,
+    0xf615862400000000, 0xe9d93c7800000000, 0xcd003b1b00000000,
+    0xa16b33be00000000, 0x85b234dd00000000, 0x38bb522f00000000,
+    0x1c62554c00000000, 0x70095de900000000, 0x54d05a8a00000000,
+    0x4e91285000000000, 0x6a482f3300000000, 0x0623279600000000,
+    0x22fa20f500000000, 0x9ff3460700000000, 0xbb2a416400000000,
+    0xd74149c100000000, 0xf3984ea200000000, 0xec54f4fe00000000,
+    0xc88df39d00000000, 0xa4e6fb3800000000, 0x803ffc5b00000000,
+    0x3d369aa900000000, 0x19ef9dca00000000, 0x7584956f00000000,
+    0x515d920c00000000, 0xd73eb17600000000, 0xf3e7b61500000000,
+    0x9f8cbeb000000000, 0xbb55b9d300000000, 0x065cdf2100000000,
+    0x2285d84200000000, 0x4eeed0e700000000, 0x6a37d78400000000,
+    0x75fb6dd800000000, 0x51226abb00000000, 0x3d49621e00000000,
+    0x1990657d00000000, 0xa499038f00000000, 0x804004ec00000000,
+    0xec2b0c4900000000, 0xc8f20b2a00000000, 0xd2b379f000000000,
+    0xf66a7e9300000000, 0x9a01763600000000, 0xbed8715500000000,
+    0x03d117a700000000, 0x270810c400000000, 0x4b63186100000000,
+    0x6fba1f0200000000, 0x7076a55e00000000, 0x54afa23d00000000,
+    0x38c4aa9800000000, 0x1c1dadfb00000000, 0xa114cb0900000000,
+    0x85cdcc6a00000000, 0xe9a6c4cf00000000, 0xcd7fc3ac00000000,
+    0x9c2251a000000000, 0xb8fb56c300000000, 0xd4905e6600000000,
+    0xf049590500000000, 0x4d403ff700000000, 0x6999389400000000,
+    0x05f2303100000000, 0x212b375200000000, 0x3ee78d0e00000000,
+    0x1a3e8a6d00000000, 0x765582c800000000, 0x528c85ab00000000,
+    0xef85e35900000000, 0xcb5ce43a00000000, 0xa737ec9f00000000,
+    0x83eeebfc00000000, 0x99af992600000000, 0xbd769e4500000000,
+    0xd11d96e000000000, 0xf5c4918300000000, 0x48cdf77100000000,
+    0x6c14f01200000000, 0x007ff8b700000000, 0x24a6ffd400000000,
+    0x3b6a458800000000, 0x1fb342eb00000000, 0x73d84a4e00000000,
+    0x57014d2d00000000, 0xea082bdf00000000, 0xced12cbc00000000,
+    0xa2ba241900000000, 0x8663237a00000000, 0xae7d62ed00000000,
+    0x8aa4658e00000000, 0xe6cf6d2b00000000, 0xc2166a4800000000,
+    0x7f1f0cba00000000, 0x5bc60bd900000000, 0x37ad037c00000000,
+    0x1374041f00000000, 0x0cb8be4300000000, 0x2861b92000000000,
+    0x440ab18500000000, 0x60d3b6e600000000, 0xdddad01400000000,
+    0xf903d77700000000, 0x9568dfd200000000, 0xb1b1d8b100000000,
+    0xabf0aa6b00000000, 0x8f29ad0800000000, 0xe342a5ad00000000,
+    0xc79ba2ce00000000, 0x7a92c43c00000000, 0x5e4bc35f00000000,
+    0x3220cbfa00000000, 0x16f9cc9900000000, 0x093576c500000000,
+    0x2dec71a600000000, 0x4187790300000000, 0x655e7e6000000000,
+    0xd857189200000000, 0xfc8e1ff100000000, 0x90e5175400000000,
+    0xb43c103700000000, 0xe561823b00000000, 0xc1b8855800000000,
+    0xadd38dfd00000000, 0x890a8a9e00000000, 0x3403ec6c00000000,
+    0x10daeb0f00000000, 0x7cb1e3aa00000000, 0x5868e4c900000000,
+    0x47a45e9500000000, 0x637d59f600000000, 0x0f16515300000000,
+    0x2bcf563000000000, 0x96c630c200000000, 0xb21f37a100000000,
+    0xde743f0400000000, 0xfaad386700000000, 0xe0ec4abd00000000,
+    0xc4354dde00000000, 0xa85e457b00000000, 0x8c87421800000000,
+    0x318e24ea00000000, 0x1557238900000000, 0x793c2b2c00000000,
+    0x5de52c4f00000000, 0x4229961300000000, 0x66f0917000000000,
+    0x0a9b99d500000000, 0x2e429eb600000000, 0x934bf84400000000,
+    0xb792ff2700000000, 0xdbf9f78200000000, 0xff20f0e100000000,
+    0x7943d39b00000000, 0x5d9ad4f800000000, 0x31f1dc5d00000000,
+    0x1528db3e00000000, 0xa821bdcc00000000, 0x8cf8baaf00000000,
+    0xe093b20a00000000, 0xc44ab56900000000, 0xdb860f3500000000,
+    0xff5f085600000000, 0x933400f300000000, 0xb7ed079000000000,
+    0x0ae4616200000000, 0x2e3d660100000000, 0x42566ea400000000,
+    0x668f69c700000000, 0x7cce1b1d00000000, 0x58171c7e00000000,
+    0x347c14db00000000, 0x10a513b800000000, 0xadac754a00000000,
+    0x8975722900000000, 0xe51e7a8c00000000, 0xc1c77def00000000,
+    0xde0bc7b300000000, 0xfad2c0d000000000, 0x96b9c87500000000,
+    0xb260cf1600000000, 0x0f69a9e400000000, 0x2bb0ae8700000000,
+    0x47dba62200000000, 0x6302a14100000000, 0x325f334d00000000,
+    0x1686342e00000000, 0x7aed3c8b00000000, 0x5e343be800000000,
+    0xe33d5d1a00000000, 0xc7e45a7900000000, 0xab8f52dc00000000,
+    0x8f5655bf00000000, 0x909aefe300000000, 0xb443e88000000000,
+    0xd828e02500000000, 0xfcf1e74600000000, 0x41f881b400000000,
+    0x652186d700000000, 0x094a8e7200000000, 0x2d93891100000000,
+    0x37d2fbcb00000000, 0x130bfca800000000, 0x7f60f40d00000000,
+    0x5bb9f36e00000000, 0xe6b0959c00000000, 0xc26992ff00000000,
+    0xae029a5a00000000, 0x8adb9d3900000000, 0x9517276500000000,
+    0xb1ce200600000000, 0xdda528a300000000, 0xf97c2fc000000000,
+    0x4475493200000000, 0x60ac4e5100000000, 0x0cc746f400000000,
+    0x281e419700000000},
+   {0x0000000000000000, 0x08e3603c00000000, 0x10c6c17800000000,
+    0x1825a14400000000, 0x208c83f100000000, 0x286fe3cd00000000,
+    0x304a428900000000, 0x38a922b500000000, 0x011e763800000000,
+    0x09fd160400000000, 0x11d8b74000000000, 0x193bd77c00000000,
+    0x2192f5c900000000, 0x297195f500000000, 0x315434b100000000,
+    0x39b7548d00000000, 0x023cec7000000000, 0x0adf8c4c00000000,
+    0x12fa2d0800000000, 0x1a194d3400000000, 0x22b06f8100000000,
+    0x2a530fbd00000000, 0x3276aef900000000, 0x3a95cec500000000,
+    0x03229a4800000000, 0x0bc1fa7400000000, 0x13e45b3000000000,
+    0x1b073b0c00000000, 0x23ae19b900000000, 0x2b4d798500000000,
+    0x3368d8c100000000, 0x3b8bb8fd00000000, 0x0478d8e100000000,
+    0x0c9bb8dd00000000, 0x14be199900000000, 0x1c5d79a500000000,
+    0x24f45b1000000000, 0x2c173b2c00000000, 0x34329a6800000000,
+    0x3cd1fa5400000000, 0x0566aed900000000, 0x0d85cee500000000,
+    0x15a06fa100000000, 0x1d430f9d00000000, 0x25ea2d2800000000,
+    0x2d094d1400000000, 0x352cec5000000000, 0x3dcf8c6c00000000,
+    0x0644349100000000, 0x0ea754ad00000000, 0x1682f5e900000000,
+    0x1e6195d500000000, 0x26c8b76000000000, 0x2e2bd75c00000000,
+    0x360e761800000000, 0x3eed162400000000, 0x075a42a900000000,
+    0x0fb9229500000000, 0x179c83d100000000, 0x1f7fe3ed00000000,
+    0x27d6c15800000000, 0x2f35a16400000000, 0x3710002000000000,
+    0x3ff3601c00000000, 0x49f6c11800000000, 0x4115a12400000000,
+    0x5930006000000000, 0x51d3605c00000000, 0x697a42e900000000,
+    0x619922d500000000, 0x79bc839100000000, 0x715fe3ad00000000,
+    0x48e8b72000000000, 0x400bd71c00000000, 0x582e765800000000,
+    0x50cd166400000000, 0x686434d100000000, 0x608754ed00000000,
+    0x78a2f5a900000000, 0x7041959500000000, 0x4bca2d6800000000,
+    0x43294d5400000000, 0x5b0cec1000000000, 0x53ef8c2c00000000,
+    0x6b46ae9900000000, 0x63a5cea500000000, 0x7b806fe100000000,
+    0x73630fdd00000000, 0x4ad45b5000000000, 0x42373b6c00000000,
+    0x5a129a2800000000, 0x52f1fa1400000000, 0x6a58d8a100000000,
+    0x62bbb89d00000000, 0x7a9e19d900000000, 0x727d79e500000000,
+    0x4d8e19f900000000, 0x456d79c500000000, 0x5d48d88100000000,
+    0x55abb8bd00000000, 0x6d029a0800000000, 0x65e1fa3400000000,
+    0x7dc45b7000000000, 0x75273b4c00000000, 0x4c906fc100000000,
+    0x44730ffd00000000, 0x5c56aeb900000000, 0x54b5ce8500000000,
+    0x6c1cec3000000000, 0x64ff8c0c00000000, 0x7cda2d4800000000,
+    0x74394d7400000000, 0x4fb2f58900000000, 0x475195b500000000,
+    0x5f7434f100000000, 0x579754cd00000000, 0x6f3e767800000000,
+    0x67dd164400000000, 0x7ff8b70000000000, 0x771bd73c00000000,
+    0x4eac83b100000000, 0x464fe38d00000000, 0x5e6a42c900000000,
+    0x568922f500000000, 0x6e20004000000000, 0x66c3607c00000000,
+    0x7ee6c13800000000, 0x7605a10400000000, 0x92ec833100000000,
+    0x9a0fe30d00000000, 0x822a424900000000, 0x8ac9227500000000,
+    0xb26000c000000000, 0xba8360fc00000000, 0xa2a6c1b800000000,
+    0xaa45a18400000000, 0x93f2f50900000000, 0x9b11953500000000,
+    0x8334347100000000, 0x8bd7544d00000000, 0xb37e76f800000000,
+    0xbb9d16c400000000, 0xa3b8b78000000000, 0xab5bd7bc00000000,
+    0x90d06f4100000000, 0x98330f7d00000000, 0x8016ae3900000000,
+    0x88f5ce0500000000, 0xb05cecb000000000, 0xb8bf8c8c00000000,
+    0xa09a2dc800000000, 0xa8794df400000000, 0x91ce197900000000,
+    0x992d794500000000, 0x8108d80100000000, 0x89ebb83d00000000,
+    0xb1429a8800000000, 0xb9a1fab400000000, 0xa1845bf000000000,
+    0xa9673bcc00000000, 0x96945bd000000000, 0x9e773bec00000000,
+    0x86529aa800000000, 0x8eb1fa9400000000, 0xb618d82100000000,
+    0xbefbb81d00000000, 0xa6de195900000000, 0xae3d796500000000,
+    0x978a2de800000000, 0x9f694dd400000000, 0x874cec9000000000,
+    0x8faf8cac00000000, 0xb706ae1900000000, 0xbfe5ce2500000000,
+    0xa7c06f6100000000, 0xaf230f5d00000000, 0x94a8b7a000000000,
+    0x9c4bd79c00000000, 0x846e76d800000000, 0x8c8d16e400000000,
+    0xb424345100000000, 0xbcc7546d00000000, 0xa4e2f52900000000,
+    0xac01951500000000, 0x95b6c19800000000, 0x9d55a1a400000000,
+    0x857000e000000000, 0x8d9360dc00000000, 0xb53a426900000000,
+    0xbdd9225500000000, 0xa5fc831100000000, 0xad1fe32d00000000,
+    0xdb1a422900000000, 0xd3f9221500000000, 0xcbdc835100000000,
+    0xc33fe36d00000000, 0xfb96c1d800000000, 0xf375a1e400000000,
+    0xeb5000a000000000, 0xe3b3609c00000000, 0xda04341100000000,
+    0xd2e7542d00000000, 0xcac2f56900000000, 0xc221955500000000,
+    0xfa88b7e000000000, 0xf26bd7dc00000000, 0xea4e769800000000,
+    0xe2ad16a400000000, 0xd926ae5900000000, 0xd1c5ce6500000000,
+    0xc9e06f2100000000, 0xc1030f1d00000000, 0xf9aa2da800000000,
+    0xf1494d9400000000, 0xe96cecd000000000, 0xe18f8cec00000000,
+    0xd838d86100000000, 0xd0dbb85d00000000, 0xc8fe191900000000,
+    0xc01d792500000000, 0xf8b45b9000000000, 0xf0573bac00000000,
+    0xe8729ae800000000, 0xe091fad400000000, 0xdf629ac800000000,
+    0xd781faf400000000, 0xcfa45bb000000000, 0xc7473b8c00000000,
+    0xffee193900000000, 0xf70d790500000000, 0xef28d84100000000,
+    0xe7cbb87d00000000, 0xde7cecf000000000, 0xd69f8ccc00000000,
+    0xceba2d8800000000, 0xc6594db400000000, 0xfef06f0100000000,
+    0xf6130f3d00000000, 0xee36ae7900000000, 0xe6d5ce4500000000,
+    0xdd5e76b800000000, 0xd5bd168400000000, 0xcd98b7c000000000,
+    0xc57bd7fc00000000, 0xfdd2f54900000000, 0xf531957500000000,
+    0xed14343100000000, 0xe5f7540d00000000, 0xdc40008000000000,
+    0xd4a360bc00000000, 0xcc86c1f800000000, 0xc465a1c400000000,
+    0xfccc837100000000, 0xf42fe34d00000000, 0xec0a420900000000,
+    0xe4e9223500000000},
+   {0x0000000000000000, 0xd1e8e70e00000000, 0xa2d1cf1d00000000,
+    0x7339281300000000, 0x44a39f3b00000000, 0x954b783500000000,
+    0xe672502600000000, 0x379ab72800000000, 0x88463f7700000000,
+    0x59aed87900000000, 0x2a97f06a00000000, 0xfb7f176400000000,
+    0xcce5a04c00000000, 0x1d0d474200000000, 0x6e346f5100000000,
+    0xbfdc885f00000000, 0x108d7eee00000000, 0xc16599e000000000,
+    0xb25cb1f300000000, 0x63b456fd00000000, 0x542ee1d500000000,
+    0x85c606db00000000, 0xf6ff2ec800000000, 0x2717c9c600000000,
+    0x98cb419900000000, 0x4923a69700000000, 0x3a1a8e8400000000,
+    0xebf2698a00000000, 0xdc68dea200000000, 0x0d8039ac00000000,
+    0x7eb911bf00000000, 0xaf51f6b100000000, 0x611c8c0700000000,
+    0xb0f46b0900000000, 0xc3cd431a00000000, 0x1225a41400000000,
+    0x25bf133c00000000, 0xf457f43200000000, 0x876edc2100000000,
+    0x56863b2f00000000, 0xe95ab37000000000, 0x38b2547e00000000,
+    0x4b8b7c6d00000000, 0x9a639b6300000000, 0xadf92c4b00000000,
+    0x7c11cb4500000000, 0x0f28e35600000000, 0xdec0045800000000,
+    0x7191f2e900000000, 0xa07915e700000000, 0xd3403df400000000,
+    0x02a8dafa00000000, 0x35326dd200000000, 0xe4da8adc00000000,
+    0x97e3a2cf00000000, 0x460b45c100000000, 0xf9d7cd9e00000000,
+    0x283f2a9000000000, 0x5b06028300000000, 0x8aeee58d00000000,
+    0xbd7452a500000000, 0x6c9cb5ab00000000, 0x1fa59db800000000,
+    0xce4d7ab600000000, 0xc238180f00000000, 0x13d0ff0100000000,
+    0x60e9d71200000000, 0xb101301c00000000, 0x869b873400000000,
+    0x5773603a00000000, 0x244a482900000000, 0xf5a2af2700000000,
+    0x4a7e277800000000, 0x9b96c07600000000, 0xe8afe86500000000,
+    0x39470f6b00000000, 0x0eddb84300000000, 0xdf355f4d00000000,
+    0xac0c775e00000000, 0x7de4905000000000, 0xd2b566e100000000,
+    0x035d81ef00000000, 0x7064a9fc00000000, 0xa18c4ef200000000,
+    0x9616f9da00000000, 0x47fe1ed400000000, 0x34c736c700000000,
+    0xe52fd1c900000000, 0x5af3599600000000, 0x8b1bbe9800000000,
+    0xf822968b00000000, 0x29ca718500000000, 0x1e50c6ad00000000,
+    0xcfb821a300000000, 0xbc8109b000000000, 0x6d69eebe00000000,
+    0xa324940800000000, 0x72cc730600000000, 0x01f55b1500000000,
+    0xd01dbc1b00000000, 0xe7870b3300000000, 0x366fec3d00000000,
+    0x4556c42e00000000, 0x94be232000000000, 0x2b62ab7f00000000,
+    0xfa8a4c7100000000, 0x89b3646200000000, 0x585b836c00000000,
+    0x6fc1344400000000, 0xbe29d34a00000000, 0xcd10fb5900000000,
+    0x1cf81c5700000000, 0xb3a9eae600000000, 0x62410de800000000,
+    0x117825fb00000000, 0xc090c2f500000000, 0xf70a75dd00000000,
+    0x26e292d300000000, 0x55dbbac000000000, 0x84335dce00000000,
+    0x3befd59100000000, 0xea07329f00000000, 0x993e1a8c00000000,
+    0x48d6fd8200000000, 0x7f4c4aaa00000000, 0xaea4ada400000000,
+    0xdd9d85b700000000, 0x0c7562b900000000, 0x8471301e00000000,
+    0x5599d71000000000, 0x26a0ff0300000000, 0xf748180d00000000,
+    0xc0d2af2500000000, 0x113a482b00000000, 0x6203603800000000,
+    0xb3eb873600000000, 0x0c370f6900000000, 0xdddfe86700000000,
+    0xaee6c07400000000, 0x7f0e277a00000000, 0x4894905200000000,
+    0x997c775c00000000, 0xea455f4f00000000, 0x3badb84100000000,
+    0x94fc4ef000000000, 0x4514a9fe00000000, 0x362d81ed00000000,
+    0xe7c566e300000000, 0xd05fd1cb00000000, 0x01b736c500000000,
+    0x728e1ed600000000, 0xa366f9d800000000, 0x1cba718700000000,
+    0xcd52968900000000, 0xbe6bbe9a00000000, 0x6f83599400000000,
+    0x5819eebc00000000, 0x89f109b200000000, 0xfac821a100000000,
+    0x2b20c6af00000000, 0xe56dbc1900000000, 0x34855b1700000000,
+    0x47bc730400000000, 0x9654940a00000000, 0xa1ce232200000000,
+    0x7026c42c00000000, 0x031fec3f00000000, 0xd2f70b3100000000,
+    0x6d2b836e00000000, 0xbcc3646000000000, 0xcffa4c7300000000,
+    0x1e12ab7d00000000, 0x29881c5500000000, 0xf860fb5b00000000,
+    0x8b59d34800000000, 0x5ab1344600000000, 0xf5e0c2f700000000,
+    0x240825f900000000, 0x57310dea00000000, 0x86d9eae400000000,
+    0xb1435dcc00000000, 0x60abbac200000000, 0x139292d100000000,
+    0xc27a75df00000000, 0x7da6fd8000000000, 0xac4e1a8e00000000,
+    0xdf77329d00000000, 0x0e9fd59300000000, 0x390562bb00000000,
+    0xe8ed85b500000000, 0x9bd4ada600000000, 0x4a3c4aa800000000,
+    0x4649281100000000, 0x97a1cf1f00000000, 0xe498e70c00000000,
+    0x3570000200000000, 0x02eab72a00000000, 0xd302502400000000,
+    0xa03b783700000000, 0x71d39f3900000000, 0xce0f176600000000,
+    0x1fe7f06800000000, 0x6cded87b00000000, 0xbd363f7500000000,
+    0x8aac885d00000000, 0x5b446f5300000000, 0x287d474000000000,
+    0xf995a04e00000000, 0x56c456ff00000000, 0x872cb1f100000000,
+    0xf41599e200000000, 0x25fd7eec00000000, 0x1267c9c400000000,
+    0xc38f2eca00000000, 0xb0b606d900000000, 0x615ee1d700000000,
+    0xde82698800000000, 0x0f6a8e8600000000, 0x7c53a69500000000,
+    0xadbb419b00000000, 0x9a21f6b300000000, 0x4bc911bd00000000,
+    0x38f039ae00000000, 0xe918dea000000000, 0x2755a41600000000,
+    0xf6bd431800000000, 0x85846b0b00000000, 0x546c8c0500000000,
+    0x63f63b2d00000000, 0xb21edc2300000000, 0xc127f43000000000,
+    0x10cf133e00000000, 0xaf139b6100000000, 0x7efb7c6f00000000,
+    0x0dc2547c00000000, 0xdc2ab37200000000, 0xebb0045a00000000,
+    0x3a58e35400000000, 0x4961cb4700000000, 0x98892c4900000000,
+    0x37d8daf800000000, 0xe6303df600000000, 0x950915e500000000,
+    0x44e1f2eb00000000, 0x737b45c300000000, 0xa293a2cd00000000,
+    0xd1aa8ade00000000, 0x00426dd000000000, 0xbf9ee58f00000000,
+    0x6e76028100000000, 0x1d4f2a9200000000, 0xcca7cd9c00000000,
+    0xfb3d7ab400000000, 0x2ad59dba00000000, 0x59ecb5a900000000,
+    0x880452a700000000},
+   {0x0000000000000000, 0xaa05daf100000000, 0x150dc53800000000,
+    0xbf081fc900000000, 0x2a1a8a7100000000, 0x801f508000000000,
+    0x3f174f4900000000, 0x951295b800000000, 0x543414e300000000,
+    0xfe31ce1200000000, 0x4139d1db00000000, 0xeb3c0b2a00000000,
+    0x7e2e9e9200000000, 0xd42b446300000000, 0x6b235baa00000000,
+    0xc126815b00000000, 0xe96e591d00000000, 0x436b83ec00000000,
+    0xfc639c2500000000, 0x566646d400000000, 0xc374d36c00000000,
+    0x6971099d00000000, 0xd679165400000000, 0x7c7ccca500000000,
+    0xbd5a4dfe00000000, 0x175f970f00000000, 0xa85788c600000000,
+    0x0252523700000000, 0x9740c78f00000000, 0x3d451d7e00000000,
+    0x824d02b700000000, 0x2848d84600000000, 0xd2ddb23a00000000,
+    0x78d868cb00000000, 0xc7d0770200000000, 0x6dd5adf300000000,
+    0xf8c7384b00000000, 0x52c2e2ba00000000, 0xedcafd7300000000,
+    0x47cf278200000000, 0x86e9a6d900000000, 0x2cec7c2800000000,
+    0x93e463e100000000, 0x39e1b91000000000, 0xacf32ca800000000,
+    0x06f6f65900000000, 0xb9fee99000000000, 0x13fb336100000000,
+    0x3bb3eb2700000000, 0x91b631d600000000, 0x2ebe2e1f00000000,
+    0x84bbf4ee00000000, 0x11a9615600000000, 0xbbacbba700000000,
+    0x04a4a46e00000000, 0xaea17e9f00000000, 0x6f87ffc400000000,
+    0xc582253500000000, 0x7a8a3afc00000000, 0xd08fe00d00000000,
+    0x459d75b500000000, 0xef98af4400000000, 0x5090b08d00000000,
+    0xfa956a7c00000000, 0xa4bb657500000000, 0x0ebebf8400000000,
+    0xb1b6a04d00000000, 0x1bb37abc00000000, 0x8ea1ef0400000000,
+    0x24a435f500000000, 0x9bac2a3c00000000, 0x31a9f0cd00000000,
+    0xf08f719600000000, 0x5a8aab6700000000, 0xe582b4ae00000000,
+    0x4f876e5f00000000, 0xda95fbe700000000, 0x7090211600000000,
+    0xcf983edf00000000, 0x659de42e00000000, 0x4dd53c6800000000,
+    0xe7d0e69900000000, 0x58d8f95000000000, 0xf2dd23a100000000,
+    0x67cfb61900000000, 0xcdca6ce800000000, 0x72c2732100000000,
+    0xd8c7a9d000000000, 0x19e1288b00000000, 0xb3e4f27a00000000,
+    0x0cecedb300000000, 0xa6e9374200000000, 0x33fba2fa00000000,
+    0x99fe780b00000000, 0x26f667c200000000, 0x8cf3bd3300000000,
+    0x7666d74f00000000, 0xdc630dbe00000000, 0x636b127700000000,
+    0xc96ec88600000000, 0x5c7c5d3e00000000, 0xf67987cf00000000,
+    0x4971980600000000, 0xe37442f700000000, 0x2252c3ac00000000,
+    0x8857195d00000000, 0x375f069400000000, 0x9d5adc6500000000,
+    0x084849dd00000000, 0xa24d932c00000000, 0x1d458ce500000000,
+    0xb740561400000000, 0x9f088e5200000000, 0x350d54a300000000,
+    0x8a054b6a00000000, 0x2000919b00000000, 0xb512042300000000,
+    0x1f17ded200000000, 0xa01fc11b00000000, 0x0a1a1bea00000000,
+    0xcb3c9ab100000000, 0x6139404000000000, 0xde315f8900000000,
+    0x7434857800000000, 0xe12610c000000000, 0x4b23ca3100000000,
+    0xf42bd5f800000000, 0x5e2e0f0900000000, 0x4877cbea00000000,
+    0xe272111b00000000, 0x5d7a0ed200000000, 0xf77fd42300000000,
+    0x626d419b00000000, 0xc8689b6a00000000, 0x776084a300000000,
+    0xdd655e5200000000, 0x1c43df0900000000, 0xb64605f800000000,
+    0x094e1a3100000000, 0xa34bc0c000000000, 0x3659557800000000,
+    0x9c5c8f8900000000, 0x2354904000000000, 0x89514ab100000000,
+    0xa11992f700000000, 0x0b1c480600000000, 0xb41457cf00000000,
+    0x1e118d3e00000000, 0x8b03188600000000, 0x2106c27700000000,
+    0x9e0eddbe00000000, 0x340b074f00000000, 0xf52d861400000000,
+    0x5f285ce500000000, 0xe020432c00000000, 0x4a2599dd00000000,
+    0xdf370c6500000000, 0x7532d69400000000, 0xca3ac95d00000000,
+    0x603f13ac00000000, 0x9aaa79d000000000, 0x30afa32100000000,
+    0x8fa7bce800000000, 0x25a2661900000000, 0xb0b0f3a100000000,
+    0x1ab5295000000000, 0xa5bd369900000000, 0x0fb8ec6800000000,
+    0xce9e6d3300000000, 0x649bb7c200000000, 0xdb93a80b00000000,
+    0x719672fa00000000, 0xe484e74200000000, 0x4e813db300000000,
+    0xf189227a00000000, 0x5b8cf88b00000000, 0x73c420cd00000000,
+    0xd9c1fa3c00000000, 0x66c9e5f500000000, 0xcccc3f0400000000,
+    0x59deaabc00000000, 0xf3db704d00000000, 0x4cd36f8400000000,
+    0xe6d6b57500000000, 0x27f0342e00000000, 0x8df5eedf00000000,
+    0x32fdf11600000000, 0x98f82be700000000, 0x0deabe5f00000000,
+    0xa7ef64ae00000000, 0x18e77b6700000000, 0xb2e2a19600000000,
+    0xecccae9f00000000, 0x46c9746e00000000, 0xf9c16ba700000000,
+    0x53c4b15600000000, 0xc6d624ee00000000, 0x6cd3fe1f00000000,
+    0xd3dbe1d600000000, 0x79de3b2700000000, 0xb8f8ba7c00000000,
+    0x12fd608d00000000, 0xadf57f4400000000, 0x07f0a5b500000000,
+    0x92e2300d00000000, 0x38e7eafc00000000, 0x87eff53500000000,
+    0x2dea2fc400000000, 0x05a2f78200000000, 0xafa72d7300000000,
+    0x10af32ba00000000, 0xbaaae84b00000000, 0x2fb87df300000000,
+    0x85bda70200000000, 0x3ab5b8cb00000000, 0x90b0623a00000000,
+    0x5196e36100000000, 0xfb93399000000000, 0x449b265900000000,
+    0xee9efca800000000, 0x7b8c691000000000, 0xd189b3e100000000,
+    0x6e81ac2800000000, 0xc48476d900000000, 0x3e111ca500000000,
+    0x9414c65400000000, 0x2b1cd99d00000000, 0x8119036c00000000,
+    0x140b96d400000000, 0xbe0e4c2500000000, 0x010653ec00000000,
+    0xab03891d00000000, 0x6a25084600000000, 0xc020d2b700000000,
+    0x7f28cd7e00000000, 0xd52d178f00000000, 0x403f823700000000,
+    0xea3a58c600000000, 0x5532470f00000000, 0xff379dfe00000000,
+    0xd77f45b800000000, 0x7d7a9f4900000000, 0xc272808000000000,
+    0x68775a7100000000, 0xfd65cfc900000000, 0x5760153800000000,
+    0xe8680af100000000, 0x426dd00000000000, 0x834b515b00000000,
+    0x294e8baa00000000, 0x9646946300000000, 0x3c434e9200000000,
+    0xa951db2a00000000, 0x035401db00000000, 0xbc5c1e1200000000,
+    0x1659c4e300000000}};
+
+#else /* W == 4 */
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87,
+    0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede,
+    0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab,
+    0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c,
+    0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1,
+    0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7,
+    0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e,
+    0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308,
+    0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5,
+    0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472,
+    0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07,
+    0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e,
+    0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa,
+    0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec,
+    0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6,
+    0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0,
+    0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3,
+    0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba,
+    0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf,
+    0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975,
+    0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8,
+    0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde,
+    0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a,
+    0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c,
+    0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1,
+    0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65,
+    0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410,
+    0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649,
+    0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a,
+    0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c,
+    0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946,
+    0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450,
+    0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e,
+    0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857,
+    0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022,
+    0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5,
+    0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758,
+    0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e,
+    0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d,
+    0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b,
+    0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6,
+    0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401,
+    0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74,
+    0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d,
+    0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073,
+    0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65,
+    0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f,
+    0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749,
+    0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a,
+    0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033,
+    0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846,
+    0x0d7139d7},
+   {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563,
+    0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f,
+    0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875,
+    0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536,
+    0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8,
+    0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43,
+    0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f,
+    0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184,
+    0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a,
+    0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39,
+    0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523,
+    0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f,
+    0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d,
+    0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6,
+    0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b,
+    0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0,
+    0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151,
+    0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d,
+    0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47,
+    0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a,
+    0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964,
+    0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef,
+    0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d,
+    0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6,
+    0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348,
+    0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53,
+    0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449,
+    0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645,
+    0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4,
+    0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f,
+    0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2,
+    0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69,
+    0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46,
+    0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a,
+    0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650,
+    0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13,
+    0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded,
+    0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366,
+    0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57,
+    0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc,
+    0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222,
+    0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61,
+    0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b,
+    0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277,
+    0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558,
+    0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3,
+    0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e,
+    0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5,
+    0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74,
+    0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78,
+    0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262,
+    0x1c53e98a},
+   {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b,
+    0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40,
+    0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580,
+    0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7,
+    0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a,
+    0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37,
+    0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75,
+    0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218,
+    0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5,
+    0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2,
+    0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02,
+    0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59,
+    0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1,
+    0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c,
+    0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a,
+    0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307,
+    0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486,
+    0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd,
+    0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d,
+    0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2,
+    0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f,
+    0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72,
+    0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8,
+    0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985,
+    0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268,
+    0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94,
+    0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454,
+    0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f,
+    0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e,
+    0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3,
+    0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915,
+    0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778,
+    0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821,
+    0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a,
+    0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba,
+    0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d,
+    0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560,
+    0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d,
+    0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe,
+    0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3,
+    0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e,
+    0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509,
+    0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9,
+    0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92,
+    0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb,
+    0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6,
+    0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50,
+    0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d,
+    0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc,
+    0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7,
+    0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927,
+    0x3f88e851},
+   {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96,
+    0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8,
+    0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0,
+    0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14,
+    0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7,
+    0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4,
+    0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe,
+    0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad,
+    0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e,
+    0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa,
+    0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2,
+    0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c,
+    0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab,
+    0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8,
+    0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d,
+    0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e,
+    0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7,
+    0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99,
+    0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1,
+    0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690,
+    0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933,
+    0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20,
+    0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf,
+    0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc,
+    0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f,
+    0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92,
+    0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca,
+    0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4,
+    0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd,
+    0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de,
+    0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb,
+    0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8,
+    0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474,
+    0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a,
+    0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252,
+    0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6,
+    0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55,
+    0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846,
+    0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7,
+    0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4,
+    0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47,
+    0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3,
+    0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb,
+    0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5,
+    0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49,
+    0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a,
+    0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f,
+    0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c,
+    0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305,
+    0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b,
+    0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523,
+    0x3dee8ca6}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x00000000, 0x85d996dd, 0x4bb55c60, 0xce6ccabd, 0x966ab9c0,
+    0x13b32f1d, 0xdddfe5a0, 0x5806737d, 0x6dd3035a, 0xe80a9587,
+    0x26665f3a, 0xa3bfc9e7, 0xfbb9ba9a, 0x7e602c47, 0xb00ce6fa,
+    0x35d57027, 0xdaa607b4, 0x5f7f9169, 0x91135bd4, 0x14cacd09,
+    0x4cccbe74, 0xc91528a9, 0x0779e214, 0x82a074c9, 0xb77504ee,
+    0x32ac9233, 0xfcc0588e, 0x7919ce53, 0x211fbd2e, 0xa4c62bf3,
+    0x6aaae14e, 0xef737793, 0xf54b7eb3, 0x7092e86e, 0xbefe22d3,
+    0x3b27b40e, 0x6321c773, 0xe6f851ae, 0x28949b13, 0xad4d0dce,
+    0x98987de9, 0x1d41eb34, 0xd32d2189, 0x56f4b754, 0x0ef2c429,
+    0x8b2b52f4, 0x45479849, 0xc09e0e94, 0x2fed7907, 0xaa34efda,
+    0x64582567, 0xe181b3ba, 0xb987c0c7, 0x3c5e561a, 0xf2329ca7,
+    0x77eb0a7a, 0x423e7a5d, 0xc7e7ec80, 0x098b263d, 0x8c52b0e0,
+    0xd454c39d, 0x518d5540, 0x9fe19ffd, 0x1a380920, 0xab918dbd,
+    0x2e481b60, 0xe024d1dd, 0x65fd4700, 0x3dfb347d, 0xb822a2a0,
+    0x764e681d, 0xf397fec0, 0xc6428ee7, 0x439b183a, 0x8df7d287,
+    0x082e445a, 0x50283727, 0xd5f1a1fa, 0x1b9d6b47, 0x9e44fd9a,
+    0x71378a09, 0xf4ee1cd4, 0x3a82d669, 0xbf5b40b4, 0xe75d33c9,
+    0x6284a514, 0xace86fa9, 0x2931f974, 0x1ce48953, 0x993d1f8e,
+    0x5751d533, 0xd28843ee, 0x8a8e3093, 0x0f57a64e, 0xc13b6cf3,
+    0x44e2fa2e, 0x5edaf30e, 0xdb0365d3, 0x156faf6e, 0x90b639b3,
+    0xc8b04ace, 0x4d69dc13, 0x830516ae, 0x06dc8073, 0x3309f054,
+    0xb6d06689, 0x78bcac34, 0xfd653ae9, 0xa5634994, 0x20badf49,
+    0xeed615f4, 0x6b0f8329, 0x847cf4ba, 0x01a56267, 0xcfc9a8da,
+    0x4a103e07, 0x12164d7a, 0x97cfdba7, 0x59a3111a, 0xdc7a87c7,
+    0xe9aff7e0, 0x6c76613d, 0xa21aab80, 0x27c33d5d, 0x7fc54e20,
+    0xfa1cd8fd, 0x34701240, 0xb1a9849d, 0x17256aa0, 0x92fcfc7d,
+    0x5c9036c0, 0xd949a01d, 0x814fd360, 0x049645bd, 0xcafa8f00,
+    0x4f2319dd, 0x7af669fa, 0xff2fff27, 0x3143359a, 0xb49aa347,
+    0xec9cd03a, 0x694546e7, 0xa7298c5a, 0x22f01a87, 0xcd836d14,
+    0x485afbc9, 0x86363174, 0x03efa7a9, 0x5be9d4d4, 0xde304209,
+    0x105c88b4, 0x95851e69, 0xa0506e4e, 0x2589f893, 0xebe5322e,
+    0x6e3ca4f3, 0x363ad78e, 0xb3e34153, 0x7d8f8bee, 0xf8561d33,
+    0xe26e1413, 0x67b782ce, 0xa9db4873, 0x2c02deae, 0x7404add3,
+    0xf1dd3b0e, 0x3fb1f1b3, 0xba68676e, 0x8fbd1749, 0x0a648194,
+    0xc4084b29, 0x41d1ddf4, 0x19d7ae89, 0x9c0e3854, 0x5262f2e9,
+    0xd7bb6434, 0x38c813a7, 0xbd11857a, 0x737d4fc7, 0xf6a4d91a,
+    0xaea2aa67, 0x2b7b3cba, 0xe517f607, 0x60ce60da, 0x551b10fd,
+    0xd0c28620, 0x1eae4c9d, 0x9b77da40, 0xc371a93d, 0x46a83fe0,
+    0x88c4f55d, 0x0d1d6380, 0xbcb4e71d, 0x396d71c0, 0xf701bb7d,
+    0x72d82da0, 0x2ade5edd, 0xaf07c800, 0x616b02bd, 0xe4b29460,
+    0xd167e447, 0x54be729a, 0x9ad2b827, 0x1f0b2efa, 0x470d5d87,
+    0xc2d4cb5a, 0x0cb801e7, 0x8961973a, 0x6612e0a9, 0xe3cb7674,
+    0x2da7bcc9, 0xa87e2a14, 0xf0785969, 0x75a1cfb4, 0xbbcd0509,
+    0x3e1493d4, 0x0bc1e3f3, 0x8e18752e, 0x4074bf93, 0xc5ad294e,
+    0x9dab5a33, 0x1872ccee, 0xd61e0653, 0x53c7908e, 0x49ff99ae,
+    0xcc260f73, 0x024ac5ce, 0x87935313, 0xdf95206e, 0x5a4cb6b3,
+    0x94207c0e, 0x11f9ead3, 0x242c9af4, 0xa1f50c29, 0x6f99c694,
+    0xea405049, 0xb2462334, 0x379fb5e9, 0xf9f37f54, 0x7c2ae989,
+    0x93599e1a, 0x168008c7, 0xd8ecc27a, 0x5d3554a7, 0x053327da,
+    0x80eab107, 0x4e867bba, 0xcb5fed67, 0xfe8a9d40, 0x7b530b9d,
+    0xb53fc120, 0x30e657fd, 0x68e02480, 0xed39b25d, 0x235578e0,
+    0xa68cee3d},
+   {0x00000000, 0x76e10f9d, 0xadc46ee1, 0xdb25617c, 0x1b8fac19,
+    0x6d6ea384, 0xb64bc2f8, 0xc0aacd65, 0x361e5933, 0x40ff56ae,
+    0x9bda37d2, 0xed3b384f, 0x2d91f52a, 0x5b70fab7, 0x80559bcb,
+    0xf6b49456, 0x6c3cb266, 0x1addbdfb, 0xc1f8dc87, 0xb719d31a,
+    0x77b31e7f, 0x015211e2, 0xda77709e, 0xac967f03, 0x5a22eb55,
+    0x2cc3e4c8, 0xf7e685b4, 0x81078a29, 0x41ad474c, 0x374c48d1,
+    0xec6929ad, 0x9a882630, 0xd87864cd, 0xae996b50, 0x75bc0a2c,
+    0x035d05b1, 0xc3f7c8d4, 0xb516c749, 0x6e33a635, 0x18d2a9a8,
+    0xee663dfe, 0x98873263, 0x43a2531f, 0x35435c82, 0xf5e991e7,
+    0x83089e7a, 0x582dff06, 0x2eccf09b, 0xb444d6ab, 0xc2a5d936,
+    0x1980b84a, 0x6f61b7d7, 0xafcb7ab2, 0xd92a752f, 0x020f1453,
+    0x74ee1bce, 0x825a8f98, 0xf4bb8005, 0x2f9ee179, 0x597feee4,
+    0x99d52381, 0xef342c1c, 0x34114d60, 0x42f042fd, 0xf1f7b941,
+    0x8716b6dc, 0x5c33d7a0, 0x2ad2d83d, 0xea781558, 0x9c991ac5,
+    0x47bc7bb9, 0x315d7424, 0xc7e9e072, 0xb108efef, 0x6a2d8e93,
+    0x1ccc810e, 0xdc664c6b, 0xaa8743f6, 0x71a2228a, 0x07432d17,
+    0x9dcb0b27, 0xeb2a04ba, 0x300f65c6, 0x46ee6a5b, 0x8644a73e,
+    0xf0a5a8a3, 0x2b80c9df, 0x5d61c642, 0xabd55214, 0xdd345d89,
+    0x06113cf5, 0x70f03368, 0xb05afe0d, 0xc6bbf190, 0x1d9e90ec,
+    0x6b7f9f71, 0x298fdd8c, 0x5f6ed211, 0x844bb36d, 0xf2aabcf0,
+    0x32007195, 0x44e17e08, 0x9fc41f74, 0xe92510e9, 0x1f9184bf,
+    0x69708b22, 0xb255ea5e, 0xc4b4e5c3, 0x041e28a6, 0x72ff273b,
+    0xa9da4647, 0xdf3b49da, 0x45b36fea, 0x33526077, 0xe877010b,
+    0x9e960e96, 0x5e3cc3f3, 0x28ddcc6e, 0xf3f8ad12, 0x8519a28f,
+    0x73ad36d9, 0x054c3944, 0xde695838, 0xa88857a5, 0x68229ac0,
+    0x1ec3955d, 0xc5e6f421, 0xb307fbbc, 0xe2ef7383, 0x940e7c1e,
+    0x4f2b1d62, 0x39ca12ff, 0xf960df9a, 0x8f81d007, 0x54a4b17b,
+    0x2245bee6, 0xd4f12ab0, 0xa210252d, 0x79354451, 0x0fd44bcc,
+    0xcf7e86a9, 0xb99f8934, 0x62bae848, 0x145be7d5, 0x8ed3c1e5,
+    0xf832ce78, 0x2317af04, 0x55f6a099, 0x955c6dfc, 0xe3bd6261,
+    0x3898031d, 0x4e790c80, 0xb8cd98d6, 0xce2c974b, 0x1509f637,
+    0x63e8f9aa, 0xa34234cf, 0xd5a33b52, 0x0e865a2e, 0x786755b3,
+    0x3a97174e, 0x4c7618d3, 0x975379af, 0xe1b27632, 0x2118bb57,
+    0x57f9b4ca, 0x8cdcd5b6, 0xfa3dda2b, 0x0c894e7d, 0x7a6841e0,
+    0xa14d209c, 0xd7ac2f01, 0x1706e264, 0x61e7edf9, 0xbac28c85,
+    0xcc238318, 0x56aba528, 0x204aaab5, 0xfb6fcbc9, 0x8d8ec454,
+    0x4d240931, 0x3bc506ac, 0xe0e067d0, 0x9601684d, 0x60b5fc1b,
+    0x1654f386, 0xcd7192fa, 0xbb909d67, 0x7b3a5002, 0x0ddb5f9f,
+    0xd6fe3ee3, 0xa01f317e, 0x1318cac2, 0x65f9c55f, 0xbedca423,
+    0xc83dabbe, 0x089766db, 0x7e766946, 0xa553083a, 0xd3b207a7,
+    0x250693f1, 0x53e79c6c, 0x88c2fd10, 0xfe23f28d, 0x3e893fe8,
+    0x48683075, 0x934d5109, 0xe5ac5e94, 0x7f2478a4, 0x09c57739,
+    0xd2e01645, 0xa40119d8, 0x64abd4bd, 0x124adb20, 0xc96fba5c,
+    0xbf8eb5c1, 0x493a2197, 0x3fdb2e0a, 0xe4fe4f76, 0x921f40eb,
+    0x52b58d8e, 0x24548213, 0xff71e36f, 0x8990ecf2, 0xcb60ae0f,
+    0xbd81a192, 0x66a4c0ee, 0x1045cf73, 0xd0ef0216, 0xa60e0d8b,
+    0x7d2b6cf7, 0x0bca636a, 0xfd7ef73c, 0x8b9ff8a1, 0x50ba99dd,
+    0x265b9640, 0xe6f15b25, 0x901054b8, 0x4b3535c4, 0x3dd43a59,
+    0xa75c1c69, 0xd1bd13f4, 0x0a987288, 0x7c797d15, 0xbcd3b070,
+    0xca32bfed, 0x1117de91, 0x67f6d10c, 0x9142455a, 0xe7a34ac7,
+    0x3c862bbb, 0x4a672426, 0x8acde943, 0xfc2ce6de, 0x270987a2,
+    0x51e8883f},
+   {0x00000000, 0xe8dbfbb9, 0x91b186a8, 0x796a7d11, 0x63657c8a,
+    0x8bbe8733, 0xf2d4fa22, 0x1a0f019b, 0x87cc89cf, 0x6f177276,
+    0x167d0f67, 0xfea6f4de, 0xe4a9f545, 0x0c720efc, 0x751873ed,
+    0x9dc38854, 0x4f9f6244, 0xa74499fd, 0xde2ee4ec, 0x36f51f55,
+    0x2cfa1ece, 0xc421e577, 0xbd4b9866, 0x559063df, 0xc853eb8b,
+    0x20881032, 0x59e26d23, 0xb139969a, 0xab369701, 0x43ed6cb8,
+    0x3a8711a9, 0xd25cea10, 0x9e3ec588, 0x76e53e31, 0x0f8f4320,
+    0xe754b899, 0xfd5bb902, 0x158042bb, 0x6cea3faa, 0x8431c413,
+    0x19f24c47, 0xf129b7fe, 0x8843caef, 0x60983156, 0x7a9730cd,
+    0x924ccb74, 0xeb26b665, 0x03fd4ddc, 0xd1a1a7cc, 0x397a5c75,
+    0x40102164, 0xa8cbdadd, 0xb2c4db46, 0x5a1f20ff, 0x23755dee,
+    0xcbaea657, 0x566d2e03, 0xbeb6d5ba, 0xc7dca8ab, 0x2f075312,
+    0x35085289, 0xddd3a930, 0xa4b9d421, 0x4c622f98, 0x7d7bfbca,
+    0x95a00073, 0xecca7d62, 0x041186db, 0x1e1e8740, 0xf6c57cf9,
+    0x8faf01e8, 0x6774fa51, 0xfab77205, 0x126c89bc, 0x6b06f4ad,
+    0x83dd0f14, 0x99d20e8f, 0x7109f536, 0x08638827, 0xe0b8739e,
+    0x32e4998e, 0xda3f6237, 0xa3551f26, 0x4b8ee49f, 0x5181e504,
+    0xb95a1ebd, 0xc03063ac, 0x28eb9815, 0xb5281041, 0x5df3ebf8,
+    0x249996e9, 0xcc426d50, 0xd64d6ccb, 0x3e969772, 0x47fcea63,
+    0xaf2711da, 0xe3453e42, 0x0b9ec5fb, 0x72f4b8ea, 0x9a2f4353,
+    0x802042c8, 0x68fbb971, 0x1191c460, 0xf94a3fd9, 0x6489b78d,
+    0x8c524c34, 0xf5383125, 0x1de3ca9c, 0x07eccb07, 0xef3730be,
+    0x965d4daf, 0x7e86b616, 0xacda5c06, 0x4401a7bf, 0x3d6bdaae,
+    0xd5b02117, 0xcfbf208c, 0x2764db35, 0x5e0ea624, 0xb6d55d9d,
+    0x2b16d5c9, 0xc3cd2e70, 0xbaa75361, 0x527ca8d8, 0x4873a943,
+    0xa0a852fa, 0xd9c22feb, 0x3119d452, 0xbbf0874e, 0x532b7cf7,
+    0x2a4101e6, 0xc29afa5f, 0xd895fbc4, 0x304e007d, 0x49247d6c,
+    0xa1ff86d5, 0x3c3c0e81, 0xd4e7f538, 0xad8d8829, 0x45567390,
+    0x5f59720b, 0xb78289b2, 0xcee8f4a3, 0x26330f1a, 0xf46fe50a,
+    0x1cb41eb3, 0x65de63a2, 0x8d05981b, 0x970a9980, 0x7fd16239,
+    0x06bb1f28, 0xee60e491, 0x73a36cc5, 0x9b78977c, 0xe212ea6d,
+    0x0ac911d4, 0x10c6104f, 0xf81debf6, 0x817796e7, 0x69ac6d5e,
+    0x25ce42c6, 0xcd15b97f, 0xb47fc46e, 0x5ca43fd7, 0x46ab3e4c,
+    0xae70c5f5, 0xd71ab8e4, 0x3fc1435d, 0xa202cb09, 0x4ad930b0,
+    0x33b34da1, 0xdb68b618, 0xc167b783, 0x29bc4c3a, 0x50d6312b,
+    0xb80dca92, 0x6a512082, 0x828adb3b, 0xfbe0a62a, 0x133b5d93,
+    0x09345c08, 0xe1efa7b1, 0x9885daa0, 0x705e2119, 0xed9da94d,
+    0x054652f4, 0x7c2c2fe5, 0x94f7d45c, 0x8ef8d5c7, 0x66232e7e,
+    0x1f49536f, 0xf792a8d6, 0xc68b7c84, 0x2e50873d, 0x573afa2c,
+    0xbfe10195, 0xa5ee000e, 0x4d35fbb7, 0x345f86a6, 0xdc847d1f,
+    0x4147f54b, 0xa99c0ef2, 0xd0f673e3, 0x382d885a, 0x222289c1,
+    0xcaf97278, 0xb3930f69, 0x5b48f4d0, 0x89141ec0, 0x61cfe579,
+    0x18a59868, 0xf07e63d1, 0xea71624a, 0x02aa99f3, 0x7bc0e4e2,
+    0x931b1f5b, 0x0ed8970f, 0xe6036cb6, 0x9f6911a7, 0x77b2ea1e,
+    0x6dbdeb85, 0x8566103c, 0xfc0c6d2d, 0x14d79694, 0x58b5b90c,
+    0xb06e42b5, 0xc9043fa4, 0x21dfc41d, 0x3bd0c586, 0xd30b3e3f,
+    0xaa61432e, 0x42bab897, 0xdf7930c3, 0x37a2cb7a, 0x4ec8b66b,
+    0xa6134dd2, 0xbc1c4c49, 0x54c7b7f0, 0x2dadcae1, 0xc5763158,
+    0x172adb48, 0xfff120f1, 0x869b5de0, 0x6e40a659, 0x744fa7c2,
+    0x9c945c7b, 0xe5fe216a, 0x0d25dad3, 0x90e65287, 0x783da93e,
+    0x0157d42f, 0xe98c2f96, 0xf3832e0d, 0x1b58d5b4, 0x6232a8a5,
+    0x8ae9531c},
+   {0x00000000, 0x919168ae, 0x6325a087, 0xf2b4c829, 0x874c31d4,
+    0x16dd597a, 0xe4699153, 0x75f8f9fd, 0x4f9f1373, 0xde0e7bdd,
+    0x2cbab3f4, 0xbd2bdb5a, 0xc8d322a7, 0x59424a09, 0xabf68220,
+    0x3a67ea8e, 0x9e3e27e6, 0x0faf4f48, 0xfd1b8761, 0x6c8aefcf,
+    0x19721632, 0x88e37e9c, 0x7a57b6b5, 0xebc6de1b, 0xd1a13495,
+    0x40305c3b, 0xb2849412, 0x2315fcbc, 0x56ed0541, 0xc77c6def,
+    0x35c8a5c6, 0xa459cd68, 0x7d7b3f17, 0xecea57b9, 0x1e5e9f90,
+    0x8fcff73e, 0xfa370ec3, 0x6ba6666d, 0x9912ae44, 0x0883c6ea,
+    0x32e42c64, 0xa37544ca, 0x51c18ce3, 0xc050e44d, 0xb5a81db0,
+    0x2439751e, 0xd68dbd37, 0x471cd599, 0xe34518f1, 0x72d4705f,
+    0x8060b876, 0x11f1d0d8, 0x64092925, 0xf598418b, 0x072c89a2,
+    0x96bde10c, 0xacda0b82, 0x3d4b632c, 0xcfffab05, 0x5e6ec3ab,
+    0x2b963a56, 0xba0752f8, 0x48b39ad1, 0xd922f27f, 0xfaf67e2e,
+    0x6b671680, 0x99d3dea9, 0x0842b607, 0x7dba4ffa, 0xec2b2754,
+    0x1e9fef7d, 0x8f0e87d3, 0xb5696d5d, 0x24f805f3, 0xd64ccdda,
+    0x47dda574, 0x32255c89, 0xa3b43427, 0x5100fc0e, 0xc09194a0,
+    0x64c859c8, 0xf5593166, 0x07edf94f, 0x967c91e1, 0xe384681c,
+    0x721500b2, 0x80a1c89b, 0x1130a035, 0x2b574abb, 0xbac62215,
+    0x4872ea3c, 0xd9e38292, 0xac1b7b6f, 0x3d8a13c1, 0xcf3edbe8,
+    0x5eafb346, 0x878d4139, 0x161c2997, 0xe4a8e1be, 0x75398910,
+    0x00c170ed, 0x91501843, 0x63e4d06a, 0xf275b8c4, 0xc812524a,
+    0x59833ae4, 0xab37f2cd, 0x3aa69a63, 0x4f5e639e, 0xdecf0b30,
+    0x2c7bc319, 0xbdeaabb7, 0x19b366df, 0x88220e71, 0x7a96c658,
+    0xeb07aef6, 0x9eff570b, 0x0f6e3fa5, 0xfddaf78c, 0x6c4b9f22,
+    0x562c75ac, 0xc7bd1d02, 0x3509d52b, 0xa498bd85, 0xd1604478,
+    0x40f12cd6, 0xb245e4ff, 0x23d48c51, 0xf4edfd5c, 0x657c95f2,
+    0x97c85ddb, 0x06593575, 0x73a1cc88, 0xe230a426, 0x10846c0f,
+    0x811504a1, 0xbb72ee2f, 0x2ae38681, 0xd8574ea8, 0x49c62606,
+    0x3c3edffb, 0xadafb755, 0x5f1b7f7c, 0xce8a17d2, 0x6ad3daba,
+    0xfb42b214, 0x09f67a3d, 0x98671293, 0xed9feb6e, 0x7c0e83c0,
+    0x8eba4be9, 0x1f2b2347, 0x254cc9c9, 0xb4dda167, 0x4669694e,
+    0xd7f801e0, 0xa200f81d, 0x339190b3, 0xc125589a, 0x50b43034,
+    0x8996c24b, 0x1807aae5, 0xeab362cc, 0x7b220a62, 0x0edaf39f,
+    0x9f4b9b31, 0x6dff5318, 0xfc6e3bb6, 0xc609d138, 0x5798b996,
+    0xa52c71bf, 0x34bd1911, 0x4145e0ec, 0xd0d48842, 0x2260406b,
+    0xb3f128c5, 0x17a8e5ad, 0x86398d03, 0x748d452a, 0xe51c2d84,
+    0x90e4d479, 0x0175bcd7, 0xf3c174fe, 0x62501c50, 0x5837f6de,
+    0xc9a69e70, 0x3b125659, 0xaa833ef7, 0xdf7bc70a, 0x4eeaafa4,
+    0xbc5e678d, 0x2dcf0f23, 0x0e1b8372, 0x9f8aebdc, 0x6d3e23f5,
+    0xfcaf4b5b, 0x8957b2a6, 0x18c6da08, 0xea721221, 0x7be37a8f,
+    0x41849001, 0xd015f8af, 0x22a13086, 0xb3305828, 0xc6c8a1d5,
+    0x5759c97b, 0xa5ed0152, 0x347c69fc, 0x9025a494, 0x01b4cc3a,
+    0xf3000413, 0x62916cbd, 0x17699540, 0x86f8fdee, 0x744c35c7,
+    0xe5dd5d69, 0xdfbab7e7, 0x4e2bdf49, 0xbc9f1760, 0x2d0e7fce,
+    0x58f68633, 0xc967ee9d, 0x3bd326b4, 0xaa424e1a, 0x7360bc65,
+    0xe2f1d4cb, 0x10451ce2, 0x81d4744c, 0xf42c8db1, 0x65bde51f,
+    0x97092d36, 0x06984598, 0x3cffaf16, 0xad6ec7b8, 0x5fda0f91,
+    0xce4b673f, 0xbbb39ec2, 0x2a22f66c, 0xd8963e45, 0x490756eb,
+    0xed5e9b83, 0x7ccff32d, 0x8e7b3b04, 0x1fea53aa, 0x6a12aa57,
+    0xfb83c2f9, 0x09370ad0, 0x98a6627e, 0xa2c188f0, 0x3350e05e,
+    0xc1e42877, 0x507540d9, 0x258db924, 0xb41cd18a, 0x46a819a3,
+    0xd739710d}};
+
+#endif
+
+#endif
+
+#if N == 5
+
+#if W == 8
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0xaf449247, 0x85f822cf, 0x2abcb088, 0xd08143df,
+    0x7fc5d198, 0x55796110, 0xfa3df357, 0x7a7381ff, 0xd53713b8,
+    0xff8ba330, 0x50cf3177, 0xaaf2c220, 0x05b65067, 0x2f0ae0ef,
+    0x804e72a8, 0xf4e703fe, 0x5ba391b9, 0x711f2131, 0xde5bb376,
+    0x24664021, 0x8b22d266, 0xa19e62ee, 0x0edaf0a9, 0x8e948201,
+    0x21d01046, 0x0b6ca0ce, 0xa4283289, 0x5e15c1de, 0xf1515399,
+    0xdbede311, 0x74a97156, 0x32bf01bd, 0x9dfb93fa, 0xb7472372,
+    0x1803b135, 0xe23e4262, 0x4d7ad025, 0x67c660ad, 0xc882f2ea,
+    0x48cc8042, 0xe7881205, 0xcd34a28d, 0x627030ca, 0x984dc39d,
+    0x370951da, 0x1db5e152, 0xb2f17315, 0xc6580243, 0x691c9004,
+    0x43a0208c, 0xece4b2cb, 0x16d9419c, 0xb99dd3db, 0x93216353,
+    0x3c65f114, 0xbc2b83bc, 0x136f11fb, 0x39d3a173, 0x96973334,
+    0x6caac063, 0xc3ee5224, 0xe952e2ac, 0x461670eb, 0x657e037a,
+    0xca3a913d, 0xe08621b5, 0x4fc2b3f2, 0xb5ff40a5, 0x1abbd2e2,
+    0x3007626a, 0x9f43f02d, 0x1f0d8285, 0xb04910c2, 0x9af5a04a,
+    0x35b1320d, 0xcf8cc15a, 0x60c8531d, 0x4a74e395, 0xe53071d2,
+    0x91990084, 0x3edd92c3, 0x1461224b, 0xbb25b00c, 0x4118435b,
+    0xee5cd11c, 0xc4e06194, 0x6ba4f3d3, 0xebea817b, 0x44ae133c,
+    0x6e12a3b4, 0xc15631f3, 0x3b6bc2a4, 0x942f50e3, 0xbe93e06b,
+    0x11d7722c, 0x57c102c7, 0xf8859080, 0xd2392008, 0x7d7db24f,
+    0x87404118, 0x2804d35f, 0x02b863d7, 0xadfcf190, 0x2db28338,
+    0x82f6117f, 0xa84aa1f7, 0x070e33b0, 0xfd33c0e7, 0x527752a0,
+    0x78cbe228, 0xd78f706f, 0xa3260139, 0x0c62937e, 0x26de23f6,
+    0x899ab1b1, 0x73a742e6, 0xdce3d0a1, 0xf65f6029, 0x591bf26e,
+    0xd95580c6, 0x76111281, 0x5cada209, 0xf3e9304e, 0x09d4c319,
+    0xa690515e, 0x8c2ce1d6, 0x23687391, 0xcafc06f4, 0x65b894b3,
+    0x4f04243b, 0xe040b67c, 0x1a7d452b, 0xb539d76c, 0x9f8567e4,
+    0x30c1f5a3, 0xb08f870b, 0x1fcb154c, 0x3577a5c4, 0x9a333783,
+    0x600ec4d4, 0xcf4a5693, 0xe5f6e61b, 0x4ab2745c, 0x3e1b050a,
+    0x915f974d, 0xbbe327c5, 0x14a7b582, 0xee9a46d5, 0x41ded492,
+    0x6b62641a, 0xc426f65d, 0x446884f5, 0xeb2c16b2, 0xc190a63a,
+    0x6ed4347d, 0x94e9c72a, 0x3bad556d, 0x1111e5e5, 0xbe5577a2,
+    0xf8430749, 0x5707950e, 0x7dbb2586, 0xd2ffb7c1, 0x28c24496,
+    0x8786d6d1, 0xad3a6659, 0x027ef41e, 0x823086b6, 0x2d7414f1,
+    0x07c8a479, 0xa88c363e, 0x52b1c569, 0xfdf5572e, 0xd749e7a6,
+    0x780d75e1, 0x0ca404b7, 0xa3e096f0, 0x895c2678, 0x2618b43f,
+    0xdc254768, 0x7361d52f, 0x59dd65a7, 0xf699f7e0, 0x76d78548,
+    0xd993170f, 0xf32fa787, 0x5c6b35c0, 0xa656c697, 0x091254d0,
+    0x23aee458, 0x8cea761f, 0xaf82058e, 0x00c697c9, 0x2a7a2741,
+    0x853eb506, 0x7f034651, 0xd047d416, 0xfafb649e, 0x55bff6d9,
+    0xd5f18471, 0x7ab51636, 0x5009a6be, 0xff4d34f9, 0x0570c7ae,
+    0xaa3455e9, 0x8088e561, 0x2fcc7726, 0x5b650670, 0xf4219437,
+    0xde9d24bf, 0x71d9b6f8, 0x8be445af, 0x24a0d7e8, 0x0e1c6760,
+    0xa158f527, 0x2116878f, 0x8e5215c8, 0xa4eea540, 0x0baa3707,
+    0xf197c450, 0x5ed35617, 0x746fe69f, 0xdb2b74d8, 0x9d3d0433,
+    0x32799674, 0x18c526fc, 0xb781b4bb, 0x4dbc47ec, 0xe2f8d5ab,
+    0xc8446523, 0x6700f764, 0xe74e85cc, 0x480a178b, 0x62b6a703,
+    0xcdf23544, 0x37cfc613, 0x988b5454, 0xb237e4dc, 0x1d73769b,
+    0x69da07cd, 0xc69e958a, 0xec222502, 0x4366b745, 0xb95b4412,
+    0x161fd655, 0x3ca366dd, 0x93e7f49a, 0x13a98632, 0xbced1475,
+    0x9651a4fd, 0x391536ba, 0xc328c5ed, 0x6c6c57aa, 0x46d0e722,
+    0xe9947565},
+   {0x00000000, 0x4e890ba9, 0x9d121752, 0xd39b1cfb, 0xe15528e5,
+    0xafdc234c, 0x7c473fb7, 0x32ce341e, 0x19db578b, 0x57525c22,
+    0x84c940d9, 0xca404b70, 0xf88e7f6e, 0xb60774c7, 0x659c683c,
+    0x2b156395, 0x33b6af16, 0x7d3fa4bf, 0xaea4b844, 0xe02db3ed,
+    0xd2e387f3, 0x9c6a8c5a, 0x4ff190a1, 0x01789b08, 0x2a6df89d,
+    0x64e4f334, 0xb77fefcf, 0xf9f6e466, 0xcb38d078, 0x85b1dbd1,
+    0x562ac72a, 0x18a3cc83, 0x676d5e2c, 0x29e45585, 0xfa7f497e,
+    0xb4f642d7, 0x863876c9, 0xc8b17d60, 0x1b2a619b, 0x55a36a32,
+    0x7eb609a7, 0x303f020e, 0xe3a41ef5, 0xad2d155c, 0x9fe32142,
+    0xd16a2aeb, 0x02f13610, 0x4c783db9, 0x54dbf13a, 0x1a52fa93,
+    0xc9c9e668, 0x8740edc1, 0xb58ed9df, 0xfb07d276, 0x289cce8d,
+    0x6615c524, 0x4d00a6b1, 0x0389ad18, 0xd012b1e3, 0x9e9bba4a,
+    0xac558e54, 0xe2dc85fd, 0x31479906, 0x7fce92af, 0xcedabc58,
+    0x8053b7f1, 0x53c8ab0a, 0x1d41a0a3, 0x2f8f94bd, 0x61069f14,
+    0xb29d83ef, 0xfc148846, 0xd701ebd3, 0x9988e07a, 0x4a13fc81,
+    0x049af728, 0x3654c336, 0x78ddc89f, 0xab46d464, 0xe5cfdfcd,
+    0xfd6c134e, 0xb3e518e7, 0x607e041c, 0x2ef70fb5, 0x1c393bab,
+    0x52b03002, 0x812b2cf9, 0xcfa22750, 0xe4b744c5, 0xaa3e4f6c,
+    0x79a55397, 0x372c583e, 0x05e26c20, 0x4b6b6789, 0x98f07b72,
+    0xd67970db, 0xa9b7e274, 0xe73ee9dd, 0x34a5f526, 0x7a2cfe8f,
+    0x48e2ca91, 0x066bc138, 0xd5f0ddc3, 0x9b79d66a, 0xb06cb5ff,
+    0xfee5be56, 0x2d7ea2ad, 0x63f7a904, 0x51399d1a, 0x1fb096b3,
+    0xcc2b8a48, 0x82a281e1, 0x9a014d62, 0xd48846cb, 0x07135a30,
+    0x499a5199, 0x7b546587, 0x35dd6e2e, 0xe64672d5, 0xa8cf797c,
+    0x83da1ae9, 0xcd531140, 0x1ec80dbb, 0x50410612, 0x628f320c,
+    0x2c0639a5, 0xff9d255e, 0xb1142ef7, 0x46c47ef1, 0x084d7558,
+    0xdbd669a3, 0x955f620a, 0xa7915614, 0xe9185dbd, 0x3a834146,
+    0x740a4aef, 0x5f1f297a, 0x119622d3, 0xc20d3e28, 0x8c843581,
+    0xbe4a019f, 0xf0c30a36, 0x235816cd, 0x6dd11d64, 0x7572d1e7,
+    0x3bfbda4e, 0xe860c6b5, 0xa6e9cd1c, 0x9427f902, 0xdaaef2ab,
+    0x0935ee50, 0x47bce5f9, 0x6ca9866c, 0x22208dc5, 0xf1bb913e,
+    0xbf329a97, 0x8dfcae89, 0xc375a520, 0x10eeb9db, 0x5e67b272,
+    0x21a920dd, 0x6f202b74, 0xbcbb378f, 0xf2323c26, 0xc0fc0838,
+    0x8e750391, 0x5dee1f6a, 0x136714c3, 0x38727756, 0x76fb7cff,
+    0xa5606004, 0xebe96bad, 0xd9275fb3, 0x97ae541a, 0x443548e1,
+    0x0abc4348, 0x121f8fcb, 0x5c968462, 0x8f0d9899, 0xc1849330,
+    0xf34aa72e, 0xbdc3ac87, 0x6e58b07c, 0x20d1bbd5, 0x0bc4d840,
+    0x454dd3e9, 0x96d6cf12, 0xd85fc4bb, 0xea91f0a5, 0xa418fb0c,
+    0x7783e7f7, 0x390aec5e, 0x881ec2a9, 0xc697c900, 0x150cd5fb,
+    0x5b85de52, 0x694bea4c, 0x27c2e1e5, 0xf459fd1e, 0xbad0f6b7,
+    0x91c59522, 0xdf4c9e8b, 0x0cd78270, 0x425e89d9, 0x7090bdc7,
+    0x3e19b66e, 0xed82aa95, 0xa30ba13c, 0xbba86dbf, 0xf5216616,
+    0x26ba7aed, 0x68337144, 0x5afd455a, 0x14744ef3, 0xc7ef5208,
+    0x896659a1, 0xa2733a34, 0xecfa319d, 0x3f612d66, 0x71e826cf,
+    0x432612d1, 0x0daf1978, 0xde340583, 0x90bd0e2a, 0xef739c85,
+    0xa1fa972c, 0x72618bd7, 0x3ce8807e, 0x0e26b460, 0x40afbfc9,
+    0x9334a332, 0xddbda89b, 0xf6a8cb0e, 0xb821c0a7, 0x6bbadc5c,
+    0x2533d7f5, 0x17fde3eb, 0x5974e842, 0x8aeff4b9, 0xc466ff10,
+    0xdcc53393, 0x924c383a, 0x41d724c1, 0x0f5e2f68, 0x3d901b76,
+    0x731910df, 0xa0820c24, 0xee0b078d, 0xc51e6418, 0x8b976fb1,
+    0x580c734a, 0x168578e3, 0x244b4cfd, 0x6ac24754, 0xb9595baf,
+    0xf7d05006},
+   {0x00000000, 0x8d88fde2, 0xc060fd85, 0x4de80067, 0x5bb0fd4b,
+    0xd63800a9, 0x9bd000ce, 0x1658fd2c, 0xb761fa96, 0x3ae90774,
+    0x77010713, 0xfa89faf1, 0xecd107dd, 0x6159fa3f, 0x2cb1fa58,
+    0xa13907ba, 0xb5b2f36d, 0x383a0e8f, 0x75d20ee8, 0xf85af30a,
+    0xee020e26, 0x638af3c4, 0x2e62f3a3, 0xa3ea0e41, 0x02d309fb,
+    0x8f5bf419, 0xc2b3f47e, 0x4f3b099c, 0x5963f4b0, 0xd4eb0952,
+    0x99030935, 0x148bf4d7, 0xb014e09b, 0x3d9c1d79, 0x70741d1e,
+    0xfdfce0fc, 0xeba41dd0, 0x662ce032, 0x2bc4e055, 0xa64c1db7,
+    0x07751a0d, 0x8afde7ef, 0xc715e788, 0x4a9d1a6a, 0x5cc5e746,
+    0xd14d1aa4, 0x9ca51ac3, 0x112de721, 0x05a613f6, 0x882eee14,
+    0xc5c6ee73, 0x484e1391, 0x5e16eebd, 0xd39e135f, 0x9e761338,
+    0x13feeeda, 0xb2c7e960, 0x3f4f1482, 0x72a714e5, 0xff2fe907,
+    0xe977142b, 0x64ffe9c9, 0x2917e9ae, 0xa49f144c, 0xbb58c777,
+    0x36d03a95, 0x7b383af2, 0xf6b0c710, 0xe0e83a3c, 0x6d60c7de,
+    0x2088c7b9, 0xad003a5b, 0x0c393de1, 0x81b1c003, 0xcc59c064,
+    0x41d13d86, 0x5789c0aa, 0xda013d48, 0x97e93d2f, 0x1a61c0cd,
+    0x0eea341a, 0x8362c9f8, 0xce8ac99f, 0x4302347d, 0x555ac951,
+    0xd8d234b3, 0x953a34d4, 0x18b2c936, 0xb98bce8c, 0x3403336e,
+    0x79eb3309, 0xf463ceeb, 0xe23b33c7, 0x6fb3ce25, 0x225bce42,
+    0xafd333a0, 0x0b4c27ec, 0x86c4da0e, 0xcb2cda69, 0x46a4278b,
+    0x50fcdaa7, 0xdd742745, 0x909c2722, 0x1d14dac0, 0xbc2ddd7a,
+    0x31a52098, 0x7c4d20ff, 0xf1c5dd1d, 0xe79d2031, 0x6a15ddd3,
+    0x27fdddb4, 0xaa752056, 0xbefed481, 0x33762963, 0x7e9e2904,
+    0xf316d4e6, 0xe54e29ca, 0x68c6d428, 0x252ed44f, 0xa8a629ad,
+    0x099f2e17, 0x8417d3f5, 0xc9ffd392, 0x44772e70, 0x522fd35c,
+    0xdfa72ebe, 0x924f2ed9, 0x1fc7d33b, 0xadc088af, 0x2048754d,
+    0x6da0752a, 0xe02888c8, 0xf67075e4, 0x7bf88806, 0x36108861,
+    0xbb987583, 0x1aa17239, 0x97298fdb, 0xdac18fbc, 0x5749725e,
+    0x41118f72, 0xcc997290, 0x817172f7, 0x0cf98f15, 0x18727bc2,
+    0x95fa8620, 0xd8128647, 0x559a7ba5, 0x43c28689, 0xce4a7b6b,
+    0x83a27b0c, 0x0e2a86ee, 0xaf138154, 0x229b7cb6, 0x6f737cd1,
+    0xe2fb8133, 0xf4a37c1f, 0x792b81fd, 0x34c3819a, 0xb94b7c78,
+    0x1dd46834, 0x905c95d6, 0xddb495b1, 0x503c6853, 0x4664957f,
+    0xcbec689d, 0x860468fa, 0x0b8c9518, 0xaab592a2, 0x273d6f40,
+    0x6ad56f27, 0xe75d92c5, 0xf1056fe9, 0x7c8d920b, 0x3165926c,
+    0xbced6f8e, 0xa8669b59, 0x25ee66bb, 0x680666dc, 0xe58e9b3e,
+    0xf3d66612, 0x7e5e9bf0, 0x33b69b97, 0xbe3e6675, 0x1f0761cf,
+    0x928f9c2d, 0xdf679c4a, 0x52ef61a8, 0x44b79c84, 0xc93f6166,
+    0x84d76101, 0x095f9ce3, 0x16984fd8, 0x9b10b23a, 0xd6f8b25d,
+    0x5b704fbf, 0x4d28b293, 0xc0a04f71, 0x8d484f16, 0x00c0b2f4,
+    0xa1f9b54e, 0x2c7148ac, 0x619948cb, 0xec11b529, 0xfa494805,
+    0x77c1b5e7, 0x3a29b580, 0xb7a14862, 0xa32abcb5, 0x2ea24157,
+    0x634a4130, 0xeec2bcd2, 0xf89a41fe, 0x7512bc1c, 0x38fabc7b,
+    0xb5724199, 0x144b4623, 0x99c3bbc1, 0xd42bbba6, 0x59a34644,
+    0x4ffbbb68, 0xc273468a, 0x8f9b46ed, 0x0213bb0f, 0xa68caf43,
+    0x2b0452a1, 0x66ec52c6, 0xeb64af24, 0xfd3c5208, 0x70b4afea,
+    0x3d5caf8d, 0xb0d4526f, 0x11ed55d5, 0x9c65a837, 0xd18da850,
+    0x5c0555b2, 0x4a5da89e, 0xc7d5557c, 0x8a3d551b, 0x07b5a8f9,
+    0x133e5c2e, 0x9eb6a1cc, 0xd35ea1ab, 0x5ed65c49, 0x488ea165,
+    0xc5065c87, 0x88ee5ce0, 0x0566a102, 0xa45fa6b8, 0x29d75b5a,
+    0x643f5b3d, 0xe9b7a6df, 0xffef5bf3, 0x7267a611, 0x3f8fa676,
+    0xb2075b94},
+   {0x00000000, 0x80f0171f, 0xda91287f, 0x5a613f60, 0x6e5356bf,
+    0xeea341a0, 0xb4c27ec0, 0x343269df, 0xdca6ad7e, 0x5c56ba61,
+    0x06378501, 0x86c7921e, 0xb2f5fbc1, 0x3205ecde, 0x6864d3be,
+    0xe894c4a1, 0x623c5cbd, 0xe2cc4ba2, 0xb8ad74c2, 0x385d63dd,
+    0x0c6f0a02, 0x8c9f1d1d, 0xd6fe227d, 0x560e3562, 0xbe9af1c3,
+    0x3e6ae6dc, 0x640bd9bc, 0xe4fbcea3, 0xd0c9a77c, 0x5039b063,
+    0x0a588f03, 0x8aa8981c, 0xc478b97a, 0x4488ae65, 0x1ee99105,
+    0x9e19861a, 0xaa2befc5, 0x2adbf8da, 0x70bac7ba, 0xf04ad0a5,
+    0x18de1404, 0x982e031b, 0xc24f3c7b, 0x42bf2b64, 0x768d42bb,
+    0xf67d55a4, 0xac1c6ac4, 0x2cec7ddb, 0xa644e5c7, 0x26b4f2d8,
+    0x7cd5cdb8, 0xfc25daa7, 0xc817b378, 0x48e7a467, 0x12869b07,
+    0x92768c18, 0x7ae248b9, 0xfa125fa6, 0xa07360c6, 0x208377d9,
+    0x14b11e06, 0x94410919, 0xce203679, 0x4ed02166, 0x538074b5,
+    0xd37063aa, 0x89115cca, 0x09e14bd5, 0x3dd3220a, 0xbd233515,
+    0xe7420a75, 0x67b21d6a, 0x8f26d9cb, 0x0fd6ced4, 0x55b7f1b4,
+    0xd547e6ab, 0xe1758f74, 0x6185986b, 0x3be4a70b, 0xbb14b014,
+    0x31bc2808, 0xb14c3f17, 0xeb2d0077, 0x6bdd1768, 0x5fef7eb7,
+    0xdf1f69a8, 0x857e56c8, 0x058e41d7, 0xed1a8576, 0x6dea9269,
+    0x378bad09, 0xb77bba16, 0x8349d3c9, 0x03b9c4d6, 0x59d8fbb6,
+    0xd928eca9, 0x97f8cdcf, 0x1708dad0, 0x4d69e5b0, 0xcd99f2af,
+    0xf9ab9b70, 0x795b8c6f, 0x233ab30f, 0xa3caa410, 0x4b5e60b1,
+    0xcbae77ae, 0x91cf48ce, 0x113f5fd1, 0x250d360e, 0xa5fd2111,
+    0xff9c1e71, 0x7f6c096e, 0xf5c49172, 0x7534866d, 0x2f55b90d,
+    0xafa5ae12, 0x9b97c7cd, 0x1b67d0d2, 0x4106efb2, 0xc1f6f8ad,
+    0x29623c0c, 0xa9922b13, 0xf3f31473, 0x7303036c, 0x47316ab3,
+    0xc7c17dac, 0x9da042cc, 0x1d5055d3, 0xa700e96a, 0x27f0fe75,
+    0x7d91c115, 0xfd61d60a, 0xc953bfd5, 0x49a3a8ca, 0x13c297aa,
+    0x933280b5, 0x7ba64414, 0xfb56530b, 0xa1376c6b, 0x21c77b74,
+    0x15f512ab, 0x950505b4, 0xcf643ad4, 0x4f942dcb, 0xc53cb5d7,
+    0x45cca2c8, 0x1fad9da8, 0x9f5d8ab7, 0xab6fe368, 0x2b9ff477,
+    0x71fecb17, 0xf10edc08, 0x199a18a9, 0x996a0fb6, 0xc30b30d6,
+    0x43fb27c9, 0x77c94e16, 0xf7395909, 0xad586669, 0x2da87176,
+    0x63785010, 0xe388470f, 0xb9e9786f, 0x39196f70, 0x0d2b06af,
+    0x8ddb11b0, 0xd7ba2ed0, 0x574a39cf, 0xbfdefd6e, 0x3f2eea71,
+    0x654fd511, 0xe5bfc20e, 0xd18dabd1, 0x517dbcce, 0x0b1c83ae,
+    0x8bec94b1, 0x01440cad, 0x81b41bb2, 0xdbd524d2, 0x5b2533cd,
+    0x6f175a12, 0xefe74d0d, 0xb586726d, 0x35766572, 0xdde2a1d3,
+    0x5d12b6cc, 0x077389ac, 0x87839eb3, 0xb3b1f76c, 0x3341e073,
+    0x6920df13, 0xe9d0c80c, 0xf4809ddf, 0x74708ac0, 0x2e11b5a0,
+    0xaee1a2bf, 0x9ad3cb60, 0x1a23dc7f, 0x4042e31f, 0xc0b2f400,
+    0x282630a1, 0xa8d627be, 0xf2b718de, 0x72470fc1, 0x4675661e,
+    0xc6857101, 0x9ce44e61, 0x1c14597e, 0x96bcc162, 0x164cd67d,
+    0x4c2de91d, 0xccddfe02, 0xf8ef97dd, 0x781f80c2, 0x227ebfa2,
+    0xa28ea8bd, 0x4a1a6c1c, 0xcaea7b03, 0x908b4463, 0x107b537c,
+    0x24493aa3, 0xa4b92dbc, 0xfed812dc, 0x7e2805c3, 0x30f824a5,
+    0xb00833ba, 0xea690cda, 0x6a991bc5, 0x5eab721a, 0xde5b6505,
+    0x843a5a65, 0x04ca4d7a, 0xec5e89db, 0x6cae9ec4, 0x36cfa1a4,
+    0xb63fb6bb, 0x820ddf64, 0x02fdc87b, 0x589cf71b, 0xd86ce004,
+    0x52c47818, 0xd2346f07, 0x88555067, 0x08a54778, 0x3c972ea7,
+    0xbc6739b8, 0xe60606d8, 0x66f611c7, 0x8e62d566, 0x0e92c279,
+    0x54f3fd19, 0xd403ea06, 0xe03183d9, 0x60c194c6, 0x3aa0aba6,
+    0xba50bcb9},
+   {0x00000000, 0x9570d495, 0xf190af6b, 0x64e07bfe, 0x38505897,
+    0xad208c02, 0xc9c0f7fc, 0x5cb02369, 0x70a0b12e, 0xe5d065bb,
+    0x81301e45, 0x1440cad0, 0x48f0e9b9, 0xdd803d2c, 0xb96046d2,
+    0x2c109247, 0xe141625c, 0x7431b6c9, 0x10d1cd37, 0x85a119a2,
+    0xd9113acb, 0x4c61ee5e, 0x288195a0, 0xbdf14135, 0x91e1d372,
+    0x049107e7, 0x60717c19, 0xf501a88c, 0xa9b18be5, 0x3cc15f70,
+    0x5821248e, 0xcd51f01b, 0x19f3c2f9, 0x8c83166c, 0xe8636d92,
+    0x7d13b907, 0x21a39a6e, 0xb4d34efb, 0xd0333505, 0x4543e190,
+    0x695373d7, 0xfc23a742, 0x98c3dcbc, 0x0db30829, 0x51032b40,
+    0xc473ffd5, 0xa093842b, 0x35e350be, 0xf8b2a0a5, 0x6dc27430,
+    0x09220fce, 0x9c52db5b, 0xc0e2f832, 0x55922ca7, 0x31725759,
+    0xa40283cc, 0x8812118b, 0x1d62c51e, 0x7982bee0, 0xecf26a75,
+    0xb042491c, 0x25329d89, 0x41d2e677, 0xd4a232e2, 0x33e785f2,
+    0xa6975167, 0xc2772a99, 0x5707fe0c, 0x0bb7dd65, 0x9ec709f0,
+    0xfa27720e, 0x6f57a69b, 0x434734dc, 0xd637e049, 0xb2d79bb7,
+    0x27a74f22, 0x7b176c4b, 0xee67b8de, 0x8a87c320, 0x1ff717b5,
+    0xd2a6e7ae, 0x47d6333b, 0x233648c5, 0xb6469c50, 0xeaf6bf39,
+    0x7f866bac, 0x1b661052, 0x8e16c4c7, 0xa2065680, 0x37768215,
+    0x5396f9eb, 0xc6e62d7e, 0x9a560e17, 0x0f26da82, 0x6bc6a17c,
+    0xfeb675e9, 0x2a14470b, 0xbf64939e, 0xdb84e860, 0x4ef43cf5,
+    0x12441f9c, 0x8734cb09, 0xe3d4b0f7, 0x76a46462, 0x5ab4f625,
+    0xcfc422b0, 0xab24594e, 0x3e548ddb, 0x62e4aeb2, 0xf7947a27,
+    0x937401d9, 0x0604d54c, 0xcb552557, 0x5e25f1c2, 0x3ac58a3c,
+    0xafb55ea9, 0xf3057dc0, 0x6675a955, 0x0295d2ab, 0x97e5063e,
+    0xbbf59479, 0x2e8540ec, 0x4a653b12, 0xdf15ef87, 0x83a5ccee,
+    0x16d5187b, 0x72356385, 0xe745b710, 0x67cf0be4, 0xf2bfdf71,
+    0x965fa48f, 0x032f701a, 0x5f9f5373, 0xcaef87e6, 0xae0ffc18,
+    0x3b7f288d, 0x176fbaca, 0x821f6e5f, 0xe6ff15a1, 0x738fc134,
+    0x2f3fe25d, 0xba4f36c8, 0xdeaf4d36, 0x4bdf99a3, 0x868e69b8,
+    0x13febd2d, 0x771ec6d3, 0xe26e1246, 0xbede312f, 0x2baee5ba,
+    0x4f4e9e44, 0xda3e4ad1, 0xf62ed896, 0x635e0c03, 0x07be77fd,
+    0x92cea368, 0xce7e8001, 0x5b0e5494, 0x3fee2f6a, 0xaa9efbff,
+    0x7e3cc91d, 0xeb4c1d88, 0x8fac6676, 0x1adcb2e3, 0x466c918a,
+    0xd31c451f, 0xb7fc3ee1, 0x228cea74, 0x0e9c7833, 0x9becaca6,
+    0xff0cd758, 0x6a7c03cd, 0x36cc20a4, 0xa3bcf431, 0xc75c8fcf,
+    0x522c5b5a, 0x9f7dab41, 0x0a0d7fd4, 0x6eed042a, 0xfb9dd0bf,
+    0xa72df3d6, 0x325d2743, 0x56bd5cbd, 0xc3cd8828, 0xefdd1a6f,
+    0x7aadcefa, 0x1e4db504, 0x8b3d6191, 0xd78d42f8, 0x42fd966d,
+    0x261ded93, 0xb36d3906, 0x54288e16, 0xc1585a83, 0xa5b8217d,
+    0x30c8f5e8, 0x6c78d681, 0xf9080214, 0x9de879ea, 0x0898ad7f,
+    0x24883f38, 0xb1f8ebad, 0xd5189053, 0x406844c6, 0x1cd867af,
+    0x89a8b33a, 0xed48c8c4, 0x78381c51, 0xb569ec4a, 0x201938df,
+    0x44f94321, 0xd18997b4, 0x8d39b4dd, 0x18496048, 0x7ca91bb6,
+    0xe9d9cf23, 0xc5c95d64, 0x50b989f1, 0x3459f20f, 0xa129269a,
+    0xfd9905f3, 0x68e9d166, 0x0c09aa98, 0x99797e0d, 0x4ddb4cef,
+    0xd8ab987a, 0xbc4be384, 0x293b3711, 0x758b1478, 0xe0fbc0ed,
+    0x841bbb13, 0x116b6f86, 0x3d7bfdc1, 0xa80b2954, 0xcceb52aa,
+    0x599b863f, 0x052ba556, 0x905b71c3, 0xf4bb0a3d, 0x61cbdea8,
+    0xac9a2eb3, 0x39eafa26, 0x5d0a81d8, 0xc87a554d, 0x94ca7624,
+    0x01baa2b1, 0x655ad94f, 0xf02a0dda, 0xdc3a9f9d, 0x494a4b08,
+    0x2daa30f6, 0xb8dae463, 0xe46ac70a, 0x711a139f, 0x15fa6861,
+    0x808abcf4},
+   {0x00000000, 0xcf9e17c8, 0x444d29d1, 0x8bd33e19, 0x889a53a2,
+    0x4704446a, 0xccd77a73, 0x03496dbb, 0xca45a105, 0x05dbb6cd,
+    0x8e0888d4, 0x41969f1c, 0x42dff2a7, 0x8d41e56f, 0x0692db76,
+    0xc90cccbe, 0x4ffa444b, 0x80645383, 0x0bb76d9a, 0xc4297a52,
+    0xc76017e9, 0x08fe0021, 0x832d3e38, 0x4cb329f0, 0x85bfe54e,
+    0x4a21f286, 0xc1f2cc9f, 0x0e6cdb57, 0x0d25b6ec, 0xc2bba124,
+    0x49689f3d, 0x86f688f5, 0x9ff48896, 0x506a9f5e, 0xdbb9a147,
+    0x1427b68f, 0x176edb34, 0xd8f0ccfc, 0x5323f2e5, 0x9cbde52d,
+    0x55b12993, 0x9a2f3e5b, 0x11fc0042, 0xde62178a, 0xdd2b7a31,
+    0x12b56df9, 0x996653e0, 0x56f84428, 0xd00eccdd, 0x1f90db15,
+    0x9443e50c, 0x5bddf2c4, 0x58949f7f, 0x970a88b7, 0x1cd9b6ae,
+    0xd347a166, 0x1a4b6dd8, 0xd5d57a10, 0x5e064409, 0x919853c1,
+    0x92d13e7a, 0x5d4f29b2, 0xd69c17ab, 0x19020063, 0xe498176d,
+    0x2b0600a5, 0xa0d53ebc, 0x6f4b2974, 0x6c0244cf, 0xa39c5307,
+    0x284f6d1e, 0xe7d17ad6, 0x2eddb668, 0xe143a1a0, 0x6a909fb9,
+    0xa50e8871, 0xa647e5ca, 0x69d9f202, 0xe20acc1b, 0x2d94dbd3,
+    0xab625326, 0x64fc44ee, 0xef2f7af7, 0x20b16d3f, 0x23f80084,
+    0xec66174c, 0x67b52955, 0xa82b3e9d, 0x6127f223, 0xaeb9e5eb,
+    0x256adbf2, 0xeaf4cc3a, 0xe9bda181, 0x2623b649, 0xadf08850,
+    0x626e9f98, 0x7b6c9ffb, 0xb4f28833, 0x3f21b62a, 0xf0bfa1e2,
+    0xf3f6cc59, 0x3c68db91, 0xb7bbe588, 0x7825f240, 0xb1293efe,
+    0x7eb72936, 0xf564172f, 0x3afa00e7, 0x39b36d5c, 0xf62d7a94,
+    0x7dfe448d, 0xb2605345, 0x3496dbb0, 0xfb08cc78, 0x70dbf261,
+    0xbf45e5a9, 0xbc0c8812, 0x73929fda, 0xf841a1c3, 0x37dfb60b,
+    0xfed37ab5, 0x314d6d7d, 0xba9e5364, 0x750044ac, 0x76492917,
+    0xb9d73edf, 0x320400c6, 0xfd9a170e, 0x1241289b, 0xdddf3f53,
+    0x560c014a, 0x99921682, 0x9adb7b39, 0x55456cf1, 0xde9652e8,
+    0x11084520, 0xd804899e, 0x179a9e56, 0x9c49a04f, 0x53d7b787,
+    0x509eda3c, 0x9f00cdf4, 0x14d3f3ed, 0xdb4de425, 0x5dbb6cd0,
+    0x92257b18, 0x19f64501, 0xd66852c9, 0xd5213f72, 0x1abf28ba,
+    0x916c16a3, 0x5ef2016b, 0x97fecdd5, 0x5860da1d, 0xd3b3e404,
+    0x1c2df3cc, 0x1f649e77, 0xd0fa89bf, 0x5b29b7a6, 0x94b7a06e,
+    0x8db5a00d, 0x422bb7c5, 0xc9f889dc, 0x06669e14, 0x052ff3af,
+    0xcab1e467, 0x4162da7e, 0x8efccdb6, 0x47f00108, 0x886e16c0,
+    0x03bd28d9, 0xcc233f11, 0xcf6a52aa, 0x00f44562, 0x8b277b7b,
+    0x44b96cb3, 0xc24fe446, 0x0dd1f38e, 0x8602cd97, 0x499cda5f,
+    0x4ad5b7e4, 0x854ba02c, 0x0e989e35, 0xc10689fd, 0x080a4543,
+    0xc794528b, 0x4c476c92, 0x83d97b5a, 0x809016e1, 0x4f0e0129,
+    0xc4dd3f30, 0x0b4328f8, 0xf6d93ff6, 0x3947283e, 0xb2941627,
+    0x7d0a01ef, 0x7e436c54, 0xb1dd7b9c, 0x3a0e4585, 0xf590524d,
+    0x3c9c9ef3, 0xf302893b, 0x78d1b722, 0xb74fa0ea, 0xb406cd51,
+    0x7b98da99, 0xf04be480, 0x3fd5f348, 0xb9237bbd, 0x76bd6c75,
+    0xfd6e526c, 0x32f045a4, 0x31b9281f, 0xfe273fd7, 0x75f401ce,
+    0xba6a1606, 0x7366dab8, 0xbcf8cd70, 0x372bf369, 0xf8b5e4a1,
+    0xfbfc891a, 0x34629ed2, 0xbfb1a0cb, 0x702fb703, 0x692db760,
+    0xa6b3a0a8, 0x2d609eb1, 0xe2fe8979, 0xe1b7e4c2, 0x2e29f30a,
+    0xa5facd13, 0x6a64dadb, 0xa3681665, 0x6cf601ad, 0xe7253fb4,
+    0x28bb287c, 0x2bf245c7, 0xe46c520f, 0x6fbf6c16, 0xa0217bde,
+    0x26d7f32b, 0xe949e4e3, 0x629adafa, 0xad04cd32, 0xae4da089,
+    0x61d3b741, 0xea008958, 0x259e9e90, 0xec92522e, 0x230c45e6,
+    0xa8df7bff, 0x67416c37, 0x6408018c, 0xab961644, 0x2045285d,
+    0xefdb3f95},
+   {0x00000000, 0x24825136, 0x4904a26c, 0x6d86f35a, 0x920944d8,
+    0xb68b15ee, 0xdb0de6b4, 0xff8fb782, 0xff638ff1, 0xdbe1dec7,
+    0xb6672d9d, 0x92e57cab, 0x6d6acb29, 0x49e89a1f, 0x246e6945,
+    0x00ec3873, 0x25b619a3, 0x01344895, 0x6cb2bbcf, 0x4830eaf9,
+    0xb7bf5d7b, 0x933d0c4d, 0xfebbff17, 0xda39ae21, 0xdad59652,
+    0xfe57c764, 0x93d1343e, 0xb7536508, 0x48dcd28a, 0x6c5e83bc,
+    0x01d870e6, 0x255a21d0, 0x4b6c3346, 0x6fee6270, 0x0268912a,
+    0x26eac01c, 0xd965779e, 0xfde726a8, 0x9061d5f2, 0xb4e384c4,
+    0xb40fbcb7, 0x908ded81, 0xfd0b1edb, 0xd9894fed, 0x2606f86f,
+    0x0284a959, 0x6f025a03, 0x4b800b35, 0x6eda2ae5, 0x4a587bd3,
+    0x27de8889, 0x035cd9bf, 0xfcd36e3d, 0xd8513f0b, 0xb5d7cc51,
+    0x91559d67, 0x91b9a514, 0xb53bf422, 0xd8bd0778, 0xfc3f564e,
+    0x03b0e1cc, 0x2732b0fa, 0x4ab443a0, 0x6e361296, 0x96d8668c,
+    0xb25a37ba, 0xdfdcc4e0, 0xfb5e95d6, 0x04d12254, 0x20537362,
+    0x4dd58038, 0x6957d10e, 0x69bbe97d, 0x4d39b84b, 0x20bf4b11,
+    0x043d1a27, 0xfbb2ada5, 0xdf30fc93, 0xb2b60fc9, 0x96345eff,
+    0xb36e7f2f, 0x97ec2e19, 0xfa6add43, 0xdee88c75, 0x21673bf7,
+    0x05e56ac1, 0x6863999b, 0x4ce1c8ad, 0x4c0df0de, 0x688fa1e8,
+    0x050952b2, 0x218b0384, 0xde04b406, 0xfa86e530, 0x9700166a,
+    0xb382475c, 0xddb455ca, 0xf93604fc, 0x94b0f7a6, 0xb032a690,
+    0x4fbd1112, 0x6b3f4024, 0x06b9b37e, 0x223be248, 0x22d7da3b,
+    0x06558b0d, 0x6bd37857, 0x4f512961, 0xb0de9ee3, 0x945ccfd5,
+    0xf9da3c8f, 0xdd586db9, 0xf8024c69, 0xdc801d5f, 0xb106ee05,
+    0x9584bf33, 0x6a0b08b1, 0x4e895987, 0x230faadd, 0x078dfbeb,
+    0x0761c398, 0x23e392ae, 0x4e6561f4, 0x6ae730c2, 0x95688740,
+    0xb1ead676, 0xdc6c252c, 0xf8ee741a, 0xf6c1cb59, 0xd2439a6f,
+    0xbfc56935, 0x9b473803, 0x64c88f81, 0x404adeb7, 0x2dcc2ded,
+    0x094e7cdb, 0x09a244a8, 0x2d20159e, 0x40a6e6c4, 0x6424b7f2,
+    0x9bab0070, 0xbf295146, 0xd2afa21c, 0xf62df32a, 0xd377d2fa,
+    0xf7f583cc, 0x9a737096, 0xbef121a0, 0x417e9622, 0x65fcc714,
+    0x087a344e, 0x2cf86578, 0x2c145d0b, 0x08960c3d, 0x6510ff67,
+    0x4192ae51, 0xbe1d19d3, 0x9a9f48e5, 0xf719bbbf, 0xd39bea89,
+    0xbdadf81f, 0x992fa929, 0xf4a95a73, 0xd02b0b45, 0x2fa4bcc7,
+    0x0b26edf1, 0x66a01eab, 0x42224f9d, 0x42ce77ee, 0x664c26d8,
+    0x0bcad582, 0x2f4884b4, 0xd0c73336, 0xf4456200, 0x99c3915a,
+    0xbd41c06c, 0x981be1bc, 0xbc99b08a, 0xd11f43d0, 0xf59d12e6,
+    0x0a12a564, 0x2e90f452, 0x43160708, 0x6794563e, 0x67786e4d,
+    0x43fa3f7b, 0x2e7ccc21, 0x0afe9d17, 0xf5712a95, 0xd1f37ba3,
+    0xbc7588f9, 0x98f7d9cf, 0x6019add5, 0x449bfce3, 0x291d0fb9,
+    0x0d9f5e8f, 0xf210e90d, 0xd692b83b, 0xbb144b61, 0x9f961a57,
+    0x9f7a2224, 0xbbf87312, 0xd67e8048, 0xf2fcd17e, 0x0d7366fc,
+    0x29f137ca, 0x4477c490, 0x60f595a6, 0x45afb476, 0x612de540,
+    0x0cab161a, 0x2829472c, 0xd7a6f0ae, 0xf324a198, 0x9ea252c2,
+    0xba2003f4, 0xbacc3b87, 0x9e4e6ab1, 0xf3c899eb, 0xd74ac8dd,
+    0x28c57f5f, 0x0c472e69, 0x61c1dd33, 0x45438c05, 0x2b759e93,
+    0x0ff7cfa5, 0x62713cff, 0x46f36dc9, 0xb97cda4b, 0x9dfe8b7d,
+    0xf0787827, 0xd4fa2911, 0xd4161162, 0xf0944054, 0x9d12b30e,
+    0xb990e238, 0x461f55ba, 0x629d048c, 0x0f1bf7d6, 0x2b99a6e0,
+    0x0ec38730, 0x2a41d606, 0x47c7255c, 0x6345746a, 0x9ccac3e8,
+    0xb84892de, 0xd5ce6184, 0xf14c30b2, 0xf1a008c1, 0xd52259f7,
+    0xb8a4aaad, 0x9c26fb9b, 0x63a94c19, 0x472b1d2f, 0x2aadee75,
+    0x0e2fbf43},
+   {0x00000000, 0x36f290f3, 0x6de521e6, 0x5b17b115, 0xdbca43cc,
+    0xed38d33f, 0xb62f622a, 0x80ddf2d9, 0x6ce581d9, 0x5a17112a,
+    0x0100a03f, 0x37f230cc, 0xb72fc215, 0x81dd52e6, 0xdacae3f3,
+    0xec387300, 0xd9cb03b2, 0xef399341, 0xb42e2254, 0x82dcb2a7,
+    0x0201407e, 0x34f3d08d, 0x6fe46198, 0x5916f16b, 0xb52e826b,
+    0x83dc1298, 0xd8cba38d, 0xee39337e, 0x6ee4c1a7, 0x58165154,
+    0x0301e041, 0x35f370b2, 0x68e70125, 0x5e1591d6, 0x050220c3,
+    0x33f0b030, 0xb32d42e9, 0x85dfd21a, 0xdec8630f, 0xe83af3fc,
+    0x040280fc, 0x32f0100f, 0x69e7a11a, 0x5f1531e9, 0xdfc8c330,
+    0xe93a53c3, 0xb22de2d6, 0x84df7225, 0xb12c0297, 0x87de9264,
+    0xdcc92371, 0xea3bb382, 0x6ae6415b, 0x5c14d1a8, 0x070360bd,
+    0x31f1f04e, 0xddc9834e, 0xeb3b13bd, 0xb02ca2a8, 0x86de325b,
+    0x0603c082, 0x30f15071, 0x6be6e164, 0x5d147197, 0xd1ce024a,
+    0xe73c92b9, 0xbc2b23ac, 0x8ad9b35f, 0x0a044186, 0x3cf6d175,
+    0x67e16060, 0x5113f093, 0xbd2b8393, 0x8bd91360, 0xd0cea275,
+    0xe63c3286, 0x66e1c05f, 0x501350ac, 0x0b04e1b9, 0x3df6714a,
+    0x080501f8, 0x3ef7910b, 0x65e0201e, 0x5312b0ed, 0xd3cf4234,
+    0xe53dd2c7, 0xbe2a63d2, 0x88d8f321, 0x64e08021, 0x521210d2,
+    0x0905a1c7, 0x3ff73134, 0xbf2ac3ed, 0x89d8531e, 0xd2cfe20b,
+    0xe43d72f8, 0xb929036f, 0x8fdb939c, 0xd4cc2289, 0xe23eb27a,
+    0x62e340a3, 0x5411d050, 0x0f066145, 0x39f4f1b6, 0xd5cc82b6,
+    0xe33e1245, 0xb829a350, 0x8edb33a3, 0x0e06c17a, 0x38f45189,
+    0x63e3e09c, 0x5511706f, 0x60e200dd, 0x5610902e, 0x0d07213b,
+    0x3bf5b1c8, 0xbb284311, 0x8ddad3e2, 0xd6cd62f7, 0xe03ff204,
+    0x0c078104, 0x3af511f7, 0x61e2a0e2, 0x57103011, 0xd7cdc2c8,
+    0xe13f523b, 0xba28e32e, 0x8cda73dd, 0x78ed02d5, 0x4e1f9226,
+    0x15082333, 0x23fab3c0, 0xa3274119, 0x95d5d1ea, 0xcec260ff,
+    0xf830f00c, 0x1408830c, 0x22fa13ff, 0x79eda2ea, 0x4f1f3219,
+    0xcfc2c0c0, 0xf9305033, 0xa227e126, 0x94d571d5, 0xa1260167,
+    0x97d49194, 0xccc32081, 0xfa31b072, 0x7aec42ab, 0x4c1ed258,
+    0x1709634d, 0x21fbf3be, 0xcdc380be, 0xfb31104d, 0xa026a158,
+    0x96d431ab, 0x1609c372, 0x20fb5381, 0x7bece294, 0x4d1e7267,
+    0x100a03f0, 0x26f89303, 0x7def2216, 0x4b1db2e5, 0xcbc0403c,
+    0xfd32d0cf, 0xa62561da, 0x90d7f129, 0x7cef8229, 0x4a1d12da,
+    0x110aa3cf, 0x27f8333c, 0xa725c1e5, 0x91d75116, 0xcac0e003,
+    0xfc3270f0, 0xc9c10042, 0xff3390b1, 0xa42421a4, 0x92d6b157,
+    0x120b438e, 0x24f9d37d, 0x7fee6268, 0x491cf29b, 0xa524819b,
+    0x93d61168, 0xc8c1a07d, 0xfe33308e, 0x7eeec257, 0x481c52a4,
+    0x130be3b1, 0x25f97342, 0xa923009f, 0x9fd1906c, 0xc4c62179,
+    0xf234b18a, 0x72e94353, 0x441bd3a0, 0x1f0c62b5, 0x29fef246,
+    0xc5c68146, 0xf33411b5, 0xa823a0a0, 0x9ed13053, 0x1e0cc28a,
+    0x28fe5279, 0x73e9e36c, 0x451b739f, 0x70e8032d, 0x461a93de,
+    0x1d0d22cb, 0x2bffb238, 0xab2240e1, 0x9dd0d012, 0xc6c76107,
+    0xf035f1f4, 0x1c0d82f4, 0x2aff1207, 0x71e8a312, 0x471a33e1,
+    0xc7c7c138, 0xf13551cb, 0xaa22e0de, 0x9cd0702d, 0xc1c401ba,
+    0xf7369149, 0xac21205c, 0x9ad3b0af, 0x1a0e4276, 0x2cfcd285,
+    0x77eb6390, 0x4119f363, 0xad218063, 0x9bd31090, 0xc0c4a185,
+    0xf6363176, 0x76ebc3af, 0x4019535c, 0x1b0ee249, 0x2dfc72ba,
+    0x180f0208, 0x2efd92fb, 0x75ea23ee, 0x4318b31d, 0xc3c541c4,
+    0xf537d137, 0xae206022, 0x98d2f0d1, 0x74ea83d1, 0x42181322,
+    0x190fa237, 0x2ffd32c4, 0xaf20c01d, 0x99d250ee, 0xc2c5e1fb,
+    0xf4377108}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x0000000000000000, 0xf390f23600000000, 0xe621e56d00000000,
+    0x15b1175b00000000, 0xcc43cadb00000000, 0x3fd338ed00000000,
+    0x2a622fb600000000, 0xd9f2dd8000000000, 0xd981e56c00000000,
+    0x2a11175a00000000, 0x3fa0000100000000, 0xcc30f23700000000,
+    0x15c22fb700000000, 0xe652dd8100000000, 0xf3e3cada00000000,
+    0x007338ec00000000, 0xb203cbd900000000, 0x419339ef00000000,
+    0x54222eb400000000, 0xa7b2dc8200000000, 0x7e40010200000000,
+    0x8dd0f33400000000, 0x9861e46f00000000, 0x6bf1165900000000,
+    0x6b822eb500000000, 0x9812dc8300000000, 0x8da3cbd800000000,
+    0x7e3339ee00000000, 0xa7c1e46e00000000, 0x5451165800000000,
+    0x41e0010300000000, 0xb270f33500000000, 0x2501e76800000000,
+    0xd691155e00000000, 0xc320020500000000, 0x30b0f03300000000,
+    0xe9422db300000000, 0x1ad2df8500000000, 0x0f63c8de00000000,
+    0xfcf33ae800000000, 0xfc80020400000000, 0x0f10f03200000000,
+    0x1aa1e76900000000, 0xe931155f00000000, 0x30c3c8df00000000,
+    0xc3533ae900000000, 0xd6e22db200000000, 0x2572df8400000000,
+    0x97022cb100000000, 0x6492de8700000000, 0x7123c9dc00000000,
+    0x82b33bea00000000, 0x5b41e66a00000000, 0xa8d1145c00000000,
+    0xbd60030700000000, 0x4ef0f13100000000, 0x4e83c9dd00000000,
+    0xbd133beb00000000, 0xa8a22cb000000000, 0x5b32de8600000000,
+    0x82c0030600000000, 0x7150f13000000000, 0x64e1e66b00000000,
+    0x9771145d00000000, 0x4a02ced100000000, 0xb9923ce700000000,
+    0xac232bbc00000000, 0x5fb3d98a00000000, 0x8641040a00000000,
+    0x75d1f63c00000000, 0x6060e16700000000, 0x93f0135100000000,
+    0x93832bbd00000000, 0x6013d98b00000000, 0x75a2ced000000000,
+    0x86323ce600000000, 0x5fc0e16600000000, 0xac50135000000000,
+    0xb9e1040b00000000, 0x4a71f63d00000000, 0xf801050800000000,
+    0x0b91f73e00000000, 0x1e20e06500000000, 0xedb0125300000000,
+    0x3442cfd300000000, 0xc7d23de500000000, 0xd2632abe00000000,
+    0x21f3d88800000000, 0x2180e06400000000, 0xd210125200000000,
+    0xc7a1050900000000, 0x3431f73f00000000, 0xedc32abf00000000,
+    0x1e53d88900000000, 0x0be2cfd200000000, 0xf8723de400000000,
+    0x6f0329b900000000, 0x9c93db8f00000000, 0x8922ccd400000000,
+    0x7ab23ee200000000, 0xa340e36200000000, 0x50d0115400000000,
+    0x4561060f00000000, 0xb6f1f43900000000, 0xb682ccd500000000,
+    0x45123ee300000000, 0x50a329b800000000, 0xa333db8e00000000,
+    0x7ac1060e00000000, 0x8951f43800000000, 0x9ce0e36300000000,
+    0x6f70115500000000, 0xdd00e26000000000, 0x2e90105600000000,
+    0x3b21070d00000000, 0xc8b1f53b00000000, 0x114328bb00000000,
+    0xe2d3da8d00000000, 0xf762cdd600000000, 0x04f23fe000000000,
+    0x0481070c00000000, 0xf711f53a00000000, 0xe2a0e26100000000,
+    0x1130105700000000, 0xc8c2cdd700000000, 0x3b523fe100000000,
+    0x2ee328ba00000000, 0xdd73da8c00000000, 0xd502ed7800000000,
+    0x26921f4e00000000, 0x3323081500000000, 0xc0b3fa2300000000,
+    0x194127a300000000, 0xead1d59500000000, 0xff60c2ce00000000,
+    0x0cf030f800000000, 0x0c83081400000000, 0xff13fa2200000000,
+    0xeaa2ed7900000000, 0x19321f4f00000000, 0xc0c0c2cf00000000,
+    0x335030f900000000, 0x26e127a200000000, 0xd571d59400000000,
+    0x670126a100000000, 0x9491d49700000000, 0x8120c3cc00000000,
+    0x72b031fa00000000, 0xab42ec7a00000000, 0x58d21e4c00000000,
+    0x4d63091700000000, 0xbef3fb2100000000, 0xbe80c3cd00000000,
+    0x4d1031fb00000000, 0x58a126a000000000, 0xab31d49600000000,
+    0x72c3091600000000, 0x8153fb2000000000, 0x94e2ec7b00000000,
+    0x67721e4d00000000, 0xf0030a1000000000, 0x0393f82600000000,
+    0x1622ef7d00000000, 0xe5b21d4b00000000, 0x3c40c0cb00000000,
+    0xcfd032fd00000000, 0xda6125a600000000, 0x29f1d79000000000,
+    0x2982ef7c00000000, 0xda121d4a00000000, 0xcfa30a1100000000,
+    0x3c33f82700000000, 0xe5c125a700000000, 0x1651d79100000000,
+    0x03e0c0ca00000000, 0xf07032fc00000000, 0x4200c1c900000000,
+    0xb19033ff00000000, 0xa42124a400000000, 0x57b1d69200000000,
+    0x8e430b1200000000, 0x7dd3f92400000000, 0x6862ee7f00000000,
+    0x9bf21c4900000000, 0x9b8124a500000000, 0x6811d69300000000,
+    0x7da0c1c800000000, 0x8e3033fe00000000, 0x57c2ee7e00000000,
+    0xa4521c4800000000, 0xb1e30b1300000000, 0x4273f92500000000,
+    0x9f0023a900000000, 0x6c90d19f00000000, 0x7921c6c400000000,
+    0x8ab134f200000000, 0x5343e97200000000, 0xa0d31b4400000000,
+    0xb5620c1f00000000, 0x46f2fe2900000000, 0x4681c6c500000000,
+    0xb51134f300000000, 0xa0a023a800000000, 0x5330d19e00000000,
+    0x8ac20c1e00000000, 0x7952fe2800000000, 0x6ce3e97300000000,
+    0x9f731b4500000000, 0x2d03e87000000000, 0xde931a4600000000,
+    0xcb220d1d00000000, 0x38b2ff2b00000000, 0xe14022ab00000000,
+    0x12d0d09d00000000, 0x0761c7c600000000, 0xf4f135f000000000,
+    0xf4820d1c00000000, 0x0712ff2a00000000, 0x12a3e87100000000,
+    0xe1331a4700000000, 0x38c1c7c700000000, 0xcb5135f100000000,
+    0xdee022aa00000000, 0x2d70d09c00000000, 0xba01c4c100000000,
+    0x499136f700000000, 0x5c2021ac00000000, 0xafb0d39a00000000,
+    0x76420e1a00000000, 0x85d2fc2c00000000, 0x9063eb7700000000,
+    0x63f3194100000000, 0x638021ad00000000, 0x9010d39b00000000,
+    0x85a1c4c000000000, 0x763136f600000000, 0xafc3eb7600000000,
+    0x5c53194000000000, 0x49e20e1b00000000, 0xba72fc2d00000000,
+    0x08020f1800000000, 0xfb92fd2e00000000, 0xee23ea7500000000,
+    0x1db3184300000000, 0xc441c5c300000000, 0x37d137f500000000,
+    0x226020ae00000000, 0xd1f0d29800000000, 0xd183ea7400000000,
+    0x2213184200000000, 0x37a20f1900000000, 0xc432fd2f00000000,
+    0x1dc020af00000000, 0xee50d29900000000, 0xfbe1c5c200000000,
+    0x087137f400000000},
+   {0x0000000000000000, 0x3651822400000000, 0x6ca2044900000000,
+    0x5af3866d00000000, 0xd844099200000000, 0xee158bb600000000,
+    0xb4e60ddb00000000, 0x82b78fff00000000, 0xf18f63ff00000000,
+    0xc7dee1db00000000, 0x9d2d67b600000000, 0xab7ce59200000000,
+    0x29cb6a6d00000000, 0x1f9ae84900000000, 0x45696e2400000000,
+    0x7338ec0000000000, 0xa319b62500000000, 0x9548340100000000,
+    0xcfbbb26c00000000, 0xf9ea304800000000, 0x7b5dbfb700000000,
+    0x4d0c3d9300000000, 0x17ffbbfe00000000, 0x21ae39da00000000,
+    0x5296d5da00000000, 0x64c757fe00000000, 0x3e34d19300000000,
+    0x086553b700000000, 0x8ad2dc4800000000, 0xbc835e6c00000000,
+    0xe670d80100000000, 0xd0215a2500000000, 0x46336c4b00000000,
+    0x7062ee6f00000000, 0x2a91680200000000, 0x1cc0ea2600000000,
+    0x9e7765d900000000, 0xa826e7fd00000000, 0xf2d5619000000000,
+    0xc484e3b400000000, 0xb7bc0fb400000000, 0x81ed8d9000000000,
+    0xdb1e0bfd00000000, 0xed4f89d900000000, 0x6ff8062600000000,
+    0x59a9840200000000, 0x035a026f00000000, 0x350b804b00000000,
+    0xe52ada6e00000000, 0xd37b584a00000000, 0x8988de2700000000,
+    0xbfd95c0300000000, 0x3d6ed3fc00000000, 0x0b3f51d800000000,
+    0x51ccd7b500000000, 0x679d559100000000, 0x14a5b99100000000,
+    0x22f43bb500000000, 0x7807bdd800000000, 0x4e563ffc00000000,
+    0xcce1b00300000000, 0xfab0322700000000, 0xa043b44a00000000,
+    0x9612366e00000000, 0x8c66d89600000000, 0xba375ab200000000,
+    0xe0c4dcdf00000000, 0xd6955efb00000000, 0x5422d10400000000,
+    0x6273532000000000, 0x3880d54d00000000, 0x0ed1576900000000,
+    0x7de9bb6900000000, 0x4bb8394d00000000, 0x114bbf2000000000,
+    0x271a3d0400000000, 0xa5adb2fb00000000, 0x93fc30df00000000,
+    0xc90fb6b200000000, 0xff5e349600000000, 0x2f7f6eb300000000,
+    0x192eec9700000000, 0x43dd6afa00000000, 0x758ce8de00000000,
+    0xf73b672100000000, 0xc16ae50500000000, 0x9b99636800000000,
+    0xadc8e14c00000000, 0xdef00d4c00000000, 0xe8a18f6800000000,
+    0xb252090500000000, 0x84038b2100000000, 0x06b404de00000000,
+    0x30e586fa00000000, 0x6a16009700000000, 0x5c4782b300000000,
+    0xca55b4dd00000000, 0xfc0436f900000000, 0xa6f7b09400000000,
+    0x90a632b000000000, 0x1211bd4f00000000, 0x24403f6b00000000,
+    0x7eb3b90600000000, 0x48e23b2200000000, 0x3bdad72200000000,
+    0x0d8b550600000000, 0x5778d36b00000000, 0x6129514f00000000,
+    0xe39edeb000000000, 0xd5cf5c9400000000, 0x8f3cdaf900000000,
+    0xb96d58dd00000000, 0x694c02f800000000, 0x5f1d80dc00000000,
+    0x05ee06b100000000, 0x33bf849500000000, 0xb1080b6a00000000,
+    0x8759894e00000000, 0xddaa0f2300000000, 0xebfb8d0700000000,
+    0x98c3610700000000, 0xae92e32300000000, 0xf461654e00000000,
+    0xc230e76a00000000, 0x4087689500000000, 0x76d6eab100000000,
+    0x2c256cdc00000000, 0x1a74eef800000000, 0x59cbc1f600000000,
+    0x6f9a43d200000000, 0x3569c5bf00000000, 0x0338479b00000000,
+    0x818fc86400000000, 0xb7de4a4000000000, 0xed2dcc2d00000000,
+    0xdb7c4e0900000000, 0xa844a20900000000, 0x9e15202d00000000,
+    0xc4e6a64000000000, 0xf2b7246400000000, 0x7000ab9b00000000,
+    0x465129bf00000000, 0x1ca2afd200000000, 0x2af32df600000000,
+    0xfad277d300000000, 0xcc83f5f700000000, 0x9670739a00000000,
+    0xa021f1be00000000, 0x22967e4100000000, 0x14c7fc6500000000,
+    0x4e347a0800000000, 0x7865f82c00000000, 0x0b5d142c00000000,
+    0x3d0c960800000000, 0x67ff106500000000, 0x51ae924100000000,
+    0xd3191dbe00000000, 0xe5489f9a00000000, 0xbfbb19f700000000,
+    0x89ea9bd300000000, 0x1ff8adbd00000000, 0x29a92f9900000000,
+    0x735aa9f400000000, 0x450b2bd000000000, 0xc7bca42f00000000,
+    0xf1ed260b00000000, 0xab1ea06600000000, 0x9d4f224200000000,
+    0xee77ce4200000000, 0xd8264c6600000000, 0x82d5ca0b00000000,
+    0xb484482f00000000, 0x3633c7d000000000, 0x006245f400000000,
+    0x5a91c39900000000, 0x6cc041bd00000000, 0xbce11b9800000000,
+    0x8ab099bc00000000, 0xd0431fd100000000, 0xe6129df500000000,
+    0x64a5120a00000000, 0x52f4902e00000000, 0x0807164300000000,
+    0x3e56946700000000, 0x4d6e786700000000, 0x7b3ffa4300000000,
+    0x21cc7c2e00000000, 0x179dfe0a00000000, 0x952a71f500000000,
+    0xa37bf3d100000000, 0xf98875bc00000000, 0xcfd9f79800000000,
+    0xd5ad196000000000, 0xe3fc9b4400000000, 0xb90f1d2900000000,
+    0x8f5e9f0d00000000, 0x0de910f200000000, 0x3bb892d600000000,
+    0x614b14bb00000000, 0x571a969f00000000, 0x24227a9f00000000,
+    0x1273f8bb00000000, 0x48807ed600000000, 0x7ed1fcf200000000,
+    0xfc66730d00000000, 0xca37f12900000000, 0x90c4774400000000,
+    0xa695f56000000000, 0x76b4af4500000000, 0x40e52d6100000000,
+    0x1a16ab0c00000000, 0x2c47292800000000, 0xaef0a6d700000000,
+    0x98a124f300000000, 0xc252a29e00000000, 0xf40320ba00000000,
+    0x873bccba00000000, 0xb16a4e9e00000000, 0xeb99c8f300000000,
+    0xddc84ad700000000, 0x5f7fc52800000000, 0x692e470c00000000,
+    0x33ddc16100000000, 0x058c434500000000, 0x939e752b00000000,
+    0xa5cff70f00000000, 0xff3c716200000000, 0xc96df34600000000,
+    0x4bda7cb900000000, 0x7d8bfe9d00000000, 0x277878f000000000,
+    0x1129fad400000000, 0x621116d400000000, 0x544094f000000000,
+    0x0eb3129d00000000, 0x38e290b900000000, 0xba551f4600000000,
+    0x8c049d6200000000, 0xd6f71b0f00000000, 0xe0a6992b00000000,
+    0x3087c30e00000000, 0x06d6412a00000000, 0x5c25c74700000000,
+    0x6a74456300000000, 0xe8c3ca9c00000000, 0xde9248b800000000,
+    0x8461ced500000000, 0xb2304cf100000000, 0xc108a0f100000000,
+    0xf75922d500000000, 0xadaaa4b800000000, 0x9bfb269c00000000,
+    0x194ca96300000000, 0x2f1d2b4700000000, 0x75eead2a00000000,
+    0x43bf2f0e00000000},
+   {0x0000000000000000, 0xc8179ecf00000000, 0xd1294d4400000000,
+    0x193ed38b00000000, 0xa2539a8800000000, 0x6a44044700000000,
+    0x737ad7cc00000000, 0xbb6d490300000000, 0x05a145ca00000000,
+    0xcdb6db0500000000, 0xd488088e00000000, 0x1c9f964100000000,
+    0xa7f2df4200000000, 0x6fe5418d00000000, 0x76db920600000000,
+    0xbecc0cc900000000, 0x4b44fa4f00000000, 0x8353648000000000,
+    0x9a6db70b00000000, 0x527a29c400000000, 0xe91760c700000000,
+    0x2100fe0800000000, 0x383e2d8300000000, 0xf029b34c00000000,
+    0x4ee5bf8500000000, 0x86f2214a00000000, 0x9fccf2c100000000,
+    0x57db6c0e00000000, 0xecb6250d00000000, 0x24a1bbc200000000,
+    0x3d9f684900000000, 0xf588f68600000000, 0x9688f49f00000000,
+    0x5e9f6a5000000000, 0x47a1b9db00000000, 0x8fb6271400000000,
+    0x34db6e1700000000, 0xfcccf0d800000000, 0xe5f2235300000000,
+    0x2de5bd9c00000000, 0x9329b15500000000, 0x5b3e2f9a00000000,
+    0x4200fc1100000000, 0x8a1762de00000000, 0x317a2bdd00000000,
+    0xf96db51200000000, 0xe053669900000000, 0x2844f85600000000,
+    0xddcc0ed000000000, 0x15db901f00000000, 0x0ce5439400000000,
+    0xc4f2dd5b00000000, 0x7f9f945800000000, 0xb7880a9700000000,
+    0xaeb6d91c00000000, 0x66a147d300000000, 0xd86d4b1a00000000,
+    0x107ad5d500000000, 0x0944065e00000000, 0xc153989100000000,
+    0x7a3ed19200000000, 0xb2294f5d00000000, 0xab179cd600000000,
+    0x6300021900000000, 0x6d1798e400000000, 0xa500062b00000000,
+    0xbc3ed5a000000000, 0x74294b6f00000000, 0xcf44026c00000000,
+    0x07539ca300000000, 0x1e6d4f2800000000, 0xd67ad1e700000000,
+    0x68b6dd2e00000000, 0xa0a143e100000000, 0xb99f906a00000000,
+    0x71880ea500000000, 0xcae547a600000000, 0x02f2d96900000000,
+    0x1bcc0ae200000000, 0xd3db942d00000000, 0x265362ab00000000,
+    0xee44fc6400000000, 0xf77a2fef00000000, 0x3f6db12000000000,
+    0x8400f82300000000, 0x4c1766ec00000000, 0x5529b56700000000,
+    0x9d3e2ba800000000, 0x23f2276100000000, 0xebe5b9ae00000000,
+    0xf2db6a2500000000, 0x3accf4ea00000000, 0x81a1bde900000000,
+    0x49b6232600000000, 0x5088f0ad00000000, 0x989f6e6200000000,
+    0xfb9f6c7b00000000, 0x3388f2b400000000, 0x2ab6213f00000000,
+    0xe2a1bff000000000, 0x59ccf6f300000000, 0x91db683c00000000,
+    0x88e5bbb700000000, 0x40f2257800000000, 0xfe3e29b100000000,
+    0x3629b77e00000000, 0x2f1764f500000000, 0xe700fa3a00000000,
+    0x5c6db33900000000, 0x947a2df600000000, 0x8d44fe7d00000000,
+    0x455360b200000000, 0xb0db963400000000, 0x78cc08fb00000000,
+    0x61f2db7000000000, 0xa9e545bf00000000, 0x12880cbc00000000,
+    0xda9f927300000000, 0xc3a141f800000000, 0x0bb6df3700000000,
+    0xb57ad3fe00000000, 0x7d6d4d3100000000, 0x64539eba00000000,
+    0xac44007500000000, 0x1729497600000000, 0xdf3ed7b900000000,
+    0xc600043200000000, 0x0e179afd00000000, 0x9b28411200000000,
+    0x533fdfdd00000000, 0x4a010c5600000000, 0x8216929900000000,
+    0x397bdb9a00000000, 0xf16c455500000000, 0xe85296de00000000,
+    0x2045081100000000, 0x9e8904d800000000, 0x569e9a1700000000,
+    0x4fa0499c00000000, 0x87b7d75300000000, 0x3cda9e5000000000,
+    0xf4cd009f00000000, 0xedf3d31400000000, 0x25e44ddb00000000,
+    0xd06cbb5d00000000, 0x187b259200000000, 0x0145f61900000000,
+    0xc95268d600000000, 0x723f21d500000000, 0xba28bf1a00000000,
+    0xa3166c9100000000, 0x6b01f25e00000000, 0xd5cdfe9700000000,
+    0x1dda605800000000, 0x04e4b3d300000000, 0xccf32d1c00000000,
+    0x779e641f00000000, 0xbf89fad000000000, 0xa6b7295b00000000,
+    0x6ea0b79400000000, 0x0da0b58d00000000, 0xc5b72b4200000000,
+    0xdc89f8c900000000, 0x149e660600000000, 0xaff32f0500000000,
+    0x67e4b1ca00000000, 0x7eda624100000000, 0xb6cdfc8e00000000,
+    0x0801f04700000000, 0xc0166e8800000000, 0xd928bd0300000000,
+    0x113f23cc00000000, 0xaa526acf00000000, 0x6245f40000000000,
+    0x7b7b278b00000000, 0xb36cb94400000000, 0x46e44fc200000000,
+    0x8ef3d10d00000000, 0x97cd028600000000, 0x5fda9c4900000000,
+    0xe4b7d54a00000000, 0x2ca04b8500000000, 0x359e980e00000000,
+    0xfd8906c100000000, 0x43450a0800000000, 0x8b5294c700000000,
+    0x926c474c00000000, 0x5a7bd98300000000, 0xe116908000000000,
+    0x29010e4f00000000, 0x303fddc400000000, 0xf828430b00000000,
+    0xf63fd9f600000000, 0x3e28473900000000, 0x271694b200000000,
+    0xef010a7d00000000, 0x546c437e00000000, 0x9c7bddb100000000,
+    0x85450e3a00000000, 0x4d5290f500000000, 0xf39e9c3c00000000,
+    0x3b8902f300000000, 0x22b7d17800000000, 0xeaa04fb700000000,
+    0x51cd06b400000000, 0x99da987b00000000, 0x80e44bf000000000,
+    0x48f3d53f00000000, 0xbd7b23b900000000, 0x756cbd7600000000,
+    0x6c526efd00000000, 0xa445f03200000000, 0x1f28b93100000000,
+    0xd73f27fe00000000, 0xce01f47500000000, 0x06166aba00000000,
+    0xb8da667300000000, 0x70cdf8bc00000000, 0x69f32b3700000000,
+    0xa1e4b5f800000000, 0x1a89fcfb00000000, 0xd29e623400000000,
+    0xcba0b1bf00000000, 0x03b72f7000000000, 0x60b72d6900000000,
+    0xa8a0b3a600000000, 0xb19e602d00000000, 0x7989fee200000000,
+    0xc2e4b7e100000000, 0x0af3292e00000000, 0x13cdfaa500000000,
+    0xdbda646a00000000, 0x651668a300000000, 0xad01f66c00000000,
+    0xb43f25e700000000, 0x7c28bb2800000000, 0xc745f22b00000000,
+    0x0f526ce400000000, 0x166cbf6f00000000, 0xde7b21a000000000,
+    0x2bf3d72600000000, 0xe3e449e900000000, 0xfada9a6200000000,
+    0x32cd04ad00000000, 0x89a04dae00000000, 0x41b7d36100000000,
+    0x588900ea00000000, 0x909e9e2500000000, 0x2e5292ec00000000,
+    0xe6450c2300000000, 0xff7bdfa800000000, 0x376c416700000000,
+    0x8c01086400000000, 0x441696ab00000000, 0x5d28452000000000,
+    0x953fdbef00000000},
+   {0x0000000000000000, 0x95d4709500000000, 0x6baf90f100000000,
+    0xfe7be06400000000, 0x9758503800000000, 0x028c20ad00000000,
+    0xfcf7c0c900000000, 0x6923b05c00000000, 0x2eb1a07000000000,
+    0xbb65d0e500000000, 0x451e308100000000, 0xd0ca401400000000,
+    0xb9e9f04800000000, 0x2c3d80dd00000000, 0xd24660b900000000,
+    0x4792102c00000000, 0x5c6241e100000000, 0xc9b6317400000000,
+    0x37cdd11000000000, 0xa219a18500000000, 0xcb3a11d900000000,
+    0x5eee614c00000000, 0xa095812800000000, 0x3541f1bd00000000,
+    0x72d3e19100000000, 0xe707910400000000, 0x197c716000000000,
+    0x8ca801f500000000, 0xe58bb1a900000000, 0x705fc13c00000000,
+    0x8e24215800000000, 0x1bf051cd00000000, 0xf9c2f31900000000,
+    0x6c16838c00000000, 0x926d63e800000000, 0x07b9137d00000000,
+    0x6e9aa32100000000, 0xfb4ed3b400000000, 0x053533d000000000,
+    0x90e1434500000000, 0xd773536900000000, 0x42a723fc00000000,
+    0xbcdcc39800000000, 0x2908b30d00000000, 0x402b035100000000,
+    0xd5ff73c400000000, 0x2b8493a000000000, 0xbe50e33500000000,
+    0xa5a0b2f800000000, 0x3074c26d00000000, 0xce0f220900000000,
+    0x5bdb529c00000000, 0x32f8e2c000000000, 0xa72c925500000000,
+    0x5957723100000000, 0xcc8302a400000000, 0x8b11128800000000,
+    0x1ec5621d00000000, 0xe0be827900000000, 0x756af2ec00000000,
+    0x1c4942b000000000, 0x899d322500000000, 0x77e6d24100000000,
+    0xe232a2d400000000, 0xf285e73300000000, 0x675197a600000000,
+    0x992a77c200000000, 0x0cfe075700000000, 0x65ddb70b00000000,
+    0xf009c79e00000000, 0x0e7227fa00000000, 0x9ba6576f00000000,
+    0xdc34474300000000, 0x49e037d600000000, 0xb79bd7b200000000,
+    0x224fa72700000000, 0x4b6c177b00000000, 0xdeb867ee00000000,
+    0x20c3878a00000000, 0xb517f71f00000000, 0xaee7a6d200000000,
+    0x3b33d64700000000, 0xc548362300000000, 0x509c46b600000000,
+    0x39bff6ea00000000, 0xac6b867f00000000, 0x5210661b00000000,
+    0xc7c4168e00000000, 0x805606a200000000, 0x1582763700000000,
+    0xebf9965300000000, 0x7e2de6c600000000, 0x170e569a00000000,
+    0x82da260f00000000, 0x7ca1c66b00000000, 0xe975b6fe00000000,
+    0x0b47142a00000000, 0x9e9364bf00000000, 0x60e884db00000000,
+    0xf53cf44e00000000, 0x9c1f441200000000, 0x09cb348700000000,
+    0xf7b0d4e300000000, 0x6264a47600000000, 0x25f6b45a00000000,
+    0xb022c4cf00000000, 0x4e5924ab00000000, 0xdb8d543e00000000,
+    0xb2aee46200000000, 0x277a94f700000000, 0xd901749300000000,
+    0x4cd5040600000000, 0x572555cb00000000, 0xc2f1255e00000000,
+    0x3c8ac53a00000000, 0xa95eb5af00000000, 0xc07d05f300000000,
+    0x55a9756600000000, 0xabd2950200000000, 0x3e06e59700000000,
+    0x7994f5bb00000000, 0xec40852e00000000, 0x123b654a00000000,
+    0x87ef15df00000000, 0xeecca58300000000, 0x7b18d51600000000,
+    0x8563357200000000, 0x10b745e700000000, 0xe40bcf6700000000,
+    0x71dfbff200000000, 0x8fa45f9600000000, 0x1a702f0300000000,
+    0x73539f5f00000000, 0xe687efca00000000, 0x18fc0fae00000000,
+    0x8d287f3b00000000, 0xcaba6f1700000000, 0x5f6e1f8200000000,
+    0xa115ffe600000000, 0x34c18f7300000000, 0x5de23f2f00000000,
+    0xc8364fba00000000, 0x364dafde00000000, 0xa399df4b00000000,
+    0xb8698e8600000000, 0x2dbdfe1300000000, 0xd3c61e7700000000,
+    0x46126ee200000000, 0x2f31debe00000000, 0xbae5ae2b00000000,
+    0x449e4e4f00000000, 0xd14a3eda00000000, 0x96d82ef600000000,
+    0x030c5e6300000000, 0xfd77be0700000000, 0x68a3ce9200000000,
+    0x01807ece00000000, 0x94540e5b00000000, 0x6a2fee3f00000000,
+    0xfffb9eaa00000000, 0x1dc93c7e00000000, 0x881d4ceb00000000,
+    0x7666ac8f00000000, 0xe3b2dc1a00000000, 0x8a916c4600000000,
+    0x1f451cd300000000, 0xe13efcb700000000, 0x74ea8c2200000000,
+    0x33789c0e00000000, 0xa6acec9b00000000, 0x58d70cff00000000,
+    0xcd037c6a00000000, 0xa420cc3600000000, 0x31f4bca300000000,
+    0xcf8f5cc700000000, 0x5a5b2c5200000000, 0x41ab7d9f00000000,
+    0xd47f0d0a00000000, 0x2a04ed6e00000000, 0xbfd09dfb00000000,
+    0xd6f32da700000000, 0x43275d3200000000, 0xbd5cbd5600000000,
+    0x2888cdc300000000, 0x6f1addef00000000, 0xfacead7a00000000,
+    0x04b54d1e00000000, 0x91613d8b00000000, 0xf8428dd700000000,
+    0x6d96fd4200000000, 0x93ed1d2600000000, 0x06396db300000000,
+    0x168e285400000000, 0x835a58c100000000, 0x7d21b8a500000000,
+    0xe8f5c83000000000, 0x81d6786c00000000, 0x140208f900000000,
+    0xea79e89d00000000, 0x7fad980800000000, 0x383f882400000000,
+    0xadebf8b100000000, 0x539018d500000000, 0xc644684000000000,
+    0xaf67d81c00000000, 0x3ab3a88900000000, 0xc4c848ed00000000,
+    0x511c387800000000, 0x4aec69b500000000, 0xdf38192000000000,
+    0x2143f94400000000, 0xb49789d100000000, 0xddb4398d00000000,
+    0x4860491800000000, 0xb61ba97c00000000, 0x23cfd9e900000000,
+    0x645dc9c500000000, 0xf189b95000000000, 0x0ff2593400000000,
+    0x9a2629a100000000, 0xf30599fd00000000, 0x66d1e96800000000,
+    0x98aa090c00000000, 0x0d7e799900000000, 0xef4cdb4d00000000,
+    0x7a98abd800000000, 0x84e34bbc00000000, 0x11373b2900000000,
+    0x78148b7500000000, 0xedc0fbe000000000, 0x13bb1b8400000000,
+    0x866f6b1100000000, 0xc1fd7b3d00000000, 0x54290ba800000000,
+    0xaa52ebcc00000000, 0x3f869b5900000000, 0x56a52b0500000000,
+    0xc3715b9000000000, 0x3d0abbf400000000, 0xa8decb6100000000,
+    0xb32e9aac00000000, 0x26faea3900000000, 0xd8810a5d00000000,
+    0x4d557ac800000000, 0x2476ca9400000000, 0xb1a2ba0100000000,
+    0x4fd95a6500000000, 0xda0d2af000000000, 0x9d9f3adc00000000,
+    0x084b4a4900000000, 0xf630aa2d00000000, 0x63e4dab800000000,
+    0x0ac76ae400000000, 0x9f131a7100000000, 0x6168fa1500000000,
+    0xf4bc8a8000000000},
+   {0x0000000000000000, 0x1f17f08000000000, 0x7f2891da00000000,
+    0x603f615a00000000, 0xbf56536e00000000, 0xa041a3ee00000000,
+    0xc07ec2b400000000, 0xdf69323400000000, 0x7eada6dc00000000,
+    0x61ba565c00000000, 0x0185370600000000, 0x1e92c78600000000,
+    0xc1fbf5b200000000, 0xdeec053200000000, 0xbed3646800000000,
+    0xa1c494e800000000, 0xbd5c3c6200000000, 0xa24bcce200000000,
+    0xc274adb800000000, 0xdd635d3800000000, 0x020a6f0c00000000,
+    0x1d1d9f8c00000000, 0x7d22fed600000000, 0x62350e5600000000,
+    0xc3f19abe00000000, 0xdce66a3e00000000, 0xbcd90b6400000000,
+    0xa3cefbe400000000, 0x7ca7c9d000000000, 0x63b0395000000000,
+    0x038f580a00000000, 0x1c98a88a00000000, 0x7ab978c400000000,
+    0x65ae884400000000, 0x0591e91e00000000, 0x1a86199e00000000,
+    0xc5ef2baa00000000, 0xdaf8db2a00000000, 0xbac7ba7000000000,
+    0xa5d04af000000000, 0x0414de1800000000, 0x1b032e9800000000,
+    0x7b3c4fc200000000, 0x642bbf4200000000, 0xbb428d7600000000,
+    0xa4557df600000000, 0xc46a1cac00000000, 0xdb7dec2c00000000,
+    0xc7e544a600000000, 0xd8f2b42600000000, 0xb8cdd57c00000000,
+    0xa7da25fc00000000, 0x78b317c800000000, 0x67a4e74800000000,
+    0x079b861200000000, 0x188c769200000000, 0xb948e27a00000000,
+    0xa65f12fa00000000, 0xc66073a000000000, 0xd977832000000000,
+    0x061eb11400000000, 0x1909419400000000, 0x793620ce00000000,
+    0x6621d04e00000000, 0xb574805300000000, 0xaa6370d300000000,
+    0xca5c118900000000, 0xd54be10900000000, 0x0a22d33d00000000,
+    0x153523bd00000000, 0x750a42e700000000, 0x6a1db26700000000,
+    0xcbd9268f00000000, 0xd4ced60f00000000, 0xb4f1b75500000000,
+    0xabe647d500000000, 0x748f75e100000000, 0x6b98856100000000,
+    0x0ba7e43b00000000, 0x14b014bb00000000, 0x0828bc3100000000,
+    0x173f4cb100000000, 0x77002deb00000000, 0x6817dd6b00000000,
+    0xb77eef5f00000000, 0xa8691fdf00000000, 0xc8567e8500000000,
+    0xd7418e0500000000, 0x76851aed00000000, 0x6992ea6d00000000,
+    0x09ad8b3700000000, 0x16ba7bb700000000, 0xc9d3498300000000,
+    0xd6c4b90300000000, 0xb6fbd85900000000, 0xa9ec28d900000000,
+    0xcfcdf89700000000, 0xd0da081700000000, 0xb0e5694d00000000,
+    0xaff299cd00000000, 0x709babf900000000, 0x6f8c5b7900000000,
+    0x0fb33a2300000000, 0x10a4caa300000000, 0xb1605e4b00000000,
+    0xae77aecb00000000, 0xce48cf9100000000, 0xd15f3f1100000000,
+    0x0e360d2500000000, 0x1121fda500000000, 0x711e9cff00000000,
+    0x6e096c7f00000000, 0x7291c4f500000000, 0x6d86347500000000,
+    0x0db9552f00000000, 0x12aea5af00000000, 0xcdc7979b00000000,
+    0xd2d0671b00000000, 0xb2ef064100000000, 0xadf8f6c100000000,
+    0x0c3c622900000000, 0x132b92a900000000, 0x7314f3f300000000,
+    0x6c03037300000000, 0xb36a314700000000, 0xac7dc1c700000000,
+    0xcc42a09d00000000, 0xd355501d00000000, 0x6ae900a700000000,
+    0x75fef02700000000, 0x15c1917d00000000, 0x0ad661fd00000000,
+    0xd5bf53c900000000, 0xcaa8a34900000000, 0xaa97c21300000000,
+    0xb580329300000000, 0x1444a67b00000000, 0x0b5356fb00000000,
+    0x6b6c37a100000000, 0x747bc72100000000, 0xab12f51500000000,
+    0xb405059500000000, 0xd43a64cf00000000, 0xcb2d944f00000000,
+    0xd7b53cc500000000, 0xc8a2cc4500000000, 0xa89dad1f00000000,
+    0xb78a5d9f00000000, 0x68e36fab00000000, 0x77f49f2b00000000,
+    0x17cbfe7100000000, 0x08dc0ef100000000, 0xa9189a1900000000,
+    0xb60f6a9900000000, 0xd6300bc300000000, 0xc927fb4300000000,
+    0x164ec97700000000, 0x095939f700000000, 0x696658ad00000000,
+    0x7671a82d00000000, 0x1050786300000000, 0x0f4788e300000000,
+    0x6f78e9b900000000, 0x706f193900000000, 0xaf062b0d00000000,
+    0xb011db8d00000000, 0xd02ebad700000000, 0xcf394a5700000000,
+    0x6efddebf00000000, 0x71ea2e3f00000000, 0x11d54f6500000000,
+    0x0ec2bfe500000000, 0xd1ab8dd100000000, 0xcebc7d5100000000,
+    0xae831c0b00000000, 0xb194ec8b00000000, 0xad0c440100000000,
+    0xb21bb48100000000, 0xd224d5db00000000, 0xcd33255b00000000,
+    0x125a176f00000000, 0x0d4de7ef00000000, 0x6d7286b500000000,
+    0x7265763500000000, 0xd3a1e2dd00000000, 0xccb6125d00000000,
+    0xac89730700000000, 0xb39e838700000000, 0x6cf7b1b300000000,
+    0x73e0413300000000, 0x13df206900000000, 0x0cc8d0e900000000,
+    0xdf9d80f400000000, 0xc08a707400000000, 0xa0b5112e00000000,
+    0xbfa2e1ae00000000, 0x60cbd39a00000000, 0x7fdc231a00000000,
+    0x1fe3424000000000, 0x00f4b2c000000000, 0xa130262800000000,
+    0xbe27d6a800000000, 0xde18b7f200000000, 0xc10f477200000000,
+    0x1e66754600000000, 0x017185c600000000, 0x614ee49c00000000,
+    0x7e59141c00000000, 0x62c1bc9600000000, 0x7dd64c1600000000,
+    0x1de92d4c00000000, 0x02feddcc00000000, 0xdd97eff800000000,
+    0xc2801f7800000000, 0xa2bf7e2200000000, 0xbda88ea200000000,
+    0x1c6c1a4a00000000, 0x037beaca00000000, 0x63448b9000000000,
+    0x7c537b1000000000, 0xa33a492400000000, 0xbc2db9a400000000,
+    0xdc12d8fe00000000, 0xc305287e00000000, 0xa524f83000000000,
+    0xba3308b000000000, 0xda0c69ea00000000, 0xc51b996a00000000,
+    0x1a72ab5e00000000, 0x05655bde00000000, 0x655a3a8400000000,
+    0x7a4dca0400000000, 0xdb895eec00000000, 0xc49eae6c00000000,
+    0xa4a1cf3600000000, 0xbbb63fb600000000, 0x64df0d8200000000,
+    0x7bc8fd0200000000, 0x1bf79c5800000000, 0x04e06cd800000000,
+    0x1878c45200000000, 0x076f34d200000000, 0x6750558800000000,
+    0x7847a50800000000, 0xa72e973c00000000, 0xb83967bc00000000,
+    0xd80606e600000000, 0xc711f66600000000, 0x66d5628e00000000,
+    0x79c2920e00000000, 0x19fdf35400000000, 0x06ea03d400000000,
+    0xd98331e000000000, 0xc694c16000000000, 0xa6aba03a00000000,
+    0xb9bc50ba00000000},
+   {0x0000000000000000, 0xe2fd888d00000000, 0x85fd60c000000000,
+    0x6700e84d00000000, 0x4bfdb05b00000000, 0xa90038d600000000,
+    0xce00d09b00000000, 0x2cfd581600000000, 0x96fa61b700000000,
+    0x7407e93a00000000, 0x1307017700000000, 0xf1fa89fa00000000,
+    0xdd07d1ec00000000, 0x3ffa596100000000, 0x58fab12c00000000,
+    0xba0739a100000000, 0x6df3b2b500000000, 0x8f0e3a3800000000,
+    0xe80ed27500000000, 0x0af35af800000000, 0x260e02ee00000000,
+    0xc4f38a6300000000, 0xa3f3622e00000000, 0x410eeaa300000000,
+    0xfb09d30200000000, 0x19f45b8f00000000, 0x7ef4b3c200000000,
+    0x9c093b4f00000000, 0xb0f4635900000000, 0x5209ebd400000000,
+    0x3509039900000000, 0xd7f48b1400000000, 0x9be014b000000000,
+    0x791d9c3d00000000, 0x1e1d747000000000, 0xfce0fcfd00000000,
+    0xd01da4eb00000000, 0x32e02c6600000000, 0x55e0c42b00000000,
+    0xb71d4ca600000000, 0x0d1a750700000000, 0xefe7fd8a00000000,
+    0x88e715c700000000, 0x6a1a9d4a00000000, 0x46e7c55c00000000,
+    0xa41a4dd100000000, 0xc31aa59c00000000, 0x21e72d1100000000,
+    0xf613a60500000000, 0x14ee2e8800000000, 0x73eec6c500000000,
+    0x91134e4800000000, 0xbdee165e00000000, 0x5f139ed300000000,
+    0x3813769e00000000, 0xdaeefe1300000000, 0x60e9c7b200000000,
+    0x82144f3f00000000, 0xe514a77200000000, 0x07e92fff00000000,
+    0x2b1477e900000000, 0xc9e9ff6400000000, 0xaee9172900000000,
+    0x4c149fa400000000, 0x77c758bb00000000, 0x953ad03600000000,
+    0xf23a387b00000000, 0x10c7b0f600000000, 0x3c3ae8e000000000,
+    0xdec7606d00000000, 0xb9c7882000000000, 0x5b3a00ad00000000,
+    0xe13d390c00000000, 0x03c0b18100000000, 0x64c059cc00000000,
+    0x863dd14100000000, 0xaac0895700000000, 0x483d01da00000000,
+    0x2f3de99700000000, 0xcdc0611a00000000, 0x1a34ea0e00000000,
+    0xf8c9628300000000, 0x9fc98ace00000000, 0x7d34024300000000,
+    0x51c95a5500000000, 0xb334d2d800000000, 0xd4343a9500000000,
+    0x36c9b21800000000, 0x8cce8bb900000000, 0x6e33033400000000,
+    0x0933eb7900000000, 0xebce63f400000000, 0xc7333be200000000,
+    0x25ceb36f00000000, 0x42ce5b2200000000, 0xa033d3af00000000,
+    0xec274c0b00000000, 0x0edac48600000000, 0x69da2ccb00000000,
+    0x8b27a44600000000, 0xa7dafc5000000000, 0x452774dd00000000,
+    0x22279c9000000000, 0xc0da141d00000000, 0x7add2dbc00000000,
+    0x9820a53100000000, 0xff204d7c00000000, 0x1dddc5f100000000,
+    0x31209de700000000, 0xd3dd156a00000000, 0xb4ddfd2700000000,
+    0x562075aa00000000, 0x81d4febe00000000, 0x6329763300000000,
+    0x04299e7e00000000, 0xe6d416f300000000, 0xca294ee500000000,
+    0x28d4c66800000000, 0x4fd42e2500000000, 0xad29a6a800000000,
+    0x172e9f0900000000, 0xf5d3178400000000, 0x92d3ffc900000000,
+    0x702e774400000000, 0x5cd32f5200000000, 0xbe2ea7df00000000,
+    0xd92e4f9200000000, 0x3bd3c71f00000000, 0xaf88c0ad00000000,
+    0x4d75482000000000, 0x2a75a06d00000000, 0xc88828e000000000,
+    0xe47570f600000000, 0x0688f87b00000000, 0x6188103600000000,
+    0x837598bb00000000, 0x3972a11a00000000, 0xdb8f299700000000,
+    0xbc8fc1da00000000, 0x5e72495700000000, 0x728f114100000000,
+    0x907299cc00000000, 0xf772718100000000, 0x158ff90c00000000,
+    0xc27b721800000000, 0x2086fa9500000000, 0x478612d800000000,
+    0xa57b9a5500000000, 0x8986c24300000000, 0x6b7b4ace00000000,
+    0x0c7ba28300000000, 0xee862a0e00000000, 0x548113af00000000,
+    0xb67c9b2200000000, 0xd17c736f00000000, 0x3381fbe200000000,
+    0x1f7ca3f400000000, 0xfd812b7900000000, 0x9a81c33400000000,
+    0x787c4bb900000000, 0x3468d41d00000000, 0xd6955c9000000000,
+    0xb195b4dd00000000, 0x53683c5000000000, 0x7f95644600000000,
+    0x9d68eccb00000000, 0xfa68048600000000, 0x18958c0b00000000,
+    0xa292b5aa00000000, 0x406f3d2700000000, 0x276fd56a00000000,
+    0xc5925de700000000, 0xe96f05f100000000, 0x0b928d7c00000000,
+    0x6c92653100000000, 0x8e6fedbc00000000, 0x599b66a800000000,
+    0xbb66ee2500000000, 0xdc66066800000000, 0x3e9b8ee500000000,
+    0x1266d6f300000000, 0xf09b5e7e00000000, 0x979bb63300000000,
+    0x75663ebe00000000, 0xcf61071f00000000, 0x2d9c8f9200000000,
+    0x4a9c67df00000000, 0xa861ef5200000000, 0x849cb74400000000,
+    0x66613fc900000000, 0x0161d78400000000, 0xe39c5f0900000000,
+    0xd84f981600000000, 0x3ab2109b00000000, 0x5db2f8d600000000,
+    0xbf4f705b00000000, 0x93b2284d00000000, 0x714fa0c000000000,
+    0x164f488d00000000, 0xf4b2c00000000000, 0x4eb5f9a100000000,
+    0xac48712c00000000, 0xcb48996100000000, 0x29b511ec00000000,
+    0x054849fa00000000, 0xe7b5c17700000000, 0x80b5293a00000000,
+    0x6248a1b700000000, 0xb5bc2aa300000000, 0x5741a22e00000000,
+    0x30414a6300000000, 0xd2bcc2ee00000000, 0xfe419af800000000,
+    0x1cbc127500000000, 0x7bbcfa3800000000, 0x994172b500000000,
+    0x23464b1400000000, 0xc1bbc39900000000, 0xa6bb2bd400000000,
+    0x4446a35900000000, 0x68bbfb4f00000000, 0x8a4673c200000000,
+    0xed469b8f00000000, 0x0fbb130200000000, 0x43af8ca600000000,
+    0xa152042b00000000, 0xc652ec6600000000, 0x24af64eb00000000,
+    0x08523cfd00000000, 0xeaafb47000000000, 0x8daf5c3d00000000,
+    0x6f52d4b000000000, 0xd555ed1100000000, 0x37a8659c00000000,
+    0x50a88dd100000000, 0xb255055c00000000, 0x9ea85d4a00000000,
+    0x7c55d5c700000000, 0x1b553d8a00000000, 0xf9a8b50700000000,
+    0x2e5c3e1300000000, 0xcca1b69e00000000, 0xaba15ed300000000,
+    0x495cd65e00000000, 0x65a18e4800000000, 0x875c06c500000000,
+    0xe05cee8800000000, 0x02a1660500000000, 0xb8a65fa400000000,
+    0x5a5bd72900000000, 0x3d5b3f6400000000, 0xdfa6b7e900000000,
+    0xf35befff00000000, 0x11a6677200000000, 0x76a68f3f00000000,
+    0x945b07b200000000},
+   {0x0000000000000000, 0xa90b894e00000000, 0x5217129d00000000,
+    0xfb1c9bd300000000, 0xe52855e100000000, 0x4c23dcaf00000000,
+    0xb73f477c00000000, 0x1e34ce3200000000, 0x8b57db1900000000,
+    0x225c525700000000, 0xd940c98400000000, 0x704b40ca00000000,
+    0x6e7f8ef800000000, 0xc77407b600000000, 0x3c689c6500000000,
+    0x9563152b00000000, 0x16afb63300000000, 0xbfa43f7d00000000,
+    0x44b8a4ae00000000, 0xedb32de000000000, 0xf387e3d200000000,
+    0x5a8c6a9c00000000, 0xa190f14f00000000, 0x089b780100000000,
+    0x9df86d2a00000000, 0x34f3e46400000000, 0xcfef7fb700000000,
+    0x66e4f6f900000000, 0x78d038cb00000000, 0xd1dbb18500000000,
+    0x2ac72a5600000000, 0x83cca31800000000, 0x2c5e6d6700000000,
+    0x8555e42900000000, 0x7e497ffa00000000, 0xd742f6b400000000,
+    0xc976388600000000, 0x607db1c800000000, 0x9b612a1b00000000,
+    0x326aa35500000000, 0xa709b67e00000000, 0x0e023f3000000000,
+    0xf51ea4e300000000, 0x5c152dad00000000, 0x4221e39f00000000,
+    0xeb2a6ad100000000, 0x1036f10200000000, 0xb93d784c00000000,
+    0x3af1db5400000000, 0x93fa521a00000000, 0x68e6c9c900000000,
+    0xc1ed408700000000, 0xdfd98eb500000000, 0x76d207fb00000000,
+    0x8dce9c2800000000, 0x24c5156600000000, 0xb1a6004d00000000,
+    0x18ad890300000000, 0xe3b112d000000000, 0x4aba9b9e00000000,
+    0x548e55ac00000000, 0xfd85dce200000000, 0x0699473100000000,
+    0xaf92ce7f00000000, 0x58bcdace00000000, 0xf1b7538000000000,
+    0x0aabc85300000000, 0xa3a0411d00000000, 0xbd948f2f00000000,
+    0x149f066100000000, 0xef839db200000000, 0x468814fc00000000,
+    0xd3eb01d700000000, 0x7ae0889900000000, 0x81fc134a00000000,
+    0x28f79a0400000000, 0x36c3543600000000, 0x9fc8dd7800000000,
+    0x64d446ab00000000, 0xcddfcfe500000000, 0x4e136cfd00000000,
+    0xe718e5b300000000, 0x1c047e6000000000, 0xb50ff72e00000000,
+    0xab3b391c00000000, 0x0230b05200000000, 0xf92c2b8100000000,
+    0x5027a2cf00000000, 0xc544b7e400000000, 0x6c4f3eaa00000000,
+    0x9753a57900000000, 0x3e582c3700000000, 0x206ce20500000000,
+    0x89676b4b00000000, 0x727bf09800000000, 0xdb7079d600000000,
+    0x74e2b7a900000000, 0xdde93ee700000000, 0x26f5a53400000000,
+    0x8ffe2c7a00000000, 0x91cae24800000000, 0x38c16b0600000000,
+    0xc3ddf0d500000000, 0x6ad6799b00000000, 0xffb56cb000000000,
+    0x56bee5fe00000000, 0xada27e2d00000000, 0x04a9f76300000000,
+    0x1a9d395100000000, 0xb396b01f00000000, 0x488a2bcc00000000,
+    0xe181a28200000000, 0x624d019a00000000, 0xcb4688d400000000,
+    0x305a130700000000, 0x99519a4900000000, 0x8765547b00000000,
+    0x2e6edd3500000000, 0xd57246e600000000, 0x7c79cfa800000000,
+    0xe91ada8300000000, 0x401153cd00000000, 0xbb0dc81e00000000,
+    0x1206415000000000, 0x0c328f6200000000, 0xa539062c00000000,
+    0x5e259dff00000000, 0xf72e14b100000000, 0xf17ec44600000000,
+    0x58754d0800000000, 0xa369d6db00000000, 0x0a625f9500000000,
+    0x145691a700000000, 0xbd5d18e900000000, 0x4641833a00000000,
+    0xef4a0a7400000000, 0x7a291f5f00000000, 0xd322961100000000,
+    0x283e0dc200000000, 0x8135848c00000000, 0x9f014abe00000000,
+    0x360ac3f000000000, 0xcd16582300000000, 0x641dd16d00000000,
+    0xe7d1727500000000, 0x4edafb3b00000000, 0xb5c660e800000000,
+    0x1ccde9a600000000, 0x02f9279400000000, 0xabf2aeda00000000,
+    0x50ee350900000000, 0xf9e5bc4700000000, 0x6c86a96c00000000,
+    0xc58d202200000000, 0x3e91bbf100000000, 0x979a32bf00000000,
+    0x89aefc8d00000000, 0x20a575c300000000, 0xdbb9ee1000000000,
+    0x72b2675e00000000, 0xdd20a92100000000, 0x742b206f00000000,
+    0x8f37bbbc00000000, 0x263c32f200000000, 0x3808fcc000000000,
+    0x9103758e00000000, 0x6a1fee5d00000000, 0xc314671300000000,
+    0x5677723800000000, 0xff7cfb7600000000, 0x046060a500000000,
+    0xad6be9eb00000000, 0xb35f27d900000000, 0x1a54ae9700000000,
+    0xe148354400000000, 0x4843bc0a00000000, 0xcb8f1f1200000000,
+    0x6284965c00000000, 0x99980d8f00000000, 0x309384c100000000,
+    0x2ea74af300000000, 0x87acc3bd00000000, 0x7cb0586e00000000,
+    0xd5bbd12000000000, 0x40d8c40b00000000, 0xe9d34d4500000000,
+    0x12cfd69600000000, 0xbbc45fd800000000, 0xa5f091ea00000000,
+    0x0cfb18a400000000, 0xf7e7837700000000, 0x5eec0a3900000000,
+    0xa9c21e8800000000, 0x00c997c600000000, 0xfbd50c1500000000,
+    0x52de855b00000000, 0x4cea4b6900000000, 0xe5e1c22700000000,
+    0x1efd59f400000000, 0xb7f6d0ba00000000, 0x2295c59100000000,
+    0x8b9e4cdf00000000, 0x7082d70c00000000, 0xd9895e4200000000,
+    0xc7bd907000000000, 0x6eb6193e00000000, 0x95aa82ed00000000,
+    0x3ca10ba300000000, 0xbf6da8bb00000000, 0x166621f500000000,
+    0xed7aba2600000000, 0x4471336800000000, 0x5a45fd5a00000000,
+    0xf34e741400000000, 0x0852efc700000000, 0xa159668900000000,
+    0x343a73a200000000, 0x9d31faec00000000, 0x662d613f00000000,
+    0xcf26e87100000000, 0xd112264300000000, 0x7819af0d00000000,
+    0x830534de00000000, 0x2a0ebd9000000000, 0x859c73ef00000000,
+    0x2c97faa100000000, 0xd78b617200000000, 0x7e80e83c00000000,
+    0x60b4260e00000000, 0xc9bfaf4000000000, 0x32a3349300000000,
+    0x9ba8bddd00000000, 0x0ecba8f600000000, 0xa7c021b800000000,
+    0x5cdcba6b00000000, 0xf5d7332500000000, 0xebe3fd1700000000,
+    0x42e8745900000000, 0xb9f4ef8a00000000, 0x10ff66c400000000,
+    0x9333c5dc00000000, 0x3a384c9200000000, 0xc124d74100000000,
+    0x682f5e0f00000000, 0x761b903d00000000, 0xdf10197300000000,
+    0x240c82a000000000, 0x8d070bee00000000, 0x18641ec500000000,
+    0xb16f978b00000000, 0x4a730c5800000000, 0xe378851600000000,
+    0xfd4c4b2400000000, 0x5447c26a00000000, 0xaf5b59b900000000,
+    0x0650d0f700000000},
+   {0x0000000000000000, 0x479244af00000000, 0xcf22f88500000000,
+    0x88b0bc2a00000000, 0xdf4381d000000000, 0x98d1c57f00000000,
+    0x1061795500000000, 0x57f33dfa00000000, 0xff81737a00000000,
+    0xb81337d500000000, 0x30a38bff00000000, 0x7731cf5000000000,
+    0x20c2f2aa00000000, 0x6750b60500000000, 0xefe00a2f00000000,
+    0xa8724e8000000000, 0xfe03e7f400000000, 0xb991a35b00000000,
+    0x31211f7100000000, 0x76b35bde00000000, 0x2140662400000000,
+    0x66d2228b00000000, 0xee629ea100000000, 0xa9f0da0e00000000,
+    0x0182948e00000000, 0x4610d02100000000, 0xcea06c0b00000000,
+    0x893228a400000000, 0xdec1155e00000000, 0x995351f100000000,
+    0x11e3eddb00000000, 0x5671a97400000000, 0xbd01bf3200000000,
+    0xfa93fb9d00000000, 0x722347b700000000, 0x35b1031800000000,
+    0x62423ee200000000, 0x25d07a4d00000000, 0xad60c66700000000,
+    0xeaf282c800000000, 0x4280cc4800000000, 0x051288e700000000,
+    0x8da234cd00000000, 0xca30706200000000, 0x9dc34d9800000000,
+    0xda51093700000000, 0x52e1b51d00000000, 0x1573f1b200000000,
+    0x430258c600000000, 0x04901c6900000000, 0x8c20a04300000000,
+    0xcbb2e4ec00000000, 0x9c41d91600000000, 0xdbd39db900000000,
+    0x5363219300000000, 0x14f1653c00000000, 0xbc832bbc00000000,
+    0xfb116f1300000000, 0x73a1d33900000000, 0x3433979600000000,
+    0x63c0aa6c00000000, 0x2452eec300000000, 0xace252e900000000,
+    0xeb70164600000000, 0x7a037e6500000000, 0x3d913aca00000000,
+    0xb52186e000000000, 0xf2b3c24f00000000, 0xa540ffb500000000,
+    0xe2d2bb1a00000000, 0x6a62073000000000, 0x2df0439f00000000,
+    0x85820d1f00000000, 0xc21049b000000000, 0x4aa0f59a00000000,
+    0x0d32b13500000000, 0x5ac18ccf00000000, 0x1d53c86000000000,
+    0x95e3744a00000000, 0xd27130e500000000, 0x8400999100000000,
+    0xc392dd3e00000000, 0x4b22611400000000, 0x0cb025bb00000000,
+    0x5b43184100000000, 0x1cd15cee00000000, 0x9461e0c400000000,
+    0xd3f3a46b00000000, 0x7b81eaeb00000000, 0x3c13ae4400000000,
+    0xb4a3126e00000000, 0xf33156c100000000, 0xa4c26b3b00000000,
+    0xe3502f9400000000, 0x6be093be00000000, 0x2c72d71100000000,
+    0xc702c15700000000, 0x809085f800000000, 0x082039d200000000,
+    0x4fb27d7d00000000, 0x1841408700000000, 0x5fd3042800000000,
+    0xd763b80200000000, 0x90f1fcad00000000, 0x3883b22d00000000,
+    0x7f11f68200000000, 0xf7a14aa800000000, 0xb0330e0700000000,
+    0xe7c033fd00000000, 0xa052775200000000, 0x28e2cb7800000000,
+    0x6f708fd700000000, 0x390126a300000000, 0x7e93620c00000000,
+    0xf623de2600000000, 0xb1b19a8900000000, 0xe642a77300000000,
+    0xa1d0e3dc00000000, 0x29605ff600000000, 0x6ef21b5900000000,
+    0xc68055d900000000, 0x8112117600000000, 0x09a2ad5c00000000,
+    0x4e30e9f300000000, 0x19c3d40900000000, 0x5e5190a600000000,
+    0xd6e12c8c00000000, 0x9173682300000000, 0xf406fcca00000000,
+    0xb394b86500000000, 0x3b24044f00000000, 0x7cb640e000000000,
+    0x2b457d1a00000000, 0x6cd739b500000000, 0xe467859f00000000,
+    0xa3f5c13000000000, 0x0b878fb000000000, 0x4c15cb1f00000000,
+    0xc4a5773500000000, 0x8337339a00000000, 0xd4c40e6000000000,
+    0x93564acf00000000, 0x1be6f6e500000000, 0x5c74b24a00000000,
+    0x0a051b3e00000000, 0x4d975f9100000000, 0xc527e3bb00000000,
+    0x82b5a71400000000, 0xd5469aee00000000, 0x92d4de4100000000,
+    0x1a64626b00000000, 0x5df626c400000000, 0xf584684400000000,
+    0xb2162ceb00000000, 0x3aa690c100000000, 0x7d34d46e00000000,
+    0x2ac7e99400000000, 0x6d55ad3b00000000, 0xe5e5111100000000,
+    0xa27755be00000000, 0x490743f800000000, 0x0e95075700000000,
+    0x8625bb7d00000000, 0xc1b7ffd200000000, 0x9644c22800000000,
+    0xd1d6868700000000, 0x59663aad00000000, 0x1ef47e0200000000,
+    0xb686308200000000, 0xf114742d00000000, 0x79a4c80700000000,
+    0x3e368ca800000000, 0x69c5b15200000000, 0x2e57f5fd00000000,
+    0xa6e749d700000000, 0xe1750d7800000000, 0xb704a40c00000000,
+    0xf096e0a300000000, 0x78265c8900000000, 0x3fb4182600000000,
+    0x684725dc00000000, 0x2fd5617300000000, 0xa765dd5900000000,
+    0xe0f799f600000000, 0x4885d77600000000, 0x0f1793d900000000,
+    0x87a72ff300000000, 0xc0356b5c00000000, 0x97c656a600000000,
+    0xd054120900000000, 0x58e4ae2300000000, 0x1f76ea8c00000000,
+    0x8e0582af00000000, 0xc997c60000000000, 0x41277a2a00000000,
+    0x06b53e8500000000, 0x5146037f00000000, 0x16d447d000000000,
+    0x9e64fbfa00000000, 0xd9f6bf5500000000, 0x7184f1d500000000,
+    0x3616b57a00000000, 0xbea6095000000000, 0xf9344dff00000000,
+    0xaec7700500000000, 0xe95534aa00000000, 0x61e5888000000000,
+    0x2677cc2f00000000, 0x7006655b00000000, 0x379421f400000000,
+    0xbf249dde00000000, 0xf8b6d97100000000, 0xaf45e48b00000000,
+    0xe8d7a02400000000, 0x60671c0e00000000, 0x27f558a100000000,
+    0x8f87162100000000, 0xc815528e00000000, 0x40a5eea400000000,
+    0x0737aa0b00000000, 0x50c497f100000000, 0x1756d35e00000000,
+    0x9fe66f7400000000, 0xd8742bdb00000000, 0x33043d9d00000000,
+    0x7496793200000000, 0xfc26c51800000000, 0xbbb481b700000000,
+    0xec47bc4d00000000, 0xabd5f8e200000000, 0x236544c800000000,
+    0x64f7006700000000, 0xcc854ee700000000, 0x8b170a4800000000,
+    0x03a7b66200000000, 0x4435f2cd00000000, 0x13c6cf3700000000,
+    0x54548b9800000000, 0xdce437b200000000, 0x9b76731d00000000,
+    0xcd07da6900000000, 0x8a959ec600000000, 0x022522ec00000000,
+    0x45b7664300000000, 0x12445bb900000000, 0x55d61f1600000000,
+    0xdd66a33c00000000, 0x9af4e79300000000, 0x3286a91300000000,
+    0x7514edbc00000000, 0xfda4519600000000, 0xba36153900000000,
+    0xedc528c300000000, 0xaa576c6c00000000, 0x22e7d04600000000,
+    0x657594e900000000}};
+
+#else /* W == 4 */
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59,
+    0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4,
+    0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67,
+    0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef,
+    0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97,
+    0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88,
+    0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687,
+    0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698,
+    0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0,
+    0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068,
+    0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb,
+    0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056,
+    0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016,
+    0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009,
+    0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028,
+    0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037,
+    0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a,
+    0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7,
+    0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054,
+    0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7,
+    0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af,
+    0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0,
+    0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4,
+    0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab,
+    0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3,
+    0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a,
+    0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9,
+    0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54,
+    0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09,
+    0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16,
+    0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37,
+    0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28,
+    0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e,
+    0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3,
+    0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40,
+    0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8,
+    0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0,
+    0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf,
+    0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6,
+    0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9,
+    0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1,
+    0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059,
+    0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca,
+    0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067,
+    0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031,
+    0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e,
+    0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f,
+    0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010,
+    0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d,
+    0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0,
+    0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073,
+    0xd8ac6b35},
+   {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2,
+    0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd,
+    0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696,
+    0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3,
+    0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f,
+    0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35,
+    0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5,
+    0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f,
+    0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673,
+    0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46,
+    0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d,
+    0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632,
+    0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28,
+    0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192,
+    0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c,
+    0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6,
+    0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0,
+    0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff,
+    0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4,
+    0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95,
+    0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9,
+    0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03,
+    0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7,
+    0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d,
+    0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151,
+    0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808,
+    0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343,
+    0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c,
+    0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a,
+    0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0,
+    0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e,
+    0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594,
+    0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6,
+    0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399,
+    0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2,
+    0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7,
+    0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb,
+    0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571,
+    0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289,
+    0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33,
+    0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f,
+    0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a,
+    0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461,
+    0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e,
+    0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c,
+    0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6,
+    0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918,
+    0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2,
+    0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484,
+    0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb,
+    0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0,
+    0xa140efa8},
+   {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706,
+    0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed,
+    0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289,
+    0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a,
+    0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214,
+    0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3,
+    0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3,
+    0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254,
+    0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a,
+    0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9,
+    0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad,
+    0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746,
+    0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060,
+    0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187,
+    0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef,
+    0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408,
+    0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e,
+    0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495,
+    0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1,
+    0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532,
+    0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c,
+    0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb,
+    0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb,
+    0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c,
+    0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42,
+    0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060,
+    0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04,
+    0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef,
+    0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99,
+    0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e,
+    0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16,
+    0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1,
+    0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7,
+    0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c,
+    0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38,
+    0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb,
+    0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5,
+    0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42,
+    0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62,
+    0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85,
+    0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb,
+    0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18,
+    0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c,
+    0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997,
+    0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1,
+    0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36,
+    0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e,
+    0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9,
+    0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf,
+    0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24,
+    0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040,
+    0x917cd6a1},
+   {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf,
+    0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd,
+    0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896,
+    0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9,
+    0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3,
+    0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f,
+    0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d,
+    0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1,
+    0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab,
+    0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4,
+    0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f,
+    0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d,
+    0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4,
+    0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978,
+    0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad,
+    0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621,
+    0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46,
+    0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854,
+    0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f,
+    0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a,
+    0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890,
+    0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c,
+    0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4,
+    0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238,
+    0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622,
+    0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab,
+    0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0,
+    0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2,
+    0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295,
+    0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19,
+    0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc,
+    0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140,
+    0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd,
+    0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf,
+    0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184,
+    0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb,
+    0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1,
+    0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d,
+    0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb,
+    0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257,
+    0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d,
+    0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22,
+    0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069,
+    0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b,
+    0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6,
+    0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a,
+    0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf,
+    0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33,
+    0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254,
+    0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146,
+    0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d,
+    0x18ba364e}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x00000000, 0x43cba687, 0xc7903cd4, 0x845b9a53, 0xcf270873,
+    0x8cecaef4, 0x08b734a7, 0x4b7c9220, 0x9e4f10e6, 0xdd84b661,
+    0x59df2c32, 0x1a148ab5, 0x51681895, 0x12a3be12, 0x96f82441,
+    0xd53382c6, 0x7d995117, 0x3e52f790, 0xba096dc3, 0xf9c2cb44,
+    0xb2be5964, 0xf175ffe3, 0x752e65b0, 0x36e5c337, 0xe3d641f1,
+    0xa01de776, 0x24467d25, 0x678ddba2, 0x2cf14982, 0x6f3aef05,
+    0xeb617556, 0xa8aad3d1, 0xfa32a32e, 0xb9f905a9, 0x3da29ffa,
+    0x7e69397d, 0x3515ab5d, 0x76de0dda, 0xf2859789, 0xb14e310e,
+    0x647db3c8, 0x27b6154f, 0xa3ed8f1c, 0xe026299b, 0xab5abbbb,
+    0xe8911d3c, 0x6cca876f, 0x2f0121e8, 0x87abf239, 0xc46054be,
+    0x403bceed, 0x03f0686a, 0x488cfa4a, 0x0b475ccd, 0x8f1cc69e,
+    0xccd76019, 0x19e4e2df, 0x5a2f4458, 0xde74de0b, 0x9dbf788c,
+    0xd6c3eaac, 0x95084c2b, 0x1153d678, 0x529870ff, 0xf465465d,
+    0xb7aee0da, 0x33f57a89, 0x703edc0e, 0x3b424e2e, 0x7889e8a9,
+    0xfcd272fa, 0xbf19d47d, 0x6a2a56bb, 0x29e1f03c, 0xadba6a6f,
+    0xee71cce8, 0xa50d5ec8, 0xe6c6f84f, 0x629d621c, 0x2156c49b,
+    0x89fc174a, 0xca37b1cd, 0x4e6c2b9e, 0x0da78d19, 0x46db1f39,
+    0x0510b9be, 0x814b23ed, 0xc280856a, 0x17b307ac, 0x5478a12b,
+    0xd0233b78, 0x93e89dff, 0xd8940fdf, 0x9b5fa958, 0x1f04330b,
+    0x5ccf958c, 0x0e57e573, 0x4d9c43f4, 0xc9c7d9a7, 0x8a0c7f20,
+    0xc170ed00, 0x82bb4b87, 0x06e0d1d4, 0x452b7753, 0x9018f595,
+    0xd3d35312, 0x5788c941, 0x14436fc6, 0x5f3ffde6, 0x1cf45b61,
+    0x98afc132, 0xdb6467b5, 0x73ceb464, 0x300512e3, 0xb45e88b0,
+    0xf7952e37, 0xbce9bc17, 0xff221a90, 0x7b7980c3, 0x38b22644,
+    0xed81a482, 0xae4a0205, 0x2a119856, 0x69da3ed1, 0x22a6acf1,
+    0x616d0a76, 0xe5369025, 0xa6fd36a2, 0xe8cb8cba, 0xab002a3d,
+    0x2f5bb06e, 0x6c9016e9, 0x27ec84c9, 0x6427224e, 0xe07cb81d,
+    0xa3b71e9a, 0x76849c5c, 0x354f3adb, 0xb114a088, 0xf2df060f,
+    0xb9a3942f, 0xfa6832a8, 0x7e33a8fb, 0x3df80e7c, 0x9552ddad,
+    0xd6997b2a, 0x52c2e179, 0x110947fe, 0x5a75d5de, 0x19be7359,
+    0x9de5e90a, 0xde2e4f8d, 0x0b1dcd4b, 0x48d66bcc, 0xcc8df19f,
+    0x8f465718, 0xc43ac538, 0x87f163bf, 0x03aaf9ec, 0x40615f6b,
+    0x12f92f94, 0x51328913, 0xd5691340, 0x96a2b5c7, 0xddde27e7,
+    0x9e158160, 0x1a4e1b33, 0x5985bdb4, 0x8cb63f72, 0xcf7d99f5,
+    0x4b2603a6, 0x08eda521, 0x43913701, 0x005a9186, 0x84010bd5,
+    0xc7caad52, 0x6f607e83, 0x2cabd804, 0xa8f04257, 0xeb3be4d0,
+    0xa04776f0, 0xe38cd077, 0x67d74a24, 0x241ceca3, 0xf12f6e65,
+    0xb2e4c8e2, 0x36bf52b1, 0x7574f436, 0x3e086616, 0x7dc3c091,
+    0xf9985ac2, 0xba53fc45, 0x1caecae7, 0x5f656c60, 0xdb3ef633,
+    0x98f550b4, 0xd389c294, 0x90426413, 0x1419fe40, 0x57d258c7,
+    0x82e1da01, 0xc12a7c86, 0x4571e6d5, 0x06ba4052, 0x4dc6d272,
+    0x0e0d74f5, 0x8a56eea6, 0xc99d4821, 0x61379bf0, 0x22fc3d77,
+    0xa6a7a724, 0xe56c01a3, 0xae109383, 0xeddb3504, 0x6980af57,
+    0x2a4b09d0, 0xff788b16, 0xbcb32d91, 0x38e8b7c2, 0x7b231145,
+    0x305f8365, 0x739425e2, 0xf7cfbfb1, 0xb4041936, 0xe69c69c9,
+    0xa557cf4e, 0x210c551d, 0x62c7f39a, 0x29bb61ba, 0x6a70c73d,
+    0xee2b5d6e, 0xade0fbe9, 0x78d3792f, 0x3b18dfa8, 0xbf4345fb,
+    0xfc88e37c, 0xb7f4715c, 0xf43fd7db, 0x70644d88, 0x33afeb0f,
+    0x9b0538de, 0xd8ce9e59, 0x5c95040a, 0x1f5ea28d, 0x542230ad,
+    0x17e9962a, 0x93b20c79, 0xd079aafe, 0x054a2838, 0x46818ebf,
+    0xc2da14ec, 0x8111b26b, 0xca6d204b, 0x89a686cc, 0x0dfd1c9f,
+    0x4e36ba18},
+   {0x00000000, 0xe1b652ef, 0x836bd405, 0x62dd86ea, 0x06d7a80b,
+    0xe761fae4, 0x85bc7c0e, 0x640a2ee1, 0x0cae5117, 0xed1803f8,
+    0x8fc58512, 0x6e73d7fd, 0x0a79f91c, 0xebcfabf3, 0x89122d19,
+    0x68a47ff6, 0x185ca32e, 0xf9eaf1c1, 0x9b37772b, 0x7a8125c4,
+    0x1e8b0b25, 0xff3d59ca, 0x9de0df20, 0x7c568dcf, 0x14f2f239,
+    0xf544a0d6, 0x9799263c, 0x762f74d3, 0x12255a32, 0xf39308dd,
+    0x914e8e37, 0x70f8dcd8, 0x30b8465d, 0xd10e14b2, 0xb3d39258,
+    0x5265c0b7, 0x366fee56, 0xd7d9bcb9, 0xb5043a53, 0x54b268bc,
+    0x3c16174a, 0xdda045a5, 0xbf7dc34f, 0x5ecb91a0, 0x3ac1bf41,
+    0xdb77edae, 0xb9aa6b44, 0x581c39ab, 0x28e4e573, 0xc952b79c,
+    0xab8f3176, 0x4a396399, 0x2e334d78, 0xcf851f97, 0xad58997d,
+    0x4ceecb92, 0x244ab464, 0xc5fce68b, 0xa7216061, 0x4697328e,
+    0x229d1c6f, 0xc32b4e80, 0xa1f6c86a, 0x40409a85, 0x60708dba,
+    0x81c6df55, 0xe31b59bf, 0x02ad0b50, 0x66a725b1, 0x8711775e,
+    0xe5ccf1b4, 0x047aa35b, 0x6cdedcad, 0x8d688e42, 0xefb508a8,
+    0x0e035a47, 0x6a0974a6, 0x8bbf2649, 0xe962a0a3, 0x08d4f24c,
+    0x782c2e94, 0x999a7c7b, 0xfb47fa91, 0x1af1a87e, 0x7efb869f,
+    0x9f4dd470, 0xfd90529a, 0x1c260075, 0x74827f83, 0x95342d6c,
+    0xf7e9ab86, 0x165ff969, 0x7255d788, 0x93e38567, 0xf13e038d,
+    0x10885162, 0x50c8cbe7, 0xb17e9908, 0xd3a31fe2, 0x32154d0d,
+    0x561f63ec, 0xb7a93103, 0xd574b7e9, 0x34c2e506, 0x5c669af0,
+    0xbdd0c81f, 0xdf0d4ef5, 0x3ebb1c1a, 0x5ab132fb, 0xbb076014,
+    0xd9dae6fe, 0x386cb411, 0x489468c9, 0xa9223a26, 0xcbffbccc,
+    0x2a49ee23, 0x4e43c0c2, 0xaff5922d, 0xcd2814c7, 0x2c9e4628,
+    0x443a39de, 0xa58c6b31, 0xc751eddb, 0x26e7bf34, 0x42ed91d5,
+    0xa35bc33a, 0xc18645d0, 0x2030173f, 0x81e66bae, 0x60503941,
+    0x028dbfab, 0xe33bed44, 0x8731c3a5, 0x6687914a, 0x045a17a0,
+    0xe5ec454f, 0x8d483ab9, 0x6cfe6856, 0x0e23eebc, 0xef95bc53,
+    0x8b9f92b2, 0x6a29c05d, 0x08f446b7, 0xe9421458, 0x99bac880,
+    0x780c9a6f, 0x1ad11c85, 0xfb674e6a, 0x9f6d608b, 0x7edb3264,
+    0x1c06b48e, 0xfdb0e661, 0x95149997, 0x74a2cb78, 0x167f4d92,
+    0xf7c91f7d, 0x93c3319c, 0x72756373, 0x10a8e599, 0xf11eb776,
+    0xb15e2df3, 0x50e87f1c, 0x3235f9f6, 0xd383ab19, 0xb78985f8,
+    0x563fd717, 0x34e251fd, 0xd5540312, 0xbdf07ce4, 0x5c462e0b,
+    0x3e9ba8e1, 0xdf2dfa0e, 0xbb27d4ef, 0x5a918600, 0x384c00ea,
+    0xd9fa5205, 0xa9028edd, 0x48b4dc32, 0x2a695ad8, 0xcbdf0837,
+    0xafd526d6, 0x4e637439, 0x2cbef2d3, 0xcd08a03c, 0xa5acdfca,
+    0x441a8d25, 0x26c70bcf, 0xc7715920, 0xa37b77c1, 0x42cd252e,
+    0x2010a3c4, 0xc1a6f12b, 0xe196e614, 0x0020b4fb, 0x62fd3211,
+    0x834b60fe, 0xe7414e1f, 0x06f71cf0, 0x642a9a1a, 0x859cc8f5,
+    0xed38b703, 0x0c8ee5ec, 0x6e536306, 0x8fe531e9, 0xebef1f08,
+    0x0a594de7, 0x6884cb0d, 0x893299e2, 0xf9ca453a, 0x187c17d5,
+    0x7aa1913f, 0x9b17c3d0, 0xff1ded31, 0x1eabbfde, 0x7c763934,
+    0x9dc06bdb, 0xf564142d, 0x14d246c2, 0x760fc028, 0x97b992c7,
+    0xf3b3bc26, 0x1205eec9, 0x70d86823, 0x916e3acc, 0xd12ea049,
+    0x3098f2a6, 0x5245744c, 0xb3f326a3, 0xd7f90842, 0x364f5aad,
+    0x5492dc47, 0xb5248ea8, 0xdd80f15e, 0x3c36a3b1, 0x5eeb255b,
+    0xbf5d77b4, 0xdb575955, 0x3ae10bba, 0x583c8d50, 0xb98adfbf,
+    0xc9720367, 0x28c45188, 0x4a19d762, 0xabaf858d, 0xcfa5ab6c,
+    0x2e13f983, 0x4cce7f69, 0xad782d86, 0xc5dc5270, 0x246a009f,
+    0x46b78675, 0xa701d49a, 0xc30bfa7b, 0x22bda894, 0x40602e7e,
+    0xa1d67c91},
+   {0x00000000, 0x5880e2d7, 0xf106b474, 0xa98656a3, 0xe20d68e9,
+    0xba8d8a3e, 0x130bdc9d, 0x4b8b3e4a, 0x851da109, 0xdd9d43de,
+    0x741b157d, 0x2c9bf7aa, 0x6710c9e0, 0x3f902b37, 0x96167d94,
+    0xce969f43, 0x0a3b4213, 0x52bba0c4, 0xfb3df667, 0xa3bd14b0,
+    0xe8362afa, 0xb0b6c82d, 0x19309e8e, 0x41b07c59, 0x8f26e31a,
+    0xd7a601cd, 0x7e20576e, 0x26a0b5b9, 0x6d2b8bf3, 0x35ab6924,
+    0x9c2d3f87, 0xc4addd50, 0x14768426, 0x4cf666f1, 0xe5703052,
+    0xbdf0d285, 0xf67beccf, 0xaefb0e18, 0x077d58bb, 0x5ffdba6c,
+    0x916b252f, 0xc9ebc7f8, 0x606d915b, 0x38ed738c, 0x73664dc6,
+    0x2be6af11, 0x8260f9b2, 0xdae01b65, 0x1e4dc635, 0x46cd24e2,
+    0xef4b7241, 0xb7cb9096, 0xfc40aedc, 0xa4c04c0b, 0x0d461aa8,
+    0x55c6f87f, 0x9b50673c, 0xc3d085eb, 0x6a56d348, 0x32d6319f,
+    0x795d0fd5, 0x21dded02, 0x885bbba1, 0xd0db5976, 0x28ec084d,
+    0x706cea9a, 0xd9eabc39, 0x816a5eee, 0xcae160a4, 0x92618273,
+    0x3be7d4d0, 0x63673607, 0xadf1a944, 0xf5714b93, 0x5cf71d30,
+    0x0477ffe7, 0x4ffcc1ad, 0x177c237a, 0xbefa75d9, 0xe67a970e,
+    0x22d74a5e, 0x7a57a889, 0xd3d1fe2a, 0x8b511cfd, 0xc0da22b7,
+    0x985ac060, 0x31dc96c3, 0x695c7414, 0xa7caeb57, 0xff4a0980,
+    0x56cc5f23, 0x0e4cbdf4, 0x45c783be, 0x1d476169, 0xb4c137ca,
+    0xec41d51d, 0x3c9a8c6b, 0x641a6ebc, 0xcd9c381f, 0x951cdac8,
+    0xde97e482, 0x86170655, 0x2f9150f6, 0x7711b221, 0xb9872d62,
+    0xe107cfb5, 0x48819916, 0x10017bc1, 0x5b8a458b, 0x030aa75c,
+    0xaa8cf1ff, 0xf20c1328, 0x36a1ce78, 0x6e212caf, 0xc7a77a0c,
+    0x9f2798db, 0xd4aca691, 0x8c2c4446, 0x25aa12e5, 0x7d2af032,
+    0xb3bc6f71, 0xeb3c8da6, 0x42badb05, 0x1a3a39d2, 0x51b10798,
+    0x0931e54f, 0xa0b7b3ec, 0xf837513b, 0x50d8119a, 0x0858f34d,
+    0xa1dea5ee, 0xf95e4739, 0xb2d57973, 0xea559ba4, 0x43d3cd07,
+    0x1b532fd0, 0xd5c5b093, 0x8d455244, 0x24c304e7, 0x7c43e630,
+    0x37c8d87a, 0x6f483aad, 0xc6ce6c0e, 0x9e4e8ed9, 0x5ae35389,
+    0x0263b15e, 0xabe5e7fd, 0xf365052a, 0xb8ee3b60, 0xe06ed9b7,
+    0x49e88f14, 0x11686dc3, 0xdffef280, 0x877e1057, 0x2ef846f4,
+    0x7678a423, 0x3df39a69, 0x657378be, 0xccf52e1d, 0x9475ccca,
+    0x44ae95bc, 0x1c2e776b, 0xb5a821c8, 0xed28c31f, 0xa6a3fd55,
+    0xfe231f82, 0x57a54921, 0x0f25abf6, 0xc1b334b5, 0x9933d662,
+    0x30b580c1, 0x68356216, 0x23be5c5c, 0x7b3ebe8b, 0xd2b8e828,
+    0x8a380aff, 0x4e95d7af, 0x16153578, 0xbf9363db, 0xe713810c,
+    0xac98bf46, 0xf4185d91, 0x5d9e0b32, 0x051ee9e5, 0xcb8876a6,
+    0x93089471, 0x3a8ec2d2, 0x620e2005, 0x29851e4f, 0x7105fc98,
+    0xd883aa3b, 0x800348ec, 0x783419d7, 0x20b4fb00, 0x8932ada3,
+    0xd1b24f74, 0x9a39713e, 0xc2b993e9, 0x6b3fc54a, 0x33bf279d,
+    0xfd29b8de, 0xa5a95a09, 0x0c2f0caa, 0x54afee7d, 0x1f24d037,
+    0x47a432e0, 0xee226443, 0xb6a28694, 0x720f5bc4, 0x2a8fb913,
+    0x8309efb0, 0xdb890d67, 0x9002332d, 0xc882d1fa, 0x61048759,
+    0x3984658e, 0xf712facd, 0xaf92181a, 0x06144eb9, 0x5e94ac6e,
+    0x151f9224, 0x4d9f70f3, 0xe4192650, 0xbc99c487, 0x6c429df1,
+    0x34c27f26, 0x9d442985, 0xc5c4cb52, 0x8e4ff518, 0xd6cf17cf,
+    0x7f49416c, 0x27c9a3bb, 0xe95f3cf8, 0xb1dfde2f, 0x1859888c,
+    0x40d96a5b, 0x0b525411, 0x53d2b6c6, 0xfa54e065, 0xa2d402b2,
+    0x6679dfe2, 0x3ef93d35, 0x977f6b96, 0xcfff8941, 0x8474b70b,
+    0xdcf455dc, 0x7572037f, 0x2df2e1a8, 0xe3647eeb, 0xbbe49c3c,
+    0x1262ca9f, 0x4ae22848, 0x01691602, 0x59e9f4d5, 0xf06fa276,
+    0xa8ef40a1},
+   {0x00000000, 0x463b6765, 0x8c76ceca, 0xca4da9af, 0x59ebed4e,
+    0x1fd08a2b, 0xd59d2384, 0x93a644e1, 0xb2d6db9d, 0xf4edbcf8,
+    0x3ea01557, 0x789b7232, 0xeb3d36d3, 0xad0651b6, 0x674bf819,
+    0x21709f7c, 0x25abc6e0, 0x6390a185, 0xa9dd082a, 0xefe66f4f,
+    0x7c402bae, 0x3a7b4ccb, 0xf036e564, 0xb60d8201, 0x977d1d7d,
+    0xd1467a18, 0x1b0bd3b7, 0x5d30b4d2, 0xce96f033, 0x88ad9756,
+    0x42e03ef9, 0x04db599c, 0x0b50fc1a, 0x4d6b9b7f, 0x872632d0,
+    0xc11d55b5, 0x52bb1154, 0x14807631, 0xdecddf9e, 0x98f6b8fb,
+    0xb9862787, 0xffbd40e2, 0x35f0e94d, 0x73cb8e28, 0xe06dcac9,
+    0xa656adac, 0x6c1b0403, 0x2a206366, 0x2efb3afa, 0x68c05d9f,
+    0xa28df430, 0xe4b69355, 0x7710d7b4, 0x312bb0d1, 0xfb66197e,
+    0xbd5d7e1b, 0x9c2de167, 0xda168602, 0x105b2fad, 0x566048c8,
+    0xc5c60c29, 0x83fd6b4c, 0x49b0c2e3, 0x0f8ba586, 0x16a0f835,
+    0x509b9f50, 0x9ad636ff, 0xdced519a, 0x4f4b157b, 0x0970721e,
+    0xc33ddbb1, 0x8506bcd4, 0xa47623a8, 0xe24d44cd, 0x2800ed62,
+    0x6e3b8a07, 0xfd9dcee6, 0xbba6a983, 0x71eb002c, 0x37d06749,
+    0x330b3ed5, 0x753059b0, 0xbf7df01f, 0xf946977a, 0x6ae0d39b,
+    0x2cdbb4fe, 0xe6961d51, 0xa0ad7a34, 0x81dde548, 0xc7e6822d,
+    0x0dab2b82, 0x4b904ce7, 0xd8360806, 0x9e0d6f63, 0x5440c6cc,
+    0x127ba1a9, 0x1df0042f, 0x5bcb634a, 0x9186cae5, 0xd7bdad80,
+    0x441be961, 0x02208e04, 0xc86d27ab, 0x8e5640ce, 0xaf26dfb2,
+    0xe91db8d7, 0x23501178, 0x656b761d, 0xf6cd32fc, 0xb0f65599,
+    0x7abbfc36, 0x3c809b53, 0x385bc2cf, 0x7e60a5aa, 0xb42d0c05,
+    0xf2166b60, 0x61b02f81, 0x278b48e4, 0xedc6e14b, 0xabfd862e,
+    0x8a8d1952, 0xccb67e37, 0x06fbd798, 0x40c0b0fd, 0xd366f41c,
+    0x955d9379, 0x5f103ad6, 0x192b5db3, 0x2c40f16b, 0x6a7b960e,
+    0xa0363fa1, 0xe60d58c4, 0x75ab1c25, 0x33907b40, 0xf9ddd2ef,
+    0xbfe6b58a, 0x9e962af6, 0xd8ad4d93, 0x12e0e43c, 0x54db8359,
+    0xc77dc7b8, 0x8146a0dd, 0x4b0b0972, 0x0d306e17, 0x09eb378b,
+    0x4fd050ee, 0x859df941, 0xc3a69e24, 0x5000dac5, 0x163bbda0,
+    0xdc76140f, 0x9a4d736a, 0xbb3dec16, 0xfd068b73, 0x374b22dc,
+    0x717045b9, 0xe2d60158, 0xa4ed663d, 0x6ea0cf92, 0x289ba8f7,
+    0x27100d71, 0x612b6a14, 0xab66c3bb, 0xed5da4de, 0x7efbe03f,
+    0x38c0875a, 0xf28d2ef5, 0xb4b64990, 0x95c6d6ec, 0xd3fdb189,
+    0x19b01826, 0x5f8b7f43, 0xcc2d3ba2, 0x8a165cc7, 0x405bf568,
+    0x0660920d, 0x02bbcb91, 0x4480acf4, 0x8ecd055b, 0xc8f6623e,
+    0x5b5026df, 0x1d6b41ba, 0xd726e815, 0x911d8f70, 0xb06d100c,
+    0xf6567769, 0x3c1bdec6, 0x7a20b9a3, 0xe986fd42, 0xafbd9a27,
+    0x65f03388, 0x23cb54ed, 0x3ae0095e, 0x7cdb6e3b, 0xb696c794,
+    0xf0ada0f1, 0x630be410, 0x25308375, 0xef7d2ada, 0xa9464dbf,
+    0x8836d2c3, 0xce0db5a6, 0x04401c09, 0x427b7b6c, 0xd1dd3f8d,
+    0x97e658e8, 0x5dabf147, 0x1b909622, 0x1f4bcfbe, 0x5970a8db,
+    0x933d0174, 0xd5066611, 0x46a022f0, 0x009b4595, 0xcad6ec3a,
+    0x8ced8b5f, 0xad9d1423, 0xeba67346, 0x21ebdae9, 0x67d0bd8c,
+    0xf476f96d, 0xb24d9e08, 0x780037a7, 0x3e3b50c2, 0x31b0f544,
+    0x778b9221, 0xbdc63b8e, 0xfbfd5ceb, 0x685b180a, 0x2e607f6f,
+    0xe42dd6c0, 0xa216b1a5, 0x83662ed9, 0xc55d49bc, 0x0f10e013,
+    0x492b8776, 0xda8dc397, 0x9cb6a4f2, 0x56fb0d5d, 0x10c06a38,
+    0x141b33a4, 0x522054c1, 0x986dfd6e, 0xde569a0b, 0x4df0deea,
+    0x0bcbb98f, 0xc1861020, 0x87bd7745, 0xa6cde839, 0xe0f68f5c,
+    0x2abb26f3, 0x6c804196, 0xff260577, 0xb91d6212, 0x7350cbbd,
+    0x356bacd8}};
+
+#endif
+
+#endif
+
+#if N == 6
+
+#if W == 8
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0x3db1ecdc, 0x7b63d9b8, 0x46d23564, 0xf6c7b370,
+    0xcb765fac, 0x8da46ac8, 0xb0158614, 0x36fe60a1, 0x0b4f8c7d,
+    0x4d9db919, 0x702c55c5, 0xc039d3d1, 0xfd883f0d, 0xbb5a0a69,
+    0x86ebe6b5, 0x6dfcc142, 0x504d2d9e, 0x169f18fa, 0x2b2ef426,
+    0x9b3b7232, 0xa68a9eee, 0xe058ab8a, 0xdde94756, 0x5b02a1e3,
+    0x66b34d3f, 0x2061785b, 0x1dd09487, 0xadc51293, 0x9074fe4f,
+    0xd6a6cb2b, 0xeb1727f7, 0xdbf98284, 0xe6486e58, 0xa09a5b3c,
+    0x9d2bb7e0, 0x2d3e31f4, 0x108fdd28, 0x565de84c, 0x6bec0490,
+    0xed07e225, 0xd0b60ef9, 0x96643b9d, 0xabd5d741, 0x1bc05155,
+    0x2671bd89, 0x60a388ed, 0x5d126431, 0xb60543c6, 0x8bb4af1a,
+    0xcd669a7e, 0xf0d776a2, 0x40c2f0b6, 0x7d731c6a, 0x3ba1290e,
+    0x0610c5d2, 0x80fb2367, 0xbd4acfbb, 0xfb98fadf, 0xc6291603,
+    0x763c9017, 0x4b8d7ccb, 0x0d5f49af, 0x30eea573, 0x6c820349,
+    0x5133ef95, 0x17e1daf1, 0x2a50362d, 0x9a45b039, 0xa7f45ce5,
+    0xe1266981, 0xdc97855d, 0x5a7c63e8, 0x67cd8f34, 0x211fba50,
+    0x1cae568c, 0xacbbd098, 0x910a3c44, 0xd7d80920, 0xea69e5fc,
+    0x017ec20b, 0x3ccf2ed7, 0x7a1d1bb3, 0x47acf76f, 0xf7b9717b,
+    0xca089da7, 0x8cdaa8c3, 0xb16b441f, 0x3780a2aa, 0x0a314e76,
+    0x4ce37b12, 0x715297ce, 0xc14711da, 0xfcf6fd06, 0xba24c862,
+    0x879524be, 0xb77b81cd, 0x8aca6d11, 0xcc185875, 0xf1a9b4a9,
+    0x41bc32bd, 0x7c0dde61, 0x3adfeb05, 0x076e07d9, 0x8185e16c,
+    0xbc340db0, 0xfae638d4, 0xc757d408, 0x7742521c, 0x4af3bec0,
+    0x0c218ba4, 0x31906778, 0xda87408f, 0xe736ac53, 0xa1e49937,
+    0x9c5575eb, 0x2c40f3ff, 0x11f11f23, 0x57232a47, 0x6a92c69b,
+    0xec79202e, 0xd1c8ccf2, 0x971af996, 0xaaab154a, 0x1abe935e,
+    0x270f7f82, 0x61dd4ae6, 0x5c6ca63a, 0xd9040692, 0xe4b5ea4e,
+    0xa267df2a, 0x9fd633f6, 0x2fc3b5e2, 0x1272593e, 0x54a06c5a,
+    0x69118086, 0xeffa6633, 0xd24b8aef, 0x9499bf8b, 0xa9285357,
+    0x193dd543, 0x248c399f, 0x625e0cfb, 0x5fefe027, 0xb4f8c7d0,
+    0x89492b0c, 0xcf9b1e68, 0xf22af2b4, 0x423f74a0, 0x7f8e987c,
+    0x395cad18, 0x04ed41c4, 0x8206a771, 0xbfb74bad, 0xf9657ec9,
+    0xc4d49215, 0x74c11401, 0x4970f8dd, 0x0fa2cdb9, 0x32132165,
+    0x02fd8416, 0x3f4c68ca, 0x799e5dae, 0x442fb172, 0xf43a3766,
+    0xc98bdbba, 0x8f59eede, 0xb2e80202, 0x3403e4b7, 0x09b2086b,
+    0x4f603d0f, 0x72d1d1d3, 0xc2c457c7, 0xff75bb1b, 0xb9a78e7f,
+    0x841662a3, 0x6f014554, 0x52b0a988, 0x14629cec, 0x29d37030,
+    0x99c6f624, 0xa4771af8, 0xe2a52f9c, 0xdf14c340, 0x59ff25f5,
+    0x644ec929, 0x229cfc4d, 0x1f2d1091, 0xaf389685, 0x92897a59,
+    0xd45b4f3d, 0xe9eaa3e1, 0xb58605db, 0x8837e907, 0xcee5dc63,
+    0xf35430bf, 0x4341b6ab, 0x7ef05a77, 0x38226f13, 0x059383cf,
+    0x8378657a, 0xbec989a6, 0xf81bbcc2, 0xc5aa501e, 0x75bfd60a,
+    0x480e3ad6, 0x0edc0fb2, 0x336de36e, 0xd87ac499, 0xe5cb2845,
+    0xa3191d21, 0x9ea8f1fd, 0x2ebd77e9, 0x130c9b35, 0x55deae51,
+    0x686f428d, 0xee84a438, 0xd33548e4, 0x95e77d80, 0xa856915c,
+    0x18431748, 0x25f2fb94, 0x6320cef0, 0x5e91222c, 0x6e7f875f,
+    0x53ce6b83, 0x151c5ee7, 0x28adb23b, 0x98b8342f, 0xa509d8f3,
+    0xe3dbed97, 0xde6a014b, 0x5881e7fe, 0x65300b22, 0x23e23e46,
+    0x1e53d29a, 0xae46548e, 0x93f7b852, 0xd5258d36, 0xe89461ea,
+    0x0383461d, 0x3e32aac1, 0x78e09fa5, 0x45517379, 0xf544f56d,
+    0xc8f519b1, 0x8e272cd5, 0xb396c009, 0x357d26bc, 0x08ccca60,
+    0x4e1eff04, 0x73af13d8, 0xc3ba95cc, 0xfe0b7910, 0xb8d94c74,
+    0x8568a0a8},
+   {0x00000000, 0x69790b65, 0xd2f216ca, 0xbb8b1daf, 0x7e952bd5,
+    0x17ec20b0, 0xac673d1f, 0xc51e367a, 0xfd2a57aa, 0x94535ccf,
+    0x2fd84160, 0x46a14a05, 0x83bf7c7f, 0xeac6771a, 0x514d6ab5,
+    0x383461d0, 0x2125a915, 0x485ca270, 0xf3d7bfdf, 0x9aaeb4ba,
+    0x5fb082c0, 0x36c989a5, 0x8d42940a, 0xe43b9f6f, 0xdc0ffebf,
+    0xb576f5da, 0x0efde875, 0x6784e310, 0xa29ad56a, 0xcbe3de0f,
+    0x7068c3a0, 0x1911c8c5, 0x424b522a, 0x2b32594f, 0x90b944e0,
+    0xf9c04f85, 0x3cde79ff, 0x55a7729a, 0xee2c6f35, 0x87556450,
+    0xbf610580, 0xd6180ee5, 0x6d93134a, 0x04ea182f, 0xc1f42e55,
+    0xa88d2530, 0x1306389f, 0x7a7f33fa, 0x636efb3f, 0x0a17f05a,
+    0xb19cedf5, 0xd8e5e690, 0x1dfbd0ea, 0x7482db8f, 0xcf09c620,
+    0xa670cd45, 0x9e44ac95, 0xf73da7f0, 0x4cb6ba5f, 0x25cfb13a,
+    0xe0d18740, 0x89a88c25, 0x3223918a, 0x5b5a9aef, 0x8496a454,
+    0xedefaf31, 0x5664b29e, 0x3f1db9fb, 0xfa038f81, 0x937a84e4,
+    0x28f1994b, 0x4188922e, 0x79bcf3fe, 0x10c5f89b, 0xab4ee534,
+    0xc237ee51, 0x0729d82b, 0x6e50d34e, 0xd5dbcee1, 0xbca2c584,
+    0xa5b30d41, 0xccca0624, 0x77411b8b, 0x1e3810ee, 0xdb262694,
+    0xb25f2df1, 0x09d4305e, 0x60ad3b3b, 0x58995aeb, 0x31e0518e,
+    0x8a6b4c21, 0xe3124744, 0x260c713e, 0x4f757a5b, 0xf4fe67f4,
+    0x9d876c91, 0xc6ddf67e, 0xafa4fd1b, 0x142fe0b4, 0x7d56ebd1,
+    0xb848ddab, 0xd131d6ce, 0x6abacb61, 0x03c3c004, 0x3bf7a1d4,
+    0x528eaab1, 0xe905b71e, 0x807cbc7b, 0x45628a01, 0x2c1b8164,
+    0x97909ccb, 0xfee997ae, 0xe7f85f6b, 0x8e81540e, 0x350a49a1,
+    0x5c7342c4, 0x996d74be, 0xf0147fdb, 0x4b9f6274, 0x22e66911,
+    0x1ad208c1, 0x73ab03a4, 0xc8201e0b, 0xa159156e, 0x64472314,
+    0x0d3e2871, 0xb6b535de, 0xdfcc3ebb, 0xd25c4ee9, 0xbb25458c,
+    0x00ae5823, 0x69d75346, 0xacc9653c, 0xc5b06e59, 0x7e3b73f6,
+    0x17427893, 0x2f761943, 0x460f1226, 0xfd840f89, 0x94fd04ec,
+    0x51e33296, 0x389a39f3, 0x8311245c, 0xea682f39, 0xf379e7fc,
+    0x9a00ec99, 0x218bf136, 0x48f2fa53, 0x8deccc29, 0xe495c74c,
+    0x5f1edae3, 0x3667d186, 0x0e53b056, 0x672abb33, 0xdca1a69c,
+    0xb5d8adf9, 0x70c69b83, 0x19bf90e6, 0xa2348d49, 0xcb4d862c,
+    0x90171cc3, 0xf96e17a6, 0x42e50a09, 0x2b9c016c, 0xee823716,
+    0x87fb3c73, 0x3c7021dc, 0x55092ab9, 0x6d3d4b69, 0x0444400c,
+    0xbfcf5da3, 0xd6b656c6, 0x13a860bc, 0x7ad16bd9, 0xc15a7676,
+    0xa8237d13, 0xb132b5d6, 0xd84bbeb3, 0x63c0a31c, 0x0ab9a879,
+    0xcfa79e03, 0xa6de9566, 0x1d5588c9, 0x742c83ac, 0x4c18e27c,
+    0x2561e919, 0x9eeaf4b6, 0xf793ffd3, 0x328dc9a9, 0x5bf4c2cc,
+    0xe07fdf63, 0x8906d406, 0x56caeabd, 0x3fb3e1d8, 0x8438fc77,
+    0xed41f712, 0x285fc168, 0x4126ca0d, 0xfaadd7a2, 0x93d4dcc7,
+    0xabe0bd17, 0xc299b672, 0x7912abdd, 0x106ba0b8, 0xd57596c2,
+    0xbc0c9da7, 0x07878008, 0x6efe8b6d, 0x77ef43a8, 0x1e9648cd,
+    0xa51d5562, 0xcc645e07, 0x097a687d, 0x60036318, 0xdb887eb7,
+    0xb2f175d2, 0x8ac51402, 0xe3bc1f67, 0x583702c8, 0x314e09ad,
+    0xf4503fd7, 0x9d2934b2, 0x26a2291d, 0x4fdb2278, 0x1481b897,
+    0x7df8b3f2, 0xc673ae5d, 0xaf0aa538, 0x6a149342, 0x036d9827,
+    0xb8e68588, 0xd19f8eed, 0xe9abef3d, 0x80d2e458, 0x3b59f9f7,
+    0x5220f292, 0x973ec4e8, 0xfe47cf8d, 0x45ccd222, 0x2cb5d947,
+    0x35a41182, 0x5cdd1ae7, 0xe7560748, 0x8e2f0c2d, 0x4b313a57,
+    0x22483132, 0x99c32c9d, 0xf0ba27f8, 0xc88e4628, 0xa1f74d4d,
+    0x1a7c50e2, 0x73055b87, 0xb61b6dfd, 0xdf626698, 0x64e97b37,
+    0x0d907052},
+   {0x00000000, 0x7fc99b93, 0xff933726, 0x805aacb5, 0x2457680d,
+    0x5b9ef39e, 0xdbc45f2b, 0xa40dc4b8, 0x48aed01a, 0x37674b89,
+    0xb73de73c, 0xc8f47caf, 0x6cf9b817, 0x13302384, 0x936a8f31,
+    0xeca314a2, 0x915da034, 0xee943ba7, 0x6ece9712, 0x11070c81,
+    0xb50ac839, 0xcac353aa, 0x4a99ff1f, 0x3550648c, 0xd9f3702e,
+    0xa63aebbd, 0x26604708, 0x59a9dc9b, 0xfda41823, 0x826d83b0,
+    0x02372f05, 0x7dfeb496, 0xf9ca4629, 0x8603ddba, 0x0659710f,
+    0x7990ea9c, 0xdd9d2e24, 0xa254b5b7, 0x220e1902, 0x5dc78291,
+    0xb1649633, 0xcead0da0, 0x4ef7a115, 0x313e3a86, 0x9533fe3e,
+    0xeafa65ad, 0x6aa0c918, 0x1569528b, 0x6897e61d, 0x175e7d8e,
+    0x9704d13b, 0xe8cd4aa8, 0x4cc08e10, 0x33091583, 0xb353b936,
+    0xcc9a22a5, 0x20393607, 0x5ff0ad94, 0xdfaa0121, 0xa0639ab2,
+    0x046e5e0a, 0x7ba7c599, 0xfbfd692c, 0x8434f2bf, 0x28e58a13,
+    0x572c1180, 0xd776bd35, 0xa8bf26a6, 0x0cb2e21e, 0x737b798d,
+    0xf321d538, 0x8ce84eab, 0x604b5a09, 0x1f82c19a, 0x9fd86d2f,
+    0xe011f6bc, 0x441c3204, 0x3bd5a997, 0xbb8f0522, 0xc4469eb1,
+    0xb9b82a27, 0xc671b1b4, 0x462b1d01, 0x39e28692, 0x9def422a,
+    0xe226d9b9, 0x627c750c, 0x1db5ee9f, 0xf116fa3d, 0x8edf61ae,
+    0x0e85cd1b, 0x714c5688, 0xd5419230, 0xaa8809a3, 0x2ad2a516,
+    0x551b3e85, 0xd12fcc3a, 0xaee657a9, 0x2ebcfb1c, 0x5175608f,
+    0xf578a437, 0x8ab13fa4, 0x0aeb9311, 0x75220882, 0x99811c20,
+    0xe64887b3, 0x66122b06, 0x19dbb095, 0xbdd6742d, 0xc21fefbe,
+    0x4245430b, 0x3d8cd898, 0x40726c0e, 0x3fbbf79d, 0xbfe15b28,
+    0xc028c0bb, 0x64250403, 0x1bec9f90, 0x9bb63325, 0xe47fa8b6,
+    0x08dcbc14, 0x77152787, 0xf74f8b32, 0x888610a1, 0x2c8bd419,
+    0x53424f8a, 0xd318e33f, 0xacd178ac, 0x51cb1426, 0x2e028fb5,
+    0xae582300, 0xd191b893, 0x759c7c2b, 0x0a55e7b8, 0x8a0f4b0d,
+    0xf5c6d09e, 0x1965c43c, 0x66ac5faf, 0xe6f6f31a, 0x993f6889,
+    0x3d32ac31, 0x42fb37a2, 0xc2a19b17, 0xbd680084, 0xc096b412,
+    0xbf5f2f81, 0x3f058334, 0x40cc18a7, 0xe4c1dc1f, 0x9b08478c,
+    0x1b52eb39, 0x649b70aa, 0x88386408, 0xf7f1ff9b, 0x77ab532e,
+    0x0862c8bd, 0xac6f0c05, 0xd3a69796, 0x53fc3b23, 0x2c35a0b0,
+    0xa801520f, 0xd7c8c99c, 0x57926529, 0x285bfeba, 0x8c563a02,
+    0xf39fa191, 0x73c50d24, 0x0c0c96b7, 0xe0af8215, 0x9f661986,
+    0x1f3cb533, 0x60f52ea0, 0xc4f8ea18, 0xbb31718b, 0x3b6bdd3e,
+    0x44a246ad, 0x395cf23b, 0x469569a8, 0xc6cfc51d, 0xb9065e8e,
+    0x1d0b9a36, 0x62c201a5, 0xe298ad10, 0x9d513683, 0x71f22221,
+    0x0e3bb9b2, 0x8e611507, 0xf1a88e94, 0x55a54a2c, 0x2a6cd1bf,
+    0xaa367d0a, 0xd5ffe699, 0x792e9e35, 0x06e705a6, 0x86bda913,
+    0xf9743280, 0x5d79f638, 0x22b06dab, 0xa2eac11e, 0xdd235a8d,
+    0x31804e2f, 0x4e49d5bc, 0xce137909, 0xb1dae29a, 0x15d72622,
+    0x6a1ebdb1, 0xea441104, 0x958d8a97, 0xe8733e01, 0x97baa592,
+    0x17e00927, 0x682992b4, 0xcc24560c, 0xb3edcd9f, 0x33b7612a,
+    0x4c7efab9, 0xa0ddee1b, 0xdf147588, 0x5f4ed93d, 0x208742ae,
+    0x848a8616, 0xfb431d85, 0x7b19b130, 0x04d02aa3, 0x80e4d81c,
+    0xff2d438f, 0x7f77ef3a, 0x00be74a9, 0xa4b3b011, 0xdb7a2b82,
+    0x5b208737, 0x24e91ca4, 0xc84a0806, 0xb7839395, 0x37d93f20,
+    0x4810a4b3, 0xec1d600b, 0x93d4fb98, 0x138e572d, 0x6c47ccbe,
+    0x11b97828, 0x6e70e3bb, 0xee2a4f0e, 0x91e3d49d, 0x35ee1025,
+    0x4a278bb6, 0xca7d2703, 0xb5b4bc90, 0x5917a832, 0x26de33a1,
+    0xa6849f14, 0xd94d0487, 0x7d40c03f, 0x02895bac, 0x82d3f719,
+    0xfd1a6c8a},
+   {0x00000000, 0xa396284c, 0x9c5d56d9, 0x3fcb7e95, 0xe3cbabf3,
+    0x405d83bf, 0x7f96fd2a, 0xdc00d566, 0x1ce651a7, 0xbf7079eb,
+    0x80bb077e, 0x232d2f32, 0xff2dfa54, 0x5cbbd218, 0x6370ac8d,
+    0xc0e684c1, 0x39cca34e, 0x9a5a8b02, 0xa591f597, 0x0607dddb,
+    0xda0708bd, 0x799120f1, 0x465a5e64, 0xe5cc7628, 0x252af2e9,
+    0x86bcdaa5, 0xb977a430, 0x1ae18c7c, 0xc6e1591a, 0x65777156,
+    0x5abc0fc3, 0xf92a278f, 0x7399469c, 0xd00f6ed0, 0xefc41045,
+    0x4c523809, 0x9052ed6f, 0x33c4c523, 0x0c0fbbb6, 0xaf9993fa,
+    0x6f7f173b, 0xcce93f77, 0xf32241e2, 0x50b469ae, 0x8cb4bcc8,
+    0x2f229484, 0x10e9ea11, 0xb37fc25d, 0x4a55e5d2, 0xe9c3cd9e,
+    0xd608b30b, 0x759e9b47, 0xa99e4e21, 0x0a08666d, 0x35c318f8,
+    0x965530b4, 0x56b3b475, 0xf5259c39, 0xcaeee2ac, 0x6978cae0,
+    0xb5781f86, 0x16ee37ca, 0x2925495f, 0x8ab36113, 0xe7328d38,
+    0x44a4a574, 0x7b6fdbe1, 0xd8f9f3ad, 0x04f926cb, 0xa76f0e87,
+    0x98a47012, 0x3b32585e, 0xfbd4dc9f, 0x5842f4d3, 0x67898a46,
+    0xc41fa20a, 0x181f776c, 0xbb895f20, 0x844221b5, 0x27d409f9,
+    0xdefe2e76, 0x7d68063a, 0x42a378af, 0xe13550e3, 0x3d358585,
+    0x9ea3adc9, 0xa168d35c, 0x02fefb10, 0xc2187fd1, 0x618e579d,
+    0x5e452908, 0xfdd30144, 0x21d3d422, 0x8245fc6e, 0xbd8e82fb,
+    0x1e18aab7, 0x94abcba4, 0x373de3e8, 0x08f69d7d, 0xab60b531,
+    0x77606057, 0xd4f6481b, 0xeb3d368e, 0x48ab1ec2, 0x884d9a03,
+    0x2bdbb24f, 0x1410ccda, 0xb786e496, 0x6b8631f0, 0xc81019bc,
+    0xf7db6729, 0x544d4f65, 0xad6768ea, 0x0ef140a6, 0x313a3e33,
+    0x92ac167f, 0x4eacc319, 0xed3aeb55, 0xd2f195c0, 0x7167bd8c,
+    0xb181394d, 0x12171101, 0x2ddc6f94, 0x8e4a47d8, 0x524a92be,
+    0xf1dcbaf2, 0xce17c467, 0x6d81ec2b, 0x15141c31, 0xb682347d,
+    0x89494ae8, 0x2adf62a4, 0xf6dfb7c2, 0x55499f8e, 0x6a82e11b,
+    0xc914c957, 0x09f24d96, 0xaa6465da, 0x95af1b4f, 0x36393303,
+    0xea39e665, 0x49afce29, 0x7664b0bc, 0xd5f298f0, 0x2cd8bf7f,
+    0x8f4e9733, 0xb085e9a6, 0x1313c1ea, 0xcf13148c, 0x6c853cc0,
+    0x534e4255, 0xf0d86a19, 0x303eeed8, 0x93a8c694, 0xac63b801,
+    0x0ff5904d, 0xd3f5452b, 0x70636d67, 0x4fa813f2, 0xec3e3bbe,
+    0x668d5aad, 0xc51b72e1, 0xfad00c74, 0x59462438, 0x8546f15e,
+    0x26d0d912, 0x191ba787, 0xba8d8fcb, 0x7a6b0b0a, 0xd9fd2346,
+    0xe6365dd3, 0x45a0759f, 0x99a0a0f9, 0x3a3688b5, 0x05fdf620,
+    0xa66bde6c, 0x5f41f9e3, 0xfcd7d1af, 0xc31caf3a, 0x608a8776,
+    0xbc8a5210, 0x1f1c7a5c, 0x20d704c9, 0x83412c85, 0x43a7a844,
+    0xe0318008, 0xdffafe9d, 0x7c6cd6d1, 0xa06c03b7, 0x03fa2bfb,
+    0x3c31556e, 0x9fa77d22, 0xf2269109, 0x51b0b945, 0x6e7bc7d0,
+    0xcdedef9c, 0x11ed3afa, 0xb27b12b6, 0x8db06c23, 0x2e26446f,
+    0xeec0c0ae, 0x4d56e8e2, 0x729d9677, 0xd10bbe3b, 0x0d0b6b5d,
+    0xae9d4311, 0x91563d84, 0x32c015c8, 0xcbea3247, 0x687c1a0b,
+    0x57b7649e, 0xf4214cd2, 0x282199b4, 0x8bb7b1f8, 0xb47ccf6d,
+    0x17eae721, 0xd70c63e0, 0x749a4bac, 0x4b513539, 0xe8c71d75,
+    0x34c7c813, 0x9751e05f, 0xa89a9eca, 0x0b0cb686, 0x81bfd795,
+    0x2229ffd9, 0x1de2814c, 0xbe74a900, 0x62747c66, 0xc1e2542a,
+    0xfe292abf, 0x5dbf02f3, 0x9d598632, 0x3ecfae7e, 0x0104d0eb,
+    0xa292f8a7, 0x7e922dc1, 0xdd04058d, 0xe2cf7b18, 0x41595354,
+    0xb87374db, 0x1be55c97, 0x242e2202, 0x87b80a4e, 0x5bb8df28,
+    0xf82ef764, 0xc7e589f1, 0x6473a1bd, 0xa495257c, 0x07030d30,
+    0x38c873a5, 0x9b5e5be9, 0x475e8e8f, 0xe4c8a6c3, 0xdb03d856,
+    0x7895f01a},
+   {0x00000000, 0x2a283862, 0x545070c4, 0x7e7848a6, 0xa8a0e188,
+    0x8288d9ea, 0xfcf0914c, 0xd6d8a92e, 0x8a30c551, 0xa018fd33,
+    0xde60b595, 0xf4488df7, 0x229024d9, 0x08b81cbb, 0x76c0541d,
+    0x5ce86c7f, 0xcf108ce3, 0xe538b481, 0x9b40fc27, 0xb168c445,
+    0x67b06d6b, 0x4d985509, 0x33e01daf, 0x19c825cd, 0x452049b2,
+    0x6f0871d0, 0x11703976, 0x3b580114, 0xed80a83a, 0xc7a89058,
+    0xb9d0d8fe, 0x93f8e09c, 0x45501f87, 0x6f7827e5, 0x11006f43,
+    0x3b285721, 0xedf0fe0f, 0xc7d8c66d, 0xb9a08ecb, 0x9388b6a9,
+    0xcf60dad6, 0xe548e2b4, 0x9b30aa12, 0xb1189270, 0x67c03b5e,
+    0x4de8033c, 0x33904b9a, 0x19b873f8, 0x8a409364, 0xa068ab06,
+    0xde10e3a0, 0xf438dbc2, 0x22e072ec, 0x08c84a8e, 0x76b00228,
+    0x5c983a4a, 0x00705635, 0x2a586e57, 0x542026f1, 0x7e081e93,
+    0xa8d0b7bd, 0x82f88fdf, 0xfc80c779, 0xd6a8ff1b, 0x8aa03f0e,
+    0xa088076c, 0xdef04fca, 0xf4d877a8, 0x2200de86, 0x0828e6e4,
+    0x7650ae42, 0x5c789620, 0x0090fa5f, 0x2ab8c23d, 0x54c08a9b,
+    0x7ee8b2f9, 0xa8301bd7, 0x821823b5, 0xfc606b13, 0xd6485371,
+    0x45b0b3ed, 0x6f988b8f, 0x11e0c329, 0x3bc8fb4b, 0xed105265,
+    0xc7386a07, 0xb94022a1, 0x93681ac3, 0xcf8076bc, 0xe5a84ede,
+    0x9bd00678, 0xb1f83e1a, 0x67209734, 0x4d08af56, 0x3370e7f0,
+    0x1958df92, 0xcff02089, 0xe5d818eb, 0x9ba0504d, 0xb188682f,
+    0x6750c101, 0x4d78f963, 0x3300b1c5, 0x192889a7, 0x45c0e5d8,
+    0x6fe8ddba, 0x1190951c, 0x3bb8ad7e, 0xed600450, 0xc7483c32,
+    0xb9307494, 0x93184cf6, 0x00e0ac6a, 0x2ac89408, 0x54b0dcae,
+    0x7e98e4cc, 0xa8404de2, 0x82687580, 0xfc103d26, 0xd6380544,
+    0x8ad0693b, 0xa0f85159, 0xde8019ff, 0xf4a8219d, 0x227088b3,
+    0x0858b0d1, 0x7620f877, 0x5c08c015, 0xce31785d, 0xe419403f,
+    0x9a610899, 0xb04930fb, 0x669199d5, 0x4cb9a1b7, 0x32c1e911,
+    0x18e9d173, 0x4401bd0c, 0x6e29856e, 0x1051cdc8, 0x3a79f5aa,
+    0xeca15c84, 0xc68964e6, 0xb8f12c40, 0x92d91422, 0x0121f4be,
+    0x2b09ccdc, 0x5571847a, 0x7f59bc18, 0xa9811536, 0x83a92d54,
+    0xfdd165f2, 0xd7f95d90, 0x8b1131ef, 0xa139098d, 0xdf41412b,
+    0xf5697949, 0x23b1d067, 0x0999e805, 0x77e1a0a3, 0x5dc998c1,
+    0x8b6167da, 0xa1495fb8, 0xdf31171e, 0xf5192f7c, 0x23c18652,
+    0x09e9be30, 0x7791f696, 0x5db9cef4, 0x0151a28b, 0x2b799ae9,
+    0x5501d24f, 0x7f29ea2d, 0xa9f14303, 0x83d97b61, 0xfda133c7,
+    0xd7890ba5, 0x4471eb39, 0x6e59d35b, 0x10219bfd, 0x3a09a39f,
+    0xecd10ab1, 0xc6f932d3, 0xb8817a75, 0x92a94217, 0xce412e68,
+    0xe469160a, 0x9a115eac, 0xb03966ce, 0x66e1cfe0, 0x4cc9f782,
+    0x32b1bf24, 0x18998746, 0x44914753, 0x6eb97f31, 0x10c13797,
+    0x3ae90ff5, 0xec31a6db, 0xc6199eb9, 0xb861d61f, 0x9249ee7d,
+    0xcea18202, 0xe489ba60, 0x9af1f2c6, 0xb0d9caa4, 0x6601638a,
+    0x4c295be8, 0x3251134e, 0x18792b2c, 0x8b81cbb0, 0xa1a9f3d2,
+    0xdfd1bb74, 0xf5f98316, 0x23212a38, 0x0909125a, 0x77715afc,
+    0x5d59629e, 0x01b10ee1, 0x2b993683, 0x55e17e25, 0x7fc94647,
+    0xa911ef69, 0x8339d70b, 0xfd419fad, 0xd769a7cf, 0x01c158d4,
+    0x2be960b6, 0x55912810, 0x7fb91072, 0xa961b95c, 0x8349813e,
+    0xfd31c998, 0xd719f1fa, 0x8bf19d85, 0xa1d9a5e7, 0xdfa1ed41,
+    0xf589d523, 0x23517c0d, 0x0979446f, 0x77010cc9, 0x5d2934ab,
+    0xced1d437, 0xe4f9ec55, 0x9a81a4f3, 0xb0a99c91, 0x667135bf,
+    0x4c590ddd, 0x3221457b, 0x18097d19, 0x44e11166, 0x6ec92904,
+    0x10b161a2, 0x3a9959c0, 0xec41f0ee, 0xc669c88c, 0xb811802a,
+    0x9239b848},
+   {0x00000000, 0x4713f6fb, 0x8e27edf6, 0xc9341b0d, 0xc73eddad,
+    0x802d2b56, 0x4919305b, 0x0e0ac6a0, 0x550cbd1b, 0x121f4be0,
+    0xdb2b50ed, 0x9c38a616, 0x923260b6, 0xd521964d, 0x1c158d40,
+    0x5b067bbb, 0xaa197a36, 0xed0a8ccd, 0x243e97c0, 0x632d613b,
+    0x6d27a79b, 0x2a345160, 0xe3004a6d, 0xa413bc96, 0xff15c72d,
+    0xb80631d6, 0x71322adb, 0x3621dc20, 0x382b1a80, 0x7f38ec7b,
+    0xb60cf776, 0xf11f018d, 0x8f43f22d, 0xc85004d6, 0x01641fdb,
+    0x4677e920, 0x487d2f80, 0x0f6ed97b, 0xc65ac276, 0x8149348d,
+    0xda4f4f36, 0x9d5cb9cd, 0x5468a2c0, 0x137b543b, 0x1d71929b,
+    0x5a626460, 0x93567f6d, 0xd4458996, 0x255a881b, 0x62497ee0,
+    0xab7d65ed, 0xec6e9316, 0xe26455b6, 0xa577a34d, 0x6c43b840,
+    0x2b504ebb, 0x70563500, 0x3745c3fb, 0xfe71d8f6, 0xb9622e0d,
+    0xb768e8ad, 0xf07b1e56, 0x394f055b, 0x7e5cf3a0, 0xc5f6e21b,
+    0x82e514e0, 0x4bd10fed, 0x0cc2f916, 0x02c83fb6, 0x45dbc94d,
+    0x8cefd240, 0xcbfc24bb, 0x90fa5f00, 0xd7e9a9fb, 0x1eddb2f6,
+    0x59ce440d, 0x57c482ad, 0x10d77456, 0xd9e36f5b, 0x9ef099a0,
+    0x6fef982d, 0x28fc6ed6, 0xe1c875db, 0xa6db8320, 0xa8d14580,
+    0xefc2b37b, 0x26f6a876, 0x61e55e8d, 0x3ae32536, 0x7df0d3cd,
+    0xb4c4c8c0, 0xf3d73e3b, 0xfdddf89b, 0xbace0e60, 0x73fa156d,
+    0x34e9e396, 0x4ab51036, 0x0da6e6cd, 0xc492fdc0, 0x83810b3b,
+    0x8d8bcd9b, 0xca983b60, 0x03ac206d, 0x44bfd696, 0x1fb9ad2d,
+    0x58aa5bd6, 0x919e40db, 0xd68db620, 0xd8877080, 0x9f94867b,
+    0x56a09d76, 0x11b36b8d, 0xe0ac6a00, 0xa7bf9cfb, 0x6e8b87f6,
+    0x2998710d, 0x2792b7ad, 0x60814156, 0xa9b55a5b, 0xeea6aca0,
+    0xb5a0d71b, 0xf2b321e0, 0x3b873aed, 0x7c94cc16, 0x729e0ab6,
+    0x358dfc4d, 0xfcb9e740, 0xbbaa11bb, 0x509cc277, 0x178f348c,
+    0xdebb2f81, 0x99a8d97a, 0x97a21fda, 0xd0b1e921, 0x1985f22c,
+    0x5e9604d7, 0x05907f6c, 0x42838997, 0x8bb7929a, 0xcca46461,
+    0xc2aea2c1, 0x85bd543a, 0x4c894f37, 0x0b9ab9cc, 0xfa85b841,
+    0xbd964eba, 0x74a255b7, 0x33b1a34c, 0x3dbb65ec, 0x7aa89317,
+    0xb39c881a, 0xf48f7ee1, 0xaf89055a, 0xe89af3a1, 0x21aee8ac,
+    0x66bd1e57, 0x68b7d8f7, 0x2fa42e0c, 0xe6903501, 0xa183c3fa,
+    0xdfdf305a, 0x98ccc6a1, 0x51f8ddac, 0x16eb2b57, 0x18e1edf7,
+    0x5ff21b0c, 0x96c60001, 0xd1d5f6fa, 0x8ad38d41, 0xcdc07bba,
+    0x04f460b7, 0x43e7964c, 0x4ded50ec, 0x0afea617, 0xc3cabd1a,
+    0x84d94be1, 0x75c64a6c, 0x32d5bc97, 0xfbe1a79a, 0xbcf25161,
+    0xb2f897c1, 0xf5eb613a, 0x3cdf7a37, 0x7bcc8ccc, 0x20caf777,
+    0x67d9018c, 0xaeed1a81, 0xe9feec7a, 0xe7f42ada, 0xa0e7dc21,
+    0x69d3c72c, 0x2ec031d7, 0x956a206c, 0xd279d697, 0x1b4dcd9a,
+    0x5c5e3b61, 0x5254fdc1, 0x15470b3a, 0xdc731037, 0x9b60e6cc,
+    0xc0669d77, 0x87756b8c, 0x4e417081, 0x0952867a, 0x075840da,
+    0x404bb621, 0x897fad2c, 0xce6c5bd7, 0x3f735a5a, 0x7860aca1,
+    0xb154b7ac, 0xf6474157, 0xf84d87f7, 0xbf5e710c, 0x766a6a01,
+    0x31799cfa, 0x6a7fe741, 0x2d6c11ba, 0xe4580ab7, 0xa34bfc4c,
+    0xad413aec, 0xea52cc17, 0x2366d71a, 0x647521e1, 0x1a29d241,
+    0x5d3a24ba, 0x940e3fb7, 0xd31dc94c, 0xdd170fec, 0x9a04f917,
+    0x5330e21a, 0x142314e1, 0x4f256f5a, 0x083699a1, 0xc10282ac,
+    0x86117457, 0x881bb2f7, 0xcf08440c, 0x063c5f01, 0x412fa9fa,
+    0xb030a877, 0xf7235e8c, 0x3e174581, 0x7904b37a, 0x770e75da,
+    0x301d8321, 0xf929982c, 0xbe3a6ed7, 0xe53c156c, 0xa22fe397,
+    0x6b1bf89a, 0x2c080e61, 0x2202c8c1, 0x65113e3a, 0xac252537,
+    0xeb36d3cc},
+   {0x00000000, 0xa13984ee, 0x99020f9d, 0x383b8b73, 0xe975197b,
+    0x484c9d95, 0x707716e6, 0xd14e9208, 0x099b34b7, 0xa8a2b059,
+    0x90993b2a, 0x31a0bfc4, 0xe0ee2dcc, 0x41d7a922, 0x79ec2251,
+    0xd8d5a6bf, 0x1336696e, 0xb20fed80, 0x8a3466f3, 0x2b0de21d,
+    0xfa437015, 0x5b7af4fb, 0x63417f88, 0xc278fb66, 0x1aad5dd9,
+    0xbb94d937, 0x83af5244, 0x2296d6aa, 0xf3d844a2, 0x52e1c04c,
+    0x6ada4b3f, 0xcbe3cfd1, 0x266cd2dc, 0x87555632, 0xbf6edd41,
+    0x1e5759af, 0xcf19cba7, 0x6e204f49, 0x561bc43a, 0xf72240d4,
+    0x2ff7e66b, 0x8ece6285, 0xb6f5e9f6, 0x17cc6d18, 0xc682ff10,
+    0x67bb7bfe, 0x5f80f08d, 0xfeb97463, 0x355abbb2, 0x94633f5c,
+    0xac58b42f, 0x0d6130c1, 0xdc2fa2c9, 0x7d162627, 0x452dad54,
+    0xe41429ba, 0x3cc18f05, 0x9df80beb, 0xa5c38098, 0x04fa0476,
+    0xd5b4967e, 0x748d1290, 0x4cb699e3, 0xed8f1d0d, 0x4cd9a5b8,
+    0xede02156, 0xd5dbaa25, 0x74e22ecb, 0xa5acbcc3, 0x0495382d,
+    0x3caeb35e, 0x9d9737b0, 0x4542910f, 0xe47b15e1, 0xdc409e92,
+    0x7d791a7c, 0xac378874, 0x0d0e0c9a, 0x353587e9, 0x940c0307,
+    0x5fefccd6, 0xfed64838, 0xc6edc34b, 0x67d447a5, 0xb69ad5ad,
+    0x17a35143, 0x2f98da30, 0x8ea15ede, 0x5674f861, 0xf74d7c8f,
+    0xcf76f7fc, 0x6e4f7312, 0xbf01e11a, 0x1e3865f4, 0x2603ee87,
+    0x873a6a69, 0x6ab57764, 0xcb8cf38a, 0xf3b778f9, 0x528efc17,
+    0x83c06e1f, 0x22f9eaf1, 0x1ac26182, 0xbbfbe56c, 0x632e43d3,
+    0xc217c73d, 0xfa2c4c4e, 0x5b15c8a0, 0x8a5b5aa8, 0x2b62de46,
+    0x13595535, 0xb260d1db, 0x79831e0a, 0xd8ba9ae4, 0xe0811197,
+    0x41b89579, 0x90f60771, 0x31cf839f, 0x09f408ec, 0xa8cd8c02,
+    0x70182abd, 0xd121ae53, 0xe91a2520, 0x4823a1ce, 0x996d33c6,
+    0x3854b728, 0x006f3c5b, 0xa156b8b5, 0x99b34b70, 0x388acf9e,
+    0x00b144ed, 0xa188c003, 0x70c6520b, 0xd1ffd6e5, 0xe9c45d96,
+    0x48fdd978, 0x90287fc7, 0x3111fb29, 0x092a705a, 0xa813f4b4,
+    0x795d66bc, 0xd864e252, 0xe05f6921, 0x4166edcf, 0x8a85221e,
+    0x2bbca6f0, 0x13872d83, 0xb2bea96d, 0x63f03b65, 0xc2c9bf8b,
+    0xfaf234f8, 0x5bcbb016, 0x831e16a9, 0x22279247, 0x1a1c1934,
+    0xbb259dda, 0x6a6b0fd2, 0xcb528b3c, 0xf369004f, 0x525084a1,
+    0xbfdf99ac, 0x1ee61d42, 0x26dd9631, 0x87e412df, 0x56aa80d7,
+    0xf7930439, 0xcfa88f4a, 0x6e910ba4, 0xb644ad1b, 0x177d29f5,
+    0x2f46a286, 0x8e7f2668, 0x5f31b460, 0xfe08308e, 0xc633bbfd,
+    0x670a3f13, 0xace9f0c2, 0x0dd0742c, 0x35ebff5f, 0x94d27bb1,
+    0x459ce9b9, 0xe4a56d57, 0xdc9ee624, 0x7da762ca, 0xa572c475,
+    0x044b409b, 0x3c70cbe8, 0x9d494f06, 0x4c07dd0e, 0xed3e59e0,
+    0xd505d293, 0x743c567d, 0xd56aeec8, 0x74536a26, 0x4c68e155,
+    0xed5165bb, 0x3c1ff7b3, 0x9d26735d, 0xa51df82e, 0x04247cc0,
+    0xdcf1da7f, 0x7dc85e91, 0x45f3d5e2, 0xe4ca510c, 0x3584c304,
+    0x94bd47ea, 0xac86cc99, 0x0dbf4877, 0xc65c87a6, 0x67650348,
+    0x5f5e883b, 0xfe670cd5, 0x2f299edd, 0x8e101a33, 0xb62b9140,
+    0x171215ae, 0xcfc7b311, 0x6efe37ff, 0x56c5bc8c, 0xf7fc3862,
+    0x26b2aa6a, 0x878b2e84, 0xbfb0a5f7, 0x1e892119, 0xf3063c14,
+    0x523fb8fa, 0x6a043389, 0xcb3db767, 0x1a73256f, 0xbb4aa181,
+    0x83712af2, 0x2248ae1c, 0xfa9d08a3, 0x5ba48c4d, 0x639f073e,
+    0xc2a683d0, 0x13e811d8, 0xb2d19536, 0x8aea1e45, 0x2bd39aab,
+    0xe030557a, 0x4109d194, 0x79325ae7, 0xd80bde09, 0x09454c01,
+    0xa87cc8ef, 0x9047439c, 0x317ec772, 0xe9ab61cd, 0x4892e523,
+    0x70a96e50, 0xd190eabe, 0x00de78b6, 0xa1e7fc58, 0x99dc772b,
+    0x38e5f3c5},
+   {0x00000000, 0xe81790a1, 0x0b5e2703, 0xe349b7a2, 0x16bc4e06,
+    0xfeabdea7, 0x1de26905, 0xf5f5f9a4, 0x2d789c0c, 0xc56f0cad,
+    0x2626bb0f, 0xce312bae, 0x3bc4d20a, 0xd3d342ab, 0x309af509,
+    0xd88d65a8, 0x5af13818, 0xb2e6a8b9, 0x51af1f1b, 0xb9b88fba,
+    0x4c4d761e, 0xa45ae6bf, 0x4713511d, 0xaf04c1bc, 0x7789a414,
+    0x9f9e34b5, 0x7cd78317, 0x94c013b6, 0x6135ea12, 0x89227ab3,
+    0x6a6bcd11, 0x827c5db0, 0xb5e27030, 0x5df5e091, 0xbebc5733,
+    0x56abc792, 0xa35e3e36, 0x4b49ae97, 0xa8001935, 0x40178994,
+    0x989aec3c, 0x708d7c9d, 0x93c4cb3f, 0x7bd35b9e, 0x8e26a23a,
+    0x6631329b, 0x85788539, 0x6d6f1598, 0xef134828, 0x0704d889,
+    0xe44d6f2b, 0x0c5aff8a, 0xf9af062e, 0x11b8968f, 0xf2f1212d,
+    0x1ae6b18c, 0xc26bd424, 0x2a7c4485, 0xc935f327, 0x21226386,
+    0xd4d79a22, 0x3cc00a83, 0xdf89bd21, 0x379e2d80, 0xb0b5e621,
+    0x58a27680, 0xbbebc122, 0x53fc5183, 0xa609a827, 0x4e1e3886,
+    0xad578f24, 0x45401f85, 0x9dcd7a2d, 0x75daea8c, 0x96935d2e,
+    0x7e84cd8f, 0x8b71342b, 0x6366a48a, 0x802f1328, 0x68388389,
+    0xea44de39, 0x02534e98, 0xe11af93a, 0x090d699b, 0xfcf8903f,
+    0x14ef009e, 0xf7a6b73c, 0x1fb1279d, 0xc73c4235, 0x2f2bd294,
+    0xcc626536, 0x2475f597, 0xd1800c33, 0x39979c92, 0xdade2b30,
+    0x32c9bb91, 0x05579611, 0xed4006b0, 0x0e09b112, 0xe61e21b3,
+    0x13ebd817, 0xfbfc48b6, 0x18b5ff14, 0xf0a26fb5, 0x282f0a1d,
+    0xc0389abc, 0x23712d1e, 0xcb66bdbf, 0x3e93441b, 0xd684d4ba,
+    0x35cd6318, 0xdddaf3b9, 0x5fa6ae09, 0xb7b13ea8, 0x54f8890a,
+    0xbcef19ab, 0x491ae00f, 0xa10d70ae, 0x4244c70c, 0xaa5357ad,
+    0x72de3205, 0x9ac9a2a4, 0x79801506, 0x919785a7, 0x64627c03,
+    0x8c75eca2, 0x6f3c5b00, 0x872bcba1, 0xba1aca03, 0x520d5aa2,
+    0xb144ed00, 0x59537da1, 0xaca68405, 0x44b114a4, 0xa7f8a306,
+    0x4fef33a7, 0x9762560f, 0x7f75c6ae, 0x9c3c710c, 0x742be1ad,
+    0x81de1809, 0x69c988a8, 0x8a803f0a, 0x6297afab, 0xe0ebf21b,
+    0x08fc62ba, 0xebb5d518, 0x03a245b9, 0xf657bc1d, 0x1e402cbc,
+    0xfd099b1e, 0x151e0bbf, 0xcd936e17, 0x2584feb6, 0xc6cd4914,
+    0x2edad9b5, 0xdb2f2011, 0x3338b0b0, 0xd0710712, 0x386697b3,
+    0x0ff8ba33, 0xe7ef2a92, 0x04a69d30, 0xecb10d91, 0x1944f435,
+    0xf1536494, 0x121ad336, 0xfa0d4397, 0x2280263f, 0xca97b69e,
+    0x29de013c, 0xc1c9919d, 0x343c6839, 0xdc2bf898, 0x3f624f3a,
+    0xd775df9b, 0x5509822b, 0xbd1e128a, 0x5e57a528, 0xb6403589,
+    0x43b5cc2d, 0xaba25c8c, 0x48ebeb2e, 0xa0fc7b8f, 0x78711e27,
+    0x90668e86, 0x732f3924, 0x9b38a985, 0x6ecd5021, 0x86dac080,
+    0x65937722, 0x8d84e783, 0x0aaf2c22, 0xe2b8bc83, 0x01f10b21,
+    0xe9e69b80, 0x1c136224, 0xf404f285, 0x174d4527, 0xff5ad586,
+    0x27d7b02e, 0xcfc0208f, 0x2c89972d, 0xc49e078c, 0x316bfe28,
+    0xd97c6e89, 0x3a35d92b, 0xd222498a, 0x505e143a, 0xb849849b,
+    0x5b003339, 0xb317a398, 0x46e25a3c, 0xaef5ca9d, 0x4dbc7d3f,
+    0xa5abed9e, 0x7d268836, 0x95311897, 0x7678af35, 0x9e6f3f94,
+    0x6b9ac630, 0x838d5691, 0x60c4e133, 0x88d37192, 0xbf4d5c12,
+    0x575accb3, 0xb4137b11, 0x5c04ebb0, 0xa9f11214, 0x41e682b5,
+    0xa2af3517, 0x4ab8a5b6, 0x9235c01e, 0x7a2250bf, 0x996be71d,
+    0x717c77bc, 0x84898e18, 0x6c9e1eb9, 0x8fd7a91b, 0x67c039ba,
+    0xe5bc640a, 0x0dabf4ab, 0xeee24309, 0x06f5d3a8, 0xf3002a0c,
+    0x1b17baad, 0xf85e0d0f, 0x10499dae, 0xc8c4f806, 0x20d368a7,
+    0xc39adf05, 0x2b8d4fa4, 0xde78b600, 0x366f26a1, 0xd5269103,
+    0x3d3101a2}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x0000000000000000, 0xa19017e800000000, 0x03275e0b00000000,
+    0xa2b749e300000000, 0x064ebc1600000000, 0xa7deabfe00000000,
+    0x0569e21d00000000, 0xa4f9f5f500000000, 0x0c9c782d00000000,
+    0xad0c6fc500000000, 0x0fbb262600000000, 0xae2b31ce00000000,
+    0x0ad2c43b00000000, 0xab42d3d300000000, 0x09f59a3000000000,
+    0xa8658dd800000000, 0x1838f15a00000000, 0xb9a8e6b200000000,
+    0x1b1faf5100000000, 0xba8fb8b900000000, 0x1e764d4c00000000,
+    0xbfe65aa400000000, 0x1d51134700000000, 0xbcc104af00000000,
+    0x14a4897700000000, 0xb5349e9f00000000, 0x1783d77c00000000,
+    0xb613c09400000000, 0x12ea356100000000, 0xb37a228900000000,
+    0x11cd6b6a00000000, 0xb05d7c8200000000, 0x3070e2b500000000,
+    0x91e0f55d00000000, 0x3357bcbe00000000, 0x92c7ab5600000000,
+    0x363e5ea300000000, 0x97ae494b00000000, 0x351900a800000000,
+    0x9489174000000000, 0x3cec9a9800000000, 0x9d7c8d7000000000,
+    0x3fcbc49300000000, 0x9e5bd37b00000000, 0x3aa2268e00000000,
+    0x9b32316600000000, 0x3985788500000000, 0x98156f6d00000000,
+    0x284813ef00000000, 0x89d8040700000000, 0x2b6f4de400000000,
+    0x8aff5a0c00000000, 0x2e06aff900000000, 0x8f96b81100000000,
+    0x2d21f1f200000000, 0x8cb1e61a00000000, 0x24d46bc200000000,
+    0x85447c2a00000000, 0x27f335c900000000, 0x8663222100000000,
+    0x229ad7d400000000, 0x830ac03c00000000, 0x21bd89df00000000,
+    0x802d9e3700000000, 0x21e6b5b000000000, 0x8076a25800000000,
+    0x22c1ebbb00000000, 0x8351fc5300000000, 0x27a809a600000000,
+    0x86381e4e00000000, 0x248f57ad00000000, 0x851f404500000000,
+    0x2d7acd9d00000000, 0x8ceada7500000000, 0x2e5d939600000000,
+    0x8fcd847e00000000, 0x2b34718b00000000, 0x8aa4666300000000,
+    0x28132f8000000000, 0x8983386800000000, 0x39de44ea00000000,
+    0x984e530200000000, 0x3af91ae100000000, 0x9b690d0900000000,
+    0x3f90f8fc00000000, 0x9e00ef1400000000, 0x3cb7a6f700000000,
+    0x9d27b11f00000000, 0x35423cc700000000, 0x94d22b2f00000000,
+    0x366562cc00000000, 0x97f5752400000000, 0x330c80d100000000,
+    0x929c973900000000, 0x302bdeda00000000, 0x91bbc93200000000,
+    0x1196570500000000, 0xb00640ed00000000, 0x12b1090e00000000,
+    0xb3211ee600000000, 0x17d8eb1300000000, 0xb648fcfb00000000,
+    0x14ffb51800000000, 0xb56fa2f000000000, 0x1d0a2f2800000000,
+    0xbc9a38c000000000, 0x1e2d712300000000, 0xbfbd66cb00000000,
+    0x1b44933e00000000, 0xbad484d600000000, 0x1863cd3500000000,
+    0xb9f3dadd00000000, 0x09aea65f00000000, 0xa83eb1b700000000,
+    0x0a89f85400000000, 0xab19efbc00000000, 0x0fe01a4900000000,
+    0xae700da100000000, 0x0cc7444200000000, 0xad5753aa00000000,
+    0x0532de7200000000, 0xa4a2c99a00000000, 0x0615807900000000,
+    0xa785979100000000, 0x037c626400000000, 0xa2ec758c00000000,
+    0x005b3c6f00000000, 0xa1cb2b8700000000, 0x03ca1aba00000000,
+    0xa25a0d5200000000, 0x00ed44b100000000, 0xa17d535900000000,
+    0x0584a6ac00000000, 0xa414b14400000000, 0x06a3f8a700000000,
+    0xa733ef4f00000000, 0x0f56629700000000, 0xaec6757f00000000,
+    0x0c713c9c00000000, 0xade12b7400000000, 0x0918de8100000000,
+    0xa888c96900000000, 0x0a3f808a00000000, 0xabaf976200000000,
+    0x1bf2ebe000000000, 0xba62fc0800000000, 0x18d5b5eb00000000,
+    0xb945a20300000000, 0x1dbc57f600000000, 0xbc2c401e00000000,
+    0x1e9b09fd00000000, 0xbf0b1e1500000000, 0x176e93cd00000000,
+    0xb6fe842500000000, 0x1449cdc600000000, 0xb5d9da2e00000000,
+    0x11202fdb00000000, 0xb0b0383300000000, 0x120771d000000000,
+    0xb397663800000000, 0x33baf80f00000000, 0x922aefe700000000,
+    0x309da60400000000, 0x910db1ec00000000, 0x35f4441900000000,
+    0x946453f100000000, 0x36d31a1200000000, 0x97430dfa00000000,
+    0x3f26802200000000, 0x9eb697ca00000000, 0x3c01de2900000000,
+    0x9d91c9c100000000, 0x39683c3400000000, 0x98f82bdc00000000,
+    0x3a4f623f00000000, 0x9bdf75d700000000, 0x2b82095500000000,
+    0x8a121ebd00000000, 0x28a5575e00000000, 0x893540b600000000,
+    0x2dccb54300000000, 0x8c5ca2ab00000000, 0x2eebeb4800000000,
+    0x8f7bfca000000000, 0x271e717800000000, 0x868e669000000000,
+    0x24392f7300000000, 0x85a9389b00000000, 0x2150cd6e00000000,
+    0x80c0da8600000000, 0x2277936500000000, 0x83e7848d00000000,
+    0x222caf0a00000000, 0x83bcb8e200000000, 0x210bf10100000000,
+    0x809be6e900000000, 0x2462131c00000000, 0x85f204f400000000,
+    0x27454d1700000000, 0x86d55aff00000000, 0x2eb0d72700000000,
+    0x8f20c0cf00000000, 0x2d97892c00000000, 0x8c079ec400000000,
+    0x28fe6b3100000000, 0x896e7cd900000000, 0x2bd9353a00000000,
+    0x8a4922d200000000, 0x3a145e5000000000, 0x9b8449b800000000,
+    0x3933005b00000000, 0x98a317b300000000, 0x3c5ae24600000000,
+    0x9dcaf5ae00000000, 0x3f7dbc4d00000000, 0x9eedaba500000000,
+    0x3688267d00000000, 0x9718319500000000, 0x35af787600000000,
+    0x943f6f9e00000000, 0x30c69a6b00000000, 0x91568d8300000000,
+    0x33e1c46000000000, 0x9271d38800000000, 0x125c4dbf00000000,
+    0xb3cc5a5700000000, 0x117b13b400000000, 0xb0eb045c00000000,
+    0x1412f1a900000000, 0xb582e64100000000, 0x1735afa200000000,
+    0xb6a5b84a00000000, 0x1ec0359200000000, 0xbf50227a00000000,
+    0x1de76b9900000000, 0xbc777c7100000000, 0x188e898400000000,
+    0xb91e9e6c00000000, 0x1ba9d78f00000000, 0xba39c06700000000,
+    0x0a64bce500000000, 0xabf4ab0d00000000, 0x0943e2ee00000000,
+    0xa8d3f50600000000, 0x0c2a00f300000000, 0xadba171b00000000,
+    0x0f0d5ef800000000, 0xae9d491000000000, 0x06f8c4c800000000,
+    0xa768d32000000000, 0x05df9ac300000000, 0xa44f8d2b00000000,
+    0x00b678de00000000, 0xa1266f3600000000, 0x039126d500000000,
+    0xa201313d00000000},
+   {0x0000000000000000, 0xee8439a100000000, 0x9d0f029900000000,
+    0x738b3b3800000000, 0x7b1975e900000000, 0x959d4c4800000000,
+    0xe616777000000000, 0x08924ed100000000, 0xb7349b0900000000,
+    0x59b0a2a800000000, 0x2a3b999000000000, 0xc4bfa03100000000,
+    0xcc2deee000000000, 0x22a9d74100000000, 0x5122ec7900000000,
+    0xbfa6d5d800000000, 0x6e69361300000000, 0x80ed0fb200000000,
+    0xf366348a00000000, 0x1de20d2b00000000, 0x157043fa00000000,
+    0xfbf47a5b00000000, 0x887f416300000000, 0x66fb78c200000000,
+    0xd95dad1a00000000, 0x37d994bb00000000, 0x4452af8300000000,
+    0xaad6962200000000, 0xa244d8f300000000, 0x4cc0e15200000000,
+    0x3f4bda6a00000000, 0xd1cfe3cb00000000, 0xdcd26c2600000000,
+    0x3256558700000000, 0x41dd6ebf00000000, 0xaf59571e00000000,
+    0xa7cb19cf00000000, 0x494f206e00000000, 0x3ac41b5600000000,
+    0xd44022f700000000, 0x6be6f72f00000000, 0x8562ce8e00000000,
+    0xf6e9f5b600000000, 0x186dcc1700000000, 0x10ff82c600000000,
+    0xfe7bbb6700000000, 0x8df0805f00000000, 0x6374b9fe00000000,
+    0xb2bb5a3500000000, 0x5c3f639400000000, 0x2fb458ac00000000,
+    0xc130610d00000000, 0xc9a22fdc00000000, 0x2726167d00000000,
+    0x54ad2d4500000000, 0xba2914e400000000, 0x058fc13c00000000,
+    0xeb0bf89d00000000, 0x9880c3a500000000, 0x7604fa0400000000,
+    0x7e96b4d500000000, 0x90128d7400000000, 0xe399b64c00000000,
+    0x0d1d8fed00000000, 0xb8a5d94c00000000, 0x5621e0ed00000000,
+    0x25aadbd500000000, 0xcb2ee27400000000, 0xc3bcaca500000000,
+    0x2d38950400000000, 0x5eb3ae3c00000000, 0xb037979d00000000,
+    0x0f91424500000000, 0xe1157be400000000, 0x929e40dc00000000,
+    0x7c1a797d00000000, 0x748837ac00000000, 0x9a0c0e0d00000000,
+    0xe987353500000000, 0x07030c9400000000, 0xd6ccef5f00000000,
+    0x3848d6fe00000000, 0x4bc3edc600000000, 0xa547d46700000000,
+    0xadd59ab600000000, 0x4351a31700000000, 0x30da982f00000000,
+    0xde5ea18e00000000, 0x61f8745600000000, 0x8f7c4df700000000,
+    0xfcf776cf00000000, 0x12734f6e00000000, 0x1ae101bf00000000,
+    0xf465381e00000000, 0x87ee032600000000, 0x696a3a8700000000,
+    0x6477b56a00000000, 0x8af38ccb00000000, 0xf978b7f300000000,
+    0x17fc8e5200000000, 0x1f6ec08300000000, 0xf1eaf92200000000,
+    0x8261c21a00000000, 0x6ce5fbbb00000000, 0xd3432e6300000000,
+    0x3dc717c200000000, 0x4e4c2cfa00000000, 0xa0c8155b00000000,
+    0xa85a5b8a00000000, 0x46de622b00000000, 0x3555591300000000,
+    0xdbd160b200000000, 0x0a1e837900000000, 0xe49abad800000000,
+    0x971181e000000000, 0x7995b84100000000, 0x7107f69000000000,
+    0x9f83cf3100000000, 0xec08f40900000000, 0x028ccda800000000,
+    0xbd2a187000000000, 0x53ae21d100000000, 0x20251ae900000000,
+    0xcea1234800000000, 0xc6336d9900000000, 0x28b7543800000000,
+    0x5b3c6f0000000000, 0xb5b856a100000000, 0x704bb39900000000,
+    0x9ecf8a3800000000, 0xed44b10000000000, 0x03c088a100000000,
+    0x0b52c67000000000, 0xe5d6ffd100000000, 0x965dc4e900000000,
+    0x78d9fd4800000000, 0xc77f289000000000, 0x29fb113100000000,
+    0x5a702a0900000000, 0xb4f413a800000000, 0xbc665d7900000000,
+    0x52e264d800000000, 0x21695fe000000000, 0xcfed664100000000,
+    0x1e22858a00000000, 0xf0a6bc2b00000000, 0x832d871300000000,
+    0x6da9beb200000000, 0x653bf06300000000, 0x8bbfc9c200000000,
+    0xf834f2fa00000000, 0x16b0cb5b00000000, 0xa9161e8300000000,
+    0x4792272200000000, 0x34191c1a00000000, 0xda9d25bb00000000,
+    0xd20f6b6a00000000, 0x3c8b52cb00000000, 0x4f0069f300000000,
+    0xa184505200000000, 0xac99dfbf00000000, 0x421de61e00000000,
+    0x3196dd2600000000, 0xdf12e48700000000, 0xd780aa5600000000,
+    0x390493f700000000, 0x4a8fa8cf00000000, 0xa40b916e00000000,
+    0x1bad44b600000000, 0xf5297d1700000000, 0x86a2462f00000000,
+    0x68267f8e00000000, 0x60b4315f00000000, 0x8e3008fe00000000,
+    0xfdbb33c600000000, 0x133f0a6700000000, 0xc2f0e9ac00000000,
+    0x2c74d00d00000000, 0x5fffeb3500000000, 0xb17bd29400000000,
+    0xb9e99c4500000000, 0x576da5e400000000, 0x24e69edc00000000,
+    0xca62a77d00000000, 0x75c472a500000000, 0x9b404b0400000000,
+    0xe8cb703c00000000, 0x064f499d00000000, 0x0edd074c00000000,
+    0xe0593eed00000000, 0x93d205d500000000, 0x7d563c7400000000,
+    0xc8ee6ad500000000, 0x266a537400000000, 0x55e1684c00000000,
+    0xbb6551ed00000000, 0xb3f71f3c00000000, 0x5d73269d00000000,
+    0x2ef81da500000000, 0xc07c240400000000, 0x7fdaf1dc00000000,
+    0x915ec87d00000000, 0xe2d5f34500000000, 0x0c51cae400000000,
+    0x04c3843500000000, 0xea47bd9400000000, 0x99cc86ac00000000,
+    0x7748bf0d00000000, 0xa6875cc600000000, 0x4803656700000000,
+    0x3b885e5f00000000, 0xd50c67fe00000000, 0xdd9e292f00000000,
+    0x331a108e00000000, 0x40912bb600000000, 0xae15121700000000,
+    0x11b3c7cf00000000, 0xff37fe6e00000000, 0x8cbcc55600000000,
+    0x6238fcf700000000, 0x6aaab22600000000, 0x842e8b8700000000,
+    0xf7a5b0bf00000000, 0x1921891e00000000, 0x143c06f300000000,
+    0xfab83f5200000000, 0x8933046a00000000, 0x67b73dcb00000000,
+    0x6f25731a00000000, 0x81a14abb00000000, 0xf22a718300000000,
+    0x1cae482200000000, 0xa3089dfa00000000, 0x4d8ca45b00000000,
+    0x3e079f6300000000, 0xd083a6c200000000, 0xd811e81300000000,
+    0x3695d1b200000000, 0x451eea8a00000000, 0xab9ad32b00000000,
+    0x7a5530e000000000, 0x94d1094100000000, 0xe75a327900000000,
+    0x09de0bd800000000, 0x014c450900000000, 0xefc87ca800000000,
+    0x9c43479000000000, 0x72c77e3100000000, 0xcd61abe900000000,
+    0x23e5924800000000, 0x506ea97000000000, 0xbeea90d100000000,
+    0xb678de0000000000, 0x58fce7a100000000, 0x2b77dc9900000000,
+    0xc5f3e53800000000},
+   {0x0000000000000000, 0xfbf6134700000000, 0xf6ed278e00000000,
+    0x0d1b34c900000000, 0xaddd3ec700000000, 0x562b2d8000000000,
+    0x5b30194900000000, 0xa0c60a0e00000000, 0x1bbd0c5500000000,
+    0xe04b1f1200000000, 0xed502bdb00000000, 0x16a6389c00000000,
+    0xb660329200000000, 0x4d9621d500000000, 0x408d151c00000000,
+    0xbb7b065b00000000, 0x367a19aa00000000, 0xcd8c0aed00000000,
+    0xc0973e2400000000, 0x3b612d6300000000, 0x9ba7276d00000000,
+    0x6051342a00000000, 0x6d4a00e300000000, 0x96bc13a400000000,
+    0x2dc715ff00000000, 0xd63106b800000000, 0xdb2a327100000000,
+    0x20dc213600000000, 0x801a2b3800000000, 0x7bec387f00000000,
+    0x76f70cb600000000, 0x8d011ff100000000, 0x2df2438f00000000,
+    0xd60450c800000000, 0xdb1f640100000000, 0x20e9774600000000,
+    0x802f7d4800000000, 0x7bd96e0f00000000, 0x76c25ac600000000,
+    0x8d34498100000000, 0x364f4fda00000000, 0xcdb95c9d00000000,
+    0xc0a2685400000000, 0x3b547b1300000000, 0x9b92711d00000000,
+    0x6064625a00000000, 0x6d7f569300000000, 0x968945d400000000,
+    0x1b885a2500000000, 0xe07e496200000000, 0xed657dab00000000,
+    0x16936eec00000000, 0xb65564e200000000, 0x4da377a500000000,
+    0x40b8436c00000000, 0xbb4e502b00000000, 0x0035567000000000,
+    0xfbc3453700000000, 0xf6d871fe00000000, 0x0d2e62b900000000,
+    0xade868b700000000, 0x561e7bf000000000, 0x5b054f3900000000,
+    0xa0f35c7e00000000, 0x1be2f6c500000000, 0xe014e58200000000,
+    0xed0fd14b00000000, 0x16f9c20c00000000, 0xb63fc80200000000,
+    0x4dc9db4500000000, 0x40d2ef8c00000000, 0xbb24fccb00000000,
+    0x005ffa9000000000, 0xfba9e9d700000000, 0xf6b2dd1e00000000,
+    0x0d44ce5900000000, 0xad82c45700000000, 0x5674d71000000000,
+    0x5b6fe3d900000000, 0xa099f09e00000000, 0x2d98ef6f00000000,
+    0xd66efc2800000000, 0xdb75c8e100000000, 0x2083dba600000000,
+    0x8045d1a800000000, 0x7bb3c2ef00000000, 0x76a8f62600000000,
+    0x8d5ee56100000000, 0x3625e33a00000000, 0xcdd3f07d00000000,
+    0xc0c8c4b400000000, 0x3b3ed7f300000000, 0x9bf8ddfd00000000,
+    0x600eceba00000000, 0x6d15fa7300000000, 0x96e3e93400000000,
+    0x3610b54a00000000, 0xcde6a60d00000000, 0xc0fd92c400000000,
+    0x3b0b818300000000, 0x9bcd8b8d00000000, 0x603b98ca00000000,
+    0x6d20ac0300000000, 0x96d6bf4400000000, 0x2dadb91f00000000,
+    0xd65baa5800000000, 0xdb409e9100000000, 0x20b68dd600000000,
+    0x807087d800000000, 0x7b86949f00000000, 0x769da05600000000,
+    0x8d6bb31100000000, 0x006aace000000000, 0xfb9cbfa700000000,
+    0xf6878b6e00000000, 0x0d71982900000000, 0xadb7922700000000,
+    0x5641816000000000, 0x5b5ab5a900000000, 0xa0aca6ee00000000,
+    0x1bd7a0b500000000, 0xe021b3f200000000, 0xed3a873b00000000,
+    0x16cc947c00000000, 0xb60a9e7200000000, 0x4dfc8d3500000000,
+    0x40e7b9fc00000000, 0xbb11aabb00000000, 0x77c29c5000000000,
+    0x8c348f1700000000, 0x812fbbde00000000, 0x7ad9a89900000000,
+    0xda1fa29700000000, 0x21e9b1d000000000, 0x2cf2851900000000,
+    0xd704965e00000000, 0x6c7f900500000000, 0x9789834200000000,
+    0x9a92b78b00000000, 0x6164a4cc00000000, 0xc1a2aec200000000,
+    0x3a54bd8500000000, 0x374f894c00000000, 0xccb99a0b00000000,
+    0x41b885fa00000000, 0xba4e96bd00000000, 0xb755a27400000000,
+    0x4ca3b13300000000, 0xec65bb3d00000000, 0x1793a87a00000000,
+    0x1a889cb300000000, 0xe17e8ff400000000, 0x5a0589af00000000,
+    0xa1f39ae800000000, 0xace8ae2100000000, 0x571ebd6600000000,
+    0xf7d8b76800000000, 0x0c2ea42f00000000, 0x013590e600000000,
+    0xfac383a100000000, 0x5a30dfdf00000000, 0xa1c6cc9800000000,
+    0xacddf85100000000, 0x572beb1600000000, 0xf7ede11800000000,
+    0x0c1bf25f00000000, 0x0100c69600000000, 0xfaf6d5d100000000,
+    0x418dd38a00000000, 0xba7bc0cd00000000, 0xb760f40400000000,
+    0x4c96e74300000000, 0xec50ed4d00000000, 0x17a6fe0a00000000,
+    0x1abdcac300000000, 0xe14bd98400000000, 0x6c4ac67500000000,
+    0x97bcd53200000000, 0x9aa7e1fb00000000, 0x6151f2bc00000000,
+    0xc197f8b200000000, 0x3a61ebf500000000, 0x377adf3c00000000,
+    0xcc8ccc7b00000000, 0x77f7ca2000000000, 0x8c01d96700000000,
+    0x811aedae00000000, 0x7aecfee900000000, 0xda2af4e700000000,
+    0x21dce7a000000000, 0x2cc7d36900000000, 0xd731c02e00000000,
+    0x6c206a9500000000, 0x97d679d200000000, 0x9acd4d1b00000000,
+    0x613b5e5c00000000, 0xc1fd545200000000, 0x3a0b471500000000,
+    0x371073dc00000000, 0xcce6609b00000000, 0x779d66c000000000,
+    0x8c6b758700000000, 0x8170414e00000000, 0x7a86520900000000,
+    0xda40580700000000, 0x21b64b4000000000, 0x2cad7f8900000000,
+    0xd75b6cce00000000, 0x5a5a733f00000000, 0xa1ac607800000000,
+    0xacb754b100000000, 0x574147f600000000, 0xf7874df800000000,
+    0x0c715ebf00000000, 0x016a6a7600000000, 0xfa9c793100000000,
+    0x41e77f6a00000000, 0xba116c2d00000000, 0xb70a58e400000000,
+    0x4cfc4ba300000000, 0xec3a41ad00000000, 0x17cc52ea00000000,
+    0x1ad7662300000000, 0xe121756400000000, 0x41d2291a00000000,
+    0xba243a5d00000000, 0xb73f0e9400000000, 0x4cc91dd300000000,
+    0xec0f17dd00000000, 0x17f9049a00000000, 0x1ae2305300000000,
+    0xe114231400000000, 0x5a6f254f00000000, 0xa199360800000000,
+    0xac8202c100000000, 0x5774118600000000, 0xf7b21b8800000000,
+    0x0c4408cf00000000, 0x015f3c0600000000, 0xfaa92f4100000000,
+    0x77a830b000000000, 0x8c5e23f700000000, 0x8145173e00000000,
+    0x7ab3047900000000, 0xda750e7700000000, 0x21831d3000000000,
+    0x2c9829f900000000, 0xd76e3abe00000000, 0x6c153ce500000000,
+    0x97e32fa200000000, 0x9af81b6b00000000, 0x610e082c00000000,
+    0xc1c8022200000000, 0x3a3e116500000000, 0x372525ac00000000,
+    0xccd336eb00000000},
+   {0x0000000000000000, 0x6238282a00000000, 0xc470505400000000,
+    0xa648787e00000000, 0x88e1a0a800000000, 0xead9888200000000,
+    0x4c91f0fc00000000, 0x2ea9d8d600000000, 0x51c5308a00000000,
+    0x33fd18a000000000, 0x95b560de00000000, 0xf78d48f400000000,
+    0xd924902200000000, 0xbb1cb80800000000, 0x1d54c07600000000,
+    0x7f6ce85c00000000, 0xe38c10cf00000000, 0x81b438e500000000,
+    0x27fc409b00000000, 0x45c468b100000000, 0x6b6db06700000000,
+    0x0955984d00000000, 0xaf1de03300000000, 0xcd25c81900000000,
+    0xb249204500000000, 0xd071086f00000000, 0x7639701100000000,
+    0x1401583b00000000, 0x3aa880ed00000000, 0x5890a8c700000000,
+    0xfed8d0b900000000, 0x9ce0f89300000000, 0x871f504500000000,
+    0xe527786f00000000, 0x436f001100000000, 0x2157283b00000000,
+    0x0ffef0ed00000000, 0x6dc6d8c700000000, 0xcb8ea0b900000000,
+    0xa9b6889300000000, 0xd6da60cf00000000, 0xb4e248e500000000,
+    0x12aa309b00000000, 0x709218b100000000, 0x5e3bc06700000000,
+    0x3c03e84d00000000, 0x9a4b903300000000, 0xf873b81900000000,
+    0x6493408a00000000, 0x06ab68a000000000, 0xa0e310de00000000,
+    0xc2db38f400000000, 0xec72e02200000000, 0x8e4ac80800000000,
+    0x2802b07600000000, 0x4a3a985c00000000, 0x3556700000000000,
+    0x576e582a00000000, 0xf126205400000000, 0x931e087e00000000,
+    0xbdb7d0a800000000, 0xdf8ff88200000000, 0x79c780fc00000000,
+    0x1bffa8d600000000, 0x0e3fa08a00000000, 0x6c0788a000000000,
+    0xca4ff0de00000000, 0xa877d8f400000000, 0x86de002200000000,
+    0xe4e6280800000000, 0x42ae507600000000, 0x2096785c00000000,
+    0x5ffa900000000000, 0x3dc2b82a00000000, 0x9b8ac05400000000,
+    0xf9b2e87e00000000, 0xd71b30a800000000, 0xb523188200000000,
+    0x136b60fc00000000, 0x715348d600000000, 0xedb3b04500000000,
+    0x8f8b986f00000000, 0x29c3e01100000000, 0x4bfbc83b00000000,
+    0x655210ed00000000, 0x076a38c700000000, 0xa12240b900000000,
+    0xc31a689300000000, 0xbc7680cf00000000, 0xde4ea8e500000000,
+    0x7806d09b00000000, 0x1a3ef8b100000000, 0x3497206700000000,
+    0x56af084d00000000, 0xf0e7703300000000, 0x92df581900000000,
+    0x8920f0cf00000000, 0xeb18d8e500000000, 0x4d50a09b00000000,
+    0x2f6888b100000000, 0x01c1506700000000, 0x63f9784d00000000,
+    0xc5b1003300000000, 0xa789281900000000, 0xd8e5c04500000000,
+    0xbadde86f00000000, 0x1c95901100000000, 0x7eadb83b00000000,
+    0x500460ed00000000, 0x323c48c700000000, 0x947430b900000000,
+    0xf64c189300000000, 0x6aace00000000000, 0x0894c82a00000000,
+    0xaedcb05400000000, 0xcce4987e00000000, 0xe24d40a800000000,
+    0x8075688200000000, 0x263d10fc00000000, 0x440538d600000000,
+    0x3b69d08a00000000, 0x5951f8a000000000, 0xff1980de00000000,
+    0x9d21a8f400000000, 0xb388702200000000, 0xd1b0580800000000,
+    0x77f8207600000000, 0x15c0085c00000000, 0x5d7831ce00000000,
+    0x3f4019e400000000, 0x9908619a00000000, 0xfb3049b000000000,
+    0xd599916600000000, 0xb7a1b94c00000000, 0x11e9c13200000000,
+    0x73d1e91800000000, 0x0cbd014400000000, 0x6e85296e00000000,
+    0xc8cd511000000000, 0xaaf5793a00000000, 0x845ca1ec00000000,
+    0xe66489c600000000, 0x402cf1b800000000, 0x2214d99200000000,
+    0xbef4210100000000, 0xdccc092b00000000, 0x7a84715500000000,
+    0x18bc597f00000000, 0x361581a900000000, 0x542da98300000000,
+    0xf265d1fd00000000, 0x905df9d700000000, 0xef31118b00000000,
+    0x8d0939a100000000, 0x2b4141df00000000, 0x497969f500000000,
+    0x67d0b12300000000, 0x05e8990900000000, 0xa3a0e17700000000,
+    0xc198c95d00000000, 0xda67618b00000000, 0xb85f49a100000000,
+    0x1e1731df00000000, 0x7c2f19f500000000, 0x5286c12300000000,
+    0x30bee90900000000, 0x96f6917700000000, 0xf4ceb95d00000000,
+    0x8ba2510100000000, 0xe99a792b00000000, 0x4fd2015500000000,
+    0x2dea297f00000000, 0x0343f1a900000000, 0x617bd98300000000,
+    0xc733a1fd00000000, 0xa50b89d700000000, 0x39eb714400000000,
+    0x5bd3596e00000000, 0xfd9b211000000000, 0x9fa3093a00000000,
+    0xb10ad1ec00000000, 0xd332f9c600000000, 0x757a81b800000000,
+    0x1742a99200000000, 0x682e41ce00000000, 0x0a1669e400000000,
+    0xac5e119a00000000, 0xce6639b000000000, 0xe0cfe16600000000,
+    0x82f7c94c00000000, 0x24bfb13200000000, 0x4687991800000000,
+    0x5347914400000000, 0x317fb96e00000000, 0x9737c11000000000,
+    0xf50fe93a00000000, 0xdba631ec00000000, 0xb99e19c600000000,
+    0x1fd661b800000000, 0x7dee499200000000, 0x0282a1ce00000000,
+    0x60ba89e400000000, 0xc6f2f19a00000000, 0xa4cad9b000000000,
+    0x8a63016600000000, 0xe85b294c00000000, 0x4e13513200000000,
+    0x2c2b791800000000, 0xb0cb818b00000000, 0xd2f3a9a100000000,
+    0x74bbd1df00000000, 0x1683f9f500000000, 0x382a212300000000,
+    0x5a12090900000000, 0xfc5a717700000000, 0x9e62595d00000000,
+    0xe10eb10100000000, 0x8336992b00000000, 0x257ee15500000000,
+    0x4746c97f00000000, 0x69ef11a900000000, 0x0bd7398300000000,
+    0xad9f41fd00000000, 0xcfa769d700000000, 0xd458c10100000000,
+    0xb660e92b00000000, 0x1028915500000000, 0x7210b97f00000000,
+    0x5cb961a900000000, 0x3e81498300000000, 0x98c931fd00000000,
+    0xfaf119d700000000, 0x859df18b00000000, 0xe7a5d9a100000000,
+    0x41eda1df00000000, 0x23d589f500000000, 0x0d7c512300000000,
+    0x6f44790900000000, 0xc90c017700000000, 0xab34295d00000000,
+    0x37d4d1ce00000000, 0x55ecf9e400000000, 0xf3a4819a00000000,
+    0x919ca9b000000000, 0xbf35716600000000, 0xdd0d594c00000000,
+    0x7b45213200000000, 0x197d091800000000, 0x6611e14400000000,
+    0x0429c96e00000000, 0xa261b11000000000, 0xc059993a00000000,
+    0xeef041ec00000000, 0x8cc869c600000000, 0x2a8011b800000000,
+    0x48b8399200000000},
+   {0x0000000000000000, 0x4c2896a300000000, 0xd9565d9c00000000,
+    0x957ecb3f00000000, 0xf3abcbe300000000, 0xbf835d4000000000,
+    0x2afd967f00000000, 0x66d500dc00000000, 0xa751e61c00000000,
+    0xeb7970bf00000000, 0x7e07bb8000000000, 0x322f2d2300000000,
+    0x54fa2dff00000000, 0x18d2bb5c00000000, 0x8dac706300000000,
+    0xc184e6c000000000, 0x4ea3cc3900000000, 0x028b5a9a00000000,
+    0x97f591a500000000, 0xdbdd070600000000, 0xbd0807da00000000,
+    0xf120917900000000, 0x645e5a4600000000, 0x2876cce500000000,
+    0xe9f22a2500000000, 0xa5dabc8600000000, 0x30a477b900000000,
+    0x7c8ce11a00000000, 0x1a59e1c600000000, 0x5671776500000000,
+    0xc30fbc5a00000000, 0x8f272af900000000, 0x9c46997300000000,
+    0xd06e0fd000000000, 0x4510c4ef00000000, 0x0938524c00000000,
+    0x6fed529000000000, 0x23c5c43300000000, 0xb6bb0f0c00000000,
+    0xfa9399af00000000, 0x3b177f6f00000000, 0x773fe9cc00000000,
+    0xe24122f300000000, 0xae69b45000000000, 0xc8bcb48c00000000,
+    0x8494222f00000000, 0x11eae91000000000, 0x5dc27fb300000000,
+    0xd2e5554a00000000, 0x9ecdc3e900000000, 0x0bb308d600000000,
+    0x479b9e7500000000, 0x214e9ea900000000, 0x6d66080a00000000,
+    0xf818c33500000000, 0xb430559600000000, 0x75b4b35600000000,
+    0x399c25f500000000, 0xace2eeca00000000, 0xe0ca786900000000,
+    0x861f78b500000000, 0xca37ee1600000000, 0x5f49252900000000,
+    0x1361b38a00000000, 0x388d32e700000000, 0x74a5a44400000000,
+    0xe1db6f7b00000000, 0xadf3f9d800000000, 0xcb26f90400000000,
+    0x870e6fa700000000, 0x1270a49800000000, 0x5e58323b00000000,
+    0x9fdcd4fb00000000, 0xd3f4425800000000, 0x468a896700000000,
+    0x0aa21fc400000000, 0x6c771f1800000000, 0x205f89bb00000000,
+    0xb521428400000000, 0xf909d42700000000, 0x762efede00000000,
+    0x3a06687d00000000, 0xaf78a34200000000, 0xe35035e100000000,
+    0x8585353d00000000, 0xc9ada39e00000000, 0x5cd368a100000000,
+    0x10fbfe0200000000, 0xd17f18c200000000, 0x9d578e6100000000,
+    0x0829455e00000000, 0x4401d3fd00000000, 0x22d4d32100000000,
+    0x6efc458200000000, 0xfb828ebd00000000, 0xb7aa181e00000000,
+    0xa4cbab9400000000, 0xe8e33d3700000000, 0x7d9df60800000000,
+    0x31b560ab00000000, 0x5760607700000000, 0x1b48f6d400000000,
+    0x8e363deb00000000, 0xc21eab4800000000, 0x039a4d8800000000,
+    0x4fb2db2b00000000, 0xdacc101400000000, 0x96e486b700000000,
+    0xf031866b00000000, 0xbc1910c800000000, 0x2967dbf700000000,
+    0x654f4d5400000000, 0xea6867ad00000000, 0xa640f10e00000000,
+    0x333e3a3100000000, 0x7f16ac9200000000, 0x19c3ac4e00000000,
+    0x55eb3aed00000000, 0xc095f1d200000000, 0x8cbd677100000000,
+    0x4d3981b100000000, 0x0111171200000000, 0x946fdc2d00000000,
+    0xd8474a8e00000000, 0xbe924a5200000000, 0xf2badcf100000000,
+    0x67c417ce00000000, 0x2bec816d00000000, 0x311c141500000000,
+    0x7d3482b600000000, 0xe84a498900000000, 0xa462df2a00000000,
+    0xc2b7dff600000000, 0x8e9f495500000000, 0x1be1826a00000000,
+    0x57c914c900000000, 0x964df20900000000, 0xda6564aa00000000,
+    0x4f1baf9500000000, 0x0333393600000000, 0x65e639ea00000000,
+    0x29ceaf4900000000, 0xbcb0647600000000, 0xf098f2d500000000,
+    0x7fbfd82c00000000, 0x33974e8f00000000, 0xa6e985b000000000,
+    0xeac1131300000000, 0x8c1413cf00000000, 0xc03c856c00000000,
+    0x55424e5300000000, 0x196ad8f000000000, 0xd8ee3e3000000000,
+    0x94c6a89300000000, 0x01b863ac00000000, 0x4d90f50f00000000,
+    0x2b45f5d300000000, 0x676d637000000000, 0xf213a84f00000000,
+    0xbe3b3eec00000000, 0xad5a8d6600000000, 0xe1721bc500000000,
+    0x740cd0fa00000000, 0x3824465900000000, 0x5ef1468500000000,
+    0x12d9d02600000000, 0x87a71b1900000000, 0xcb8f8dba00000000,
+    0x0a0b6b7a00000000, 0x4623fdd900000000, 0xd35d36e600000000,
+    0x9f75a04500000000, 0xf9a0a09900000000, 0xb588363a00000000,
+    0x20f6fd0500000000, 0x6cde6ba600000000, 0xe3f9415f00000000,
+    0xafd1d7fc00000000, 0x3aaf1cc300000000, 0x76878a6000000000,
+    0x10528abc00000000, 0x5c7a1c1f00000000, 0xc904d72000000000,
+    0x852c418300000000, 0x44a8a74300000000, 0x088031e000000000,
+    0x9dfefadf00000000, 0xd1d66c7c00000000, 0xb7036ca000000000,
+    0xfb2bfa0300000000, 0x6e55313c00000000, 0x227da79f00000000,
+    0x099126f200000000, 0x45b9b05100000000, 0xd0c77b6e00000000,
+    0x9cefedcd00000000, 0xfa3aed1100000000, 0xb6127bb200000000,
+    0x236cb08d00000000, 0x6f44262e00000000, 0xaec0c0ee00000000,
+    0xe2e8564d00000000, 0x77969d7200000000, 0x3bbe0bd100000000,
+    0x5d6b0b0d00000000, 0x11439dae00000000, 0x843d569100000000,
+    0xc815c03200000000, 0x4732eacb00000000, 0x0b1a7c6800000000,
+    0x9e64b75700000000, 0xd24c21f400000000, 0xb499212800000000,
+    0xf8b1b78b00000000, 0x6dcf7cb400000000, 0x21e7ea1700000000,
+    0xe0630cd700000000, 0xac4b9a7400000000, 0x3935514b00000000,
+    0x751dc7e800000000, 0x13c8c73400000000, 0x5fe0519700000000,
+    0xca9e9aa800000000, 0x86b60c0b00000000, 0x95d7bf8100000000,
+    0xd9ff292200000000, 0x4c81e21d00000000, 0x00a974be00000000,
+    0x667c746200000000, 0x2a54e2c100000000, 0xbf2a29fe00000000,
+    0xf302bf5d00000000, 0x3286599d00000000, 0x7eaecf3e00000000,
+    0xebd0040100000000, 0xa7f892a200000000, 0xc12d927e00000000,
+    0x8d0504dd00000000, 0x187bcfe200000000, 0x5453594100000000,
+    0xdb7473b800000000, 0x975ce51b00000000, 0x02222e2400000000,
+    0x4e0ab88700000000, 0x28dfb85b00000000, 0x64f72ef800000000,
+    0xf189e5c700000000, 0xbda1736400000000, 0x7c2595a400000000,
+    0x300d030700000000, 0xa573c83800000000, 0xe95b5e9b00000000,
+    0x8f8e5e4700000000, 0xc3a6c8e400000000, 0x56d803db00000000,
+    0x1af0957800000000},
+   {0x0000000000000000, 0x939bc97f00000000, 0x263793ff00000000,
+    0xb5ac5a8000000000, 0x0d68572400000000, 0x9ef39e5b00000000,
+    0x2b5fc4db00000000, 0xb8c40da400000000, 0x1ad0ae4800000000,
+    0x894b673700000000, 0x3ce73db700000000, 0xaf7cf4c800000000,
+    0x17b8f96c00000000, 0x8423301300000000, 0x318f6a9300000000,
+    0xa214a3ec00000000, 0x34a05d9100000000, 0xa73b94ee00000000,
+    0x1297ce6e00000000, 0x810c071100000000, 0x39c80ab500000000,
+    0xaa53c3ca00000000, 0x1fff994a00000000, 0x8c64503500000000,
+    0x2e70f3d900000000, 0xbdeb3aa600000000, 0x0847602600000000,
+    0x9bdca95900000000, 0x2318a4fd00000000, 0xb0836d8200000000,
+    0x052f370200000000, 0x96b4fe7d00000000, 0x2946caf900000000,
+    0xbadd038600000000, 0x0f71590600000000, 0x9cea907900000000,
+    0x242e9ddd00000000, 0xb7b554a200000000, 0x02190e2200000000,
+    0x9182c75d00000000, 0x339664b100000000, 0xa00dadce00000000,
+    0x15a1f74e00000000, 0x863a3e3100000000, 0x3efe339500000000,
+    0xad65faea00000000, 0x18c9a06a00000000, 0x8b52691500000000,
+    0x1de6976800000000, 0x8e7d5e1700000000, 0x3bd1049700000000,
+    0xa84acde800000000, 0x108ec04c00000000, 0x8315093300000000,
+    0x36b953b300000000, 0xa5229acc00000000, 0x0736392000000000,
+    0x94adf05f00000000, 0x2101aadf00000000, 0xb29a63a000000000,
+    0x0a5e6e0400000000, 0x99c5a77b00000000, 0x2c69fdfb00000000,
+    0xbff2348400000000, 0x138ae52800000000, 0x80112c5700000000,
+    0x35bd76d700000000, 0xa626bfa800000000, 0x1ee2b20c00000000,
+    0x8d797b7300000000, 0x38d521f300000000, 0xab4ee88c00000000,
+    0x095a4b6000000000, 0x9ac1821f00000000, 0x2f6dd89f00000000,
+    0xbcf611e000000000, 0x04321c4400000000, 0x97a9d53b00000000,
+    0x22058fbb00000000, 0xb19e46c400000000, 0x272ab8b900000000,
+    0xb4b171c600000000, 0x011d2b4600000000, 0x9286e23900000000,
+    0x2a42ef9d00000000, 0xb9d926e200000000, 0x0c757c6200000000,
+    0x9feeb51d00000000, 0x3dfa16f100000000, 0xae61df8e00000000,
+    0x1bcd850e00000000, 0x88564c7100000000, 0x309241d500000000,
+    0xa30988aa00000000, 0x16a5d22a00000000, 0x853e1b5500000000,
+    0x3acc2fd100000000, 0xa957e6ae00000000, 0x1cfbbc2e00000000,
+    0x8f60755100000000, 0x37a478f500000000, 0xa43fb18a00000000,
+    0x1193eb0a00000000, 0x8208227500000000, 0x201c819900000000,
+    0xb38748e600000000, 0x062b126600000000, 0x95b0db1900000000,
+    0x2d74d6bd00000000, 0xbeef1fc200000000, 0x0b43454200000000,
+    0x98d88c3d00000000, 0x0e6c724000000000, 0x9df7bb3f00000000,
+    0x285be1bf00000000, 0xbbc028c000000000, 0x0304256400000000,
+    0x909fec1b00000000, 0x2533b69b00000000, 0xb6a87fe400000000,
+    0x14bcdc0800000000, 0x8727157700000000, 0x328b4ff700000000,
+    0xa110868800000000, 0x19d48b2c00000000, 0x8a4f425300000000,
+    0x3fe318d300000000, 0xac78d1ac00000000, 0x2614cb5100000000,
+    0xb58f022e00000000, 0x002358ae00000000, 0x93b891d100000000,
+    0x2b7c9c7500000000, 0xb8e7550a00000000, 0x0d4b0f8a00000000,
+    0x9ed0c6f500000000, 0x3cc4651900000000, 0xaf5fac6600000000,
+    0x1af3f6e600000000, 0x89683f9900000000, 0x31ac323d00000000,
+    0xa237fb4200000000, 0x179ba1c200000000, 0x840068bd00000000,
+    0x12b496c000000000, 0x812f5fbf00000000, 0x3483053f00000000,
+    0xa718cc4000000000, 0x1fdcc1e400000000, 0x8c47089b00000000,
+    0x39eb521b00000000, 0xaa709b6400000000, 0x0864388800000000,
+    0x9bfff1f700000000, 0x2e53ab7700000000, 0xbdc8620800000000,
+    0x050c6fac00000000, 0x9697a6d300000000, 0x233bfc5300000000,
+    0xb0a0352c00000000, 0x0f5201a800000000, 0x9cc9c8d700000000,
+    0x2965925700000000, 0xbafe5b2800000000, 0x023a568c00000000,
+    0x91a19ff300000000, 0x240dc57300000000, 0xb7960c0c00000000,
+    0x1582afe000000000, 0x8619669f00000000, 0x33b53c1f00000000,
+    0xa02ef56000000000, 0x18eaf8c400000000, 0x8b7131bb00000000,
+    0x3edd6b3b00000000, 0xad46a24400000000, 0x3bf25c3900000000,
+    0xa869954600000000, 0x1dc5cfc600000000, 0x8e5e06b900000000,
+    0x369a0b1d00000000, 0xa501c26200000000, 0x10ad98e200000000,
+    0x8336519d00000000, 0x2122f27100000000, 0xb2b93b0e00000000,
+    0x0715618e00000000, 0x948ea8f100000000, 0x2c4aa55500000000,
+    0xbfd16c2a00000000, 0x0a7d36aa00000000, 0x99e6ffd500000000,
+    0x359e2e7900000000, 0xa605e70600000000, 0x13a9bd8600000000,
+    0x803274f900000000, 0x38f6795d00000000, 0xab6db02200000000,
+    0x1ec1eaa200000000, 0x8d5a23dd00000000, 0x2f4e803100000000,
+    0xbcd5494e00000000, 0x097913ce00000000, 0x9ae2dab100000000,
+    0x2226d71500000000, 0xb1bd1e6a00000000, 0x041144ea00000000,
+    0x978a8d9500000000, 0x013e73e800000000, 0x92a5ba9700000000,
+    0x2709e01700000000, 0xb492296800000000, 0x0c5624cc00000000,
+    0x9fcdedb300000000, 0x2a61b73300000000, 0xb9fa7e4c00000000,
+    0x1beedda000000000, 0x887514df00000000, 0x3dd94e5f00000000,
+    0xae42872000000000, 0x16868a8400000000, 0x851d43fb00000000,
+    0x30b1197b00000000, 0xa32ad00400000000, 0x1cd8e48000000000,
+    0x8f432dff00000000, 0x3aef777f00000000, 0xa974be0000000000,
+    0x11b0b3a400000000, 0x822b7adb00000000, 0x3787205b00000000,
+    0xa41ce92400000000, 0x06084ac800000000, 0x959383b700000000,
+    0x203fd93700000000, 0xb3a4104800000000, 0x0b601dec00000000,
+    0x98fbd49300000000, 0x2d578e1300000000, 0xbecc476c00000000,
+    0x2878b91100000000, 0xbbe3706e00000000, 0x0e4f2aee00000000,
+    0x9dd4e39100000000, 0x2510ee3500000000, 0xb68b274a00000000,
+    0x03277dca00000000, 0x90bcb4b500000000, 0x32a8175900000000,
+    0xa133de2600000000, 0x149f84a600000000, 0x87044dd900000000,
+    0x3fc0407d00000000, 0xac5b890200000000, 0x19f7d38200000000,
+    0x8a6c1afd00000000},
+   {0x0000000000000000, 0x650b796900000000, 0xca16f2d200000000,
+    0xaf1d8bbb00000000, 0xd52b957e00000000, 0xb020ec1700000000,
+    0x1f3d67ac00000000, 0x7a361ec500000000, 0xaa572afd00000000,
+    0xcf5c539400000000, 0x6041d82f00000000, 0x054aa14600000000,
+    0x7f7cbf8300000000, 0x1a77c6ea00000000, 0xb56a4d5100000000,
+    0xd061343800000000, 0x15a9252100000000, 0x70a25c4800000000,
+    0xdfbfd7f300000000, 0xbab4ae9a00000000, 0xc082b05f00000000,
+    0xa589c93600000000, 0x0a94428d00000000, 0x6f9f3be400000000,
+    0xbffe0fdc00000000, 0xdaf576b500000000, 0x75e8fd0e00000000,
+    0x10e3846700000000, 0x6ad59aa200000000, 0x0fdee3cb00000000,
+    0xa0c3687000000000, 0xc5c8111900000000, 0x2a524b4200000000,
+    0x4f59322b00000000, 0xe044b99000000000, 0x854fc0f900000000,
+    0xff79de3c00000000, 0x9a72a75500000000, 0x356f2cee00000000,
+    0x5064558700000000, 0x800561bf00000000, 0xe50e18d600000000,
+    0x4a13936d00000000, 0x2f18ea0400000000, 0x552ef4c100000000,
+    0x30258da800000000, 0x9f38061300000000, 0xfa337f7a00000000,
+    0x3ffb6e6300000000, 0x5af0170a00000000, 0xf5ed9cb100000000,
+    0x90e6e5d800000000, 0xead0fb1d00000000, 0x8fdb827400000000,
+    0x20c609cf00000000, 0x45cd70a600000000, 0x95ac449e00000000,
+    0xf0a73df700000000, 0x5fbab64c00000000, 0x3ab1cf2500000000,
+    0x4087d1e000000000, 0x258ca88900000000, 0x8a91233200000000,
+    0xef9a5a5b00000000, 0x54a4968400000000, 0x31afefed00000000,
+    0x9eb2645600000000, 0xfbb91d3f00000000, 0x818f03fa00000000,
+    0xe4847a9300000000, 0x4b99f12800000000, 0x2e92884100000000,
+    0xfef3bc7900000000, 0x9bf8c51000000000, 0x34e54eab00000000,
+    0x51ee37c200000000, 0x2bd8290700000000, 0x4ed3506e00000000,
+    0xe1cedbd500000000, 0x84c5a2bc00000000, 0x410db3a500000000,
+    0x2406cacc00000000, 0x8b1b417700000000, 0xee10381e00000000,
+    0x942626db00000000, 0xf12d5fb200000000, 0x5e30d40900000000,
+    0x3b3bad6000000000, 0xeb5a995800000000, 0x8e51e03100000000,
+    0x214c6b8a00000000, 0x444712e300000000, 0x3e710c2600000000,
+    0x5b7a754f00000000, 0xf467fef400000000, 0x916c879d00000000,
+    0x7ef6ddc600000000, 0x1bfda4af00000000, 0xb4e02f1400000000,
+    0xd1eb567d00000000, 0xabdd48b800000000, 0xced631d100000000,
+    0x61cbba6a00000000, 0x04c0c30300000000, 0xd4a1f73b00000000,
+    0xb1aa8e5200000000, 0x1eb705e900000000, 0x7bbc7c8000000000,
+    0x018a624500000000, 0x64811b2c00000000, 0xcb9c909700000000,
+    0xae97e9fe00000000, 0x6b5ff8e700000000, 0x0e54818e00000000,
+    0xa1490a3500000000, 0xc442735c00000000, 0xbe746d9900000000,
+    0xdb7f14f000000000, 0x74629f4b00000000, 0x1169e62200000000,
+    0xc108d21a00000000, 0xa403ab7300000000, 0x0b1e20c800000000,
+    0x6e1559a100000000, 0x1423476400000000, 0x71283e0d00000000,
+    0xde35b5b600000000, 0xbb3eccdf00000000, 0xe94e5cd200000000,
+    0x8c4525bb00000000, 0x2358ae0000000000, 0x4653d76900000000,
+    0x3c65c9ac00000000, 0x596eb0c500000000, 0xf6733b7e00000000,
+    0x9378421700000000, 0x4319762f00000000, 0x26120f4600000000,
+    0x890f84fd00000000, 0xec04fd9400000000, 0x9632e35100000000,
+    0xf3399a3800000000, 0x5c24118300000000, 0x392f68ea00000000,
+    0xfce779f300000000, 0x99ec009a00000000, 0x36f18b2100000000,
+    0x53faf24800000000, 0x29ccec8d00000000, 0x4cc795e400000000,
+    0xe3da1e5f00000000, 0x86d1673600000000, 0x56b0530e00000000,
+    0x33bb2a6700000000, 0x9ca6a1dc00000000, 0xf9add8b500000000,
+    0x839bc67000000000, 0xe690bf1900000000, 0x498d34a200000000,
+    0x2c864dcb00000000, 0xc31c179000000000, 0xa6176ef900000000,
+    0x090ae54200000000, 0x6c019c2b00000000, 0x163782ee00000000,
+    0x733cfb8700000000, 0xdc21703c00000000, 0xb92a095500000000,
+    0x694b3d6d00000000, 0x0c40440400000000, 0xa35dcfbf00000000,
+    0xc656b6d600000000, 0xbc60a81300000000, 0xd96bd17a00000000,
+    0x76765ac100000000, 0x137d23a800000000, 0xd6b532b100000000,
+    0xb3be4bd800000000, 0x1ca3c06300000000, 0x79a8b90a00000000,
+    0x039ea7cf00000000, 0x6695dea600000000, 0xc988551d00000000,
+    0xac832c7400000000, 0x7ce2184c00000000, 0x19e9612500000000,
+    0xb6f4ea9e00000000, 0xd3ff93f700000000, 0xa9c98d3200000000,
+    0xccc2f45b00000000, 0x63df7fe000000000, 0x06d4068900000000,
+    0xbdeaca5600000000, 0xd8e1b33f00000000, 0x77fc388400000000,
+    0x12f741ed00000000, 0x68c15f2800000000, 0x0dca264100000000,
+    0xa2d7adfa00000000, 0xc7dcd49300000000, 0x17bde0ab00000000,
+    0x72b699c200000000, 0xddab127900000000, 0xb8a06b1000000000,
+    0xc29675d500000000, 0xa79d0cbc00000000, 0x0880870700000000,
+    0x6d8bfe6e00000000, 0xa843ef7700000000, 0xcd48961e00000000,
+    0x62551da500000000, 0x075e64cc00000000, 0x7d687a0900000000,
+    0x1863036000000000, 0xb77e88db00000000, 0xd275f1b200000000,
+    0x0214c58a00000000, 0x671fbce300000000, 0xc802375800000000,
+    0xad094e3100000000, 0xd73f50f400000000, 0xb234299d00000000,
+    0x1d29a22600000000, 0x7822db4f00000000, 0x97b8811400000000,
+    0xf2b3f87d00000000, 0x5dae73c600000000, 0x38a50aaf00000000,
+    0x4293146a00000000, 0x27986d0300000000, 0x8885e6b800000000,
+    0xed8e9fd100000000, 0x3defabe900000000, 0x58e4d28000000000,
+    0xf7f9593b00000000, 0x92f2205200000000, 0xe8c43e9700000000,
+    0x8dcf47fe00000000, 0x22d2cc4500000000, 0x47d9b52c00000000,
+    0x8211a43500000000, 0xe71add5c00000000, 0x480756e700000000,
+    0x2d0c2f8e00000000, 0x573a314b00000000, 0x3231482200000000,
+    0x9d2cc39900000000, 0xf827baf000000000, 0x28468ec800000000,
+    0x4d4df7a100000000, 0xe2507c1a00000000, 0x875b057300000000,
+    0xfd6d1bb600000000, 0x986662df00000000, 0x377be96400000000,
+    0x5270900d00000000},
+   {0x0000000000000000, 0xdcecb13d00000000, 0xb8d9637b00000000,
+    0x6435d24600000000, 0x70b3c7f600000000, 0xac5f76cb00000000,
+    0xc86aa48d00000000, 0x148615b000000000, 0xa160fe3600000000,
+    0x7d8c4f0b00000000, 0x19b99d4d00000000, 0xc5552c7000000000,
+    0xd1d339c000000000, 0x0d3f88fd00000000, 0x690a5abb00000000,
+    0xb5e6eb8600000000, 0x42c1fc6d00000000, 0x9e2d4d5000000000,
+    0xfa189f1600000000, 0x26f42e2b00000000, 0x32723b9b00000000,
+    0xee9e8aa600000000, 0x8aab58e000000000, 0x5647e9dd00000000,
+    0xe3a1025b00000000, 0x3f4db36600000000, 0x5b78612000000000,
+    0x8794d01d00000000, 0x9312c5ad00000000, 0x4ffe749000000000,
+    0x2bcba6d600000000, 0xf72717eb00000000, 0x8482f9db00000000,
+    0x586e48e600000000, 0x3c5b9aa000000000, 0xe0b72b9d00000000,
+    0xf4313e2d00000000, 0x28dd8f1000000000, 0x4ce85d5600000000,
+    0x9004ec6b00000000, 0x25e207ed00000000, 0xf90eb6d000000000,
+    0x9d3b649600000000, 0x41d7d5ab00000000, 0x5551c01b00000000,
+    0x89bd712600000000, 0xed88a36000000000, 0x3164125d00000000,
+    0xc64305b600000000, 0x1aafb48b00000000, 0x7e9a66cd00000000,
+    0xa276d7f000000000, 0xb6f0c24000000000, 0x6a1c737d00000000,
+    0x0e29a13b00000000, 0xd2c5100600000000, 0x6723fb8000000000,
+    0xbbcf4abd00000000, 0xdffa98fb00000000, 0x031629c600000000,
+    0x17903c7600000000, 0xcb7c8d4b00000000, 0xaf495f0d00000000,
+    0x73a5ee3000000000, 0x4903826c00000000, 0x95ef335100000000,
+    0xf1dae11700000000, 0x2d36502a00000000, 0x39b0459a00000000,
+    0xe55cf4a700000000, 0x816926e100000000, 0x5d8597dc00000000,
+    0xe8637c5a00000000, 0x348fcd6700000000, 0x50ba1f2100000000,
+    0x8c56ae1c00000000, 0x98d0bbac00000000, 0x443c0a9100000000,
+    0x2009d8d700000000, 0xfce569ea00000000, 0x0bc27e0100000000,
+    0xd72ecf3c00000000, 0xb31b1d7a00000000, 0x6ff7ac4700000000,
+    0x7b71b9f700000000, 0xa79d08ca00000000, 0xc3a8da8c00000000,
+    0x1f446bb100000000, 0xaaa2803700000000, 0x764e310a00000000,
+    0x127be34c00000000, 0xce97527100000000, 0xda1147c100000000,
+    0x06fdf6fc00000000, 0x62c824ba00000000, 0xbe24958700000000,
+    0xcd817bb700000000, 0x116dca8a00000000, 0x755818cc00000000,
+    0xa9b4a9f100000000, 0xbd32bc4100000000, 0x61de0d7c00000000,
+    0x05ebdf3a00000000, 0xd9076e0700000000, 0x6ce1858100000000,
+    0xb00d34bc00000000, 0xd438e6fa00000000, 0x08d457c700000000,
+    0x1c52427700000000, 0xc0bef34a00000000, 0xa48b210c00000000,
+    0x7867903100000000, 0x8f4087da00000000, 0x53ac36e700000000,
+    0x3799e4a100000000, 0xeb75559c00000000, 0xfff3402c00000000,
+    0x231ff11100000000, 0x472a235700000000, 0x9bc6926a00000000,
+    0x2e2079ec00000000, 0xf2ccc8d100000000, 0x96f91a9700000000,
+    0x4a15abaa00000000, 0x5e93be1a00000000, 0x827f0f2700000000,
+    0xe64add6100000000, 0x3aa66c5c00000000, 0x920604d900000000,
+    0x4eeab5e400000000, 0x2adf67a200000000, 0xf633d69f00000000,
+    0xe2b5c32f00000000, 0x3e59721200000000, 0x5a6ca05400000000,
+    0x8680116900000000, 0x3366faef00000000, 0xef8a4bd200000000,
+    0x8bbf999400000000, 0x575328a900000000, 0x43d53d1900000000,
+    0x9f398c2400000000, 0xfb0c5e6200000000, 0x27e0ef5f00000000,
+    0xd0c7f8b400000000, 0x0c2b498900000000, 0x681e9bcf00000000,
+    0xb4f22af200000000, 0xa0743f4200000000, 0x7c988e7f00000000,
+    0x18ad5c3900000000, 0xc441ed0400000000, 0x71a7068200000000,
+    0xad4bb7bf00000000, 0xc97e65f900000000, 0x1592d4c400000000,
+    0x0114c17400000000, 0xddf8704900000000, 0xb9cda20f00000000,
+    0x6521133200000000, 0x1684fd0200000000, 0xca684c3f00000000,
+    0xae5d9e7900000000, 0x72b12f4400000000, 0x66373af400000000,
+    0xbadb8bc900000000, 0xdeee598f00000000, 0x0202e8b200000000,
+    0xb7e4033400000000, 0x6b08b20900000000, 0x0f3d604f00000000,
+    0xd3d1d17200000000, 0xc757c4c200000000, 0x1bbb75ff00000000,
+    0x7f8ea7b900000000, 0xa362168400000000, 0x5445016f00000000,
+    0x88a9b05200000000, 0xec9c621400000000, 0x3070d32900000000,
+    0x24f6c69900000000, 0xf81a77a400000000, 0x9c2fa5e200000000,
+    0x40c314df00000000, 0xf525ff5900000000, 0x29c94e6400000000,
+    0x4dfc9c2200000000, 0x91102d1f00000000, 0x859638af00000000,
+    0x597a899200000000, 0x3d4f5bd400000000, 0xe1a3eae900000000,
+    0xdb0586b500000000, 0x07e9378800000000, 0x63dce5ce00000000,
+    0xbf3054f300000000, 0xabb6414300000000, 0x775af07e00000000,
+    0x136f223800000000, 0xcf83930500000000, 0x7a65788300000000,
+    0xa689c9be00000000, 0xc2bc1bf800000000, 0x1e50aac500000000,
+    0x0ad6bf7500000000, 0xd63a0e4800000000, 0xb20fdc0e00000000,
+    0x6ee36d3300000000, 0x99c47ad800000000, 0x4528cbe500000000,
+    0x211d19a300000000, 0xfdf1a89e00000000, 0xe977bd2e00000000,
+    0x359b0c1300000000, 0x51aede5500000000, 0x8d426f6800000000,
+    0x38a484ee00000000, 0xe44835d300000000, 0x807de79500000000,
+    0x5c9156a800000000, 0x4817431800000000, 0x94fbf22500000000,
+    0xf0ce206300000000, 0x2c22915e00000000, 0x5f877f6e00000000,
+    0x836bce5300000000, 0xe75e1c1500000000, 0x3bb2ad2800000000,
+    0x2f34b89800000000, 0xf3d809a500000000, 0x97eddbe300000000,
+    0x4b016ade00000000, 0xfee7815800000000, 0x220b306500000000,
+    0x463ee22300000000, 0x9ad2531e00000000, 0x8e5446ae00000000,
+    0x52b8f79300000000, 0x368d25d500000000, 0xea6194e800000000,
+    0x1d46830300000000, 0xc1aa323e00000000, 0xa59fe07800000000,
+    0x7973514500000000, 0x6df544f500000000, 0xb119f5c800000000,
+    0xd52c278e00000000, 0x09c096b300000000, 0xbc267d3500000000,
+    0x60cacc0800000000, 0x04ff1e4e00000000, 0xd813af7300000000,
+    0xcc95bac300000000, 0x10790bfe00000000, 0x744cd9b800000000,
+    0xa8a0688500000000}};
+
+#else /* W == 4 */
+
+local const z_crc_t FAR crc_braid_table[][256] = {
+   {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f,
+    0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999,
+    0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee,
+    0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615,
+    0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383,
+    0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb,
+    0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275,
+    0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d,
+    0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b,
+    0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460,
+    0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317,
+    0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1,
+    0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5,
+    0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd,
+    0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04,
+    0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c,
+    0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7,
+    0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11,
+    0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66,
+    0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7,
+    0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871,
+    0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309,
+    0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd,
+    0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85,
+    0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913,
+    0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d,
+    0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a,
+    0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc,
+    0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57,
+    0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f,
+    0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6,
+    0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e,
+    0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f,
+    0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289,
+    0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe,
+    0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05,
+    0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893,
+    0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb,
+    0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0,
+    0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8,
+    0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e,
+    0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5,
+    0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2,
+    0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574,
+    0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5,
+    0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add,
+    0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114,
+    0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c,
+    0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7,
+    0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701,
+    0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076,
+    0x09cd8551},
+   {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193,
+    0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2,
+    0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c,
+    0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71,
+    0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a,
+    0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d,
+    0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71,
+    0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436,
+    0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d,
+    0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000,
+    0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae,
+    0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf,
+    0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930,
+    0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277,
+    0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff,
+    0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8,
+    0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef,
+    0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e,
+    0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20,
+    0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95,
+    0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e,
+    0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9,
+    0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d,
+    0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a,
+    0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151,
+    0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4,
+    0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a,
+    0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b,
+    0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c,
+    0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b,
+    0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3,
+    0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4,
+    0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b,
+    0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a,
+    0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4,
+    0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189,
+    0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92,
+    0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5,
+    0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9,
+    0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe,
+    0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5,
+    0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8,
+    0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66,
+    0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707,
+    0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8,
+    0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f,
+    0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707,
+    0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40,
+    0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017,
+    0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876,
+    0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8,
+    0x7bc97a0c},
+   {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300,
+    0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0,
+    0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80,
+    0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701,
+    0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41,
+    0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81,
+    0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43,
+    0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83,
+    0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3,
+    0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42,
+    0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202,
+    0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2,
+    0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7,
+    0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407,
+    0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47,
+    0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87,
+    0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86,
+    0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46,
+    0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506,
+    0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44,
+    0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704,
+    0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4,
+    0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5,
+    0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505,
+    0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45,
+    0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f,
+    0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f,
+    0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f,
+    0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e,
+    0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e,
+    0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e,
+    0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce,
+    0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c,
+    0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc,
+    0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c,
+    0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d,
+    0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d,
+    0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d,
+    0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88,
+    0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48,
+    0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708,
+    0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89,
+    0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9,
+    0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309,
+    0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb,
+    0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b,
+    0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b,
+    0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b,
+    0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a,
+    0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a,
+    0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a,
+    0x7851a2ca},
+   {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb,
+    0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8,
+    0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0,
+    0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f,
+    0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a,
+    0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf,
+    0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5,
+    0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380,
+    0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815,
+    0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa,
+    0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2,
+    0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1,
+    0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1,
+    0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4,
+    0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa,
+    0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df,
+    0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6,
+    0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5,
+    0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad,
+    0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca,
+    0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f,
+    0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a,
+    0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8,
+    0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d,
+    0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708,
+    0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d,
+    0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865,
+    0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636,
+    0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f,
+    0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a,
+    0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744,
+    0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061,
+    0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0,
+    0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293,
+    0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb,
+    0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874,
+    0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1,
+    0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4,
+    0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f,
+    0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a,
+    0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f,
+    0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120,
+    0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778,
+    0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b,
+    0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a,
+    0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af,
+    0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81,
+    0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4,
+    0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd,
+    0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e,
+    0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6,
+    0x566b6848}};
+
+local const z_word_t FAR crc_braid_big_table[][256] = {
+   {0x00000000, 0x9e83da9f, 0x7d01c4e4, 0xe3821e7b, 0xbb04f912,
+    0x2587238d, 0xc6053df6, 0x5886e769, 0x7609f225, 0xe88a28ba,
+    0x0b0836c1, 0x958bec5e, 0xcd0d0b37, 0x538ed1a8, 0xb00ccfd3,
+    0x2e8f154c, 0xec12e44b, 0x72913ed4, 0x911320af, 0x0f90fa30,
+    0x57161d59, 0xc995c7c6, 0x2a17d9bd, 0xb4940322, 0x9a1b166e,
+    0x0498ccf1, 0xe71ad28a, 0x79990815, 0x211fef7c, 0xbf9c35e3,
+    0x5c1e2b98, 0xc29df107, 0xd825c897, 0x46a61208, 0xa5240c73,
+    0x3ba7d6ec, 0x63213185, 0xfda2eb1a, 0x1e20f561, 0x80a32ffe,
+    0xae2c3ab2, 0x30afe02d, 0xd32dfe56, 0x4dae24c9, 0x1528c3a0,
+    0x8bab193f, 0x68290744, 0xf6aadddb, 0x34372cdc, 0xaab4f643,
+    0x4936e838, 0xd7b532a7, 0x8f33d5ce, 0x11b00f51, 0xf232112a,
+    0x6cb1cbb5, 0x423edef9, 0xdcbd0466, 0x3f3f1a1d, 0xa1bcc082,
+    0xf93a27eb, 0x67b9fd74, 0x843be30f, 0x1ab83990, 0xf14de1f4,
+    0x6fce3b6b, 0x8c4c2510, 0x12cfff8f, 0x4a4918e6, 0xd4cac279,
+    0x3748dc02, 0xa9cb069d, 0x874413d1, 0x19c7c94e, 0xfa45d735,
+    0x64c60daa, 0x3c40eac3, 0xa2c3305c, 0x41412e27, 0xdfc2f4b8,
+    0x1d5f05bf, 0x83dcdf20, 0x605ec15b, 0xfedd1bc4, 0xa65bfcad,
+    0x38d82632, 0xdb5a3849, 0x45d9e2d6, 0x6b56f79a, 0xf5d52d05,
+    0x1657337e, 0x88d4e9e1, 0xd0520e88, 0x4ed1d417, 0xad53ca6c,
+    0x33d010f3, 0x29682963, 0xb7ebf3fc, 0x5469ed87, 0xcaea3718,
+    0x926cd071, 0x0cef0aee, 0xef6d1495, 0x71eece0a, 0x5f61db46,
+    0xc1e201d9, 0x22601fa2, 0xbce3c53d, 0xe4652254, 0x7ae6f8cb,
+    0x9964e6b0, 0x07e73c2f, 0xc57acd28, 0x5bf917b7, 0xb87b09cc,
+    0x26f8d353, 0x7e7e343a, 0xe0fdeea5, 0x037ff0de, 0x9dfc2a41,
+    0xb3733f0d, 0x2df0e592, 0xce72fbe9, 0x50f12176, 0x0877c61f,
+    0x96f41c80, 0x757602fb, 0xebf5d864, 0xa39db332, 0x3d1e69ad,
+    0xde9c77d6, 0x401fad49, 0x18994a20, 0x861a90bf, 0x65988ec4,
+    0xfb1b545b, 0xd5944117, 0x4b179b88, 0xa89585f3, 0x36165f6c,
+    0x6e90b805, 0xf013629a, 0x13917ce1, 0x8d12a67e, 0x4f8f5779,
+    0xd10c8de6, 0x328e939d, 0xac0d4902, 0xf48bae6b, 0x6a0874f4,
+    0x898a6a8f, 0x1709b010, 0x3986a55c, 0xa7057fc3, 0x448761b8,
+    0xda04bb27, 0x82825c4e, 0x1c0186d1, 0xff8398aa, 0x61004235,
+    0x7bb87ba5, 0xe53ba13a, 0x06b9bf41, 0x983a65de, 0xc0bc82b7,
+    0x5e3f5828, 0xbdbd4653, 0x233e9ccc, 0x0db18980, 0x9332531f,
+    0x70b04d64, 0xee3397fb, 0xb6b57092, 0x2836aa0d, 0xcbb4b476,
+    0x55376ee9, 0x97aa9fee, 0x09294571, 0xeaab5b0a, 0x74288195,
+    0x2cae66fc, 0xb22dbc63, 0x51afa218, 0xcf2c7887, 0xe1a36dcb,
+    0x7f20b754, 0x9ca2a92f, 0x022173b0, 0x5aa794d9, 0xc4244e46,
+    0x27a6503d, 0xb9258aa2, 0x52d052c6, 0xcc538859, 0x2fd19622,
+    0xb1524cbd, 0xe9d4abd4, 0x7757714b, 0x94d56f30, 0x0a56b5af,
+    0x24d9a0e3, 0xba5a7a7c, 0x59d86407, 0xc75bbe98, 0x9fdd59f1,
+    0x015e836e, 0xe2dc9d15, 0x7c5f478a, 0xbec2b68d, 0x20416c12,
+    0xc3c37269, 0x5d40a8f6, 0x05c64f9f, 0x9b459500, 0x78c78b7b,
+    0xe64451e4, 0xc8cb44a8, 0x56489e37, 0xb5ca804c, 0x2b495ad3,
+    0x73cfbdba, 0xed4c6725, 0x0ece795e, 0x904da3c1, 0x8af59a51,
+    0x147640ce, 0xf7f45eb5, 0x6977842a, 0x31f16343, 0xaf72b9dc,
+    0x4cf0a7a7, 0xd2737d38, 0xfcfc6874, 0x627fb2eb, 0x81fdac90,
+    0x1f7e760f, 0x47f89166, 0xd97b4bf9, 0x3af95582, 0xa47a8f1d,
+    0x66e77e1a, 0xf864a485, 0x1be6bafe, 0x85656061, 0xdde38708,
+    0x43605d97, 0xa0e243ec, 0x3e619973, 0x10ee8c3f, 0x8e6d56a0,
+    0x6def48db, 0xf36c9244, 0xabea752d, 0x3569afb2, 0xd6ebb1c9,
+    0x48686b56},
+   {0x00000000, 0xc0642817, 0x80c9502e, 0x40ad7839, 0x0093a15c,
+    0xc0f7894b, 0x805af172, 0x403ed965, 0x002643b9, 0xc0426bae,
+    0x80ef1397, 0x408b3b80, 0x00b5e2e5, 0xc0d1caf2, 0x807cb2cb,
+    0x40189adc, 0x414af7a9, 0x812edfbe, 0xc183a787, 0x01e78f90,
+    0x41d956f5, 0x81bd7ee2, 0xc11006db, 0x01742ecc, 0x416cb410,
+    0x81089c07, 0xc1a5e43e, 0x01c1cc29, 0x41ff154c, 0x819b3d5b,
+    0xc1364562, 0x01526d75, 0xc3929f88, 0x03f6b79f, 0x435bcfa6,
+    0x833fe7b1, 0xc3013ed4, 0x036516c3, 0x43c86efa, 0x83ac46ed,
+    0xc3b4dc31, 0x03d0f426, 0x437d8c1f, 0x8319a408, 0xc3277d6d,
+    0x0343557a, 0x43ee2d43, 0x838a0554, 0x82d86821, 0x42bc4036,
+    0x0211380f, 0xc2751018, 0x824bc97d, 0x422fe16a, 0x02829953,
+    0xc2e6b144, 0x82fe2b98, 0x429a038f, 0x02377bb6, 0xc25353a1,
+    0x826d8ac4, 0x4209a2d3, 0x02a4daea, 0xc2c0f2fd, 0xc7234eca,
+    0x074766dd, 0x47ea1ee4, 0x878e36f3, 0xc7b0ef96, 0x07d4c781,
+    0x4779bfb8, 0x871d97af, 0xc7050d73, 0x07612564, 0x47cc5d5d,
+    0x87a8754a, 0xc796ac2f, 0x07f28438, 0x475ffc01, 0x873bd416,
+    0x8669b963, 0x460d9174, 0x06a0e94d, 0xc6c4c15a, 0x86fa183f,
+    0x469e3028, 0x06334811, 0xc6576006, 0x864ffada, 0x462bd2cd,
+    0x0686aaf4, 0xc6e282e3, 0x86dc5b86, 0x46b87391, 0x06150ba8,
+    0xc67123bf, 0x04b1d142, 0xc4d5f955, 0x8478816c, 0x441ca97b,
+    0x0422701e, 0xc4465809, 0x84eb2030, 0x448f0827, 0x049792fb,
+    0xc4f3baec, 0x845ec2d5, 0x443aeac2, 0x040433a7, 0xc4601bb0,
+    0x84cd6389, 0x44a94b9e, 0x45fb26eb, 0x859f0efc, 0xc53276c5,
+    0x05565ed2, 0x456887b7, 0x850cafa0, 0xc5a1d799, 0x05c5ff8e,
+    0x45dd6552, 0x85b94d45, 0xc514357c, 0x05701d6b, 0x454ec40e,
+    0x852aec19, 0xc5879420, 0x05e3bc37, 0xcf41ed4f, 0x0f25c558,
+    0x4f88bd61, 0x8fec9576, 0xcfd24c13, 0x0fb66404, 0x4f1b1c3d,
+    0x8f7f342a, 0xcf67aef6, 0x0f0386e1, 0x4faefed8, 0x8fcad6cf,
+    0xcff40faa, 0x0f9027bd, 0x4f3d5f84, 0x8f597793, 0x8e0b1ae6,
+    0x4e6f32f1, 0x0ec24ac8, 0xcea662df, 0x8e98bbba, 0x4efc93ad,
+    0x0e51eb94, 0xce35c383, 0x8e2d595f, 0x4e497148, 0x0ee40971,
+    0xce802166, 0x8ebef803, 0x4edad014, 0x0e77a82d, 0xce13803a,
+    0x0cd372c7, 0xccb75ad0, 0x8c1a22e9, 0x4c7e0afe, 0x0c40d39b,
+    0xcc24fb8c, 0x8c8983b5, 0x4cedaba2, 0x0cf5317e, 0xcc911969,
+    0x8c3c6150, 0x4c584947, 0x0c669022, 0xcc02b835, 0x8cafc00c,
+    0x4ccbe81b, 0x4d99856e, 0x8dfdad79, 0xcd50d540, 0x0d34fd57,
+    0x4d0a2432, 0x8d6e0c25, 0xcdc3741c, 0x0da75c0b, 0x4dbfc6d7,
+    0x8ddbeec0, 0xcd7696f9, 0x0d12beee, 0x4d2c678b, 0x8d484f9c,
+    0xcde537a5, 0x0d811fb2, 0x0862a385, 0xc8068b92, 0x88abf3ab,
+    0x48cfdbbc, 0x08f102d9, 0xc8952ace, 0x883852f7, 0x485c7ae0,
+    0x0844e03c, 0xc820c82b, 0x888db012, 0x48e99805, 0x08d74160,
+    0xc8b36977, 0x881e114e, 0x487a3959, 0x4928542c, 0x894c7c3b,
+    0xc9e10402, 0x09852c15, 0x49bbf570, 0x89dfdd67, 0xc972a55e,
+    0x09168d49, 0x490e1795, 0x896a3f82, 0xc9c747bb, 0x09a36fac,
+    0x499db6c9, 0x89f99ede, 0xc954e6e7, 0x0930cef0, 0xcbf03c0d,
+    0x0b94141a, 0x4b396c23, 0x8b5d4434, 0xcb639d51, 0x0b07b546,
+    0x4baacd7f, 0x8bcee568, 0xcbd67fb4, 0x0bb257a3, 0x4b1f2f9a,
+    0x8b7b078d, 0xcb45dee8, 0x0b21f6ff, 0x4b8c8ec6, 0x8be8a6d1,
+    0x8abacba4, 0x4adee3b3, 0x0a739b8a, 0xca17b39d, 0x8a296af8,
+    0x4a4d42ef, 0x0ae03ad6, 0xca8412c1, 0x8a9c881d, 0x4af8a00a,
+    0x0a55d833, 0xca31f024, 0x8a0f2941, 0x4a6b0156, 0x0ac6796f,
+    0xcaa25178},
+   {0x00000000, 0xd4ea739b, 0xe9d396ed, 0x3d39e576, 0x93a15c00,
+    0x474b2f9b, 0x7a72caed, 0xae98b976, 0x2643b900, 0xf2a9ca9b,
+    0xcf902fed, 0x1b7a5c76, 0xb5e2e500, 0x6108969b, 0x5c3173ed,
+    0x88db0076, 0x4c867201, 0x986c019a, 0xa555e4ec, 0x71bf9777,
+    0xdf272e01, 0x0bcd5d9a, 0x36f4b8ec, 0xe21ecb77, 0x6ac5cb01,
+    0xbe2fb89a, 0x83165dec, 0x57fc2e77, 0xf9649701, 0x2d8ee49a,
+    0x10b701ec, 0xc45d7277, 0x980ce502, 0x4ce69699, 0x71df73ef,
+    0xa5350074, 0x0badb902, 0xdf47ca99, 0xe27e2fef, 0x36945c74,
+    0xbe4f5c02, 0x6aa52f99, 0x579ccaef, 0x8376b974, 0x2dee0002,
+    0xf9047399, 0xc43d96ef, 0x10d7e574, 0xd48a9703, 0x0060e498,
+    0x3d5901ee, 0xe9b37275, 0x472bcb03, 0x93c1b898, 0xaef85dee,
+    0x7a122e75, 0xf2c92e03, 0x26235d98, 0x1b1ab8ee, 0xcff0cb75,
+    0x61687203, 0xb5820198, 0x88bbe4ee, 0x5c519775, 0x3019ca05,
+    0xe4f3b99e, 0xd9ca5ce8, 0x0d202f73, 0xa3b89605, 0x7752e59e,
+    0x4a6b00e8, 0x9e817373, 0x165a7305, 0xc2b0009e, 0xff89e5e8,
+    0x2b639673, 0x85fb2f05, 0x51115c9e, 0x6c28b9e8, 0xb8c2ca73,
+    0x7c9fb804, 0xa875cb9f, 0x954c2ee9, 0x41a65d72, 0xef3ee404,
+    0x3bd4979f, 0x06ed72e9, 0xd2070172, 0x5adc0104, 0x8e36729f,
+    0xb30f97e9, 0x67e5e472, 0xc97d5d04, 0x1d972e9f, 0x20aecbe9,
+    0xf444b872, 0xa8152f07, 0x7cff5c9c, 0x41c6b9ea, 0x952cca71,
+    0x3bb47307, 0xef5e009c, 0xd267e5ea, 0x068d9671, 0x8e569607,
+    0x5abce59c, 0x678500ea, 0xb36f7371, 0x1df7ca07, 0xc91db99c,
+    0xf4245cea, 0x20ce2f71, 0xe4935d06, 0x30792e9d, 0x0d40cbeb,
+    0xd9aab870, 0x77320106, 0xa3d8729d, 0x9ee197eb, 0x4a0be470,
+    0xc2d0e406, 0x163a979d, 0x2b0372eb, 0xffe90170, 0x5171b806,
+    0x859bcb9d, 0xb8a22eeb, 0x6c485d70, 0x6032940b, 0xb4d8e790,
+    0x89e102e6, 0x5d0b717d, 0xf393c80b, 0x2779bb90, 0x1a405ee6,
+    0xceaa2d7d, 0x46712d0b, 0x929b5e90, 0xafa2bbe6, 0x7b48c87d,
+    0xd5d0710b, 0x013a0290, 0x3c03e7e6, 0xe8e9947d, 0x2cb4e60a,
+    0xf85e9591, 0xc56770e7, 0x118d037c, 0xbf15ba0a, 0x6bffc991,
+    0x56c62ce7, 0x822c5f7c, 0x0af75f0a, 0xde1d2c91, 0xe324c9e7,
+    0x37ceba7c, 0x9956030a, 0x4dbc7091, 0x708595e7, 0xa46fe67c,
+    0xf83e7109, 0x2cd40292, 0x11ede7e4, 0xc507947f, 0x6b9f2d09,
+    0xbf755e92, 0x824cbbe4, 0x56a6c87f, 0xde7dc809, 0x0a97bb92,
+    0x37ae5ee4, 0xe3442d7f, 0x4ddc9409, 0x9936e792, 0xa40f02e4,
+    0x70e5717f, 0xb4b80308, 0x60527093, 0x5d6b95e5, 0x8981e67e,
+    0x27195f08, 0xf3f32c93, 0xcecac9e5, 0x1a20ba7e, 0x92fbba08,
+    0x4611c993, 0x7b282ce5, 0xafc25f7e, 0x015ae608, 0xd5b09593,
+    0xe88970e5, 0x3c63037e, 0x502b5e0e, 0x84c12d95, 0xb9f8c8e3,
+    0x6d12bb78, 0xc38a020e, 0x17607195, 0x2a5994e3, 0xfeb3e778,
+    0x7668e70e, 0xa2829495, 0x9fbb71e3, 0x4b510278, 0xe5c9bb0e,
+    0x3123c895, 0x0c1a2de3, 0xd8f05e78, 0x1cad2c0f, 0xc8475f94,
+    0xf57ebae2, 0x2194c979, 0x8f0c700f, 0x5be60394, 0x66dfe6e2,
+    0xb2359579, 0x3aee950f, 0xee04e694, 0xd33d03e2, 0x07d77079,
+    0xa94fc90f, 0x7da5ba94, 0x409c5fe2, 0x94762c79, 0xc827bb0c,
+    0x1ccdc897, 0x21f42de1, 0xf51e5e7a, 0x5b86e70c, 0x8f6c9497,
+    0xb25571e1, 0x66bf027a, 0xee64020c, 0x3a8e7197, 0x07b794e1,
+    0xd35de77a, 0x7dc55e0c, 0xa92f2d97, 0x9416c8e1, 0x40fcbb7a,
+    0x84a1c90d, 0x504bba96, 0x6d725fe0, 0xb9982c7b, 0x1700950d,
+    0xc3eae696, 0xfed303e0, 0x2a39707b, 0xa2e2700d, 0x76080396,
+    0x4b31e6e0, 0x9fdb957b, 0x31432c0d, 0xe5a95f96, 0xd890bae0,
+    0x0c7ac97b},
+   {0x00000000, 0x27652581, 0x0fcc3bd9, 0x28a91e58, 0x5f9e0669,
+    0x78fb23e8, 0x50523db0, 0x77371831, 0xbe3c0dd2, 0x99592853,
+    0xb1f0360b, 0x9695138a, 0xe1a20bbb, 0xc6c72e3a, 0xee6e3062,
+    0xc90b15e3, 0x3d7f6b7f, 0x1a1a4efe, 0x32b350a6, 0x15d67527,
+    0x62e16d16, 0x45844897, 0x6d2d56cf, 0x4a48734e, 0x834366ad,
+    0xa426432c, 0x8c8f5d74, 0xabea78f5, 0xdcdd60c4, 0xfbb84545,
+    0xd3115b1d, 0xf4747e9c, 0x7afed6fe, 0x5d9bf37f, 0x7532ed27,
+    0x5257c8a6, 0x2560d097, 0x0205f516, 0x2aaceb4e, 0x0dc9cecf,
+    0xc4c2db2c, 0xe3a7fead, 0xcb0ee0f5, 0xec6bc574, 0x9b5cdd45,
+    0xbc39f8c4, 0x9490e69c, 0xb3f5c31d, 0x4781bd81, 0x60e49800,
+    0x484d8658, 0x6f28a3d9, 0x181fbbe8, 0x3f7a9e69, 0x17d38031,
+    0x30b6a5b0, 0xf9bdb053, 0xded895d2, 0xf6718b8a, 0xd114ae0b,
+    0xa623b63a, 0x814693bb, 0xa9ef8de3, 0x8e8aa862, 0xb5fadc26,
+    0x929ff9a7, 0xba36e7ff, 0x9d53c27e, 0xea64da4f, 0xcd01ffce,
+    0xe5a8e196, 0xc2cdc417, 0x0bc6d1f4, 0x2ca3f475, 0x040aea2d,
+    0x236fcfac, 0x5458d79d, 0x733df21c, 0x5b94ec44, 0x7cf1c9c5,
+    0x8885b759, 0xafe092d8, 0x87498c80, 0xa02ca901, 0xd71bb130,
+    0xf07e94b1, 0xd8d78ae9, 0xffb2af68, 0x36b9ba8b, 0x11dc9f0a,
+    0x39758152, 0x1e10a4d3, 0x6927bce2, 0x4e429963, 0x66eb873b,
+    0x418ea2ba, 0xcf040ad8, 0xe8612f59, 0xc0c83101, 0xe7ad1480,
+    0x909a0cb1, 0xb7ff2930, 0x9f563768, 0xb83312e9, 0x7138070a,
+    0x565d228b, 0x7ef43cd3, 0x59911952, 0x2ea60163, 0x09c324e2,
+    0x216a3aba, 0x060f1f3b, 0xf27b61a7, 0xd51e4426, 0xfdb75a7e,
+    0xdad27fff, 0xade567ce, 0x8a80424f, 0xa2295c17, 0x854c7996,
+    0x4c476c75, 0x6b2249f4, 0x438b57ac, 0x64ee722d, 0x13d96a1c,
+    0x34bc4f9d, 0x1c1551c5, 0x3b707444, 0x6af5b94d, 0x4d909ccc,
+    0x65398294, 0x425ca715, 0x356bbf24, 0x120e9aa5, 0x3aa784fd,
+    0x1dc2a17c, 0xd4c9b49f, 0xf3ac911e, 0xdb058f46, 0xfc60aac7,
+    0x8b57b2f6, 0xac329777, 0x849b892f, 0xa3feacae, 0x578ad232,
+    0x70eff7b3, 0x5846e9eb, 0x7f23cc6a, 0x0814d45b, 0x2f71f1da,
+    0x07d8ef82, 0x20bdca03, 0xe9b6dfe0, 0xced3fa61, 0xe67ae439,
+    0xc11fc1b8, 0xb628d989, 0x914dfc08, 0xb9e4e250, 0x9e81c7d1,
+    0x100b6fb3, 0x376e4a32, 0x1fc7546a, 0x38a271eb, 0x4f9569da,
+    0x68f04c5b, 0x40595203, 0x673c7782, 0xae376261, 0x895247e0,
+    0xa1fb59b8, 0x869e7c39, 0xf1a96408, 0xd6cc4189, 0xfe655fd1,
+    0xd9007a50, 0x2d7404cc, 0x0a11214d, 0x22b83f15, 0x05dd1a94,
+    0x72ea02a5, 0x558f2724, 0x7d26397c, 0x5a431cfd, 0x9348091e,
+    0xb42d2c9f, 0x9c8432c7, 0xbbe11746, 0xccd60f77, 0xebb32af6,
+    0xc31a34ae, 0xe47f112f, 0xdf0f656b, 0xf86a40ea, 0xd0c35eb2,
+    0xf7a67b33, 0x80916302, 0xa7f44683, 0x8f5d58db, 0xa8387d5a,
+    0x613368b9, 0x46564d38, 0x6eff5360, 0x499a76e1, 0x3ead6ed0,
+    0x19c84b51, 0x31615509, 0x16047088, 0xe2700e14, 0xc5152b95,
+    0xedbc35cd, 0xcad9104c, 0xbdee087d, 0x9a8b2dfc, 0xb22233a4,
+    0x95471625, 0x5c4c03c6, 0x7b292647, 0x5380381f, 0x74e51d9e,
+    0x03d205af, 0x24b7202e, 0x0c1e3e76, 0x2b7b1bf7, 0xa5f1b395,
+    0x82949614, 0xaa3d884c, 0x8d58adcd, 0xfa6fb5fc, 0xdd0a907d,
+    0xf5a38e25, 0xd2c6aba4, 0x1bcdbe47, 0x3ca89bc6, 0x1401859e,
+    0x3364a01f, 0x4453b82e, 0x63369daf, 0x4b9f83f7, 0x6cfaa676,
+    0x988ed8ea, 0xbfebfd6b, 0x9742e333, 0xb027c6b2, 0xc710de83,
+    0xe075fb02, 0xc8dce55a, 0xefb9c0db, 0x26b2d538, 0x01d7f0b9,
+    0x297eeee1, 0x0e1bcb60, 0x792cd351, 0x5e49f6d0, 0x76e0e888,
+    0x5185cd09}};
+
+#endif
+
+#endif
+
+#endif
+
+local const z_crc_t FAR x2n_table[] = {
+    0x40000000, 0x20000000, 0x08000000, 0x00800000, 0x00008000,
+    0xedb88320, 0xb1e6b092, 0xa06a2517, 0xed627dae, 0x88d14467,
+    0xd7bbfe6a, 0xec447f11, 0x8e7ea170, 0x6427800e, 0x4d47bae0,
+    0x09fe548f, 0x83852d0f, 0x30362f1a, 0x7b5a9cc3, 0x31fec169,
+    0x9fec022a, 0x6c8dedc4, 0x15d6874d, 0x5fde7a4e, 0xbad90e37,
+    0x2e4e5eef, 0x4eaba214, 0xa8a472c0, 0x429a969e, 0x148d302a,
+    0xc40ba6d0, 0xc4e22c3c};
diff --git a/deps/zlib/crc32_simd.c b/deps/zlib/crc32_simd.c
index 27481847e97b90..1181e0f9f2c07d 100644
--- a/deps/zlib/crc32_simd.c
+++ b/deps/zlib/crc32_simd.c
@@ -1,6 +1,6 @@
 /* crc32_simd.c
  *
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
@@ -161,11 +161,16 @@ uint32_t ZLIB_INTERNAL crc32_sse42_simd_(  /* SSE4.2+PCLMUL */
 #elif defined(CRC32_ARMV8_CRC32)
 
 /* CRC32 checksums using ARMv8-a crypto instructions.
- *
- * TODO: implement a version using the PMULL instruction.
  */
 
 #if defined(__clang__)
+/* We need some extra types for using PMULL.
+ */
+#if defined(__aarch64__)
+#include <arm_neon.h>
+#include <arm_acle.h>
+#endif
+
 /* CRC32 intrinsics are #ifdef'ed out of arm_acle.h unless we build with an
  * armv8 target, which is incompatible with ThinLTO optimizations on Android.
  * (Namely, mixing and matching different module-level targets makes ThinLTO
@@ -181,14 +186,21 @@ uint32_t ZLIB_INTERNAL crc32_sse42_simd_(  /* SSE4.2+PCLMUL */
  * NOTE: clang currently complains that "'+soft-float-abi' is not a recognized
  * feature for this target (ignoring feature)." This appears to be a harmless
  * bug in clang.
+ *
+ * These definitions must appear *after* including arm_acle.h otherwise that
+ * header may end up defining functions named __builtin_arm_crc32* that call
+ * themselves, creating an infinite loop when the intrinsic is called.
  */
+/* XXX: Cannot hook into builtins with XCode for arm64. */
+#if !defined(ARMV8_OS_MACOS)
 #define __crc32b __builtin_arm_crc32b
 #define __crc32d __builtin_arm_crc32d
 #define __crc32w __builtin_arm_crc32w
 #define __crc32cw __builtin_arm_crc32cw
+#endif
 
 #if defined(__aarch64__)
-#define TARGET_ARMV8_WITH_CRC __attribute__((target("crc")))
+#define TARGET_ARMV8_WITH_CRC __attribute__((target("aes,crc")))
 #else  // !defined(__aarch64__)
 #define TARGET_ARMV8_WITH_CRC __attribute__((target("armv8-a,crc")))
 #endif  // defined(__aarch64__)
@@ -198,15 +210,17 @@ uint32_t ZLIB_INTERNAL crc32_sse42_simd_(  /* SSE4.2+PCLMUL */
  * allowed. We can just include arm_acle.h.
  */
 #include <arm_acle.h>
+#include <arm_neon.h>
 #define TARGET_ARMV8_WITH_CRC
 #else  // !defined(__GNUC__) && !defined(_aarch64__)
 #error ARM CRC32 SIMD extensions only supported for Clang and GCC
 #endif
 
 TARGET_ARMV8_WITH_CRC
-uint32_t ZLIB_INTERNAL armv8_crc32_little(unsigned long crc,
-                                          const unsigned char *buf,
-                                          z_size_t len)
+uint32_t ZLIB_INTERNAL armv8_crc32_little(
+    const unsigned char *buf,
+    z_size_t len,
+    uint32_t crc)
 {
     uint32_t c = (uint32_t) ~crc;
 
@@ -244,4 +258,178 @@ uint32_t ZLIB_INTERNAL armv8_crc32_little(unsigned long crc,
     return ~c;
 }
 
+#if defined(__aarch64__) || defined(ARMV8_OS_MACOS) /* aarch64 specific code. */
+
+/*
+ * crc32_pmull_simd_(): compute the crc32 of the buffer, where the buffer
+ * length must be at least 64, and a multiple of 16. Based on:
+ *
+ * "Fast CRC Computation for Generic Polynomials Using PCLMULQDQ Instruction"
+ *  V. Gopal, E. Ozturk, et al., 2009, http://intel.ly/2ySEwL0
+ */
+TARGET_ARMV8_WITH_CRC
+static inline uint8x16_t pmull_lo(const uint64x2_t a, const uint64x2_t b)
+{
+    uint8x16_t r;
+    __asm__ __volatile__ ("pmull  %0.1q, %1.1d, %2.1d \n\t"
+        : "=w" (r) : "w" (a), "w" (b) );
+    return r;
+}
+
+TARGET_ARMV8_WITH_CRC
+static inline uint8x16_t pmull_01(const uint64x2_t a, const uint64x2_t b)
+{
+    uint8x16_t r;
+    __asm__ __volatile__ ("pmull  %0.1q, %1.1d, %2.1d \n\t"
+        : "=w" (r) : "w" (a), "w" (vgetq_lane_u64(b, 1)) );
+    return r;
+}
+
+TARGET_ARMV8_WITH_CRC
+static inline uint8x16_t pmull_hi(const uint64x2_t a, const uint64x2_t b)
+{
+    uint8x16_t r;
+    __asm__ __volatile__ ("pmull2 %0.1q, %1.2d, %2.2d \n\t"
+        : "=w" (r) : "w" (a), "w" (b) );
+    return r;
+}
+
+TARGET_ARMV8_WITH_CRC
+uint32_t ZLIB_INTERNAL armv8_crc32_pmull_little(
+    const unsigned char *buf,
+    z_size_t len,
+    uint32_t crc)
+{
+    /*
+     * Definitions of the bit-reflected domain constants k1,k2,k3, etc and
+     * the CRC32+Barrett polynomials given at the end of the paper.
+     */
+    static const uint64_t zalign(16) k1k2[] = { 0x0154442bd4, 0x01c6e41596 };
+    static const uint64_t zalign(16) k3k4[] = { 0x01751997d0, 0x00ccaa009e };
+    static const uint64_t zalign(16) k5k0[] = { 0x0163cd6124, 0x0000000000 };
+    static const uint64_t zalign(16) poly[] = { 0x01db710641, 0x01f7011641 };
+
+    uint64x2_t x0, x1, x2, x3, x4, x5, x6, x7, x8, y5, y6, y7, y8;
+
+    /*
+     * There's at least one block of 64.
+     */
+    x1 = vld1q_u64((const uint64_t *)(buf + 0x00));
+    x2 = vld1q_u64((const uint64_t *)(buf + 0x10));
+    x3 = vld1q_u64((const uint64_t *)(buf + 0x20));
+    x4 = vld1q_u64((const uint64_t *)(buf + 0x30));
+
+    x1 = veorq_u64(x1, (uint64x2_t) vsetq_lane_u32(crc, vdupq_n_u32(0), 0));
+
+    x0 = vld1q_u64(k1k2);
+
+    buf += 64;
+    len -= 64;
+
+    /*
+     * Parallel fold blocks of 64, if any.
+     */
+    while (len >= 64)
+    {
+        x5 = (uint64x2_t) pmull_lo(x1, x0);
+        x6 = (uint64x2_t) pmull_lo(x2, x0);
+        x7 = (uint64x2_t) pmull_lo(x3, x0);
+        x8 = (uint64x2_t) pmull_lo(x4, x0);
+
+        y5 = vld1q_u64((const uint64_t *)(buf + 0x00));
+        y6 = vld1q_u64((const uint64_t *)(buf + 0x10));
+        y7 = vld1q_u64((const uint64_t *)(buf + 0x20));
+        y8 = vld1q_u64((const uint64_t *)(buf + 0x30));
+
+        x1 = (uint64x2_t) pmull_hi(x1, x0);
+        x2 = (uint64x2_t) pmull_hi(x2, x0);
+        x3 = (uint64x2_t) pmull_hi(x3, x0);
+        x4 = (uint64x2_t) pmull_hi(x4, x0);
+
+        x1 = veorq_u64(x1, x5);
+        x2 = veorq_u64(x2, x6);
+        x3 = veorq_u64(x3, x7);
+        x4 = veorq_u64(x4, x8);
+
+        x1 = veorq_u64(x1, y5);
+        x2 = veorq_u64(x2, y6);
+        x3 = veorq_u64(x3, y7);
+        x4 = veorq_u64(x4, y8);
+
+        buf += 64;
+        len -= 64;
+    }
+
+    /*
+     * Fold into 128-bits.
+     */
+    x0 = vld1q_u64(k3k4);
+
+    x5 = (uint64x2_t) pmull_lo(x1, x0);
+    x1 = (uint64x2_t) pmull_hi(x1, x0);
+    x1 = veorq_u64(x1, x2);
+    x1 = veorq_u64(x1, x5);
+
+    x5 = (uint64x2_t) pmull_lo(x1, x0);
+    x1 = (uint64x2_t) pmull_hi(x1, x0);
+    x1 = veorq_u64(x1, x3);
+    x1 = veorq_u64(x1, x5);
+
+    x5 = (uint64x2_t) pmull_lo(x1, x0);
+    x1 = (uint64x2_t) pmull_hi(x1, x0);
+    x1 = veorq_u64(x1, x4);
+    x1 = veorq_u64(x1, x5);
+
+    /*
+     * Single fold blocks of 16, if any.
+     */
+    while (len >= 16)
+    {
+        x2 = vld1q_u64((const uint64_t *)buf);
+
+        x5 = (uint64x2_t) pmull_lo(x1, x0);
+        x1 = (uint64x2_t) pmull_hi(x1, x0);
+        x1 = veorq_u64(x1, x2);
+        x1 = veorq_u64(x1, x5);
+
+        buf += 16;
+        len -= 16;
+    }
+
+    /*
+     * Fold 128-bits to 64-bits.
+     */
+    static uint32_t zalign(16) mask[] = { ~0u, 0u, ~0u, 0u };
+
+    x2 = (uint64x2_t) pmull_01(x1, x0);
+    x1 = (uint64x2_t) vextq_u8(vreinterpretq_u8_u64(x1), vdupq_n_u8(0), 8);
+    x3 = (uint64x2_t) vld1q_u32(mask);
+    x1 = veorq_u64(x1, x2);
+
+    x0 = vld1q_u64(k5k0);
+
+    x2 = (uint64x2_t) pmull_01(x2, x0);
+    x2 = (uint64x2_t) vextq_u8(vreinterpretq_u8_u64(x1), vdupq_n_u8(0), 4);
+    x1 = vandq_u64(x1, x3);
+    x1 = (uint64x2_t) pmull_lo(x1, x0);
+    x1 = veorq_u64(x1, x2);
+
+    /*
+     * Barret reduce to 32-bits.
+     */
+    x0 = vld1q_u64(poly);
+
+    x2 = vandq_u64(x1, x3);
+    x2 = (uint64x2_t) pmull_01(x2, x0);
+    x2 = vandq_u64(x2, x3);
+    x2 = (uint64x2_t) pmull_lo(x2, x0);
+    x1 = veorq_u64(x1, x2);
+
+    /*
+     * Return the crc32.
+     */
+    return vgetq_lane_u32(vreinterpretq_u32_u64(x1), 1);
+}
+#endif /* aarch64 specific code. */
+
 #endif
diff --git a/deps/zlib/crc32_simd.h b/deps/zlib/crc32_simd.h
index 68bc235cbe1682..c0346dc3d903e3 100644
--- a/deps/zlib/crc32_simd.h
+++ b/deps/zlib/crc32_simd.h
@@ -1,6 +1,6 @@
 /* crc32_simd.h
  *
- * Copyright 2017 The Chromium Authors. All rights reserved.
+ * Copyright 2017 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
@@ -15,10 +15,9 @@
  * crc32_sse42_simd_(): compute the crc32 of the buffer, where the buffer
  * length must be at least 64, and a multiple of 16.
  */
-uint32_t ZLIB_INTERNAL crc32_sse42_simd_(
-    const unsigned char *buf,
-    z_size_t len,
-    uint32_t crc);
+uint32_t ZLIB_INTERNAL crc32_sse42_simd_(const unsigned char* buf,
+                                         z_size_t len,
+                                         uint32_t crc);
 
 /*
  * crc32_sse42_simd_ buffer size constraints: see the use in zlib/crc32.c
@@ -30,7 +29,23 @@ uint32_t ZLIB_INTERNAL crc32_sse42_simd_(
 /*
  * CRC32 checksums using ARMv8-a crypto instructions.
  */
-uint32_t ZLIB_INTERNAL armv8_crc32_little(unsigned long crc,
-                                          const unsigned char* buf,
-                                          z_size_t len);
+uint32_t ZLIB_INTERNAL armv8_crc32_little(const unsigned char* buf,
+                                          z_size_t len,
+                                          uint32_t crc);
 
+/* aarch64 specific code. */
+#if defined(__aarch64__)
+
+/* 128 is the sweet spot at the time of coding (late 2020). */
+#define Z_CRC32_PMULL_MINIMUM_LENGTH 128
+#define Z_CRC32_PMULL_CHUNKSIZE_MASK 15
+
+/*
+ * CRC32 checksums using ARMv8-a PMULL instructions, where the buffer
+ * length must be at least 64, and a multiple of 16.
+ */
+uint32_t ZLIB_INTERNAL armv8_crc32_pmull_little(const unsigned char* buf,
+                                                z_size_t len,
+                                                uint32_t crc);
+
+#endif
diff --git a/deps/zlib/crc_folding.c b/deps/zlib/crc_folding.c
index 54f4b5c9401089..4e9c6e78529f7e 100644
--- a/deps/zlib/crc_folding.c
+++ b/deps/zlib/crc_folding.c
@@ -18,6 +18,8 @@
 
 #include "deflate.h"
 
+#ifdef CRC32_SIMD_SSE42_PCLMUL
+
 #include <inttypes.h>
 #include <emmintrin.h>
 #include <immintrin.h>
@@ -294,7 +296,7 @@ ZLIB_INTERNAL void crc_fold_copy(deflate_state *const s,
         goto partial;
     }
 
-    algn_diff = 0 - (uintptr_t)src & 0xF;
+    algn_diff = (0 - (uintptr_t)src) & 0xF;
     if (algn_diff) {
         xmm_crc_part = _mm_loadu_si128((__m128i *)src);
         _mm_storeu_si128((__m128i *)dst, xmm_crc_part);
@@ -503,3 +505,5 @@ unsigned ZLIB_INTERNAL crc_fold_512to32(deflate_state *const s)
     return ~crc;
     CRC_SAVE(s)
 }
+
+#endif  /* CRC32_SIMD_SSE42_PCLMUL */
diff --git a/deps/zlib/deflate.c b/deps/zlib/deflate.c
index 201254ac1b664e..413590f2735d3c 100644
--- a/deps/zlib/deflate.c
+++ b/deps/zlib/deflate.c
@@ -1,5 +1,5 @@
 /* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ * Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -50,18 +50,22 @@
 /* @(#) $Id$ */
 #include <assert.h>
 #include "deflate.h"
-#include "x86.h"
-#include "contrib/optimizations/insert_string.h"
 
-#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
-#include "contrib/optimizations/slide_hash_neon.h"
+#include "cpu_features.h"
+
+#if defined(DEFLATE_SLIDE_HASH_SSE2) || defined(DEFLATE_SLIDE_HASH_NEON)
+#include "slide_hash_simd.h"
 #endif
-#if defined(CRC32_ARMV8_CRC32)
-#include "crc32_simd.h"
+
+#include "contrib/optimizations/insert_string.h"
+
+#ifdef FASTEST
+/* See http://crbug.com/1113596 */
+#error "FASTEST is not supported in Chromium's zlib."
 #endif
 
 const char deflate_copyright[] =
-   " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler ";
+   " deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler ";
 /*
   If you use the zlib library in a product, an acknowledgment is welcome
   in the documentation of your product. If for some reason you cannot
@@ -95,14 +99,8 @@ local block_state deflate_huff   OF((deflate_state *s, int flush));
 local void lm_init        OF((deflate_state *s));
 local void putShortMSB    OF((deflate_state *s, uInt b));
 local void flush_pending  OF((z_streamp strm));
-unsigned ZLIB_INTERNAL deflate_read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
-#ifdef ASMV
-#  pragma message("Assembler code may have bugs -- use at your own risk")
-      void match_init OF((void)); /* asm code initialization */
-      uInt longest_match  OF((deflate_state *s, IPos cur_match));
-#else
+local unsigned read_buf   OF((z_streamp strm, Bytef *buf, unsigned size));
 local uInt longest_match  OF((deflate_state *s, IPos cur_match));
-#endif
 
 #ifdef ZLIB_DEBUG
 local  void check_match OF((deflate_state *s, IPos start, IPos match,
@@ -171,10 +169,15 @@ local const config configuration_table[10] = {
 /* ===========================================================================
  * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
  * prev[] will be initialized on the fly.
+ * TODO(cavalcantii): optimization opportunity, check comments on:
+ * https://chromium-review.googlesource.com/c/chromium/src/+/3561506/
  */
 #define CLEAR_HASH(s) \
-    s->head[s->hash_size-1] = NIL; \
-    zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
+    do { \
+        s->head[s->hash_size - 1] = NIL; \
+        zmemzero((Bytef *)s->head, \
+                 (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \
+    } while (0)
 
 /* ===========================================================================
  * Slide the hash table when sliding the window down (could be avoided with 32
@@ -184,10 +187,11 @@ local const config configuration_table[10] = {
 local void slide_hash(s)
     deflate_state *s;
 {
-#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
-    /* NEON based hash table rebase. */
-    return neon_slide_hash(s->head, s->prev, s->w_size, s->hash_size);
+#if defined(DEFLATE_SLIDE_HASH_SSE2) || defined(DEFLATE_SLIDE_HASH_NEON)
+    slide_hash_simd(s->head, s->prev, s->w_size, s->hash_size);
+    return;
 #endif
+
     unsigned n, m;
     Posf *p;
     uInt wsize = s->w_size;
@@ -244,10 +248,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
     // for all wrapper formats (e.g. RAW, ZLIB, GZIP).
     // Feature detection is not triggered while using RAW mode (i.e. we never
     // call crc32() with a NULL buffer).
-#if defined(CRC32_ARMV8_CRC32)
-    arm_check_features();
-#elif defined(CRC32_SIMD_SSE42_PCLMUL)
-    x86_check_features();
+#if defined(CRC32_ARMV8_CRC32) || defined(CRC32_SIMD_SSE42_PCLMUL)
+    cpu_check_features();
 #endif
 
     if (version == Z_NULL || version[0] != my_version[0] ||
@@ -280,6 +282,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
 
     if (windowBits < 0) { /* suppress zlib wrapper */
         wrap = 0;
+        if (windowBits < -15)
+            return Z_STREAM_ERROR;
         windowBits = -windowBits;
     }
 #ifdef GZIP
@@ -306,20 +310,37 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
     s->w_size = 1 << s->w_bits;
     s->w_mask = s->w_size - 1;
 
-    if (x86_cpu_enable_simd) {
+    s->chromium_zlib_hash = 0;
+#if !defined(USE_ZLIB_RABIN_KARP_ROLLING_HASH)
+  #if defined(TARGET_CPU_WITH_CRC) && defined(CRC32_SIMD_SSE42_PCLMUL)
+    if (x86_cpu_enable_simd)
+      s->chromium_zlib_hash = 1;
+  #elif defined(TARGET_CPU_WITH_CRC) && defined(CRC32_ARMV8_CRC32)
+    if (arm_cpu_enable_crc32)
+      s->chromium_zlib_hash = 1;
+  #endif
+#endif
+
+    s->hash_bits = memLevel + 7;
+    if (s->chromium_zlib_hash && s->hash_bits < 15) {
         s->hash_bits = 15;
-    } else {
-        s->hash_bits = memLevel + 7;
     }
 
     s->hash_size = 1 << s->hash_bits;
     s->hash_mask = s->hash_size - 1;
-    s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
+    s->hash_shift =  ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH);
 
     s->window = (Bytef *) ZALLOC(strm,
                                  s->w_size + window_padding,
                                  2*sizeof(Byte));
+    /* Avoid use of unitialized values in the window, see crbug.com/1137613 and
+     * crbug.com/1144420 */
+    zmemzero(s->window, (s->w_size + window_padding) * (2 * sizeof(Byte)));
     s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
+    /* Avoid use of uninitialized value, see:
+     * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360
+     */
+    zmemzero(s->prev, s->w_size * sizeof(Pos));
     s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));
 
     s->high_water = 0;      /* nothing written to s->window yet */
@@ -342,11 +363,11 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
      * sym_buf value to read moves forward three bytes. From that symbol, up to
      * 31 bits are written to pending_buf. The closest the written pending_buf
      * bits gets to the next sym_buf symbol to read is just before the last
-     * code is written. At that time, 31*(n-2) bits have been written, just
-     * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at
-     * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1
+     * code is written. At that time, 31*(n - 2) bits have been written, just
+     * after 24*(n - 2) bits have been consumed from sym_buf. sym_buf starts at
+     * 8*n bits into pending_buf. (Note that the symbol buffer fills when n - 1
      * symbols are written.) The closest the writing gets to what is unread is
-     * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and
+     * then n + 14 bits. Here n is lit_bufsize, which is 16384 by default, and
      * can range from 128 to 32768.
      *
      * Therefore, at a minimum, there are 142 bits of space between what is
@@ -391,7 +412,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
 /* =========================================================================
  * Check for a valid deflate stream state. Return 0 if ok, 1 if not.
  */
-local int deflateStateCheck (strm)
+local int deflateStateCheck(strm)
     z_streamp strm;
 {
     deflate_state *s;
@@ -414,7 +435,7 @@ local int deflateStateCheck (strm)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
+int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength)
     z_streamp strm;
     const Bytef *dictionary;
     uInt  dictLength;
@@ -435,7 +456,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
     /* when using zlib wrappers, compute Adler-32 for provided dictionary */
     if (wrap == 1)
         strm->adler = adler32(strm->adler, dictionary, dictLength);
-    s->wrap = 0;                    /* avoid computing Adler-32 in deflate_read_buf */
+    s->wrap = 0;                    /* avoid computing Adler-32 in read_buf */
 
     /* if dictionary would fill window, just replace the history */
     if (dictLength >= s->w_size) {
@@ -479,7 +500,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength)
+int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength)
     z_streamp strm;
     Bytef *dictionary;
     uInt  *dictLength;
@@ -501,7 +522,7 @@ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateResetKeep (strm)
+int ZEXPORT deflateResetKeep(strm)
     z_streamp strm;
 {
     deflate_state *s;
@@ -525,13 +546,13 @@ int ZEXPORT deflateResetKeep (strm)
 #ifdef GZIP
         s->wrap == 2 ? GZIP_STATE :
 #endif
-        s->wrap ? INIT_STATE : BUSY_STATE;
+        INIT_STATE;
     strm->adler =
 #ifdef GZIP
         s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
 #endif
         adler32(0L, Z_NULL, 0);
-    s->last_flush = Z_NO_FLUSH;
+    s->last_flush = -2;
 
     _tr_init(s);
 
@@ -539,7 +560,7 @@ int ZEXPORT deflateResetKeep (strm)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateReset (strm)
+int ZEXPORT deflateReset(strm)
     z_streamp strm;
 {
     int ret;
@@ -551,7 +572,7 @@ int ZEXPORT deflateReset (strm)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateSetHeader (strm, head)
+int ZEXPORT deflateSetHeader(strm, head)
     z_streamp strm;
     gz_headerp head;
 {
@@ -562,7 +583,7 @@ int ZEXPORT deflateSetHeader (strm, head)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflatePending (strm, pending, bits)
+int ZEXPORT deflatePending(strm, pending, bits)
     unsigned *pending;
     int *bits;
     z_streamp strm;
@@ -576,7 +597,7 @@ int ZEXPORT deflatePending (strm, pending, bits)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflatePrime (strm, bits, value)
+int ZEXPORT deflatePrime(strm, bits, value)
     z_streamp strm;
     int bits;
     int value;
@@ -586,7 +607,8 @@ int ZEXPORT deflatePrime (strm, bits, value)
 
     if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
     s = strm->state;
-    if (s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
+    if (bits < 0 || bits > 16 ||
+        s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
         return Z_BUF_ERROR;
     do {
         put = Buf_size - s->bi_valid;
@@ -624,12 +646,12 @@ int ZEXPORT deflateParams(strm, level, strategy)
     func = configuration_table[s->level].func;
 
     if ((strategy != s->strategy || func != configuration_table[level].func) &&
-        s->high_water) {
+        s->last_flush != -2) {
         /* Flush the last buffer: */
         int err = deflate(strm, Z_BLOCK);
         if (err == Z_STREAM_ERROR)
             return err;
-        if (strm->avail_out == 0)
+        if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead)
             return Z_BUF_ERROR;
     }
     if (s->level != level) {
@@ -670,36 +692,50 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
 }
 
 /* =========================================================================
- * For the default windowBits of 15 and memLevel of 8, this function returns
- * a close to exact, as well as small, upper bound on the compressed size.
- * They are coded as constants here for a reason--if the #define's are
- * changed, then this function needs to be changed as well.  The return
- * value for 15 and 8 only works for those exact settings.
+ * For the default windowBits of 15 and memLevel of 8, this function returns a
+ * close to exact, as well as small, upper bound on the compressed size. This
+ * is an expansion of ~0.03%, plus a small constant.
+ *
+ * For any setting other than those defaults for windowBits and memLevel, one
+ * of two worst case bounds is returned. This is at most an expansion of ~4% or
+ * ~13%, plus a small constant.
+ *
+ * Both the 0.03% and 4% derive from the overhead of stored blocks. The first
+ * one is for stored blocks of 16383 bytes (memLevel == 8), whereas the second
+ * is for stored blocks of 127 bytes (the worst case memLevel == 1). The
+ * expansion results from five bytes of header for each stored block.
  *
- * For any setting other than those defaults for windowBits and memLevel,
- * the value returned is a conservative worst case for the maximum expansion
- * resulting from using fixed blocks instead of stored blocks, which deflate
- * can emit on compressed data for some combinations of the parameters.
+ * The larger expansion of 13% results from a window size less than or equal to
+ * the symbols buffer size (windowBits <= memLevel + 7). In that case some of
+ * the data being compressed may have slid out of the sliding window, impeding
+ * a stored block from being emitted. Then the only choice is a fixed or
+ * dynamic block, where a fixed block limits the maximum expansion to 9 bits
+ * per 8-bit byte, plus 10 bits for every block. The smallest block size for
+ * which this can occur is 255 (memLevel == 2).
  *
- * This function could be more sophisticated to provide closer upper bounds for
- * every combination of windowBits and memLevel.  But even the conservative
- * upper bound of about 14% expansion does not seem onerous for output buffer
- * allocation.
+ * Shifts are used to approximate divisions, for speed.
  */
 uLong ZEXPORT deflateBound(strm, sourceLen)
     z_streamp strm;
     uLong sourceLen;
 {
     deflate_state *s;
-    uLong complen, wraplen;
+    uLong fixedlen, storelen, wraplen;
 
-    /* conservative upper bound for compressed data */
-    complen = sourceLen +
-              ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
+    /* upper bound for fixed blocks with 9-bit literals and length 255
+       (memLevel == 2, which is the lowest that may not use stored blocks) --
+       ~13% overhead plus a small constant */
+    fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) +
+               (sourceLen >> 9) + 4;
 
-    /* if can't get parameters, return conservative bound plus zlib wrapper */
+    /* upper bound for stored blocks with length 127 (memLevel == 1) --
+       ~4% overhead plus a small constant */
+    storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) +
+               (sourceLen >> 11) + 7;
+
+    /* if can't get parameters, return larger bound plus a zlib wrapper */
     if (deflateStateCheck(strm))
-        return complen + 6;
+        return (fixedlen > storelen ? fixedlen : storelen) + 6;
 
     /* compute wrapper length */
     s = strm->state;
@@ -736,11 +772,12 @@ uLong ZEXPORT deflateBound(strm, sourceLen)
         wraplen = 6;
     }
 
-    /* if not default parameters, return conservative bound */
+    /* if not default parameters, return one of the conservative bounds */
     if (s->w_bits != 15 || s->hash_bits != 8 + 7)
-        return complen + wraplen;
+        return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen;
 
-    /* default settings: return tight bound for that case */
+    /* default settings: return tight bound for that case -- ~0.03% overhead
+       plus a small constant */
     return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
            (sourceLen >> 25) + 13 - 6 + wraplen;
 }
@@ -750,7 +787,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen)
  * IN assertion: the stream state is correct and there is enough room in
  * pending_buf.
  */
-local void putShortMSB (s, b)
+local void putShortMSB(s, b)
     deflate_state *s;
     uInt b;
 {
@@ -762,7 +799,7 @@ local void putShortMSB (s, b)
  * Flush as much pending output as possible. All deflate() output, except for
  * some deflate_stored() output, goes through this function so some
  * applications may wish to modify it to avoid allocating a large
- * strm->next_out buffer and copying into it. (See also deflate_read_buf()).
+ * strm->next_out buffer and copying into it. (See also read_buf()).
  */
 local void flush_pending(strm)
     z_streamp strm;
@@ -797,7 +834,7 @@ local void flush_pending(strm)
     } while (0)
 
 /* ========================================================================= */
-int ZEXPORT deflate (strm, flush)
+int ZEXPORT deflate(strm, flush)
     z_streamp strm;
     int flush;
 {
@@ -848,9 +885,11 @@ int ZEXPORT deflate (strm, flush)
     }
 
     /* Write the header */
+    if (s->status == INIT_STATE && s->wrap == 0)
+        s->status = BUSY_STATE;
     if (s->status == INIT_STATE) {
         /* zlib header */
-        uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
+        uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8;
         uInt level_flags;
 
         if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
@@ -1111,7 +1150,7 @@ int ZEXPORT deflate (strm, flush)
 }
 
 /* ========================================================================= */
-int ZEXPORT deflateEnd (strm)
+int ZEXPORT deflateEnd(strm)
     z_streamp strm;
 {
     int status;
@@ -1137,7 +1176,7 @@ int ZEXPORT deflateEnd (strm)
  * To simplify the source, this is not supported for 16-bit MSDOS (which
  * doesn't have enough memory anyway to duplicate compression states).
  */
-int ZEXPORT deflateCopy (dest, source)
+int ZEXPORT deflateCopy(dest, source)
     z_streamp dest;
     z_streamp source;
 {
@@ -1196,7 +1235,7 @@ int ZEXPORT deflateCopy (dest, source)
  * allocating a large strm->next_in buffer and copying from it.
  * (See also flush_pending()).
  */
-ZLIB_INTERNAL unsigned deflate_read_buf(strm, buf, size)
+local unsigned read_buf(strm, buf, size)
     z_streamp strm;
     Bytef *buf;
     unsigned size;
@@ -1211,7 +1250,7 @@ ZLIB_INTERNAL unsigned deflate_read_buf(strm, buf, size)
 #ifdef GZIP
     if (strm->state->wrap == 2)
         copy_with_crc(strm, buf, len);
-    else 
+    else
 #endif
     {
         zmemcpy(buf, strm->next_in, len);
@@ -1227,7 +1266,7 @@ ZLIB_INTERNAL unsigned deflate_read_buf(strm, buf, size)
 /* ===========================================================================
  * Initialize the "longest match" routines for a new zlib stream
  */
-local void lm_init (s)
+local void lm_init(s)
     deflate_state *s;
 {
     s->window_size = (ulg)2L*s->w_size;
@@ -1248,11 +1287,6 @@ local void lm_init (s)
     s->match_length = s->prev_length = MIN_MATCH-1;
     s->match_available = 0;
     s->ins_h = 0;
-#ifndef FASTEST
-#ifdef ASMV
-    match_init(); /* initialize the asm code */
-#endif
-#endif
 }
 
 #ifndef FASTEST
@@ -1265,10 +1299,6 @@ local void lm_init (s)
  *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
  * OUT assertion: the match length is not greater than s->lookahead.
  */
-#ifndef ASMV
-/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
- * match.S. The code will be functionally equivalent.
- */
 local uInt longest_match(s, cur_match)
     deflate_state *s;
     IPos cur_match;                             /* current match */
@@ -1293,10 +1323,10 @@ local uInt longest_match(s, cur_match)
      */
     register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
     register ush scan_start = *(ushf*)scan;
-    register ush scan_end   = *(ushf*)(scan+best_len-1);
+    register ush scan_end   = *(ushf*)(scan + best_len - 1);
 #else
     register Bytef *strend = s->window + s->strstart + MAX_MATCH;
-    register Byte scan_end1  = scan[best_len-1];
+    register Byte scan_end1  = scan[best_len - 1];
     register Byte scan_end   = scan[best_len];
 #endif
 
@@ -1314,7 +1344,8 @@ local uInt longest_match(s, cur_match)
      */
     if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead;
 
-    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+           "need lookahead");
 
     do {
         Assert(cur_match < s->strstart, "no future");
@@ -1332,53 +1363,72 @@ local uInt longest_match(s, cur_match)
         /* This code assumes sizeof(unsigned short) == 2. Do not use
          * UNALIGNED_OK if your compiler uses a different size.
          */
-        if (*(ushf*)(match+best_len-1) != scan_end ||
+        if (*(ushf*)(match + best_len - 1) != scan_end ||
             *(ushf*)match != scan_start) continue;
 
         /* It is not necessary to compare scan[2] and match[2] since they are
          * always equal when the other bytes match, given that the hash keys
          * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
-         * strstart+3, +5, ... up to strstart+257. We check for insufficient
+         * strstart + 3, + 5, up to strstart + 257. We check for insufficient
          * lookahead only every 4th comparison; the 128th check will be made
-         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+         * at strstart + 257. If MAX_MATCH-2 is not a multiple of 8, it is
          * necessary to put more guard bytes at the end of the window, or
          * to check more often for insufficient lookahead.
          */
-        Assert(scan[2] == match[2], "scan[2]?");
+        if (!s->chromium_zlib_hash) {
+          Assert(scan[2] == match[2], "scan[2]?");
+        } else {
+          /* When using CRC hashing, scan[2] and match[2] may mismatch, but in
+           * that case at least one of the other hashed bytes will mismatch
+           * also. Bytes 0 and 1 were already checked above, and we know there
+           * are at least four bytes to check otherwise the mismatch would have
+           * been found by the scan_end comparison above, so: */
+          Assert(scan[2] == match[2] || scan[3] != match[3], "scan[2]??");
+        }
         scan++, match++;
         do {
-        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
-                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+        } while (*(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
+                 *(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
+                 *(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
+                 *(ushf*)(scan += 2) == *(ushf*)(match += 2) &&
                  scan < strend);
         /* The funny "do {}" generates better code on most compilers */
 
-        /* Here, scan <= window+strstart+257 */
-        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+        /* Here, scan <= window + strstart + 257 */
+        Assert(scan <= s->window+(unsigned)(s->window_size - 1),
+               "wild scan");
         if (*scan == *match) scan++;
 
-        len = (MAX_MATCH - 1) - (int)(strend-scan);
+        len = (MAX_MATCH - 1) - (int)(strend - scan);
         scan = strend - (MAX_MATCH-1);
 
 #else /* UNALIGNED_OK */
 
         if (match[best_len]   != scan_end  ||
-            match[best_len-1] != scan_end1 ||
+            match[best_len - 1] != scan_end1 ||
             *match            != *scan     ||
             *++match          != scan[1])      continue;
 
-        /* The check at best_len-1 can be removed because it will be made
+        /* The check at best_len - 1 can be removed because it will be made
          * again later. (This heuristic is not always a win.)
          * It is not necessary to compare scan[2] and match[2] since they
          * are always equal when the other bytes match, given that
          * the hash keys are equal and that HASH_BITS >= 8.
          */
         scan += 2, match++;
-        Assert(*scan == *match, "match[2]?");
+        if (!s->chromium_zlib_hash) {
+          Assert(*scan == *match, "match[2]?");
+        } else {
+          /* When using CRC hashing, scan[2] and match[2] may mismatch, but in
+           * that case at least one of the other hashed bytes will mismatch
+           * also. Bytes 0 and 1 were already checked above, and we know there
+           * are at least four bytes to check otherwise the mismatch would have
+           * been found by the scan_end comparison above, so: */
+          Assert(*scan == *match || scan[1] != match[1], "match[2]??");
+        }
 
         /* We check for insufficient lookahead only every 8th comparison;
-         * the 256th check will be made at strstart+258.
+         * the 256th check will be made at strstart + 258.
          */
         do {
         } while (*++scan == *++match && *++scan == *++match &&
@@ -1387,7 +1437,8 @@ local uInt longest_match(s, cur_match)
                  *++scan == *++match && *++scan == *++match &&
                  scan < strend);
 
-        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+        Assert(scan <= s->window + (unsigned)(s->window_size - 1),
+               "wild scan");
 
         len = MAX_MATCH - (int)(strend - scan);
         scan = strend - MAX_MATCH;
@@ -1399,9 +1450,9 @@ local uInt longest_match(s, cur_match)
             best_len = len;
             if (len >= nice_match) break;
 #ifdef UNALIGNED_OK
-            scan_end = *(ushf*)(scan+best_len-1);
+            scan_end = *(ushf*)(scan + best_len - 1);
 #else
-            scan_end1  = scan[best_len-1];
+            scan_end1  = scan[best_len - 1];
             scan_end   = scan[best_len];
 #endif
         }
@@ -1411,7 +1462,6 @@ local uInt longest_match(s, cur_match)
     if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
     return s->lookahead;
 }
-#endif /* ASMV */
 
 #else /* FASTEST */
 
@@ -1432,7 +1482,8 @@ local uInt longest_match(s, cur_match)
      */
     Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
 
-    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+           "need lookahead");
 
     Assert(cur_match < s->strstart, "no future");
 
@@ -1442,7 +1493,7 @@ local uInt longest_match(s, cur_match)
      */
     if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
 
-    /* The check at best_len-1 can be removed because it will be made
+    /* The check at best_len - 1 can be removed because it will be made
      * again later. (This heuristic is not always a win.)
      * It is not necessary to compare scan[2] and match[2] since they
      * are always equal when the other bytes match, given that
@@ -1452,7 +1503,7 @@ local uInt longest_match(s, cur_match)
     Assert(*scan == *match, "match[2]?");
 
     /* We check for insufficient lookahead only every 8th comparison;
-     * the 256th check will be made at strstart+258.
+     * the 256th check will be made at strstart + 258.
      */
     do {
     } while (*++scan == *++match && *++scan == *++match &&
@@ -1461,7 +1512,7 @@ local uInt longest_match(s, cur_match)
              *++scan == *++match && *++scan == *++match &&
              scan < strend);
 
-    Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+    Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan");
 
     len = MAX_MATCH - (int)(strend - scan);
 
@@ -1497,7 +1548,7 @@ local void check_match(s, start, match, length)
         z_error("invalid match");
     }
     if (z_verbose > 1) {
-        fprintf(stderr,"\\[%d,%d]", start-match, length);
+        fprintf(stderr,"\\[%d,%d]", start - match, length);
         do { putc(s->window[start++], stderr); } while (--length != 0);
     }
 }
@@ -1515,19 +1566,7 @@ local void check_match(s, start, match, length)
  *    performed for at least two bytes (required for the zip translate_eol
  *    option -- not supported here).
  */
-local void fill_window_c(deflate_state *s);
-
-local void fill_window(deflate_state *s)
-{
-    if (x86_cpu_enable_simd) {
-        fill_window_sse(s);
-        return;
-    }
-
-    fill_window_c(s);
-}
-
-local void fill_window_c(s)
+local void fill_window(s)
     deflate_state *s;
 {
     unsigned n;
@@ -1555,12 +1594,14 @@ local void fill_window_c(s)
         /* If the window is almost full and there is insufficient lookahead,
          * move the upper half to the lower one to make room in the upper half.
          */
-        if (s->strstart >= wsize+MAX_DIST(s)) {
+        if (s->strstart >= wsize + MAX_DIST(s)) {
 
-            zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more);
+            zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more);
             s->match_start -= wsize;
             s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
             s->block_start -= (long) wsize;
+            if (s->insert > s->strstart)
+                s->insert = s->strstart;
             slide_hash(s);
             more += wsize;
         }
@@ -1579,9 +1620,23 @@ local void fill_window_c(s)
          */
         Assert(more >= 2, "more < 2");
 
-        n = deflate_read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
+        n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
         s->lookahead += n;
 
+        /* Initialize the hash value now that we have some input: */
+        if (s->chromium_zlib_hash) {
+            /* chromium hash reads 4 bytes */
+            if (s->lookahead + s->insert > MIN_MATCH) {
+                uInt str = s->strstart - s->insert;
+                while (s->insert) {
+                    insert_string(s, str);
+                    str++;
+                    s->insert--;
+                    if (s->lookahead + s->insert <= MIN_MATCH)
+                        break;
+                }
+            }
+        } else
         /* Initialize the hash value now that we have some input: */
         if (s->lookahead + s->insert >= MIN_MATCH) {
             uInt str = s->strstart - s->insert;
@@ -1686,7 +1741,7 @@ local void fill_window_c(s)
  *
  * deflate_stored() is written to minimize the number of times an input byte is
  * copied. It is most efficient with large input and output buffers, which
- * maximizes the opportunites to have a single copy from next_in to next_out.
+ * maximizes the opportunities to have a single copy from next_in to next_out.
  */
 local block_state deflate_stored(s, flush)
     deflate_state *s;
@@ -1768,7 +1823,7 @@ local block_state deflate_stored(s, flush)
          * the check value.
          */
         if (len) {
-            deflate_read_buf(s->strm, s->strm->next_out, len);
+            read_buf(s->strm, s->strm->next_out, len);
             s->strm->next_out += len;
             s->strm->avail_out -= len;
             s->strm->total_out += len;
@@ -1790,6 +1845,7 @@ local block_state deflate_stored(s, flush)
             s->matches = 2;         /* clear hash */
             zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);
             s->strstart = s->w_size;
+            s->insert = s->strstart;
         }
         else {
             if (s->window_size - s->strstart <= used) {
@@ -1798,12 +1854,14 @@ local block_state deflate_stored(s, flush)
                 zmemcpy(s->window, s->window + s->w_size, s->strstart);
                 if (s->matches < 2)
                     s->matches++;   /* add a pending slide_hash() */
+                if (s->insert > s->strstart)
+                    s->insert = s->strstart;
             }
             zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);
             s->strstart += used;
+            s->insert += MIN(used, s->w_size - s->insert);
         }
         s->block_start = s->strstart;
-        s->insert += MIN(used, s->w_size - s->insert);
     }
     if (s->high_water < s->strstart)
         s->high_water = s->strstart;
@@ -1818,7 +1876,7 @@ local block_state deflate_stored(s, flush)
         return block_done;
 
     /* Fill the window with any remaining input. */
-    have = s->window_size - s->strstart - 1;
+    have = s->window_size - s->strstart;
     if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) {
         /* Slide the window down. */
         s->block_start -= s->w_size;
@@ -1827,12 +1885,15 @@ local block_state deflate_stored(s, flush)
         if (s->matches < 2)
             s->matches++;           /* add a pending slide_hash() */
         have += s->w_size;          /* more space now */
+        if (s->insert > s->strstart)
+            s->insert = s->strstart;
     }
     if (have > s->strm->avail_in)
         have = s->strm->avail_in;
     if (have) {
-        deflate_read_buf(s->strm, s->window + s->strstart, have);
+        read_buf(s->strm, s->window + s->strstart, have);
         s->strstart += have;
+        s->insert += MIN(have, s->w_size - s->insert);
     }
     if (s->high_water < s->strstart)
         s->high_water = s->strstart;
@@ -1890,7 +1951,7 @@ local block_state deflate_fast(s, flush)
             if (s->lookahead == 0) break; /* flush the current block */
         }
 
-        /* Insert the string window[strstart .. strstart+2] in the
+        /* Insert the string window[strstart .. strstart + 2] in the
          * dictionary, and set hash_head to the head of the hash chain:
          */
         hash_head = NIL;
@@ -1937,19 +1998,22 @@ local block_state deflate_fast(s, flush)
             {
                 s->strstart += s->match_length;
                 s->match_length = 0;
-                s->ins_h = s->window[s->strstart];
-                UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+
+                if (!s->chromium_zlib_hash) {
+                  s->ins_h = s->window[s->strstart];
+                  UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]);
 #if MIN_MATCH != 3
-                Call UPDATE_HASH() MIN_MATCH-3 more times
+                  Call UPDATE_HASH() MIN_MATCH-3 more times
 #endif
-                /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
-                 * matter since it will be recomputed at next deflate call.
-                 */
+                  /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+                   * matter since it will be recomputed at next deflate call.
+                   */
+                }
             }
         } else {
             /* No match, output a literal byte */
             Tracevv((stderr,"%c", s->window[s->strstart]));
-            _tr_tally_lit (s, s->window[s->strstart], bflush);
+            _tr_tally_lit(s, s->window[s->strstart], bflush);
             s->lookahead--;
             s->strstart++;
         }
@@ -1993,7 +2057,7 @@ local block_state deflate_slow(s, flush)
             if (s->lookahead == 0) break; /* flush the current block */
         }
 
-        /* Insert the string window[strstart .. strstart+2] in the
+        /* Insert the string window[strstart .. strstart + 2] in the
          * dictionary, and set hash_head to the head of the hash chain:
          */
         hash_head = NIL;
@@ -2035,17 +2099,23 @@ local block_state deflate_slow(s, flush)
             uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
             /* Do not insert strings in hash table beyond this. */
 
-            check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+            if (s->prev_match == -1) {
+                /* The window has slid one byte past the previous match,
+                 * so the first byte cannot be compared. */
+                check_match(s, s->strstart, s->prev_match + 1, s->prev_length - 1);
+            } else {
+                check_match(s, s->strstart - 1, s->prev_match, s->prev_length);
+            }
 
-            _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+            _tr_tally_dist(s, s->strstart - 1 - s->prev_match,
                            s->prev_length - MIN_MATCH, bflush);
 
             /* Insert in hash table all strings up to the end of the match.
-             * strstart-1 and strstart are already inserted. If there is not
+             * strstart - 1 and strstart are already inserted. If there is not
              * enough lookahead, the last two strings are not inserted in
              * the hash table.
              */
-            s->lookahead -= s->prev_length-1;
+            s->lookahead -= s->prev_length - 1;
             s->prev_length -= 2;
             do {
                 if (++s->strstart <= max_insert) {
@@ -2063,8 +2133,8 @@ local block_state deflate_slow(s, flush)
              * single literal. If there was a match but the current match
              * is longer, truncate the previous match to a single literal.
              */
-            Tracevv((stderr,"%c", s->window[s->strstart-1]));
-            _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+            Tracevv((stderr,"%c", s->window[s->strstart - 1]));
+            _tr_tally_lit(s, s->window[s->strstart - 1], bflush);
             if (bflush) {
                 FLUSH_BLOCK_ONLY(s, 0);
             }
@@ -2082,8 +2152,8 @@ local block_state deflate_slow(s, flush)
     }
     Assert (flush != Z_NO_FLUSH, "no flush?");
     if (s->match_available) {
-        Tracevv((stderr,"%c", s->window[s->strstart-1]));
-        _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+        Tracevv((stderr,"%c", s->window[s->strstart - 1]));
+        _tr_tally_lit(s, s->window[s->strstart - 1], bflush);
         s->match_available = 0;
     }
     s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
@@ -2140,7 +2210,8 @@ local block_state deflate_rle(s, flush)
                 if (s->match_length > s->lookahead)
                     s->match_length = s->lookahead;
             }
-            Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
+            Assert(scan <= s->window + (uInt)(s->window_size - 1),
+                   "wild scan");
         }
 
         /* Emit match if have run of MIN_MATCH or longer, else emit literal */
@@ -2155,7 +2226,7 @@ local block_state deflate_rle(s, flush)
         } else {
             /* No match, output a literal byte */
             Tracevv((stderr,"%c", s->window[s->strstart]));
-            _tr_tally_lit (s, s->window[s->strstart], bflush);
+            _tr_tally_lit(s, s->window[s->strstart], bflush);
             s->lookahead--;
             s->strstart++;
         }
@@ -2195,7 +2266,7 @@ local block_state deflate_huff(s, flush)
         /* Output a literal byte */
         s->match_length = 0;
         Tracevv((stderr,"%c", s->window[s->strstart]));
-        _tr_tally_lit (s, s->window[s->strstart], bflush);
+        _tr_tally_lit(s, s->window[s->strstart], bflush);
         s->lookahead--;
         s->strstart++;
         if (bflush) FLUSH_BLOCK(s, 0);
diff --git a/deps/zlib/deflate.h b/deps/zlib/deflate.h
index 78ffb00a29768e..ad3cef7e45da4f 100644
--- a/deps/zlib/deflate.h
+++ b/deps/zlib/deflate.h
@@ -1,5 +1,5 @@
 /* deflate.h -- internal compression state
- * Copyright (C) 1995-2016 Jean-loup Gailly
+ * Copyright (C) 1995-2018 Jean-loup Gailly
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -268,6 +268,11 @@ typedef struct internal_state {
      * updated to the new high water mark.
      */
 
+    uInt chromium_zlib_hash;
+    /* 0 if Rabin-Karp rolling hash is enabled, non-zero if chromium zlib
+     * hash is enabled.
+     */
+
 } FAR deflate_state;
 
 /* Output a byte on the stream.
@@ -329,8 +334,8 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
 # define _tr_tally_dist(s, distance, length, flush) \
   { uch len = (uch)(length); \
     ush dist = (ush)(distance); \
-    s->sym_buf[s->sym_next++] = dist; \
-    s->sym_buf[s->sym_next++] = dist >> 8; \
+    s->sym_buf[s->sym_next++] = (uch)dist; \
+    s->sym_buf[s->sym_next++] = (uch)(dist >> 8); \
     s->sym_buf[s->sym_next++] = len; \
     dist--; \
     s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
@@ -351,6 +356,4 @@ void ZLIB_INTERNAL crc_fold_copy(deflate_state* const s,
                                  long len);
 unsigned ZLIB_INTERNAL crc_fold_512to32(deflate_state* const s);
 
-void ZLIB_INTERNAL fill_window_sse(deflate_state* s);
-
 #endif /* DEFLATE_H */
diff --git a/deps/zlib/fill_window_sse.c b/deps/zlib/fill_window_sse.c
deleted file mode 100644
index e19154bc14d238..00000000000000
--- a/deps/zlib/fill_window_sse.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Fill Window with SSE2-optimized hash shifting
- *
- * Copyright (C) 2013 Intel Corporation
- * Authors:
- *  Arjan van de Ven    <arjan@linux.intel.com>
- *  Jim Kukunas         <james.t.kukunas@linux.intel.com>
- *
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#pragma GCC target ("sse2")
-#include <immintrin.h>
-#include "deflate.h"
-
-#define UPDATE_HASH(s,h,i) \
-    {\
-        if (s->level < 6) { \
-            h = (3483 * (s->window[i]) +\
-                 23081* (s->window[i+1]) +\
-                 6954 * (s->window[i+2]) +\
-                 20947* (s->window[i+3])) & s->hash_mask;\
-        } else {\
-            h = (25881* (s->window[i]) +\
-                 24674* (s->window[i+1]) +\
-                 25811* (s->window[i+2])) & s->hash_mask;\
-        }\
-    }\
-
-extern int deflate_read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
-
-void fill_window_sse(deflate_state *s)
-{
-    const __m128i xmm_wsize = _mm_set1_epi16(s->w_size);
-
-    register unsigned n;
-    register Posf *p;
-    unsigned more;    /* Amount of free space at the end of the window. */
-    uInt wsize = s->w_size;
-
-    Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
-
-    do {
-        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
-
-        /* Deal with !@#$% 64K limit: */
-        if (sizeof(int) <= 2) {
-            if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
-                more = wsize;
-
-            } else if (more == (unsigned)(-1)) {
-                /* Very unlikely, but possible on 16 bit machine if
-                 * strstart == 0 && lookahead == 1 (input done a byte at time)
-                 */
-                more--;
-            }
-        }
-
-        /* If the window is almost full and there is insufficient lookahead,
-         * move the upper half to the lower one to make room in the upper half.
-         */
-        if (s->strstart >= wsize+MAX_DIST(s)) {
-
-            zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
-            s->match_start -= wsize;
-            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
-            s->block_start -= (long) wsize;
-
-            /* Slide the hash table (could be avoided with 32 bit values
-               at the expense of memory usage). We slide even when level == 0
-               to keep the hash table consistent if we switch back to level > 0
-               later. (Using level 0 permanently is not an optimal usage of
-               zlib, so we don't care about this pathological case.)
-             */
-            n = s->hash_size;
-            p = &s->head[n];
-            p -= 8;
-            do {
-                __m128i value, result;
-
-                value = _mm_loadu_si128((__m128i *)p);
-                result = _mm_subs_epu16(value, xmm_wsize);
-                _mm_storeu_si128((__m128i *)p, result);
-
-                p -= 8;
-                n -= 8;
-            } while (n > 0);
-
-            n = wsize;
-#ifndef FASTEST
-            p = &s->prev[n];
-            p -= 8;
-            do {
-                __m128i value, result;
-
-                value = _mm_loadu_si128((__m128i *)p);
-                result = _mm_subs_epu16(value, xmm_wsize);
-                _mm_storeu_si128((__m128i *)p, result);
-
-                p -= 8;
-                n -= 8;
-            } while (n > 0);
-#endif
-            more += wsize;
-        }
-        if (s->strm->avail_in == 0) break;
-
-        /* If there was no sliding:
-         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
-         *    more == window_size - lookahead - strstart
-         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
-         * => more >= window_size - 2*WSIZE + 2
-         * In the BIG_MEM or MMAP case (not yet supported),
-         *   window_size == input_size + MIN_LOOKAHEAD  &&
-         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
-         * Otherwise, window_size == 2*WSIZE so more >= 2.
-         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
-         */
-        Assert(more >= 2, "more < 2");
-
-        n = deflate_read_buf(s->strm,
-                             s->window + s->strstart + s->lookahead,
-                             more);
-        s->lookahead += n;
-
-        /* Initialize the hash value now that we have some input: */
-        if (s->lookahead >= MIN_MATCH) {
-            uInt str = s->strstart;
-            s->ins_h = s->window[str];
-            if (str >= 1)
-                UPDATE_HASH(s, s->ins_h, str + 1 - (MIN_MATCH-1));
-#if MIN_MATCH != 3
-            Call UPDATE_HASH() MIN_MATCH-3 more times
-#endif
-        }
-        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
-         * but this is not important since only literal bytes will be emitted.
-         */
-
-    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
-
-    /* If the WIN_INIT bytes after the end of the current data have never been
-     * written, then zero those bytes in order to avoid memory check reports of
-     * the use of uninitialized (or uninitialised as Julian writes) bytes by
-     * the longest match routines.  Update the high water mark for the next
-     * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
-     * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
-     */
-    if (s->high_water < s->window_size) {
-        ulg curr = s->strstart + (ulg)(s->lookahead);
-        ulg init;
-
-        if (s->high_water < curr) {
-            /* Previous high water mark below current data -- zero WIN_INIT
-             * bytes or up to end of window, whichever is less.
-             */
-            init = s->window_size - curr;
-            if (init > WIN_INIT)
-                init = WIN_INIT;
-            zmemzero(s->window + curr, (unsigned)init);
-            s->high_water = curr + init;
-        }
-        else if (s->high_water < (ulg)curr + WIN_INIT) {
-            /* High water mark at or above current data, but below current data
-             * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
-             * to end of window, whichever is less.
-             */
-            init = (ulg)curr + WIN_INIT - s->high_water;
-            if (init > s->window_size - s->high_water)
-                init = s->window_size - s->high_water;
-            zmemzero(s->window + s->high_water, (unsigned)init);
-            s->high_water += init;
-        }
-    }
-
-    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
-           "not enough room for search");
-}
diff --git a/deps/zlib/google/BUILD.gn b/deps/zlib/google/BUILD.gn
index 4024836205f64c..35ba1daf2dfea3 100644
--- a/deps/zlib/google/BUILD.gn
+++ b/deps/zlib/google/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
+# Copyright 2017 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
@@ -7,6 +7,7 @@ import("//build_overrides/build.gni")
 if (build_with_chromium) {
   static_library("zip") {
     sources = [
+      "redact.h",
       "zip.cc",
       "zip.h",
       "zip_internal.cc",
@@ -18,6 +19,7 @@ if (build_with_chromium) {
     ]
     deps = [
       "//base",
+      "//base:i18n",
       "//third_party/zlib:minizip",
     ]
   }
@@ -28,10 +30,10 @@ if (build_with_chromium) {
       "compression_utils.h",
     ]
     deps = [
-      ":compression_utils_portable",
       "//base",
       "//third_party/zlib",
     ]
+    public_deps = [ ":compression_utils_portable" ]
   }
 }
 
@@ -42,7 +44,5 @@ static_library("compression_utils_portable") {
     "compression_utils_portable.cc",
     "compression_utils_portable.h",
   ]
-  deps = [
-    "//third_party/zlib",
-  ]
+  public_deps = [ "//third_party/zlib" ]
 }
diff --git a/deps/zlib/google/DEPS b/deps/zlib/google/DEPS
index 144fbd149295b3..03f2cb950b9517 100644
--- a/deps/zlib/google/DEPS
+++ b/deps/zlib/google/DEPS
@@ -2,4 +2,5 @@ include_rules = [
   '+base',
   '+build',
   '+testing',
+  "+third_party/zlib/zlib.h",
 ]
diff --git a/deps/zlib/google/OWNERS b/deps/zlib/google/OWNERS
index 1ca25314631124..411670ca13aa17 100644
--- a/deps/zlib/google/OWNERS
+++ b/deps/zlib/google/OWNERS
@@ -1,5 +1,8 @@
+fdegros@chromium.org
+noel@chromium.org
 satorux@chromium.org
 
 # compression_utils*
 asvitkine@chromium.org
 isherman@chromium.org
+cavalcantii@chromium.org
diff --git a/deps/zlib/google/compression_utils.cc b/deps/zlib/google/compression_utils.cc
index 9f63a840167d47..279ea0732980c3 100644
--- a/deps/zlib/google/compression_utils.cc
+++ b/deps/zlib/google/compression_utils.cc
@@ -1,20 +1,19 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #include "third_party/zlib/google/compression_utils.h"
 
 #include "base/bit_cast.h"
-#include "base/logging.h"
+#include "base/check_op.h"
 #include "base/process/memory.h"
-#include "base/strings/string_piece.h"
 #include "base/sys_byteorder.h"
 
 #include "third_party/zlib/google/compression_utils_portable.h"
 
 namespace compression {
 
-bool GzipCompress(base::StringPiece input,
+bool GzipCompress(base::span<const char> input,
                   char* output_buffer,
                   size_t output_buffer_size,
                   size_t* compressed_size,
@@ -25,8 +24,8 @@ bool GzipCompress(base::StringPiece input,
   // uLongf can be larger than size_t.
   uLongf compressed_size_long = static_cast<uLongf>(output_buffer_size);
   if (zlib_internal::GzipCompressHelper(
-          bit_cast<Bytef*>(output_buffer), &compressed_size_long,
-          bit_cast<const Bytef*>(input.data()),
+          base::bit_cast<Bytef*>(output_buffer), &compressed_size_long,
+          base::bit_cast<const Bytef*>(input.data()),
           static_cast<uLongf>(input.size()), malloc_fn, free_fn) != Z_OK) {
     return false;
   }
@@ -35,7 +34,11 @@ bool GzipCompress(base::StringPiece input,
   return true;
 }
 
-bool GzipCompress(base::StringPiece input, std::string* output) {
+bool GzipCompress(base::span<const char> input, std::string* output) {
+  return GzipCompress(base::as_bytes(input), output);
+}
+
+bool GzipCompress(base::span<const uint8_t> input, std::string* output) {
   // Not using std::vector<> because allocation failures are recoverable,
   // which is hidden by std::vector<>.
   static_assert(sizeof(Bytef) == 1, "");
@@ -50,9 +53,10 @@ bool GzipCompress(base::StringPiece input, std::string* output) {
     return false;
   }
 
-  if (zlib_internal::GzipCompressHelper(compressed_data, &compressed_data_size,
-                                        bit_cast<const Bytef*>(input.data()),
-                                        input_size, nullptr, nullptr) != Z_OK) {
+  if (zlib_internal::GzipCompressHelper(
+          compressed_data, &compressed_data_size,
+          base::bit_cast<const Bytef*>(input.data()), input_size, nullptr,
+          nullptr) != Z_OK) {
     free(compressed_data);
     return false;
   }
@@ -73,13 +77,13 @@ bool GzipCompress(base::StringPiece input, std::string* output) {
 bool GzipUncompress(const std::string& input, std::string* output) {
   std::string uncompressed_output;
   uLongf uncompressed_size = static_cast<uLongf>(GetUncompressedSize(input));
-  if (uncompressed_size > uncompressed_output.max_size())
+  if (size_t{uncompressed_size} > uncompressed_output.max_size())
     return false;
 
   uncompressed_output.resize(uncompressed_size);
   if (zlib_internal::GzipUncompressHelper(
-          bit_cast<Bytef*>(uncompressed_output.data()), &uncompressed_size,
-          bit_cast<const Bytef*>(input.data()),
+          base::bit_cast<Bytef*>(uncompressed_output.data()),
+          &uncompressed_size, base::bit_cast<const Bytef*>(input.data()),
           static_cast<uLongf>(input.length())) == Z_OK) {
     output->swap(uncompressed_output);
     return true;
@@ -87,30 +91,44 @@ bool GzipUncompress(const std::string& input, std::string* output) {
   return false;
 }
 
-bool GzipUncompress(base::StringPiece input, base::StringPiece output) {
+bool GzipUncompress(base::span<const char> input,
+                    base::span<const char> output) {
+  return GzipUncompress(base::as_bytes(input), base::as_bytes(output));
+}
+
+bool GzipUncompress(base::span<const uint8_t> input,
+                    base::span<const uint8_t> output) {
   uLongf uncompressed_size = GetUncompressedSize(input);
   if (uncompressed_size > output.size())
     return false;
   return zlib_internal::GzipUncompressHelper(
-             bit_cast<Bytef*>(output.data()), &uncompressed_size,
-             bit_cast<const Bytef*>(input.data()),
-             static_cast<uLongf>(input.length())) == Z_OK;
+             base::bit_cast<Bytef*>(output.data()), &uncompressed_size,
+             base::bit_cast<const Bytef*>(input.data()),
+             static_cast<uLongf>(input.size())) == Z_OK;
 }
 
-bool GzipUncompress(base::StringPiece input, std::string* output) {
+bool GzipUncompress(base::span<const char> input, std::string* output) {
+  return GzipUncompress(base::as_bytes(input), output);
+}
+
+bool GzipUncompress(base::span<const uint8_t> input, std::string* output) {
   // Disallow in-place usage, i.e., |input| using |*output| as underlying data.
-  DCHECK_NE(input.data(), output->data());
+  DCHECK_NE(reinterpret_cast<const char*>(input.data()), output->data());
   uLongf uncompressed_size = GetUncompressedSize(input);
   output->resize(uncompressed_size);
   return zlib_internal::GzipUncompressHelper(
-             bit_cast<Bytef*>(output->data()), &uncompressed_size,
-             bit_cast<const Bytef*>(input.data()),
-             static_cast<uLongf>(input.length())) == Z_OK;
+             base::bit_cast<Bytef*>(output->data()), &uncompressed_size,
+             base::bit_cast<const Bytef*>(input.data()),
+             static_cast<uLongf>(input.size())) == Z_OK;
+}
+
+uint32_t GetUncompressedSize(base::span<const char> compressed_data) {
+  return GetUncompressedSize(base::as_bytes(compressed_data));
 }
 
-uint32_t GetUncompressedSize(base::StringPiece compressed_data) {
+uint32_t GetUncompressedSize(base::span<const uint8_t> compressed_data) {
   return zlib_internal::GetGzipUncompressedSize(
-      bit_cast<Bytef*>(compressed_data.data()), compressed_data.length());
+      base::bit_cast<Bytef*>(compressed_data.data()), compressed_data.size());
 }
 
 }  // namespace compression
diff --git a/deps/zlib/google/compression_utils.h b/deps/zlib/google/compression_utils.h
index 516220719ff43c..ea399816f60351 100644
--- a/deps/zlib/google/compression_utils.h
+++ b/deps/zlib/google/compression_utils.h
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -7,7 +7,7 @@
 
 #include <string>
 
-#include "base/strings/string_piece.h"
+#include "base/containers/span.h"
 
 namespace compression {
 
@@ -18,7 +18,7 @@ namespace compression {
 // |malloc_fn| and |free_fn| are pointers to malloc() and free()-like functions,
 // or nullptr to use the standard ones.
 // Returns true for success.
-bool GzipCompress(base::StringPiece input,
+bool GzipCompress(base::span<const char> input,
                   char* output_buffer,
                   size_t output_buffer_size,
                   size_t* compressed_size,
@@ -29,27 +29,41 @@ bool GzipCompress(base::StringPiece input,
 // |input| and |output| are allowed to point to the same string (in-place
 // operation).
 // Returns true for success.
-bool GzipCompress(base::StringPiece input, std::string* output);
+bool GzipCompress(base::span<const char> input, std::string* output);
+
+// Like the above method, but using uint8_t instead.
+bool GzipCompress(base::span<const uint8_t> input, std::string* output);
 
 // Uncompresses the data in |input| using gzip, storing the result in |output|.
 // |input| and |output| are allowed to be the same string (in-place operation).
 // Returns true for success.
 bool GzipUncompress(const std::string& input, std::string* output);
 
-// Like the above method, but uses base::StringPiece to avoid allocations if
+// Like the above method, but uses base::span to avoid allocations if
 // needed. |output|'s size must be at least as large as the return value from
 // GetUncompressedSize.
 // Returns true for success.
-bool GzipUncompress(base::StringPiece input, base::StringPiece output);
+bool GzipUncompress(base::span<const char> input,
+                    base::span<const char> output);
+
+// Like the above method, but using uint8_t instead.
+bool GzipUncompress(base::span<const uint8_t> input,
+                    base::span<const uint8_t> output);
 
 // Uncompresses the data in |input| using gzip, and writes the results to
 // |output|, which must NOT be the underlying string of |input|, and is resized
 // if necessary.
 // Returns true for success.
-bool GzipUncompress(base::StringPiece input, std::string* output);
+bool GzipUncompress(base::span<const char> input, std::string* output);
+
+// Like the above method, but using uint8_t instead.
+bool GzipUncompress(base::span<const uint8_t> input, std::string* output);
 
 // Returns the uncompressed size from GZIP-compressed |compressed_data|.
-uint32_t GetUncompressedSize(base::StringPiece compressed_data);
+uint32_t GetUncompressedSize(base::span<const char> compressed_data);
+
+// Like the above method, but using uint8_t instead.
+uint32_t GetUncompressedSize(base::span<const uint8_t> compressed_data);
 
 }  // namespace compression
 
diff --git a/deps/zlib/google/compression_utils_portable.cc b/deps/zlib/google/compression_utils_portable.cc
index 191e349e31ad30..49d6bfe9ea6ed4 100644
--- a/deps/zlib/google/compression_utils_portable.cc
+++ b/deps/zlib/google/compression_utils_portable.cc
@@ -1,11 +1,11 @@
 /* compression_utils_portable.cc
  *
- * Copyright 2019 The Chromium Authors. All rights reserved.
+ * Copyright 2019 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
 
-#include "third_party/zlib/google/compression_utils_portable.h"
+#include "compression_utils_portable.h"
 
 #include <stddef.h>
 #include <stdlib.h>
@@ -84,7 +84,7 @@ int CompressHelper(WrapperType wrapper_type,
                    int compression_level,
                    void* (*malloc_fn)(size_t),
                    void (*free_fn)(void*)) {
-  if (compression_level < 1 || compression_level > 9) {
+  if (compression_level < 0 || compression_level > 9) {
     compression_level = Z_DEFAULT_COMPRESSION;
   }
 
diff --git a/deps/zlib/google/compression_utils_portable.h b/deps/zlib/google/compression_utils_portable.h
index cd004e86cf515c..92b033e889f7f8 100644
--- a/deps/zlib/google/compression_utils_portable.h
+++ b/deps/zlib/google/compression_utils_portable.h
@@ -1,6 +1,6 @@
 /* compression_utils_portable.h
  *
- * Copyright 2019 The Chromium Authors. All rights reserved.
+ * Copyright 2019 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
@@ -9,10 +9,14 @@
 
 #include <stdint.h>
 
+/* TODO(cavalcantii): remove support for Chromium ever building with a system
+ * zlib.
+ */
 #if defined(USE_SYSTEM_ZLIB)
 #include <zlib.h>
+/* AOSP build requires relative paths. */
 #else
-#include "third_party/zlib/zlib.h"
+#include "zlib.h"
 #endif
 
 namespace zlib_internal {
diff --git a/deps/zlib/google/compression_utils_unittest.cc b/deps/zlib/google/compression_utils_unittest.cc
index b0e04b8c973633..8e24387ee341da 100644
--- a/deps/zlib/google/compression_utils_unittest.cc
+++ b/deps/zlib/google/compression_utils_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -7,10 +7,9 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <iterator>
 #include <string>
 
-#include "base/logging.h"
-#include "base/stl_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace compression {
@@ -34,37 +33,33 @@ const uint8_t kCompressedData[] = {
 }  // namespace
 
 TEST(CompressionUtilsTest, GzipCompression) {
-  std::string data(reinterpret_cast<const char*>(kData), base::size(kData));
+  std::string data(reinterpret_cast<const char*>(kData), std::size(kData));
   std::string compressed_data;
   EXPECT_TRUE(GzipCompress(data, &compressed_data));
   std::string golden_compressed_data(
       reinterpret_cast<const char*>(kCompressedData),
-      base::size(kCompressedData));
+      std::size(kCompressedData));
   EXPECT_EQ(golden_compressed_data, compressed_data);
 }
 
 TEST(CompressionUtilsTest, GzipUncompression) {
   std::string compressed_data(reinterpret_cast<const char*>(kCompressedData),
-                              base::size(kCompressedData));
+                              std::size(kCompressedData));
 
   std::string uncompressed_data;
   EXPECT_TRUE(GzipUncompress(compressed_data, &uncompressed_data));
 
   std::string golden_data(reinterpret_cast<const char*>(kData),
-                          base::size(kData));
+                          std::size(kData));
   EXPECT_EQ(golden_data, uncompressed_data);
 }
 
-TEST(CompressionUtilsTest, GzipUncompressionFromStringPieceToString) {
-  base::StringPiece compressed_data(
-      reinterpret_cast<const char*>(kCompressedData),
-      base::size(kCompressedData));
-
+TEST(CompressionUtilsTest, GzipUncompressionFromSpanToString) {
   std::string uncompressed_data;
-  EXPECT_TRUE(GzipUncompress(compressed_data, &uncompressed_data));
+  EXPECT_TRUE(GzipUncompress(kCompressedData, &uncompressed_data));
 
   std::string golden_data(reinterpret_cast<const char*>(kData),
-                          base::size(kData));
+                          std::size(kData));
   EXPECT_EQ(golden_data, uncompressed_data);
 }
 
@@ -89,10 +84,10 @@ TEST(CompressionUtilsTest, LargeInput) {
 
 TEST(CompressionUtilsTest, InPlace) {
   const std::string original_data(reinterpret_cast<const char*>(kData),
-                                  base::size(kData));
+                                  std::size(kData));
   const std::string golden_compressed_data(
       reinterpret_cast<const char*>(kCompressedData),
-      base::size(kCompressedData));
+      std::size(kCompressedData));
 
   std::string data(original_data);
   EXPECT_TRUE(GzipCompress(data, &data));
diff --git a/deps/zlib/google/redact.h b/deps/zlib/google/redact.h
new file mode 100644
index 00000000000000..df6bcafc2af8dd
--- /dev/null
+++ b/deps/zlib/google/redact.h
@@ -0,0 +1,31 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#ifndef THIRD_PARTY_ZLIB_GOOGLE_REDACT_H_
+#define THIRD_PARTY_ZLIB_GOOGLE_REDACT_H_
+
+#include <ostream>
+
+#include "base/files/file_path.h"
+#include "base/logging.h"
+
+namespace zip {
+
+// Redacts file paths in log messages.
+// Example:
+// LOG(ERROR) << "Cannot open " << Redact(path);
+class Redact {
+ public:
+  explicit Redact(const base::FilePath& path) : path_(path) {}
+
+  friend std::ostream& operator<<(std::ostream& out, const Redact&& r) {
+    return LOG_IS_ON(INFO) ? out << "'" << r.path_ << "'" : out << "(redacted)";
+  }
+
+ private:
+  const base::FilePath& path_;
+};
+
+}  // namespace zip
+
+#endif  // THIRD_PARTY_ZLIB_GOOGLE_REDACT_H_
diff --git a/deps/zlib/google/test/data/Different Encryptions.zip b/deps/zlib/google/test/data/Different Encryptions.zip
new file mode 100644
index 00000000000000..858e7c74b61ee6
Binary files /dev/null and b/deps/zlib/google/test/data/Different Encryptions.zip differ
diff --git a/deps/zlib/google/test/data/Empty Dir Same Name As File.zip b/deps/zlib/google/test/data/Empty Dir Same Name As File.zip
new file mode 100644
index 00000000000000..e26c42d158ccc2
Binary files /dev/null and b/deps/zlib/google/test/data/Empty Dir Same Name As File.zip differ
diff --git a/deps/zlib/google/test/data/Mixed Paths.zip b/deps/zlib/google/test/data/Mixed Paths.zip
new file mode 100644
index 00000000000000..881f4985997447
Binary files /dev/null and b/deps/zlib/google/test/data/Mixed Paths.zip differ
diff --git a/deps/zlib/google/test/data/Parent Dir Same Name As File.zip b/deps/zlib/google/test/data/Parent Dir Same Name As File.zip
new file mode 100644
index 00000000000000..76cfd906edcf69
Binary files /dev/null and b/deps/zlib/google/test/data/Parent Dir Same Name As File.zip differ
diff --git a/deps/zlib/google/test/data/README.md b/deps/zlib/google/test/data/README.md
new file mode 100644
index 00000000000000..c76648fb08a4ef
--- /dev/null
+++ b/deps/zlib/google/test/data/README.md
@@ -0,0 +1,15 @@
+## test\_posix\_permissions.zip
+Rebuild this zip by running:
+```
+rm test_posix_permissions.zip &&
+mkdir z &&
+cd z &&
+touch 0.txt 1.txt 2.txt 3.txt &&
+chmod a+x 0.txt &&
+chmod o+x 1.txt &&
+chmod u+x 2.txt &&
+zip test_posix_permissions.zip * &&
+mv test_posix_permissions.zip .. &&
+cd .. &&
+rm -r z
+```
diff --git a/deps/zlib/google/test/data/Repeated Dir Name.zip b/deps/zlib/google/test/data/Repeated Dir Name.zip
new file mode 100644
index 00000000000000..2375bc7697cb35
Binary files /dev/null and b/deps/zlib/google/test/data/Repeated Dir Name.zip differ
diff --git a/deps/zlib/google/test/data/Repeated File Name With Different Cases.zip b/deps/zlib/google/test/data/Repeated File Name With Different Cases.zip
new file mode 100644
index 00000000000000..9eb44e1a507eb9
Binary files /dev/null and b/deps/zlib/google/test/data/Repeated File Name With Different Cases.zip differ
diff --git a/deps/zlib/google/test/data/Repeated File Name.zip b/deps/zlib/google/test/data/Repeated File Name.zip
new file mode 100644
index 00000000000000..4a3e7b13c66a4a
Binary files /dev/null and b/deps/zlib/google/test/data/Repeated File Name.zip differ
diff --git a/deps/zlib/google/test/data/SJIS Bug 846195.zip b/deps/zlib/google/test/data/SJIS Bug 846195.zip
new file mode 100644
index 00000000000000..078300284e634a
Binary files /dev/null and b/deps/zlib/google/test/data/SJIS Bug 846195.zip differ
diff --git a/deps/zlib/google/test/data/Windows Special Names.zip b/deps/zlib/google/test/data/Windows Special Names.zip
new file mode 100644
index 00000000000000..4fac907fa754b0
Binary files /dev/null and b/deps/zlib/google/test/data/Windows Special Names.zip differ
diff --git a/deps/zlib/google/test/data/Wrong CRC.zip b/deps/zlib/google/test/data/Wrong CRC.zip
new file mode 100644
index 00000000000000..ee9a1ef05431f9
Binary files /dev/null and b/deps/zlib/google/test/data/Wrong CRC.zip differ
diff --git a/deps/zlib/google/test/data/create_test_zip.sh b/deps/zlib/google/test/data/create_test_zip.sh
index f4cc635c2cf7a4..620e8f6d6d4c0c 100755
--- a/deps/zlib/google/test/data/create_test_zip.sh
+++ b/deps/zlib/google/test/data/create_test_zip.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Copyright 2011 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 #
diff --git a/deps/zlib/google/test/data/empty.zip b/deps/zlib/google/test/data/empty.zip
new file mode 100644
index 00000000000000..15cb0ecb3e219d
Binary files /dev/null and b/deps/zlib/google/test/data/empty.zip differ
diff --git a/deps/zlib/google/test/data/test_posix_permissions.zip b/deps/zlib/google/test/data/test_posix_permissions.zip
new file mode 100644
index 00000000000000..a058ba17445c37
Binary files /dev/null and b/deps/zlib/google/test/data/test_posix_permissions.zip differ
diff --git a/deps/zlib/google/zip.cc b/deps/zlib/google/zip.cc
index 907e5da72e974d..490dcee34e1e42 100644
--- a/deps/zlib/google/zip.cc
+++ b/deps/zlib/google/zip.cc
@@ -1,20 +1,21 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #include "third_party/zlib/google/zip.h"
 
-#include <list>
 #include <string>
 #include <vector>
 
 #include "base/bind.h"
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
+#include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
+#include "third_party/zlib/google/redact.h"
 #include "third_party/zlib/google/zip_internal.h"
 #include "third_party/zlib/google/zip_reader.h"
 #include "third_party/zlib/google/zip_writer.h"
@@ -26,18 +27,13 @@ bool IsHiddenFile(const base::FilePath& file_path) {
   return file_path.BaseName().value()[0] == '.';
 }
 
-bool ExcludeNoFilesFilter(const base::FilePath& file_path) {
-  return true;
-}
-
-bool ExcludeHiddenFilesFilter(const base::FilePath& file_path) {
-  return !IsHiddenFile(file_path);
-}
-
 // Creates a directory at |extract_dir|/|entry_path|, including any parents.
 bool CreateDirectory(const base::FilePath& extract_dir,
                      const base::FilePath& entry_path) {
-  return base::CreateDirectory(extract_dir.Append(entry_path));
+  const base::FilePath dir = extract_dir.Append(entry_path);
+  const bool ok = base::CreateDirectory(dir);
+  PLOG_IF(ERROR, !ok) << "Cannot create directory " << Redact(dir);
+  return ok;
 }
 
 // Creates a WriterDelegate that can write a file at |extract_dir|/|entry_path|.
@@ -50,222 +46,229 @@ std::unique_ptr<WriterDelegate> CreateFilePathWriterDelegate(
 
 class DirectFileAccessor : public FileAccessor {
  public:
-  explicit DirectFileAccessor(base::FilePath src_dir) : src_dir_(src_dir) {}
+  explicit DirectFileAccessor(base::FilePath src_dir)
+      : src_dir_(std::move(src_dir)) {}
+
   ~DirectFileAccessor() override = default;
 
-  std::vector<base::File> OpenFilesForReading(
-      const std::vector<base::FilePath>& paths) override {
-    std::vector<base::File> files;
-    for (const auto& path : paths) {
-      base::File file;
-      if (base::PathExists(path) && !base::DirectoryExists(path)) {
-        file = base::File(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+  bool Open(const Paths paths, std::vector<base::File>* const files) override {
+    DCHECK(files);
+    files->reserve(files->size() + paths.size());
+
+    for (const base::FilePath& path : paths) {
+      DCHECK(!path.IsAbsolute());
+      const base::FilePath absolute_path = src_dir_.Append(path);
+      if (base::DirectoryExists(absolute_path)) {
+        files->emplace_back();
+        LOG(ERROR) << "Cannot open " << Redact(path) << ": It is a directory";
+      } else {
+        const base::File& file = files->emplace_back(
+            absolute_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+        LOG_IF(ERROR, !file.IsValid())
+            << "Cannot open " << Redact(path) << ": "
+            << base::File::ErrorToString(file.error_details());
       }
-      files.push_back(std::move(file));
     }
-    return files;
-  }
 
-  bool DirectoryExists(const base::FilePath& file) override {
-    return base::DirectoryExists(file);
+    return true;
   }
 
-  std::vector<DirectoryContentEntry> ListDirectoryContent(
-      const base::FilePath& dir) override {
-    std::vector<DirectoryContentEntry> files;
+  bool List(const base::FilePath& path,
+            std::vector<base::FilePath>* const files,
+            std::vector<base::FilePath>* const subdirs) override {
+    DCHECK(!path.IsAbsolute());
+    DCHECK(files);
+    DCHECK(subdirs);
+
     base::FileEnumerator file_enumerator(
-        dir, false /* recursive */,
+        src_dir_.Append(path), false /* recursive */,
         base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES);
-    for (base::FilePath path = file_enumerator.Next(); !path.value().empty();
-         path = file_enumerator.Next()) {
-      files.push_back(DirectoryContentEntry(path, base::DirectoryExists(path)));
+
+    while (!file_enumerator.Next().empty()) {
+      const base::FileEnumerator::FileInfo info = file_enumerator.GetInfo();
+      (info.IsDirectory() ? subdirs : files)
+          ->push_back(path.Append(info.GetName()));
     }
-    return files;
+
+    return true;
   }
 
-  base::Time GetLastModifiedTime(const base::FilePath& path) override {
+  bool GetInfo(const base::FilePath& path, Info* const info) override {
+    DCHECK(!path.IsAbsolute());
+    DCHECK(info);
+
     base::File::Info file_info;
-    if (!base::GetFileInfo(path, &file_info)) {
-      LOG(ERROR) << "Failed to retrieve file modification time for "
-                 << path.value();
+    if (!base::GetFileInfo(src_dir_.Append(path), &file_info)) {
+      PLOG(ERROR) << "Cannot get info of " << Redact(path);
+      return false;
     }
-    return file_info.last_modified;
+
+    info->is_directory = file_info.is_directory;
+    info->last_modified = file_info.last_modified;
+
+    return true;
   }
 
  private:
-  base::FilePath src_dir_;
-
-  DISALLOW_COPY_AND_ASSIGN(DirectFileAccessor);
+  const base::FilePath src_dir_;
 };
 
 }  // namespace
 
-ZipParams::ZipParams(const base::FilePath& src_dir,
-                     const base::FilePath& dest_file)
-    : src_dir_(src_dir),
-      dest_file_(dest_file),
-      file_accessor_(new DirectFileAccessor(src_dir)) {}
-
-#if defined(OS_POSIX)
-// Does not take ownership of |fd|.
-ZipParams::ZipParams(const base::FilePath& src_dir, int dest_fd)
-    : src_dir_(src_dir),
-      dest_fd_(dest_fd),
-      file_accessor_(new DirectFileAccessor(src_dir)) {}
-#endif
+std::ostream& operator<<(std::ostream& out, const Progress& progress) {
+  return out << progress.bytes << " bytes, " << progress.files << " files, "
+             << progress.directories << " dirs, " << progress.errors
+             << " errors";
+}
 
 bool Zip(const ZipParams& params) {
-  // Using a pointer to avoid copies of a potentially large array.
-  const std::vector<base::FilePath>* files_to_add = &params.files_to_zip();
-  std::vector<base::FilePath> all_files;
-  if (files_to_add->empty()) {
-    // Include all files from the src_dir (modulo the src_dir itself and
-    // filtered and hidden files).
-
-    files_to_add = &all_files;
-    // Using a list so we can call push_back while iterating.
-    std::list<FileAccessor::DirectoryContentEntry> entries;
-    entries.push_back(FileAccessor::DirectoryContentEntry(
-        params.src_dir(), true /* is directory*/));
-    const FilterCallback& filter_callback = params.filter_callback();
-    for (auto iter = entries.begin(); iter != entries.end(); ++iter) {
-      const base::FilePath& entry_path = iter->path;
-      if (iter != entries.begin() &&  // Don't filter the root dir.
-          ((!params.include_hidden_files() && IsHiddenFile(entry_path)) ||
-           (filter_callback && !filter_callback.Run(entry_path)))) {
-        continue;
-      }
-
-      if (iter != entries.begin()) {  // Exclude the root dir from the ZIP file.
-        // Make the path relative for AddEntryToZip.
-        base::FilePath relative_path;
-        bool success =
-            params.src_dir().AppendRelativePath(entry_path, &relative_path);
-        DCHECK(success);
-        all_files.push_back(relative_path);
-      }
-
-      if (iter->is_directory) {
-        std::vector<FileAccessor::DirectoryContentEntry> subentries =
-            params.file_accessor()->ListDirectoryContent(entry_path);
-        entries.insert(entries.end(), subentries.begin(), subentries.end());
-      }
-    }
-  }
+  DirectFileAccessor default_accessor(params.src_dir);
+  FileAccessor* const file_accessor = params.file_accessor ?: &default_accessor;
 
   std::unique_ptr<internal::ZipWriter> zip_writer;
-#if defined(OS_POSIX)
-  if (params.dest_fd() != base::kInvalidPlatformFile) {
-    DCHECK(params.dest_file().empty());
-    zip_writer = internal::ZipWriter::CreateWithFd(
-        params.dest_fd(), params.src_dir(), params.file_accessor());
+
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
+  if (params.dest_fd != base::kInvalidPlatformFile) {
+    DCHECK(params.dest_file.empty());
+    zip_writer =
+        internal::ZipWriter::CreateWithFd(params.dest_fd, file_accessor);
     if (!zip_writer)
       return false;
   }
 #endif
+
   if (!zip_writer) {
-    zip_writer = internal::ZipWriter::Create(
-        params.dest_file(), params.src_dir(), params.file_accessor());
+    zip_writer = internal::ZipWriter::Create(params.dest_file, file_accessor);
     if (!zip_writer)
       return false;
   }
-  return zip_writer->WriteEntries(*files_to_add);
-}
 
-bool Unzip(const base::FilePath& src_file, const base::FilePath& dest_dir) {
-  return UnzipWithFilterCallback(
-      src_file, dest_dir, base::BindRepeating(&ExcludeNoFilesFilter), true);
+  zip_writer->SetProgressCallback(params.progress_callback,
+                                  params.progress_period);
+  zip_writer->SetRecursive(params.recursive);
+  zip_writer->ContinueOnError(params.continue_on_error);
+
+  if (!params.include_hidden_files || params.filter_callback)
+    zip_writer->SetFilterCallback(base::BindRepeating(
+        [](const ZipParams* const params, const base::FilePath& path) -> bool {
+          return (params->include_hidden_files || !IsHiddenFile(path)) &&
+                 (!params->filter_callback ||
+                  params->filter_callback.Run(params->src_dir.Append(path)));
+        },
+        &params));
+
+  if (params.src_files.empty()) {
+    // No source items are specified. Zip the entire source directory.
+    zip_writer->SetRecursive(true);
+    if (!zip_writer->AddDirectoryContents(base::FilePath()))
+      return false;
+  } else {
+    // Only zip the specified source items.
+    if (!zip_writer->AddMixedEntries(params.src_files))
+      return false;
+  }
+
+  return zip_writer->Close();
 }
 
-bool UnzipWithFilterCallback(const base::FilePath& src_file,
-                             const base::FilePath& dest_dir,
-                             const FilterCallback& filter_cb,
-                             bool log_skipped_files) {
+bool Unzip(const base::FilePath& src_file,
+           const base::FilePath& dest_dir,
+           UnzipOptions options) {
   base::File file(src_file, base::File::FLAG_OPEN | base::File::FLAG_READ);
   if (!file.IsValid()) {
-    DLOG(WARNING) << "Failed to open " << src_file.value();
+    PLOG(ERROR) << "Cannot open " << Redact(src_file) << ": "
+                << base::File::ErrorToString(file.error_details());
     return false;
   }
-  return UnzipWithFilterAndWriters(
-      file.GetPlatformFile(),
-      base::BindRepeating(&CreateFilePathWriterDelegate, dest_dir),
-      base::BindRepeating(&CreateDirectory, dest_dir), filter_cb,
-      log_skipped_files);
+
+  DLOG_IF(WARNING, !base::IsDirectoryEmpty(dest_dir))
+      << "ZIP extraction directory is not empty: " << dest_dir;
+
+  return Unzip(file.GetPlatformFile(),
+               base::BindRepeating(&CreateFilePathWriterDelegate, dest_dir),
+               base::BindRepeating(&CreateDirectory, dest_dir),
+               std::move(options));
 }
 
-bool UnzipWithFilterAndWriters(const base::PlatformFile& src_file,
-                               const WriterFactory& writer_factory,
-                               const DirectoryCreator& directory_creator,
-                               const FilterCallback& filter_cb,
-                               bool log_skipped_files) {
+bool Unzip(const base::PlatformFile& src_file,
+           WriterFactory writer_factory,
+           DirectoryCreator directory_creator,
+           UnzipOptions options) {
   ZipReader reader;
+  reader.SetEncoding(std::move(options.encoding));
+  reader.SetPassword(std::move(options.password));
+
   if (!reader.OpenFromPlatformFile(src_file)) {
-    DLOG(WARNING) << "Failed to open src_file " << src_file;
+    LOG(ERROR) << "Cannot open ZIP from file handle " << src_file;
     return false;
   }
-  while (reader.HasMore()) {
-    if (!reader.OpenCurrentEntryInZip()) {
-      DLOG(WARNING) << "Failed to open the current file in zip";
-      return false;
+
+  while (const ZipReader::Entry* const entry = reader.Next()) {
+    if (entry->is_unsafe) {
+      LOG(ERROR) << "Found unsafe entry " << Redact(entry->path) << " in ZIP";
+      if (!options.continue_on_error)
+        return false;
+      continue;
     }
-    const base::FilePath& entry_path = reader.current_entry_info()->file_path();
-    if (reader.current_entry_info()->is_unsafe()) {
-      DLOG(WARNING) << "Found an unsafe file in zip " << entry_path;
-      return false;
+
+    if (options.filter && !options.filter.Run(entry->path)) {
+      VLOG(1) << "Skipped ZIP entry " << Redact(entry->path);
+      continue;
     }
-    if (filter_cb.Run(entry_path)) {
-      if (reader.current_entry_info()->is_directory()) {
-        if (!directory_creator.Run(entry_path))
-          return false;
-      } else {
-        std::unique_ptr<WriterDelegate> writer = writer_factory.Run(entry_path);
-        if (!reader.ExtractCurrentEntry(writer.get(),
-                                        std::numeric_limits<uint64_t>::max())) {
-          DLOG(WARNING) << "Failed to extract " << entry_path;
+
+    if (entry->is_directory) {
+      // It's a directory.
+      if (!directory_creator.Run(entry->path)) {
+        LOG(ERROR) << "Cannot create directory " << Redact(entry->path);
+        if (!options.continue_on_error)
           return false;
-        }
       }
-    } else if (log_skipped_files) {
-      DLOG(WARNING) << "Skipped file " << entry_path;
+
+      continue;
     }
 
-    if (!reader.AdvanceToNextEntry()) {
-      DLOG(WARNING) << "Failed to advance to the next file";
-      return false;
+    // It's a file.
+    std::unique_ptr<WriterDelegate> writer = writer_factory.Run(entry->path);
+    if (!writer ||
+        (options.progress ? !reader.ExtractCurrentEntryWithListener(
+                                writer.get(), options.progress)
+                          : !reader.ExtractCurrentEntry(writer.get()))) {
+      LOG(ERROR) << "Cannot extract file " << Redact(entry->path)
+                 << " from ZIP";
+      if (!options.continue_on_error)
+        return false;
     }
   }
-  return true;
+
+  return reader.ok();
 }
 
 bool ZipWithFilterCallback(const base::FilePath& src_dir,
                            const base::FilePath& dest_file,
-                           const FilterCallback& filter_cb) {
+                           FilterCallback filter) {
   DCHECK(base::DirectoryExists(src_dir));
-  ZipParams params(src_dir, dest_file);
-  params.set_filter_callback(filter_cb);
-  return Zip(params);
+  return Zip({.src_dir = src_dir,
+              .dest_file = dest_file,
+              .filter_callback = std::move(filter)});
 }
 
-bool Zip(const base::FilePath& src_dir, const base::FilePath& dest_file,
+bool Zip(const base::FilePath& src_dir,
+         const base::FilePath& dest_file,
          bool include_hidden_files) {
-  if (include_hidden_files) {
-    return ZipWithFilterCallback(src_dir, dest_file,
-                                 base::BindRepeating(&ExcludeNoFilesFilter));
-  } else {
-    return ZipWithFilterCallback(
-        src_dir, dest_file, base::BindRepeating(&ExcludeHiddenFilesFilter));
-  }
+  return Zip({.src_dir = src_dir,
+              .dest_file = dest_file,
+              .include_hidden_files = include_hidden_files});
 }
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 bool ZipFiles(const base::FilePath& src_dir,
-              const std::vector<base::FilePath>& src_relative_paths,
+              Paths src_relative_paths,
               int dest_fd) {
   DCHECK(base::DirectoryExists(src_dir));
-  ZipParams params(src_dir, dest_fd);
-  params.set_files_to_zip(src_relative_paths);
-  return Zip(params);
+  return Zip({.src_dir = src_dir,
+              .dest_fd = dest_fd,
+              .src_files = src_relative_paths});
 }
-#endif  // defined(OS_POSIX)
+#endif  // defined(OS_POSIX) || defined(OS_FUCHSIA)
 
 }  // namespace zip
diff --git a/deps/zlib/google/zip.h b/deps/zlib/google/zip.h
index 4f64a8aca883a8..e3036c809c2376 100644
--- a/deps/zlib/google/zip.h
+++ b/deps/zlib/google/zip.h
@@ -1,13 +1,17 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_H_
 #define THIRD_PARTY_ZLIB_GOOGLE_ZIP_H_
 
+#include <cstdint>
+#include <ostream>
+#include <utility>
 #include <vector>
 
 #include "base/callback.h"
+#include "base/containers/span.h"
 #include "base/files/file_path.h"
 #include "base/files/platform_file.h"
 #include "base/time/time.h"
@@ -21,99 +25,118 @@ namespace zip {
 
 class WriterDelegate;
 
+// Paths passed as span to avoid copying them.
+using Paths = base::span<const base::FilePath>;
+
 // Abstraction for file access operation required by Zip().
+//
 // Can be passed to the ZipParams for providing custom access to the files,
 // for example over IPC.
-// If none is provided, the files are accessed directly.
-// All parameters paths are expected to be absolute.
+//
+// All parameters paths are expected to be relative to the source directory.
 class FileAccessor {
  public:
   virtual ~FileAccessor() = default;
 
-  struct DirectoryContentEntry {
-    DirectoryContentEntry(const base::FilePath& path, bool is_directory)
-        : path(path), is_directory(is_directory) {}
-    base::FilePath path;
+  struct Info {
     bool is_directory = false;
+    base::Time last_modified;
   };
 
   // Opens files specified in |paths|.
   // Directories should be mapped to invalid files.
-  virtual std::vector<base::File> OpenFilesForReading(
-      const std::vector<base::FilePath>& paths) = 0;
+  virtual bool Open(Paths paths, std::vector<base::File>* files) = 0;
+
+  // Lists contents of a directory at |path|.
+  virtual bool List(const base::FilePath& path,
+                    std::vector<base::FilePath>* files,
+                    std::vector<base::FilePath>* subdirs) = 0;
 
-  virtual bool DirectoryExists(const base::FilePath& path) = 0;
-  virtual std::vector<DirectoryContentEntry> ListDirectoryContent(
-      const base::FilePath& dir_path) = 0;
-  virtual base::Time GetLastModifiedTime(const base::FilePath& path) = 0;
+  // Gets info about a file or directory.
+  virtual bool GetInfo(const base::FilePath& path, Info* info) = 0;
 };
 
-class ZipParams {
- public:
-  ZipParams(const base::FilePath& src_dir, const base::FilePath& dest_file);
-#if defined(OS_POSIX)
-  // Does not take ownership of |dest_fd|.
-  ZipParams(const base::FilePath& src_dir, int dest_fd);
+// Progress of a ZIP creation operation.
+struct Progress {
+  // Total number of bytes read from files getting zipped so far.
+  std::int64_t bytes = 0;
 
-  int dest_fd() const { return dest_fd_; }
-#endif
+  // Number of file entries added to the ZIP so far.
+  // A file entry is added after its bytes have been processed.
+  int files = 0;
 
-  const base::FilePath& src_dir() const { return src_dir_; }
-
-  const base::FilePath& dest_file() const { return dest_file_; }
-
-  // Restricts the files actually zipped to the paths listed in
-  // |src_relative_paths|. They must be relative to the |src_dir| passed in the
-  // constructor and will be used as the file names in the created zip file. All
-  // source paths must be under |src_dir| in the file system hierarchy.
-  void set_files_to_zip(const std::vector<base::FilePath>& src_relative_paths) {
-    src_files_ = src_relative_paths;
-  }
-  const std::vector<base::FilePath>& files_to_zip() const { return src_files_; }
-
-  using FilterCallback = base::RepeatingCallback<bool(const base::FilePath&)>;
-  void set_filter_callback(FilterCallback filter_callback) {
-    filter_callback_ = filter_callback;
-  }
-  const FilterCallback& filter_callback() const { return filter_callback_; }
-
-  void set_include_hidden_files(bool include_hidden_files) {
-    include_hidden_files_ = include_hidden_files;
-  }
-  bool include_hidden_files() const { return include_hidden_files_; }
-
-  // Sets a custom file accessor for file operations. Default is to directly
-  // access the files (with fopen and the rest).
-  // Useful in cases where running in a sandbox process and file access has to
-  // go through IPC, for example.
-  void set_file_accessor(std::unique_ptr<FileAccessor> file_accessor) {
-    file_accessor_ = std::move(file_accessor);
-  }
-  FileAccessor* file_accessor() const { return file_accessor_.get(); }
-
- private:
-  base::FilePath src_dir_;
-
-  base::FilePath dest_file_;
-#if defined(OS_POSIX)
-  int dest_fd_ = base::kInvalidPlatformFile;
-#endif
+  // Number of directory entries added to the ZIP so far.
+  // A directory entry is added before items in it.
+  int directories = 0;
+
+  // Number of errors encountered so far (files that cannot be opened,
+  // directories that cannot be listed).
+  int errors = 0;
+};
+
+// Prints Progress to output stream.
+std::ostream& operator<<(std::ostream& out, const Progress& progress);
+
+// Callback reporting the progress of a ZIP creation operation.
+//
+// This callback returns a boolean indicating whether the ZIP creation operation
+// should continue. If it returns false once, then the ZIP creation operation is
+// immediately cancelled and the callback won't be called again.
+using ProgressCallback = base::RepeatingCallback<bool(const Progress&)>;
+
+using FilterCallback = base::RepeatingCallback<bool(const base::FilePath&)>;
+
+// ZIP creation parameters and options.
+struct ZipParams {
+  // Source directory. Ignored if |file_accessor| is set.
+  base::FilePath src_dir;
 
-  // The relative paths to the files that should be included in the zip file. If
-  // this is empty, all files in |src_dir_| are included.
-  std::vector<base::FilePath> src_files_;
+  // Abstraction around file system access used to read files.
+  // If left null, an implementation that accesses files directly is used.
+  FileAccessor* file_accessor = nullptr;  // Not owned
 
-  // Filter used to exclude files from the ZIP file. Only effective when
-  // |src_files_| is empty.
-  FilterCallback filter_callback_;
+  // Destination file path.
+  // Either dest_file or dest_fd should be set, but not both.
+  base::FilePath dest_file;
 
-  // Whether hidden files should be included in the ZIP file. Only effective
-  // when |src_files_| is empty.
-  bool include_hidden_files_ = true;
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
+  // Destination file passed a file descriptor.
+  // Either dest_file or dest_fd should be set, but not both.
+  int dest_fd = base::kInvalidPlatformFile;
+#endif
 
-  // Abstraction around file system access used to read files. An implementation
-  // that accesses files directly is provided by default.
-  std::unique_ptr<FileAccessor> file_accessor_;
+  // The relative paths to the files and directories that should be included in
+  // the ZIP file. If this is empty, the whole contents of |src_dir| are
+  // included.
+  //
+  // These paths must be relative to |src_dir| and will be used as the file
+  // names in the created ZIP file. All files must be under |src_dir| in the
+  // file system hierarchy.
+  //
+  // All the paths in |src_files| are included in the created ZIP file,
+  // irrespective of |include_hidden_files| and |filter_callback|.
+  Paths src_files;
+
+  // Filter used to exclude files from the ZIP file. This is only taken in
+  // account when recursively adding subdirectory contents.
+  FilterCallback filter_callback;
+
+  // Optional progress reporting callback.
+  ProgressCallback progress_callback;
+
+  // Progress reporting period. The final callback is always called when the ZIP
+  // creation operation completes.
+  base::TimeDelta progress_period;
+
+  // Should add hidden files? This is only taken in account when recursively
+  // adding subdirectory contents.
+  bool include_hidden_files = true;
+
+  // Should recursively add subdirectory contents?
+  bool recursive = false;
+
+  // Should ignore errors when discovering files and zipping them?
+  bool continue_on_error = false;
 };
 
 // Zip files specified into a ZIP archives. The source files and ZIP destination
@@ -125,56 +148,71 @@ bool Zip(const ZipParams& params);
 // of src_dir will be at the root level of the created zip. For each file in
 // src_dir, include it only if the callback |filter_cb| returns true. Otherwise
 // omit it.
-using FilterCallback = base::RepeatingCallback<bool(const base::FilePath&)>;
 bool ZipWithFilterCallback(const base::FilePath& src_dir,
                            const base::FilePath& dest_file,
-                           const FilterCallback& filter_cb);
+                           FilterCallback filter_cb);
 
 // Convenience method for callers who don't need to set up the filter callback.
 // If |include_hidden_files| is true, files starting with "." are included.
 // Otherwise they are omitted.
-bool Zip(const base::FilePath& src_dir, const base::FilePath& dest_file,
+bool Zip(const base::FilePath& src_dir,
+         const base::FilePath& dest_file,
          bool include_hidden_files);
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 // Zips files listed in |src_relative_paths| to destination specified by file
 // descriptor |dest_fd|, without taking ownership of |dest_fd|. The paths listed
 // in |src_relative_paths| are relative to the |src_dir| and will be used as the
 // file names in the created zip file. All source paths must be under |src_dir|
 // in the file system hierarchy.
 bool ZipFiles(const base::FilePath& src_dir,
-              const std::vector<base::FilePath>& src_relative_paths,
+              Paths src_relative_paths,
               int dest_fd);
-#endif  // defined(OS_POSIX)
+#endif  // defined(OS_POSIX) || defined(OS_FUCHSIA)
+
+// Callback reporting the number of bytes written during Unzip.
+using UnzipProgressCallback = base::RepeatingCallback<void(uint64_t bytes)>;
+
+// Options of the Unzip function, with valid default values.
+struct UnzipOptions {
+  // Encoding of entry paths in the ZIP archive. By default, paths are assumed
+  // to be in UTF-8.
+  std::string encoding;
+
+  // Only extract the entries for which |filter_cb| returns true. By default,
+  // everything gets extracted.
+  FilterCallback filter;
+
+  // Callback to report bytes extracted from the ZIP.
+  UnzipProgressCallback progress;
+
+  // Password to decrypt the encrypted files.
+  std::string password;
+
+  // Should ignore errors when extracting files?
+  bool continue_on_error = false;
+};
 
-// Unzip the contents of zip_file into dest_dir.
-// For each file in zip_file, include it only if the callback |filter_cb|
-// returns true. Otherwise omit it.
-// If |log_skipped_files| is true, files skipped during extraction are printed
-// to debug log.
-using FilterCallback = base::RepeatingCallback<bool(const base::FilePath&)>;
-bool UnzipWithFilterCallback(const base::FilePath& zip_file,
-                             const base::FilePath& dest_dir,
-                             const FilterCallback& filter_cb,
-                             bool log_skipped_files);
-
-// Unzip the contents of zip_file, using the writers provided by writer_factory.
-// For each file in zip_file, include it only if the callback |filter_cb|
-// returns true. Otherwise omit it.
-// If |log_skipped_files| is true, files skipped during extraction are printed
-// to debug log.
 typedef base::RepeatingCallback<std::unique_ptr<WriterDelegate>(
     const base::FilePath&)>
     WriterFactory;
+
 typedef base::RepeatingCallback<bool(const base::FilePath&)> DirectoryCreator;
-bool UnzipWithFilterAndWriters(const base::PlatformFile& zip_file,
-                               const WriterFactory& writer_factory,
-                               const DirectoryCreator& directory_creator,
-                               const FilterCallback& filter_cb,
-                               bool log_skipped_files);
-
-// Unzip the contents of zip_file into dest_dir.
-bool Unzip(const base::FilePath& zip_file, const base::FilePath& dest_dir);
+
+// Unzips the contents of |zip_file|, using the writers provided by
+// |writer_factory|.
+bool Unzip(const base::PlatformFile& zip_file,
+           WriterFactory writer_factory,
+           DirectoryCreator directory_creator,
+           UnzipOptions options = {});
+
+// Unzips the contents of |zip_file| into |dest_dir|.
+// This function does not overwrite any existing file.
+// A filename collision will result in an error.
+// Therefore, |dest_dir| should initially be an empty directory.
+bool Unzip(const base::FilePath& zip_file,
+           const base::FilePath& dest_dir,
+           UnzipOptions options = {});
 
 }  // namespace zip
 
diff --git a/deps/zlib/google/zip_internal.cc b/deps/zlib/google/zip_internal.cc
index 314740f5447c03..e65d7ce6b5f464 100644
--- a/deps/zlib/google/zip_internal.cc
+++ b/deps/zlib/google/zip_internal.cc
@@ -1,14 +1,20 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #include "third_party/zlib/google/zip_internal.h"
 
 #include <stddef.h>
+#include <string.h>
 
 #include <algorithm>
+#include <unordered_set>
 
+#include "base/files/file_path.h"
 #include "base/logging.h"
+#include "base/no_destructor.h"
+#include "base/notreached.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 
 #if defined(USE_SYSTEM_MINIZIP)
@@ -34,9 +40,9 @@ typedef struct {
 } WIN32FILE_IOWIN;
 
 // This function is derived from third_party/minizip/iowin32.c.
-// Its only difference is that it treats the char* as UTF8 and
+// Its only difference is that it treats the filename as UTF-8 and
 // uses the Unicode version of CreateFile.
-void* ZipOpenFunc(void *opaque, const char* filename, int mode) {
+void* ZipOpenFunc(void* opaque, const void* filename, int mode) {
   DWORD desired_access = 0, creation_disposition = 0;
   DWORD share_mode = 0, flags_and_attributes = 0;
   HANDLE file = 0;
@@ -54,10 +60,11 @@ void* ZipOpenFunc(void *opaque, const char* filename, int mode) {
     creation_disposition = CREATE_ALWAYS;
   }
 
-  base::string16 filename16 = base::UTF8ToUTF16(filename);
-  if ((filename != NULL) && (desired_access != 0)) {
-    file = CreateFile(filename16.c_str(), desired_access, share_mode,
-        NULL, creation_disposition, flags_and_attributes, NULL);
+  if (filename != nullptr && desired_access != 0) {
+    file = CreateFileW(
+        base::UTF8ToWide(static_cast<const char*>(filename)).c_str(),
+        desired_access, share_mode, nullptr, creation_disposition,
+        flags_and_attributes, nullptr);
   }
 
   if (file == INVALID_HANDLE_VALUE)
@@ -77,11 +84,11 @@ void* ZipOpenFunc(void *opaque, const char* filename, int mode) {
 }
 #endif
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 // Callback function for zlib that opens a file stream from a file descriptor.
 // Since we do not own the file descriptor, dup it so that we can fdopen/fclose
 // a file stream.
-void* FdOpenFileFunc(void* opaque, const char* filename, int mode) {
+void* FdOpenFileFunc(void* opaque, const void* filename, int mode) {
   FILE* file = NULL;
   const char* mode_fopen = NULL;
 
@@ -103,15 +110,15 @@ void* FdOpenFileFunc(void* opaque, const char* filename, int mode) {
 
 int FdCloseFileFunc(void* opaque, void* stream) {
   fclose(static_cast<FILE*>(stream));
-  free(opaque); // malloc'ed in FillFdOpenFileFunc()
+  free(opaque);  // malloc'ed in FillFdOpenFileFunc()
   return 0;
 }
 
 // Fills |pzlib_filecunc_def| appropriately to handle the zip file
 // referred to by |fd|.
-void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) {
-  fill_fopen_filefunc(pzlib_filefunc_def);
-  pzlib_filefunc_def->zopen_file = FdOpenFileFunc;
+void FillFdOpenFileFunc(zlib_filefunc64_def* pzlib_filefunc_def, int fd) {
+  fill_fopen64_filefunc(pzlib_filefunc_def);
+  pzlib_filefunc_def->zopen64_file = FdOpenFileFunc;
   pzlib_filefunc_def->zclose_file = FdCloseFileFunc;
   int* ptr_fd = static_cast<int*>(malloc(sizeof(fd)));
   *ptr_fd = fd;
@@ -122,7 +129,7 @@ void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) {
 #if defined(OS_WIN)
 // Callback function for zlib that opens a file stream from a Windows handle.
 // Does not take ownership of the handle.
-void* HandleOpenFileFunc(void* opaque, const char* filename, int mode) {
+void* HandleOpenFileFunc(void* opaque, const void* /*filename*/, int mode) {
   WIN32FILE_IOWIN file_ret;
   file_ret.hf = static_cast<HANDLE>(opaque);
   file_ret.error = 0;
@@ -136,7 +143,7 @@ void* HandleOpenFileFunc(void* opaque, const char* filename, int mode) {
 }
 
 int HandleCloseFileFunc(void* opaque, void* stream) {
-  free(stream); // malloc'ed in HandleOpenFileFunc()
+  free(stream);  // malloc'ed in HandleOpenFileFunc()
   return 0;
 }
 #endif
@@ -146,8 +153,8 @@ int HandleCloseFileFunc(void* opaque, void* stream) {
 // expect their opaque parameters refer to this struct.
 struct ZipBuffer {
   const char* data;  // weak
-  size_t length;
-  size_t offset;
+  ZPOS64_T length;
+  ZPOS64_T offset;
 };
 
 // Opens the specified file. When this function returns a non-NULL pointer, zlib
@@ -156,7 +163,7 @@ struct ZipBuffer {
 // given opaque parameter and returns it because this parameter stores all
 // information needed for uncompressing data. (This function does not support
 // writing compressed data and it returns NULL for this case.)
-void* OpenZipBuffer(void* opaque, const char* /*filename*/, int mode) {
+void* OpenZipBuffer(void* opaque, const void* /*filename*/, int mode) {
   if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) != ZLIB_FILEFUNC_MODE_READ) {
     NOTREACHED();
     return NULL;
@@ -173,10 +180,11 @@ void* OpenZipBuffer(void* opaque, const char* /*filename*/, int mode) {
 uLong ReadZipBuffer(void* opaque, void* /*stream*/, void* buf, uLong size) {
   ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque);
   DCHECK_LE(buffer->offset, buffer->length);
-  size_t remaining_bytes = buffer->length - buffer->offset;
+  ZPOS64_T remaining_bytes = buffer->length - buffer->offset;
   if (!buffer || !buffer->data || !remaining_bytes)
     return 0;
-  size = std::min(size, static_cast<uLong>(remaining_bytes));
+  if (size > remaining_bytes)
+    size = remaining_bytes;
   memcpy(buf, &buffer->data[buffer->offset], size);
   buffer->offset += size;
   return size;
@@ -193,21 +201,23 @@ uLong WriteZipBuffer(void* /*opaque*/,
 }
 
 // Returns the offset from the beginning of the data.
-long GetOffsetOfZipBuffer(void* opaque, void* /*stream*/) {
+ZPOS64_T GetOffsetOfZipBuffer(void* opaque, void* /*stream*/) {
   ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque);
   if (!buffer)
     return -1;
-  return static_cast<long>(buffer->offset);
+  return buffer->offset;
 }
 
 // Moves the current offset to the specified position.
-long SeekZipBuffer(void* opaque, void* /*stream*/, uLong offset, int origin) {
+long SeekZipBuffer(void* opaque,
+                   void* /*stream*/,
+                   ZPOS64_T offset,
+                   int origin) {
   ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque);
   if (!buffer)
     return -1;
   if (origin == ZLIB_FILEFUNC_SEEK_CUR) {
-    buffer->offset = std::min(buffer->offset + static_cast<size_t>(offset),
-                              buffer->length);
+    buffer->offset = std::min(buffer->offset + offset, buffer->length);
     return 0;
   }
   if (origin == ZLIB_FILEFUNC_SEEK_END) {
@@ -215,7 +225,7 @@ long SeekZipBuffer(void* opaque, void* /*stream*/, uLong offset, int origin) {
     return 0;
   }
   if (origin == ZLIB_FILEFUNC_SEEK_SET) {
-    buffer->offset = std::min(buffer->length, static_cast<size_t>(offset));
+    buffer->offset = std::min(buffer->length, offset);
     return 0;
   }
   NOTREACHED();
@@ -241,7 +251,7 @@ int GetErrorOfZipBuffer(void* /*opaque*/, void* /*stream*/) {
 // Returns a zip_fileinfo struct with the time represented by |file_time|.
 zip_fileinfo TimeToZipFileInfo(const base::Time& file_time) {
   base::Time::Exploded file_time_parts;
-  file_time.LocalExplode(&file_time_parts);
+  file_time.UTCExplode(&file_time_parts);
 
   zip_fileinfo zip_info = {};
   if (file_time_parts.year >= 1980) {
@@ -266,33 +276,33 @@ namespace zip {
 namespace internal {
 
 unzFile OpenForUnzipping(const std::string& file_name_utf8) {
-  zlib_filefunc_def* zip_func_ptrs = NULL;
+  zlib_filefunc64_def* zip_func_ptrs = nullptr;
 #if defined(OS_WIN)
-  zlib_filefunc_def zip_funcs;
-  fill_win32_filefunc(&zip_funcs);
-  zip_funcs.zopen_file = ZipOpenFunc;
+  zlib_filefunc64_def zip_funcs;
+  fill_win32_filefunc64(&zip_funcs);
+  zip_funcs.zopen64_file = ZipOpenFunc;
   zip_func_ptrs = &zip_funcs;
 #endif
-  return unzOpen2(file_name_utf8.c_str(), zip_func_ptrs);
+  return unzOpen2_64(file_name_utf8.c_str(), zip_func_ptrs);
 }
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 unzFile OpenFdForUnzipping(int zip_fd) {
-  zlib_filefunc_def zip_funcs;
+  zlib_filefunc64_def zip_funcs;
   FillFdOpenFileFunc(&zip_funcs, zip_fd);
   // Passing dummy "fd" filename to zlib.
-  return unzOpen2("fd", &zip_funcs);
+  return unzOpen2_64("fd", &zip_funcs);
 }
 #endif
 
 #if defined(OS_WIN)
 unzFile OpenHandleForUnzipping(HANDLE zip_handle) {
-  zlib_filefunc_def zip_funcs;
-  fill_win32_filefunc(&zip_funcs);
-  zip_funcs.zopen_file = HandleOpenFileFunc;
+  zlib_filefunc64_def zip_funcs;
+  fill_win32_filefunc64(&zip_funcs);
+  zip_funcs.zopen64_file = HandleOpenFileFunc;
   zip_funcs.zclose_file = HandleCloseFileFunc;
   zip_funcs.opaque = zip_handle;
-  return unzOpen2("fd", &zip_funcs);
+  return unzOpen2_64("fd", &zip_funcs);
 }
 #endif
 
@@ -308,72 +318,152 @@ unzFile PrepareMemoryForUnzipping(const std::string& data) {
   buffer->length = data.length();
   buffer->offset = 0;
 
-  zlib_filefunc_def zip_functions;
-  zip_functions.zopen_file = OpenZipBuffer;
+  zlib_filefunc64_def zip_functions;
+  zip_functions.zopen64_file = OpenZipBuffer;
   zip_functions.zread_file = ReadZipBuffer;
   zip_functions.zwrite_file = WriteZipBuffer;
-  zip_functions.ztell_file = GetOffsetOfZipBuffer;
-  zip_functions.zseek_file = SeekZipBuffer;
+  zip_functions.ztell64_file = GetOffsetOfZipBuffer;
+  zip_functions.zseek64_file = SeekZipBuffer;
   zip_functions.zclose_file = CloseZipBuffer;
   zip_functions.zerror_file = GetErrorOfZipBuffer;
-  zip_functions.opaque = static_cast<void*>(buffer);
-  return unzOpen2(NULL, &zip_functions);
+  zip_functions.opaque = buffer;
+  return unzOpen2_64(nullptr, &zip_functions);
 }
 
 zipFile OpenForZipping(const std::string& file_name_utf8, int append_flag) {
-  zlib_filefunc_def* zip_func_ptrs = NULL;
+  zlib_filefunc64_def* zip_func_ptrs = nullptr;
 #if defined(OS_WIN)
-  zlib_filefunc_def zip_funcs;
-  fill_win32_filefunc(&zip_funcs);
-  zip_funcs.zopen_file = ZipOpenFunc;
+  zlib_filefunc64_def zip_funcs;
+  fill_win32_filefunc64(&zip_funcs);
+  zip_funcs.zopen64_file = ZipOpenFunc;
   zip_func_ptrs = &zip_funcs;
 #endif
-  return zipOpen2(file_name_utf8.c_str(),
-                  append_flag,
-                  NULL,  // global comment
-                  zip_func_ptrs);
+  return zipOpen2_64(file_name_utf8.c_str(), append_flag, nullptr,
+                     zip_func_ptrs);
 }
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 zipFile OpenFdForZipping(int zip_fd, int append_flag) {
-  zlib_filefunc_def zip_funcs;
+  zlib_filefunc64_def zip_funcs;
   FillFdOpenFileFunc(&zip_funcs, zip_fd);
   // Passing dummy "fd" filename to zlib.
-  return zipOpen2("fd", append_flag, NULL, &zip_funcs);
+  return zipOpen2_64("fd", append_flag, nullptr, &zip_funcs);
 }
 #endif
 
 bool ZipOpenNewFileInZip(zipFile zip_file,
                          const std::string& str_path,
-                         base::Time last_modified_time) {
+                         base::Time last_modified_time,
+                         Compression compression) {
   // Section 4.4.4 http://www.pkware.com/documents/casestudies/APPNOTE.TXT
   // Setting the Language encoding flag so the file is told to be in utf-8.
   const uLong LANGUAGE_ENCODING_FLAG = 0x1 << 11;
 
-  zip_fileinfo file_info = TimeToZipFileInfo(last_modified_time);
-  if (ZIP_OK != zipOpenNewFileInZip4(zip_file,          // file
-                                     str_path.c_str(),  // filename
-                                     &file_info,        // zip_fileinfo
-                                     NULL,              // extrafield_local,
-                                     0u,                // size_extrafield_local
-                                     NULL,              // extrafield_global
-                                     0u,          // size_extrafield_global
-                                     NULL,        // comment
-                                     Z_DEFLATED,  // method
-                                     Z_DEFAULT_COMPRESSION,  // level
-                                     0,                      // raw
-                                     -MAX_WBITS,             // windowBits
-                                     DEF_MEM_LEVEL,          // memLevel
-                                     Z_DEFAULT_STRATEGY,     // strategy
-                                     NULL,                   // password
-                                     0,                      // crcForCrypting
-                                     0,                      // versionMadeBy
-                                     LANGUAGE_ENCODING_FLAG)) {  // flagBase
-    DLOG(ERROR) << "Could not open zip file entry " << str_path;
+  const zip_fileinfo file_info = TimeToZipFileInfo(last_modified_time);
+  const int err = zipOpenNewFileInZip4_64(
+      /*file=*/zip_file,
+      /*filename=*/str_path.c_str(),
+      /*zip_fileinfo=*/&file_info,
+      /*extrafield_local=*/nullptr,
+      /*size_extrafield_local=*/0u,
+      /*extrafield_global=*/nullptr,
+      /*size_extrafield_global=*/0u,
+      /*comment=*/nullptr,
+      /*method=*/compression,
+      /*level=*/Z_DEFAULT_COMPRESSION,
+      /*raw=*/0,
+      /*windowBits=*/-MAX_WBITS,
+      /*memLevel=*/DEF_MEM_LEVEL,
+      /*strategy=*/Z_DEFAULT_STRATEGY,
+      /*password=*/nullptr,
+      /*crcForCrypting=*/0,
+      /*versionMadeBy=*/0,
+      /*flagBase=*/LANGUAGE_ENCODING_FLAG,
+      /*zip64=*/1);
+
+  if (err != ZIP_OK) {
+    DLOG(ERROR) << "Cannot open ZIP file entry '" << str_path
+                << "': zipOpenNewFileInZip4_64 returned " << err;
     return false;
   }
+
   return true;
 }
 
+Compression GetCompressionMethod(const base::FilePath& path) {
+  // Get the filename extension in lower case.
+  const base::FilePath::StringType ext =
+      base::ToLowerASCII(path.FinalExtension());
+
+  if (ext.empty())
+    return kDeflated;
+
+  using StringPiece = base::FilePath::StringPieceType;
+
+  // Skip the leading dot.
+  StringPiece ext_without_dot = ext;
+  DCHECK_EQ(ext_without_dot.front(), FILE_PATH_LITERAL('.'));
+  ext_without_dot.remove_prefix(1);
+
+  // Well known filename extensions of files that a likely to be already
+  // compressed. The extensions are in lower case without the leading dot.
+  static const base::NoDestructor<
+      std::unordered_set<StringPiece, base::StringPieceHashImpl<StringPiece>>>
+      exts(std::initializer_list<StringPiece>{
+          FILE_PATH_LITERAL("3g2"),   //
+          FILE_PATH_LITERAL("3gp"),   //
+          FILE_PATH_LITERAL("7z"),    //
+          FILE_PATH_LITERAL("7zip"),  //
+          FILE_PATH_LITERAL("aac"),   //
+          FILE_PATH_LITERAL("avi"),   //
+          FILE_PATH_LITERAL("bz"),    //
+          FILE_PATH_LITERAL("bz2"),   //
+          FILE_PATH_LITERAL("crx"),   //
+          FILE_PATH_LITERAL("gif"),   //
+          FILE_PATH_LITERAL("gz"),    //
+          FILE_PATH_LITERAL("jar"),   //
+          FILE_PATH_LITERAL("jpeg"),  //
+          FILE_PATH_LITERAL("jpg"),   //
+          FILE_PATH_LITERAL("lz"),    //
+          FILE_PATH_LITERAL("m2v"),   //
+          FILE_PATH_LITERAL("m4p"),   //
+          FILE_PATH_LITERAL("m4v"),   //
+          FILE_PATH_LITERAL("mng"),   //
+          FILE_PATH_LITERAL("mov"),   //
+          FILE_PATH_LITERAL("mp2"),   //
+          FILE_PATH_LITERAL("mp3"),   //
+          FILE_PATH_LITERAL("mp4"),   //
+          FILE_PATH_LITERAL("mpe"),   //
+          FILE_PATH_LITERAL("mpeg"),  //
+          FILE_PATH_LITERAL("mpg"),   //
+          FILE_PATH_LITERAL("mpv"),   //
+          FILE_PATH_LITERAL("ogg"),   //
+          FILE_PATH_LITERAL("ogv"),   //
+          FILE_PATH_LITERAL("png"),   //
+          FILE_PATH_LITERAL("qt"),    //
+          FILE_PATH_LITERAL("rar"),   //
+          FILE_PATH_LITERAL("taz"),   //
+          FILE_PATH_LITERAL("tb2"),   //
+          FILE_PATH_LITERAL("tbz"),   //
+          FILE_PATH_LITERAL("tbz2"),  //
+          FILE_PATH_LITERAL("tgz"),   //
+          FILE_PATH_LITERAL("tlz"),   //
+          FILE_PATH_LITERAL("tz"),    //
+          FILE_PATH_LITERAL("tz2"),   //
+          FILE_PATH_LITERAL("vob"),   //
+          FILE_PATH_LITERAL("webm"),  //
+          FILE_PATH_LITERAL("wma"),   //
+          FILE_PATH_LITERAL("wmv"),   //
+          FILE_PATH_LITERAL("xz"),    //
+          FILE_PATH_LITERAL("z"),     //
+          FILE_PATH_LITERAL("zip"),   //
+      });
+
+  if (exts->count(ext_without_dot))
+    return kStored;
+
+  return kDeflated;
+}
+
 }  // namespace internal
 }  // namespace zip
diff --git a/deps/zlib/google/zip_internal.h b/deps/zlib/google/zip_internal.h
index 49fb902a7408e7..f107d7fe883541 100644
--- a/deps/zlib/google/zip_internal.h
+++ b/deps/zlib/google/zip_internal.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -35,7 +35,7 @@ namespace internal {
 // Windows.
 unzFile OpenForUnzipping(const std::string& file_name_utf8);
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 // Opens the file referred to by |zip_fd| for unzipping.
 unzFile OpenFdForUnzipping(int zip_fd);
 #endif
@@ -54,16 +54,30 @@ unzFile PrepareMemoryForUnzipping(const std::string& data);
 // Windows. |append_flag| will be passed to zipOpen2().
 zipFile OpenForZipping(const std::string& file_name_utf8, int append_flag);
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 // Opens the file referred to by |zip_fd| for zipping. |append_flag| will be
 // passed to zipOpen2().
 zipFile OpenFdForZipping(int zip_fd, int append_flag);
 #endif
 
-// Wrapper around zipOpenNewFileInZip4 which passes most common options.
+// Compression methods.
+enum Compression {
+  kStored = 0,             // Stored (no compression)
+  kDeflated = Z_DEFLATED,  // Deflated
+};
+
+// Adds a file (or directory) entry to the ZIP archive.
 bool ZipOpenNewFileInZip(zipFile zip_file,
                          const std::string& str_path,
-                         base::Time last_modified_time);
+                         base::Time last_modified_time,
+                         Compression compression);
+
+// Selects the best compression method for the given file. The heuristic is
+// based on the filename extension. By default, the compression method is
+// kDeflated. But if the given path has an extension indicating a well known
+// file format which is likely to be already compressed (eg ZIP, RAR, JPG,
+// PNG...) then the compression method is simply kStored.
+Compression GetCompressionMethod(const base::FilePath& path);
 
 const int kZipMaxPath = 256;
 const int kZipBufSize = 8192;
diff --git a/deps/zlib/google/zip_reader.cc b/deps/zlib/google/zip_reader.cc
index 8b4bb4aee782bf..e97027a0bbb2fb 100644
--- a/deps/zlib/google/zip_reader.cc
+++ b/deps/zlib/google/zip_reader.cc
@@ -1,20 +1,26 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #include "third_party/zlib/google/zip_reader.h"
 
+#include <algorithm>
 #include <utility>
 
 #include "base/bind.h"
+#include "base/check.h"
 #include "base/files/file.h"
+#include "base/files/file_util.h"
+#include "base/i18n/icu_string_conversions.h"
 #include "base/logging.h"
-#include "base/macros.h"
-#include "base/single_thread_task_runner.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/threading/thread_task_runner_handle.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "build/build_config.h"
+#include "third_party/zlib/google/redact.h"
 #include "third_party/zlib/google/zip_internal.h"
 
 #if defined(USE_SYSTEM_MINIZIP)
@@ -26,114 +32,93 @@
 #endif  // defined(OS_WIN)
 #endif  // defined(USE_SYSTEM_MINIZIP)
 
-namespace zip {
+#if defined(OS_POSIX)
+#include <sys/stat.h>
+#endif
 
+namespace zip {
 namespace {
 
-// StringWriterDelegate --------------------------------------------------------
+enum UnzipError : int;
+
+std::ostream& operator<<(std::ostream& out, UnzipError error) {
+#define SWITCH_ERR(X) \
+  case X:             \
+    return out << #X;
+  switch (error) {
+    SWITCH_ERR(UNZ_OK);
+    SWITCH_ERR(UNZ_END_OF_LIST_OF_FILE);
+    SWITCH_ERR(UNZ_ERRNO);
+    SWITCH_ERR(UNZ_PARAMERROR);
+    SWITCH_ERR(UNZ_BADZIPFILE);
+    SWITCH_ERR(UNZ_INTERNALERROR);
+    SWITCH_ERR(UNZ_CRCERROR);
+    default:
+      return out << "UNZ" << static_cast<int>(error);
+  }
+#undef SWITCH_ERR
+}
 
-// A writer delegate that writes no more than |max_read_bytes| to a given
-// std::string.
-class StringWriterDelegate : public WriterDelegate {
- public:
-  StringWriterDelegate(size_t max_read_bytes, std::string* output);
-  ~StringWriterDelegate() override;
+bool IsValidFileNameCharacterOnWindows(char16_t c) {
+  if (c < 32)
+    return false;
 
-  // WriterDelegate methods:
+  switch (c) {
+    case '<':   // Less than
+    case '>':   // Greater than
+    case ':':   // Colon
+    case '"':   // Double quote
+    case '|':   // Vertical bar or pipe
+    case '?':   // Question mark
+    case '*':   // Asterisk
+    case '/':   // Forward slash
+    case '\\':  // Backslash
+      return false;
+  }
 
-  // Returns true.
-  bool PrepareOutput() override;
+  return true;
+}
 
-  // Appends |num_bytes| bytes from |data| to the output string. Returns false
-  // if |num_bytes| will cause the string to exceed |max_read_bytes|.
-  bool WriteBytes(const char* data, int num_bytes) override;
+// A writer delegate that writes to a given string.
+class StringWriterDelegate : public WriterDelegate {
+ public:
+  explicit StringWriterDelegate(std::string* output) : output_(output) {}
 
-  void SetTimeModified(const base::Time& time) override;
+  // WriterDelegate methods:
+  bool WriteBytes(const char* data, int num_bytes) override {
+    output_->append(data, num_bytes);
+    return true;
+  }
 
  private:
-  size_t max_read_bytes_;
-  std::string* output_;
-
-  DISALLOW_COPY_AND_ASSIGN(StringWriterDelegate);
+  std::string* const output_;
 };
 
-StringWriterDelegate::StringWriterDelegate(size_t max_read_bytes,
-                                           std::string* output)
-    : max_read_bytes_(max_read_bytes),
-      output_(output) {
-}
-
-StringWriterDelegate::~StringWriterDelegate() {
-}
-
-bool StringWriterDelegate::PrepareOutput() {
-  return true;
-}
-
-bool StringWriterDelegate::WriteBytes(const char* data, int num_bytes) {
-  if (output_->size() + num_bytes > max_read_bytes_)
-    return false;
-  output_->append(data, num_bytes);
-  return true;
-}
-
-void StringWriterDelegate::SetTimeModified(const base::Time& time) {
-  // Do nothing.
+#if defined(OS_POSIX)
+void SetPosixFilePermissions(int fd, int mode) {
+  base::stat_wrapper_t sb;
+  if (base::File::Fstat(fd, &sb)) {
+    return;
+  }
+  mode_t new_mode = sb.st_mode;
+  // Transfer the executable bit only if the file is readable.
+  if ((sb.st_mode & S_IRUSR) == S_IRUSR && (mode & S_IXUSR) == S_IXUSR) {
+    new_mode |= S_IXUSR;
+  }
+  if ((sb.st_mode & S_IRGRP) == S_IRGRP && (mode & S_IXGRP) == S_IXGRP) {
+    new_mode |= S_IXGRP;
+  }
+  if ((sb.st_mode & S_IROTH) == S_IROTH && (mode & S_IXOTH) == S_IXOTH) {
+    new_mode |= S_IXOTH;
+  }
+  if (new_mode != sb.st_mode) {
+    fchmod(fd, new_mode);
+  }
 }
+#endif
 
 }  // namespace
 
-// TODO(satorux): The implementation assumes that file names in zip files
-// are encoded in UTF-8. This is true for zip files created by Zip()
-// function in zip.h, but not true for user-supplied random zip files.
-ZipReader::EntryInfo::EntryInfo(const std::string& file_name_in_zip,
-                                const unz_file_info& raw_file_info)
-    : file_path_(base::FilePath::FromUTF8Unsafe(file_name_in_zip)),
-      is_directory_(false),
-      is_unsafe_(false),
-      is_encrypted_(false) {
-  original_size_ = raw_file_info.uncompressed_size;
-
-  // Directory entries in zip files end with "/".
-  is_directory_ = base::EndsWith(file_name_in_zip, "/",
-                                 base::CompareCase::INSENSITIVE_ASCII);
-
-  // Check the file name here for directory traversal issues.
-  is_unsafe_ = file_path_.ReferencesParent();
-
-  // We also consider that the file name is unsafe, if it's invalid UTF-8.
-  base::string16 file_name_utf16;
-  if (!base::UTF8ToUTF16(file_name_in_zip.data(), file_name_in_zip.size(),
-                         &file_name_utf16)) {
-    is_unsafe_ = true;
-  }
-
-  // We also consider that the file name is unsafe, if it's absolute.
-  // On Windows, IsAbsolute() returns false for paths starting with "/".
-  if (file_path_.IsAbsolute() ||
-      base::StartsWith(file_name_in_zip, "/",
-                       base::CompareCase::INSENSITIVE_ASCII))
-    is_unsafe_ = true;
-
-  // Whether the file is encrypted is bit 0 of the flag.
-  is_encrypted_ = raw_file_info.flag & 1;
-
-  // Construct the last modified time. The timezone info is not present in
-  // zip files, so we construct the time as local time.
-  base::Time::Exploded exploded_time = {};  // Zero-clear.
-  exploded_time.year = raw_file_info.tmu_date.tm_year;
-  // The month in zip file is 0-based, whereas ours is 1-based.
-  exploded_time.month = raw_file_info.tmu_date.tm_mon + 1;
-  exploded_time.day_of_month = raw_file_info.tmu_date.tm_mday;
-  exploded_time.hour = raw_file_info.tmu_date.tm_hour;
-  exploded_time.minute = raw_file_info.tmu_date.tm_min;
-  exploded_time.second = raw_file_info.tmu_date.tm_sec;
-  exploded_time.millisecond = 0;
-
-  if (!base::Time::FromLocalExploded(exploded_time, &last_modified_))
-    last_modified_ = base::Time::UnixEpoch();
-}
-
 ZipReader::ZipReader() {
   Reset();
 }
@@ -142,13 +127,14 @@ ZipReader::~ZipReader() {
   Close();
 }
 
-bool ZipReader::Open(const base::FilePath& zip_file_path) {
+bool ZipReader::Open(const base::FilePath& zip_path) {
   DCHECK(!zip_file_);
 
   // Use of "Unsafe" function does not look good, but there is no way to do
   // this safely on Linux. See file_util.h for details.
-  zip_file_ = internal::OpenForUnzipping(zip_file_path.AsUTF8Unsafe());
+  zip_file_ = internal::OpenForUnzipping(zip_path.AsUTF8Unsafe());
   if (!zip_file_) {
+    LOG(ERROR) << "Cannot open ZIP archive " << Redact(zip_path);
     return false;
   }
 
@@ -158,12 +144,13 @@ bool ZipReader::Open(const base::FilePath& zip_file_path) {
 bool ZipReader::OpenFromPlatformFile(base::PlatformFile zip_fd) {
   DCHECK(!zip_file_);
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
   zip_file_ = internal::OpenFdForUnzipping(zip_fd);
 #elif defined(OS_WIN)
   zip_file_ = internal::OpenHandleForUnzipping(zip_fd);
 #endif
   if (!zip_file_) {
+    LOG(ERROR) << "Cannot open ZIP from file handle " << zip_fd;
     return false;
   }
 
@@ -179,145 +166,329 @@ bool ZipReader::OpenFromString(const std::string& data) {
 
 void ZipReader::Close() {
   if (zip_file_) {
-    unzClose(zip_file_);
+    if (const UnzipError err{unzClose(zip_file_)}; err != UNZ_OK) {
+      LOG(ERROR) << "Error while closing ZIP archive: " << err;
+    }
   }
   Reset();
 }
 
-bool ZipReader::HasMore() {
-  return !reached_end_;
-}
-
-bool ZipReader::AdvanceToNextEntry() {
+const ZipReader::Entry* ZipReader::Next() {
   DCHECK(zip_file_);
 
-  // Should not go further if we already reached the end.
   if (reached_end_)
-    return false;
+    return nullptr;
 
-  unz_file_pos position = {};
-  if (unzGetFilePos(zip_file_, &position) != UNZ_OK)
-    return false;
-  const int current_entry_index = position.num_of_file;
-  // If we are currently at the last entry, then the next position is the
-  // end of the zip file, so mark that we reached the end.
-  if (current_entry_index + 1 == num_entries_) {
-    reached_end_ = true;
-  } else {
-    DCHECK_LT(current_entry_index + 1, num_entries_);
-    if (unzGoToNextFile(zip_file_) != UNZ_OK) {
-      return false;
+  DCHECK(ok_);
+
+  // Move to the next entry if we're not trying to open the first entry.
+  if (next_index_ > 0) {
+    if (const UnzipError err{unzGoToNextFile(zip_file_)}; err != UNZ_OK) {
+      reached_end_ = true;
+      if (err != UNZ_END_OF_LIST_OF_FILE) {
+        LOG(ERROR) << "Cannot go to next entry in ZIP: " << err;
+        ok_ = false;
+      }
+      return nullptr;
     }
   }
-  current_entry_info_.reset();
-  return true;
+
+  next_index_++;
+
+  if (!OpenEntry()) {
+    reached_end_ = true;
+    ok_ = false;
+    return nullptr;
+  }
+
+  return &entry_;
 }
 
-bool ZipReader::OpenCurrentEntryInZip() {
+bool ZipReader::OpenEntry() {
   DCHECK(zip_file_);
 
-  unz_file_info raw_file_info = {};
-  char raw_file_name_in_zip[internal::kZipMaxPath] = {};
-  const int result = unzGetCurrentFileInfo(zip_file_,
-                                           &raw_file_info,
-                                           raw_file_name_in_zip,
-                                           sizeof(raw_file_name_in_zip) - 1,
-                                           NULL,  // extraField.
-                                           0,  // extraFieldBufferSize.
-                                           NULL,  // szComment.
-                                           0);  // commentBufferSize.
-  if (result != UNZ_OK)
+  // Get entry info.
+  unz_file_info64 info = {};
+  char path_in_zip[internal::kZipMaxPath] = {};
+  if (const UnzipError err{unzGetCurrentFileInfo64(
+          zip_file_, &info, path_in_zip, sizeof(path_in_zip) - 1, nullptr, 0,
+          nullptr, 0)};
+      err != UNZ_OK) {
+    LOG(ERROR) << "Cannot get entry from ZIP: " << err;
     return false;
-  if (raw_file_name_in_zip[0] == '\0')
+  }
+
+  entry_.path_in_original_encoding = path_in_zip;
+
+  // Convert path from original encoding to Unicode.
+  std::u16string path_in_utf16;
+  const char* const encoding = encoding_.empty() ? "UTF-8" : encoding_.c_str();
+  if (!base::CodepageToUTF16(entry_.path_in_original_encoding, encoding,
+                             base::OnStringConversionError::SUBSTITUTE,
+                             &path_in_utf16)) {
+    LOG(ERROR) << "Cannot convert path from encoding " << encoding;
     return false;
-  current_entry_info_.reset(
-      new EntryInfo(raw_file_name_in_zip, raw_file_info));
+  }
+
+  // Normalize path.
+  Normalize(path_in_utf16);
+
+  entry_.original_size = info.uncompressed_size;
+
+  // The file content of this entry is encrypted if flag bit 0 is set.
+  entry_.is_encrypted = info.flag & 1;
+  if (entry_.is_encrypted) {
+    // Is the entry AES encrypted.
+    entry_.uses_aes_encryption = info.compression_method == 99;
+  } else {
+    entry_.uses_aes_encryption = false;
+  }
+
+  // Construct the last modified time. The timezone info is not present in ZIP
+  // archives, so we construct the time as UTC.
+  base::Time::Exploded exploded_time = {};
+  exploded_time.year = info.tmu_date.tm_year;
+  exploded_time.month = info.tmu_date.tm_mon + 1;  // 0-based vs 1-based
+  exploded_time.day_of_month = info.tmu_date.tm_mday;
+  exploded_time.hour = info.tmu_date.tm_hour;
+  exploded_time.minute = info.tmu_date.tm_min;
+  exploded_time.second = info.tmu_date.tm_sec;
+  exploded_time.millisecond = 0;
+
+  if (!base::Time::FromUTCExploded(exploded_time, &entry_.last_modified))
+    entry_.last_modified = base::Time::UnixEpoch();
+
+#if defined(OS_POSIX)
+  entry_.posix_mode = (info.external_fa >> 16L) & (S_IRWXU | S_IRWXG | S_IRWXO);
+#else
+  entry_.posix_mode = 0;
+#endif
+
   return true;
 }
 
+void ZipReader::Normalize(base::StringPiece16 in) {
+  entry_.is_unsafe = true;
+
+  // Directory entries in ZIP have a path ending with "/".
+  entry_.is_directory = base::EndsWith(in, u"/");
+
+  std::u16string normalized_path;
+  if (base::StartsWith(in, u"/")) {
+    normalized_path = u"ROOT";
+    entry_.is_unsafe = false;
+  }
+
+  for (;;) {
+    // Consume initial path separators.
+    const base::StringPiece16::size_type i = in.find_first_not_of(u'/');
+    if (i == base::StringPiece16::npos)
+      break;
+
+    in.remove_prefix(i);
+    DCHECK(!in.empty());
+
+    // Isolate next path component.
+    const base::StringPiece16 part = in.substr(0, in.find_first_of(u'/'));
+    DCHECK(!part.empty());
+
+    in.remove_prefix(part.size());
+
+    if (!normalized_path.empty())
+      normalized_path += u'/';
+
+    if (part == u".") {
+      normalized_path += u"DOT";
+      entry_.is_unsafe = true;
+      continue;
+    }
+
+    if (part == u"..") {
+      normalized_path += u"UP";
+      entry_.is_unsafe = true;
+      continue;
+    }
+
+    // Windows has more restrictions than other systems when it comes to valid
+    // file paths. Replace Windows-invalid characters on all systems for
+    // consistency. In particular, this prevents a path component containing
+    // colon and backslash from being misinterpreted as an absolute path on
+    // Windows.
+    for (const char16_t c : part) {
+      normalized_path += IsValidFileNameCharacterOnWindows(c) ? c : 0xFFFD;
+    }
+
+    entry_.is_unsafe = false;
+  }
+
+  // If the entry is a directory, add the final path separator to the entry
+  // path.
+  if (entry_.is_directory && !normalized_path.empty()) {
+    normalized_path += u'/';
+    entry_.is_unsafe = false;
+  }
+
+  entry_.path = base::FilePath::FromUTF16Unsafe(normalized_path);
+
+  // By construction, we should always get a relative path.
+  DCHECK(!entry_.path.IsAbsolute()) << entry_.path;
+}
+
+void ZipReader::ReportProgress(ListenerCallback listener_callback,
+                               uint64_t bytes) const {
+  delta_bytes_read_ += bytes;
+
+  const base::TimeTicks now = base::TimeTicks::Now();
+  if (next_progress_report_time_ > now)
+    return;
+
+  next_progress_report_time_ = now + progress_period_;
+  listener_callback.Run(delta_bytes_read_);
+  delta_bytes_read_ = 0;
+}
+
 bool ZipReader::ExtractCurrentEntry(WriterDelegate* delegate,
+                                    ListenerCallback listener_callback,
                                     uint64_t num_bytes_to_extract) const {
   DCHECK(zip_file_);
-
-  const int open_result = unzOpenCurrentFile(zip_file_);
-  if (open_result != UNZ_OK)
+  DCHECK_LT(0, next_index_);
+  DCHECK(ok_);
+  DCHECK(!reached_end_);
+
+  // Use password only for encrypted files. For non-encrypted files, no password
+  // is needed, and must be nullptr.
+  const char* const password =
+      entry_.is_encrypted ? password_.c_str() : nullptr;
+  if (const UnzipError err{unzOpenCurrentFilePassword(zip_file_, password)};
+      err != UNZ_OK) {
+    LOG(ERROR) << "Cannot open file " << Redact(entry_.path)
+               << " from ZIP: " << err;
     return false;
+  }
 
+  DCHECK(delegate);
   if (!delegate->PrepareOutput())
     return false;
-  std::unique_ptr<char[]> buf(new char[internal::kZipBufSize]);
 
   uint64_t remaining_capacity = num_bytes_to_extract;
   bool entire_file_extracted = false;
 
   while (remaining_capacity > 0) {
+    char buf[internal::kZipBufSize];
     const int num_bytes_read =
-        unzReadCurrentFile(zip_file_, buf.get(), internal::kZipBufSize);
+        unzReadCurrentFile(zip_file_, buf, internal::kZipBufSize);
 
     if (num_bytes_read == 0) {
       entire_file_extracted = true;
       break;
-    } else if (num_bytes_read < 0) {
-      // If num_bytes_read < 0, then it's a specific UNZ_* error code.
+    }
+
+    if (num_bytes_read < 0) {
+      LOG(ERROR) << "Cannot read file " << Redact(entry_.path)
+                 << " from ZIP: " << UnzipError(num_bytes_read);
       break;
-    } else if (num_bytes_read > 0) {
-      uint64_t num_bytes_to_write = std::min<uint64_t>(
-          remaining_capacity, base::checked_cast<uint64_t>(num_bytes_read));
-      if (!delegate->WriteBytes(buf.get(), num_bytes_to_write))
-        break;
-      if (remaining_capacity == base::checked_cast<uint64_t>(num_bytes_read)) {
-        // Ensures function returns true if the entire file has been read.
-        entire_file_extracted =
-            (unzReadCurrentFile(zip_file_, buf.get(), 1) == 0);
-      }
-      CHECK_GE(remaining_capacity, num_bytes_to_write);
-      remaining_capacity -= num_bytes_to_write;
     }
+
+    if (listener_callback) {
+      ReportProgress(listener_callback, num_bytes_read);
+    }
+
+    DCHECK_LT(0, num_bytes_read);
+    CHECK_LE(num_bytes_read, internal::kZipBufSize);
+
+    uint64_t num_bytes_to_write = std::min<uint64_t>(
+        remaining_capacity, base::checked_cast<uint64_t>(num_bytes_read));
+    if (!delegate->WriteBytes(buf, num_bytes_to_write))
+      break;
+
+    if (remaining_capacity == base::checked_cast<uint64_t>(num_bytes_read)) {
+      // Ensures function returns true if the entire file has been read.
+      const int n = unzReadCurrentFile(zip_file_, buf, 1);
+      entire_file_extracted = (n == 0);
+      LOG_IF(ERROR, n < 0) << "Cannot read file " << Redact(entry_.path)
+                           << " from ZIP: " << UnzipError(n);
+    }
+
+    CHECK_GE(remaining_capacity, num_bytes_to_write);
+    remaining_capacity -= num_bytes_to_write;
   }
 
-  unzCloseCurrentFile(zip_file_);
+  if (const UnzipError err{unzCloseCurrentFile(zip_file_)}; err != UNZ_OK) {
+    LOG(ERROR) << "Cannot extract file " << Redact(entry_.path)
+               << " from ZIP: " << err;
+    entire_file_extracted = false;
+  }
+
+  if (entire_file_extracted) {
+    delegate->SetPosixFilePermissions(entry_.posix_mode);
+    if (entry_.last_modified != base::Time::UnixEpoch()) {
+      delegate->SetTimeModified(entry_.last_modified);
+    }
+  } else {
+    delegate->OnError();
+  }
 
-  if (entire_file_extracted &&
-      current_entry_info()->last_modified() != base::Time::UnixEpoch()) {
-    delegate->SetTimeModified(current_entry_info()->last_modified());
+  if (listener_callback) {
+    listener_callback.Run(delta_bytes_read_);
+    delta_bytes_read_ = 0;
   }
 
   return entire_file_extracted;
 }
 
+bool ZipReader::ExtractCurrentEntry(WriterDelegate* delegate,
+                                    uint64_t num_bytes_to_extract) const {
+  return ExtractCurrentEntry(delegate, ListenerCallback(),
+                             num_bytes_to_extract);
+}
+
+bool ZipReader::ExtractCurrentEntryWithListener(
+    WriterDelegate* delegate,
+    ListenerCallback listener_callback) const {
+  return ExtractCurrentEntry(delegate, listener_callback);
+}
+
 void ZipReader::ExtractCurrentEntryToFilePathAsync(
     const base::FilePath& output_file_path,
     SuccessCallback success_callback,
     FailureCallback failure_callback,
-    const ProgressCallback& progress_callback) {
+    ProgressCallback progress_callback) {
   DCHECK(zip_file_);
-  DCHECK(current_entry_info_.get());
+  DCHECK_LT(0, next_index_);
+  DCHECK(ok_);
+  DCHECK(!reached_end_);
 
   // If this is a directory, just create it and return.
-  if (current_entry_info()->is_directory()) {
+  if (entry_.is_directory) {
     if (base::CreateDirectory(output_file_path)) {
-      base::ThreadTaskRunnerHandle::Get()->PostTask(
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, std::move(success_callback));
     } else {
-      DVLOG(1) << "Unzip failed: unable to create directory.";
-      base::ThreadTaskRunnerHandle::Get()->PostTask(
+      LOG(ERROR) << "Cannot create directory " << Redact(output_file_path);
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, std::move(failure_callback));
     }
     return;
   }
 
-  if (unzOpenCurrentFile(zip_file_) != UNZ_OK) {
-    DVLOG(1) << "Unzip failed: unable to open current zip entry.";
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  std::move(failure_callback));
+  // Use password only for encrypted files. For non-encrypted files, no password
+  // is needed, and must be nullptr.
+  const char* const password =
+      entry_.is_encrypted ? password_.c_str() : nullptr;
+  if (const UnzipError err{unzOpenCurrentFilePassword(zip_file_, password)};
+      err != UNZ_OK) {
+    LOG(ERROR) << "Cannot open file " << Redact(entry_.path)
+               << " from ZIP: " << err;
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, std::move(failure_callback));
     return;
   }
 
   base::FilePath output_dir_path = output_file_path.DirName();
   if (!base::CreateDirectory(output_dir_path)) {
-    DVLOG(1) << "Unzip failed: unable to create containing directory.";
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  std::move(failure_callback));
+    LOG(ERROR) << "Cannot create directory " << Redact(output_dir_path);
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, std::move(failure_callback));
     return;
   }
 
@@ -325,139 +496,155 @@ void ZipReader::ExtractCurrentEntryToFilePathAsync(
   base::File output_file(output_file_path, flags);
 
   if (!output_file.IsValid()) {
-    DVLOG(1) << "Unzip failed: unable to create platform file at "
-             << output_file_path.value();
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  std::move(failure_callback));
+    LOG(ERROR) << "Cannot create file " << Redact(output_file_path);
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, std::move(failure_callback));
     return;
   }
 
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::BindOnce(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(),
-                     Passed(std::move(output_file)),
-                     std::move(success_callback), std::move(failure_callback),
-                     progress_callback, 0 /* initial offset */));
+                     std::move(output_file), std::move(success_callback),
+                     std::move(failure_callback), std::move(progress_callback),
+                     0 /* initial offset */));
 }
 
 bool ZipReader::ExtractCurrentEntryToString(uint64_t max_read_bytes,
                                             std::string* output) const {
   DCHECK(output);
   DCHECK(zip_file_);
+  DCHECK_LT(0, next_index_);
+  DCHECK(ok_);
+  DCHECK(!reached_end_);
+
+  output->clear();
 
-  if (max_read_bytes == 0) {
-    output->clear();
+  if (max_read_bytes == 0)
     return true;
-  }
 
-  if (current_entry_info()->is_directory()) {
-    output->clear();
+  if (entry_.is_directory)
     return true;
-  }
 
-  // The original_size() is the best hint for the real size, so it saves
-  // doing reallocations for the common case when the uncompressed size is
-  // correct. However, we need to assume that the uncompressed size could be
-  // incorrect therefore this function needs to read as much data as possible.
-  std::string contents;
-  contents.reserve(
-      static_cast<size_t>(std::min(base::checked_cast<int64_t>(max_read_bytes),
-                                   current_entry_info()->original_size())));
-
-  StringWriterDelegate writer(max_read_bytes, &contents);
-  if (!ExtractCurrentEntry(&writer, max_read_bytes)) {
-    if (contents.length() < max_read_bytes) {
-      // There was an error in extracting entry. If ExtractCurrentEntry()
-      // returns false, the entire file was not read - in which case
-      // contents.length() should equal |max_read_bytes| unless an error
-      // occurred which caused extraction to be aborted.
-      output->clear();
-    } else {
-      // |num_bytes| is less than the length of current entry.
-      output->swap(contents);
-    }
-    return false;
-  }
-  output->swap(contents);
-  return true;
+  // The original_size is the best hint for the real size, so it saves doing
+  // reallocations for the common case when the uncompressed size is correct.
+  // However, we need to assume that the uncompressed size could be incorrect
+  // therefore this function needs to read as much data as possible.
+  output->reserve(base::checked_cast<size_t>(std::min<uint64_t>(
+      max_read_bytes, base::checked_cast<uint64_t>(entry_.original_size))));
+
+  StringWriterDelegate writer(output);
+  return ExtractCurrentEntry(&writer, max_read_bytes);
 }
 
 bool ZipReader::OpenInternal() {
   DCHECK(zip_file_);
 
   unz_global_info zip_info = {};  // Zero-clear.
-  if (unzGetGlobalInfo(zip_file_, &zip_info) != UNZ_OK) {
+  if (const UnzipError err{unzGetGlobalInfo(zip_file_, &zip_info)};
+      err != UNZ_OK) {
+    LOG(ERROR) << "Cannot get ZIP info: " << err;
     return false;
   }
-  num_entries_ = zip_info.number_entry;
-  if (num_entries_ < 0)
-    return false;
 
-  // We are already at the end if the zip file is empty.
-  reached_end_ = (num_entries_ == 0);
+  num_entries_ = zip_info.number_entry;
+  reached_end_ = (num_entries_ <= 0);
+  ok_ = true;
   return true;
 }
 
 void ZipReader::Reset() {
-  zip_file_ = NULL;
+  zip_file_ = nullptr;
   num_entries_ = 0;
-  reached_end_ = false;
-  current_entry_info_.reset();
+  next_index_ = 0;
+  reached_end_ = true;
+  ok_ = false;
+  delta_bytes_read_ = 0;
+  entry_ = {};
 }
 
 void ZipReader::ExtractChunk(base::File output_file,
                              SuccessCallback success_callback,
                              FailureCallback failure_callback,
-                             const ProgressCallback& progress_callback,
-                             const int64_t offset) {
+                             ProgressCallback progress_callback,
+                             int64_t offset) {
   char buffer[internal::kZipBufSize];
 
-  const int num_bytes_read = unzReadCurrentFile(zip_file_,
-                                                buffer,
-                                                internal::kZipBufSize);
+  const int num_bytes_read =
+      unzReadCurrentFile(zip_file_, buffer, internal::kZipBufSize);
 
   if (num_bytes_read == 0) {
-    unzCloseCurrentFile(zip_file_);
-    std::move(success_callback).Run();
-  } else if (num_bytes_read < 0) {
-    DVLOG(1) << "Unzip failed: error while reading zipfile "
-             << "(" << num_bytes_read << ")";
-    std::move(failure_callback).Run();
-  } else {
-    if (num_bytes_read != output_file.Write(offset, buffer, num_bytes_read)) {
-      DVLOG(1) << "Unzip failed: unable to write all bytes to target.";
+    if (const UnzipError err{unzCloseCurrentFile(zip_file_)}; err != UNZ_OK) {
+      LOG(ERROR) << "Cannot extract file " << Redact(entry_.path)
+                 << " from ZIP: " << err;
       std::move(failure_callback).Run();
       return;
     }
 
-    int64_t current_progress = offset + num_bytes_read;
+    std::move(success_callback).Run();
+    return;
+  }
 
-    progress_callback.Run(current_progress);
+  if (num_bytes_read < 0) {
+    LOG(ERROR) << "Cannot read file " << Redact(entry_.path)
+               << " from ZIP: " << UnzipError(num_bytes_read);
+    std::move(failure_callback).Run();
+    return;
+  }
 
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(),
-                       Passed(std::move(output_file)),
-                       std::move(success_callback), std::move(failure_callback),
-                       progress_callback, current_progress));
+  if (num_bytes_read != output_file.Write(offset, buffer, num_bytes_read)) {
+    LOG(ERROR) << "Cannot write " << num_bytes_read
+               << " bytes to file at offset " << offset;
+    std::move(failure_callback).Run();
+    return;
   }
+
+  offset += num_bytes_read;
+  progress_callback.Run(offset);
+
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(),
+                     std::move(output_file), std::move(success_callback),
+                     std::move(failure_callback), std::move(progress_callback),
+                     offset));
 }
 
 // FileWriterDelegate ----------------------------------------------------------
 
-FileWriterDelegate::FileWriterDelegate(base::File* file) : file_(file) {}
-
-FileWriterDelegate::FileWriterDelegate(std::unique_ptr<base::File> file)
-    : file_(file.get()), owned_file_(std::move(file)) {}
+FileWriterDelegate::FileWriterDelegate(base::File* file) : file_(file) {
+  DCHECK(file_);
+}
 
-FileWriterDelegate::~FileWriterDelegate() {
-  if (!file_->SetLength(file_length_)) {
-    DVPLOG(1) << "Failed updating length of written file";
-  }
+FileWriterDelegate::FileWriterDelegate(base::File owned_file)
+    : owned_file_(std::move(owned_file)) {
+  DCHECK_EQ(file_, &owned_file_);
 }
 
+FileWriterDelegate::~FileWriterDelegate() {}
+
 bool FileWriterDelegate::PrepareOutput() {
-  return file_->Seek(base::File::FROM_BEGIN, 0) >= 0;
+  DCHECK(file_);
+
+  if (!file_->IsValid()) {
+    LOG(ERROR) << "File is not valid";
+    return false;
+  }
+
+  const int64_t length = file_->GetLength();
+  if (length < 0) {
+    PLOG(ERROR) << "Cannot get length of file handle "
+                << file_->GetPlatformFile();
+    return false;
+  }
+
+  // Just log a warning if the file is not empty.
+  // See crbug.com/1309879 and crbug.com/774762.
+  LOG_IF(WARNING, length > 0)
+      << "File handle " << file_->GetPlatformFile()
+      << " is not empty: Its length is " << length << " bytes";
+
+  return true;
 }
 
 bool FileWriterDelegate::WriteBytes(const char* data, int num_bytes) {
@@ -471,32 +658,65 @@ void FileWriterDelegate::SetTimeModified(const base::Time& time) {
   file_->SetTimes(base::Time::Now(), time);
 }
 
+void FileWriterDelegate::SetPosixFilePermissions(int mode) {
+#if defined(OS_POSIX)
+  zip::SetPosixFilePermissions(file_->GetPlatformFile(), mode);
+#endif
+}
+
+void FileWriterDelegate::OnError() {
+  file_length_ = 0;
+  file_->SetLength(0);
+}
+
 // FilePathWriterDelegate ------------------------------------------------------
 
-FilePathWriterDelegate::FilePathWriterDelegate(
-    const base::FilePath& output_file_path)
-    : output_file_path_(output_file_path) {}
+FilePathWriterDelegate::FilePathWriterDelegate(base::FilePath output_file_path)
+    : FileWriterDelegate(base::File()),
+      output_file_path_(std::move(output_file_path)) {}
 
 FilePathWriterDelegate::~FilePathWriterDelegate() {}
 
 bool FilePathWriterDelegate::PrepareOutput() {
   // We can't rely on parent directory entries being specified in the
   // zip, so we make sure they are created.
-  if (!base::CreateDirectory(output_file_path_.DirName()))
+  if (const base::FilePath dir = output_file_path_.DirName();
+      !base::CreateDirectory(dir)) {
+    PLOG(ERROR) << "Cannot create directory " << Redact(dir);
     return false;
+  }
 
-  file_.Initialize(output_file_path_,
-                   base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-  return file_.IsValid();
-}
+  owned_file_.Initialize(output_file_path_,
+                         base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+  if (!owned_file_.IsValid()) {
+    PLOG(ERROR) << "Cannot create file " << Redact(output_file_path_) << ": "
+                << base::File::ErrorToString(owned_file_.error_details());
+    return false;
+  }
+
+  const int64_t length = owned_file_.GetLength();
+  if (length < 0) {
+    PLOG(ERROR) << "Cannot get length of file " << Redact(output_file_path_);
+    return false;
+  }
 
-bool FilePathWriterDelegate::WriteBytes(const char* data, int num_bytes) {
-  return num_bytes == file_.WriteAtCurrentPos(data, num_bytes);
+  if (length > 0) {
+    LOG(ERROR) << "File " << Redact(output_file_path_)
+               << " is not empty: Its length is " << length << " bytes";
+    return false;
+  }
+
+  return true;
 }
 
-void FilePathWriterDelegate::SetTimeModified(const base::Time& time) {
-  file_.Close();
-  base::TouchFile(output_file_path_, base::Time::Now(), time);
+void FilePathWriterDelegate::OnError() {
+  FileWriterDelegate::OnError();
+  owned_file_.Close();
+
+  if (!base::DeleteFile(output_file_path_)) {
+    LOG(ERROR) << "Cannot delete partially extracted file "
+               << Redact(output_file_path_);
+  }
 }
 
 }  // namespace zip
diff --git a/deps/zlib/google/zip_reader.h b/deps/zlib/google/zip_reader.h
index d442d428591e50..48244c8238368e 100644
--- a/deps/zlib/google/zip_reader.h
+++ b/deps/zlib/google/zip_reader.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 #ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_READER_H_
@@ -7,15 +7,15 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <limits>
 #include <memory>
 #include <string>
 
 #include "base/callback.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/time/time.h"
 
 #if defined(USE_SYSTEM_MINIZIP)
@@ -34,33 +34,47 @@ class WriterDelegate {
 
   // Invoked once before any data is streamed out to pave the way (e.g., to open
   // the output file). Return false on failure to cancel extraction.
-  virtual bool PrepareOutput() = 0;
+  virtual bool PrepareOutput() { return true; }
 
   // Invoked to write the next chunk of data. Return false on failure to cancel
   // extraction.
-  virtual bool WriteBytes(const char* data, int num_bytes) = 0;
+  virtual bool WriteBytes(const char* data, int num_bytes) { return true; }
 
   // Sets the last-modified time of the data.
-  virtual void SetTimeModified(const base::Time& time) = 0;
+  virtual void SetTimeModified(const base::Time& time) {}
+
+  // Called with the POSIX file permissions of the data; POSIX implementations
+  // may apply some of the permissions (for example, the executable bit) to the
+  // output file.
+  virtual void SetPosixFilePermissions(int mode) {}
+
+  // Called if an error occurred while extracting the file. The WriterDelegate
+  // can then remove and clean up the partially extracted data.
+  virtual void OnError() {}
 };
 
-// This class is used for reading zip files. A typical use case of this
-// class is to scan entries in a zip file and extract them. The code will
-// look like:
+// This class is used for reading ZIP archives. A typical use case of this class
+// is to scan entries in a ZIP archive and extract them. The code will look
+// like:
 //
 //   ZipReader reader;
-//   reader.Open(zip_file_path);
-//   while (reader.HasMore()) {
-//     reader.OpenCurrentEntryInZip();
-//     const base::FilePath& entry_path =
-//        reader.current_entry_info()->file_path();
-//     auto writer = CreateFilePathWriterDelegate(extract_dir, entry_path);
-//     reader.ExtractCurrentEntry(writer, std::numeric_limits<uint64_t>::max());
-//     reader.AdvanceToNextEntry();
+//   if (!reader.Open(zip_path)) {
+//     // Cannot open
+//     return;
+//   }
+//
+//   while (const ZipReader::entry* entry = reader.Next()) {
+//     auto writer = CreateFilePathWriterDelegate(extract_dir, entry->path);
+//     if (!reader.ExtractCurrentEntry(writer)) {
+//           // Cannot extract
+//           return;
+//     }
 //   }
 //
-// For simplicity, error checking is omitted in the example code above. The
-// production code should check return values from all of these functions.
+//   if (!reader.ok()) {
+//     // Error while enumerating entries
+//     return;
+//   }
 //
 class ZipReader {
  public:
@@ -71,63 +85,77 @@ class ZipReader {
   // A callback that is called periodically during the operation with the number
   // of bytes that have been processed so far.
   using ProgressCallback = base::RepeatingCallback<void(int64_t)>;
-
-  // This class represents information of an entry (file or directory) in
-  // a zip file.
-  class EntryInfo {
-   public:
-    EntryInfo(const std::string& filename_in_zip,
-              const unz_file_info& raw_file_info);
-
-    // Returns the file path. The path is usually relative like
-    // "foo/bar.txt", but if it's absolute, is_unsafe() returns true.
-    const base::FilePath& file_path() const { return file_path_; }
-
-    // Returns the size of the original file (i.e. after uncompressed).
-    // Returns 0 if the entry is a directory.
-    // Note: this value should not be trusted, because it is stored as metadata
-    // in the zip archive and can be different from the real uncompressed size.
-    int64_t original_size() const { return original_size_; }
-
-    // Returns the last modified time. If the time stored in the zip file was
-    // not valid, the unix epoch will be returned.
+  // A callback that is called periodically during the operation with the number
+  // of bytes that have been processed since the previous call (i.e. delta).
+  using ListenerCallback = base::RepeatingCallback<void(uint64_t)>;
+
+  // Information of an entry (file or directory) in a ZIP archive.
+  struct Entry {
+    // Path of this entry, in its original encoding as it is stored in the ZIP
+    // archive. The encoding is not specified here. It might or might not be
+    // UTF-8, and the caller needs to use other means to determine the encoding
+    // if it wants to interpret this path correctly.
+    std::string path_in_original_encoding;
+
+    // Path of the entry, converted to Unicode. This path is relative (eg
+    // "foo/bar.txt"). Absolute paths (eg "/foo/bar.txt") or paths containing
+    // ".." or "." components (eg "../foo/bar.txt") are converted to safe
+    // relative paths. Eg:
+    // (In ZIP) -> (Entry.path)
+    // /foo/bar -> ROOT/foo/bar
+    // ../a     -> UP/a
+    // ./a      -> DOT/a
+    base::FilePath path;
+
+    // Size of the original uncompressed file, or 0 if the entry is a directory.
+    // This value should not be trusted, because it is stored as metadata in the
+    // ZIP archive and can be different from the real uncompressed size.
+    int64_t original_size;
+
+    // Last modified time. If the timestamp stored in the ZIP archive is not
+    // valid, the Unix epoch will be returned.
+    //
+    // The timestamp stored in the ZIP archive uses the MS-DOS date and time
+    // format.
     //
-    // The time stored in the zip archive uses the MS-DOS date and time format.
     // http://msdn.microsoft.com/en-us/library/ms724247(v=vs.85).aspx
+    //
     // As such the following limitations apply:
-    // * only years from 1980 to 2107 can be represented.
-    // * the time stamp has a 2 second resolution.
-    // * there's no timezone information, so the time is interpreted as local.
-    base::Time last_modified() const { return last_modified_; }
-
-    // Returns true if the entry is a directory.
-    bool is_directory() const { return is_directory_; }
-
-    // Returns true if the entry is unsafe, like having ".." or invalid
-    // UTF-8 characters in its file name, or the file path is absolute.
-    bool is_unsafe() const { return is_unsafe_; }
-
-    // Returns true if the entry is encrypted.
-    bool is_encrypted() const { return is_encrypted_; }
-
-   private:
-    const base::FilePath file_path_;
-    int64_t original_size_;
-    base::Time last_modified_;
-    bool is_directory_;
-    bool is_unsafe_;
-    bool is_encrypted_;
-    DISALLOW_COPY_AND_ASSIGN(EntryInfo);
+    // * Only years from 1980 to 2107 can be represented.
+    // * The timestamp has a 2-second resolution.
+    // * There is no timezone information, so the time is interpreted as UTC.
+    base::Time last_modified;
+
+    // True if the entry is a directory.
+    // False if the entry is a file.
+    bool is_directory = false;
+
+    // True if the entry path cannot be converted to a safe relative path. This
+    // happens if a file entry (not a directory) has a filename "." or "..".
+    bool is_unsafe = false;
+
+    // True if the file content is encrypted.
+    bool is_encrypted = false;
+
+    // True if the encryption scheme is AES.
+    bool uses_aes_encryption = false;
+
+    // Entry POSIX permissions (POSIX systems only).
+    int posix_mode;
   };
 
   ZipReader();
+
+  ZipReader(const ZipReader&) = delete;
+  ZipReader& operator=(const ZipReader&) = delete;
+
   ~ZipReader();
 
-  // Opens the zip file specified by |zip_file_path|. Returns true on
+  // Opens the ZIP archive specified by |zip_path|. Returns true on
   // success.
-  bool Open(const base::FilePath& zip_file_path);
+  bool Open(const base::FilePath& zip_path);
 
-  // Opens the zip file referred to by the platform file |zip_fd|, without
+  // Opens the ZIP archive referred to by the platform file |zip_fd|, without
   // taking ownership of |zip_fd|. Returns true on success.
   bool OpenFromPlatformFile(base::PlatformFile zip_fd);
 
@@ -136,72 +164,105 @@ class ZipReader {
   // string until it finishes extracting files.
   bool OpenFromString(const std::string& data);
 
-  // Closes the currently opened zip file. This function is called in the
+  // Closes the currently opened ZIP archive. This function is called in the
   // destructor of the class, so you usually don't need to call this.
   void Close();
 
-  // Returns true if there is at least one entry to read. This function is
-  // used to scan entries with AdvanceToNextEntry(), like:
-  //
-  // while (reader.HasMore()) {
-  //   // Do something with the current file here.
-  //   reader.AdvanceToNextEntry();
-  // }
-  bool HasMore();
+  // Sets the encoding of entry paths in the ZIP archive.
+  // By default, paths are assumed to be in UTF-8.
+  void SetEncoding(std::string encoding) { encoding_ = std::move(encoding); }
 
-  // Advances the next entry. Returns true on success.
-  bool AdvanceToNextEntry();
+  // Sets the decryption password that will be used to decrypt encrypted file in
+  // the ZIP archive.
+  void SetPassword(std::string password) { password_ = std::move(password); }
 
-  // Opens the current entry in the zip file. On success, returns true and
-  // updates the the current entry state (i.e. current_entry_info() is
-  // updated). This function should be called before operations over the
-  // current entry like ExtractCurrentEntryToFile().
+  // Gets the next entry. Returns null if there is no more entry, or if an error
+  // occurred while scanning entries. The returned Entry is owned by this
+  // ZipReader, and is valid until Next() is called again or until this
+  // ZipReader is closed.
+  //
+  // This function should be called before operations over the current entry
+  // like ExtractCurrentEntryToFile().
+  //
+  // while (const ZipReader::Entry* entry = reader.Next()) {
+  //   // Do something with the current entry here.
+  //   ...
+  // }
   //
-  // Note that there is no CloseCurrentEntryInZip(). The the current entry
-  // state is reset automatically as needed.
-  bool OpenCurrentEntryInZip();
+  // // Finished scanning entries.
+  // // Check if the scanning stopped because of an error.
+  // if (!reader.ok()) {
+  //   // There was an error.
+  //   ...
+  // }
+  const Entry* Next();
+
+  // Returns true if the enumeration of entries was successful, or false if it
+  // stopped because of an error.
+  bool ok() const { return ok_; }
 
   // Extracts |num_bytes_to_extract| bytes of the current entry to |delegate|,
-  // starting from the beginning of the entry. Return value specifies whether
-  // the entire file was extracted.
+  // starting from the beginning of the entry.
+  //
+  // Returns true if the entire file was extracted without error.
+  //
+  // Precondition: Next() returned a non-null Entry.
   bool ExtractCurrentEntry(WriterDelegate* delegate,
-                           uint64_t num_bytes_to_extract) const;
+                           uint64_t num_bytes_to_extract =
+                               std::numeric_limits<uint64_t>::max()) const;
 
-  // Asynchronously extracts the current entry to the given output file path.
-  // If the current entry is a directory it just creates the directory
-  // synchronously instead.  OpenCurrentEntryInZip() must be called beforehand.
-  // success_callback will be called on success and failure_callback will be
-  // called on failure.  progress_callback will be called at least once.
+  // Extracts the current entry to |delegate|, starting from the beginning
+  // of the entry, calling |listener_callback| regularly with the number of
+  // bytes extracted.
+  //
+  // Returns true if the entire file was extracted without error.
+  //
+  // Precondition: Next() returned a non-null Entry.
+  bool ExtractCurrentEntryWithListener(
+      WriterDelegate* delegate,
+      ListenerCallback listener_callback) const;
+
+  // Asynchronously extracts the current entry to the given output file path. If
+  // the current entry is a directory it just creates the directory
+  // synchronously instead.
+  //
+  // |success_callback| will be called on success and |failure_callback| will be
+  // called on failure. |progress_callback| will be called at least once.
   // Callbacks will be posted to the current MessageLoop in-order.
+  //
+  // Precondition: Next() returned a non-null Entry.
   void ExtractCurrentEntryToFilePathAsync(
       const base::FilePath& output_file_path,
       SuccessCallback success_callback,
       FailureCallback failure_callback,
-      const ProgressCallback& progress_callback);
+      ProgressCallback progress_callback);
 
   // Extracts the current entry into memory. If the current entry is a
-  // directory, the |output| parameter is set to the empty string. If the
-  // current entry is a file, the |output| parameter is filled with its
-  // contents. OpenCurrentEntryInZip() must be called beforehand. Note: the
-  // |output| parameter can be filled with a big amount of data, avoid passing
-  // it around by value, but by reference or pointer. Note: the value returned
-  // by EntryInfo::original_size() cannot be trusted, so the real size of the
-  // uncompressed contents can be different. |max_read_bytes| limits the ammount
-  // of memory used to carry the entry. Returns true if the entire content is
-  // read. If the entry is bigger than |max_read_bytes|, returns false and
-  // |output| is filled with |max_read_bytes| of data. If an error occurs,
-  // returns false, and |output| is set to the empty string.
+  // directory, |*output| is set to the empty string. If the current entry is a
+  // file, |*output| is filled with its contents.
+  //
+  // The value in |Entry::original_size| cannot be trusted, so the real size of
+  // the uncompressed contents can be different. |max_read_bytes| limits the
+  // amount of memory used to carry the entry.
+  //
+  // Returns true if the entire content is read without error. If the content is
+  // bigger than |max_read_bytes|, this function returns false and |*output| is
+  // filled with |max_read_bytes| of data. If an error occurs, this function
+  // returns false and |*output| contains the content extracted so far, which
+  // might be garbage data.
+  //
+  // Precondition: Next() returned a non-null Entry.
   bool ExtractCurrentEntryToString(uint64_t max_read_bytes,
                                    std::string* output) const;
 
-  // Returns the current entry info. Returns NULL if the current entry is
-  // not yet opened. OpenCurrentEntryInZip() must be called beforehand.
-  EntryInfo* current_entry_info() const {
-    return current_entry_info_.get();
+  bool ExtractCurrentEntryToString(std::string* output) const {
+    return ExtractCurrentEntryToString(
+        base::checked_cast<uint64_t>(output->max_size()), output);
   }
 
-  // Returns the number of entries in the zip file.
-  // Open() must be called beforehand.
+  // Returns the number of entries in the ZIP archive.
+  //
+  // Precondition: one of the Open() methods returned true.
   int num_entries() const { return num_entries_; }
 
  private:
@@ -211,25 +272,64 @@ class ZipReader {
   // Resets the internal state.
   void Reset();
 
+  // Opens the current entry in the ZIP archive. On success, returns true and
+  // updates the current entry state |entry_|.
+  //
+  // Note that there is no matching CloseEntry(). The current entry state is
+  // reset automatically as needed.
+  bool OpenEntry();
+
+  // Normalizes the given path passed as UTF-16 string piece. Sets entry_.path,
+  // entry_.is_directory and entry_.is_unsafe.
+  void Normalize(base::StringPiece16 in);
+
+  // Runs the ListenerCallback at a throttled rate.
+  void ReportProgress(ListenerCallback listener_callback, uint64_t bytes) const;
+
+  // Extracts |num_bytes_to_extract| bytes of the current entry to |delegate|,
+  // starting from the beginning of the entry calling |listener_callback| if
+  // its supplied.
+  //
+  // Returns true if the entire file was extracted without error.
+  //
+  // Precondition: Next() returned a non-null Entry.
+  bool ExtractCurrentEntry(WriterDelegate* delegate,
+                           ListenerCallback listener_callback,
+                           uint64_t num_bytes_to_extract =
+                               std::numeric_limits<uint64_t>::max()) const;
+
   // Extracts a chunk of the file to the target.  Will post a task for the next
   // chunk and success/failure/progress callbacks as necessary.
   void ExtractChunk(base::File target_file,
                     SuccessCallback success_callback,
                     FailureCallback failure_callback,
-                    const ProgressCallback& progress_callback,
+                    ProgressCallback progress_callback,
                     const int64_t offset);
 
+  std::string encoding_;
+  std::string password_;
   unzFile zip_file_;
   int num_entries_;
+  int next_index_;
   bool reached_end_;
-  std::unique_ptr<EntryInfo> current_entry_info_;
+  bool ok_;
+  Entry entry_;
 
-  base::WeakPtrFactory<ZipReader> weak_ptr_factory_{this};
+  // Next time to report progress.
+  mutable base::TimeTicks next_progress_report_time_ = base::TimeTicks::Now();
+
+  // Progress time delta.
+  // TODO(crbug.com/953256) Add this as parameter to the unzip options.
+  base::TimeDelta progress_period_ = base::Milliseconds(1000);
 
-  DISALLOW_COPY_AND_ASSIGN(ZipReader);
+  // Number of bytes read since last progress report callback executed.
+  mutable uint64_t delta_bytes_read_ = 0;
+
+  base::WeakPtrFactory<ZipReader> weak_ptr_factory_{this};
 };
 
-// A writer delegate that writes to a given File.
+// A writer delegate that writes to a given File. It is recommended that this
+// file be initially empty.
 class FileWriterDelegate : public WriterDelegate {
  public:
   // Constructs a FileWriterDelegate that manipulates |file|. The delegate will
@@ -238,14 +338,14 @@ class FileWriterDelegate : public WriterDelegate {
   explicit FileWriterDelegate(base::File* file);
 
   // Constructs a FileWriterDelegate that takes ownership of |file|.
-  explicit FileWriterDelegate(std::unique_ptr<base::File> file);
+  explicit FileWriterDelegate(base::File owned_file);
 
-  // Truncates the file to the number of bytes written.
-  ~FileWriterDelegate() override;
+  FileWriterDelegate(const FileWriterDelegate&) = delete;
+  FileWriterDelegate& operator=(const FileWriterDelegate&) = delete;
 
-  // WriterDelegate methods:
+  ~FileWriterDelegate() override;
 
-  // Seeks to the beginning of the file, returning false if the seek fails.
+  // Returns true if the file handle passed to the constructor is valid.
   bool PrepareOutput() override;
 
   // Writes |num_bytes| bytes of |data| to the file, returning false on error or
@@ -255,45 +355,48 @@ class FileWriterDelegate : public WriterDelegate {
   // Sets the last-modified time of the data.
   void SetTimeModified(const base::Time& time) override;
 
-  // Return the actual size of the file.
-  int64_t file_length() { return file_length_; }
+  // On POSIX systems, sets the file to be executable if the source file was
+  // executable.
+  void SetPosixFilePermissions(int mode) override;
 
- private:
-  // The file the delegate modifies.
-  base::File* file_;
+  // Empties the file to avoid leaving garbage data in it.
+  void OnError() override;
+
+  // Gets the number of bytes written into the file.
+  int64_t file_length() { return file_length_; }
 
+ protected:
   // The delegate can optionally own the file it modifies, in which case
   // owned_file_ is set and file_ is an alias for owned_file_.
-  std::unique_ptr<base::File> owned_file_;
+  base::File owned_file_;
 
-  int64_t file_length_ = 0;
+  // The file the delegate modifies.
+  base::File* const file_ = &owned_file_;
 
-  DISALLOW_COPY_AND_ASSIGN(FileWriterDelegate);
+  int64_t file_length_ = 0;
 };
 
-// A writer delegate that writes a file at a given path.
-class FilePathWriterDelegate : public WriterDelegate {
+// A writer delegate that creates and writes a file at a given path. This does
+// not overwrite any existing file.
+class FilePathWriterDelegate : public FileWriterDelegate {
  public:
-  explicit FilePathWriterDelegate(const base::FilePath& output_file_path);
-  ~FilePathWriterDelegate() override;
+  explicit FilePathWriterDelegate(base::FilePath output_file_path);
 
-  // WriterDelegate methods:
+  FilePathWriterDelegate(const FilePathWriterDelegate&) = delete;
+  FilePathWriterDelegate& operator=(const FilePathWriterDelegate&) = delete;
 
-  // Creates the output file and any necessary intermediate directories.
-  bool PrepareOutput() override;
+  ~FilePathWriterDelegate() override;
 
-  // Writes |num_bytes| bytes of |data| to the file, returning false if not all
-  // bytes could be written.
-  bool WriteBytes(const char* data, int num_bytes) override;
+  // Creates the output file and any necessary intermediate directories. Does
+  // not overwrite any existing file, and returns false if the output file
+  // cannot be created because another file conflicts with it.
+  bool PrepareOutput() override;
 
-  // Sets the last-modified time of the data.
-  void SetTimeModified(const base::Time& time) override;
+  // Deletes the output file.
+  void OnError() override;
 
  private:
-  base::FilePath output_file_path_;
-  base::File file_;
-
-  DISALLOW_COPY_AND_ASSIGN(FilePathWriterDelegate);
+  const base::FilePath output_file_path_;
 };
 
 }  // namespace zip
diff --git a/deps/zlib/google/zip_reader_unittest.cc b/deps/zlib/google/zip_reader_unittest.cc
index 87190c7e0dee76..52dab200a3494c 100644
--- a/deps/zlib/google/zip_reader_unittest.cc
+++ b/deps/zlib/google/zip_reader_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -8,29 +8,36 @@
 #include <stdint.h>
 #include <string.h>
 
-#include <set>
+#include <iterator>
 #include <string>
+#include <vector>
 
 #include "base/bind.h"
+#include "base/check.h"
 #include "base/files/file.h"
+#include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/hash/md5.h"
-#include "base/logging.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
-#include "base/stl_util.h"
+#include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
+#include "build/build_config.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 #include "third_party/zlib/google/zip_internal.h"
 
-using ::testing::Return;
 using ::testing::_;
+using ::testing::ElementsAre;
+using ::testing::ElementsAreArray;
+using ::testing::Return;
+using ::testing::SizeIs;
 
 namespace {
 
@@ -38,10 +45,7 @@ const static std::string kQuuxExpectedMD5 = "d1ae4ac8a17a0e09317113ab284b57a6";
 
 class FileWrapper {
  public:
-  typedef enum {
-    READ_ONLY,
-    READ_WRITE
-  } AccessMode;
+  typedef enum { READ_ONLY, READ_WRITE } AccessMode;
 
   FileWrapper(const base::FilePath& path, AccessMode mode) {
     int flags = base::File::FLAG_READ;
@@ -72,18 +76,13 @@ class MockUnzipListener : public base::SupportsWeakPtr<MockUnzipListener> {
       : success_calls_(0),
         failure_calls_(0),
         progress_calls_(0),
-        current_progress_(0) {
-  }
+        current_progress_(0) {}
 
   // Success callback for async functions.
-  void OnUnzipSuccess() {
-    success_calls_++;
-  }
+  void OnUnzipSuccess() { success_calls_++; }
 
   // Failure callback for async functions.
-  void OnUnzipFailure() {
-    failure_calls_++;
-  }
+  void OnUnzipFailure() { failure_calls_++; }
 
   // Progress callback for async functions.
   void OnUnzipProgress(int64_t progress) {
@@ -110,184 +109,189 @@ class MockWriterDelegate : public zip::WriterDelegate {
   MOCK_METHOD0(PrepareOutput, bool());
   MOCK_METHOD2(WriteBytes, bool(const char*, int));
   MOCK_METHOD1(SetTimeModified, void(const base::Time&));
+  MOCK_METHOD1(SetPosixFilePermissions, void(int));
+  MOCK_METHOD0(OnError, void());
 };
 
 bool ExtractCurrentEntryToFilePath(zip::ZipReader* reader,
                                    base::FilePath path) {
   zip::FilePathWriterDelegate writer(path);
-  return reader->ExtractCurrentEntry(&writer,
-                                     std::numeric_limits<uint64_t>::max());
+  return reader->ExtractCurrentEntry(&writer);
 }
 
-bool LocateAndOpenEntry(zip::ZipReader* reader,
-                        const base::FilePath& path_in_zip) {
+const zip::ZipReader::Entry* LocateAndOpenEntry(
+    zip::ZipReader* const reader,
+    const base::FilePath& path_in_zip) {
+  DCHECK(reader);
+  EXPECT_TRUE(reader->ok());
+
   // The underlying library can do O(1) access, but ZipReader does not expose
   // that. O(N) access is acceptable for these tests.
-  while (reader->HasMore()) {
-    if (!reader->OpenCurrentEntryInZip())
-      return false;
-    if (reader->current_entry_info()->file_path() == path_in_zip)
-      return true;
-    reader->AdvanceToNextEntry();
+  while (const zip::ZipReader::Entry* const entry = reader->Next()) {
+    EXPECT_TRUE(reader->ok());
+    if (entry->path == path_in_zip)
+      return entry;
   }
-  return false;
+
+  EXPECT_TRUE(reader->ok());
+  return nullptr;
 }
 
-}   // namespace
+using Paths = std::vector<base::FilePath>;
+
+}  // namespace
 
 namespace zip {
 
 // Make the test a PlatformTest to setup autorelease pools properly on Mac.
 class ZipReaderTest : public PlatformTest {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     PlatformTest::SetUp();
 
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     test_dir_ = temp_dir_.GetPath();
-
-    ASSERT_TRUE(GetTestDataDirectory(&test_data_dir_));
-
-    test_zip_file_ = test_data_dir_.AppendASCII("test.zip");
-    encrypted_zip_file_ = test_data_dir_.AppendASCII("test_encrypted.zip");
-    evil_zip_file_ = test_data_dir_.AppendASCII("evil.zip");
-    evil_via_invalid_utf8_zip_file_ = test_data_dir_.AppendASCII(
-        "evil_via_invalid_utf8.zip");
-    evil_via_absolute_file_name_zip_file_ = test_data_dir_.AppendASCII(
-        "evil_via_absolute_file_name.zip");
-
-    test_zip_contents_.insert(base::FilePath(FILE_PATH_LITERAL("foo/")));
-    test_zip_contents_.insert(base::FilePath(FILE_PATH_LITERAL("foo/bar/")));
-    test_zip_contents_.insert(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar/baz.txt")));
-    test_zip_contents_.insert(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar/quux.txt")));
-    test_zip_contents_.insert(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar.txt")));
-    test_zip_contents_.insert(base::FilePath(FILE_PATH_LITERAL("foo.txt")));
-    test_zip_contents_.insert(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar/.hidden")));
   }
 
-  virtual void TearDown() {
-    PlatformTest::TearDown();
+  static base::FilePath GetTestDataDirectory() {
+    base::FilePath path;
+    CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &path));
+    return path.AppendASCII("third_party")
+        .AppendASCII("zlib")
+        .AppendASCII("google")
+        .AppendASCII("test")
+        .AppendASCII("data");
   }
 
-  bool GetTestDataDirectory(base::FilePath* path) {
-    bool success = base::PathService::Get(base::DIR_SOURCE_ROOT, path);
-    EXPECT_TRUE(success);
-    if (!success)
-      return false;
-    *path = path->AppendASCII("third_party");
-    *path = path->AppendASCII("zlib");
-    *path = path->AppendASCII("google");
-    *path = path->AppendASCII("test");
-    *path = path->AppendASCII("data");
-    return true;
-  }
+  static Paths GetPaths(const base::FilePath& zip_path,
+                        base::StringPiece encoding = {}) {
+    Paths paths;
+
+    if (ZipReader reader; reader.Open(zip_path)) {
+      if (!encoding.empty())
+        reader.SetEncoding(std::string(encoding));
+
+      while (const ZipReader::Entry* const entry = reader.Next()) {
+        EXPECT_TRUE(reader.ok());
+        paths.push_back(entry->path);
+      }
+
+      EXPECT_TRUE(reader.ok());
+    }
 
-  bool CompareFileAndMD5(const base::FilePath& path,
-                         const std::string expected_md5) {
-    // Read the output file and compute the MD5.
-    std::string output;
-    if (!base::ReadFileToString(path, &output))
-      return false;
-    const std::string md5 = base::MD5String(output);
-    return expected_md5 == md5;
+    return paths;
   }
 
   // The path to temporary directory used to contain the test operations.
   base::FilePath test_dir_;
   // The path to the test data directory where test.zip etc. are located.
-  base::FilePath test_data_dir_;
+  const base::FilePath data_dir_ = GetTestDataDirectory();
   // The path to test.zip in the test data directory.
-  base::FilePath test_zip_file_;
-  // The path to test_encrypted.zip in the test data directory.
-  base::FilePath encrypted_zip_file_;
-  // The path to evil.zip in the test data directory.
-  base::FilePath evil_zip_file_;
-  // The path to evil_via_invalid_utf8.zip in the test data directory.
-  base::FilePath evil_via_invalid_utf8_zip_file_;
-  // The path to evil_via_absolute_file_name.zip in the test data directory.
-  base::FilePath evil_via_absolute_file_name_zip_file_;
-  std::set<base::FilePath> test_zip_contents_;
-
+  const base::FilePath test_zip_file_ = data_dir_.AppendASCII("test.zip");
+  const Paths test_zip_contents_ = {
+      base::FilePath(FILE_PATH_LITERAL("foo/")),
+      base::FilePath(FILE_PATH_LITERAL("foo/bar/")),
+      base::FilePath(FILE_PATH_LITERAL("foo/bar/baz.txt")),
+      base::FilePath(FILE_PATH_LITERAL("foo/bar/quux.txt")),
+      base::FilePath(FILE_PATH_LITERAL("foo/bar.txt")),
+      base::FilePath(FILE_PATH_LITERAL("foo.txt")),
+      base::FilePath(FILE_PATH_LITERAL("foo/bar/.hidden")),
+  };
   base::ScopedTempDir temp_dir_;
-
   base::test::TaskEnvironment task_environment_;
 };
 
 TEST_F(ZipReaderTest, Open_ValidZipFile) {
   ZipReader reader;
-  ASSERT_TRUE(reader.Open(test_zip_file_));
+  EXPECT_TRUE(reader.Open(test_zip_file_));
+  EXPECT_TRUE(reader.ok());
 }
 
 TEST_F(ZipReaderTest, Open_ValidZipPlatformFile) {
   ZipReader reader;
+  EXPECT_FALSE(reader.ok());
   FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY);
-  ASSERT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file()));
+  EXPECT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file()));
+  EXPECT_TRUE(reader.ok());
 }
 
 TEST_F(ZipReaderTest, Open_NonExistentFile) {
   ZipReader reader;
-  ASSERT_FALSE(reader.Open(test_data_dir_.AppendASCII("nonexistent.zip")));
+  EXPECT_FALSE(reader.ok());
+  EXPECT_FALSE(reader.Open(data_dir_.AppendASCII("nonexistent.zip")));
+  EXPECT_FALSE(reader.ok());
 }
 
 TEST_F(ZipReaderTest, Open_ExistentButNonZipFile) {
   ZipReader reader;
-  ASSERT_FALSE(reader.Open(test_data_dir_.AppendASCII("create_test_zip.sh")));
+  EXPECT_FALSE(reader.ok());
+  EXPECT_FALSE(reader.Open(data_dir_.AppendASCII("create_test_zip.sh")));
+  EXPECT_FALSE(reader.ok());
 }
 
-// Iterate through the contents in the test zip file, and compare that the
-// contents collected from the zip reader matches the expected contents.
+TEST_F(ZipReaderTest, Open_EmptyFile) {
+  ZipReader reader;
+  EXPECT_FALSE(reader.ok());
+  EXPECT_FALSE(reader.Open(data_dir_.AppendASCII("empty.zip")));
+  EXPECT_FALSE(reader.ok());
+}
+
+// Iterate through the contents in the test ZIP archive, and compare that the
+// contents collected from the ZipReader matches the expected contents.
 TEST_F(ZipReaderTest, Iteration) {
-  std::set<base::FilePath> actual_contents;
+  Paths actual_contents;
   ZipReader reader;
-  ASSERT_TRUE(reader.Open(test_zip_file_));
-  while (reader.HasMore()) {
-    ASSERT_TRUE(reader.OpenCurrentEntryInZip());
-    actual_contents.insert(reader.current_entry_info()->file_path());
-    ASSERT_TRUE(reader.AdvanceToNextEntry());
+  EXPECT_FALSE(reader.ok());
+  EXPECT_TRUE(reader.Open(test_zip_file_));
+  EXPECT_TRUE(reader.ok());
+  while (const ZipReader::Entry* const entry = reader.Next()) {
+    EXPECT_TRUE(reader.ok());
+    actual_contents.push_back(entry->path);
   }
-  EXPECT_FALSE(reader.AdvanceToNextEntry());  // Shouldn't go further.
-  EXPECT_EQ(test_zip_contents_.size(),
-            static_cast<size_t>(reader.num_entries()));
-  EXPECT_EQ(test_zip_contents_.size(), actual_contents.size());
-  EXPECT_EQ(test_zip_contents_, actual_contents);
+
+  EXPECT_TRUE(reader.ok());
+  EXPECT_FALSE(reader.Next());  // Shouldn't go further.
+  EXPECT_TRUE(reader.ok());
+
+  EXPECT_THAT(actual_contents, SizeIs(reader.num_entries()));
+  EXPECT_THAT(actual_contents, ElementsAreArray(test_zip_contents_));
 }
 
-// Open the test zip file from a file descriptor, iterate through its contents,
-// and compare that they match the expected contents.
+// Open the test ZIP archive from a file descriptor, iterate through its
+// contents, and compare that they match the expected contents.
 TEST_F(ZipReaderTest, PlatformFileIteration) {
-  std::set<base::FilePath> actual_contents;
+  Paths actual_contents;
   ZipReader reader;
   FileWrapper zip_fd_wrapper(test_zip_file_, FileWrapper::READ_ONLY);
-  ASSERT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file()));
-  while (reader.HasMore()) {
-    ASSERT_TRUE(reader.OpenCurrentEntryInZip());
-    actual_contents.insert(reader.current_entry_info()->file_path());
-    ASSERT_TRUE(reader.AdvanceToNextEntry());
+  EXPECT_TRUE(reader.OpenFromPlatformFile(zip_fd_wrapper.platform_file()));
+  EXPECT_TRUE(reader.ok());
+  while (const ZipReader::Entry* const entry = reader.Next()) {
+    EXPECT_TRUE(reader.ok());
+    actual_contents.push_back(entry->path);
   }
-  EXPECT_FALSE(reader.AdvanceToNextEntry());  // Shouldn't go further.
-  EXPECT_EQ(test_zip_contents_.size(),
-            static_cast<size_t>(reader.num_entries()));
-  EXPECT_EQ(test_zip_contents_.size(), actual_contents.size());
-  EXPECT_EQ(test_zip_contents_, actual_contents);
+
+  EXPECT_TRUE(reader.ok());
+  EXPECT_FALSE(reader.Next());  // Shouldn't go further.
+  EXPECT_TRUE(reader.ok());
+
+  EXPECT_THAT(actual_contents, SizeIs(reader.num_entries()));
+  EXPECT_THAT(actual_contents, ElementsAreArray(test_zip_contents_));
 }
 
-TEST_F(ZipReaderTest, current_entry_info_RegularFile) {
+TEST_F(ZipReaderTest, RegularFile) {
   ZipReader reader;
   ASSERT_TRUE(reader.Open(test_zip_file_));
   base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt"));
-  ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path));
-  ZipReader::EntryInfo* current_entry_info = reader.current_entry_info();
 
-  EXPECT_EQ(target_path, current_entry_info->file_path());
-  EXPECT_EQ(13527, current_entry_info->original_size());
+  const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path);
+  ASSERT_TRUE(entry);
+
+  EXPECT_EQ(target_path, entry->path);
+  EXPECT_EQ(13527, entry->original_size);
 
   // The expected time stamp: 2009-05-29 06:22:20
   base::Time::Exploded exploded = {};  // Zero-clear.
-  current_entry_info->last_modified().LocalExplode(&exploded);
+  entry->last_modified.UTCExplode(&exploded);
   EXPECT_EQ(2009, exploded.year);
   EXPECT_EQ(5, exploded.month);
   EXPECT_EQ(29, exploded.day_of_month);
@@ -296,67 +300,106 @@ TEST_F(ZipReaderTest, current_entry_info_RegularFile) {
   EXPECT_EQ(20, exploded.second);
   EXPECT_EQ(0, exploded.millisecond);
 
-  EXPECT_FALSE(current_entry_info->is_unsafe());
-  EXPECT_FALSE(current_entry_info->is_directory());
+  EXPECT_FALSE(entry->is_unsafe);
+  EXPECT_FALSE(entry->is_directory);
 }
 
-TEST_F(ZipReaderTest, current_entry_info_DotDotFile) {
+TEST_F(ZipReaderTest, DotDotFile) {
   ZipReader reader;
-  ASSERT_TRUE(reader.Open(evil_zip_file_));
+  ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("evil.zip")));
   base::FilePath target_path(FILE_PATH_LITERAL(
-      "../levilevilevilevilevilevilevilevilevilevilevilevil"));
-  ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path));
-  ZipReader::EntryInfo* current_entry_info = reader.current_entry_info();
-  EXPECT_EQ(target_path, current_entry_info->file_path());
-
-  // This file is unsafe because of ".." in the file name.
-  EXPECT_TRUE(current_entry_info->is_unsafe());
-  EXPECT_FALSE(current_entry_info->is_directory());
+      "UP/levilevilevilevilevilevilevilevilevilevilevilevil"));
+  const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path);
+  ASSERT_TRUE(entry);
+  EXPECT_EQ(target_path, entry->path);
+  EXPECT_FALSE(entry->is_unsafe);
+  EXPECT_FALSE(entry->is_directory);
 }
 
-TEST_F(ZipReaderTest, current_entry_info_InvalidUTF8File) {
+TEST_F(ZipReaderTest, InvalidUTF8File) {
   ZipReader reader;
-  ASSERT_TRUE(reader.Open(evil_via_invalid_utf8_zip_file_));
-  // The evil file is the 2nd file in the zip file.
-  // We cannot locate by the file name ".\x80.\\evil.txt",
-  // as FilePath may internally convert the string.
-  ASSERT_TRUE(reader.AdvanceToNextEntry());
-  ASSERT_TRUE(reader.OpenCurrentEntryInZip());
-  ZipReader::EntryInfo* current_entry_info = reader.current_entry_info();
+  ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("evil_via_invalid_utf8.zip")));
+  base::FilePath target_path = base::FilePath::FromUTF8Unsafe(".�.�evil.txt");
+  const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path);
+  ASSERT_TRUE(entry);
+  EXPECT_EQ(target_path, entry->path);
+  EXPECT_FALSE(entry->is_unsafe);
+  EXPECT_FALSE(entry->is_directory);
+}
 
-  // This file is unsafe because of invalid UTF-8 in the file name.
-  EXPECT_TRUE(current_entry_info->is_unsafe());
-  EXPECT_FALSE(current_entry_info->is_directory());
+// By default, file paths in ZIPs are interpreted as UTF-8. But in this test,
+// the ZIP archive contains file paths that are actually encoded in Shift JIS.
+// The SJIS-encoded paths are thus wrongly interpreted as UTF-8, resulting in
+// garbled paths. Invalid UTF-8 sequences are safely converted to the
+// replacement character �.
+TEST_F(ZipReaderTest, EncodingSjisAsUtf8) {
+  EXPECT_THAT(
+      GetPaths(data_dir_.AppendASCII("SJIS Bug 846195.zip")),
+      ElementsAre(
+          base::FilePath::FromUTF8Unsafe("�V�����t�H���_/SJIS_835C_��.txt"),
+          base::FilePath::FromUTF8Unsafe(
+              "�V�����t�H���_/�V�����e�L�X�g �h�L�������g.txt")));
 }
 
-TEST_F(ZipReaderTest, current_entry_info_AbsoluteFile) {
-  ZipReader reader;
-  ASSERT_TRUE(reader.Open(evil_via_absolute_file_name_zip_file_));
-  base::FilePath target_path(FILE_PATH_LITERAL("/evil.txt"));
-  ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path));
-  ZipReader::EntryInfo* current_entry_info = reader.current_entry_info();
-  EXPECT_EQ(target_path, current_entry_info->file_path());
+// In this test, SJIS-encoded paths are interpreted as Code Page 1252. This
+// results in garbled paths. Note the presence of C1 control codes U+0090 and
+// U+0081 in the garbled paths.
+TEST_F(ZipReaderTest, EncodingSjisAs1252) {
+  EXPECT_THAT(
+      GetPaths(data_dir_.AppendASCII("SJIS Bug 846195.zip"), "windows-1252"),
+      ElementsAre(base::FilePath::FromUTF8Unsafe(
+                      "\u0090V‚µ‚¢ƒtƒHƒ‹ƒ_/SJIS_835C_ƒ�.txt"),
+                  base::FilePath::FromUTF8Unsafe(
+                      "\u0090V‚µ‚¢ƒtƒHƒ‹ƒ_/\u0090V‚µ‚¢ƒeƒLƒXƒg "
+                      "ƒhƒLƒ…ƒ\u0081ƒ“ƒg.txt")));
+}
+
+// In this test, SJIS-encoded paths are interpreted as Code Page 866. This
+// results in garbled paths.
+TEST_F(ZipReaderTest, EncodingSjisAsIbm866) {
+  EXPECT_THAT(
+      GetPaths(data_dir_.AppendASCII("SJIS Bug 846195.zip"), "IBM866"),
+      ElementsAre(
+          base::FilePath::FromUTF8Unsafe("РVВ╡ВвГtГHГЛГ_/SJIS_835C_Г�.txt"),
+          base::FilePath::FromUTF8Unsafe(
+              "РVВ╡ВвГtГHГЛГ_/РVВ╡ВвГeГLГXГg ГhГLГЕГБГУГg.txt")));
+}
+
+// Tests that SJIS-encoded paths are correctly converted to Unicode.
+TEST_F(ZipReaderTest, EncodingSjis) {
+  EXPECT_THAT(
+      GetPaths(data_dir_.AppendASCII("SJIS Bug 846195.zip"), "Shift_JIS"),
+      ElementsAre(
+          base::FilePath::FromUTF8Unsafe("新しいフォルダ/SJIS_835C_ソ.txt"),
+          base::FilePath::FromUTF8Unsafe(
+              "新しいフォルダ/新しいテキスト ドキュメント.txt")));
+}
 
-  // This file is unsafe because of the absolute file name.
-  EXPECT_TRUE(current_entry_info->is_unsafe());
-  EXPECT_FALSE(current_entry_info->is_directory());
+TEST_F(ZipReaderTest, AbsoluteFile) {
+  ZipReader reader;
+  ASSERT_TRUE(
+      reader.Open(data_dir_.AppendASCII("evil_via_absolute_file_name.zip")));
+  base::FilePath target_path(FILE_PATH_LITERAL("ROOT/evil.txt"));
+  const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path);
+  ASSERT_TRUE(entry);
+  EXPECT_EQ(target_path, entry->path);
+  EXPECT_FALSE(entry->is_unsafe);
+  EXPECT_FALSE(entry->is_directory);
 }
 
-TEST_F(ZipReaderTest, current_entry_info_Directory) {
+TEST_F(ZipReaderTest, Directory) {
   ZipReader reader;
   ASSERT_TRUE(reader.Open(test_zip_file_));
   base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/"));
-  ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path));
-  ZipReader::EntryInfo* current_entry_info = reader.current_entry_info();
-
-  EXPECT_EQ(base::FilePath(FILE_PATH_LITERAL("foo/bar/")),
-            current_entry_info->file_path());
+  const ZipReader::Entry* entry = LocateAndOpenEntry(&reader, target_path);
+  ASSERT_TRUE(entry);
+  EXPECT_EQ(target_path, entry->path);
   // The directory size should be zero.
-  EXPECT_EQ(0, current_entry_info->original_size());
+  EXPECT_EQ(0, entry->original_size);
 
   // The expected time stamp: 2009-05-31 15:49:52
   base::Time::Exploded exploded = {};  // Zero-clear.
-  current_entry_info->last_modified().LocalExplode(&exploded);
+  entry->last_modified.UTCExplode(&exploded);
   EXPECT_EQ(2009, exploded.year);
   EXPECT_EQ(5, exploded.month);
   EXPECT_EQ(31, exploded.day_of_month);
@@ -365,22 +408,91 @@ TEST_F(ZipReaderTest, current_entry_info_Directory) {
   EXPECT_EQ(52, exploded.second);
   EXPECT_EQ(0, exploded.millisecond);
 
-  EXPECT_FALSE(current_entry_info->is_unsafe());
-  EXPECT_TRUE(current_entry_info->is_directory());
+  EXPECT_FALSE(entry->is_unsafe);
+  EXPECT_TRUE(entry->is_directory);
 }
 
-TEST_F(ZipReaderTest, current_entry_info_EncryptedFile) {
+TEST_F(ZipReaderTest, EncryptedFile_WrongPassword) {
   ZipReader reader;
-  base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt"));
+  ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Different Encryptions.zip")));
+  reader.SetPassword("wrong password");
 
-  ASSERT_TRUE(reader.Open(encrypted_zip_file_));
-  ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path));
-  EXPECT_TRUE(reader.current_entry_info()->is_encrypted());
-  reader.Close();
+  {
+    const ZipReader::Entry* entry = reader.Next();
+    ASSERT_TRUE(entry);
+    EXPECT_EQ(base::FilePath::FromASCII("ClearText.txt"), entry->path);
+    EXPECT_FALSE(entry->is_directory);
+    EXPECT_FALSE(entry->is_encrypted);
+    std::string contents = "dummy";
+    EXPECT_TRUE(reader.ExtractCurrentEntryToString(&contents));
+    EXPECT_EQ("This is not encrypted.\n", contents);
+  }
 
-  ASSERT_TRUE(reader.Open(test_zip_file_));
-  ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path));
-  EXPECT_FALSE(reader.current_entry_info()->is_encrypted());
+  for (const base::StringPiece path : {
+           "Encrypted AES-128.txt",
+           "Encrypted AES-192.txt",
+           "Encrypted AES-256.txt",
+           "Encrypted ZipCrypto.txt",
+       }) {
+    const ZipReader::Entry* entry = reader.Next();
+    ASSERT_TRUE(entry);
+    EXPECT_EQ(base::FilePath::FromASCII(path), entry->path);
+    EXPECT_FALSE(entry->is_directory);
+    EXPECT_TRUE(entry->is_encrypted);
+    std::string contents = "dummy";
+    EXPECT_FALSE(reader.ExtractCurrentEntryToString(&contents));
+  }
+
+  EXPECT_FALSE(reader.Next());
+  EXPECT_TRUE(reader.ok());
+}
+
+TEST_F(ZipReaderTest, EncryptedFile_RightPassword) {
+  ZipReader reader;
+  ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Different Encryptions.zip")));
+  reader.SetPassword("password");
+
+  {
+    const ZipReader::Entry* entry = reader.Next();
+    ASSERT_TRUE(entry);
+    EXPECT_EQ(base::FilePath::FromASCII("ClearText.txt"), entry->path);
+    EXPECT_FALSE(entry->is_directory);
+    EXPECT_FALSE(entry->is_encrypted);
+    std::string contents = "dummy";
+    EXPECT_TRUE(reader.ExtractCurrentEntryToString(&contents));
+    EXPECT_EQ("This is not encrypted.\n", contents);
+  }
+
+  // TODO(crbug.com/1296838) Support AES encryption.
+  for (const base::StringPiece path : {
+           "Encrypted AES-128.txt",
+           "Encrypted AES-192.txt",
+           "Encrypted AES-256.txt",
+       }) {
+    const ZipReader::Entry* entry = reader.Next();
+    ASSERT_TRUE(entry);
+    EXPECT_EQ(base::FilePath::FromASCII(path), entry->path);
+    EXPECT_FALSE(entry->is_directory);
+    EXPECT_TRUE(entry->is_encrypted);
+    std::string contents = "dummy";
+    EXPECT_FALSE(reader.ExtractCurrentEntryToString(&contents));
+    EXPECT_EQ("", contents);
+  }
+
+  {
+    const ZipReader::Entry* entry = reader.Next();
+    ASSERT_TRUE(entry);
+    EXPECT_EQ(base::FilePath::FromASCII("Encrypted ZipCrypto.txt"),
+              entry->path);
+    EXPECT_FALSE(entry->is_directory);
+    EXPECT_TRUE(entry->is_encrypted);
+    std::string contents = "dummy";
+    EXPECT_TRUE(reader.ExtractCurrentEntryToString(&contents));
+    EXPECT_EQ("This is encrypted with ZipCrypto.\n", contents);
+  }
+
+  EXPECT_FALSE(reader.Next());
+  EXPECT_TRUE(reader.ok());
 }
 
 // Verifies that the ZipReader class can extract a file from a zip archive
@@ -403,7 +515,7 @@ TEST_F(ZipReaderTest, OpenFromString) {
       "\x50\x75\x78\x0b\x00\x01\x04\x8e\xf0\x00\x00\x04\x88\x13\x00\x00"
       "\x50\x4b\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00\x4e\x00\x00\x00"
       "\x52\x00\x00\x00\x00\x00";
-  std::string data(kTestData, base::size(kTestData));
+  std::string data(kTestData, std::size(kTestData));
   ZipReader reader;
   ASSERT_TRUE(reader.OpenFromString(data));
   base::FilePath target_path(FILE_PATH_LITERAL("test.txt"));
@@ -412,8 +524,8 @@ TEST_F(ZipReaderTest, OpenFromString) {
                                             test_dir_.AppendASCII("test.txt")));
 
   std::string actual;
-  ASSERT_TRUE(base::ReadFileToString(
-      test_dir_.AppendASCII("test.txt"), &actual));
+  ASSERT_TRUE(
+      base::ReadFileToString(test_dir_.AppendASCII("test.txt"), &actual));
   EXPECT_EQ(std::string("This is a test.\n"), actual);
 }
 
@@ -444,8 +556,8 @@ TEST_F(ZipReaderTest, ExtractToFileAsync_RegularFile) {
   EXPECT_LE(1, listener.progress_calls());
 
   std::string output;
-  ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("quux.txt"),
-                                     &output));
+  ASSERT_TRUE(
+      base::ReadFileToString(test_dir_.AppendASCII("quux.txt"), &output));
   const std::string md5 = base::MD5String(output);
   EXPECT_EQ(kQuuxExpectedMD5, md5);
 
@@ -455,6 +567,103 @@ TEST_F(ZipReaderTest, ExtractToFileAsync_RegularFile) {
   EXPECT_EQ(file_size, listener.current_progress());
 }
 
+TEST_F(ZipReaderTest, ExtractToFileAsync_Encrypted_NoPassword) {
+  MockUnzipListener listener;
+
+  ZipReader reader;
+  ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Different Encryptions.zip")));
+  ASSERT_TRUE(LocateAndOpenEntry(
+      &reader, base::FilePath::FromASCII("Encrypted ZipCrypto.txt")));
+  const base::FilePath target_path = test_dir_.AppendASCII("extracted");
+  reader.ExtractCurrentEntryToFilePathAsync(
+      target_path,
+      base::BindOnce(&MockUnzipListener::OnUnzipSuccess, listener.AsWeakPtr()),
+      base::BindOnce(&MockUnzipListener::OnUnzipFailure, listener.AsWeakPtr()),
+      base::BindRepeating(&MockUnzipListener::OnUnzipProgress,
+                          listener.AsWeakPtr()));
+
+  EXPECT_EQ(0, listener.success_calls());
+  EXPECT_EQ(0, listener.failure_calls());
+  EXPECT_EQ(0, listener.progress_calls());
+
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0, listener.success_calls());
+  EXPECT_EQ(1, listener.failure_calls());
+  EXPECT_LE(1, listener.progress_calls());
+
+  // The extracted file contains rubbish data.
+  // We probably shouldn't even look at it.
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(target_path, &contents));
+  EXPECT_NE("", contents);
+  EXPECT_EQ(contents.size(), listener.current_progress());
+}
+
+TEST_F(ZipReaderTest, ExtractToFileAsync_Encrypted_RightPassword) {
+  MockUnzipListener listener;
+
+  ZipReader reader;
+  reader.SetPassword("password");
+  ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Different Encryptions.zip")));
+  ASSERT_TRUE(LocateAndOpenEntry(
+      &reader, base::FilePath::FromASCII("Encrypted ZipCrypto.txt")));
+  const base::FilePath target_path = test_dir_.AppendASCII("extracted");
+  reader.ExtractCurrentEntryToFilePathAsync(
+      target_path,
+      base::BindOnce(&MockUnzipListener::OnUnzipSuccess, listener.AsWeakPtr()),
+      base::BindOnce(&MockUnzipListener::OnUnzipFailure, listener.AsWeakPtr()),
+      base::BindRepeating(&MockUnzipListener::OnUnzipProgress,
+                          listener.AsWeakPtr()));
+
+  EXPECT_EQ(0, listener.success_calls());
+  EXPECT_EQ(0, listener.failure_calls());
+  EXPECT_EQ(0, listener.progress_calls());
+
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(1, listener.success_calls());
+  EXPECT_EQ(0, listener.failure_calls());
+  EXPECT_LE(1, listener.progress_calls());
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(target_path, &contents));
+  EXPECT_EQ("This is encrypted with ZipCrypto.\n", contents);
+  EXPECT_EQ(contents.size(), listener.current_progress());
+}
+
+TEST_F(ZipReaderTest, ExtractToFileAsync_WrongCrc) {
+  MockUnzipListener listener;
+
+  ZipReader reader;
+  ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Wrong CRC.zip")));
+  ASSERT_TRUE(
+      LocateAndOpenEntry(&reader, base::FilePath::FromASCII("Corrupted.txt")));
+  const base::FilePath target_path = test_dir_.AppendASCII("extracted");
+  reader.ExtractCurrentEntryToFilePathAsync(
+      target_path,
+      base::BindOnce(&MockUnzipListener::OnUnzipSuccess, listener.AsWeakPtr()),
+      base::BindOnce(&MockUnzipListener::OnUnzipFailure, listener.AsWeakPtr()),
+      base::BindRepeating(&MockUnzipListener::OnUnzipProgress,
+                          listener.AsWeakPtr()));
+
+  EXPECT_EQ(0, listener.success_calls());
+  EXPECT_EQ(0, listener.failure_calls());
+  EXPECT_EQ(0, listener.progress_calls());
+
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(0, listener.success_calls());
+  EXPECT_EQ(1, listener.failure_calls());
+  EXPECT_LE(1, listener.progress_calls());
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(target_path, &contents));
+  EXPECT_EQ("This file has been changed after its CRC was computed.\n",
+            contents);
+  EXPECT_EQ(contents.size(), listener.current_progress());
+}
+
 // Verifies that the asynchronous extraction to a file works.
 TEST_F(ZipReaderTest, ExtractToFileAsync_Directory) {
   MockUnzipListener listener;
@@ -489,7 +698,7 @@ TEST_F(ZipReaderTest, ExtractCurrentEntryToString) {
   // sizes from 0 to 7 bytes respectively, being the contents of each file a
   // substring of "0123456" starting at '0'.
   base::FilePath test_zip_file =
-      test_data_dir_.AppendASCII("test_mismatch_size.zip");
+      data_dir_.AppendASCII("test_mismatch_size.zip");
 
   ZipReader reader;
   std::string contents;
@@ -510,12 +719,12 @@ TEST_F(ZipReaderTest, ExtractCurrentEntryToString) {
     if (i > 0) {
       // Exact byte read limit: must pass.
       EXPECT_TRUE(reader.ExtractCurrentEntryToString(i, &contents));
-      EXPECT_EQ(base::StringPiece("0123456", i).as_string(), contents);
+      EXPECT_EQ(std::string(base::StringPiece("0123456", i)), contents);
     }
 
     // More than necessary byte read limit: must pass.
-    EXPECT_TRUE(reader.ExtractCurrentEntryToString(16, &contents));
-    EXPECT_EQ(base::StringPiece("0123456", i).as_string(), contents);
+    EXPECT_TRUE(reader.ExtractCurrentEntryToString(&contents));
+    EXPECT_EQ(std::string(base::StringPiece("0123456", i)), contents);
   }
   reader.Close();
 }
@@ -525,7 +734,7 @@ TEST_F(ZipReaderTest, ExtractPartOfCurrentEntry) {
   // sizes from 0 to 7 bytes respectively, being the contents of each file a
   // substring of "0123456" starting at '0'.
   base::FilePath test_zip_file =
-      test_data_dir_.AppendASCII("test_mismatch_size.zip");
+      data_dir_.AppendASCII("test_mismatch_size.zip");
 
   ZipReader reader;
   std::string contents;
@@ -563,6 +772,37 @@ TEST_F(ZipReaderTest, ExtractPartOfCurrentEntry) {
   reader.Close();
 }
 
+TEST_F(ZipReaderTest, ExtractPosixPermissions) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  ZipReader reader;
+  ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("test_posix_permissions.zip")));
+  for (auto entry : {"0.txt", "1.txt", "2.txt", "3.txt"}) {
+    ASSERT_TRUE(LocateAndOpenEntry(&reader, base::FilePath::FromASCII(entry)));
+    FilePathWriterDelegate delegate(temp_dir.GetPath().AppendASCII(entry));
+    ASSERT_TRUE(reader.ExtractCurrentEntry(&delegate));
+  }
+  reader.Close();
+
+#if defined(OS_POSIX)
+  // This assumes a umask of at least 0400.
+  int mode = 0;
+  EXPECT_TRUE(base::GetPosixFilePermissions(
+      temp_dir.GetPath().AppendASCII("0.txt"), &mode));
+  EXPECT_EQ(mode & 0700, 0700);
+  EXPECT_TRUE(base::GetPosixFilePermissions(
+      temp_dir.GetPath().AppendASCII("1.txt"), &mode));
+  EXPECT_EQ(mode & 0700, 0600);
+  EXPECT_TRUE(base::GetPosixFilePermissions(
+      temp_dir.GetPath().AppendASCII("2.txt"), &mode));
+  EXPECT_EQ(mode & 0700, 0700);
+  EXPECT_TRUE(base::GetPosixFilePermissions(
+      temp_dir.GetPath().AppendASCII("3.txt"), &mode));
+  EXPECT_EQ(mode & 0700, 0600);
+#endif
+}
+
 // This test exposes http://crbug.com/430959, at least on OS X
 TEST_F(ZipReaderTest, DISABLED_LeakDetectionTest) {
   for (int i = 0; i < 100000; ++i) {
@@ -577,45 +817,40 @@ TEST_F(ZipReaderTest, DISABLED_LeakDetectionTest) {
 TEST_F(ZipReaderTest, ExtractCurrentEntryPrepareFailure) {
   testing::StrictMock<MockWriterDelegate> mock_writer;
 
-  EXPECT_CALL(mock_writer, PrepareOutput())
-      .WillOnce(Return(false));
+  EXPECT_CALL(mock_writer, PrepareOutput()).WillOnce(Return(false));
 
   base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt"));
   ZipReader reader;
 
   ASSERT_TRUE(reader.Open(test_zip_file_));
   ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path));
-  ASSERT_FALSE(reader.ExtractCurrentEntry(
-      &mock_writer, std::numeric_limits<uint64_t>::max()));
+  ASSERT_FALSE(reader.ExtractCurrentEntry(&mock_writer));
 }
 
-// Test that when WriterDelegate::WriteBytes returns false, no other methods on
-// the delegate are called and the extraction fails.
+// Test that when WriterDelegate::WriteBytes returns false, only the OnError
+// method on the delegate is called and the extraction fails.
 TEST_F(ZipReaderTest, ExtractCurrentEntryWriteBytesFailure) {
   testing::StrictMock<MockWriterDelegate> mock_writer;
 
-  EXPECT_CALL(mock_writer, PrepareOutput())
-      .WillOnce(Return(true));
-  EXPECT_CALL(mock_writer, WriteBytes(_, _))
-      .WillOnce(Return(false));
+  EXPECT_CALL(mock_writer, PrepareOutput()).WillOnce(Return(true));
+  EXPECT_CALL(mock_writer, WriteBytes(_, _)).WillOnce(Return(false));
+  EXPECT_CALL(mock_writer, OnError());
 
   base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt"));
   ZipReader reader;
 
   ASSERT_TRUE(reader.Open(test_zip_file_));
   ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path));
-  ASSERT_FALSE(reader.ExtractCurrentEntry(
-      &mock_writer, std::numeric_limits<uint64_t>::max()));
+  ASSERT_FALSE(reader.ExtractCurrentEntry(&mock_writer));
 }
 
 // Test that extraction succeeds when the writer delegate reports all is well.
 TEST_F(ZipReaderTest, ExtractCurrentEntrySuccess) {
   testing::StrictMock<MockWriterDelegate> mock_writer;
 
-  EXPECT_CALL(mock_writer, PrepareOutput())
-      .WillOnce(Return(true));
-  EXPECT_CALL(mock_writer, WriteBytes(_, _))
-      .WillRepeatedly(Return(true));
+  EXPECT_CALL(mock_writer, PrepareOutput()).WillOnce(Return(true));
+  EXPECT_CALL(mock_writer, WriteBytes(_, _)).WillRepeatedly(Return(true));
+  EXPECT_CALL(mock_writer, SetPosixFilePermissions(_));
   EXPECT_CALL(mock_writer, SetTimeModified(_));
 
   base::FilePath target_path(FILE_PATH_LITERAL("foo/bar/quux.txt"));
@@ -623,50 +858,84 @@ TEST_F(ZipReaderTest, ExtractCurrentEntrySuccess) {
 
   ASSERT_TRUE(reader.Open(test_zip_file_));
   ASSERT_TRUE(LocateAndOpenEntry(&reader, target_path));
-  ASSERT_TRUE(reader.ExtractCurrentEntry(&mock_writer,
-                                         std::numeric_limits<uint64_t>::max()));
+  ASSERT_TRUE(reader.ExtractCurrentEntry(&mock_writer));
+}
+
+TEST_F(ZipReaderTest, WrongCrc) {
+  ZipReader reader;
+  ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("Wrong CRC.zip")));
+
+  const ZipReader::Entry* const entry =
+      LocateAndOpenEntry(&reader, base::FilePath::FromASCII("Corrupted.txt"));
+  ASSERT_TRUE(entry);
+
+  std::string contents = "dummy";
+  EXPECT_FALSE(reader.ExtractCurrentEntryToString(&contents));
+  EXPECT_EQ("This file has been changed after its CRC was computed.\n",
+            contents);
+
+  contents = "dummy";
+  EXPECT_FALSE(
+      reader.ExtractCurrentEntryToString(entry->original_size + 1, &contents));
+  EXPECT_EQ("This file has been changed after its CRC was computed.\n",
+            contents);
+
+  contents = "dummy";
+  EXPECT_FALSE(
+      reader.ExtractCurrentEntryToString(entry->original_size, &contents));
+  EXPECT_EQ("This file has been changed after its CRC was computed.\n",
+            contents);
+
+  contents = "dummy";
+  EXPECT_FALSE(
+      reader.ExtractCurrentEntryToString(entry->original_size - 1, &contents));
+  EXPECT_EQ("This file has been changed after its CRC was computed.", contents);
 }
 
 class FileWriterDelegateTest : public ::testing::Test {
  protected:
   void SetUp() override {
     ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path_));
-    file_.Initialize(temp_file_path_, (base::File::FLAG_CREATE_ALWAYS |
-                                       base::File::FLAG_READ |
-                                       base::File::FLAG_WRITE |
-                                       base::File::FLAG_TEMPORARY |
-                                       base::File::FLAG_DELETE_ON_CLOSE));
+    file_.Initialize(temp_file_path_,
+                     (base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ |
+                      base::File::FLAG_WRITE | base::File::FLAG_WIN_TEMPORARY |
+                      base::File::FLAG_DELETE_ON_CLOSE));
     ASSERT_TRUE(file_.IsValid());
   }
 
-  // Writes data to the file, leaving the current position at the end of the
-  // write.
-  void PopulateFile() {
-    static const char kSomeData[] = "this sure is some data.";
-    static const size_t kSomeDataLen = sizeof(kSomeData) - 1;
-    ASSERT_NE(-1LL, file_.Write(0LL, kSomeData, kSomeDataLen));
-  }
-
   base::FilePath temp_file_path_;
   base::File file_;
 };
 
-TEST_F(FileWriterDelegateTest, WriteToStartAndTruncate) {
-  // Write stuff and advance.
-  PopulateFile();
+TEST_F(FileWriterDelegateTest, WriteToEnd) {
+  const std::string payload = "This is the actualy payload data.\n";
 
-  // This should rewind, write, then truncate.
-  static const char kSomeData[] = "short";
-  static const int kSomeDataLen = sizeof(kSomeData) - 1;
   {
     FileWriterDelegate writer(&file_);
+    EXPECT_EQ(0, writer.file_length());
     ASSERT_TRUE(writer.PrepareOutput());
-    ASSERT_TRUE(writer.WriteBytes(kSomeData, kSomeDataLen));
+    ASSERT_TRUE(writer.WriteBytes(payload.data(), payload.size()));
+    EXPECT_EQ(payload.size(), writer.file_length());
   }
-  ASSERT_EQ(kSomeDataLen, file_.GetLength());
-  char buf[kSomeDataLen] = {};
-  ASSERT_EQ(kSomeDataLen, file_.Read(0LL, buf, kSomeDataLen));
-  ASSERT_EQ(std::string(kSomeData), std::string(buf, kSomeDataLen));
+
+  EXPECT_EQ(payload.size(), file_.GetLength());
+}
+
+TEST_F(FileWriterDelegateTest, EmptyOnError) {
+  const std::string payload = "This is the actualy payload data.\n";
+
+  {
+    FileWriterDelegate writer(&file_);
+    EXPECT_EQ(0, writer.file_length());
+    ASSERT_TRUE(writer.PrepareOutput());
+    ASSERT_TRUE(writer.WriteBytes(payload.data(), payload.size()));
+    EXPECT_EQ(payload.size(), writer.file_length());
+    EXPECT_EQ(payload.size(), file_.GetLength());
+    writer.OnError();
+    EXPECT_EQ(0, writer.file_length());
+  }
+
+  EXPECT_EQ(0, file_.GetLength());
 }
 
 }  // namespace zip
diff --git a/deps/zlib/google/zip_unittest.cc b/deps/zlib/google/zip_unittest.cc
index 7ea3c36c2a80f1..b639e8e8437799 100644
--- a/deps/zlib/google/zip_unittest.cc
+++ b/deps/zlib/google/zip_unittest.cc
@@ -1,13 +1,15 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #include <stddef.h>
 #include <stdint.h>
 
-#include <map>
-#include <set>
+#include <iomanip>
+#include <limits>
 #include <string>
+#include <unordered_map>
+#include <unordered_set>
 #include <vector>
 
 #include "base/bind.h"
@@ -16,18 +18,43 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
-#include "base/macros.h"
+#include "base/logging.h"
 #include "base/path_service.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/bind.h"
+#include "base/time/time.h"
 #include "build/build_config.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 #include "third_party/zlib/google/zip.h"
+#include "third_party/zlib/google/zip_internal.h"
 #include "third_party/zlib/google/zip_reader.h"
 
+// Convenience macro to create a file path from a string literal.
+#define FP(path) base::FilePath(FILE_PATH_LITERAL(path))
+
 namespace {
 
+using testing::UnorderedElementsAre;
+using testing::UnorderedElementsAreArray;
+
+std::vector<std::string> GetRelativePaths(const base::FilePath& dir,
+                                          base::FileEnumerator::FileType type) {
+  std::vector<std::string> got_paths;
+  base::FileEnumerator files(dir, true, type);
+  for (base::FilePath path = files.Next(); !path.empty(); path = files.Next()) {
+    base::FilePath relative;
+    EXPECT_TRUE(dir.AppendRelativePath(path, &relative));
+    got_paths.push_back(relative.NormalizePathSeparatorsTo('/').AsUTF8Unsafe());
+  }
+
+  EXPECT_EQ(base::File::FILE_OK, files.GetError());
+  return got_paths;
+}
+
 bool CreateFile(const std::string& content,
                 base::FilePath* file_path,
                 base::File* file) {
@@ -42,6 +69,46 @@ bool CreateFile(const std::string& content,
   return file->IsValid();
 }
 
+// A WriterDelegate that logs progress once per second.
+class ProgressWriterDelegate : public zip::WriterDelegate {
+ public:
+  explicit ProgressWriterDelegate(int64_t expected_size)
+      : expected_size_(expected_size) {
+    CHECK_GT(expected_size_, 0);
+  }
+
+  bool WriteBytes(const char* data, int num_bytes) override {
+    received_bytes_ += num_bytes;
+    LogProgressIfNecessary();
+    return true;
+  }
+
+  void SetTimeModified(const base::Time& time) override { LogProgress(); }
+
+  int64_t received_bytes() const { return received_bytes_; }
+
+ private:
+  void LogProgressIfNecessary() {
+    const base::TimeTicks now = base::TimeTicks::Now();
+    if (next_progress_report_time_ > now)
+      return;
+
+    next_progress_report_time_ = now + progress_period_;
+    LogProgress();
+  }
+
+  void LogProgress() const {
+    LOG(INFO) << "Unzipping... " << std::setw(3)
+              << (100 * received_bytes_ / expected_size_) << "%";
+  }
+
+  const base::TimeDelta progress_period_ = base::Seconds(1);
+  base::TimeTicks next_progress_report_time_ =
+      base::TimeTicks::Now() + progress_period_;
+  const uint64_t expected_size_;
+  int64_t received_bytes_ = 0;
+};
+
 // A virtual file system containing:
 // /test
 // /test/foo.txt
@@ -55,8 +122,8 @@ class VirtualFileSystem : public zip::FileAccessor {
   static constexpr char kBar2Content[] = "This is bar too.";
 
   VirtualFileSystem() {
-    base::FilePath test_dir(FILE_PATH_LITERAL("/test"));
-    base::FilePath foo_txt_path = test_dir.Append(FILE_PATH_LITERAL("foo.txt"));
+    base::FilePath test_dir;
+    base::FilePath foo_txt_path = test_dir.AppendASCII("foo.txt");
 
     base::FilePath file_path;
     base::File file;
@@ -64,62 +131,92 @@ class VirtualFileSystem : public zip::FileAccessor {
     DCHECK(success);
     files_[foo_txt_path] = std::move(file);
 
-    base::FilePath bar_dir = test_dir.Append(FILE_PATH_LITERAL("bar"));
-    base::FilePath bar1_txt_path =
-        bar_dir.Append(FILE_PATH_LITERAL("bar1.txt"));
+    base::FilePath bar_dir = test_dir.AppendASCII("bar");
+    base::FilePath bar1_txt_path = bar_dir.AppendASCII("bar1.txt");
     success = CreateFile(kBar1Content, &file_path, &file);
     DCHECK(success);
     files_[bar1_txt_path] = std::move(file);
 
-    base::FilePath bar2_txt_path =
-        bar_dir.Append(FILE_PATH_LITERAL("bar2.txt"));
+    base::FilePath bar2_txt_path = bar_dir.AppendASCII("bar2.txt");
     success = CreateFile(kBar2Content, &file_path, &file);
     DCHECK(success);
     files_[bar2_txt_path] = std::move(file);
 
-    file_tree_[test_dir] = std::vector<DirectoryContentEntry>{
-        DirectoryContentEntry(foo_txt_path, /*is_dir=*/false),
-        DirectoryContentEntry(bar_dir, /*is_dir=*/true)};
-    file_tree_[bar_dir] = std::vector<DirectoryContentEntry>{
-        DirectoryContentEntry(bar1_txt_path, /*is_dir=*/false),
-        DirectoryContentEntry(bar2_txt_path, /*is_dir=*/false)};
+    file_tree_[base::FilePath()] = {{foo_txt_path}, {bar_dir}};
+    file_tree_[bar_dir] = {{bar1_txt_path, bar2_txt_path}};
+    file_tree_[foo_txt_path] = {};
+    file_tree_[bar1_txt_path] = {};
+    file_tree_[bar2_txt_path] = {};
   }
+
+  VirtualFileSystem(const VirtualFileSystem&) = delete;
+  VirtualFileSystem& operator=(const VirtualFileSystem&) = delete;
+
   ~VirtualFileSystem() override = default;
 
  private:
-  std::vector<base::File> OpenFilesForReading(
-      const std::vector<base::FilePath>& paths) override {
-    std::vector<base::File> files;
-    for (const auto& path : paths) {
-      auto iter = files_.find(path);
-      files.push_back(iter == files_.end() ? base::File()
-                                           : std::move(iter->second));
+  bool Open(const zip::Paths paths,
+            std::vector<base::File>* const files) override {
+    DCHECK(files);
+    files->reserve(files->size() + paths.size());
+
+    for (const base::FilePath& path : paths) {
+      const auto it = files_.find(path);
+      if (it == files_.end()) {
+        files->emplace_back();
+      } else {
+        EXPECT_TRUE(it->second.IsValid());
+        files->push_back(std::move(it->second));
+      }
     }
-    return files;
-  }
 
-  bool DirectoryExists(const base::FilePath& file) override {
-    return file_tree_.count(file) == 1 && files_.count(file) == 0;
+    return true;
   }
 
-  std::vector<DirectoryContentEntry> ListDirectoryContent(
-      const base::FilePath& dir) override {
-    auto iter = file_tree_.find(dir);
-    if (iter == file_tree_.end()) {
-      NOTREACHED();
-      return std::vector<DirectoryContentEntry>();
+  bool List(const base::FilePath& path,
+            std::vector<base::FilePath>* const files,
+            std::vector<base::FilePath>* const subdirs) override {
+    DCHECK(!path.IsAbsolute());
+    DCHECK(files);
+    DCHECK(subdirs);
+
+    const auto it = file_tree_.find(path);
+    if (it == file_tree_.end())
+      return false;
+
+    for (const base::FilePath& file : it->second.files) {
+      DCHECK(!file.empty());
+      files->push_back(file);
     }
-    return iter->second;
+
+    for (const base::FilePath& subdir : it->second.subdirs) {
+      DCHECK(!subdir.empty());
+      subdirs->push_back(subdir);
+    }
+
+    return true;
   }
 
-  base::Time GetLastModifiedTime(const base::FilePath& path) override {
-    return base::Time::FromDoubleT(172097977);  // Some random date.
+  bool GetInfo(const base::FilePath& path, Info* const info) override {
+    DCHECK(!path.IsAbsolute());
+    DCHECK(info);
+
+    if (!file_tree_.count(path))
+      return false;
+
+    info->is_directory = !files_.count(path);
+    info->last_modified =
+        base::Time::FromDoubleT(172097977);  // Some random date.
+
+    return true;
   }
 
-  std::map<base::FilePath, std::vector<DirectoryContentEntry>> file_tree_;
-  std::map<base::FilePath, base::File> files_;
+  struct DirContents {
+    std::vector<base::FilePath> files, subdirs;
+  };
 
-  DISALLOW_COPY_AND_ASSIGN(VirtualFileSystem);
+  std::unordered_map<base::FilePath, DirContents> file_tree_;
+  std::unordered_map<base::FilePath, base::File> files_;
 };
 
 // static
@@ -130,10 +227,7 @@ constexpr char VirtualFileSystem::kBar2Content[];
 // Make the test a PlatformTest to setup autorelease pools properly on Mac.
 class ZipTest : public PlatformTest {
  protected:
-  enum ValidYearType {
-    VALID_YEAR,
-    INVALID_YEAR
-  };
+  enum ValidYearType { VALID_YEAR, INVALID_YEAR };
 
   virtual void SetUp() {
     PlatformTest::SetUp();
@@ -142,94 +236,77 @@ class ZipTest : public PlatformTest {
     test_dir_ = temp_dir_.GetPath();
 
     base::FilePath zip_path(test_dir_);
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("foo.txt")));
-    zip_path = zip_path.Append(FILE_PATH_LITERAL("foo"));
+    zip_contents_.insert(zip_path.AppendASCII("foo.txt"));
+    zip_path = zip_path.AppendASCII("foo");
     zip_contents_.insert(zip_path);
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("bar.txt")));
-    zip_path = zip_path.Append(FILE_PATH_LITERAL("bar"));
+    zip_contents_.insert(zip_path.AppendASCII("bar.txt"));
+    zip_path = zip_path.AppendASCII("bar");
     zip_contents_.insert(zip_path);
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("baz.txt")));
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("quux.txt")));
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL(".hidden")));
+    zip_contents_.insert(zip_path.AppendASCII("baz.txt"));
+    zip_contents_.insert(zip_path.AppendASCII("quux.txt"));
+    zip_contents_.insert(zip_path.AppendASCII(".hidden"));
 
     // Include a subset of files in |zip_file_list_| to test ZipFiles().
-    zip_file_list_.push_back(base::FilePath(FILE_PATH_LITERAL("foo.txt")));
-    zip_file_list_.push_back(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar/quux.txt")));
-    zip_file_list_.push_back(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar/.hidden")));
+    zip_file_list_.push_back(FP("foo.txt"));
+    zip_file_list_.push_back(FP("foo/bar/quux.txt"));
+    zip_file_list_.push_back(FP("foo/bar/.hidden"));
   }
 
-  virtual void TearDown() {
-    PlatformTest::TearDown();
-  }
+  virtual void TearDown() { PlatformTest::TearDown(); }
 
-  bool GetTestDataDirectory(base::FilePath* path) {
-    bool success = base::PathService::Get(base::DIR_SOURCE_ROOT, path);
+  static base::FilePath GetDataDirectory() {
+    base::FilePath path;
+    bool success = base::PathService::Get(base::DIR_SOURCE_ROOT, &path);
     EXPECT_TRUE(success);
-    if (!success)
-      return false;
-    *path = path->AppendASCII("third_party");
-    *path = path->AppendASCII("zlib");
-    *path = path->AppendASCII("google");
-    *path = path->AppendASCII("test");
-    *path = path->AppendASCII("data");
-    return true;
+    return std::move(path)
+        .AppendASCII("third_party")
+        .AppendASCII("zlib")
+        .AppendASCII("google")
+        .AppendASCII("test")
+        .AppendASCII("data");
   }
 
   void TestUnzipFile(const base::FilePath::StringType& filename,
                      bool expect_hidden_files) {
-    base::FilePath test_dir;
-    ASSERT_TRUE(GetTestDataDirectory(&test_dir));
-    TestUnzipFile(test_dir.Append(filename), expect_hidden_files);
+    TestUnzipFile(GetDataDirectory().Append(filename), expect_hidden_files);
   }
 
   void TestUnzipFile(const base::FilePath& path, bool expect_hidden_files) {
-    ASSERT_TRUE(base::PathExists(path)) << "no file " << path.value();
+    ASSERT_TRUE(base::PathExists(path)) << "no file " << path;
     ASSERT_TRUE(zip::Unzip(path, test_dir_));
 
-    base::FilePath original_dir;
-    ASSERT_TRUE(GetTestDataDirectory(&original_dir));
-    original_dir = original_dir.AppendASCII("test");
+    base::FilePath original_dir = GetDataDirectory().AppendASCII("test");
 
-    base::FileEnumerator files(test_dir_, true,
+    base::FileEnumerator files(
+        test_dir_, true,
         base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES);
-    base::FilePath unzipped_entry_path = files.Next();
+
     size_t count = 0;
-    while (!unzipped_entry_path.value().empty()) {
+    for (base::FilePath unzipped_entry_path = files.Next();
+         !unzipped_entry_path.empty(); unzipped_entry_path = files.Next()) {
       EXPECT_EQ(zip_contents_.count(unzipped_entry_path), 1U)
-          << "Couldn't find " << unzipped_entry_path.value();
+          << "Couldn't find " << unzipped_entry_path;
       count++;
 
       if (base::PathExists(unzipped_entry_path) &&
           !base::DirectoryExists(unzipped_entry_path)) {
         // It's a file, check its contents are what we zipped.
-        // TODO(774156): figure out why the commented out EXPECT_TRUE below
-        // fails on the build bots (but not on the try-bots).
         base::FilePath relative_path;
-        bool append_relative_path_success =
-            test_dir_.AppendRelativePath(unzipped_entry_path, &relative_path);
-        if (!append_relative_path_success) {
-          LOG(ERROR) << "Append relative path failed, params: "
-                     << test_dir_.value() << " and "
-                     << unzipped_entry_path.value();
-        }
+        ASSERT_TRUE(
+            test_dir_.AppendRelativePath(unzipped_entry_path, &relative_path))
+            << "Cannot append relative path failed, params: '" << test_dir_
+            << "' and '" << unzipped_entry_path << "'";
         base::FilePath original_path = original_dir.Append(relative_path);
-        LOG(ERROR) << "Comparing original " << original_path.value()
-                   << " and unzipped file " << unzipped_entry_path.value()
-                   << " result: "
-                   << base::ContentsEqual(original_path, unzipped_entry_path);
-        // EXPECT_TRUE(base::ContentsEqual(original_path, unzipped_entry_path))
-        //    << "Contents differ between original " << original_path.value()
-        //    << " and unzipped file " << unzipped_entry_path.value();
+        EXPECT_TRUE(base::ContentsEqual(original_path, unzipped_entry_path))
+            << "Original file '" << original_path << "' and unzipped file '"
+            << unzipped_entry_path << "' have different contents";
       }
-      unzipped_entry_path = files.Next();
     }
+    EXPECT_EQ(base::File::FILE_OK, files.GetError());
 
     size_t expected_count = 0;
-    for (std::set<base::FilePath>::iterator iter = zip_contents_.begin();
-         iter != zip_contents_.end(); ++iter) {
-      if (expect_hidden_files || iter->BaseName().value()[0] != '.')
+    for (const base::FilePath& path : zip_contents_) {
+      if (expect_hidden_files || path.BaseName().value()[0] != '.')
         ++expected_count;
     }
 
@@ -265,11 +342,11 @@ class ZipTest : public PlatformTest {
     // supports, which is 2 seconds. Note that between this call to Time::Now()
     // and zip::Zip() the clock can advance a bit, hence the use of EXPECT_GE.
     base::Time::Exploded now_parts;
-    base::Time::Now().LocalExplode(&now_parts);
+    base::Time::Now().UTCExplode(&now_parts);
     now_parts.second = now_parts.second & ~1;
     now_parts.millisecond = 0;
     base::Time now_time;
-    EXPECT_TRUE(base::Time::FromLocalExploded(now_parts, &now_time));
+    EXPECT_TRUE(base::Time::FromUTCExploded(now_parts, &now_time));
 
     EXPECT_EQ(1, base::WriteFile(src_file, "1", 1));
     EXPECT_TRUE(base::TouchFile(src_file, base::Time::Now(), test_mtime));
@@ -295,12 +372,23 @@ class ZipTest : public PlatformTest {
   base::ScopedTempDir temp_dir_;
 
   // Hard-coded contents of a known zip file.
-  std::set<base::FilePath> zip_contents_;
+  std::unordered_set<base::FilePath> zip_contents_;
 
   // Hard-coded list of relative paths for a zip file created with ZipFiles.
   std::vector<base::FilePath> zip_file_list_;
 };
 
+TEST_F(ZipTest, UnzipNoSuchFile) {
+  EXPECT_FALSE(zip::Unzip(GetDataDirectory().AppendASCII("No Such File.zip"),
+                          test_dir_));
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre());
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES),
+      UnorderedElementsAre());
+}
+
 TEST_F(ZipTest, Unzip) {
   TestUnzipFile(FILE_PATH_LITERAL("test.zip"), true);
 }
@@ -310,108 +398,617 @@ TEST_F(ZipTest, UnzipUncompressed) {
 }
 
 TEST_F(ZipTest, UnzipEvil) {
-  base::FilePath path;
-  ASSERT_TRUE(GetTestDataDirectory(&path));
-  path = path.AppendASCII("evil.zip");
+  base::FilePath path = GetDataDirectory().AppendASCII("evil.zip");
   // Unzip the zip file into a sub directory of test_dir_ so evil.zip
   // won't create a persistent file outside test_dir_ in case of a
   // failure.
   base::FilePath output_dir = test_dir_.AppendASCII("out");
-  ASSERT_FALSE(zip::Unzip(path, output_dir));
-  base::FilePath evil_file = output_dir;
-  evil_file = evil_file.AppendASCII(
-      "../levilevilevilevilevilevilevilevilevilevilevilevil");
-  ASSERT_FALSE(base::PathExists(evil_file));
+  EXPECT_TRUE(zip::Unzip(path, output_dir));
+  EXPECT_TRUE(base::PathExists(output_dir.AppendASCII(
+      "UP/levilevilevilevilevilevilevilevilevilevilevilevil")));
 }
 
 TEST_F(ZipTest, UnzipEvil2) {
-  base::FilePath path;
-  ASSERT_TRUE(GetTestDataDirectory(&path));
-  // The zip file contains an evil file with invalid UTF-8 in its file
-  // name.
-  path = path.AppendASCII("evil_via_invalid_utf8.zip");
+  // The ZIP file contains a file with invalid UTF-8 in its file name.
+  base::FilePath path =
+      GetDataDirectory().AppendASCII("evil_via_invalid_utf8.zip");
   // See the comment at UnzipEvil() for why we do this.
   base::FilePath output_dir = test_dir_.AppendASCII("out");
-  // This should fail as it contains an evil file.
-  ASSERT_FALSE(zip::Unzip(path, output_dir));
-  base::FilePath evil_file = output_dir;
-  evil_file = evil_file.AppendASCII("../evil.txt");
-  ASSERT_FALSE(base::PathExists(evil_file));
+  ASSERT_TRUE(zip::Unzip(path, output_dir));
+  ASSERT_TRUE(base::PathExists(
+      output_dir.Append(base::FilePath::FromUTF8Unsafe(".�.�evil.txt"))));
+  ASSERT_FALSE(base::PathExists(output_dir.AppendASCII("../evil.txt")));
 }
 
 TEST_F(ZipTest, UnzipWithFilter) {
   auto filter = base::BindRepeating([](const base::FilePath& path) {
     return path.BaseName().MaybeAsASCII() == "foo.txt";
   });
-  base::FilePath path;
-  ASSERT_TRUE(GetTestDataDirectory(&path));
-  ASSERT_TRUE(zip::UnzipWithFilterCallback(path.AppendASCII("test.zip"),
-                                           test_dir_, filter, false));
-  // Only foo.txt should have been extracted. The following paths should not
-  // be extracted:
-  //   foo/
-  //   foo/bar.txt
-  //   foo/bar/
-  //   foo/bar/.hidden
-  //   foo/bar/baz.txt
-  //   foo/bar/quux.txt
-  ASSERT_TRUE(base::PathExists(test_dir_.AppendASCII("foo.txt")));
-  base::FileEnumerator extractedFiles(
-      test_dir_,
-      false,  // Do not enumerate recursively - the file must be in the root.
-      base::FileEnumerator::FileType::FILES);
-  int extracted_count = 0;
-  while (!extractedFiles.Next().empty())
-    ++extracted_count;
-  ASSERT_EQ(1, extracted_count);
-
-  base::FileEnumerator extractedDirs(
-      test_dir_,
-      false,  // Do not enumerate recursively - we require zero directories.
-      base::FileEnumerator::FileType::DIRECTORIES);
-  extracted_count = 0;
-  while (!extractedDirs.Next().empty())
-    ++extracted_count;
-  ASSERT_EQ(0, extracted_count);
+  ASSERT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII("test.zip"), test_dir_,
+                         {.filter = std::move(filter)}));
+  // Only foo.txt should have been extracted.
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("foo.txt"));
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES),
+      UnorderedElementsAre());
+}
+
+TEST_F(ZipTest, UnzipEncryptedWithRightPassword) {
+  // TODO(crbug.com/1296838) Also check the AES-encrypted files.
+  auto filter = base::BindRepeating([](const base::FilePath& path) {
+    return !base::StartsWith(path.MaybeAsASCII(), "Encrypted AES");
+  });
+
+  ASSERT_TRUE(zip::Unzip(
+      GetDataDirectory().AppendASCII("Different Encryptions.zip"), test_dir_,
+      {.filter = std::move(filter), .password = "password"}));
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("ClearText.txt"),
+                                     &contents));
+  EXPECT_EQ("This is not encrypted.\n", contents);
+
+  ASSERT_TRUE(base::ReadFileToString(
+      test_dir_.AppendASCII("Encrypted ZipCrypto.txt"), &contents));
+  EXPECT_EQ("This is encrypted with ZipCrypto.\n", contents);
+}
+
+TEST_F(ZipTest, UnzipEncryptedWithWrongPassword) {
+  // TODO(crbug.com/1296838) Also check the AES-encrypted files.
+  auto filter = base::BindRepeating([](const base::FilePath& path) {
+    return !base::StartsWith(path.MaybeAsASCII(), "Encrypted AES");
+  });
+
+  ASSERT_FALSE(zip::Unzip(
+      GetDataDirectory().AppendASCII("Different Encryptions.zip"), test_dir_,
+      {.filter = std::move(filter), .password = "wrong"}));
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("ClearText.txt"),
+                                     &contents));
+  EXPECT_EQ("This is not encrypted.\n", contents);
+
+  // No rubbish file should be left behind.
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("ClearText.txt"));
+}
+
+TEST_F(ZipTest, UnzipEncryptedWithNoPassword) {
+  // TODO(crbug.com/1296838) Also check the AES-encrypted files.
+  auto filter = base::BindRepeating([](const base::FilePath& path) {
+    return !base::StartsWith(path.MaybeAsASCII(), "Encrypted AES");
+  });
+
+  ASSERT_FALSE(
+      zip::Unzip(GetDataDirectory().AppendASCII("Different Encryptions.zip"),
+                 test_dir_, {.filter = std::move(filter)}));
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("ClearText.txt"),
+                                     &contents));
+  EXPECT_EQ("This is not encrypted.\n", contents);
+
+  // No rubbish file should be left behind.
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("ClearText.txt"));
+}
+
+TEST_F(ZipTest, UnzipEncryptedContinueOnError) {
+  EXPECT_TRUE(
+      zip::Unzip(GetDataDirectory().AppendASCII("Different Encryptions.zip"),
+                 test_dir_, {.continue_on_error = true}));
+
+  std::string contents;
+  EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("ClearText.txt"),
+                                     &contents));
+  EXPECT_EQ("This is not encrypted.\n", contents);
+
+  // No rubbish file should be left behind.
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("ClearText.txt"));
+}
+
+TEST_F(ZipTest, UnzipWrongCrc) {
+  ASSERT_FALSE(
+      zip::Unzip(GetDataDirectory().AppendASCII("Wrong CRC.zip"), test_dir_));
+
+  // No rubbish file should be left behind.
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre());
+}
+
+TEST_F(ZipTest, UnzipRepeatedDirName) {
+  EXPECT_TRUE(zip::Unzip(
+      GetDataDirectory().AppendASCII("Repeated Dir Name.zip"), test_dir_));
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre());
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES),
+      UnorderedElementsAre("repeated"));
+}
+
+TEST_F(ZipTest, UnzipRepeatedFileName) {
+  EXPECT_FALSE(zip::Unzip(
+      GetDataDirectory().AppendASCII("Repeated File Name.zip"), test_dir_));
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("repeated"));
+
+  std::string contents;
+  EXPECT_TRUE(
+      base::ReadFileToString(test_dir_.AppendASCII("repeated"), &contents));
+  EXPECT_EQ("First file", contents);
+}
+
+TEST_F(ZipTest, UnzipCannotCreateEmptyDir) {
+  EXPECT_FALSE(zip::Unzip(
+      GetDataDirectory().AppendASCII("Empty Dir Same Name As File.zip"),
+      test_dir_));
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("repeated"));
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES),
+      UnorderedElementsAre());
+
+  std::string contents;
+  EXPECT_TRUE(
+      base::ReadFileToString(test_dir_.AppendASCII("repeated"), &contents));
+  EXPECT_EQ("First file", contents);
+}
+
+TEST_F(ZipTest, UnzipCannotCreateParentDir) {
+  EXPECT_FALSE(zip::Unzip(
+      GetDataDirectory().AppendASCII("Parent Dir Same Name As File.zip"),
+      test_dir_));
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("repeated"));
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES),
+      UnorderedElementsAre());
+
+  std::string contents;
+  EXPECT_TRUE(
+      base::ReadFileToString(test_dir_.AppendASCII("repeated"), &contents));
+  EXPECT_EQ("First file", contents);
+}
+
+// TODO(crbug.com/1311140) Detect and rename reserved file names on Windows.
+TEST_F(ZipTest, UnzipWindowsSpecialNames) {
+  EXPECT_TRUE(
+      zip::Unzip(GetDataDirectory().AppendASCII("Windows Special Names.zip"),
+                 test_dir_, {.continue_on_error = true}));
+
+  std::unordered_set<std::string> want_paths = {
+      "First",
+      "Last",
+      "CLOCK$",
+      " NUL.txt",
+#ifndef OS_WIN
+      "NUL",
+      "NUL ",
+      "NUL.",
+      "NUL .",
+      "NUL.txt",
+      "NUL.tar.gz",
+      "NUL..txt",
+      "NUL...txt",
+      "NUL .txt",
+      "NUL  .txt",
+      "NUL  ..txt",
+#ifndef OS_MAC
+      "Nul.txt",
+#endif
+      "nul.very long extension",
+      "a/NUL",
+      "CON",
+      "PRN",
+      "AUX",
+      "COM1",
+      "COM2",
+      "COM3",
+      "COM4",
+      "COM5",
+      "COM6",
+      "COM7",
+      "COM8",
+      "COM9",
+      "LPT1",
+      "LPT2",
+      "LPT3",
+      "LPT4",
+      "LPT5",
+      "LPT6",
+      "LPT7",
+      "LPT8",
+      "LPT9",
+#endif
+  };
+
+  const std::vector<std::string> got_paths =
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES);
+
+  for (const std::string& path : got_paths) {
+    const bool ok = want_paths.erase(path);
+
+#ifdef OS_WIN
+    if (!ok) {
+      // See crbug.com/1313991: Different versions of Windows treat these
+      // filenames differently. No hard error here if there is an unexpected
+      // file.
+      LOG(WARNING) << "Found unexpected file: " << std::quoted(path);
+      continue;
+    }
+#else
+    EXPECT_TRUE(ok) << "Found unexpected file: " << std::quoted(path);
+#endif
+
+    std::string contents;
+    EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII(path), &contents));
+    EXPECT_EQ(base::StrCat({"This is: ", path}), contents);
+  }
+
+  for (const std::string& path : want_paths) {
+    EXPECT_TRUE(false) << "Cannot find expected file: " << std::quoted(path);
+  }
+}
+
+TEST_F(ZipTest, UnzipDifferentCases) {
+#if defined(OS_WIN) || defined(OS_MAC)
+  // Only the first file (with mixed case) is extracted.
+  EXPECT_FALSE(zip::Unzip(GetDataDirectory().AppendASCII(
+                              "Repeated File Name With Different Cases.zip"),
+                          test_dir_));
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("Case"));
+
+  std::string contents;
+  EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("Case"), &contents));
+  EXPECT_EQ("Mixed case 111", contents);
+#else
+  // All the files are extracted.
+  EXPECT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII(
+                             "Repeated File Name With Different Cases.zip"),
+                         test_dir_));
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("Case", "case", "CASE"));
+
+  std::string contents;
+  EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("Case"), &contents));
+  EXPECT_EQ("Mixed case 111", contents);
+
+  EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("case"), &contents));
+  EXPECT_EQ("Lower case 22", contents);
+
+  EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("CASE"), &contents));
+  EXPECT_EQ("Upper case 3", contents);
+#endif
+}
+
+TEST_F(ZipTest, UnzipDifferentCasesContinueOnError) {
+  EXPECT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII(
+                             "Repeated File Name With Different Cases.zip"),
+                         test_dir_, {.continue_on_error = true}));
+
+  std::string contents;
+
+#if defined(OS_WIN) || defined(OS_MAC)
+  // Only the first file (with mixed case) has been extracted.
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("Case"));
+
+  EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("Case"), &contents));
+  EXPECT_EQ("Mixed case 111", contents);
+#else
+  // All the files have been extracted.
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES),
+      UnorderedElementsAre("Case", "case", "CASE"));
+
+  EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("Case"), &contents));
+  EXPECT_EQ("Mixed case 111", contents);
+
+  EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("case"), &contents));
+  EXPECT_EQ("Lower case 22", contents);
+
+  EXPECT_TRUE(base::ReadFileToString(test_dir_.AppendASCII("CASE"), &contents));
+  EXPECT_EQ("Upper case 3", contents);
+#endif
+}
+
+TEST_F(ZipTest, UnzipMixedPaths) {
+  EXPECT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII("Mixed Paths.zip"),
+                         test_dir_, {.continue_on_error = true}));
+
+  std::unordered_set<std::string> want_paths = {
+#ifdef OS_WIN
+      "Dot",     //
+      "Space→",  //
+#else
+      " ",                        //
+      "AUX",                      // Disappears on Windows
+      "COM1",                     // Disappears on Windows
+      "COM2",                     // Disappears on Windows
+      "COM3",                     // Disappears on Windows
+      "COM4",                     // Disappears on Windows
+      "COM5",                     // Disappears on Windows
+      "COM6",                     // Disappears on Windows
+      "COM7",                     // Disappears on Windows
+      "COM8",                     // Disappears on Windows
+      "COM9",                     // Disappears on Windows
+      "CON",                      // Disappears on Windows
+      "Dot .",                    //
+      "LPT1",                     // Disappears on Windows
+      "LPT2",                     // Disappears on Windows
+      "LPT3",                     // Disappears on Windows
+      "LPT4",                     // Disappears on Windows
+      "LPT5",                     // Disappears on Windows
+      "LPT6",                     // Disappears on Windows
+      "LPT7",                     // Disappears on Windows
+      "LPT8",                     // Disappears on Windows
+      "LPT9",                     // Disappears on Windows
+      "NUL  ..txt",               // Disappears on Windows
+      "NUL  .txt",                // Disappears on Windows
+      "NUL ",                     // Disappears on Windows
+      "NUL .",                    // Disappears on Windows
+      "NUL .txt",                 // Disappears on Windows
+      "NUL",                      // Disappears on Windows
+      "NUL.",                     // Disappears on Windows
+      "NUL...txt",                // Disappears on Windows
+      "NUL..txt",                 // Disappears on Windows
+      "NUL.tar.gz",               // Disappears on Windows
+      "NUL.txt",                  // Disappears on Windows
+      "PRN",                      // Disappears on Windows
+      "Space→ ",                  //
+      "c/NUL",                    // Disappears on Windows
+      "nul.very long extension",  // Disappears on Windows
+#ifndef OS_MAC
+      "CASE",                     // Conflicts with "Case"
+      "case",                     // Conflicts with "Case"
+#endif
+#endif
+      " NUL.txt",                  //
+      " ←Space",                   //
+      "$HOME",                     //
+      "%TMP",                      //
+      "-",                         //
+      "...Three",                  //
+      "..Two",                     //
+      ".One",                      //
+      "Ampersand &",               //
+      "Angle ��",                  //
+      "At @",                      //
+      "Backslash1→�",              //
+      "Backslash3→�←Backslash4",   //
+      "Backspace �",               //
+      "Backtick `",                //
+      "Bell �",                    //
+      "CLOCK$",                    //
+      "Caret ^",                   //
+      "Carriage Return �",         //
+      "Case",                      //
+      "Colon �",                   //
+      "Comma ,",                   //
+      "Curly {}",                  //
+      "C�",                        //
+      "C��",                       //
+      "C��Temp",                   //
+      "C��Temp�",                  //
+      "C��Temp�File",              //
+      "Dash -",                    //
+      "Delete \x7F",               //
+      "Dollar $",                  //
+      "Double quote �",            //
+      "Equal =",                   //
+      "Escape �",                  //
+      "Euro €",                    //
+      "Exclamation !",             //
+      "FileOrDir",                 //
+      "First",                     //
+      "Hash #",                    //
+      "Last",                      //
+      "Line Feed �",               //
+      "Percent %",                 //
+      "Pipe �",                    //
+      "Plus +",                    //
+      "Question �",                //
+      "Quote '",                   //
+      "ROOT/At The Top",           //
+      "ROOT/UP/Over The Top",      //
+      "ROOT/dev/null",             //
+      "Round ()",                  //
+      "Semicolon ;",               //
+      "Smile \U0001F642",          //
+      "Square []",                 //
+      "Star �",                    //
+      "String Terminator \u009C",  //
+      "Tab �",                     //
+      "Tilde ~",                   //
+      "UP/One Level Up",           //
+      "UP/UP/Two Levels Up",       //
+      "Underscore _",              //
+      "a/DOT/b",                   //
+      "a/UP/b",                    //
+      "u/v/w/x/y/z",               //
+      "~",                         //
+      "�←Backslash2",              //
+      "��server�share�file",       //
+  };
+
+  const std::vector<std::string> got_paths =
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::FILES);
+
+  for (const std::string& path : got_paths) {
+    const bool ok = want_paths.erase(path);
+#ifdef OS_WIN
+    // See crbug.com/1313991: Different versions of Windows treat reserved
+    // Windows filenames differently. No hard error here if there is an
+    // unexpected file.
+    LOG_IF(WARNING, !ok) << "Found unexpected file: " << std::quoted(path);
+#else
+    EXPECT_TRUE(ok) << "Found unexpected file: " << std::quoted(path);
+#endif
+  }
+
+  for (const std::string& path : want_paths) {
+    EXPECT_TRUE(false) << "Cannot find expected file: " << std::quoted(path);
+  }
+
+  EXPECT_THAT(
+      GetRelativePaths(test_dir_, base::FileEnumerator::FileType::DIRECTORIES),
+      UnorderedElementsAreArray({
+          "Empty",
+          "ROOT",
+          "ROOT/Empty",
+          "ROOT/UP",
+          "ROOT/dev",
+          "UP",
+          "UP/UP",
+          "a",
+          "a/DOT",
+          "a/UP",
+          "c",
+          "u",
+          "u/v",
+          "u/v/w",
+          "u/v/w/x",
+          "u/v/w/x/y",
+      }));
 }
 
 TEST_F(ZipTest, UnzipWithDelegates) {
-  auto filter =
-      base::BindRepeating([](const base::FilePath& path) { return true; });
-  auto dir_creator = base::BindRepeating(
-      [](const base::FilePath& extract_dir, const base::FilePath& entry_path) {
-        return base::CreateDirectory(extract_dir.Append(entry_path));
-      },
-      test_dir_);
-  auto writer = base::BindRepeating(
-      [](const base::FilePath& extract_dir, const base::FilePath& entry_path)
-          -> std::unique_ptr<zip::WriterDelegate> {
+  auto dir_creator =
+      base::BindLambdaForTesting([this](const base::FilePath& entry_path) {
+        return base::CreateDirectory(test_dir_.Append(entry_path));
+      });
+  auto writer =
+      base::BindLambdaForTesting([this](const base::FilePath& entry_path)
+                                     -> std::unique_ptr<zip::WriterDelegate> {
         return std::make_unique<zip::FilePathWriterDelegate>(
-            extract_dir.Append(entry_path));
-      },
-      test_dir_);
-  base::FilePath path;
-  ASSERT_TRUE(GetTestDataDirectory(&path));
-  base::File file(path.AppendASCII("test.zip"),
+            test_dir_.Append(entry_path));
+      });
+
+  base::File file(GetDataDirectory().AppendASCII("test.zip"),
                   base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ);
-  ASSERT_TRUE(zip::UnzipWithFilterAndWriters(file.GetPlatformFile(), writer,
-                                             dir_creator, filter, false));
+  EXPECT_TRUE(zip::Unzip(file.GetPlatformFile(), writer, dir_creator));
   base::FilePath dir = test_dir_;
   base::FilePath dir_foo = dir.AppendASCII("foo");
   base::FilePath dir_foo_bar = dir_foo.AppendASCII("bar");
-  ASSERT_TRUE(base::PathExists(dir.AppendASCII("foo.txt")));
-  ASSERT_TRUE(base::PathExists(dir_foo));
-  ASSERT_TRUE(base::PathExists(dir_foo.AppendASCII("bar.txt")));
-  ASSERT_TRUE(base::PathExists(dir_foo_bar));
-  ASSERT_TRUE(base::PathExists(dir_foo_bar.AppendASCII(".hidden")));
-  ASSERT_TRUE(base::PathExists(dir_foo_bar.AppendASCII("baz.txt")));
-  ASSERT_TRUE(base::PathExists(dir_foo_bar.AppendASCII("quux.txt")));
+  EXPECT_TRUE(base::PathExists(dir.AppendASCII("foo.txt")));
+  EXPECT_TRUE(base::DirectoryExists(dir_foo));
+  EXPECT_TRUE(base::PathExists(dir_foo.AppendASCII("bar.txt")));
+  EXPECT_TRUE(base::DirectoryExists(dir_foo_bar));
+  EXPECT_TRUE(base::PathExists(dir_foo_bar.AppendASCII(".hidden")));
+  EXPECT_TRUE(base::PathExists(dir_foo_bar.AppendASCII("baz.txt")));
+  EXPECT_TRUE(base::PathExists(dir_foo_bar.AppendASCII("quux.txt")));
+}
+
+TEST_F(ZipTest, UnzipOnlyDirectories) {
+  auto dir_creator =
+      base::BindLambdaForTesting([this](const base::FilePath& entry_path) {
+        return base::CreateDirectory(test_dir_.Append(entry_path));
+      });
+
+  // Always return a null WriterDelegate.
+  auto writer =
+      base::BindLambdaForTesting([](const base::FilePath& entry_path) {
+        return std::unique_ptr<zip::WriterDelegate>();
+      });
+
+  base::File file(GetDataDirectory().AppendASCII("test.zip"),
+                  base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ);
+  EXPECT_TRUE(zip::Unzip(file.GetPlatformFile(), writer, dir_creator,
+                         {.continue_on_error = true}));
+  base::FilePath dir = test_dir_;
+  base::FilePath dir_foo = dir.AppendASCII("foo");
+  base::FilePath dir_foo_bar = dir_foo.AppendASCII("bar");
+  EXPECT_FALSE(base::PathExists(dir.AppendASCII("foo.txt")));
+  EXPECT_TRUE(base::DirectoryExists(dir_foo));
+  EXPECT_FALSE(base::PathExists(dir_foo.AppendASCII("bar.txt")));
+  EXPECT_TRUE(base::DirectoryExists(dir_foo_bar));
+  EXPECT_FALSE(base::PathExists(dir_foo_bar.AppendASCII(".hidden")));
+  EXPECT_FALSE(base::PathExists(dir_foo_bar.AppendASCII("baz.txt")));
+  EXPECT_FALSE(base::PathExists(dir_foo_bar.AppendASCII("quux.txt")));
+}
+
+// Tests that a ZIP archive containing SJIS-encoded file names can be correctly
+// extracted if the encoding is specified.
+TEST_F(ZipTest, UnzipSjis) {
+  ASSERT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII("SJIS Bug 846195.zip"),
+                         test_dir_, {.encoding = "Shift_JIS"}));
+
+  const base::FilePath dir =
+      test_dir_.Append(base::FilePath::FromUTF8Unsafe("新しいフォルダ"));
+  EXPECT_TRUE(base::DirectoryExists(dir));
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(
+      dir.Append(base::FilePath::FromUTF8Unsafe("SJIS_835C_ソ.txt")),
+      &contents));
+  EXPECT_EQ(
+      "This file's name contains 0x5c (backslash) as the 2nd byte of Japanese "
+      "characater \"\x83\x5c\" when encoded in Shift JIS.",
+      contents);
+
+  ASSERT_TRUE(base::ReadFileToString(dir.Append(base::FilePath::FromUTF8Unsafe(
+                                         "新しいテキスト ドキュメント.txt")),
+                                     &contents));
+  EXPECT_EQ("This file name is coded in Shift JIS in the archive.", contents);
+}
+
+// Tests that a ZIP archive containing SJIS-encoded file names can be extracted
+// even if the encoding is not specified. In this case, file names are
+// interpreted as UTF-8, which leads to garbled names where invalid UTF-8
+// sequences are replaced with the character �. Nevertheless, the files are
+// safely extracted and readable.
+TEST_F(ZipTest, UnzipSjisAsUtf8) {
+  ASSERT_TRUE(zip::Unzip(GetDataDirectory().AppendASCII("SJIS Bug 846195.zip"),
+                         test_dir_));
+
+  EXPECT_FALSE(base::DirectoryExists(
+      test_dir_.Append(base::FilePath::FromUTF8Unsafe("新しいフォルダ"))));
+
+  const base::FilePath dir =
+      test_dir_.Append(base::FilePath::FromUTF8Unsafe("�V�����t�H���_"));
+  EXPECT_TRUE(base::DirectoryExists(dir));
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(
+      dir.Append(base::FilePath::FromUTF8Unsafe("SJIS_835C_��.txt")),
+      &contents));
+  EXPECT_EQ(
+      "This file's name contains 0x5c (backslash) as the 2nd byte of Japanese "
+      "characater \"\x83\x5c\" when encoded in Shift JIS.",
+      contents);
+
+  ASSERT_TRUE(base::ReadFileToString(dir.Append(base::FilePath::FromUTF8Unsafe(
+                                         "�V�����e�L�X�g �h�L�������g.txt")),
+                                     &contents));
+  EXPECT_EQ("This file name is coded in Shift JIS in the archive.", contents);
 }
 
 TEST_F(ZipTest, Zip) {
-  base::FilePath src_dir;
-  ASSERT_TRUE(GetTestDataDirectory(&src_dir));
-  src_dir = src_dir.AppendASCII("test");
+  base::FilePath src_dir = GetDataDirectory().AppendASCII("test");
 
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
@@ -422,9 +1019,7 @@ TEST_F(ZipTest, Zip) {
 }
 
 TEST_F(ZipTest, ZipIgnoreHidden) {
-  base::FilePath src_dir;
-  ASSERT_TRUE(GetTestDataDirectory(&src_dir));
-  src_dir = src_dir.AppendASCII("test");
+  base::FilePath src_dir = GetDataDirectory().AppendASCII("test");
 
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
@@ -435,9 +1030,7 @@ TEST_F(ZipTest, ZipIgnoreHidden) {
 }
 
 TEST_F(ZipTest, ZipNonASCIIDir) {
-  base::FilePath src_dir;
-  ASSERT_TRUE(GetTestDataDirectory(&src_dir));
-  src_dir = src_dir.AppendASCII("test");
+  base::FilePath src_dir = GetDataDirectory().AppendASCII("test");
 
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
@@ -473,11 +1066,9 @@ TEST_F(ZipTest, ZipTimeStamp) {
   TestTimeStamp("02 Jan 2038 23:59:58", VALID_YEAR);
 }
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 TEST_F(ZipTest, ZipFiles) {
-  base::FilePath src_dir;
-  ASSERT_TRUE(GetTestDataDirectory(&src_dir));
-  src_dir = src_dir.AppendASCII("test");
+  base::FilePath src_dir = GetDataDirectory().AppendASCII("test");
 
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
@@ -486,33 +1077,28 @@ TEST_F(ZipTest, ZipFiles) {
   base::File zip_file(zip_name,
                       base::File::FLAG_CREATE | base::File::FLAG_WRITE);
   ASSERT_TRUE(zip_file.IsValid());
-  EXPECT_TRUE(zip::ZipFiles(src_dir, zip_file_list_,
-                            zip_file.GetPlatformFile()));
+  EXPECT_TRUE(
+      zip::ZipFiles(src_dir, zip_file_list_, zip_file.GetPlatformFile()));
   zip_file.Close();
 
   zip::ZipReader reader;
   EXPECT_TRUE(reader.Open(zip_name));
   EXPECT_EQ(zip_file_list_.size(), static_cast<size_t>(reader.num_entries()));
   for (size_t i = 0; i < zip_file_list_.size(); ++i) {
-    EXPECT_TRUE(reader.HasMore());
-    EXPECT_TRUE(reader.OpenCurrentEntryInZip());
-    const zip::ZipReader::EntryInfo* entry_info = reader.current_entry_info();
-    EXPECT_EQ(entry_info->file_path(), zip_file_list_[i]);
-    reader.AdvanceToNextEntry();
+    const zip::ZipReader::Entry* const entry = reader.Next();
+    ASSERT_TRUE(entry);
+    EXPECT_EQ(entry->path, zip_file_list_[i]);
   }
 }
-#endif  // defined(OS_POSIX)
+#endif  // defined(OS_POSIX) || defined(OS_FUCHSIA)
 
 TEST_F(ZipTest, UnzipFilesWithIncorrectSize) {
-  base::FilePath test_data_folder;
-  ASSERT_TRUE(GetTestDataDirectory(&test_data_folder));
-
   // test_mismatch_size.zip contains files with names from 0.txt to 7.txt with
   // sizes from 0 to 7 bytes respectively, but the metadata in the zip file says
   // the uncompressed size is 3 bytes. The ZipReader and minizip code needs to
   // be clever enough to get all the data out.
   base::FilePath test_zip_file =
-      test_data_folder.AppendASCII("test_mismatch_size.zip");
+      GetDataDirectory().AppendASCII("test_mismatch_size.zip");
 
   base::ScopedTempDir scoped_temp_dir;
   ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
@@ -523,8 +1109,8 @@ TEST_F(ZipTest, UnzipFilesWithIncorrectSize) {
 
   for (int i = 0; i < 8; i++) {
     SCOPED_TRACE(base::StringPrintf("Processing %d.txt", i));
-    base::FilePath file_path = temp_dir.AppendASCII(
-        base::StringPrintf("%d.txt", i));
+    base::FilePath file_path =
+        temp_dir.AppendASCII(base::StringPrintf("%d.txt", i));
     int64_t file_size = -1;
     EXPECT_TRUE(base::GetFileSize(file_path, &file_size));
     EXPECT_EQ(static_cast<int64_t>(i), file_size);
@@ -534,26 +1120,309 @@ TEST_F(ZipTest, UnzipFilesWithIncorrectSize) {
 TEST_F(ZipTest, ZipWithFileAccessor) {
   base::FilePath zip_file;
   ASSERT_TRUE(base::CreateTemporaryFile(&zip_file));
-  zip::ZipParams params(base::FilePath(FILE_PATH_LITERAL("/test")), zip_file);
-  params.set_file_accessor(std::make_unique<VirtualFileSystem>());
+  VirtualFileSystem file_accessor;
+  const zip::ZipParams params{.file_accessor = &file_accessor,
+                              .dest_file = zip_file};
   ASSERT_TRUE(zip::Zip(params));
 
   base::ScopedTempDir scoped_temp_dir;
   ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
   const base::FilePath& temp_dir = scoped_temp_dir.GetPath();
   ASSERT_TRUE(zip::Unzip(zip_file, temp_dir));
-  base::FilePath bar_dir = temp_dir.Append(FILE_PATH_LITERAL("bar"));
+  base::FilePath bar_dir = temp_dir.AppendASCII("bar");
   EXPECT_TRUE(base::DirectoryExists(bar_dir));
   std::string file_content;
-  EXPECT_TRUE(base::ReadFileToString(
-      temp_dir.Append(FILE_PATH_LITERAL("foo.txt")), &file_content));
+  EXPECT_TRUE(
+      base::ReadFileToString(temp_dir.AppendASCII("foo.txt"), &file_content));
   EXPECT_EQ(VirtualFileSystem::kFooContent, file_content);
-  EXPECT_TRUE(base::ReadFileToString(
-      bar_dir.Append(FILE_PATH_LITERAL("bar1.txt")), &file_content));
+  EXPECT_TRUE(
+      base::ReadFileToString(bar_dir.AppendASCII("bar1.txt"), &file_content));
   EXPECT_EQ(VirtualFileSystem::kBar1Content, file_content);
-  EXPECT_TRUE(base::ReadFileToString(
-      bar_dir.Append(FILE_PATH_LITERAL("bar2.txt")), &file_content));
+  EXPECT_TRUE(
+      base::ReadFileToString(bar_dir.AppendASCII("bar2.txt"), &file_content));
   EXPECT_EQ(VirtualFileSystem::kBar2Content, file_content);
 }
 
+// Tests progress reporting while zipping files.
+TEST_F(ZipTest, ZipProgress) {
+  base::FilePath src_dir = GetDataDirectory().AppendASCII("test");
+
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+  base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip");
+
+  int progress_count = 0;
+  zip::Progress last_progress;
+
+  zip::ProgressCallback progress_callback =
+      base::BindLambdaForTesting([&](const zip::Progress& progress) {
+        progress_count++;
+        LOG(INFO) << "Progress #" << progress_count << ": " << progress;
+
+        // Progress should only go forwards.
+        EXPECT_GE(progress.bytes, last_progress.bytes);
+        EXPECT_GE(progress.files, last_progress.files);
+        EXPECT_GE(progress.directories, last_progress.directories);
+
+        last_progress = progress;
+        return true;
+      });
+
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir,
+                        .dest_file = zip_file,
+                        .progress_callback = std::move(progress_callback)}));
+
+  EXPECT_EQ(progress_count, 14);
+  EXPECT_EQ(last_progress.bytes, 13546);
+  EXPECT_EQ(last_progress.files, 5);
+  EXPECT_EQ(last_progress.directories, 2);
+
+  TestUnzipFile(zip_file, true);
+}
+
+// Tests throttling of progress reporting while zipping files.
+TEST_F(ZipTest, ZipProgressPeriod) {
+  base::FilePath src_dir = GetDataDirectory().AppendASCII("test");
+
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+  base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip");
+
+  int progress_count = 0;
+  zip::Progress last_progress;
+
+  zip::ProgressCallback progress_callback =
+      base::BindLambdaForTesting([&](const zip::Progress& progress) {
+        progress_count++;
+        LOG(INFO) << "Progress #" << progress_count << ": " << progress;
+
+        // Progress should only go forwards.
+        EXPECT_GE(progress.bytes, last_progress.bytes);
+        EXPECT_GE(progress.files, last_progress.files);
+        EXPECT_GE(progress.directories, last_progress.directories);
+
+        last_progress = progress;
+        return true;
+      });
+
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir,
+                        .dest_file = zip_file,
+                        .progress_callback = std::move(progress_callback),
+                        .progress_period = base::Hours(1)}));
+
+  // We expect only 2 progress reports: the first one, and the last one.
+  EXPECT_EQ(progress_count, 2);
+  EXPECT_EQ(last_progress.bytes, 13546);
+  EXPECT_EQ(last_progress.files, 5);
+  EXPECT_EQ(last_progress.directories, 2);
+
+  TestUnzipFile(zip_file, true);
+}
+
+// Tests cancellation while zipping files.
+TEST_F(ZipTest, ZipCancel) {
+  base::FilePath src_dir = GetDataDirectory().AppendASCII("test");
+
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+  base::FilePath zip_file = temp_dir.GetPath().AppendASCII("out.zip");
+
+  // First: establish the number of possible interruption points.
+  int progress_count = 0;
+
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir,
+                        .dest_file = zip_file,
+                        .progress_callback = base::BindLambdaForTesting(
+                            [&progress_count](const zip::Progress&) {
+                              progress_count++;
+                              return true;
+                            })}));
+
+  EXPECT_EQ(progress_count, 14);
+
+  // Second: exercise each and every interruption point.
+  for (int i = progress_count; i > 0; i--) {
+    int j = 0;
+    EXPECT_FALSE(zip::Zip({.src_dir = src_dir,
+                           .dest_file = zip_file,
+                           .progress_callback = base::BindLambdaForTesting(
+                               [i, &j](const zip::Progress&) {
+                                 j++;
+                                 // Callback shouldn't be called again after
+                                 // having returned false once.
+                                 EXPECT_LE(j, i);
+                                 return j < i;
+                               })}));
+
+    EXPECT_EQ(j, i);
+  }
+}
+
+// Tests zip::internal::GetCompressionMethod()
+TEST_F(ZipTest, GetCompressionMethod) {
+  using zip::internal::GetCompressionMethod;
+  using zip::internal::kDeflated;
+  using zip::internal::kStored;
+
+  EXPECT_EQ(GetCompressionMethod(FP("")), kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("NoExtension")), kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("Folder.zip").Append(FP("NoExtension"))),
+            kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.txt")), kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.zip")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name....zip")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.zip")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("NAME.ZIP")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.gz")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.tar.gz")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.tar")), kDeflated);
+
+  // This one is controversial.
+  EXPECT_EQ(GetCompressionMethod(FP(".zip")), kStored);
+}
+
+// Tests that files put inside a ZIP are effectively compressed.
+TEST_F(ZipTest, Compressed) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input");
+  EXPECT_TRUE(base::CreateDirectory(src_dir));
+
+  // Create some dummy source files.
+  for (const base::StringPiece s : {"foo", "bar.txt", ".hidden"}) {
+    base::File f(src_dir.AppendASCII(s),
+                 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(f.SetLength(5000));
+  }
+
+  // Zip the source files.
+  const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip");
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir,
+                        .dest_file = dest_file,
+                        .include_hidden_files = true}));
+
+  // Since the source files compress well, the destination ZIP file should be
+  // smaller than the source files.
+  int64_t dest_file_size;
+  ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size));
+  EXPECT_GT(dest_file_size, 300);
+  EXPECT_LT(dest_file_size, 1000);
+}
+
+// Tests that a ZIP put inside a ZIP is simply stored instead of being
+// compressed.
+TEST_F(ZipTest, NestedZip) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input");
+  EXPECT_TRUE(base::CreateDirectory(src_dir));
+
+  // Create a dummy ZIP file. This is not a valid ZIP file, but for the purpose
+  // of this test, it doesn't really matter.
+  const int64_t src_size = 5000;
+
+  {
+    base::File f(src_dir.AppendASCII("src.zip"),
+                 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(f.SetLength(src_size));
+  }
+
+  // Zip the dummy ZIP file.
+  const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip");
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir, .dest_file = dest_file}));
+
+  // Since the dummy source (inner) ZIP file should simply be stored in the
+  // destination (outer) ZIP file, the destination file should be bigger than
+  // the source file, but not much bigger.
+  int64_t dest_file_size;
+  ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size));
+  EXPECT_GT(dest_file_size, src_size + 100);
+  EXPECT_LT(dest_file_size, src_size + 300);
+}
+
+// Tests that there is no 2GB or 4GB limits. Tests that big files can be zipped
+// (crbug.com/1207737) and that big ZIP files can be created
+// (crbug.com/1221447). Tests that the big ZIP can be opened, that its entries
+// are correctly enumerated (crbug.com/1298347), and that the big file can be
+// extracted.
+//
+// Because this test is dealing with big files, it tends to take a lot of disk
+// space and time (crbug.com/1299736). Therefore, it only gets run on a few bots
+// (ChromeOS and Windows).
+//
+// This test is too slow with TSAN.
+// OS Fuchsia does not seem to support large files.
+// Some 32-bit Android waterfall and CQ try bots are running out of space when
+// performing this test (android-asan, android-11-x86-rel,
+// android-marshmallow-x86-rel-non-cq).
+// Some Mac, Linux and Debug (dbg) bots tend to time out when performing this
+// test (crbug.com/1299736, crbug.com/1300448, crbug.com/1369958).
+#if defined(THREAD_SANITIZER) || BUILDFLAG(IS_FUCHSIA) ||                \
+    BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || !defined(NDEBUG)
+TEST_F(ZipTest, DISABLED_BigFile) {
+#else
+TEST_F(ZipTest, BigFile) {
+#endif
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input");
+  EXPECT_TRUE(base::CreateDirectory(src_dir));
+
+  // Create a big dummy ZIP file. This is not a valid ZIP file, but for the
+  // purpose of this test, it doesn't really matter.
+  const int64_t src_size = 5'000'000'000;
+
+  const base::FilePath src_file = src_dir.AppendASCII("src.zip");
+  LOG(INFO) << "Creating big file " << src_file;
+  {
+    base::File f(src_file, base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(f.SetLength(src_size));
+  }
+
+  // Zip the dummy ZIP file.
+  const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip");
+  LOG(INFO) << "Zipping big file into " << dest_file;
+  zip::ProgressCallback progress_callback =
+      base::BindLambdaForTesting([&](const zip::Progress& progress) {
+        LOG(INFO) << "Zipping... " << std::setw(3)
+                  << (100 * progress.bytes / src_size) << "%";
+        return true;
+      });
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir,
+                        .dest_file = dest_file,
+                        .progress_callback = std::move(progress_callback),
+                        .progress_period = base::Seconds(1)}));
+
+  // Since the dummy source (inner) ZIP file should simply be stored in the
+  // destination (outer) ZIP file, the destination file should be bigger than
+  // the source file, but not much bigger.
+  int64_t dest_file_size;
+  ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size));
+  EXPECT_GT(dest_file_size, src_size + 100);
+  EXPECT_LT(dest_file_size, src_size + 300);
+
+  LOG(INFO) << "Reading big ZIP " << dest_file;
+  zip::ZipReader reader;
+  ASSERT_TRUE(reader.Open(dest_file));
+
+  const zip::ZipReader::Entry* const entry = reader.Next();
+  ASSERT_TRUE(entry);
+  EXPECT_EQ(FP("src.zip"), entry->path);
+  EXPECT_EQ(src_size, entry->original_size);
+  EXPECT_FALSE(entry->is_directory);
+  EXPECT_FALSE(entry->is_encrypted);
+
+  ProgressWriterDelegate writer(src_size);
+  EXPECT_TRUE(reader.ExtractCurrentEntry(&writer,
+                                         std::numeric_limits<uint64_t>::max()));
+  EXPECT_EQ(src_size, writer.received_bytes());
+
+  EXPECT_FALSE(reader.Next());
+  EXPECT_TRUE(reader.ok());
+}
+
 }  // namespace
diff --git a/deps/zlib/google/zip_writer.cc b/deps/zlib/google/zip_writer.cc
index 1f2f073b30cb32..31161ae86c3b7a 100644
--- a/deps/zlib/google/zip_writer.cc
+++ b/deps/zlib/google/zip_writer.cc
@@ -1,203 +1,308 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #include "third_party/zlib/google/zip_writer.h"
 
+#include <algorithm>
+
 #include "base/files/file.h"
+#include "base/logging.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
+#include "third_party/zlib/google/redact.h"
 #include "third_party/zlib/google/zip_internal.h"
 
 namespace zip {
 namespace internal {
 
-namespace {
+bool ZipWriter::ShouldContinue() {
+  if (!progress_callback_)
+    return true;
+
+  const base::TimeTicks now = base::TimeTicks::Now();
+  if (next_progress_report_time_ > now)
+    return true;
+
+  next_progress_report_time_ = now + progress_period_;
+  if (progress_callback_.Run(progress_))
+    return true;
 
-// Numbers of pending entries that trigger writting them to the ZIP file.
-constexpr size_t kMaxPendingEntriesCount = 50;
+  LOG(ERROR) << "Cancelling ZIP creation";
+  return false;
+}
 
-bool AddFileContentToZip(zipFile zip_file,
-                         base::File file,
-                         const base::FilePath& file_path) {
-  int num_bytes;
+bool ZipWriter::AddFileContent(const base::FilePath& path, base::File file) {
   char buf[zip::internal::kZipBufSize];
-  do {
-    num_bytes = file.ReadAtCurrentPos(buf, zip::internal::kZipBufSize);
 
-    if (num_bytes > 0) {
-      if (zipWriteInFileInZip(zip_file, buf, num_bytes) != ZIP_OK) {
-        DLOG(ERROR) << "Could not write data to zip for path "
-                    << file_path.value();
-        return false;
-      }
+  while (ShouldContinue()) {
+    const int num_bytes =
+        file.ReadAtCurrentPos(buf, zip::internal::kZipBufSize);
+
+    if (num_bytes < 0) {
+      PLOG(ERROR) << "Cannot read file " << Redact(path);
+      return false;
     }
-  } while (num_bytes > 0);
 
-  return true;
+    if (num_bytes == 0)
+      return true;
+
+    if (zipWriteInFileInZip(zip_file_, buf, num_bytes) != ZIP_OK) {
+      PLOG(ERROR) << "Cannot write data from file " << Redact(path)
+                  << " to ZIP";
+      return false;
+    }
+
+    progress_.bytes += num_bytes;
+  }
+
+  return false;
 }
 
-bool OpenNewFileEntry(zipFile zip_file,
-                      const base::FilePath& path,
-                      bool is_directory,
-                      base::Time last_modified) {
+bool ZipWriter::OpenNewFileEntry(const base::FilePath& path,
+                                 bool is_directory,
+                                 base::Time last_modified) {
   std::string str_path = path.AsUTF8Unsafe();
+
 #if defined(OS_WIN)
   base::ReplaceSubstringsAfterOffset(&str_path, 0u, "\\", "/");
 #endif
-  if (is_directory)
+
+  Compression compression = kDeflated;
+
+  if (is_directory) {
     str_path += "/";
+  } else {
+    compression = GetCompressionMethod(path);
+  }
 
-  return zip::internal::ZipOpenNewFileInZip(zip_file, str_path, last_modified);
+  return zip::internal::ZipOpenNewFileInZip(zip_file_, str_path, last_modified,
+                                            compression);
 }
 
-bool CloseNewFileEntry(zipFile zip_file) {
-  return zipCloseFileInZip(zip_file) == ZIP_OK;
+bool ZipWriter::CloseNewFileEntry() {
+  return zipCloseFileInZip(zip_file_) == ZIP_OK;
 }
 
-bool AddFileEntryToZip(zipFile zip_file,
-                       const base::FilePath& path,
-                       base::File file) {
-  base::File::Info file_info;
-  if (!file.GetInfo(&file_info))
+bool ZipWriter::AddFileEntry(const base::FilePath& path, base::File file) {
+  base::File::Info info;
+  if (!file.GetInfo(&info))
     return false;
 
-  if (!OpenNewFileEntry(zip_file, path, /*is_directory=*/false,
-                        file_info.last_modified))
+  if (!OpenNewFileEntry(path, /*is_directory=*/false, info.last_modified))
     return false;
 
-  bool success = AddFileContentToZip(zip_file, std::move(file), path);
-  if (!CloseNewFileEntry(zip_file))
+  if (!AddFileContent(path, std::move(file)))
     return false;
 
-  return success;
+  progress_.files++;
+  return CloseNewFileEntry();
 }
 
-bool AddDirectoryEntryToZip(zipFile zip_file,
-                            const base::FilePath& path,
-                            base::Time last_modified) {
-  return OpenNewFileEntry(zip_file, path, /*is_directory=*/true,
-                          last_modified) &&
-         CloseNewFileEntry(zip_file);
-}
+bool ZipWriter::AddDirectoryEntry(const base::FilePath& path) {
+  FileAccessor::Info info;
+  if (!file_accessor_->GetInfo(path, &info) || !info.is_directory) {
+    LOG(ERROR) << "Not a directory: " << Redact(path);
+    progress_.errors++;
+    return continue_on_error_;
+  }
 
-}  // namespace
+  if (!OpenNewFileEntry(path, /*is_directory=*/true, info.last_modified))
+    return false;
+
+  if (!CloseNewFileEntry())
+    return false;
 
-#if defined(OS_POSIX)
+  progress_.directories++;
+  if (!ShouldContinue())
+    return false;
+
+  if (!recursive_)
+    return true;
+
+  return AddDirectoryContents(path);
+}
+
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 // static
 std::unique_ptr<ZipWriter> ZipWriter::CreateWithFd(
     int zip_file_fd,
-    const base::FilePath& root_dir,
     FileAccessor* file_accessor) {
   DCHECK(zip_file_fd != base::kInvalidPlatformFile);
   zipFile zip_file =
       internal::OpenFdForZipping(zip_file_fd, APPEND_STATUS_CREATE);
+
   if (!zip_file) {
-    DLOG(ERROR) << "Couldn't create ZIP file for FD " << zip_file_fd;
+    DLOG(ERROR) << "Cannot create ZIP file for FD " << zip_file_fd;
     return nullptr;
   }
-  return std::unique_ptr<ZipWriter>(
-      new ZipWriter(zip_file, root_dir, file_accessor));
+
+  return std::unique_ptr<ZipWriter>(new ZipWriter(zip_file, file_accessor));
 }
 #endif
 
 // static
 std::unique_ptr<ZipWriter> ZipWriter::Create(
     const base::FilePath& zip_file_path,
-    const base::FilePath& root_dir,
     FileAccessor* file_accessor) {
   DCHECK(!zip_file_path.empty());
   zipFile zip_file = internal::OpenForZipping(zip_file_path.AsUTF8Unsafe(),
                                               APPEND_STATUS_CREATE);
+
   if (!zip_file) {
-    DLOG(ERROR) << "Couldn't create ZIP file at path " << zip_file_path;
+    PLOG(ERROR) << "Cannot create ZIP file " << Redact(zip_file_path);
     return nullptr;
   }
-  return std::unique_ptr<ZipWriter>(
-      new ZipWriter(zip_file, root_dir, file_accessor));
-}
-
-ZipWriter::ZipWriter(zipFile zip_file,
-                     const base::FilePath& root_dir,
-                     FileAccessor* file_accessor)
-    : zip_file_(zip_file), root_dir_(root_dir), file_accessor_(file_accessor) {}
 
-ZipWriter::~ZipWriter() {
-  DCHECK(pending_entries_.empty());
+  return std::unique_ptr<ZipWriter>(new ZipWriter(zip_file, file_accessor));
 }
 
-bool ZipWriter::WriteEntries(const std::vector<base::FilePath>& paths) {
-  return AddEntries(paths) && Close();
-}
+ZipWriter::ZipWriter(zipFile zip_file, FileAccessor* file_accessor)
+    : zip_file_(zip_file), file_accessor_(file_accessor) {}
 
-bool ZipWriter::AddEntries(const std::vector<base::FilePath>& paths) {
-  DCHECK(zip_file_);
-  pending_entries_.insert(pending_entries_.end(), paths.begin(), paths.end());
-  return FlushEntriesIfNeeded(/*force=*/false);
+ZipWriter::~ZipWriter() {
+  if (zip_file_)
+    zipClose(zip_file_, nullptr);
 }
 
 bool ZipWriter::Close() {
-  bool success = FlushEntriesIfNeeded(/*force=*/true) &&
-                 zipClose(zip_file_, nullptr) == ZIP_OK;
+  const bool success = zipClose(zip_file_, nullptr) == ZIP_OK;
   zip_file_ = nullptr;
+
+  // Call the progress callback one last time with the final progress status.
+  if (progress_callback_ && !progress_callback_.Run(progress_)) {
+    LOG(ERROR) << "Cancelling ZIP creation at the end";
+    return false;
+  }
+
   return success;
 }
 
-bool ZipWriter::FlushEntriesIfNeeded(bool force) {
-  if (pending_entries_.size() < kMaxPendingEntriesCount && !force)
-    return true;
+bool ZipWriter::AddMixedEntries(Paths paths) {
+  // Pointers to directory paths in |paths|.
+  std::vector<const base::FilePath*> directories;
 
-  while (pending_entries_.size() >= kMaxPendingEntriesCount ||
-         (force && !pending_entries_.empty())) {
-    size_t entry_count =
-        std::min(pending_entries_.size(), kMaxPendingEntriesCount);
-    std::vector<base::FilePath> relative_paths;
-    std::vector<base::FilePath> absolute_paths;
-    relative_paths.insert(relative_paths.begin(), pending_entries_.begin(),
-                          pending_entries_.begin() + entry_count);
-    for (auto iter = pending_entries_.begin();
-         iter != pending_entries_.begin() + entry_count; ++iter) {
-      // The FileAccessor requires absolute paths.
-      absolute_paths.push_back(root_dir_.Append(*iter));
-    }
-    pending_entries_.erase(pending_entries_.begin(),
-                           pending_entries_.begin() + entry_count);
-
-    // We don't know which paths are files and which ones are directories, and
-    // we want to avoid making a call to file_accessor_ for each entry. Open the
-    // files instead, invalid files are returned for directories.
-    std::vector<base::File> files =
-        file_accessor_->OpenFilesForReading(absolute_paths);
-    DCHECK_EQ(files.size(), relative_paths.size());
-    for (size_t i = 0; i < files.size(); i++) {
+  // Declared outside loop to reuse internal buffer.
+  std::vector<base::File> files;
+
+  // First pass. We don't know which paths are files and which ones are
+  // directories, and we want to avoid making a call to file_accessor_ for each
+  // path. Try to open all of the paths as files. We'll get invalid file
+  // descriptors for directories, and we'll process these directories in the
+  // second pass.
+  while (!paths.empty()) {
+    // Work with chunks of 50 paths at most.
+    const size_t n = std::min<size_t>(paths.size(), 50);
+    const Paths relative_paths = paths.subspan(0, n);
+    paths = paths.subspan(n, paths.size() - n);
+
+    files.clear();
+    if (!file_accessor_->Open(relative_paths, &files) || files.size() != n)
+      return false;
+
+    for (size_t i = 0; i < n; i++) {
       const base::FilePath& relative_path = relative_paths[i];
-      const base::FilePath& absolute_path = absolute_paths[i];
-      base::File file = std::move(files[i]);
+      DCHECK(!relative_path.empty());
+      base::File& file = files[i];
+
       if (file.IsValid()) {
-        if (!AddFileEntryToZip(zip_file_, relative_path, std::move(file))) {
-          LOG(ERROR) << "Failed to write file " << relative_path.value()
-                     << " to ZIP file.";
+        // It's a file.
+        if (!AddFileEntry(relative_path, std::move(file)))
           return false;
-        }
       } else {
-        // Missing file or directory case.
-        base::Time last_modified =
-            file_accessor_->GetLastModifiedTime(absolute_path);
-        if (last_modified.is_null()) {
-          LOG(ERROR) << "Failed to write entry " << relative_path.value()
-                     << " to ZIP file.";
-          return false;
-        }
-        DCHECK(file_accessor_->DirectoryExists(absolute_path));
-        if (!AddDirectoryEntryToZip(zip_file_, relative_path, last_modified)) {
-          LOG(ERROR) << "Failed to write directory " << relative_path.value()
-                     << " to ZIP file.";
-          return false;
-        }
+        // It's probably a directory. Remember its path for the second pass.
+        directories.push_back(&relative_path);
       }
     }
   }
+
+  // Second pass for directories discovered during the first pass.
+  for (const base::FilePath* const path : directories) {
+    DCHECK(path);
+    if (!AddDirectoryEntry(*path))
+      return false;
+  }
+
   return true;
 }
 
+bool ZipWriter::AddFileEntries(Paths paths) {
+  // Declared outside loop to reuse internal buffer.
+  std::vector<base::File> files;
+
+  while (!paths.empty()) {
+    // Work with chunks of 50 paths at most.
+    const size_t n = std::min<size_t>(paths.size(), 50);
+    const Paths relative_paths = paths.subspan(0, n);
+    paths = paths.subspan(n, paths.size() - n);
+
+    DCHECK_EQ(relative_paths.size(), n);
+
+    files.clear();
+    if (!file_accessor_->Open(relative_paths, &files) || files.size() != n)
+      return false;
+
+    for (size_t i = 0; i < n; i++) {
+      const base::FilePath& relative_path = relative_paths[i];
+      DCHECK(!relative_path.empty());
+      base::File& file = files[i];
+
+      if (!file.IsValid()) {
+        LOG(ERROR) << "Cannot open " << Redact(relative_path);
+        progress_.errors++;
+
+        if (continue_on_error_)
+          continue;
+
+        return false;
+      }
+
+      if (!AddFileEntry(relative_path, std::move(file)))
+        return false;
+    }
+  }
+
+  return true;
+}
+
+bool ZipWriter::AddDirectoryEntries(Paths paths) {
+  for (const base::FilePath& path : paths) {
+    if (!AddDirectoryEntry(path))
+      return false;
+  }
+
+  return true;
+}
+
+bool ZipWriter::AddDirectoryContents(const base::FilePath& path) {
+  std::vector<base::FilePath> files, subdirs;
+
+  if (!file_accessor_->List(path, &files, &subdirs)) {
+    progress_.errors++;
+    return continue_on_error_;
+  }
+
+  Filter(&files);
+  Filter(&subdirs);
+
+  if (!AddFileEntries(files))
+    return false;
+
+  return AddDirectoryEntries(subdirs);
+}
+
+void ZipWriter::Filter(std::vector<base::FilePath>* const paths) {
+  DCHECK(paths);
+
+  if (!filter_callback_)
+    return;
+
+  const auto end = std::remove_if(paths->begin(), paths->end(),
+                                  [this](const base::FilePath& path) {
+                                    return !filter_callback_.Run(path);
+                                  });
+  paths->erase(end, paths->end());
+}
+
 }  // namespace internal
 }  // namespace zip
diff --git a/deps/zlib/google/zip_writer.h b/deps/zlib/google/zip_writer.h
index bd2a727b94d408..dd109293da0a4f 100644
--- a/deps/zlib/google/zip_writer.h
+++ b/deps/zlib/google/zip_writer.h
@@ -1,4 +1,4 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/files/file_path.h"
+#include "base/time/time.h"
 #include "build/build_config.h"
 #include "third_party/zlib/google/zip.h"
 
@@ -28,64 +29,126 @@ namespace internal {
 // performance reasons as these calls may be expensive when IPC based).
 // This class is so far internal and only used by zip.cc, but could be made
 // public if needed.
+//
+// All methods returning a bool return true on success and false on error.
 class ZipWriter {
  public:
-// Creates a writer that will write a ZIP file to |zip_file_fd|/|zip_file|
-// and which entries (specifies with AddEntries) are relative to |root_dir|.
+// Creates a writer that will write a ZIP file to |zip_file_fd| or |zip_file|
+// and which entries are relative to |file_accessor|'s source directory.
 // All file reads are performed using |file_accessor|.
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
   static std::unique_ptr<ZipWriter> CreateWithFd(int zip_file_fd,
-                                                 const base::FilePath& root_dir,
                                                  FileAccessor* file_accessor);
 #endif
+
   static std::unique_ptr<ZipWriter> Create(const base::FilePath& zip_file,
-                                           const base::FilePath& root_dir,
                                            FileAccessor* file_accessor);
+
+  ZipWriter(const ZipWriter&) = delete;
+  ZipWriter& operator=(const ZipWriter&) = delete;
+
   ~ZipWriter();
 
-  // Writes the files at |paths| to the ZIP file and closes this Zip file.
-  // Note that the the FilePaths must be relative to |root_dir| specified in the
-  // Create method.
-  // Returns true if all entries were written successfuly.
-  bool WriteEntries(const std::vector<base::FilePath>& paths);
+  // Sets the optional progress callback. The callback is called once for each
+  // time |period|. The final callback is always called when the ZIP operation
+  // completes.
+  void SetProgressCallback(ProgressCallback callback, base::TimeDelta period) {
+    progress_callback_ = std::move(callback);
+    progress_period_ = std::move(period);
+  }
+
+  // Should ignore missing files and directories?
+  void ContinueOnError(bool continue_on_error) {
+    continue_on_error_ = continue_on_error;
+  }
+
+  // Sets the recursive flag, indicating whether the contents of subdirectories
+  // should be included.
+  void SetRecursive(bool b) { recursive_ = b; }
+
+  // Sets the filter callback.
+  void SetFilterCallback(FilterCallback callback) {
+    filter_callback_ = std::move(callback);
+  }
+
+  // Adds the contents of a directory. If the recursive flag is set, the
+  // contents of subdirectories are also added.
+  bool AddDirectoryContents(const base::FilePath& path);
+
+  // Adds the entries at |paths| to the ZIP file. These can be a mixed bag of
+  // files and directories. If the recursive flag is set, the contents of
+  // subdirectories is also added.
+  bool AddMixedEntries(Paths paths);
+
+  // Closes the ZIP file.
+  bool Close();
 
  private:
-  ZipWriter(zipFile zip_file,
-            const base::FilePath& root_dir,
-            FileAccessor* file_accessor);
+  // Takes ownership of |zip_file|.
+  ZipWriter(zipFile zip_file, FileAccessor* file_accessor);
 
-  // Writes the pending entries to the ZIP file if there are at least
-  // |kMaxPendingEntriesCount| of them. If |force| is true, all pending entries
-  // are written regardless of how many there are.
-  // Returns false if writing an entry fails, true if no entry was written or
-  // there was no error writing entries.
-  bool FlushEntriesIfNeeded(bool force);
+  // Regularly called during processing to check whether zipping should continue
+  // or should be cancelled.
+  bool ShouldContinue();
 
-  // Adds the files at |paths| to the ZIP file. These FilePaths must be relative
-  // to |root_dir| specified in the Create method.
-  bool AddEntries(const std::vector<base::FilePath>& paths);
+  // Adds file content to currently open file entry.
+  bool AddFileContent(const base::FilePath& path, base::File file);
 
-  // Closes the ZIP file.
-  // Returns true if successful, false otherwise (typically if an entry failed
-  // to be written).
-  bool Close();
+  // Adds a file entry (including file contents).
+  bool AddFileEntry(const base::FilePath& path, base::File file);
+
+  // Adds file entries. All the paths should be existing files.
+  bool AddFileEntries(Paths paths);
+
+  // Adds a directory entry. If the recursive flag is set, the contents of this
+  // directory are also added.
+  bool AddDirectoryEntry(const base::FilePath& path);
 
-  // The entries that have been added but not yet written to the ZIP file.
-  std::vector<base::FilePath> pending_entries_;
+  // Adds directory entries. All the paths should be existing directories. If
+  // the recursive flag is set, the contents of these directories are also
+  // added.
+  bool AddDirectoryEntries(Paths paths);
+
+  // Opens a file or directory entry.
+  bool OpenNewFileEntry(const base::FilePath& path,
+                        bool is_directory,
+                        base::Time last_modified);
+
+  // Closes the currently open entry.
+  bool CloseNewFileEntry();
+
+  // Filters entries.
+  void Filter(std::vector<base::FilePath>* paths);
 
   // The actual zip file.
   zipFile zip_file_;
 
-  // Path to the directory entry paths are relative to.
-  base::FilePath root_dir_;
-
   // Abstraction over file access methods used to read files.
-  FileAccessor* file_accessor_;
+  FileAccessor* const file_accessor_;
+
+  // Progress stats.
+  Progress progress_;
+
+  // Optional progress callback.
+  ProgressCallback progress_callback_;
+
+  // Optional progress reporting period.
+  base::TimeDelta progress_period_;
+
+  // Next time to report progress.
+  base::TimeTicks next_progress_report_time_ = base::TimeTicks::Now();
+
+  // Filter used to exclude files from the ZIP file.
+  FilterCallback filter_callback_;
+
+  // Should recursively add directories?
+  bool recursive_ = false;
 
-  DISALLOW_COPY_AND_ASSIGN(ZipWriter);
+  // Should ignore missing files and directories?
+  bool continue_on_error_ = false;
 };
 
 }  // namespace internal
 }  // namespace zip
 
-#endif  // THIRD_PARTY_ZLIB_GOOGLE_ZIP_WRITER_H_
\ No newline at end of file
+#endif  // THIRD_PARTY_ZLIB_GOOGLE_ZIP_WRITER_H_
diff --git a/deps/zlib/gzguts.h b/deps/zlib/gzguts.h
index 990a4d25149337..57faf37165a354 100644
--- a/deps/zlib/gzguts.h
+++ b/deps/zlib/gzguts.h
@@ -1,5 +1,5 @@
 /* gzguts.h -- zlib internal header definitions for gz* operations
- * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
+ * Copyright (C) 2004-2019 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -39,7 +39,7 @@
 #  include <io.h>
 #endif
 
-#if defined(_WIN32) || defined(__CYGWIN__)
+#if defined(_WIN32)
 #  define WIDECHAR
 #endif
 
@@ -190,6 +190,7 @@ typedef struct {
         /* just for writing */
     int level;              /* compression level */
     int strategy;           /* compression strategy */
+    int reset;              /* true if a reset is pending after a Z_FINISH */
         /* seek request */
     z_off64_t skip;         /* amount to skip (already rewound if backwards) */
     int seek;               /* true if seek request pending */
diff --git a/deps/zlib/gzlib.c b/deps/zlib/gzlib.c
index 4105e6aff92594..55da46a453fd18 100644
--- a/deps/zlib/gzlib.c
+++ b/deps/zlib/gzlib.c
@@ -1,11 +1,11 @@
 /* gzlib.c -- zlib functions common to reading and writing gzip files
- * Copyright (C) 2004-2017 Mark Adler
+ * Copyright (C) 2004-2019 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
 #include "gzguts.h"
 
-#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__)
+#if defined(_WIN32) && !defined(__BORLANDC__)
 #  define LSEEK _lseeki64
 #else
 #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
@@ -30,7 +30,7 @@ local gzFile gz_open OF((const void *, int, const char *));
 
    The gz_strwinerror function does not change the current setting of
    GetLastError. */
-char ZLIB_INTERNAL *gz_strwinerror (error)
+char ZLIB_INTERNAL *gz_strwinerror(error)
      DWORD error;
 {
     static char buf[1024];
@@ -81,6 +81,8 @@ local void gz_reset(state)
         state->past = 0;            /* have not read past end yet */
         state->how = LOOK;          /* look for gzip header */
     }
+    else                            /* for writing ... */
+        state->reset = 0;           /* no deflateReset pending */
     state->seek = 0;                /* no seek request pending */
     gz_error(state, Z_OK, NULL);    /* clear error */
     state->x.pos = 0;               /* no uncompressed data yet */
@@ -397,7 +399,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
     /* if within raw area while reading, just go there */
     if (state->mode == GZ_READ && state->how == COPY &&
             state->x.pos + offset >= 0) {
-        ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);
+        ret = LSEEK(state->fd, offset - (z_off64_t)state->x.have, SEEK_CUR);
         if (ret == -1)
             return -1;
         state->x.have = 0;
diff --git a/deps/zlib/gzread.c b/deps/zlib/gzread.c
index 832d3ef98c5948..9449a79289b437 100644
--- a/deps/zlib/gzread.c
+++ b/deps/zlib/gzread.c
@@ -1,5 +1,5 @@
 /* gzread.c -- zlib functions for reading gzip files
- * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
+ * Copyright (C) 2004-2017 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -157,11 +157,9 @@ local int gz_look(state)
        the output buffer is larger than the input buffer, which also assures
        space for gzungetc() */
     state->x.next = state->out;
-    if (strm->avail_in) {
-        memcpy(state->x.next, strm->next_in, strm->avail_in);
-        state->x.have = strm->avail_in;
-        strm->avail_in = 0;
-    }
+    memcpy(state->x.next, strm->next_in, strm->avail_in);
+    state->x.have = strm->avail_in;
+    strm->avail_in = 0;
     state->how = COPY;
     state->direct = 1;
     return 0;
@@ -314,9 +312,9 @@ local z_size_t gz_read(state, buf, len)
     got = 0;
     do {
         /* set n to the maximum amount of len that fits in an unsigned int */
-        n = -1;
+        n = (unsigned)-1;
         if (n > len)
-            n = len;
+            n = (unsigned)len;
 
         /* first just try copying data from the output buffer */
         if (state->x.have) {
@@ -397,7 +395,7 @@ int ZEXPORT gzread(file, buf, len)
     }
 
     /* read len or fewer bytes to buf */
-    len = gz_read(state, buf, len);
+    len = (unsigned)gz_read(state, buf, len);
 
     /* check for an error */
     if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR)
@@ -451,7 +449,6 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file)
 int ZEXPORT gzgetc(file)
     gzFile file;
 {
-    int ret;
     unsigned char buf[1];
     gz_statep state;
 
@@ -473,8 +470,7 @@ int ZEXPORT gzgetc(file)
     }
 
     /* nothing there -- try gz_read() */
-    ret = gz_read(state, buf, 1);
-    return ret < 1 ? -1 : buf[0];
+    return gz_read(state, buf, 1) < 1 ? -1 : buf[0];
 }
 
 int ZEXPORT gzgetc_(file)
diff --git a/deps/zlib/gzwrite.c b/deps/zlib/gzwrite.c
index c7b5651d70b994..eb8a0e5893ff6a 100644
--- a/deps/zlib/gzwrite.c
+++ b/deps/zlib/gzwrite.c
@@ -1,5 +1,5 @@
 /* gzwrite.c -- zlib functions for writing gzip files
- * Copyright (C) 2004-2017 Mark Adler
+ * Copyright (C) 2004-2019 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -97,6 +97,15 @@ local int gz_comp(state, flush)
         return 0;
     }
 
+    /* check for a pending reset */
+    if (state->reset) {
+        /* don't start a new gzip member unless there is data to write */
+        if (strm->avail_in == 0)
+            return 0;
+        deflateReset(strm);
+        state->reset = 0;
+    }
+
     /* run deflate() on provided input until it produces no more output */
     ret = Z_OK;
     do {
@@ -134,7 +143,7 @@ local int gz_comp(state, flush)
 
     /* if that completed a deflate stream, allow another to start */
     if (flush == Z_FINISH)
-        deflateReset(strm);
+        state->reset = 1;
 
     /* all done, no errors */
     return 0;
@@ -209,7 +218,7 @@ local z_size_t gz_write(state, buf, len)
                               state->in);
             copy = state->size - have;
             if (copy > len)
-                copy = len;
+                copy = (unsigned)len;
             memcpy(state->in + have, buf, copy);
             state->strm.avail_in += copy;
             state->x.pos += copy;
@@ -229,7 +238,7 @@ local z_size_t gz_write(state, buf, len)
         do {
             unsigned n = (unsigned)-1;
             if (n > len)
-                n = len;
+                n = (unsigned)len;
             state->strm.avail_in = n;
             state->x.pos += n;
             if (gz_comp(state, Z_NO_FLUSH) == -1)
@@ -349,12 +358,11 @@ int ZEXPORT gzputc(file, c)
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzputs(file, str)
+int ZEXPORT gzputs(file, s)
     gzFile file;
-    const char *str;
+    const char *s;
 {
-    int ret;
-    z_size_t len;
+    z_size_t len, put;
     gz_statep state;
 
     /* get internal structure */
@@ -367,9 +375,13 @@ int ZEXPORT gzputs(file, str)
         return -1;
 
     /* write string */
-    len = strlen(str);
-    ret = gz_write(state, str, len);
-    return ret == 0 && len != 0 ? -1 : ret;
+    len = strlen(s);
+    if ((int)len < 0 || (unsigned)len != len) {
+        gz_error(state, Z_STREAM_ERROR, "string length does not fit in int");
+        return -1;
+    }
+    put = gz_write(state, s, len);
+    return put < len ? -1 : (int)len;
 }
 
 #if defined(STDC) || defined(Z_HAVE_STDARG_H)
@@ -441,7 +453,7 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
         strm->avail_in = state->size;
         if (gz_comp(state, Z_NO_FLUSH) == -1)
             return state->err;
-        memcpy(state->in, state->in + state->size, left);
+        memmove(state->in, state->in + state->size, left);
         strm->next_in = state->in;
         strm->avail_in = left;
     }
@@ -462,7 +474,7 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
 #else /* !STDC && !Z_HAVE_STDARG_H */
 
 /* -- see zlib.h -- */
-int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
+int ZEXPORTVA gzprintf(file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
                        a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
     gzFile file;
     const char *format;
@@ -540,7 +552,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
         strm->avail_in = state->size;
         if (gz_comp(state, Z_NO_FLUSH) == -1)
             return state->err;
-        memcpy(state->in, state->in + state->size, left);
+        memmove(state->in, state->in + state->size, left);
         strm->next_in = state->in;
         strm->avail_in = left;
     }
diff --git a/deps/zlib/infback.c b/deps/zlib/infback.c
index aab14b4848effa..cba8fda6fd40ce 100644
--- a/deps/zlib/infback.c
+++ b/deps/zlib/infback.c
@@ -1,5 +1,5 @@
 /* infback.c -- inflate using a call-back interface
- * Copyright (C) 1995-2016 Mark Adler
+ * Copyright (C) 1995-2022 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -66,6 +66,7 @@ int stream_size;
     state->window = window;
     state->wnext = 0;
     state->whave = 0;
+    state->sane = 1;
     return Z_OK;
 }
 
@@ -454,11 +455,11 @@ void FAR *out_desc;
             }
 
             /* build code tables -- note: do not change the lenbits or distbits
-               values here (9 and 6) without reading the comments in inftrees.h
+               values here (10 and 9) without reading the comments in inftrees.h
                concerning the ENOUGH constants, which depend on those values */
             state->next = state->codes;
             state->lencode = (code const FAR *)(state->next);
-            state->lenbits = 9;
+            state->lenbits = 10;
             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
                                 &(state->lenbits), state->work);
             if (ret) {
@@ -467,7 +468,7 @@ void FAR *out_desc;
                 break;
             }
             state->distcode = (code const FAR *)(state->next);
-            state->distbits = 6;
+            state->distbits = 9;
             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
                             &(state->next), &(state->distbits), state->work);
             if (ret) {
@@ -477,6 +478,7 @@ void FAR *out_desc;
             }
             Tracev((stderr, "inflate:       codes ok\n"));
             state->mode = LEN;
+                /* fallthrough */
 
         case LEN:
             /* use inflate_fast() if we have enough input and output */
@@ -605,25 +607,27 @@ void FAR *out_desc;
             break;
 
         case DONE:
-            /* inflate stream terminated properly -- write leftover output */
+            /* inflate stream terminated properly */
             ret = Z_STREAM_END;
-            if (left < state->wsize) {
-                if (out(out_desc, state->window, state->wsize - left))
-                    ret = Z_BUF_ERROR;
-            }
             goto inf_leave;
 
         case BAD:
             ret = Z_DATA_ERROR;
             goto inf_leave;
 
-        default:                /* can't happen, but makes compilers happy */
+        default:
+            /* can't happen, but makes compilers happy */
             ret = Z_STREAM_ERROR;
             goto inf_leave;
         }
 
-    /* Return unused input */
+    /* Write leftover output and return unused input */
   inf_leave:
+    if (left < state->wsize) {
+        if (out(out_desc, state->window, state->wsize - left) &&
+            ret == Z_STREAM_END)
+            ret = Z_BUF_ERROR;
+    }
     strm->next_in = next;
     strm->avail_in = have;
     return ret;
diff --git a/deps/zlib/inffast.c b/deps/zlib/inffast.c
index 2797e8a03c5151..d89ad5ccdee0e2 100644
--- a/deps/zlib/inffast.c
+++ b/deps/zlib/inffast.c
@@ -74,7 +74,7 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
     code const FAR *dcode;      /* local strm->distcode */
     unsigned lmask;             /* mask for first level of length codes */
     unsigned dmask;             /* mask for first level of distance codes */
-    code here;                  /* retrieved table entry */
+    code const *here;           /* retrieved table entry */
     unsigned op;                /* code bits, operation, extra bits, or */
                                 /*  window position, window bytes to copy */
     unsigned len;               /* match length, unused bytes */
@@ -111,20 +111,20 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
             hold += (unsigned long)(*in++) << bits;
             bits += 8;
         }
-        here = lcode[hold & lmask];
+        here = lcode + (hold & lmask);
       dolen:
-        op = (unsigned)(here.bits);
+        op = (unsigned)(here->bits);
         hold >>= op;
         bits -= op;
-        op = (unsigned)(here.op);
+        op = (unsigned)(here->op);
         if (op == 0) {                          /* literal */
-            Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+            Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ?
                     "inflate:         literal '%c'\n" :
-                    "inflate:         literal 0x%02x\n", here.val));
-            *out++ = (unsigned char)(here.val);
+                    "inflate:         literal 0x%02x\n", here->val));
+            *out++ = (unsigned char)(here->val);
         }
         else if (op & 16) {                     /* length base */
-            len = (unsigned)(here.val);
+            len = (unsigned)(here->val);
             op &= 15;                           /* number of extra bits */
             if (op) {
                 if (bits < op) {
@@ -142,14 +142,14 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
                 hold += (unsigned long)(*in++) << bits;
                 bits += 8;
             }
-            here = dcode[hold & dmask];
+            here = dcode + (hold & dmask);
           dodist:
-            op = (unsigned)(here.bits);
+            op = (unsigned)(here->bits);
             hold >>= op;
             bits -= op;
-            op = (unsigned)(here.op);
+            op = (unsigned)(here->op);
             if (op & 16) {                      /* distance base */
-                dist = (unsigned)(here.val);
+                dist = (unsigned)(here->val);
                 op &= 15;                       /* number of extra bits */
                 if (bits < op) {
                     hold += (unsigned long)(*in++) << bits;
@@ -268,7 +268,7 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
                 }
             }
             else if ((op & 64) == 0) {          /* 2nd level distance code */
-                here = dcode[here.val + (hold & ((1U << op) - 1))];
+                here = dcode + here->val + (hold & ((1U << op) - 1));
                 goto dodist;
             }
             else {
@@ -278,7 +278,7 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */
             }
         }
         else if ((op & 64) == 0) {              /* 2nd level length code */
-            here = lcode[here.val + (hold & ((1U << op) - 1))];
+            here = lcode + here->val + (hold & ((1U << op) - 1));
             goto dolen;
         }
         else if (op & 32) {                     /* end-of-block */
diff --git a/deps/zlib/inflate.c b/deps/zlib/inflate.c
index 68902e81bd4be9..281f9ab2e8c5fc 100644
--- a/deps/zlib/inflate.c
+++ b/deps/zlib/inflate.c
@@ -1,5 +1,5 @@
 /* inflate.c -- zlib decompression
- * Copyright (C) 1995-2016 Mark Adler
+ * Copyright (C) 1995-2022 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -130,6 +130,7 @@ z_streamp strm;
     state->mode = HEAD;
     state->last = 0;
     state->havedict = 0;
+    state->flags = -1;
     state->dmax = 32768U;
     state->head = Z_NULL;
     state->hold = 0;
@@ -167,6 +168,8 @@ int windowBits;
 
     /* extract wrap request from windowBits parameter */
     if (windowBits < 0) {
+        if (windowBits < -15)
+            return Z_STREAM_ERROR;
         wrap = 0;
         windowBits = -windowBits;
     }
@@ -448,10 +451,10 @@ unsigned copy;
 
 /* check function to use adler32() for zlib or crc32() for gzip */
 #ifdef GUNZIP
-#  define UPDATE(check, buf, len) \
+#  define UPDATE_CHECK(check, buf, len) \
     (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
 #else
-#  define UPDATE(check, buf, len) adler32(check, buf, len)
+#  define UPDATE_CHECK(check, buf, len) adler32(check, buf, len)
 #endif
 
 /* check macros for header crc */
@@ -671,7 +674,6 @@ int flush;
                 state->mode = FLAGS;
                 break;
             }
-            state->flags = 0;           /* expect zlib header */
             if (state->head != Z_NULL)
                 state->head->done = -1;
             if (!(state->wrap & 1) ||   /* check if zlib header allowed */
@@ -698,6 +700,7 @@ int flush;
                 break;
             }
             state->dmax = 1U << len;
+            state->flags = 0;               /* indicate zlib header */
             Tracev((stderr, "inflate:   zlib header ok\n"));
             strm->adler = state->check = adler32(0L, Z_NULL, 0);
             state->mode = hold & 0x200 ? DICTID : TYPE;
@@ -723,6 +726,7 @@ int flush;
                 CRC2(state->check, hold);
             INITBITS();
             state->mode = TIME;
+                /* fallthrough */
         case TIME:
             NEEDBITS(32);
             if (state->head != Z_NULL)
@@ -731,6 +735,7 @@ int flush;
                 CRC4(state->check, hold);
             INITBITS();
             state->mode = OS;
+                /* fallthrough */
         case OS:
             NEEDBITS(16);
             if (state->head != Z_NULL) {
@@ -741,6 +746,7 @@ int flush;
                 CRC2(state->check, hold);
             INITBITS();
             state->mode = EXLEN;
+                /* fallthrough */
         case EXLEN:
             if (state->flags & 0x0400) {
                 NEEDBITS(16);
@@ -754,14 +760,16 @@ int flush;
             else if (state->head != Z_NULL)
                 state->head->extra = Z_NULL;
             state->mode = EXTRA;
+                /* fallthrough */
         case EXTRA:
             if (state->flags & 0x0400) {
                 copy = state->length;
                 if (copy > have) copy = have;
                 if (copy) {
                     if (state->head != Z_NULL &&
-                        state->head->extra != Z_NULL) {
-                        len = state->head->extra_len - state->length;
+                        state->head->extra != Z_NULL &&
+                        (len = state->head->extra_len - state->length) <
+                            state->head->extra_max) {
                         zmemcpy(state->head->extra + len, next,
                                 len + copy > state->head->extra_max ?
                                 state->head->extra_max - len : copy);
@@ -776,6 +784,7 @@ int flush;
             }
             state->length = 0;
             state->mode = NAME;
+                /* fallthrough */
         case NAME:
             if (state->flags & 0x0800) {
                 if (have == 0) goto inf_leave;
@@ -797,6 +806,7 @@ int flush;
                 state->head->name = Z_NULL;
             state->length = 0;
             state->mode = COMMENT;
+                /* fallthrough */
         case COMMENT:
             if (state->flags & 0x1000) {
                 if (have == 0) goto inf_leave;
@@ -817,6 +827,7 @@ int flush;
             else if (state->head != Z_NULL)
                 state->head->comment = Z_NULL;
             state->mode = HCRC;
+                /* fallthrough */
         case HCRC:
             if (state->flags & 0x0200) {
                 NEEDBITS(16);
@@ -840,6 +851,7 @@ int flush;
             strm->adler = state->check = ZSWAP32(hold);
             INITBITS();
             state->mode = DICT;
+                /* fallthrough */
         case DICT:
             if (state->havedict == 0) {
                 RESTORE();
@@ -847,8 +859,10 @@ int flush;
             }
             strm->adler = state->check = adler32(0L, Z_NULL, 0);
             state->mode = TYPE;
+                /* fallthrough */
         case TYPE:
             if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
+                /* fallthrough */
         case TYPEDO:
             if (state->last) {
                 BYTEBITS();
@@ -899,8 +913,10 @@ int flush;
             INITBITS();
             state->mode = COPY_;
             if (flush == Z_TREES) goto inf_leave;
+                /* fallthrough */
         case COPY_:
             state->mode = COPY;
+                /* fallthrough */
         case COPY:
             copy = state->length;
             if (copy) {
@@ -936,6 +952,7 @@ int flush;
             Tracev((stderr, "inflate:       table sizes ok\n"));
             state->have = 0;
             state->mode = LENLENS;
+                /* fallthrough */
         case LENLENS:
             while (state->have < state->ncode) {
                 NEEDBITS(3);
@@ -957,6 +974,7 @@ int flush;
             Tracev((stderr, "inflate:       code lengths ok\n"));
             state->have = 0;
             state->mode = CODELENS;
+                /* fallthrough */
         case CODELENS:
             while (state->have < state->nlen + state->ndist) {
                 for (;;) {
@@ -1016,11 +1034,11 @@ int flush;
             }
 
             /* build code tables -- note: do not change the lenbits or distbits
-               values here (9 and 6) without reading the comments in inftrees.h
+               values here (10 and 9) without reading the comments in inftrees.h
                concerning the ENOUGH constants, which depend on those values */
             state->next = state->codes;
             state->lencode = (const code FAR *)(state->next);
-            state->lenbits = 9;
+            state->lenbits = 10;
             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
                                 &(state->lenbits), state->work);
             if (ret) {
@@ -1029,7 +1047,7 @@ int flush;
                 break;
             }
             state->distcode = (const code FAR *)(state->next);
-            state->distbits = 6;
+            state->distbits = 9;
             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
                             &(state->next), &(state->distbits), state->work);
             if (ret) {
@@ -1040,8 +1058,10 @@ int flush;
             Tracev((stderr, "inflate:       codes ok\n"));
             state->mode = LEN_;
             if (flush == Z_TREES) goto inf_leave;
+                /* fallthrough */
         case LEN_:
             state->mode = LEN;
+                /* fallthrough */
         case LEN:
             if (have >= INFLATE_FAST_MIN_INPUT &&
                 left >= INFLATE_FAST_MIN_OUTPUT) {
@@ -1092,6 +1112,7 @@ int flush;
             }
             state->extra = (unsigned)(here.op) & 15;
             state->mode = LENEXT;
+                /* fallthrough */
         case LENEXT:
             if (state->extra) {
                 NEEDBITS(state->extra);
@@ -1102,6 +1123,7 @@ int flush;
             Tracevv((stderr, "inflate:         length %u\n", state->length));
             state->was = state->length;
             state->mode = DIST;
+                /* fallthrough */
         case DIST:
             for (;;) {
                 here = state->distcode[BITS(state->distbits)];
@@ -1129,6 +1151,7 @@ int flush;
             state->offset = (unsigned)here.val;
             state->extra = (unsigned)(here.op) & 15;
             state->mode = DISTEXT;
+                /* fallthrough */
         case DISTEXT:
             if (state->extra) {
                 NEEDBITS(state->extra);
@@ -1145,6 +1168,7 @@ int flush;
 #endif
             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
             state->mode = MATCH;
+                /* fallthrough */
         case MATCH:
             if (left == 0) goto inf_leave;
             copy = out - left;
@@ -1204,7 +1228,7 @@ int flush;
                 state->total += out;
                 if ((state->wrap & 4) && out)
                     strm->adler = state->check =
-                        UPDATE(state->check, put - out, out);
+                        UPDATE_CHECK(state->check, put - out, out);
                 out = left;
                 if ((state->wrap & 4) && (
 #ifdef GUNZIP
@@ -1220,10 +1244,11 @@ int flush;
             }
 #ifdef GUNZIP
             state->mode = LENGTH;
+                /* fallthrough */
         case LENGTH:
             if (state->wrap && state->flags) {
                 NEEDBITS(32);
-                if (hold != (state->total & 0xffffffffUL)) {
+                if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {
                     strm->msg = (char *)"incorrect length check";
                     state->mode = BAD;
                     break;
@@ -1233,6 +1258,7 @@ int flush;
             }
 #endif
             state->mode = DONE;
+                /* fallthrough */
         case DONE:
             ret = Z_STREAM_END;
             goto inf_leave;
@@ -1242,6 +1268,7 @@ int flush;
         case MEM:
             return Z_MEM_ERROR;
         case SYNC:
+                /* fallthrough */
         default:
             return Z_STREAM_ERROR;
         }
@@ -1267,7 +1294,7 @@ int flush;
     state->total += out;
     if ((state->wrap & 4) && out)
         strm->adler = state->check =
-            UPDATE(state->check, strm->next_out - out, out);
+            UPDATE_CHECK(state->check, strm->next_out - out, out);
     strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
                       (state->mode == TYPE ? 128 : 0) +
                       (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
@@ -1403,6 +1430,7 @@ int ZEXPORT inflateSync(strm)
 z_streamp strm;
 {
     unsigned len;               /* number of bytes to look at or looked at */
+    int flags;                  /* temporary to save header status */
     unsigned long in, out;      /* temporary to save total_in and total_out */
     unsigned char buf[4];       /* to restore bit buffer to byte string */
     struct inflate_state FAR *state;
@@ -1435,9 +1463,15 @@ z_streamp strm;
 
     /* return no joy or set up to restart inflate() on a new block */
     if (state->have != 4) return Z_DATA_ERROR;
+    if (state->flags == -1)
+        state->wrap = 0;    /* if no header yet, treat as raw */
+    else
+        state->wrap &= ~4;  /* no point in computing a check value now */
+    flags = state->flags;
     in = strm->total_in;  out = strm->total_out;
     inflateReset(strm);
     strm->total_in = in;  strm->total_out = out;
+    state->flags = flags;
     state->mode = TYPE;
     return Z_OK;
 }
@@ -1533,7 +1567,7 @@ int check;
 
     if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
     state = (struct inflate_state FAR *)strm->state;
-    if (check)
+    if (check && state->wrap)
         state->wrap |= 4;
     else
         state->wrap &= ~4;
diff --git a/deps/zlib/inflate.h b/deps/zlib/inflate.h
index a46cce6b6d05ef..f127b6b1fa5f7d 100644
--- a/deps/zlib/inflate.h
+++ b/deps/zlib/inflate.h
@@ -1,5 +1,5 @@
 /* inflate.h -- internal inflate state definition
- * Copyright (C) 1995-2016 Mark Adler
+ * Copyright (C) 1995-2019 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -86,7 +86,8 @@ struct inflate_state {
     int wrap;                   /* bit 0 true for zlib, bit 1 true for gzip,
                                    bit 2 true to validate check value */
     int havedict;               /* true if dictionary provided */
-    int flags;                  /* gzip header method and flags (0 if zlib) */
+    int flags;                  /* gzip header method and flags, 0 if zlib, or
+                                   -1 if raw or no header yet */
     unsigned dmax;              /* zlib header max distance (INFLATE_STRICT) */
     unsigned long check;        /* protected copy of check value */
     unsigned long total;        /* protected copy of output count */
diff --git a/deps/zlib/inftrees.c b/deps/zlib/inftrees.c
index 2ea08fc13ea8ec..57d2793bec931f 100644
--- a/deps/zlib/inftrees.c
+++ b/deps/zlib/inftrees.c
@@ -1,5 +1,5 @@
 /* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2017 Mark Adler
+ * Copyright (C) 1995-2022 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -9,7 +9,7 @@
 #define MAXBITS 15
 
 const char inflate_copyright[] =
-   " inflate 1.2.11 Copyright 1995-2017 Mark Adler ";
+   " inflate 1.2.13 Copyright 1995-2022 Mark Adler ";
 /*
   If you use the zlib library in a product, an acknowledgment is welcome
   in the documentation of your product. If for some reason you cannot
@@ -62,7 +62,7 @@ unsigned short FAR *work;
         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
     static const unsigned short lext[31] = { /* Length codes 257..285 extra */
         16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
-        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202};
+        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65};
     static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
         257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
diff --git a/deps/zlib/inftrees.h b/deps/zlib/inftrees.h
index baa53a0b1a199c..44b96b30c5aac5 100644
--- a/deps/zlib/inftrees.h
+++ b/deps/zlib/inftrees.h
@@ -36,17 +36,17 @@ typedef struct {
  */
 
 /* Maximum size of the dynamic table.  The maximum number of code structures is
-   1444, which is the sum of 852 for literal/length codes and 592 for distance
+   1924, which is the sum of 1332 for literal/length codes and 592 for distance
    codes.  These values were found by exhaustive searches using the program
-   examples/enough.c found in the zlib distribtution.  The arguments to that
+   examples/enough.c found in the zlib distribution.  The arguments to that
    program are the number of symbols, the initial root table size, and the
-   maximum bit length of a code.  "enough 286 9 15" for literal/length codes
-   returns returns 852, and "enough 30 6 15" for distance codes returns 592.
-   The initial root table size (9 or 6) is found in the fifth argument of the
+   maximum bit length of a code.  "enough 286 10 15" for literal/length codes
+   returns returns 1332, and "enough 30 9 15" for distance codes returns 592.
+   The initial root table size (10 or 9) is found in the fifth argument of the
    inflate_table() calls in inflate.c and infback.c.  If the root table size is
    changed, then these maximum sizes would be need to be recalculated and
    updated. */
-#define ENOUGH_LENS 852
+#define ENOUGH_LENS 1332
 #define ENOUGH_DISTS 592
 #define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)
 
diff --git a/deps/zlib/patches/0003-uninitializedjump.patch b/deps/zlib/patches/0003-uninitializedjump.patch
new file mode 100644
index 00000000000000..7aae3238a5011a
--- /dev/null
+++ b/deps/zlib/patches/0003-uninitializedjump.patch
@@ -0,0 +1,15 @@
+diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c
+index a39e62787862..c6053fd1c7ea 100644
+--- a/third_party/zlib/deflate.c
++++ b/third_party/zlib/deflate.c
+@@ -318,6 +318,10 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
+                                  s->w_size + window_padding,
+                                  2*sizeof(Byte));
+     s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
++    /* Avoid use of uninitialized value, see:
++     * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360
++     */
++    zmemzero(s->prev, s->w_size * sizeof(Pos));
+     s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));
+ 
+     s->high_water = 0;      /* nothing written to s->window yet */
diff --git a/deps/zlib/patches/0004-fix-uwp.patch b/deps/zlib/patches/0004-fix-uwp.patch
new file mode 100644
index 00000000000000..23145a7ae5357f
--- /dev/null
+++ b/deps/zlib/patches/0004-fix-uwp.patch
@@ -0,0 +1,22 @@
+diff --git a/third_party/zlib/contrib/minizip/iowin32.c b/third_party/zlib/contrib/minizip/iowin32.c
+index 246ceb91a139..c6bc314b3c28 100644
+--- a/third_party/zlib/contrib/minizip/iowin32.c
++++ b/third_party/zlib/contrib/minizip/iowin32.c
+@@ -31,14 +31,12 @@
+ #define _WIN32_WINNT 0x601
+ #endif
+ 
+-#if _WIN32_WINNT >= _WIN32_WINNT_WIN8
+-// see Include/shared/winapifamily.h in the Windows Kit
+-#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
+-#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
++#if !defined(IOWIN32_USING_WINRT_API)
++#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
++// Windows Store or Universal Windows Platform
+ #define IOWIN32_USING_WINRT_API 1
+ #endif
+ #endif
+-#endif
+ 
+ voidpf  ZCALLBACK win32_open_file_func  OF((voidpf opaque, const char* filename, int mode));
+ uLong   ZCALLBACK win32_read_file_func  OF((voidpf opaque, voidpf stream, void* buf, uLong size));
diff --git a/deps/zlib/patches/0005-infcover-gtest.patch b/deps/zlib/patches/0005-infcover-gtest.patch
new file mode 100644
index 00000000000000..f5443bd7d88e1c
--- /dev/null
+++ b/deps/zlib/patches/0005-infcover-gtest.patch
@@ -0,0 +1,405 @@
+From 409594639f15d825202971db7a275023e05772ff Mon Sep 17 00:00:00 2001
+From: Adenilson Cavalcanti <adenilson.cavalcanti@arm.com>
+Date: Tue, 28 Apr 2020 10:48:01 -0700
+Subject: [PATCH] Local Changes:   - make C tests build as C++ code so we can
+ use gtest.   - use gtest EXPECT_TRUE instead of C assert.   - replace C
+ streams for C++ (portability issues).
+
+---
+ test/infcover.c | 167 ++++++++++++++++++++++++++----------------------
+ 1 file changed, 90 insertions(+), 77 deletions(-)
+
+diff --git a/test/infcover.c b/test/infcover.c
+index 2be0164..a8c51c7 100644
+--- a/test/infcover.c
++++ b/test/infcover.c
+@@ -4,11 +4,12 @@
+  */
+ 
+ /* to use, do: ./configure --cover && make cover */
+-
++// clang-format off
++#include "infcover.h"
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+-#include <assert.h>
++
+ #include "zlib.h"
+ 
+ /* get definition of internal structure so we can mess with it (see pull()),
+@@ -17,8 +18,22 @@
+ #include "inftrees.h"
+ #include "inflate.h"
+ 
++/* XXX: use C++ streams instead of printf/fputs/etc due to portability
++ * as type sizes can vary between platforms.
++ */
++#include <iostream>
+ #define local static
+ 
++/* XXX: hacking C assert and plugging into GTest. */
++#include "gtest.h"
++#if defined(assert)
++#undef assert
++#define assert EXPECT_TRUE
++#endif
++
++/* XXX: handle what is a reserved word in C++. */
++#define try try_f
++
+ /* -- memory tracking routines -- */
+ 
+ /*
+@@ -72,7 +87,7 @@ local void *mem_alloc(void *mem, unsigned count, unsigned size)
+ {
+     void *ptr;
+     struct mem_item *item;
+-    struct mem_zone *zone = mem;
++    struct mem_zone *zone = static_cast<struct mem_zone *>(mem);
+     size_t len = count * (size_t)size;
+ 
+     /* induced allocation failure */
+@@ -87,7 +102,7 @@ local void *mem_alloc(void *mem, unsigned count, unsigned size)
+     memset(ptr, 0xa5, len);
+ 
+     /* create a new item for the list */
+-    item = malloc(sizeof(struct mem_item));
++    item = static_cast<struct mem_item *>(malloc(sizeof(struct mem_item)));
+     if (item == NULL) {
+         free(ptr);
+         return NULL;
+@@ -112,7 +127,7 @@ local void *mem_alloc(void *mem, unsigned count, unsigned size)
+ local void mem_free(void *mem, void *ptr)
+ {
+     struct mem_item *item, *next;
+-    struct mem_zone *zone = mem;
++    struct mem_zone *zone = static_cast<struct mem_zone *>(mem);
+ 
+     /* if no zone, just do a free */
+     if (zone == NULL) {
+@@ -159,7 +174,7 @@ local void mem_setup(z_stream *strm)
+ {
+     struct mem_zone *zone;
+ 
+-    zone = malloc(sizeof(struct mem_zone));
++    zone = static_cast<struct mem_zone *>(malloc(sizeof(struct mem_zone)));
+     assert(zone != NULL);
+     zone->first = NULL;
+     zone->total = 0;
+@@ -175,33 +190,33 @@ local void mem_setup(z_stream *strm)
+ /* set a limit on the total memory allocation, or 0 to remove the limit */
+ local void mem_limit(z_stream *strm, size_t limit)
+ {
+-    struct mem_zone *zone = strm->opaque;
++    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
+ 
+     zone->limit = limit;
+ }
+ 
+ /* show the current total requested allocations in bytes */
+-local void mem_used(z_stream *strm, char *prefix)
++local void mem_used(z_stream *strm, const char *prefix)
+ {
+-    struct mem_zone *zone = strm->opaque;
++    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
+ 
+-    fprintf(stderr, "%s: %lu allocated\n", prefix, zone->total);
++    std::cout << prefix << ": " << zone->total << " allocated" << std::endl;
+ }
+ 
+ /* show the high water allocation in bytes */
+-local void mem_high(z_stream *strm, char *prefix)
++local void mem_high(z_stream *strm, const char *prefix)
+ {
+-    struct mem_zone *zone = strm->opaque;
++    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
+ 
+-    fprintf(stderr, "%s: %lu high water mark\n", prefix, zone->highwater);
++    std::cout << prefix << ": " << zone->highwater << " high water mark" << std::endl;
+ }
+ 
+ /* release the memory allocation zone -- if there are any surprises, notify */
+-local void mem_done(z_stream *strm, char *prefix)
++local void mem_done(z_stream *strm, const char *prefix)
+ {
+     int count = 0;
+     struct mem_item *item, *next;
+-    struct mem_zone *zone = strm->opaque;
++    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
+ 
+     /* show high water mark */
+     mem_high(strm, prefix);
+@@ -218,13 +233,20 @@ local void mem_done(z_stream *strm, char *prefix)
+ 
+     /* issue alerts about anything unexpected */
+     if (count || zone->total)
+-        fprintf(stderr, "** %s: %lu bytes in %d blocks not freed\n",
+-                prefix, zone->total, count);
++        std::cout << "** " << prefix << ": "
++                  << zone->total << " bytes in "
++                  << count << " blocks not freed"
++                  << std::endl;
++
+     if (zone->notlifo)
+-        fprintf(stderr, "** %s: %d frees not LIFO\n", prefix, zone->notlifo);
++        std::cout << "** " << prefix << ": "
++                  << zone->notlifo << " frees not LIFO"
++                  << std::endl;
++
+     if (zone->rogue)
+-        fprintf(stderr, "** %s: %d frees not recognized\n",
+-                prefix, zone->rogue);
++        std::cout << "** " << prefix << ": "
++                  << zone->rogue << " frees not recognized"
++                  << std::endl;
+ 
+     /* free the zone and delete from the stream */
+     free(zone);
+@@ -247,7 +269,7 @@ local unsigned char *h2b(const char *hex, unsigned *len)
+     unsigned char *in, *re;
+     unsigned next, val;
+ 
+-    in = malloc((strlen(hex) + 1) >> 1);
++    in = static_cast<unsigned char *>(malloc((strlen(hex) + 1) >> 1));
+     if (in == NULL)
+         return NULL;
+     next = 0;
+@@ -268,7 +290,7 @@ local unsigned char *h2b(const char *hex, unsigned *len)
+     } while (*hex++);       /* go through the loop with the terminating null */
+     if (len != NULL)
+         *len = next;
+-    re = realloc(in, next);
++    re = static_cast<unsigned char *>(realloc(in, next));
+     return re == NULL ? in : re;
+ }
+ 
+@@ -281,7 +303,7 @@ local unsigned char *h2b(const char *hex, unsigned *len)
+    header information is collected with inflateGetHeader().  If a zlib stream
+    is looking for a dictionary, then an empty dictionary is provided.
+    inflate() is run until all of the input data is consumed. */
+-local void inf(char *hex, char *what, unsigned step, int win, unsigned len,
++local void inf(const char *hex, const char *what, unsigned step, int win, unsigned len,
+                int err)
+ {
+     int ret;
+@@ -298,7 +320,7 @@ local void inf(char *hex, char *what, unsigned step, int win, unsigned len,
+         mem_done(&strm, what);
+         return;
+     }
+-    out = malloc(len);                          assert(out != NULL);
++    out = static_cast<unsigned char *>(malloc(len));                          assert(out != NULL);
+     if (win == 47) {
+         head.extra = out;
+         head.extra_max = len;
+@@ -347,7 +369,7 @@ local void inf(char *hex, char *what, unsigned step, int win, unsigned len,
+ }
+ 
+ /* cover all of the lines in inflate.c up to inflate() */
+-local void cover_support(void)
++void cover_support(void)
+ {
+     int ret;
+     z_stream strm;
+@@ -381,11 +403,11 @@ local void cover_support(void)
+     strm.next_in = Z_NULL;
+     ret = inflateInit(&strm);                   assert(ret == Z_OK);
+     ret = inflateEnd(&strm);                    assert(ret == Z_OK);
+-    fputs("inflate built-in memory routines\n", stderr);
++    std::cout << "inflate built-in memory routines" << std::endl;;
+ }
+ 
+ /* cover all inflate() header and trailer cases and code after inflate() */
+-local void cover_wrap(void)
++void cover_wrap(void)
+ {
+     int ret;
+     z_stream strm, copy;
+@@ -394,7 +416,7 @@ local void cover_wrap(void)
+     ret = inflate(Z_NULL, 0);                   assert(ret == Z_STREAM_ERROR);
+     ret = inflateEnd(Z_NULL);                   assert(ret == Z_STREAM_ERROR);
+     ret = inflateCopy(Z_NULL, Z_NULL);          assert(ret == Z_STREAM_ERROR);
+-    fputs("inflate bad parameters\n", stderr);
++    std::cout << "inflate bad parameters" << std::endl;
+ 
+     inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR);
+     inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR);
+@@ -415,9 +437,9 @@ local void cover_wrap(void)
+     strm.next_in = Z_NULL;
+     ret = inflateInit2(&strm, -8);
+     strm.avail_in = 2;
+-    strm.next_in = (void *)"\x63";
++    strm.next_in = (Bytef *)"\x63";
+     strm.avail_out = 1;
+-    strm.next_out = (void *)&ret;
++    strm.next_out = (Bytef *)&ret;
+     mem_limit(&strm, 1);
+     ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_MEM_ERROR);
+     ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_MEM_ERROR);
+@@ -428,11 +450,11 @@ local void cover_wrap(void)
+     mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256);
+     ret = inflatePrime(&strm, 16, 0);           assert(ret == Z_OK);
+     strm.avail_in = 2;
+-    strm.next_in = (void *)"\x80";
++    strm.next_in = (Bytef *)"\x80";
+     ret = inflateSync(&strm);                   assert(ret == Z_DATA_ERROR);
+     ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_STREAM_ERROR);
+     strm.avail_in = 4;
+-    strm.next_in = (void *)"\0\0\xff\xff";
++    strm.next_in = (Bytef *)"\0\0\xff\xff";
+     ret = inflateSync(&strm);                   assert(ret == Z_OK);
+     (void)inflateSyncPoint(&strm);
+     ret = inflateCopy(&copy, &strm);            assert(ret == Z_MEM_ERROR);
+@@ -454,7 +476,7 @@ local unsigned pull(void *desc, unsigned char **buf)
+         next = 0;
+         return 0;   /* no input (already provided at next_in) */
+     }
+-    state = (void *)((z_stream *)desc)->state;
++    state = reinterpret_cast<struct inflate_state *>(((z_stream *)desc)->state);
+     if (state != Z_NULL)
+         state->mode = SYNC;     /* force an otherwise impossible situation */
+     return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0;
+@@ -467,7 +489,7 @@ local int push(void *desc, unsigned char *buf, unsigned len)
+ }
+ 
+ /* cover inflateBack() up to common deflate data cases and after those */
+-local void cover_back(void)
++void cover_back(void)
+ {
+     int ret;
+     z_stream strm;
+@@ -479,17 +501,17 @@ local void cover_back(void)
+     ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL);
+                                                 assert(ret == Z_STREAM_ERROR);
+     ret = inflateBackEnd(Z_NULL);               assert(ret == Z_STREAM_ERROR);
+-    fputs("inflateBack bad parameters\n", stderr);
++    std::cout << "inflateBack bad parameters" << std::endl;;
+ 
+     mem_setup(&strm);
+     ret = inflateBackInit(&strm, 15, win);      assert(ret == Z_OK);
+     strm.avail_in = 2;
+-    strm.next_in = (void *)"\x03";
++    strm.next_in = (Bytef *)"\x03";
+     ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL);
+                                                 assert(ret == Z_STREAM_END);
+         /* force output error */
+     strm.avail_in = 3;
+-    strm.next_in = (void *)"\x63\x00";
++    strm.next_in = (Bytef *)"\x63\x00";
+     ret = inflateBack(&strm, pull, Z_NULL, push, &strm);
+                                                 assert(ret == Z_BUF_ERROR);
+         /* force mode error by mucking with state */
+@@ -500,11 +522,11 @@ local void cover_back(void)
+ 
+     ret = inflateBackInit(&strm, 15, win);      assert(ret == Z_OK);
+     ret = inflateBackEnd(&strm);                assert(ret == Z_OK);
+-    fputs("inflateBack built-in memory routines\n", stderr);
++    std::cout << "inflateBack built-in memory routines" << std::endl;;
+ }
+ 
+ /* do a raw inflate of data in hexadecimal with both inflate and inflateBack */
+-local int try(char *hex, char *id, int err)
++local int try(const char *hex, const char *id, int err)
+ {
+     int ret;
+     unsigned len, size;
+@@ -518,11 +540,11 @@ local int try(char *hex, char *id, int err)
+ 
+     /* allocate work areas */
+     size = len << 3;
+-    out = malloc(size);
++    out = static_cast<unsigned char *>(malloc(size));
+     assert(out != NULL);
+-    win = malloc(32768);
++    win = static_cast<unsigned char *>(malloc(32768));
+     assert(win != NULL);
+-    prefix = malloc(strlen(id) + 6);
++    prefix = static_cast<char *>(malloc(strlen(id) + 6));
+     assert(prefix != NULL);
+ 
+     /* first with inflate */
+@@ -578,7 +600,7 @@ local int try(char *hex, char *id, int err)
+ }
+ 
+ /* cover deflate data cases in both inflate() and inflateBack() */
+-local void cover_inflate(void)
++void cover_inflate(void)
+ {
+     try("0 0 0 0 0", "invalid stored block lengths", 1);
+     try("3 0", "fixed", 0);
+@@ -613,32 +635,33 @@ local void cover_inflate(void)
+     inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK);
+ }
+ 
++/* XXX(cavalcantii): fix linking error due inflate_table. */
+ /* cover remaining lines in inftrees.c */
+-local void cover_trees(void)
+-{
+-    int ret;
+-    unsigned bits;
+-    unsigned short lens[16], work[16];
+-    code *next, table[ENOUGH_DISTS];
+-
+-    /* we need to call inflate_table() directly in order to manifest not-
+-       enough errors, since zlib insures that enough is always enough */
+-    for (bits = 0; bits < 15; bits++)
+-        lens[bits] = (unsigned short)(bits + 1);
+-    lens[15] = 15;
+-    next = table;
+-    bits = 15;
+-    ret = inflate_table(DISTS, lens, 16, &next, &bits, work);
+-                                                assert(ret == 1);
+-    next = table;
+-    bits = 1;
+-    ret = inflate_table(DISTS, lens, 16, &next, &bits, work);
+-                                                assert(ret == 1);
+-    fputs("inflate_table not enough errors\n", stderr);
+-}
++/* void cover_trees(void) */
++/* { */
++/*     int ret; */
++/*     unsigned bits; */
++/*     unsigned short lens[16], work[16]; */
++/*     code *next, table[ENOUGH_DISTS]; */
++
++/*     /\* we need to call inflate_table() directly in order to manifest not- */
++/*        enough errors, since zlib insures that enough is always enough *\/ */
++/*     for (bits = 0; bits < 15; bits++) */
++/*         lens[bits] = (unsigned short)(bits + 1); */
++/*     lens[15] = 15; */
++/*     next = table; */
++/*     bits = 15; */
++/*     ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */
++/*                                                 assert(ret == 1); */
++/*     next = table; */
++/*     bits = 1; */
++/*     ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */
++/*                                                 assert(ret == 1); */
++/*     fputs("inflate_table not enough errors\n", stderr); */
++/* } */
+ 
+ /* cover remaining inffast.c decoding and window copying */
+-local void cover_fast(void)
++void cover_fast(void)
+ {
+     inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68"
+         " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR);
+@@ -658,14 +681,4 @@ local void cover_fast(void)
+         Z_STREAM_END);
+ }
+ 
+-int main(void)
+-{
+-    fprintf(stderr, "%s\n", zlibVersion());
+-    cover_support();
+-    cover_wrap();
+-    cover_back();
+-    cover_inflate();
+-    cover_trees();
+-    cover_fast();
+-    return 0;
+-}
++// clang-format on
+-- 
+2.21.1 (Apple Git-122.3)
+
diff --git a/deps/zlib/patches/0006-fix-check_match.patch b/deps/zlib/patches/0006-fix-check_match.patch
new file mode 100644
index 00000000000000..b21c363b1ec1e7
--- /dev/null
+++ b/deps/zlib/patches/0006-fix-check_match.patch
@@ -0,0 +1,42 @@
+From 8304bdda5293ffd5b3efce8e4f54904b387029d6 Mon Sep 17 00:00:00 2001
+From: Hans Wennborg <hans@chromium.org>
+Date: Wed, 23 Sep 2020 16:36:38 +0200
+Subject: [PATCH] Avoid crashing in check_match when prev_match == -1
+
+prev_match can be set to -1 after sliding the window. In that case, the
+window has slid past the first byte of the last match, which means it
+cannot be compared in check_match.
+
+This would cause zlib to crash on some inputs to deflate when built
+with ZLIB_DEBUG enabled.
+
+Check for this situation and avoid crashing by not trying to compare
+the first byte.
+
+Bug: 1113142
+---
+ third_party/zlib/deflate.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c
+index cfdd2f46b230..d70732ec6fc2 100644
+--- a/third_party/zlib/deflate.c
++++ b/third_party/zlib/deflate.c
+@@ -2060,7 +2060,13 @@ local block_state deflate_slow(s, flush)
+             uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
+             /* Do not insert strings in hash table beyond this. */
+ 
+-            check_match(s, s->strstart-1, s->prev_match, s->prev_length);
++            if (s->prev_match == -1) {
++                /* The window has slid one byte past the previous match,
++                 * so the first byte cannot be compared. */
++                check_match(s, s->strstart, s->prev_match+1, s->prev_length-1);
++            } else {
++                check_match(s, s->strstart-1, s->prev_match, s->prev_length);
++            }
+ 
+             _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+                            s->prev_length - MIN_MATCH, bflush);
+-- 
+2.28.0.681.g6f77f65b4e-goog
+
diff --git a/deps/zlib/patches/0007-zero-init-deflate-window.patch b/deps/zlib/patches/0007-zero-init-deflate-window.patch
new file mode 100644
index 00000000000000..9dbbf53a8c6b6e
--- /dev/null
+++ b/deps/zlib/patches/0007-zero-init-deflate-window.patch
@@ -0,0 +1,40 @@
+From 92537ee19784e0e545f06d89b7d89ab532a18cff Mon Sep 17 00:00:00 2001
+From: Hans Wennborg <hans@chromium.org>
+Date: Tue, 3 Nov 2020 15:54:09 +0100
+Subject: [PATCH] [zlib] Zero-initialize the window used for deflation
+
+Otherwise MSan complains about use-of-uninitialized values in the
+window.
+This happens in both regular deflate's longest_match and deflate_rle.
+
+Before crrev.com/822755 we used to suppress those reports, but it seems
+better to fix it properly. That will also allow us to catch other
+potential issues with MSan in these functions.
+
+The instances of this that we've seen only reproduce with
+fill_window_sse(), not with the regular fill_window() function. Since
+the former doesn't exist in upstream zlib, I'm not planning to send this
+patch upstream.
+
+Bug: 1137613, 1144420
+---
+ third_party/zlib/deflate.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c
+index 8bf93e524875..fc7ae45905ff 100644
+--- a/third_party/zlib/deflate.c
++++ b/third_party/zlib/deflate.c
+@@ -321,6 +321,9 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
+     s->window = (Bytef *) ZALLOC(strm,
+                                  s->w_size + window_padding,
+                                  2*sizeof(Byte));
++    /* Avoid use of unitialized values in the window, see crbug.com/1137613 and
++     * crbug.com/1144420 */
++    zmemzero(s->window, (s->w_size + window_padding) * (2 * sizeof(Byte)));
+     s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
+     /* Avoid use of uninitialized value, see:
+      * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360
+-- 
+2.29.1.341.ge80a0c044ae-goog
+
diff --git a/deps/zlib/patches/0008-minizip-zip-unzip-tools.patch b/deps/zlib/patches/0008-minizip-zip-unzip-tools.patch
new file mode 100644
index 00000000000000..48ceb02d4c3781
--- /dev/null
+++ b/deps/zlib/patches/0008-minizip-zip-unzip-tools.patch
@@ -0,0 +1,98 @@
+From 0c7de17000659f4f79de878296892c46be0aff77 Mon Sep 17 00:00:00 2001
+From: Noel Gordon <noel@chromium.org>
+Date: Wed, 26 May 2021 21:57:43 +1000
+Subject: [PATCH] Build minizip zip and unzip tools
+
+---
+ third_party/zlib/contrib/minizip/miniunz.c | 13 ++++++-------
+ third_party/zlib/contrib/minizip/minizip.c |  7 +++----
+ 2 files changed, 9 insertions(+), 11 deletions(-)
+
+diff --git a/third_party/zlib/contrib/minizip/miniunz.c b/third_party/zlib/contrib/minizip/miniunz.c
+index 3d65401be5cd..08737f689a96 100644
+--- a/third_party/zlib/contrib/minizip/miniunz.c
++++ b/third_party/zlib/contrib/minizip/miniunz.c
+@@ -12,7 +12,7 @@
+          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+ */
+
+-#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
++#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!defined(__ANDROID_API__))
+         #ifndef __USE_FILE_OFFSET64
+                 #define __USE_FILE_OFFSET64
+         #endif
+@@ -27,7 +27,7 @@
+         #endif
+ #endif
+
+-#ifdef __APPLE__
++#if defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+ // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
+ #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
+ #define FTELLO_FUNC(stream) ftello(stream)
+@@ -45,6 +45,7 @@
+ #include <time.h>
+ #include <errno.h>
+ #include <fcntl.h>
++#include <sys/stat.h>
+
+ #ifdef _WIN32
+ # include <direct.h>
+@@ -97,7 +98,7 @@ void change_file_date(filename,dosdate,tmu_date)
+   SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
+   CloseHandle(hFile);
+ #else
+-#ifdef unix || __APPLE__
++#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+   struct utimbuf ut;
+   struct tm newdate;
+   newdate.tm_sec = tmu_date.tm_sec;
+@@ -125,11 +126,9 @@ int mymkdir(dirname)
+     const char* dirname;
+ {
+     int ret=0;
+-#ifdef _WIN32
++#if defined(_WIN32)
+     ret = _mkdir(dirname);
+-#elif unix
+-    ret = mkdir (dirname,0775);
+-#elif __APPLE__
++#elif defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+     ret = mkdir (dirname,0775);
+ #endif
+     return ret;
+diff --git a/third_party/zlib/contrib/minizip/minizip.c b/third_party/zlib/contrib/minizip/minizip.c
+index 4288962ecef0..b794953c5c23 100644
+--- a/third_party/zlib/contrib/minizip/minizip.c
++++ b/third_party/zlib/contrib/minizip/minizip.c
+@@ -12,8 +12,7 @@
+          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+ */
+
+-
+-#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
++#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) && (!defined(__ANDROID_API__))
+         #ifndef __USE_FILE_OFFSET64
+                 #define __USE_FILE_OFFSET64
+         #endif
+@@ -28,7 +27,7 @@
+         #endif
+ #endif
+
+-#ifdef __APPLE__
++#if defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+ // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
+ #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
+ #define FTELLO_FUNC(stream) ftello(stream)
+@@ -94,7 +93,7 @@ uLong filetime(f, tmzip, dt)
+   return ret;
+ }
+ #else
+-#ifdef unix || __APPLE__
++#if defined(unix) || defined(__APPLE__) || defined(__Fuchsia__) || defined(__ANDROID_API__)
+ uLong filetime(f, tmzip, dt)
+     char *f;               /* name of file to get info on */
+     tm_zip *tmzip;         /* return value: access, modific. and creation times */
+--
+2.31.1.818.g46aad6cb9e-goog
+
diff --git a/deps/zlib/patches/0009-infcover-oob.patch b/deps/zlib/patches/0009-infcover-oob.patch
new file mode 100644
index 00000000000000..648360f332d49c
--- /dev/null
+++ b/deps/zlib/patches/0009-infcover-oob.patch
@@ -0,0 +1,24 @@
+From 75690b2683667be5535ac6243438115dc9c40f6a Mon Sep 17 00:00:00 2001
+From: Florian Mayer <fmayer@google.com>
+Date: Wed, 16 Mar 2022 16:38:36 -0700
+Subject: [PATCH] Fix out of bounds in infcover.c.
+
+---
+ test/infcover.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/test/infcover.c b/test/infcover.c
+index 2be01646c..a6d83693c 100644
+--- a/test/infcover.c
++++ b/test/infcover.c
+@@ -373,7 +373,9 @@ local void cover_support(void)
+     mem_setup(&strm);
+     strm.avail_in = 0;
+     strm.next_in = Z_NULL;
+-    ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream));
++    char versioncpy[] = ZLIB_VERSION;
++    versioncpy[0] -= 1;
++    ret = inflateInit_(&strm, versioncpy, (int)sizeof(z_stream));
+                                                 assert(ret == Z_VERSION_ERROR);
+     mem_done(&strm, "wrong version");
+ 
diff --git a/deps/zlib/simd_stub.c b/deps/zlib/simd_stub.c
deleted file mode 100644
index c6d46051498f36..00000000000000
--- a/deps/zlib/simd_stub.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* simd_stub.c -- stub implementations
-* Copyright (C) 2014 Intel Corporation
-* For conditions of distribution and use, see copyright notice in zlib.h
-*/
-#include <assert.h>
-
-#include "deflate.h"
-#include "x86.h"
-
-int ZLIB_INTERNAL x86_cpu_enable_simd = 0;
-
-void ZLIB_INTERNAL crc_fold_init(deflate_state *const s) {
-    assert(0);
-}
-
-void ZLIB_INTERNAL crc_fold_copy(deflate_state *const s,
-                                 unsigned char *dst,
-                                 const unsigned char *src,
-                                 long len) {
-    assert(0);
-}
-
-unsigned ZLIB_INTERNAL crc_fold_512to32(deflate_state *const s) {
-    assert(0);
-    return 0;
-}
-
-void ZLIB_INTERNAL fill_window_sse(deflate_state *s)
-{
-    assert(0);
-}
-
-void x86_check_features(void)
-{
-}
diff --git a/deps/zlib/slide_hash_simd.h b/deps/zlib/slide_hash_simd.h
new file mode 100644
index 00000000000000..1000b774ccb60a
--- /dev/null
+++ b/deps/zlib/slide_hash_simd.h
@@ -0,0 +1,116 @@
+/* slide_hash_simd.h
+ *
+ * Copyright 2022 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the Chromium source repository LICENSE file.
+ */
+
+#ifndef SLIDE_HASH_SIMD_H
+#define SLIDE_HASH_SIMD_H
+
+#include "deflate.h"
+
+#ifndef INLINE
+#if defined(_MSC_VER) && !defined(__clang__)
+#define INLINE __inline
+#else
+#define INLINE inline
+#endif
+#endif
+
+#if defined(CPU_NO_SIMD)
+
+#error SIMD has been disabled for your build target
+
+#elif defined(DEFLATE_SLIDE_HASH_SSE2)
+
+#include <emmintrin.h>  /* SSE2 */
+
+#define Z_SLIDE_INIT_SIMD(wsize) _mm_set1_epi16((ush)(wsize))
+
+#define Z_SLIDE_HASH_SIMD(table, size, vector_wsize) \
+    for (const Posf* const end = table + size; table != end;) { \
+        __m128i vO = _mm_loadu_si128((__m128i *)(table + 0)); \
+        vO = _mm_subs_epu16(vO, vector_wsize); \
+        _mm_storeu_si128((__m128i *)(table + 0), vO); \
+        table += 8; \
+    }
+
+typedef __m128i z_vec128i_u16x8_t;
+
+#elif defined(DEFLATE_SLIDE_HASH_NEON)
+
+#include <arm_neon.h>  /* NEON */
+
+#define Z_SLIDE_INIT_SIMD(wsize) vdupq_n_u16((ush)(wsize))
+
+#define Z_SLIDE_HASH_SIMD(table, size, vector_wsize) \
+    for (const Posf* const end = table + size; table != end;) { \
+        uint16x8_t vO = vld1q_u16(table + 0); \
+        uint16x8_t v8 = vld1q_u16(table + 8); \
+        vO = vqsubq_u16(vO, vector_wsize); \
+        v8 = vqsubq_u16(v8, vector_wsize); \
+        vst1q_u16(table + 0, vO); \
+        vst1q_u16(table + 8, v8); \
+        table += 8 + 8; \
+    }
+
+typedef uint16x8_t z_vec128i_u16x8_t;
+
+#else
+
+#error slide_hash_simd is not defined for your build target
+
+#endif
+
+/* ===========================================================================
+ * Slide the hash table when sliding the window down (could be avoided with 32
+ * bit values at the expense of memory usage). We slide even when level == 0 to
+ * keep the hash table consistent if we switch back to level > 0 later.
+ */
+local INLINE void slide_hash_simd(
+    Posf *head, Posf *prev, const uInt w_size, const uInt hash_size) {
+    /*
+     * The SIMD implementation of the hash table slider assumes:
+     *
+     * 1. hash chain offset is 2 bytes. Should be true as Pos is "ush" type.
+     */
+    Assert(sizeof(Pos) == 2, "Pos type size error: should be 2 bytes");
+    Assert(sizeof(ush) == 2, "ush type size error: should be 2 bytes");
+
+    Assert(hash_size <= (1 << 16), "Hash table maximum size error");
+    Assert(hash_size >= (1 << 8), "Hash table minimum size error");
+    Assert(w_size == (ush)w_size, "Prev table size error");
+
+    /*
+     * 2. The hash & prev table sizes are a multiple of 32 bytes (256 bits),
+     * since the NEON table slider moves two 128-bit items per loop (loop is
+     * unrolled on NEON for performance, see http://crbug.com/863257).
+     */
+    Assert(!((hash_size * sizeof(head[0])) & (32 - 1)),
+        "Hash table size error: should be a multiple of 32 bytes");
+    Assert(!((w_size * sizeof(prev[0])) & (32 - 1)),
+        "Prev table size error: should be a multiple of 32 bytes");
+
+    /*
+     * Duplicate (ush)w_size in each uint16_t component of a 128-bit vector.
+     */
+    const z_vec128i_u16x8_t vec_wsize = Z_SLIDE_INIT_SIMD(w_size);
+
+    /*
+     * Slide {head,prev} hash chain values: subtracts (ush)w_size from every
+     * value with a saturating SIMD subtract, to clamp the result to 0(NIL),
+     * to implement slide_hash() `(m >= wsize ? m - wsize : NIL);` code.
+     */
+    Z_SLIDE_HASH_SIMD(head, hash_size, vec_wsize);
+#ifndef FASTEST
+    Z_SLIDE_HASH_SIMD(prev, w_size, vec_wsize);
+#endif
+
+}
+
+#undef z_vec128i_u16x8_t
+#undef Z_SLIDE_HASH_SIMD
+#undef Z_SLIDE_INIT_SIMD
+
+#endif  /* SLIDE_HASH_SIMD_H */
diff --git a/deps/zlib/trees.c b/deps/zlib/trees.c
index 5f89d056ef9692..5f305c47221e90 100644
--- a/deps/zlib/trees.c
+++ b/deps/zlib/trees.c
@@ -1,5 +1,5 @@
 /* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2017 Jean-loup Gailly
+ * Copyright (C) 1995-2021 Jean-loup Gailly
  * detect_data_type() function provided freely by Cosmin Truta, 2006
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
@@ -149,7 +149,7 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
 local void compress_block OF((deflate_state *s, const ct_data *ltree,
                               const ct_data *dtree));
 local int  detect_data_type OF((deflate_state *s));
-local unsigned bi_reverse OF((unsigned value, int length));
+local unsigned bi_reverse OF((unsigned code, int len));
 local void bi_windup      OF((deflate_state *s));
 local void bi_flush       OF((deflate_state *s));
 
@@ -193,7 +193,7 @@ local void send_bits(s, value, length)
     s->bits_sent += (ulg)length;
 
     /* If not enough room in bi_buf, use (valid) bits from bi_buf and
-     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+     * (16 - bi_valid) bits from value, leaving (width - (16 - bi_valid))
      * unused bits in value.
      */
     if (s->bi_valid > (int)Buf_size - length) {
@@ -256,7 +256,7 @@ local void tr_static_init()
     length = 0;
     for (code = 0; code < LENGTH_CODES-1; code++) {
         base_length[code] = length;
-        for (n = 0; n < (1<<extra_lbits[code]); n++) {
+        for (n = 0; n < (1 << extra_lbits[code]); n++) {
             _length_code[length++] = (uch)code;
         }
     }
@@ -265,13 +265,13 @@ local void tr_static_init()
      * in two different ways: code 284 + 5 bits or code 285, so we
      * overwrite length_code[255] to use the best encoding:
      */
-    _length_code[length-1] = (uch)code;
+    _length_code[length - 1] = (uch)code;
 
     /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
     dist = 0;
     for (code = 0 ; code < 16; code++) {
         base_dist[code] = dist;
-        for (n = 0; n < (1<<extra_dbits[code]); n++) {
+        for (n = 0; n < (1 << extra_dbits[code]); n++) {
             _dist_code[dist++] = (uch)code;
         }
     }
@@ -279,11 +279,11 @@ local void tr_static_init()
     dist >>= 7; /* from now on, all distances are divided by 128 */
     for ( ; code < D_CODES; code++) {
         base_dist[code] = dist << 7;
-        for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
+        for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
             _dist_code[256 + dist++] = (uch)code;
         }
     }
-    Assert (dist == 256, "tr_static_init: 256+dist != 512");
+    Assert (dist == 256, "tr_static_init: 256 + dist != 512");
 
     /* Construct the codes of the static literal tree */
     for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
@@ -312,7 +312,7 @@ local void tr_static_init()
 }
 
 /* ===========================================================================
- * Genererate the file trees.h describing the static trees.
+ * Generate the file trees.h describing the static trees.
  */
 #ifdef GEN_TREES_H
 #  ifndef ZLIB_DEBUG
@@ -321,7 +321,7 @@ local void tr_static_init()
 
 #  define SEPARATOR(i, last, width) \
       ((i) == (last)? "\n};\n\n" :    \
-       ((i) % (width) == (width)-1 ? ",\n" : ", "))
+       ((i) % (width) == (width) - 1 ? ",\n" : ", "))
 
 void gen_trees_header()
 {
@@ -458,7 +458,7 @@ local void pqdownheap(s, tree, k)
     while (j <= s->heap_len) {
         /* Set j to the smallest of the two sons: */
         if (j < s->heap_len &&
-            smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
+            smaller(tree, s->heap[j + 1], s->heap[j], s->depth)) {
             j++;
         }
         /* Exit if v is smaller than both sons */
@@ -507,7 +507,7 @@ local void gen_bitlen(s, desc)
      */
     tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
 
-    for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
+    for (h = s->heap_max + 1; h < HEAP_SIZE; h++) {
         n = s->heap[h];
         bits = tree[tree[n].Dad].Len + 1;
         if (bits > max_length) bits = max_length, overflow++;
@@ -518,7 +518,7 @@ local void gen_bitlen(s, desc)
 
         s->bl_count[bits]++;
         xbits = 0;
-        if (n >= base) xbits = extra[n-base];
+        if (n >= base) xbits = extra[n - base];
         f = tree[n].Freq;
         s->opt_len += (ulg)f * (unsigned)(bits + xbits);
         if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits);
@@ -530,10 +530,10 @@ local void gen_bitlen(s, desc)
 
     /* Find the first bit length which could increase: */
     do {
-        bits = max_length-1;
+        bits = max_length - 1;
         while (s->bl_count[bits] == 0) bits--;
-        s->bl_count[bits]--;      /* move one leaf down the tree */
-        s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
+        s->bl_count[bits]--;        /* move one leaf down the tree */
+        s->bl_count[bits + 1] += 2; /* move one overflow item as its brother */
         s->bl_count[max_length]--;
         /* The brother of the overflow item also moves one step up,
          * but this does not affect bl_count[max_length]
@@ -569,7 +569,7 @@ local void gen_bitlen(s, desc)
  * OUT assertion: the field code is set for all tree elements of non
  *     zero code length.
  */
-local void gen_codes (tree, max_code, bl_count)
+local void gen_codes(tree, max_code, bl_count)
     ct_data *tree;             /* the tree to decorate */
     int max_code;              /* largest code with non zero frequency */
     ushf *bl_count;            /* number of codes at each bit length */
@@ -583,13 +583,13 @@ local void gen_codes (tree, max_code, bl_count)
      * without bit reversal.
      */
     for (bits = 1; bits <= MAX_BITS; bits++) {
-        code = (code + bl_count[bits-1]) << 1;
+        code = (code + bl_count[bits - 1]) << 1;
         next_code[bits] = (ush)code;
     }
     /* Check that the bit counts in bl_count are consistent. The last code
      * must be all ones.
      */
-    Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+    Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
             "inconsistent bit counts");
     Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
 
@@ -600,7 +600,7 @@ local void gen_codes (tree, max_code, bl_count)
         tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
 
         Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
-             n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+            n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
     }
 }
 
@@ -624,7 +624,7 @@ local void build_tree(s, desc)
     int node;          /* new node being created */
 
     /* Construct the initial heap, with least frequent element in
-     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n + 1].
      * heap[0] is not used.
      */
     s->heap_len = 0, s->heap_max = HEAP_SIZE;
@@ -652,7 +652,7 @@ local void build_tree(s, desc)
     }
     desc->max_code = max_code;
 
-    /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+    /* The elements heap[heap_len/2 + 1 .. heap_len] are leaves of the tree,
      * establish sub-heaps of increasing lengths:
      */
     for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
@@ -700,7 +700,7 @@ local void build_tree(s, desc)
  * Scan a literal or distance tree to determine the frequencies of the codes
  * in the bit length tree.
  */
-local void scan_tree (s, tree, max_code)
+local void scan_tree(s, tree, max_code)
     deflate_state *s;
     ct_data *tree;   /* the tree to be scanned */
     int max_code;    /* and its largest code of non zero frequency */
@@ -714,10 +714,10 @@ local void scan_tree (s, tree, max_code)
     int min_count = 4;         /* min repeat count */
 
     if (nextlen == 0) max_count = 138, min_count = 3;
-    tree[max_code+1].Len = (ush)0xffff; /* guard */
+    tree[max_code + 1].Len = (ush)0xffff; /* guard */
 
     for (n = 0; n <= max_code; n++) {
-        curlen = nextlen; nextlen = tree[n+1].Len;
+        curlen = nextlen; nextlen = tree[n + 1].Len;
         if (++count < max_count && curlen == nextlen) {
             continue;
         } else if (count < min_count) {
@@ -745,7 +745,7 @@ local void scan_tree (s, tree, max_code)
  * Send a literal or distance tree in compressed form, using the codes in
  * bl_tree.
  */
-local void send_tree (s, tree, max_code)
+local void send_tree(s, tree, max_code)
     deflate_state *s;
     ct_data *tree; /* the tree to be scanned */
     int max_code;       /* and its largest code of non zero frequency */
@@ -758,11 +758,11 @@ local void send_tree (s, tree, max_code)
     int max_count = 7;         /* max repeat count */
     int min_count = 4;         /* min repeat count */
 
-    /* tree[max_code+1].Len = -1; */  /* guard already set */
+    /* tree[max_code + 1].Len = -1; */  /* guard already set */
     if (nextlen == 0) max_count = 138, min_count = 3;
 
     for (n = 0; n <= max_code; n++) {
-        curlen = nextlen; nextlen = tree[n+1].Len;
+        curlen = nextlen; nextlen = tree[n + 1].Len;
         if (++count < max_count && curlen == nextlen) {
             continue;
         } else if (count < min_count) {
@@ -773,13 +773,13 @@ local void send_tree (s, tree, max_code)
                 send_code(s, curlen, s->bl_tree); count--;
             }
             Assert(count >= 3 && count <= 6, " 3_6?");
-            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
+            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count - 3, 2);
 
         } else if (count <= 10) {
-            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
+            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count - 3, 3);
 
         } else {
-            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
+            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count - 11, 7);
         }
         count = 0; prevlen = curlen;
         if (nextlen == 0) {
@@ -807,8 +807,8 @@ local int build_bl_tree(s)
 
     /* Build the bit length tree: */
     build_tree(s, (tree_desc *)(&(s->bl_desc)));
-    /* opt_len now includes the length of the tree representations, except
-     * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+    /* opt_len now includes the length of the tree representations, except the
+     * lengths of the bit lengths codes and the 5 + 5 + 4 bits for the counts.
      */
 
     /* Determine the number of bit length codes to send. The pkzip format
@@ -819,7 +819,7 @@ local int build_bl_tree(s)
         if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
     }
     /* Update opt_len to include the bit length tree and counts */
-    s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4;
+    s->opt_len += 3*((ulg)max_blindex + 1) + 5 + 5 + 4;
     Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
             s->opt_len, s->static_len));
 
@@ -841,19 +841,19 @@ local void send_all_trees(s, lcodes, dcodes, blcodes)
     Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
             "too many codes");
     Tracev((stderr, "\nbl counts: "));
-    send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
-    send_bits(s, dcodes-1,   5);
-    send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
+    send_bits(s, lcodes - 257, 5);  /* not +255 as stated in appnote.txt */
+    send_bits(s, dcodes - 1,   5);
+    send_bits(s, blcodes - 4,  4);  /* not -3 as stated in appnote.txt */
     for (rank = 0; rank < blcodes; rank++) {
         Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
         send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
     }
     Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
 
-    send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
+    send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1);  /* literal tree */
     Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
 
-    send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
+    send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1);  /* distance tree */
     Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
 }
 
@@ -866,17 +866,18 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
     ulg stored_len;   /* length of input block */
     int last;         /* one if this is the last block for a file */
 {
-    send_bits(s, (STORED_BLOCK<<1)+last, 3);    /* send block type */
+    send_bits(s, (STORED_BLOCK<<1) + last, 3);  /* send block type */
     bi_windup(s);        /* align on byte boundary */
     put_short(s, (ush)stored_len);
     put_short(s, (ush)~stored_len);
-    zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len);
+    if (stored_len)
+        zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len);
     s->pending += stored_len;
 #ifdef ZLIB_DEBUG
     s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
     s->compressed_len += (stored_len + 4) << 3;
     s->bits_sent += 2*16;
-    s->bits_sent += stored_len<<3;
+    s->bits_sent += stored_len << 3;
 #endif
 }
 
@@ -942,14 +943,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
         max_blindex = build_bl_tree(s);
 
         /* Determine the best encoding. Compute the block lengths in bytes. */
-        opt_lenb = (s->opt_len+3+7)>>3;
-        static_lenb = (s->static_len+3+7)>>3;
+        opt_lenb = (s->opt_len + 3 + 7) >> 3;
+        static_lenb = (s->static_len + 3 + 7) >> 3;
 
         Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
                 opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
                 s->sym_next / 3));
 
-        if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+#ifndef FORCE_STATIC
+        if (static_lenb <= opt_lenb || s->strategy == Z_FIXED)
+#endif
+            opt_lenb = static_lenb;
 
     } else {
         Assert(buf != (char*)0, "lost buf");
@@ -959,7 +963,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
 #ifdef FORCE_STORED
     if (buf != (char*)0) { /* force stored block */
 #else
-    if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+    if (stored_len + 4 <= opt_lenb && buf != (char*)0) {
                        /* 4: two words for the lengths */
 #endif
         /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
@@ -970,21 +974,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
          */
         _tr_stored_block(s, buf, stored_len, last);
 
-#ifdef FORCE_STATIC
-    } else if (static_lenb >= 0) { /* force static trees */
-#else
-    } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
-#endif
-        send_bits(s, (STATIC_TREES<<1)+last, 3);
+    } else if (static_lenb == opt_lenb) {
+        send_bits(s, (STATIC_TREES<<1) + last, 3);
         compress_block(s, (const ct_data *)static_ltree,
                        (const ct_data *)static_dtree);
 #ifdef ZLIB_DEBUG
         s->compressed_len += 3 + s->static_len;
 #endif
     } else {
-        send_bits(s, (DYN_TREES<<1)+last, 3);
-        send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
-                       max_blindex+1);
+        send_bits(s, (DYN_TREES<<1) + last, 3);
+        send_all_trees(s, s->l_desc.max_code + 1, s->d_desc.max_code + 1,
+                       max_blindex + 1);
         compress_block(s, (const ct_data *)s->dyn_ltree,
                        (const ct_data *)s->dyn_dtree);
 #ifdef ZLIB_DEBUG
@@ -1003,22 +1003,22 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
         s->compressed_len += 7;  /* align on byte boundary */
 #endif
     }
-    Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
-           s->compressed_len-7*last));
+    Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len >> 3,
+           s->compressed_len - 7*last));
 }
 
 /* ===========================================================================
  * Save the match info and tally the frequency counts. Return true if
  * the current block must be flushed.
  */
-int ZLIB_INTERNAL _tr_tally (s, dist, lc)
+int ZLIB_INTERNAL _tr_tally(s, dist, lc)
     deflate_state *s;
     unsigned dist;  /* distance of matched string */
-    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
+    unsigned lc;    /* match length - MIN_MATCH or unmatched char (dist==0) */
 {
-    s->sym_buf[s->sym_next++] = dist;
-    s->sym_buf[s->sym_next++] = dist >> 8;
-    s->sym_buf[s->sym_next++] = lc;
+    s->sym_buf[s->sym_next++] = (uch)dist;
+    s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
+    s->sym_buf[s->sym_next++] = (uch)lc;
     if (dist == 0) {
         /* lc is the unmatched char */
         s->dyn_ltree[lc].Freq++;
@@ -1030,7 +1030,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc)
                (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
                (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
 
-        s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
+        s->dyn_ltree[_length_code[lc] + LITERALS + 1].Freq++;
         s->dyn_dtree[d_code(dist)].Freq++;
     }
     return (s->sym_next == s->sym_end);
@@ -1060,7 +1060,7 @@ local void compress_block(s, ltree, dtree)
         } else {
             /* Here, lc is the match length - MIN_MATCH */
             code = _length_code[lc];
-            send_code(s, code+LITERALS+1, ltree); /* send the length code */
+            send_code(s, code + LITERALS + 1, ltree);   /* send length code */
             extra = extra_lbits[code];
             if (extra != 0) {
                 lc -= base_length[code];
@@ -1090,9 +1090,9 @@ local void compress_block(s, ltree, dtree)
  * Check if the data type is TEXT or BINARY, using the following algorithm:
  * - TEXT if the two conditions below are satisfied:
  *    a) There are no non-portable control characters belonging to the
- *       "black list" (0..6, 14..25, 28..31).
+ *       "block list" (0..6, 14..25, 28..31).
  *    b) There is at least one printable character belonging to the
- *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ *       "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
  * - BINARY otherwise.
  * - The following partially-portable control characters form a
  *   "gray list" that is ignored in this detection algorithm:
@@ -1102,19 +1102,19 @@ local void compress_block(s, ltree, dtree)
 local int detect_data_type(s)
     deflate_state *s;
 {
-    /* black_mask is the bit mask of black-listed bytes
+    /* block_mask is the bit mask of block-listed bytes
      * set bits 0..6, 14..25, and 28..31
      * 0xf3ffc07f = binary 11110011111111111100000001111111
      */
-    unsigned long black_mask = 0xf3ffc07fUL;
+    unsigned long block_mask = 0xf3ffc07fUL;
     int n;
 
-    /* Check for non-textual ("black-listed") bytes. */
-    for (n = 0; n <= 31; n++, black_mask >>= 1)
-        if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))
+    /* Check for non-textual ("block-listed") bytes. */
+    for (n = 0; n <= 31; n++, block_mask >>= 1)
+        if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
             return Z_BINARY;
 
-    /* Check for textual ("white-listed") bytes. */
+    /* Check for textual ("allow-listed") bytes. */
     if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
             || s->dyn_ltree[13].Freq != 0)
         return Z_TEXT;
@@ -1122,7 +1122,7 @@ local int detect_data_type(s)
         if (s->dyn_ltree[n].Freq != 0)
             return Z_TEXT;
 
-    /* There are no "black-listed" or "white-listed" bytes:
+    /* There are no "block-listed" or "allow-listed" bytes:
      * this stream either is empty or has tolerated ("gray-listed") bytes only.
      */
     return Z_BINARY;
@@ -1176,6 +1176,6 @@ local void bi_windup(s)
     s->bi_buf = 0;
     s->bi_valid = 0;
 #ifdef ZLIB_DEBUG
-    s->bits_sent = (s->bits_sent+7) & ~7;
+    s->bits_sent = (s->bits_sent + 7) & ~7;
 #endif
 }
diff --git a/deps/zlib/uncompr.c b/deps/zlib/uncompr.c
index f03a1a865e347d..f9532f46c1a69f 100644
--- a/deps/zlib/uncompr.c
+++ b/deps/zlib/uncompr.c
@@ -24,7 +24,7 @@
    Z_DATA_ERROR if the input data was corrupted, including if the input data is
    an incomplete zlib stream.
 */
-int ZEXPORT uncompress2 (dest, destLen, source, sourceLen)
+int ZEXPORT uncompress2(dest, destLen, source, sourceLen)
     Bytef *dest;
     uLongf *destLen;
     const Bytef *source;
@@ -83,7 +83,7 @@ int ZEXPORT uncompress2 (dest, destLen, source, sourceLen)
            err;
 }
 
-int ZEXPORT uncompress (dest, destLen, source, sourceLen)
+int ZEXPORT uncompress(dest, destLen, source, sourceLen)
     Bytef *dest;
     uLongf *destLen;
     const Bytef *source;
diff --git a/deps/zlib/x86.c b/deps/zlib/x86.c
deleted file mode 100644
index 7488ad08b976c8..00000000000000
--- a/deps/zlib/x86.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * x86 feature check
- *
- * Copyright (C) 2013 Intel Corporation. All rights reserved.
- * Author:
- *  Jim Kukunas
- *
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "x86.h"
-#include "zutil.h"
-
-int ZLIB_INTERNAL x86_cpu_enable_ssse3 = 0;
-int ZLIB_INTERNAL x86_cpu_enable_simd = 0;
-
-#ifndef _MSC_VER
-#include <pthread.h>
-
-pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT;
-static void _x86_check_features(void);
-
-void x86_check_features(void)
-{
-  pthread_once(&cpu_check_inited_once, _x86_check_features);
-}
-
-static void _x86_check_features(void)
-{
-    int x86_cpu_has_sse2;
-    int x86_cpu_has_ssse3;
-    int x86_cpu_has_sse42;
-    int x86_cpu_has_pclmulqdq;
-    unsigned eax, ebx, ecx, edx;
-
-    eax = 1;
-#ifdef __i386__
-    __asm__ __volatile__ (
-        "xchg %%ebx, %1\n\t"
-        "cpuid\n\t"
-        "xchg %1, %%ebx\n\t"
-    : "+a" (eax), "=S" (ebx), "=c" (ecx), "=d" (edx)
-    );
-#else
-    __asm__ __volatile__ (
-        "cpuid\n\t"
-    : "+a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-    );
-#endif  /* (__i386__) */
-
-    x86_cpu_has_sse2 = edx & 0x4000000;
-    x86_cpu_has_ssse3 = ecx & 0x000200;
-    x86_cpu_has_sse42 = ecx & 0x100000;
-    x86_cpu_has_pclmulqdq = ecx & 0x2;
-
-    x86_cpu_enable_ssse3 = x86_cpu_has_ssse3;
-
-    x86_cpu_enable_simd = x86_cpu_has_sse2 &&
-                          x86_cpu_has_sse42 &&
-                          x86_cpu_has_pclmulqdq;
-}
-#else
-#include <intrin.h>
-#include <windows.h>
-
-static BOOL CALLBACK _x86_check_features(PINIT_ONCE once,
-                                         PVOID param,
-                                         PVOID *context);
-static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT;
-
-void x86_check_features(void)
-{
-    InitOnceExecuteOnce(&cpu_check_inited_once, _x86_check_features,
-                        NULL, NULL);
-}
-
-static BOOL CALLBACK _x86_check_features(PINIT_ONCE once,
-                                         PVOID param,
-                                         PVOID *context)
-{
-    int x86_cpu_has_sse2;
-    int x86_cpu_has_ssse3;
-    int x86_cpu_has_sse42;
-    int x86_cpu_has_pclmulqdq;
-    int regs[4];
-
-    __cpuid(regs, 1);
-
-    x86_cpu_has_sse2 = regs[3] & 0x4000000;
-    x86_cpu_has_ssse3 = regs[2] & 0x000200;
-    x86_cpu_has_sse42 = regs[2] & 0x100000;
-    x86_cpu_has_pclmulqdq = regs[2] & 0x2;
-
-    x86_cpu_enable_ssse3 = x86_cpu_has_ssse3;
-
-    x86_cpu_enable_simd = x86_cpu_has_sse2 &&
-                          x86_cpu_has_sse42 &&
-                          x86_cpu_has_pclmulqdq;
-    return TRUE;
-}
-#endif  /* _MSC_VER */
diff --git a/deps/zlib/x86.h b/deps/zlib/x86.h
deleted file mode 100644
index 7205d50265c356..00000000000000
--- a/deps/zlib/x86.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* x86.h -- check for x86 CPU features
-* Copyright (C) 2013 Intel Corporation Jim Kukunas
-* For conditions of distribution and use, see copyright notice in zlib.h
-*/
-
-#ifndef X86_H
-#define X86_H
-
-#include "zlib.h"
-
-extern int x86_cpu_enable_ssse3;
-extern int x86_cpu_enable_simd;
-
-void x86_check_features(void);
-
-#endif  /* X86_H */
diff --git a/deps/zlib/zconf.h b/deps/zlib/zconf.h
index 353fd36f17e3e5..c88d40847b6af8 100644
--- a/deps/zlib/zconf.h
+++ b/deps/zlib/zconf.h
@@ -50,6 +50,9 @@
 #  define crc32                 z_crc32
 #  define crc32_combine         z_crc32_combine
 #  define crc32_combine64       z_crc32_combine64
+#  define crc32_combine_gen     z_crc32_combine_gen
+#  define crc32_combine_gen64   z_crc32_combine_gen64
+#  define crc32_combine_op      z_crc32_combine_op
 #  define crc32_z               z_crc32_z
 #  define deflate               z_deflate
 #  define deflateBound          z_deflateBound
@@ -361,6 +364,9 @@
 #    ifdef FAR
 #      undef FAR
 #    endif
+#    ifndef WIN32_LEAN_AND_MEAN
+#      define WIN32_LEAN_AND_MEAN
+#    endif
 #    include <windows.h>
      /* No need for _export, use ZLIB.DEF instead. */
      /* For complete Windows compatibility, use WINAPI, not __stdcall. */
@@ -482,11 +488,18 @@ typedef uLong FAR uLongf;
 #  undef _LARGEFILE64_SOURCE
 #endif
 
-#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
-#  define Z_HAVE_UNISTD_H
+#ifndef Z_HAVE_UNISTD_H
+#  ifdef __WATCOMC__
+#    define Z_HAVE_UNISTD_H
+#  endif
+#endif
+#ifndef Z_HAVE_UNISTD_H
+#  if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)
+#    define Z_HAVE_UNISTD_H
+#  endif
 #endif
 #ifndef Z_SOLO
-#  if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+#  if defined(Z_HAVE_UNISTD_H)
 #    include <unistd.h>         /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
 #    ifdef VMS
 #      include <unixio.h>       /* for off_t */
diff --git a/deps/zlib/zlib.gyp b/deps/zlib/zlib.gyp
index b6bebb6cf4e6a4..547143e19dca45 100644
--- a/deps/zlib/zlib.gyp
+++ b/deps/zlib/zlib.gyp
@@ -18,6 +18,8 @@
             'adler32.c',
             'compress.c',
             'contrib/optimizations/insert_string.h',
+            'cpu_features.c',
+            'cpu_features.h',
             'crc32.c',
             'crc32.h',
             'deflate.c',
@@ -37,7 +39,6 @@
             'trees.c',
             'trees.h',
             'uncompr.c',
-            'x86.h',
             'zconf.h',
             'zlib.h',
             'zutil.c',
@@ -57,7 +58,7 @@
               'cflags': [ '-Wno-implicit-fallthrough' ],
               'defines': [ 'HAVE_HIDDEN' ],
             }],
-            ['OS=="mac" or OS=="ios" or OS=="freebsd" or OS=="android"', {
+            ['OS=="mac" or OS=="freebsd" or OS=="android"', {
               # Mac, Android and the BSDs don't have fopen64, ftello64, or
               # fseeko64. We use fopen, ftell, and fseek instead on these
               # systems.
@@ -67,12 +68,11 @@
             }],
             ['(target_arch in "ia32 x64" and OS!="ios") or arm_fpu=="neon"', {
               'sources': [
-                'adler32_simd.c',
-                'adler32_simd.h',
                 'contrib/optimizations/chunkcopy.h',
                 'contrib/optimizations/inffast_chunk.c',
                 'contrib/optimizations/inffast_chunk.h',
                 'contrib/optimizations/inflate.c',
+                'slide_hash_simd.h'
               ],
             }, {
               'sources': [ 'inflate.c', ],
@@ -83,55 +83,68 @@
                 'ADLER32_SIMD_SSSE3',
                 'INFLATE_CHUNK_SIMD_SSE2',
                 'CRC32_SIMD_SSE42_PCLMUL',
+                'DEFLATE_SLIDE_HASH_SSE2'
               ],
               'sources': [
+                'adler32_simd.c',
+                'adler32_simd.h',
                 'crc32_simd.c',
                 'crc32_simd.h',
-                'crc_folding.c',
-                'fill_window_sse.c',
-                'x86.c',
+                'crc_folding.c'
               ],
               'conditions': [
                 ['target_arch=="x64"', {
                   'defines': [ 'INFLATE_CHUNK_READ_64LE' ],
                 }],
+                ['OS=="win"', {
+                  'defines': [ 'X86_WINDOWS' ]
+                }, {
+                  'defines': [ 'X86_NOT_WINDOWS' ]
+                }]
               ],
-            }, {
-              'sources': [ 'simd_stub.c', ],
             }],
             ['arm_fpu=="neon"', {
-              'defines': [
-                'ADLER32_SIMD_NEON',
-                'INFLATE_CHUNK_SIMD_NEON',
-              ],
-              'sources': [
-                'contrib/optimizations/slide_hash_neon.h',
-              ],
+              'defines': [ '__ARM_NEON__' ],
               'conditions': [
-                ['OS!="ios"', {
-                  'defines': [ 'CRC32_ARMV8_CRC32' ],
-                  'sources': [
-                    'arm_features.c',
-                    'arm_features.h',
-                    'crc32_simd.c',
-                    'crc32_simd.h',
-                  ],
+                ['OS=="win"', {
+                  'defines': [
+                    'ARMV8_OS_WINDOWS',
+                    'DEFLATE_SLIDE_HASH_NEON',
+                    'INFLATE_CHUNK_SIMD_NEON'
+                  ]
+                }, {
                   'conditions': [
-                    ['OS=="android"', {
-                      'defines': [ 'ARMV8_OS_ANDROID' ],
-                    }],
-                    ['OS=="linux"', {
-                      'defines': [ 'ARMV8_OS_LINUX' ],
-                    }],
-                    ['OS=="win"', {
-                      'defines': [ 'ARMV8_OS_WINDOWS' ],
-                    }],
-                    ['OS!="android" and OS!="win" and llvm_version=="0.0"', {
-                      'cflags': [
-                        '-march=armv8-a+crc',
+                    ['OS!="ios"', {
+                      'defines': [
+                        'ADLER32_SIMD_NEON',
+                        'CRC32_ARMV8_CRC32',
+                        'DEFLATE_SLIDE_HASH_NEON',
+                        'INFLATE_CHUNK_SIMD_NEON'
+                      ],
+                      'sources': [
+                        'adler32_simd.c',
+                        'adler32_simd.h',
+                        'crc32_simd.c',
+                        'crc32_simd.h',
+                      ],
+                      'conditions': [
+                        ['OS=="android"', {
+                          'defines': [ 'ARMV8_OS_ANDROID' ],
+                        }],
+                        ['OS=="linux"', {
+                          'defines': [ 'ARMV8_OS_LINUX' ],
+                        }],
+                        ['OS=="mac"', {
+                          'defines': [ 'ARMV8_OS_MACOS' ],
+                        }],
+                        ['llvm_version=="0.0"', {
+                          'cflags': [
+                            '-march=armv8-a+aes+crc',
+                          ],
+                        }],
                       ],
-                    }],
-                  ],
+                    }]
+                  ]
                 }],
                 ['target_arch=="arm64"', {
                   'defines': [ 'INFLATE_CHUNK_READ_64LE' ],
diff --git a/deps/zlib/zlib.h b/deps/zlib/zlib.h
index 99fd467f6b1a54..cff21a1564dfdf 100644
--- a/deps/zlib/zlib.h
+++ b/deps/zlib/zlib.h
@@ -1,7 +1,7 @@
 /* zlib.h -- interface of the 'zlib' general purpose compression library
-  version 1.2.11, January 15th, 2017
+  version 1.2.13, October 13th, 2022
 
-  Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+  Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -37,11 +37,11 @@
 extern "C" {
 #endif
 
-#define ZLIB_VERSION "1.2.11"
-#define ZLIB_VERNUM 0x12b0
+#define ZLIB_VERSION "1.2.13"
+#define ZLIB_VERNUM 0x12d0
 #define ZLIB_VER_MAJOR 1
 #define ZLIB_VER_MINOR 2
-#define ZLIB_VER_REVISION 11
+#define ZLIB_VER_REVISION 13
 #define ZLIB_VER_SUBREVISION 0
 
 /*
@@ -276,7 +276,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
   == 0), or after each call of deflate().  If deflate returns Z_OK and with
   zero avail_out, it must be called again after making room in the output
   buffer because there might be more output pending. See deflatePending(),
-  which can be used if desired to determine whether or not there is more ouput
+  which can be used if desired to determine whether or not there is more output
   in that case.
 
     Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
@@ -359,7 +359,6 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
   continue compressing.
 */
 
-
 ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
 /*
      All dynamically allocated data structures for this stream are freed.
@@ -543,8 +542,7 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
                                      int  strategy));
 
      This is another version of deflateInit with more compression options.  The
-   fields next_in, zalloc, zfree and opaque must be initialized before by the
-   caller.
+   fields zalloc, zfree and opaque must be initialized before by the caller.
 
      The method parameter is the compression method.  It must be Z_DEFLATED in
    this version of the library.
@@ -661,7 +659,7 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
    to dictionary.  dictionary must have enough space, where 32768 bytes is
    always enough.  If deflateGetDictionary() is called with dictionary equal to
    Z_NULL, then only the dictionary length is returned, and nothing is copied.
-   Similary, if dictLength is Z_NULL, then it is not set.
+   Similarly, if dictLength is Z_NULL, then it is not set.
 
      deflateGetDictionary() may return a length less than the window size, even
    when more than the window size in input has been provided. It may return up
@@ -712,11 +710,12 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
    used to switch between compression and straight copy of the input data, or
    to switch to a different kind of input data requiring a different strategy.
    If the compression approach (which is a function of the level) or the
-   strategy is changed, and if any input has been consumed in a previous
-   deflate() call, then the input available so far is compressed with the old
-   level and strategy using deflate(strm, Z_BLOCK).  There are three approaches
-   for the compression levels 0, 1..3, and 4..9 respectively.  The new level
-   and strategy will take effect at the next call of deflate().
+   strategy is changed, and if there have been any deflate() calls since the
+   state was initialized or reset, then the input available so far is
+   compressed with the old level and strategy using deflate(strm, Z_BLOCK).
+   There are three approaches for the compression levels 0, 1..3, and 4..9
+   respectively.  The new level and strategy will take effect at the next call
+   of deflate().
 
      If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does
    not have enough output space to complete, then the parameter change will not
@@ -865,9 +864,11 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
    detection, or add 16 to decode only the gzip format (the zlib format will
    return a Z_DATA_ERROR).  If a gzip stream is being decoded, strm->adler is a
    CRC-32 instead of an Adler-32.  Unlike the gunzip utility and gzread() (see
-   below), inflate() will not automatically decode concatenated gzip streams.
-   inflate() will return Z_STREAM_END at the end of the gzip stream.  The state
-   would need to be reset to continue decoding a subsequent gzip stream.
+   below), inflate() will *not* automatically decode concatenated gzip members.
+   inflate() will return Z_STREAM_END at the end of the gzip member.  The state
+   would need to be reset to continue decoding a subsequent gzip member.  This
+   *must* be done if there is more data after a gzip member, in order for the
+   decompression to be compliant with the gzip standard (RFC 1952).
 
      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
    memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
@@ -913,7 +914,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
    to dictionary.  dictionary must have enough space, where 32768 bytes is
    always enough.  If inflateGetDictionary() is called with dictionary equal to
    Z_NULL, then only the dictionary length is returned, and nothing is copied.
-   Similary, if dictLength is Z_NULL, then it is not set.
+   Similarly, if dictLength is Z_NULL, then it is not set.
 
      inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
    stream state is inconsistent.
@@ -1302,14 +1303,14 @@ typedef struct gzFile_s *gzFile;    /* semi-opaque gzip file descriptor */
 /*
 ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
 
-     Opens a gzip (.gz) file for reading or writing.  The mode parameter is as
-   in fopen ("rb" or "wb") but can also include a compression level ("wb9") or
-   a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only
-   compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'
-   for fixed code compression as in "wb9F".  (See the description of
-   deflateInit2 for more information about the strategy parameter.)  'T' will
-   request transparent writing or appending with no compression and not using
-   the gzip format.
+     Open the gzip (.gz) file at path for reading and decompressing, or
+   compressing and writing.  The mode parameter is as in fopen ("rb" or "wb")
+   but can also include a compression level ("wb9") or a strategy: 'f' for
+   filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h",
+   'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression
+   as in "wb9F".  (See the description of deflateInit2 for more information
+   about the strategy parameter.)  'T' will request transparent writing or
+   appending with no compression and not using the gzip format.
 
      "a" can be used instead of "w" to request that the gzip stream that will
    be written be appended to the file.  "+" will result in an error, since
@@ -1339,9 +1340,9 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
 
 ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
 /*
-     gzdopen associates a gzFile with the file descriptor fd.  File descriptors
-   are obtained from calls like open, dup, creat, pipe or fileno (if the file
-   has been previously opened with fopen).  The mode parameter is as in gzopen.
+     Associate a gzFile with the file descriptor fd.  File descriptors are
+   obtained from calls like open, dup, creat, pipe or fileno (if the file has
+   been previously opened with fopen).  The mode parameter is as in gzopen.
 
      The next call of gzclose on the returned gzFile will also close the file
    descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor
@@ -1362,13 +1363,13 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
 
 ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
 /*
-     Set the internal buffer size used by this library's functions.  The
-   default buffer size is 8192 bytes.  This function must be called after
-   gzopen() or gzdopen(), and before any other calls that read or write the
-   file.  The buffer memory allocation is always deferred to the first read or
-   write.  Three times that size in buffer space is allocated.  A larger buffer
-   size of, for example, 64K or 128K bytes will noticeably increase the speed
-   of decompression (reading).
+     Set the internal buffer size used by this library's functions for file to
+   size.  The default buffer size is 8192 bytes.  This function must be called
+   after gzopen() or gzdopen(), and before any other calls that read or write
+   the file.  The buffer memory allocation is always deferred to the first read
+   or write.  Three times that size in buffer space is allocated.  A larger
+   buffer size of, for example, 64K or 128K bytes will noticeably increase the
+   speed of decompression (reading).
 
      The new buffer size also affects the maximum length for gzprintf().
 
@@ -1378,9 +1379,9 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
 
 ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
 /*
-     Dynamically update the compression level or strategy.  See the description
-   of deflateInit2 for the meaning of these parameters.  Previously provided
-   data is flushed before the parameter change.
+     Dynamically update the compression level and strategy for file.  See the
+   description of deflateInit2 for the meaning of these parameters. Previously
+   provided data is flushed before applying the parameter changes.
 
      gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not
    opened for writing, Z_ERRNO if there is an error writing the flushed data,
@@ -1389,7 +1390,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
 
 ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
 /*
-     Reads the given number of uncompressed bytes from the compressed file.  If
+     Read and decompress up to len uncompressed bytes from file into buf.  If
    the input file is not in gzip format, gzread copies the given number of
    bytes into the buffer directly from the file.
 
@@ -1420,11 +1421,11 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
 ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
                                      gzFile file));
 /*
-     Read up to nitems items of size size from file to buf, otherwise operating
-   as gzread() does.  This duplicates the interface of stdio's fread(), with
-   size_t request and return types.  If the library defines size_t, then
-   z_size_t is identical to size_t.  If not, then z_size_t is an unsigned
-   integer type that can contain a pointer.
+     Read and decompress up to nitems items of size size from file into buf,
+   otherwise operating as gzread() does.  This duplicates the interface of
+   stdio's fread(), with size_t request and return types.  If the library
+   defines size_t, then z_size_t is identical to size_t.  If not, then z_size_t
+   is an unsigned integer type that can contain a pointer.
 
      gzfread() returns the number of full items read of size size, or zero if
    the end of the file was reached and a full item could not be read, or if
@@ -1435,26 +1436,24 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
 
      In the event that the end of file is reached and only a partial item is
    available at the end, i.e. the remaining uncompressed data length is not a
-   multiple of size, then the final partial item is nevetheless read into buf
+   multiple of size, then the final partial item is nevertheless read into buf
    and the end-of-file flag is set.  The length of the partial item read is not
    provided, but could be inferred from the result of gztell().  This behavior
    is the same as the behavior of fread() implementations in common libraries,
    but it prevents the direct use of gzfread() to read a concurrently written
-   file, reseting and retrying on end-of-file, when size is not 1.
+   file, resetting and retrying on end-of-file, when size is not 1.
 */
 
-ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
-                                voidpc buf, unsigned len));
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len));
 /*
-     Writes the given number of uncompressed bytes into the compressed file.
-   gzwrite returns the number of uncompressed bytes written or 0 in case of
-   error.
+     Compress and write the len uncompressed bytes at buf to file. gzwrite
+   returns the number of uncompressed bytes written or 0 in case of error.
 */
 
 ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
                                       z_size_t nitems, gzFile file));
 /*
-     gzfwrite() writes nitems items of size size from buf to file, duplicating
+     Compress and write nitems items of size size from buf to file, duplicating
    the interface of stdio's fwrite(), with size_t request and return types.  If
    the library defines size_t, then z_size_t is identical to size_t.  If not,
    then z_size_t is an unsigned integer type that can contain a pointer.
@@ -1467,22 +1466,22 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
 
 ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
 /*
-     Converts, formats, and writes the arguments to the compressed file under
-   control of the format string, as in fprintf.  gzprintf returns the number of
+     Convert, format, compress, and write the arguments (...) to file under
+   control of the string format, as in fprintf.  gzprintf returns the number of
    uncompressed bytes actually written, or a negative zlib error code in case
    of error.  The number of uncompressed bytes written is limited to 8191, or
    one less than the buffer size given to gzbuffer().  The caller should assure
    that this limit is not exceeded.  If it is exceeded, then gzprintf() will
    return an error (0) with nothing written.  In this case, there may also be a
    buffer overflow with unpredictable consequences, which is possible only if
-   zlib was compiled with the insecure functions sprintf() or vsprintf()
+   zlib was compiled with the insecure functions sprintf() or vsprintf(),
    because the secure snprintf() or vsnprintf() functions were not available.
    This can be determined using zlibCompileFlags().
 */
 
 ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
 /*
-     Writes the given null-terminated string to the compressed file, excluding
+     Compress and write the given null-terminated string s to file, excluding
    the terminating null character.
 
      gzputs returns the number of characters written, or -1 in case of error.
@@ -1490,11 +1489,12 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
 
 ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
 /*
-     Reads bytes from the compressed file until len-1 characters are read, or a
-   newline character is read and transferred to buf, or an end-of-file
-   condition is encountered.  If any characters are read or if len == 1, the
-   string is terminated with a null character.  If no characters are read due
-   to an end-of-file or len < 1, then the buffer is left untouched.
+     Read and decompress bytes from file into buf, until len-1 characters are
+   read, or until a newline character is read and transferred to buf, or an
+   end-of-file condition is encountered.  If any characters are read or if len
+   is one, the string is terminated with a null character.  If no characters
+   are read due to an end-of-file or len is less than one, then the buffer is
+   left untouched.
 
      gzgets returns buf which is a null-terminated string, or it returns NULL
    for end-of-file or in case of error.  If there was an error, the contents at
@@ -1503,13 +1503,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
 
 ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
 /*
-     Writes c, converted to an unsigned char, into the compressed file.  gzputc
+     Compress and write c, converted to an unsigned char, into file.  gzputc
    returns the value that was written, or -1 in case of error.
 */
 
 ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
 /*
-     Reads one byte from the compressed file.  gzgetc returns this byte or -1
+     Read and decompress one byte from file.  gzgetc returns this byte or -1
    in case of end of file or error.  This is implemented as a macro for speed.
    As such, it does not do all of the checking the other functions do.  I.e.
    it does not check to see if file is NULL, nor whether the structure file
@@ -1518,8 +1518,8 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
 
 ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
 /*
-     Push one character back onto the stream to be read as the first character
-   on the next read.  At least one character of push-back is allowed.
+     Push c back onto the stream for file to be read as the first character on
+   the next read.  At least one character of push-back is always allowed.
    gzungetc() returns the character pushed, or -1 on failure.  gzungetc() will
    fail if c is -1, and may fail if a character has been pushed but not read
    yet.  If gzungetc is used immediately after gzopen or gzdopen, at least the
@@ -1530,9 +1530,9 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
 
 ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
 /*
-     Flushes all pending output into the compressed file.  The parameter flush
-   is as in the deflate() function.  The return value is the zlib error number
-   (see function gzerror below).  gzflush is only permitted when writing.
+     Flush all pending output to file.  The parameter flush is as in the
+   deflate() function.  The return value is the zlib error number (see function
+   gzerror below).  gzflush is only permitted when writing.
 
      If the flush parameter is Z_FINISH, the remaining data is written and the
    gzip stream is completed in the output.  If gzwrite() is called again, a new
@@ -1547,8 +1547,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
 ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
                                    z_off_t offset, int whence));
 
-     Sets the starting position for the next gzread or gzwrite on the given
-   compressed file.  The offset represents a number of bytes in the
+     Set the starting position to offset relative to whence for the next gzread
+   or gzwrite on file.  The offset represents a number of bytes in the
    uncompressed data stream.  The whence parameter is defined as in lseek(2);
    the value SEEK_END is not supported.
 
@@ -1565,18 +1565,18 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
 
 ZEXTERN int ZEXPORT    gzrewind OF((gzFile file));
 /*
-     Rewinds the given file. This function is supported only for reading.
+     Rewind file. This function is supported only for reading.
 
-     gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+     gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET).
 */
 
 /*
 ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));
 
-     Returns the starting position for the next gzread or gzwrite on the given
-   compressed file.  This position represents a number of bytes in the
-   uncompressed data stream, and is zero when starting, even if appending or
-   reading a gzip stream from the middle of a file using gzdopen().
+     Return the starting position for the next gzread or gzwrite on file.
+   This position represents a number of bytes in the uncompressed data stream,
+   and is zero when starting, even if appending or reading a gzip stream from
+   the middle of a file using gzdopen().
 
      gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
 */
@@ -1584,22 +1584,22 @@ ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));
 /*
 ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
 
-     Returns the current offset in the file being read or written.  This offset
-   includes the count of bytes that precede the gzip stream, for example when
-   appending or when using gzdopen() for reading.  When reading, the offset
-   does not include as yet unused buffered input.  This information can be used
-   for a progress indicator.  On error, gzoffset() returns -1.
+     Return the current compressed (actual) read or write offset of file.  This
+   offset includes the count of bytes that precede the gzip stream, for example
+   when appending or when using gzdopen() for reading.  When reading, the
+   offset does not include as yet unused buffered input.  This information can
+   be used for a progress indicator.  On error, gzoffset() returns -1.
 */
 
 ZEXTERN int ZEXPORT gzeof OF((gzFile file));
 /*
-     Returns true (1) if the end-of-file indicator has been set while reading,
-   false (0) otherwise.  Note that the end-of-file indicator is set only if the
-   read tried to go past the end of the input, but came up short.  Therefore,
-   just like feof(), gzeof() may return false even if there is no more data to
-   read, in the event that the last read request was for the exact number of
-   bytes remaining in the input file.  This will happen if the input file size
-   is an exact multiple of the buffer size.
+     Return true (1) if the end-of-file indicator for file has been set while
+   reading, false (0) otherwise.  Note that the end-of-file indicator is set
+   only if the read tried to go past the end of the input, but came up short.
+   Therefore, just like feof(), gzeof() may return false even if there is no
+   more data to read, in the event that the last read request was for the exact
+   number of bytes remaining in the input file.  This will happen if the input
+   file size is an exact multiple of the buffer size.
 
      If gzeof() returns true, then the read functions will return no more data,
    unless the end-of-file indicator is reset by gzclearerr() and the input file
@@ -1608,7 +1608,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file));
 
 ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
 /*
-     Returns true (1) if file is being copied directly while reading, or false
+     Return true (1) if file is being copied directly while reading, or false
    (0) if file is a gzip stream being decompressed.
 
      If the input file is empty, gzdirect() will return true, since the input
@@ -1629,8 +1629,8 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
 
 ZEXTERN int ZEXPORT    gzclose OF((gzFile file));
 /*
-     Flushes all pending output if necessary, closes the compressed file and
-   deallocates the (de)compression state.  Note that once file is closed, you
+     Flush all pending output for file, if necessary, close file and
+   deallocate the (de)compression state.  Note that once file is closed, you
    cannot call gzerror with file, since its structures have been deallocated.
    gzclose must not be called more than once on the same file, just as free
    must not be called more than once on the same allocation.
@@ -1654,10 +1654,10 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
 
 ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
 /*
-     Returns the error message for the last error which occurred on the given
-   compressed file.  errnum is set to zlib error number.  If an error occurred
-   in the file system and not in the compression library, errnum is set to
-   Z_ERRNO and the application may consult errno to get the exact error code.
+     Return the error message for the last error which occurred on file.
+   errnum is set to zlib error number.  If an error occurred in the file system
+   and not in the compression library, errnum is set to Z_ERRNO and the
+   application may consult errno to get the exact error code.
 
      The application must not modify the returned string.  Future calls to
    this function may invalidate the previously returned string.  If file is
@@ -1670,7 +1670,7 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
 
 ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
 /*
-     Clears the error and end-of-file flags for file.  This is analogous to the
+     Clear the error and end-of-file flags for file.  This is analogous to the
    clearerr() function in stdio.  This is useful for continuing to read a gzip
    file that is being written concurrently.
 */
@@ -1688,8 +1688,9 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
 ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
 /*
      Update a running Adler-32 checksum with the bytes buf[0..len-1] and
-   return the updated checksum.  If buf is Z_NULL, this function returns the
-   required initial value for the checksum.
+   return the updated checksum. An Adler-32 value is in the range of a 32-bit
+   unsigned integer. If buf is Z_NULL, this function returns the required
+   initial value for the checksum.
 
      An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed
    much faster.
@@ -1722,12 +1723,13 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
    negative, the result has no meaning or utility.
 */
 
-ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));
+ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
 /*
      Update a running CRC-32 with the bytes buf[0..len-1] and return the
-   updated CRC-32.  If buf is Z_NULL, this function returns the required
-   initial value for the crc.  Pre- and post-conditioning (one's complement) is
-   performed within this function so it shouldn't be done by the application.
+   updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer.
+   If buf is Z_NULL, this function returns the required initial value for the
+   crc. Pre- and post-conditioning (one's complement) is performed within this
+   function so it shouldn't be done by the application.
 
    Usage example:
 
@@ -1739,7 +1741,7 @@ ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));
      if (crc != original_crc) error();
 */
 
-ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf,
+ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf,
                                   z_size_t len));
 /*
      Same as crc32(), but with a size_t length.
@@ -1755,6 +1757,20 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
    len2.
 */
 
+/*
+ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2));
+
+     Return the operator corresponding to length len2, to be used with
+   crc32_combine_op().
+*/
+
+ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op));
+/*
+     Give the same result as crc32_combine(), using op in place of len2. op is
+   is generated from len2 by crc32_combine_gen(). This will be faster than
+   crc32_combine() if the generated op is used more than once.
+*/
+
 
                         /* various hacks, don't look :) */
 
@@ -1847,6 +1863,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */
    ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
    ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
    ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
+   ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t));
 #endif
 
 #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
@@ -1857,6 +1874,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */
 #    define z_gzoffset z_gzoffset64
 #    define z_adler32_combine z_adler32_combine64
 #    define z_crc32_combine z_crc32_combine64
+#    define z_crc32_combine_gen z_crc32_combine_gen64
 #  else
 #    ifdef gzopen
 #      undef gzopen
@@ -1881,7 +1899,15 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */
 #    ifdef crc32_combine
 #      undef crc32_combine
 #    endif
-#    define crc32_combine crc32_combine64
+#    ifdef crc32_combine64
+#      undef crc32_combine64
+#    endif
+#    ifdef crc32_combine_gen
+#      undef crc32_combine_gen
+#    endif
+#    ifdef crc32_combine_op
+#      undef crc32_combine_op
+#    endif
 #  endif
 #  ifndef Z_LARGE64
      ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
@@ -1890,6 +1916,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */
      ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));
      ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
      ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
+     ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
 #  endif
 #else
    ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
@@ -1898,12 +1925,14 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */
    ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
    ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
    ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+   ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
 #endif
 
 #else /* Z_SOLO */
 
    ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
    ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+   ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t));
 
 #endif /* !Z_SOLO */
 
@@ -1913,10 +1942,10 @@ ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp));
 ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table    OF((void));
 ZEXTERN int            ZEXPORT inflateUndermine OF((z_streamp, int));
 ZEXTERN int            ZEXPORT inflateValidate OF((z_streamp, int));
-ZEXTERN unsigned long  ZEXPORT inflateCodesUsed OF ((z_streamp));
+ZEXTERN unsigned long  ZEXPORT inflateCodesUsed OF((z_streamp));
 ZEXTERN int            ZEXPORT inflateResetKeep OF((z_streamp));
 ZEXTERN int            ZEXPORT deflateResetKeep OF((z_streamp));
-#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO)
+#if defined(_WIN32) && !defined(Z_SOLO)
 ZEXTERN gzFile         ZEXPORT gzopen_w OF((const wchar_t *path,
                                             const char *mode));
 #endif
diff --git a/deps/zlib/zutil.c b/deps/zlib/zutil.c
index a76c6b0c7e557f..9543ae825e3250 100644
--- a/deps/zlib/zutil.c
+++ b/deps/zlib/zutil.c
@@ -61,9 +61,11 @@ uLong ZEXPORT zlibCompileFlags()
 #ifdef ZLIB_DEBUG
     flags += 1 << 8;
 #endif
+    /*
 #if defined(ASMV) || defined(ASMINF)
     flags += 1 << 9;
 #endif
+     */
 #ifdef ZLIB_WINAPI
     flags += 1 << 10;
 #endif
@@ -119,7 +121,7 @@ uLong ZEXPORT zlibCompileFlags()
 #  endif
 int ZLIB_INTERNAL z_verbose = verbose;
 
-void ZLIB_INTERNAL z_error (m)
+void ZLIB_INTERNAL z_error(m)
     char *m;
 {
     fprintf(stderr, "%s\n", m);
@@ -136,8 +138,8 @@ const char * ZEXPORT zError(err)
     return ERR_MSG(err);
 }
 
-#if defined(_WIN32_WCE)
-    /* The Microsoft C Run-Time Library for Windows CE doesn't have
+#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800
+    /* The older Microsoft C Run-Time Library for Windows CE doesn't have
      * errno.  We define it as a global variable to simplify porting.
      * Its value is always 0 and should not be used.
      */
@@ -214,7 +216,7 @@ local ptr_table table[MAX_PTR];
  * a protected system like OS/2. Use Microsoft C instead.
  */
 
-voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
 {
     voidpf buf;
     ulg bsize = (ulg)items*size;
@@ -240,7 +242,7 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
     return buf;
 }
 
-void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
 {
     int n;
 
@@ -277,13 +279,13 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
 #  define _hfree   hfree
 #endif
 
-voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)
+voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size)
 {
     (void)opaque;
     return _halloc((long)items, size);
 }
 
-void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
 {
     (void)opaque;
     _hfree(ptr);
@@ -302,7 +304,7 @@ extern voidp  calloc OF((uInt items, uInt size));
 extern void   free   OF((voidpf ptr));
 #endif
 
-voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
+voidpf ZLIB_INTERNAL zcalloc(opaque, items, size)
     voidpf opaque;
     unsigned items;
     unsigned size;
@@ -312,7 +314,7 @@ voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
                               (voidpf)calloc(items, size);
 }
 
-void ZLIB_INTERNAL zcfree (opaque, ptr)
+void ZLIB_INTERNAL zcfree(opaque, ptr)
     voidpf opaque;
     voidpf ptr;
 {
diff --git a/deps/zlib/zutil.h b/deps/zlib/zutil.h
index 4425bcf75eb38c..e0466922244edc 100644
--- a/deps/zlib/zutil.h
+++ b/deps/zlib/zutil.h
@@ -1,5 +1,5 @@
 /* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -44,10 +44,6 @@
 #  endif
 #endif
 
-#ifdef Z_SOLO
-   typedef long ptrdiff_t;  /* guess -- will be caught if guess is wrong */
-#endif
-
 #ifndef local
 #  define local static
 #endif
@@ -61,6 +57,17 @@ typedef unsigned short ush;
 typedef ush FAR ushf;
 typedef unsigned long  ulg;
 
+#if !defined(Z_U8) && !defined(Z_SOLO) && defined(STDC)
+#  include <limits.h>
+#  if (ULONG_MAX == 0xffffffffffffffff)
+#    define Z_U8 unsigned long
+#  elif (ULLONG_MAX == 0xffffffffffffffff)
+#    define Z_U8 unsigned long long
+#  elif (UINT_MAX == 0xffffffffffffffff)
+#    define Z_U8 unsigned
+#  endif
+#endif
+
 extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
 /* (size given to avoid silly warnings with Visual C++) */
 
@@ -185,10 +192,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
 #if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
 #  if defined(_WIN32_WCE)
 #    define fdopen(fd,mode) NULL /* No fdopen() */
-#    ifndef _PTRDIFF_T_DEFINED
-       typedef int ptrdiff_t;
-#      define _PTRDIFF_T_DEFINED
-#    endif
 #  else
 #    define fdopen(fd,type)  _fdopen(fd,type)
 #  endif
@@ -205,6 +208,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
     (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
     ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
     ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
+    ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t));
 #endif
 
         /* common defaults */
diff --git a/doc/.eslintrc.yaml b/doc/.eslintrc.yaml
index e8d24adb6e00aa..5703dc6f8584c5 100644
--- a/doc/.eslintrc.yaml
+++ b/doc/.eslintrc.yaml
@@ -15,3 +15,4 @@ rules:
 
   # Stylistic Issues
   no-multiple-empty-lines: [error, {max: 1, maxEOF: 0, maxBOF: 0}]
+  comma-dangle: [error, always-multiline]
diff --git a/doc/api/assert.md b/doc/api/assert.md
index 7256c2745e3015..d636c70001a5bc 100644
--- a/doc/api/assert.md
+++ b/doc/api/assert.md
@@ -172,7 +172,7 @@ import assert from 'node:assert';
 const { message } = new assert.AssertionError({
   actual: 1,
   expected: 2,
-  operator: 'strictEqual'
+  operator: 'strictEqual',
 });
 
 // Verify error output:
@@ -197,7 +197,7 @@ const assert = require('node:assert');
 const { message } = new assert.AssertionError({
   actual: 1,
   expected: 2,
-  operator: 'strictEqual'
+  operator: 'strictEqual',
 });
 
 // Verify error output:
@@ -651,18 +651,18 @@ import assert from 'node:assert';
 
 const obj1 = {
   a: {
-    b: 1
-  }
+    b: 1,
+  },
 };
 const obj2 = {
   a: {
-    b: 2
-  }
+    b: 2,
+  },
 };
 const obj3 = {
   a: {
-    b: 1
-  }
+    b: 1,
+  },
 };
 const obj4 = Object.create(obj1);
 
@@ -686,18 +686,18 @@ const assert = require('node:assert');
 
 const obj1 = {
   a: {
-    b: 1
-  }
+    b: 1,
+  },
 };
 const obj2 = {
   a: {
-    b: 2
-  }
+    b: 2,
+  },
 };
 const obj3 = {
   a: {
-    b: 1
-  }
+    b: 1,
+  },
 };
 const obj4 = Object.create(obj1);
 
@@ -1066,7 +1066,7 @@ await assert.doesNotReject(
   async () => {
     throw new TypeError('Wrong value');
   },
-  SyntaxError
+  SyntaxError,
 );
 ```
 
@@ -1078,7 +1078,7 @@ const assert = require('node:assert/strict');
     async () => {
       throw new TypeError('Wrong value');
     },
-    SyntaxError
+    SyntaxError,
   );
 })();
 ```
@@ -1148,7 +1148,7 @@ assert.doesNotThrow(
   () => {
     throw new TypeError('Wrong value');
   },
-  SyntaxError
+  SyntaxError,
 );
 ```
 
@@ -1159,7 +1159,7 @@ assert.doesNotThrow(
   () => {
     throw new TypeError('Wrong value');
   },
-  SyntaxError
+  SyntaxError,
 );
 ```
 
@@ -1173,7 +1173,7 @@ assert.doesNotThrow(
   () => {
     throw new TypeError('Wrong value');
   },
-  TypeError
+  TypeError,
 );
 ```
 
@@ -1184,7 +1184,7 @@ assert.doesNotThrow(
   () => {
     throw new TypeError('Wrong value');
   },
-  TypeError
+  TypeError,
 );
 ```
 
@@ -1200,7 +1200,7 @@ assert.doesNotThrow(
     throw new TypeError('Wrong value');
   },
   /Wrong value/,
-  'Whoops'
+  'Whoops',
 );
 // Throws: AssertionError: Got unwanted exception: Whoops
 ```
@@ -1213,7 +1213,7 @@ assert.doesNotThrow(
     throw new TypeError('Wrong value');
   },
   /Wrong value/,
-  'Whoops'
+  'Whoops',
 );
 // Throws: AssertionError: Got unwanted exception: Whoops
 ```
@@ -1610,18 +1610,18 @@ import assert from 'node:assert';
 
 const obj1 = {
   a: {
-    b: 1
-  }
+    b: 1,
+  },
 };
 const obj2 = {
   a: {
-    b: 2
-  }
+    b: 2,
+  },
 };
 const obj3 = {
   a: {
-    b: 1
-  }
+    b: 1,
+  },
 };
 const obj4 = Object.create(obj1);
 
@@ -1643,18 +1643,18 @@ const assert = require('node:assert');
 
 const obj1 = {
   a: {
-    b: 1
-  }
+    b: 1,
+  },
 };
 const obj2 = {
   a: {
-    b: 2
-  }
+    b: 2,
+  },
 };
 const obj3 = {
   a: {
-    b: 1
-  }
+    b: 1,
+  },
 };
 const obj4 = Object.create(obj1);
 
@@ -2012,8 +2012,8 @@ await assert.rejects(
   },
   {
     name: 'TypeError',
-    message: 'Wrong value'
-  }
+    message: 'Wrong value',
+  },
 );
 ```
 
@@ -2027,8 +2027,8 @@ const assert = require('node:assert/strict');
     },
     {
       name: 'TypeError',
-      message: 'Wrong value'
-    }
+      message: 'Wrong value',
+    },
   );
 })();
 ```
@@ -2044,7 +2044,7 @@ await assert.rejects(
     assert.strictEqual(err.name, 'TypeError');
     assert.strictEqual(err.message, 'Wrong value');
     return true;
-  }
+  },
 );
 ```
 
@@ -2060,7 +2060,7 @@ const assert = require('node:assert/strict');
       assert.strictEqual(err.name, 'TypeError');
       assert.strictEqual(err.message, 'Wrong value');
       return true;
-    }
+    },
   );
 })();
 ```
@@ -2070,7 +2070,7 @@ import assert from 'node:assert/strict';
 
 assert.rejects(
   Promise.reject(new Error('Wrong value')),
-  Error
+  Error,
 ).then(() => {
   // ...
 });
@@ -2081,7 +2081,7 @@ const assert = require('node:assert/strict');
 
 assert.rejects(
   Promise.reject(new Error('Wrong value')),
-  Error
+  Error,
 ).then(() => {
   // ...
 });
@@ -2258,7 +2258,7 @@ err.code = 404;
 err.foo = 'bar';
 err.info = {
   nested: true,
-  baz: 'text'
+  baz: 'text',
 };
 err.reg = /abc/i;
 
@@ -2271,12 +2271,12 @@ assert.throws(
     message: 'Wrong value',
     info: {
       nested: true,
-      baz: 'text'
-    }
+      baz: 'text',
+    },
     // Only properties on the validation object will be tested for.
     // Using nested objects requires all properties to be present. Otherwise
     // the validation is going to fail.
-  }
+  },
 );
 
 // Using regular expressions to validate error properties:
@@ -2294,13 +2294,13 @@ assert.throws(
     info: {
       nested: true,
       // It is not possible to use regular expressions for nested properties!
-      baz: 'text'
+      baz: 'text',
     },
     // The `reg` property contains a regular expression and only if the
     // validation object contains an identical regular expression, it is going
     // to pass.
-    reg: /abc/i
-  }
+    reg: /abc/i,
+  },
 );
 
 // Fails due to the different `message` and `name` properties:
@@ -2315,7 +2315,7 @@ assert.throws(
   },
   // The error's `message` and `name` properties will also be checked when using
   // an error as validation object.
-  err
+  err,
 );
 ```
 
@@ -2327,7 +2327,7 @@ err.code = 404;
 err.foo = 'bar';
 err.info = {
   nested: true,
-  baz: 'text'
+  baz: 'text',
 };
 err.reg = /abc/i;
 
@@ -2340,12 +2340,12 @@ assert.throws(
     message: 'Wrong value',
     info: {
       nested: true,
-      baz: 'text'
-    }
+      baz: 'text',
+    },
     // Only properties on the validation object will be tested for.
     // Using nested objects requires all properties to be present. Otherwise
     // the validation is going to fail.
-  }
+  },
 );
 
 // Using regular expressions to validate error properties:
@@ -2363,13 +2363,13 @@ assert.throws(
     info: {
       nested: true,
       // It is not possible to use regular expressions for nested properties!
-      baz: 'text'
+      baz: 'text',
     },
     // The `reg` property contains a regular expression and only if the
     // validation object contains an identical regular expression, it is going
     // to pass.
-    reg: /abc/i
-  }
+    reg: /abc/i,
+  },
 );
 
 // Fails due to the different `message` and `name` properties:
@@ -2384,7 +2384,7 @@ assert.throws(
   },
   // The error's `message` and `name` properties will also be checked when using
   // an error as validation object.
-  err
+  err,
 );
 ```
 
@@ -2397,7 +2397,7 @@ assert.throws(
   () => {
     throw new Error('Wrong value');
   },
-  Error
+  Error,
 );
 ```
 
@@ -2408,7 +2408,7 @@ assert.throws(
   () => {
     throw new Error('Wrong value');
   },
-  Error
+  Error,
 );
 ```
 
@@ -2424,7 +2424,7 @@ assert.throws(
   () => {
     throw new Error('Wrong value');
   },
-  /^Error: Wrong value$/
+  /^Error: Wrong value$/,
 );
 ```
 
@@ -2435,7 +2435,7 @@ assert.throws(
   () => {
     throw new Error('Wrong value');
   },
-  /^Error: Wrong value$/
+  /^Error: Wrong value$/,
 );
 ```
 
@@ -2461,7 +2461,7 @@ assert.throws(
     // possible.
     return true;
   },
-  'unexpected error'
+  'unexpected error',
 );
 ```
 
@@ -2482,7 +2482,7 @@ assert.throws(
     // possible.
     return true;
   },
-  'unexpected error'
+  'unexpected error',
 );
 ```
 
diff --git a/doc/api/async_context.md b/doc/api/async_context.md
index a41b73ce67697e..c0806c3f2330cc 100644
--- a/doc/api/async_context.md
+++ b/doc/api/async_context.md
@@ -116,17 +116,35 @@ Each instance of `AsyncLocalStorage` maintains an independent storage context.
 Multiple instances can safely exist simultaneously without risk of interfering
 with each other's data.
 
-### `new AsyncLocalStorage()`
+### `new AsyncLocalStorage([options])`
 
 <!-- YAML
 added:
  - v13.10.0
  - v12.17.0
+changes:
+ - version: v19.2.0
+   pr-url: https://github.com/nodejs/node/pull/45386
+   description: Add option onPropagate.
 -->
 
+> Stability: 1 - `options.onPropagate` is experimental.
+
+* `options` {Object}
+  * `onPropagate` {Function} Optional callback invoked before a store is
+    propagated to a new async resource. Returning `true` allows propagation,
+    returning `false` avoids it. Default is to propagate always.
+
 Creates a new instance of `AsyncLocalStorage`. Store is only provided within a
 `run()` call or after an `enterWith()` call.
 
+The `onPropagate` is called during creation of an async resource. Throwing at
+this time will print the stack trace and exit. See
+[`async_hooks` Error handling][] for details.
+
+Creating an async resource within the `onPropagate` callback will result in
+a recursive call to `onPropagate`.
+
 ### `asyncLocalStorage.disable()`
 
 <!-- YAML
@@ -354,7 +372,7 @@ import { AsyncResource, executionAsyncId } from 'node:async_hooks';
 // new AsyncResource() also triggers init. If triggerAsyncId is omitted then
 // async_hook.executionAsyncId() is used.
 const asyncResource = new AsyncResource(
-  type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false }
+  type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false },
 );
 
 // Run a function in the execution context of the resource. This will
@@ -382,7 +400,7 @@ const { AsyncResource, executionAsyncId } = require('node:async_hooks');
 // new AsyncResource() also triggers init. If triggerAsyncId is omitted then
 // async_hook.executionAsyncId() is used.
 const asyncResource = new AsyncResource(
-  type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false }
+  type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false },
 );
 
 // Run a function in the execution context of the resource. This will
@@ -816,4 +834,5 @@ const server = createServer((req, res) => {
 [`EventEmitter`]: events.md#class-eventemitter
 [`Stream`]: stream.md#stream
 [`Worker`]: worker_threads.md#class-worker
+[`async_hooks` Error handling]: async_hooks.md#error-handling
 [`util.promisify()`]: util.md#utilpromisifyoriginal
diff --git a/doc/api/async_hooks.md b/doc/api/async_hooks.md
index 99ada9240f18c2..eb6af648c10e36 100644
--- a/doc/api/async_hooks.md
+++ b/doc/api/async_hooks.md
@@ -2,7 +2,16 @@
 
 <!--introduced_in=v8.1.0-->
 
-> Stability: 1 - Experimental
+> Stability: 1 - Experimental. Please migrate away from this API, if you can.
+> We do not recommend using the [`createHook`][], [`AsyncHook`][], and
+> [`executionAsyncResource`][] APIs as they have usability issues, safety risks,
+> and performance implications. Async context tracking use cases are better
+> served by the stable [`AsyncLocalStorage`][] API. If you have a use case for
+> `createHook`, `AsyncHook`, or `executionAsyncResource` beyond the context
+> tracking need solved by [`AsyncLocalStorage`][] or diagnostics data currently
+> provided by [Diagnostics Channel][], please open an issue at
+> <https://github.com/nodejs/node/issues> describing your use case so we can
+> create a more purpose-focused API.
 
 <!-- source_link=lib/async_hooks.js -->
 
@@ -165,7 +174,7 @@ import { createHook } from 'node:async_hooks';
 
 const asyncHook = createHook({
   init(asyncId, type, triggerAsyncId, resource) { },
-  destroy(asyncId) { }
+  destroy(asyncId) { },
 });
 ```
 
@@ -174,7 +183,7 @@ const async_hooks = require('node:async_hooks');
 
 const asyncHook = async_hooks.createHook({
   init(asyncId, type, triggerAsyncId, resource) { },
-  destroy(asyncId) { }
+  destroy(asyncId) { },
 });
 ```
 
@@ -373,7 +382,7 @@ createHook({
     fs.writeSync(
       stdout.fd,
       `${type}(${asyncId}): trigger: ${triggerAsyncId} execution: ${eid}\n`);
-  }
+  },
 }).enable();
 
 net.createServer((conn) => {}).listen(8080);
@@ -390,7 +399,7 @@ createHook({
     fs.writeSync(
       stdout.fd,
       `${type}(${asyncId}): trigger: ${triggerAsyncId} execution: ${eid}\n`);
-  }
+  },
 }).enable();
 
 net.createServer((conn) => {}).listen(8080);
@@ -651,7 +660,7 @@ import { createServer } from 'node:http';
 import {
   executionAsyncId,
   executionAsyncResource,
-  createHook
+  createHook,
 } from 'async_hooks';
 const sym = Symbol('state'); // Private symbol to avoid pollution
 
@@ -661,7 +670,7 @@ createHook({
     if (cr) {
       resource[sym] = cr[sym];
     }
-  }
+  },
 }).enable();
 
 const server = createServer((req, res) => {
@@ -677,7 +686,7 @@ const { createServer } = require('node:http');
 const {
   executionAsyncId,
   executionAsyncResource,
-  createHook
+  createHook,
 } = require('node:async_hooks');
 const sym = Symbol('state'); // Private symbol to avoid pollution
 
@@ -687,7 +696,7 @@ createHook({
     if (cr) {
       resource[sym] = cr[sym];
     }
-  }
+  },
 }).enable();
 
 const server = createServer((req, res) => {
@@ -869,14 +878,18 @@ The documentation for this class has moved [`AsyncResource`][].
 The documentation for this class has moved [`AsyncLocalStorage`][].
 
 [DEP0111]: deprecations.md#dep0111-processbinding
+[Diagnostics Channel]: diagnostics_channel.md
 [Hook Callbacks]: #hook-callbacks
 [PromiseHooks]: https://docs.google.com/document/d/1rda3yKGHimKIhg5YeoAmCOtyURgsbTH_qaYR79FELlk/edit
+[`AsyncHook`]: #class-asynchook
 [`AsyncLocalStorage`]: async_context.md#class-asynclocalstorage
 [`AsyncResource`]: async_context.md#class-asyncresource
 [`Worker`]: worker_threads.md#class-worker
 [`after` callback]: #afterasyncid
 [`before` callback]: #beforeasyncid
+[`createHook`]: #async_hookscreatehookcallbacks
 [`destroy` callback]: #destroyasyncid
+[`executionAsyncResource`]: #async_hooksexecutionasyncresource
 [`init` callback]: #initasyncid-type-triggerasyncid-resource
 [`process.getActiveResourcesInfo()`]: process.md#processgetactiveresourcesinfo
 [`promiseResolve` callback]: #promiseresolveasyncid
diff --git a/doc/api/buffer.md b/doc/api/buffer.md
index 8b46553ec4941a..2fda3cf23b95a8 100644
--- a/doc/api/buffer.md
+++ b/doc/api/buffer.md
@@ -5013,6 +5013,56 @@ changes:
 
 See [`Buffer.from(string[, encoding])`][`Buffer.from(string)`].
 
+## Class: `File`
+
+<!-- YAML
+added: v19.2.0
+-->
+
+> Stability: 1 - Experimental
+
+* Extends: {Blob}
+
+A [`File`][] provides information about files.
+
+### `new buffer.File(sources, fileName[, options])`
+
+<!-- YAML
+added: v19.2.0
+-->
+
+* `sources` {string\[]|ArrayBuffer\[]|TypedArray\[]|DataView\[]|Blob\[]|File\[]}
+  An array of string, {ArrayBuffer}, {TypedArray}, {DataView}, {File}, or {Blob}
+  objects, or any mix of such objects, that will be stored within the `File`.
+* `fileName` {string} The name of the file.
+* `options` {Object}
+  * `endings` {string} One of either `'transparent'` or `'native'`. When set
+    to `'native'`, line endings in string source parts will be converted to
+    the platform native line-ending as specified by `require('node:os').EOL`.
+  * `type` {string} The File content-type.
+  * `lastModified` {number} The last modified date of the file.
+    **Default:** `Date.now()`.
+
+### `file.name`
+
+<!-- YAML
+added: v19.2.0
+-->
+
+* Type: {string}
+
+The name of the `File`.
+
+### `file.lastModified`
+
+<!-- YAML
+added: v19.2.0
+-->
+
+* Type: {number}
+
+The last modified date of the `File`.
+
 ## `node:buffer` module APIs
 
 While, the `Buffer` object is available as a global, there are additional
@@ -5359,6 +5409,7 @@ introducing security vulnerabilities into an application.
 [`ERR_INVALID_ARG_VALUE`]: errors.md#err_invalid_arg_value
 [`ERR_INVALID_BUFFER_SIZE`]: errors.md#err_invalid_buffer_size
 [`ERR_OUT_OF_RANGE`]: errors.md#err_out_of_range
+[`File`]: https://developer.mozilla.org/en-US/docs/Web/API/File
 [`JSON.stringify()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
 [`SharedArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer
 [`String.prototype.indexOf()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf
diff --git a/doc/api/child_process.md b/doc/api/child_process.md
index 557eb3d53a3a3d..27566c44cf9312 100644
--- a/doc/api/child_process.md
+++ b/doc/api/child_process.md
@@ -606,7 +606,7 @@ A third argument may be used to specify additional options, with these defaults:
 ```js
 const defaults = {
   cwd: undefined,
-  env: process.env
+  env: process.env,
 };
 ```
 
@@ -749,7 +749,7 @@ const { spawn } = require('node:child_process');
 
 const subprocess = spawn(process.argv[0], ['child_program.js'], {
   detached: true,
-  stdio: 'ignore'
+  stdio: 'ignore',
 });
 
 subprocess.unref();
@@ -765,7 +765,7 @@ const err = fs.openSync('./out.log', 'a');
 
 const subprocess = spawn('prg', [], {
   detached: true,
-  stdio: [ 'ignore', out, err ]
+  stdio: [ 'ignore', out, err ],
 });
 
 subprocess.unref();
@@ -1392,8 +1392,8 @@ const subprocess = spawn(
       console.log(process.pid, 'is alive')
     }, 500);"`,
   ], {
-    stdio: ['inherit', 'inherit', 'inherit']
-  }
+    stdio: ['inherit', 'inherit', 'inherit'],
+  },
 );
 
 setTimeout(() => {
@@ -1449,7 +1449,7 @@ const { spawn } = require('node:child_process');
 
 const subprocess = spawn(process.argv[0], ['child_program.js'], {
   detached: true,
-  stdio: 'ignore'
+  stdio: 'ignore',
 });
 
 subprocess.unref();
@@ -1733,7 +1733,7 @@ const subprocess = child_process.spawn('ls', {
     0, // Use parent's stdin for child.
     'pipe', // Pipe child's stdout to parent.
     fs.openSync('err.out', 'w'), // Direct child's stderr to a file.
-  ]
+  ],
 });
 
 assert.strictEqual(subprocess.stdio[0], null);
@@ -1796,7 +1796,7 @@ const { spawn } = require('node:child_process');
 
 const subprocess = spawn(process.argv[0], ['child_program.js'], {
   detached: true,
-  stdio: 'ignore'
+  stdio: 'ignore',
 });
 
 subprocess.unref();
diff --git a/doc/api/cli.md b/doc/api/cli.md
index aeebb55933d622..f78ba6515e2c81 100644
--- a/doc/api/cli.md
+++ b/doc/api/cli.md
@@ -1208,11 +1208,16 @@ status code 1.
 added:
   - v18.1.0
   - v16.17.0
+changes:
+  - version: v19.2.0
+    pr-url: https://github.com/nodejs/node/pull/45214
+    description: Test runner now supports running in watch mode.
 -->
 
 Starts the Node.js command line test runner. This flag cannot be combined with
-`--check`, `--eval`, `--interactive`, or the inspector. See the documentation
-on [running tests from the command line][] for more details.
+`--watch-path`, `--check`, `--eval`, `--interactive`, or the inspector.
+See the documentation on [running tests from the command line][]
+for more details.
 
 ### `--test-name-pattern`
 
@@ -1564,16 +1569,21 @@ added: v5.10.0
 
 Set V8's thread pool size which will be used to allocate background jobs.
 
-If set to `0` then V8 will choose an appropriate size of the thread pool based
-on the number of online processors.
+If set to `0` then Node.js will choose an appropriate size of the thread pool
+based on an estimate of the amount of parallelism.
 
-If the value provided is larger than V8's maximum, then the largest value
-will be chosen.
+The amount of parallelism refers to the number of computations that can be
+carried out simultaneously in a given machine. In general, it's the same as the
+amount of CPUs, but it may diverge in environments such as VMs or containers.
 
 ### `--watch`
 
 <!-- YAML
 added: v18.11.0
+changes:
+  - version: v19.2.0
+    pr-url: https://github.com/nodejs/node/pull/45214
+    description: Test runner now supports running in watch mode.
 -->
 
 > Stability: 1 - Experimental
@@ -1607,7 +1617,7 @@ This will turn off watching of required or imported modules, even when used in
 combination with `--watch`.
 
 This flag cannot be combined with
-`--check`, `--eval`, `--interactive`, or the REPL.
+`--check`, `--eval`, `--interactive`, `--test`, or the REPL.
 
 ```console
 $ node --watch-path=./src --watch-path=./tests index.js
@@ -1936,6 +1946,7 @@ V8 options that are allowed are:
 * `--interpreted-frames-native-stack`
 * `--jitless`
 * `--max-old-space-size`
+* `--max-semi-space-size`
 * `--perf-basic-prof-only-functions`
 * `--perf-basic-prof`
 * `--perf-prof-unwinding-info`
diff --git a/doc/api/cluster.md b/doc/api/cluster.md
index 89fb26199885e9..f904272f62bdc6 100644
--- a/doc/api/cluster.md
+++ b/doc/api/cluster.md
@@ -987,12 +987,12 @@ import cluster from 'node:cluster';
 cluster.setupPrimary({
   exec: 'worker.js',
   args: ['--use', 'https'],
-  silent: true
+  silent: true,
 });
 cluster.fork(); // https worker
 cluster.setupPrimary({
   exec: 'worker.js',
-  args: ['--use', 'http']
+  args: ['--use', 'http'],
 });
 cluster.fork(); // http worker
 ```
@@ -1003,12 +1003,12 @@ const cluster = require('node:cluster');
 cluster.setupPrimary({
   exec: 'worker.js',
   args: ['--use', 'https'],
-  silent: true
+  silent: true,
 });
 cluster.fork(); // https worker
 cluster.setupPrimary({
   exec: 'worker.js',
-  args: ['--use', 'http']
+  args: ['--use', 'http'],
 });
 cluster.fork(); // http worker
 ```
diff --git a/doc/api/crypto.md b/doc/api/crypto.md
index 4ab859c853838c..b0f7eefa020067 100644
--- a/doc/api/crypto.md
+++ b/doc/api/crypto.md
@@ -327,7 +327,7 @@ Example: Using `Cipher` objects as streams:
 const {
   scrypt,
   randomFill,
-  createCipheriv
+  createCipheriv,
 } = await import('node:crypto');
 
 const algorithm = 'aes-192-cbc';
@@ -360,7 +360,7 @@ scrypt(password, 'salt', 24, (err, key) => {
 const {
   scrypt,
   randomFill,
-  createCipheriv
+  createCipheriv,
 } = require('node:crypto');
 
 const algorithm = 'aes-192-cbc';
@@ -398,13 +398,13 @@ import {
 } from 'node:fs';
 
 import {
-  pipeline
+  pipeline,
 } from 'node:stream';
 
 const {
   scrypt,
   randomFill,
-  createCipheriv
+  createCipheriv,
 } = await import('node:crypto');
 
 const algorithm = 'aes-192-cbc';
@@ -437,7 +437,7 @@ const {
 } = require('node:fs');
 
 const {
-  pipeline
+  pipeline,
 } = require('node:stream');
 
 const {
@@ -475,7 +475,7 @@ Example: Using the [`cipher.update()`][] and [`cipher.final()`][] methods:
 const {
   scrypt,
   randomFill,
-  createCipheriv
+  createCipheriv,
 } = await import('node:crypto');
 
 const algorithm = 'aes-192-cbc';
@@ -659,7 +659,7 @@ Example: Using `Decipher` objects as streams:
 import { Buffer } from 'node:buffer';
 const {
   scryptSync,
-  createDecipheriv
+  createDecipheriv,
 } = await import('node:crypto');
 
 const algorithm = 'aes-192-cbc';
@@ -739,7 +739,7 @@ import {
 import { Buffer } from 'node:buffer';
 const {
   scryptSync,
-  createDecipheriv
+  createDecipheriv,
 } = await import('node:crypto');
 
 const algorithm = 'aes-192-cbc';
@@ -789,7 +789,7 @@ Example: Using the [`decipher.update()`][] and [`decipher.final()`][] methods:
 import { Buffer } from 'node:buffer';
 const {
   scryptSync,
-  createDecipheriv
+  createDecipheriv,
 } = await import('node:crypto');
 
 const algorithm = 'aes-192-cbc';
@@ -987,7 +987,7 @@ Instances of the `DiffieHellman` class can be created using the
 import assert from 'node:assert';
 
 const {
-  createDiffieHellman
+  createDiffieHellman,
 } = await import('node:crypto');
 
 // Generate Alice's keys...
@@ -1215,7 +1215,7 @@ Instances of the `ECDH` class can be created using the
 import assert from 'node:assert';
 
 const {
-  createECDH
+  createECDH,
 } = await import('node:crypto');
 
 // Generate Alice's keys...
@@ -1291,7 +1291,7 @@ Example (uncompressing a key):
 ```mjs
 const {
   createECDH,
-  ECDH
+  ECDH,
 } = await import('node:crypto');
 
 const ecdh = createECDH('secp256k1');
@@ -1463,7 +1463,7 @@ Example (obtaining a shared secret):
 ```mjs
 const {
   createECDH,
-  createHash
+  createHash,
 } = await import('node:crypto');
 
 const alice = createECDH('secp256k1');
@@ -1473,7 +1473,7 @@ const bob = createECDH('secp256k1');
 // keys. It would be unwise to use such a predictable private key in a real
 // application.
 alice.setPrivateKey(
-  createHash('sha256').update('alice', 'utf8').digest()
+  createHash('sha256').update('alice', 'utf8').digest(),
 );
 
 // Bob uses a newly generated cryptographically strong
@@ -1500,7 +1500,7 @@ const bob = createECDH('secp256k1');
 // keys. It would be unwise to use such a predictable private key in a real
 // application.
 alice.setPrivateKey(
-  createHash('sha256').update('alice', 'utf8').digest()
+  createHash('sha256').update('alice', 'utf8').digest(),
 );
 
 // Bob uses a newly generated cryptographically strong
@@ -1537,7 +1537,7 @@ Example: Using `Hash` objects as streams:
 
 ```mjs
 const {
-  createHash
+  createHash,
 } = await import('node:crypto');
 
 const hash = createHash('sha256');
@@ -1607,7 +1607,7 @@ Example: Using the [`hash.update()`][] and [`hash.digest()`][] methods:
 
 ```mjs
 const {
-  createHash
+  createHash,
 } = await import('node:crypto');
 
 const hash = createHash('sha256');
@@ -1653,7 +1653,7 @@ its [`hash.digest()`][] method has been called.
 ```mjs
 // Calculate a rolling hash.
 const {
-  createHash
+  createHash,
 } = await import('node:crypto');
 
 const hash = createHash('sha256');
@@ -1751,7 +1751,7 @@ Example: Using `Hmac` objects as streams:
 
 ```mjs
 const {
-  createHmac
+  createHmac,
 } = await import('node:crypto');
 
 const hmac = createHmac('sha256', 'a secret');
@@ -1799,7 +1799,7 @@ Example: Using `Hmac` and piped streams:
 import { createReadStream } from 'node:fs';
 import { stdout } from 'node:process';
 const {
-  createHmac
+  createHmac,
 } = await import('node:crypto');
 
 const hmac = createHmac('sha256', 'a secret');
@@ -1827,7 +1827,7 @@ Example: Using the [`hmac.update()`][] and [`hmac.digest()`][] methods:
 
 ```mjs
 const {
-  createHmac
+  createHmac,
 } = await import('node:crypto');
 
 const hmac = createHmac('sha256', 'a secret');
@@ -1936,7 +1936,7 @@ const { subtle } = webcrypto;
 const key = await subtle.generateKey({
   name: 'HMAC',
   hash: 'SHA-256',
-  length: 256
+  length: 256,
 }, true, ['sign', 'verify']);
 
 const keyObject = KeyObject.from(key);
@@ -1956,7 +1956,7 @@ const {
   const key = await subtle.generateKey({
     name: 'HMAC',
     hash: 'SHA-256',
-    length: 256
+    length: 256,
   }, true, ['sign', 'verify']);
 
   const keyObject = KeyObject.from(key);
@@ -2155,11 +2155,11 @@ Example: Using `Sign` and [`Verify`][] objects as streams:
 const {
   generateKeyPairSync,
   createSign,
-  createVerify
+  createVerify,
 } = await import('node:crypto');
 
 const { privateKey, publicKey } = generateKeyPairSync('ec', {
-  namedCurve: 'sect239k1'
+  namedCurve: 'sect239k1',
 });
 
 const sign = createSign('SHA256');
@@ -2182,7 +2182,7 @@ const {
 } = require('node:crypto');
 
 const { privateKey, publicKey } = generateKeyPairSync('ec', {
-  namedCurve: 'sect239k1'
+  namedCurve: 'sect239k1',
 });
 
 const sign = createSign('SHA256');
@@ -2203,7 +2203,7 @@ Example: Using the [`sign.update()`][] and [`verify.update()`][] methods:
 const {
   generateKeyPairSync,
   createSign,
-  createVerify
+  createVerify,
 } = await import('node:crypto');
 
 const { privateKey, publicKey } = generateKeyPairSync('rsa', {
@@ -3335,11 +3335,11 @@ Example: generating the sha256 sum of a file
 
 ```mjs
 import {
-  createReadStream
+  createReadStream,
 } from 'node:fs';
 import { argv } from 'node:process';
 const {
-  createHash
+  createHash,
 } = await import('node:crypto');
 
 const filename = argv[2];
@@ -3421,11 +3421,11 @@ Example: generating the sha256 HMAC of a file
 
 ```mjs
 import {
-  createReadStream
+  createReadStream,
 } from 'node:fs';
 import { argv } from 'node:process';
 const {
-  createHmac
+  createHmac,
 } = await import('node:crypto');
 
 const filename = argv[2];
@@ -3669,7 +3669,7 @@ Asynchronously generates a new random secret key of the given `length`. The
 
 ```mjs
 const {
-  generateKey
+  generateKey,
 } = await import('node:crypto');
 
 generateKey('hmac', { length: 64 }, (err, key) => {
@@ -3739,6 +3739,8 @@ changes:
   * `generator`: {number} Custom generator (DH). **Default:** `2`.
   * `groupName`: {string} Diffie-Hellman group name (DH). See
     [`crypto.getDiffieHellman()`][].
+  * `paramEncoding`: {string} Must be `'named'` or `'explicit'` (EC).
+    **Default:** `'named'`.
   * `publicKeyEncoding`: {Object} See [`keyObject.export()`][].
   * `privateKeyEncoding`: {Object} See [`keyObject.export()`][].
 * `callback`: {Function}
@@ -3758,21 +3760,21 @@ It is recommended to encode public keys as `'spki'` and private keys as
 
 ```mjs
 const {
-  generateKeyPair
+  generateKeyPair,
 } = await import('node:crypto');
 
 generateKeyPair('rsa', {
   modulusLength: 4096,
   publicKeyEncoding: {
     type: 'spki',
-    format: 'pem'
+    format: 'pem',
   },
   privateKeyEncoding: {
     type: 'pkcs8',
     format: 'pem',
     cipher: 'aes-256-cbc',
-    passphrase: 'top secret'
-  }
+    passphrase: 'top secret',
+  },
 }, (err, publicKey, privateKey) => {
   // Handle errors and use the generated key pair.
 });
@@ -3787,14 +3789,14 @@ generateKeyPair('rsa', {
   modulusLength: 4096,
   publicKeyEncoding: {
     type: 'spki',
-    format: 'pem'
+    format: 'pem',
   },
   privateKeyEncoding: {
     type: 'pkcs8',
     format: 'pem',
     cipher: 'aes-256-cbc',
-    passphrase: 'top secret'
-  }
+    passphrase: 'top secret',
+  },
 }, (err, publicKey, privateKey) => {
   // Handle errors and use the generated key pair.
 });
@@ -3851,6 +3853,8 @@ changes:
   * `generator`: {number} Custom generator (DH). **Default:** `2`.
   * `groupName`: {string} Diffie-Hellman group name (DH). See
     [`crypto.getDiffieHellman()`][].
+  * `paramEncoding`: {string} Must be `'named'` or `'explicit'` (EC).
+    **Default:** `'named'`.
   * `publicKeyEncoding`: {Object} See [`keyObject.export()`][].
   * `privateKeyEncoding`: {Object} See [`keyObject.export()`][].
 * Returns: {Object}
@@ -3870,7 +3874,7 @@ and to keep the passphrase confidential.
 
 ```mjs
 const {
-  generateKeyPairSync
+  generateKeyPairSync,
 } = await import('node:crypto');
 
 const {
@@ -3880,14 +3884,14 @@ const {
   modulusLength: 4096,
   publicKeyEncoding: {
     type: 'spki',
-    format: 'pem'
+    format: 'pem',
   },
   privateKeyEncoding: {
     type: 'pkcs8',
     format: 'pem',
     cipher: 'aes-256-cbc',
-    passphrase: 'top secret'
-  }
+    passphrase: 'top secret',
+  },
 });
 ```
 
@@ -3903,14 +3907,14 @@ const {
   modulusLength: 4096,
   publicKeyEncoding: {
     type: 'spki',
-    format: 'pem'
+    format: 'pem',
   },
   privateKeyEncoding: {
     type: 'pkcs8',
     format: 'pem',
     cipher: 'aes-256-cbc',
-    passphrase: 'top secret'
-  }
+    passphrase: 'top secret',
+  },
 });
 ```
 
@@ -3939,7 +3943,7 @@ Synchronously generates a new random secret key of the given `length`. The
 
 ```mjs
 const {
-  generateKeySync
+  generateKeySync,
 } = await import('node:crypto');
 
 const key = generateKeySync('hmac', { length: 64 });
@@ -4086,7 +4090,7 @@ added: v0.9.3
 
 ```mjs
 const {
-  getCiphers
+  getCiphers,
 } = await import('node:crypto');
 
 console.log(getCiphers()); // ['aes-128-cbc', 'aes-128-ccm', ...]
@@ -4110,7 +4114,7 @@ added: v2.3.0
 
 ```mjs
 const {
-  getCurves
+  getCurves,
 } = await import('node:crypto');
 
 console.log(getCurves()); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...]
@@ -4147,7 +4151,7 @@ Example (obtaining a shared secret):
 
 ```mjs
 const {
-  getDiffieHellman
+  getDiffieHellman,
 } = await import('node:crypto');
 const alice = getDiffieHellman('modp14');
 const bob = getDiffieHellman('modp14');
@@ -4201,7 +4205,7 @@ added: v0.9.3
 
 ```mjs
 const {
-  getHashes
+  getHashes,
 } = await import('node:crypto');
 
 console.log(getHashes()); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...]
@@ -4272,7 +4276,7 @@ of the input arguments specify invalid values or types.
 ```mjs
 import { Buffer } from 'node:buffer';
 const {
-  hkdf
+  hkdf,
 } = await import('node:crypto');
 
 hkdf('sha512', 'key', 'salt', 'info', 64, (err, derivedKey) => {
@@ -4330,7 +4334,7 @@ types, or if the derived key cannot be generated.
 ```mjs
 import { Buffer } from 'node:buffer';
 const {
-  hkdfSync
+  hkdfSync,
 } = await import('node:crypto');
 
 const derivedKey = hkdfSync('sha512', 'key', 'salt', 'info', 64);
@@ -4410,7 +4414,7 @@ When passing strings for `password` or `salt`, please consider
 
 ```mjs
 const {
-  pbkdf2
+  pbkdf2,
 } = await import('node:crypto');
 
 pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
@@ -4505,7 +4509,7 @@ When passing strings for `password` or `salt`, please consider
 
 ```mjs
 const {
-  pbkdf2Sync
+  pbkdf2Sync,
 } = await import('node:crypto');
 
 const key = pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512');
@@ -4761,7 +4765,7 @@ If an error occurs, `err` will be an `Error` object; otherwise it is `null`. The
 ```mjs
 // Asynchronous
 const {
-  randomBytes
+  randomBytes,
 } = await import('node:crypto');
 
 randomBytes(256, (err, buf) => {
@@ -4789,7 +4793,7 @@ there is a problem generating the bytes.
 ```mjs
 // Synchronous
 const {
-  randomBytes
+  randomBytes,
 } = await import('node:crypto');
 
 const buf = randomBytes(256);
@@ -5082,7 +5086,7 @@ generated synchronously.
 ```mjs
 // Asynchronous
 const {
-  randomInt
+  randomInt,
 } = await import('node:crypto');
 
 randomInt(3, (err, n) => {
@@ -5106,7 +5110,7 @@ randomInt(3, (err, n) => {
 ```mjs
 // Synchronous
 const {
-  randomInt
+  randomInt,
 } = await import('node:crypto');
 
 const n = randomInt(3);
@@ -5126,7 +5130,7 @@ console.log(`Random number chosen from (0, 1, 2): ${n}`);
 ```mjs
 // With `min` argument
 const {
-  randomInt
+  randomInt,
 } = await import('node:crypto');
 
 const n = randomInt(1, 7);
@@ -5223,7 +5227,7 @@ or types.
 
 ```mjs
 const {
-  scrypt
+  scrypt,
 } = await import('node:crypto');
 
 // Using the factory defaults.
@@ -5304,7 +5308,7 @@ or types.
 
 ```mjs
 const {
-  scryptSync
+  scryptSync,
 } = await import('node:crypto');
 // Using the factory defaults.
 
@@ -5690,7 +5694,7 @@ import { Buffer } from 'node:buffer';
 const {
   createCipheriv,
   createDecipheriv,
-  randomBytes
+  randomBytes,
 } = await import('node:crypto');
 
 const key = 'keykeykeykeykeykeykeykey';
@@ -5699,11 +5703,11 @@ const nonce = randomBytes(12);
 const aad = Buffer.from('0123456789', 'hex');
 
 const cipher = createCipheriv('aes-192-ccm', key, nonce, {
-  authTagLength: 16
+  authTagLength: 16,
 });
 const plaintext = 'Hello world';
 cipher.setAAD(aad, {
-  plaintextLength: Buffer.byteLength(plaintext)
+  plaintextLength: Buffer.byteLength(plaintext),
 });
 const ciphertext = cipher.update(plaintext, 'utf8');
 cipher.final();
@@ -5712,11 +5716,11 @@ const tag = cipher.getAuthTag();
 // Now transmit { ciphertext, nonce, tag }.
 
 const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
-  authTagLength: 16
+  authTagLength: 16,
 });
 decipher.setAuthTag(tag);
 decipher.setAAD(aad, {
-  plaintextLength: ciphertext.length
+  plaintextLength: ciphertext.length,
 });
 const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');
 
@@ -5743,11 +5747,11 @@ const nonce = randomBytes(12);
 const aad = Buffer.from('0123456789', 'hex');
 
 const cipher = createCipheriv('aes-192-ccm', key, nonce, {
-  authTagLength: 16
+  authTagLength: 16,
 });
 const plaintext = 'Hello world';
 cipher.setAAD(aad, {
-  plaintextLength: Buffer.byteLength(plaintext)
+  plaintextLength: Buffer.byteLength(plaintext),
 });
 const ciphertext = cipher.update(plaintext, 'utf8');
 cipher.final();
@@ -5756,11 +5760,11 @@ const tag = cipher.getAuthTag();
 // Now transmit { ciphertext, nonce, tag }.
 
 const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
-  authTagLength: 16
+  authTagLength: 16,
 });
 decipher.setAuthTag(tag);
 decipher.setAAD(aad, {
-  plaintextLength: ciphertext.length
+  plaintextLength: ciphertext.length,
 });
 const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');
 
diff --git a/doc/api/deprecations.md b/doc/api/deprecations.md
index 123cceadd300f0..83d2651c5cb7fb 100644
--- a/doc/api/deprecations.md
+++ b/doc/api/deprecations.md
@@ -3055,7 +3055,7 @@ const w = new Writable({
   async final(callback) {
     await someOp();
     callback();
-  }
+  },
 });
 ```
 
@@ -3292,6 +3292,22 @@ Type: Documentation-only
 have security implications. Use the [WHATWG URL API][] instead. CVEs are not
 issued for `url.parse()` vulnerabilities.
 
+### DEP0170: Invalid port when using `url.parse()`
+
+<!-- YAML
+changes:
+  - version:
+    - v19.2.0
+    pr-url: https://github.com/nodejs/node/pull/45576
+    description: Documentation-only deprecation.
+-->
+
+Type: Documentation-only
+
+[`url.parse()`][] accepts URLs with ports that are not numbers. This behavior
+might result in host name spoofing with unexpected input. These URLs will throw
+an error in future versions of Node.js, as the [WHATWG URL API][] does already.
+
 [NIST SP 800-38D]: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf
 [RFC 6066]: https://tools.ietf.org/html/rfc6066#section-3
 [RFC 8247 Section 2.4]: https://www.rfc-editor.org/rfc/rfc8247#section-2.4
diff --git a/doc/api/dgram.md b/doc/api/dgram.md
index 4c188629e2bb22..84fd2684266c3f 100644
--- a/doc/api/dgram.md
+++ b/doc/api/dgram.md
@@ -357,7 +357,7 @@ An example socket listening on an exclusive port is shown below.
 socket.bind({
   address: 'localhost',
   port: 8000,
-  exclusive: true
+  exclusive: true,
 });
 ```
 
diff --git a/doc/api/diagnostics_channel.md b/doc/api/diagnostics_channel.md
index cbcf06e716bd42..b862c9203ee9e1 100644
--- a/doc/api/diagnostics_channel.md
+++ b/doc/api/diagnostics_channel.md
@@ -1,8 +1,16 @@
 # Diagnostics Channel
 
+<!-- YAML
+added: v15.1.0
+changes:
+  - version: v19.2.0
+    pr-url: https://github.com/nodejs/node/pull/45290
+    description: diagnostics_channel is now Stable.
+-->
+
 <!--introduced_in=v15.1.0-->
 
-> Stability: 1 - Experimental
+> Stability: 2 - Stable
 
 <!-- source_link=lib/diagnostics_channel.js -->
 
@@ -54,7 +62,7 @@ diagnostics_channel.subscribe('my-channel', onMessage);
 if (channel.hasSubscribers) {
   // Publish data to the channel
   channel.publish({
-    some: 'data'
+    some: 'data',
   });
 }
 
@@ -79,7 +87,7 @@ diagnostics_channel.subscribe('my-channel', onMessage);
 if (channel.hasSubscribers) {
   // Publish data to the channel
   channel.publish({
-    some: 'data'
+    some: 'data',
   });
 }
 
@@ -290,7 +298,7 @@ import diagnostics_channel from 'node:diagnostics_channel';
 const channel = diagnostics_channel.channel('my-channel');
 
 channel.publish({
-  some: 'message'
+  some: 'message',
 });
 ```
 
@@ -300,7 +308,7 @@ const diagnostics_channel = require('node:diagnostics_channel');
 const channel = diagnostics_channel.channel('my-channel');
 
 channel.publish({
-  some: 'message'
+  some: 'message',
 });
 ```
 
@@ -401,6 +409,12 @@ channel.unsubscribe(onMessage);
 
 ### Built-in Channels
 
+> Stability: 1 - Experimental
+
+While the diagnostics\_channel API is now considered stable, the built-in
+channels currently available are not. Each channel must be declared stable
+independently.
+
 #### HTTP
 
 `http.client.request.start`
diff --git a/doc/api/errors.md b/doc/api/errors.md
index e1e1b92f654505..b277a53e66cd6d 100644
--- a/doc/api/errors.md
+++ b/doc/api/errors.md
@@ -2690,6 +2690,25 @@ An unspecified or non-specific system error has occurred within the Node.js
 process. The error object will have an `err.info` object property with
 additional details.
 
+<a id="ERR_TAP_LEXER_ERROR"></a>
+
+### `ERR_TAP_LEXER_ERROR`
+
+An error representing a failing lexer state.
+
+<a id="ERR_TAP_PARSER_ERROR"></a>
+
+### `ERR_TAP_PARSER_ERROR`
+
+An error representing a failing parser state. Additional information about
+the token causing the error is available via the `cause` property.
+
+<a id="ERR_TAP_VALIDATION_ERROR"></a>
+
+### `ERR_TAP_VALIDATION_ERROR`
+
+This error represents a failed TAP validation.
+
 <a id="ERR_TEST_FAILURE"></a>
 
 ### `ERR_TEST_FAILURE`
diff --git a/doc/api/esm.md b/doc/api/esm.md
index d18a6b866b15d2..9571bb11e8fef4 100644
--- a/doc/api/esm.md
+++ b/doc/api/esm.md
@@ -1024,7 +1024,7 @@ export function resolve(specifier, context, nextResolve) {
   if (specifier.startsWith('https://')) {
     return {
       shortCircuit: true,
-      url: specifier
+      url: specifier,
     };
   } else if (parentURL && parentURL.startsWith('https://')) {
     return {
@@ -1105,7 +1105,7 @@ export async function resolve(specifier, context, nextResolve) {
     // specifiers ending in the CoffeeScript file extensions.
     return {
       shortCircuit: true,
-      url: new URL(specifier, parentURL).href
+      url: new URL(specifier, parentURL).href,
     };
   }
 
diff --git a/doc/api/events.md b/doc/api/events.md
index 4876dd6d4a639b..e776e0ec4017d1 100644
--- a/doc/api/events.md
+++ b/doc/api/events.md
@@ -1465,7 +1465,7 @@ setMaxListeners(5, target, emitter);
 ```cjs
 const {
   setMaxListeners,
-  EventEmitter
+  EventEmitter,
 } = require('node:events');
 
 const target = new EventTarget();
@@ -1688,13 +1688,13 @@ async function handler2(event) {
 const handler3 = {
   handleEvent(event) {
     console.log(event.type);  // Prints 'foo'
-  }
+  },
 };
 
 const handler4 = {
   async handleEvent(event) {
     console.log(event.type);  // Prints 'foo'
-  }
+  },
 };
 
 const target = new EventTarget();
diff --git a/doc/api/fs.md b/doc/api/fs.md
index c25744c8bfbce3..3fd65cc8d9cf13 100644
--- a/doc/api/fs.md
+++ b/doc/api/fs.md
@@ -1734,6 +1734,12 @@ system requests but rather the internal buffering `fs.writeFile` performs.
 
 ### `fsPromises.constants`
 
+<!-- YAML
+added:
+  - v18.4.0
+  - v16.17.0
+-->
+
 * {Object}
 
 Returns an object containing commonly used constants for file system
@@ -7039,7 +7045,7 @@ import { open, constants } from 'node:fs';
 const {
   O_RDWR,
   O_CREAT,
-  O_EXCL
+  O_EXCL,
 } = constants;
 
 open('/path/to/my/file', O_RDWR | O_CREAT | O_EXCL, (err, fd) => {
diff --git a/doc/api/http.md b/doc/api/http.md
index d0bebabe5c4bda..276739366328b0 100644
--- a/doc/api/http.md
+++ b/doc/api/http.md
@@ -106,7 +106,7 @@ http.get({
   hostname: 'localhost',
   port: 80,
   path: '/',
-  agent: false  // Create a new agent just for this one request
+  agent: false,  // Create a new agent just for this one request
 }, (res) => {
   // Do stuff with response
 });
@@ -504,7 +504,7 @@ proxy.listen(1337, '127.0.0.1', () => {
     port: 1337,
     host: '127.0.0.1',
     method: 'CONNECT',
-    path: 'www.google.com:80'
+    path: 'www.google.com:80',
   };
 
   const req = http.request(options);
@@ -575,7 +575,7 @@ const http = require('node:http');
 const options = {
   host: '127.0.0.1',
   port: 8080,
-  path: '/length_request'
+  path: '/length_request',
 };
 
 // Make a request
@@ -673,8 +673,8 @@ server.listen(1337, '127.0.0.1', () => {
     host: '127.0.0.1',
     headers: {
       'Connection': 'Upgrade',
-      'Upgrade': 'websocket'
-    }
+      'Upgrade': 'websocket',
+    },
   };
 
   const req = http.request(options);
@@ -2185,7 +2185,7 @@ const earlyHintsLinks = [
 ];
 response.writeEarlyHints({
   'link': earlyHintsLinks,
-  'x-trace-id': 'id for diagnostics'
+  'x-trace-id': 'id for diagnostics',
 });
 
 const earlyHintsCallback = () => console.log('early hints message sent');
@@ -2238,7 +2238,7 @@ const body = 'hello world';
 response
   .writeHead(200, {
     'Content-Length': Buffer.byteLength(body),
-    'Content-Type': 'text/plain'
+    'Content-Type': 'text/plain',
   })
   .end(body);
 ```
@@ -2375,7 +2375,7 @@ server fully transmitted a message before a connection was terminated:
 const req = http.request({
   host: '127.0.0.1',
   port: 8080,
-  method: 'POST'
+  method: 'POST',
 }, (res) => {
   res.resume();
   res.on('end', () => {
@@ -3202,7 +3202,7 @@ const http = require('node:http');
 const server = http.createServer((req, res) => {
   res.writeHead(200, { 'Content-Type': 'application/json' });
   res.end(JSON.stringify({
-    data: 'Hello World!'
+    data: 'Hello World!',
   }));
 });
 
@@ -3219,7 +3219,7 @@ const server = http.createServer();
 server.on('request', (request, res) => {
   res.writeHead(200, { 'Content-Type': 'application/json' });
   res.end(JSON.stringify({
-    data: 'Hello World!'
+    data: 'Hello World!',
   }));
 });
 
@@ -3301,7 +3301,7 @@ http.get('http://localhost:8000/', (res) => {
 const server = http.createServer((req, res) => {
   res.writeHead(200, { 'Content-Type': 'application/json' });
   res.end(JSON.stringify({
-    data: 'Hello World!'
+    data: 'Hello World!',
   }));
 });
 
@@ -3459,7 +3459,7 @@ upload a file with a POST request, then write to the `ClientRequest` object.
 const http = require('node:http');
 
 const postData = JSON.stringify({
-  'msg': 'Hello World!'
+  'msg': 'Hello World!',
 });
 
 const options = {
@@ -3469,8 +3469,8 @@ const options = {
   method: 'POST',
   headers: {
     'Content-Type': 'application/json',
-    'Content-Length': Buffer.byteLength(postData)
-  }
+    'Content-Length': Buffer.byteLength(postData),
+  },
 };
 
 const req = http.request(options, (res) => {
diff --git a/doc/api/http2.md b/doc/api/http2.md
index 713edfca66376e..1b2d7c246367d2 100644
--- a/doc/api/http2.md
+++ b/doc/api/http2.md
@@ -43,7 +43,7 @@ let http2;
 try {
   http2 = require('node:http2');
 } catch (err) {
-  console.log('http2 support is disabled!');
+  console.error('http2 support is disabled!');
 }
 ```
 
@@ -61,7 +61,7 @@ let http2;
 try {
   http2 = await import('node:http2');
 } catch (err) {
-  console.log('http2 support is disabled!');
+  console.error('http2 support is disabled!');
 }
 ```
 
@@ -90,7 +90,7 @@ const fs = require('node:fs');
 
 const server = http2.createSecureServer({
   key: fs.readFileSync('localhost-privkey.pem'),
-  cert: fs.readFileSync('localhost-cert.pem')
+  cert: fs.readFileSync('localhost-cert.pem'),
 });
 server.on('error', (err) => console.error(err));
 
@@ -98,7 +98,7 @@ server.on('stream', (stream, headers) => {
   // stream is a Duplex
   stream.respond({
     'content-type': 'text/html; charset=utf-8',
-    ':status': 200
+    ':status': 200,
   });
   stream.end('<h1>Hello World</h1>');
 });
@@ -121,7 +121,7 @@ The following illustrates an HTTP/2 client:
 const http2 = require('node:http2');
 const fs = require('node:fs');
 const client = http2.connect('https://localhost:8443', {
-  ca: fs.readFileSync('localhost-cert.pem')
+  ca: fs.readFileSync('localhost-cert.pem'),
 });
 client.on('error', (err) => console.error(err));
 
@@ -327,7 +327,7 @@ session.on('stream', (stream, headers, flags) => {
   // ...
   stream.respond({
     ':status': 200,
-    'content-type': 'text/plain; charset=utf-8'
+    'content-type': 'text/plain; charset=utf-8',
   });
   stream.write('hello ');
   stream.end('world');
@@ -348,7 +348,7 @@ const server = http2.createServer();
 server.on('stream', (stream, headers) => {
   stream.respond({
     'content-type': 'text/html; charset=utf-8',
-    ':status': 200
+    ':status': 200,
   });
   stream.on('error', (error) => console.error(error));
   stream.end('<h1>Hello World</h1>');
@@ -971,7 +971,7 @@ const http2 = require('node:http2');
 const clientSession = http2.connect('https://localhost:1234');
 const {
   HTTP2_HEADER_PATH,
-  HTTP2_HEADER_STATUS
+  HTTP2_HEADER_STATUS,
 } = http2.constants;
 
 const req = clientSession.request({ [HTTP2_HEADER_PATH]: '/' });
@@ -1038,7 +1038,7 @@ encoding.
 ```js
 stream.respond({
   'content-type': 'text/html; charset=utf-8',
-  ':status': 200
+  ':status': 200,
 });
 ```
 
@@ -1731,7 +1731,7 @@ server.on('stream', (stream) => {
   const headers = {
     'content-length': stat.size,
     'last-modified': stat.mtime.toUTCString(),
-    'content-type': 'text/plain; charset=utf-8'
+    'content-type': 'text/plain; charset=utf-8',
   };
   stream.respondWithFD(fd, headers);
   stream.on('close', () => fs.closeSync(fd));
@@ -1776,7 +1776,7 @@ server.on('stream', (stream) => {
   const headers = {
     'content-length': stat.size,
     'last-modified': stat.mtime.toUTCString(),
-    'content-type': 'text/plain; charset=utf-8'
+    'content-type': 'text/plain; charset=utf-8',
   };
   stream.respondWithFD(fd, headers, { waitForTrailers: true });
   stream.on('wantTrailers', () => {
@@ -1850,7 +1850,7 @@ server.on('stream', (stream) => {
       }
     } catch (err) {
       // Perform actual error handling.
-      console.log(err);
+      console.error(err);
     }
     stream.end();
   }
@@ -2022,7 +2022,7 @@ const {
   HTTP2_HEADER_METHOD,
   HTTP2_HEADER_PATH,
   HTTP2_HEADER_STATUS,
-  HTTP2_HEADER_CONTENT_TYPE
+  HTTP2_HEADER_CONTENT_TYPE,
 } = http2.constants;
 
 const server = http2.createServer();
@@ -2032,7 +2032,7 @@ server.on('stream', (stream, headers, flags) => {
   // ...
   stream.respond({
     [HTTP2_HEADER_STATUS]: 200,
-    [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain; charset=utf-8'
+    [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain; charset=utf-8',
   });
   stream.write('hello ');
   stream.end('world');
@@ -2242,7 +2242,7 @@ const {
   HTTP2_HEADER_METHOD,
   HTTP2_HEADER_PATH,
   HTTP2_HEADER_STATUS,
-  HTTP2_HEADER_CONTENT_TYPE
+  HTTP2_HEADER_CONTENT_TYPE,
 } = http2.constants;
 
 const options = getOptionsSomehow();
@@ -2254,7 +2254,7 @@ server.on('stream', (stream, headers, flags) => {
   // ...
   stream.respond({
     [HTTP2_HEADER_STATUS]: 200,
-    [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain; charset=utf-8'
+    [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain; charset=utf-8',
   });
   stream.write('hello ');
   stream.end('world');
@@ -2527,7 +2527,7 @@ const server = http2.createServer();
 server.on('stream', (stream, headers) => {
   stream.respond({
     'content-type': 'text/html; charset=utf-8',
-    ':status': 200
+    ':status': 200,
   });
   stream.end('<h1>Hello World</h1>');
 });
@@ -2659,7 +2659,7 @@ const fs = require('node:fs');
 
 const options = {
   key: fs.readFileSync('server-key.pem'),
-  cert: fs.readFileSync('server-cert.pem')
+  cert: fs.readFileSync('server-cert.pem'),
 };
 
 // Create a secure HTTP/2 server
@@ -2668,7 +2668,7 @@ const server = http2.createSecureServer(options);
 server.on('stream', (stream, headers) => {
   stream.respond({
     'content-type': 'text/html; charset=utf-8',
-    ':status': 200
+    ':status': 200,
   });
   stream.end('<h1>Hello World</h1>');
 });
@@ -2889,7 +2889,7 @@ to send more than one value per header field).
 const headers = {
   ':status': '200',
   'content-type': 'text-plain',
-  'ABC': ['has', 'more', 'than', 'one', 'value']
+  'ABC': ['has', 'more', 'than', 'one', 'value'],
 };
 
 stream.respond(headers);
@@ -2940,7 +2940,7 @@ const headers = {
   'content-type': 'text-plain',
   'cookie': 'some-cookie',
   'other-sensitive-header': 'very secret data',
-  [http2.sensitiveHeaders]: ['cookie', 'other-sensitive-header']
+  [http2.sensitiveHeaders]: ['cookie', 'other-sensitive-header'],
 };
 
 stream.respond(headers);
@@ -3126,7 +3126,7 @@ const client = http2.connect('http://localhost:8001');
 // for CONNECT requests or an error will be thrown.
 const req = client.request({
   ':method': 'CONNECT',
-  ':authority': `localhost:${port}`
+  ':authority': `localhost:${port}`,
 });
 
 req.on('response', (headers) => {
@@ -3222,7 +3222,7 @@ const key = readFileSync('./key.pem');
 
 const server = createSecureServer(
   { cert, key, allowHTTP1: true },
-  onRequest
+  onRequest,
 ).listen(4443);
 
 function onRequest(req, res) {
@@ -3232,7 +3232,7 @@ function onRequest(req, res) {
   res.writeHead(200, { 'content-type': 'application/json' });
   res.end(JSON.stringify({
     alpnProtocol,
-    httpVersion: req.httpVersion
+    httpVersion: req.httpVersion,
   }));
 }
 ```
diff --git a/doc/api/https.md b/doc/api/https.md
index b917cc0bd2eda5..eb5636168b54dd 100644
--- a/doc/api/https.md
+++ b/doc/api/https.md
@@ -236,7 +236,7 @@ const fs = require('node:fs');
 
 const options = {
   key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
-  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
+  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'),
 };
 
 https.createServer(options, (req, res) => {
@@ -253,7 +253,7 @@ const fs = require('node:fs');
 
 const options = {
   pfx: fs.readFileSync('test/fixtures/test_cert.pfx'),
-  passphrase: 'sample'
+  passphrase: 'sample',
 };
 
 https.createServer(options, (req, res) => {
@@ -380,7 +380,7 @@ const options = {
   hostname: 'encrypted.google.com',
   port: 443,
   path: '/',
-  method: 'GET'
+  method: 'GET',
 };
 
 const req = https.request(options, (res) => {
@@ -407,7 +407,7 @@ const options = {
   path: '/',
   method: 'GET',
   key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
-  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
+  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'),
 };
 options.agent = new https.Agent(options);
 
@@ -426,7 +426,7 @@ const options = {
   method: 'GET',
   key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
   cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'),
-  agent: false
+  agent: false,
 };
 
 const req = https.request(options, (res) => {
diff --git a/doc/api/modules.md b/doc/api/modules.md
index 6f663d473c3602..eb54d7921f29a3 100644
--- a/doc/api/modules.md
+++ b/doc/api/modules.md
@@ -90,8 +90,8 @@ By default, Node.js will treat the following as CommonJS modules:
 * Files with an extension that is not `.mjs`, `.cjs`, `.json`, `.node`, or `.js`
   (when the nearest parent `package.json` file contains a top-level field
   [`"type"`][] with a value of `"module"`, those files will be recognized as
-  CommonJS modules only if they are being `require`d, not when used as the
-  command-line entry point of the program).
+  CommonJS modules only if they are being included via `require()`, not when
+  used as the command-line entry point of the program).
 
 See [Determining module system][] for more details.
 
@@ -272,15 +272,10 @@ LOAD_PACKAGE_SELF(X, DIR)
 6. RESOLVE_ESM_MATCH(MATCH)
 
 RESOLVE_ESM_MATCH(MATCH)
-1. let { RESOLVED, EXACT } = MATCH
-2. let RESOLVED_PATH = fileURLToPath(RESOLVED)
-3. If EXACT is true,
-   a. If the file at RESOLVED_PATH exists, load RESOLVED_PATH as its extension
-      format. STOP
-4. Otherwise, if EXACT is false,
-   a. LOAD_AS_FILE(RESOLVED_PATH)
-   b. LOAD_AS_DIRECTORY(RESOLVED_PATH)
-5. THROW "not found"
+1. let RESOLVED_PATH = fileURLToPath(MATCH)
+2. If the file at RESOLVED_PATH exists, load RESOLVED_PATH as its extension
+   format. STOP
+3. THROW "not found"
 </pre>
 
 ## Caching
diff --git a/doc/api/n-api.md b/doc/api/n-api.md
index b0b89de1c75bf6..9c3c4588b49b28 100644
--- a/doc/api/n-api.md
+++ b/doc/api/n-api.md
@@ -898,6 +898,24 @@ typedef void (*napi_threadsafe_function_call_js)(napi_env env,
 Unless for reasons discussed in [Object Lifetime Management][], creating a
 handle and/or callback scope inside the function body is not necessary.
 
+#### `napi_cleanup_hook`
+
+<!-- YAML
+added: v19.2.0
+napiVersion: 3
+-->
+
+Function pointer used with [`napi_add_env_cleanup_hook`][]. It will be called
+when the environment is being torn down.
+
+Callback functions must satisfy the following signature:
+
+```c
+typedef void (*napi_cleanup_hook)(void* data);
+```
+
+* `[in] data`: The data that was passed to [`napi_add_env_cleanup_hook`][].
+
 #### `napi_async_cleanup_hook`
 
 <!-- YAML
@@ -1799,7 +1817,7 @@ napiVersion: 3
 
 ```c
 NODE_EXTERN napi_status napi_add_env_cleanup_hook(napi_env env,
-                                                  void (*fun)(void* arg),
+                                                  napi_cleanup_hook fun,
                                                   void* arg);
 ```
 
@@ -4000,7 +4018,7 @@ reasons. Consider the following JavaScript:
 const obj = {};
 Object.defineProperties(obj, {
   'foo': { value: 123, writable: true, configurable: true, enumerable: true },
-  'bar': { value: 456, writable: true, configurable: true, enumerable: true }
+  'bar': { value: 456, writable: true, configurable: true, enumerable: true },
 });
 ```
 
diff --git a/doc/api/net.md b/doc/api/net.md
index d268d560209518..a72d3bb3a66c8a 100644
--- a/doc/api/net.md
+++ b/doc/api/net.md
@@ -487,7 +487,7 @@ shown below.
 server.listen({
   host: 'localhost',
   port: 80,
-  exclusive: true
+  exclusive: true,
 });
 ```
 
@@ -507,7 +507,7 @@ const controller = new AbortController();
 server.listen({
   host: 'localhost',
   port: 80,
-  signal: controller.signal
+  signal: controller.signal,
 });
 // Later, when you want to close the server.
 controller.abort();
@@ -937,8 +937,8 @@ net.connect({
     callback: function(nread, buf) {
       // Received data is available in `buf` from 0 to `nread`.
       console.log(buf.toString('utf8', 0, nread));
-    }
-  }
+    },
+  },
 });
 ```
 
diff --git a/doc/api/os.md b/doc/api/os.md
index 13feec731e80cc..245371e9cfac4a 100644
--- a/doc/api/os.md
+++ b/doc/api/os.md
@@ -85,8 +85,8 @@ The properties included on each object include:
       nice: 0,
       sys: 30340,
       idle: 1070356870,
-      irq: 0
-    }
+      irq: 0,
+    },
   },
   {
     model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
@@ -96,8 +96,8 @@ The properties included on each object include:
       nice: 0,
       sys: 26980,
       idle: 1071569080,
-      irq: 0
-    }
+      irq: 0,
+    },
   },
   {
     model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
@@ -107,8 +107,8 @@ The properties included on each object include:
       nice: 0,
       sys: 21750,
       idle: 1070919370,
-      irq: 0
-    }
+      irq: 0,
+    },
   },
   {
     model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
@@ -118,8 +118,8 @@ The properties included on each object include:
       nice: 0,
       sys: 19430,
       idle: 1070905480,
-      irq: 20
-    }
+      irq: 20,
+    },
   },
 ]
 ```
@@ -462,8 +462,8 @@ added:
 
 * Returns {string}
 
-Returns the machine type as a string, such as `arm`, `aarch64`, `mips`,
-`mips64`, `ppc64`, `ppc64le`, `s390`, `s390x`, `i386`, `i686`, `x86_64`.
+Returns the machine type as a string, such as `arm`, `arm64`, `aarch64`,
+`mips`, `mips64`, `ppc64`, `ppc64le`, `s390`, `s390x`, `i386`, `i686`, `x86_64`.
 
 On POSIX systems, the machine type is determined by calling
 [`uname(3)`][]. On Windows, `RtlGetVersion()` is used, and if it is not
diff --git a/doc/api/packages.md b/doc/api/packages.md
index 52ba6f432bbf84..d781dfc02ccc25 100644
--- a/doc/api/packages.md
+++ b/doc/api/packages.md
@@ -1033,7 +1033,7 @@ CommonJS and ES module instances of the package:
    // ./node_modules/pkg/index.mjs
    import state from './state.cjs';
    export {
-     state
+     state,
    };
    ```
 
diff --git a/doc/api/path.md b/doc/api/path.md
index 43f5a7733cffdb..d58fc044476bb9 100644
--- a/doc/api/path.md
+++ b/doc/api/path.md
@@ -238,7 +238,7 @@ For example, on POSIX:
 path.format({
   root: '/ignored',
   dir: '/home/user/dir',
-  base: 'file.txt'
+  base: 'file.txt',
 });
 // Returns: '/home/user/dir/file.txt'
 
@@ -248,7 +248,7 @@ path.format({
 path.format({
   root: '/',
   base: 'file.txt',
-  ext: 'ignored'
+  ext: 'ignored',
 });
 // Returns: '/file.txt'
 
@@ -256,7 +256,7 @@ path.format({
 path.format({
   root: '/',
   name: 'file',
-  ext: '.txt'
+  ext: '.txt',
 });
 // Returns: '/file.txt'
 
@@ -264,7 +264,7 @@ path.format({
 path.format({
   root: '/',
   name: 'file',
-  ext: 'txt'
+  ext: 'txt',
 });
 // Returns: '/file.txt'
 ```
@@ -274,7 +274,7 @@ On Windows:
 ```js
 path.format({
   dir: 'C:\\path\\dir',
-  base: 'file.txt'
+  base: 'file.txt',
 });
 // Returns: 'C:\\path\\dir\\file.txt'
 ```
diff --git a/doc/api/perf_hooks.md b/doc/api/perf_hooks.md
index a996f071133484..f99758a0e75275 100644
--- a/doc/api/perf_hooks.md
+++ b/doc/api/perf_hooks.md
@@ -411,7 +411,7 @@ event type in order for the timing details to be accessed.
 ```js
 const {
   performance,
-  PerformanceObserver
+  PerformanceObserver,
 } = require('node:perf_hooks');
 
 function someFunction() {
@@ -1201,7 +1201,7 @@ changes:
 ```js
 const {
   performance,
-  PerformanceObserver
+  PerformanceObserver,
 } = require('node:perf_hooks');
 
 const obs = new PerformanceObserver((list, observer) => {
@@ -1267,7 +1267,7 @@ or `options.type`:
 ```js
 const {
   performance,
-  PerformanceObserver
+  PerformanceObserver,
 } = require('node:perf_hooks');
 
 const obs = new PerformanceObserver((list, observer) => {
@@ -1303,7 +1303,7 @@ with respect to `performanceEntry.startTime`.
 ```js
 const {
   performance,
-  PerformanceObserver
+  PerformanceObserver,
 } = require('node:perf_hooks');
 
 const obs = new PerformanceObserver((perfObserverList, observer) => {
@@ -1353,7 +1353,7 @@ equal to `name`, and optionally, whose `performanceEntry.entryType` is equal to
 ```js
 const {
   performance,
-  PerformanceObserver
+  PerformanceObserver,
 } = require('node:perf_hooks');
 
 const obs = new PerformanceObserver((perfObserverList, observer) => {
@@ -1409,7 +1409,7 @@ is equal to `type`.
 ```js
 const {
   performance,
-  PerformanceObserver
+  PerformanceObserver,
 } = require('node:perf_hooks');
 
 const obs = new PerformanceObserver((perfObserverList, observer) => {
@@ -1755,7 +1755,7 @@ to execute the callback).
 const async_hooks = require('node:async_hooks');
 const {
   performance,
-  PerformanceObserver
+  PerformanceObserver,
 } = require('node:perf_hooks');
 
 const set = new Set();
@@ -1774,7 +1774,7 @@ const hook = async_hooks.createHook({
                           `Timeout-${id}-Init`,
                           `Timeout-${id}-Destroy`);
     }
-  }
+  },
 });
 hook.enable();
 
@@ -1800,7 +1800,7 @@ dependencies:
 'use strict';
 const {
   performance,
-  PerformanceObserver
+  PerformanceObserver,
 } = require('node:perf_hooks');
 const mod = require('node:module');
 
diff --git a/doc/api/process.md b/doc/api/process.md
index 9166194ab54863..31210abf13824e 100644
--- a/doc/api/process.md
+++ b/doc/api/process.md
@@ -365,7 +365,7 @@ process.on('uncaughtException', (err, origin) => {
   fs.writeSync(
     process.stderr.fd,
     `Caught exception: ${err}\n` +
-    `Exception origin: ${origin}`
+    `Exception origin: ${origin}`,
   );
 });
 
@@ -385,7 +385,7 @@ process.on('uncaughtException', (err, origin) => {
   fs.writeSync(
     process.stderr.fd,
     `Caught exception: ${err}\n` +
-    `Exception origin: ${origin}`
+    `Exception origin: ${origin}`,
   );
 });
 
@@ -1293,7 +1293,7 @@ import { emitWarning } from 'node:process';
 // Emit a warning with a code and additional detail.
 emitWarning('Something happened!', {
   code: 'MY_WARNING',
-  detail: 'This is some additional information'
+  detail: 'This is some additional information',
 });
 // Emits:
 // (node:56338) [MY_WARNING] Warning: Something happened!
@@ -1306,7 +1306,7 @@ const { emitWarning } = require('node:process');
 // Emit a warning with a code and additional detail.
 emitWarning('Something happened!', {
   code: 'MY_WARNING',
-  detail: 'This is some additional information'
+  detail: 'This is some additional information',
 });
 // Emits:
 // (node:56338) [MY_WARNING] Warning: Something happened!
@@ -3671,7 +3671,7 @@ import { umask } from 'node:process';
 const newmask = 0o022;
 const oldmask = umask(newmask);
 console.log(
-  `Changed umask from ${oldmask.toString(8)} to ${newmask.toString(8)}`
+  `Changed umask from ${oldmask.toString(8)} to ${newmask.toString(8)}`,
 );
 ```
 
@@ -3681,7 +3681,7 @@ const { umask } = require('node:process');
 const newmask = 0o022;
 const oldmask = umask(newmask);
 console.log(
-  `Changed umask from ${oldmask.toString(8)} to ${newmask.toString(8)}`
+  `Changed umask from ${oldmask.toString(8)} to ${newmask.toString(8)}`,
 );
 ```
 
diff --git a/doc/api/readline.md b/doc/api/readline.md
index b4ac0b3bf5f264..eaac5f8f79d579 100644
--- a/doc/api/readline.md
+++ b/doc/api/readline.md
@@ -449,7 +449,7 @@ const rl = readline.createInterface(process.stdin);
 const showResults = debounce(() => {
   console.log(
     '\n',
-    values.filter((val) => val.startsWith(rl.line)).join(' ')
+    values.filter((val) => val.startsWith(rl.line)).join(' '),
   );
 }, 300);
 process.stdin.on('keypress', (c, k) => {
@@ -707,7 +707,7 @@ instance.
 const readlinePromises = require('node:readline/promises');
 const rl = readlinePromises.createInterface({
   input: process.stdin,
-  output: process.stdout
+  output: process.stdout,
 });
 ```
 
@@ -964,7 +964,7 @@ instance.
 const readline = require('node:readline');
 const rl = readline.createInterface({
   input: process.stdin,
-  output: process.stdout
+  output: process.stdout,
 });
 ```
 
@@ -1103,7 +1103,7 @@ const readline = require('node:readline');
 const rl = readline.createInterface({
   input: process.stdin,
   output: process.stdout,
-  prompt: 'OHAI> '
+  prompt: 'OHAI> ',
 });
 
 rl.prompt();
@@ -1139,7 +1139,7 @@ async function processLineByLine() {
 
   const rl = readline.createInterface({
     input: fileStream,
-    crlfDelay: Infinity
+    crlfDelay: Infinity,
   });
   // Note: we use the crlfDelay option to recognize all instances of CR LF
   // ('\r\n') in input.txt as a single line break.
@@ -1161,7 +1161,7 @@ const readline = require('node:readline');
 
 const rl = readline.createInterface({
   input: fs.createReadStream('sample.txt'),
-  crlfDelay: Infinity
+  crlfDelay: Infinity,
 });
 
 rl.on('line', (line) => {
@@ -1181,7 +1181,7 @@ const { createInterface } = require('node:readline');
   try {
     const rl = createInterface({
       input: createReadStream('big-file.txt'),
-      crlfDelay: Infinity
+      crlfDelay: Infinity,
     });
 
     rl.on('line', (line) => {
diff --git a/doc/api/repl.md b/doc/api/repl.md
index 28dc5ecce55f51..1d216c4358fcd4 100644
--- a/doc/api/repl.md
+++ b/doc/api/repl.md
@@ -132,7 +132,7 @@ const r = repl.start('> ');
 Object.defineProperty(r.context, 'm', {
   configurable: false,
   enumerable: true,
-  value: msg
+  value: msg,
 });
 ```
 
@@ -485,7 +485,7 @@ replServer.defineCommand('sayhello', {
     this.clearBufferedCommand();
     console.log(`Hello, ${name}!`);
     this.displayPrompt();
-  }
+  },
 });
 replServer.defineCommand('saybye', function saybye() {
   console.log('Goodbye!');
@@ -733,7 +733,7 @@ let connections = 0;
 repl.start({
   prompt: 'Node.js via stdin> ',
   input: process.stdin,
-  output: process.stdout
+  output: process.stdout,
 });
 
 net.createServer((socket) => {
@@ -741,7 +741,7 @@ net.createServer((socket) => {
   repl.start({
     prompt: 'Node.js via Unix socket> ',
     input: socket,
-    output: socket
+    output: socket,
   }).on('exit', () => {
     socket.end();
   });
@@ -752,7 +752,7 @@ net.createServer((socket) => {
   repl.start({
     prompt: 'Node.js via TCP socket> ',
     input: socket,
-    output: socket
+    output: socket,
   }).on('exit', () => {
     socket.end();
   });
diff --git a/doc/api/stream.md b/doc/api/stream.md
index 224ccbb27be9b3..92f77f61a9d28d 100644
--- a/doc/api/stream.md
+++ b/doc/api/stream.md
@@ -882,8 +882,10 @@ pass.unpipe(writable);
 // readableFlowing is now false.
 
 pass.on('data', (chunk) => { console.log(chunk.toString()); });
+// readableFlowing is still false.
 pass.write('ok');  // Will not emit 'data'.
 pass.resume();     // Must be called to make stream emit 'data'.
+// readableFlowing is now true.
 ```
 
 While `readable.readableFlowing` is `false`, data may be accumulating
@@ -2536,7 +2538,7 @@ pipeline(
     } else {
       console.log('Pipeline succeeded.');
     }
-  }
+  },
 );
 ```
 
@@ -2555,7 +2557,7 @@ async function run() {
   await pipeline(
     fs.createReadStream('archive.tar'),
     zlib.createGzip(),
-    fs.createWriteStream('archive.tar.gz')
+    fs.createWriteStream('archive.tar.gz'),
   );
   console.log('Pipeline succeeded.');
 }
@@ -2602,7 +2604,7 @@ async function run() {
         yield await processChunk(chunk, { signal });
       }
     },
-    fs.createWriteStream('uppercase.txt')
+    fs.createWriteStream('uppercase.txt'),
   );
   console.log('Pipeline succeeded.');
 }
@@ -2624,7 +2626,7 @@ async function run() {
       await someLongRunningfn({ signal });
       yield 'asd';
     },
-    fs.createWriteStream('uppercase.txt')
+    fs.createWriteStream('uppercase.txt'),
   );
   console.log('Pipeline succeeded.');
 }
@@ -2696,7 +2698,7 @@ import { compose, Transform } from 'node:stream';
 const removeSpaces = new Transform({
   transform(chunk, encoding, callback) {
     callback(null, String(chunk).replace(' ', ''));
-  }
+  },
 });
 
 async function* toUpper(source) {
@@ -2948,7 +2950,7 @@ added: v17.0.0
 import { Duplex } from 'node:stream';
 import {
   ReadableStream,
-  WritableStream
+  WritableStream,
 } from 'node:stream/web';
 
 const readable = new ReadableStream({
@@ -2960,12 +2962,12 @@ const readable = new ReadableStream({
 const writable = new WritableStream({
   write(chunk) {
     console.log('writable', chunk);
-  }
+  },
 });
 
 const pair = {
   readable,
-  writable
+  writable,
 };
 const duplex = Duplex.fromWeb(pair, { encoding: 'utf8', objectMode: true });
 
@@ -2980,7 +2982,7 @@ for await (const chunk of duplex) {
 const { Duplex } = require('node:stream');
 const {
   ReadableStream,
-  WritableStream
+  WritableStream,
 } = require('node:stream/web');
 
 const readable = new ReadableStream({
@@ -2992,12 +2994,12 @@ const readable = new ReadableStream({
 const writable = new WritableStream({
   write(chunk) {
     console.log('writable', chunk);
-  }
+  },
 });
 
 const pair = {
   readable,
-  writable
+  writable,
 };
 const duplex = Duplex.fromWeb(pair, { encoding: 'utf8', objectMode: true });
 
@@ -3030,7 +3032,7 @@ const duplex = Duplex({
   write(chunk, encoding, callback) {
     console.log('writable', chunk);
     callback();
-  }
+  },
 });
 
 const { readable, writable } = Duplex.toWeb(duplex);
@@ -3052,7 +3054,7 @@ const duplex = Duplex({
   write(chunk, encoding, callback) {
     console.log('writable', chunk);
     callback();
-  }
+  },
 });
 
 const { readable, writable } = Duplex.toWeb(duplex);
@@ -3085,7 +3087,7 @@ const fs = require('node:fs');
 const controller = new AbortController();
 const read = addAbortSignal(
   controller.signal,
-  fs.createReadStream(('object.json'))
+  fs.createReadStream(('object.json')),
 );
 // Later, abort the operation closing the stream
 controller.abort();
@@ -3098,7 +3100,7 @@ const controller = new AbortController();
 setTimeout(() => controller.abort(), 10_000); // set a timeout
 const stream = addAbortSignal(
   controller.signal,
-  fs.createReadStream(('object.json'))
+  fs.createReadStream(('object.json')),
 );
 (async () => {
   try {
@@ -3192,7 +3194,7 @@ const myWritable = new Writable({
   },
   destroy() {
     // Free resources...
-  }
+  },
 });
 ```
 
@@ -3299,7 +3301,7 @@ const myWritable = new Writable({
   },
   writev(chunks, callback) {
     // ...
-  }
+  },
 });
 ```
 
@@ -3318,7 +3320,7 @@ const myWritable = new Writable({
   writev(chunks, callback) {
     // ...
   },
-  signal: controller.signal
+  signal: controller.signal,
 });
 // Later, abort the operation closing the stream
 controller.abort();
@@ -3509,7 +3511,7 @@ const myWritable = new Writable({
     } else {
       callback();
     }
-  }
+  },
 });
 ```
 
@@ -3656,7 +3658,7 @@ const { Readable } = require('node:stream');
 const myReadable = new Readable({
   read(size) {
     // ...
-  }
+  },
 });
 ```
 
@@ -3671,7 +3673,7 @@ const read = new Readable({
   read(size) {
     // ...
   },
-  signal: controller.signal
+  signal: controller.signal,
 });
 // Later, abort the operation closing the stream
 controller.abort();
@@ -3879,7 +3881,7 @@ const myReadable = new Readable({
     } else {
       // Do some work.
     }
-  }
+  },
 });
 ```
 
@@ -3997,7 +3999,7 @@ const myDuplex = new Duplex({
   },
   write(chunk, encoding, callback) {
     // ...
-  }
+  },
 });
 ```
 
@@ -4029,7 +4031,7 @@ pipeline(
       } catch (err) {
         callback(err);
       }
-    }
+    },
   }),
   fs.createWriteStream('valid-object.json'),
   (err) => {
@@ -4038,7 +4040,7 @@ pipeline(
     } else {
       console.log('completed');
     }
-  }
+  },
 );
 ```
 
@@ -4109,7 +4111,7 @@ const myTransform = new Transform({
 
     // Push the data onto the readable queue.
     callback(null, '0'.repeat(data.length % 2) + data);
-  }
+  },
 });
 
 myTransform.setEncoding('ascii');
@@ -4191,7 +4193,7 @@ const { Transform } = require('node:stream');
 const myTransform = new Transform({
   transform(chunk, encoding, callback) {
     // ...
-  }
+  },
 });
 ```
 
diff --git a/doc/api/test.md b/doc/api/test.md
index cc55eb6943028b..6bfff0c341bfa7 100644
--- a/doc/api/test.md
+++ b/doc/api/test.md
@@ -291,6 +291,25 @@ test('a test that creates asynchronous activity', (t) => {
 });
 ```
 
+## Watch mode
+
+<!-- YAML
+added: v19.2.0
+-->
+
+> Stability: 1 - Experimental
+
+The Node.js test runner supports running in watch mode by passing the `--watch` flag:
+
+```bash
+node --test --watch
+```
+
+In watch mode, the test runner will watch for changes to test files and
+their dependencies. When a change is detected, the test runner will
+rerun the tests affected by the change.
+The test runner will continue to run until the process is terminated.
+
 ## Running tests from the command line
 
 The Node.js test runner can be invoked from the command line by passing the
@@ -1023,8 +1042,7 @@ Emitted when [`context.diagnostic`][] is called.
 ### Event: `'test:fail'`
 
 * `data` {Object}
-  * `duration` {number} The test duration.
-  * `error` {Error} The failure casing test to fail.
+  * `details` {Object} Additional execution metadata.
   * `name` {string} The test name.
   * `testNumber` {number} The ordinal number of the test.
   * `todo` {string|undefined} Present if [`context.todo`][] is called
@@ -1035,7 +1053,7 @@ Emitted when a test fails.
 ### Event: `'test:pass'`
 
 * `data` {Object}
-  * `duration` {number} The test duration.
+  * `details` {Object} Additional execution metadata.
   * `name` {string} The test name.
   * `testNumber` {number} The ordinal number of the test.
   * `todo` {string|undefined} Present if [`context.todo`][] is called
@@ -1084,7 +1102,7 @@ test('top level test', async (t) => {
     'This is a subtest',
     (t) => {
       assert.ok('some relevant assertion here');
-    }
+    },
   );
 });
 ```
@@ -1118,7 +1136,7 @@ test('top level test', async (t) => {
     'This is a subtest',
     (t) => {
       assert.ok('some relevant assertion here');
-    }
+    },
   );
 });
 ```
@@ -1295,7 +1313,7 @@ test('top level test', async (t) => {
     { only: false, skip: false, concurrency: 1, todo: false },
     (t) => {
       assert.ok('some relevant assertion here');
-    }
+    },
   );
 });
 ```
diff --git a/doc/api/tls.md b/doc/api/tls.md
index d20004e0da4405..db4487d14c73dc 100644
--- a/doc/api/tls.md
+++ b/doc/api/tls.md
@@ -2126,7 +2126,7 @@ const options = {
   requestCert: true,
 
   // This is necessary only if the client uses a self-signed certificate.
-  ca: [ fs.readFileSync('client-cert.pem') ]
+  ca: [ fs.readFileSync('client-cert.pem') ],
 };
 
 const server = tls.createServer(options, (socket) => {
diff --git a/doc/api/url.md b/doc/api/url.md
index 09faddadc2b99d..ba80ec96d3d38b 100644
--- a/doc/api/url.md
+++ b/doc/api/url.md
@@ -762,7 +762,7 @@ joins all array elements with commas.
 ```js
 const params = new URLSearchParams({
   user: 'abc',
-  query: ['first', 'second']
+  query: ['first', 'second'],
 });
 console.log(params.getAll('query'));
 // Prints [ 'first,second' ]
@@ -1454,8 +1454,8 @@ url.format({
   pathname: '/some/path',
   query: {
     page: 1,
-    format: 'json'
-  }
+    format: 'json',
+  },
 });
 
 // => 'https://example.com/some/path?page=1&format=json'
diff --git a/doc/api/util.md b/doc/api/util.md
index 8377ed61cb8ccd..69549ebd0da993 100644
--- a/doc/api/util.md
+++ b/doc/api/util.md
@@ -680,7 +680,7 @@ const o = {
       'eiusmod \ntempor incididunt ut labore et dolore magna aliqua.',
     'test',
     'foo']], 4],
-  b: new Map([['za', 1], ['zb', 'test']])
+  b: new Map([['za', 1], ['zb', 'test']]),
 };
 console.log(util.inspect(o, { compact: true, depth: 5, breakLength: 80 }));
 
@@ -748,7 +748,7 @@ const assert = require('node:assert');
 const o1 = {
   b: [2, 3, 1],
   a: '`a` comes before `b`',
-  c: new Set([2, 3, 1])
+  c: new Set([2, 3, 1]),
 };
 console.log(inspect(o1, { sorted: true }));
 // { a: '`a` comes before `b`', b: [ 2, 3, 1 ], c: Set(3) { 1, 2, 3 } }
@@ -758,11 +758,11 @@ console.log(inspect(o1, { sorted: (a, b) => b.localeCompare(a) }));
 const o2 = {
   c: new Set([2, 1, 3]),
   a: '`a` comes before `b`',
-  b: [2, 3, 1]
+  b: [2, 3, 1],
 };
 assert.strict.equal(
   inspect(o1, { sorted: true }),
-  inspect(o2, { sorted: true })
+  inspect(o2, { sorted: true }),
 );
 ```
 
@@ -909,7 +909,7 @@ class Box {
     }
 
     const newOptions = Object.assign({}, options, {
-      depth: options.depth === null ? null : options.depth - 1
+      depth: options.depth === null ? null : options.depth - 1,
     });
 
     // Five space padding because that's the size of "Box< ".
@@ -1437,15 +1437,15 @@ const args = ['-f', '--bar', 'b'];
 const options = {
   foo: {
     type: 'boolean',
-    short: 'f'
+    short: 'f',
   },
   bar: {
-    type: 'string'
-  }
+    type: 'string',
+  },
 };
 const {
   values,
-  positionals
+  positionals,
 } = parseArgs({ args, options });
 console.log(values, positionals);
 // Prints: [Object: null prototype] { foo: true, bar: 'b' } []
@@ -1457,15 +1457,15 @@ const args = ['-f', '--bar', 'b'];
 const options = {
   foo: {
     type: 'boolean',
-    short: 'f'
+    short: 'f',
   },
   bar: {
-    type: 'string'
-  }
+    type: 'string',
+  },
 };
 const {
   values,
-  positionals
+  positionals,
 } = parseArgs({ args, options });
 console.log(values, positionals);
 // Prints: [Object: null prototype] { foo: true, bar: 'b' } []
diff --git a/doc/api/v8.md b/doc/api/v8.md
index 40d0b10c989337..7bb1a795b5a581 100644
--- a/doc/api/v8.md
+++ b/doc/api/v8.md
@@ -349,7 +349,7 @@ const { writeHeapSnapshot } = require('node:v8');
 const {
   Worker,
   isMainThread,
-  parentPort
+  parentPort,
 } = require('node:worker_threads');
 
 if (isMainThread) {
@@ -689,7 +689,7 @@ const stopHookSet = promiseHooks.createHook({
   init,
   settled,
   before,
-  after
+  after,
 });
 
 // To stop a hook, call the function returned at its creation.
@@ -839,7 +839,7 @@ specifics of all functions that can be passed to `callbacks` is in the
 import { promiseHooks } from 'node:v8';
 
 const stopAll = promiseHooks.createHook({
-  init(promise, parent) {}
+  init(promise, parent) {},
 });
 ```
 
@@ -847,7 +847,7 @@ const stopAll = promiseHooks.createHook({
 const { promiseHooks } = require('node:v8');
 
 const stopAll = promiseHooks.createHook({
-  init(promise, parent) {}
+  init(promise, parent) {},
 });
 ```
 
@@ -950,7 +950,7 @@ const {
   isBuildingSnapshot,
   addSerializeCallback,
   addDeserializeCallback,
-  setDeserializeMainFunction
+  setDeserializeMainFunction,
 } = require('node:v8').startupSnapshot;
 
 const filePath = path.resolve(__dirname, '../x1024.txt');
diff --git a/doc/api/vm.md b/doc/api/vm.md
index a37dedb6e2fabd..35a5d4f4bafd67 100644
--- a/doc/api/vm.md
+++ b/doc/api/vm.md
@@ -206,7 +206,7 @@ const vm = require('node:vm');
 
 const context = {
   animal: 'cat',
-  count: 2
+  count: 2,
 };
 
 const script = new vm.Script('count += 1; name = "kitty";');
@@ -785,7 +785,7 @@ const module = new vm.SourceTextModule(
       // Object.prototype in the top context rather than that in
       // the contextified object.
       meta.prop = {};
-    }
+    },
   });
 // Since module has no dependencies, the linker function will never be called.
 await module.link(() => {});
@@ -812,7 +812,7 @@ const contextifiedObject = vm.createContext({ secret: 42 });
         // Object.prototype in the top context rather than that in
         // the contextified object.
         meta.prop = {};
-      }
+      },
     });
   // Since module has no dependencies, the linker function will never be called.
   await module.link(() => {});
@@ -1358,7 +1358,7 @@ const vm = require('node:vm');
 
 const contextObject = {
   animal: 'cat',
-  count: 2
+  count: 2,
 };
 
 vm.runInNewContext('count += 1; name = "kitty"', contextObject);
@@ -1522,7 +1522,7 @@ function loop() {
 vm.runInNewContext(
   'Promise.resolve().then(() => loop());',
   { loop, console },
-  { timeout: 5 }
+  { timeout: 5 },
 );
 // This is printed *before* 'entering loop' (!)
 console.log('done executing');
@@ -1541,7 +1541,7 @@ function loop() {
 vm.runInNewContext(
   'Promise.resolve().then(() => loop());',
   { loop, console },
-  { timeout: 5, microtaskMode: 'afterEvaluate' }
+  { timeout: 5, microtaskMode: 'afterEvaluate' },
 );
 ```
 
diff --git a/doc/api/wasi.md b/doc/api/wasi.md
index 1b457201345ff0..c0b07c63bb3426 100644
--- a/doc/api/wasi.md
+++ b/doc/api/wasi.md
@@ -19,8 +19,8 @@ const wasi = new WASI({
   args: argv,
   env,
   preopens: {
-    '/sandbox': '/some/real/path/that/wasm/can/access'
-  }
+    '/sandbox': '/some/real/path/that/wasm/can/access',
+  },
 });
 
 // Some WASI binaries require:
@@ -28,7 +28,7 @@ const wasi = new WASI({
 const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
 
 const wasm = await WebAssembly.compile(
-  await readFile(new URL('./demo.wasm', import.meta.url))
+  await readFile(new URL('./demo.wasm', import.meta.url)),
 );
 const instance = await WebAssembly.instantiate(wasm, importObject);
 
@@ -46,8 +46,8 @@ const wasi = new WASI({
   args: argv,
   env,
   preopens: {
-    '/sandbox': '/some/real/path/that/wasm/can/access'
-  }
+    '/sandbox': '/some/real/path/that/wasm/can/access',
+  },
 });
 
 // Some WASI binaries require:
@@ -56,7 +56,7 @@ const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
 
 (async () => {
   const wasm = await WebAssembly.compile(
-    await readFile(join(__dirname, 'demo.wasm'))
+    await readFile(join(__dirname, 'demo.wasm')),
   );
   const instance = await WebAssembly.instantiate(wasm, importObject);
 
diff --git a/doc/api/webcrypto.md b/doc/api/webcrypto.md
index 31568ffc3b783a..c993de34e2f8e3 100644
--- a/doc/api/webcrypto.md
+++ b/doc/api/webcrypto.md
@@ -54,14 +54,14 @@ const { subtle } = globalThis.crypto;
   const key = await subtle.generateKey({
     name: 'HMAC',
     hash: 'SHA-256',
-    length: 256
+    length: 256,
   }, true, ['sign', 'verify']);
 
   const enc = new TextEncoder();
   const message = enc.encode('I love cupcakes');
 
   const digest = await subtle.sign({
-    name: 'HMAC'
+    name: 'HMAC',
   }, key, message);
 
 })();
@@ -82,7 +82,7 @@ const { subtle } = globalThis.crypto;
 async function generateAesKey(length = 256) {
   const key = await subtle.generateKey({
     name: 'AES-CBC',
-    length
+    length,
   }, true, ['encrypt', 'decrypt']);
 
   return key;
@@ -97,7 +97,7 @@ const { subtle } = globalThis.crypto;
 async function generateEcKey(namedCurve = 'P-521') {
   const {
     publicKey,
-    privateKey
+    privateKey,
   } = await subtle.generateKey({
     name: 'ECDSA',
     namedCurve,
@@ -135,7 +135,7 @@ const { subtle } = globalThis.crypto;
 async function generateHmacKey(hash = 'SHA-256') {
   const key = await subtle.generateKey({
     name: 'HMAC',
-    hash
+    hash,
   }, true, ['sign', 'verify']);
 
   return key;
@@ -151,7 +151,7 @@ const publicExponent = new Uint8Array([1, 0, 1]);
 async function generateRsaKey(modulusLength = 2048, hash = 'SHA-256') {
   const {
     publicKey,
-    privateKey
+    privateKey,
   } = await subtle.generateKey({
     name: 'RSASSA-PKCS1-v1_5',
     modulusLength,
@@ -181,7 +181,7 @@ async function aesEncrypt(plaintext) {
   return {
     key,
     iv,
-    ciphertext
+    ciphertext,
   };
 }
 
@@ -204,7 +204,7 @@ const { subtle } = globalThis.crypto;
 async function generateAndExportHmacKey(format = 'jwk', hash = 'SHA-512') {
   const key = await subtle.generateKey({
     name: 'HMAC',
-    hash
+    hash,
   }, true, ['sign', 'verify']);
 
   return subtle.exportKey(format, key);
@@ -213,7 +213,7 @@ async function generateAndExportHmacKey(format = 'jwk', hash = 'SHA-512') {
 async function importHmacKey(keyData, format = 'jwk', hash = 'SHA-512') {
   const key = await subtle.importKey(format, keyData, {
     name: 'HMAC',
-    hash
+    hash,
   }, true, ['sign', 'verify']);
 
   return key;
@@ -231,11 +231,11 @@ async function generateAndWrapHmacKey(format = 'jwk', hash = 'SHA-512') {
     wrappingKey,
   ] = await Promise.all([
     subtle.generateKey({
-      name: 'HMAC', hash
+      name: 'HMAC', hash,
     }, true, ['sign', 'verify']),
     subtle.generateKey({
       name: 'AES-KW',
-      length: 256
+      length: 256,
     }, true, ['wrapKey', 'unwrapKey']),
   ]);
 
@@ -304,7 +304,7 @@ async function pbkdf2(pass, salt, iterations = 1000, length = 256) {
     name: 'PBKDF2',
     hash: 'SHA-512',
     salt: ec.encode(salt),
-    iterations
+    iterations,
   }, key, length);
   return bits;
 }
@@ -321,10 +321,10 @@ async function pbkdf2Key(pass, salt, iterations = 1000, length = 256) {
     name: 'PBKDF2',
     hash: 'SHA-512',
     salt: ec.encode(salt),
-    iterations
+    iterations,
   }, keyMaterial, {
     name: 'AES-GCM',
-    length: 256
+    length: 256,
   }, true, ['encrypt', 'decrypt']);
   return key;
 }
diff --git a/doc/api/webstreams.md b/doc/api/webstreams.md
index 970d147be49fe0..c8c2b845c9ad6e 100644
--- a/doc/api/webstreams.md
+++ b/doc/api/webstreams.md
@@ -35,15 +35,15 @@ is used to read the data from the stream.
 
 ```mjs
 import {
-  ReadableStream
+  ReadableStream,
 } from 'node:stream/web';
 
 import {
-  setInterval as every
+  setInterval as every,
 } from 'node:timers/promises';
 
 import {
-  performance
+  performance,
 } from 'node:perf_hooks';
 
 const SECOND = 1000;
@@ -52,7 +52,7 @@ const stream = new ReadableStream({
   async start(controller) {
     for await (const _ of every(SECOND))
       controller.enqueue(performance.now());
-  }
+  },
 });
 
 for await (const value of stream)
@@ -61,15 +61,15 @@ for await (const value of stream)
 
 ```cjs
 const {
-  ReadableStream
+  ReadableStream,
 } = require('node:stream/web');
 
 const {
-  setInterval: every
+  setInterval: every,
 } = require('node:timers/promises');
 
 const {
-  performance
+  performance,
 } = require('node:perf_hooks');
 
 const SECOND = 1000;
@@ -78,7 +78,7 @@ const stream = new ReadableStream({
   async start(controller) {
     for await (const _ of every(SECOND))
       controller.enqueue(performance.now());
-  }
+  },
 });
 
 (async () => {
@@ -238,7 +238,7 @@ const stream = new ReadableStream({
 const transform = new TransformStream({
   transform(chunk, controller) {
     controller.enqueue(chunk.toUpperCase());
-  }
+  },
 });
 
 const transformedStream = stream.pipeThrough(transform);
@@ -262,7 +262,7 @@ const stream = new ReadableStream({
 const transform = new TransformStream({
   transform(chunk, controller) {
     controller.enqueue(chunk.toUpperCase());
-  }
+  },
 });
 
 const transformedStream = stream.pipeThrough(transform);
@@ -476,11 +476,11 @@ data that avoids extraneous copying.
 
 ```mjs
 import {
-  open
+  open,
 } from 'node:fs/promises';
 
 import {
-  ReadableStream
+  ReadableStream,
 } from 'node:stream/web';
 
 import { Buffer } from 'node:buffer';
@@ -501,7 +501,7 @@ class Source {
     } = await this.file.read({
       buffer: view,
       offset: view.byteOffset,
-      length: view.byteLength
+      length: view.byteLength,
     });
 
     if (bytesRead === 0) {
@@ -774,13 +774,13 @@ The `WritableStream` is a destination to which stream data is sent.
 
 ```mjs
 import {
-  WritableStream
+  WritableStream,
 } from 'node:stream/web';
 
 const stream = new WritableStream({
   write(chunk) {
     console.log(chunk);
-  }
+  },
 });
 
 await stream.getWriter().write('Hello World');
@@ -1018,13 +1018,13 @@ queue.
 
 ```mjs
 import {
-  TransformStream
+  TransformStream,
 } from 'node:stream/web';
 
 const transform = new TransformStream({
   transform(chunk, controller) {
     controller.enqueue(chunk.toUpperCase());
-  }
+  },
 });
 
 await Promise.all([
@@ -1571,11 +1571,11 @@ import { Readable } from 'node:stream';
 
 const items = Array.from(
   {
-    length: 100
+    length: 100,
   },
   () => ({
-    message: 'hello world from consumers!'
-  })
+    message: 'hello world from consumers!',
+  }),
 );
 
 const readable = Readable.from(JSON.stringify(items));
@@ -1589,11 +1589,11 @@ const { Readable } = require('node:stream');
 
 const items = Array.from(
   {
-    length: 100
+    length: 100,
   },
   () => ({
-    message: 'hello world from consumers!'
-  })
+    message: 'hello world from consumers!',
+  }),
 );
 
 const readable = Readable.from(JSON.stringify(items));
diff --git a/doc/api/worker_threads.md b/doc/api/worker_threads.md
index 8f71fb5a851972..43f10ae489a9a0 100644
--- a/doc/api/worker_threads.md
+++ b/doc/api/worker_threads.md
@@ -23,14 +23,14 @@ instances.
 
 ```js
 const {
-  Worker, isMainThread, parentPort, workerData
+  Worker, isMainThread, parentPort, workerData,
 } = require('node:worker_threads');
 
 if (isMainThread) {
   module.exports = function parseJSAsync(script) {
     return new Promise((resolve, reject) => {
       const worker = new Worker(__filename, {
-        workerData: script
+        workerData: script,
       });
       worker.on('message', resolve);
       worker.on('error', reject);
@@ -370,7 +370,7 @@ with all other `BroadcastChannel` instances bound to the same channel name.
 const {
   isMainThread,
   BroadcastChannel,
-  Worker
+  Worker,
 } = require('node:worker_threads');
 
 const bc = new BroadcastChannel('hello');
@@ -883,7 +883,7 @@ the thread barrier.
 ```js
 const assert = require('node:assert');
 const {
-  Worker, MessageChannel, MessagePort, isMainThread, parentPort
+  Worker, MessageChannel, MessagePort, isMainThread, parentPort,
 } = require('node:worker_threads');
 if (isMainThread) {
   const worker = new Worker(__filename);
diff --git a/doc/api/zlib.md b/doc/api/zlib.md
index 83a767a07e0253..a33de3833cbe9f 100644
--- a/doc/api/zlib.md
+++ b/doc/api/zlib.md
@@ -26,7 +26,7 @@ const { createGzip } = require('node:zlib');
 const { pipeline } = require('node:stream');
 const {
   createReadStream,
-  createWriteStream
+  createWriteStream,
 } = require('node:fs');
 
 const gzip = createGzip();
@@ -562,8 +562,8 @@ const stream = zlib.createBrotliCompress({
   params: {
     [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,
     [zlib.constants.BROTLI_PARAM_QUALITY]: 4,
-    [zlib.constants.BROTLI_PARAM_SIZE_HINT]: fs.statSync(inputFile).size
-  }
+    [zlib.constants.BROTLI_PARAM_SIZE_HINT]: fs.statSync(inputFile).size,
+  },
 });
 ```
 
diff --git a/doc/api_assets/api.js b/doc/api_assets/api.js
index 8854182c4c56f0..49906b1a2abab5 100644
--- a/doc/api_assets/api.js
+++ b/doc/api_assets/api.js
@@ -20,7 +20,7 @@
             function() {
               mq.removeEventListener('change', mqChangeListener);
             },
-            { once: true }
+            { once: true },
           );
         }
       }
@@ -37,7 +37,7 @@
       themeToggleButton.addEventListener('click', function() {
         sessionStorage.setItem(
           kCustomPreference,
-          document.documentElement.classList.toggle('dark-mode')
+          document.documentElement.classList.toggle('dark-mode'),
         );
       });
     }
@@ -119,7 +119,7 @@
 
         header.classList.toggle('is-pinned', newStatus);
       },
-      { threshold: [1] }
+      { threshold: [1] },
     ).observe(header);
   }
 
diff --git a/doc/changelogs/CHANGELOG_V12.md b/doc/changelogs/CHANGELOG_V12.md
index faf4839c446cae..4c67234eb747e7 100644
--- a/doc/changelogs/CHANGELOG_V12.md
+++ b/doc/changelogs/CHANGELOG_V12.md
@@ -1821,7 +1821,7 @@ const { Console } = require('console');
 const customConsole = new Console({
   stdout: process.stdout,
   stderr: process.stderr,
-  groupIndentation: 10
+  groupIndentation: 10,
 });
 
 customConsole.log('foo');
diff --git a/doc/changelogs/CHANGELOG_V14.md b/doc/changelogs/CHANGELOG_V14.md
index 69783f7c19f3d4..3c2c087e64a9e3 100644
--- a/doc/changelogs/CHANGELOG_V14.md
+++ b/doc/changelogs/CHANGELOG_V14.md
@@ -3971,7 +3971,7 @@ const { Console } = require('console');
 const customConsole = new Console({
   stdout: process.stdout,
   stderr: process.stderr,
-  groupIndentation: 10
+  groupIndentation: 10,
 });
 
 customConsole.log('foo');
diff --git a/doc/changelogs/CHANGELOG_V15.md b/doc/changelogs/CHANGELOG_V15.md
index 2a1e91e52be666..983a09c43f7ef6 100644
--- a/doc/changelogs/CHANGELOG_V15.md
+++ b/doc/changelogs/CHANGELOG_V15.md
@@ -1078,7 +1078,7 @@ const read = new Readable({
   read(size) {
     // ...
   },
-  signal: controller.signal
+  signal: controller.signal,
 });
 // Later, abort the operation closing the stream
 controller.abort();
diff --git a/doc/changelogs/CHANGELOG_V19.md b/doc/changelogs/CHANGELOG_V19.md
index ea23e952bffda6..3d2ff9ae5b409d 100644
--- a/doc/changelogs/CHANGELOG_V19.md
+++ b/doc/changelogs/CHANGELOG_V19.md
@@ -8,7 +8,8 @@
 </tr>
 <tr>
 <td>
-<b><a href="#19.1.0">19.1.0</a></b><br/>
+<b><a href="#19.2.0">19.2.0</a></b><br/>
+<a href="#19.1.0">19.1.0</a><br/>
 <a href="#19.0.1">19.0.1</a><br/>
 <a href="#19.0.0">19.0.0</a><br/>
 </td>
@@ -36,6 +37,146 @@
   * [io.js](CHANGELOG_IOJS.md)
   * [Archive](CHANGELOG_ARCHIVE.md)
 
+<a id="19.2.0"></a>
+
+## 2022-11-29, Version 19.2.0 (Current), @ruyadorno
+
+### Notable changes
+
+#### Time zone update
+
+Time zone data has been updated to 2022f. This includes changes to Daylight Savings Time (DST) for Fiji and Mexico. For more information, see <https://mm.icann.org/pipermail/tz-announce/2022-October/000075.html>.
+
+#### Other notable changes
+
+* **buffer**
+  * (SEMVER-MINOR) introduce `File` class (Khafra) [#45139](https://github.com/nodejs/node/pull/45139)
+* **deps**
+  * update V8 to 10.8.168.20 (Michaël Zasso) [#45230](https://github.com/nodejs/node/pull/45230)
+* **doc**
+  * deprecate use of invalid ports in `url.parse` (Antoine du Hamel) [#45576](https://github.com/nodejs/node/pull/45576)
+* **util**
+  * add fast path for utf8 encoding (Yagiz Nizipli) [#45412](https://github.com/nodejs/node/pull/45412)
+
+### Commits
+
+* \[[`7cff1e14ba`](https://github.com/nodejs/node/commit/7cff1e14ba)] - **(SEMVER-MINOR)** **async\_hooks**: add hook to stop propagation (Gerhard Stöbich) [#45386](https://github.com/nodejs/node/pull/45386)
+* \[[`f08f6a64a3`](https://github.com/nodejs/node/commit/f08f6a64a3)] - **benchmark**: add v8 serialize benchmark (Yagiz Nizipli) [#45476](https://github.com/nodejs/node/pull/45476)
+* \[[`26ad54c1a2`](https://github.com/nodejs/node/commit/26ad54c1a2)] - **benchmark**: add text-encoder benchmark (Yagiz Nizipli) [#45450](https://github.com/nodejs/node/pull/45450)
+* \[[`6c56c9722b`](https://github.com/nodejs/node/commit/6c56c9722b)] - **(SEMVER-MINOR)** **buffer**: introduce File (Khafra) [#45139](https://github.com/nodejs/node/pull/45139)
+* \[[`6e1e25d6dd`](https://github.com/nodejs/node/commit/6e1e25d6dd)] - **build**: avoid redefined macro (Michaël Zasso) [#45544](https://github.com/nodejs/node/pull/45544)
+* \[[`5c9b2a7c82`](https://github.com/nodejs/node/commit/5c9b2a7c82)] - **build**: fix env.h for cpp20 (Jiawen Geng) [#45516](https://github.com/nodejs/node/pull/45516)
+* \[[`54fd8a1966`](https://github.com/nodejs/node/commit/54fd8a1966)] - **build**: reset embedder string to "-node.0" (Michaël Zasso) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`0f3cf7e5ce`](https://github.com/nodejs/node/commit/0f3cf7e5ce)] - _**Revert**_ "**build**: remove precompiled header and debug information for host builds" (Stefan Stojanovic) [#45432](https://github.com/nodejs/node/pull/45432)
+* \[[`62ef1eb4ff`](https://github.com/nodejs/node/commit/62ef1eb4ff)] - **build**: add --v8-disable-object-print flag (MURAKAMI Masahiko) [#45458](https://github.com/nodejs/node/pull/45458)
+* \[[`1ce2f56cf6`](https://github.com/nodejs/node/commit/1ce2f56cf6)] - **build**: make scripts in gyp run with right python (Jiawen Geng) [#45435](https://github.com/nodejs/node/pull/45435)
+* \[[`9ffe3c051a`](https://github.com/nodejs/node/commit/9ffe3c051a)] - **build,deps,src**: fix Intel VTune profiling support (Shi Lei) [#45248](https://github.com/nodejs/node/pull/45248)
+* \[[`bd3accc7b2`](https://github.com/nodejs/node/commit/bd3accc7b2)] - **crypto**: clear OpenSSL error queue after calling X509\_check\_private\_key() (Filip Skokan) [#45495](https://github.com/nodejs/node/pull/45495)
+* \[[`724addb293`](https://github.com/nodejs/node/commit/724addb293)] - **crypto**: update root certificates (Luigi Pinca) [#45490](https://github.com/nodejs/node/pull/45490)
+* \[[`efe19eb7f5`](https://github.com/nodejs/node/commit/efe19eb7f5)] - **crypto**: clear OpenSSL error queue after calling X509\_verify() (Takuro Sato) [#45377](https://github.com/nodejs/node/pull/45377)
+* \[[`f63ae525fa`](https://github.com/nodejs/node/commit/f63ae525fa)] - **deps**: V8: cherry-pick 2ada52cffbff (Michaël Zasso) [#45573](https://github.com/nodejs/node/pull/45573)
+* \[[`43e002e3d4`](https://github.com/nodejs/node/commit/43e002e3d4)] - **deps**: update base64 to 0.5.0 (Facundo Tuesca) [#45509](https://github.com/nodejs/node/pull/45509)
+* \[[`aaa4ac7735`](https://github.com/nodejs/node/commit/aaa4ac7735)] - **deps**: V8: cherry-pick 9df5ef70ff18 (Yagiz Nizipli) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`e70c3090ff`](https://github.com/nodejs/node/commit/e70c3090ff)] - **deps**: V8: cherry-pick f1c888e7093e (Michaël Zasso) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`51eb323c50`](https://github.com/nodejs/node/commit/51eb323c50)] - **deps**: V8: cherry-pick 92a7385171bb (Michaël Zasso) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`1370b1a769`](https://github.com/nodejs/node/commit/1370b1a769)] - **deps**: fix V8 build on Windows with MSVC (Michaël Zasso) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`3cd6367e6a`](https://github.com/nodejs/node/commit/3cd6367e6a)] - **deps**: silence irrelevant V8 warning (Michaël Zasso) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`9348bdd28d`](https://github.com/nodejs/node/commit/9348bdd28d)] - **deps**: V8: fix v8-cppgc.h for MSVC (Jiawen Geng) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`e9292544b0`](https://github.com/nodejs/node/commit/e9292544b0)] - **deps**: fix V8 build issue with inline methods (Jiawen Geng) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`a3b9967553`](https://github.com/nodejs/node/commit/a3b9967553)] - **deps**: update V8 to 10.8.168.20 (Michaël Zasso) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`117efe98b0`](https://github.com/nodejs/node/commit/117efe98b0)] - **deps**: V8: cherry-pick 9df5ef70ff18 (Yagiz Nizipli) [#45474](https://github.com/nodejs/node/pull/45474)
+* \[[`628891d4dd`](https://github.com/nodejs/node/commit/628891d4dd)] - **deps**: update timezone to 2022f (Node.js GitHub Bot) [#45289](https://github.com/nodejs/node/pull/45289)
+* \[[`45ba14b3be`](https://github.com/nodejs/node/commit/45ba14b3be)] - **deps**: fix zlib compilation for CPUs without SIMD features (Anna Henningsen) [#45387](https://github.com/nodejs/node/pull/45387)
+* \[[`c41e67fe1d`](https://github.com/nodejs/node/commit/c41e67fe1d)] - **deps**: update zlib to upstream 8bbd6c31 (Luigi Pinca) [#45387](https://github.com/nodejs/node/pull/45387)
+* \[[`413bf9ad39`](https://github.com/nodejs/node/commit/413bf9ad39)] - **deps**: patch V8 to 10.7.193.22 (Michaël Zasso) [#45460](https://github.com/nodejs/node/pull/45460)
+* \[[`ad8da86b3f`](https://github.com/nodejs/node/commit/ad8da86b3f)] - **deps**: update acorn to 8.8.1 (Node.js GitHub Bot) [#45441](https://github.com/nodejs/node/pull/45441)
+* \[[`17e6031bf0`](https://github.com/nodejs/node/commit/17e6031bf0)] - **deps**: V8: cherry-pick 031b98b25cba (Michaël Zasso) [#45375](https://github.com/nodejs/node/pull/45375)
+* \[[`9e0e97c121`](https://github.com/nodejs/node/commit/9e0e97c121)] - **diagnostics\_channel**: built-in channels should remain experimental (Stephen Belanger) [#45423](https://github.com/nodejs/node/pull/45423)
+* \[[`44886e55e1`](https://github.com/nodejs/node/commit/44886e55e1)] - **diagnostics\_channel**: mark as stable (Stephen Belanger) [#45290](https://github.com/nodejs/node/pull/45290)
+* \[[`b6b5b51687`](https://github.com/nodejs/node/commit/b6b5b51687)] - **doc**: deprecate use of invalid ports in `url.parse` (Antoine du Hamel) [#45576](https://github.com/nodejs/node/pull/45576)
+* \[[`d805d5a894`](https://github.com/nodejs/node/commit/d805d5a894)] - **doc**: clarify changes in readableFlowing (Kohei Ueno) [#45554](https://github.com/nodejs/node/pull/45554)
+* \[[`015842f3d2`](https://github.com/nodejs/node/commit/015842f3d2)] - **doc**: use console.error for error case in http2 (Deokjin Kim) [#45577](https://github.com/nodejs/node/pull/45577)
+* \[[`4345732900`](https://github.com/nodejs/node/commit/4345732900)] - **doc**: add version description about fsPromise.constants (chlorine) [#45556](https://github.com/nodejs/node/pull/45556)
+* \[[`16643dbb19`](https://github.com/nodejs/node/commit/16643dbb19)] - **doc**: add missing documentation for paramEncoding (Tobias Nießen) [#45523](https://github.com/nodejs/node/pull/45523)
+* \[[`246cd358b5`](https://github.com/nodejs/node/commit/246cd358b5)] - **doc**: fix typo in threat model (Tobias Nießen) [#45558](https://github.com/nodejs/node/pull/45558)
+* \[[`5b1df22db0`](https://github.com/nodejs/node/commit/5b1df22db0)] - **doc**: add Node.js Threat Model (Rafael Gonzaga) [#45223](https://github.com/nodejs/node/pull/45223)
+* \[[`19d8493c92`](https://github.com/nodejs/node/commit/19d8493c92)] - **doc**: run license-builder (github-actions\[bot]) [#45553](https://github.com/nodejs/node/pull/45553)
+* \[[`6f0bc097ea`](https://github.com/nodejs/node/commit/6f0bc097ea)] - **doc**: add async\_hooks migration note (Geoffrey Booth) [#45335](https://github.com/nodejs/node/pull/45335)
+* \[[`118de4b44c`](https://github.com/nodejs/node/commit/118de4b44c)] - **doc**: fix RESOLVE\_ESM\_MATCH in modules.md (翠 / green) [#45280](https://github.com/nodejs/node/pull/45280)
+* \[[`4de67d1ef4`](https://github.com/nodejs/node/commit/4de67d1ef4)] - **doc**: add arm64 to os.machine() (Carter Snook) [#45374](https://github.com/nodejs/node/pull/45374)
+* \[[`1812a89c00`](https://github.com/nodejs/node/commit/1812a89c00)] - **doc**: add lint rule to enforce trailing commas (Antoine du Hamel) [#45471](https://github.com/nodejs/node/pull/45471)
+* \[[`4128c27f66`](https://github.com/nodejs/node/commit/4128c27f66)] - **doc**: include v19.1.0 in `CHANGELOG.md` (Rafael Gonzaga) [#45462](https://github.com/nodejs/node/pull/45462)
+* \[[`94a6a97ec6`](https://github.com/nodejs/node/commit/94a6a97ec6)] - **doc**: adjust wording to eliminate awkward typography (Konv) [#45398](https://github.com/nodejs/node/pull/45398)
+* \[[`a6fe707b62`](https://github.com/nodejs/node/commit/a6fe707b62)] - **doc**: fix typo in maintaining-dependencies.md (Tobias Nießen) [#45428](https://github.com/nodejs/node/pull/45428)
+* \[[`8906a4e58e`](https://github.com/nodejs/node/commit/8906a4e58e)] - **esm**: add JSDoc property descriptions for loader (Rich Trott) [#45370](https://github.com/nodejs/node/pull/45370)
+* \[[`4e5ad9df50`](https://github.com/nodejs/node/commit/4e5ad9df50)] - **esm**: add JSDoc property descriptions for fetch (Rich Trott) [#45370](https://github.com/nodejs/node/pull/45370)
+* \[[`2b760c339e`](https://github.com/nodejs/node/commit/2b760c339e)] - **fs**: fix fs.rm support for loop symlinks (Nathanael Ruf) [#45439](https://github.com/nodejs/node/pull/45439)
+* \[[`e0a271e41b`](https://github.com/nodejs/node/commit/e0a271e41b)] - **gyp**: fix v8 canary build on aix (Vasili Skurydzin) [#45496](https://github.com/nodejs/node/pull/45496)
+* \[[`eac26c0793`](https://github.com/nodejs/node/commit/eac26c0793)] - _**Revert**_ "**http**: headers(Distinct), trailers(Distinct) setters to be no-op" (Rich Trott) [#45527](https://github.com/nodejs/node/pull/45527)
+* \[[`f208db70a0`](https://github.com/nodejs/node/commit/f208db70a0)] - **http**: add debug log for ERR\_UNESCAPED\_CHARACTERS (Aidan Temple) [#45420](https://github.com/nodejs/node/pull/45420)
+* \[[`b72b2bab72`](https://github.com/nodejs/node/commit/b72b2bab72)] - **http**: add JSDoc property descriptions (Rich Trott) [#45370](https://github.com/nodejs/node/pull/45370)
+* \[[`4c9159a830`](https://github.com/nodejs/node/commit/4c9159a830)] - **lib**: improve transferable abort controller exec (Yagiz Nizipli) [#45525](https://github.com/nodejs/node/pull/45525)
+* \[[`5745bcbb41`](https://github.com/nodejs/node/commit/5745bcbb41)] - **lib**: improve AbortController creation duration (Yagiz Nizipli) [#45525](https://github.com/nodejs/node/pull/45525)
+* \[[`38767b42fb`](https://github.com/nodejs/node/commit/38767b42fb)] - **lib**: do not throw if global property is no longer configurable (Antoine du Hamel) [#45344](https://github.com/nodejs/node/pull/45344)
+* \[[`0d1b1c5df0`](https://github.com/nodejs/node/commit/0d1b1c5df0)] - **meta**: update AUTHORS (Node.js GitHub Bot) [#45531](https://github.com/nodejs/node/pull/45531)
+* \[[`208ea1a58c`](https://github.com/nodejs/node/commit/208ea1a58c)] - **meta**: update VoltrexMaster's username (Mohammed Keyvanzadeh) [#45503](https://github.com/nodejs/node/pull/45503)
+* \[[`d13ea68ef6`](https://github.com/nodejs/node/commit/d13ea68ef6)] - **meta**: update AUTHORS (Node.js GitHub Bot) [#45443](https://github.com/nodejs/node/pull/45443)
+* \[[`6704e7814f`](https://github.com/nodejs/node/commit/6704e7814f)] - **meta**: be more proactive about removing from teams (Rich Trott) [#45352](https://github.com/nodejs/node/pull/45352)
+* \[[`6fdd202c57`](https://github.com/nodejs/node/commit/6fdd202c57)] - **module**: require.resolve.paths returns null with node schema (MURAKAMI Masahiko) [#45147](https://github.com/nodejs/node/pull/45147)
+* \[[`38f1ede379`](https://github.com/nodejs/node/commit/38f1ede379)] - **node-api**: address coverity warning (Michael Dawson) [#45563](https://github.com/nodejs/node/pull/45563)
+* \[[`4a4f2802ec`](https://github.com/nodejs/node/commit/4a4f2802ec)] - **node-api**: declare type napi\_cleanup\_hook (Chengzhong Wu) [#45391](https://github.com/nodejs/node/pull/45391)
+* \[[`8ff16fd8c0`](https://github.com/nodejs/node/commit/8ff16fd8c0)] - **node-api**: fix immediate napi\_remove\_wrap test (Chengzhong Wu) [#45406](https://github.com/nodejs/node/pull/45406)
+* \[[`e7a5b3347b`](https://github.com/nodejs/node/commit/e7a5b3347b)] - **src**: address coverity warning in node\_file.cc (Michael Dawson) [#45565](https://github.com/nodejs/node/pull/45565)
+* \[[`128c9f6fac`](https://github.com/nodejs/node/commit/128c9f6fac)] - **src**: use qualified `std::move` call in node\_http2 (Michaël Zasso) [#45555](https://github.com/nodejs/node/pull/45555)
+* \[[`57bca94cb1`](https://github.com/nodejs/node/commit/57bca94cb1)] - **src**: avoid unused variables and functions (Michaël Zasso) [#45542](https://github.com/nodejs/node/pull/45542)
+* \[[`649b31f5e5`](https://github.com/nodejs/node/commit/649b31f5e5)] - **src**: add missing include for `std::all_of` (Michaël Zasso) [#45541](https://github.com/nodejs/node/pull/45541)
+* \[[`56f22ea47c`](https://github.com/nodejs/node/commit/56f22ea47c)] - **src**: set an appropriate thread pool size if given `--v8-pool-size=0` (Daeyeon Jeong) [#45513](https://github.com/nodejs/node/pull/45513)
+* \[[`cce9e11d2d`](https://github.com/nodejs/node/commit/cce9e11d2d)] - **src**: move FsStatsOffset and kFsStatsBufferLength to node\_file.h (Joyee Cheung) [#45498](https://github.com/nodejs/node/pull/45498)
+* \[[`5e5bf0c236`](https://github.com/nodejs/node/commit/5e5bf0c236)] - **src**: don't run tasks on isolate termination (Santiago Gimeno) [#45444](https://github.com/nodejs/node/pull/45444)
+* \[[`10e7c2a62c`](https://github.com/nodejs/node/commit/10e7c2a62c)] - **src**: remove the unused PackageConfig class (Joyee Cheung) [#45478](https://github.com/nodejs/node/pull/45478)
+* \[[`459d4481d4`](https://github.com/nodejs/node/commit/459d4481d4)] - **src**: add --max-semi-space-size to the options allowed in NODE\_OPTIONS (Emanuel Hoogeveen) [#44436](https://github.com/nodejs/node/pull/44436)
+* \[[`a483d1291e`](https://github.com/nodejs/node/commit/a483d1291e)] - **src**: condense experimental warning message (Rich Trott) [#45424](https://github.com/nodejs/node/pull/45424)
+* \[[`42507e68ab`](https://github.com/nodejs/node/commit/42507e68ab)] - **src,node-api**: update `napi_is_detached_arraybuffer` (Daeyeon Jeong) [#45538](https://github.com/nodejs/node/pull/45538)
+* \[[`f720c5880e`](https://github.com/nodejs/node/commit/f720c5880e)] - **stream**: use ArrayBufferPrototypeGetByteLength (Yagiz Nizipli) [#45528](https://github.com/nodejs/node/pull/45528)
+* \[[`c00258e24b`](https://github.com/nodejs/node/commit/c00258e24b)] - **stream**: add primordials to adapters (Yagiz Nizipli) [#45511](https://github.com/nodejs/node/pull/45511)
+* \[[`5274a8f7db`](https://github.com/nodejs/node/commit/5274a8f7db)] - **stream**: avoid premature close when will not emit close (Robert Nagy) [#45301](https://github.com/nodejs/node/pull/45301)
+* \[[`496912d722`](https://github.com/nodejs/node/commit/496912d722)] - **stream**: fix typo in `adapters.js` (#45515) (Kohei Ueno) [#45515](https://github.com/nodejs/node/pull/45515)
+* \[[`8d96e2c723`](https://github.com/nodejs/node/commit/8d96e2c723)] - **stream**: add fast path for utf8 (Yagiz Nizipli) [#45483](https://github.com/nodejs/node/pull/45483)
+* \[[`c3fe9072c6`](https://github.com/nodejs/node/commit/c3fe9072c6)] - **test**: add trailing commas in event tests (Rich Trott) [#45466](https://github.com/nodejs/node/pull/45466)
+* \[[`bb4c293873`](https://github.com/nodejs/node/commit/bb4c293873)] - **test**: add trailing commas in async-hooks tests (#45549) (Antoine du Hamel) [#45549](https://github.com/nodejs/node/pull/45549)
+* \[[`731e8741b2`](https://github.com/nodejs/node/commit/731e8741b2)] - **test**: add trailing commas in addons test (#45548) (Antoine du Hamel) [#45548](https://github.com/nodejs/node/pull/45548)
+* \[[`d6c68ce346`](https://github.com/nodejs/node/commit/d6c68ce346)] - **test**: add trailing commas in `test/common` (#45550) (Antoine du Hamel) [#45550](https://github.com/nodejs/node/pull/45550)
+* \[[`c9ba0b738d`](https://github.com/nodejs/node/commit/c9ba0b738d)] - **test**: revise pull request guide text about code (Rich Trott) [#45519](https://github.com/nodejs/node/pull/45519)
+* \[[`076e9eeaeb`](https://github.com/nodejs/node/commit/076e9eeaeb)] - **test**: fix test-trace-gc-flag (Tony Gorez) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`72f2df2802`](https://github.com/nodejs/node/commit/72f2df2802)] - **test**: adapt test-v8-stats for V8 update (Michaël Zasso) [#45230](https://github.com/nodejs/node/pull/45230)
+* \[[`b491504d77`](https://github.com/nodejs/node/commit/b491504d77)] - **test**: enable the WPT for `structuredClone` (Daeyeon Jeong) [#45482](https://github.com/nodejs/node/pull/45482)
+* \[[`1277ffcb55`](https://github.com/nodejs/node/commit/1277ffcb55)] - **test**: add lint rule to enforce trailing commas (Antoine du Hamel) [#45468](https://github.com/nodejs/node/pull/45468)
+* \[[`45b54eec55`](https://github.com/nodejs/node/commit/45b54eec55)] - **test**: update uses of \_jabber.\_tcp.google.com (Colin Ihrig) [#45451](https://github.com/nodejs/node/pull/45451)
+* \[[`51213c24bd`](https://github.com/nodejs/node/commit/51213c24bd)] - **test**: add test to validate changelogs for releases (Richard Lau) [#45325](https://github.com/nodejs/node/pull/45325)
+* \[[`00a3b5f7d5`](https://github.com/nodejs/node/commit/00a3b5f7d5)] - **test**: remove flaky designation for test-worker-http2-stream-terminate (Rich Trott) [#45438](https://github.com/nodejs/node/pull/45438)
+* \[[`4fe5c4e167`](https://github.com/nodejs/node/commit/4fe5c4e167)] - **test**: fix flaky test-repl-sigint-nested-eval (Rich Trott) [#45354](https://github.com/nodejs/node/pull/45354)
+* \[[`f79dd65333`](https://github.com/nodejs/node/commit/f79dd65333)] - **test**: add a test to ensure the correctness of timezone upgrades (Darshan Sen) [#45299](https://github.com/nodejs/node/pull/45299)
+* \[[`016749ba5d`](https://github.com/nodejs/node/commit/016749ba5d)] - **test\_runner**: add initial TAP parser (Wassim Chegham) [#43525](https://github.com/nodejs/node/pull/43525)
+* \[[`e9760b4ae8`](https://github.com/nodejs/node/commit/e9760b4ae8)] - **test\_runner**: support watch mode (Moshe Atlow) [#45214](https://github.com/nodejs/node/pull/45214)
+* \[[`160c88ec77`](https://github.com/nodejs/node/commit/160c88ec77)] - **tools**: have test-asan use ubuntu-20.04 (Filip Skokan) [#45581](https://github.com/nodejs/node/pull/45581)
+* \[[`81f63c2b28`](https://github.com/nodejs/node/commit/81f63c2b28)] - **tools**: update eslint to 8.28.0 (Node.js GitHub Bot) [#45532](https://github.com/nodejs/node/pull/45532)
+* \[[`f3f1aed01a`](https://github.com/nodejs/node/commit/f3f1aed01a)] - **tools**: add automation for updating libuv dependency (Facundo Tuesca) [#45362](https://github.com/nodejs/node/pull/45362)
+* \[[`d4f30f07b3`](https://github.com/nodejs/node/commit/d4f30f07b3)] - **tools**: add missing step in update-base64.sh script (Facundo Tuesca) [#45509](https://github.com/nodejs/node/pull/45509)
+* \[[`cca20330cf`](https://github.com/nodejs/node/commit/cca20330cf)] - **tools**: update certdata.txt (Luigi Pinca) [#45490](https://github.com/nodejs/node/pull/45490)
+* \[[`39e873139b`](https://github.com/nodejs/node/commit/39e873139b)] - **tools**: include current release in the list of released versions (Antoine du Hamel) [#45463](https://github.com/nodejs/node/pull/45463)
+* \[[`8a34ef4897`](https://github.com/nodejs/node/commit/8a34ef4897)] - **tools**: update lint-md-dependencies to rollup\@3.3.0 (Node.js GitHub Bot) [#45442](https://github.com/nodejs/node/pull/45442)
+* \[[`bb36acff42`](https://github.com/nodejs/node/commit/bb36acff42)] - **tools**: do not run CQ on non-fast-tracked PRs open for less than 2 days (Moshe Atlow) [#45407](https://github.com/nodejs/node/pull/45407)
+* \[[`93bc2ba509`](https://github.com/nodejs/node/commit/93bc2ba509)] - **tools**: simplify .eslintrc.js (Rich Trott) [#45397](https://github.com/nodejs/node/pull/45397)
+* \[[`b7f8a44c64`](https://github.com/nodejs/node/commit/b7f8a44c64)] - **tools**: simplify regex in ESLint config (Rich Trott) [#45399](https://github.com/nodejs/node/pull/45399)
+* \[[`36bf87fabf`](https://github.com/nodejs/node/commit/36bf87fabf)] - **tools**: enable jsdoc/require-property-description rule (Rich Trott) [#45370](https://github.com/nodejs/node/pull/45370)
+* \[[`7c6281a7d2`](https://github.com/nodejs/node/commit/7c6281a7d2)] - **tools**: dynamically determine parallelism on GitHub Actions macOS (Rich Trott) [#45350](https://github.com/nodejs/node/pull/45350)
+* \[[`f441b04c11`](https://github.com/nodejs/node/commit/f441b04c11)] - **trace\_events**: add new categories (theanarkh) [#45266](https://github.com/nodejs/node/pull/45266)
+* \[[`6bdd2c3884`](https://github.com/nodejs/node/commit/6bdd2c3884)] - _**Revert**_ "**url**: improve port validation" (Rich Trott) [#45517](https://github.com/nodejs/node/pull/45517)
+* \[[`bbba42fcb2`](https://github.com/nodejs/node/commit/bbba42fcb2)] - **url**: remove unnecessary object call to kFormat (Yagiz Nizipli) [#45492](https://github.com/nodejs/node/pull/45492)
+* \[[`7c79ba7b27`](https://github.com/nodejs/node/commit/7c79ba7b27)] - **util**: add fast path for utf8 encoding (Yagiz Nizipli) [#45412](https://github.com/nodejs/node/pull/45412)
+* \[[`f86f90f839`](https://github.com/nodejs/node/commit/f86f90f839)] - **util**: improve text decoder performance (Yagiz Nizipli) [#45388](https://github.com/nodejs/node/pull/45388)
+* \[[`3263ceb21a`](https://github.com/nodejs/node/commit/3263ceb21a)] - **watch**: watch for missing dependencies (Moshe Atlow) [#45348](https://github.com/nodejs/node/pull/45348)
+
 <a id="19.1.0"></a>
 
 ## 2022-11-14, Version 19.1.0 (Current), @RafaelGSS
diff --git a/doc/contributing/maintaining-dependencies.md b/doc/contributing/maintaining-dependencies.md
index 2c057320b4819b..b43f1d36a40fc6 100644
--- a/doc/contributing/maintaining-dependencies.md
+++ b/doc/contributing/maintaining-dependencies.md
@@ -67,7 +67,7 @@ shared library is available can added by:
   If there are additional libraries that are required it is
   possible to list more than one with the `pkgname` option.
 * in `node.gypi` guard the build for the dependency
-  with `node_shared_depname` so that is is only built if
+  with `node_shared_depname` so that it is only built if
   the dependency is being bundled into Node.js itself. For example:
 
 ```text
diff --git a/doc/contributing/offboarding.md b/doc/contributing/offboarding.md
index 87f21103540bef..f30688a33d0d87 100644
--- a/doc/contributing/offboarding.md
+++ b/doc/contributing/offboarding.md
@@ -12,6 +12,9 @@ emeritus or leaves the project.
     a team listing. For example, if someone is removed from @nodejs/build,
     they should also be removed from the Build WG README.md file in the
     <https://github.com/nodejs/build> repository.
+  * When in doubt, especially if you are unable to get in contact with the
+    collaborator, remove them from all teams. It is easy enough to add them
+    back later, so we err on the side of privacy and security.
 * Open an issue in the [build](https://github.com/nodejs/build) repository
   titled `Remove Collaborator from Coverity` asking that the collaborator
   be removed from the Node.js coverity project if they had access.
diff --git a/doc/contributing/primordials.md b/doc/contributing/primordials.md
index 48f260559f0c39..5570a17f6bc5bc 100644
--- a/doc/contributing/primordials.md
+++ b/doc/contributing/primordials.md
@@ -516,7 +516,7 @@ Promise.prototype.then = function then(a, b) {
 let thenBlockExecuted = false;
 PromisePrototypeThen(
   PromiseAll(new SafeArrayIterator([PromiseResolve()])),
-  () => { thenBlockExecuted = true; }
+  () => { thenBlockExecuted = true; },
 );
 process.on('exit', () => console.log(thenBlockExecuted)); // false
 ```
@@ -531,7 +531,7 @@ Promise.prototype.then = function then(a, b) {
 let thenBlockExecuted = false;
 PromisePrototypeThen(
   SafePromiseAll([PromiseResolve()]),
-  () => { thenBlockExecuted = true; }
+  () => { thenBlockExecuted = true; },
 );
 process.on('exit', () => console.log(thenBlockExecuted)); // true
 ```
diff --git a/doc/contributing/pull-requests.md b/doc/contributing/pull-requests.md
index cf130d0d2e5391..33715bc3c2096e 100644
--- a/doc/contributing/pull-requests.md
+++ b/doc/contributing/pull-requests.md
@@ -107,13 +107,13 @@ git checkout -b my-branch -t upstream/HEAD
 
 ### Step 3: Code
 
-The vast majority of pull requests opened against the `nodejs/node`
-repository includes changes to one or more of the following:
+Pull requests in Node.js typically involve changes to
+one or more of a few places in the repository.
 
-* the C/C++ code contained in the `src` directory
-* the JavaScript code contained in the `lib` directory
-* the documentation in `doc/api`
-* tests within the `test` directory.
+* C/C++ code contained in the `src` directory
+* JavaScript code contained in the `lib` directory
+* Documentation in `doc/api`
+* Tests within the `test` directory
 
 If you are modifying code, please be sure to run `make lint` (or
 `vcbuild.bat lint` on Windows) to ensure that the changes follow the Node.js
diff --git a/doc/contributing/using-internal-errors.md b/doc/contributing/using-internal-errors.md
index b55b187bff0152..6e88ca9863f5a0 100644
--- a/doc/contributing/using-internal-errors.md
+++ b/doc/contributing/using-internal-errors.md
@@ -122,7 +122,7 @@ assert.throws(() => {
   socket.bind();
 }, common.expectsError({
   code: 'ERR_SOCKET_ALREADY_BOUND',
-  type: Error
+  type: Error,
 }));
 ```
 
diff --git a/doc/contributing/writing-and-running-benchmarks.md b/doc/contributing/writing-and-running-benchmarks.md
index 99325d876928b3..9422d42519453c 100644
--- a/doc/contributing/writing-and-running-benchmarks.md
+++ b/doc/contributing/writing-and-running-benchmarks.md
@@ -486,12 +486,12 @@ const configs = {
   // Most benchmarks just use one value for all runs.
   n: [1024],
   type: ['fast', 'slow'],  // Custom configurations
-  size: [16, 128, 1024]  // Custom configurations
+  size: [16, 128, 1024],  // Custom configurations
 };
 
 const options = {
   // Add --expose-internals in order to require internal modules in main
-  flags: ['--zero-fill-buffers']
+  flags: ['--zero-fill-buffers'],
 };
 
 // `main` and `configs` are required, `options` is optional.
@@ -535,7 +535,7 @@ const common = require('../common.js');
 const bench = common.createBenchmark(main, {
   kb: [64, 128, 256, 1024],
   connections: [100, 500],
-  duration: 5
+  duration: 5,
 });
 
 function main(conf) {
diff --git a/doc/contributing/writing-tests.md b/doc/contributing/writing-tests.md
index cc75191d32027e..dc4954fe9a874f 100644
--- a/doc/contributing/writing-tests.md
+++ b/doc/contributing/writing-tests.md
@@ -46,7 +46,7 @@ const server = http.createServer(common.mustCall((req, res) => {       // 11
 server.listen(0, () => {                                               // 14
   http.get({                                                           // 15
     port: server.address().port,                                       // 16
-    headers: { 'Test': 'Düsseldorf' }                                  // 17
+    headers: { 'Test': 'Düsseldorf' },                                 // 17
   }, common.mustCall((res) => {                                        // 18
     assert.strictEqual(res.statusCode, 200);                           // 19
     server.close();                                                    // 20
@@ -116,7 +116,7 @@ const server = http.createServer(common.mustCall((req, res) => {
 server.listen(0, () => {
   http.get({
     port: server.address().port,
-    headers: { 'Test': 'Düsseldorf' }
+    headers: { 'Test': 'Düsseldorf' },
   }, common.mustCall((res) => {
     assert.strictEqual(res.statusCode, 200);
     server.close();
@@ -192,7 +192,7 @@ const server = http.createServer((req, res) => {
   listening++;
   const options = {
     agent: null,
-    port: server.address().port
+    port: server.address().port,
   };
   http.get(options, (res) => {
     response++;
@@ -214,7 +214,7 @@ const server = http.createServer(common.mustCall((req, res) => {
 })).listen(0, common.mustCall(() => {
   const options = {
     agent: null,
-    port: server.address().port
+    port: server.address().port,
   };
   http.get(options, common.mustCall((res) => {
     res.resume();
@@ -262,7 +262,7 @@ const fs = require('node:fs').promises;
 // Wrap the `onFulfilled` handler in `common.mustCall()`.
 fs.readFile('test-file').then(
   common.mustCall(
-    (content) => assert.strictEqual(content.toString(), 'test2')
+    (content) => assert.strictEqual(content.toString(), 'test2'),
   ));
 ```
 
@@ -308,7 +308,7 @@ assert.throws(
   () => {
     throw new Error('Wrong value');
   },
-  /^Error: Wrong value$/ // Instead of something like /Wrong value/
+  /^Error: Wrong value$/, // Instead of something like /Wrong value/
 );
 ```
 
@@ -319,7 +319,7 @@ assert.throws(
   () => {
     throw new ERR_FS_FILE_TOO_LARGE(`${sizeKiB} Kb`);
   },
-  { code: 'ERR_FS_FILE_TOO_LARGE' }
+  { code: 'ERR_FS_FILE_TOO_LARGE' },
   // Do not include message: /^File size ([0-9]+ Kb) is greater than 2 GiB$/
 );
 ```
diff --git a/lib/_http_client.js b/lib/_http_client.js
index ef58f66f6a97e5..79ed2c8bc9b2d3 100644
--- a/lib/_http_client.js
+++ b/lib/_http_client.js
@@ -173,8 +173,10 @@ function ClientRequest(input, options, cb) {
 
   if (options.path) {
     const path = String(options.path);
-    if (RegExpPrototypeExec(INVALID_PATH_REGEX, path) !== null)
+    if (RegExpPrototypeExec(INVALID_PATH_REGEX, path) !== null) {
+      debug('Path contains unescaped characters: "%s"', path);
       throw new ERR_UNESCAPED_CHARACTERS('Request path');
+    }
   }
 
   if (protocol !== expectedProtocol) {
diff --git a/lib/_http_incoming.js b/lib/_http_incoming.js
index a83c8660db589b..950c8c6e08bbc9 100644
--- a/lib/_http_incoming.js
+++ b/lib/_http_incoming.js
@@ -122,7 +122,9 @@ ObjectDefineProperty(IncomingMessage.prototype, 'headers', {
     }
     return this[kHeaders];
   },
-  set: function(val) {}
+  set: function(val) {
+    this[kHeaders] = val;
+  }
 });
 
 ObjectDefineProperty(IncomingMessage.prototype, 'headersDistinct', {
@@ -140,7 +142,9 @@ ObjectDefineProperty(IncomingMessage.prototype, 'headersDistinct', {
     }
     return this[kHeadersDistinct];
   },
-  set: function(val) {}
+  set: function(val) {
+    this[kHeadersDistinct] = val;
+  }
 });
 
 ObjectDefineProperty(IncomingMessage.prototype, 'trailers', {
@@ -158,7 +162,9 @@ ObjectDefineProperty(IncomingMessage.prototype, 'trailers', {
     }
     return this[kTrailers];
   },
-  set: function(val) {}
+  set: function(val) {
+    this[kTrailers] = val;
+  }
 });
 
 ObjectDefineProperty(IncomingMessage.prototype, 'trailersDistinct', {
@@ -176,7 +182,9 @@ ObjectDefineProperty(IncomingMessage.prototype, 'trailersDistinct', {
     }
     return this[kTrailersDistinct];
   },
-  set: function(val) {}
+  set: function(val) {
+    this[kTrailersDistinct] = val;
+  }
 });
 
 IncomingMessage.prototype.setTimeout = function setTimeout(msecs, callback) {
diff --git a/lib/async_hooks.js b/lib/async_hooks.js
index 8638bb4d7b3497..187d29281f9652 100644
--- a/lib/async_hooks.js
+++ b/lib/async_hooks.js
@@ -18,6 +18,7 @@ const {
 const {
   ERR_ASYNC_CALLBACK,
   ERR_ASYNC_TYPE,
+  ERR_INVALID_ARG_TYPE,
   ERR_INVALID_ASYNC_ID
 } = require('internal/errors').codes;
 const { kEmptyObject } = require('internal/util');
@@ -268,15 +269,27 @@ const storageHook = createHook({
     const currentResource = executionAsyncResource();
     // Value of currentResource is always a non null object
     for (let i = 0; i < storageList.length; ++i) {
-      storageList[i]._propagate(resource, currentResource);
+      storageList[i]._propagate(resource, currentResource, type);
     }
   }
 });
 
 class AsyncLocalStorage {
-  constructor() {
+  constructor(options = kEmptyObject) {
+    if (typeof options !== 'object' || options === null) {
+      throw new ERR_INVALID_ARG_TYPE('options', 'Object', options);
+    }
+
+    const { onPropagate = null } = options;
+    if (onPropagate !== null && typeof onPropagate !== 'function') {
+      throw new ERR_INVALID_ARG_TYPE('options.onPropagate',
+                                     'function',
+                                     onPropagate);
+    }
+
     this.kResourceStore = Symbol('kResourceStore');
     this.enabled = false;
+    this._onPropagate = onPropagate;
   }
 
   disable() {
@@ -300,10 +313,12 @@ class AsyncLocalStorage {
   }
 
   // Propagate the context from a parent resource to a child one
-  _propagate(resource, triggerResource) {
+  _propagate(resource, triggerResource, type) {
     const store = triggerResource[this.kResourceStore];
     if (this.enabled) {
-      resource[this.kResourceStore] = store;
+      if (this._onPropagate === null || this._onPropagate(type, store)) {
+        resource[this.kResourceStore] = store;
+      }
     }
   }
 
diff --git a/lib/buffer.js b/lib/buffer.js
index 7c0bbbc81c6398..898bc5032e5f8d 100644
--- a/lib/buffer.js
+++ b/lib/buffer.js
@@ -126,6 +126,10 @@ const {
   resolveObjectURL,
 } = require('internal/blob');
 
+const {
+  File,
+} = require('internal/file');
+
 FastBuffer.prototype.constructor = Buffer;
 Buffer.prototype = FastBuffer.prototype;
 addBufferPrototypeMethods(Buffer.prototype);
@@ -1320,6 +1324,7 @@ function atob(input) {
 
 module.exports = {
   Blob,
+  File,
   resolveObjectURL,
   Buffer,
   SlowBuffer,
diff --git a/lib/http.js b/lib/http.js
index d7acafe4f317b8..6835789836d66b 100644
--- a/lib/http.js
+++ b/lib/http.js
@@ -62,28 +62,28 @@ function createServer(opts, requestListener) {
 
 /**
  * @typedef {object} HTTPRequestOptions
- * @property {httpAgent.Agent | boolean} [agent]
- * @property {string} [auth]
- * @property {Function} [createConnection]
- * @property {number} [defaultPort]
- * @property {number} [family]
- * @property {object} [headers]
- * @property {number} [hints]
- * @property {string} [host]
- * @property {string} [hostname]
- * @property {boolean} [insecureHTTPParser]
- * @property {string} [localAddress]
- * @property {number} [localPort]
- * @property {Function} [lookup]
- * @property {number} [maxHeaderSize]
- * @property {string} [method]
- * @property {string} [path]
- * @property {number} [port]
- * @property {string} [protocol]
- * @property {boolean} [setHost]
- * @property {string} [socketPath]
- * @property {number} [timeout]
- * @property {AbortSignal} [signal]
+ * @property {httpAgent.Agent | boolean} [agent] Controls Agent behavior.
+ * @property {string} [auth] Basic authentication ('user:password') to compute an Authorization header.
+ * @property {Function} [createConnection] Produces a socket/stream to use when the agent option is not used.
+ * @property {number} [defaultPort] Default port for the protocol.
+ * @property {number} [family] IP address family to use when resolving host or hostname.
+ * @property {object} [headers] An object containing request headers.
+ * @property {number} [hints] Optional dns.lookup() hints.
+ * @property {string} [host] A domain name or IP address of the server to issue the request to.
+ * @property {string} [hostname] Alias for host.
+ * @property {boolean} [insecureHTTPParser] Use an insecure HTTP parser that accepts invalid HTTP headers when true.
+ * @property {string} [localAddress] Local interface to bind for network connections.
+ * @property {number} [localPort] Local port to connect from.
+ * @property {Function} [lookup] Custom lookup function. Default: dns.lookup().
+ * @property {number} [maxHeaderSize] Overrides the --max-http-header-size value for responses received from the server.
+ * @property {string} [method] A string specifying the HTTP request method.
+ * @property {string} [path] Request path.
+ * @property {number} [port] Port of remote server.
+ * @property {string} [protocol] Protocol to use.
+ * @property {boolean} [setHost] Specifies whether or not to automatically add the Host header.
+ * @property {AbortSignal} [signal] An AbortSignal that may be used to abort an ongoing request.
+ * @property {string} [socketPath] Unix domain socket.
+ * @property {number} [timeout] A number specifying the socket timeout in milliseconds.
  */
 
 /**
diff --git a/lib/internal/abort_controller.js b/lib/internal/abort_controller.js
index ae12099bf802d3..7a4381ecd13cb3 100644
--- a/lib/internal/abort_controller.js
+++ b/lib/internal/abort_controller.js
@@ -309,12 +309,13 @@ function abortSignal(signal, reason) {
 }
 
 class AbortController {
-  #signal = createAbortSignal();
+  #signal;
 
   /**
    * @type {AbortSignal}
    */
   get signal() {
+    this.#signal ??= createAbortSignal();
     return this.#signal;
   }
 
@@ -322,7 +323,7 @@ class AbortController {
    * @param {any} reason
    */
   abort(reason = new DOMException('This operation was aborted', 'AbortError')) {
-    abortSignal(this.#signal, reason);
+    abortSignal(this.#signal ??= createAbortSignal(), reason);
   }
 
   [customInspectSymbol](depth, options) {
@@ -333,7 +334,7 @@ class AbortController {
 
   static [kMakeTransferable]() {
     const controller = new AbortController();
-    controller.#signal = transferableAbortSignal(controller.#signal);
+    controller.#signal = createAbortSignal({ transferable: true });
     return controller;
   }
 }
diff --git a/lib/internal/encoding.js b/lib/internal/encoding.js
index 40c87a0a8719ff..0e3c44d2e84fbb 100644
--- a/lib/internal/encoding.js
+++ b/lib/internal/encoding.js
@@ -4,6 +4,7 @@
 // https://encoding.spec.whatwg.org
 
 const {
+  Boolean,
   ObjectCreate,
   ObjectDefineProperties,
   ObjectGetOwnPropertyDescriptors,
@@ -18,7 +19,6 @@ const {
 } = primordials;
 
 const {
-  ERR_ENCODING_INVALID_ENCODED_DATA,
   ERR_ENCODING_NOT_SUPPORTED,
   ERR_INVALID_ARG_TYPE,
   ERR_INVALID_THIS,
@@ -29,6 +29,8 @@ const kFlags = Symbol('flags');
 const kEncoding = Symbol('encoding');
 const kDecoder = Symbol('decoder');
 const kEncoder = Symbol('encoder');
+const kUTF8FastPath = Symbol('kUTF8FastPath');
+const kIgnoreBOM = Symbol('kIgnoreBOM');
 
 const {
   getConstructorOf,
@@ -50,7 +52,8 @@ const {
 
 const {
   encodeInto,
-  encodeUtf8String
+  encodeUtf8String,
+  decodeUTF8,
 } = internalBinding('buffer');
 
 let Buffer;
@@ -398,24 +401,40 @@ function makeTextDecoderICU() {
         flags |= options.ignoreBOM ? CONVERTER_FLAGS_IGNORE_BOM : 0;
       }
 
-      const handle = getConverter(enc, flags);
-      if (handle === undefined)
-        throw new ERR_ENCODING_NOT_SUPPORTED(encoding);
+      // Only support fast path for UTF-8 without FATAL flag
+      const fastPathAvailable = enc === 'utf-8' && !(options?.fatal);
 
       this[kDecoder] = true;
-      this[kHandle] = handle;
       this[kFlags] = flags;
       this[kEncoding] = enc;
+      this[kIgnoreBOM] = Boolean(options?.ignoreBOM);
+      this[kUTF8FastPath] = fastPathAvailable;
+      this[kHandle] = undefined;
+
+      if (!fastPathAvailable) {
+        this.#prepareConverter();
+      }
     }
 
+    #prepareConverter() {
+      if (this[kHandle] !== undefined) return;
+      const handle = getConverter(this[kEncoding], this[kFlags]);
+      if (handle === undefined)
+        throw new ERR_ENCODING_NOT_SUPPORTED(this[kEncoding]);
+      this[kHandle] = handle;
+    }
 
     decode(input = empty, options = kEmptyObject) {
       validateDecoder(this);
-      if (!isAnyArrayBuffer(input) && !isArrayBufferView(input)) {
-        throw new ERR_INVALID_ARG_TYPE('input',
-                                       ['ArrayBuffer', 'ArrayBufferView'],
-                                       input);
+
+      this[kUTF8FastPath] &&= !(options?.stream);
+
+      if (this[kUTF8FastPath]) {
+        return decodeUTF8(input, this[kIgnoreBOM]);
       }
+
+      this.#prepareConverter();
+
       validateObject(options, 'options', {
         nullable: true,
         allowArray: true,
@@ -426,11 +445,7 @@ function makeTextDecoderICU() {
       if (options !== null)
         flags |= options.stream ? 0 : CONVERTER_FLAGS_FLUSH;
 
-      const ret = _decode(this[kHandle], input, flags);
-      if (typeof ret === 'number') {
-        throw new ERR_ENCODING_INVALID_ENCODED_DATA(this.encoding, ret);
-      }
-      return ret;
+      return _decode(this[kHandle], input, flags, this.encoding);
     }
   }
 
diff --git a/lib/internal/errors.js b/lib/internal/errors.js
index 5677b9af679f33..f68855c148fcfe 100644
--- a/lib/internal/errors.js
+++ b/lib/internal/errors.js
@@ -1597,6 +1597,21 @@ E('ERR_STREAM_WRAP', 'Stream has StringDecoder set or is in objectMode', Error);
 E('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error);
 E('ERR_SYNTHETIC', 'JavaScript Callstack', Error);
 E('ERR_SYSTEM_ERROR', 'A system error occurred', SystemError);
+E('ERR_TAP_LEXER_ERROR', function(errorMsg) {
+  hideInternalStackFrames(this);
+  return errorMsg;
+}, Error);
+E('ERR_TAP_PARSER_ERROR', function(errorMsg, details, tokenCausedError, source) {
+  hideInternalStackFrames(this);
+  this.cause = tokenCausedError;
+  const { column, line, start, end } = tokenCausedError.location;
+  const errorDetails = `${details} at line ${line}, column ${column} (start ${start}, end ${end})`;
+  return errorMsg + errorDetails;
+}, SyntaxError);
+E('ERR_TAP_VALIDATION_ERROR', function(errorMsg) {
+  hideInternalStackFrames(this);
+  return errorMsg;
+}, Error);
 E('ERR_TEST_FAILURE', function(error, failureType) {
   hideInternalStackFrames(this);
   assert(typeof failureType === 'string',
diff --git a/lib/internal/file.js b/lib/internal/file.js
new file mode 100644
index 00000000000000..df9966532cdc24
--- /dev/null
+++ b/lib/internal/file.js
@@ -0,0 +1,113 @@
+'use strict';
+
+const {
+  DateNow,
+  NumberIsNaN,
+  ObjectDefineProperties,
+  SymbolToStringTag,
+} = primordials;
+
+const {
+  Blob,
+} = require('internal/blob');
+
+const {
+  customInspectSymbol: kInspect,
+  emitExperimentalWarning,
+  kEnumerableProperty,
+  kEmptyObject,
+  toUSVString,
+} = require('internal/util');
+
+const {
+  codes: {
+    ERR_INVALID_THIS,
+    ERR_MISSING_ARGS,
+  },
+} = require('internal/errors');
+
+const {
+  inspect,
+} = require('internal/util/inspect');
+
+class File extends Blob {
+  /** @type {string} */
+  #name;
+
+  /** @type {number} */
+  #lastModified;
+
+  constructor(fileBits, fileName, options = kEmptyObject) {
+    emitExperimentalWarning('buffer.File');
+
+    if (arguments.length < 2) {
+      throw new ERR_MISSING_ARGS('fileBits', 'fileName');
+    }
+
+    super(fileBits, options);
+
+    let { lastModified } = options ?? kEmptyObject;
+
+    if (lastModified !== undefined) {
+      // Using Number(...) will not throw an error for bigints.
+      lastModified = +lastModified;
+
+      if (NumberIsNaN(lastModified)) {
+        lastModified = 0;
+      }
+    } else {
+      lastModified = DateNow();
+    }
+
+    this.#name = toUSVString(fileName);
+    this.#lastModified = lastModified;
+  }
+
+  get name() {
+    if (!this || !(#name in this)) {
+      throw new ERR_INVALID_THIS('File');
+    }
+
+    return this.#name;
+  }
+
+  get lastModified() {
+    if (!this || !(#name in this)) {
+      throw new ERR_INVALID_THIS('File');
+    }
+
+    return this.#lastModified;
+  }
+
+  [kInspect](depth, options) {
+    if (depth < 0) {
+      return this;
+    }
+
+    const opts = {
+      ...options,
+      depth: options.depth == null ? null : options.depth - 1,
+    };
+
+    return `File ${inspect({
+      size: this.size,
+      type: this.type,
+      name: this.#name,
+      lastModified: this.#lastModified,
+    }, opts)}`;
+  }
+}
+
+ObjectDefineProperties(File.prototype, {
+  name: kEnumerableProperty,
+  lastModified: kEnumerableProperty,
+  [SymbolToStringTag]: {
+    __proto__: null,
+    configurable: true,
+    value: 'File',
+  }
+});
+
+module.exports = {
+  File,
+};
diff --git a/lib/internal/fs/utils.js b/lib/internal/fs/utils.js
index 1e2bdbcd8823a6..a3ef20b708a030 100644
--- a/lib/internal/fs/utils.js
+++ b/lib/internal/fs/utils.js
@@ -769,7 +769,7 @@ const validateRmOptions = hideStackFrames((path, options, expectDir, cb) => {
   options = validateRmdirOptions(options, defaultRmOptions);
   validateBoolean(options.force, 'options.force');
 
-  lazyLoadFs().stat(path, (err, stats) => {
+  lazyLoadFs().lstat(path, (err, stats) => {
     if (err) {
       if (options.force && err.code === 'ENOENT') {
         return cb(null, options);
@@ -800,7 +800,7 @@ const validateRmOptionsSync = hideStackFrames((path, options, expectDir) => {
 
   if (!options.force || expectDir || !options.recursive) {
     const isDirectory = lazyLoadFs()
-      .statSync(path, { throwIfNoEntry: !options.force })?.isDirectory();
+      .lstatSync(path, { throwIfNoEntry: !options.force })?.isDirectory();
 
     if (expectDir && !isDirectory) {
       return false;
diff --git a/lib/internal/main/test_runner.js b/lib/internal/main/test_runner.js
index 12753f3bbbf6dc..f7165a0288cf9e 100644
--- a/lib/internal/main/test_runner.js
+++ b/lib/internal/main/test_runner.js
@@ -3,6 +3,7 @@ const {
   prepareMainThreadExecution,
   markBootstrapComplete
 } = require('internal/process/pre_execution');
+const { getOptionValue } = require('internal/options');
 const { isUsingInspector } = require('internal/util/inspector');
 const { run } = require('internal/test_runner/runner');
 const { exitCodes: { kGenericUserError } } = internalBinding('errors');
@@ -20,7 +21,7 @@ if (isUsingInspector()) {
   inspectPort = process.debugPort;
 }
 
-const tapStream = run({ concurrency, inspectPort });
+const tapStream = run({ concurrency, inspectPort, watch: getOptionValue('--watch') });
 tapStream.pipe(process.stdout);
 tapStream.once('test:fail', () => {
   process.exitCode = kGenericUserError;
diff --git a/lib/internal/modules/cjs/helpers.js b/lib/internal/modules/cjs/helpers.js
index 3c49ab0a5d84cb..fea3fbcf48dc00 100644
--- a/lib/internal/modules/cjs/helpers.js
+++ b/lib/internal/modules/cjs/helpers.js
@@ -176,16 +176,19 @@ function addBuiltinLibsToObject(object, dummyModuleName) {
       get: () => {
         const lib = dummyModule.require(name);
 
-        // Disable the current getter/setter and set up a new
-        // non-enumerable property.
-        delete object[name];
-        ObjectDefineProperty(object, name, {
-          __proto__: null,
-          get: () => lib,
-          set: setReal,
-          configurable: true,
-          enumerable: false
-        });
+        try {
+          // Override the current getter/setter and set up a new
+          // non-enumerable property.
+          ObjectDefineProperty(object, name, {
+            __proto__: null,
+            get: () => lib,
+            set: setReal,
+            configurable: true,
+            enumerable: false,
+          });
+        } catch {
+          // If the property is no longer configurable, ignore the error.
+        }
 
         return lib;
       },
diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js
index 02a07222746dfd..33bc7f28a41c6c 100644
--- a/lib/internal/modules/cjs/loader.js
+++ b/lib/internal/modules/cjs/loader.js
@@ -28,6 +28,7 @@ const {
   ArrayPrototypeIncludes,
   ArrayPrototypeIndexOf,
   ArrayPrototypeJoin,
+  ArrayPrototypeMap,
   ArrayPrototypePush,
   ArrayPrototypeSlice,
   ArrayPrototypeSplice,
@@ -191,7 +192,13 @@ function updateChildren(parent, child, scan) {
 
 function reportModuleToWatchMode(filename) {
   if (shouldReportRequiredModules && process.send) {
-    process.send({ 'watch:require': filename });
+    process.send({ 'watch:require': [filename] });
+  }
+}
+
+function reportModuleNotFoundToWatchMode(basePath, extensions) {
+  if (shouldReportRequiredModules && process.send) {
+    process.send({ 'watch:require': ArrayPrototypeMap(extensions, (ext) => path.resolve(`${basePath}${ext}`)) });
   }
 }
 
@@ -648,6 +655,7 @@ Module._findPath = function(request, paths, isMain) {
       Module._pathCache[cacheKey] = filename;
       return filename;
     }
+    reportModuleNotFoundToWatchMode(basePath, ArrayPrototypeConcat([''], exts));
   }
 
   return false;
@@ -743,8 +751,13 @@ if (isWindows) {
 }
 
 Module._resolveLookupPaths = function(request, parent) {
-  if (BuiltinModule.canBeRequiredByUsers(request) &&
-      BuiltinModule.canBeRequiredWithoutScheme(request)) {
+  if ((
+    StringPrototypeStartsWith(request, 'node:') &&
+    BuiltinModule.canBeRequiredByUsers(StringPrototypeSlice(request, 5))
+  ) || (
+    BuiltinModule.canBeRequiredByUsers(request) &&
+    BuiltinModule.canBeRequiredWithoutScheme(request)
+  )) {
     debug('looking for %j in []', request);
     return null;
   }
diff --git a/lib/internal/modules/esm/fetch_module.js b/lib/internal/modules/esm/fetch_module.js
index 7638f94b3fe525..073ec13562097c 100644
--- a/lib/internal/modules/esm/fetch_module.js
+++ b/lib/internal/modules/esm/fetch_module.js
@@ -21,9 +21,9 @@ const { once } = require('events');
 const { compose } = require('stream');
 /**
  * @typedef CacheEntry
- * @property {Promise<string> | string} resolvedHREF
- * @property {Record<string, string>} headers
- * @property {Promise<Buffer> | Buffer} body
+ * @property {Promise<string> | string} resolvedHREF Parsed HREF of the request.
+ * @property {Record<string, string>} headers HTTP headers of the response.
+ * @property {Promise<Buffer> | Buffer} body Response body.
  */
 
 /**
diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js
index 0f23d48084abe8..e4d320ebc39cce 100644
--- a/lib/internal/modules/esm/loader.js
+++ b/lib/internal/modules/esm/loader.js
@@ -58,9 +58,9 @@ const { getOptionValue } = require('internal/options');
 
 /**
  * @typedef {object} ExportedHooks
- * @property {Function} globalPreload
- * @property {Function} resolve
- * @property {Function} load
+ * @property {Function} globalPreload Global preload hook.
+ * @property {Function} resolve Resolve hook.
+ * @property {Function} load Load hook.
  */
 
 /**
@@ -69,14 +69,14 @@ const { getOptionValue } = require('internal/options');
 
 /**
  * @typedef {object} KeyedExports
- * @property {ModuleExports} exports
- * @property {URL['href']} url
+ * @property {ModuleExports} exports The contents of the module.
+ * @property {URL['href']} url The URL of the module.
  */
 
 /**
  * @typedef {object} KeyedHook
- * @property {Function} fn
- * @property {URL['href']} url
+ * @property {Function} fn The hook function.
+ * @property {URL['href']} url The URL of the module.
  */
 
 /**
@@ -463,7 +463,7 @@ class ESMLoader {
     );
 
     if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) {
-      process.send({ 'watch:import': url });
+      process.send({ 'watch:import': [url] });
     }
 
     const job = new ModuleJob(
diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js
index 561bbbe32e626e..e4ad685a6938e7 100644
--- a/lib/internal/modules/esm/resolve.js
+++ b/lib/internal/modules/esm/resolve.js
@@ -254,6 +254,9 @@ function finalizeResolution(resolved, base, preserveSymlinks) {
     err.url = String(resolved);
     throw err;
   } else if (!stats.isFile()) {
+    if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) {
+      process.send({ 'watch:require': [path || resolved.pathname] });
+    }
     throw new ERR_MODULE_NOT_FOUND(
       path || resolved.pathname, base && fileURLToPath(base), 'module');
   }
diff --git a/lib/internal/streams/end-of-stream.js b/lib/internal/streams/end-of-stream.js
index ba565a9ae52323..ca42174c86459a 100644
--- a/lib/internal/streams/end-of-stream.js
+++ b/lib/internal/streams/end-of-stream.js
@@ -151,6 +151,18 @@ function eos(stream, options, callback) {
     callback.call(stream);
   };
 
+  const onclosed = () => {
+    closed = true;
+
+    const errored = isWritableErrored(stream) || isReadableErrored(stream);
+
+    if (errored && typeof errored !== 'boolean') {
+      return callback.call(stream, errored);
+    }
+
+    callback.call(stream);
+  };
+
   const onrequest = () => {
     stream.req.on('finish', onfinish);
   };
@@ -186,22 +198,22 @@ function eos(stream, options, callback) {
     process.nextTick(onclose);
   } else if (wState?.errorEmitted || rState?.errorEmitted) {
     if (!willEmitClose) {
-      process.nextTick(onclose);
+      process.nextTick(onclosed);
     }
   } else if (
     !readable &&
     (!willEmitClose || isReadable(stream)) &&
     (writableFinished || isWritable(stream) === false)
   ) {
-    process.nextTick(onclose);
+    process.nextTick(onclosed);
   } else if (
     !writable &&
     (!willEmitClose || isWritable(stream)) &&
     (readableFinished || isReadable(stream) === false)
   ) {
-    process.nextTick(onclose);
+    process.nextTick(onclosed);
   } else if ((rState && stream.req && stream.aborted)) {
-    process.nextTick(onclose);
+    process.nextTick(onclosed);
   }
 
   const cleanup = () => {
diff --git a/lib/internal/test_runner/runner.js b/lib/internal/test_runner/runner.js
index c82799a30ac6af..fde85a36325917 100644
--- a/lib/internal/test_runner/runner.js
+++ b/lib/internal/test_runner/runner.js
@@ -2,6 +2,7 @@
 const {
   ArrayFrom,
   ArrayPrototypeFilter,
+  ArrayPrototypeForEach,
   ArrayPrototypeIncludes,
   ArrayPrototypeJoin,
   ArrayPrototypePush,
@@ -10,33 +11,44 @@ const {
   ObjectAssign,
   PromisePrototypeThen,
   SafePromiseAll,
+  SafePromiseAllReturnVoid,
+  SafePromiseAllSettledReturnVoid,
+  SafeMap,
   SafeSet,
+  StringPrototypeRepeat,
 } = primordials;
 
 const { spawn } = require('child_process');
 const { readdirSync, statSync } = require('fs');
 // TODO(aduh95): switch to internal/readline/interface when backporting to Node.js 16.x is no longer a concern.
 const { createInterface } = require('readline');
+const { FilesWatcher } = require('internal/watch_mode/files_watcher');
 const console = require('internal/console/global');
 const {
   codes: {
     ERR_TEST_FAILURE,
   },
 } = require('internal/errors');
-const { validateArray } = require('internal/validators');
+const { validateArray, validateBoolean } = require('internal/validators');
 const { getInspectPort, isUsingInspector, isInspectorMessage } = require('internal/util/inspector');
 const { kEmptyObject } = require('internal/util');
 const { createTestTree } = require('internal/test_runner/harness');
-const { kSubtestsFailed, Test } = require('internal/test_runner/test');
+const { kDefaultIndent, kSubtestsFailed, Test } = require('internal/test_runner/test');
+const { TapParser } = require('internal/test_runner/tap_parser');
+const { TokenKind } = require('internal/test_runner/tap_lexer');
+
 const {
   isSupportedFileType,
   doesPathMatchFilter,
 } = require('internal/test_runner/utils');
 const { basename, join, resolve } = require('path');
 const { once } = require('events');
-const { exitCodes: { kGenericUserError } } = internalBinding('errors');
+const {
+  triggerUncaughtException,
+  exitCodes: { kGenericUserError },
+} = internalBinding('errors');
 
-const kFilterArgs = ['--test'];
+const kFilterArgs = ['--test', '--watch'];
 
 // TODO(cjihrig): Replace this with recursive readdir once it lands.
 function processPath(path, testFiles, options) {
@@ -113,17 +125,119 @@ function getRunArgs({ path, inspectPort }) {
   return argv;
 }
 
+class FileTest extends Test {
+  #buffer = [];
+  #handleReportItem({ kind, node, nesting = 0 }) {
+    const indent = StringPrototypeRepeat(kDefaultIndent, nesting + 1);
+
+    const details = (diagnostic) => {
+      return (
+        diagnostic && {
+          __proto__: null,
+          yaml:
+            `${indent}  ` +
+            ArrayPrototypeJoin(diagnostic, `\n${indent}  `) +
+            '\n',
+        }
+      );
+    };
+
+    switch (kind) {
+      case TokenKind.TAP_VERSION:
+        // TODO(manekinekko): handle TAP version coming from the parser.
+        // this.reporter.version(node.version);
+        break;
+
+      case TokenKind.TAP_PLAN:
+        this.reporter.plan(indent, node.end - node.start + 1);
+        break;
+
+      case TokenKind.TAP_SUBTEST_POINT:
+        this.reporter.subtest(indent, node.name);
+        break;
+
+      case TokenKind.TAP_TEST_POINT:
+        // eslint-disable-next-line no-case-declarations
+        const { todo, skip, pass } = node.status;
+        // eslint-disable-next-line no-case-declarations
+        let directive;
+
+        if (skip) {
+          directive = this.reporter.getSkip(node.reason);
+        } else if (todo) {
+          directive = this.reporter.getTodo(node.reason);
+        } else {
+          directive = kEmptyObject;
+        }
+
+        if (pass) {
+          this.reporter.ok(
+            indent,
+            node.id,
+            node.description,
+            details(node.diagnostics),
+            directive
+          );
+        } else {
+          this.reporter.fail(
+            indent,
+            node.id,
+            node.description,
+            details(node.diagnostics),
+            directive
+          );
+        }
+        break;
+
+      case TokenKind.COMMENT:
+        if (indent === kDefaultIndent) {
+          // Ignore file top level diagnostics
+          break;
+        }
+        this.reporter.diagnostic(indent, node.comment);
+        break;
+
+      case TokenKind.UNKNOWN:
+        this.reporter.diagnostic(indent, node.value);
+        break;
+    }
+  }
+  addToReport(ast) {
+    if (!this.isClearToSend()) {
+      ArrayPrototypePush(this.#buffer, ast);
+      return;
+    }
+    this.reportSubtest();
+    this.#handleReportItem(ast);
+  }
+  report() {
+    this.reportSubtest();
+    ArrayPrototypeForEach(this.#buffer, (ast) => this.#handleReportItem(ast));
+    super.report();
+  }
+}
+
+const runningProcesses = new SafeMap();
+const runningSubtests = new SafeMap();
 
-function runTestFile(path, root, inspectPort) {
-  const subtest = root.createSubtest(Test, path, async (t) => {
+function runTestFile(path, root, inspectPort, filesWatcher) {
+  const subtest = root.createSubtest(FileTest, path, async (t) => {
     const args = getRunArgs({ path, inspectPort });
+    const stdio = ['pipe', 'pipe', 'pipe'];
+    const env = { ...process.env };
+    if (filesWatcher) {
+      stdio.push('ipc');
+      env.WATCH_REPORT_DEPENDENCIES = '1';
+    }
+
+    const child = spawn(process.execPath, args, { signal: t.signal, encoding: 'utf8', env, stdio });
+    runningProcesses.set(path, child);
 
-    const child = spawn(process.execPath, args, { signal: t.signal, encoding: 'utf8' });
-    // TODO(cjihrig): Implement a TAP parser to read the child's stdout
-    // instead of just displaying it all if the child fails.
     let err;
     let stderr = '';
 
+    filesWatcher?.watchChildProcessModules(child, path);
+
     child.on('error', (error) => {
       err = error;
     });
@@ -141,11 +255,24 @@ function runTestFile(path, root, inspectPort) {
       });
     }
 
+    const parser = new TapParser();
+    child.stderr.pipe(parser).on('data', (ast) => {
+      if (ast.lexeme && isInspectorMessage(ast.lexeme)) {
+        process.stderr.write(ast.lexeme + '\n');
+      }
+    });
+
+    child.stdout.pipe(parser).on('data', (ast) => {
+      subtest.addToReport(ast);
+    });
+
     const { 0: { 0: code, 1: signal }, 1: stdout } = await SafePromiseAll([
       once(child, 'exit', { signal: t.signal }),
       child.stdout.toArray({ signal: t.signal }),
     ]);
 
+    runningProcesses.delete(path);
+    runningSubtests.delete(path);
     if (code !== 0 || signal !== null) {
       if (!err) {
         err = ObjectAssign(new ERR_TEST_FAILURE('test failed', kSubtestsFailed), {
@@ -166,21 +293,57 @@ function runTestFile(path, root, inspectPort) {
   return subtest.start();
 }
 
+function watchFiles(testFiles, root, inspectPort) {
+  const filesWatcher = new FilesWatcher({ throttle: 500, mode: 'filter' });
+  filesWatcher.on('changed', ({ owners }) => {
+    filesWatcher.unfilterFilesOwnedBy(owners);
+    PromisePrototypeThen(SafePromiseAllReturnVoid(testFiles, async (file) => {
+      if (!owners.has(file)) {
+        return;
+      }
+      const runningProcess = runningProcesses.get(file);
+      if (runningProcess) {
+        runningProcess.kill();
+        await once(runningProcess, 'exit');
+      }
+      await runningSubtests.get(file);
+      runningSubtests.set(file, runTestFile(file, root, inspectPort, filesWatcher));
+    }, undefined, (error) => {
+      triggerUncaughtException(error, true /* fromPromise */);
+    }));
+  });
+  return filesWatcher;
+}
+
 function run(options) {
   if (options === null || typeof options !== 'object') {
     options = kEmptyObject;
   }
-  const { concurrency, timeout, signal, files, inspectPort } = options;
+  const { concurrency, timeout, signal, files, inspectPort, watch } = options;
 
   if (files != null) {
     validateArray(files, 'options.files');
   }
+  if (watch != null) {
+    validateBoolean(watch, 'options.watch');
+  }
 
   const root = createTestTree({ concurrency, timeout, signal });
   const testFiles = files ?? createTestFileList();
 
-  PromisePrototypeThen(SafePromiseAll(testFiles, (path) => runTestFile(path, root, inspectPort)),
-                       () => root.postRun());
+  let postRun = () => root.postRun();
+  let filesWatcher;
+  if (watch) {
+    filesWatcher = watchFiles(testFiles, root, inspectPort);
+    postRun = undefined;
+  }
+
+  PromisePrototypeThen(SafePromiseAllSettledReturnVoid(testFiles, (path) => {
+    const subtest = runTestFile(path, root, inspectPort, filesWatcher);
+    runningSubtests.set(path, subtest);
+    return subtest;
+  }), postRun);
+
 
   return root.reporter;
 }
diff --git a/lib/internal/test_runner/tap_checker.js b/lib/internal/test_runner/tap_checker.js
new file mode 100644
index 00000000000000..1392fb7d3bd335
--- /dev/null
+++ b/lib/internal/test_runner/tap_checker.js
@@ -0,0 +1,155 @@
+'use strict';
+
+const {
+  ArrayPrototypeFilter,
+  ArrayPrototypeFind,
+  NumberParseInt,
+} = primordials;
+const {
+  codes: { ERR_TAP_VALIDATION_ERROR },
+} = require('internal/errors');
+const { TokenKind } = require('internal/test_runner/tap_lexer');
+
+// TODO(@manekinekko): add more validation rules based on the TAP14 spec.
+// See https://testanything.org/tap-version-14-specification.html
+class TAPValidationStrategy {
+  validate(ast) {
+    this.#validateVersion(ast);
+    this.#validatePlan(ast);
+    this.#validateTestPoints(ast);
+
+    return true;
+  }
+
+  #validateVersion(ast) {
+    const entry = ArrayPrototypeFind(
+      ast,
+      (node) => node.kind === TokenKind.TAP_VERSION
+    );
+
+    if (!entry) {
+      throw new ERR_TAP_VALIDATION_ERROR('missing TAP version');
+    }
+
+    const { version } = entry.node;
+
+    // TAP14 specification is compatible with observed behavior of existing TAP13 consumers and producers
+    if (version !== '14' && version !== '13') {
+      throw new ERR_TAP_VALIDATION_ERROR('TAP version should be 13 or 14');
+    }
+  }
+
+  #validatePlan(ast) {
+    const entry = ArrayPrototypeFind(
+      ast,
+      (node) => node.kind === TokenKind.TAP_PLAN
+    );
+
+    if (!entry) {
+      throw new ERR_TAP_VALIDATION_ERROR('missing TAP plan');
+    }
+
+    const plan = entry.node;
+
+    if (!plan.start) {
+      throw new ERR_TAP_VALIDATION_ERROR('missing plan start');
+    }
+
+    if (!plan.end) {
+      throw new ERR_TAP_VALIDATION_ERROR('missing plan end');
+    }
+
+    const planStart = NumberParseInt(plan.start, 10);
+    const planEnd = NumberParseInt(plan.end, 10);
+
+    if (planEnd !== 0 && planStart > planEnd) {
+      throw new ERR_TAP_VALIDATION_ERROR(
+        `plan start ${planStart} is greater than plan end ${planEnd}`
+      );
+    }
+  }
+
+  // TODO(@manekinekko): since we are dealing with a flat AST, we need to
+  // validate test points grouped by their "nesting" level. This is because a set of
+  // Test points belongs to a TAP document. Each new subtest block creates a new TAP document.
+  // https://testanything.org/tap-version-14-specification.html#subtests
+  #validateTestPoints(ast) {
+    const bailoutEntry = ArrayPrototypeFind(
+      ast,
+      (node) => node.kind === TokenKind.TAP_BAIL_OUT
+    );
+    const planEntry = ArrayPrototypeFind(
+      ast,
+      (node) => node.kind === TokenKind.TAP_PLAN
+    );
+    const testPointEntries = ArrayPrototypeFilter(
+      ast,
+      (node) => node.kind === TokenKind.TAP_TEST_POINT
+    );
+
+    const plan = planEntry.node;
+
+    const planStart = NumberParseInt(plan.start, 10);
+    const planEnd = NumberParseInt(plan.end, 10);
+
+    if (planEnd === 0 && testPointEntries.length > 0) {
+      throw new ERR_TAP_VALIDATION_ERROR(
+        `found ${testPointEntries.length} Test Point${
+          testPointEntries.length > 1 ? 's' : ''
+        } but plan is ${planStart}..0`
+      );
+    }
+
+    if (planEnd > 0) {
+      if (testPointEntries.length === 0) {
+        throw new ERR_TAP_VALIDATION_ERROR('missing Test Points');
+      }
+
+      if (!bailoutEntry && testPointEntries.length !== planEnd) {
+        throw new ERR_TAP_VALIDATION_ERROR(
+          `test Points count ${testPointEntries.length} does not match plan count ${planEnd}`
+        );
+      }
+
+      for (let i = 0; i < testPointEntries.length; i++) {
+        const test = testPointEntries[i].node;
+        const testId = NumberParseInt(test.id, 10);
+
+        if (testId < planStart || testId > planEnd) {
+          throw new ERR_TAP_VALIDATION_ERROR(
+            `test ${testId} is out of plan range ${planStart}..${planEnd}`
+          );
+        }
+      }
+    }
+  }
+}
+
+// TAP14 and TAP13 are compatible with each other
+class TAP13ValidationStrategy extends TAPValidationStrategy {}
+class TAP14ValidationStrategy extends TAPValidationStrategy {}
+
+class TapChecker {
+  static TAP13 = '13';
+  static TAP14 = '14';
+
+  constructor({ specs }) {
+    switch (specs) {
+      case TapChecker.TAP13:
+        this.strategy = new TAP13ValidationStrategy();
+        break;
+      default:
+        this.strategy = new TAP14ValidationStrategy();
+    }
+  }
+
+  check(ast) {
+    return this.strategy.validate(ast);
+  }
+}
+
+module.exports = {
+  TapChecker,
+  TAP14ValidationStrategy,
+  TAP13ValidationStrategy,
+};
diff --git a/lib/internal/test_runner/tap_lexer.js b/lib/internal/test_runner/tap_lexer.js
new file mode 100644
index 00000000000000..24743a1853a833
--- /dev/null
+++ b/lib/internal/test_runner/tap_lexer.js
@@ -0,0 +1,522 @@
+'use strict';
+
+const { SafeSet, MathMax, StringPrototypeIncludes } = primordials;
+const {
+  codes: { ERR_TAP_LEXER_ERROR },
+} = require('internal/errors');
+
+const kEOL = '';
+const kEOF = '';
+
+const TokenKind = {
+  EOF: 'EOF',
+  EOL: 'EOL',
+  NEWLINE: 'NewLine',
+  NUMERIC: 'Numeric',
+  LITERAL: 'Literal',
+  KEYWORD: 'Keyword',
+  WHITESPACE: 'Whitespace',
+  COMMENT: 'Comment',
+  DASH: 'Dash',
+  PLUS: 'Plus',
+  HASH: 'Hash',
+  ESCAPE: 'Escape',
+  UNKNOWN: 'Unknown',
+
+  // TAP tokens
+  TAP: 'TAPKeyword',
+  TAP_VERSION: 'VersionKeyword',
+  TAP_PLAN: 'PlanKeyword',
+  TAP_TEST_POINT: 'TestPointKeyword',
+  TAP_SUBTEST_POINT: 'SubTestPointKeyword',
+  TAP_TEST_OK: 'TestOkKeyword',
+  TAP_TEST_NOTOK: 'TestNotOkKeyword',
+  TAP_YAML_START: 'YamlStartKeyword',
+  TAP_YAML_END: 'YamlEndKeyword',
+  TAP_YAML_BLOCK: 'YamlKeyword',
+  TAP_PRAGMA: 'PragmaKeyword',
+  TAP_BAIL_OUT: 'BailOutKeyword',
+};
+
+class Token {
+  constructor({ kind, value, stream }) {
+    const valueLength = ('' + value).length;
+    this.kind = kind;
+    this.value = value;
+    this.location = {
+      line: stream.line,
+      column: MathMax(stream.column - valueLength + 1, 1), // 1 based
+      start: MathMax(stream.pos - valueLength, 0), // zero based
+      end: stream.pos - (value === '' ? 0 : 1), // zero based
+    };
+
+    // EOF is a special case
+    if (value === TokenKind.EOF) {
+      const eofPosition = stream.input.length + 1; // We consider EOF to be outside the stream
+      this.location.start = eofPosition;
+      this.location.end = eofPosition;
+      this.location.column = stream.column + 1; // 1 based
+    }
+  }
+}
+
+class InputStream {
+  constructor(input) {
+    this.input = input;
+    this.pos = 0;
+    this.column = 0;
+    this.line = 1;
+  }
+
+  eof() {
+    return this.peek() === undefined;
+  }
+
+  peek(offset = 0) {
+    return this.input[this.pos + offset];
+  }
+
+  next() {
+    const char = this.peek();
+    if (char === undefined) {
+      return undefined;
+    }
+
+    this.pos++;
+    this.column++;
+    if (char === '\n') {
+      this.line++;
+      this.column = 0;
+    }
+
+    return char;
+  }
+}
+
+class TapLexer {
+  static Keywords = new SafeSet([
+    'TAP',
+    'version',
+    'ok',
+    'not',
+    '...',
+    '---',
+    '..',
+    'pragma',
+    '-',
+    '+',
+
+    // NOTE: "Skip", "Todo" and "Bail out!" literals are deferred to the parser
+  ]);
+
+  #isComment = false;
+  #source = null;
+  #line = 1;
+  #column = 0;
+  #escapeStack = [];
+  #lastScannedToken = null;
+
+  constructor(source) {
+    this.#source = new InputStream(source);
+    this.#lastScannedToken = new Token({
+      kind: TokenKind.EOL,
+      value: kEOL,
+      stream: this.#source,
+    });
+  }
+
+  scan() {
+    const tokens = [];
+    let chunk = [];
+    while (!this.eof()) {
+      const token = this.#scanToken();
+
+      // Remember the last scanned token (except for whitespace)
+      if (token.kind !== TokenKind.WHITESPACE) {
+        this.#lastScannedToken = token;
+      }
+
+      if (token.kind === TokenKind.NEWLINE) {
+        // Store the current chunk + NEWLINE token
+        tokens.push([...chunk, token]);
+        chunk = [];
+      } else {
+        chunk.push(token);
+      }
+    }
+
+    if (chunk.length > 0) {
+      tokens.push([...chunk, this.#scanEOL()]);
+    }
+
+    // send EOF as a separate chunk
+    tokens.push([this.#scanEOF()]);
+
+    return tokens;
+  }
+
+  next() {
+    return this.#source.next();
+  }
+
+  eof() {
+    return this.#source.eof();
+  }
+
+  error(message, token, expected = '') {
+    this.#source.error(message, token, expected);
+  }
+
+  #scanToken() {
+    const char = this.next();
+
+    if (this.#isEOFSymbol(char)) {
+      return this.#scanEOF();
+    } else if (this.#isNewLineSymbol(char)) {
+      return this.#scanNewLine(char);
+    } else if (this.#isNumericSymbol(char)) {
+      return this.#scanNumeric(char);
+    } else if (this.#isDashSymbol(char)) {
+      return this.#scanDash(char);
+    } else if (this.#isPlusSymbol(char)) {
+      return this.#scanPlus(char);
+    } else if (this.#isHashSymbol(char)) {
+      return this.#scanHash(char);
+    } else if (this.#isEscapeSymbol(char)) {
+      return this.#scanEscapeSymbol(char);
+    } else if (this.#isWhitespaceSymbol(char)) {
+      return this.#scanWhitespace(char);
+    } else if (this.#isLiteralSymbol(char)) {
+      return this.#scanLiteral(char);
+    }
+
+    throw new ERR_TAP_LEXER_ERROR(
+      `Unexpected character: ${char} at line ${this.#line}, column ${
+        this.#column
+      }`
+    );
+  }
+
+  #scanNewLine(char) {
+    // In case of odd number of ESCAPE symbols, we need to clear the remaining
+    // escape chars from the stack and start fresh for the next line.
+    this.#escapeStack = [];
+
+    // We also need to reset the comment flag
+    this.#isComment = false;
+
+    return new Token({
+      kind: TokenKind.NEWLINE,
+      value: char,
+      stream: this.#source,
+    });
+  }
+
+  #scanEOL() {
+    return new Token({
+      kind: TokenKind.EOL,
+      value: kEOL,
+      stream: this.#source,
+    });
+  }
+
+  #scanEOF() {
+    this.#isComment = false;
+
+    return new Token({
+      kind: TokenKind.EOF,
+      value: kEOF,
+      stream: this.#source,
+    });
+  }
+
+  #scanEscapeSymbol(char) {
+    // If the escape symbol has been escaped (by previous symbol),
+    // or if the next symbol is a whitespace symbol,
+    // then consume it as a literal.
+    if (
+      this.#hasTheCurrentCharacterBeenEscaped() ||
+      this.#source.peek(1) === TokenKind.WHITESPACE
+    ) {
+      this.#escapeStack.pop();
+      return new Token({
+        kind: TokenKind.LITERAL,
+        value: char,
+        stream: this.#source,
+      });
+    }
+
+    // Otherwise, consume the escape symbol as an escape symbol that should be ignored by the parser
+    // we also need to push the escape symbol to the escape stack
+    // and consume the next character as a literal (done in the next turn)
+    this.#escapeStack.push(char);
+    return new Token({
+      kind: TokenKind.ESCAPE,
+      value: char,
+      stream: this.#source,
+    });
+  }
+
+  #scanWhitespace(char) {
+    return new Token({
+      kind: TokenKind.WHITESPACE,
+      value: char,
+      stream: this.#source,
+    });
+  }
+
+  #scanDash(char) {
+    // Peek next 3 characters and check if it's a YAML start marker
+    const marker = char + this.#source.peek() + this.#source.peek(1);
+
+    if (this.#isYamlStartSymbol(marker)) {
+      this.next(); // consume second -
+      this.next(); // consume third -
+
+      return new Token({
+        kind: TokenKind.TAP_YAML_START,
+        value: marker,
+        stream: this.#source,
+      });
+    }
+
+    return new Token({
+      kind: TokenKind.DASH,
+      value: char,
+      stream: this.#source,
+    });
+  }
+
+  #scanPlus(char) {
+    return new Token({
+      kind: TokenKind.PLUS,
+      value: char,
+      stream: this.#source,
+    });
+  }
+
+  #scanHash(char) {
+    const lastCharacter = this.#source.peek(-2);
+    const nextToken = this.#source.peek();
+
+    // If we encounter a hash symbol at the beginning of a line,
+    // we consider it as a comment
+    if (!lastCharacter || this.#isNewLineSymbol(lastCharacter)) {
+      this.#isComment = true;
+      return new Token({
+        kind: TokenKind.COMMENT,
+        value: char,
+        stream: this.#source,
+      });
+    }
+
+    // The only valid case where a hash symbol is considered as a hash token
+    // is when it's preceded by a whitespace symbol and followed by a non-hash symbol
+    if (
+      this.#isWhitespaceSymbol(lastCharacter) &&
+      !this.#isHashSymbol(nextToken)
+    ) {
+      return new Token({
+        kind: TokenKind.HASH,
+        value: char,
+        stream: this.#source,
+      });
+    }
+
+    const charHasBeenEscaped = this.#hasTheCurrentCharacterBeenEscaped();
+    if (this.#isComment || charHasBeenEscaped) {
+      if (charHasBeenEscaped) {
+        this.#escapeStack.pop();
+      }
+
+      return new Token({
+        kind: TokenKind.LITERAL,
+        value: char,
+        stream: this.#source,
+      });
+    }
+
+    // As a fallback, we consume the hash symbol as a literal
+    return new Token({
+      kind: TokenKind.LITERAL,
+      value: char,
+      stream: this.#source,
+    });
+  }
+
+  #scanLiteral(char) {
+    let word = char;
+    while (!this.#source.eof()) {
+      const nextChar = this.#source.peek();
+      if (this.#isLiteralSymbol(nextChar)) {
+        word += this.#source.next();
+      } else {
+        break;
+      }
+    }
+
+    word = word.trim();
+
+    if (TapLexer.Keywords.has(word)) {
+      const token = this.#scanTAPKeyword(word);
+      if (token) {
+        return token;
+      }
+    }
+
+    if (this.#isYamlEndSymbol(word)) {
+      return new Token({
+        kind: TokenKind.TAP_YAML_END,
+        value: word,
+        stream: this.#source,
+      });
+    }
+
+    return new Token({
+      kind: TokenKind.LITERAL,
+      value: word,
+      stream: this.#source,
+    });
+  }
+
+  #scanTAPKeyword(word) {
+    const isLastScannedTokenEOLorNewLine = StringPrototypeIncludes(
+      [TokenKind.EOL, TokenKind.NEWLINE],
+      this.#lastScannedToken.kind
+    );
+
+    if (word === 'TAP' && isLastScannedTokenEOLorNewLine) {
+      return new Token({
+        kind: TokenKind.TAP,
+        value: word,
+        stream: this.#source,
+      });
+    }
+
+    if (word === 'version' && this.#lastScannedToken.kind === TokenKind.TAP) {
+      return new Token({
+        kind: TokenKind.TAP_VERSION,
+        value: word,
+        stream: this.#source,
+      });
+    }
+
+    if (word === '..' && this.#lastScannedToken.kind === TokenKind.NUMERIC) {
+      return new Token({
+        kind: TokenKind.TAP_PLAN,
+        value: word,
+        stream: this.#source,
+      });
+    }
+
+    if (word === 'not' && isLastScannedTokenEOLorNewLine) {
+      return new Token({
+        kind: TokenKind.TAP_TEST_NOTOK,
+        value: word,
+        stream: this.#source,
+      });
+    }
+
+    if (
+      word === 'ok' &&
+      (this.#lastScannedToken.kind === TokenKind.TAP_TEST_NOTOK ||
+        isLastScannedTokenEOLorNewLine)
+    ) {
+      return new Token({
+        kind: TokenKind.TAP_TEST_OK,
+        value: word,
+        stream: this.#source,
+      });
+    }
+
+    if (word === 'pragma' && isLastScannedTokenEOLorNewLine) {
+      return new Token({
+        kind: TokenKind.TAP_PRAGMA,
+        value: word,
+        stream: this.#source,
+      });
+    }
+
+    return null;
+  }
+
+  #scanNumeric(char) {
+    let number = char;
+    while (!this.#source.eof()) {
+      const nextChar = this.#source.peek();
+      if (this.#isNumericSymbol(nextChar)) {
+        number += nextChar;
+        this.#source.next();
+      } else {
+        break;
+      }
+    }
+    return new Token({
+      kind: TokenKind.NUMERIC,
+      value: number,
+      stream: this.#source,
+    });
+  }
+
+  #hasTheCurrentCharacterBeenEscaped() {
+    // Use the escapeStack to keep track of the escape characters
+    return this.#escapeStack.length > 0;
+  }
+
+  #isNumericSymbol(char) {
+    return char >= '0' && char <= '9';
+  }
+
+  #isLiteralSymbol(char) {
+    return (
+      (char >= 'a' && char <= 'z') ||
+      (char >= 'A' && char <= 'Z') ||
+      this.#isSpecialCharacterSymbol(char)
+    );
+  }
+
+  #isSpecialCharacterSymbol(char) {
+    // We deliberately do not include "# \ + -"" in this list
+    // these are used for comments/reasons explanations, pragma and escape characters
+    // whitespace is not included because it is handled separately
+    return '!"$%&\'()*,./:;<=>?@[]^_`{|}~'.indexOf(char) > -1;
+  }
+
+  #isWhitespaceSymbol(char) {
+    return char === ' ' || char === '\t';
+  }
+
+  #isEOFSymbol(char) {
+    return char === undefined;
+  }
+
+  #isNewLineSymbol(char) {
+    return char === '\n' || char === '\r';
+  }
+
+  #isHashSymbol(char) {
+    return char === '#';
+  }
+
+  #isDashSymbol(char) {
+    return char === '-';
+  }
+
+  #isPlusSymbol(char) {
+    return char === '+';
+  }
+
+  #isEscapeSymbol(char) {
+    return char === '\\';
+  }
+
+  #isYamlStartSymbol(char) {
+    return char === '---';
+  }
+
+  #isYamlEndSymbol(char) {
+    return char === '...';
+  }
+}
+
+module.exports = { TapLexer, TokenKind };
diff --git a/lib/internal/test_runner/tap_parser.js b/lib/internal/test_runner/tap_parser.js
new file mode 100644
index 00000000000000..2b79220b632e02
--- /dev/null
+++ b/lib/internal/test_runner/tap_parser.js
@@ -0,0 +1,980 @@
+'use strict';
+
+const Transform = require('internal/streams/transform');
+const { TapLexer, TokenKind } = require('internal/test_runner/tap_lexer');
+const { TapChecker } = require('internal/test_runner/tap_checker');
+const {
+  codes: { ERR_TAP_VALIDATION_ERROR, ERR_TAP_PARSER_ERROR },
+} = require('internal/errors');
+const { kEmptyObject } = require('internal/util');
+const {
+  ArrayPrototypeFilter,
+  ArrayPrototypeForEach,
+  ArrayPrototypeJoin,
+  ArrayPrototypeMap,
+  ArrayPrototypePush,
+  ArrayPrototypeIncludes,
+  ArrayPrototypeSplice,
+  Boolean,
+  Number,
+  RegExpPrototypeExec,
+  RegExpPrototypeSymbolReplace,
+  String,
+  StringPrototypeTrim,
+  StringPrototypeSplit,
+} = primordials;
+/**
+ *
+ * TAP14 specifications
+ *
+ * See https://testanything.org/tap-version-14-specification.html
+ *
+ * Note that the following grammar is intended as a rough "pseudocode" guidance.
+ * It is not strict EBNF:
+ *
+ * TAPDocument := Version Plan Body | Version Body Plan
+ * Version     := "TAP version 14\n"
+ * Plan        := "1.." (Number) (" # " Reason)? "\n"
+ * Body        := (TestPoint | BailOut | Pragma | Comment | Anything | Empty | Subtest)*
+ * TestPoint   := ("not ")? "ok" (" " Number)? ((" -")? (" " Description) )? (" " Directive)? "\n" (YAMLBlock)?
+ * Directive   := " # " ("todo" | "skip") (" " Reason)?
+ * YAMLBlock   := "  ---\n" (YAMLLine)* "  ...\n"
+ * YAMLLine    := "  " (YAML)* "\n"
+ * BailOut     := "Bail out!" (" " Reason)? "\n"
+ * Reason      := [^\n]+
+ * Pragma      := "pragma " [+-] PragmaKey "\n"
+ * PragmaKey   := ([a-zA-Z0-9_-])+
+ * Subtest     := ("# Subtest" (": " SubtestName)?)? "\n" SubtestDocument TestPoint
+ * Comment     := ^ (" ")* "#" [^\n]* "\n"
+ * Empty       := [\s\t]* "\n"
+ * Anything    := [^\n]+ "\n"
+ *
+ */
+
+/**
+ * An LL(1) parser for TAP14/TAP13.
+ */
+class TapParser extends Transform {
+  #checker = null;
+  #lexer = null;
+  #currentToken = null;
+
+  #input = '';
+  #currentChunkAsString = '';
+  #lastLine = '';
+
+  #tokens = [[]];
+  #flatAST = [];
+  #bufferedComments = [];
+  #bufferedTestPoints = [];
+  #lastTestPointDetails = {};
+  #yamlBlockBuffer = [];
+
+  #currentTokenIndex = 0;
+  #currentTokenChunk = 0;
+  #subTestNestingLevel = 0;
+  #yamlCurrentIndentationLevel = 0;
+  #kSubtestBlockIndentationFactor = 4;
+
+  #isYAMLBlock = false;
+  #isSyncParsingEnabled = false;
+
+  constructor({ specs = TapChecker.TAP13 } = kEmptyObject) {
+    super({ __proto__: null, readableObjectMode: true });
+
+    this.#checker = new TapChecker({ specs });
+  }
+
+  // ----------------------------------------------------------------------//
+  // ----------------------------- Public API -----------------------------//
+  // ----------------------------------------------------------------------//
+
+  parse(chunkAsString = '', callback = null) {
+    this.#isSyncParsingEnabled = false;
+    this.#currentTokenChunk = 0;
+    this.#currentTokenIndex = 0;
+    // Note: we are overwriting the input on each stream call
+    // This is fine because we don't want to parse previous chunks
+    this.#input = chunkAsString;
+    this.#lexer = new TapLexer(chunkAsString);
+
+    try {
+      this.#tokens = this.#scanTokens();
+      this.#parseTokens(callback);
+    } catch (error) {
+      callback(null, error);
+    }
+  }
+
+  parseSync(input = '', callback = null) {
+    if (typeof input !== 'string' || input === '') {
+      return [];
+    }
+
+    this.#isSyncParsingEnabled = true;
+    this.#input = input;
+    this.#lexer = new TapLexer(input);
+    this.#tokens = this.#scanTokens();
+
+    this.#parseTokens(callback);
+
+    if (this.#isYAMLBlock) {
+      // Looks like we have a non-ending YAML block
+      this.#error('Expected end of YAML block');
+    }
+
+    // Manually flush the remaining buffered comments and test points
+    this._flush();
+
+    return this.#flatAST;
+  }
+
+  // Check if the TAP content is semantically valid
+  // Note: Validating the TAP content requires the whole AST to be available.
+  check() {
+    if (this.#isSyncParsingEnabled) {
+      return this.#checker.check(this.#flatAST);
+    }
+
+    // TODO(@manekinekko): when running in async mode, it doesn't make sense to
+    // validate the current chunk. Validation needs to whole AST to be available.
+    throw new ERR_TAP_VALIDATION_ERROR(
+      'TAP validation is not supported for async parsing'
+    );
+  }
+  // ----------------------------------------------------------------------//
+  // --------------------------- Transform API ----------------------------//
+  // ----------------------------------------------------------------------//
+
+  processChunk(chunk) {
+    const str = this.#lastLine + chunk.toString('utf8');
+    const lines = StringPrototypeSplit(str, '\n');
+    this.#lastLine = ArrayPrototypeSplice(lines, lines.length - 1, 1)[0];
+
+    let chunkAsString = lines.join('\n');
+    // Special case where chunk is emitted by a child process
+    chunkAsString = RegExpPrototypeSymbolReplace(
+      /\[out\] /g,
+      chunkAsString,
+      ''
+    );
+    chunkAsString = RegExpPrototypeSymbolReplace(
+      /\[err\] /g,
+      chunkAsString,
+      ''
+    );
+    chunkAsString = RegExpPrototypeSymbolReplace(/\n$/, chunkAsString, '');
+    chunkAsString = RegExpPrototypeSymbolReplace(/EOF$/, chunkAsString, '');
+
+    return chunkAsString;
+  }
+
+  _transform(chunk, _encoding, next) {
+    const chunkAsString = this.processChunk(chunk);
+
+    if (!chunkAsString) {
+      // Ignore empty chunks
+      next();
+      return;
+    }
+
+    this.parse(chunkAsString, (node, error) => {
+      if (error) {
+        next(error);
+        return;
+      }
+
+      if (node.kind === TokenKind.EOF) {
+        // Emit when the current chunk is fully processed and consumed
+        next();
+      }
+    });
+  }
+
+  // Flush the remaining buffered comments and test points
+  // This will be called automatically when the stream is closed
+  // We also call this method manually when we reach the end of the sync parsing
+  _flush(next = null) {
+    if (!this.#lastLine) {
+      this.#__flushPendingTestPointsAndComments();
+      next?.();
+      return;
+    }
+    // Parse the remaining line
+    this.parse(this.#lastLine, (node, error) => {
+      this.#lastLine = '';
+
+      if (error) {
+        next?.(error);
+        return;
+      }
+
+      if (node.kind === TokenKind.EOF) {
+        this.#__flushPendingTestPointsAndComments();
+        next?.();
+      }
+    });
+  }
+
+  #__flushPendingTestPointsAndComments() {
+    ArrayPrototypeForEach(this.#bufferedTestPoints, (node) => {
+      this.#emit(node);
+    });
+    ArrayPrototypeForEach(this.#bufferedComments, (node) => {
+      this.#emit(node);
+    });
+
+    // Clean up
+    this.#bufferedTestPoints = [];
+    this.#bufferedComments = [];
+  }
+
+  // ----------------------------------------------------------------------//
+  // ----------------------------- Private API ----------------------------//
+  // ----------------------------------------------------------------------//
+
+  #scanTokens() {
+    return this.#lexer.scan();
+  }
+
+  #parseTokens(callback = null) {
+    for (let index = 0; index < this.#tokens.length; index++) {
+      const chunk = this.#tokens[index];
+      this.#parseChunk(chunk);
+    }
+
+    callback?.({ kind: TokenKind.EOF });
+  }
+
+  #parseChunk(chunk) {
+    this.#subTestNestingLevel = this.#getCurrentIndentationLevel(chunk);
+    // We compute the current index of the token in the chunk
+    // based on the indentation level (number of spaces).
+    // We also need to take into account if we are in a YAML block or not.
+    // If we are in a YAML block, we compute the current index of the token
+    // based on the indentation level of the YAML block (start block).
+
+    if (this.#isYAMLBlock) {
+      this.#currentTokenIndex =
+        this.#yamlCurrentIndentationLevel *
+        this.#kSubtestBlockIndentationFactor;
+    } else {
+      this.#currentTokenIndex =
+        this.#subTestNestingLevel * this.#kSubtestBlockIndentationFactor;
+      this.#yamlCurrentIndentationLevel = this.#subTestNestingLevel;
+    }
+
+    // Parse current chunk
+    const node = this.#TAPDocument(chunk);
+
+    // Emit the parsed node to both the stream and the AST
+    this.#emitOrBufferCurrentNode(node);
+
+    // Move pointers to the next chunk and reset the current token index
+    this.#currentTokenChunk++;
+    this.#currentTokenIndex = 0;
+  }
+
+  #error(message) {
+    if (!this.#isSyncParsingEnabled) {
+      // When async parsing is enabled, don't throw.
+      // Unrecognized tokens would be ignored.
+      return;
+    }
+
+    const token = this.#currentToken || { value: '', kind: '' };
+    // Escape NewLine characters
+    if (token.value === '\n') {
+      token.value = '\\n';
+    }
+
+    throw new ERR_TAP_PARSER_ERROR(
+      message,
+      `, received "${token.value}" (${token.kind})`,
+      token,
+      this.#input
+    );
+  }
+
+  #peek(shouldSkipBlankTokens = true) {
+    if (shouldSkipBlankTokens) {
+      this.#skip(TokenKind.WHITESPACE);
+    }
+
+    return this.#tokens[this.#currentTokenChunk][this.#currentTokenIndex];
+  }
+
+  #next(shouldSkipBlankTokens = true) {
+    if (shouldSkipBlankTokens) {
+      this.#skip(TokenKind.WHITESPACE);
+    }
+
+    if (this.#tokens[this.#currentTokenChunk]) {
+      this.#currentToken =
+        this.#tokens[this.#currentTokenChunk][this.#currentTokenIndex++];
+    } else {
+      this.#currentToken = null;
+    }
+
+    return this.#currentToken;
+  }
+
+  // Skip the provided tokens in the current chunk
+  #skip(...tokensToSkip) {
+    let token = this.#tokens[this.#currentTokenChunk][this.#currentTokenIndex];
+    while (token && ArrayPrototypeIncludes(tokensToSkip, token.kind)) {
+      // pre-increment to skip current tokens but make sure we don't advance index on the last iteration
+      token = this.#tokens[this.#currentTokenChunk][++this.#currentTokenIndex];
+    }
+  }
+
+  #readNextLiterals() {
+    const literals = [];
+    let nextToken = this.#peek(false);
+
+    // Read all literal, numeric, whitespace and escape tokens until we hit a different token
+    // or reach end of current chunk
+    while (
+      nextToken &&
+      ArrayPrototypeIncludes(
+        [
+          TokenKind.LITERAL,
+          TokenKind.NUMERIC,
+          TokenKind.DASH,
+          TokenKind.PLUS,
+          TokenKind.WHITESPACE,
+          TokenKind.ESCAPE,
+        ],
+        nextToken.kind
+      )
+    ) {
+      const word = this.#next(false).value;
+
+      // Don't output escaped characters
+      if (nextToken.kind !== TokenKind.ESCAPE) {
+        ArrayPrototypePush(literals, word);
+      }
+
+      nextToken = this.#peek(false);
+    }
+
+    return ArrayPrototypeJoin(literals, '');
+  }
+
+  #countLeadingSpacesInCurrentChunk(chunk) {
+    // Count the number of whitespace tokens in the chunk, starting from the first token
+    let whitespaceCount = 0;
+    while (chunk?.[whitespaceCount]?.kind === TokenKind.WHITESPACE) {
+      whitespaceCount++;
+    }
+    return whitespaceCount;
+  }
+
+  #addDiagnosticsToLastTestPoint(currentNode) {
+    const lastTestPoint = this.#bufferedTestPoints.at(-1);
+
+    // Diagnostic nodes are only added to Test points of the same nesting level
+    if (lastTestPoint && lastTestPoint.nesting === currentNode.nesting) {
+      lastTestPoint.node.time = this.#lastTestPointDetails.duration;
+
+      // TODO(@manekinekko): figure out where to put the other diagnostic properties
+      // See https://github.com/nodejs/node/pull/44952
+      lastTestPoint.node.diagnostics ||= [];
+
+      ArrayPrototypeForEach(currentNode.node.diagnostics, (diagnostic) => {
+        // Avoid adding empty diagnostics
+        if (diagnostic) {
+          ArrayPrototypePush(lastTestPoint.node.diagnostics, diagnostic);
+        }
+      });
+
+      this.#bufferedTestPoints = [];
+    }
+
+    return lastTestPoint;
+  }
+
+  #flushBufferedTestPointNode(shouldClearBuffer = true) {
+    if (this.#bufferedTestPoints.length > 0) {
+      this.#emit(this.#bufferedTestPoints.at(0));
+
+      if (shouldClearBuffer) {
+        this.#bufferedTestPoints = [];
+      }
+    }
+  }
+
+  #addCommentsToCurrentNode(currentNode) {
+    if (this.#bufferedComments.length > 0) {
+      currentNode.comments = ArrayPrototypeMap(
+        this.#bufferedComments,
+        (c) => c.node.comment
+      );
+      this.#bufferedComments = [];
+    }
+
+    return currentNode;
+  }
+
+  #flushBufferedComments(shouldClearBuffer = true) {
+    if (this.#bufferedComments.length > 0) {
+      ArrayPrototypeForEach(this.#bufferedComments, (node) => {
+        this.#emit(node);
+      });
+
+      if (shouldClearBuffer) {
+        this.#bufferedComments = [];
+      }
+    }
+  }
+
+  #getCurrentIndentationLevel(chunk) {
+    const whitespaceCount = this.#countLeadingSpacesInCurrentChunk(chunk);
+    return (whitespaceCount / this.#kSubtestBlockIndentationFactor) | 0;
+  }
+
+  #emit(node) {
+    if (node.kind !== TokenKind.EOF) {
+      ArrayPrototypePush(this.#flatAST, node);
+      this.push({
+        __proto__: null,
+        ...node,
+      });
+    }
+  }
+
+  #emitOrBufferCurrentNode(currentNode) {
+    currentNode = {
+      ...currentNode,
+      nesting: this.#subTestNestingLevel,
+      lexeme: this.#currentChunkAsString,
+    };
+
+    switch (currentNode.kind) {
+      // Emit these nodes
+      case TokenKind.UNKNOWN:
+        if (!currentNode.node.value) {
+          // Ignore unrecognized and empty nodes
+          break;
+        }
+
+        // Otherwise continue and process node
+        // eslint no-fallthrough
+
+      case TokenKind.TAP_PLAN:
+      case TokenKind.TAP_PRAGMA:
+      case TokenKind.TAP_VERSION:
+      case TokenKind.TAP_BAIL_OUT:
+      case TokenKind.TAP_SUBTEST_POINT:
+        // Check if we have a buffered test point, and if so, emit it
+        this.#flushBufferedTestPointNode();
+
+        // If we have buffered comments, add them to the current node
+        currentNode = this.#addCommentsToCurrentNode(currentNode);
+
+        // Emit the current node
+        this.#emit(currentNode);
+        break;
+
+      // By default, we buffer the next test point node in case we have a diagnostic
+      // to add to it in the next iteration
+      // Note: in case we hit and EOF, we flush the comments buffer (see _flush())
+      case TokenKind.TAP_TEST_POINT:
+        // In case of an already buffered test point, we flush it and buffer the current one
+        // Because diagnostic nodes are only added to the last processed test point
+        this.#flushBufferedTestPointNode();
+
+        // Buffer this node (and also add any pending comments to it)
+        ArrayPrototypePush(
+          this.#bufferedTestPoints,
+          this.#addCommentsToCurrentNode(currentNode)
+        );
+        break;
+
+      // Keep buffering comments until we hit a non-comment node, then add them to the that node
+      // Note: in case we hit and EOF, we flush the comments buffer (see _flush())
+      case TokenKind.COMMENT:
+        ArrayPrototypePush(this.#bufferedComments, currentNode);
+        break;
+
+      // Diagnostic nodes are added to Test points of the same nesting level
+      case TokenKind.TAP_YAML_END:
+        // Emit either the last updated test point (w/ diagnostics) or the current diagnostics node alone
+        this.#emit(
+          this.#addDiagnosticsToLastTestPoint(currentNode) || currentNode
+        );
+        break;
+
+      // In case we hit an EOF, we emit it to indicate the end of the stream
+      case TokenKind.EOF:
+        this.#emit(currentNode);
+        break;
+    }
+  }
+
+  #serializeChunk(chunk) {
+    return ArrayPrototypeJoin(
+      ArrayPrototypeMap(
+        // Exclude NewLine and EOF tokens
+        ArrayPrototypeFilter(
+          chunk,
+          (token) =>
+            token.kind !== TokenKind.NEWLINE && token.kind !== TokenKind.EOF
+        ),
+        (token) => token.value
+      ),
+      ''
+    );
+  }
+
+  // --------------------------------------------------------------------------//
+  // ------------------------------ Parser rules ------------------------------//
+  // --------------------------------------------------------------------------//
+
+  // TAPDocument := Version Plan Body | Version Body Plan
+  #TAPDocument(tokenChunks) {
+    this.#currentChunkAsString = this.#serializeChunk(tokenChunks);
+    const firstToken = this.#peek(false);
+
+    if (firstToken) {
+      const { kind } = firstToken;
+
+      switch (kind) {
+        case TokenKind.TAP:
+          return this.#Version();
+        case TokenKind.NUMERIC:
+          return this.#Plan();
+        case TokenKind.TAP_TEST_OK:
+        case TokenKind.TAP_TEST_NOTOK:
+          return this.#TestPoint();
+        case TokenKind.COMMENT:
+        case TokenKind.HASH:
+          return this.#Comment();
+        case TokenKind.TAP_PRAGMA:
+          return this.#Pragma();
+        case TokenKind.WHITESPACE:
+          return this.#YAMLBlock();
+        case TokenKind.LITERAL:
+          // Check for "Bail out!" literal (case insensitive)
+          if (
+            RegExpPrototypeExec(/^Bail\s+out!/i, this.#currentChunkAsString)
+          ) {
+            return this.#Bailout();
+          } else if (this.#isYAMLBlock) {
+            return this.#YAMLBlock();
+          }
+
+          // Read token because error needs the last token details
+          this.#next(false);
+          this.#error('Expected a valid token');
+
+          break;
+        case TokenKind.EOF:
+          return firstToken;
+
+        case TokenKind.NEWLINE:
+          // Consume and ignore NewLine token
+          return this.#next(false);
+        default:
+          // Read token because error needs the last token details
+          this.#next(false);
+          this.#error('Expected a valid token');
+      }
+    }
+
+    const node = {
+      kind: TokenKind.UNKNOWN,
+      node: {
+        value: this.#currentChunkAsString,
+      },
+    };
+
+    // We make sure the emitted node has the same shape
+    // both in sync and async parsing (for the stream interface)
+    return node;
+  }
+
+  // ----------------Version----------------
+  // Version := "TAP version Number\n"
+  #Version() {
+    const tapToken = this.#peek();
+
+    if (tapToken.kind === TokenKind.TAP) {
+      this.#next(); // Consume the TAP token
+    } else {
+      this.#error('Expected "TAP" keyword');
+    }
+
+    const versionToken = this.#peek();
+    if (versionToken?.kind === TokenKind.TAP_VERSION) {
+      this.#next(); // Consume the version token
+    } else {
+      this.#error('Expected "version" keyword');
+    }
+
+    const numberToken = this.#peek();
+    if (numberToken?.kind === TokenKind.NUMERIC) {
+      const version = this.#next().value;
+      const node = { kind: TokenKind.TAP_VERSION, node: { version } };
+      return node;
+    }
+    this.#error('Expected a version number');
+  }
+
+  // ----------------Plan----------------
+  // Plan := "1.." (Number) (" # " Reason)? "\n"
+  #Plan() {
+    // Even if specs mention plan starts at 1, we need to make sure we read the plan start value
+    // in case of a missing or invalid plan start value
+    const planStart = this.#next();
+
+    if (planStart.kind !== TokenKind.NUMERIC) {
+      this.#error('Expected a plan start count');
+    }
+
+    const planToken = this.#next();
+    if (planToken?.kind !== TokenKind.TAP_PLAN) {
+      this.#error('Expected ".." symbol');
+    }
+
+    const planEnd = this.#next();
+    if (planEnd?.kind !== TokenKind.NUMERIC) {
+      this.#error('Expected a plan end count');
+    }
+
+    const plan = {
+      start: planStart.value,
+      end: planEnd.value,
+    };
+
+    // Read optional reason
+    const hashToken = this.#peek();
+    if (hashToken) {
+      if (hashToken.kind === TokenKind.HASH) {
+        this.#next(); // skip hash
+        plan.reason = StringPrototypeTrim(this.#readNextLiterals());
+      } else if (hashToken.kind === TokenKind.LITERAL) {
+        this.#error('Expected "#" symbol before a reason');
+      }
+    }
+
+    const node = {
+      kind: TokenKind.TAP_PLAN,
+      node: plan,
+    };
+
+    return node;
+  }
+
+  // ----------------TestPoint----------------
+  // TestPoint := ("not ")? "ok" (" " Number)? ((" -")? (" " Description) )? (" " Directive)? "\n" (YAMLBlock)?
+  // Directive   := " # " ("todo" | "skip") (" " Reason)?
+  // YAMLBlock   := "  ---\n" (YAMLLine)* "  ...\n"
+  // YAMLLine    := "  " (YAML)* "\n"
+
+  // Test Status: ok/not ok (required)
+  // Test number (recommended)
+  // Description (recommended, prefixed by " - ")
+  // Directive (only when necessary)
+  #TestPoint() {
+    const notToken = this.#peek();
+    let isTestFailed = false;
+
+    if (notToken.kind === TokenKind.TAP_TEST_NOTOK) {
+      this.#next(); // skip "not" token
+      isTestFailed = true;
+    }
+
+    const okToken = this.#next();
+    if (okToken.kind !== TokenKind.TAP_TEST_OK) {
+      this.#error('Expected "ok" or "not ok" keyword');
+    }
+
+    // Read optional test number
+    let numberToken = this.#peek();
+    if (numberToken && numberToken.kind === TokenKind.NUMERIC) {
+      numberToken = this.#next().value;
+    } else {
+      numberToken = ''; // Set an empty ID to indicate that the test hasn't provider an ID
+    }
+
+    const test = {
+      // Output both failed and passed properties to make it easier for the checker to detect the test status
+      status: {
+        fail: isTestFailed,
+        pass: !isTestFailed,
+        todo: false,
+        skip: false,
+      },
+      id: numberToken,
+      description: '',
+      reason: '',
+      time: 0,
+      diagnostics: [],
+    };
+
+    // Read optional description prefix " - "
+    const descriptionDashToken = this.#peek();
+    if (descriptionDashToken && descriptionDashToken.kind === TokenKind.DASH) {
+      this.#next(); // skip dash
+    }
+
+    // Read optional description
+    if (this.#peek()) {
+      const description = StringPrototypeTrim(this.#readNextLiterals());
+      if (description) {
+        test.description = description;
+      }
+    }
+
+    // Read optional directive and reason
+    const hashToken = this.#peek();
+    if (hashToken && hashToken.kind === TokenKind.HASH) {
+      this.#next(); // skip hash
+    }
+
+    let todoOrSkipToken = this.#peek();
+    if (todoOrSkipToken && todoOrSkipToken.kind === TokenKind.LITERAL) {
+      if (RegExpPrototypeExec(/todo/i, todoOrSkipToken.value)) {
+        todoOrSkipToken = 'todo';
+        this.#next(); // skip token
+      } else if (RegExpPrototypeExec(/skip/i, todoOrSkipToken.value)) {
+        todoOrSkipToken = 'skip';
+        this.#next(); // skip token
+      }
+    }
+
+    const reason = StringPrototypeTrim(this.#readNextLiterals());
+    if (todoOrSkipToken) {
+      if (reason) {
+        test.reason = reason;
+      }
+
+      test.status.todo = todoOrSkipToken === 'todo';
+      test.status.skip = todoOrSkipToken === 'skip';
+    }
+
+    const node = {
+      kind: TokenKind.TAP_TEST_POINT,
+      node: test,
+    };
+
+    return node;
+  }
+
+  // ----------------Bailout----------------
+  // BailOut := "Bail out!" (" " Reason)? "\n"
+  #Bailout() {
+    this.#next(); // skip "Bail"
+    this.#next(); // skip "out!"
+
+    // Read optional reason
+    const hashToken = this.#peek();
+    if (hashToken && hashToken.kind === TokenKind.HASH) {
+      this.#next(); // skip hash
+    }
+
+    const reason = StringPrototypeTrim(this.#readNextLiterals());
+
+    const node = {
+      kind: TokenKind.TAP_BAIL_OUT,
+      node: { bailout: true, reason },
+    };
+
+    return node;
+  }
+
+  // ----------------Comment----------------
+  // Comment := ^ (" ")* "#" [^\n]* "\n"
+  #Comment() {
+    const commentToken = this.#next();
+    if (
+      commentToken.kind !== TokenKind.COMMENT &&
+      commentToken.kind !== TokenKind.HASH
+    ) {
+      this.#error('Expected "#" symbol');
+    }
+
+    const commentContent = this.#peek();
+    if (commentContent) {
+      if (/^Subtest:/i.test(commentContent.value)) {
+        this.#next(); // skip subtest keyword
+        const name = StringPrototypeTrim(this.#readNextLiterals());
+        const node = {
+          kind: TokenKind.TAP_SUBTEST_POINT,
+          node: {
+            name,
+          },
+        };
+
+        return node;
+      }
+
+      const comment = StringPrototypeTrim(this.#readNextLiterals());
+      const node = {
+        kind: TokenKind.COMMENT,
+        node: { comment },
+      };
+
+      return node;
+    }
+
+    // If there is no comment content, then we ignore the current node
+  }
+
+  // ----------------YAMLBlock----------------
+  // YAMLBlock := "  ---\n" (YAMLLine)* "  ...\n"
+  #YAMLBlock() {
+    const space1 = this.#peek(false);
+    if (space1 && space1.kind === TokenKind.WHITESPACE) {
+      this.#next(false); // skip 1st space
+    }
+
+    const space2 = this.#peek(false);
+    if (space2 && space2.kind === TokenKind.WHITESPACE) {
+      this.#next(false); // skip 2nd space
+    }
+
+    const yamlBlockSymbol = this.#peek(false);
+
+    if (yamlBlockSymbol.kind === TokenKind.WHITESPACE) {
+      if (this.#isYAMLBlock === false) {
+        this.#next(false); // skip 3rd space
+        this.#error('Expected valid YAML indentation (2 spaces)');
+      }
+    }
+
+    if (yamlBlockSymbol.kind === TokenKind.TAP_YAML_START) {
+      if (this.#isYAMLBlock) {
+        // Looks like we have another YAML start block, but we didn't close the previous one
+        this.#error('Unexpected YAML start marker');
+      }
+
+      this.#isYAMLBlock = true;
+      this.#yamlCurrentIndentationLevel = this.#subTestNestingLevel;
+      this.#lastTestPointDetails = {};
+
+      // Consume the YAML start marker
+      this.#next(false); // skip "---"
+
+      // No need to pass this token to the stream interface
+      return;
+    } else if (yamlBlockSymbol.kind === TokenKind.TAP_YAML_END) {
+      this.#next(false); // skip "..."
+
+      if (!this.#isYAMLBlock) {
+        // Looks like we have an YAML end block, but we didn't encounter any YAML start marker
+        this.#error('Unexpected YAML end marker');
+      }
+
+      this.#isYAMLBlock = false;
+
+      const diagnostics = this.#yamlBlockBuffer;
+      this.#yamlBlockBuffer = []; // Free the buffer for the next YAML block
+
+      const node = {
+        kind: TokenKind.TAP_YAML_END,
+        node: {
+          diagnostics,
+        },
+      };
+
+      return node;
+    }
+
+    if (this.#isYAMLBlock) {
+      this.#YAMLLine();
+    } else {
+      return {
+        kind: TokenKind.UNKNOWN,
+        node: {
+          value: yamlBlockSymbol.value,
+        },
+      };
+    }
+  }
+
+  // ----------------YAMLLine----------------
+  // YAMLLine := "  " (YAML)* "\n"
+  #YAMLLine() {
+    const yamlLiteral = this.#readNextLiterals();
+    const { 0: key, 1: value } = StringPrototypeSplit(yamlLiteral, ':');
+
+    // Note that this.#lastTestPointDetails has been cleared when we encounter a YAML start marker
+
+    switch (key) {
+      case 'duration_ms':
+        this.#lastTestPointDetails.duration = Number(value);
+        break;
+      // Below are diagnostic properties introduced in https://github.com/nodejs/node/pull/44952
+      case 'expected':
+        this.#lastTestPointDetails.expected = Boolean(value);
+        break;
+      case 'actual':
+        this.#lastTestPointDetails.actual = Boolean(value);
+        break;
+      case 'operator':
+        this.#lastTestPointDetails.operator = String(value);
+        break;
+    }
+
+    ArrayPrototypePush(this.#yamlBlockBuffer, yamlLiteral);
+  }
+
+  // ----------------PRAGMA----------------
+  // Pragma := "pragma " [+-] PragmaKey "\n"
+  // PragmaKey := ([a-zA-Z0-9_-])+
+  // TODO(@manekinekko): pragmas are parsed but not used yet! TapChecker() should take care of that.
+  #Pragma() {
+    const pragmaToken = this.#next();
+    if (pragmaToken.kind !== TokenKind.TAP_PRAGMA) {
+      this.#error('Expected "pragma" keyword');
+    }
+
+    const pragmas = {};
+
+    let nextToken = this.#peek();
+    while (
+      nextToken &&
+      ArrayPrototypeIncludes(
+        [TokenKind.NEWLINE, TokenKind.EOF, TokenKind.EOL],
+        nextToken.kind
+      ) === false
+    ) {
+      let isEnabled = true;
+      const pragmaKeySign = this.#next();
+      if (pragmaKeySign.kind === TokenKind.PLUS) {
+        isEnabled = true;
+      } else if (pragmaKeySign.kind === TokenKind.DASH) {
+        isEnabled = false;
+      } else {
+        this.#error('Expected "+" or "-" before pragma keys');
+      }
+
+      const pragmaKeyToken = this.#peek();
+      if (pragmaKeyToken.kind !== TokenKind.LITERAL) {
+        this.#error('Expected pragma key');
+      }
+
+      let pragmaKey = this.#next().value;
+
+      // In some cases, pragma key can be followed by a comma separator,
+      // so we need to remove it
+      pragmaKey = RegExpPrototypeSymbolReplace(/,/g, pragmaKey, '');
+
+      pragmas[pragmaKey] = isEnabled;
+      nextToken = this.#peek();
+    }
+
+    const node = {
+      kind: TokenKind.TAP_PRAGMA,
+      node: {
+        pragmas,
+      },
+    };
+
+    return node;
+  }
+}
+
+module.exports = { TapParser };
diff --git a/lib/internal/test_runner/tap_stream.js b/lib/internal/test_runner/tap_stream.js
index efd73e1e945995..3abd7ed5560664 100644
--- a/lib/internal/test_runner/tap_stream.js
+++ b/lib/internal/test_runner/tap_stream.js
@@ -7,6 +7,7 @@ const {
   ArrayPrototypeShift,
   ObjectEntries,
   StringPrototypeReplaceAll,
+  StringPrototypeToUpperCase,
   StringPrototypeSplit,
   RegExpPrototypeSymbolReplace,
 } = primordials;
@@ -15,6 +16,7 @@ const Readable = require('internal/streams/readable');
 const { isError, kEmptyObject } = require('internal/util');
 const kFrameStartRegExp = /^ {4}at /;
 const kLineBreakRegExp = /\n|\r\n/;
+const kDefaultTAPVersion = 13;
 const inspectOptions = { colors: false, breakLength: Infinity };
 let testModule; // Lazy loaded due to circular dependency.
 
@@ -50,16 +52,16 @@ class TapStream extends Readable {
     this.#tryPush(`Bail out!${message ? ` ${tapEscape(message)}` : ''}\n`);
   }
 
-  fail(indent, testNumber, name, duration, error, directive) {
-    this.emit('test:fail', { __proto__: null, name, testNumber, duration, ...directive, error });
+  fail(indent, testNumber, name, details, directive) {
+    this.emit('test:fail', { __proto__: null, name, testNumber, details, ...directive });
     this.#test(indent, testNumber, 'not ok', name, directive);
-    this.#details(indent, duration, error);
+    this.#details(indent, details);
   }
 
-  ok(indent, testNumber, name, duration, directive) {
-    this.emit('test:pass', { __proto__: null, name, testNumber, duration, ...directive });
+  ok(indent, testNumber, name, details, directive) {
+    this.emit('test:pass', { __proto__: null, name, testNumber, details, ...directive });
     this.#test(indent, testNumber, 'ok', name, directive);
-    this.#details(indent, duration, null);
+    this.#details(indent, details);
   }
 
   plan(indent, count, explanation) {
@@ -80,9 +82,11 @@ class TapStream extends Readable {
     this.#tryPush(`${indent}# Subtest: ${tapEscape(name)}\n`);
   }
 
-  #details(indent, duration, error) {
+  #details(indent, data = kEmptyObject) {
+    const { error, duration, yaml } = data;
     let details = `${indent}  ---\n`;
 
+    details += `${yaml ? yaml : ''}`;
     details += jsToYaml(indent, 'duration_ms', duration);
     details += jsToYaml(indent, null, error);
     details += `${indent}  ...\n`;
@@ -94,8 +98,8 @@ class TapStream extends Readable {
     this.#tryPush(`${indent}# ${tapEscape(message)}\n`);
   }
 
-  version() {
-    this.#tryPush('TAP version 13\n');
+  version(spec = kDefaultTAPVersion) {
+    this.#tryPush(`TAP version ${spec}\n`);
   }
 
   #test(indent, testNumber, status, name, directive = kEmptyObject) {
@@ -106,10 +110,11 @@ class TapStream extends Readable {
     }
 
     line += ArrayPrototypeJoin(ArrayPrototypeMap(ObjectEntries(directive), ({ 0: key, 1: value }) => (
-      ` # ${key.toUpperCase()}${value ? ` ${tapEscape(value)}` : ''}`
+      ` # ${StringPrototypeToUpperCase(key)}${value ? ` ${tapEscape(value)}` : ''}`
     )), '');
 
     line += '\n';
+
     this.#tryPush(line);
   }
 
@@ -229,7 +234,9 @@ function jsToYaml(indent, name, value) {
         StringPrototypeSplit(errStack, kLineBreakRegExp),
         (frame) => {
           const processed = RegExpPrototypeSymbolReplace(
-            kFrameStartRegExp, frame, ''
+            kFrameStartRegExp,
+            frame,
+            ''
           );
 
           if (processed.length > 0 && processed.length !== frame.length) {
@@ -242,7 +249,7 @@ function jsToYaml(indent, name, value) {
         const frameDelimiter = `\n${indent}    `;
 
         result += `${indent}  stack: |-${frameDelimiter}`;
-        result += `${ArrayPrototypeJoin(frames, `${frameDelimiter}`)}\n`;
+        result += `${ArrayPrototypeJoin(frames, frameDelimiter)}\n`;
       }
     }
   }
diff --git a/lib/internal/test_runner/test.js b/lib/internal/test_runner/test.js
index 2176b87fbf1b37..9372cb7032ec21 100644
--- a/lib/internal/test_runner/test.js
+++ b/lib/internal/test_runner/test.js
@@ -62,8 +62,8 @@ const kSubtestsFailed = 'subtestsFailed';
 const kTestCodeFailure = 'testCodeFailure';
 const kTestTimeoutFailure = 'testTimeoutFailure';
 const kHookFailure = 'hookFailed';
-const kDefaultIndent = '    ';
 const kDefaultTimeout = null;
+const kDefaultIndent = '    '; // 4 spaces
 const noop = FunctionPrototype;
 const isTestRunner = getOptionValue('--test');
 const testOnlyFlag = !isTestRunner && getOptionValue('--test-only');
@@ -172,7 +172,6 @@ class Test extends AsyncResource {
     if (parent === null) {
       this.concurrency = 1;
       this.indent = '';
-      this.indentString = kDefaultIndent;
       this.only = testOnlyFlag;
       this.reporter = new TapStream();
       this.runOnlySubtests = this.only;
@@ -180,11 +179,10 @@ class Test extends AsyncResource {
       this.timeout = kDefaultTimeout;
     } else {
       const indent = parent.parent === null ? parent.indent :
-        parent.indent + parent.indentString;
+        parent.indent + kDefaultIndent;
 
       this.concurrency = parent.concurrency;
       this.indent = indent;
-      this.indentString = parent.indentString;
       this.only = only ?? !parent.runOnlySubtests;
       this.reporter = parent.reporter;
       this.runOnlySubtests = !this.only;
@@ -662,6 +660,7 @@ class Test extends AsyncResource {
       this.reportSubtest();
     }
     let directive;
+    const details = { __proto__: null, duration: this.#duration() };
 
     if (this.skipped) {
       directive = this.reporter.getSkip(this.message);
@@ -670,9 +669,10 @@ class Test extends AsyncResource {
     }
 
     if (this.passed) {
-      this.reporter.ok(this.indent, this.testNumber, this.name, this.#duration(), directive);
+      this.reporter.ok(this.indent, this.testNumber, this.name, details, directive);
     } else {
-      this.reporter.fail(this.indent, this.testNumber, this.name, this.#duration(), this.error, directive);
+      details.error = this.error;
+      this.reporter.fail(this.indent, this.testNumber, this.name, details, directive);
     }
 
     for (let i = 0; i < this.diagnostics.length; i++) {
diff --git a/lib/internal/url.js b/lib/internal/url.js
index 1f84e05e1d6142..40b25f6890b5db 100644
--- a/lib/internal/url.js
+++ b/lib/internal/url.js
@@ -748,13 +748,13 @@ class URL {
   toString() {
     if (!isURLThis(this))
       throw new ERR_INVALID_THIS('URL');
-    return this[kFormat]({});
+    return this[kFormat]();
   }
 
   get href() {
     if (!isURLThis(this))
       throw new ERR_INVALID_THIS('URL');
-    return this[kFormat]({});
+    return this[kFormat]();
   }
 
   set href(input) {
@@ -1011,7 +1011,7 @@ class URL {
   toJSON() {
     if (!isURLThis(this))
       throw new ERR_INVALID_THIS('URL');
-    return this[kFormat]({});
+    return this[kFormat]();
   }
 
   static createObjectURL(obj) {
diff --git a/lib/internal/util.js b/lib/internal/util.js
index 4f74f912936611..6e3b60d77ba44a 100644
--- a/lib/internal/util.js
+++ b/lib/internal/util.js
@@ -224,8 +224,7 @@ function slowCases(enc) {
 
 function emitExperimentalWarning(feature) {
   if (experimentalWarnings.has(feature)) return;
-  const msg = `${feature} is an experimental feature. This feature could ` +
-       'change at any time';
+  const msg = `${feature} is an experimental feature and might change at any time`;
   experimentalWarnings.add(feature);
   process.emitWarning(msg, 'ExperimentalWarning');
 }
diff --git a/lib/internal/watch_mode/files_watcher.js b/lib/internal/watch_mode/files_watcher.js
index 6c6c0f27fd8f8d..3c756c4b5d77c9 100644
--- a/lib/internal/watch_mode/files_watcher.js
+++ b/lib/internal/watch_mode/files_watcher.js
@@ -1,6 +1,8 @@
 'use strict';
 
 const {
+  ArrayIsArray,
+  ArrayPrototypeForEach,
   SafeMap,
   SafeSet,
   StringPrototypeStartsWith,
@@ -24,6 +26,8 @@ class FilesWatcher extends EventEmitter {
   #watchers = new SafeMap();
   #filteredFiles = new SafeSet();
   #throttling = new SafeSet();
+  #depencencyOwners = new SafeMap();
+  #ownerDependencies = new SafeMap();
   #throttle;
   #mode;
 
@@ -72,7 +76,8 @@ class FilesWatcher extends EventEmitter {
       return;
     }
     this.#throttling.add(trigger);
-    this.emit('changed');
+    const owners = this.#depencencyOwners.get(trigger);
+    this.emit('changed', { owners });
     setTimeout(() => this.#throttling.delete(trigger), this.#throttle).unref();
   }
 
@@ -93,7 +98,8 @@ class FilesWatcher extends EventEmitter {
     }
   }
 
-  filterFile(file) {
+  filterFile(file, owner) {
+    if (!file) return;
     if (supportsRecursiveWatching) {
       this.watchPath(dirname(file));
     } else {
@@ -102,24 +108,43 @@ class FilesWatcher extends EventEmitter {
       this.watchPath(file, false);
     }
     this.#filteredFiles.add(file);
+    if (owner) {
+      const owners = this.#depencencyOwners.get(file) ?? new SafeSet();
+      const dependencies = this.#ownerDependencies.get(file) ?? new SafeSet();
+      owners.add(owner);
+      dependencies.add(file);
+      this.#depencencyOwners.set(file, owners);
+      this.#ownerDependencies.set(owner, dependencies);
+    }
   }
-  watchChildProcessModules(child) {
+  watchChildProcessModules(child, key = null) {
     if (this.#mode !== 'filter') {
       return;
     }
     child.on('message', (message) => {
       try {
-        if (message['watch:require']) {
-          this.filterFile(message['watch:require']);
+        if (ArrayIsArray(message['watch:require'])) {
+          ArrayPrototypeForEach(message['watch:require'], (file) => this.filterFile(file, key));
         }
-        if (message['watch:import']) {
-          this.filterFile(fileURLToPath(message['watch:import']));
+        if (ArrayIsArray(message['watch:import'])) {
+          ArrayPrototypeForEach(message['watch:import'], (file) => this.filterFile(fileURLToPath(file), key));
         }
       } catch {
         // Failed watching file. ignore
       }
     });
   }
+  unfilterFilesOwnedBy(owners) {
+    owners.forEach((owner) => {
+      this.#ownerDependencies.get(owner)?.forEach((dependency) => {
+        this.#filteredFiles.delete(dependency);
+        this.#depencencyOwners.delete(dependency);
+      });
+      this.#filteredFiles.delete(owner);
+      this.#depencencyOwners.delete(owner);
+      this.#ownerDependencies.delete(owner);
+    });
+  }
   clearFileFilters() {
     this.#filteredFiles.clear();
   }
@@ -127,6 +152,8 @@ class FilesWatcher extends EventEmitter {
     this.#watchers.forEach(this.#unwatch);
     this.#watchers.clear();
     this.#filteredFiles.clear();
+    this.#depencencyOwners.clear();
+    this.#ownerDependencies.clear();
   }
 }
 
diff --git a/lib/internal/webstreams/adapters.js b/lib/internal/webstreams/adapters.js
index 5768c71d21ff58..0e844d01200751 100644
--- a/lib/internal/webstreams/adapters.js
+++ b/lib/internal/webstreams/adapters.js
@@ -5,9 +5,14 @@ const {
   PromiseResolve,
   SafePromiseAll,
   SafePromisePrototypeFinally,
+  TypedArrayPrototypeGetBuffer,
+  TypedArrayPrototypeGetByteOffset,
+  TypedArrayPrototypeGetByteLength,
   Uint8Array,
 } = primordials;
 
+const { TextEncoder } = require('internal/encoding');
+
 const {
   ReadableStream,
   isReadableStream,
@@ -54,6 +59,7 @@ const {
 const {
   createDeferredPromise,
   kEmptyObject,
+  normalizeEncoding,
 } = require('internal/util');
 
 const {
@@ -73,6 +79,8 @@ const finished = require('internal/streams/end-of-stream');
 
 const { UV_EOF } = internalBinding('uv');
 
+const encoder = new TextEncoder();
+
 /**
  * @typedef {import('../../stream').Writable} Writable
  * @typedef {import('../../stream').Readable} Readable
@@ -255,11 +263,18 @@ function newStreamWritableFromWritableStream(writableStream, options = kEmptyObj
 
     write(chunk, encoding, callback) {
       if (typeof chunk === 'string' && decodeStrings && !objectMode) {
-        chunk = Buffer.from(chunk, encoding);
-        chunk = new Uint8Array(
-          chunk.buffer,
-          chunk.byteOffset,
-          chunk.byteLength);
+        const enc = normalizeEncoding(encoding);
+
+        if (enc === 'utf8') {
+          chunk = encoder.encode(chunk);
+        } else {
+          chunk = Buffer.from(chunk, encoding);
+          chunk = new Uint8Array(
+            TypedArrayPrototypeGetBuffer(chunk),
+            TypedArrayPrototypeGetByteOffset(chunk),
+            TypedArrayPrototypeGetByteLength(chunk),
+          );
+        }
       }
 
       function done(error) {
@@ -548,7 +563,7 @@ function newStreamReadableFromReadableStream(readableStream, options = kEmptyObj
  */
 function newReadableWritablePairFromDuplex(duplex) {
   // Not using the internal/streams/utils isWritableNodeStream and
-  // isReadableNodestream utilities here because they will return false
+  // isReadableNodeStream utilities here because they will return false
   // if the duplex was created with writable or readable options set to
   // false. Instead, we'll check the readable and writable state after
   // and return closed WritableStream or closed ReadableStream as
@@ -674,11 +689,18 @@ function newStreamDuplexFromReadableWritablePair(pair = kEmptyObject, options =
 
     write(chunk, encoding, callback) {
       if (typeof chunk === 'string' && decodeStrings && !objectMode) {
-        chunk = Buffer.from(chunk, encoding);
-        chunk = new Uint8Array(
-          chunk.buffer,
-          chunk.byteOffset,
-          chunk.byteLength);
+        const enc = normalizeEncoding(encoding);
+
+        if (enc === 'utf8') {
+          chunk = encoder.encode(chunk);
+        } else {
+          chunk = Buffer.from(chunk, encoding);
+          chunk = new Uint8Array(
+            TypedArrayPrototypeGetBuffer(chunk),
+            TypedArrayPrototypeGetByteOffset(chunk),
+            TypedArrayPrototypeGetByteLength(chunk),
+          );
+        }
       }
 
       function done(error) {
diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js
index 3239f3ee932caa..256075d3a1cfaa 100644
--- a/lib/internal/webstreams/readablestream.js
+++ b/lib/internal/webstreams/readablestream.js
@@ -4,6 +4,7 @@
 
 const {
   ArrayBuffer,
+  ArrayBufferPrototypeGetByteLength,
   ArrayBufferPrototypeSlice,
   ArrayPrototypePush,
   ArrayPrototypeShift,
@@ -93,7 +94,6 @@ const {
   ArrayBufferViewGetBuffer,
   ArrayBufferViewGetByteLength,
   ArrayBufferViewGetByteOffset,
-  ArrayBufferGetByteLength,
   AsyncIterator,
   cloneAsUint8Array,
   copyArrayBuffer,
@@ -667,7 +667,7 @@ class ReadableStreamBYOBRequest {
 
     const viewByteLength = ArrayBufferViewGetByteLength(view);
     const viewBuffer = ArrayBufferViewGetBuffer(view);
-    const viewBufferByteLength = ArrayBufferGetByteLength(viewBuffer);
+    const viewBufferByteLength = ArrayBufferPrototypeGetByteLength(viewBuffer);
 
     if (isDetachedBuffer(viewBuffer)) {
       throw new ERR_INVALID_STATE.TypeError('Viewed ArrayBuffer is detached');
@@ -906,7 +906,7 @@ class ReadableStreamBYOBReader {
 
     const viewByteLength = ArrayBufferViewGetByteLength(view);
     const viewBuffer = ArrayBufferViewGetBuffer(view);
-    const viewBufferByteLength = ArrayBufferGetByteLength(viewBuffer);
+    const viewBufferByteLength = ArrayBufferPrototypeGetByteLength(viewBuffer);
 
     if (viewByteLength === 0 || viewBufferByteLength === 0) {
       return PromiseReject(
@@ -1118,7 +1118,7 @@ class ReadableByteStreamController {
     }
     const chunkByteLength = ArrayBufferViewGetByteLength(chunk);
     const chunkBuffer = ArrayBufferViewGetBuffer(chunk);
-    const chunkBufferByteLength = ArrayBufferGetByteLength(chunkBuffer);
+    const chunkBufferByteLength = ArrayBufferPrototypeGetByteLength(chunkBuffer);
     if (chunkByteLength === 0 || chunkBufferByteLength === 0) {
       throw new ERR_INVALID_STATE.TypeError(
         'chunk ArrayBuffer is zero-length or detached');
@@ -2492,7 +2492,7 @@ function readableByteStreamControllerPullInto(
   const buffer = ArrayBufferViewGetBuffer(view);
   const byteOffset = ArrayBufferViewGetByteOffset(view);
   const byteLength = ArrayBufferViewGetByteLength(view);
-  const bufferByteLength = ArrayBufferGetByteLength(buffer);
+  const bufferByteLength = ArrayBufferPrototypeGetByteLength(buffer);
 
   let transferredBuffer;
   try {
@@ -2795,7 +2795,7 @@ function readableByteStreamControllerFillPullIntoDescriptorFromQueue(
       totalBytesToCopyRemaining,
       headOfQueue.byteLength);
     const destStart = byteOffset + desc.bytesFilled;
-    const arrayBufferByteLength = ArrayBufferGetByteLength(buffer);
+    const arrayBufferByteLength = ArrayBufferPrototypeGetByteLength(buffer);
     if (arrayBufferByteLength - destStart < bytesToCopy) {
       throw new ERR_INVALID_STATE.RangeError(
         'view ArrayBuffer size is invalid');
@@ -2899,7 +2899,7 @@ function readableByteStreamControllerRespondInReadableState(
       controller,
       remainder,
       0,
-      ArrayBufferGetByteLength(remainder));
+      ArrayBufferPrototypeGetByteLength(remainder));
   }
   desc.bytesFilled -= remainderSize;
   readableByteStreamControllerCommitPullIntoDescriptor(
@@ -2921,7 +2921,7 @@ function readableByteStreamControllerRespondWithNewView(controller, view) {
   const viewByteLength = ArrayBufferViewGetByteLength(view);
   const viewByteOffset = ArrayBufferViewGetByteOffset(view);
   const viewBuffer = ArrayBufferViewGetBuffer(view);
-  const viewBufferByteLength = ArrayBufferGetByteLength(viewBuffer);
+  const viewBufferByteLength = ArrayBufferPrototypeGetByteLength(viewBuffer);
 
   if (stream[kState].state === 'closed') {
     if (viewByteLength !== 0)
diff --git a/lib/internal/webstreams/util.js b/lib/internal/webstreams/util.js
index 0e260d074c73c2..1cf2d3a1874b10 100644
--- a/lib/internal/webstreams/util.js
+++ b/lib/internal/webstreams/util.js
@@ -1,7 +1,7 @@
 'use strict';
 
 const {
-  ArrayBufferPrototype,
+  ArrayBufferPrototypeGetByteLength,
   ArrayBufferPrototypeSlice,
   ArrayPrototypePush,
   ArrayPrototypeShift,
@@ -109,10 +109,6 @@ function ArrayBufferViewGetByteOffset(view) {
   return ReflectGet(view.constructor.prototype, 'byteOffset', view);
 }
 
-function ArrayBufferGetByteLength(view) {
-  return ReflectGet(ArrayBufferPrototype, 'byteLength', view);
-}
-
 function cloneAsUint8Array(view) {
   const buffer = ArrayBufferViewGetBuffer(view);
   const byteOffset = ArrayBufferViewGetByteOffset(view);
@@ -140,7 +136,7 @@ function transferArrayBuffer(buffer) {
 }
 
 function isDetachedBuffer(buffer) {
-  if (ArrayBufferGetByteLength(buffer) === 0) {
+  if (ArrayBufferPrototypeGetByteLength(buffer) === 0) {
     // TODO(daeyeon): Consider using C++ builtin to improve performance.
     try {
       new Uint8Array(buffer);
@@ -244,7 +240,6 @@ module.exports = {
   ArrayBufferViewGetBuffer,
   ArrayBufferViewGetByteLength,
   ArrayBufferViewGetByteOffset,
-  ArrayBufferGetByteLength,
   AsyncIterator,
   cloneAsUint8Array,
   copyArrayBuffer,
diff --git a/lib/url.js b/lib/url.js
index 95b7f8afe29e77..4d7374a8e3f358 100644
--- a/lib/url.js
+++ b/lib/url.js
@@ -387,7 +387,7 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
 
     // validate a little.
     if (!ipv6Hostname) {
-      rest = getHostname(this, rest, hostname, url);
+      rest = getHostname(this, rest, hostname);
     }
 
     if (this.hostname.length > hostnameMaxLen) {
@@ -506,7 +506,7 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) {
   return this;
 };
 
-function getHostname(self, rest, hostname, url) {
+function getHostname(self, rest, hostname) {
   for (let i = 0; i < hostname.length; ++i) {
     const code = hostname.charCodeAt(i);
     const isValid = (code !== CHAR_FORWARD_SLASH &&
@@ -516,10 +516,6 @@ function getHostname(self, rest, hostname, url) {
                      code !== CHAR_COLON);
 
     if (!isValid) {
-      // If leftover starts with :, then it represents an invalid port.
-      if (hostname.charCodeAt(i) === 58) {
-        throw new ERR_INVALID_URL(url);
-      }
       self.hostname = hostname.slice(0, i);
       return `/${hostname.slice(i)}${rest}`;
     }
diff --git a/node.gyp b/node.gyp
index a22af3b479aadf..448cb8a8c7cd49 100644
--- a/node.gyp
+++ b/node.gyp
@@ -22,6 +22,7 @@
     'node_use_openssl%': 'true',
     'node_shared_openssl%': 'false',
     'node_v8_options%': '',
+    'node_enable_v8_vtunejit%': 'false',
     'node_core_target_name%': 'node',
     'node_lib_target_name%': 'libnode',
     'node_intermediate_lib_type%': 'static_library',
@@ -429,7 +430,7 @@
                'inputs': [ '<(opensslconfig)', ],
                'outputs': [ '<(opensslconfig_internal)', ],
                'action': [
-                 'python', 'tools/copyfile.py',
+                 '<(python)', 'tools/copyfile.py',
                  '<(opensslconfig)',
                  '<(opensslconfig_internal)',
                ],
diff --git a/node.gypi b/node.gypi
index 0b0f05322e7bcc..059df00bcf4e06 100644
--- a/node.gypi
+++ b/node.gypi
@@ -125,6 +125,14 @@
           ],
       }]],
     }],
+    [ 'node_use_bundled_v8=="true" and \
+       node_enable_v8_vtunejit=="true" and (target_arch=="x64" or \
+       target_arch=="ia32" or target_arch=="x32")', {
+      'defines': [ 'NODE_ENABLE_VTUNE_PROFILING' ],
+      'dependencies': [
+        'tools/v8_gypfiles/v8vtune.gyp:v8_vtune'
+      ],
+    }],
     [ 'node_no_browser_globals=="true"', {
       'defines': [ 'NODE_NO_BROWSER_GLOBALS' ],
     } ],
diff --git a/src/api/environment.cc b/src/api/environment.cc
index 2c9f4adc7585f4..0cbbe3fb048517 100644
--- a/src/api/environment.cc
+++ b/src/api/environment.cc
@@ -12,7 +12,9 @@
 #include "node_v8_platform-inl.h"
 #include "node_wasm_web_api.h"
 #include "uv.h"
-
+#ifdef NODE_ENABLE_VTUNE_PROFILING
+#include "../deps/v8/src/third_party/vtune/v8-vtune.h"
+#endif
 #if HAVE_INSPECTOR
 #include "inspector/worker_inspector.h"  // ParentInspectorHandle
 #endif
@@ -226,6 +228,10 @@ void SetIsolateCreateParamsForNode(Isolate::CreateParams* params) {
   }
   params->embedder_wrapper_object_index = BaseObject::InternalFields::kSlot;
   params->embedder_wrapper_type_index = std::numeric_limits<int>::max();
+
+#ifdef NODE_ENABLE_VTUNE_PROFILING
+  params->code_event_handler = vTune::GetVtuneCodeEventHandler();
+#endif
 }
 
 void SetIsolateErrorHandlers(v8::Isolate* isolate, const IsolateSettings& s) {
diff --git a/src/crypto/crypto_x509.cc b/src/crypto/crypto_x509.cc
index 3c30749c394655..98d704c48c3948 100644
--- a/src/crypto/crypto_x509.cc
+++ b/src/crypto/crypto_x509.cc
@@ -453,6 +453,8 @@ void X509Certificate::CheckPrivateKey(const FunctionCallbackInfo<Value>& args) {
   ASSIGN_OR_RETURN_UNWRAP(&key, args[0]);
   CHECK_EQ(key->Data()->GetKeyType(), kKeyTypePrivate);
 
+  ClearErrorOnReturn clear_error_on_return;
+
   args.GetReturnValue().Set(
       X509_check_private_key(
           cert->get(),
@@ -468,6 +470,8 @@ void X509Certificate::Verify(const FunctionCallbackInfo<Value>& args) {
   ASSIGN_OR_RETURN_UNWRAP(&key, args[0]);
   CHECK_EQ(key->Data()->GetKeyType(), kKeyTypePublic);
 
+  ClearErrorOnReturn clear_error_on_return;
+
   args.GetReturnValue().Set(
       X509_verify(
           cert->get(),
diff --git a/src/env.h b/src/env.h
index 542d1cf6e5697b..1120bd130edccf 100644
--- a/src/env.h
+++ b/src/env.h
@@ -94,56 +94,11 @@ class Worker;
 
 namespace loader {
 class ModuleWrap;
-
-struct PackageConfig {
-  enum class Exists { Yes, No };
-  enum class IsValid { Yes, No };
-  enum class HasMain { Yes, No };
-  enum class HasName { Yes, No };
-  enum PackageType : uint32_t { None = 0, CommonJS, Module };
-
-  const Exists exists;
-  const IsValid is_valid;
-  const HasMain has_main;
-  const std::string main;
-  const HasName has_name;
-  const std::string name;
-  const PackageType type;
-
-  v8::Global<v8::Value> exports;
-};
 }  // namespace loader
 
 class Environment;
 class Realm;
 
-enum class FsStatsOffset {
-  kDev = 0,
-  kMode,
-  kNlink,
-  kUid,
-  kGid,
-  kRdev,
-  kBlkSize,
-  kIno,
-  kSize,
-  kBlocks,
-  kATimeSec,
-  kATimeNsec,
-  kMTimeSec,
-  kMTimeNsec,
-  kCTimeSec,
-  kCTimeNsec,
-  kBirthTimeSec,
-  kBirthTimeNsec,
-  kFsStatsFieldsNumber
-};
-
-// Stat fields buffers contain twice the number of entries in an uv_stat_t
-// because `fs.StatWatcher` needs room to store 2 `fs.Stats` instances.
-constexpr size_t kFsStatsBufferLength =
-    static_cast<size_t>(FsStatsOffset::kFsStatsFieldsNumber) * 2;
-
 // Disables zero-filling for ArrayBuffer allocations in this scope. This is
 // similar to how we implement Buffer.allocUnsafe() in JS land.
 class NoArrayBufferZeroFillScope {
@@ -499,9 +454,6 @@ struct DeserializeRequest {
   v8::Global<v8::Object> holder;
   int index;
   InternalFieldInfoBase* info = nullptr;  // Owned by the request
-
-  // Move constructor
-  DeserializeRequest(DeserializeRequest&& other) = default;
 };
 
 struct EnvSerializeInfo {
@@ -565,13 +517,6 @@ struct SnapshotData {
   static bool FromBlob(SnapshotData* out, FILE* in);
 
   ~SnapshotData();
-
-  SnapshotData(const SnapshotData&) = delete;
-  SnapshotData& operator=(const SnapshotData&) = delete;
-  SnapshotData(SnapshotData&&) = delete;
-  SnapshotData& operator=(SnapshotData&&) = delete;
-
-  SnapshotData() = default;
 };
 
 void DefaultProcessExitHandlerInternal(Environment* env, ExitCode exit_code);
diff --git a/src/inspector/tracing_agent.cc b/src/inspector/tracing_agent.cc
index caed5b044e86c9..cdbdd63f8aff9f 100644
--- a/src/inspector/tracing_agent.cc
+++ b/src/inspector/tracing_agent.cc
@@ -174,24 +174,27 @@ DispatchResponse TracingAgent::getCategories(
     std::unique_ptr<protocol::Array<String>>* categories) {
   *categories = Array<String>::create();
   protocol::Array<String>* categories_list = categories->get();
+  // In alphabetical order
   categories_list->addItem("node");
   categories_list->addItem("node.async_hooks");
   categories_list->addItem("node.bootstrap");
   categories_list->addItem("node.console");
   categories_list->addItem("node.dns.native");
-  categories_list->addItem("node.net.native");
   categories_list->addItem("node.environment");
-  categories_list->addItem("node.fs.sync");
-  categories_list->addItem("node.fs_dir.sync");
   categories_list->addItem("node.fs.async");
+  categories_list->addItem("node.fs.sync");
   categories_list->addItem("node.fs_dir.async");
+  categories_list->addItem("node.fs_dir.sync");
+  categories_list->addItem("node.http");
+  categories_list->addItem("node.net.native");
   categories_list->addItem("node.perf");
-  categories_list->addItem("node.perf.usertiming");
   categories_list->addItem("node.perf.timerify");
+  categories_list->addItem("node.perf.usertiming");
   categories_list->addItem("node.promises.rejections");
+  categories_list->addItem("node.threadpoolwork.async");
+  categories_list->addItem("node.threadpoolwork.sync");
   categories_list->addItem("node.vm.script");
   categories_list->addItem("v8");
-  categories_list->addItem("node.http");
   return DispatchResponse::OK();
 }
 
diff --git a/src/inspector_agent.cc b/src/inspector_agent.cc
index 3fae123ed59325..decd9f748a2775 100644
--- a/src/inspector_agent.cc
+++ b/src/inspector_agent.cc
@@ -52,7 +52,9 @@ using v8_inspector::StringView;
 using v8_inspector::V8Inspector;
 using v8_inspector::V8InspectorClient;
 
+#ifdef __POSIX__
 static uv_sem_t start_io_thread_semaphore;
+#endif  // __POSIX__
 static uv_async_t start_io_thread_async;
 // This is just an additional check to make sure start_io_thread_async
 // is not accidentally re-used or used when uninitialized.
diff --git a/src/inspector_socket.cc b/src/inspector_socket.cc
index 2c29ff04b25e69..f36682b93386a9 100644
--- a/src/inspector_socket.cc
+++ b/src/inspector_socket.cc
@@ -6,6 +6,7 @@
 
 #include "openssl/sha.h"  // Sha-1 hash
 
+#include <algorithm>
 #include <cstring>
 #include <map>
 
diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc
index 9000175d9d869a..abc9e56d6b0bbb 100644
--- a/src/js_native_api_v8.cc
+++ b/src/js_native_api_v8.cc
@@ -3254,7 +3254,7 @@ napi_status NAPI_CDECL napi_is_detached_arraybuffer(napi_env env,
   v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(arraybuffer);
 
   *result =
-      value->IsArrayBuffer() && value.As<v8::ArrayBuffer>()->Data() == nullptr;
+      value->IsArrayBuffer() && value.As<v8::ArrayBuffer>()->WasDetached();
 
   return napi_clear_last_error(env);
 }
diff --git a/src/node.cc b/src/node.cc
index dc28fb1d653f1c..fb34d3e0c2cedc 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -65,6 +65,10 @@
 #include "inspector/worker_inspector.h"  // ParentInspectorHandle
 #endif
 
+#ifdef NODE_ENABLE_VTUNE_PROFILING
+#include "../deps/v8/src/third_party/vtune/v8-vtune.h"
+#endif
+
 #include "large_pages/node_large_page.h"
 
 #if defined(__APPLE__) || defined(__linux__) || defined(_WIN32)
diff --git a/src/node_api.cc b/src/node_api.cc
index 15fe8a07f705f9..8f1e4fb0e40d4a 100644
--- a/src/node_api.cc
+++ b/src/node_api.cc
@@ -633,7 +633,7 @@ void napi_module_register_by_symbol(v8::Local<v8::Object> exports,
   // Create a new napi_env for this specific module.
   napi_env env = v8impl::NewEnv(context, module_filename);
 
-  napi_value _exports;
+  napi_value _exports = nullptr;
   env->CallIntoModule([&](napi_env env) {
     _exports = init(env, v8impl::JsValueFromV8LocalValue(exports));
   });
@@ -671,8 +671,9 @@ void NAPI_CDECL napi_module_register(napi_module* mod) {
   node::node_module_register(nm);
 }
 
-napi_status NAPI_CDECL napi_add_env_cleanup_hook(
-    napi_env env, void(NAPI_CDECL* fun)(void* arg), void* arg) {
+napi_status NAPI_CDECL napi_add_env_cleanup_hook(napi_env env,
+                                                 napi_cleanup_hook fun,
+                                                 void* arg) {
   CHECK_ENV(env);
   CHECK_ARG(env, fun);
 
@@ -681,8 +682,9 @@ napi_status NAPI_CDECL napi_add_env_cleanup_hook(
   return napi_ok;
 }
 
-napi_status NAPI_CDECL napi_remove_env_cleanup_hook(
-    napi_env env, void(NAPI_CDECL* fun)(void* arg), void* arg) {
+napi_status NAPI_CDECL napi_remove_env_cleanup_hook(napi_env env,
+                                                    napi_cleanup_hook fun,
+                                                    void* arg) {
   CHECK_ENV(env);
   CHECK_ARG(env, fun);
 
diff --git a/src/node_api.h b/src/node_api.h
index 8e6af2cf284e85..2e3a816a6c5024 100644
--- a/src/node_api.h
+++ b/src/node_api.h
@@ -208,11 +208,11 @@ napi_get_uv_event_loop(napi_env env, struct uv_loop_s** loop);
 NAPI_EXTERN napi_status NAPI_CDECL napi_fatal_exception(napi_env env,
                                                         napi_value err);
 
-NAPI_EXTERN napi_status NAPI_CDECL napi_add_env_cleanup_hook(
-    napi_env env, void(NAPI_CDECL* fun)(void* arg), void* arg);
+NAPI_EXTERN napi_status NAPI_CDECL
+napi_add_env_cleanup_hook(napi_env env, napi_cleanup_hook fun, void* arg);
 
-NAPI_EXTERN napi_status NAPI_CDECL napi_remove_env_cleanup_hook(
-    napi_env env, void(NAPI_CDECL* fun)(void* arg), void* arg);
+NAPI_EXTERN napi_status NAPI_CDECL
+napi_remove_env_cleanup_hook(napi_env env, napi_cleanup_hook fun, void* arg);
 
 NAPI_EXTERN napi_status NAPI_CDECL
 napi_open_callback_scope(napi_env env,
diff --git a/src/node_api_types.h b/src/node_api_types.h
index 4231994748a53e..9c2f03f4d09c08 100644
--- a/src/node_api_types.h
+++ b/src/node_api_types.h
@@ -6,6 +6,11 @@
 typedef struct napi_callback_scope__* napi_callback_scope;
 typedef struct napi_async_context__* napi_async_context;
 typedef struct napi_async_work__* napi_async_work;
+
+#if NAPI_VERSION >= 3
+typedef void(NAPI_CDECL* napi_cleanup_hook)(void* arg);
+#endif  // NAPI_VERSION >= 3
+
 #if NAPI_VERSION >= 4
 typedef struct napi_threadsafe_function__* napi_threadsafe_function;
 #endif  // NAPI_VERSION >= 4
diff --git a/src/node_binding.cc b/src/node_binding.cc
index fa67a45386e159..d3b0678f9c79c9 100644
--- a/src/node_binding.cc
+++ b/src/node_binding.cc
@@ -222,7 +222,7 @@ static bool libc_may_be_musl() {
   has_cached_retval = true;
   return retval;
 }
-#else  // __linux__
+#elif defined(__POSIX__)
 static bool libc_may_be_musl() { return false; }
 #endif  // __linux__
 
diff --git a/src/node_buffer.cc b/src/node_buffer.cc
index eb8e541c68635d..acec3c420ce1d2 100644
--- a/src/node_buffer.cc
+++ b/src/node_buffer.cc
@@ -24,6 +24,7 @@
 #include "node_blob.h"
 #include "node_errors.h"
 #include "node_external_reference.h"
+#include "node_i18n.h"
 #include "node_internals.h"
 
 #include "env-inl.h"
@@ -565,6 +566,48 @@ void StringSlice(const FunctionCallbackInfo<Value>& args) {
   args.GetReturnValue().Set(ret);
 }
 
+// Convert the input into an encoded string
+void DecodeUTF8(const FunctionCallbackInfo<Value>& args) {
+  Environment* env = Environment::GetCurrent(args);  // list, flags
+
+  if (!(args[0]->IsArrayBuffer() || args[0]->IsSharedArrayBuffer() ||
+        args[0]->IsArrayBufferView())) {
+    return node::THROW_ERR_INVALID_ARG_TYPE(
+        env->isolate(),
+        "The \"list\" argument must be an instance of SharedArrayBuffer, "
+        "ArrayBuffer or ArrayBufferView.");
+  }
+
+  ArrayBufferViewContents<char> buffer(args[0]);
+
+  CHECK(args[1]->IsBoolean());
+  bool ignore_bom = args[1]->IsTrue();
+
+  const char* data = buffer.data();
+  size_t length = buffer.length();
+
+  if (!ignore_bom && length >= 3) {
+    if (memcmp(data, "\xEF\xBB\xBF", 3) == 0) {
+      data += 3;
+      length -= 3;
+    }
+  }
+
+  if (length == 0) return args.GetReturnValue().SetEmptyString();
+
+  Local<Value> error;
+  MaybeLocal<Value> maybe_ret =
+      StringBytes::Encode(env->isolate(), data, length, UTF8, &error);
+  Local<Value> ret;
+
+  if (!maybe_ret.ToLocal(&ret)) {
+    CHECK(!error.IsEmpty());
+    env->isolate()->ThrowException(error);
+    return;
+  }
+
+  args.GetReturnValue().Set(ret);
+}
 
 // bytesCopied = copy(buffer, target[, targetStart][, sourceStart][, sourceEnd])
 void Copy(const FunctionCallbackInfo<Value> &args) {
@@ -1282,6 +1325,7 @@ void Initialize(Local<Object> target,
 
   SetMethod(context, target, "setBufferPrototype", SetBufferPrototype);
   SetMethodNoSideEffect(context, target, "createFromString", CreateFromString);
+  SetMethodNoSideEffect(context, target, "decodeUTF8", DecodeUTF8);
 
   SetMethodNoSideEffect(context, target, "byteLengthUtf8", ByteLengthUtf8);
   SetMethod(context, target, "copy", Copy);
@@ -1339,6 +1383,7 @@ void Initialize(Local<Object> target,
 void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
   registry->Register(SetBufferPrototype);
   registry->Register(CreateFromString);
+  registry->Register(DecodeUTF8);
 
   registry->Register(ByteLengthUtf8);
   registry->Register(Copy);
diff --git a/src/node_credentials.cc b/src/node_credentials.cc
index 115c2fc877d5cc..9bf9b2442fa99f 100644
--- a/src/node_credentials.cc
+++ b/src/node_credentials.cc
@@ -456,12 +456,12 @@ static void Initialize(Local<Object> target,
                        Local<Value> unused,
                        Local<Context> context,
                        void* priv) {
-  Environment* env = Environment::GetCurrent(context);
-  Isolate* isolate = env->isolate();
-
   SetMethod(context, target, "safeGetenv", SafeGetenv);
 
 #ifdef NODE_IMPLEMENTS_POSIX_CREDENTIALS
+  Environment* env = Environment::GetCurrent(context);
+  Isolate* isolate = env->isolate();
+
   READONLY_TRUE_PROPERTY(target, "implementsPosixCredentials");
   SetMethodNoSideEffect(context, target, "getuid", GetUid);
   SetMethodNoSideEffect(context, target, "geteuid", GetEUid);
diff --git a/src/node_errors.h b/src/node_errors.h
index 68a95835812e50..706464acc87b5c 100644
--- a/src/node_errors.h
+++ b/src/node_errors.h
@@ -60,6 +60,7 @@ void OOMErrorHandler(const char* location, const v8::OOMDetails& details);
   V(ERR_CRYPTO_JOB_INIT_FAILED, Error)                                         \
   V(ERR_DLOPEN_DISABLED, Error)                                                \
   V(ERR_DLOPEN_FAILED, Error)                                                  \
+  V(ERR_ENCODING_INVALID_ENCODED_DATA, TypeError)                              \
   V(ERR_EXECUTION_ENVIRONMENT_NOT_AVAILABLE, Error)                            \
   V(ERR_INVALID_ADDRESS, Error)                                                \
   V(ERR_INVALID_ARG_VALUE, TypeError)                                          \
diff --git a/src/node_file.cc b/src/node_file.cc
index cdfcf5bac29c3a..e7d40c40d5b6fb 100644
--- a/src/node_file.cc
+++ b/src/node_file.cc
@@ -1584,7 +1584,7 @@ int MKDirpAsync(uv_loop_t* loop,
           std::string dirname = path.substr(0,
                                             path.find_last_of(kPathSeparator));
           if (dirname != path) {
-            req_wrap->continuation_data()->PushPath(std::move(path));
+            req_wrap->continuation_data()->PushPath(path);
             req_wrap->continuation_data()->PushPath(std::move(dirname));
           } else if (req_wrap->continuation_data()->paths().size() == 0) {
             err = UV_EEXIST;
diff --git a/src/node_file.h b/src/node_file.h
index f30bd5e8a58d97..a043f8a0eaea55 100644
--- a/src/node_file.h
+++ b/src/node_file.h
@@ -13,6 +13,33 @@ namespace fs {
 
 class FileHandleReadWrap;
 
+enum class FsStatsOffset {
+  kDev = 0,
+  kMode,
+  kNlink,
+  kUid,
+  kGid,
+  kRdev,
+  kBlkSize,
+  kIno,
+  kSize,
+  kBlocks,
+  kATimeSec,
+  kATimeNsec,
+  kMTimeSec,
+  kMTimeNsec,
+  kCTimeSec,
+  kCTimeNsec,
+  kBirthTimeSec,
+  kBirthTimeNsec,
+  kFsStatsFieldsNumber
+};
+
+// Stat fields buffers contain twice the number of entries in an uv_stat_t
+// because `fs.StatWatcher` needs room to store 2 `fs.Stats` instances.
+constexpr size_t kFsStatsBufferLength =
+    static_cast<size_t>(FsStatsOffset::kFsStatsFieldsNumber) * 2;
+
 class BindingData : public SnapshotableObject {
  public:
   explicit BindingData(Environment* env, v8::Local<v8::Object> wrap);
diff --git a/src/node_http2.cc b/src/node_http2.cc
index fe66f9761d0c70..36cbb1c3f534e4 100644
--- a/src/node_http2.cc
+++ b/src/node_http2.cc
@@ -14,6 +14,10 @@
 #include "util-inl.h"
 
 #include <algorithm>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
 
 namespace node {
 
@@ -644,7 +648,7 @@ void Http2Stream::EmitStatistics() {
           duration,
           statistics_);
 
-  env()->SetImmediate([entry = move(entry)](Environment* env) {
+  env()->SetImmediate([entry = std::move(entry)](Environment* env) {
     if (HasHttp2Observer(env))
       entry->Notify(env);
   });
diff --git a/src/node_i18n.cc b/src/node_i18n.cc
index ed7b72c31f975e..441c2b32763a96 100644
--- a/src/node_i18n.cc
+++ b/src/node_i18n.cc
@@ -436,13 +436,25 @@ void ConverterObject::Create(const FunctionCallbackInfo<Value>& args) {
 void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) {
   Environment* env = Environment::GetCurrent(args);
 
-  CHECK_GE(args.Length(), 3);  // Converter, Buffer, Flags
+  CHECK_GE(args.Length(), 4);  // Converter, Buffer, Flags, Encoding
 
   ConverterObject* converter;
   ASSIGN_OR_RETURN_UNWRAP(&converter, args[0].As<Object>());
+
+  if (!(args[1]->IsArrayBuffer() || args[1]->IsSharedArrayBuffer() ||
+        args[1]->IsArrayBufferView())) {
+    return node::THROW_ERR_INVALID_ARG_TYPE(
+        env->isolate(),
+        "The \"input\" argument must be an instance of SharedArrayBuffer, "
+        "ArrayBuffer or ArrayBufferView.");
+  }
+
   ArrayBufferViewContents<char> input(args[1]);
   int flags = args[2]->Uint32Value(env->context()).ToChecked();
 
+  CHECK(args[3]->IsString());
+  Local<String> from_encoding = args[3].As<String>();
+
   UErrorCode status = U_ZERO_ERROR;
   MaybeStackBuffer<UChar> result;
 
@@ -524,14 +536,14 @@ void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) {
     Local<Value> ret;
     if (encoded.ToLocal(&ret)) {
       args.GetReturnValue().Set(ret);
-    } else {
-      args.GetReturnValue().Set(error);
+      return;
     }
-
-    return;
   }
 
-  args.GetReturnValue().Set(status);
+  node::THROW_ERR_ENCODING_INVALID_ENCODED_DATA(
+      env->isolate(),
+      "The encoded data was not valid for encoding %s",
+      *node::Utf8Value(env->isolate(), from_encoding));
 }
 
 ConverterObject::ConverterObject(
diff --git a/src/node_options.cc b/src/node_options.cc
index ce353bbcf5cbbf..7f44ed0bcd90e1 100644
--- a/src/node_options.cc
+++ b/src/node_options.cc
@@ -152,9 +152,9 @@ void EnvironmentOptions::CheckOptions(std::vector<std::string>* errors,
       errors->push_back("either --test or --interactive can be used, not both");
     }
 
-    if (watch_mode) {
-      // TODO(MoLow): Support (incremental?) watch mode within test runner
-      errors->push_back("either --test or --watch can be used, not both");
+    if (watch_mode_paths.size() > 0) {
+      errors->push_back(
+          "--watch-path cannot be used in combination with --test");
     }
 
 #ifndef ALLOW_ATTACHING_DEBUGGER_IN_TEST_RUNNER
@@ -709,6 +709,7 @@ PerIsolateOptionsParser::PerIsolateOptionsParser(
             V8Option{},
             kAllowedInEnvvar);
   AddOption("--max-old-space-size", "", V8Option{}, kAllowedInEnvvar);
+  AddOption("--max-semi-space-size", "", V8Option{}, kAllowedInEnvvar);
   AddOption("--perf-basic-prof", "", V8Option{}, kAllowedInEnvvar);
   AddOption(
       "--perf-basic-prof-only-functions", "", V8Option{}, kAllowedInEnvvar);
diff --git a/src/node_platform.cc b/src/node_platform.cc
index 6085c9487b6bf9..74ab4a3df8f09b 100644
--- a/src/node_platform.cc
+++ b/src/node_platform.cc
@@ -45,6 +45,13 @@ static void PlatformWorkerThread(void* data) {
   }
 }
 
+static int GetActualThreadPoolSize(int thread_pool_size) {
+  if (thread_pool_size < 1) {
+    thread_pool_size = uv_available_parallelism() - 1;
+  }
+  return std::max(thread_pool_size, 1);
+}
+
 }  // namespace
 
 class WorkerThreadsTaskRunner::DelayedTaskScheduler {
@@ -340,6 +347,8 @@ NodePlatform::NodePlatform(int thread_pool_size,
   // current v8::Platform instance.
   SetTracingController(tracing_controller_);
   DCHECK_EQ(GetTracingController(), tracing_controller_);
+
+  thread_pool_size = GetActualThreadPoolSize(thread_pool_size);
   worker_thread_task_runner_ =
       std::make_shared<WorkerThreadsTaskRunner>(thread_pool_size);
 }
@@ -406,7 +415,7 @@ int NodePlatform::NumberOfWorkerThreads() {
 }
 
 void PerIsolatePlatformData::RunForegroundTask(std::unique_ptr<Task> task) {
-  if (isolate_->IsExecutionTerminating()) return task->Run();
+  if (isolate_->IsExecutionTerminating()) return;
   DebugSealHandleScope scope(isolate_);
   Environment* env = Environment::GetCurrent(isolate_);
   if (env != nullptr) {
diff --git a/src/node_process_events.cc b/src/node_process_events.cc
index 944b0605b148b7..f4c39d7dd9eb68 100644
--- a/src/node_process_events.cc
+++ b/src/node_process_events.cc
@@ -92,8 +92,7 @@ Maybe<bool> ProcessEmitExperimentalWarning(Environment* env,
 
   experimental_warnings.insert(warning);
   std::string message(warning);
-  message.append(
-      " is an experimental feature. This feature could change at any time");
+  message.append(" is an experimental feature and might change at any time");
   return ProcessEmitWarningGeneric(env, message.c_str(), "ExperimentalWarning");
 }
 
diff --git a/src/node_root_certs.h b/src/node_root_certs.h
index 1fbec584b6a7b2..2eb13a1dcf92ce 100644
--- a/src/node_root_certs.h
+++ b/src/node_root_certs.h
@@ -21,28 +21,6 @@
 "HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n"
 "-----END CERTIFICATE-----",
 
-/* GlobalSign Root CA - R2 */
-"-----BEGIN CERTIFICATE-----\n"
-"MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMX\n"
-"R2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMT\n"
-"Ckdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQL\n"
-"ExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UE\n"
-"AxMKR2xvYmFsU2lnbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8o\n"
-"mUVCxKs+IVSbC9N/hHD6ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7\n"
-"SqbKSaZeqKeMWhG8eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQ\n"
-"BoZfXklqtTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd\n"
-"C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feq\n"
-"CapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8E\n"
-"BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IHV2ccHsBqBt5ZtJot39wZhi4w\n"
-"NgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxzaWduLm5ldC9yb290LXIyLmNy\n"
-"bDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEA\n"
-"mYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkI\n"
-"k7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRD\n"
-"LenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd\n"
-"AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7TBj0/VLZ\n"
-"jmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n"
-"-----END CERTIFICATE-----",
-
 /* Entrust.net Premium 2048 Secure Server CA */
 "-----BEGIN CERTIFICATE-----\n"
 "MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVz\n"
@@ -364,26 +342,6 @@
 "yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K\n"
 "-----END CERTIFICATE-----",
 
-/* DST Root CA X3 */
-"-----BEGIN CERTIFICATE-----\n"
-"MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYD\n"
-"VQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENB\n"
-"IFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRh\n"
-"bCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJ\n"
-"KoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdA\n"
-"wRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwG\n"
-"MoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4X\n"
-"Lh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw\n"
-"7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkq\n"
-"tilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw\n"
-"HQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiyb\n"
-"FwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR\n"
-"6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaL\n"
-"bumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir\n"
-"/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06Xyx\n"
-"V3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\n"
-"-----END CERTIFICATE-----",
-
 /* SwissSign Gold CA - G2 */
 "-----BEGIN CERTIFICATE-----\n"
 "MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNI\n"
@@ -578,28 +536,6 @@
 "vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\n"
 "-----END CERTIFICATE-----",
 
-/* Cybertrust Global Root */
-"-----BEGIN CERTIFICATE-----\n"
-"MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMP\n"
-"Q3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2\n"
-"MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5j\n"
-"MR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC\n"
-"AQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO2\n"
-"1O1fWLE3TdVJDm71aofW0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2O\n"
-"lTEQXO2iLb3VOm2yHLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeW\n"
-"P032a7iPt3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz\n"
-"FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQID\n"
-"AQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2\n"
-"CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJs\n"
-"aWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8GA1UdIwQYMBaAFLYIew16zKwgTIZW\n"
-"Ml7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ej\n"
-"hVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24C\n"
-"JJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+z\n"
-"v+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc\n"
-"A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jWWL1WMRJO\n"
-"Ecgh4LMRkWXbtKaIOM5V\n"
-"-----END CERTIFICATE-----",
-
 /* ePKI Root Certification Authority */
 "-----BEGIN CERTIFICATE-----\n"
 "MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYD\n"
@@ -1074,30 +1010,6 @@
 "Un/10asIbvPuW/mIPX64b24D5EI=\n"
 "-----END CERTIFICATE-----",
 
-/* Hellenic Academic and Research Institutions RootCA 2011 */
-"-----BEGIN CERTIFICATE-----\n"
-"MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNV\n"
-"BAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4g\n"
-"QXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5z\n"
-"dGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1Mlow\n"
-"gZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFy\n"
-"Y2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNh\n"
-"ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZI\n"
-"hvcNAQEBBQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz\n"
-"dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0a\n"
-"e50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsm\n"
-"LIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD75O6aRXxYp2fmTmCobd0LovU\n"
-"xQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH3N6sQWRstBmbAmNtJGSPRLIl6s5d\n"
-"dAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNV\n"
-"HQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUw\n"
-"BoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3\n"
-"DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p\n"
-"6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8TqBTnbI6\n"
-"nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD/md9\n"
-"zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N\n"
-"7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4\n"
-"-----END CERTIFICATE-----",
-
 /* Actalis Authentication Root CA */
 "-----BEGIN CERTIFICATE-----\n"
 "MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQx\n"
@@ -1743,19 +1655,6 @@
 "qZtNyWHa0V1Xahg=\n"
 "-----END CERTIFICATE-----",
 
-/* GlobalSign ECC Root CA - R4 */
-"-----BEGIN CERTIFICATE-----\n"
-"MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UE\n"
-"CxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMw\n"
-"EQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEk\n"
-"MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxT\n"
-"aWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5\n"
-"049sJQ6fLjkZHAOkrprlOQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5Rikqtlx\n"
-"P6jUuc6MHaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\n"
-"FFSwe61FuOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX\n"
-"kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=\n"
-"-----END CERTIFICATE-----",
-
 /* GlobalSign ECC Root CA - R5 */
 "-----BEGIN CERTIFICATE-----\n"
 "MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UE\n"
@@ -2483,94 +2382,6 @@
 "i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9\n"
 "-----END CERTIFICATE-----",
 
-/* GTS Root R1 */
-"-----BEGIN CERTIFICATE-----\n"
-"MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYD\n"
-"VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxML\n"
-"R1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQG\n"
-"EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RT\n"
-"IFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+U\n"
-"PreVp0A8of2C+X0yBoJx9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeq\n"
-"Uqv4IyfLpLGcY9vXmX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g\n"
-"4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P\n"
-"fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVs\n"
-"rBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3\n"
-"+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmkMiVOKvFlRNACzqrOSbTq\n"
-"n3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1AK/1TD7Cn1TsNsYqiA94xrcx3\n"
-"6m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqgh\n"
-"tqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB\n"
-"2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n"
-"/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW\n"
-"Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1d5iyfNm9\n"
-"dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73svfuo2\n"
-"1pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm\n"
-"ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL0\n"
-"7q9bgsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdlj\n"
-"UEn2NIVq4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0d\n"
-"zpqPJeaAcWErtXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwl\n"
-"fnuzCdyyF62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9\n"
-"SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQ\n"
-"cu51OyLemGhmW/HGY0dVHLqlCFF1pkgl\n"
-"-----END CERTIFICATE-----",
-
-/* GTS Root R2 */
-"-----BEGIN CERTIFICATE-----\n"
-"MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYD\n"
-"VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxML\n"
-"R1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQG\n"
-"EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RT\n"
-"IFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZa\n"
-"bFn3GTXd98GdVarTzTukk3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+\n"
-"cnfgLFuv5AS/T3KgGjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJ\n"
-"k9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd\n"
-"re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9Rh\n"
-"D1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1\n"
-"E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8YzodDqs5xoic4DSMPclQsci\n"
-"OzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9qS34BIbIjMt/kmkRtWVtd9QCg\n"
-"HJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W\n"
-"+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/U\n"
-"VKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n"
-"/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp\n"
-"8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JTvhaI8dI4\n"
-"XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ+YF5\n"
-"9exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw\n"
-"c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SL\n"
-"A3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvp\n"
-"x0QnRY5rn/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Y\n"
-"u5UC56GtmwfuNmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOb\n"
-"oB6BAFDC5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF\n"
-"izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxg\n"
-"XS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC\n"
-"-----END CERTIFICATE-----",
-
-/* GTS Root R3 */
-"-----BEGIN CERTIFICATE-----\n"
-"MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQG\n"
-"EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RT\n"
-"IFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJV\n"
-"UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv\n"
-"b3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1M\n"
-"J7x/JlFyb+Kf1qPKzEUURout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx\n"
-"1WyRRK2EE46ajA2ADDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/\n"
-"MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk\n"
-"fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUl\n"
-"UfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd\n"
-"-----END CERTIFICATE-----",
-
-/* GTS Root R4 */
-"-----BEGIN CERTIFICATE-----\n"
-"MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQG\n"
-"EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RT\n"
-"IFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJV\n"
-"UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv\n"
-"b3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5G\n"
-"vWvVYRg1rkDdc/eJkTBa6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRl\n"
-"BtHci8nHc8iMai/lxKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/\n"
-"MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0\n"
-"CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG\n"
-"7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w==\n"
-"-----END CERTIFICATE-----",
-
 /* UCA Global G2 Root */
 "-----BEGIN CERTIFICATE-----\n"
 "MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYD\n"
@@ -3243,4 +3054,478 @@
 "qsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygNnxS2PFOiTAZpffpskcYqSUXm\n"
 "7LcT4Tps\n"
 "-----END CERTIFICATE-----",
+
+/* Autoridad de Certificacion Firmaprofesional CIF A62634068 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMx\n"
+"QjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwg\n"
+"Q0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNV\n"
+"BAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zl\n"
+"c2lvbmFsIENJRiBBNjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDK\n"
+"lmuO6vj78aI14H9M2uDDUtd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOS\n"
+"L/UR5GLXMnE42QQMcas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9\n"
+"qFD0sefGL9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i\n"
+"NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2\n"
+"f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44\n"
+"I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCyZ/QYFpM6/EfY0XiWMR+6Kwxf\n"
+"XZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy\n"
+"9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF\n"
+"8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mV\n"
+"BngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4A\n"
+"Pn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd\n"
+"IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5jb20vY3Bz\n"
+"MFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4AbwB2\n"
+"AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC\n"
+"AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fg\n"
+"PiDL4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6\n"
+"kN/oGbDbLIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg\n"
+"4MSPi3i1O1ilI45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX\n"
+"2lSX3xZEEAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV\n"
+"1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2eb\n"
+"KHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU\n"
+"72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTm\n"
+"VXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RB\n"
+"VuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqEZycPvEJdvSRUDewdcAZfpLz6IHxV\n"
+"-----END CERTIFICATE-----",
+
+/* vTrus ECC Root CA */
+"-----BEGIN CERTIFICATE-----\n"
+"MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkG\n"
+"A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVz\n"
+"IEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UE\n"
+"BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVD\n"
+"QyBSb290IENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9\n"
+"JpRCux3NCNtzslt188+cToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A\n"
+"2MMrMudwpremIFUde4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHb\n"
+"H88wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw\n"
+"V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPG\n"
+"nlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEGGJTO\n"
+"-----END CERTIFICATE-----",
+
+/* vTrus Root CA */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzEL\n"
+"MAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZU\n"
+"cnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQG\n"
+"EwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9v\n"
+"dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB\n"
+"6ksDXhA/kFocizuwZotsSKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoR\n"
+"uBLpDLvPbmyAhykUAyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6W\n"
+"TEN+VRS+GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9\n"
+"8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZN\n"
+"O7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9\n"
+"Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7o\n"
+"NOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu/9ROutW04o5IWgAZCfEF2c6Rsffr\n"
+"6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwX\n"
+"C1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1Bk\n"
+"LFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNV\n"
+"HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet\n"
+"8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWdnxEt/Hlk\n"
+"3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjrjld2\n"
+"2VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4\n"
+"8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8\n"
+"sHJnxDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVT\n"
+"sMo554WgicEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7I\n"
+"dMakLXogqzu4sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9\n"
+"mK5S4fNBUvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P\n"
+"Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy\n"
+"6K2ir40zSbofitzmdHxghm+Hl3s=\n"
+"-----END CERTIFICATE-----",
+
+/* ISRG Root X2 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQG\n"
+"EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNV\n"
+"BAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJ\n"
+"BgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEV\n"
+"MBMGA1UEAxMMSVNSRyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJ\n"
+"SvMWSj5cz3es3mcFDR0HttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvX\n"
+"RdgKam7mAHf7AlF9ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYw\n"
+"DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI\n"
+"zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQav\n"
+"Ei51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tb\n"
+"FfLn\n"
+"-----END CERTIFICATE-----",
+
+/* HiPKI Root CA - G1 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYD\n"
+"VQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMM\n"
+"EkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8x\n"
+"CzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkG\n"
+"A1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC\n"
+"AgEA9B5/UnMyDHPkvRN0o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6\n"
+"zCFovkRTv4354twvVcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY2\n"
+"9yTw1S+6lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz\n"
+"Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj\n"
+"2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7U\n"
+"TuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM\n"
+"+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K49a6SsvfhhEvyovKTmiKe0xRvNlS9\n"
+"H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09b\n"
+"A8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaX\n"
+"xA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB\n"
+"/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG\n"
+"SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi7zNKpiMd\n"
+"Dg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSltJcz\n"
+"WNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE\n"
+"wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Ll\n"
+"l07QJNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+Em\n"
+"BYTksMCv5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFef\n"
+"Q05rLisY+GpzjLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1\n"
+"/k6fi8wrkkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+\n"
+"vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBV\n"
+"LuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ==\n"
+"-----END CERTIFICATE-----",
+
+/* GlobalSign ECC Root CA - R4 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtH\n"
+"bG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNV\n"
+"BAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYD\n"
+"VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24x\n"
+"EzARBgNVBAMTCkdsb2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wl\n"
+"Dp8uORkcA6SumuU5BwkWymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5\n"
+"zowdo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7\n"
+"rUW44kB/+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147\n"
+"bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm\n"
+"-----END CERTIFICATE-----",
+
+/* GTS Root R1 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG\n"
+"EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RT\n"
+"IFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJV\n"
+"UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv\n"
+"b3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreV\n"
+"p0A8of2C+X0yBoJx9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4\n"
+"IyfLpLGcY9vXmX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/S\n"
+"CYe7zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl\n"
+"qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQ\n"
+"f4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH\n"
+"+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yD\n"
+"sEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97\n"
+"PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmx\n"
+"lbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACY\n"
+"PTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAd\n"
+"BgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb\n"
+"C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEeQkEzCzc9\n"
+"zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRiClmp\n"
+"IgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar\n"
+"J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlH\n"
+"xYciNuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/b\n"
+"al8xa5meLMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAb\n"
+"d03OIozUhfJFfbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLs\n"
+"QBqvFAnZ0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm\n"
+"2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJw\n"
+"NQzcmRk13NfIRmPVNnGuV/u3gm3c\n"
+"-----END CERTIFICATE-----",
+
+/* GTS Root R2 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG\n"
+"EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RT\n"
+"IFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJV\n"
+"UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv\n"
+"b3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3\n"
+"GTXd98GdVarTzTukk3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfg\n"
+"LFuv5AS/T3KgGjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/B\n"
+"W9BuXvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k\n"
+"RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FL\n"
+"PD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66H\n"
+"jucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8YzodDqs5xoic4DSMPclQsciOzsS\n"
+"rZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvG\n"
+"eJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9Om\n"
+"TN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGF\n"
+"PP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAd\n"
+"BgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H\n"
+"vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM80mJhwQTt\n"
+"zuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxhswWV\n"
+"7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel\n"
+"/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTol\n"
+"UVVnjWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFe\n"
+"nTgCR2y59PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGo\n"
+"o7z7GJa7Um8M7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCM\n"
+"Elv924SgJPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV\n"
+"7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7Y\n"
+"TVWW4tAR+kg0Eeye7QUd5MjWHYbL\n"
+"-----END CERTIFICATE-----",
+
+/* GTS Root R3 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV\n"
+"UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv\n"
+"b3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEi\n"
+"MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg\n"
+"UjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/\n"
+"JlFyb+Kf1qPKzEUURout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyR\n"
+"RK2EE46ajA2ADDL24CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0G\n"
+"A1UdDgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7\n"
+"VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD\n"
+"3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X\n"
+"-----END CERTIFICATE-----",
+
+/* GTS Root R4 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV\n"
+"UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv\n"
+"b3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEi\n"
+"MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg\n"
+"UjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvV\n"
+"YRg1rkDdc/eJkTBa6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHc\n"
+"i8nHc8iMai/lxKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0G\n"
+"A1UdDgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D\n"
+"9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh\n"
+"1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD\n"
+"-----END CERTIFICATE-----",
+
+/* Telia Root CA v2 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNV\n"
+"BAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9v\n"
+"dCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJ\n"
+"MRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2\n"
+"MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8\n"
+"gm2h/oFlH0wnrI4AuhZ76zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfi\n"
+"KDOlyzG4OiIjNLh9vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW\n"
+"/q/5iaq9lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD\n"
+"n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3M\n"
+"aRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjd\n"
+"scr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPCTEPlcDaMtjNXepUugqD0XBCz\n"
+"YYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG\n"
+"6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4c\n"
+"J7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1\n"
+"K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1Ud\n"
+"DgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\n"
+"AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ8rKJhGdE\n"
+"r7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5tFJ3\n"
+"gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H\n"
+"eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRn\n"
+"De+Cy748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8\n"
+"YVMJAygCQMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitE\n"
+"ZU61/Qrowc15h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBq\n"
+"nUsvWHMtTy3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT\n"
+"VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8\n"
+"e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc=\n"
+"-----END CERTIFICATE-----",
+
+/* D-TRUST BR Root CA 1 2020 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQG\n"
+"EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3Qg\n"
+"Q0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMC\n"
+"REUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENB\n"
+"IDEgMjAyMDB2MBAGByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE\n"
+"1HaTJddZO0Flax7mNCq7dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJ\n"
+"GT11NIXe7WB9xwy0QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\n"
+"FHOREKv/VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g\n"
+"PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8y\n"
+"MDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNU\n"
+"JTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1c3QlMjBHbWJILEM9REU/Y2Vy\n"
+"dGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQDAwNpADBmAjEAlJAtE/rhY/hhY+it\n"
+"hXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SU\n"
+"eho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87\n"
+"-----END CERTIFICATE-----",
+
+/* D-TRUST EV Root CA 1 2020 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQG\n"
+"EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3Qg\n"
+"Q0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMC\n"
+"REUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENB\n"
+"IDEgMjAyMDB2MBAGByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL\n"
+"46bSj8WeeHsxiamJrSc8ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3Vl\n"
+"SSowZ/Rk99Yad9rDwpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\n"
+"FH8QARY3OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g\n"
+"PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8y\n"
+"MDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNU\n"
+"JTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1c3QlMjBHbWJILEM9REU/Y2Vy\n"
+"dGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQDAwNpADBmAjEAyjzGKnXCXnViOTYA\n"
+"YFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvA\n"
+"KQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW\n"
+"-----END CERTIFICATE-----",
+
+/* DigiCert TLS ECC P384 Root G5 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQG\n"
+"EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBF\n"
+"Q0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkG\n"
+"A1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBU\n"
+"TFMgRUNDIFAzODQgUm9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOC\n"
+"NQfN0MsYndLxf3c1TzvdlHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cK\n"
+"PGEQQil8pQgO4CLp0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7n\n"
+"LFr6ICISB4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49\n"
+"BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaR\n"
+"nUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeW\n"
+"UA==\n"
+"-----END CERTIFICATE-----",
+
+/* DigiCert TLS RSA4096 Root G5 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYD\n"
+"VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRM\n"
+"UyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQsw\n"
+"CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0\n"
+"IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz\n"
+"0PTJeRGd/fxmgefM1eS87IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLl\n"
+"vevxGs3npAOpPxG02C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUT\n"
+"mDKdFqgpwgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM\n"
+"pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN\n"
+"1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0\n"
+"KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDxZre3zu/O7Oyldcqs4+Fj97ih\n"
+"BMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvyz6b84xQslpghjLSR6Rlgg/IwKwZz\n"
+"UNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGP\n"
+"hvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUM\n"
+"CUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfT\n"
+"Jc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN\n"
+"AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxwGXIeo8mH\n"
+"/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShNlnx2\n"
+"xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN\n"
+"MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTur\n"
+"WGT/u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vS\n"
+"dPD3Rh9GOUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V\n"
+"77PnSIMx8IIh47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP\n"
+"//fx4ilwMUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF\n"
+"qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWF\n"
+"JqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+\n"
+"-----END CERTIFICATE-----",
+
+/* Certainly Root R1 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkG\n"
+"A1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3Qg\n"
+"UjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAG\n"
+"A1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZI\n"
+"hvcNAQEBBQADggIPADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WN\n"
+"pIGD2ngwEc/csiu+kr+O5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S\n"
+"98zTm/mLvg7fMbedaFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM61\n"
+"0rCrm/b01C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5\n"
+"r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1Hp\n"
+"yTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8\n"
+"y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNu\n"
+"nLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OW\n"
+"zaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31\n"
+"C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGj\n"
+"QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9E\n"
+"XME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr\n"
+"PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d8VkswTOl\n"
+"MIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4vMMM2\n"
+"SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB\n"
+"GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDY\n"
+"T3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7\n"
+"pw0WwfgHJBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9\n"
+"Hb4DJqPb1OG7fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUz\n"
+"VounmdLyyCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n\n"
+"wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalB\n"
+"WQewLK8=\n"
+"-----END CERTIFICATE-----",
+
+/* Certainly Root E1 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQG\n"
+"EwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAe\n"
+"Fw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQK\n"
+"EwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYF\n"
+"K4EEACIDYgAE3m/4fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQY\n"
+"UBsQ3tA3SybHGWCA6TS9YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0Iw\n"
+"QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq\n"
+"6+2uI1g4hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm\n"
+"ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRI\n"
+"Nzf43TNRnXCve1XYAS59BWQOhriR\n"
+"-----END CERTIFICATE-----",
+
+/* E-Tugra Global Root CA RSA v3 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQELBQAwgYAx\n"
+"CzAJBgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEu\n"
+"Uy4xHTAbBgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEds\n"
+"b2JhbCBSb290IENBIFJTQSB2MzAeFw0yMDAzMTgwOTA3MTdaFw00NTAzMTIwOTA3MTdaMIGA\n"
+"MQswCQYDVQQGEwJUUjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBB\n"
+"LlMuMR0wGwYDVQQLExRFLVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBH\n"
+"bG9iYWwgUm9vdCBDQSBSU0EgdjMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCi\n"
+"ZvCJt3J77gnJY9LTQ91ew6aEOErxjYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscx\n"
+"uj7X/iWpKo429NEvx7epXTPcMHD4QGxLsqYxYdE0PD0xesevxKenhOGXpOhL9hd87jwH7eKK\n"
+"V9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF/YP9f4RtNGx/ardLAQO/rWm31zLZ9Vdq6YaC\n"
+"PqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8qQedmCeFLl+d3vSFtKbZnwy1+7dZ5ZdHP\n"
+"OrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bGwzrwbMOLyKSRBfP12baqBqG3q+Sx6iEU\n"
+"XIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4znKS4iicvObpCdg604nmvi533wEKb5b25Y08TVJ2\n"
+"Glbhc34XrD2tbKNSEhhw5oBOM/J+JjKsBY04pOZ2PJ8QaQ5tndLBeSBrW88zjdGUdjXnXVXH\n"
+"t6woq0bM5zshtQoK5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiMbIedBi3x7+PmBvrF\n"
+"ZhNb/FAHnnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbgh3cXTJ2w2Amo\n"
+"DVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8G\n"
+"A1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSytK7mLfcm1ap1LXZL\n"
+"wBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAImocn+M684uGMQQ\n"
+"gC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9\n"
+"emN438o2Fi+CiJ+8EUdPdk3ILY7r3y18Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+Q\n"
+"LHUWnw/qln0F7psTpURs+APQ3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1\n"
+"bZL0SmFQhO3sSdPkvmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CG\n"
+"q+ffCsn99t2HVhjYsCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQ\n"
+"mhty3QUBjYZgv6Rn7rWlDdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YAVSgU7NbH\n"
+"EqIbZULpkejLPoeJVF3Zr52XnGnnCv8PWniLYypMfUeUP95L6VPQMPHF9p5J3zugkaOj/s1Y\n"
+"zOrfr28oO6Bpm4/srK4rVJ2bBLFHIK+WEj5jlB0E5y67hscMmoi/dkfv97ALl2bSRM9gUgfh\n"
+"1SxKOidhd8rXj+eHDjD/DLsE4mHDosiXYY60MGo8bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP\n"
+"3Qt6f4ueJiDPO++BcYNZ\n"
+"-----END CERTIFICATE-----",
+
+/* E-Tugra Global Root CA ECC v3 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJ\n"
+"BgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4x\n"
+"HTAbBgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2Jh\n"
+"bCBSb290IENBIEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQsw\n"
+"CQYDVQQGEwJUUjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMu\n"
+"MR0wGwYDVQQLExRFLVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9i\n"
+"YWwgUm9vdCBDQSBFQ0MgdjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8wo\n"
+"LNheSBkQKczLWYHMjLiSF4mDKpL2w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YK\n"
+"fWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYD\n"
+"VR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQzPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGw\n"
+"UYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZ\n"
+"CL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4WAie3AjEA3VoXK3YdZUKWpqxdinlW\n"
+"2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3\n"
+"-----END CERTIFICATE-----",
+
+/* Security Communication RootCA3 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQ\n"
+"MSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1\n"
+"cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYx\n"
+"NzE2WjBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4s\n"
+"TFRELjEnMCUGA1UEAxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkq\n"
+"hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltz\n"
+"kBtnTCHsXzW7OT4rCmDvu20rhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOz\n"
+"QD11EKzAlrenfna84xtSGc4RHwsENPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MG\n"
+"TfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH\n"
+"7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGmnpjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e\n"
+"4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtYXLVqAvO4g160a75BflcJdURQVc1aEWEh\n"
+"CmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPKp7FKFSBWFHA9K4IsD50VHUeAR/94\n"
+"mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC3PsXuKHqy6C0rtOUfnrQq8Ps\n"
+"OC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOfGAN0iltSIEdrRU0id4xV\n"
+"J/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0VcwCBEF/VfR2ccCAwEA\n"
+"AaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB/wQEAwIBBjAP\n"
+"BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybSYpOnpSNy\n"
+"ByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHuTofj\n"
+"can0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O\n"
+"H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn\n"
+"2ASxYfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQD\n"
+"dwj98ClZXSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO\n"
+"0QR4ynKudtml+LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU\n"
+"1cXrvMUVnuiZIesnKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD\n"
+"2NCcnWXL0CsnMQMeNuE9dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAu\n"
+"c1Uh6N//g7kdPjIe1qZ9LPFm6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR\n"
+"16/9M51NZg==\n"
+"-----END CERTIFICATE-----",
+
+/* Security Communication ECC RootCA1 */
+"-----BEGIN CERTIFICATE-----\n"
+"MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUw\n"
+"IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0\n"
+"eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1\n"
+"MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08u\n"
+"LExURC4xKzApBgNVBAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQ\n"
+"BgcqhkjOPQIBBgUrgQQAIgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPp\n"
+"R27KkBLIE+CnnfdldB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8Ekdt\n"
+"XP9JTxpKULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E\n"
+"BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie\n"
+"9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjg\n"
+"UMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k=\n"
+"-----END CERTIFICATE-----",
 #endif  // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
diff --git a/src/node_version.h b/src/node_version.h
index fb87f835470b29..356ab2bf73c852 100644
--- a/src/node_version.h
+++ b/src/node_version.h
@@ -23,13 +23,13 @@
 #define SRC_NODE_VERSION_H_
 
 #define NODE_MAJOR_VERSION 19
-#define NODE_MINOR_VERSION 1
-#define NODE_PATCH_VERSION 1
+#define NODE_MINOR_VERSION 2
+#define NODE_PATCH_VERSION 0
 
 #define NODE_VERSION_IS_LTS 0
 #define NODE_VERSION_LTS_CODENAME ""
 
-#define NODE_VERSION_IS_RELEASE 0
+#define NODE_VERSION_IS_RELEASE 1
 
 #ifndef NODE_STRINGIFY
 #define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n)
diff --git a/test/.eslintrc.yaml b/test/.eslintrc.yaml
index b79009fb9c8591..b0a648738eb086 100644
--- a/test/.eslintrc.yaml
+++ b/test/.eslintrc.yaml
@@ -8,6 +8,7 @@ rules:
   multiline-comment-style: [error, separate-lines]
   prefer-const: error
   symbol-description: off
+  comma-dangle: [error, always-multiline]
 
   no-restricted-syntax:
     # Config copied from .eslintrc.js
@@ -68,3 +69,27 @@ rules:
 # Global scoped methods and vars
 globals:
   WebAssembly: false
+
+overrides:
+  - files:
+      - es-module/*.js
+      - es-module/*.mjs
+      - internet/*.js
+      - js-native-api/*/*.js
+      - known_issues/*.js
+      - message/*.js
+      - node-api/*/*.js
+      - parallel/*.js
+      - parallel/*.mjs
+      - pseudo-tty/*.js
+      - pummel/*.js
+      - sequential/*.js
+      - sequential/*.mjs
+    rules:
+      comma-dangle: [error, {
+        arrays: always-multiline,
+        exports: only-multiline,
+        functions: only-multiline,
+        imports: only-multiline,
+        objects: only-multiline,
+      }]
diff --git a/test/addons/async-hooks-id/test.js b/test/addons/async-hooks-id/test.js
index c6ce366c5de756..fd4a88c29f6076 100644
--- a/test/addons/async-hooks-id/test.js
+++ b/test/addons/async-hooks-id/test.js
@@ -7,20 +7,20 @@ const async_hooks = require('async_hooks');
 
 assert.strictEqual(
   binding.getExecutionAsyncId(),
-  async_hooks.executionAsyncId()
+  async_hooks.executionAsyncId(),
 );
 assert.strictEqual(
   binding.getTriggerAsyncId(),
-  async_hooks.triggerAsyncId()
+  async_hooks.triggerAsyncId(),
 );
 
 process.nextTick(common.mustCall(() => {
   assert.strictEqual(
     binding.getExecutionAsyncId(),
-    async_hooks.executionAsyncId()
+    async_hooks.executionAsyncId(),
   );
   assert.strictEqual(
     binding.getTriggerAsyncId(),
-    async_hooks.triggerAsyncId()
+    async_hooks.triggerAsyncId(),
   );
 }));
diff --git a/test/addons/async-resource/test.js b/test/addons/async-resource/test.js
index c37d4df83d0103..86cbb38e1cf2df 100644
--- a/test/addons/async-resource/test.js
+++ b/test/addons/async-resource/test.js
@@ -38,7 +38,7 @@ async_hooks.createHook({
 
   destroy(id) {
     if (bindingUids.includes(id)) destroy++;
-  }
+  },
 }).enable();
 
 for (const call of [binding.callViaFunction,
@@ -53,7 +53,7 @@ for (const call of [binding.callViaFunction,
         assert.strictEqual(async_hooks.executionAsyncId(), uid);
         return 'baz';
       },
-      kObjectTag
+      kObjectTag,
     };
 
     if (passedTriggerId === undefined)
diff --git a/test/addons/callback-scope/test-async-hooks.js b/test/addons/callback-scope/test-async-hooks.js
index 94b53efc53d78e..3c276ce00ff482 100644
--- a/test/addons/callback-scope/test-async-hooks.js
+++ b/test/addons/callback-scope/test-async-hooks.js
@@ -14,7 +14,7 @@ async_hooks.createHook({
   after: common.mustCall((id) => {
     assert.strictEqual(id, 1000);
     insideHook = false;
-  })
+  }),
 }).enable();
 
 runInCallbackScope({}, 1000, 1000, () => {
diff --git a/test/addons/no-addons/test-worker.js b/test/addons/no-addons/test-worker.js
index 2a89cef3e2736d..25e893ca33aea7 100644
--- a/test/addons/no-addons/test-worker.js
+++ b/test/addons/no-addons/test-worker.js
@@ -13,7 +13,7 @@ const assertError = (error) => {
   assert.strictEqual(error.code, 'ERR_DLOPEN_DISABLED');
   assert.strictEqual(
     error.message,
-    'Cannot load native addon because loading addons is disabled.'
+    'Cannot load native addon because loading addons is disabled.',
   );
 };
 
@@ -32,7 +32,7 @@ const assertError = (error) => {
     `process.dlopen({ exports: {} }, ${JSON.stringify(binding)});`,
     {
       eval: true,
-    }
+    },
   );
 
   worker.on('error', common.mustCall(assertError));
diff --git a/test/addons/no-addons/test.js b/test/addons/no-addons/test.js
index 063dd3491e36fc..485fad4a8bc643 100644
--- a/test/addons/no-addons/test.js
+++ b/test/addons/no-addons/test.js
@@ -12,7 +12,7 @@ const assertError = (error) => {
   assert.strictEqual(error.code, 'ERR_DLOPEN_DISABLED');
   assert.strictEqual(
     error.message,
-    'Cannot load native addon because loading addons is disabled.'
+    'Cannot load native addon because loading addons is disabled.',
   );
 };
 
diff --git a/test/addons/non-node-context/test-make-buffer.js b/test/addons/non-node-context/test-make-buffer.js
index d134f63b77283c..344ea973d76c0c 100644
--- a/test/addons/non-node-context/test-make-buffer.js
+++ b/test/addons/non-node-context/test-make-buffer.js
@@ -3,7 +3,7 @@
 const common = require('../../common');
 const assert = require('assert');
 const {
-  makeBufferInNewContext
+  makeBufferInNewContext,
 } = require(`./build/${common.buildType}/binding`);
 
 // Because the `Buffer` function and its protoype property only (currently)
@@ -19,5 +19,5 @@ assert.throws(
     assert.strictEqual(exception.message,
                        'Buffer is not available for the current Context');
     return true;
-  }
+  },
 );
diff --git a/test/addons/openssl-client-cert-engine/test.js b/test/addons/openssl-client-cert-engine/test.js
index e843e4bf433bff..648600c99cd852 100644
--- a/test/addons/openssl-client-cert-engine/test.js
+++ b/test/addons/openssl-client-cert-engine/test.js
@@ -26,7 +26,7 @@ const serverOptions = {
   cert: agentCert,
   ca: agentCa,
   requestCert: true,
-  rejectUnauthorized: true
+  rejectUnauthorized: true,
 };
 
 const server = https.createServer(serverOptions, common.mustCall((req, res) => {
@@ -40,7 +40,7 @@ const server = https.createServer(serverOptions, common.mustCall((req, res) => {
     path: '/test',
     clientCertEngine: engine,  // `engine` will provide key+cert
     rejectUnauthorized: false, // Prevent failing on self-signed certificates
-    headers: {}
+    headers: {},
   };
 
   const req = https.request(clientOptions, common.mustCall((response) => {
diff --git a/test/addons/openssl-key-engine/test.js b/test/addons/openssl-key-engine/test.js
index 2cd7ddabc17095..58885e46728788 100644
--- a/test/addons/openssl-key-engine/test.js
+++ b/test/addons/openssl-key-engine/test.js
@@ -26,7 +26,7 @@ const serverOptions = {
   cert: agentCert,
   ca: agentCa,
   requestCert: true,
-  rejectUnauthorized: true
+  rejectUnauthorized: true,
 };
 
 const server = https.createServer(serverOptions, common.mustCall((req, res) => {
@@ -42,7 +42,7 @@ const server = https.createServer(serverOptions, common.mustCall((req, res) => {
     privateKeyIdentifier: 'dummykey',
     cert: agentCert,
     rejectUnauthorized: false, // Prevent failing on self-signed certificates
-    headers: {}
+    headers: {},
   };
 
   const req = https.request(clientOptions, common.mustCall((response) => {
diff --git a/test/addons/repl-domain-abort/test.js b/test/addons/repl-domain-abort/test.js
index f8e70ffce96e45..8d148432c31c21 100644
--- a/test/addons/repl-domain-abort/test.js
+++ b/test/addons/repl-domain-abort/test.js
@@ -63,7 +63,7 @@ const options = {
   input: dInput,
   output: dOutput,
   terminal: false,
-  ignoreUndefined: true
+  ignoreUndefined: true,
 };
 
 // Run commands from fake REPL.
diff --git a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-ascii.js b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-ascii.js
index 024ba28aba04e0..6aff044519567e 100644
--- a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-ascii.js
+++ b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-ascii.js
@@ -32,5 +32,5 @@ assert.throws(() => {
   message: `Cannot create a string longer than 0x${stringLengthHex} ` +
            'characters',
   code: 'ERR_STRING_TOO_LONG',
-  name: 'Error'
+  name: 'Error',
 });
diff --git a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-base64.js b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-base64.js
index 20137636024987..7c8e2d92c6a4db 100644
--- a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-base64.js
+++ b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-base64.js
@@ -32,5 +32,5 @@ assert.throws(() => {
   message: `Cannot create a string longer than 0x${stringLengthHex} ` +
            'characters',
   code: 'ERR_STRING_TOO_LONG',
-  name: 'Error'
+  name: 'Error',
 });
diff --git a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-binary.js b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-binary.js
index 1ad04dc652873a..176c095e22e2ee 100644
--- a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-binary.js
+++ b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-binary.js
@@ -33,7 +33,7 @@ assert.throws(() => {
   message: `Cannot create a string longer than 0x${stringLengthHex} ` +
            'characters',
   code: 'ERR_STRING_TOO_LONG',
-  name: 'Error'
+  name: 'Error',
 });
 
 // FIXME: Free the memory early to avoid OOM.
diff --git a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-hex.js b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-hex.js
index 7e3132af09d172..a473e0e90fb220 100644
--- a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-hex.js
+++ b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-hex.js
@@ -32,5 +32,5 @@ assert.throws(() => {
   message: `Cannot create a string longer than 0x${stringLengthHex} ` +
            'characters',
   code: 'ERR_STRING_TOO_LONG',
-  name: 'Error'
+  name: 'Error',
 });
diff --git a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-utf8.js b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-utf8.js
index 78e73e0dc8557b..25271fad94b689 100644
--- a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-utf8.js
+++ b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-utf8.js
@@ -35,7 +35,7 @@ assert.throws(() => {
       message: `Cannot create a string longer than 0x${stringLengthHex} ` +
                'characters',
       code: 'ERR_STRING_TOO_LONG',
-      name: 'Error'
+      name: 'Error',
     })(e);
     return true;
   }
@@ -48,5 +48,5 @@ assert.throws(() => {
   message: `Cannot create a string longer than 0x${stringLengthHex} ` +
            'characters',
   code: 'ERR_STRING_TOO_LONG',
-  name: 'Error'
+  name: 'Error',
 });
diff --git a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max.js b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max.js
index 7206b90d5f28b6..b843be5a9ab7a5 100644
--- a/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max.js
+++ b/test/addons/stringbytes-external-exceed-max/test-stringbytes-external-exceed-max.js
@@ -33,5 +33,5 @@ assert.throws(() => {
   message: `Cannot create a string longer than 0x${stringLengthHex} ` +
            'characters',
   code: 'ERR_STRING_TOO_LONG',
-  name: 'Error'
+  name: 'Error',
 });
diff --git a/test/addons/worker-addon/test.js b/test/addons/worker-addon/test.js
index 2d64c2f1c5187d..50191d183da544 100644
--- a/test/addons/worker-addon/test.js
+++ b/test/addons/worker-addon/test.js
@@ -13,12 +13,12 @@ switch (process.argv[2]) {
   case 'worker-twice':
   case 'worker': {
     const worker = new Worker(`require(${JSON.stringify(binding)});`, {
-      eval: true
+      eval: true,
     });
     if (process.argv[2] === 'worker-twice') {
       worker.on('exit', common.mustCall(() => {
         new Worker(`require(${JSON.stringify(binding)});`, {
-          eval: true
+          eval: true,
         });
       }));
     }
@@ -52,7 +52,7 @@ for (const { test, expected } of [
       'ctor cleanup dtor ctor cleanup dtor ',
     ].concat(libcMayBeMusl ? [
       'ctor cleanup cleanup dtor ',
-    ] : [])
+    ] : []),
   },
 ]) {
   console.log('spawning test', test);
diff --git a/test/async-hooks/hook-checks.js b/test/async-hooks/hook-checks.js
index e1328810f58982..6ad79bc68e8ac1 100644
--- a/test/async-hooks/hook-checks.js
+++ b/test/async-hooks/hook-checks.js
@@ -21,7 +21,7 @@ exports.checkInvocations = function checkInvocations(activity, hooks, stage) {
 
   assert.ok(activity != null,
             `${stageInfo} Trying to check invocation for an activity, ` +
-            'but it was empty/undefined.'
+            'but it was empty/undefined.',
   );
 
   // Check that actual invocations for all hooks match the expected invocations
diff --git a/test/async-hooks/init-hooks.js b/test/async-hooks/init-hooks.js
index 5d697036602902..2c5167156b615d 100644
--- a/test/async-hooks/init-hooks.js
+++ b/test/async-hooks/init-hooks.js
@@ -27,7 +27,7 @@ class ActivityCollector {
     ondestroy,
     onpromiseResolve,
     logid = null,
-    logtype = null
+    logtype = null,
   } = {}) {
     this._start = start;
     this._allowNoInit = allowNoInit;
@@ -49,7 +49,7 @@ class ActivityCollector {
       before: this._before.bind(this),
       after: this._after.bind(this),
       destroy: this._destroy.bind(this),
-      promiseResolve: this._promiseResolve.bind(this)
+      promiseResolve: this._promiseResolve.bind(this),
     });
   }
 
@@ -181,7 +181,7 @@ class ActivityCollector {
       // In some cases (e.g. Timeout) the handle is a function, thus the usual
       // `typeof handle === 'object' && handle !== null` check can't be used.
       handleIsObject: handle instanceof Object,
-      handle
+      handle,
     };
     this._stamp(activity, 'init');
     this._activities.set(uid, activity);
@@ -233,7 +233,7 @@ exports = module.exports = function initHooks({
   onpromiseResolve,
   allowNoInit,
   logid,
-  logtype
+  logtype,
 } = {}) {
   return new ActivityCollector(process.hrtime(), {
     oninit,
@@ -243,6 +243,6 @@ exports = module.exports = function initHooks({
     onpromiseResolve,
     allowNoInit,
     logid,
-    logtype
+    logtype,
   });
 };
diff --git a/test/async-hooks/test-async-await.js b/test/async-hooks/test-async-await.js
index 19a22d3076b8c0..4fd698c8e98197 100644
--- a/test/async-hooks/test-async-await.js
+++ b/test/async-hooks/test-async-await.js
@@ -22,7 +22,7 @@ const hooks = initHooks({
   onbefore,
   onafter,
   ondestroy: null,  // Intentionally not tested, since it will be removed soon
-  onpromiseResolve
+  onpromiseResolve,
 });
 hooks.enable();
 
diff --git a/test/async-hooks/test-async-exec-resource-http-32060.js b/test/async-hooks/test-async-exec-resource-http-32060.js
index 0ff68aa1070e19..1423179d4215bd 100644
--- a/test/async-hooks/test-async-exec-resource-http-32060.js
+++ b/test/async-hooks/test-async-exec-resource-http-32060.js
@@ -12,7 +12,7 @@ const hooked = {};
 createHook({
   init(asyncId, type, triggerAsyncId, resource) {
     hooked[asyncId] = resource;
-  }
+  },
 }).enable();
 
 const server = http.createServer((req, res) => {
diff --git a/test/async-hooks/test-async-exec-resource-http.js b/test/async-hooks/test-async-exec-resource-http.js
index ecc654bea0ab79..844720250d4195 100644
--- a/test/async-hooks/test-async-exec-resource-http.js
+++ b/test/async-hooks/test-async-exec-resource-http.js
@@ -13,7 +13,7 @@ const hooked = {};
 createHook({
   init(asyncId, type, triggerAsyncId, resource) {
     hooked[asyncId] = resource;
-  }
+  },
 }).enable();
 
 const server = http.createServer((req, res) => {
diff --git a/test/async-hooks/test-async-exec-resource-match.js b/test/async-hooks/test-async-exec-resource-match.js
index f5ea2c2b13965a..6174768ba76877 100644
--- a/test/async-hooks/test-async-exec-resource-match.js
+++ b/test/async-hooks/test-async-exec-resource-match.js
@@ -6,7 +6,7 @@ const { readFile } = require('fs');
 const {
   createHook,
   executionAsyncResource,
-  AsyncResource
+  AsyncResource,
 } = require('async_hooks');
 
 // Ignore any asyncIds created before our hook is active.
@@ -32,7 +32,7 @@ createHook({
     if (asyncId >= firstSeenAsyncId) {
       afterHook(asyncId);
     }
-  }
+  },
 }).enable();
 
 const beforeHook = common.mustCallAtLeast(
diff --git a/test/async-hooks/test-async-local-storage-http-agent.js b/test/async-hooks/test-async-local-storage-http-agent.js
index 1de535aa709687..54c8a585a5ba1c 100644
--- a/test/async-hooks/test-async-local-storage-http-agent.js
+++ b/test/async-hooks/test-async-local-storage-http-agent.js
@@ -7,7 +7,7 @@ const http = require('http');
 const asyncLocalStorage = new AsyncLocalStorage();
 
 const agent = new http.Agent({
-  maxSockets: 1
+  maxSockets: 1,
 });
 
 const N = 3;
diff --git a/test/async-hooks/test-async-local-storage-stop-propagation.js b/test/async-hooks/test-async-local-storage-stop-propagation.js
new file mode 100644
index 00000000000000..0480bd4be7f918
--- /dev/null
+++ b/test/async-hooks/test-async-local-storage-stop-propagation.js
@@ -0,0 +1,50 @@
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+const { AsyncLocalStorage, AsyncResource } = require('async_hooks');
+
+let cnt = 0;
+function onPropagate(type, store) {
+  assert.strictEqual(als.getStore(), store);
+  cnt++;
+  if (cnt === 1) {
+    assert.strictEqual(type, 'r1');
+    return true;
+  }
+  if (cnt === 2) {
+    assert.strictEqual(type, 'r2');
+    return false;
+  }
+}
+
+const als = new AsyncLocalStorage({
+  onPropagate: common.mustCall(onPropagate, 2),
+});
+
+const myStore = {};
+
+als.run(myStore, common.mustCall(() => {
+  const r1 = new AsyncResource('r1');
+  const r2 = new AsyncResource('r2');
+  r1.runInAsyncScope(common.mustCall(() => {
+    assert.strictEqual(als.getStore(), myStore);
+  }));
+  r2.runInAsyncScope(common.mustCall(() => {
+    assert.strictEqual(als.getStore(), undefined);
+    r1.runInAsyncScope(common.mustCall(() => {
+      assert.strictEqual(als.getStore(), myStore);
+    }));
+  }));
+}));
+
+assert.throws(() => new AsyncLocalStorage(15), {
+  message: 'The "options" argument must be of type object. Received type number (15)',
+  code: 'ERR_INVALID_ARG_TYPE',
+  name: 'TypeError',
+});
+
+assert.throws(() => new AsyncLocalStorage({ onPropagate: 'bar' }), {
+  message: 'The "options.onPropagate" property must be of type function. Received type string (\'bar\')',
+  code: 'ERR_INVALID_ARG_TYPE',
+  name: 'TypeError',
+});
diff --git a/test/async-hooks/test-async-local-storage-thenable.js b/test/async-hooks/test-async-local-storage-thenable.js
index 1f947fa9345491..3dc6841ac9838e 100644
--- a/test/async-hooks/test-async-local-storage-thenable.js
+++ b/test/async-hooks/test-async-local-storage-thenable.js
@@ -17,7 +17,7 @@ const then = common.mustCall((cb) => {
 
 function thenable() {
   return {
-    then
+    then,
   };
 }
 
diff --git a/test/async-hooks/test-async-local-storage-tlssocket.js b/test/async-hooks/test-async-local-storage-tlssocket.js
index 34ea4c068253cb..09da3ac735ac20 100644
--- a/test/async-hooks/test-async-local-storage-tlssocket.js
+++ b/test/async-hooks/test-async-local-storage-tlssocket.js
@@ -14,7 +14,7 @@ const { AsyncLocalStorage } = require('async_hooks');
 const options = {
   cert: fixtures.readKey('rsa_cert.crt'),
   key: fixtures.readKey('rsa_private.pem'),
-  rejectUnauthorized: false
+  rejectUnauthorized: false,
 };
 
 tls
diff --git a/test/async-hooks/test-callback-error.js b/test/async-hooks/test-callback-error.js
index 5665464c2d3921..f6af8e0018d534 100644
--- a/test/async-hooks/test-callback-error.js
+++ b/test/async-hooks/test-callback-error.js
@@ -9,14 +9,14 @@ const arg = process.argv[2];
 switch (arg) {
   case 'test_init_callback':
     initHooks({
-      oninit: common.mustCall(() => { throw new Error(arg); })
+      oninit: common.mustCall(() => { throw new Error(arg); }),
     }).enable();
     new async_hooks.AsyncResource(`${arg}_type`);
     return;
 
   case 'test_callback': {
     initHooks({
-      onbefore: common.mustCall(() => { throw new Error(arg); })
+      onbefore: common.mustCall(() => { throw new Error(arg); }),
     }).enable();
     const resource = new async_hooks.AsyncResource(`${arg}_type`);
     resource.runInAsyncScope(() => {});
@@ -25,7 +25,7 @@ switch (arg) {
 
   case 'test_callback_abort':
     initHooks({
-      oninit: common.mustCall(() => { throw new Error(arg); })
+      oninit: common.mustCall(() => { throw new Error(arg); }),
     }).enable();
     new async_hooks.AsyncResource(`${arg}_type`);
     return;
diff --git a/test/async-hooks/test-destroy-not-blocked.js b/test/async-hooks/test-destroy-not-blocked.js
index aa467f30143806..b9a314072483f2 100644
--- a/test/async-hooks/test-destroy-not-blocked.js
+++ b/test/async-hooks/test-destroy-not-blocked.js
@@ -23,7 +23,7 @@ createHook({
     if (activeId === id) {
       activeId = -1;
     }
-  }
+  },
 }).enable();
 
 function testNextTick() {
@@ -33,7 +33,7 @@ function testNextTick() {
   res.emitDestroy();
   // nextTick has higher prio than emit destroy
   process.nextTick(common.mustCall(() =>
-    assert.strictEqual(activeId, res.asyncId()))
+    assert.strictEqual(activeId, res.asyncId())),
   );
 }
 
@@ -44,7 +44,7 @@ function testQueueMicrotask() {
   res.emitDestroy();
   // queueMicrotask has higher prio than emit destroy
   queueMicrotask(common.mustCall(() =>
-    assert.strictEqual(activeId, res.asyncId()))
+    assert.strictEqual(activeId, res.asyncId())),
   );
 }
 
@@ -54,7 +54,7 @@ function testImmediate() {
   assert.strictEqual(activeId, res.asyncId());
   res.emitDestroy();
   setImmediate(common.mustCall(() =>
-    assert.strictEqual(activeId, -1))
+    assert.strictEqual(activeId, -1)),
   );
 }
 
@@ -65,7 +65,7 @@ function testPromise() {
   res.emitDestroy();
   // Promise has higher prio than emit destroy
   Promise.resolve().then(common.mustCall(() =>
-    assert.strictEqual(activeId, res.asyncId()))
+    assert.strictEqual(activeId, res.asyncId())),
   );
 }
 
diff --git a/test/async-hooks/test-disable-in-init.js b/test/async-hooks/test-disable-in-init.js
index 17537c62f30885..f810dfca3b9605 100644
--- a/test/async-hooks/test-disable-in-init.js
+++ b/test/async-hooks/test-disable-in-init.js
@@ -13,11 +13,11 @@ async_hooks.createHook({
       nestedCall = true;
       fs.access(__filename, common.mustCall());
     }
-  }, 2)
+  }, 2),
 }).enable();
 
 const nestedHook = async_hooks.createHook({
-  init: common.mustCall(2)
+  init: common.mustCall(2),
 }).enable();
 
 fs.access(__filename, common.mustCall());
diff --git a/test/async-hooks/test-embedder.api.async-resource-no-type.js b/test/async-hooks/test-embedder.api.async-resource-no-type.js
index 2600325e1ed6be..e21c5458df8614 100644
--- a/test/async-hooks/test-embedder.api.async-resource-no-type.js
+++ b/test/async-hooks/test-embedder.api.async-resource-no-type.js
@@ -20,7 +20,7 @@ if (process.argv[2] === 'child') {
   [null, undefined, 1, Date, {}, []].forEach((i) => {
     assert.throws(() => new Foo(i), {
       code: 'ERR_INVALID_ARG_TYPE',
-      name: 'TypeError'
+      name: 'TypeError',
     });
   });
 
diff --git a/test/async-hooks/test-embedder.api.async-resource.js b/test/async-hooks/test-embedder.api.async-resource.js
index c53590393af89f..d60c03fb87b2ea 100644
--- a/test/async-hooks/test-embedder.api.async-resource.js
+++ b/test/async-hooks/test-embedder.api.async-resource.js
@@ -26,7 +26,7 @@ assert.throws(() => {
 
 assert.strictEqual(
   new AsyncResource('default_trigger_id').triggerAsyncId(),
-  async_hooks.executionAsyncId()
+  async_hooks.executionAsyncId(),
 );
 
 // Create first custom event 'alcazares' with triggerAsyncId derived
diff --git a/test/async-hooks/test-emit-after-on-destroyed.js b/test/async-hooks/test-emit-after-on-destroyed.js
index 37c54b1c9e0a20..1a10a1dfc74a74 100644
--- a/test/async-hooks/test-emit-after-on-destroyed.js
+++ b/test/async-hooks/test-emit-after-on-destroyed.js
@@ -10,7 +10,7 @@ const heartbeatMsg = /heartbeat: still alive/;
 
 const {
   newAsyncId, getDefaultTriggerAsyncId,
-  emitInit, emitBefore, emitAfter, emitDestroy
+  emitInit, emitBefore, emitAfter, emitDestroy,
 } = internal_async_hooks;
 
 const initHooks = require('./init-hooks');
diff --git a/test/async-hooks/test-emit-before-after.js b/test/async-hooks/test-emit-before-after.js
index 2ad98b993efd5b..561004cac2f012 100644
--- a/test/async-hooks/test-emit-before-after.js
+++ b/test/async-hooks/test-emit-before-after.js
@@ -30,7 +30,7 @@ const checkOnce = (fn) => {
 initHooks({
   onbefore: checkOnce(chkBefore),
   onafter: checkOnce(chkAfter),
-  allowNoInit: true
+  allowNoInit: true,
 }).enable();
 
 async_hooks.emitInit(expectedId, expectedType, expectedTriggerId);
diff --git a/test/async-hooks/test-emit-before-on-destroyed.js b/test/async-hooks/test-emit-before-on-destroyed.js
index 7b56eeeb63d4d2..ca0553e53348be 100644
--- a/test/async-hooks/test-emit-before-on-destroyed.js
+++ b/test/async-hooks/test-emit-before-on-destroyed.js
@@ -10,7 +10,7 @@ const heartbeatMsg = /heartbeat: still alive/;
 
 const {
   newAsyncId, getDefaultTriggerAsyncId,
-  emitInit, emitBefore, emitAfter, emitDestroy
+  emitInit, emitBefore, emitAfter, emitDestroy,
 } = internal_async_hooks;
 
 const initHooks = require('./init-hooks');
diff --git a/test/async-hooks/test-emit-init.js b/test/async-hooks/test-emit-init.js
index bc1cd49cba2824..8994943b472931 100644
--- a/test/async-hooks/test-emit-init.js
+++ b/test/async-hooks/test-emit-init.js
@@ -17,7 +17,7 @@ const hooks1 = initHooks({
     assert.strictEqual(type, expectedType);
     assert.strictEqual(triggerAsyncId, expectedTriggerId);
     assert.strictEqual(resource.key, expectedResource.key);
-  })
+  }),
 });
 
 hooks1.enable();
@@ -33,7 +33,7 @@ initHooks({
     assert.strictEqual(type, expectedType);
     assert.notStrictEqual(triggerAsyncId, expectedTriggerId);
     assert.strictEqual(resource.key, expectedResource.key);
-  })
+  }),
 }).enable();
 
 async_hooks.emitInit(expectedId, expectedType, null, expectedResource);
diff --git a/test/async-hooks/test-enable-in-init.js b/test/async-hooks/test-enable-in-init.js
index 7bc70994e1fa7d..e710657a340440 100644
--- a/test/async-hooks/test-enable-in-init.js
+++ b/test/async-hooks/test-enable-in-init.js
@@ -5,7 +5,7 @@ const async_hooks = require('async_hooks');
 const fs = require('fs');
 
 const nestedHook = async_hooks.createHook({
-  init: common.mustNotCall()
+  init: common.mustNotCall(),
 });
 let nestedCall = false;
 
@@ -16,7 +16,7 @@ async_hooks.createHook({
       nestedCall = true;
       fs.access(__filename, common.mustCall());
     }
-  }, 2)
+  }, 2),
 }).enable();
 
 fs.access(__filename, common.mustCall());
diff --git a/test/async-hooks/test-filehandle-no-reuse.js b/test/async-hooks/test-filehandle-no-reuse.js
index 7cd3322c1906fd..34921471e48c77 100644
--- a/test/async-hooks/test-filehandle-no-reuse.js
+++ b/test/async-hooks/test-filehandle-no-reuse.js
@@ -17,7 +17,7 @@ const hooks = initHooks();
 hooks.enable();
 
 const {
-  HTTP2_HEADER_CONTENT_TYPE
+  HTTP2_HEADER_CONTENT_TYPE,
 } = http2.constants;
 
 // Use large fixture to get several file operations.
@@ -27,7 +27,7 @@ const fd = fs.openSync(fname, 'r');
 const server = http2.createServer();
 server.on('stream', (stream) => {
   stream.respondWithFD(fd, {
-    [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain'
+    [HTTP2_HEADER_CONTENT_TYPE]: 'text/plain',
   });
 });
 server.on('close', common.mustCall(() => fs.closeSync(fd)));
diff --git a/test/async-hooks/test-graph.fsreq-readFile.js b/test/async-hooks/test-graph.fsreq-readFile.js
index 0a310ed5774a67..543ce68aa73622 100644
--- a/test/async-hooks/test-graph.fsreq-readFile.js
+++ b/test/async-hooks/test-graph.fsreq-readFile.js
@@ -21,6 +21,6 @@ function onexit() {
     [ { type: 'FSREQCALLBACK', id: 'fsreq:1', triggerAsyncId: null },
       { type: 'FSREQCALLBACK', id: 'fsreq:2', triggerAsyncId: 'fsreq:1' },
       { type: 'FSREQCALLBACK', id: 'fsreq:3', triggerAsyncId: 'fsreq:2' },
-      { type: 'FSREQCALLBACK', id: 'fsreq:4', triggerAsyncId: 'fsreq:3' } ]
+      { type: 'FSREQCALLBACK', id: 'fsreq:4', triggerAsyncId: 'fsreq:3' } ],
   );
 }
diff --git a/test/async-hooks/test-graph.http.js b/test/async-hooks/test-graph.http.js
index 62d27fe1b54431..859000b14aa8e0 100644
--- a/test/async-hooks/test-graph.http.js
+++ b/test/async-hooks/test-graph.http.js
@@ -20,7 +20,7 @@ server.listen(0, common.mustCall(() => {
   http.get({
     host: '::1',
     family: 6,
-    port: server.address().port
+    port: server.address().port,
   }, common.mustCall());
 }));
 
@@ -48,6 +48,6 @@ process.on('exit', () => {
         triggerAsyncId: null },
       { type: 'SHUTDOWNWRAP',
         id: 'shutdown:1',
-        triggerAsyncId: 'tcp:2' } ]
+        triggerAsyncId: 'tcp:2' } ],
   );
 });
diff --git a/test/async-hooks/test-graph.intervals.js b/test/async-hooks/test-graph.intervals.js
index 8aa46ab07b5471..9e626951a14bbf 100644
--- a/test/async-hooks/test-graph.intervals.js
+++ b/test/async-hooks/test-graph.intervals.js
@@ -30,6 +30,6 @@ function onexit() {
   verifyGraph(
     hooks,
     [ { type: 'Timeout', id: 'timeout:1', triggerAsyncId: null },
-      { type: 'Timeout', id: 'timeout:2', triggerAsyncId: 'timeout:1' }]
+      { type: 'Timeout', id: 'timeout:2', triggerAsyncId: 'timeout:1' }],
   );
 }
diff --git a/test/async-hooks/test-graph.pipe.js b/test/async-hooks/test-graph.pipe.js
index 162fb3639bfbfc..abf8a98ff00e62 100644
--- a/test/async-hooks/test-graph.pipe.js
+++ b/test/async-hooks/test-graph.pipe.js
@@ -27,6 +27,6 @@ function onexit() {
     [ { type: 'PROCESSWRAP', id: 'process:1', triggerAsyncId: null },
       { type: 'PIPEWRAP', id: 'pipe:1', triggerAsyncId: null },
       { type: 'PIPEWRAP', id: 'pipe:2', triggerAsyncId: null },
-      { type: 'PIPEWRAP', id: 'pipe:3', triggerAsyncId: null } ]
+      { type: 'PIPEWRAP', id: 'pipe:3', triggerAsyncId: null } ],
   );
 }
diff --git a/test/async-hooks/test-graph.pipeconnect.js b/test/async-hooks/test-graph.pipeconnect.js
index 440ea906a17c4d..db237ff6b2d0ab 100644
--- a/test/async-hooks/test-graph.pipeconnect.js
+++ b/test/async-hooks/test-graph.pipeconnect.js
@@ -34,6 +34,6 @@ function onexit() {
       { type: 'PIPECONNECTWRAP', id: 'pipeconnect:1',
         triggerAsyncId: 'pipe:1' },
       { type: 'PIPEWRAP', id: 'pipe:2', triggerAsyncId: 'pipeserver:1' },
-      { type: 'SHUTDOWNWRAP', id: 'shutdown:1', triggerAsyncId: 'pipe:2' } ]
+      { type: 'SHUTDOWNWRAP', id: 'shutdown:1', triggerAsyncId: 'pipe:2' } ],
   );
 }
diff --git a/test/async-hooks/test-graph.shutdown.js b/test/async-hooks/test-graph.shutdown.js
index f4f077c0dd1c83..0f633787e5e59d 100644
--- a/test/async-hooks/test-graph.shutdown.js
+++ b/test/async-hooks/test-graph.shutdown.js
@@ -41,6 +41,6 @@ function onexit() {
       { type: 'TCPCONNECTWRAP',
         id: 'tcpconnect:1', triggerAsyncId: 'tcp:1' },
       { type: 'TCPWRAP', id: 'tcp:2', triggerAsyncId: 'tcpserver:1' },
-      { type: 'SHUTDOWNWRAP', id: 'shutdown:1', triggerAsyncId: 'tcp:2' } ]
+      { type: 'SHUTDOWNWRAP', id: 'shutdown:1', triggerAsyncId: 'tcp:2' } ],
   );
 }
diff --git a/test/async-hooks/test-graph.signal.js b/test/async-hooks/test-graph.signal.js
index b0a45ddf67765a..f87b1215b523b9 100644
--- a/test/async-hooks/test-graph.signal.js
+++ b/test/async-hooks/test-graph.signal.js
@@ -61,6 +61,6 @@ function onexit() {
       { type: 'PROCESSWRAP', id: 'process:3', triggerAsyncId: 'signal:1' },
       { type: 'PIPEWRAP', id: 'pipe:7', triggerAsyncId: 'signal:1' },
       { type: 'PIPEWRAP', id: 'pipe:8', triggerAsyncId: 'signal:1' },
-      { type: 'PIPEWRAP', id: 'pipe:9', triggerAsyncId: 'signal:1' } ]
+      { type: 'PIPEWRAP', id: 'pipe:9', triggerAsyncId: 'signal:1' } ],
   );
 }
diff --git a/test/async-hooks/test-graph.statwatcher.js b/test/async-hooks/test-graph.statwatcher.js
index 96376926a67450..f960ffebd3eb70 100644
--- a/test/async-hooks/test-graph.statwatcher.js
+++ b/test/async-hooks/test-graph.statwatcher.js
@@ -29,6 +29,6 @@ function onexit() {
   verifyGraph(
     hooks,
     [ { type: 'STATWATCHER', id: 'statwatcher:1', triggerAsyncId: null },
-      { type: 'STATWATCHER', id: 'statwatcher:2', triggerAsyncId: null } ]
+      { type: 'STATWATCHER', id: 'statwatcher:2', triggerAsyncId: null } ],
   );
 }
diff --git a/test/async-hooks/test-graph.tcp.js b/test/async-hooks/test-graph.tcp.js
index c2253486ee651e..6f8db20add682c 100644
--- a/test/async-hooks/test-graph.tcp.js
+++ b/test/async-hooks/test-graph.tcp.js
@@ -43,6 +43,6 @@ function onexit() {
       { type: 'TCPCONNECTWRAP',
         id: 'tcpconnect:1', triggerAsyncId: 'tcp:1' },
       { type: 'TCPWRAP', id: 'tcp:2', triggerAsyncId: 'tcpserver:1' },
-      { type: 'SHUTDOWNWRAP', id: 'shutdown:1', triggerAsyncId: 'tcp:2' } ]
+      { type: 'SHUTDOWNWRAP', id: 'shutdown:1', triggerAsyncId: 'tcp:2' } ],
   );
 }
diff --git a/test/async-hooks/test-graph.timeouts.js b/test/async-hooks/test-graph.timeouts.js
index 2ec1420f0c03b1..88350db2bae8ee 100644
--- a/test/async-hooks/test-graph.timeouts.js
+++ b/test/async-hooks/test-graph.timeouts.js
@@ -27,6 +27,6 @@ function onexit() {
     hooks,
     [ { type: 'Timeout', id: 'timeout:1', triggerAsyncId: null },
       { type: 'Timeout', id: 'timeout:2', triggerAsyncId: 'timeout:1' },
-      { type: 'Timeout', id: 'timeout:3', triggerAsyncId: 'timeout:2' }]
+      { type: 'Timeout', id: 'timeout:3', triggerAsyncId: 'timeout:2' }],
   );
 }
diff --git a/test/async-hooks/test-graph.tls-write.js b/test/async-hooks/test-graph.tls-write.js
index b493ac819dfbcd..243039e01d116f 100644
--- a/test/async-hooks/test-graph.tls-write.js
+++ b/test/async-hooks/test-graph.tls-write.js
@@ -21,7 +21,7 @@ hooks.enable();
 const server = tls
   .createServer({
     cert: fixtures.readKey('rsa_cert.crt'),
-    key: fixtures.readKey('rsa_private.pem')
+    key: fixtures.readKey('rsa_private.pem'),
   })
   .on('listening', common.mustCall(onlistening))
   .on('secureConnection', common.mustCall(onsecureConnection))
@@ -66,6 +66,6 @@ function onexit() {
         id: 'tcpconnect:1', triggerAsyncId: 'tcp:1' },
       { type: 'TCPWRAP', id: 'tcp:2', triggerAsyncId: 'tcpserver:1' },
       { type: 'TLSWRAP', id: 'tls:2', triggerAsyncId: 'tcpserver:1' },
-    ]
+    ],
   );
 }
diff --git a/test/async-hooks/test-http-agent-handle-reuse-parallel.js b/test/async-hooks/test-http-agent-handle-reuse-parallel.js
index 844ba1e9f9bf78..f60369a8b55321 100644
--- a/test/async-hooks/test-http-agent-handle-reuse-parallel.js
+++ b/test/async-hooks/test-http-agent-handle-reuse-parallel.js
@@ -21,7 +21,7 @@ let responses = 0;
 const agent = new http.Agent({
   keepAlive: true,
   keepAliveMsecs: Infinity,
-  maxSockets: 1
+  maxSockets: 1,
 });
 
 const verifyRequest = (idx) => (res) => {
@@ -58,13 +58,13 @@ const server = http.createServer(common.mustCall((req, res) => {
 
   // First request.
   const r1 = http.request({
-    agent, port, method: 'POST'
+    agent, port, method: 'POST',
   }, common.mustCall(verifyRequest(0)));
   r1.end(payload);
 
   // Second request. Sent in parallel with the first one.
   const r2 = http.request({
-    agent, port, method: 'POST'
+    agent, port, method: 'POST',
   }, common.mustCall(verifyRequest(1)));
   r2.end(payload);
 }));
diff --git a/test/async-hooks/test-http-agent-handle-reuse-serial.js b/test/async-hooks/test-http-agent-handle-reuse-serial.js
index fbd1d43378555e..bae0698a0a6b5b 100644
--- a/test/async-hooks/test-http-agent-handle-reuse-serial.js
+++ b/test/async-hooks/test-http-agent-handle-reuse-serial.js
@@ -20,7 +20,7 @@ let asyncIdAtSecondReq;
 const agent = new http.Agent({
   keepAlive: true,
   keepAliveMsecs: Infinity,
-  maxSockets: 1
+  maxSockets: 1,
 });
 
 const server = http.createServer(common.mustCall((req, res) => {
@@ -38,7 +38,7 @@ const server = http.createServer(common.mustCall((req, res) => {
   // First request. This is useless except for adding a socket to the
   // agent’s pool for reuse.
   const r1 = http.request({
-    agent, port, method: 'POST'
+    agent, port, method: 'POST',
   }, common.mustCall((res) => {
     // Remember which socket we used.
     const socket = res.socket;
@@ -60,8 +60,8 @@ const server = http.createServer(common.mustCall((req, res) => {
         // response header has already been received.
         const r2 = http.request({
           agent, port, method: 'POST', headers: {
-            'Content-Length': payload.length
-          }
+            'Content-Length': payload.length,
+          },
         }, common.mustCall((res) => {
           asyncIdAtSecondReq = res.socket[async_id_symbol];
           assert.ok(asyncIdAtSecondReq > 0, `${asyncIdAtSecondReq} > 0`);
diff --git a/test/async-hooks/test-httpparser-reuse.js b/test/async-hooks/test-httpparser-reuse.js
index 70248970df364c..f7ce2cd876220e 100644
--- a/test/async-hooks/test-httpparser-reuse.js
+++ b/test/async-hooks/test-httpparser-reuse.js
@@ -29,7 +29,7 @@ createHook({
 
     if (resource[reused]) {
       reusedParser.push(
-        `resource reused: ${asyncId}, ${triggerAsyncId}, ${type}`
+        `resource reused: ${asyncId}, ${triggerAsyncId}, ${type}`,
       );
     }
     resource[reused] = true;
@@ -40,7 +40,7 @@ createHook({
     } else {
       destroyed.push(asyncId);
     }
-  }
+  },
 }).enable();
 
 const server = http.createServer((req, res) => {
diff --git a/test/async-hooks/test-httpparser.request.js b/test/async-hooks/test-httpparser.request.js
index cd61aa25e3f6e7..40c01bc8177d6e 100644
--- a/test/async-hooks/test-httpparser.request.js
+++ b/test/async-hooks/test-httpparser.request.js
@@ -16,7 +16,7 @@ const REQUEST = HTTPParser.REQUEST;
 const kOnHeadersComplete = HTTPParser.kOnHeadersComplete | 0;
 
 const request = Buffer.from(
-  'GET /hello HTTP/1.1\r\n\r\n'
+  'GET /hello HTTP/1.1\r\n\r\n',
 );
 
 const parser = new HTTPParser();
diff --git a/test/async-hooks/test-httpparser.response.js b/test/async-hooks/test-httpparser.response.js
index d6625661eb7407..64f0893c5a9aa8 100644
--- a/test/async-hooks/test-httpparser.response.js
+++ b/test/async-hooks/test-httpparser.response.js
@@ -21,7 +21,7 @@ const request = Buffer.from(
   'Content-Type: text/plain\r\n' +
   'Content-Length: 4\r\n' +
   '\r\n' +
-  'pong'
+  'pong',
 );
 
 const parser = new HTTPParser();
diff --git a/test/async-hooks/test-improper-order.js b/test/async-hooks/test-improper-order.js
index 800c7422b42e31..5452e2c6e05030 100644
--- a/test/async-hooks/test-improper-order.js
+++ b/test/async-hooks/test-improper-order.js
@@ -10,7 +10,7 @@ const heartbeatMsg = /heartbeat: still alive/;
 
 const {
   newAsyncId, getDefaultTriggerAsyncId,
-  emitInit, emitBefore, emitAfter
+  emitInit, emitBefore, emitAfter,
 } = internal_async_hooks;
 
 const initHooks = require('./init-hooks');
diff --git a/test/async-hooks/test-improper-unwind.js b/test/async-hooks/test-improper-unwind.js
index f2fbef2dbcc469..ea0eee025d7fd3 100644
--- a/test/async-hooks/test-improper-unwind.js
+++ b/test/async-hooks/test-improper-unwind.js
@@ -10,7 +10,7 @@ const heartbeatMsg = /heartbeat: still alive/;
 
 const {
   newAsyncId, getDefaultTriggerAsyncId,
-  emitInit, emitBefore, emitAfter
+  emitInit, emitBefore, emitAfter,
 } = internal_async_hooks;
 
 const initHooks = require('./init-hooks');
diff --git a/test/async-hooks/test-late-hook-enable.js b/test/async-hooks/test-late-hook-enable.js
index 7ee1323adbdbcc..8512ed993d507f 100644
--- a/test/async-hooks/test-late-hook-enable.js
+++ b/test/async-hooks/test-late-hook-enable.js
@@ -37,7 +37,7 @@ const hook = async_hooks.createHook({
   destroy: common.mustCall(() => {
     hook.disable();
     nextTest();
-  }, 3)
+  }, 3),
 });
 
 nextTest();
diff --git a/test/async-hooks/test-nexttick-default-trigger.js b/test/async-hooks/test-nexttick-default-trigger.js
index 7d6d98c9abc902..fa1ad2c561ce6f 100644
--- a/test/async-hooks/test-nexttick-default-trigger.js
+++ b/test/async-hooks/test-nexttick-default-trigger.js
@@ -23,6 +23,6 @@ process.on('exit', () => {
 
   const as = hooks.activitiesOfTypes('TickObject');
   checkInvocations(as[0], {
-    init: 1, before: 1, after: 1, destroy: 1
+    init: 1, before: 1, after: 1, destroy: 1,
   }, 'when process exits');
 });
diff --git a/test/async-hooks/test-pipewrap.js b/test/async-hooks/test-pipewrap.js
index 0a4d082856df22..2d42e769cfd1f3 100644
--- a/test/async-hooks/test-pipewrap.js
+++ b/test/async-hooks/test-pipewrap.js
@@ -55,7 +55,7 @@ function onsleepClose() {
     checkInvocations(
       processwrap,
       { init: 1, before: 1, after: 1 },
-      'processwrap while in onsleepClose callback')
+      'processwrap while in onsleepClose callback'),
   );
 }
 
diff --git a/test/async-hooks/test-queue-microtask.js b/test/async-hooks/test-queue-microtask.js
index 1e2029efe4ad0e..01200d45423929 100644
--- a/test/async-hooks/test-queue-microtask.js
+++ b/test/async-hooks/test-queue-microtask.js
@@ -20,6 +20,6 @@ process.on('exit', () => {
 
   const as = hooks.activitiesOfTypes('Microtask');
   checkInvocations(as[0], {
-    init: 1, before: 1, after: 1, destroy: 1
+    init: 1, before: 1, after: 1, destroy: 1,
   }, 'when process exits');
 });
diff --git a/test/async-hooks/test-tlswrap.js b/test/async-hooks/test-tlswrap.js
index 65a4087d1659c6..6a8996e00f2b71 100644
--- a/test/async-hooks/test-tlswrap.js
+++ b/test/async-hooks/test-tlswrap.js
@@ -25,7 +25,7 @@ tls.DEFAULT_MAX_VERSION = 'TLSv1.2';
 const server = tls
   .createServer({
     cert: fixtures.readKey('rsa_cert.crt'),
-    key: fixtures.readKey('rsa_private.pem')
+    key: fixtures.readKey('rsa_private.pem'),
   })
   .on('listening', common.mustCall(onlistening))
   .on('secureConnection', common.mustCall(onsecureConnection))
diff --git a/test/async-hooks/test-ttywrap.readstream.js b/test/async-hooks/test-ttywrap.readstream.js
index e6fb3cdc28a4fe..7e27ffc5bfb2a2 100644
--- a/test/async-hooks/test-ttywrap.readstream.js
+++ b/test/async-hooks/test-ttywrap.readstream.js
@@ -35,7 +35,7 @@ const delayedOnCloseHandler = common.mustCall(() => {
 });
 process.stdin.on('error', (err) => assert.fail(err));
 process.stdin.on('close', common.mustCall(() =>
-  tick(2, delayedOnCloseHandler)
+  tick(2, delayedOnCloseHandler),
 ));
 process.stdin.destroy();
 checkInvocations(tty, checkInitOpts, 'when tty.end() was invoked');
diff --git a/test/async-hooks/test-unhandled-rejection-context.js b/test/async-hooks/test-unhandled-rejection-context.js
index b70d97f99fd441..8404cf71f0db6f 100644
--- a/test/async-hooks/test-unhandled-rejection-context.js
+++ b/test/async-hooks/test-unhandled-rejection-context.js
@@ -15,7 +15,7 @@ const hooks = initHooks({
     if (type === 'PROMISE') {
       promiseAsyncIds.push(asyncId);
     }
-  }
+  },
 });
 
 hooks.enable();
diff --git a/test/async-hooks/test-zlib.zlib-binding.deflate.js b/test/async-hooks/test-zlib.zlib-binding.deflate.js
index 16d9b3f3ebd7d5..802f09eb306cf9 100644
--- a/test/async-hooks/test-zlib.zlib-binding.deflate.js
+++ b/test/async-hooks/test-zlib.zlib-binding.deflate.js
@@ -29,7 +29,7 @@ const buffers = {
   writeResult: new Uint32Array(2),
   dictionary: new Uint8Array(0),
   inBuf: new Uint8Array([0x78]),
-  outBuf: new Uint8Array(1)
+  outBuf: new Uint8Array(1),
 };
 
 handle.init(
@@ -39,7 +39,7 @@ handle.init(
   constants.Z_DEFAULT_STRATEGY,
   buffers.writeResult,
   function processCallback() { this.cb(); },
-  buffers.dictionary
+  buffers.dictionary,
 );
 checkInvocations(hdl, { init: 1 }, 'when initialized handle');
 
diff --git a/test/async-hooks/verify-graph.js b/test/async-hooks/verify-graph.js
index 638edd03a4ab24..61d1849f21ef48 100644
--- a/test/async-hooks/verify-graph.js
+++ b/test/async-hooks/verify-graph.js
@@ -20,7 +20,7 @@ function pruneTickObjects(activities) {
   const tickObject = {
     found: true,
     index: null,
-    data: null
+    data: null,
   };
 
   if (!Array.isArray(activities))
@@ -42,7 +42,7 @@ function pruneTickObjects(activities) {
       tickObject.data = activities[tickObject.index];
       const triggerId = {
         new: tickObject.data.triggerAsyncId,
-        old: tickObject.data.uid
+        old: tickObject.data.uid,
       };
 
       activities.forEach(function repointTriggerId(x) {
@@ -85,7 +85,7 @@ module.exports = function verifyGraph(hooks, graph) {
     errors.push({
       id: node.id,
       expectedTid: node.triggerAsyncId,
-      actualTid: uidtoid[x.triggerAsyncId]
+      actualTid: uidtoid[x.triggerAsyncId],
     });
   }
 
@@ -93,8 +93,8 @@ module.exports = function verifyGraph(hooks, graph) {
     errors.forEach((x) =>
       console.error(
         `'${x.id}' expected to be triggered by '${x.expectedTid}', ` +
-        `but was triggered by '${x.actualTid}' instead.`
-      )
+        `but was triggered by '${x.actualTid}' instead.`,
+      ),
     );
   }
   assert.strictEqual(errors.length, 0);
diff --git a/test/common/README.md b/test/common/README.md
index ef86f59c656f7b..4d26e355d5480f 100644
--- a/test/common/README.md
+++ b/test/common/README.md
@@ -110,20 +110,20 @@ expectWarning('DeprecationWarning', [
 
 expectWarning('DeprecationWarning', {
   DEP0XXX: 'Foobar is deprecated',
-  DEP0XX2: 'Baz is also deprecated'
+  DEP0XX2: 'Baz is also deprecated',
 });
 
 expectWarning({
   DeprecationWarning: {
     DEP0XXX: 'Foobar is deprecated',
-    DEP0XX1: 'Baz is also deprecated'
+    DEP0XX1: 'Baz is also deprecated',
   },
   Warning: [
     ['Multiple array entries are fine', 'SpecialWarningCode'],
     ['No code is also fine'],
   ],
   SingleEntry: ['This will also work', 'WarningCode'],
-  SingleString: 'Single string entries without code will also work'
+  SingleString: 'Single string entries without code will also work',
 });
 ```
 
@@ -720,7 +720,7 @@ validateSnapshotNodes('TLSWRAP', [
       { name: 'enc_out' },
       { name: 'enc_in' },
       { name: 'TLSWrap' },
-    ]
+    ],
   },
 ]);
 ```
diff --git a/test/common/benchmark.js b/test/common/benchmark.js
index 88c918766fd76c..d9c1cdc627d994 100644
--- a/test/common/benchmark.js
+++ b/test/common/benchmark.js
@@ -15,7 +15,7 @@ function runBenchmark(name, env) {
 
   const child = fork(runjs, argv, {
     env: mergedEnv,
-    stdio: ['inherit', 'pipe', 'inherit', 'ipc']
+    stdio: ['inherit', 'pipe', 'inherit', 'ipc'],
   });
   child.stdout.setEncoding('utf8');
 
@@ -35,7 +35,7 @@ function runBenchmark(name, env) {
     // get from testing the benchmark file.
     assert.ok(
       /^(?:\n.+?\n.+?\n)+$/.test(stdout),
-      `benchmark file not running exactly one configuration in test: ${stdout}`
+      `benchmark file not running exactly one configuration in test: ${stdout}`,
     );
   });
 }
diff --git a/test/common/child_process.js b/test/common/child_process.js
index 6d52e33fcef8d4..799c963a7ed7dc 100644
--- a/test/common/child_process.js
+++ b/test/common/child_process.js
@@ -45,5 +45,5 @@ module.exports = {
   cleanupStaleProcess,
   logAfterTime,
   kExpiringChildRunTime,
-  kExpiringParentTimer
+  kExpiringParentTimer,
 };
diff --git a/test/common/cpu-prof.js b/test/common/cpu-prof.js
index e4bba24037dff9..42f55b35feb738 100644
--- a/test/common/cpu-prof.js
+++ b/test/common/cpu-prof.js
@@ -38,7 +38,7 @@ function verifyFrames(output, file, suffix) {
 const kCpuProfInterval = 50;
 const env = {
   ...process.env,
-  NODE_DEBUG_NATIVE: 'INSPECTOR_PROFILER'
+  NODE_DEBUG_NATIVE: 'INSPECTOR_PROFILER',
 };
 
 module.exports = {
@@ -46,5 +46,5 @@ module.exports = {
   kCpuProfInterval,
   env,
   getFrames,
-  verifyFrames
+  verifyFrames,
 };
diff --git a/test/common/crypto.js b/test/common/crypto.js
index 298badf5c2b8bc..8919b54d1fc632 100644
--- a/test/common/crypto.js
+++ b/test/common/crypto.js
@@ -30,11 +30,11 @@ function testDH({ publicKey: alicePublicKey, privateKey: alicePrivateKey },
                 expectedValue) {
   const buf1 = crypto.diffieHellman({
     privateKey: alicePrivateKey,
-    publicKey: bobPublicKey
+    publicKey: bobPublicKey,
   });
   const buf2 = crypto.diffieHellman({
     privateKey: bobPrivateKey,
-    publicKey: alicePublicKey
+    publicKey: alicePublicKey,
   });
   assert.deepStrictEqual(buf1, buf2);
 
@@ -44,5 +44,5 @@ function testDH({ publicKey: alicePublicKey, privateKey: alicePrivateKey },
 
 module.exports = {
   modp2buf,
-  testDH
+  testDH,
 };
diff --git a/test/common/dns.js b/test/common/dns.js
index 0c88d1963f24d3..2ee4bff5182699 100644
--- a/test/common/dns.js
+++ b/test/common/dns.js
@@ -13,11 +13,11 @@ const types = {
   MX: 15,
   TXT: 16,
   ANY: 255,
-  CAA: 257
+  CAA: 257,
 };
 
 const classes = {
-  IN: 1
+  IN: 1,
 };
 
 // Naïve DNS parser/serializer.
@@ -34,7 +34,7 @@ function readDomainFromPacket(buffer, offset) {
     const { nread, domain } = readDomainFromPacket(buffer, offset + length);
     return {
       nread: 1 + length + nread,
-      domain: domain ? `${chunk}.${domain}` : chunk
+      domain: domain ? `${chunk}.${domain}` : chunk,
     };
   }
   // Pointer to another part of the packet.
@@ -43,7 +43,7 @@ function readDomainFromPacket(buffer, offset) {
   const pointeeOffset = buffer.readUInt16BE(offset) &~ 0xC000;
   return {
     nread: 2,
-    domain: readDomainFromPacket(buffer, pointeeOffset)
+    domain: readDomainFromPacket(buffer, pointeeOffset),
   };
 }
 
@@ -316,5 +316,5 @@ module.exports = {
   parseDNSPacket,
   errorLookupMock,
   mockedErrorCode,
-  mockedSysCall
+  mockedSysCall,
 };
diff --git a/test/common/heap.js b/test/common/heap.js
index 1c22c274af125a..8eb36a8bfcaf6c 100644
--- a/test/common/heap.js
+++ b/test/common/heap.js
@@ -41,7 +41,7 @@ function createJSHeapSnapshot(stream = getHeapSnapshot()) {
       type,
       to: toNode,
       from: fromNode,
-      name: typeof name_or_index === 'string' ? name_or_index : null
+      name: typeof name_or_index === 'string' ? name_or_index : null,
     };
     toNode.incomingEdges.push(edge);
     fromNode.outgoingEdges.push(edge);
@@ -130,7 +130,7 @@ class State {
           const check = typeof expectedEdge === 'function' ? expectedEdge :
             (edge) => (isEdge(edge, expectedEdge));
           const hasChild = rootNodes.some(
-            (node) => node.outgoingEdges.some(check)
+            (node) => node.outgoingEdges.some(check),
           );
           // Don't use assert with a custom message here. Otherwise the
           // inspection in the message is done eagerly and wastes a lot of CPU
@@ -164,7 +164,7 @@ class State {
   // Validate our internal embedded graph representation
   validateGraph(rootName, expected, { loose = false } = {}) {
     const rootNodes = this.embedderGraph.filter(
-      (node) => node.name === rootName
+      (node) => node.name === rootName,
     );
     if (loose) {
       assert(rootNodes.length >= expected.length,
@@ -185,7 +185,7 @@ class State {
           // inspection in the message is done eagerly and wastes a lot of CPU
           // time.
           const hasChild = rootNodes.some(
-            (node) => node.edges.some(check)
+            (node) => node.edges.some(check),
           );
           if (!hasChild) {
             throw new Error(
@@ -221,16 +221,16 @@ function getHeapSnapshotOptionTests() {
           // We don't have anything special to test here yet
           // because we don't use cppgc or embedder heap tracer.
           { edge_name: 'nonNumeric', node_name: 'test' },
-        ]
-      }]
+        ],
+      }],
     },
     {
       options: { exposeNumericValues: true },
       expected: [{
         children: [
           { edge_name: 'numeric', node_name: 'smi number' },
-        ]
-      }]
+        ],
+      }],
     },
   ];
   return {
@@ -245,5 +245,5 @@ function getHeapSnapshotOptionTests() {
 module.exports = {
   recordState,
   validateSnapshotNodes,
-  getHeapSnapshotOptionTests
+  getHeapSnapshotOptionTests,
 };
diff --git a/test/common/hijackstdio.js b/test/common/hijackstdio.js
index 44e00ed0b11cc2..749d6aab48760a 100644
--- a/test/common/hijackstdio.js
+++ b/test/common/hijackstdio.js
@@ -28,5 +28,5 @@ module.exports = {
   hijackStdout: hijackStdWritable.bind(null, 'stdout'),
   hijackStderr: hijackStdWritable.bind(null, 'stderr'),
   restoreStdout: restoreWritable.bind(null, 'stdout'),
-  restoreStderr: restoreWritable.bind(null, 'stderr')
+  restoreStderr: restoreWritable.bind(null, 'stderr'),
 };
diff --git a/test/common/http2.js b/test/common/http2.js
index baaed492e5a9a3..6df1c29c09eecd 100644
--- a/test/common/http2.js
+++ b/test/common/http2.js
@@ -144,5 +144,5 @@ module.exports = {
   PingFrame,
   kFakeRequestHeaders,
   kFakeResponseHeaders,
-  kClientMagic
+  kClientMagic,
 };
diff --git a/test/common/index.js b/test/common/index.js
index 7a2cbb2133c670..06ea1fee1d9437 100644
--- a/test/common/index.js
+++ b/test/common/index.js
@@ -39,7 +39,7 @@ const hasIntl = !!process.config.variables.v8_enable_i18n_support;
 
 const {
   atob,
-  btoa
+  btoa,
 } = require('buffer');
 
 // Some tests assume a umask of 0o022 so set that up front. Tests that need a
@@ -98,7 +98,7 @@ if (process.argv.length === 2 &&
         console.log(
           'NOTE: The test started as a child_process using these flags:',
           inspect(flags),
-          'Use NODE_SKIP_FLAG_CHECK to run the test with the original flags.'
+          'Use NODE_SKIP_FLAG_CHECK to run the test with the original flags.',
         );
         const args = [...flags, ...process.execArgv, ...process.argv.slice(1)];
         const options = { encoding: 'utf8', stdio: 'inherit' };
@@ -175,7 +175,7 @@ if (process.env.NODE_TEST_WITH_ASYNC_HOOKS) {
       }
       initHandles[id] = {
         resource,
-        stack: inspect(new Error()).substr(6)
+        stack: inspect(new Error()).substr(6),
       };
     },
     before() { },
@@ -435,7 +435,7 @@ function _mustCallInner(fn, criteria = 1, field) {
     [field]: criteria,
     actual: 0,
     stack: inspect(new Error()),
-    name: fn.name || '<anonymous>'
+    name: fn.name || '<anonymous>',
   };
 
   // Add the exit listener only once to avoid listener leak warnings
@@ -478,7 +478,7 @@ function hasMultiLocalhost() {
 
 function skipIfEslintMissing() {
   if (!fs.existsSync(
-    path.join(__dirname, '..', '..', 'tools', 'node_modules', 'eslint')
+    path.join(__dirname, '..', '..', 'tools', 'node_modules', 'eslint'),
   )) {
     skip('missing ESLint');
   }
@@ -567,7 +567,7 @@ function mustNotMutateObjectDeep(original) {
     },
     setPrototypeOf(target, prototype) {
       assert.fail(`Expected no side effects, got set prototype to ${prototype}`);
-    }
+    },
   };
 
   const proxy = new Proxy(original, _mustNotMutateObjectDeepHandler);
@@ -670,7 +670,7 @@ function expectWarning(nameOrMap, expected, code) {
       if (!catchWarning[warning.name]) {
         throw new TypeError(
           `"${warning.name}" was triggered without being expected.\n` +
-          inspect(warning)
+          inspect(warning),
         );
       }
       catchWarning[warning.name](warning);
@@ -1034,5 +1034,5 @@ module.exports = new Proxy(common, {
     if (!validProperties.has(prop))
       throw new Error(`Using invalid common property: '${prop}'`);
     return obj[prop];
-  }
+  },
 });
diff --git a/test/common/inspector-helper.js b/test/common/inspector-helper.js
index ed3a6c90989664..48c9e5f1d17141 100644
--- a/test/common/inspector-helper.js
+++ b/test/common/inspector-helper.js
@@ -434,8 +434,8 @@ class NodeInstance extends EventEmitter {
         'Connection': 'Upgrade',
         'Upgrade': 'websocket',
         'Sec-WebSocket-Version': 13,
-        'Sec-WebSocket-Key': 'key=='
-      }
+        'Sec-WebSocket-Key': 'key==',
+      },
     });
   }
 
@@ -530,5 +530,5 @@ function fires(promise, error, timeoutMs) {
 }
 
 module.exports = {
-  NodeInstance
+  NodeInstance,
 };
diff --git a/test/common/internet.js b/test/common/internet.js
index 0943ac96c45ec3..51f18aeb4470c1 100644
--- a/test/common/internet.js
+++ b/test/common/internet.js
@@ -25,7 +25,7 @@ const addresses = {
   // record not found. Use this to guarantee record not found.
   NOT_FOUND: 'come.on.fhqwhgads.test',
   // A host with SRV records registered
-  SRV_HOST: '_jabber._tcp.google.com',
+  SRV_HOST: '_caldav._tcp.google.com',
   // A host with PTR records registered
   PTR_HOST: '8.8.8.8.in-addr.arpa',
   // A host with NAPTR records registered
@@ -43,7 +43,7 @@ const addresses = {
   // An accessible IPv4 DNS server
   DNS4_SERVER: '8.8.8.8',
   // An accessible IPv4 DNS server
-  DNS6_SERVER: '2001:4860:4860::8888'
+  DNS6_SERVER: '2001:4860:4860::8888',
 };
 
 for (const key of Object.keys(addresses)) {
@@ -54,5 +54,5 @@ for (const key of Object.keys(addresses)) {
 }
 
 module.exports = {
-  addresses
+  addresses,
 };
diff --git a/test/common/measure-memory.js b/test/common/measure-memory.js
index a42f6344268d12..ffde35f285da36 100644
--- a/test/common/measure-memory.js
+++ b/test/common/measure-memory.js
@@ -43,14 +43,15 @@ function assertSingleDetailedShape(result) {
 }
 
 function expectExperimentalWarning() {
-  common.expectWarning('ExperimentalWarning',
-                       'vm.measureMemory is an experimental feature. ' +
-                       'This feature could change at any time');
+  common.expectWarning(
+    'ExperimentalWarning',
+    'vm.measureMemory is an experimental feature and might change at any time',
+  );
 }
 
 module.exports = {
   assertSummaryShape,
   assertDetailedShape,
   assertSingleDetailedShape,
-  expectExperimentalWarning
+  expectExperimentalWarning,
 };
diff --git a/test/common/ongc.js b/test/common/ongc.js
index d8e27beb8f0a13..d361c55b51fe30 100644
--- a/test/common/ongc.js
+++ b/test/common/ongc.js
@@ -21,7 +21,7 @@ function onGC(obj, gcListener) {
         this.gcListener.ongc();
         onGcAsyncHook.disable();
       }
-    }
+    },
   }).enable();
   onGcAsyncHook.gcListener = gcListener;
 
diff --git a/test/common/prof.js b/test/common/prof.js
index 3eb288be1b9ca3..13047406dc7b7f 100644
--- a/test/common/prof.js
+++ b/test/common/prof.js
@@ -13,7 +13,7 @@ function getHeapProfiles(dir) {
 
 function findFirstFrameInNode(root, func) {
   const first = root.children.find(
-    (child) => child.callFrame.functionName === func
+    (child) => child.callFrame.functionName === func,
   );
   if (first) {
     return first;
@@ -53,7 +53,7 @@ const TEST_ALLOCATION = kHeapProfInterval * 2;
 const env = {
   ...process.env,
   TEST_ALLOCATION,
-  NODE_DEBUG_NATIVE: 'INSPECTOR_PROFILER'
+  NODE_DEBUG_NATIVE: 'INSPECTOR_PROFILER',
 };
 
 // TODO(joyeecheung): share the fixutres with v8 coverage tests
@@ -63,5 +63,5 @@ module.exports = {
   findFirstFrame,
   kHeapProfInterval,
   TEST_ALLOCATION,
-  env
+  env,
 };
diff --git a/test/common/report.js b/test/common/report.js
index 12bf30f4d0a499..f30c4d2a75477a 100644
--- a/test/common/report.js
+++ b/test/common/report.js
@@ -216,7 +216,7 @@ function _validateContent(report, fields = []) {
     for (let i = 0; i < jsHeapFields.length - 1; i++) {
       assert(
         Number.isSafeInteger(heap[jsHeapFields[i]]),
-        `heap.${jsHeapFields[i]} is not a safe integer`
+        `heap.${jsHeapFields[i]} is not a safe integer`,
       );
     }
     assert(typeof heap.heapSpaces === 'object' && heap.heapSpaces !== null);
diff --git a/test/common/require-as.js b/test/common/require-as.js
index 9425404fa1416d..bffdc3d83804ff 100644
--- a/test/common/require-as.js
+++ b/test/common/require-as.js
@@ -17,7 +17,7 @@ const { Worker, isMainThread, workerData } = require('worker_threads');
 if (isMainThread) {
   if (process.argv[2] === 'worker') {
     new Worker(__filename, {
-      workerData: process.argv[3]
+      workerData: process.argv[3],
     });
     return;
   }
diff --git a/test/common/shared-lib-util.js b/test/common/shared-lib-util.js
index f40acd783ba0e7..3ecd38791cf481 100644
--- a/test/common/shared-lib-util.js
+++ b/test/common/shared-lib-util.js
@@ -46,5 +46,5 @@ function getBinaryPath() {
 module.exports = {
   addLibraryPath,
   getBinaryPath,
-  getSharedLibPath
+  getSharedLibPath,
 };
diff --git a/test/common/snapshot.js b/test/common/snapshot.js
index 97367c05656c3c..3037ce45639eb9 100644
--- a/test/common/snapshot.js
+++ b/test/common/snapshot.js
@@ -45,7 +45,7 @@ function runWithSnapshot(entry, env) {
     env: {
       ...process.env,
       ...env,
-    }
+    },
   });
 
   const stderr = child.stderr.toString();
diff --git a/test/common/tls.js b/test/common/tls.js
index 2c91241c3b20b7..d212fbe076072c 100644
--- a/test/common/tls.js
+++ b/test/common/tls.js
@@ -52,7 +52,7 @@ class TestTLSSocket extends net.Socket {
   createClientKeyExchange() {
     const encrypted_pre_primary_secret = crypto.publicEncrypt({
       key: this.server_cert,
-      padding: crypto.constants.RSA_PKCS1_PADDING
+      padding: crypto.constants.RSA_PKCS1_PADDING,
     }, this.pre_primary_secret);
     const length = Buffer.alloc(2);
     length.writeUIntBE(encrypted_pre_primary_secret.length, 0, 2);
diff --git a/test/common/tmpdir.js b/test/common/tmpdir.js
index 8dbb6fda43cb0e..1f2ebb18ee64e0 100644
--- a/test/common/tmpdir.js
+++ b/test/common/tmpdir.js
@@ -57,5 +57,5 @@ function onexit() {
 
 module.exports = {
   path: tmpPath,
-  refresh
+  refresh,
 };
diff --git a/test/common/udppair.js b/test/common/udppair.js
index 6213f4becfd6aa..3f2b0aed78a169 100644
--- a/test/common/udppair.js
+++ b/test/common/udppair.js
@@ -67,7 +67,7 @@ class FakeUDPWrap extends EventEmitter {
         address = '127.0.0.1',
         port = 1337,
       },
-      flags = 0
+      flags = 0,
     } = info;
 
     let familyInt;
@@ -97,5 +97,5 @@ function makeUDPPair() {
 
 module.exports = {
   FakeUDPWrap,
-  makeUDPPair
+  makeUDPPair,
 };
diff --git a/test/common/wpt.js b/test/common/wpt.js
index b3ec2b369b3dcc..9d6debdb0b87fb 100644
--- a/test/common/wpt.js
+++ b/test/common/wpt.js
@@ -34,7 +34,7 @@ const harnessMock = {
   assert_array_equals: assert.deepStrictEqual,
   assert_unreached(desc) {
     assert.fail(`Reached unreachable code: ${desc}`);
-  }
+  },
 };
 
 class ResourceLoader {
@@ -46,7 +46,7 @@ class ResourceLoader {
     // We need to patch this to load the WebIDL parser
     url = url.replace(
       '/resources/WebIDLParser.js',
-      '/resources/webidl2/lib/webidl2.js'
+      '/resources/webidl2/lib/webidl2.js',
     );
     const base = path.dirname(from);
     return url.startsWith('/') ?
@@ -70,7 +70,7 @@ class ResourceLoader {
           return {
             ok: true,
             json() { return JSON.parse(data.toString()); },
-            text() { return data.toString(); }
+            text() { return data.toString(); },
           };
         });
     }
@@ -304,7 +304,7 @@ class WPTRunner {
     this.status = new StatusLoader(path);
     this.status.load();
     this.specMap = new Map(
-      this.status.specs.map((item) => [item.filename, item])
+      this.status.specs.map((item) => [item.filename, item]),
     );
 
     this.results = {};
@@ -440,7 +440,7 @@ class WPTRunner {
         for (const script of meta.script) {
           const obj = {
             filename: this.resource.toRealFilePath(relativePath, script),
-            code: this.resource.read(relativePath, script, false)
+            code: this.resource.read(relativePath, script, false),
           };
           this.scriptsModifier?.(obj);
           scriptsToRun.push(obj);
@@ -449,7 +449,7 @@ class WPTRunner {
       // The actual test
       const obj = {
         code: content,
-        filename: absolutePath
+        filename: absolutePath,
       };
       this.scriptsModifier?.(obj);
       scriptsToRun.push(obj);
@@ -494,9 +494,9 @@ class WPTRunner {
             status: NODE_UNCAUGHT,
             name: 'evaluation in WPTRunner.runJsTests()',
             message: err.message,
-            stack: inspect(err)
+            stack: inspect(err),
           },
-          kUncaught
+          kUncaught,
         );
         this.inProgress.delete(testFileName);
       });
@@ -517,7 +517,7 @@ class WPTRunner {
           obj[key] = this.results[key];
           return obj;
         },
-        {}
+        {},
       ), null, 2));
 
       const failures = [];
@@ -691,7 +691,7 @@ class WPTRunner {
       name: test.name,
       expected,
       status: kFail,
-      reason: test.message || status
+      reason: test.message || status,
     });
   }
 
@@ -702,7 +702,7 @@ class WPTRunner {
     console.log(`[SKIPPED] ${joinedReasons}`);
     this.addTestResult(filename, {
       status: kSkip,
-      reason: joinedReasons
+      reason: joinedReasons,
     });
   }
 
@@ -753,5 +753,5 @@ class WPTRunner {
 module.exports = {
   harness: harnessMock,
   ResourceLoader,
-  WPTRunner
+  WPTRunner,
 };
diff --git a/test/common/wpt/worker.js b/test/common/wpt/worker.js
index 47e119c22dcd84..34368ab5c5beff 100644
--- a/test/common/wpt/worker.js
+++ b/test/common/wpt/worker.js
@@ -9,7 +9,7 @@ const resource = new ResourceLoader(workerData.wptPath);
 global.self = global;
 global.GLOBAL = {
   isWindow() { return false; },
-  isShadowRealm() { return false; }
+  isShadowRealm() { return false; },
 };
 global.require = require;
 
@@ -25,7 +25,7 @@ if (workerData.initScript) {
 }
 
 runInThisContext(workerData.harness.code, {
-  filename: workerData.harness.filename
+  filename: workerData.harness.filename,
 });
 
 // eslint-disable-next-line no-undef
diff --git a/test/doctool/test-apilinks.mjs b/test/doctool/test-apilinks.mjs
index e3c334b19e7234..fbbfafc139b711 100644
--- a/test/doctool/test-apilinks.mjs
+++ b/test/doctool/test-apilinks.mjs
@@ -23,7 +23,7 @@ fs.readdirSync(apilinks).forEach((fixture) => {
   execFileSync(
     process.execPath,
     [script, outputPath, input],
-    { encoding: 'utf-8' }
+    { encoding: 'utf-8' },
   );
 
   const expectedLinks = JSON.parse(expectedContent);
@@ -38,6 +38,6 @@ fs.readdirSync(apilinks).forEach((fixture) => {
 
   assert.strictEqual(
     Object.keys(actualLinks).length, 0,
-    `unexpected links returned ${JSON.stringify(actualLinks)}`
+    `unexpected links returned ${JSON.stringify(actualLinks)}`,
   );
 });
diff --git a/test/doctool/test-deprecation-codes.js b/test/doctool/test-deprecation-codes.js
index 8e7ea37d242aa5..1bc63babb3f026 100644
--- a/test/doctool/test-deprecation-codes.js
+++ b/test/doctool/test-deprecation-codes.js
@@ -10,7 +10,7 @@ const script = path.join(
   '..',
   'tools',
   'doc',
-  'deprecationCodes.mjs'
+  'deprecationCodes.mjs',
 );
 
 const mdPath = path.join(
@@ -19,7 +19,7 @@ const mdPath = path.join(
   '..',
   'doc',
   'api',
-  'deprecations.md'
+  'deprecations.md',
 );
 
 const cp = spawn(process.execPath, [script, mdPath], { encoding: 'utf-8', stdio: 'inherit' });
diff --git a/test/doctool/test-doctool-html.mjs b/test/doctool/test-doctool-html.mjs
index 6a64da42cfd5bc..9323548221b599 100644
--- a/test/doctool/test-doctool-html.mjs
+++ b/test/doctool/test-doctool-html.mjs
@@ -23,8 +23,8 @@ import {
 const testLinksMapper = {
   'foo': {
     'command line options': 'cli.html#cli-options',
-    'web server': 'example.html'
-  }
+    'web server': 'example.html',
+  },
 };
 
 function toHTML({ input, filename, nodeVersion, versions }) {
@@ -58,7 +58,7 @@ const testData = [
       'id="foo_static_method_buffer_from_array"></a></h4>' +
       '<ul><li><code>array</code><a ' +
       'href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/' +
-      'Reference/Global_Objects/Array" class="type">&#x3C;Array></a></li></ul>'
+      'Reference/Global_Objects/Array" class="type">&#x3C;Array></a></li></ul>',
   },
   {
     file: fixtures.path('doc_with_yaml.md'),
@@ -99,7 +99,7 @@ const testData = [
       '" id="something">#</a></span>' +
       '<a aria-hidden="true" class="legacy" id="foo_something"></a></h3>' +
       '<!-- This is not a metadata comment --> ' +
-      '<p>Describe <code>Something</code> in more detail here. </p></section>'
+      '<p>Describe <code>Something</code> in more detail here. </p></section>',
   },
   {
     file: fixtures.path('sample_document.md'),
@@ -129,7 +129,7 @@ const testData = [
     '<h3>See also<span><a class="mark"' +
     'href="#see-also" id="see-also">#</a></span><a aria-hidden="true"' +
     'class="legacy" id="foo_see_also"></a></h3><p>Check' +
-    'out also<a href="https://nodejs.org/">this guide</a></p></section>'
+    'out also<a href="https://nodejs.org/">this guide</a></p></section>',
   },
   {
     file: fixtures.path('document_with_special_heading.md'),
diff --git a/test/doctool/test-doctool-json.mjs b/test/doctool/test-doctool-json.mjs
index eb1c9b2ea8cda2..7537dd46dab590 100644
--- a/test/doctool/test-doctool-json.mjs
+++ b/test/doctool/test-doctool-json.mjs
@@ -41,12 +41,12 @@ const testData = [
           desc: '<ol>\n<li>fish</li>\n<li>fish</li>\n</ol>\n' +
                   '<ul>\n<li>Red fish</li>\n<li>Blue fish</li>\n</ul>',
           type: 'module',
-          displayName: 'Seussian Rhymes'
+          displayName: 'Seussian Rhymes',
         }],
         type: 'module',
-        displayName: 'Sample Markdown'
-      }]
-    }
+        displayName: 'Sample Markdown',
+      }],
+    },
   },
   {
     file: fixtures.path('order_of_end_tags_5873.md'),
@@ -68,18 +68,18 @@ const testData = [
                 params: [{
                   textRaw: '`array` {Array}',
                   name: 'array',
-                  type: 'Array'
-                }]
+                  type: 'Array',
+                }],
               },
-            ]
+            ],
           }],
           type: 'module',
-          displayName: 'Subsection'
+          displayName: 'Subsection',
         }],
         type: 'module',
-        displayName: 'Title'
-      }]
-    }
+        displayName: 'Title',
+      }],
+    },
   },
   {
     file: fixtures.path('doc_with_yaml.md'),
@@ -96,12 +96,12 @@ const testData = [
               name: 'foobar',
               meta: {
                 added: ['v1.0.0'],
-                changes: []
+                changes: [],
               },
               desc: '<p>Describe <code>Foobar</code> in more detail ' +
                 'here.</p>',
               type: 'module',
-              displayName: 'Foobar'
+              displayName: 'Foobar',
             },
             {
               textRaw: 'Foobar II',
@@ -113,12 +113,12 @@ const testData = [
                     'pr-url': 'https://github.com/nodejs/node/pull/3276',
                     'description': 'The `error` parameter can now be ' +
                       'an arrow function.' },
-                ]
+                ],
               },
               desc: '<p>Describe <code>Foobar II</code> in more detail ' +
                 'here. fg(1)</p>',
               type: 'module',
-              displayName: 'Foobar II'
+              displayName: 'Foobar II',
             },
             {
               textRaw: 'Deprecated thingy',
@@ -126,12 +126,12 @@ const testData = [
               meta: {
                 added: ['v1.0.0'],
                 deprecated: ['v2.0.0'],
-                changes: []
+                changes: [],
               },
               desc: '<p>Describe <code>Deprecated thingy</code> in more ' +
                 'detail here. fg(1p)</p>',
               type: 'module',
-              displayName: 'Deprecated thingy'
+              displayName: 'Deprecated thingy',
             },
             {
               textRaw: 'Something',
@@ -139,14 +139,14 @@ const testData = [
               desc: '<!-- This is not a metadata comment -->\n<p>' +
                 'Describe <code>Something</code> in more detail here.</p>',
               type: 'module',
-              displayName: 'Something'
+              displayName: 'Something',
             },
           ],
           type: 'module',
-          displayName: 'Sample Markdown with YAML info'
+          displayName: 'Sample Markdown with YAML info',
         },
-      ]
-    }
+      ],
+    },
   },
   {
     file: fixtures.path('doc_with_backticks_in_headings.md'),
@@ -160,7 +160,7 @@ const testData = [
           properties: [
             {
               name: 'fullName',
-              textRaw: '`Fqhqwhgads.fullName`'
+              textRaw: '`Fqhqwhgads.fullName`',
             },
           ],
           classMethods: [
@@ -168,18 +168,18 @@ const testData = [
               name: 'again',
               signatures: [
                 {
-                  params: []
+                  params: [],
                 },
               ],
               textRaw: 'Static method: `Fhqwhgads.again()`',
-              type: 'classMethod'
+              type: 'classMethod',
             },
           ],
           classes: [
             {
               textRaw: 'Class: `ComeOn`',
               type: 'class',
-              name: 'ComeOn'
+              name: 'ComeOn',
             },
           ],
           ctors: [
@@ -187,11 +187,11 @@ const testData = [
               name: 'Fhqwhgads',
               signatures: [
                 {
-                  params: []
+                  params: [],
                 },
               ],
               textRaw: 'Constructor: `new Fhqwhgads()`',
-              type: 'ctor'
+              type: 'ctor',
             },
           ],
           methods: [
@@ -199,7 +199,7 @@ const testData = [
               textRaw: '`everybody.to(limit)`',
               type: 'method',
               name: 'to',
-              signatures: [{ params: [] }]
+              signatures: [{ params: [] }],
             },
           ],
           events: [
@@ -207,14 +207,14 @@ const testData = [
               textRaw: "Event: `'FHQWHfest'`",
               type: 'event',
               name: 'FHQWHfest',
-              params: []
+              params: [],
             },
           ],
           type: 'module',
-          displayName: 'Fhqwhgads'
+          displayName: 'Fhqwhgads',
         },
-      ]
-    }
+      ],
+    },
   },
 ];
 
diff --git a/test/doctool/test-make-doc.mjs b/test/doctool/test-make-doc.mjs
index 5771f4e1ce777f..33b949f06f92b0 100644
--- a/test/doctool/test-make-doc.mjs
+++ b/test/doctool/test-make-doc.mjs
@@ -21,7 +21,7 @@ const actualDocs = allDocs.filter(
   (name) => {
     const extension = path.extname(name);
     return extension === '.html' || extension === '.json';
-  }
+  },
 );
 
 for (const name of actualDocs) {
@@ -29,7 +29,7 @@ for (const name of actualDocs) {
 
   assert.ok(
     allMD.includes(name.replace(/\.\w+$/, '.md')),
-    `Unexpected output: out/doc/api/${name}, remove and rerun.`
+    `Unexpected output: out/doc/api/${name}, remove and rerun.`,
   );
 }
 
@@ -66,6 +66,6 @@ for (const actualDoc of actualDocs) {
   assert.notStrictEqual(
     fs.statSync(new URL(`./${actualDoc}`, apiURL)).size,
     0,
-    `${actualDoc} is empty`
+    `${actualDoc} is empty`,
   );
 }
diff --git a/test/fixtures/test-runner/dependency.js b/test/fixtures/test-runner/dependency.js
new file mode 100644
index 00000000000000..f053ebf7976e37
--- /dev/null
+++ b/test/fixtures/test-runner/dependency.js
@@ -0,0 +1 @@
+module.exports = {};
diff --git a/test/fixtures/test-runner/dependency.mjs b/test/fixtures/test-runner/dependency.mjs
new file mode 100644
index 00000000000000..cc798ff50da947
--- /dev/null
+++ b/test/fixtures/test-runner/dependency.mjs
@@ -0,0 +1 @@
+export const a = 1;
diff --git a/test/fixtures/test-runner/dependent.js b/test/fixtures/test-runner/dependent.js
new file mode 100644
index 00000000000000..c382b0f989e47b
--- /dev/null
+++ b/test/fixtures/test-runner/dependent.js
@@ -0,0 +1,3 @@
+require('./dependency.js');
+import('./dependency.mjs');
+import('data:text/javascript,');
diff --git a/test/fixtures/test-runner/invalid-tap.js b/test/fixtures/test-runner/invalid-tap.js
new file mode 100644
index 00000000000000..d43fb8ad5cb374
--- /dev/null
+++ b/test/fixtures/test-runner/invalid-tap.js
@@ -0,0 +1 @@
+console.log('invalid tap output');
diff --git a/test/fixtures/test-runner/nested.js b/test/fixtures/test-runner/nested.js
new file mode 100644
index 00000000000000..b539f872f883da
--- /dev/null
+++ b/test/fixtures/test-runner/nested.js
@@ -0,0 +1,24 @@
+'use strict';
+const test = require('node:test');
+
+
+
+test('level 0a', { concurrency: 4 }, async (t) => {
+  t.test('level 1a', async (t) => {
+  });
+
+  t.test('level 1b', async (t) => {
+    throw new Error('level 1b error');
+  });
+
+  t.test('level 1c', { skip: 'aaa' }, async (t) => {
+  });
+
+  t.test('level 1d', async (t) => {
+    t.diagnostic('level 1d diagnostic');
+  });
+});
+
+test('level 0b', async (t) => {
+  throw new Error('level 0b error');
+});
\ No newline at end of file
diff --git a/test/fixtures/test-runner/run_inspect.js b/test/fixtures/test-runner/run_inspect.js
index 1586b6aaccf082..bf9e3cc7f7042f 100644
--- a/test/fixtures/test-runner/run_inspect.js
+++ b/test/fixtures/test-runner/run_inspect.js
@@ -32,8 +32,8 @@ if (process.env.inspectPort === 'addTwo') {
 
 const stream = run({ files: [fixtures.path('test-runner/run_inspect_assert.js')], inspectPort });
 if (expectedError) {
-  stream.on('test:fail', common.mustCall(({ error }) => {
-    assert.deepStrictEqual({ name: error.cause.name, code: error.cause.code }, expectedError);
+  stream.on('test:fail', common.mustCall(({ details }) => {
+    assert.deepStrictEqual({ name: details.error.cause.name, code: details.error.cause.code }, expectedError);
   }));
 } else {
   stream.on('test:fail', common.mustNotCall());
diff --git a/test/fixtures/tz-version.txt b/test/fixtures/tz-version.txt
new file mode 100644
index 00000000000000..5c8fbb478a2cdf
--- /dev/null
+++ b/test/fixtures/tz-version.txt
@@ -0,0 +1 @@
+2022f
diff --git a/test/fixtures/watch-mode/ipc.js b/test/fixtures/watch-mode/ipc.js
index 021df9973511d0..5881299387e5b4 100644
--- a/test/fixtures/watch-mode/ipc.js
+++ b/test/fixtures/watch-mode/ipc.js
@@ -6,7 +6,7 @@ const tmpdir = require('../../common/tmpdir');
 const tmpfile = path.join(tmpdir.path, 'file');
 fs.writeFileSync(tmpfile, '');
 
-process.send({ 'watch:require': path.resolve(__filename) });
-process.send({ 'watch:import': url.pathToFileURL(path.resolve(__filename)).toString() });
-process.send({ 'watch:import': url.pathToFileURL(tmpfile).toString() });
-process.send({ 'watch:import': new URL('http://invalid.com').toString() });
+process.send({ 'watch:require': [path.resolve(__filename)] });
+process.send({ 'watch:import': [url.pathToFileURL(path.resolve(__filename)).toString()] });
+process.send({ 'watch:import': [url.pathToFileURL(tmpfile).toString()] });
+process.send({ 'watch:import': [new URL('http://invalid.com').toString()] });
diff --git a/test/fixtures/wpt/FileAPI/file/File-constructor.any.js b/test/fixtures/wpt/FileAPI/file/File-constructor.any.js
new file mode 100644
index 00000000000000..0b0185c40bf83c
--- /dev/null
+++ b/test/fixtures/wpt/FileAPI/file/File-constructor.any.js
@@ -0,0 +1,155 @@
+// META: title=File constructor
+
+const to_string_obj = { toString: () => 'a string' };
+const to_string_throws = { toString: () => { throw new Error('expected'); } };
+
+test(function() {
+  assert_true("File" in globalThis, "globalThis should have a File property.");
+}, "File interface object exists");
+
+test(t => {
+  assert_throws_js(TypeError, () => new File(),
+                   'Bits argument is required');
+  assert_throws_js(TypeError, () => new File([]),
+                   'Name argument is required');
+}, 'Required arguments');
+
+function test_first_argument(arg1, expectedSize, testName) {
+  test(function() {
+    var file = new File(arg1, "dummy");
+    assert_true(file instanceof File);
+    assert_equals(file.name, "dummy");
+    assert_equals(file.size, expectedSize);
+    assert_equals(file.type, "");
+    // assert_false(file.isClosed); XXX: File.isClosed doesn't seem to be implemented
+    assert_not_equals(file.lastModified, "");
+  }, testName);
+}
+
+test_first_argument([], 0, "empty fileBits");
+test_first_argument(["bits"], 4, "DOMString fileBits");
+test_first_argument(["𝓽𝓮𝔁𝓽"], 16, "Unicode DOMString fileBits");
+test_first_argument([new String('string object')], 13, "String object fileBits");
+test_first_argument([new Blob()], 0, "Empty Blob fileBits");
+test_first_argument([new Blob(["bits"])], 4, "Blob fileBits");
+test_first_argument([new File([], 'world.txt')], 0, "Empty File fileBits");
+test_first_argument([new File(["bits"], 'world.txt')], 4, "File fileBits");
+test_first_argument([new ArrayBuffer(8)], 8, "ArrayBuffer fileBits");
+test_first_argument([new Uint8Array([0x50, 0x41, 0x53, 0x53])], 4, "Typed array fileBits");
+test_first_argument(["bits", new Blob(["bits"]), new Blob(), new Uint8Array([0x50, 0x41]),
+                     new Uint16Array([0x5353]), new Uint32Array([0x53534150])], 16, "Various fileBits");
+test_first_argument([12], 2, "Number in fileBits");
+test_first_argument([[1,2,3]], 5, "Array in fileBits");
+test_first_argument([{}], 15, "Object in fileBits"); // "[object Object]"
+if (globalThis.document !== undefined) {
+  test_first_argument([document.body], 24, "HTMLBodyElement in fileBits"); // "[object HTMLBodyElement]"
+}
+test_first_argument([to_string_obj], 8, "Object with toString in fileBits");
+test_first_argument({[Symbol.iterator]() {
+  let i = 0;
+  return {next: () => [
+    {done:false, value:'ab'},
+    {done:false, value:'cde'},
+    {done:true}
+  ][i++]};
+}}, 5, 'Custom @@iterator');
+
+[
+  'hello',
+  0,
+  null
+].forEach(arg => {
+  test(t => {
+    assert_throws_js(TypeError, () => new File(arg, 'world.html'),
+                     'Constructor should throw for invalid bits argument');
+  }, `Invalid bits argument: ${JSON.stringify(arg)}`);
+});
+
+test(t => {
+  assert_throws_js(Error, () => new File([to_string_throws], 'name.txt'),
+                   'Constructor should propagate exceptions');
+}, 'Bits argument: object that throws');
+
+
+function test_second_argument(arg2, expectedFileName, testName) {
+  test(function() {
+    var file = new File(["bits"], arg2);
+    assert_true(file instanceof File);
+    assert_equals(file.name, expectedFileName);
+  }, testName);
+}
+
+test_second_argument("dummy", "dummy", "Using fileName");
+test_second_argument("dummy/foo", "dummy/foo",
+                     "No replacement when using special character in fileName");
+test_second_argument(null, "null", "Using null fileName");
+test_second_argument(1, "1", "Using number fileName");
+test_second_argument('', '', "Using empty string fileName");
+if (globalThis.document !== undefined) {
+  test_second_argument(document.body, '[object HTMLBodyElement]', "Using object fileName");
+}
+
+// testing the third argument
+[
+  {type: 'text/plain', expected: 'text/plain'},
+  {type: 'text/plain;charset=UTF-8', expected: 'text/plain;charset=utf-8'},
+  {type: 'TEXT/PLAIN', expected: 'text/plain'},
+  {type: '𝓽𝓮𝔁𝓽/𝔭𝔩𝔞𝔦𝔫', expected: ''},
+  {type: 'ascii/nonprintable\u001F', expected: ''},
+  {type: 'ascii/nonprintable\u007F', expected: ''},
+  {type: 'nonascii\u00EE', expected: ''},
+  {type: 'nonascii\u1234', expected: ''},
+  {type: 'nonparsable', expected: 'nonparsable'}
+].forEach(testCase => {
+  test(t => {
+    var file = new File(["bits"], "dummy", { type: testCase.type});
+    assert_true(file instanceof File);
+    assert_equals(file.type, testCase.expected);
+  }, `Using type in File constructor: ${testCase.type}`);
+});
+test(function() {
+  var file = new File(["bits"], "dummy", { lastModified: 42 });
+  assert_true(file instanceof File);
+  assert_equals(file.lastModified, 42);
+}, "Using lastModified");
+test(function() {
+  var file = new File(["bits"], "dummy", { name: "foo" });
+  assert_true(file instanceof File);
+  assert_equals(file.name, "dummy");
+}, "Misusing name");
+test(function() {
+  var file = new File(["bits"], "dummy", { unknownKey: "value" });
+  assert_true(file instanceof File);
+  assert_equals(file.name, "dummy");
+}, "Unknown properties are ignored");
+
+[
+  123,
+  123.4,
+  true,
+  'abc'
+].forEach(arg => {
+  test(t => {
+    assert_throws_js(TypeError, () => new File(['bits'], 'name.txt', arg),
+                     'Constructor should throw for invalid property bag type');
+  }, `Invalid property bag: ${JSON.stringify(arg)}`);
+});
+
+[
+  null,
+  undefined,
+  [1,2,3],
+  /regex/,
+  function() {}
+].forEach(arg => {
+  test(t => {
+    assert_equals(new File(['bits'], 'name.txt', arg).size, 4,
+                  'Constructor should accept object-ish property bag type');
+  }, `Unusual but valid property bag: ${arg}`);
+});
+
+test(t => {
+  assert_throws_js(Error,
+                   () => new File(['bits'], 'name.txt', {type: to_string_throws}),
+                   'Constructor should propagate exceptions');
+}, 'Property bag propagates exceptions');
diff --git a/test/fixtures/wpt/FileAPI/file/send-file-formdata-controls.any.js b/test/fixtures/wpt/FileAPI/file/send-file-formdata-controls.any.js
new file mode 100644
index 00000000000000..e95d3aada4421f
--- /dev/null
+++ b/test/fixtures/wpt/FileAPI/file/send-file-formdata-controls.any.js
@@ -0,0 +1,69 @@
+// META: title=FormData: FormData: Upload files named using controls
+// META: script=../support/send-file-formdata-helper.js
+  "use strict";
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-NUL-[\0].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-BS-[\b].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-VT-[\v].txt",
+  });
+
+  // These have characters that undergo processing in name=,
+  // filename=, and/or value; formDataPostFileUploadTest postprocesses
+  // expectedEncodedBaseName for these internally.
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-LF-[\n].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-LF-CR-[\n\r].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-CR-[\r].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-CR-LF-[\r\n].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-HT-[\t].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-FF-[\f].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-DEL-[\x7F].txt",
+  });
+
+  // The rest should be passed through unmodified:
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-ESC-[\x1B].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-SPACE-[ ].txt",
+  });
diff --git a/test/fixtures/wpt/FileAPI/file/send-file-formdata-punctuation.any.js b/test/fixtures/wpt/FileAPI/file/send-file-formdata-punctuation.any.js
new file mode 100644
index 00000000000000..987dba39aff3a1
--- /dev/null
+++ b/test/fixtures/wpt/FileAPI/file/send-file-formdata-punctuation.any.js
@@ -0,0 +1,144 @@
+// META: title=FormData: FormData: Upload files named using punctuation
+// META: script=../support/send-file-formdata-helper.js
+  "use strict";
+
+  // These have characters that undergo processing in name=,
+  // filename=, and/or value; formDataPostFileUploadTest postprocesses
+  // expectedEncodedBaseName for these internally.
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-QUOTATION-MARK-[\x22].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: '"file-for-upload-in-form-double-quoted.txt"',
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-REVERSE-SOLIDUS-[\\].txt",
+  });
+
+  // The rest should be passed through unmodified:
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-EXCLAMATION-MARK-[!].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-DOLLAR-SIGN-[$].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-PERCENT-SIGN-[%].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-AMPERSAND-[&].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-APOSTROPHE-['].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-LEFT-PARENTHESIS-[(].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-RIGHT-PARENTHESIS-[)].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-ASTERISK-[*].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-PLUS-SIGN-[+].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-COMMA-[,].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-FULL-STOP-[.].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-SOLIDUS-[/].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-COLON-[:].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-SEMICOLON-[;].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-EQUALS-SIGN-[=].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-QUESTION-MARK-[?].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-CIRCUMFLEX-ACCENT-[^].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-LEFT-SQUARE-BRACKET-[[].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-RIGHT-SQUARE-BRACKET-[]].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-LEFT-CURLY-BRACKET-[{].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-VERTICAL-LINE-[|].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-RIGHT-CURLY-BRACKET-[}].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form-TILDE-[~].txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "'file-for-upload-in-form-single-quoted.txt'",
+  });
diff --git a/test/fixtures/wpt/FileAPI/file/send-file-formdata-utf-8.any.js b/test/fixtures/wpt/FileAPI/file/send-file-formdata-utf-8.any.js
new file mode 100644
index 00000000000000..b8bd74c717a1b3
--- /dev/null
+++ b/test/fixtures/wpt/FileAPI/file/send-file-formdata-utf-8.any.js
@@ -0,0 +1,33 @@
+// META: title=FormData: FormData: Upload files in UTF-8 fetch()
+// META: script=../support/send-file-formdata-helper.js
+  "use strict";
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form.txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "x-user-defined",
+    fileBaseName: "file-for-upload-in-form-\uF7F0\uF793\uF783\uF7A0.txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "windows-1252",
+    fileBaseName: "file-for-upload-in-form-☺😂.txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "JIS X 0201 and JIS X 0208",
+    fileBaseName: "file-for-upload-in-form-★星★.txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "Unicode",
+    fileBaseName: "file-for-upload-in-form-☺😂.txt",
+  });
+
+  formDataPostFileUploadTest({
+    fileNameSource: "Unicode",
+    fileBaseName: `file-for-upload-in-form-${kTestChars}.txt`,
+  });
diff --git a/test/fixtures/wpt/FileAPI/file/send-file-formdata.any.js b/test/fixtures/wpt/FileAPI/file/send-file-formdata.any.js
new file mode 100644
index 00000000000000..e13a34828a0ebe
--- /dev/null
+++ b/test/fixtures/wpt/FileAPI/file/send-file-formdata.any.js
@@ -0,0 +1,8 @@
+// META: title=FormData: Upload ASCII-named file in UTF-8 form
+// META: script=../support/send-file-formdata-helper.js
+  "use strict";
+
+  formDataPostFileUploadTest({
+    fileNameSource: "ASCII",
+    fileBaseName: "file-for-upload-in-form.txt",
+  });
diff --git a/test/fixtures/wpt/README.md b/test/fixtures/wpt/README.md
index b4b0e9c151f1a3..6e2ce815a454fd 100644
--- a/test/fixtures/wpt/README.md
+++ b/test/fixtures/wpt/README.md
@@ -17,6 +17,7 @@ Last update:
 - encoding: https://github.com/web-platform-tests/wpt/tree/c1b24fce6e/encoding
 - fetch/data-urls/resources: https://github.com/web-platform-tests/wpt/tree/7c79d998ff/fetch/data-urls/resources
 - FileAPI: https://github.com/web-platform-tests/wpt/tree/3b279420d4/FileAPI
+- FileAPI/file: https://github.com/web-platform-tests/wpt/tree/c01f637cca/FileAPI/file
 - hr-time: https://github.com/web-platform-tests/wpt/tree/34cafd797e/hr-time
 - html/webappapis/atob: https://github.com/web-platform-tests/wpt/tree/f267e1dca6/html/webappapis/atob
 - html/webappapis/microtask-queuing: https://github.com/web-platform-tests/wpt/tree/2c5c3c4c27/html/webappapis/microtask-queuing
diff --git a/test/fixtures/wpt/versions.json b/test/fixtures/wpt/versions.json
index 374fce9d0dca89..2b6ae3401d3645 100644
--- a/test/fixtures/wpt/versions.json
+++ b/test/fixtures/wpt/versions.json
@@ -27,6 +27,10 @@
     "commit": "3b279420d40afea32506e823f9ac005448f4f3d8",
     "path": "FileAPI"
   },
+  "FileAPI/file": {
+    "commit": "c01f637cca43f0e08ce8e4269121dcd89ccbdd82",
+    "path": "FileAPI/file"
+  },
   "hr-time": {
     "commit": "34cafd797e58dad280d20040eee012d49ccfa91f",
     "path": "hr-time"
diff --git a/test/internet/test-dns-any.js b/test/internet/test-dns-any.js
index e721d0f99dcfd7..33556322a8d350 100644
--- a/test/internet/test-dns-any.js
+++ b/test/internet/test-dns-any.js
@@ -141,10 +141,10 @@ TEST(async function test_google_for_cname_and_srv(done) {
     assert.ok(types.SRV);
   }
 
-  validateResult(await dnsPromises.resolve('_jabber._tcp.google.com', 'ANY'));
+  validateResult(await dnsPromises.resolve('_caldav._tcp.google.com', 'ANY'));
 
   const req = dns.resolve(
-    '_jabber._tcp.google.com',
+    '_caldav._tcp.google.com',
     'ANY',
     common.mustSucceed((ret) => {
       validateResult(ret);
diff --git a/test/js-native-api/test_reference_double_free/test_reference_double_free.c b/test/js-native-api/test_reference_double_free/test_reference_double_free.c
index 32f08c8e66adf1..f491d237fded3e 100644
--- a/test/js-native-api/test_reference_double_free/test_reference_double_free.c
+++ b/test/js-native-api/test_reference_double_free/test_reference_double_free.c
@@ -44,6 +44,13 @@ static napi_value New(napi_env env, napi_callback_info info) {
 
 static void NoopDeleter(napi_env env, void* data, void* hint) {}
 
+// Tests that calling napi_remove_wrap and napi_delete_reference consecutively
+// doesn't crash the process.
+// This is analogous to the test https://github.com/nodejs/node-addon-api/blob/main/test/objectwrap_constructor_exception.cc.
+// In which the Napi::ObjectWrap<> is being destructed immediately after napi_wrap.
+// As Napi::ObjectWrap<> is a subclass of Napi::Reference<>, napi_remove_wrap
+// in the destructor of Napi::ObjectWrap<> is called before napi_delete_reference
+// in the destructor of Napi::Reference<>.
 static napi_value DeleteImmediately(napi_env env, napi_callback_info info) {
   size_t argc = 1;
   napi_value js_obj;
@@ -56,8 +63,8 @@ static napi_value DeleteImmediately(napi_env env, napi_callback_info info) {
   NODE_API_ASSERT(env, type == napi_object, "Expected object parameter");
 
   NODE_API_CALL(env, napi_wrap(env, js_obj, NULL, NoopDeleter, NULL, &ref));
-  NODE_API_CALL(env, napi_delete_reference(env, ref));
   NODE_API_CALL(env, napi_remove_wrap(env, js_obj, NULL));
+  NODE_API_CALL(env, napi_delete_reference(env, ref));
 
   return NULL;
 }
diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status
index b749eb8497743f..2f3d912a9b7ab1 100644
--- a/test/parallel/parallel.status
+++ b/test/parallel/parallel.status
@@ -5,10 +5,6 @@ prefix parallel
 # sample-test                        : PASS,FLAKY
 
 [true] # This section applies to all platforms
-# https://github.com/nodejs/node/issues/41123
-test-repl-sigint-nested-eval: PASS, FLAKY
-# https://github.com/nodejs/node/issues/43084
-test-worker-http2-stream-terminate: PASS, FLAKY
 
 [$system==win32]
 # https://github.com/nodejs/node/issues/24497
diff --git a/test/parallel/test-bootstrap-modules.js b/test/parallel/test-bootstrap-modules.js
index c0698fe1a96b5c..53da8b1af1492d 100644
--- a/test/parallel/test-bootstrap-modules.js
+++ b/test/parallel/test-bootstrap-modules.js
@@ -165,6 +165,7 @@ const expectedModules = new Set([
   'NativeModule internal/worker/js_transferable',
   'Internal Binding blob',
   'NativeModule internal/blob',
+  'NativeModule internal/file',
   'NativeModule async_hooks',
   'NativeModule net',
   'NativeModule path',
diff --git a/test/parallel/test-cli-eval.js b/test/parallel/test-cli-eval.js
index dcc2b8fcde3ca4..b993dd474149e9 100644
--- a/test/parallel/test-cli-eval.js
+++ b/test/parallel/test-cli-eval.js
@@ -354,3 +354,12 @@ child.exec(
   common.mustSucceed((stdout) => {
     assert.match(stdout, /^number/);
   }));
+
+// Regression test for https://github.com/nodejs/node/issues/45336
+child.execFile(process.execPath,
+               ['-p',
+                'Object.defineProperty(global, "fs", { configurable: false });' +
+                'fs === require("node:fs")'],
+               common.mustSucceed((stdout) => {
+                 assert.match(stdout, /^true/);
+               }));
diff --git a/test/parallel/test-cli-node-options.js b/test/parallel/test-cli-node-options.js
index 2d34a56e03c1a0..4d659a7b212441 100644
--- a/test/parallel/test-cli-node-options.js
+++ b/test/parallel/test-cli-node-options.js
@@ -72,6 +72,7 @@ expect('--disallow-code-generation-from-strings', 'B\n');
 expect('--huge-max-old-generation-size', 'B\n');
 expect('--jitless', 'B\n');
 expect('--max-old-space-size=0', 'B\n');
+expect('--max-semi-space-size=0', 'B\n');
 expect('--stack-trace-limit=100',
        /(\s*at f \(\[(eval|worker eval)\]:1:\d*\)\r?\n)/,
        '(function f() { f(); })();',
diff --git a/test/parallel/test-crypto-x509.js b/test/parallel/test-crypto-x509.js
index 510e3183cf3ce3..6d92e97115fd53 100644
--- a/test/parallel/test-crypto-x509.js
+++ b/test/parallel/test-crypto-x509.js
@@ -8,6 +8,7 @@ if (!common.hasCrypto)
 const {
   X509Certificate,
   createPrivateKey,
+  generateKeyPairSync,
 } = require('crypto');
 
 const {
@@ -186,6 +187,19 @@ const der = Buffer.from(
     code: 'ERR_INVALID_ARG_VALUE'
   });
 
+  {
+    // https://github.com/nodejs/node/issues/45377
+    // https://github.com/nodejs/node/issues/45485
+    // Confirm failures of X509Certificate:verify() and X509Certificate:CheckPrivateKey()
+    // do not affect other functions that use OpenSSL.
+    // Subsequent calls to e.g. createPrivateKey should not throw.
+    const keyPair = generateKeyPairSync('ed25519');
+    assert(!x509.verify(keyPair.publicKey));
+    createPrivateKey(key);
+    assert(!x509.checkPrivateKey(keyPair.privateKey));
+    createPrivateKey(key);
+  }
+
   // X509Certificate can be cloned via MessageChannel/MessagePort
   const mc = new MessageChannel();
   mc.port1.onmessage = common.mustCall(({ data }) => {
diff --git a/test/parallel/test-event-capture-rejections.js b/test/parallel/test-event-capture-rejections.js
index b6dad65d364854..ea2db46ec2c5a0 100644
--- a/test/parallel/test-event-capture-rejections.js
+++ b/test/parallel/test-event-capture-rejections.js
@@ -18,7 +18,7 @@ function NoConstructor() {
         name: 'TypeError',
         code: 'ERR_INVALID_ARG_TYPE',
         message: 'The "options.captureRejections" property must be of type boolean.' +
-                 common.invalidArgTypeHelper(arg)
+                 common.invalidArgTypeHelper(arg),
       }
     );
   });
@@ -160,7 +160,7 @@ function thenable() {
           assert.strictEqual(resolved, undefined);
           rejected(_err);
         });
-      }, 1) // Only 1 call for Promises/A+ compat.
+      }, 1), // Only 1 call for Promises/A+ compat.
     });
 
     return obj;
@@ -235,7 +235,7 @@ function thenableThatThrows() {
     Object.defineProperty(obj, 'then', {
       get: common.mustCall(() => {
         throw _err;
-      }, 1) // Only 1 call for Promises/A+ compat.
+      }, 1), // Only 1 call for Promises/A+ compat.
     });
 
     return obj;
@@ -301,14 +301,14 @@ function argValidation() {
       code: 'ERR_INVALID_ARG_TYPE',
       name: 'TypeError',
       message: 'The "options.captureRejections" property must be of type ' +
-               `boolean. Received ${received}`
+               `boolean. Received ${received}`,
     });
 
     assert.throws(() => EventEmitter.captureRejections = obj, {
       code: 'ERR_INVALID_ARG_TYPE',
       name: 'TypeError',
       message: 'The "EventEmitter.captureRejections" property must be of ' +
-               `type boolean. Received ${received}`
+               `type boolean. Received ${received}`,
     });
   }
 
diff --git a/test/parallel/test-event-emitter-errors.js b/test/parallel/test-event-emitter-errors.js
index 0a5e707a61a178..f22fc3bd58c2b1 100644
--- a/test/parallel/test-event-emitter-errors.js
+++ b/test/parallel/test-event-emitter-errors.js
@@ -11,7 +11,7 @@ assert.throws(
   {
     code: 'ERR_UNHANDLED_ERROR',
     name: 'Error',
-    message: "Unhandled error. ('Accepts a string')"
+    message: "Unhandled error. ('Accepts a string')",
   }
 );
 
@@ -20,18 +20,18 @@ assert.throws(
   {
     code: 'ERR_UNHANDLED_ERROR',
     name: 'Error',
-    message: "Unhandled error. ({ message: 'Error!' })"
+    message: "Unhandled error. ({ message: 'Error!' })",
   }
 );
 
 assert.throws(
   () => EE.emit('error', {
     message: 'Error!',
-    [util.inspect.custom]() { throw new Error(); }
+    [util.inspect.custom]() { throw new Error(); },
   }),
   {
     code: 'ERR_UNHANDLED_ERROR',
     name: 'Error',
-    message: 'Unhandled error. ([object Object])'
+    message: 'Unhandled error. ([object Object])',
   }
 );
diff --git a/test/parallel/test-event-emitter-invalid-listener.js b/test/parallel/test-event-emitter-invalid-listener.js
index 3070d4ed7517de..1abd84e1acc723 100644
--- a/test/parallel/test-event-emitter-invalid-listener.js
+++ b/test/parallel/test-event-emitter-invalid-listener.js
@@ -15,6 +15,6 @@ for (const method of eventsMethods) {
     code: 'ERR_INVALID_ARG_TYPE',
     name: 'TypeError',
     message: 'The "listener" argument must be of type function. ' +
-             'Received null'
+             'Received null',
   }, `event.${method}('foo', null) should throw the proper error`);
 }
diff --git a/test/parallel/test-event-emitter-max-listeners.js b/test/parallel/test-event-emitter-max-listeners.js
index a881bf86497f16..7bd1a6d619af23 100644
--- a/test/parallel/test-event-emitter-max-listeners.js
+++ b/test/parallel/test-event-emitter-max-listeners.js
@@ -40,7 +40,7 @@ for (const obj of throwsObjs) {
       code: 'ERR_OUT_OF_RANGE',
       name: 'RangeError',
       message: 'The value of "n" is out of range. ' +
-               `It must be a non-negative number. Received ${inspect(obj)}`
+               `It must be a non-negative number. Received ${inspect(obj)}`,
     }
   );
 
@@ -50,7 +50,7 @@ for (const obj of throwsObjs) {
       code: 'ERR_OUT_OF_RANGE',
       name: 'RangeError',
       message: 'The value of "defaultMaxListeners" is out of range. ' +
-               `It must be a non-negative number. Received ${inspect(obj)}`
+               `It must be a non-negative number. Received ${inspect(obj)}`,
     }
   );
 }
diff --git a/test/parallel/test-eventemitter-asyncresource.js b/test/parallel/test-eventemitter-asyncresource.js
index 8290cdee1f20fb..8466b1b66f2d1e 100644
--- a/test/parallel/test-eventemitter-asyncresource.js
+++ b/test/parallel/test-eventemitter-asyncresource.js
@@ -41,7 +41,7 @@ function makeHook(trackedTypes) {
 
     before(asyncId) { log(asyncId, 'before'); },
     after(asyncId) { log(asyncId, 'after'); },
-    destroy(asyncId) { log(asyncId, 'destroy'); }
+    destroy(asyncId) { log(asyncId, 'destroy'); },
   }).enable();
 
   return {
@@ -51,7 +51,7 @@ function makeHook(trackedTypes) {
     },
     ids() {
       return new Set(eventMap.keys());
-    }
+    },
   };
 }
 
@@ -150,7 +150,7 @@ throws(
       code: 'ERR_INVALID_THIS',
       name: /TypeError/,
       message: 'Value of "this" must be of type EventEmitterAsyncResource',
-      stack: new RegExp(`at get ${getter}`)
+      stack: new RegExp(`at get ${getter}`),
     }
   );
 });
diff --git a/test/parallel/test-events-on-async-iterator.js b/test/parallel/test-events-on-async-iterator.js
index dbd27a8a44693e..94f66a81edb0c0 100644
--- a/test/parallel/test-events-on-async-iterator.js
+++ b/test/parallel/test-events-on-async-iterator.js
@@ -5,7 +5,7 @@ const common = require('../common');
 const assert = require('assert');
 const { on, EventEmitter } = require('events');
 const {
-  NodeEventTarget
+  NodeEventTarget,
 } = require('internal/event_target');
 
 async function basic() {
@@ -131,18 +131,18 @@ async function next() {
 
   assert.deepStrictEqual(results, [{
     value: ['bar'],
-    done: false
+    done: false,
   }, {
     value: [42],
-    done: false
+    done: false,
   }, {
     value: undefined,
-    done: true
+    done: true,
   }]);
 
   assert.deepStrictEqual(await iterable.next(), {
     value: undefined,
-    done: true
+    done: true,
   });
 }
 
@@ -160,19 +160,19 @@ async function nextError() {
   ]);
   assert.deepStrictEqual(results, [{
     status: 'rejected',
-    reason: _err
+    reason: _err,
   }, {
     status: 'fulfilled',
     value: {
       value: undefined,
-      done: true
-    }
+      done: true,
+    },
   }, {
     status: 'fulfilled',
     value: {
       value: undefined,
-      done: true
-    }
+      done: true,
+    },
   }]);
   assert.strictEqual(ee.listeners('error').length, 0);
 }
@@ -196,7 +196,7 @@ async function iterableThrow() {
   }, {
     message: 'The "EventEmitter.AsyncIterator" property must be' +
     ' an instance of Error. Received undefined',
-    name: 'TypeError'
+    name: 'TypeError',
   });
 
   const expected = [['bar'], [42]];
@@ -258,11 +258,11 @@ async function abortableOnBefore() {
   const abortedSignal = AbortSignal.abort();
   [1, {}, null, false, 'hi'].forEach((signal) => {
     assert.throws(() => on(ee, 'foo', { signal }), {
-      code: 'ERR_INVALID_ARG_TYPE'
+      code: 'ERR_INVALID_ARG_TYPE',
     });
   });
   assert.throws(() => on(ee, 'foo', { signal: abortedSignal }), {
-    name: 'AbortError'
+    name: 'AbortError',
   });
 }
 
@@ -271,11 +271,11 @@ async function eventTargetAbortableOnBefore() {
   const abortedSignal = AbortSignal.abort();
   [1, {}, null, false, 'hi'].forEach((signal) => {
     assert.throws(() => on(et, 'foo', { signal }), {
-      code: 'ERR_INVALID_ARG_TYPE'
+      code: 'ERR_INVALID_ARG_TYPE',
     });
   });
   assert.throws(() => on(et, 'foo', { signal: abortedSignal }), {
-    name: 'AbortError'
+    name: 'AbortError',
   });
 }
 
diff --git a/test/parallel/test-events-once.js b/test/parallel/test-events-once.js
index 6acb795653590b..0b1d5677f60109 100644
--- a/test/parallel/test-events-once.js
+++ b/test/parallel/test-events-once.js
@@ -165,12 +165,12 @@ async function abortSignalBefore() {
 
   await Promise.all([1, {}, 'hi', null, false].map((signal) => {
     return rejects(once(ee, 'foo', { signal }), {
-      code: 'ERR_INVALID_ARG_TYPE'
+      code: 'ERR_INVALID_ARG_TYPE',
     });
   }));
 
   return rejects(once(ee, 'foo', { signal: abortedSignal }), {
-    name: 'AbortError'
+    name: 'AbortError',
   });
 }
 
@@ -179,7 +179,7 @@ async function abortSignalAfter() {
   const ac = new AbortController();
   ee.on('error', common.mustNotCall());
   const r = rejects(once(ee, 'foo', { signal: ac.signal }), {
-    name: 'AbortError'
+    name: 'AbortError',
   });
   process.nextTick(() => ac.abort());
   return r;
@@ -217,12 +217,12 @@ async function eventTargetAbortSignalBefore() {
 
   await Promise.all([1, {}, 'hi', null, false].map((signal) => {
     return rejects(once(et, 'foo', { signal }), {
-      code: 'ERR_INVALID_ARG_TYPE'
+      code: 'ERR_INVALID_ARG_TYPE',
     });
   }));
 
   return rejects(once(et, 'foo', { signal: abortedSignal }), {
-    name: 'AbortError'
+    name: 'AbortError',
   });
 }
 
@@ -230,7 +230,7 @@ async function eventTargetAbortSignalAfter() {
   const et = new EventTarget();
   const ac = new AbortController();
   const r = rejects(once(et, 'foo', { signal: ac.signal }), {
-    name: 'AbortError'
+    name: 'AbortError',
   });
   process.nextTick(() => ac.abort());
   return r;
diff --git a/test/parallel/test-events-static-geteventlisteners.js b/test/parallel/test-events-static-geteventlisteners.js
index eba92de4a00c90..b6370f7e159d13 100644
--- a/test/parallel/test-events-static-geteventlisteners.js
+++ b/test/parallel/test-events-static-geteventlisteners.js
@@ -5,7 +5,7 @@ const { kWeakHandler } = require('internal/event_target');
 
 const {
   deepStrictEqual,
-  throws
+  throws,
 } = require('assert');
 
 const { getEventListeners, EventEmitter } = require('events');
diff --git a/test/parallel/test-eventtarget-memoryleakwarning.js b/test/parallel/test-eventtarget-memoryleakwarning.js
index d58a4edb37a299..bb4002e30c6e6d 100644
--- a/test/parallel/test-eventtarget-memoryleakwarning.js
+++ b/test/parallel/test-eventtarget-memoryleakwarning.js
@@ -3,7 +3,7 @@
 const common = require('../common');
 const {
   setMaxListeners,
-  EventEmitter
+  EventEmitter,
 } = require('events');
 const assert = require('assert');
 
diff --git a/test/parallel/test-eventtarget.js b/test/parallel/test-eventtarget.js
index a6336cfee02467..b7898391a793b5 100644
--- a/test/parallel/test-eventtarget.js
+++ b/test/parallel/test-eventtarget.js
@@ -65,7 +65,7 @@ let asyncTest = Promise.resolve();
       code: 'ERR_INVALID_ARG_TYPE',
       name: 'TypeError',
       message: 'The "options" argument must be of type object.' +
-               common.invalidArgTypeHelper(i)
+               common.invalidArgTypeHelper(i),
     })
   ));
 }
@@ -141,7 +141,7 @@ let asyncTest = Promise.resolve();
     handleEvent: common.mustCall(function(event) {
       strictEqual(event.type, 'foo');
       strictEqual(this, ev2);
-    })
+    }),
   };
 
   eventTarget.addEventListener('foo', ev1);
@@ -318,7 +318,7 @@ let asyncTest = Promise.resolve();
       code: 'ERR_INVALID_ARG_TYPE',
       name: 'TypeError',
       message: 'The "event" argument must be an instance of Event.' +
-               common.invalidArgTypeHelper(i)
+               common.invalidArgTypeHelper(i),
     });
   });
 
@@ -326,7 +326,7 @@ let asyncTest = Promise.resolve();
     code: 'ERR_INVALID_ARG_TYPE',
     name: 'TypeError',
     message: 'The "listener" argument must be an instance of EventListener.' +
-             common.invalidArgTypeHelper(arg)
+             common.invalidArgTypeHelper(arg),
   });
 
   [
@@ -388,7 +388,7 @@ let asyncTest = Promise.resolve();
   const event = new Event('foo');
   target1.addEventListener('foo', common.mustCall((event) => {
     throws(() => target2.dispatchEvent(event), {
-      code: 'ERR_EVENT_RECURSION'
+      code: 'ERR_EVENT_RECURSION',
     });
   }));
   target1.dispatchEvent(event);
@@ -486,7 +486,7 @@ let asyncTest = Promise.resolve();
     /a/,
   ].forEach((i) => {
     throws(() => target.dispatchEvent.call(i, event), {
-      code: 'ERR_INVALID_THIS'
+      code: 'ERR_INVALID_THIS',
     });
   });
 }
@@ -636,12 +636,12 @@ let asyncTest = Promise.resolve();
 {
   const ev = new Event('test');
   const evConstructorName = inspect(ev, {
-    depth: -1
+    depth: -1,
   });
   strictEqual(evConstructorName, 'Event');
 
   const inspectResult = inspect(ev, {
-    depth: 1
+    depth: 1,
   });
   ok(inspectResult.includes('Event'));
 }
@@ -649,7 +649,7 @@ let asyncTest = Promise.resolve();
 {
   const et = new EventTarget();
   const inspectResult = inspect(et, {
-    depth: 1
+    depth: 1,
   });
   ok(inspectResult.includes('EventTarget'));
 }
diff --git a/test/parallel/test-file.js b/test/parallel/test-file.js
new file mode 100644
index 00000000000000..64a83f77ef919d
--- /dev/null
+++ b/test/parallel/test-file.js
@@ -0,0 +1,155 @@
+'use strict';
+
+const common = require('../common');
+const assert = require('assert');
+const { Blob, File } = require('buffer');
+const { inspect } = require('util');
+
+{
+  // ensure File extends Blob
+  assert.deepStrictEqual(Object.getPrototypeOf(File.prototype), Blob.prototype);
+}
+
+{
+  assert.throws(() => new File(), TypeError);
+  assert.throws(() => new File([]), TypeError);
+}
+
+{
+  const properties = ['name', 'lastModified'];
+
+  for (const prop of properties) {
+    const desc = Object.getOwnPropertyDescriptor(File.prototype, prop);
+    assert.notStrictEqual(desc, undefined);
+    // Ensure these properties are getters.
+    assert.strictEqual(desc.get?.name, `get ${prop}`);
+    assert.strictEqual(desc.set, undefined);
+    assert.strictEqual(desc.enumerable, true);
+    assert.strictEqual(desc.configurable, true);
+  }
+}
+
+{
+  const file = new File([], '');
+  assert.strictEqual(file[Symbol.toStringTag], 'File');
+  assert.strictEqual(File.prototype[Symbol.toStringTag], 'File');
+}
+
+{
+  assert.throws(() => File.prototype.name, TypeError);
+  assert.throws(() => File.prototype.lastModified, TypeError);
+}
+
+{
+  const keys = Object.keys(File.prototype).sort();
+  assert.deepStrictEqual(keys, ['lastModified', 'name']);
+}
+
+{
+  const file = new File([], 'dummy.txt.exe');
+  assert.strictEqual(file.name, 'dummy.txt.exe');
+  assert.strictEqual(file.size, 0);
+  assert.strictEqual(typeof file.lastModified, 'number');
+  assert(file.lastModified <= Date.now());
+}
+
+{
+  const emptyFile = new File([], 'empty.txt');
+  const blob = new Blob(['hello world']);
+
+  emptyFile.text.call(blob).then(common.mustCall((text) => {
+    assert.strictEqual(text, 'hello world');
+  }));
+}
+
+{
+  const toPrimitive = {
+    [Symbol.toPrimitive]() {
+      return 'NaN';
+    }
+  };
+
+  const invalidLastModified = [
+    null,
+    'string',
+    false,
+    toPrimitive,
+  ];
+
+  for (const lastModified of invalidLastModified) {
+    const file = new File([], '', { lastModified });
+    assert.strictEqual(file.lastModified, 0);
+  }
+}
+
+{
+  const file = new File([], '', { lastModified: undefined });
+  assert.notStrictEqual(file.lastModified, 0);
+}
+
+{
+  const toPrimitive = {
+    [Symbol.toPrimitive]() {
+      throw new TypeError('boom');
+    }
+  };
+
+  const throwValues = [
+    BigInt(3n),
+    toPrimitive,
+  ];
+
+  for (const lastModified of throwValues) {
+    assert.throws(() => new File([], '', { lastModified }), TypeError);
+  }
+}
+
+{
+  const valid = [
+    {
+      [Symbol.toPrimitive]() {
+        return 10;
+      }
+    },
+    new Number(10),
+    10,
+  ];
+
+  for (const lastModified of valid) {
+    assert.strictEqual(new File([], '', { lastModified }).lastModified, 10);
+  }
+}
+
+{
+  const file = new File([], '');
+  assert(inspect(file).startsWith('File { size: 0, type: \'\', name: \'\', lastModified:'));
+}
+
+{
+  function MyClass() {}
+  MyClass.prototype.lastModified = 10;
+
+  const file = new File([], '', new MyClass());
+  assert.strictEqual(file.lastModified, 10);
+}
+
+{
+  let counter = 0;
+  new File([], '', {
+    get lastModified() {
+      counter++;
+      return 10;
+    }
+  });
+  assert.strictEqual(counter, 1);
+}
+
+{
+  const getter = Object.getOwnPropertyDescriptor(File.prototype, 'name').get;
+  assert.throws(
+    () => getter.call(undefined), // eslint-disable-line no-useless-call
+    {
+      code: 'ERR_INVALID_THIS',
+    }
+  );
+}
diff --git a/test/parallel/test-fs-readv-promises.js b/test/parallel/test-fs-readv-promises.js
index ae3c92926ea221..3d698f2536a7f2 100644
--- a/test/parallel/test-fs-readv-promises.js
+++ b/test/parallel/test-fs-readv-promises.js
@@ -29,7 +29,6 @@ const allocateEmptyBuffers = (combinedLength) => {
     const filename = getFileName();
     await fs.writeFile(filename, exptectedBuff);
     const handle = await fs.open(filename, 'r');
-    // const buffer = Buffer.from(expected);
     const bufferArr = allocateEmptyBuffers(exptectedBuff.length);
     const expectedLength = exptectedBuff.length;
 
@@ -49,7 +48,6 @@ const allocateEmptyBuffers = (combinedLength) => {
     const filename = getFileName();
     await fs.writeFile(filename, exptectedBuff);
     const handle = await fs.open(filename, 'r');
-    // const buffer = Buffer.from(expected);
     const bufferArr = allocateEmptyBuffers(exptectedBuff.length);
     const expectedLength = exptectedBuff.length;
 
diff --git a/test/parallel/test-fs-rm.js b/test/parallel/test-fs-rm.js
index 6723d2b1cabd85..e6bc47038b8d92 100644
--- a/test/parallel/test-fs-rm.js
+++ b/test/parallel/test-fs-rm.js
@@ -49,6 +49,15 @@ function makeNonEmptyDirectory(depth, files, folders, dirname, createSymLinks) {
       path.join(dirname, `link-${depth}-bad`),
       'file'
     );
+
+    // Symlinks that form a loop
+    [['a', 'b'], ['b', 'a']].forEach(([x, y]) => {
+      fs.symlinkSync(
+        `link-${depth}-loop-${x}`,
+        path.join(dirname, `link-${depth}-loop-${y}`),
+        'file'
+      );
+    });
   }
 
   // File with a name that looks like a glob
@@ -88,7 +97,7 @@ function removeAsync(dir) {
 
         // Attempted removal should fail now because the directory is gone.
         fs.rm(dir, common.mustCall((err) => {
-          assert.strictEqual(err.syscall, 'stat');
+          assert.strictEqual(err.syscall, 'lstat');
         }));
       }));
     }));
@@ -137,6 +146,48 @@ function removeAsync(dir) {
       fs.rmSync(filePath, common.mustNotMutateObjectDeep({ force: true }));
     }
   }));
+
+  // Should delete a valid symlink
+  const linkTarget = path.join(tmpdir.path, 'link-target-async.txt');
+  fs.writeFileSync(linkTarget, '');
+  const validLink = path.join(tmpdir.path, 'valid-link-async');
+  fs.symlinkSync(linkTarget, validLink);
+  fs.rm(validLink, common.mustNotMutateObjectDeep({ recursive: true }), common.mustCall((err) => {
+    try {
+      assert.strictEqual(err, null);
+      assert.strictEqual(fs.existsSync(validLink), false);
+    } finally {
+      fs.rmSync(linkTarget, common.mustNotMutateObjectDeep({ force: true }));
+      fs.rmSync(validLink, common.mustNotMutateObjectDeep({ force: true }));
+    }
+  }));
+
+  // Should delete an invalid symlink
+  const invalidLink = path.join(tmpdir.path, 'invalid-link-async');
+  fs.symlinkSync('definitely-does-not-exist-async', invalidLink);
+  fs.rm(invalidLink, common.mustNotMutateObjectDeep({ recursive: true }), common.mustCall((err) => {
+    try {
+      assert.strictEqual(err, null);
+      assert.strictEqual(fs.existsSync(invalidLink), false);
+    } finally {
+      fs.rmSync(invalidLink, common.mustNotMutateObjectDeep({ force: true }));
+    }
+  }));
+
+  // Should delete a symlink that is part of a loop
+  const loopLinkA = path.join(tmpdir.path, 'loop-link-async-a');
+  const loopLinkB = path.join(tmpdir.path, 'loop-link-async-b');
+  fs.symlinkSync(loopLinkA, loopLinkB);
+  fs.symlinkSync(loopLinkB, loopLinkA);
+  fs.rm(loopLinkA, common.mustNotMutateObjectDeep({ recursive: true }), common.mustCall((err) => {
+    try {
+      assert.strictEqual(err, null);
+      assert.strictEqual(fs.existsSync(loopLinkA), false);
+    } finally {
+      fs.rmSync(loopLinkA, common.mustNotMutateObjectDeep({ force: true }));
+      fs.rmSync(loopLinkB, common.mustNotMutateObjectDeep({ force: true }));
+    }
+  }));
 }
 
 // Removing a .git directory should not throw an EPERM.
@@ -168,7 +219,7 @@ if (isGitPresent) {
   }, {
     code: 'ENOENT',
     name: 'Error',
-    message: /^ENOENT: no such file or directory, stat/
+    message: /^ENOENT: no such file or directory, lstat/
   });
 
   // Should delete a file
@@ -177,25 +228,64 @@ if (isGitPresent) {
 
   try {
     fs.rmSync(filePath, common.mustNotMutateObjectDeep({ recursive: true }));
+    assert.strictEqual(fs.existsSync(filePath), false);
   } finally {
     fs.rmSync(filePath, common.mustNotMutateObjectDeep({ force: true }));
   }
 
+  // Should delete a valid symlink
+  const linkTarget = path.join(tmpdir.path, 'link-target.txt');
+  fs.writeFileSync(linkTarget, '');
+  const validLink = path.join(tmpdir.path, 'valid-link');
+  fs.symlinkSync(linkTarget, validLink);
+  try {
+    fs.rmSync(validLink);
+    assert.strictEqual(fs.existsSync(validLink), false);
+  } finally {
+    fs.rmSync(linkTarget, common.mustNotMutateObjectDeep({ force: true }));
+    fs.rmSync(validLink, common.mustNotMutateObjectDeep({ force: true }));
+  }
+
+  // Should delete an invalid symlink
+  const invalidLink = path.join(tmpdir.path, 'invalid-link');
+  fs.symlinkSync('definitely-does-not-exist', invalidLink);
+  try {
+    fs.rmSync(invalidLink);
+    assert.strictEqual(fs.existsSync(invalidLink), false);
+  } finally {
+    fs.rmSync(invalidLink, common.mustNotMutateObjectDeep({ force: true }));
+  }
+
+  // Should delete a symlink that is part of a loop
+  const loopLinkA = path.join(tmpdir.path, 'loop-link-a');
+  const loopLinkB = path.join(tmpdir.path, 'loop-link-b');
+  fs.symlinkSync(loopLinkA, loopLinkB);
+  fs.symlinkSync(loopLinkB, loopLinkA);
+  try {
+    fs.rmSync(loopLinkA);
+    assert.strictEqual(fs.existsSync(loopLinkA), false);
+  } finally {
+    fs.rmSync(loopLinkA, common.mustNotMutateObjectDeep({ force: true }));
+    fs.rmSync(loopLinkB, common.mustNotMutateObjectDeep({ force: true }));
+  }
+
   // Should accept URL
   const fileURL = pathToFileURL(path.join(tmpdir.path, 'rm-file.txt'));
   fs.writeFileSync(fileURL, '');
 
   try {
     fs.rmSync(fileURL, common.mustNotMutateObjectDeep({ recursive: true }));
+    assert.strictEqual(fs.existsSync(fileURL), false);
   } finally {
     fs.rmSync(fileURL, common.mustNotMutateObjectDeep({ force: true }));
   }
 
   // Recursive removal should succeed.
   fs.rmSync(dir, { recursive: true });
+  assert.strictEqual(fs.existsSync(dir), false);
 
   // Attempted removal should fail now because the directory is gone.
-  assert.throws(() => fs.rmSync(dir), { syscall: 'stat' });
+  assert.throws(() => fs.rmSync(dir), { syscall: 'lstat' });
 }
 
 // Removing a .git directory should not throw an EPERM.
@@ -220,9 +310,10 @@ if (isGitPresent) {
 
   // Recursive removal should succeed.
   await fs.promises.rm(dir, common.mustNotMutateObjectDeep({ recursive: true }));
+  assert.strictEqual(fs.existsSync(dir), false);
 
   // Attempted removal should fail now because the directory is gone.
-  await assert.rejects(fs.promises.rm(dir), { syscall: 'stat' });
+  await assert.rejects(fs.promises.rm(dir), { syscall: 'lstat' });
 
   // Should fail if target does not exist
   await assert.rejects(fs.promises.rm(
@@ -231,7 +322,7 @@ if (isGitPresent) {
   ), {
     code: 'ENOENT',
     name: 'Error',
-    message: /^ENOENT: no such file or directory, stat/
+    message: /^ENOENT: no such file or directory, lstat/
   });
 
   // Should not fail if target does not exist and force option is true
@@ -243,16 +334,54 @@ if (isGitPresent) {
 
   try {
     await fs.promises.rm(filePath, common.mustNotMutateObjectDeep({ recursive: true }));
+    assert.strictEqual(fs.existsSync(filePath), false);
   } finally {
     fs.rmSync(filePath, common.mustNotMutateObjectDeep({ force: true }));
   }
 
+  // Should delete a valid symlink
+  const linkTarget = path.join(tmpdir.path, 'link-target-prom.txt');
+  fs.writeFileSync(linkTarget, '');
+  const validLink = path.join(tmpdir.path, 'valid-link-prom');
+  fs.symlinkSync(linkTarget, validLink);
+  try {
+    await fs.promises.rm(validLink);
+    assert.strictEqual(fs.existsSync(validLink), false);
+  } finally {
+    fs.rmSync(linkTarget, common.mustNotMutateObjectDeep({ force: true }));
+    fs.rmSync(validLink, common.mustNotMutateObjectDeep({ force: true }));
+  }
+
+  // Should delete an invalid symlink
+  const invalidLink = path.join(tmpdir.path, 'invalid-link-prom');
+  fs.symlinkSync('definitely-does-not-exist-prom', invalidLink);
+  try {
+    await fs.promises.rm(invalidLink);
+    assert.strictEqual(fs.existsSync(invalidLink), false);
+  } finally {
+    fs.rmSync(invalidLink, common.mustNotMutateObjectDeep({ force: true }));
+  }
+
+  // Should delete a symlink that is part of a loop
+  const loopLinkA = path.join(tmpdir.path, 'loop-link-prom-a');
+  const loopLinkB = path.join(tmpdir.path, 'loop-link-prom-b');
+  fs.symlinkSync(loopLinkA, loopLinkB);
+  fs.symlinkSync(loopLinkB, loopLinkA);
+  try {
+    await fs.promises.rm(loopLinkA);
+    assert.strictEqual(fs.existsSync(loopLinkA), false);
+  } finally {
+    fs.rmSync(loopLinkA, common.mustNotMutateObjectDeep({ force: true }));
+    fs.rmSync(loopLinkB, common.mustNotMutateObjectDeep({ force: true }));
+  }
+
   // Should accept URL
   const fileURL = pathToFileURL(path.join(tmpdir.path, 'rm-promises-file.txt'));
   fs.writeFileSync(fileURL, '');
 
   try {
     await fs.promises.rm(fileURL, common.mustNotMutateObjectDeep({ recursive: true }));
+    assert.strictEqual(fs.existsSync(fileURL), false);
   } finally {
     fs.rmSync(fileURL, common.mustNotMutateObjectDeep({ force: true }));
   }
diff --git a/test/parallel/test-http-set-headers-distinct.js b/test/parallel/test-http-set-headers-distinct.js
deleted file mode 100644
index 3a3c99cdcc5f00..00000000000000
--- a/test/parallel/test-http-set-headers-distinct.js
+++ /dev/null
@@ -1,54 +0,0 @@
-'use strict';
-
-const common = require('../common');
-const assert = require('assert');
-const { createServer, request } = require('http');
-
-const server = createServer(
-  common.mustCall((req, res) => {
-    req.headersDistinct = { 'x-req-a': ['zzz'] };
-
-    // headersDistinct setter should be a No-Op
-    assert.deepStrictEqual(req.headersDistinct, {
-      'transfer-encoding': [
-        'chunked',
-      ],
-      'connection': [
-        'keep-alive',
-      ],
-      'host': [
-        `127.0.0.1:${server.address().port}`,
-      ]
-    });
-
-    req.on('end', function() {
-      res.write('BODY');
-      res.end();
-    });
-
-    req.resume();
-  })
-);
-
-server.listen(
-  0,
-  common.mustCall(() => {
-    const req = request(
-      {
-        host: '127.0.0.1',
-        port: server.address().port,
-        path: '/',
-        method: 'POST',
-      },
-      common.mustCall((res) => {
-        res.on('end', function() {
-          server.close();
-        });
-        res.resume();
-      })
-    );
-
-    req.write('BODY');
-    req.end();
-  })
-);
diff --git a/test/parallel/test-inspector-tracing-domain.js b/test/parallel/test-inspector-tracing-domain.js
index a1f9724dab677f..f5ac6875a0f643 100644
--- a/test/parallel/test-inspector-tracing-domain.js
+++ b/test/parallel/test-inspector-tracing-domain.js
@@ -10,12 +10,6 @@ const { Session } = require('inspector');
 
 const session = new Session();
 
-function compareIgnoringOrder(array1, array2) {
-  const set = new Set(array1);
-  const test = set.size === array2.length && array2.every((el) => set.has(el));
-  assert.ok(test, `[${array1}] differs from [${array2}]`);
-}
-
 function post(message, data) {
   return new Promise((resolve, reject) => {
     session.post(message, data, (err, result) => {
@@ -48,25 +42,33 @@ async function test() {
   session.on('NodeTracing.dataCollected', (n) => traceNotification = n);
   session.on('NodeTracing.tracingComplete', () => tracingComplete = true);
   const { categories } = await post('NodeTracing.getCategories');
-  compareIgnoringOrder(['node',
-                        'node.async_hooks',
-                        'node.bootstrap',
-                        'node.console',
-                        'node.dns.native',
-                        'node.net.native',
-                        'node.environment',
-                        'node.fs.sync',
-                        'node.fs_dir.sync',
-                        'node.fs.async',
-                        'node.fs_dir.async',
-                        'node.perf',
-                        'node.perf.usertiming',
-                        'node.perf.timerify',
-                        'node.promises.rejections',
-                        'node.vm.script',
-                        'v8',
-                        'node.http',
-  ], categories);
+  const expectedCategories = [
+    'node',
+    'node.async_hooks',
+    'node.bootstrap',
+    'node.console',
+    'node.dns.native',
+    'node.environment',
+    'node.fs.async',
+    'node.fs.sync',
+    'node.fs_dir.async',
+    'node.fs_dir.sync',
+    'node.http',
+    'node.net.native',
+    'node.perf',
+    'node.perf.timerify',
+    'node.perf.usertiming',
+    'node.promises.rejections',
+    'node.threadpoolwork.async',
+    'node.threadpoolwork.sync',
+    'node.vm.script',
+    'v8',
+  ].sort();
+  assert.ok(categories.length === expectedCategories.length);
+  categories.forEach((category, index) => {
+    const value = expectedCategories[index];
+    assert.ok(category === value, `${category} is out of order, expect ${value}`);
+  });
 
   const traceConfig = { includedCategories: ['v8'] };
   await post('NodeTracing.start', { traceConfig });
diff --git a/test/parallel/test-release-changelog.js b/test/parallel/test-release-changelog.js
new file mode 100644
index 00000000000000..99889fa1724014
--- /dev/null
+++ b/test/parallel/test-release-changelog.js
@@ -0,0 +1,89 @@
+'use strict';
+
+// This test checks that the changelogs contain an entry for releases.
+
+const common = require('../common');
+const assert = require('assert');
+const fs = require('fs');
+const path = require('path');
+
+const getDefine = (text, name) => {
+  const regexp = new RegExp(`#define\\s+${name}\\s+(.*)`);
+  const match = regexp.exec(text);
+  assert.notStrictEqual(match, null);
+  return match[1];
+};
+
+const srcRoot = path.join(__dirname, '..', '..');
+const mainChangelogFile = path.join(srcRoot, 'CHANGELOG.md');
+const versionFile = path.join(srcRoot, 'src', 'node_version.h');
+const versionText = fs.readFileSync(versionFile, { encoding: 'utf8' });
+const release = getDefine(versionText, 'NODE_VERSION_IS_RELEASE') !== '0';
+
+if (!release) {
+  common.skip('release bit is not set');
+}
+
+const major = getDefine(versionText, 'NODE_MAJOR_VERSION');
+const minor = getDefine(versionText, 'NODE_MINOR_VERSION');
+const patch = getDefine(versionText, 'NODE_PATCH_VERSION');
+const versionForRegex = `${major}\\.${minor}\\.${patch}`;
+
+const lts = getDefine(versionText, 'NODE_VERSION_IS_LTS') !== '0';
+const codename = getDefine(versionText, 'NODE_VERSION_LTS_CODENAME').slice(1, -1);
+// If the LTS bit is set there should be a codename.
+if (lts) {
+  assert.notStrictEqual(codename, '');
+}
+
+const changelogPath = `doc/changelogs/CHANGELOG_V${major}.md`;
+// Check CHANGELOG_V*.md
+{
+  const changelog = fs.readFileSync(path.join(srcRoot, changelogPath), { encoding: 'utf8' });
+  // Check title matches major version.
+  assert.match(changelog, new RegExp(`# Node\\.js ${major} ChangeLog`));
+  // Check table header
+  let tableHeader;
+  if (lts) {
+    tableHeader = new RegExp(`<th>LTS '${codename}'</th>`);
+  } else {
+    tableHeader = /<th>Current<\/th>/;
+  }
+  assert.match(changelog, tableHeader);
+  // Check table contains link to this release.
+  assert.match(changelog, new RegExp(`<a href="#${versionForRegex}">${versionForRegex}</a>`));
+  // Check anchor for this release.
+  assert.match(changelog, new RegExp(`<a id="${versionForRegex}"></a>`));
+  // Check title for changelog entry.
+  let title;
+  if (lts) {
+    title = new RegExp(`## \\d{4}-\\d{2}-\\d{2}, Version ${versionForRegex} '${codename}' \\(LTS\\), @\\S+`);
+  } else {
+    title = new RegExp(`## \\d{4}-\\d{2}-\\d{2}, Version ${versionForRegex} \\(Current\\), @\\S+`);
+  }
+  assert.match(changelog, title);
+}
+
+// Main CHANGELOG.md checks
+{
+  const mainChangelog = fs.readFileSync(mainChangelogFile, { encoding: 'utf8' });
+  // Check for the link to the appropriate CHANGELOG_V*.md file.
+  let linkToChangelog;
+  if (lts) {
+    linkToChangelog = new RegExp(`\\[Node\\.js ${major}\\]\\(${changelogPath}\\) \\*\\*Long Term Support\\*\\*`);
+  } else {
+    linkToChangelog = new RegExp(`\\[Node\\.js ${major}\\]\\(${changelogPath}\\) \\*\\*Current\\*\\*`);
+  }
+  assert.match(mainChangelog, linkToChangelog);
+  // Check table header.
+  let tableHeader;
+  if (lts) {
+    tableHeader = new RegExp(`<th title="LTS Until \\d{4}-\\d{2}"><a href="${changelogPath}">${major}</a> \\(LTS\\)</th>`);
+  } else {
+    tableHeader = new RegExp(`<th title="Current"><a href="${changelogPath}">${major}</a> \\(Current\\)</th>`);
+  }
+  assert.match(mainChangelog, tableHeader);
+  // Check the table contains a link to the release in the appropriate CHANGELOG_V*.md file.
+  const linkToVersion = new RegExp(`<b><a href="${changelogPath}#${versionForRegex}">${versionForRegex}</a></b><br/>`);
+  assert.match(mainChangelog, linkToVersion);
+}
diff --git a/test/parallel/test-repl-sigint-nested-eval.js b/test/parallel/test-repl-sigint-nested-eval.js
index 28e4d44b235cde..62eb46e0af6759 100644
--- a/test/parallel/test-repl-sigint-nested-eval.js
+++ b/test/parallel/test-repl-sigint-nested-eval.js
@@ -10,9 +10,8 @@ if (!common.isMainThread)
 const assert = require('assert');
 const spawn = require('child_process').spawn;
 
-process.env.REPL_TEST_PPID = process.pid;
 const child = spawn(process.execPath, [ '-i' ], {
-  stdio: [null, null, 2]
+  stdio: [null, null, 2, 'ipc']
 });
 
 let stdout = '';
@@ -22,7 +21,8 @@ child.stdout.on('data', function(c) {
 });
 
 child.stdout.once('data', common.mustCall(() => {
-  process.on('SIGUSR2', common.mustCall(() => {
+  child.on('message', common.mustCall((msg) => {
+    assert.strictEqual(msg, 'repl is busy');
     process.kill(child.pid, 'SIGINT');
     child.stdout.once('data', common.mustCall(() => {
       // Make sure REPL still works.
@@ -30,9 +30,10 @@ child.stdout.once('data', common.mustCall(() => {
     }));
   }));
 
-  child.stdin.write('process.kill(+process.env.REPL_TEST_PPID, "SIGUSR2");' +
-                    'vm.runInThisContext("while(true){}", ' +
-                    '{ breakOnSigint: true });\n');
+  child.stdin.write(
+    'vm.runInThisContext("process.send(\'repl is busy\'); while(true){}", ' +
+    '{ breakOnSigint: true });\n'
+  );
 }));
 
 child.on('close', function(code) {
diff --git a/test/parallel/test-require-resolve.js b/test/parallel/test-require-resolve.js
index ab58033e2c9b5c..a38a8e074ab85d 100644
--- a/test/parallel/test-require-resolve.js
+++ b/test/parallel/test-require-resolve.js
@@ -63,6 +63,10 @@ require(fixtures.path('resolve-paths', 'default', 'verify-paths.js'));
     assert.strictEqual(require.resolve.paths(mod), null);
   });
 
+  builtinModules.forEach((mod) => {
+    assert.strictEqual(require.resolve.paths(`node:${mod}`), null);
+  });
+
   // node_modules.
   const resolvedPaths = require.resolve.paths('eslint');
   assert.strictEqual(Array.isArray(resolvedPaths), true);
diff --git a/test/parallel/test-runner-cli.js b/test/parallel/test-runner-cli.js
index 8c1f6b3b0bee69..ac8482c5ce69be 100644
--- a/test/parallel/test-runner-cli.js
+++ b/test/parallel/test-runner-cli.js
@@ -1,4 +1,5 @@
 'use strict';
+
 require('../common');
 const assert = require('assert');
 const { spawnSync } = require('child_process');
@@ -104,7 +105,6 @@ const testFixtures = fixtures.path('test-runner');
     ['--print', 'console.log("should not print")', '--test'],
   ];
 
-
   flags.forEach((args) => {
     const child = spawnSync(process.execPath, args);
 
@@ -115,3 +115,56 @@ const testFixtures = fixtures.path('test-runner');
     assert.match(stderr, /--test/);
   });
 }
+
+{
+  // Test combined stream outputs
+  const args = [
+    '--test',
+    'test/fixtures/test-runner/index.test.js',
+    'test/fixtures/test-runner/nested.js',
+    'test/fixtures/test-runner/invalid-tap.js',
+  ];
+  const child = spawnSync(process.execPath, args);
+
+
+  assert.strictEqual(child.status, 1);
+  assert.strictEqual(child.signal, null);
+  assert.strictEqual(child.stderr.toString(), '');
+  const stdout = child.stdout.toString();
+  assert.match(stdout, /# Subtest: .+index\.test\.js/);
+  assert.match(stdout, / {4}# Subtest: this should pass/);
+  assert.match(stdout, / {4}ok 1 - this should pass/);
+  assert.match(stdout, / {6}---/);
+  assert.match(stdout, / {6}duration_ms: .*/);
+  assert.match(stdout, / {6}\.\.\./);
+  assert.match(stdout, / {4}1\.\.1/);
+
+  assert.match(stdout, /ok 1 - .+index\.test\.js/);
+
+  assert.match(stdout, /# Subtest: .+invalid-tap\.js/);
+  assert.match(stdout, / {4}# invalid tap output/);
+  assert.match(stdout, /ok 2 - .+invalid-tap\.js/);
+
+  assert.match(stdout, /# Subtest: .+nested\.js/);
+  assert.match(stdout, / {4}# Subtest: level 0a/);
+  assert.match(stdout, / {8}# Subtest: level 1a/);
+  assert.match(stdout, / {8}ok 1 - level 1a/);
+  assert.match(stdout, / {8}# Subtest: level 1b/);
+  assert.match(stdout, / {8}not ok 2 - level 1b/);
+  assert.match(stdout, / {10}code: 'ERR_TEST_FAILURE'/);
+  assert.match(stdout, / {10}stack: |-'/);
+  assert.match(stdout, / {12}TestContext\.<anonymous> .*/);
+  assert.match(stdout, / {8}# Subtest: level 1c/);
+  assert.match(stdout, / {8}ok 3 - level 1c # SKIP aaa/);
+  assert.match(stdout, / {8}# Subtest: level 1d/);
+  assert.match(stdout, / {8}ok 4 - level 1d/);
+  assert.match(stdout, / {4}not ok 1 - level 0a/);
+  assert.match(stdout, / {6}error: '1 subtest failed'/);
+  assert.match(stdout, / {4}# Subtest: level 0b/);
+  assert.match(stdout, / {4}not ok 2 - level 0b/);
+  assert.match(stdout, / {6}error: 'level 0b error'/);
+  assert.match(stdout, /not ok 3 - .+nested\.js/);
+  assert.match(stdout, /# tests 3/);
+  assert.match(stdout, /# pass 2/);
+  assert.match(stdout, /# fail 1/);
+}
diff --git a/test/parallel/test-runner-inspect.mjs b/test/parallel/test-runner-inspect.mjs
index 92117641870c16..bdff1ce7ceb84f 100644
--- a/test/parallel/test-runner-inspect.mjs
+++ b/test/parallel/test-runner-inspect.mjs
@@ -37,7 +37,6 @@ tmpdir.refresh();
   assert.match(stderr,
                /Warning: Using the inspector with --test forces running at a concurrency of 1\. Use the inspectPort option to run with concurrency/);
   assert.match(stdout, /not ok 1 - .+index\.js/);
-  assert.match(stdout, /stderr: \|-\r?\n\s+Debugger listening on/);
   assert.strictEqual(code, 1);
   assert.strictEqual(signal, null);
 }
diff --git a/test/parallel/test-runner-run.mjs b/test/parallel/test-runner-run.mjs
index 4a0d4f025bf7bf..8f650509f9ee54 100644
--- a/test/parallel/test-runner-run.mjs
+++ b/test/parallel/test-runner-run.mjs
@@ -28,7 +28,7 @@ describe('require(\'node:test\').run', { concurrency: true }, () => {
   it('should succeed with a file', async () => {
     const stream = run({ files: [join(testFixtures, 'test/random.cjs')] });
     stream.on('test:fail', common.mustNotCall());
-    stream.on('test:pass', common.mustCall(1));
+    stream.on('test:pass', common.mustCall(2));
     // eslint-disable-next-line no-unused-vars
     for await (const _ of stream); // TODO(MoLow): assert.snapshot
   });
@@ -36,7 +36,7 @@ describe('require(\'node:test\').run', { concurrency: true }, () => {
   it('should run same file twice', async () => {
     const stream = run({ files: [join(testFixtures, 'test/random.cjs'), join(testFixtures, 'test/random.cjs')] });
     stream.on('test:fail', common.mustNotCall());
-    stream.on('test:pass', common.mustCall(2));
+    stream.on('test:pass', common.mustCall(4));
     // eslint-disable-next-line no-unused-vars
     for await (const _ of stream); // TODO(MoLow): assert.snapshot
   });
diff --git a/test/parallel/test-runner-tap-checker.js b/test/parallel/test-runner-tap-checker.js
new file mode 100644
index 00000000000000..d437b025180c78
--- /dev/null
+++ b/test/parallel/test-runner-tap-checker.js
@@ -0,0 +1,119 @@
+'use strict';
+// Flags: --expose-internals
+
+require('../common');
+const assert = require('assert');
+
+const { TapParser } = require('internal/test_runner/tap_parser');
+const { TapChecker } = require('internal/test_runner/tap_checker');
+
+function TAPChecker(input) {
+  // parse
+  const parser = new TapParser({ specs: TapChecker.TAP14 });
+  parser.parseSync(input);
+  parser.check();
+}
+
+[
+  ['TAP version 14', 'missing TAP plan'],
+  [`
+TAP version 14
+1..1
+  `, 'missing Test Points'],
+  [`
+TAP version 14
+1..1
+ok 2
+  `, 'test 2 is out of plan range 1..1'],
+  [`
+TAP version 14
+3..1
+ok 2
+  `, 'plan start 3 is greater than plan end 1'],
+  [`
+TAP version 14
+2..3
+ok 1
+ok 2
+ok 3
+  `, 'test 1 is out of plan range 2..3'],
+
+].forEach(([str, message]) => {
+  assert.throws(() => TAPChecker(str), {
+    code: 'ERR_TAP_VALIDATION_ERROR',
+    message,
+  });
+});
+
+// Valid TAP14 should not throw
+TAPChecker(`
+TAP version 14
+1..1
+ok
+`);
+
+// Valid comment line shout not throw.
+TAPChecker(`
+TAP version 14
+1..5
+ok 1 - approved operating system
+# $^0 is solaris
+ok 2 - # SKIP no /sys directory
+ok 3 - # SKIP no /sys directory
+ok 4 - # SKIP no /sys directory
+ok 5 - # SKIP no /sys directory
+`);
+
+// Valid empty test plan should not throw.
+TAPChecker(`
+TAP version 14
+1..0 # skip because English-to-French translator isn't installed
+`);
+
+// Valid test plan count should not throw.
+TAPChecker(`
+TAP version 14
+1..4
+ok 1 - Creating test program
+ok 2 - Test program runs, no error
+not ok 3 - infinite loop # TODO halting problem unsolved
+not ok 4 - infinite loop 2 # TODO halting problem unsolved
+`);
+
+// Valid YAML diagnostic should not throw.
+TAPChecker(`
+TAP version 14
+ok - created Board
+ok
+ok
+ok
+ok
+ok
+ok
+ok
+  ---
+  message: "Board layout"
+  severity: comment
+  dump:
+    board:
+      - '      16G         05C        '
+      - '      G N C       C C G      '
+      - '        G           C  +     '
+      - '10C   01G         03C        '
+      - 'R N G G A G       C C C      '
+      - '  R     G           C  +     '
+      - '      01G   17C   00C        '
+      - '      G A G G N R R N R      '
+      - '        G     R     G        '
+  ...
+ok - board has 7 tiles + starter tile
+1..9
+`);
+
+// Valid Bail out should not throw.
+TAPChecker(`
+TAP version 14
+1..573
+not ok 1 - database handle
+Bail out! Couldn't connect to database.
+`);
diff --git a/test/parallel/test-runner-tap-lexer.js b/test/parallel/test-runner-tap-lexer.js
new file mode 100644
index 00000000000000..7da0f7c617c121
--- /dev/null
+++ b/test/parallel/test-runner-tap-lexer.js
@@ -0,0 +1,446 @@
+'use strict';
+// Flags: --expose-internals
+
+require('../common');
+const assert = require('assert');
+
+const { TapLexer, TokenKind } = require('internal/test_runner/tap_lexer');
+
+function TAPLexer(input) {
+  const lexer = new TapLexer(input);
+  return lexer.scan().flat();
+}
+
+{
+  const tokens = TAPLexer('');
+
+  assert.strictEqual(tokens[0].kind, TokenKind.EOF);
+  assert.strictEqual(tokens[0].value, '');
+}
+
+{
+  const tokens = TAPLexer('TAP version 14');
+
+  [
+    { kind: TokenKind.TAP, value: 'TAP' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.TAP_VERSION, value: 'version' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '14' },
+    { kind: TokenKind.EOL, value: '' },
+    { kind: TokenKind.EOF, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('1..5 # reason');
+
+  [
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.TAP_PLAN, value: '..' },
+    { kind: TokenKind.NUMERIC, value: '5' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.HASH, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'reason' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer(
+    '1..5 # reason "\\ !"\\#$%&\'()*+,\\-./:;<=>?@[]^_`{|}~'
+  );
+
+  [
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.TAP_PLAN, value: '..' },
+    { kind: TokenKind.NUMERIC, value: '5' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.HASH, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'reason' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: '"' },
+    { kind: TokenKind.ESCAPE, value: '\\' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: '!"' },
+    { kind: TokenKind.LITERAL, value: '\\' },
+    { kind: TokenKind.LITERAL, value: '#' },
+    { kind: TokenKind.LITERAL, value: "$%&'()*" },
+    { kind: TokenKind.PLUS, value: '+' },
+    { kind: TokenKind.LITERAL, value: ',' },
+    { kind: TokenKind.ESCAPE, value: '\\' },
+    { kind: TokenKind.DASH, value: '-' },
+    { kind: TokenKind.LITERAL, value: './:;<=>?@[]^_`{|}~' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('ok');
+
+  [
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('not ok');
+
+  [
+    { kind: TokenKind.TAP_TEST_NOTOK, value: 'not' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('ok 1');
+
+  [
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer(`
+ok 1
+not ok 2
+`);
+
+  [
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.TAP_TEST_NOTOK, value: 'not' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '2' },
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.EOF, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer(`
+ok 1
+    ok 1
+`);
+
+  [
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.EOF, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('ok 1 description');
+
+  [
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'description' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('ok 1 - description');
+
+  [
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.DASH, value: '-' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'description' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('ok 1 - description # todo');
+
+  [
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.DASH, value: '-' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'description' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.HASH, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'todo' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('ok 1 - description \\# todo');
+
+  [
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.DASH, value: '-' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'description' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.ESCAPE, value: '\\' },
+    { kind: TokenKind.LITERAL, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'todo' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('ok 1 - description \\ # todo');
+
+  [
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.DASH, value: '-' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'description' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.ESCAPE, value: '\\' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.HASH, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'todo' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer(
+    'ok 1 description \\# \\\\ world # TODO escape \\# characters with \\\\'
+  );
+  [
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'description' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.ESCAPE, value: '\\' },
+    { kind: TokenKind.LITERAL, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.ESCAPE, value: '\\' },
+    { kind: TokenKind.LITERAL, value: '\\' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'world' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.HASH, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'TODO' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'escape' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.ESCAPE, value: '\\' },
+    { kind: TokenKind.LITERAL, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'characters' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'with' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.ESCAPE, value: '\\' },
+    { kind: TokenKind.LITERAL, value: '\\' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('ok 1 - description # ##');
+
+  [
+    { kind: TokenKind.TAP_TEST_OK, value: 'ok' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.NUMERIC, value: '1' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.DASH, value: '-' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'description' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.HASH, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: '#' },
+    { kind: TokenKind.LITERAL, value: '#' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('# comment');
+  [
+    { kind: TokenKind.COMMENT, value: '#' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'comment' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('#');
+
+  [
+    { kind: TokenKind.COMMENT, value: '#' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer(`
+  ---
+    message: "description"
+    severity: fail
+  ...
+`);
+
+  [
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.TAP_YAML_START, value: '---' },
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'message:' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: '"description"' },
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'severity:' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'fail' },
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.TAP_YAML_END, value: '...' },
+    { kind: TokenKind.NEWLINE, value: '\n' },
+    { kind: TokenKind.EOF, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('pragma +strict -warnings');
+
+  [
+    { kind: TokenKind.TAP_PRAGMA, value: 'pragma' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.PLUS, value: '+' },
+    { kind: TokenKind.LITERAL, value: 'strict' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.DASH, value: '-' },
+    { kind: TokenKind.LITERAL, value: 'warnings' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
+
+{
+  const tokens = TAPLexer('Bail out! Error');
+
+  [
+    { kind: TokenKind.LITERAL, value: 'Bail' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'out!' },
+    { kind: TokenKind.WHITESPACE, value: ' ' },
+    { kind: TokenKind.LITERAL, value: 'Error' },
+    { kind: TokenKind.EOL, value: '' },
+  ].forEach((token, index) => {
+    assert.strictEqual(tokens[index].kind, token.kind);
+    assert.strictEqual(tokens[index].value, token.value);
+  });
+}
diff --git a/test/parallel/test-runner-tap-parser-stream.js b/test/parallel/test-runner-tap-parser-stream.js
new file mode 100644
index 00000000000000..bd10af29d88279
--- /dev/null
+++ b/test/parallel/test-runner-tap-parser-stream.js
@@ -0,0 +1,629 @@
+// Flags: --expose-internals
+'use strict';
+const common = require('../common');
+const assert = require('node:assert');
+const { TapParser } = require('internal/test_runner/tap_parser');
+const { TapChecker } = require('internal/test_runner/tap_checker');
+
+const cases = [
+  {
+    input: 'TAP version 13',
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+    ],
+  },
+  {
+    input: 'invalid tap',
+    expected: [
+      {
+        nesting: 0,
+        kind: 'Unknown',
+        node: { value: 'invalid tap' },
+        lexeme: 'invalid tap',
+      },
+    ],
+  },
+  {
+    input: 'TAP version 13\ninvalid tap after harness',
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+      {
+        nesting: 0,
+        kind: 'Unknown',
+        node: { value: 'invalid tap after harness' },
+        lexeme: 'invalid tap after harness',
+      },
+    ],
+  },
+  {
+    input: `TAP version 13
+    # nested diagnostic
+# diagnostic comment`,
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+      {
+        nesting: 1,
+        kind: 'Comment',
+        node: { comment: 'nested diagnostic' },
+        lexeme: '    # nested diagnostic',
+      },
+      {
+        nesting: 0,
+        kind: 'Comment',
+        node: { comment: 'diagnostic comment' },
+        lexeme: '# diagnostic comment',
+      },
+    ],
+  },
+  {
+    input: `TAP version 13
+    1..5
+1..3
+2..2`,
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+      {
+        nesting: 1,
+        kind: 'PlanKeyword',
+        node: { start: '1', end: '5' },
+        lexeme: '    1..5',
+      },
+      {
+        nesting: 0,
+        kind: 'PlanKeyword',
+        node: { start: '1', end: '3' },
+        lexeme: '1..3',
+      },
+      {
+        nesting: 0,
+        kind: 'PlanKeyword',
+        node: { start: '2', end: '2' },
+        lexeme: '2..2',
+      },
+    ],
+  },
+  {
+    input: `TAP version 13
+ok 1 - test
+ok 2 - test # SKIP
+not ok 3 - test # TODO reason`,
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '1',
+          description: 'test',
+          reason: '',
+          time: 0,
+          diagnostics: [],
+        },
+        lexeme: 'ok 1 - test',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: true },
+          id: '2',
+          description: 'test',
+          reason: '',
+          time: 0,
+          diagnostics: [],
+        },
+        lexeme: 'ok 2 - test # SKIP',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: true, pass: false, todo: true, skip: false },
+          id: '3',
+          description: 'test',
+          reason: 'reason',
+          time: 0,
+          diagnostics: [],
+        },
+        lexeme: 'not ok 3 - test # TODO reason',
+      },
+    ],
+  },
+  {
+    input: `TAP version 13
+# Subtest: test
+ok 1 - test
+ok 2 - test`,
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+      {
+        nesting: 0,
+        kind: 'SubTestPointKeyword',
+        node: { name: 'test' },
+        lexeme: '# Subtest: test',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '1',
+          description: 'test',
+          reason: '',
+          time: 0,
+          diagnostics: [],
+        },
+        lexeme: 'ok 1 - test',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '2',
+          description: 'test',
+          reason: '',
+          time: 0,
+          diagnostics: [],
+        },
+        lexeme: 'ok 2 - test',
+      },
+    ],
+  },
+  {
+    input: `TAP version 13
+# Subtest: test
+ok 1 - test
+  ---
+  foo: bar
+  duration_ms: 0.0001
+  prop: |-
+    multiple
+    lines
+  ...`,
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+      {
+        nesting: 0,
+        kind: 'SubTestPointKeyword',
+        node: { name: 'test' },
+        lexeme: '# Subtest: test',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '1',
+          description: 'test',
+          reason: '',
+          time: 0.0001,
+          diagnostics: [
+            'foo: bar',
+            'duration_ms: 0.0001',
+            'prop: |-',
+            '  multiple',
+            '  lines',
+          ],
+        },
+        lexeme: 'ok 1 - test',
+      },
+    ],
+  },
+  {
+    input: `TAP version 13
+# Subtest: test/fixtures/test-runner/index.test.js
+    # Subtest: this should pass
+    ok 1 - this should pass
+      ---
+      duration_ms: 0.0001
+      ...
+    1..1`,
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+      {
+        kind: 'SubTestPointKeyword',
+        lexeme: '# Subtest: test/fixtures/test-runner/index.test.js',
+        nesting: 0,
+        node: {
+          name: 'test/fixtures/test-runner/index.test.js',
+        },
+      },
+      {
+        kind: 'SubTestPointKeyword',
+        lexeme: '    # Subtest: this should pass',
+        nesting: 1,
+        node: {
+          name: 'this should pass',
+        },
+      },
+      {
+        kind: 'TestPointKeyword',
+        lexeme: '    ok 1 - this should pass',
+        nesting: 1,
+        node: {
+          description: 'this should pass',
+          diagnostics: ['duration_ms: 0.0001'],
+          id: '1',
+          reason: '',
+          status: {
+            fail: false,
+            pass: true,
+            skip: false,
+            todo: false,
+          },
+          time: 0.0001,
+        },
+      },
+      {
+        kind: 'PlanKeyword',
+        lexeme: '    1..1',
+        nesting: 1,
+        node: {
+          end: '1',
+          start: '1',
+        },
+      },
+    ],
+  },
+  {
+    input: `TAP version 13
+# Subtest: test 1
+ok 1 - test 1
+  ---
+  foo: bar
+  duration_ms: 1.00
+  prop: |-
+    multiple
+    lines
+  ...
+# Subtest: test 2
+ok 2 - test 2
+  ---
+  duration_ms: 2.00
+  ...
+# Subtest: test 3
+ok 3 - test 3
+  ---
+  foo: bar
+  duration_ms: 3.00
+  prop: |-
+    multiple
+    lines
+  ...`,
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+      {
+        nesting: 0,
+        kind: 'SubTestPointKeyword',
+        node: { name: 'test 1' },
+        lexeme: '# Subtest: test 1',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '1',
+          description: 'test 1',
+          reason: '',
+          time: 1.0,
+          diagnostics: [
+            'foo: bar',
+            'duration_ms: 1.00',
+            'prop: |-',
+            '  multiple',
+            '  lines',
+          ],
+        },
+        lexeme: 'ok 1 - test 1',
+      },
+      {
+        nesting: 0,
+        kind: 'SubTestPointKeyword',
+        node: { name: 'test 2' },
+        lexeme: '# Subtest: test 2',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '2',
+          description: 'test 2',
+          reason: '',
+          time: 2.0,
+          diagnostics: ['duration_ms: 2.00'],
+        },
+        lexeme: 'ok 2 - test 2',
+      },
+      {
+        nesting: 0,
+        kind: 'SubTestPointKeyword',
+        node: { name: 'test 3' },
+        lexeme: '# Subtest: test 3',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '3',
+          description: 'test 3',
+          reason: '',
+          time: 3.0,
+          diagnostics: [
+            'foo: bar',
+            'duration_ms: 3.00',
+            'prop: |-',
+            '  multiple',
+            '  lines',
+          ],
+        },
+        lexeme: 'ok 3 - test 3',
+      },
+    ],
+  },
+  {
+    input: `TAP version 13
+# Subtest: test 1
+ok 1 - test 1
+  ---
+  foo: bar
+  duration_ms: 1.00
+  prop: |-
+    multiple
+    lines
+  ...
+    # Subtest: test 11
+    ok 11 - test 11
+      ---
+      duration_ms: 11.00
+      ...
+        # Subtest: test 111
+        ok 111 - test 111
+          ---
+          foo: bar
+          duration_ms: 111.00
+          prop: |-
+            multiple
+            lines
+          ...`,
+    expected: [
+      {
+        nesting: 0,
+        kind: 'VersionKeyword',
+        node: { version: '13' },
+        lexeme: 'TAP version 13',
+      },
+      {
+        nesting: 0,
+        kind: 'SubTestPointKeyword',
+        node: { name: 'test 1' },
+        lexeme: '# Subtest: test 1',
+      },
+      {
+        nesting: 0,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '1',
+          description: 'test 1',
+          reason: '',
+          time: 1.0,
+          diagnostics: [
+            'foo: bar',
+            'duration_ms: 1.00',
+            'prop: |-',
+            '  multiple',
+            '  lines',
+          ],
+        },
+        lexeme: 'ok 1 - test 1',
+      },
+      {
+        nesting: 1,
+        kind: 'SubTestPointKeyword',
+        node: { name: 'test 11' },
+        lexeme: '    # Subtest: test 11',
+      },
+      {
+        nesting: 1,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '11',
+          description: 'test 11',
+          reason: '',
+          time: 11.0,
+          diagnostics: ['duration_ms: 11.00'],
+        },
+        lexeme: '    ok 11 - test 11',
+      },
+      {
+        nesting: 2,
+        kind: 'SubTestPointKeyword',
+        node: { name: 'test 111' },
+        lexeme: '        # Subtest: test 111',
+      },
+      {
+        nesting: 2,
+        kind: 'TestPointKeyword',
+        node: {
+          status: { fail: false, pass: true, todo: false, skip: false },
+          id: '111',
+          description: 'test 111',
+          reason: '',
+          time: 111.0,
+          diagnostics: [
+            'foo: bar',
+            'duration_ms: 111.00',
+            'prop: |-',
+            '  multiple',
+            '  lines',
+          ],
+        },
+        lexeme: '        ok 111 - test 111',
+      },
+    ],
+  },
+];
+
+(async () => {
+  for (const { input, expected } of cases) {
+    const parser = new TapParser();
+    parser.write(input);
+    parser.end();
+    const actual = await parser.toArray();
+    assert.deepStrictEqual(
+      actual,
+      expected.map((item) => ({ __proto__: null, ...item }))
+    );
+  }
+})().then(common.mustCall());
+
+(async () => {
+  const expected = [
+    {
+      kind: 'PlanKeyword',
+      node: { start: '1', end: '3' },
+      nesting: 0,
+      lexeme: '1..3',
+    },
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'Input file opened',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1 - Input file opened',
+    },
+    {
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: true, pass: false, todo: false, skip: false },
+        id: '2',
+        description: '',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      nesting: 0,
+      lexeme: 'not ok    2 ',
+    },
+    {
+      kind: 'SubTestPointKeyword',
+      node: { name: 'foobar' },
+      nesting: 1,
+      lexeme: '    # Subtest: foobar',
+    },
+    {
+      __proto__: null,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: true, skip: false },
+        id: '3',
+        description: '',
+        reason: '',
+        time: 0.0001,
+        diagnostics: [
+          'foo: bar',
+          'duration_ms:   0.0001',
+          'prop: |-',
+          '  foo',
+          '  bar',
+        ],
+      },
+      nesting: 0,
+      lexeme: 'ok    3 # TODO',
+    },
+  ];
+
+  const parser = new TapParser({ specs: TapChecker.TAP14 });
+  parser.write('\n');
+  parser.write('1');
+  parser.write('.');
+  parser.write('.');
+  parser.write('3');
+  parser.write('\n');
+  parser.write('ok 1 ');
+  parser.write('- Input file opened\n');
+  parser.write('not');
+  parser.write(' ok');
+  parser.write('    2 \n');
+  parser.write('\n');
+  parser.write('    # ');
+  parser.write('Subtest: foo');
+  parser.write('bar');
+  parser.write('\n');
+  parser.write('');
+  parser.write('ok');
+  parser.write('    3 #');
+  parser.write(' TODO');
+  parser.write('\n');
+  parser.write('  ---\n');
+  parser.write('  foo: bar\n');
+  parser.write('  duration_ms: ');
+  parser.write('  0.0001\n');
+  parser.write('  prop: |-\n');
+  parser.write('    foo\n');
+  parser.write('    bar\n');
+  parser.write('  ...\n');
+  parser.end();
+  const actual = await parser.toArray();
+  assert.deepStrictEqual(
+    actual,
+    expected.map((item) => ({ __proto__: null, ...item }))
+  );
+})().then(common.mustCall());
diff --git a/test/parallel/test-runner-tap-parser.js b/test/parallel/test-runner-tap-parser.js
new file mode 100644
index 00000000000000..530e56626a4c5b
--- /dev/null
+++ b/test/parallel/test-runner-tap-parser.js
@@ -0,0 +1,1312 @@
+'use strict';
+// Flags: --expose-internals
+
+require('../common');
+const assert = require('assert');
+
+const { TapParser } = require('internal/test_runner/tap_parser');
+
+function TAPParser(input) {
+  const parser = new TapParser();
+  const ast = parser.parseSync(input);
+  return ast;
+}
+
+// Comment
+
+{
+  const ast = TAPParser('# comment');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'Comment',
+      node: { comment: 'comment' },
+      lexeme: '# comment',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('#');
+  assert.deepStrictEqual(ast, [
+    {
+      kind: 'Comment',
+      nesting: 0,
+      node: {
+        comment: '',
+      },
+      lexeme: '#',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('####');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'Comment',
+      node: { comment: '###' },
+      lexeme: '####',
+    },
+  ]);
+}
+
+// Empty input
+
+{
+  const ast = TAPParser('');
+  assert.deepStrictEqual(ast, []);
+}
+
+// TAP version
+
+{
+  const ast = TAPParser('TAP version 14');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'VersionKeyword',
+      node: { version: '14' },
+      lexeme: 'TAP version 14',
+    },
+  ]);
+}
+
+{
+  assert.throws(() => TAPParser('TAP version'), {
+    name: 'SyntaxError',
+    code: 'ERR_TAP_PARSER_ERROR',
+    message:
+      'Expected a version number, received "version" (VersionKeyword) at line 1, column 5 (start 4, end 10)',
+  });
+}
+
+{
+  assert.throws(() => TAPParser('TAP'), {
+    name: 'SyntaxError',
+    code: 'ERR_TAP_PARSER_ERROR',
+    message:
+      'Expected "version" keyword, received "TAP" (TAPKeyword) at line 1, column 1 (start 0, end 2)',
+  });
+}
+
+// Test plan
+
+{
+  const ast = TAPParser('1..5 # reason');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'PlanKeyword',
+      node: { start: '1', end: '5', reason: 'reason' },
+      lexeme: '1..5 # reason',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser(
+    '1..5 # reason "\\ !"\\#$%&\'()*+,\\-./:;<=>?@[]^_`{|}~'
+  );
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'PlanKeyword',
+      node: {
+        start: '1',
+        end: '5',
+        reason: 'reason " !"\\#$%&\'()*+,-./:;<=>?@[]^_`{|}~',
+      },
+      lexeme: '1..5 # reason "\\ !"\\#$%&\'()*+,\\-./:;<=>?@[]^_`{|}~',
+    },
+  ]);
+}
+
+{
+  assert.throws(() => TAPParser('1..'), {
+    name: 'SyntaxError',
+    code: 'ERR_TAP_PARSER_ERROR',
+    message:
+      'Expected a plan end count, received "" (EOL) at line 1, column 4 (start 3, end 3)',
+  });
+}
+
+{
+  assert.throws(() => TAPParser('1..abc'), {
+    name: 'SyntaxError',
+    code: 'ERR_TAP_PARSER_ERROR',
+    message:
+      'Expected ".." symbol, received "..abc" (Literal) at line 1, column 2 (start 1, end 5)',
+  });
+}
+
+{
+  assert.throws(() => TAPParser('1..-1'), {
+    name: 'SyntaxError',
+    code: 'ERR_TAP_PARSER_ERROR',
+    message:
+      'Expected a plan end count, received "-" (Dash) at line 1, column 4 (start 3, end 3)',
+  });
+}
+
+{
+  assert.throws(() => TAPParser('1.1'), {
+    name: 'SyntaxError',
+    code: 'ERR_TAP_PARSER_ERROR',
+    message:
+      'Expected ".." symbol, received "." (Literal) at line 1, column 2 (start 1, end 1)',
+  });
+}
+
+// Test point
+
+{
+  const ast = TAPParser('ok');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '',
+        description: '',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('not ok');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: true, pass: false, todo: false, skip: false },
+        id: '',
+        description: '',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'not ok',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok 1');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: '',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser(`
+ok 111
+not ok 222
+`);
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '111',
+        description: '',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 111',
+    },
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: true, pass: false, todo: false, skip: false },
+        id: '222',
+        description: '',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'not ok 222',
+    },
+  ]);
+}
+
+{
+  // Nested tests
+  const ast = TAPParser(`
+ok 1 - parent
+    ok 2 - child
+`);
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'parent',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1 - parent',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '2',
+        description: 'child',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 2 - child',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser(`
+# Subtest: nested1
+    ok 1
+
+    # Subtest: nested2
+    ok 2 - nested2
+
+    # Subtest: nested3
+    ok 3 - nested3
+
+    # Subtest: nested4
+    ok 4 - nested4
+
+ok 1 - nested1
+`);
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'SubTestPointKeyword',
+      node: { name: 'nested1' },
+      lexeme: '# Subtest: nested1',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: '',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 1',
+    },
+    {
+      nesting: 1,
+      kind: 'SubTestPointKeyword',
+      node: { name: 'nested2' },
+      lexeme: '    # Subtest: nested2',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '2',
+        description: 'nested2',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 2 - nested2',
+    },
+    {
+      nesting: 1,
+      kind: 'SubTestPointKeyword',
+      node: { name: 'nested3' },
+      lexeme: '    # Subtest: nested3',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '3',
+        description: 'nested3',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 3 - nested3',
+    },
+    {
+      nesting: 1,
+      kind: 'SubTestPointKeyword',
+      node: { name: 'nested4' },
+      lexeme: '    # Subtest: nested4',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '4',
+        description: 'nested4',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 4 - nested4',
+    },
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'nested1',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1 - nested1',
+    },
+  ]);
+}
+
+// Nested tests as comment
+
+{
+  const ast = TAPParser(`
+# Subtest: nested1
+    ok 1 - test nested1
+
+    # Subtest: nested2
+        ok 2 - test nested2
+
+    ok 3 - nested2
+
+ok 4 - nested1
+`);
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'SubTestPointKeyword',
+      node: { name: 'nested1' },
+      lexeme: '# Subtest: nested1',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'test nested1',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 1 - test nested1',
+    },
+    {
+      nesting: 1,
+      kind: 'SubTestPointKeyword',
+      node: { name: 'nested2' },
+      lexeme: '    # Subtest: nested2',
+    },
+    {
+      nesting: 2,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '2',
+        description: 'test nested2',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '        ok 2 - test nested2',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '3',
+        description: 'nested2',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 3 - nested2',
+    },
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '4',
+        description: 'nested1',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 4 - nested1',
+    },
+  ]);
+}
+
+// Multiple nested tests as comment
+
+{
+  const ast = TAPParser(`
+# Subtest: nested1
+    ok 1 - test nested1
+
+    # Subtest: nested2a
+        ok 2 - test nested2a
+
+    ok 3 - nested2a
+
+    # Subtest: nested2b
+        ok 4 - test nested2b
+
+    ok 5 - nested2b
+
+ok 6 - nested1
+`);
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'SubTestPointKeyword',
+      node: { name: 'nested1' },
+      lexeme: '# Subtest: nested1',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'test nested1',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 1 - test nested1',
+    },
+    {
+      nesting: 1,
+      kind: 'SubTestPointKeyword',
+      node: { name: 'nested2a' },
+      lexeme: '    # Subtest: nested2a',
+    },
+    {
+      nesting: 2,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '2',
+        description: 'test nested2a',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '        ok 2 - test nested2a',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '3',
+        description: 'nested2a',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 3 - nested2a',
+    },
+    {
+      nesting: 1,
+      kind: 'SubTestPointKeyword',
+      node: { name: 'nested2b' },
+      lexeme: '    # Subtest: nested2b',
+    },
+    {
+      nesting: 2,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '4',
+        description: 'test nested2b',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '        ok 4 - test nested2b',
+    },
+    {
+      nesting: 1,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '5',
+        description: 'nested2b',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: '    ok 5 - nested2b',
+    },
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '6',
+        description: 'nested1',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 6 - nested1',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok 1 description');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'description',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1 description',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok 1 - description');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'description',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1 - description',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok 1 - description # todo');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: true, skip: false },
+        id: '1',
+        description: 'description',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1 - description # todo',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok 1 - description \\# todo');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'description # todo',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1 - description \\# todo',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok 1 - description \\ # todo');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: true, skip: false },
+        id: '1',
+        description: 'description',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1 - description \\ # todo',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser(
+    'ok 1 description \\# \\\\ world # TODO escape \\# characters with \\\\'
+  );
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: true, skip: false },
+        id: '1',
+        description: 'description # \\ world',
+        reason: 'escape # characters with \\',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme:
+        'ok 1 description \\# \\\\ world # TODO escape \\# characters with \\\\',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok 1 - description # ##');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'description',
+        reason: '##',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1 - description # ##',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser(
+    'ok 2 not skipped: https://example.com/page.html#skip is a url'
+  );
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '2',
+        description: 'not skipped: https://example.com/page.html#skip is a url',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 2 not skipped: https://example.com/page.html#skip is a url',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok 3 - #SkIp case insensitive, so this is skipped');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: true },
+        id: '3',
+        description: '',
+        reason: 'case insensitive, so this is skipped',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 3 - #SkIp case insensitive, so this is skipped',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok ok ok');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '',
+        description: 'ok ok',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok ok ok',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok not ok');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '',
+        description: 'not ok',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok not ok',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser('ok 1..1');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: '',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      lexeme: 'ok 1..1',
+    },
+  ]);
+}
+
+// Diagnostic
+
+{
+  // Note the leading 2 valid spaces
+  const ast = TAPParser(`
+  ---
+  message: 'description'
+  property: 'value'
+  ...
+`);
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'YamlEndKeyword',
+      node: {
+        diagnostics: ["message: 'description'", "property: 'value'"],
+      },
+      lexeme: '  ...',
+    },
+  ]);
+}
+
+{
+  // Note the leading 2 valid spaces
+  const ast = TAPParser(`
+  ---
+  message: "Board layout"
+  severity: comment
+  dump:
+    board:
+      - '      16G         05C        '
+      - '      G N C       C C G      '
+      - '        G           C  +     '
+      - '10C   01G         03C        '
+      - 'R N G G A G       C C C      '
+      - '  R     G           C  +     '
+      - '      01G   17C   00C        '
+      - '      G A G G N R R N R      '
+      - '        G     R     G        '
+  ...
+`);
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'YamlEndKeyword',
+      node: {
+        diagnostics: [
+          'message: "Board layout"',
+          'severity: comment',
+          'dump:',
+          '  board:',
+          "    - '      16G         05C        '",
+          "    - '      G N C       C C G      '",
+          "    - '        G           C  +     '",
+          "    - '10C   01G         03C        '",
+          "    - 'R N G G A G       C C C      '",
+          "    - '  R     G           C  +     '",
+          "    - '      01G   17C   00C        '",
+          "    - '      G A G G N R R N R      '",
+          "    - '        G     R     G        '",
+        ],
+      },
+      lexeme: '  ...',
+    },
+  ]);
+}
+
+{
+  const ast = TAPParser(`
+  ---
+  ...
+`);
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'YamlEndKeyword',
+      node: { diagnostics: [] },
+      lexeme: '  ...',
+    },
+  ]);
+}
+
+{
+  assert.throws(
+    () =>
+      TAPParser(
+        `
+  message: 'description'
+  property: 'value'
+  ...`
+      ),
+    {
+      name: 'SyntaxError',
+      code: 'ERR_TAP_PARSER_ERROR',
+      message:
+        'Unexpected YAML end marker, received "..." (YamlEndKeyword) at line 4, column 3 (start 48, end 50)',
+    }
+  );
+}
+
+{
+  assert.throws(
+    () =>
+      TAPParser(
+        `
+  ---
+  message: 'description'
+  property: 'value'`
+      ),
+    {
+      name: 'SyntaxError',
+      code: 'ERR_TAP_PARSER_ERROR',
+      message:
+        'Expected end of YAML block, received "\'value\'" (Literal) at line 4, column 13 (start 44, end 50)',
+    }
+  );
+}
+
+{
+  assert.throws(
+    () =>
+      // Note the leading 3 spaces before ---
+      TAPParser(
+        `
+   ---
+  message: 'description'
+  property: 'value'
+  ...`
+      ),
+    {
+      name: 'SyntaxError',
+      code: 'ERR_TAP_PARSER_ERROR',
+      message:
+        'Expected valid YAML indentation (2 spaces), received " " (Whitespace) at line 2, column 3 (start 3, end 3)',
+    }
+  );
+}
+
+{
+  assert.throws(
+    () =>
+      // Note the leading 5 spaces before ---
+      // This is a special case because the YAML block is indented by 1 space
+      // the extra 4 spaces are those of the subtest nesting level.
+      // However, the remaining content of the YAML block is indented by 2 spaces
+      // making it belong to the parent level.
+      TAPParser(
+        `
+     ---
+  message: 'description'
+  property: 'value'
+  ...
+  `
+      ),
+    {
+      name: 'SyntaxError',
+      code: 'ERR_TAP_PARSER_ERROR',
+      message:
+        'Expected end of YAML block, received "\'value\'" (Literal) at line 4, column 13 (start 47, end 53)',
+    }
+  );
+}
+
+{
+  assert.throws(
+    () =>
+      // Note the leading 4 spaces before ---
+      TAPParser(
+        `
+    ---
+  message: 'description'
+  property: 'value'
+  ...
+  `
+      ),
+    {
+      name: 'SyntaxError',
+      code: 'ERR_TAP_PARSER_ERROR',
+      message:
+        'Expected a valid token, received "---" (YamlStartKeyword) at line 2, column 5 (start 5, end 7)',
+    }
+  );
+}
+
+{
+  assert.throws(
+    () =>
+      // Note the leading 4 spaces before ...
+      TAPParser(
+        `
+  ---
+  message: 'description'
+  property: 'value'
+    ...
+  `
+      ),
+    {
+      name: 'SyntaxError',
+      code: 'ERR_TAP_PARSER_ERROR',
+      message:
+        'Expected end of YAML block, received " " (Whitespace) at line 6, column 2 (start 61, end 61)',
+    }
+  );
+}
+
+// Pragma
+
+{
+  const ast = TAPParser('pragma +strict, -warnings');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'PragmaKeyword',
+      node: {
+        pragmas: { strict: true, warnings: false },
+      },
+      lexeme: 'pragma +strict, -warnings',
+    },
+  ]);
+}
+
+// Bail out
+
+{
+  const ast = TAPParser('Bail out! Error');
+  assert.deepStrictEqual(ast, [
+    {
+      nesting: 0,
+      kind: 'BailOutKeyword',
+      node: { bailout: true, reason: 'Error' },
+      lexeme: 'Bail out! Error',
+    },
+  ]);
+}
+
+// Non-recognized
+
+{
+  assert.throws(() => TAPParser('abc'), {
+    name: 'SyntaxError',
+    code: 'ERR_TAP_PARSER_ERROR',
+    message:
+      'Expected a valid token, received "abc" (Literal) at line 1, column 1 (start 0, end 2)',
+  });
+}
+
+{
+  assert.throws(() => TAPParser('    abc'), {
+    name: 'SyntaxError',
+    code: 'ERR_TAP_PARSER_ERROR',
+    message:
+      'Expected a valid token, received "abc" (Literal) at line 1, column 5 (start 4, end 6)',
+  });
+}
+
+// TAP document (with diagnostics)
+
+{
+  const ast = TAPParser(`
+# Comment on version 13
+# Another comment on version 13
+
+TAP version 13
+
+# Subtest: /test.js
+    # Subtest: level 0a
+        # Subtest: level 1a
+            # Comment test point 1a
+            # Comment test point 1aa
+            ok 1 - level 1a
+              ---
+              duration_ms: 1.676996
+              ...
+            # Comment plan 1a
+            # Comment plan 1aa
+            1..1
+        # Comment closing test point 1a
+        # Comment closing test point 1aa
+        not ok 1 - level 1a
+          ---
+          duration_ms: 0.122839
+          failureType: 'testCodeFailure'
+          error: 'level 0b error'
+          code: 'ERR_TEST_FAILURE'
+          stack: |-
+            TestContext.<anonymous> (/test.js:23:9)
+          ...
+        1..1
+    not ok 1 - level 0a
+      ---
+      duration_ms: 84.920487
+      failureType: 'subtestsFailed'
+      exitCode: 1
+      error: '3 subtests failed'
+      code: 'ERR_TEST_FAILURE'
+      ...
+    # Comment plan 0a
+    # Comment plan 0aa
+    1..1
+
+# Comment closing test point 0a
+
+# Comment closing test point 0aa
+
+not ok 1 - /test.js
+# tests 1
+# pass 0
+# fail 1
+# cancelled 0
+# skipped 0
+# todo 0
+# duration_ms 87.077507
+`);
+
+  assert.deepStrictEqual(ast, [
+    {
+      kind: 'VersionKeyword',
+      node: { version: '13' },
+      nesting: 0,
+      comments: ['Comment on version 13', 'Another comment on version 13'],
+      lexeme: 'TAP version 13',
+    },
+    {
+      kind: 'SubTestPointKeyword',
+      node: { name: '/test.js' },
+      nesting: 0,
+      lexeme: '# Subtest: /test.js',
+    },
+    {
+      kind: 'SubTestPointKeyword',
+      node: { name: 'level 0a' },
+      nesting: 1,
+      lexeme: '    # Subtest: level 0a',
+    },
+    {
+      kind: 'SubTestPointKeyword',
+      node: { name: 'level 1a' },
+      nesting: 2,
+      lexeme: '        # Subtest: level 1a',
+    },
+    {
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: false, pass: true, todo: false, skip: false },
+        id: '1',
+        description: 'level 1a',
+        reason: '',
+        time: 1.676996,
+        diagnostics: ['duration_ms: 1.676996'],
+      },
+      nesting: 3,
+      comments: ['Comment test point 1a', 'Comment test point 1aa'],
+      lexeme: '            ok 1 - level 1a',
+    },
+    {
+      kind: 'PlanKeyword',
+      node: { start: '1', end: '1' },
+      nesting: 3,
+      comments: ['Comment plan 1a', 'Comment plan 1aa'],
+      lexeme: '            1..1',
+    },
+    {
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: true, pass: false, todo: false, skip: false },
+        id: '1',
+        description: 'level 1a',
+        reason: '',
+        time: 0.122839,
+        diagnostics: [
+          'duration_ms: 0.122839',
+          "failureType: 'testCodeFailure'",
+          "error: 'level 0b error'",
+          "code: 'ERR_TEST_FAILURE'",
+          'stack: |-',
+          '  TestContext.<anonymous> (/test.js:23:9)',
+        ],
+      },
+      nesting: 2,
+      comments: [
+        'Comment closing test point 1a',
+        'Comment closing test point 1aa',
+      ],
+      lexeme: '        not ok 1 - level 1a',
+    },
+    {
+      kind: 'PlanKeyword',
+      node: { start: '1', end: '1' },
+      nesting: 2,
+      lexeme: '        1..1',
+    },
+    {
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: true, pass: false, todo: false, skip: false },
+        id: '1',
+        description: 'level 0a',
+        reason: '',
+        time: 84.920487,
+        diagnostics: [
+          'duration_ms: 84.920487',
+          "failureType: 'subtestsFailed'",
+          'exitCode: 1',
+          "error: '3 subtests failed'",
+          "code: 'ERR_TEST_FAILURE'",
+        ],
+      },
+      nesting: 1,
+      lexeme: '    not ok 1 - level 0a',
+    },
+    {
+      kind: 'PlanKeyword',
+      node: { start: '1', end: '1' },
+      nesting: 1,
+      comments: ['Comment plan 0a', 'Comment plan 0aa'],
+      lexeme: '    1..1',
+    },
+    {
+      kind: 'TestPointKeyword',
+      node: {
+        status: { fail: true, pass: false, todo: false, skip: false },
+        id: '1',
+        description: '/test.js',
+        reason: '',
+        time: 0,
+        diagnostics: [],
+      },
+      nesting: 0,
+      comments: [
+        'Comment closing test point 0a',
+        'Comment closing test point 0aa',
+      ],
+      lexeme: 'not ok 1 - /test.js',
+    },
+    {
+      kind: 'Comment',
+      node: { comment: 'tests 1' },
+      nesting: 0,
+      lexeme: '# tests 1',
+    },
+    {
+      kind: 'Comment',
+      node: { comment: 'pass 0' },
+      nesting: 0,
+      lexeme: '# pass 0',
+    },
+    {
+      kind: 'Comment',
+      node: { comment: 'fail 1' },
+      nesting: 0,
+      lexeme: '# fail 1',
+    },
+    {
+      kind: 'Comment',
+      node: { comment: 'cancelled 0' },
+      nesting: 0,
+      lexeme: '# cancelled 0',
+    },
+    {
+      kind: 'Comment',
+      node: { comment: 'skipped 0' },
+      nesting: 0,
+      lexeme: '# skipped 0',
+    },
+    {
+      kind: 'Comment',
+      node: { comment: 'todo 0' },
+      nesting: 0,
+      lexeme: '# todo 0',
+    },
+    {
+      kind: 'Comment',
+      node: { comment: 'duration_ms 87.077507' },
+      nesting: 0,
+      lexeme: '# duration_ms 87.077507',
+    },
+  ]);
+}
diff --git a/test/parallel/test-runner-watch-mode.mjs b/test/parallel/test-runner-watch-mode.mjs
new file mode 100644
index 00000000000000..6803ac4e349138
--- /dev/null
+++ b/test/parallel/test-runner-watch-mode.mjs
@@ -0,0 +1,46 @@
+// Flags: --expose-internals
+import '../common/index.mjs';
+import { describe, it } from 'node:test';
+import { spawn } from 'node:child_process';
+import { writeFileSync, readFileSync } from 'node:fs';
+import util from 'internal/util';
+import * as fixtures from '../common/fixtures.mjs';
+
+async function testWatch({ files, fileToUpdate }) {
+  const ran1 = util.createDeferredPromise();
+  const ran2 = util.createDeferredPromise();
+  const child = spawn(process.execPath, ['--watch', '--test', '--no-warnings', ...files], { encoding: 'utf8' });
+  let stdout = '';
+  child.stdout.on('data', (data) => {
+    stdout += data.toString();
+    if (/ok 2/.test(stdout)) ran1.resolve();
+    if (/ok 3/.test(stdout)) ran2.resolve();
+  });
+
+  await ran1.promise;
+  writeFileSync(fileToUpdate, readFileSync(fileToUpdate, 'utf8'));
+  await ran2.promise;
+  child.kill();
+}
+
+describe('test runner watch mode', () => {
+  it('should run tests repeatedly', async () => {
+    const file1 = fixtures.path('test-runner/index.test.js');
+    const file2 = fixtures.path('test-runner/subdir/subdir_test.js');
+    await testWatch({ files: [file1, file2], fileToUpdate: file2 });
+  });
+
+  it('should run tests with dependency repeatedly', async () => {
+    const file1 = fixtures.path('test-runner/index.test.js');
+    const dependent = fixtures.path('test-runner/dependent.js');
+    const dependency = fixtures.path('test-runner/dependency.js');
+    await testWatch({ files: [file1, dependent], fileToUpdate: dependency });
+  });
+
+  it('should run tests with ESM dependency', async () => {
+    const file1 = fixtures.path('test-runner/index.test.js');
+    const dependent = fixtures.path('test-runner/dependent.js');
+    const dependency = fixtures.path('test-runner/dependency.mjs');
+    await testWatch({ files: [file1, dependent], fileToUpdate: dependency });
+  });
+});
diff --git a/test/parallel/test-set-incoming-message-header.js b/test/parallel/test-set-incoming-message-header.js
index 1fab6cd1e5a724..9ac05a8138d445 100644
--- a/test/parallel/test-set-incoming-message-header.js
+++ b/test/parallel/test-set-incoming-message-header.js
@@ -4,23 +4,24 @@ require('../common');
 const { IncomingMessage } = require('http');
 const assert = require('assert');
 
-// Headers setter should be a No-Op
+// Headers setter function set a header correctly
 {
   const im = new IncomingMessage();
   im.headers = { key: 'value' };
-  assert.deepStrictEqual(im.headers, {});
+  assert.deepStrictEqual(im.headers, { key: 'value' });
 }
 
-// Trailers setter should be a No-Op
+// Trailers setter function set a header correctly
 {
   const im = new IncomingMessage();
   im.trailers = { key: 'value' };
-  assert.deepStrictEqual(im.trailers, {});
+  assert.deepStrictEqual(im.trailers, { key: 'value' });
 }
 
 // _addHeaderLines function set a header correctly
 {
   const im = new IncomingMessage();
+  im.headers = { key1: 'value1' };
   im._addHeaderLines(['key2', 'value2'], 2);
-  assert.deepStrictEqual(im.headers, { key2: 'value2' });
+  assert.deepStrictEqual(im.headers, { key1: 'value1', key2: 'value2' });
 }
diff --git a/test/parallel/test-stream-finished.js b/test/parallel/test-stream-finished.js
index a574a4a65342e2..c7513805e7ac6f 100644
--- a/test/parallel/test-stream-finished.js
+++ b/test/parallel/test-stream-finished.js
@@ -667,3 +667,17 @@ testClosed((opts) => new Writable({ write() {}, ...opts }));
     ).end();
   });
 }
+
+{
+  const stream = new Duplex({
+    write(chunk, enc, cb) {
+      setImmediate(cb);
+    }
+  });
+
+  stream.end('foo');
+
+  finished(stream, { readable: false }, common.mustCall((err) => {
+    assert(!err);
+  }));
+}
diff --git a/test/parallel/test-tz-version.js b/test/parallel/test-tz-version.js
new file mode 100644
index 00000000000000..6e4b14e1ac1880
--- /dev/null
+++ b/test/parallel/test-tz-version.js
@@ -0,0 +1,28 @@
+'use strict';
+
+const common = require('../common');
+
+if (!common.hasIntl) {
+  common.skip('missing Intl');
+}
+
+// Refs: https://github.com/nodejs/node/blob/1af63a90ca3a59ca05b3a12ad7dbea04008db7d9/configure.py#L1694-L1711
+if (process.config.variables.icu_path !== 'deps/icu-small') {
+  // If Node.js is configured to use its built-in ICU, it uses a strict subset
+  // of ICU formed using `tools/icu/shrink-icu-src.py`, which is present in
+  // `deps/icu-small`. It is not the same as configuring the build with
+  // `./configure --with-intl=small-icu`. The latter only uses a subset of the
+  // locales, i.e., it uses the English locale, `root,en`, by default and other
+  // locales can also be specified using the `--with-icu-locales` option.
+  common.skip('not using the icu data file present in deps/icu-small/source/data/in/icudt##l.dat.bz2');
+}
+
+const fixtures = require('../common/fixtures');
+
+// This test ensures the correctness of the automated timezone upgrade PRs.
+
+const { strictEqual } = require('assert');
+const { readFileSync } = require('fs');
+
+const expectedVersion = readFileSync(fixtures.path('tz-version.txt'), 'utf8').trim();
+strictEqual(process.versions.tz, expectedVersion);
diff --git a/test/parallel/test-url-parse-format.js b/test/parallel/test-url-parse-format.js
index 03e7b7ece5ef5c..ef4aad51d0e3ac 100644
--- a/test/parallel/test-url-parse-format.js
+++ b/test/parallel/test-url-parse-format.js
@@ -865,6 +865,22 @@ const parseTests = {
     href: 'http://a%22%20%3C\'b:b@cd/e?f'
   },
 
+  // Git urls used by npm
+  'git+ssh://git@github.com:npm/npm': {
+    protocol: 'git+ssh:',
+    slashes: true,
+    auth: 'git',
+    host: 'github.com',
+    port: null,
+    hostname: 'github.com',
+    hash: null,
+    search: null,
+    query: null,
+    pathname: '/:npm/npm',
+    path: '/:npm/npm',
+    href: 'git+ssh://git@github.com/:npm/npm'
+  },
+
   'https://*': {
     protocol: 'https:',
     slashes: true,
diff --git a/test/parallel/test-url-parse-invalid-input.js b/test/parallel/test-url-parse-invalid-input.js
index 7ab86380ad7384..794a756524925b 100644
--- a/test/parallel/test-url-parse-invalid-input.js
+++ b/test/parallel/test-url-parse-invalid-input.js
@@ -74,15 +74,3 @@ if (common.hasIntl) {
                 (e) => e.code === 'ERR_INVALID_URL',
                 'parsing http://\u00AD/bad.com/');
 }
-
-{
-  const badURLs = [
-    'https://evil.com:.example.com',
-    'git+ssh://git@github.com:npm/npm',
-  ];
-  badURLs.forEach((badURL) => {
-    assert.throws(() => { url.parse(badURL); },
-                  (e) => e.code === 'ERR_INVALID_URL',
-                  `parsing ${badURL}`);
-  });
-}
diff --git a/test/parallel/test-v8-flag-pool-size-0.js b/test/parallel/test-v8-flag-pool-size-0.js
new file mode 100644
index 00000000000000..5f78e6006e0836
--- /dev/null
+++ b/test/parallel/test-v8-flag-pool-size-0.js
@@ -0,0 +1,10 @@
+// Flags: --v8-pool-size=0 --expose-gc
+
+'use strict';
+
+require('../common');
+
+// This verifies that V8 tasks scheduled by GC are handled on worker threads if
+// `--v8-pool-size=0` is given. The worker threads are managed by Node.js'
+// `v8::Platform` implementation.
+globalThis.gc();
diff --git a/test/parallel/test-v8-stats.js b/test/parallel/test-v8-stats.js
index 2eaa3c5b060914..d7360db03309eb 100644
--- a/test/parallel/test-v8-stats.js
+++ b/test/parallel/test-v8-stats.js
@@ -47,6 +47,8 @@ const expectedHeapSpaces = [
   'new_space',
   'old_space',
   'read_only_space',
+  'shared_large_object_space',
+  'shared_space',
 ];
 const heapSpaceStatistics = v8.getHeapSpaceStatistics();
 const actualHeapSpaceNames = heapSpaceStatistics.map((s) => s.space_name);
diff --git a/test/parallel/test-vfs.js b/test/parallel/test-vfs.js
index c4842be3a839d0..84e77f4bd58cd8 100644
--- a/test/parallel/test-vfs.js
+++ b/test/parallel/test-vfs.js
@@ -34,7 +34,8 @@ throws(() => require(vfsFile), { code: 'MODULE_NOT_FOUND' });
 
 common.expectWarning(
   'ExperimentalWarning',
-  'Module._stat is an experimental feature. This feature could change at any time');
+  'Module._stat is an experimental feature and might change at any time'
+);
 
 process.on('warning', common.mustCall());
 
diff --git a/test/parallel/test-whatwg-encoding-custom-textdecoder.js b/test/parallel/test-whatwg-encoding-custom-textdecoder.js
index 75a2a4735cd6ef..a48d0993fc7a92 100644
--- a/test/parallel/test-whatwg-encoding-custom-textdecoder.js
+++ b/test/parallel/test-whatwg-encoding-custom-textdecoder.js
@@ -113,7 +113,7 @@ if (common.hasIntl) {
       '  fatal: false,\n' +
       '  ignoreBOM: true,\n' +
       '  [Symbol(flags)]: 4,\n' +
-      '  [Symbol(handle)]: Converter {}\n' +
+      '  [Symbol(handle)]: undefined\n' +
       '}'
     );
   } else {
diff --git a/test/report/test-report-config.js b/test/report/test-report-config.js
index a8c0f70691e63f..dce58c5bfcd954 100644
--- a/test/report/test-report-config.js
+++ b/test/report/test-report-config.js
@@ -76,13 +76,13 @@ if (!common.isWindows) {
     process.report.signal = 'foo';
   }, {
     code: 'ERR_UNKNOWN_SIGNAL',
-    message: 'Unknown signal: foo'
+    message: 'Unknown signal: foo',
   });
   assert.throws(() => {
     process.report.signal = 'sigusr1';
   }, {
     code: 'ERR_UNKNOWN_SIGNAL',
-    message: 'Unknown signal: sigusr1 (signals must use all capital letters)'
+    message: 'Unknown signal: sigusr1 (signals must use all capital letters)',
   });
   assert.strictEqual(process.report.signal, 'SIGUSR2');
   process.report.signal = 'SIGUSR1';
diff --git a/test/report/test-report-uncaught-exception-compat.js b/test/report/test-report-uncaught-exception-compat.js
index 91989f6ecda994..454a48fd484600 100644
--- a/test/report/test-report-uncaught-exception-compat.js
+++ b/test/report/test-report-uncaught-exception-compat.js
@@ -17,7 +17,7 @@ const child = childProcess.spawn(process.execPath, [
   __filename,
   'child',
 ], {
-  cwd: tmpdir.path
+  cwd: tmpdir.path,
 });
 child.on('exit', common.mustCall((code) => {
   assert.strictEqual(code, 1);
diff --git a/test/sequential/test-watch-mode.mjs b/test/sequential/test-watch-mode.mjs
index e24fb97ad234a8..9b894922621e3b 100644
--- a/test/sequential/test-watch-mode.mjs
+++ b/test/sequential/test-watch-mode.mjs
@@ -9,10 +9,13 @@ import { spawn } from 'node:child_process';
 import { writeFileSync, readFileSync } from 'node:fs';
 import { inspect } from 'node:util';
 import { once } from 'node:events';
+import { createInterface } from 'node:readline/promises';
 
 if (common.isIBMi)
   common.skip('IBMi does not support `fs.watch()`');
 
+const supportsRecursive = common.isOSX || common.isWindows;
+
 function restart(file) {
   // To avoid flakiness, we save the file repeatedly until test is done
   writeFileSync(file, readFileSync(file));
@@ -59,8 +62,8 @@ async function spawnWithRestarts({
 }
 
 let tmpFiles = 0;
-function createTmpFile(content = 'console.log("running");') {
-  const file = path.join(tmpdir.path, `${tmpFiles++}.js`);
+function createTmpFile(content = 'console.log("running");', ext = '.js') {
+  const file = path.join(tmpdir.path, `${tmpFiles++}${ext}`);
   writeFileSync(file, content);
   return file;
 }
@@ -74,11 +77,29 @@ function assertRestartedCorrectly({ stdout, messages: { inner, completed, restar
   assert.deepStrictEqual(lines.slice(-end.length), end);
 }
 
+async function failWriteSucceed({ file, watchedFile }) {
+  const child = spawn(execPath, ['--watch', '--no-warnings', file], { encoding: 'utf8' });
+
+  try {
+    // Break the chunks into lines
+    for await (const data of createInterface({ input: child.stdout })) {
+      if (data.startsWith('Completed running')) {
+        break;
+      }
+      if (data.startsWith('Failed running')) {
+        writeFileSync(watchedFile, 'console.log("test has ran");');
+      }
+    }
+  } finally {
+    child.kill();
+  }
+}
+
 tmpdir.refresh();
 
 // Warning: this suite can run safely with concurrency: true
 // only if tests do not watch/depend on the same files
-describe('watch mode', { concurrency: true, timeout: 60_0000 }, () => {
+describe('watch mode', { concurrency: true, timeout: 60_000 }, () => {
   it('should watch changes to a file - event loop ended', async () => {
     const file = createTmpFile();
     const { stderr, stdout } = await spawnWithRestarts({ file });
@@ -104,16 +125,8 @@ describe('watch mode', { concurrency: true, timeout: 60_0000 }, () => {
     });
   });
 
-  it('should not watch when running an non-existing file', async () => {
-    const file = fixtures.path('watch-mode/non-existing.js');
-    const { stderr, stdout } = await spawnWithRestarts({ file, restarts: 0 });
-
-    assert.match(stderr, /code: 'MODULE_NOT_FOUND'/);
-    assert.strictEqual(stdout, `Failed running ${inspect(file)}\n`);
-  });
-
   it('should watch when running an non-existing file - when specified under --watch-path', {
-    skip: !common.isOSX && !common.isWindows
+    skip: !supportsRecursive
   }, async () => {
     const file = fixtures.path('watch-mode/subdir/non-existing.js');
     const watchedFile = fixtures.path('watch-mode/subdir/file.js');
@@ -220,4 +233,39 @@ describe('watch mode', { concurrency: true, timeout: 60_0000 }, () => {
       messages: { restarted: `Restarting ${inspect(file)}`, completed: `Completed running ${inspect(file)}` },
     });
   });
+
+  // TODO: Remove skip after https://github.com/nodejs/node/pull/45271 lands
+  it('should not watch when running an missing file', {
+    skip: !supportsRecursive
+  }, async () => {
+    const nonExistingfile = path.join(tmpdir.path, `${tmpFiles++}.js`);
+    await failWriteSucceed({ file: nonExistingfile, watchedFile: nonExistingfile });
+  });
+
+  it('should not watch when running an missing mjs file', {
+    skip: !supportsRecursive
+  }, async () => {
+    const nonExistingfile = path.join(tmpdir.path, `${tmpFiles++}.mjs`);
+    await failWriteSucceed({ file: nonExistingfile, watchedFile: nonExistingfile });
+  });
+
+  it('should watch changes to previously missing dependency', {
+    skip: !supportsRecursive
+  }, async () => {
+    const dependency = path.join(tmpdir.path, `${tmpFiles++}.js`);
+    const relativeDependencyPath = `./${path.basename(dependency)}`;
+    const dependant = createTmpFile(`console.log(require('${relativeDependencyPath}'))`);
+
+    await failWriteSucceed({ file: dependant, watchedFile: dependency });
+  });
+
+  it('should watch changes to previously missing ESM dependency', {
+    skip: !supportsRecursive
+  }, async () => {
+    const dependency = path.join(tmpdir.path, `${tmpFiles++}.mjs`);
+    const relativeDependencyPath = `./${path.basename(dependency)}`;
+    const dependant = createTmpFile(`import '${relativeDependencyPath}'`, '.mjs');
+
+    await failWriteSucceed({ file: dependant, watchedFile: dependency });
+  });
 });
diff --git a/test/tick-processor/test-tick-processor-builtin.js b/test/tick-processor/test-tick-processor-builtin.js
index f01f0986682dc9..cdd24d48f60ab2 100644
--- a/test/tick-processor/test-tick-processor-builtin.js
+++ b/test/tick-processor/test-tick-processor-builtin.js
@@ -14,5 +14,5 @@ base.runTest({
            this.ts = Date.now();
            setImmediate(function() { new f(); });
          };
-         f();`
+         f();`,
 });
diff --git a/test/tick-processor/test-tick-processor-cpp-core.js b/test/tick-processor/test-tick-processor-cpp-core.js
index 89943cca5c8329..9b578f9cbd962e 100644
--- a/test/tick-processor/test-tick-processor-cpp-core.js
+++ b/test/tick-processor/test-tick-processor-cpp-core.js
@@ -14,5 +14,5 @@ base.runTest({
            require('vm').createContext({});
            setImmediate(function() { f(); });
          };
-         f();`
+         f();`,
 });
diff --git a/test/tick-processor/test-tick-processor-polyfill-brokenfile.js b/test/tick-processor/test-tick-processor-polyfill-brokenfile.js
index e5e13fd3db122f..2089325dff3e99 100644
--- a/test/tick-processor/test-tick-processor-polyfill-brokenfile.js
+++ b/test/tick-processor/test-tick-processor-polyfill-brokenfile.js
@@ -36,7 +36,7 @@ const proc = spawn(process.execPath, [
   '--prof',
   '-pe', code,
 ], {
-  stdio: ['ignore', 'pipe', 'inherit']
+  stdio: ['ignore', 'pipe', 'inherit'],
 });
 
 let ticks = '';
diff --git a/test/tick-processor/test-tick-processor-preprocess-flag.js b/test/tick-processor/test-tick-processor-preprocess-flag.js
index b003f7c6b8b01f..15bc0fbad71de9 100644
--- a/test/tick-processor/test-tick-processor-preprocess-flag.js
+++ b/test/tick-processor/test-tick-processor-preprocess-flag.js
@@ -15,5 +15,5 @@ base.runTest({
            setImmediate(function() { f(); });
          };
          f();`,
-  profProcessFlags: ['--preprocess']
+  profProcessFlags: ['--preprocess'],
 });
diff --git a/test/tick-processor/test-tick-processor-unknown.js b/test/tick-processor/test-tick-processor-unknown.js
index d5e6a9359e52eb..f7116a9d54d3de 100644
--- a/test/tick-processor/test-tick-processor-unknown.js
+++ b/test/tick-processor/test-tick-processor-unknown.js
@@ -21,5 +21,5 @@ base.runTest({
            }
            setImmediate(function() { f(); });
          };
-         f();`
+         f();`,
 });
diff --git a/test/tick-processor/tick-processor-base.js b/test/tick-processor/tick-processor-base.js
index d9f23ae7d768f5..91307d16928889 100644
--- a/test/tick-processor/tick-processor-base.js
+++ b/test/tick-processor/tick-processor-base.js
@@ -17,7 +17,7 @@ function runTest(test) {
     '--prof',
     '-pe', test.code,
   ], {
-    stdio: [ 'ignore', 'pipe', 'inherit' ]
+    stdio: [ 'ignore', 'pipe', 'inherit' ],
   });
 
   let ticks = '';
@@ -39,7 +39,7 @@ function match(pattern, parent, ticks, flags = []) {
     ...flags,
     LOG_FILE,
   ], {
-    stdio: [ 'ignore', 'pipe', 'inherit' ]
+    stdio: [ 'ignore', 'pipe', 'inherit' ],
   });
 
   let out = '';
diff --git a/test/tick-processor/util.js b/test/tick-processor/util.js
index d25a2a7dcb132e..6d118b7c38bc66 100644
--- a/test/tick-processor/util.js
+++ b/test/tick-processor/util.js
@@ -6,7 +6,7 @@ const {
   isSunOS,
   isAIX,
   isLinuxPPCBE,
-  isFreeBSD
+  isFreeBSD,
 } = require('../common');
 
 module.exports = {
@@ -14,5 +14,5 @@ module.exports = {
                          isSunOS ||
                          isAIX ||
                          isLinuxPPCBE ||
-                         isFreeBSD
+                         isFreeBSD,
 };
diff --git a/test/v8-updates/test-trace-gc-flag.js b/test/v8-updates/test-trace-gc-flag.js
index d84e359525127c..0fe9beb52a3503 100644
--- a/test/v8-updates/test-trace-gc-flag.js
+++ b/test/v8-updates/test-trace-gc-flag.js
@@ -24,7 +24,7 @@ const fixtures = require('../common/fixtures');
     scavengeRegex,
     scavengeRegex,
     scavengeRegex,
-    /\bMark-sweep\b/,
+    /\bMark-Compact\b/,
   ];
   lines.forEach((line, index) => {
     assert.match(line, expectedOutput[index]);
diff --git a/test/wasi/test-wasi-initialize-validation.js b/test/wasi/test-wasi-initialize-validation.js
index 6506e1ac4a79e3..f1279a6009433d 100644
--- a/test/wasi/test-wasi-initialize-validation.js
+++ b/test/wasi/test-wasi-initialize-validation.js
@@ -18,8 +18,8 @@ const bufferSource = fixtures.readSync('simple.wasm');
       () => { wasi.initialize(); },
       {
         code: 'ERR_INVALID_ARG_TYPE',
-        message: /"instance" argument must be of type object/
-      }
+        message: /"instance" argument must be of type object/,
+      },
     );
   }
 
@@ -34,8 +34,8 @@ const bufferSource = fixtures.readSync('simple.wasm');
       () => { wasi.initialize(instance); },
       {
         code: 'ERR_INVALID_ARG_TYPE',
-        message: /"instance\.exports" property must be of type object/
-      }
+        message: /"instance\.exports" property must be of type object/,
+      },
     );
   }
 
@@ -57,8 +57,8 @@ const bufferSource = fixtures.readSync('simple.wasm');
       () => { wasi.initialize(instance); },
       {
         code: 'ERR_INVALID_ARG_TYPE',
-        message: /"instance\.exports\._initialize" property must be of type function/
-      }
+        message: /"instance\.exports\._initialize" property must be of type function/,
+      },
     );
   }
 
@@ -75,7 +75,7 @@ const bufferSource = fixtures.readSync('simple.wasm');
           _initialize() {},
           memory: new WebAssembly.Memory({ initial: 1 }),
         };
-      }
+      },
     });
     assert.throws(
       () => { wasi.initialize(instance); },
@@ -83,7 +83,7 @@ const bufferSource = fixtures.readSync('simple.wasm');
         code: 'ERR_INVALID_ARG_TYPE',
         message: 'The "instance.exports._start" property must be' +
           ' undefined. Received function _start',
-      }
+      },
     );
   }
 
@@ -94,14 +94,14 @@ const bufferSource = fixtures.readSync('simple.wasm');
     const instance = await WebAssembly.instantiate(wasm);
 
     Object.defineProperty(instance, 'exports', {
-      get() { return { _initialize() {} }; }
+      get() { return { _initialize() {} }; },
     });
     assert.throws(
       () => { wasi.initialize(instance); },
       {
         code: 'ERR_INVALID_ARG_TYPE',
-        message: /"instance\.exports\.memory" property must be a WebAssembly\.Memory object/
-      }
+        message: /"instance\.exports\.memory" property must be a WebAssembly\.Memory object/,
+      },
     );
   }
 
@@ -139,17 +139,17 @@ const bufferSource = fixtures.readSync('simple.wasm');
       get() {
         return {
           _initialize() {},
-          memory: new WebAssembly.Memory({ initial: 1 })
+          memory: new WebAssembly.Memory({ initial: 1 }),
         };
-      }
+      },
     });
     wasi.initialize(instance);
     assert.throws(
       () => { wasi.initialize(instance); },
       {
         code: 'ERR_WASI_ALREADY_STARTED',
-        message: /^WASI instance has already started$/
-      }
+        message: /^WASI instance has already started$/,
+      },
     );
   }
 })().then(common.mustCall());
diff --git a/test/wasi/test-wasi-not-started.js b/test/wasi/test-wasi-not-started.js
index 0dde5495112497..28da4fa41b657f 100644
--- a/test/wasi/test-wasi-not-started.js
+++ b/test/wasi/test-wasi-not-started.js
@@ -8,7 +8,7 @@ if (process.argv[2] === 'wasi-child') {
 
   const { WASI } = require('wasi');
   const wasi = new WASI({
-    args: ['foo', '-bar', '--baz=value']
+    args: ['foo', '-bar', '--baz=value'],
   });
   const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
 
@@ -21,7 +21,7 @@ if (process.argv[2] === 'wasi-child') {
   }, {
     name: 'Error',
     code: 'ERR_WASI_NOT_STARTED',
-    message: 'wasi.start() has not been called'
+    message: 'wasi.start() has not been called',
   });
 } else {
   const assert = require('assert');
@@ -32,7 +32,7 @@ if (process.argv[2] === 'wasi-child') {
     __filename,
     'wasi-child',
   ], {
-    env: { ...process.env, NODE_DEBUG_NATIVE: 'wasi' }
+    env: { ...process.env, NODE_DEBUG_NATIVE: 'wasi' },
   });
   assert.strictEqual(child.signal, null);
   assert.strictEqual(child.status, 0);
diff --git a/test/wasi/test-wasi-start-validation.js b/test/wasi/test-wasi-start-validation.js
index 016479f412f678..01bd1a2bb63624 100644
--- a/test/wasi/test-wasi-start-validation.js
+++ b/test/wasi/test-wasi-start-validation.js
@@ -18,8 +18,8 @@ const bufferSource = fixtures.readSync('simple.wasm');
       () => { wasi.start(); },
       {
         code: 'ERR_INVALID_ARG_TYPE',
-        message: /"instance" argument must be of type object/
-      }
+        message: /"instance" argument must be of type object/,
+      },
     );
   }
 
@@ -34,8 +34,8 @@ const bufferSource = fixtures.readSync('simple.wasm');
       () => { wasi.start(instance); },
       {
         code: 'ERR_INVALID_ARG_TYPE',
-        message: /"instance\.exports" property must be of type object/
-      }
+        message: /"instance\.exports" property must be of type object/,
+      },
     );
   }
 
@@ -54,8 +54,8 @@ const bufferSource = fixtures.readSync('simple.wasm');
       () => { wasi.start(instance); },
       {
         code: 'ERR_INVALID_ARG_TYPE',
-        message: /"instance\.exports\._start" property must be of type function/
-      }
+        message: /"instance\.exports\._start" property must be of type function/,
+      },
     );
   }
 
@@ -72,7 +72,7 @@ const bufferSource = fixtures.readSync('simple.wasm');
           _initialize() {},
           memory: new WebAssembly.Memory({ initial: 1 }),
         };
-      }
+      },
     });
     assert.throws(
       () => { wasi.start(instance); },
@@ -80,7 +80,7 @@ const bufferSource = fixtures.readSync('simple.wasm');
         code: 'ERR_INVALID_ARG_TYPE',
         message: 'The "instance.exports._initialize" property must be' +
           ' undefined. Received function _initialize',
-      }
+      },
     );
   }
 
@@ -91,14 +91,14 @@ const bufferSource = fixtures.readSync('simple.wasm');
     const instance = await WebAssembly.instantiate(wasm);
 
     Object.defineProperty(instance, 'exports', {
-      get() { return { _start() {} }; }
+      get() { return { _start() {} }; },
     });
     assert.throws(
       () => { wasi.start(instance); },
       {
         code: 'ERR_INVALID_ARG_TYPE',
-        message: /"instance\.exports\.memory" property must be a WebAssembly\.Memory object/
-      }
+        message: /"instance\.exports\.memory" property must be a WebAssembly\.Memory object/,
+      },
     );
   }
 
@@ -136,17 +136,17 @@ const bufferSource = fixtures.readSync('simple.wasm');
       get() {
         return {
           _start() {},
-          memory: new WebAssembly.Memory({ initial: 1 })
+          memory: new WebAssembly.Memory({ initial: 1 }),
         };
-      }
+      },
     });
     wasi.start(instance);
     assert.throws(
       () => { wasi.start(instance); },
       {
         code: 'ERR_WASI_ALREADY_STARTED',
-        message: /^WASI instance has already started$/
-      }
+        message: /^WASI instance has already started$/,
+      },
     );
   }
 })().then(common.mustCall());
diff --git a/test/wasi/test-wasi-symlinks.js b/test/wasi/test-wasi-symlinks.js
index 1389707671adcb..7f6d9302dedf0a 100644
--- a/test/wasi/test-wasi-symlinks.js
+++ b/test/wasi/test-wasi-symlinks.js
@@ -5,8 +5,7 @@ const path = require('path');
 
 if (process.argv[2] === 'wasi-child') {
   common.expectWarning('ExperimentalWarning',
-                       'WASI is an experimental feature. This feature could ' +
-                       'change at any time');
+                       'WASI is an experimental feature and might change at any time');
 
   const { WASI } = require('wasi');
   const wasmDir = path.join(__dirname, 'wasm');
@@ -15,8 +14,8 @@ if (process.argv[2] === 'wasi-child') {
     env: process.env,
     preopens: {
       '/sandbox': process.argv[4],
-      '/tmp': process.argv[5]
-    }
+      '/tmp': process.argv[5],
+    },
   });
   const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
   const modulePath = path.join(wasmDir, `${process.argv[3]}.wasm`);
diff --git a/test/wasi/test-wasi.js b/test/wasi/test-wasi.js
index 6c00b5a7b72503..949fc77e97a7a3 100644
--- a/test/wasi/test-wasi.js
+++ b/test/wasi/test-wasi.js
@@ -8,8 +8,7 @@ if (process.argv[2] === 'wasi-child') {
   const path = require('path');
 
   common.expectWarning('ExperimentalWarning',
-                       'WASI is an experimental feature. This feature could ' +
-                       'change at any time');
+                       'WASI is an experimental feature and might change at any time');
 
   const { WASI } = require('wasi');
   tmpdir.refresh();
@@ -19,8 +18,8 @@ if (process.argv[2] === 'wasi-child') {
     env: process.env,
     preopens: {
       '/sandbox': fixtures.path('wasi'),
-      '/tmp': tmpdir.path
-    }
+      '/tmp': tmpdir.path,
+    },
   });
   const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
   const modulePath = path.join(wasmDir, `${process.argv[3]}.wasm`);
@@ -42,8 +41,8 @@ if (process.argv[2] === 'wasi-child') {
       env: {
         ...process.env,
         NODE_DEBUG_NATIVE: 'wasi',
-        NODE_PLATFORM: process.platform
-      }
+        NODE_PLATFORM: process.platform,
+      },
     };
 
     if (options.stdin !== undefined)
@@ -90,7 +89,7 @@ if (process.argv[2] === 'wasi-child') {
   runWASI({ test: 'read_file', stdout: `hello from input.txt${checkoutEOL}` });
   runWASI({
     test: 'read_file_twice',
-    stdout: `hello from input.txt${checkoutEOL}hello from input.txt${checkoutEOL}`
+    stdout: `hello from input.txt${checkoutEOL}hello from input.txt${checkoutEOL}`,
   });
   runWASI({ test: 'stat' });
   runWASI({ test: 'write_file' });
diff --git a/test/wpt/status/FileAPI/file.json b/test/wpt/status/FileAPI/file.json
new file mode 100644
index 00000000000000..6b50bcec1539e3
--- /dev/null
+++ b/test/wpt/status/FileAPI/file.json
@@ -0,0 +1,17 @@
+{
+  "Worker-read-file-constructor.worker.js": {
+    "skip": true
+  },
+  "send-file-formdata-punctuation.any.js": {
+    "skip": true
+  },
+  "send-file-formdata-utf-8.any.js": {
+    "skip": true
+  },
+  "send-file-formdata.any.js": {
+    "skip": true
+  },
+  "send-file-formdata-controls.any.js": {
+    "skip": true
+  }
+}
diff --git a/test/wpt/status/html/webappapis/structured-clone.json b/test/wpt/status/html/webappapis/structured-clone.json
index d2a7539641ffb5..873f2f9b46eb03 100644
--- a/test/wpt/status/html/webappapis/structured-clone.json
+++ b/test/wpt/status/html/webappapis/structured-clone.json
@@ -1,5 +1,7 @@
 {
   "structured-clone.any.js": {
-    "skip": "Missing File API"
+    "fail": {
+      "expected": ["File basic"]
+    }
   }
 }
diff --git a/test/wpt/test-file.js b/test/wpt/test-file.js
new file mode 100644
index 00000000000000..71e8c179de95e2
--- /dev/null
+++ b/test/wpt/test-file.js
@@ -0,0 +1,13 @@
+'use strict';
+
+require('../common');
+const { WPTRunner } = require('../common/wpt');
+
+const runner = new WPTRunner('FileAPI/file');
+
+runner.setInitScript(`
+  const { File } = require('buffer');
+  globalThis.File = File;
+`);
+
+runner.runJsTests();
diff --git a/test/wpt/test-structured-clone.js b/test/wpt/test-structured-clone.js
index 98ef87184a6ce2..57b990c23cdfb5 100644
--- a/test/wpt/test-structured-clone.js
+++ b/test/wpt/test-structured-clone.js
@@ -6,8 +6,8 @@ const { WPTRunner } = require('../common/wpt');
 const runner = new WPTRunner('html/webappapis/structured-clone');
 
 runner.setInitScript(`
-  const { Blob } = require('buffer');
-  global.Blob = Blob;
+  const { File } = require('buffer');
+  globalThis.File = File;
 `);
 
 runner.runJsTests();
diff --git a/tools/certdata.txt b/tools/certdata.txt
index dfaeceb89acf7a..7c5e55ff5b413e 100644
--- a/tools/certdata.txt
+++ b/tools/certdata.txt
@@ -79,7 +79,7 @@ CKA_LABEL UTF8 "Mozilla Builtin Roots"
 # Subject: CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE
 # Not Valid Before: Tue Sep 01 12:00:00 1998
 # Not Valid After : Fri Jan 28 12:00:00 2028
-# Fingerprint (MD5): 3E:45:52:15:09:51:92:E1:B7:5D:37:9F:B1:87:29:8A
+# Fingerprint (SHA-256): EB:D4:10:40:E4:BB:3E:C7:42:C9:E3:81:D3:1E:F2:A4:1A:48:B6:68:5C:96:E7:CE:F3:C1:DF:6C:D4:33:1C:99
 # Fingerprint (SHA1): B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -169,13 +169,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "GlobalSign Root CA"
+# Trust for "GlobalSign Root CA"
 # Issuer: CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE
 # Serial Number:04:00:00:00:00:01:15:4b:5a:c3:94
 # Subject: CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE
 # Not Valid Before: Tue Sep 01 12:00:00 1998
 # Not Valid After : Fri Jan 28 12:00:00 2028
-# Fingerprint (MD5): 3E:45:52:15:09:51:92:E1:B7:5D:37:9F:B1:87:29:8A
+# Fingerprint (SHA-256): EB:D4:10:40:E4:BB:3E:C7:42:C9:E3:81:D3:1E:F2:A4:1A:48:B6:68:5C:96:E7:CE:F3:C1:DF:6C:D4:33:1C:99
 # Fingerprint (SHA1): B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -205,141 +205,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
-#
-# Certificate "GlobalSign Root CA - R2"
-#
-# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R2
-# Serial Number:04:00:00:00:00:01:0f:86:26:e6:0d
-# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R2
-# Not Valid Before: Fri Dec 15 08:00:00 2006
-# Not Valid After : Wed Dec 15 08:00:00 2021
-# Fingerprint (MD5): 94:14:77:7E:3E:5E:FD:8F:30:BD:41:B0:CF:E7:D0:30
-# Fingerprint (SHA1): 75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Root CA - R2"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\114\061\040\060\036\006\003\125\004\013\023\027\107\154\157
-\142\141\154\123\151\147\156\040\122\157\157\164\040\103\101\040
-\055\040\122\062\061\023\060\021\006\003\125\004\012\023\012\107
-\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125
-\004\003\023\012\107\154\157\142\141\154\123\151\147\156
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\114\061\040\060\036\006\003\125\004\013\023\027\107\154\157
-\142\141\154\123\151\147\156\040\122\157\157\164\040\103\101\040
-\055\040\122\062\061\023\060\021\006\003\125\004\012\023\012\107
-\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125
-\004\003\023\012\107\154\157\142\141\154\123\151\147\156
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\013\004\000\000\000\000\001\017\206\046\346\015
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\003\272\060\202\002\242\240\003\002\001\002\002\013\004
-\000\000\000\000\001\017\206\046\346\015\060\015\006\011\052\206
-\110\206\367\015\001\001\005\005\000\060\114\061\040\060\036\006
-\003\125\004\013\023\027\107\154\157\142\141\154\123\151\147\156
-\040\122\157\157\164\040\103\101\040\055\040\122\062\061\023\060
-\021\006\003\125\004\012\023\012\107\154\157\142\141\154\123\151
-\147\156\061\023\060\021\006\003\125\004\003\023\012\107\154\157
-\142\141\154\123\151\147\156\060\036\027\015\060\066\061\062\061
-\065\060\070\060\060\060\060\132\027\015\062\061\061\062\061\065
-\060\070\060\060\060\060\132\060\114\061\040\060\036\006\003\125
-\004\013\023\027\107\154\157\142\141\154\123\151\147\156\040\122
-\157\157\164\040\103\101\040\055\040\122\062\061\023\060\021\006
-\003\125\004\012\023\012\107\154\157\142\141\154\123\151\147\156
-\061\023\060\021\006\003\125\004\003\023\012\107\154\157\142\141
-\154\123\151\147\156\060\202\001\042\060\015\006\011\052\206\110
-\206\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001
-\012\002\202\001\001\000\246\317\044\016\276\056\157\050\231\105
-\102\304\253\076\041\124\233\013\323\177\204\160\372\022\263\313
-\277\207\137\306\177\206\323\262\060\134\326\375\255\361\173\334
-\345\370\140\226\011\222\020\365\320\123\336\373\173\176\163\210
-\254\122\210\173\112\246\312\111\246\136\250\247\214\132\021\274
-\172\202\353\276\214\351\263\254\226\045\007\227\112\231\052\007
-\057\264\036\167\277\212\017\265\002\174\033\226\270\305\271\072
-\054\274\326\022\271\353\131\175\342\320\006\206\137\136\111\152
-\265\071\136\210\064\354\274\170\014\010\230\204\154\250\315\113
-\264\240\175\014\171\115\360\270\055\313\041\312\325\154\133\175
-\341\240\051\204\241\371\323\224\111\313\044\142\221\040\274\335
-\013\325\331\314\371\352\047\012\053\163\221\306\235\033\254\310
-\313\350\340\240\364\057\220\213\115\373\260\066\033\366\031\172
-\205\340\155\362\141\023\210\134\237\340\223\012\121\227\212\132
-\316\257\253\325\367\252\011\252\140\275\334\331\137\337\162\251
-\140\023\136\000\001\311\112\372\077\244\352\007\003\041\002\216
-\202\312\003\302\233\217\002\003\001\000\001\243\201\234\060\201
-\231\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001
-\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001
-\001\377\060\035\006\003\125\035\016\004\026\004\024\233\342\007
-\127\147\034\036\300\152\006\336\131\264\232\055\337\334\031\206
-\056\060\066\006\003\125\035\037\004\057\060\055\060\053\240\051
-\240\047\206\045\150\164\164\160\072\057\057\143\162\154\056\147
-\154\157\142\141\154\163\151\147\156\056\156\145\164\057\162\157
-\157\164\055\162\062\056\143\162\154\060\037\006\003\125\035\043
-\004\030\060\026\200\024\233\342\007\127\147\034\036\300\152\006
-\336\131\264\232\055\337\334\031\206\056\060\015\006\011\052\206
-\110\206\367\015\001\001\005\005\000\003\202\001\001\000\231\201
-\123\207\034\150\227\206\221\354\340\112\270\104\013\253\201\254
-\047\117\326\301\270\034\103\170\263\014\232\374\352\054\074\156
-\141\033\115\113\051\365\237\005\035\046\301\270\351\203\000\142
-\105\266\251\010\223\271\251\063\113\030\232\302\370\207\210\116
-\333\335\161\064\032\301\124\332\106\077\340\323\052\253\155\124
-\042\365\072\142\315\040\157\272\051\211\327\335\221\356\323\134
-\242\076\241\133\101\365\337\345\144\103\055\351\325\071\253\322
-\242\337\267\213\320\300\200\031\034\105\300\055\214\350\370\055
-\244\164\126\111\305\005\265\117\025\336\156\104\170\071\207\250
-\176\273\363\171\030\221\273\364\157\235\301\360\214\065\214\135
-\001\373\303\155\271\357\104\155\171\106\061\176\012\376\251\202
-\301\377\357\253\156\040\304\120\311\137\235\115\233\027\214\014
-\345\001\311\240\101\152\163\123\372\245\120\264\156\045\017\373
-\114\030\364\375\122\331\216\151\261\350\021\017\336\210\330\373
-\035\111\367\252\336\225\317\040\170\302\140\022\333\045\100\214
-\152\374\176\102\070\100\144\022\367\236\201\341\223\056
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for Certificate "GlobalSign Root CA - R2"
-# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R2
-# Serial Number:04:00:00:00:00:01:0f:86:26:e6:0d
-# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R2
-# Not Valid Before: Fri Dec 15 08:00:00 2006
-# Not Valid After : Wed Dec 15 08:00:00 2021
-# Fingerprint (MD5): 94:14:77:7E:3E:5E:FD:8F:30:BD:41:B0:CF:E7:D0:30
-# Fingerprint (SHA1): 75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Root CA - R2"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\165\340\253\266\023\205\022\047\034\004\370\137\335\336\070\344
-\267\044\056\376
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\224\024\167\176\076\136\375\217\060\275\101\260\317\347\320\060
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\114\061\040\060\036\006\003\125\004\013\023\027\107\154\157
-\142\141\154\123\151\147\156\040\122\157\157\164\040\103\101\040
-\055\040\122\062\061\023\060\021\006\003\125\004\012\023\012\107
-\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125
-\004\003\023\012\107\154\157\142\141\154\123\151\147\156
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\013\004\000\000\000\000\001\017\206\046\346\015
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
 #
 # Certificate "Verisign Class 1 Public Primary Certification Authority - G3"
 #
@@ -348,7 +213,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=VeriSign Class 1 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
 # Not Valid Before: Fri Oct 01 00:00:00 1999
 # Not Valid After : Wed Jul 16 23:59:59 2036
-# Fingerprint (MD5): B1:47:BC:18:57:D1:18:A0:78:2D:EC:71:E8:2A:95:73
+# Fingerprint (SHA-256): CB:B5:AF:18:5E:94:2A:24:02:F9:EA:CB:C0:ED:5B:B8:76:EE:A3:C1:22:36:23:D0:04:47:E4:F3:BA:55:4B:65
 # Fingerprint (SHA1): 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -466,13 +331,13 @@ CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL
 \062\062\060\070\063\061\060\060\060\060\060\060\132
 END
 
-# Trust for Certificate "Verisign Class 1 Public Primary Certification Authority - G3"
+# Trust for "Verisign Class 1 Public Primary Certification Authority - G3"
 # Issuer: CN=VeriSign Class 1 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
 # Serial Number:00:8b:5b:75:56:84:54:85:0b:00:cf:af:38:48:ce:b1:a4
 # Subject: CN=VeriSign Class 1 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
 # Not Valid Before: Fri Oct 01 00:00:00 1999
 # Not Valid After : Wed Jul 16 23:59:59 2036
-# Fingerprint (MD5): B1:47:BC:18:57:D1:18:A0:78:2D:EC:71:E8:2A:95:73
+# Fingerprint (SHA-256): CB:B5:AF:18:5E:94:2A:24:02:F9:EA:CB:C0:ED:5B:B8:76:EE:A3:C1:22:36:23:D0:04:47:E4:F3:BA:55:4B:65
 # Fingerprint (SHA1): 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -518,7 +383,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=VeriSign Class 2 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
 # Not Valid Before: Fri Oct 01 00:00:00 1999
 # Not Valid After : Wed Jul 16 23:59:59 2036
-# Fingerprint (MD5): F8:BE:C4:63:22:C9:A8:46:74:8B:B8:1D:1E:4A:2B:F6
+# Fingerprint (SHA-256): 92:A9:D9:83:3F:E1:94:4D:B3:66:E8:BF:AE:7A:95:B6:48:0C:2D:6C:6C:2A:1B:E6:5D:42:36:B6:08:FC:A1:BB
 # Fingerprint (SHA1): 61:EF:43:D7:7F:CA:D4:61:51:BC:98:E0:C3:59:12:AF:9F:EB:63:11
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -636,13 +501,13 @@ CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL
 \062\062\060\070\063\061\060\060\060\060\060\060\132
 END
 
-# Trust for Certificate "Verisign Class 2 Public Primary Certification Authority - G3"
+# Trust for "Verisign Class 2 Public Primary Certification Authority - G3"
 # Issuer: CN=VeriSign Class 2 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
 # Serial Number:61:70:cb:49:8c:5f:98:45:29:e7:b0:a6:d9:50:5b:7a
 # Subject: CN=VeriSign Class 2 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
 # Not Valid Before: Fri Oct 01 00:00:00 1999
 # Not Valid After : Wed Jul 16 23:59:59 2036
-# Fingerprint (MD5): F8:BE:C4:63:22:C9:A8:46:74:8B:B8:1D:1E:4A:2B:F6
+# Fingerprint (SHA-256): 92:A9:D9:83:3F:E1:94:4D:B3:66:E8:BF:AE:7A:95:B6:48:0C:2D:6C:6C:2A:1B:E6:5D:42:36:B6:08:FC:A1:BB
 # Fingerprint (SHA1): 61:EF:43:D7:7F:CA:D4:61:51:BC:98:E0:C3:59:12:AF:9F:EB:63:11
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -688,7 +553,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Entrust.net Certification Authority (2048),OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),O=Entrust.net
 # Not Valid Before: Fri Dec 24 17:50:51 1999
 # Not Valid After : Tue Jul 24 14:15:12 2029
-# Fingerprint (MD5): EE:29:31:BC:32:7E:9A:E6:E8:B5:F7:51:B4:34:71:90
+# Fingerprint (SHA-256): 6D:C4:71:72:E0:1C:BC:B0:BF:62:58:0D:89:5F:E2:B8:AC:9A:D4:F8:73:80:1E:0C:10:B9:C8:37:D2:1E:B1:77
 # Fingerprint (SHA1): 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -807,7 +672,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=Entrust.net Certification Authority (2048),OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),O=Entrust.net
 # Not Valid Before: Fri Dec 24 17:50:51 1999
 # Not Valid After : Tue Jul 24 14:15:12 2029
-# Fingerprint (MD5): EE:29:31:BC:32:7E:9A:E6:E8:B5:F7:51:B4:34:71:90
+# Fingerprint (SHA-256): 6D:C4:71:72:E0:1C:BC:B0:BF:62:58:0D:89:5F:E2:B8:AC:9A:D4:F8:73:80:1E:0C:10:B9:C8:37:D2:1E:B1:77
 # Fingerprint (SHA1): 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -851,7 +716,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Baltimore CyberTrust Root,OU=CyberTrust,O=Baltimore,C=IE
 # Not Valid Before: Fri May 12 18:46:00 2000
 # Not Valid After : Mon May 12 23:59:00 2025
-# Fingerprint (MD5): AC:B6:94:A5:9C:17:E0:D7:91:52:9B:B1:97:06:A6:E4
+# Fingerprint (SHA-256): 16:AF:57:A9:F6:76:B0:AB:12:60:95:AA:5E:BA:DE:F2:2A:B3:11:19:D6:44:AC:95:CD:4B:93:DB:F3:F2:6A:EB
 # Fingerprint (SHA1): D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -941,13 +806,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Baltimore CyberTrust Root"
+# Trust for "Baltimore CyberTrust Root"
 # Issuer: CN=Baltimore CyberTrust Root,OU=CyberTrust,O=Baltimore,C=IE
 # Serial Number: 33554617 (0x20000b9)
 # Subject: CN=Baltimore CyberTrust Root,OU=CyberTrust,O=Baltimore,C=IE
 # Not Valid Before: Fri May 12 18:46:00 2000
 # Not Valid After : Mon May 12 23:59:00 2025
-# Fingerprint (MD5): AC:B6:94:A5:9C:17:E0:D7:91:52:9B:B1:97:06:A6:E4
+# Fingerprint (SHA-256): 16:AF:57:A9:F6:76:B0:AB:12:60:95:AA:5E:BA:DE:F2:2A:B3:11:19:D6:44:AC:95:CD:4B:93:DB:F3:F2:6A:EB
 # Fingerprint (SHA1): D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -985,7 +850,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Entrust Root Certification Authority,OU="(c) 2006 Entrust, Inc.",OU=www.entrust.net/CPS is incorporated by reference,O="Entrust, Inc.",C=US
 # Not Valid Before: Mon Nov 27 20:23:42 2006
 # Not Valid After : Fri Nov 27 20:53:42 2026
-# Fingerprint (MD5): D6:A5:C3:ED:5D:DD:3E:00:C1:3D:87:92:1F:1D:3F:E4
+# Fingerprint (SHA-256): 73:C1:76:43:4F:1B:C6:D5:AD:F4:5B:0E:76:E7:27:28:7C:8D:E5:76:16:C1:E6:E6:14:1A:2B:2C:BC:7D:8E:4C
 # Fingerprint (SHA1): B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1105,13 +970,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Entrust Root Certification Authority"
+# Trust for "Entrust Root Certification Authority"
 # Issuer: CN=Entrust Root Certification Authority,OU="(c) 2006 Entrust, Inc.",OU=www.entrust.net/CPS is incorporated by reference,O="Entrust, Inc.",C=US
 # Serial Number: 1164660820 (0x456b5054)
 # Subject: CN=Entrust Root Certification Authority,OU="(c) 2006 Entrust, Inc.",OU=www.entrust.net/CPS is incorporated by reference,O="Entrust, Inc.",C=US
 # Not Valid Before: Mon Nov 27 20:23:42 2006
 # Not Valid After : Fri Nov 27 20:53:42 2026
-# Fingerprint (MD5): D6:A5:C3:ED:5D:DD:3E:00:C1:3D:87:92:1F:1D:3F:E4
+# Fingerprint (SHA-256): 73:C1:76:43:4F:1B:C6:D5:AD:F4:5B:0E:76:E7:27:28:7C:8D:E5:76:16:C1:E6:E6:14:1A:2B:2C:BC:7D:8E:4C
 # Fingerprint (SHA1): B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1155,7 +1020,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL
 # Not Valid Before: Tue Jun 11 10:46:39 2002
 # Not Valid After : Fri Jun 11 10:46:39 2027
-# Fingerprint (MD5): 2C:8F:9F:66:1D:18:90:B1:47:26:9D:8E:86:82:8C:A9
+# Fingerprint (SHA-256): D8:E0:FE:BC:1D:B2:E3:8D:00:94:0F:37:D2:7D:41:34:4D:99:3E:73:4B:99:D5:65:6D:97:78:D4:D8:14:36:24
 # Fingerprint (SHA1): 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1234,13 +1099,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Certum Root CA"
+# Trust for "Certum Root CA"
 # Issuer: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL
 # Serial Number: 65568 (0x10020)
 # Subject: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL
 # Not Valid Before: Tue Jun 11 10:46:39 2002
 # Not Valid After : Fri Jun 11 10:46:39 2027
-# Fingerprint (MD5): 2C:8F:9F:66:1D:18:90:B1:47:26:9D:8E:86:82:8C:A9
+# Fingerprint (SHA-256): D8:E0:FE:BC:1D:B2:E3:8D:00:94:0F:37:D2:7D:41:34:4D:99:3E:73:4B:99:D5:65:6D:97:78:D4:D8:14:36:24
 # Fingerprint (SHA1): 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1276,7 +1141,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=AAA Certificate Services,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB
 # Not Valid Before: Thu Jan 01 00:00:00 2004
 # Not Valid After : Sun Dec 31 23:59:59 2028
-# Fingerprint (MD5): 49:79:04:B0:EB:87:19:AC:47:B0:BC:11:51:9B:74:D0
+# Fingerprint (SHA-256): D7:A7:A0:FB:5D:7E:27:31:D7:71:E9:48:4E:BC:DE:F7:1D:5F:0C:3E:0A:29:48:78:2B:C8:3E:E0:EA:69:9E:F4
 # Fingerprint (SHA1): D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1382,13 +1247,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Comodo AAA Services root"
+# Trust for "Comodo AAA Services root"
 # Issuer: CN=AAA Certificate Services,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB
 # Serial Number: 1 (0x1)
 # Subject: CN=AAA Certificate Services,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB
 # Not Valid Before: Thu Jan 01 00:00:00 2004
 # Not Valid After : Sun Dec 31 23:59:59 2028
-# Fingerprint (MD5): 49:79:04:B0:EB:87:19:AC:47:B0:BC:11:51:9B:74:D0
+# Fingerprint (SHA-256): D7:A7:A0:FB:5D:7E:27:31:D7:71:E9:48:4E:BC:DE:F7:1D:5F:0C:3E:0A:29:48:78:2B:C8:3E:E0:EA:69:9E:F4
 # Fingerprint (SHA1): D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1428,7 +1293,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=QuoVadis Root CA 2,O=QuoVadis Limited,C=BM
 # Not Valid Before: Fri Nov 24 18:27:00 2006
 # Not Valid After : Mon Nov 24 18:23:33 2031
-# Fingerprint (MD5): 5E:39:7B:DD:F8:BA:EC:82:E9:AC:62:BA:0C:54:00:2B
+# Fingerprint (SHA-256): 85:A0:DD:7D:D7:20:AD:B7:FF:05:F8:3D:54:2B:20:9D:C7:FF:45:28:F7:D6:77:B1:83:89:FE:A5:E5:C4:9E:86
 # Fingerprint (SHA1): CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1552,13 +1417,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "QuoVadis Root CA 2"
+# Trust for "QuoVadis Root CA 2"
 # Issuer: CN=QuoVadis Root CA 2,O=QuoVadis Limited,C=BM
 # Serial Number: 1289 (0x509)
 # Subject: CN=QuoVadis Root CA 2,O=QuoVadis Limited,C=BM
 # Not Valid Before: Fri Nov 24 18:27:00 2006
 # Not Valid After : Mon Nov 24 18:23:33 2031
-# Fingerprint (MD5): 5E:39:7B:DD:F8:BA:EC:82:E9:AC:62:BA:0C:54:00:2B
+# Fingerprint (SHA-256): 85:A0:DD:7D:D7:20:AD:B7:FF:05:F8:3D:54:2B:20:9D:C7:FF:45:28:F7:D6:77:B1:83:89:FE:A5:E5:C4:9E:86
 # Fingerprint (SHA1): CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1595,7 +1460,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=QuoVadis Root CA 3,O=QuoVadis Limited,C=BM
 # Not Valid Before: Fri Nov 24 19:11:23 2006
 # Not Valid After : Mon Nov 24 19:06:44 2031
-# Fingerprint (MD5): 31:85:3C:62:94:97:63:B9:AA:FD:89:4E:AF:6F:E0:CF
+# Fingerprint (SHA-256): 18:F1:FC:7F:20:5D:F8:AD:DD:EB:7F:E0:07:DD:57:E3:AF:37:5A:9C:4D:8D:73:54:6B:F4:F1:FE:D1:E1:8D:35
 # Fingerprint (SHA1): 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1734,13 +1599,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "QuoVadis Root CA 3"
+# Trust for "QuoVadis Root CA 3"
 # Issuer: CN=QuoVadis Root CA 3,O=QuoVadis Limited,C=BM
 # Serial Number: 1478 (0x5c6)
 # Subject: CN=QuoVadis Root CA 3,O=QuoVadis Limited,C=BM
 # Not Valid Before: Fri Nov 24 19:11:23 2006
 # Not Valid After : Mon Nov 24 19:06:44 2031
-# Fingerprint (MD5): 31:85:3C:62:94:97:63:B9:AA:FD:89:4E:AF:6F:E0:CF
+# Fingerprint (SHA-256): 18:F1:FC:7F:20:5D:F8:AD:DD:EB:7F:E0:07:DD:57:E3:AF:37:5A:9C:4D:8D:73:54:6B:F4:F1:FE:D1:E1:8D:35
 # Fingerprint (SHA1): 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1777,7 +1642,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: OU=Security Communication RootCA1,O=SECOM Trust.net,C=JP
 # Not Valid Before: Tue Sep 30 04:20:49 2003
 # Not Valid After : Sat Sep 30 04:20:49 2023
-# Fingerprint (MD5): F1:BC:63:6A:54:E0:B5:27:F5:CD:E7:1A:E3:4D:6E:4A
+# Fingerprint (SHA-256): E7:5E:72:ED:9F:56:0E:EC:6E:B4:80:00:73:A4:3F:C3:AD:19:19:5A:39:22:82:01:78:95:97:4A:99:02:6B:6C
 # Fingerprint (SHA1): 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1865,13 +1730,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Security Communication Root CA"
+# Trust for "Security Communication Root CA"
 # Issuer: OU=Security Communication RootCA1,O=SECOM Trust.net,C=JP
 # Serial Number: 0 (0x0)
 # Subject: OU=Security Communication RootCA1,O=SECOM Trust.net,C=JP
 # Not Valid Before: Tue Sep 30 04:20:49 2003
 # Not Valid After : Sat Sep 30 04:20:49 2023
-# Fingerprint (MD5): F1:BC:63:6A:54:E0:B5:27:F5:CD:E7:1A:E3:4D:6E:4A
+# Fingerprint (SHA-256): E7:5E:72:ED:9F:56:0E:EC:6E:B4:80:00:73:A4:3F:C3:AD:19:19:5A:39:22:82:01:78:95:97:4A:99:02:6B:6C
 # Fingerprint (SHA1): 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -1909,7 +1774,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Chambers of Commerce Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU
 # Not Valid Before: Tue Sep 30 16:13:43 2003
 # Not Valid After : Wed Sep 30 16:13:44 2037
-# Fingerprint (MD5): B0:01:EE:14:D9:AF:29:18:94:76:8E:F1:69:33:2A:84
+# Fingerprint (SHA-256): 0C:25:8A:12:A5:67:4A:EF:25:F2:8B:A7:DC:FA:EC:EE:A3:48:E5:41:E6:F5:CC:4E:E6:3B:71:B3:61:60:6A:C3
 # Fingerprint (SHA1): 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2029,13 +1894,13 @@ CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL
 \062\061\060\063\060\061\060\060\060\060\060\060\132
 END
 
-# Trust for Certificate "Camerfirma Chambers of Commerce Root"
+# Trust for "Camerfirma Chambers of Commerce Root"
 # Issuer: CN=Chambers of Commerce Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU
 # Serial Number: 0 (0x0)
 # Subject: CN=Chambers of Commerce Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU
 # Not Valid Before: Tue Sep 30 16:13:43 2003
 # Not Valid After : Wed Sep 30 16:13:44 2037
-# Fingerprint (MD5): B0:01:EE:14:D9:AF:29:18:94:76:8E:F1:69:33:2A:84
+# Fingerprint (SHA-256): 0C:25:8A:12:A5:67:4A:EF:25:F2:8B:A7:DC:FA:EC:EE:A3:48:E5:41:E6:F5:CC:4E:E6:3B:71:B3:61:60:6A:C3
 # Fingerprint (SHA1): 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2068,170 +1933,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
-#
-# Certificate "Camerfirma Global Chambersign Root"
-#
-# Issuer: CN=Global Chambersign Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU
-# Serial Number: 0 (0x0)
-# Subject: CN=Global Chambersign Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU
-# Not Valid Before: Tue Sep 30 16:14:18 2003
-# Not Valid After : Wed Sep 30 16:14:18 2037
-# Fingerprint (MD5): C5:E6:7B:BF:06:D0:4F:43:ED:C4:7A:65:8A:FB:6B:19
-# Fingerprint (SHA1): 33:9B:6B:14:50:24:9B:55:7A:01:87:72:84:D9:E0:2F:C3:D2:D8:E9
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Camerfirma Global Chambersign Root"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\175\061\013\060\011\006\003\125\004\006\023\002\105\125\061
-\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155
-\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101
-\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004
-\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150
-\141\155\142\145\162\163\151\147\156\056\157\162\147\061\040\060
-\036\006\003\125\004\003\023\027\107\154\157\142\141\154\040\103
-\150\141\155\142\145\162\163\151\147\156\040\122\157\157\164
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\175\061\013\060\011\006\003\125\004\006\023\002\105\125\061
-\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155
-\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101
-\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004
-\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150
-\141\155\142\145\162\163\151\147\156\056\157\162\147\061\040\060
-\036\006\003\125\004\003\023\027\107\154\157\142\141\154\040\103
-\150\141\155\142\145\162\163\151\147\156\040\122\157\157\164
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\001\000
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\004\305\060\202\003\255\240\003\002\001\002\002\001\000
-\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060
-\175\061\013\060\011\006\003\125\004\006\023\002\105\125\061\047
-\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155\145
-\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101\070
-\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004\013
-\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150\141
-\155\142\145\162\163\151\147\156\056\157\162\147\061\040\060\036
-\006\003\125\004\003\023\027\107\154\157\142\141\154\040\103\150
-\141\155\142\145\162\163\151\147\156\040\122\157\157\164\060\036
-\027\015\060\063\060\071\063\060\061\066\061\064\061\070\132\027
-\015\063\067\060\071\063\060\061\066\061\064\061\070\132\060\175
-\061\013\060\011\006\003\125\004\006\023\002\105\125\061\047\060
-\045\006\003\125\004\012\023\036\101\103\040\103\141\155\145\162
-\146\151\162\155\141\040\123\101\040\103\111\106\040\101\070\062
-\067\064\063\062\070\067\061\043\060\041\006\003\125\004\013\023
-\032\150\164\164\160\072\057\057\167\167\167\056\143\150\141\155
-\142\145\162\163\151\147\156\056\157\162\147\061\040\060\036\006
-\003\125\004\003\023\027\107\154\157\142\141\154\040\103\150\141
-\155\142\145\162\163\151\147\156\040\122\157\157\164\060\202\001
-\040\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000
-\003\202\001\015\000\060\202\001\010\002\202\001\001\000\242\160
-\242\320\237\102\256\133\027\307\330\175\317\024\203\374\117\311
-\241\267\023\257\212\327\236\076\004\012\222\213\140\126\372\264
-\062\057\210\115\241\140\010\364\267\011\116\240\111\057\111\326
-\323\337\235\227\132\237\224\004\160\354\077\131\331\267\314\146
-\213\230\122\050\011\002\337\305\057\204\215\172\227\167\277\354
-\100\235\045\162\253\265\077\062\230\373\267\267\374\162\204\345
-\065\207\371\125\372\243\037\016\157\056\050\335\151\240\331\102
-\020\306\370\265\104\302\320\103\177\333\274\344\242\074\152\125
-\170\012\167\251\330\352\031\062\267\057\376\134\077\033\356\261
-\230\354\312\255\172\151\105\343\226\017\125\366\346\355\165\352
-\145\350\062\126\223\106\211\250\045\212\145\006\356\153\277\171
-\007\320\361\267\257\355\054\115\222\273\300\250\137\247\147\175
-\004\362\025\010\160\254\222\326\175\004\322\063\373\114\266\013
-\013\373\032\311\304\215\003\251\176\134\362\120\253\022\245\241
-\317\110\120\245\357\322\310\032\023\372\260\177\261\202\034\167
-\152\017\137\334\013\225\217\357\103\176\346\105\011\045\002\001
-\003\243\202\001\120\060\202\001\114\060\022\006\003\125\035\023
-\001\001\377\004\010\060\006\001\001\377\002\001\014\060\077\006
-\003\125\035\037\004\070\060\066\060\064\240\062\240\060\206\056
-\150\164\164\160\072\057\057\143\162\154\056\143\150\141\155\142
-\145\162\163\151\147\156\056\157\162\147\057\143\150\141\155\142
-\145\162\163\151\147\156\162\157\157\164\056\143\162\154\060\035
-\006\003\125\035\016\004\026\004\024\103\234\066\237\260\236\060
-\115\306\316\137\255\020\253\345\003\245\372\251\024\060\016\006
-\003\125\035\017\001\001\377\004\004\003\002\001\006\060\021\006
-\011\140\206\110\001\206\370\102\001\001\004\004\003\002\000\007
-\060\052\006\003\125\035\021\004\043\060\041\201\037\143\150\141
-\155\142\145\162\163\151\147\156\162\157\157\164\100\143\150\141
-\155\142\145\162\163\151\147\156\056\157\162\147\060\052\006\003
-\125\035\022\004\043\060\041\201\037\143\150\141\155\142\145\162
-\163\151\147\156\162\157\157\164\100\143\150\141\155\142\145\162
-\163\151\147\156\056\157\162\147\060\133\006\003\125\035\040\004
-\124\060\122\060\120\006\013\053\006\001\004\001\201\207\056\012
-\001\001\060\101\060\077\006\010\053\006\001\005\005\007\002\001
-\026\063\150\164\164\160\072\057\057\143\160\163\056\143\150\141
-\155\142\145\162\163\151\147\156\056\157\162\147\057\143\160\163
-\057\143\150\141\155\142\145\162\163\151\147\156\162\157\157\164
-\056\150\164\155\154\060\015\006\011\052\206\110\206\367\015\001
-\001\005\005\000\003\202\001\001\000\074\073\160\221\371\004\124
-\047\221\341\355\355\376\150\177\141\135\345\101\145\117\062\361
-\030\005\224\152\034\336\037\160\333\076\173\062\002\064\265\014
-\154\241\212\174\245\364\217\377\324\330\255\027\325\055\004\321
-\077\130\200\342\201\131\210\276\300\343\106\223\044\376\220\275
-\046\242\060\055\350\227\046\127\065\211\164\226\030\366\025\342
-\257\044\031\126\002\002\262\272\017\024\352\306\212\146\301\206
-\105\125\213\276\222\276\234\244\004\307\111\074\236\350\051\172
-\211\327\376\257\377\150\365\245\027\220\275\254\231\314\245\206
-\127\011\147\106\333\326\026\302\106\361\344\251\120\365\217\321
-\222\025\323\137\076\306\000\111\072\156\130\262\321\321\047\015
-\045\310\062\370\040\021\315\175\062\063\110\224\124\114\335\334
-\171\304\060\237\353\216\270\125\265\327\210\134\305\152\044\075
-\262\323\005\003\121\306\007\357\314\024\162\164\075\156\162\316
-\030\050\214\112\240\167\345\011\053\105\104\107\254\267\147\177
-\001\212\005\132\223\276\241\301\377\370\347\016\147\244\107\111
-\166\135\165\220\032\365\046\217\360
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-# For Email Distrust After: Mon Mar 01 00:00:00 2021
-CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL
-\062\061\060\063\060\061\060\060\060\060\060\060\132
-END
-
-# Trust for Certificate "Camerfirma Global Chambersign Root"
-# Issuer: CN=Global Chambersign Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU
-# Serial Number: 0 (0x0)
-# Subject: CN=Global Chambersign Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU
-# Not Valid Before: Tue Sep 30 16:14:18 2003
-# Not Valid After : Wed Sep 30 16:14:18 2037
-# Fingerprint (MD5): C5:E6:7B:BF:06:D0:4F:43:ED:C4:7A:65:8A:FB:6B:19
-# Fingerprint (SHA1): 33:9B:6B:14:50:24:9B:55:7A:01:87:72:84:D9:E0:2F:C3:D2:D8:E9
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Camerfirma Global Chambersign Root"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\063\233\153\024\120\044\233\125\172\001\207\162\204\331\340\057
-\303\322\330\351
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\305\346\173\277\006\320\117\103\355\304\172\145\212\373\153\031
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\175\061\013\060\011\006\003\125\004\006\023\002\105\125\061
-\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155
-\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101
-\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004
-\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150
-\141\155\142\145\162\163\151\147\156\056\157\162\147\061\040\060
-\036\006\003\125\004\003\023\027\107\154\157\142\141\154\040\103
-\150\141\155\142\145\162\163\151\147\156\040\122\157\157\164
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\001\000
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
 #
 # Certificate "XRamp Global CA Root"
 #
@@ -2240,7 +1941,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US
 # Not Valid Before: Mon Nov 01 17:14:04 2004
 # Not Valid After : Mon Jan 01 05:37:19 2035
-# Fingerprint (MD5): A1:0B:44:B3:CA:10:D8:00:6E:9D:0F:D8:0F:92:0A:D1
+# Fingerprint (SHA-256): CE:CD:DC:90:50:99:D8:DA:DF:C5:B1:D2:09:B7:37:CB:E2:C1:8C:FB:2C:10:C0:FF:0B:CF:0D:32:86:FC:1A:A2
 # Fingerprint (SHA1): B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2349,13 +2050,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "XRamp Global CA Root"
+# Trust for "XRamp Global CA Root"
 # Issuer: CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US
 # Serial Number:50:94:6c:ec:18:ea:d5:9c:4d:d5:97:ef:75:8f:a0:ad
 # Subject: CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US
 # Not Valid Before: Mon Nov 01 17:14:04 2004
 # Not Valid After : Mon Jan 01 05:37:19 2035
-# Fingerprint (MD5): A1:0B:44:B3:CA:10:D8:00:6E:9D:0F:D8:0F:92:0A:D1
+# Fingerprint (SHA-256): CE:CD:DC:90:50:99:D8:DA:DF:C5:B1:D2:09:B7:37:CB:E2:C1:8C:FB:2C:10:C0:FF:0B:CF:0D:32:86:FC:1A:A2
 # Fingerprint (SHA1): B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2397,7 +2098,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: OU=Go Daddy Class 2 Certification Authority,O="The Go Daddy Group, Inc.",C=US
 # Not Valid Before: Tue Jun 29 17:06:20 2004
 # Not Valid After : Thu Jun 29 17:06:20 2034
-# Fingerprint (MD5): 91:DE:06:25:AB:DA:FD:32:17:0C:BB:25:17:2A:84:67
+# Fingerprint (SHA-256): C3:84:6B:F2:4B:9E:93:CA:64:27:4C:0E:C6:7C:1E:CC:5E:02:4F:FC:AC:D2:D7:40:19:35:0E:81:FE:54:6A:E4
 # Fingerprint (SHA1): 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2498,13 +2199,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Go Daddy Class 2 CA"
+# Trust for "Go Daddy Class 2 CA"
 # Issuer: OU=Go Daddy Class 2 Certification Authority,O="The Go Daddy Group, Inc.",C=US
 # Serial Number: 0 (0x0)
 # Subject: OU=Go Daddy Class 2 Certification Authority,O="The Go Daddy Group, Inc.",C=US
 # Not Valid Before: Tue Jun 29 17:06:20 2004
 # Not Valid After : Thu Jun 29 17:06:20 2034
-# Fingerprint (MD5): 91:DE:06:25:AB:DA:FD:32:17:0C:BB:25:17:2A:84:67
+# Fingerprint (SHA-256): C3:84:6B:F2:4B:9E:93:CA:64:27:4C:0E:C6:7C:1E:CC:5E:02:4F:FC:AC:D2:D7:40:19:35:0E:81:FE:54:6A:E4
 # Fingerprint (SHA1): 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2543,7 +2244,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: OU=Starfield Class 2 Certification Authority,O="Starfield Technologies, Inc.",C=US
 # Not Valid Before: Tue Jun 29 17:39:16 2004
 # Not Valid After : Thu Jun 29 17:39:16 2034
-# Fingerprint (MD5): 32:4A:4B:BB:C8:63:69:9B:BE:74:9A:C6:DD:1D:46:24
+# Fingerprint (SHA-256): 14:65:FA:20:53:97:B8:76:FA:A6:F0:A9:95:8E:55:90:E4:0F:CC:7F:AA:4F:B7:C2:C8:67:75:21:FB:5F:B6:58
 # Fingerprint (SHA1): AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2645,13 +2346,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Starfield Class 2 CA"
+# Trust for "Starfield Class 2 CA"
 # Issuer: OU=Starfield Class 2 Certification Authority,O="Starfield Technologies, Inc.",C=US
 # Serial Number: 0 (0x0)
 # Subject: OU=Starfield Class 2 Certification Authority,O="Starfield Technologies, Inc.",C=US
 # Not Valid Before: Tue Jun 29 17:39:16 2004
 # Not Valid After : Thu Jun 29 17:39:16 2034
-# Fingerprint (MD5): 32:4A:4B:BB:C8:63:69:9B:BE:74:9A:C6:DD:1D:46:24
+# Fingerprint (SHA-256): 14:65:FA:20:53:97:B8:76:FA:A6:F0:A9:95:8E:55:90:E4:0F:CC:7F:AA:4F:B7:C2:C8:67:75:21:FB:5F:B6:58
 # Fingerprint (SHA1): AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2690,7 +2391,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
 # Not Valid Before: Fri Nov 10 00:00:00 2006
 # Not Valid After : Mon Nov 10 00:00:00 2031
-# Fingerprint (MD5): 87:CE:0B:7B:2A:0E:49:00:E1:58:71:9B:37:A8:93:72
+# Fingerprint (SHA-256): 3E:90:99:B5:01:5E:8F:48:6C:00:BC:EA:9D:11:1E:E7:21:FA:BA:35:5A:89:BC:F1:DF:69:56:1E:3D:C6:32:5C
 # Fingerprint (SHA1): 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2787,13 +2488,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "DigiCert Assured ID Root CA"
+# Trust for "DigiCert Assured ID Root CA"
 # Issuer: CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
 # Serial Number:0c:e7:e0:e5:17:d8:46:fe:8f:e5:60:fc:1b:f0:30:39
 # Subject: CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
 # Not Valid Before: Fri Nov 10 00:00:00 2006
 # Not Valid After : Mon Nov 10 00:00:00 2031
-# Fingerprint (MD5): 87:CE:0B:7B:2A:0E:49:00:E1:58:71:9B:37:A8:93:72
+# Fingerprint (SHA-256): 3E:90:99:B5:01:5E:8F:48:6C:00:BC:EA:9D:11:1E:E7:21:FA:BA:35:5A:89:BC:F1:DF:69:56:1E:3D:C6:32:5C
 # Fingerprint (SHA1): 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2833,7 +2534,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
 # Not Valid Before: Fri Nov 10 00:00:00 2006
 # Not Valid After : Mon Nov 10 00:00:00 2031
-# Fingerprint (MD5): 79:E4:A9:84:0D:7D:3A:96:D7:C0:4F:E2:43:4C:89:2E
+# Fingerprint (SHA-256): 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61
 # Fingerprint (SHA1): A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2930,13 +2631,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "DigiCert Global Root CA"
+# Trust for "DigiCert Global Root CA"
 # Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
 # Serial Number:08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a
 # Subject: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
 # Not Valid Before: Fri Nov 10 00:00:00 2006
 # Not Valid After : Mon Nov 10 00:00:00 2031
-# Fingerprint (MD5): 79:E4:A9:84:0D:7D:3A:96:D7:C0:4F:E2:43:4C:89:2E
+# Fingerprint (SHA-256): 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61
 # Fingerprint (SHA1): A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -2976,7 +2677,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
 # Not Valid Before: Fri Nov 10 00:00:00 2006
 # Not Valid After : Mon Nov 10 00:00:00 2031
-# Fingerprint (MD5): D4:74:DE:57:5C:39:B2:D3:9C:85:83:C5:C0:65:49:8A
+# Fingerprint (SHA-256): 74:31:E5:F4:C3:C1:CE:46:90:77:4F:0B:61:E0:54:40:88:3B:A9:A0:1E:D0:0B:A6:AB:D7:80:6E:D3:B1:18:CF
 # Fingerprint (SHA1): 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3074,13 +2775,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "DigiCert High Assurance EV Root CA"
+# Trust for "DigiCert High Assurance EV Root CA"
 # Issuer: CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
 # Serial Number:02:ac:5c:26:6a:0b:40:9b:8f:0b:79:f2:ae:46:25:77
 # Subject: CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
 # Not Valid Before: Fri Nov 10 00:00:00 2006
 # Not Valid After : Mon Nov 10 00:00:00 2031
-# Fingerprint (MD5): D4:74:DE:57:5C:39:B2:D3:9C:85:83:C5:C0:65:49:8A
+# Fingerprint (SHA-256): 74:31:E5:F4:C3:C1:CE:46:90:77:4F:0B:61:E0:54:40:88:3B:A9:A0:1E:D0:0B:A6:AB:D7:80:6E:D3:B1:18:CF
 # Fingerprint (SHA1): 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3112,136 +2813,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
-#
-# Certificate "DST Root CA X3"
-#
-# Issuer: CN=DST Root CA X3,O=Digital Signature Trust Co.
-# Serial Number:44:af:b0:80:d6:a3:27:ba:89:30:39:86:2e:f8:40:6b
-# Subject: CN=DST Root CA X3,O=Digital Signature Trust Co.
-# Not Valid Before: Sat Sep 30 21:12:19 2000
-# Not Valid After : Thu Sep 30 14:01:15 2021
-# Fingerprint (MD5): 41:03:52:DC:0F:F7:50:1B:16:F0:02:8E:BA:6F:45:C5
-# Fingerprint (SHA1): DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "DST Root CA X3"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\077\061\044\060\042\006\003\125\004\012\023\033\104\151\147
-\151\164\141\154\040\123\151\147\156\141\164\165\162\145\040\124
-\162\165\163\164\040\103\157\056\061\027\060\025\006\003\125\004
-\003\023\016\104\123\124\040\122\157\157\164\040\103\101\040\130
-\063
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\077\061\044\060\042\006\003\125\004\012\023\033\104\151\147
-\151\164\141\154\040\123\151\147\156\141\164\165\162\145\040\124
-\162\165\163\164\040\103\157\056\061\027\060\025\006\003\125\004
-\003\023\016\104\123\124\040\122\157\157\164\040\103\101\040\130
-\063
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\104\257\260\200\326\243\047\272\211\060\071\206\056\370
-\100\153
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\003\112\060\202\002\062\240\003\002\001\002\002\020\104
-\257\260\200\326\243\047\272\211\060\071\206\056\370\100\153\060
-\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\077
-\061\044\060\042\006\003\125\004\012\023\033\104\151\147\151\164
-\141\154\040\123\151\147\156\141\164\165\162\145\040\124\162\165
-\163\164\040\103\157\056\061\027\060\025\006\003\125\004\003\023
-\016\104\123\124\040\122\157\157\164\040\103\101\040\130\063\060
-\036\027\015\060\060\060\071\063\060\062\061\061\062\061\071\132
-\027\015\062\061\060\071\063\060\061\064\060\061\061\065\132\060
-\077\061\044\060\042\006\003\125\004\012\023\033\104\151\147\151
-\164\141\154\040\123\151\147\156\141\164\165\162\145\040\124\162
-\165\163\164\040\103\157\056\061\027\060\025\006\003\125\004\003
-\023\016\104\123\124\040\122\157\157\164\040\103\101\040\130\063
-\060\202\001\042\060\015\006\011\052\206\110\206\367\015\001\001
-\001\005\000\003\202\001\017\000\060\202\001\012\002\202\001\001
-\000\337\257\351\227\120\010\203\127\264\314\142\145\366\220\202
-\354\307\323\054\153\060\312\133\354\331\303\175\307\100\301\030
-\024\213\340\350\063\166\111\052\343\077\041\111\223\254\116\016
-\257\076\110\313\145\356\374\323\041\017\145\322\052\331\062\217
-\214\345\367\167\260\022\173\265\225\300\211\243\251\272\355\163
-\056\172\014\006\062\203\242\176\212\024\060\315\021\240\341\052
-\070\271\171\012\061\375\120\275\200\145\337\267\121\143\203\310
-\342\210\141\352\113\141\201\354\122\153\271\242\342\113\032\050
-\237\110\243\236\014\332\011\216\076\027\056\036\335\040\337\133
-\306\052\212\253\056\275\160\255\305\013\032\045\220\164\162\305
-\173\152\253\064\326\060\211\377\345\150\023\173\124\013\310\326
-\256\354\132\234\222\036\075\144\263\214\306\337\277\311\101\160
-\354\026\162\325\046\354\070\125\071\103\320\374\375\030\134\100
-\361\227\353\325\232\233\215\035\272\332\045\271\306\330\337\301
-\025\002\072\253\332\156\361\076\056\365\134\010\234\074\326\203
-\151\344\020\233\031\052\266\051\127\343\345\075\233\237\360\002
-\135\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035
-\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003\125
-\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003\125
-\035\016\004\026\004\024\304\247\261\244\173\054\161\372\333\341
-\113\220\165\377\304\025\140\205\211\020\060\015\006\011\052\206
-\110\206\367\015\001\001\005\005\000\003\202\001\001\000\243\032
-\054\233\027\000\134\251\036\356\050\146\067\072\277\203\307\077
-\113\303\011\240\225\040\135\343\331\131\104\322\076\015\076\275
-\212\113\240\164\037\316\020\202\234\164\032\035\176\230\032\335
-\313\023\113\263\040\104\344\221\351\314\374\175\245\333\152\345
-\376\346\375\340\116\335\267\000\072\265\160\111\257\362\345\353
-\002\361\321\002\213\031\313\224\072\136\110\304\030\036\130\031
-\137\036\002\132\360\014\361\261\255\251\334\131\206\213\156\351
-\221\365\206\312\372\271\146\063\252\131\133\316\342\247\026\163
-\107\313\053\314\231\260\067\110\317\343\126\113\365\317\017\014
-\162\062\207\306\360\104\273\123\162\155\103\365\046\110\232\122
-\147\267\130\253\376\147\166\161\170\333\015\242\126\024\023\071
-\044\061\205\242\250\002\132\060\107\341\335\120\007\274\002\011
-\220\000\353\144\143\140\233\026\274\210\311\022\346\322\175\221
-\213\371\075\062\215\145\264\351\174\261\127\166\352\305\266\050
-\071\277\025\145\034\310\366\167\226\152\012\215\167\013\330\221
-\013\004\216\007\333\051\266\012\356\235\202\065\065\020
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for Certificate "DST Root CA X3"
-# Issuer: CN=DST Root CA X3,O=Digital Signature Trust Co.
-# Serial Number:44:af:b0:80:d6:a3:27:ba:89:30:39:86:2e:f8:40:6b
-# Subject: CN=DST Root CA X3,O=Digital Signature Trust Co.
-# Not Valid Before: Sat Sep 30 21:12:19 2000
-# Not Valid After : Thu Sep 30 14:01:15 2021
-# Fingerprint (MD5): 41:03:52:DC:0F:F7:50:1B:16:F0:02:8E:BA:6F:45:C5
-# Fingerprint (SHA1): DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "DST Root CA X3"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\332\311\002\117\124\330\366\337\224\223\137\261\163\046\070\312
-\152\327\174\023
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\101\003\122\334\017\367\120\033\026\360\002\216\272\157\105\305
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\077\061\044\060\042\006\003\125\004\012\023\033\104\151\147
-\151\164\141\154\040\123\151\147\156\141\164\165\162\145\040\124
-\162\165\163\164\040\103\157\056\061\027\060\025\006\003\125\004
-\003\023\016\104\123\124\040\122\157\157\164\040\103\101\040\130
-\063
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\104\257\260\200\326\243\047\272\211\060\071\206\056\370
-\100\153
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
 #
 # Certificate "SwissSign Platinum CA - G2"
 #
@@ -3250,7 +2821,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH
 # Not Valid Before: Wed Oct 25 08:36:00 2006
 # Not Valid After : Sat Oct 25 08:36:00 2036
-# Fingerprint (MD5): C9:98:27:77:28:1E:3D:0E:15:3C:84:00:B8:85:03:E6
+# Fingerprint (SHA-256): 3B:22:2E:56:67:11:E9:92:30:0D:C0:B1:5A:B9:47:3D:AF:DE:F8:C8:4D:0C:EF:7D:33:17:B4:C1:82:1D:14:36
 # Fingerprint (SHA1): 56:E0:FA:C0:3B:8F:18:23:55:18:E5:D3:11:CA:E8:C2:43:31:AB:66
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3375,13 +2946,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "SwissSign Platinum CA - G2"
+# Trust for "SwissSign Platinum CA - G2"
 # Issuer: CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH
 # Serial Number:4e:b2:00:67:0c:03:5d:4f
 # Subject: CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH
 # Not Valid Before: Wed Oct 25 08:36:00 2006
 # Not Valid After : Sat Oct 25 08:36:00 2036
-# Fingerprint (MD5): C9:98:27:77:28:1E:3D:0E:15:3C:84:00:B8:85:03:E6
+# Fingerprint (SHA-256): 3B:22:2E:56:67:11:E9:92:30:0D:C0:B1:5A:B9:47:3D:AF:DE:F8:C8:4D:0C:EF:7D:33:17:B4:C1:82:1D:14:36
 # Fingerprint (SHA1): 56:E0:FA:C0:3B:8F:18:23:55:18:E5:D3:11:CA:E8:C2:43:31:AB:66
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3418,7 +2989,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH
 # Not Valid Before: Wed Oct 25 08:30:35 2006
 # Not Valid After : Sat Oct 25 08:30:35 2036
-# Fingerprint (MD5): 24:77:D9:A8:91:D1:3B:FA:88:2D:C2:FF:F8:CD:33:93
+# Fingerprint (SHA-256): 62:DD:0B:E9:B9:F5:0A:16:3E:A0:F8:E7:5C:05:3B:1E:CA:57:EA:55:C8:68:8F:64:7C:68:81:F2:C8:35:7B:95
 # Fingerprint (SHA1): D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3542,13 +3113,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "SwissSign Gold CA - G2"
+# Trust for "SwissSign Gold CA - G2"
 # Issuer: CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH
 # Serial Number:00:bb:40:1c:43:f5:5e:4f:b0
 # Subject: CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH
 # Not Valid Before: Wed Oct 25 08:30:35 2006
 # Not Valid After : Sat Oct 25 08:30:35 2036
-# Fingerprint (MD5): 24:77:D9:A8:91:D1:3B:FA:88:2D:C2:FF:F8:CD:33:93
+# Fingerprint (SHA-256): 62:DD:0B:E9:B9:F5:0A:16:3E:A0:F8:E7:5C:05:3B:1E:CA:57:EA:55:C8:68:8F:64:7C:68:81:F2:C8:35:7B:95
 # Fingerprint (SHA1): D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3585,7 +3156,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=SwissSign Silver CA - G2,O=SwissSign AG,C=CH
 # Not Valid Before: Wed Oct 25 08:32:46 2006
 # Not Valid After : Sat Oct 25 08:32:46 2036
-# Fingerprint (MD5): E0:06:A1:C9:7D:CF:C9:FC:0D:C0:56:75:96:D8:62:13
+# Fingerprint (SHA-256): BE:6C:4D:A2:BB:B9:BA:59:B6:F3:93:97:68:37:42:46:C3:C0:05:99:3F:A9:8F:02:0D:1D:ED:BE:D4:8A:81:D5
 # Fingerprint (SHA1): 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3710,13 +3281,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "SwissSign Silver CA - G2"
+# Trust for "SwissSign Silver CA - G2"
 # Issuer: CN=SwissSign Silver CA - G2,O=SwissSign AG,C=CH
 # Serial Number:4f:1b:d4:2f:54:bb:2f:4b
 # Subject: CN=SwissSign Silver CA - G2,O=SwissSign AG,C=CH
 # Not Valid Before: Wed Oct 25 08:32:46 2006
 # Not Valid After : Sat Oct 25 08:32:46 2036
-# Fingerprint (MD5): E0:06:A1:C9:7D:CF:C9:FC:0D:C0:56:75:96:D8:62:13
+# Fingerprint (SHA-256): BE:6C:4D:A2:BB:B9:BA:59:B6:F3:93:97:68:37:42:46:C3:C0:05:99:3F:A9:8F:02:0D:1D:ED:BE:D4:8A:81:D5
 # Fingerprint (SHA1): 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3753,7 +3324,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=SecureTrust CA,O=SecureTrust Corporation,C=US
 # Not Valid Before: Tue Nov 07 19:31:18 2006
 # Not Valid After : Mon Dec 31 19:40:55 2029
-# Fingerprint (MD5): DC:32:C3:A7:6D:25:57:C7:68:09:9D:EA:2D:A9:A2:D1
+# Fingerprint (SHA-256): F1:C1:B5:0A:E5:A2:0D:D8:03:0E:C9:F6:BC:24:82:3D:D3:67:B5:25:57:59:B4:E7:1B:61:FC:E9:F7:37:5D:73
 # Fingerprint (SHA1): 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3846,13 +3417,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "SecureTrust CA"
+# Trust for "SecureTrust CA"
 # Issuer: CN=SecureTrust CA,O=SecureTrust Corporation,C=US
 # Serial Number:0c:f0:8e:5c:08:16:a5:ad:42:7f:f0:eb:27:18:59:d0
 # Subject: CN=SecureTrust CA,O=SecureTrust Corporation,C=US
 # Not Valid Before: Tue Nov 07 19:31:18 2006
 # Not Valid After : Mon Dec 31 19:40:55 2029
-# Fingerprint (MD5): DC:32:C3:A7:6D:25:57:C7:68:09:9D:EA:2D:A9:A2:D1
+# Fingerprint (SHA-256): F1:C1:B5:0A:E5:A2:0D:D8:03:0E:C9:F6:BC:24:82:3D:D3:67:B5:25:57:59:B4:E7:1B:61:FC:E9:F7:37:5D:73
 # Fingerprint (SHA1): 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3890,7 +3461,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Secure Global CA,O=SecureTrust Corporation,C=US
 # Not Valid Before: Tue Nov 07 19:42:28 2006
 # Not Valid After : Mon Dec 31 19:52:06 2029
-# Fingerprint (MD5): CF:F4:27:0D:D4:ED:DC:65:16:49:6D:3D:DA:BF:6E:DE
+# Fingerprint (SHA-256): 42:00:F5:04:3A:C8:59:0E:BB:52:7D:20:9E:D1:50:30:29:FB:CB:D4:1C:A1:B5:06:EC:27:F1:5A:DE:7D:AC:69
 # Fingerprint (SHA1): 3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -3983,13 +3554,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Secure Global CA"
+# Trust for "Secure Global CA"
 # Issuer: CN=Secure Global CA,O=SecureTrust Corporation,C=US
 # Serial Number:07:56:22:a4:e8:d4:8a:89:4d:f4:13:c8:f0:f8:ea:a5
 # Subject: CN=Secure Global CA,O=SecureTrust Corporation,C=US
 # Not Valid Before: Tue Nov 07 19:42:28 2006
 # Not Valid After : Mon Dec 31 19:52:06 2029
-# Fingerprint (MD5): CF:F4:27:0D:D4:ED:DC:65:16:49:6D:3D:DA:BF:6E:DE
+# Fingerprint (SHA-256): 42:00:F5:04:3A:C8:59:0E:BB:52:7D:20:9E:D1:50:30:29:FB:CB:D4:1C:A1:B5:06:EC:27:F1:5A:DE:7D:AC:69
 # Fingerprint (SHA1): 3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4027,7 +3598,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
 # Not Valid Before: Fri Dec 01 00:00:00 2006
 # Not Valid After : Mon Dec 31 23:59:59 2029
-# Fingerprint (MD5): 5C:48:DC:F7:42:72:EC:56:94:6D:1C:CC:71:35:80:75
+# Fingerprint (SHA-256): 0C:2C:D6:3D:F7:80:6F:A3:99:ED:E8:09:11:6B:57:5B:F8:79:89:F0:65:18:F9:80:8C:86:05:03:17:8B:AF:66
 # Fingerprint (SHA1): 66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4135,13 +3706,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "COMODO Certification Authority"
+# Trust for "COMODO Certification Authority"
 # Issuer: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
 # Serial Number:4e:81:2d:8a:82:65:e0:0b:02:ee:3e:35:02:46:e5:3d
 # Subject: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
 # Not Valid Before: Fri Dec 01 00:00:00 2006
 # Not Valid After : Mon Dec 31 23:59:59 2029
-# Fingerprint (MD5): 5C:48:DC:F7:42:72:EC:56:94:6D:1C:CC:71:35:80:75
+# Fingerprint (SHA-256): 0C:2C:D6:3D:F7:80:6F:A3:99:ED:E8:09:11:6B:57:5B:F8:79:89:F0:65:18:F9:80:8C:86:05:03:17:8B:AF:66
 # Fingerprint (SHA1): 66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4183,7 +3754,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Network Solutions Certificate Authority,O=Network Solutions L.L.C.,C=US
 # Not Valid Before: Fri Dec 01 00:00:00 2006
 # Not Valid After : Mon Dec 31 23:59:59 2029
-# Fingerprint (MD5): D3:F3:A6:16:C0:FA:6B:1D:59:B1:2D:96:4D:0E:11:2E
+# Fingerprint (SHA-256): 15:F0:BA:00:A3:AC:7A:F3:AC:88:4C:07:2B:10:11:A0:77:BD:77:C0:97:F4:01:64:B2:F8:59:8A:BD:83:86:0C
 # Fingerprint (SHA1): 74:F8:A3:C3:EF:E7:B3:90:06:4B:83:90:3C:21:64:60:20:E5:DF:CE
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4283,13 +3854,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Network Solutions Certificate Authority"
+# Trust for "Network Solutions Certificate Authority"
 # Issuer: CN=Network Solutions Certificate Authority,O=Network Solutions L.L.C.,C=US
 # Serial Number:57:cb:33:6f:c2:5c:16:e6:47:16:17:e3:90:31:68:e0
 # Subject: CN=Network Solutions Certificate Authority,O=Network Solutions L.L.C.,C=US
 # Not Valid Before: Fri Dec 01 00:00:00 2006
 # Not Valid After : Mon Dec 31 23:59:59 2029
-# Fingerprint (MD5): D3:F3:A6:16:C0:FA:6B:1D:59:B1:2D:96:4D:0E:11:2E
+# Fingerprint (SHA-256): 15:F0:BA:00:A3:AC:7A:F3:AC:88:4C:07:2B:10:11:A0:77:BD:77:C0:97:F4:01:64:B2:F8:59:8A:BD:83:86:0C
 # Fingerprint (SHA1): 74:F8:A3:C3:EF:E7:B3:90:06:4B:83:90:3C:21:64:60:20:E5:DF:CE
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4329,7 +3900,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=COMODO ECC Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
 # Not Valid Before: Thu Mar 06 00:00:00 2008
 # Not Valid After : Mon Jan 18 23:59:59 2038
-# Fingerprint (MD5): 7C:62:FF:74:9D:31:53:5E:68:4A:D5:78:AA:1E:BF:23
+# Fingerprint (SHA-256): 17:93:92:7A:06:14:54:97:89:AD:CE:2F:8F:34:F7:F0:B6:6D:0F:3A:E3:A3:B8:4D:21:EC:15:DB:BA:4F:AD:C7
 # Fingerprint (SHA1): 9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4411,13 +3982,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "COMODO ECC Certification Authority"
+# Trust for "COMODO ECC Certification Authority"
 # Issuer: CN=COMODO ECC Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
 # Serial Number:1f:47:af:aa:62:00:70:50:54:4c:01:9e:9b:63:99:2a
 # Subject: CN=COMODO ECC Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
 # Not Valid Before: Thu Mar 06 00:00:00 2008
 # Not Valid After : Mon Jan 18 23:59:59 2038
-# Fingerprint (MD5): 7C:62:FF:74:9D:31:53:5E:68:4A:D5:78:AA:1E:BF:23
+# Fingerprint (SHA-256): 17:93:92:7A:06:14:54:97:89:AD:CE:2F:8F:34:F7:F0:B6:6D:0F:3A:E3:A3:B8:4D:21:EC:15:DB:BA:4F:AD:C7
 # Fingerprint (SHA1): 9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4459,7 +4030,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=OISTE WISeKey Global Root GA CA,OU=OISTE Foundation Endorsed,OU=Copyright (c) 2005,O=WISeKey,C=CH
 # Not Valid Before: Sun Dec 11 16:03:44 2005
 # Not Valid After : Fri Dec 11 16:09:51 2037
-# Fingerprint (MD5): BC:6C:51:33:A7:E9:D3:66:63:54:15:72:1B:21:92:93
+# Fingerprint (SHA-256): 41:C9:23:86:6A:B4:CA:D6:B7:AD:57:80:81:58:2E:02:07:97:A6:CB:DF:4F:FF:78:CE:83:96:B3:89:37:D7:F5
 # Fingerprint (SHA1): 59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4564,13 +4135,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "OISTE WISeKey Global Root GA CA"
+# Trust for "OISTE WISeKey Global Root GA CA"
 # Issuer: CN=OISTE WISeKey Global Root GA CA,OU=OISTE Foundation Endorsed,OU=Copyright (c) 2005,O=WISeKey,C=CH
 # Serial Number:41:3d:72:c7:f4:6b:1f:81:43:7d:f1:d2:28:54:df:9a
 # Subject: CN=OISTE WISeKey Global Root GA CA,OU=OISTE Foundation Endorsed,OU=Copyright (c) 2005,O=WISeKey,C=CH
 # Not Valid Before: Sun Dec 11 16:03:44 2005
 # Not Valid After : Fri Dec 11 16:09:51 2037
-# Fingerprint (MD5): BC:6C:51:33:A7:E9:D3:66:63:54:15:72:1B:21:92:93
+# Fingerprint (SHA-256): 41:C9:23:86:6A:B4:CA:D6:B7:AD:57:80:81:58:2E:02:07:97:A6:CB:DF:4F:FF:78:CE:83:96:B3:89:37:D7:F5
 # Fingerprint (SHA1): 59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4612,7 +4183,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Certigna,O=Dhimyotis,C=FR
 # Not Valid Before: Fri Jun 29 15:13:05 2007
 # Not Valid After : Tue Jun 29 15:13:05 2027
-# Fingerprint (MD5): AB:57:A6:5B:7D:42:82:19:B5:D8:58:26:28:5E:FD:FF
+# Fingerprint (SHA-256): E3:B6:A2:DB:2E:D7:CE:48:84:2F:7A:C5:32:41:C7:B7:1D:54:14:4B:FB:40:C1:1F:3F:1D:0B:42:F5:EE:A1:2D
 # Fingerprint (SHA1): B1:2E:13:63:45:86:A4:6F:1A:B2:60:68:37:58:2D:C4:AC:FD:94:97
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4701,13 +4272,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Certigna"
+# Trust for "Certigna"
 # Issuer: CN=Certigna,O=Dhimyotis,C=FR
 # Serial Number:00:fe:dc:e3:01:0f:c9:48:ff
 # Subject: CN=Certigna,O=Dhimyotis,C=FR
 # Not Valid Before: Fri Jun 29 15:13:05 2007
 # Not Valid After : Tue Jun 29 15:13:05 2027
-# Fingerprint (MD5): AB:57:A6:5B:7D:42:82:19:B5:D8:58:26:28:5E:FD:FF
+# Fingerprint (SHA-256): E3:B6:A2:DB:2E:D7:CE:48:84:2F:7A:C5:32:41:C7:B7:1D:54:14:4B:FB:40:C1:1F:3F:1D:0B:42:F5:EE:A1:2D
 # Fingerprint (SHA1): B1:2E:13:63:45:86:A4:6F:1A:B2:60:68:37:58:2D:C4:AC:FD:94:97
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -4735,137 +4306,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
-#
-# Certificate "Cybertrust Global Root"
-#
-# Issuer: CN=Cybertrust Global Root,O="Cybertrust, Inc"
-# Serial Number:04:00:00:00:00:01:0f:85:aa:2d:48
-# Subject: CN=Cybertrust Global Root,O="Cybertrust, Inc"
-# Not Valid Before: Fri Dec 15 08:00:00 2006
-# Not Valid After : Wed Dec 15 08:00:00 2021
-# Fingerprint (MD5): 72:E4:4A:87:E3:69:40:80:77:EA:BC:E3:F4:FF:F0:E1
-# Fingerprint (SHA1): 5F:43:E5:B1:BF:F8:78:8C:AC:1C:C7:CA:4A:9A:C6:22:2B:CC:34:C6
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Cybertrust Global Root"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\073\061\030\060\026\006\003\125\004\012\023\017\103\171\142
-\145\162\164\162\165\163\164\054\040\111\156\143\061\037\060\035
-\006\003\125\004\003\023\026\103\171\142\145\162\164\162\165\163
-\164\040\107\154\157\142\141\154\040\122\157\157\164
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\073\061\030\060\026\006\003\125\004\012\023\017\103\171\142
-\145\162\164\162\165\163\164\054\040\111\156\143\061\037\060\035
-\006\003\125\004\003\023\026\103\171\142\145\162\164\162\165\163
-\164\040\107\154\157\142\141\154\040\122\157\157\164
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\013\004\000\000\000\000\001\017\205\252\055\110
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\003\241\060\202\002\211\240\003\002\001\002\002\013\004
-\000\000\000\000\001\017\205\252\055\110\060\015\006\011\052\206
-\110\206\367\015\001\001\005\005\000\060\073\061\030\060\026\006
-\003\125\004\012\023\017\103\171\142\145\162\164\162\165\163\164
-\054\040\111\156\143\061\037\060\035\006\003\125\004\003\023\026
-\103\171\142\145\162\164\162\165\163\164\040\107\154\157\142\141
-\154\040\122\157\157\164\060\036\027\015\060\066\061\062\061\065
-\060\070\060\060\060\060\132\027\015\062\061\061\062\061\065\060
-\070\060\060\060\060\132\060\073\061\030\060\026\006\003\125\004
-\012\023\017\103\171\142\145\162\164\162\165\163\164\054\040\111
-\156\143\061\037\060\035\006\003\125\004\003\023\026\103\171\142
-\145\162\164\162\165\163\164\040\107\154\157\142\141\154\040\122
-\157\157\164\060\202\001\042\060\015\006\011\052\206\110\206\367
-\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012\002
-\202\001\001\000\370\310\274\275\024\120\146\023\377\360\323\171
-\354\043\362\267\032\307\216\205\361\022\163\246\031\252\020\333
-\234\242\145\164\132\167\076\121\175\126\366\334\043\266\324\355
-\137\130\261\067\115\325\111\016\156\365\152\207\326\322\214\322
-\047\306\342\377\066\237\230\145\240\023\116\306\052\144\233\325
-\220\022\317\024\006\364\073\343\324\050\276\350\016\370\253\116
-\110\224\155\216\225\061\020\134\355\242\055\275\325\072\155\262
-\034\273\140\300\106\113\001\365\111\256\176\106\212\320\164\215
-\241\014\002\316\356\374\347\217\270\153\146\363\177\104\000\277
-\146\045\024\053\335\020\060\035\007\226\077\115\366\153\270\217
-\267\173\014\245\070\353\336\107\333\325\135\071\374\210\247\363
-\327\052\164\361\350\132\242\073\237\120\272\246\214\105\065\302
-\120\145\225\334\143\202\357\335\277\167\115\234\142\311\143\163
-\026\320\051\017\111\251\110\360\263\252\267\154\305\247\060\071
-\100\135\256\304\342\135\046\123\360\316\034\043\010\141\250\224
-\031\272\004\142\100\354\037\070\160\167\022\006\161\247\060\030
-\135\045\047\245\002\003\001\000\001\243\201\245\060\201\242\060
-\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060
-\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377
-\060\035\006\003\125\035\016\004\026\004\024\266\010\173\015\172
-\314\254\040\114\206\126\062\136\317\253\156\205\055\160\127\060
-\077\006\003\125\035\037\004\070\060\066\060\064\240\062\240\060
-\206\056\150\164\164\160\072\057\057\167\167\167\062\056\160\165
-\142\154\151\143\055\164\162\165\163\164\056\143\157\155\057\143
-\162\154\057\143\164\057\143\164\162\157\157\164\056\143\162\154
-\060\037\006\003\125\035\043\004\030\060\026\200\024\266\010\173
-\015\172\314\254\040\114\206\126\062\136\317\253\156\205\055\160
-\127\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000
-\003\202\001\001\000\126\357\012\043\240\124\116\225\227\311\370
-\211\332\105\301\324\243\000\045\364\037\023\253\267\243\205\130
-\151\302\060\255\330\025\212\055\343\311\315\201\132\370\163\043
-\132\247\174\005\363\375\042\073\016\321\006\304\333\066\114\163
-\004\216\345\260\042\344\305\363\056\245\331\043\343\270\116\112
-\040\247\156\002\044\237\042\140\147\173\213\035\162\011\305\061
-\134\351\171\237\200\107\075\255\241\013\007\024\075\107\377\003
-\151\032\014\013\104\347\143\045\247\177\262\311\270\166\204\355
-\043\366\175\007\253\105\176\323\337\263\277\351\212\266\315\250
-\242\147\053\122\325\267\145\360\071\114\143\240\221\171\223\122
-\017\124\335\203\273\237\321\217\247\123\163\303\313\377\060\354
-\174\004\270\330\104\037\223\137\161\011\042\267\156\076\352\034
-\003\116\235\032\040\141\373\201\067\354\136\374\012\105\253\327
-\347\027\125\320\240\352\140\233\246\366\343\214\133\051\302\006
-\140\024\235\055\227\114\251\223\025\235\141\304\001\137\110\326
-\130\275\126\061\022\116\021\310\041\340\263\021\221\145\333\264
-\246\210\070\316\125
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for Certificate "Cybertrust Global Root"
-# Issuer: CN=Cybertrust Global Root,O="Cybertrust, Inc"
-# Serial Number:04:00:00:00:00:01:0f:85:aa:2d:48
-# Subject: CN=Cybertrust Global Root,O="Cybertrust, Inc"
-# Not Valid Before: Fri Dec 15 08:00:00 2006
-# Not Valid After : Wed Dec 15 08:00:00 2021
-# Fingerprint (MD5): 72:E4:4A:87:E3:69:40:80:77:EA:BC:E3:F4:FF:F0:E1
-# Fingerprint (SHA1): 5F:43:E5:B1:BF:F8:78:8C:AC:1C:C7:CA:4A:9A:C6:22:2B:CC:34:C6
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Cybertrust Global Root"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\137\103\345\261\277\370\170\214\254\034\307\312\112\232\306\042
-\053\314\064\306
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\162\344\112\207\343\151\100\200\167\352\274\343\364\377\360\341
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\073\061\030\060\026\006\003\125\004\012\023\017\103\171\142
-\145\162\164\162\165\163\164\054\040\111\156\143\061\037\060\035
-\006\003\125\004\003\023\026\103\171\142\145\162\164\162\165\163
-\164\040\107\154\157\142\141\154\040\122\157\157\164
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\013\004\000\000\000\000\001\017\205\252\055\110
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
 #
 # Certificate "ePKI Root Certification Authority"
 #
@@ -4874,7 +4314,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: OU=ePKI Root Certification Authority,O="Chunghwa Telecom Co., Ltd.",C=TW
 # Not Valid Before: Mon Dec 20 02:31:27 2004
 # Not Valid After : Wed Dec 20 02:31:27 2034
-# Fingerprint (MD5): 1B:2E:00:CA:26:06:90:3D:AD:FE:6F:15:68:D3:6B:B3
+# Fingerprint (SHA-256): C0:A6:F4:DC:63:A2:4B:FD:CF:54:EF:2A:6A:08:2A:0A:72:DE:35:80:3E:2F:F5:FF:52:7A:E5:D8:72:06:DF:D5
 # Fingerprint (SHA1): 67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5001,13 +4441,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "ePKI Root Certification Authority"
+# Trust for "ePKI Root Certification Authority"
 # Issuer: OU=ePKI Root Certification Authority,O="Chunghwa Telecom Co., Ltd.",C=TW
 # Serial Number:15:c8:bd:65:47:5c:af:b8:97:00:5e:e4:06:d2:bc:9d
 # Subject: OU=ePKI Root Certification Authority,O="Chunghwa Telecom Co., Ltd.",C=TW
 # Not Valid Before: Mon Dec 20 02:31:27 2004
 # Not Valid After : Wed Dec 20 02:31:27 2034
-# Fingerprint (MD5): 1B:2E:00:CA:26:06:90:3D:AD:FE:6F:15:68:D3:6B:B3
+# Fingerprint (SHA-256): C0:A6:F4:DC:63:A2:4B:FD:CF:54:EF:2A:6A:08:2A:0A:72:DE:35:80:3E:2F:F5:FF:52:7A:E5:D8:72:06:DF:D5
 # Fingerprint (SHA1): 67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5046,7 +4486,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: OU=certSIGN ROOT CA,O=certSIGN,C=RO
 # Not Valid Before: Tue Jul 04 17:20:04 2006
 # Not Valid After : Fri Jul 04 17:20:04 2031
-# Fingerprint (MD5): 18:98:C0:D6:E9:3A:FC:F9:B0:F5:0C:F7:4B:01:44:17
+# Fingerprint (SHA-256): EA:A9:62:C4:FA:4A:6B:AF:EB:E4:15:19:6D:35:1C:CD:88:8D:4F:53:F3:FA:8A:E6:D7:C4:66:A9:4E:60:42:BB
 # Fingerprint (SHA1): FA:B7:EE:36:97:26:62:FB:2D:B0:2A:F6:BF:03:FD:E8:7C:4B:2F:9B
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5128,13 +4568,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "certSIGN ROOT CA"
+# Trust for "certSIGN ROOT CA"
 # Issuer: OU=certSIGN ROOT CA,O=certSIGN,C=RO
 # Serial Number:20:06:05:16:70:02
 # Subject: OU=certSIGN ROOT CA,O=certSIGN,C=RO
 # Not Valid Before: Tue Jul 04 17:20:04 2006
 # Not Valid After : Fri Jul 04 17:20:04 2031
-# Fingerprint (MD5): 18:98:C0:D6:E9:3A:FC:F9:B0:F5:0C:F7:4B:01:44:17
+# Fingerprint (SHA-256): EA:A9:62:C4:FA:4A:6B:AF:EB:E4:15:19:6D:35:1C:CD:88:8D:4F:53:F3:FA:8A:E6:D7:C4:66:A9:4E:60:42:BB
 # Fingerprint (SHA1): FA:B7:EE:36:97:26:62:FB:2D:B0:2A:F6:BF:03:FD:E8:7C:4B:2F:9B
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5170,7 +4610,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=NetLock Arany (Class Gold) F..tan..s..tv..ny,OU=Tan..s..tv..nykiad..k (Certification Services),O=NetLock Kft.,L=Budapest,C=HU
 # Not Valid Before: Thu Dec 11 15:08:21 2008
 # Not Valid After : Wed Dec 06 15:08:21 2028
-# Fingerprint (MD5): C5:A1:B7:FF:73:DD:D6:D7:34:32:18:DF:FC:3C:AD:88
+# Fingerprint (SHA-256): 6C:61:DA:C3:A2:DE:F0:31:50:6B:E0:36:D2:A6:FE:40:19:94:FB:D1:3D:F9:C8:D4:66:59:92:74:C4:46:EC:98
 # Fingerprint (SHA1): 06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5280,13 +4720,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "NetLock Arany (Class Gold) Főtanúsítvány"
+# Trust for "NetLock Arany (Class Gold) Főtanúsítvány"
 # Issuer: CN=NetLock Arany (Class Gold) F..tan..s..tv..ny,OU=Tan..s..tv..nykiad..k (Certification Services),O=NetLock Kft.,L=Budapest,C=HU
 # Serial Number:49:41:2c:e4:00:10
 # Subject: CN=NetLock Arany (Class Gold) F..tan..s..tv..ny,OU=Tan..s..tv..nykiad..k (Certification Services),O=NetLock Kft.,L=Budapest,C=HU
 # Not Valid Before: Thu Dec 11 15:08:21 2008
 # Not Valid After : Wed Dec 06 15:08:21 2028
-# Fingerprint (MD5): C5:A1:B7:FF:73:DD:D6:D7:34:32:18:DF:FC:3C:AD:88
+# Fingerprint (SHA-256): 6C:61:DA:C3:A2:DE:F0:31:50:6B:E0:36:D2:A6:FE:40:19:94:FB:D1:3D:F9:C8:D4:66:59:92:74:C4:46:EC:98
 # Fingerprint (SHA1): 06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5329,7 +4769,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Hongkong Post Root CA 1,O=Hongkong Post,C=HK
 # Not Valid Before: Thu May 15 05:13:14 2003
 # Not Valid After : Mon May 15 04:52:29 2023
-# Fingerprint (MD5): A8:0D:6F:39:78:B9:43:6D:77:42:6D:98:5A:CC:23:CA
+# Fingerprint (SHA-256): F9:E6:7D:33:6C:51:00:2A:C0:54:C6:32:02:2D:66:DD:A2:E7:E3:FF:F1:0A:D0:61:ED:31:D8:BB:B4:10:CF:B2
 # Fingerprint (SHA1): D6:DA:A8:20:8D:09:D2:15:4D:24:B5:2F:CB:34:6E:B2:58:B2:8A:58
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5413,13 +4853,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Hongkong Post Root CA 1"
+# Trust for "Hongkong Post Root CA 1"
 # Issuer: CN=Hongkong Post Root CA 1,O=Hongkong Post,C=HK
 # Serial Number: 1000 (0x3e8)
 # Subject: CN=Hongkong Post Root CA 1,O=Hongkong Post,C=HK
 # Not Valid Before: Thu May 15 05:13:14 2003
 # Not Valid After : Mon May 15 04:52:29 2023
-# Fingerprint (MD5): A8:0D:6F:39:78:B9:43:6D:77:42:6D:98:5A:CC:23:CA
+# Fingerprint (SHA-256): F9:E6:7D:33:6C:51:00:2A:C0:54:C6:32:02:2D:66:DD:A2:E7:E3:FF:F1:0A:D0:61:ED:31:D8:BB:B4:10:CF:B2
 # Fingerprint (SHA1): D6:DA:A8:20:8D:09:D2:15:4D:24:B5:2F:CB:34:6E:B2:58:B2:8A:58
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5456,7 +4896,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=SecureSign RootCA11,O="Japan Certification Services, Inc.",C=JP
 # Not Valid Before: Wed Apr 08 04:56:47 2009
 # Not Valid After : Sun Apr 08 04:56:47 2029
-# Fingerprint (MD5): B7:52:74:E2:92:B4:80:93:F2:75:E4:CC:D7:F2:EA:26
+# Fingerprint (SHA-256): BF:0F:EE:FB:9E:3A:58:1A:D5:F9:E9:DB:75:89:98:57:43:D2:61:08:5C:4D:31:4F:6F:5D:72:59:AA:42:16:12
 # Fingerprint (SHA1): 3B:C4:9F:48:F8:F3:73:A0:9C:1E:BD:F8:5B:B1:C3:65:C7:D8:11:B3
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5546,13 +4986,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "SecureSign RootCA11"
+# Trust for "SecureSign RootCA11"
 # Issuer: CN=SecureSign RootCA11,O="Japan Certification Services, Inc.",C=JP
 # Serial Number: 1 (0x1)
 # Subject: CN=SecureSign RootCA11,O="Japan Certification Services, Inc.",C=JP
 # Not Valid Before: Wed Apr 08 04:56:47 2009
 # Not Valid After : Sun Apr 08 04:56:47 2029
-# Fingerprint (MD5): B7:52:74:E2:92:B4:80:93:F2:75:E4:CC:D7:F2:EA:26
+# Fingerprint (SHA-256): BF:0F:EE:FB:9E:3A:58:1A:D5:F9:E9:DB:75:89:98:57:43:D2:61:08:5C:4D:31:4F:6F:5D:72:59:AA:42:16:12
 # Fingerprint (SHA1): 3B:C4:9F:48:F8:F3:73:A0:9C:1E:BD:F8:5B:B1:C3:65:C7:D8:11:B3
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5590,7 +5030,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: E=info@e-szigno.hu,CN=Microsec e-Szigno Root CA 2009,O=Microsec Ltd.,L=Budapest,C=HU
 # Not Valid Before: Tue Jun 16 11:30:18 2009
 # Not Valid After : Sun Dec 30 11:30:18 2029
-# Fingerprint (MD5): F8:49:F4:03:BC:44:2D:83:BE:48:69:7D:29:64:FC:B1
+# Fingerprint (SHA-256): 3C:5F:81:FE:A5:FA:B8:2C:64:BF:A2:EA:EC:AF:CD:E8:E0:77:FC:86:20:A7:CA:E5:37:16:3D:F3:6E:DB:F3:78
 # Fingerprint (SHA1): 89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5695,13 +5135,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Microsec e-Szigno Root CA 2009"
+# Trust for "Microsec e-Szigno Root CA 2009"
 # Issuer: E=info@e-szigno.hu,CN=Microsec e-Szigno Root CA 2009,O=Microsec Ltd.,L=Budapest,C=HU
 # Serial Number:00:c2:7e:43:04:4e:47:3f:19
 # Subject: E=info@e-szigno.hu,CN=Microsec e-Szigno Root CA 2009,O=Microsec Ltd.,L=Budapest,C=HU
 # Not Valid Before: Tue Jun 16 11:30:18 2009
 # Not Valid After : Sun Dec 30 11:30:18 2029
-# Fingerprint (MD5): F8:49:F4:03:BC:44:2D:83:BE:48:69:7D:29:64:FC:B1
+# Fingerprint (SHA-256): 3C:5F:81:FE:A5:FA:B8:2C:64:BF:A2:EA:EC:AF:CD:E8:E0:77:FC:86:20:A7:CA:E5:37:16:3D:F3:6E:DB:F3:78
 # Fingerprint (SHA1): 89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5742,7 +5182,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R3
 # Not Valid Before: Wed Mar 18 10:00:00 2009
 # Not Valid After : Sun Mar 18 10:00:00 2029
-# Fingerprint (MD5): C5:DF:B8:49:CA:05:13:55:EE:2D:BA:1A:C3:3E:B0:28
+# Fingerprint (SHA-256): CB:B5:22:D7:B7:F1:27:AD:6A:01:13:86:5B:DF:1C:D4:10:2E:7D:07:59:AF:63:5A:7C:F4:72:0D:C9:63:C5:3B
 # Fingerprint (SHA1): D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5829,13 +5269,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "GlobalSign Root CA - R3"
+# Trust for "GlobalSign Root CA - R3"
 # Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R3
 # Serial Number:04:00:00:00:00:01:21:58:53:08:a2
 # Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R3
 # Not Valid Before: Wed Mar 18 10:00:00 2009
 # Not Valid After : Sun Mar 18 10:00:00 2029
-# Fingerprint (MD5): C5:DF:B8:49:CA:05:13:55:EE:2D:BA:1A:C3:3E:B0:28
+# Fingerprint (SHA-256): CB:B5:22:D7:B7:F1:27:AD:6A:01:13:86:5B:DF:1C:D4:10:2E:7D:07:59:AF:63:5A:7C:F4:72:0D:C9:63:C5:3B
 # Fingerprint (SHA1): D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -5872,7 +5312,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES
 # Not Valid Before: Wed May 20 08:38:15 2009
 # Not Valid After : Tue Dec 31 08:38:15 2030
-# Fingerprint (MD5): 73:3A:74:7A:EC:BB:A3:96:A6:C2:E4:E2:C8:9B:C0:C3
+# Fingerprint (SHA-256): 04:04:80:28:BF:1F:28:64:D4:8F:9A:D4:D8:32:94:36:6A:82:88:56:55:3F:3B:14:30:3F:90:14:7F:5D:40:EF
 # Fingerprint (SHA1): AE:C5:FB:3F:C8:E1:BF:C4:E5:4F:03:07:5A:9A:E8:00:B7:F7:B6:FA
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6004,13 +5444,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Autoridad de Certificacion Firmaprofesional CIF A62634068"
+# Trust for "Autoridad de Certificacion Firmaprofesional CIF A62634068"
 # Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES
 # Serial Number:53:ec:3b:ee:fb:b2:48:5f
 # Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES
 # Not Valid Before: Wed May 20 08:38:15 2009
 # Not Valid After : Tue Dec 31 08:38:15 2030
-# Fingerprint (MD5): 73:3A:74:7A:EC:BB:A3:96:A6:C2:E4:E2:C8:9B:C0:C3
+# Fingerprint (SHA-256): 04:04:80:28:BF:1F:28:64:D4:8F:9A:D4:D8:32:94:36:6A:82:88:56:55:3F:3B:14:30:3F:90:14:7F:5D:40:EF
 # Fingerprint (SHA1): AE:C5:FB:3F:C8:E1:BF:C4:E5:4F:03:07:5A:9A:E8:00:B7:F7:B6:FA
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6048,7 +5488,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Izenpe.com,O=IZENPE S.A.,C=ES
 # Not Valid Before: Thu Dec 13 13:08:28 2007
 # Not Valid After : Sun Dec 13 08:27:25 2037
-# Fingerprint (MD5): A6:B0:CD:85:80:DA:5C:50:34:A3:39:90:2F:55:67:73
+# Fingerprint (SHA-256): 25:30:CC:8E:98:32:15:02:BA:D9:6F:9B:1F:BA:1B:09:9E:2D:29:9E:0F:45:48:BB:91:4F:36:3B:C0:D4:53:1F
 # Fingerprint (SHA1): 2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6175,13 +5615,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Izenpe.com"
+# Trust for "Izenpe.com"
 # Issuer: CN=Izenpe.com,O=IZENPE S.A.,C=ES
 # Serial Number:00:b0:b7:5a:16:48:5f:bf:e1:cb:f5:8b:d7:19:e6:7d
 # Subject: CN=Izenpe.com,O=IZENPE S.A.,C=ES
 # Not Valid Before: Thu Dec 13 13:08:28 2007
 # Not Valid After : Sun Dec 13 08:27:25 2037
-# Fingerprint (MD5): A6:B0:CD:85:80:DA:5C:50:34:A3:39:90:2F:55:67:73
+# Fingerprint (SHA-256): 25:30:CC:8E:98:32:15:02:BA:D9:6F:9B:1F:BA:1B:09:9E:2D:29:9E:0F:45:48:BB:91:4F:36:3B:C0:D4:53:1F
 # Fingerprint (SHA1): 2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6218,7 +5658,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Chambers of Commerce Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU
 # Not Valid Before: Fri Aug 01 12:29:50 2008
 # Not Valid After : Sat Jul 31 12:29:50 2038
-# Fingerprint (MD5): 5E:80:9E:84:5A:0E:65:0B:17:02:F3:55:18:2A:3E:D7
+# Fingerprint (SHA-256): 06:3E:4A:FA:C4:91:DF:D3:32:F3:08:9B:85:42:E9:46:17:D8:93:D7:FE:94:4E:10:A7:93:7E:E2:9D:96:93:C0
 # Fingerprint (SHA1): 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6382,13 +5822,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Chambers of Commerce Root - 2008"
+# Trust for "Chambers of Commerce Root - 2008"
 # Issuer: CN=Chambers of Commerce Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU
 # Serial Number:00:a3:da:42:7e:a4:b1:ae:da
 # Subject: CN=Chambers of Commerce Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU
 # Not Valid Before: Fri Aug 01 12:29:50 2008
 # Not Valid After : Sat Jul 31 12:29:50 2038
-# Fingerprint (MD5): 5E:80:9E:84:5A:0E:65:0B:17:02:F3:55:18:2A:3E:D7
+# Fingerprint (SHA-256): 06:3E:4A:FA:C4:91:DF:D3:32:F3:08:9B:85:42:E9:46:17:D8:93:D7:FE:94:4E:10:A7:93:7E:E2:9D:96:93:C0
 # Fingerprint (SHA1): 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6432,7 +5872,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Global Chambersign Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU
 # Not Valid Before: Fri Aug 01 12:31:40 2008
 # Not Valid After : Sat Jul 31 12:31:40 2038
-# Fingerprint (MD5): 9E:80:FF:78:01:0C:2E:C1:36:BD:FE:96:90:6E:08:F3
+# Fingerprint (SHA-256): 13:63:35:43:93:34:A7:69:80:16:A0:D3:24:DE:72:28:4E:07:9D:7B:52:20:BB:8F:BD:74:78:16:EE:BE:BA:CA
 # Fingerprint (SHA1): 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6593,13 +6033,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Global Chambersign Root - 2008"
+# Trust for "Global Chambersign Root - 2008"
 # Issuer: CN=Global Chambersign Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU
 # Serial Number:00:c9:cd:d3:e9:d5:7d:23:ce
 # Subject: CN=Global Chambersign Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU
 # Not Valid Before: Fri Aug 01 12:31:40 2008
 # Not Valid After : Sat Jul 31 12:31:40 2038
-# Fingerprint (MD5): 9E:80:FF:78:01:0C:2E:C1:36:BD:FE:96:90:6E:08:F3
+# Fingerprint (SHA-256): 13:63:35:43:93:34:A7:69:80:16:A0:D3:24:DE:72:28:4E:07:9D:7B:52:20:BB:8F:BD:74:78:16:EE:BE:BA:CA
 # Fingerprint (SHA1): 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6642,7 +6082,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Go Daddy Root Certificate Authority - G2,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US
 # Not Valid Before: Tue Sep 01 00:00:00 2009
 # Not Valid After : Thu Dec 31 23:59:59 2037
-# Fingerprint (MD5): 80:3A:BC:22:C1:E6:FB:8D:9B:3B:27:4A:32:1B:9A:01
+# Fingerprint (SHA-256): 45:14:0B:32:47:EB:9C:C8:C5:B4:F0:D7:B5:30:91:F7:32:92:08:9E:6E:5A:63:E2:74:9D:D3:AC:A9:19:8E:DA
 # Fingerprint (SHA1): 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6743,13 +6183,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Go Daddy Root Certificate Authority - G2"
+# Trust for "Go Daddy Root Certificate Authority - G2"
 # Issuer: CN=Go Daddy Root Certificate Authority - G2,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US
 # Serial Number: 0 (0x0)
 # Subject: CN=Go Daddy Root Certificate Authority - G2,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US
 # Not Valid Before: Tue Sep 01 00:00:00 2009
 # Not Valid After : Thu Dec 31 23:59:59 2037
-# Fingerprint (MD5): 80:3A:BC:22:C1:E6:FB:8D:9B:3B:27:4A:32:1B:9A:01
+# Fingerprint (SHA-256): 45:14:0B:32:47:EB:9C:C8:C5:B4:F0:D7:B5:30:91:F7:32:92:08:9E:6E:5A:63:E2:74:9D:D3:AC:A9:19:8E:DA
 # Fingerprint (SHA1): 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6790,7 +6230,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Starfield Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US
 # Not Valid Before: Tue Sep 01 00:00:00 2009
 # Not Valid After : Thu Dec 31 23:59:59 2037
-# Fingerprint (MD5): D6:39:81:C6:52:7E:96:69:FC:FC:CA:66:ED:05:F2:96
+# Fingerprint (SHA-256): 2C:E1:CB:0B:F9:D2:F9:E1:02:99:3F:BE:21:51:52:C3:B2:DD:0C:AB:DE:1C:68:E5:31:9B:83:91:54:DB:B7:F5
 # Fingerprint (SHA1): B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6895,13 +6335,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Starfield Root Certificate Authority - G2"
+# Trust for "Starfield Root Certificate Authority - G2"
 # Issuer: CN=Starfield Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US
 # Serial Number: 0 (0x0)
 # Subject: CN=Starfield Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US
 # Not Valid Before: Tue Sep 01 00:00:00 2009
 # Not Valid After : Thu Dec 31 23:59:59 2037
-# Fingerprint (MD5): D6:39:81:C6:52:7E:96:69:FC:FC:CA:66:ED:05:F2:96
+# Fingerprint (SHA-256): 2C:E1:CB:0B:F9:D2:F9:E1:02:99:3F:BE:21:51:52:C3:B2:DD:0C:AB:DE:1C:68:E5:31:9B:83:91:54:DB:B7:F5
 # Fingerprint (SHA1): B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -6943,7 +6383,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US
 # Not Valid Before: Tue Sep 01 00:00:00 2009
 # Not Valid After : Thu Dec 31 23:59:59 2037
-# Fingerprint (MD5): 17:35:74:AF:7B:61:1C:EB:F4:F9:3C:E2:EE:40:F9:A2
+# Fingerprint (SHA-256): 56:8D:69:05:A2:C8:87:08:A4:B3:02:51:90:ED:CF:ED:B1:97:4A:60:6A:13:C6:E5:29:0F:CB:2A:E6:3E:DA:B5
 # Fingerprint (SHA1): 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7049,13 +6489,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Starfield Services Root Certificate Authority - G2"
+# Trust for "Starfield Services Root Certificate Authority - G2"
 # Issuer: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US
 # Serial Number: 0 (0x0)
 # Subject: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US
 # Not Valid Before: Tue Sep 01 00:00:00 2009
 # Not Valid After : Thu Dec 31 23:59:59 2037
-# Fingerprint (MD5): 17:35:74:AF:7B:61:1C:EB:F4:F9:3C:E2:EE:40:F9:A2
+# Fingerprint (SHA-256): 56:8D:69:05:A2:C8:87:08:A4:B3:02:51:90:ED:CF:ED:B1:97:4A:60:6A:13:C6:E5:29:0F:CB:2A:E6:3E:DA:B5
 # Fingerprint (SHA1): 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7097,7 +6537,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=AffirmTrust Commercial,O=AffirmTrust,C=US
 # Not Valid Before: Fri Jan 29 14:06:06 2010
 # Not Valid After : Tue Dec 31 14:06:06 2030
-# Fingerprint (MD5): 82:92:BA:5B:EF:CD:8A:6F:A6:3D:55:F9:84:F6:D6:B7
+# Fingerprint (SHA-256): 03:76:AB:1D:54:C5:F9:80:3C:E4:B2:E2:01:A0:EE:7E:EF:7B:57:B6:36:E8:A9:3C:9B:8D:48:60:C9:6F:5F:A7
 # Fingerprint (SHA1): F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7182,13 +6622,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "AffirmTrust Commercial"
+# Trust for "AffirmTrust Commercial"
 # Issuer: CN=AffirmTrust Commercial,O=AffirmTrust,C=US
 # Serial Number:77:77:06:27:26:a9:b1:7c
 # Subject: CN=AffirmTrust Commercial,O=AffirmTrust,C=US
 # Not Valid Before: Fri Jan 29 14:06:06 2010
 # Not Valid After : Tue Dec 31 14:06:06 2030
-# Fingerprint (MD5): 82:92:BA:5B:EF:CD:8A:6F:A6:3D:55:F9:84:F6:D6:B7
+# Fingerprint (SHA-256): 03:76:AB:1D:54:C5:F9:80:3C:E4:B2:E2:01:A0:EE:7E:EF:7B:57:B6:36:E8:A9:3C:9B:8D:48:60:C9:6F:5F:A7
 # Fingerprint (SHA1): F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7225,7 +6665,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=AffirmTrust Networking,O=AffirmTrust,C=US
 # Not Valid Before: Fri Jan 29 14:08:24 2010
 # Not Valid After : Tue Dec 31 14:08:24 2030
-# Fingerprint (MD5): 42:65:CA:BE:01:9A:9A:4C:A9:8C:41:49:CD:C0:D5:7F
+# Fingerprint (SHA-256): 0A:81:EC:5A:92:97:77:F1:45:90:4A:F3:8D:5D:50:9F:66:B5:E2:C5:8F:CD:B5:31:05:8B:0E:17:F3:F0:B4:1B
 # Fingerprint (SHA1): 29:36:21:02:8B:20:ED:02:F5:66:C5:32:D1:D6:ED:90:9F:45:00:2F
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7310,13 +6750,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "AffirmTrust Networking"
+# Trust for "AffirmTrust Networking"
 # Issuer: CN=AffirmTrust Networking,O=AffirmTrust,C=US
 # Serial Number:7c:4f:04:39:1c:d4:99:2d
 # Subject: CN=AffirmTrust Networking,O=AffirmTrust,C=US
 # Not Valid Before: Fri Jan 29 14:08:24 2010
 # Not Valid After : Tue Dec 31 14:08:24 2030
-# Fingerprint (MD5): 42:65:CA:BE:01:9A:9A:4C:A9:8C:41:49:CD:C0:D5:7F
+# Fingerprint (SHA-256): 0A:81:EC:5A:92:97:77:F1:45:90:4A:F3:8D:5D:50:9F:66:B5:E2:C5:8F:CD:B5:31:05:8B:0E:17:F3:F0:B4:1B
 # Fingerprint (SHA1): 29:36:21:02:8B:20:ED:02:F5:66:C5:32:D1:D6:ED:90:9F:45:00:2F
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7353,7 +6793,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=AffirmTrust Premium,O=AffirmTrust,C=US
 # Not Valid Before: Fri Jan 29 14:10:36 2010
 # Not Valid After : Mon Dec 31 14:10:36 2040
-# Fingerprint (MD5): C4:5D:0E:48:B6:AC:28:30:4E:0A:BC:F9:38:16:87:57
+# Fingerprint (SHA-256): 70:A7:3F:7F:37:6B:60:07:42:48:90:45:34:B1:14:82:D5:BF:0E:69:8E:CC:49:8D:F5:25:77:EB:F2:E9:3B:9A
 # Fingerprint (SHA1): D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7470,13 +6910,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "AffirmTrust Premium"
+# Trust for "AffirmTrust Premium"
 # Issuer: CN=AffirmTrust Premium,O=AffirmTrust,C=US
 # Serial Number:6d:8c:14:46:b1:a6:0a:ee
 # Subject: CN=AffirmTrust Premium,O=AffirmTrust,C=US
 # Not Valid Before: Fri Jan 29 14:10:36 2010
 # Not Valid After : Mon Dec 31 14:10:36 2040
-# Fingerprint (MD5): C4:5D:0E:48:B6:AC:28:30:4E:0A:BC:F9:38:16:87:57
+# Fingerprint (SHA-256): 70:A7:3F:7F:37:6B:60:07:42:48:90:45:34:B1:14:82:D5:BF:0E:69:8E:CC:49:8D:F5:25:77:EB:F2:E9:3B:9A
 # Fingerprint (SHA1): D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7513,7 +6953,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=AffirmTrust Premium ECC,O=AffirmTrust,C=US
 # Not Valid Before: Fri Jan 29 14:20:24 2010
 # Not Valid After : Mon Dec 31 14:20:24 2040
-# Fingerprint (MD5): 64:B0:09:55:CF:B1:D5:99:E2:BE:13:AB:A6:5D:EA:4D
+# Fingerprint (SHA-256): BD:71:FD:F6:DA:97:E4:CF:62:D1:64:7A:DD:25:81:B0:7D:79:AD:F8:39:7E:B4:EC:BA:9C:5E:84:88:82:14:23
 # Fingerprint (SHA1): B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7578,13 +7018,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "AffirmTrust Premium ECC"
+# Trust for "AffirmTrust Premium ECC"
 # Issuer: CN=AffirmTrust Premium ECC,O=AffirmTrust,C=US
 # Serial Number:74:97:25:8a:c7:3f:7a:54
 # Subject: CN=AffirmTrust Premium ECC,O=AffirmTrust,C=US
 # Not Valid Before: Fri Jan 29 14:20:24 2010
 # Not Valid After : Mon Dec 31 14:20:24 2040
-# Fingerprint (MD5): 64:B0:09:55:CF:B1:D5:99:E2:BE:13:AB:A6:5D:EA:4D
+# Fingerprint (SHA-256): BD:71:FD:F6:DA:97:E4:CF:62:D1:64:7A:DD:25:81:B0:7D:79:AD:F8:39:7E:B4:EC:BA:9C:5E:84:88:82:14:23
 # Fingerprint (SHA1): B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7621,7 +7061,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL
 # Not Valid Before: Wed Oct 22 12:07:37 2008
 # Not Valid After : Mon Dec 31 12:07:37 2029
-# Fingerprint (MD5): D5:E9:81:40:C5:18:69:FC:46:2C:89:75:62:0F:AA:78
+# Fingerprint (SHA-256): 5C:58:46:8D:55:F5:8E:49:7E:74:39:82:D2:B5:00:10:B6:D1:65:37:4A:CF:83:A7:D4:A3:2D:B7:68:C4:40:8E
 # Fingerprint (SHA1): 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7719,13 +7159,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Certum Trusted Network CA"
+# Trust for "Certum Trusted Network CA"
 # Issuer: CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL
 # Serial Number: 279744 (0x444c0)
 # Subject: CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL
 # Not Valid Before: Wed Oct 22 12:07:37 2008
 # Not Valid After : Mon Dec 31 12:07:37 2029
-# Fingerprint (MD5): D5:E9:81:40:C5:18:69:FC:46:2C:89:75:62:0F:AA:78
+# Fingerprint (SHA-256): 5C:58:46:8D:55:F5:8E:49:7E:74:39:82:D2:B5:00:10:B6:D1:65:37:4A:CF:83:A7:D4:A3:2D:B7:68:C4:40:8E
 # Fingerprint (SHA1): 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7765,7 +7205,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=TWCA Root Certification Authority,OU=Root CA,O=TAIWAN-CA,C=TW
 # Not Valid Before: Thu Aug 28 07:24:33 2008
 # Not Valid After : Tue Dec 31 15:59:59 2030
-# Fingerprint (MD5): AA:08:8F:F6:F9:7B:B7:F2:B1:A7:1E:9B:EA:EA:BD:79
+# Fingerprint (SHA-256): BF:D8:8F:E1:10:1C:41:AE:3E:80:1B:F8:BE:56:35:0E:E9:BA:D1:A6:B9:BD:51:5E:DC:5C:6D:5B:87:11:AC:44
 # Fingerprint (SHA1): CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -7857,13 +7297,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "TWCA Root Certification Authority"
+# Trust for "TWCA Root Certification Authority"
 # Issuer: CN=TWCA Root Certification Authority,OU=Root CA,O=TAIWAN-CA,C=TW
 # Serial Number: 1 (0x1)
 # Subject: CN=TWCA Root Certification Authority,OU=Root CA,O=TAIWAN-CA,C=TW
 # Not Valid Before: Thu Aug 28 07:24:33 2008
 # Not Valid After : Tue Dec 31 15:59:59 2030
-# Fingerprint (MD5): AA:08:8F:F6:F9:7B:B7:F2:B1:A7:1E:9B:EA:EA:BD:79
+# Fingerprint (SHA-256): BF:D8:8F:E1:10:1C:41:AE:3E:80:1B:F8:BE:56:35:0E:E9:BA:D1:A6:B9:BD:51:5E:DC:5C:6D:5B:87:11:AC:44
 # Fingerprint (SHA1): CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -8063,187 +7503,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_NOT_TRUSTED
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_NOT_TRUSTED
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
-#
-# Certificate "Explicitly Distrusted DigiNotar PKIoverheid G2"
-#
-# Issuer: CN=DigiNotar PKIoverheid CA Organisatie - G2,O=DigiNotar B.V.,C=NL
-# Serial Number: 268435455 (0xfffffff)
-# Subject: CN=DigiNotar PKIoverheid CA Organisatie - G2,O=DigiNotar B.V.,C=NL
-# Not Valid Before: Wed May 12 08:51:39 2010
-# Not Valid After : Mon Mar 23 09:50:05 2020
-# Fingerprint (MD5): 2E:61:A2:D1:78:CE:EE:BF:59:33:B0:23:14:0F:94:1C
-# Fingerprint (SHA1): D5:F2:57:A9:BF:2D:D0:3F:8B:46:57:F9:2B:C9:A4:C6:92:E1:42:42
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Explicitly Distrusted DigiNotar PKIoverheid G2"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\132\061\013\060\011\006\003\125\004\006\023\002\116\114\061
-\027\060\025\006\003\125\004\012\014\016\104\151\147\151\116\157
-\164\141\162\040\102\056\126\056\061\062\060\060\006\003\125\004
-\003\014\051\104\151\147\151\116\157\164\141\162\040\120\113\111
-\157\166\145\162\150\145\151\144\040\103\101\040\117\162\147\141
-\156\151\163\141\164\151\145\040\055\040\107\062
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\132\061\013\060\011\006\003\125\004\006\023\002\116\114\061
-\027\060\025\006\003\125\004\012\014\016\104\151\147\151\116\157
-\164\141\162\040\102\056\126\056\061\062\060\060\006\003\125\004
-\003\014\051\104\151\147\151\116\157\164\141\162\040\120\113\111
-\157\166\145\162\150\145\151\144\040\103\101\040\117\162\147\141
-\156\151\163\141\164\151\145\040\055\040\107\062
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\004\017\377\377\377
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\006\225\060\202\004\175\240\003\002\001\002\002\004\017
-\377\377\377\060\015\006\011\052\206\110\206\367\015\001\001\013
-\005\000\060\132\061\013\060\011\006\003\125\004\006\023\002\116
-\114\061\027\060\025\006\003\125\004\012\014\016\104\151\147\151
-\116\157\164\141\162\040\102\056\126\056\061\062\060\060\006\003
-\125\004\003\014\051\104\151\147\151\116\157\164\141\162\040\120
-\113\111\157\166\145\162\150\145\151\144\040\103\101\040\117\162
-\147\141\156\151\163\141\164\151\145\040\055\040\107\062\060\036
-\027\015\061\060\060\065\061\062\060\070\065\061\063\071\132\027
-\015\062\060\060\063\062\063\060\071\065\060\060\065\132\060\132
-\061\013\060\011\006\003\125\004\006\023\002\116\114\061\027\060
-\025\006\003\125\004\012\014\016\104\151\147\151\116\157\164\141
-\162\040\102\056\126\056\061\062\060\060\006\003\125\004\003\014
-\051\104\151\147\151\116\157\164\141\162\040\120\113\111\157\166
-\145\162\150\145\151\144\040\103\101\040\117\162\147\141\156\151
-\163\141\164\151\145\040\055\040\107\062\060\202\002\042\060\015
-\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002
-\017\000\060\202\002\012\002\202\002\001\000\261\023\031\017\047
-\346\154\324\125\206\113\320\354\211\212\105\221\170\254\107\275
-\107\053\344\374\105\353\117\264\046\163\133\067\323\303\177\366
-\343\336\327\243\370\055\150\305\010\076\113\224\326\344\207\045
-\066\153\204\265\030\164\363\050\130\163\057\233\152\317\274\004
-\036\366\336\335\257\374\113\252\365\333\146\142\045\001\045\202
-\336\362\227\132\020\156\335\135\251\042\261\004\251\043\163\072
-\370\161\255\035\317\204\104\353\107\321\257\155\310\174\050\253
-\307\362\067\172\164\137\137\305\002\024\212\243\132\343\033\154
-\001\343\135\216\331\150\326\364\011\033\062\334\221\265\054\365
-\040\353\214\003\155\046\111\270\223\304\205\135\330\322\233\257
-\126\152\314\005\063\314\240\102\236\064\125\104\234\153\240\324
-\022\320\053\124\315\267\211\015\345\366\353\350\373\205\001\063
-\117\172\153\361\235\162\063\226\016\367\262\204\245\245\047\304
-\047\361\121\163\051\167\272\147\156\376\114\334\264\342\241\241
-\201\057\071\111\215\103\070\023\316\320\245\134\302\207\072\000
-\147\145\102\043\361\066\131\012\035\243\121\310\274\243\224\052
-\061\337\343\074\362\235\032\074\004\260\357\261\012\060\023\163
-\266\327\363\243\114\001\165\024\205\170\300\327\212\071\130\205
-\120\372\056\346\305\276\317\213\077\257\217\066\324\045\011\055
-\322\017\254\162\223\362\277\213\324\120\263\371\025\120\233\231
-\365\024\331\373\213\221\243\062\046\046\240\370\337\073\140\201
-\206\203\171\133\053\353\023\075\051\072\301\155\335\275\236\216
-\207\326\112\256\064\227\005\356\024\246\366\334\070\176\112\351
-\044\124\007\075\227\150\067\106\153\015\307\250\041\257\023\124
-\344\011\152\361\115\106\012\311\135\373\233\117\275\336\373\267
-\124\313\270\070\234\247\071\373\152\055\300\173\215\253\245\247
-\127\354\112\222\212\063\305\341\040\134\163\330\220\222\053\200
-\325\017\206\030\151\174\071\117\204\206\274\367\114\133\363\325
-\264\312\240\302\360\067\042\312\171\122\037\123\346\252\363\220
-\260\073\335\362\050\375\254\353\305\006\044\240\311\324\057\017
-\130\375\265\236\354\017\317\262\131\320\242\004\172\070\152\256
-\162\373\275\360\045\142\224\011\247\005\013\002\003\001\000\001
-\243\202\001\141\060\202\001\135\060\110\006\003\125\035\040\004
-\101\060\077\060\075\006\004\125\035\040\000\060\065\060\063\006
-\010\053\006\001\005\005\007\002\001\026\047\150\164\164\160\072
-\057\057\167\167\167\056\144\151\147\151\156\157\164\141\162\056
-\156\154\057\143\160\163\057\160\153\151\157\166\145\162\150\145
-\151\144\060\017\006\003\125\035\023\001\001\377\004\005\060\003
-\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003
-\002\001\006\060\201\205\006\003\125\035\043\004\176\060\174\200
-\024\071\020\213\111\222\134\333\141\022\040\315\111\235\032\216
-\332\234\147\100\271\241\136\244\134\060\132\061\013\060\011\006
-\003\125\004\006\023\002\116\114\061\036\060\034\006\003\125\004
-\012\014\025\123\164\141\141\164\040\144\145\162\040\116\145\144
-\145\162\154\141\156\144\145\156\061\053\060\051\006\003\125\004
-\003\014\042\123\164\141\141\164\040\144\145\162\040\116\145\144
-\145\162\154\141\156\144\145\156\040\122\157\157\164\040\103\101
-\040\055\040\107\062\202\004\000\230\226\364\060\111\006\003\125
-\035\037\004\102\060\100\060\076\240\074\240\072\206\070\150\164
-\164\160\072\057\057\143\162\154\056\160\153\151\157\166\145\162
-\150\145\151\144\056\156\154\057\104\157\155\117\162\147\141\156
-\151\163\141\164\151\145\114\141\164\145\163\164\103\122\114\055
-\107\062\056\143\162\154\060\035\006\003\125\035\016\004\026\004
-\024\274\135\224\073\331\253\173\003\045\163\141\302\333\055\356
-\374\253\217\145\241\060\015\006\011\052\206\110\206\367\015\001
-\001\013\005\000\003\202\002\001\000\217\374\055\114\267\331\055
-\325\037\275\357\313\364\267\150\027\165\235\116\325\367\335\234
-\361\052\046\355\237\242\266\034\003\325\123\263\354\010\317\064
-\342\343\303\364\265\026\057\310\303\276\327\323\163\253\000\066
-\371\032\112\176\326\143\351\136\106\272\245\266\216\025\267\243
-\052\330\103\035\357\135\310\037\201\205\263\213\367\377\074\364
-\331\364\106\010\077\234\274\035\240\331\250\114\315\045\122\116
-\012\261\040\367\037\351\103\331\124\106\201\023\232\300\136\164
-\154\052\230\062\352\374\167\273\015\245\242\061\230\042\176\174
-\174\347\332\244\255\354\267\056\032\031\161\370\110\120\332\103
-\217\054\204\335\301\100\047\343\265\360\025\116\226\324\370\134
-\343\206\051\106\053\327\073\007\353\070\177\310\206\127\227\323
-\357\052\063\304\027\120\325\144\151\153\053\153\105\136\135\057
-\027\312\132\116\317\303\327\071\074\365\073\237\106\271\233\347
-\016\111\227\235\326\325\343\033\017\352\217\001\116\232\023\224
-\131\012\002\007\110\113\032\140\253\177\117\355\013\330\125\015
-\150\157\125\234\151\145\025\102\354\300\334\335\154\254\303\026
-\316\013\035\126\233\244\304\304\322\056\340\017\342\104\047\053
-\120\151\244\334\142\350\212\041\051\102\154\314\000\072\226\166
-\233\357\100\300\244\136\167\204\062\154\046\052\071\146\256\135
-\343\271\271\262\054\150\037\036\232\220\003\071\360\252\263\244
-\314\111\213\030\064\351\067\311\173\051\307\204\174\157\104\025
-\057\354\141\131\004\311\105\313\242\326\122\242\174\177\051\222
-\326\112\305\213\102\250\324\376\352\330\307\207\043\030\344\235
-\172\175\163\100\122\230\240\256\156\343\005\077\005\017\340\245
-\306\155\115\355\203\067\210\234\307\363\334\102\232\152\266\327
-\041\111\066\167\362\357\030\117\305\160\331\236\351\336\267\053
-\213\364\274\176\050\337\015\100\311\205\134\256\235\305\061\377
-\320\134\016\265\250\176\360\351\057\272\257\210\256\345\265\321
-\130\245\257\234\161\247\051\001\220\203\151\067\202\005\272\374
-\011\301\010\156\214\170\073\303\063\002\200\077\104\205\010\035
-\337\125\126\010\255\054\205\055\135\261\003\341\256\252\164\305
-\244\363\116\272\067\230\173\202\271
-END
-
-# Trust for Certificate "Explicitly Distrusted DigiNotar PKIoverheid G2"
-# Issuer: CN=DigiNotar PKIoverheid CA Organisatie - G2,O=DigiNotar B.V.,C=NL
-# Serial Number: 268435455 (0xfffffff)
-# Subject: CN=DigiNotar PKIoverheid CA Organisatie - G2,O=DigiNotar B.V.,C=NL
-# Not Valid Before: Wed May 12 08:51:39 2010
-# Not Valid After : Mon Mar 23 09:50:05 2020
-# Fingerprint (MD5): 2E:61:A2:D1:78:CE:EE:BF:59:33:B0:23:14:0F:94:1C
-# Fingerprint (SHA1): D5:F2:57:A9:BF:2D:D0:3F:8B:46:57:F9:2B:C9:A4:C6:92:E1:42:42
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Explicitly Distrusted DigiNotar PKIoverheid G2"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\325\362\127\251\277\055\320\077\213\106\127\371\053\311\244\306
-\222\341\102\102
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\056\141\242\321\170\316\356\277\131\063\260\043\024\017\224\034
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\132\061\013\060\011\006\003\125\004\006\023\002\116\114\061
-\027\060\025\006\003\125\004\012\014\016\104\151\147\151\116\157
-\164\141\162\040\102\056\126\056\061\062\060\060\006\003\125\004
-\003\014\051\104\151\147\151\116\157\164\141\162\040\120\113\111
-\157\166\145\162\150\145\151\144\040\103\101\040\117\162\147\141
-\156\151\163\141\164\151\145\040\055\040\107\062
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\004\017\377\377\377
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
 #
 # Certificate "Security Communication RootCA2"
 #
@@ -8252,7 +7511,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: OU=Security Communication RootCA2,O="SECOM Trust Systems CO.,LTD.",C=JP
 # Not Valid Before: Fri May 29 05:00:39 2009
 # Not Valid After : Tue May 29 05:00:39 2029
-# Fingerprint (MD5): 6C:39:7D:A4:0E:55:59:B2:3F:D6:41:B1:12:50:DE:43
+# Fingerprint (SHA-256): 51:3B:2C:EC:B8:10:D4:CD:E5:DD:85:39:1A:DF:C6:C2:DD:60:D8:7B:B7:36:D2:B5:21:48:4A:A4:7A:0E:BE:F6
 # Fingerprint (SHA1): 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -8342,13 +7601,13 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for Certificate "Security Communication RootCA2"
+# Trust for "Security Communication RootCA2"
 # Issuer: OU=Security Communication RootCA2,O="SECOM Trust Systems CO.,LTD.",C=JP
 # Serial Number: 0 (0x0)
 # Subject: OU=Security Communication RootCA2,O="SECOM Trust Systems CO.,LTD.",C=JP
 # Not Valid Before: Fri May 29 05:00:39 2009
 # Not Valid After : Tue May 29 05:00:39 2029
-# Fingerprint (MD5): 6C:39:7D:A4:0E:55:59:B2:3F:D6:41:B1:12:50:DE:43
+# Fingerprint (SHA-256): 51:3B:2C:EC:B8:10:D4:CD:E5:DD:85:39:1A:DF:C6:C2:DD:60:D8:7B:B7:36:D2:B5:21:48:4A:A4:7A:0E:BE:F6
 # Fingerprint (SHA1): 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -8386,7 +7645,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=EC-ACC,OU=Jerarquia Entitats de Certificacio Catalanes,OU=Vegeu https://www.catcert.net/verarrel (c)03,OU=Serveis Publics de Certificacio,O=Agencia Catalana de Certificacio (NIF Q-0801176-I),C=ES
 # Not Valid Before: Tue Jan 07 23:00:00 2003
 # Not Valid After : Tue Jan 07 22:59:59 2031
-# Fingerprint (MD5): EB:F5:9D:29:0D:61:F9:42:1F:7C:C2:BA:6D:E3:15:09
+# Fingerprint (SHA-256): 88:49:7F:01:60:2F:31:54:24:6A:E2:8C:4D:5A:EF:10:F1:D8:7E:BB:76:62:6F:4A:E0:B7:F9:5B:A7:96:87:99
 # Fingerprint (SHA1): 28:90:3A:63:5B:52:80:FA:E6:77:4C:0B:6D:A7:D6:BA:A6:4A:F2:E8
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -8533,13 +7792,13 @@ CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL
 \062\062\060\070\063\061\060\060\060\060\060\060\132
 END
 
-# Trust for Certificate "EC-ACC"
+# Trust for "EC-ACC"
 # Issuer: CN=EC-ACC,OU=Jerarquia Entitats de Certificacio Catalanes,OU=Vegeu https://www.catcert.net/verarrel (c)03,OU=Serveis Publics de Certificacio,O=Agencia Catalana de Certificacio (NIF Q-0801176-I),C=ES
 # Serial Number:ee:2b:3d:eb:d4:21:de:14:a8:62:ac:04:f3:dd:c4:01
 # Subject: CN=EC-ACC,OU=Jerarquia Entitats de Certificacio Catalanes,OU=Vegeu https://www.catcert.net/verarrel (c)03,OU=Serveis Publics de Certificacio,O=Agencia Catalana de Certificacio (NIF Q-0801176-I),C=ES
 # Not Valid Before: Tue Jan 07 23:00:00 2003
 # Not Valid After : Tue Jan 07 22:59:59 2031
-# Fingerprint (MD5): EB:F5:9D:29:0D:61:F9:42:1F:7C:C2:BA:6D:E3:15:09
+# Fingerprint (SHA-256): 88:49:7F:01:60:2F:31:54:24:6A:E2:8C:4D:5A:EF:10:F1:D8:7E:BB:76:62:6F:4A:E0:B7:F9:5B:A7:96:87:99
 # Fingerprint (SHA1): 28:90:3A:63:5B:52:80:FA:E6:77:4C:0B:6D:A7:D6:BA:A6:4A:F2:E8
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -8581,240 +7840,20 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Hellenic Academic and Research Institutions RootCA 2011"
+# Certificate "Actalis Authentication Root CA"
 #
-# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011,O=Hellenic Academic and Research Institutions Cert. Authority,C=GR
-# Serial Number: 0 (0x0)
-# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011,O=Hellenic Academic and Research Institutions Cert. Authority,C=GR
-# Not Valid Before: Tue Dec 06 13:49:52 2011
-# Not Valid After : Mon Dec 01 13:49:52 2031
-# Fingerprint (MD5): 73:9F:4C:4B:73:5B:79:E9:FA:BA:1C:EF:6E:CB:D5:C9
-# Fingerprint (SHA1): FE:45:65:9B:79:03:5B:98:A1:61:B5:51:2E:AC:DA:58:09:48:22:4D
+# Issuer: CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT
+# Serial Number:57:0a:11:97:42:c4:e3:cc
+# Subject: CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT
+# Not Valid Before: Thu Sep 22 11:22:02 2011
+# Not Valid After : Sun Sep 22 11:22:02 2030
+# Fingerprint (SHA-256): 55:92:60:84:EC:96:3A:64:B9:6E:2A:BE:01:CE:0B:A8:6A:64:FB:FE:BC:C7:AA:B5:AF:C1:55:B3:7F:D7:60:66
+# Fingerprint (SHA1): F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Hellenic Academic and Research Institutions RootCA 2011"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\201\225\061\013\060\011\006\003\125\004\006\023\002\107\122
-\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154\145
-\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144
-\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164
-\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165\164
-\150\157\162\151\164\171\061\100\060\076\006\003\125\004\003\023
-\067\110\145\154\154\145\156\151\143\040\101\143\141\144\145\155
-\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150\040
-\111\156\163\164\151\164\165\164\151\157\156\163\040\122\157\157
-\164\103\101\040\062\060\061\061
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\201\225\061\013\060\011\006\003\125\004\006\023\002\107\122
-\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154\145
-\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144
-\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164
-\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165\164
-\150\157\162\151\164\171\061\100\060\076\006\003\125\004\003\023
-\067\110\145\154\154\145\156\151\143\040\101\143\141\144\145\155
-\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150\040
-\111\156\163\164\151\164\165\164\151\157\156\163\040\122\157\157
-\164\103\101\040\062\060\061\061
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\001\000
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\004\061\060\202\003\031\240\003\002\001\002\002\001\000
-\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060
-\201\225\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\104\060\102\006\003\125\004\012\023\073\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\145\162\164\056\040\101\165\164\150
-\157\162\151\164\171\061\100\060\076\006\003\125\004\003\023\067
-\110\145\154\154\145\156\151\143\040\101\143\141\144\145\155\151
-\143\040\141\156\144\040\122\145\163\145\141\162\143\150\040\111
-\156\163\164\151\164\165\164\151\157\156\163\040\122\157\157\164
-\103\101\040\062\060\061\061\060\036\027\015\061\061\061\062\060
-\066\061\063\064\071\065\062\132\027\015\063\061\061\062\060\061
-\061\063\064\071\065\062\132\060\201\225\061\013\060\011\006\003
-\125\004\006\023\002\107\122\061\104\060\102\006\003\125\004\012
-\023\073\110\145\154\154\145\156\151\143\040\101\143\141\144\145
-\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150
-\040\111\156\163\164\151\164\165\164\151\157\156\163\040\103\145
-\162\164\056\040\101\165\164\150\157\162\151\164\171\061\100\060
-\076\006\003\125\004\003\023\067\110\145\154\154\145\156\151\143
-\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122\145
-\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164\151
-\157\156\163\040\122\157\157\164\103\101\040\062\060\061\061\060
-\202\001\042\060\015\006\011\052\206\110\206\367\015\001\001\001
-\005\000\003\202\001\017\000\060\202\001\012\002\202\001\001\000
-\251\123\000\343\056\246\366\216\372\140\330\055\225\076\370\054
-\052\124\116\315\271\204\141\224\130\117\217\075\213\344\103\363
-\165\211\215\121\344\303\067\322\212\210\115\171\036\267\022\335
-\103\170\112\212\222\346\327\110\325\017\244\072\051\104\065\270
-\007\366\150\035\125\315\070\121\360\214\044\061\205\257\203\311
-\175\351\167\257\355\032\173\235\027\371\263\235\070\120\017\246
-\132\171\221\200\257\067\256\246\323\061\373\265\046\011\235\074
-\132\357\121\305\053\337\226\135\353\062\036\002\332\160\111\354
-\156\014\310\232\067\215\367\361\066\140\113\046\054\202\236\320
-\170\363\015\017\143\244\121\060\341\371\053\047\022\007\330\352
-\275\030\142\230\260\131\067\175\276\356\363\040\121\102\132\203
-\357\223\272\151\025\361\142\235\237\231\071\202\241\267\164\056
-\213\324\305\013\173\057\360\310\012\332\075\171\012\232\223\034
-\245\050\162\163\221\103\232\247\321\115\205\204\271\251\164\217
-\024\100\307\334\336\254\101\144\154\264\031\233\002\143\155\044
-\144\217\104\262\045\352\316\135\164\014\143\062\134\215\207\345
-\002\003\001\000\001\243\201\211\060\201\206\060\017\006\003\125
-\035\023\001\001\377\004\005\060\003\001\001\377\060\013\006\003
-\125\035\017\004\004\003\002\001\006\060\035\006\003\125\035\016
-\004\026\004\024\246\221\102\375\023\141\112\043\236\010\244\051
-\345\330\023\004\043\356\101\045\060\107\006\003\125\035\036\004
-\100\060\076\240\074\060\005\202\003\056\147\162\060\005\202\003
-\056\145\165\060\006\202\004\056\145\144\165\060\006\202\004\056
-\157\162\147\060\005\201\003\056\147\162\060\005\201\003\056\145
-\165\060\006\201\004\056\145\144\165\060\006\201\004\056\157\162
-\147\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000
-\003\202\001\001\000\037\357\171\101\341\173\156\077\262\214\206
-\067\102\112\116\034\067\036\215\146\272\044\201\311\117\022\017
-\041\300\003\227\206\045\155\135\323\042\051\250\154\242\015\251
-\353\075\006\133\231\072\307\314\303\232\064\177\253\016\310\116
-\034\341\372\344\334\315\015\276\277\044\376\154\347\153\302\015
-\310\006\236\116\215\141\050\246\152\375\345\366\142\352\030\074
-\116\240\123\235\262\072\234\353\245\234\221\026\266\115\202\340
-\014\005\110\251\154\365\314\370\313\235\111\264\360\002\245\375
-\160\003\355\212\041\245\256\023\206\111\303\063\163\276\207\073
-\164\213\027\105\046\114\026\221\203\376\147\175\315\115\143\147
-\372\363\003\022\226\170\006\215\261\147\355\216\077\276\237\117
-\002\365\263\011\057\363\114\207\337\052\313\225\174\001\314\254
-\066\172\277\242\163\172\367\217\301\265\232\241\024\262\217\063
-\237\015\357\042\334\146\173\204\275\105\027\006\075\074\312\271
-\167\064\217\312\352\317\077\061\076\343\210\343\200\111\045\310
-\227\265\235\232\231\115\260\074\370\112\000\233\144\335\237\071
-\113\321\047\327\270
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for Certificate "Hellenic Academic and Research Institutions RootCA 2011"
-# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011,O=Hellenic Academic and Research Institutions Cert. Authority,C=GR
-# Serial Number: 0 (0x0)
-# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011,O=Hellenic Academic and Research Institutions Cert. Authority,C=GR
-# Not Valid Before: Tue Dec 06 13:49:52 2011
-# Not Valid After : Mon Dec 01 13:49:52 2031
-# Fingerprint (MD5): 73:9F:4C:4B:73:5B:79:E9:FA:BA:1C:EF:6E:CB:D5:C9
-# Fingerprint (SHA1): FE:45:65:9B:79:03:5B:98:A1:61:B5:51:2E:AC:DA:58:09:48:22:4D
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Hellenic Academic and Research Institutions RootCA 2011"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\376\105\145\233\171\003\133\230\241\141\265\121\056\254\332\130
-\011\110\042\115
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\163\237\114\113\163\133\171\351\372\272\034\357\156\313\325\311
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\201\225\061\013\060\011\006\003\125\004\006\023\002\107\122
-\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154\145
-\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144
-\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164
-\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165\164
-\150\157\162\151\164\171\061\100\060\076\006\003\125\004\003\023
-\067\110\145\154\154\145\156\151\143\040\101\143\141\144\145\155
-\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150\040
-\111\156\163\164\151\164\165\164\151\157\156\163\040\122\157\157
-\164\103\101\040\062\060\061\061
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\001\000
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
-# Explicitly Distrust "MITM subCA 1 issued by Trustwave", Bug 724929
-# Issuer: E=ca@trustwave.com,CN="Trustwave Organization Issuing CA, Level 2",O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Serial Number: 1800000005 (0x6b49d205)
-# Not Before: Apr  7 15:37:15 2011 GMT
-# Not After : Apr  4 15:37:15 2021 GMT
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "MITM subCA 1 issued by Trustwave"
-CKA_ISSUER MULTILINE_OCTAL
-\060\201\253\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\063\060\061\006\003\125\004
-\003\023\052\124\162\165\163\164\167\141\166\145\040\117\162\147
-\141\156\151\172\141\164\151\157\156\040\111\163\163\165\151\156
-\147\040\103\101\054\040\114\145\166\145\154\040\062\061\037\060
-\035\006\011\052\206\110\206\367\015\001\011\001\026\020\143\141
-\100\164\162\165\163\164\167\141\166\145\056\143\157\155
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\004\153\111\322\005
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
-# Explicitly Distrust "MITM subCA 2 issued by Trustwave", Bug 724929
-# Issuer: E=ca@trustwave.com,CN="Trustwave Organization Issuing CA, Level 2",O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Serial Number: 1800000006 (0x6b49d206)
-# Not Before: Apr 18 21:09:30 2011 GMT
-# Not After : Apr 15 21:09:30 2021 GMT
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "MITM subCA 2 issued by Trustwave"
-CKA_ISSUER MULTILINE_OCTAL
-\060\201\253\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\063\060\061\006\003\125\004
-\003\023\052\124\162\165\163\164\167\141\166\145\040\117\162\147
-\141\156\151\172\141\164\151\157\156\040\111\163\163\165\151\156
-\147\040\103\101\054\040\114\145\166\145\154\040\062\061\037\060
-\035\006\011\052\206\110\206\367\015\001\011\001\026\020\143\141
-\100\164\162\165\163\164\167\141\166\145\056\143\157\155
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\004\153\111\322\006
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
-#
-# Certificate "Actalis Authentication Root CA"
-#
-# Issuer: CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT
-# Serial Number:57:0a:11:97:42:c4:e3:cc
-# Subject: CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT
-# Not Valid Before: Thu Sep 22 11:22:02 2011
-# Not Valid After : Sun Sep 22 11:22:02 2030
-# Fingerprint (MD5): 69:C1:0D:4F:07:A3:1B:C3:FE:56:3D:04:BC:11:F6:A6
-# Fingerprint (SHA1): F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Actalis Authentication Root CA"
+CKA_LABEL UTF8 "Actalis Authentication Root CA"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
 \060\153\061\013\060\011\006\003\125\004\006\023\002\111\124\061
@@ -8942,7 +7981,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT
 # Not Valid Before: Thu Sep 22 11:22:02 2011
 # Not Valid After : Sun Sep 22 11:22:02 2030
-# Fingerprint (MD5): 69:C1:0D:4F:07:A3:1B:C3:FE:56:3D:04:BC:11:F6:A6
+# Fingerprint (SHA-256): 55:92:60:84:EC:96:3A:64:B9:6E:2A:BE:01:CE:0B:A8:6A:64:FB:FE:BC:C7:AA:B5:AF:C1:55:B3:7F:D7:60:66
 # Fingerprint (SHA1): F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -8981,7 +8020,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO
 # Not Valid Before: Tue Oct 26 08:38:03 2010
 # Not Valid After : Fri Oct 26 08:38:03 2040
-# Fingerprint (MD5): 46:A7:D2:FE:45:FB:64:5A:A8:59:90:9B:78:44:9B:29
+# Fingerprint (SHA-256): 9A:11:40:25:19:7C:5B:B9:5D:94:E6:3D:55:CD:43:79:08:47:B6:46:B2:3C:DF:11:AD:A4:A0:0E:FF:15:FB:48
 # Fingerprint (SHA1): 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9105,7 +8144,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO
 # Not Valid Before: Tue Oct 26 08:38:03 2010
 # Not Valid After : Fri Oct 26 08:38:03 2040
-# Fingerprint (MD5): 46:A7:D2:FE:45:FB:64:5A:A8:59:90:9B:78:44:9B:29
+# Fingerprint (SHA-256): 9A:11:40:25:19:7C:5B:B9:5D:94:E6:3D:55:CD:43:79:08:47:B6:46:B2:3C:DF:11:AD:A4:A0:0E:FF:15:FB:48
 # Fingerprint (SHA1): 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9142,7 +8181,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO
 # Not Valid Before: Tue Oct 26 08:28:58 2010
 # Not Valid After : Fri Oct 26 08:28:58 2040
-# Fingerprint (MD5): 3D:3B:18:9E:2C:64:5A:E8:D5:88:CE:0E:F9:37:C2:EC
+# Fingerprint (SHA-256): ED:F7:EB:BC:A2:7A:2A:38:4D:38:7B:7D:40:10:C6:66:E2:ED:B4:84:3E:4C:29:B4:AE:1D:5B:93:32:E6:B2:4D
 # Fingerprint (SHA1): DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9266,7 +8305,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO
 # Not Valid Before: Tue Oct 26 08:28:58 2010
 # Not Valid After : Fri Oct 26 08:28:58 2040
-# Fingerprint (MD5): 3D:3B:18:9E:2C:64:5A:E8:D5:88:CE:0E:F9:37:C2:EC
+# Fingerprint (SHA-256): ED:F7:EB:BC:A2:7A:2A:38:4D:38:7B:7D:40:10:C6:66:E2:ED:B4:84:3E:4C:29:B4:AE:1D:5B:93:32:E6:B2:4D
 # Fingerprint (SHA1): DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9303,7 +8342,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=T-TeleSec GlobalRoot Class 3,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE
 # Not Valid Before: Wed Oct 01 10:29:56 2008
 # Not Valid After : Sat Oct 01 23:59:59 2033
-# Fingerprint (MD5): CA:FB:40:A8:4E:39:92:8A:1D:FE:8E:2F:C4:27:EA:EF
+# Fingerprint (SHA-256): FD:73:DA:D3:1C:64:4F:F1:B4:3B:EF:0C:CD:DA:96:71:0B:9C:D9:87:5E:CA:7E:31:70:7A:F3:E9:6D:52:2B:BD
 # Fingerprint (SHA1): 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9410,7 +8449,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=T-TeleSec GlobalRoot Class 3,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE
 # Not Valid Before: Wed Oct 01 10:29:56 2008
 # Not Valid After : Sat Oct 01 23:59:59 2033
-# Fingerprint (MD5): CA:FB:40:A8:4E:39:92:8A:1D:FE:8E:2F:C4:27:EA:EF
+# Fingerprint (SHA-256): FD:73:DA:D3:1C:64:4F:F1:B4:3B:EF:0C:CD:DA:96:71:0B:9C:D9:87:5E:CA:7E:31:70:7A:F3:E9:6D:52:2B:BD
 # Fingerprint (SHA1): 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9443,74 +8482,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
-# Explicitly Distrust "TURKTRUST Mis-issued Intermediate CA 1", Bug 825022
-# Issuer: O=T..RKTRUST Bilgi ..leti..im ve Bili..im G..venli..i Hizmetleri A...,C=TR,CN=T..RKTRUST Elektronik Sunucu Sertifikas.. Hizmetleri
-# Serial Number: 2087 (0x827)
-# Subject: CN=*.EGO.GOV.TR,OU=EGO BILGI ISLEM,O=EGO,L=ANKARA,ST=ANKARA,C=TR
-# Not Valid Before: Mon Aug 08 07:07:51 2011
-# Not Valid After : Tue Jul 06 07:07:51 2021
-# Fingerprint (MD5): F8:F5:25:FF:0C:31:CF:85:E1:0C:86:17:C1:CE:1F:8E
-# Fingerprint (SHA1): C6:9F:28:C8:25:13:9E:65:A6:46:C4:34:AC:A5:A1:D2:00:29:5D:B1
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "TURKTRUST Mis-issued Intermediate CA 1"
-CKA_ISSUER MULTILINE_OCTAL
-\060\201\254\061\075\060\073\006\003\125\004\003\014\064\124\303
-\234\122\113\124\122\125\123\124\040\105\154\145\153\164\162\157
-\156\151\153\040\123\165\156\165\143\165\040\123\145\162\164\151
-\146\151\153\141\163\304\261\040\110\151\172\155\145\164\154\145
-\162\151\061\013\060\011\006\003\125\004\006\023\002\124\122\061
-\136\060\134\006\003\125\004\012\014\125\124\303\234\122\113\124
-\122\125\123\124\040\102\151\154\147\151\040\304\260\154\145\164
-\151\305\237\151\155\040\166\145\040\102\151\154\151\305\237\151
-\155\040\107\303\274\166\145\156\154\151\304\237\151\040\110\151
-\172\155\145\164\154\145\162\151\040\101\056\305\236\056\040\050
-\143\051\040\113\141\163\304\261\155\040\040\062\060\060\065
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\002\010\047
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
-# Explicitly Distrust "TURKTRUST Mis-issued Intermediate CA 2", Bug 825022
-# Issuer: O=T..RKTRUST Bilgi ..leti..im ve Bili..im G..venli..i Hizmetleri A...,C=TR,CN=T..RKTRUST Elektronik Sunucu Sertifikas.. Hizmetleri
-# Serial Number: 2148 (0x864)
-# Subject: E=ileti@kktcmerkezbankasi.org,CN=e-islem.kktcmerkezbankasi.org,O=KKTC Merkez Bankasi,L=Lefkosa,ST=Lefkosa,C=TR
-# Not Valid Before: Mon Aug 08 07:07:51 2011
-# Not Valid After : Thu Aug 05 07:07:51 2021
-# Fingerprint (MD5): BF:C3:EC:AD:0F:42:4F:B4:B5:38:DB:35:BF:AD:84:A2
-# Fingerprint (SHA1): F9:2B:E5:26:6C:C0:5D:B2:DC:0D:C3:F2:DC:74:E0:2D:EF:D9:49:CB
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "TURKTRUST Mis-issued Intermediate CA 2"
-CKA_ISSUER MULTILINE_OCTAL
-\060\201\254\061\075\060\073\006\003\125\004\003\014\064\124\303
-\234\122\113\124\122\125\123\124\040\105\154\145\153\164\162\157
-\156\151\153\040\123\165\156\165\143\165\040\123\145\162\164\151
-\146\151\153\141\163\304\261\040\110\151\172\155\145\164\154\145
-\162\151\061\013\060\011\006\003\125\004\006\023\002\124\122\061
-\136\060\134\006\003\125\004\012\014\125\124\303\234\122\113\124
-\122\125\123\124\040\102\151\154\147\151\040\304\260\154\145\164
-\151\305\237\151\155\040\166\145\040\102\151\154\151\305\237\151
-\155\040\107\303\274\166\145\156\154\151\304\237\151\040\110\151
-\172\155\145\164\154\145\162\151\040\101\056\305\236\056\040\050
-\143\051\040\113\141\163\304\261\155\040\040\062\060\060\065
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\002\010\144
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_NOT_TRUSTED
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
 #
 # Certificate "D-TRUST Root Class 3 CA 2 2009"
 #
@@ -9519,7 +8490,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=D-TRUST Root Class 3 CA 2 2009,O=D-Trust GmbH,C=DE
 # Not Valid Before: Thu Nov 05 08:35:58 2009
 # Not Valid After : Mon Nov 05 08:35:58 2029
-# Fingerprint (MD5): CD:E0:25:69:8D:47:AC:9C:89:35:90:F7:FD:51:3D:2F
+# Fingerprint (SHA-256): 49:E7:A4:42:AC:F0:EA:62:87:05:00:54:B5:25:64:B6:50:E4:F4:9E:42:E3:48:D6:AA:38:E0:39:E9:57:B1:C1
 # Fingerprint (SHA1): 58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9625,7 +8596,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=D-TRUST Root Class 3 CA 2 2009,O=D-Trust GmbH,C=DE
 # Not Valid Before: Thu Nov 05 08:35:58 2009
 # Not Valid After : Mon Nov 05 08:35:58 2029
-# Fingerprint (MD5): CD:E0:25:69:8D:47:AC:9C:89:35:90:F7:FD:51:3D:2F
+# Fingerprint (SHA-256): 49:E7:A4:42:AC:F0:EA:62:87:05:00:54:B5:25:64:B6:50:E4:F4:9E:42:E3:48:D6:AA:38:E0:39:E9:57:B1:C1
 # Fingerprint (SHA1): 58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9662,7 +8633,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009,O=D-Trust GmbH,C=DE
 # Not Valid Before: Thu Nov 05 08:50:46 2009
 # Not Valid After : Mon Nov 05 08:50:46 2029
-# Fingerprint (MD5): AA:C6:43:2C:5E:2D:CD:C4:34:C0:50:4F:11:02:4F:B6
+# Fingerprint (SHA-256): EE:C5:49:6B:98:8C:E9:86:25:B9:34:09:2E:EC:29:08:BE:D0:B0:F3:16:C2:D4:73:0C:84:EA:F1:F3:D3:48:81
 # Fingerprint (SHA1): 96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9771,7 +8742,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009,O=D-Trust GmbH,C=DE
 # Not Valid Before: Thu Nov 05 08:50:46 2009
 # Not Valid After : Mon Nov 05 08:50:46 2029
-# Fingerprint (MD5): AA:C6:43:2C:5E:2D:CD:C4:34:C0:50:4F:11:02:4F:B6
+# Fingerprint (SHA-256): EE:C5:49:6B:98:8C:E9:86:25:B9:34:09:2E:EC:29:08:BE:D0:B0:F3:16:C2:D4:73:0C:84:EA:F1:F3:D3:48:81
 # Fingerprint (SHA1): 96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9809,7 +8780,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=CA Disig Root R2,O=Disig a.s.,L=Bratislava,C=SK
 # Not Valid Before: Thu Jul 19 09:15:30 2012
 # Not Valid After : Sat Jul 19 09:15:30 2042
-# Fingerprint (MD5): 26:01:FB:D8:27:A7:17:9A:45:54:38:1A:43:01:3B:03
+# Fingerprint (SHA-256): E2:3D:4A:03:6D:7B:70:E9:F5:95:B1:42:20:79:D2:B9:1E:DF:BB:1F:B6:51:A0:63:3E:AA:8A:9D:C5:F8:07:03
 # Fingerprint (SHA1): B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9936,7 +8907,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=CA Disig Root R2,O=Disig a.s.,L=Bratislava,C=SK
 # Not Valid Before: Thu Jul 19 09:15:30 2012
 # Not Valid After : Sat Jul 19 09:15:30 2042
-# Fingerprint (MD5): 26:01:FB:D8:27:A7:17:9A:45:54:38:1A:43:01:3B:03
+# Fingerprint (SHA-256): E2:3D:4A:03:6D:7B:70:E9:F5:95:B1:42:20:79:D2:B9:1E:DF:BB:1F:B6:51:A0:63:3E:AA:8A:9D:C5:F8:07:03
 # Fingerprint (SHA1): B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -9974,7 +8945,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: C=ES,O=ACCV,OU=PKIACCV,CN=ACCVRAIZ1
 # Not Valid Before: Thu May 05 09:37:37 2011
 # Not Valid After : Tue Dec 31 09:37:37 2030
-# Fingerprint (MD5): D0:A0:5A:EE:05:B6:09:94:21:A1:7D:F1:B2:29:82:02
+# Fingerprint (SHA-256): 9A:6E:C0:12:E1:A7:DA:9D:BE:34:19:4D:47:8A:D7:C0:DB:18:22:FB:07:1D:F1:29:81:49:6E:D1:04:38:41:13
 # Fingerprint (SHA1): 93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10138,7 +9109,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: C=ES,O=ACCV,OU=PKIACCV,CN=ACCVRAIZ1
 # Not Valid Before: Thu May 05 09:37:37 2011
 # Not Valid After : Tue Dec 31 09:37:37 2030
-# Fingerprint (MD5): D0:A0:5A:EE:05:B6:09:94:21:A1:7D:F1:B2:29:82:02
+# Fingerprint (SHA-256): 9A:6E:C0:12:E1:A7:DA:9D:BE:34:19:4D:47:8A:D7:C0:DB:18:22:FB:07:1D:F1:29:81:49:6E:D1:04:38:41:13
 # Fingerprint (SHA1): 93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10175,7 +9146,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW
 # Not Valid Before: Wed Jun 27 06:28:33 2012
 # Not Valid After : Tue Dec 31 15:59:59 2030
-# Fingerprint (MD5): F9:03:7E:CF:E6:9E:3C:73:7A:2A:90:07:69:FF:2B:96
+# Fingerprint (SHA-256): 59:76:90:07:F7:68:5D:0F:CD:50:87:2F:9F:95:D5:75:5A:5B:2B:45:7D:81:F3:69:2B:61:0A:98:67:2F:0E:1B
 # Fingerprint (SHA1): 9C:BB:48:53:F6:A4:F6:D3:52:A4:E8:32:52:55:60:13:F5:AD:AF:65
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10300,7 +9271,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW
 # Not Valid Before: Wed Jun 27 06:28:33 2012
 # Not Valid After : Tue Dec 31 15:59:59 2030
-# Fingerprint (MD5): F9:03:7E:CF:E6:9E:3C:73:7A:2A:90:07:69:FF:2B:96
+# Fingerprint (SHA-256): 59:76:90:07:F7:68:5D:0F:CD:50:87:2F:9F:95:D5:75:5A:5B:2B:45:7D:81:F3:69:2B:61:0A:98:67:2F:0E:1B
 # Fingerprint (SHA1): 9C:BB:48:53:F6:A4:F6:D3:52:A4:E8:32:52:55:60:13:F5:AD:AF:65
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10338,7 +9309,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=TeliaSonera Root CA v1,O=TeliaSonera
 # Not Valid Before: Thu Oct 18 12:00:50 2007
 # Not Valid After : Mon Oct 18 12:00:50 2032
-# Fingerprint (MD5): 37:41:49:1B:18:56:9A:26:F5:AD:C2:66:FB:40:A5:4C
+# Fingerprint (SHA-256): DD:69:36:FE:21:F8:F0:77:C1:23:A1:A5:21:C1:22:24:F7:22:55:B7:3E:03:A7:26:06:93:E8:A2:4B:0F:A3:89
 # Fingerprint (SHA1): 43:13:BB:96:F1:D5:86:9B:C1:4E:6A:92:F6:CF:F6:34:69:87:82:37
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10459,7 +9430,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=TeliaSonera Root CA v1,O=TeliaSonera
 # Not Valid Before: Thu Oct 18 12:00:50 2007
 # Not Valid After : Mon Oct 18 12:00:50 2032
-# Fingerprint (MD5): 37:41:49:1B:18:56:9A:26:F5:AD:C2:66:FB:40:A5:4C
+# Fingerprint (SHA-256): DD:69:36:FE:21:F8:F0:77:C1:23:A1:A5:21:C1:22:24:F7:22:55:B7:3E:03:A7:26:06:93:E8:A2:4B:0F:A3:89
 # Fingerprint (SHA1): 43:13:BB:96:F1:D5:86:9B:C1:4E:6A:92:F6:CF:F6:34:69:87:82:37
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10496,7 +9467,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=E-Tugra Certification Authority,OU=E-Tugra Sertifikasyon Merkezi,O=E-Tu..ra EBG Bili..im Teknolojileri ve Hizmetleri A....,L=Ankara,C=TR
 # Not Valid Before: Tue Mar 05 12:09:48 2013
 # Not Valid After : Fri Mar 03 12:09:48 2023
-# Fingerprint (MD5): B8:A1:03:63:B0:BD:21:71:70:8A:6F:13:3A:BB:79:49
+# Fingerprint (SHA-256): B0:BF:D5:2B:B0:D7:D9:BD:92:BF:5D:4D:C1:3D:A2:55:C0:2C:54:2F:37:83:65:EA:89:39:11:F5:5E:55:F2:3C
 # Fingerprint (SHA1): 51:C6:E7:08:49:06:6E:F3:92:D4:5C:A0:0D:6D:A3:62:8F:C3:52:39
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10649,7 +9620,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=E-Tugra Certification Authority,OU=E-Tugra Sertifikasyon Merkezi,O=E-Tu..ra EBG Bili..im Teknolojileri ve Hizmetleri A....,L=Ankara,C=TR
 # Not Valid Before: Tue Mar 05 12:09:48 2013
 # Not Valid After : Fri Mar 03 12:09:48 2023
-# Fingerprint (MD5): B8:A1:03:63:B0:BD:21:71:70:8A:6F:13:3A:BB:79:49
+# Fingerprint (SHA-256): B0:BF:D5:2B:B0:D7:D9:BD:92:BF:5D:4D:C1:3D:A2:55:C0:2C:54:2F:37:83:65:EA:89:39:11:F5:5E:55:F2:3C
 # Fingerprint (SHA1): 51:C6:E7:08:49:06:6E:F3:92:D4:5C:A0:0D:6D:A3:62:8F:C3:52:39
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10693,7 +9664,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE
 # Not Valid Before: Wed Oct 01 10:40:14 2008
 # Not Valid After : Sat Oct 01 23:59:59 2033
-# Fingerprint (MD5): 2B:9B:9E:E4:7B:6C:1F:00:72:1A:CC:C1:77:79:DF:6A
+# Fingerprint (SHA-256): 91:E2:F5:78:8D:58:10:EB:A7:BA:58:73:7D:E1:54:8A:8E:CA:CD:01:45:98:BC:0B:14:3E:04:1B:17:05:25:52
 # Fingerprint (SHA1): 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10800,7 +9771,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE
 # Not Valid Before: Wed Oct 01 10:40:14 2008
 # Not Valid After : Sat Oct 01 23:59:59 2033
-# Fingerprint (MD5): 2B:9B:9E:E4:7B:6C:1F:00:72:1A:CC:C1:77:79:DF:6A
+# Fingerprint (SHA-256): 91:E2:F5:78:8D:58:10:EB:A7:BA:58:73:7D:E1:54:8A:8E:CA:CD:01:45:98:BC:0B:14:3E:04:1B:17:05:25:52
 # Fingerprint (SHA1): 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10841,7 +9812,7 @@ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 # Subject: C=DE,O=Atos,CN=Atos TrustedRoot 2011
 # Not Valid Before: Thu Jul 07 14:58:30 2011
 # Not Valid After : Tue Dec 31 23:59:59 2030
-# Fingerprint (MD5): AE:B9:C4:32:4B:AC:7F:5D:66:CC:77:94:BB:2A:77:56
+# Fingerprint (SHA-256): F3:56:BE:A2:44:B7:A9:1E:B3:5D:53:CA:9A:D7:86:4A:CE:01:8E:2D:35:D5:F8:F9:6D:DF:68:A6:F4:1A:A4:74
 # Fingerprint (SHA1): 2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -10933,7 +9904,7 @@ CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 # Subject: C=DE,O=Atos,CN=Atos TrustedRoot 2011
 # Not Valid Before: Thu Jul 07 14:58:30 2011
 # Not Valid After : Tue Dec 31 23:59:59 2030
-# Fingerprint (MD5): AE:B9:C4:32:4B:AC:7F:5D:66:CC:77:94:BB:2A:77:56
+# Fingerprint (SHA-256): F3:56:BE:A2:44:B7:A9:1E:B3:5D:53:CA:9A:D7:86:4A:CE:01:8E:2D:35:D5:F8:F9:6D:DF:68:A6:F4:1A:A4:74
 # Fingerprint (SHA1): 2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
@@ -12646,117 +11617,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
-#
-# Certificate "GlobalSign ECC Root CA - R4"
-#
-# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4
-# Serial Number:2a:38:a4:1c:96:0a:04:de:42:b2:28:a5:0b:e8:34:98:02
-# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4
-# Not Valid Before: Tue Nov 13 00:00:00 2012
-# Not Valid After : Tue Jan 19 03:14:07 2038
-# Fingerprint (SHA-256): BE:C9:49:11:C2:95:56:76:DB:6C:0A:55:09:86:D7:6E:3B:A0:05:66:7C:44:2C:97:62:B4:FB:B7:73:DE:22:8C
-# Fingerprint (SHA1): 69:69:56:2E:40:80:F4:24:A1:E7:19:9F:14:BA:F3:EE:58:AB:6A:BB
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign ECC Root CA - R4"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157
-\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164
-\040\103\101\040\055\040\122\064\061\023\060\021\006\003\125\004
-\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060
-\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151
-\147\156
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157
-\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164
-\040\103\101\040\055\040\122\064\061\023\060\021\006\003\125\004
-\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060
-\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151
-\147\156
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\021\052\070\244\034\226\012\004\336\102\262\050\245\013\350
-\064\230\002
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\001\341\060\202\001\207\240\003\002\001\002\002\021\052
-\070\244\034\226\012\004\336\102\262\050\245\013\350\064\230\002
-\060\012\006\010\052\206\110\316\075\004\003\002\060\120\061\044
-\060\042\006\003\125\004\013\023\033\107\154\157\142\141\154\123
-\151\147\156\040\105\103\103\040\122\157\157\164\040\103\101\040
-\055\040\122\064\061\023\060\021\006\003\125\004\012\023\012\107
-\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125
-\004\003\023\012\107\154\157\142\141\154\123\151\147\156\060\036
-\027\015\061\062\061\061\061\063\060\060\060\060\060\060\132\027
-\015\063\070\060\061\061\071\060\063\061\064\060\067\132\060\120
-\061\044\060\042\006\003\125\004\013\023\033\107\154\157\142\141
-\154\123\151\147\156\040\105\103\103\040\122\157\157\164\040\103
-\101\040\055\040\122\064\061\023\060\021\006\003\125\004\012\023
-\012\107\154\157\142\141\154\123\151\147\156\061\023\060\021\006
-\003\125\004\003\023\012\107\154\157\142\141\154\123\151\147\156
-\060\131\060\023\006\007\052\206\110\316\075\002\001\006\010\052
-\206\110\316\075\003\001\007\003\102\000\004\270\306\171\323\217
-\154\045\016\237\056\071\031\034\003\244\256\232\345\071\007\011
-\026\312\143\261\271\206\370\212\127\301\127\316\102\372\163\241
-\367\145\102\377\036\301\000\262\156\163\016\377\307\041\345\030
-\244\252\331\161\077\250\324\271\316\214\035\243\102\060\100\060
-\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060
-\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377
-\060\035\006\003\125\035\016\004\026\004\024\124\260\173\255\105
-\270\342\100\177\373\012\156\373\276\063\311\074\243\204\325\060
-\012\006\010\052\206\110\316\075\004\003\002\003\110\000\060\105
-\002\041\000\334\222\241\240\023\246\317\003\260\346\304\041\227
-\220\372\024\127\055\003\354\356\074\323\156\312\250\154\166\274
-\242\336\273\002\040\047\250\205\047\065\233\126\306\243\362\107
-\322\267\156\033\002\000\027\252\147\246\025\221\336\372\224\354
-\173\013\370\237\204
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for "GlobalSign ECC Root CA - R4"
-# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4
-# Serial Number:2a:38:a4:1c:96:0a:04:de:42:b2:28:a5:0b:e8:34:98:02
-# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4
-# Not Valid Before: Tue Nov 13 00:00:00 2012
-# Not Valid After : Tue Jan 19 03:14:07 2038
-# Fingerprint (SHA-256): BE:C9:49:11:C2:95:56:76:DB:6C:0A:55:09:86:D7:6E:3B:A0:05:66:7C:44:2C:97:62:B4:FB:B7:73:DE:22:8C
-# Fingerprint (SHA1): 69:69:56:2E:40:80:F4:24:A1:E7:19:9F:14:BA:F3:EE:58:AB:6A:BB
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign ECC Root CA - R4"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\151\151\126\056\100\200\364\044\241\347\031\237\024\272\363\356
-\130\253\152\273
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\040\360\047\150\321\176\240\235\016\346\052\312\337\134\211\216
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157
-\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164
-\040\103\101\040\055\040\122\064\061\023\060\021\006\003\125\004
-\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060
-\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151
-\147\156
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\021\052\070\244\034\226\012\004\336\102\262\050\245\013\350
-\064\230\002
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
 #
 # Certificate "GlobalSign ECC Root CA - R5"
 #
@@ -17845,325 +16705,321 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "GTS Root R1"
+# Certificate "UCA Global G2 Root"
 #
-# Issuer: CN=GTS Root R1,O=Google Trust Services LLC,C=US
-# Serial Number:6e:47:a9:c5:4b:47:0c:0d:ec:33:d0:89:b9:1c:f4:e1
-# Subject: CN=GTS Root R1,O=Google Trust Services LLC,C=US
-# Not Valid Before: Wed Jun 22 00:00:00 2016
-# Not Valid After : Sun Jun 22 00:00:00 2036
-# Fingerprint (SHA-256): 2A:57:54:71:E3:13:40:BC:21:58:1C:BD:2C:F1:3E:15:84:63:20:3E:CE:94:BC:F9:D3:CC:19:6B:F0:9A:54:72
-# Fingerprint (SHA1): E1:C9:50:E6:EF:22:F8:4C:56:45:72:8B:92:20:60:D7:D5:A7:A3:E8
+# Issuer: CN=UCA Global G2 Root,O=UniTrust,C=CN
+# Serial Number:5d:df:b1:da:5a:a3:ed:5d:be:5a:65:20:65:03:90:ef
+# Subject: CN=UCA Global G2 Root,O=UniTrust,C=CN
+# Not Valid Before: Fri Mar 11 00:00:00 2016
+# Not Valid After : Mon Dec 31 00:00:00 2040
+# Fingerprint (SHA-256): 9B:EA:11:C9:76:FE:01:47:64:C1:BE:56:A6:F9:14:B5:A5:60:31:7A:BD:99:88:39:33:82:E5:16:1A:A0:49:3C
+# Fingerprint (SHA1): 28:F9:78:16:19:7A:FF:18:25:18:AA:44:FE:C1:A0:CE:5C:B6:4C:8A
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GTS Root R1"
+CKA_LABEL UTF8 "UCA Global G2 Root"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\061
+\060\075\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
+\163\164\061\033\060\031\006\003\125\004\003\014\022\125\103\101
+\040\107\154\157\142\141\154\040\107\062\040\122\157\157\164
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\061
+\060\075\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
+\163\164\061\033\060\031\006\003\125\004\003\014\022\125\103\101
+\040\107\154\157\142\141\154\040\107\062\040\122\157\157\164
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\156\107\251\305\113\107\014\015\354\063\320\211\271\034
-\364\341
+\002\020\135\337\261\332\132\243\355\135\276\132\145\040\145\003
+\220\357
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\132\060\202\003\102\240\003\002\001\002\002\020\156
-\107\251\305\113\107\014\015\354\063\320\211\271\034\364\341\060
-\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\107
-\061\013\060\011\006\003\125\004\006\023\002\125\123\061\042\060
-\040\006\003\125\004\012\023\031\107\157\157\147\154\145\040\124
-\162\165\163\164\040\123\145\162\166\151\143\145\163\040\114\114
-\103\061\024\060\022\006\003\125\004\003\023\013\107\124\123\040
-\122\157\157\164\040\122\061\060\036\027\015\061\066\060\066\062
-\062\060\060\060\060\060\060\132\027\015\063\066\060\066\062\062
-\060\060\060\060\060\060\132\060\107\061\013\060\011\006\003\125
-\004\006\023\002\125\123\061\042\060\040\006\003\125\004\012\023
-\031\107\157\157\147\154\145\040\124\162\165\163\164\040\123\145
-\162\166\151\143\145\163\040\114\114\103\061\024\060\022\006\003
-\125\004\003\023\013\107\124\123\040\122\157\157\164\040\122\061
-\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
-\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
-\000\266\021\002\213\036\343\241\167\233\073\334\277\224\076\267
-\225\247\100\074\241\375\202\371\175\062\006\202\161\366\366\214
-\177\373\350\333\274\152\056\227\227\243\214\113\371\053\366\261
-\371\316\204\035\261\371\305\227\336\357\271\362\243\351\274\022
-\211\136\247\252\122\253\370\043\047\313\244\261\234\143\333\327
-\231\176\360\012\136\353\150\246\364\306\132\107\015\115\020\063
-\343\116\261\023\243\310\030\154\113\354\374\011\220\337\235\144
-\051\045\043\007\241\264\322\075\056\140\340\317\322\011\207\273
-\315\110\360\115\302\302\172\210\212\273\272\317\131\031\326\257
-\217\260\007\260\236\061\361\202\301\300\337\056\246\155\154\031
-\016\265\330\176\046\032\105\003\075\260\171\244\224\050\255\017
-\177\046\345\250\010\376\226\350\074\150\224\123\356\203\072\210
-\053\025\226\011\262\340\172\214\056\165\326\234\353\247\126\144
-\217\226\117\150\256\075\227\302\204\217\300\274\100\300\013\134
-\275\366\207\263\065\154\254\030\120\177\204\340\114\315\222\323
-\040\351\063\274\122\231\257\062\265\051\263\045\052\264\110\371
-\162\341\312\144\367\346\202\020\215\350\235\302\212\210\372\070
-\146\212\374\143\371\001\371\170\375\173\134\167\372\166\207\372
-\354\337\261\016\171\225\127\264\275\046\357\326\001\321\353\026
-\012\273\216\013\265\305\305\212\125\253\323\254\352\221\113\051
-\314\031\244\062\045\116\052\361\145\104\320\002\316\252\316\111
-\264\352\237\174\203\260\100\173\347\103\253\247\154\243\217\175
-\211\201\372\114\245\377\325\216\303\316\113\340\265\330\263\216
-\105\317\166\300\355\100\053\375\123\017\260\247\325\073\015\261
-\212\242\003\336\061\255\314\167\352\157\173\076\326\337\221\042
-\022\346\276\372\330\062\374\020\143\024\121\162\336\135\326\026
-\223\275\051\150\063\357\072\146\354\007\212\046\337\023\327\127
-\145\170\047\336\136\111\024\000\242\000\177\232\250\041\266\251
-\261\225\260\245\271\015\026\021\332\307\154\110\074\100\340\176
-\015\132\315\126\074\321\227\005\271\313\113\355\071\113\234\304
-\077\322\125\023\156\044\260\326\161\372\364\301\272\314\355\033
-\365\376\201\101\330\000\230\075\072\310\256\172\230\067\030\005
-\225\002\003\001\000\001\243\102\060\100\060\016\006\003\125\035
-\017\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035
-\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125
-\035\016\004\026\004\024\344\257\053\046\161\032\053\110\047\205
-\057\122\146\054\357\360\211\023\161\076\060\015\006\011\052\206
-\110\206\367\015\001\001\014\005\000\003\202\002\001\000\070\226
-\012\356\075\264\226\036\137\357\235\234\013\063\237\053\340\312
-\375\322\216\012\037\101\164\245\174\252\204\324\345\362\036\346
-\067\122\062\234\013\321\141\035\277\050\301\266\104\051\065\165
-\167\230\262\174\331\275\164\254\212\150\343\251\061\011\051\001
-\140\163\343\107\174\123\250\220\112\047\357\113\327\237\223\347
-\202\066\316\232\150\014\202\347\317\324\020\026\157\137\016\231
-\134\366\037\161\175\357\357\173\057\176\352\066\326\227\160\013
-\025\356\327\134\126\152\063\245\343\111\070\014\270\175\373\215
-\205\244\261\131\136\364\152\341\335\241\366\144\104\256\346\121
-\203\041\146\306\021\076\363\316\107\356\234\050\037\045\332\377
-\254\146\225\335\065\017\134\357\040\054\142\375\221\272\251\314
-\374\132\234\223\201\203\051\227\112\174\132\162\264\071\320\267
-\167\313\171\375\151\072\222\067\355\156\070\145\106\176\351\140
-\275\171\210\227\137\070\022\364\356\257\133\202\310\206\325\341
-\231\155\214\004\362\166\272\111\366\156\351\155\036\137\240\357
-\047\202\166\100\370\246\323\130\134\017\054\102\332\102\306\173
-\210\064\307\301\330\105\233\301\076\305\141\035\331\143\120\111
-\366\064\205\152\340\030\305\156\107\253\101\102\051\233\366\140
-\015\322\061\323\143\230\043\223\132\000\201\110\264\357\315\212
-\315\311\317\231\356\331\236\252\066\341\150\113\161\111\024\066
-\050\072\075\035\316\232\217\045\346\200\161\141\053\265\173\314
-\371\045\026\201\341\061\137\241\243\176\026\244\234\026\152\227
-\030\275\166\162\245\013\236\035\066\346\057\241\057\276\160\221
-\017\250\346\332\370\304\222\100\154\045\176\173\263\011\334\262
-\027\255\200\104\360\150\245\217\224\165\377\164\132\350\250\002
-\174\014\011\342\251\113\013\240\205\013\142\271\357\241\061\222
-\373\357\366\121\004\211\154\350\251\164\241\273\027\263\265\375
-\111\017\174\074\354\203\030\040\103\116\325\223\272\264\064\261
-\037\026\066\037\014\346\144\071\026\114\334\340\376\035\310\251
-\142\075\100\352\312\305\064\002\264\256\211\210\063\065\334\054
-\023\163\330\047\361\320\162\356\165\073\042\336\230\150\146\133
-\361\306\143\107\125\034\272\245\010\121\165\246\110\045
+\060\202\005\106\060\202\003\056\240\003\002\001\002\002\020\135
+\337\261\332\132\243\355\135\276\132\145\040\145\003\220\357\060
+\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\075
+\061\013\060\011\006\003\125\004\006\023\002\103\116\061\021\060
+\017\006\003\125\004\012\014\010\125\156\151\124\162\165\163\164
+\061\033\060\031\006\003\125\004\003\014\022\125\103\101\040\107
+\154\157\142\141\154\040\107\062\040\122\157\157\164\060\036\027
+\015\061\066\060\063\061\061\060\060\060\060\060\060\132\027\015
+\064\060\061\062\063\061\060\060\060\060\060\060\132\060\075\061
+\013\060\011\006\003\125\004\006\023\002\103\116\061\021\060\017
+\006\003\125\004\012\014\010\125\156\151\124\162\165\163\164\061
+\033\060\031\006\003\125\004\003\014\022\125\103\101\040\107\154
+\157\142\141\154\040\107\062\040\122\157\157\164\060\202\002\042
+\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003
+\202\002\017\000\060\202\002\012\002\202\002\001\000\305\346\053
+\157\174\357\046\005\047\243\201\044\332\157\313\001\371\231\232
+\251\062\302\042\207\141\101\221\073\313\303\150\033\006\305\114
+\251\053\301\147\027\042\035\053\355\371\051\211\223\242\170\275
+\222\153\240\243\015\242\176\312\223\263\246\321\214\065\325\165
+\371\027\366\317\105\305\345\172\354\167\223\240\217\043\256\016
+\032\003\177\276\324\320\355\056\173\253\106\043\133\377\054\346
+\124\172\224\300\052\025\360\311\215\260\172\073\044\341\327\150
+\342\061\074\006\063\106\266\124\021\246\245\057\042\124\052\130
+\015\001\002\361\372\025\121\147\154\300\372\327\266\033\177\321
+\126\210\057\032\072\215\073\273\202\021\340\107\000\320\122\207
+\253\373\206\176\017\044\153\100\235\064\147\274\215\307\055\206
+\157\171\076\216\251\074\027\113\177\260\231\343\260\161\140\334
+\013\365\144\303\316\103\274\155\161\271\322\336\047\133\212\350
+\330\306\256\341\131\175\317\050\055\065\270\225\126\032\361\262
+\130\113\267\022\067\310\174\263\355\113\200\341\215\372\062\043
+\266\157\267\110\225\010\261\104\116\205\214\072\002\124\040\057
+\337\277\127\117\073\072\220\041\327\301\046\065\124\040\354\307
+\077\107\354\357\132\277\113\172\301\255\073\027\120\134\142\330
+\017\113\112\334\053\372\156\274\163\222\315\354\307\120\350\101
+\226\327\251\176\155\330\351\035\217\212\265\271\130\222\272\112
+\222\053\014\126\375\200\353\010\360\136\051\156\033\034\014\257
+\217\223\211\255\333\275\243\236\041\312\211\031\354\337\265\303
+\032\353\026\376\170\066\114\326\156\320\076\027\034\220\027\153
+\046\272\373\172\057\277\021\034\030\016\055\163\003\217\240\345
+\065\240\132\342\114\165\035\161\341\071\070\123\170\100\314\203
+\223\327\012\236\235\133\217\212\344\345\340\110\344\110\262\107
+\315\116\052\165\052\173\362\042\366\311\276\011\221\226\127\172
+\210\210\254\356\160\254\371\334\051\343\014\034\073\022\116\104
+\326\247\116\260\046\310\363\331\032\227\221\150\352\357\215\106
+\006\322\126\105\130\232\074\014\017\203\270\005\045\303\071\317
+\073\244\064\211\267\171\022\057\107\305\347\251\227\151\374\246
+\167\147\265\337\173\361\172\145\025\344\141\126\145\002\003\001
+\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001\377
+\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377
+\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026
+\004\024\201\304\214\314\365\344\060\377\245\014\010\137\214\025
+\147\041\164\001\337\337\060\015\006\011\052\206\110\206\367\015
+\001\001\013\005\000\003\202\002\001\000\023\145\042\365\216\053
+\255\104\344\313\377\271\150\346\303\200\110\075\004\173\372\043
+\057\172\355\066\332\262\316\155\366\346\236\345\137\130\217\313
+\067\062\241\310\145\266\256\070\075\065\033\076\274\073\266\004
+\320\274\371\111\365\233\367\205\305\066\266\313\274\370\310\071
+\325\344\137\007\275\025\124\227\164\312\312\355\117\272\272\144
+\166\237\201\270\204\105\111\114\215\157\242\353\261\314\321\303
+\224\332\104\302\346\342\352\030\350\242\037\047\005\272\327\345
+\326\251\315\335\357\166\230\215\000\016\315\033\372\003\267\216
+\200\130\016\047\077\122\373\224\242\312\136\145\311\326\204\332
+\271\065\161\363\046\300\117\167\346\201\047\322\167\073\232\024
+\157\171\364\366\320\341\323\224\272\320\127\121\275\047\005\015
+\301\375\310\022\060\356\157\215\021\053\010\235\324\324\277\200
+\105\024\232\210\104\332\060\352\264\247\343\356\357\133\202\325
+\076\326\255\170\222\333\134\074\363\330\255\372\270\153\177\304
+\066\050\266\002\025\212\124\054\234\260\027\163\216\320\067\243
+\024\074\230\225\000\014\051\005\133\236\111\111\261\137\307\343
+\313\317\047\145\216\065\027\267\127\310\060\331\101\133\271\024
+\266\350\302\017\224\061\247\224\230\314\152\353\265\341\047\365
+\020\250\001\350\216\022\142\350\210\314\265\177\106\227\300\233
+\020\146\070\032\066\106\137\042\150\075\337\311\306\023\047\253
+\123\006\254\242\074\206\006\145\157\261\176\261\051\104\232\243
+\272\111\151\050\151\217\327\345\137\255\004\206\144\157\032\240
+\014\305\010\142\316\200\243\320\363\354\150\336\276\063\307\027
+\133\177\200\304\114\114\261\246\204\212\303\073\270\011\315\024
+\201\272\030\343\124\127\066\376\333\057\174\107\241\072\063\310
+\371\130\073\104\117\261\312\002\211\004\226\050\150\305\113\270
+\046\211\273\326\063\057\120\325\376\232\211\272\030\062\222\124
+\306\133\340\235\371\136\345\015\042\233\366\332\342\310\041\262
+\142\041\252\206\100\262\056\144\323\137\310\343\176\021\147\105
+\037\005\376\343\242\357\263\250\263\363\175\217\370\014\037\042
+\037\055\160\264\270\001\064\166\060\000\345\043\170\247\126\327
+\120\037\212\373\006\365\302\031\360\320
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "GTS Root R1"
-# Issuer: CN=GTS Root R1,O=Google Trust Services LLC,C=US
-# Serial Number:6e:47:a9:c5:4b:47:0c:0d:ec:33:d0:89:b9:1c:f4:e1
-# Subject: CN=GTS Root R1,O=Google Trust Services LLC,C=US
-# Not Valid Before: Wed Jun 22 00:00:00 2016
-# Not Valid After : Sun Jun 22 00:00:00 2036
-# Fingerprint (SHA-256): 2A:57:54:71:E3:13:40:BC:21:58:1C:BD:2C:F1:3E:15:84:63:20:3E:CE:94:BC:F9:D3:CC:19:6B:F0:9A:54:72
-# Fingerprint (SHA1): E1:C9:50:E6:EF:22:F8:4C:56:45:72:8B:92:20:60:D7:D5:A7:A3:E8
+# Trust for "UCA Global G2 Root"
+# Issuer: CN=UCA Global G2 Root,O=UniTrust,C=CN
+# Serial Number:5d:df:b1:da:5a:a3:ed:5d:be:5a:65:20:65:03:90:ef
+# Subject: CN=UCA Global G2 Root,O=UniTrust,C=CN
+# Not Valid Before: Fri Mar 11 00:00:00 2016
+# Not Valid After : Mon Dec 31 00:00:00 2040
+# Fingerprint (SHA-256): 9B:EA:11:C9:76:FE:01:47:64:C1:BE:56:A6:F9:14:B5:A5:60:31:7A:BD:99:88:39:33:82:E5:16:1A:A0:49:3C
+# Fingerprint (SHA1): 28:F9:78:16:19:7A:FF:18:25:18:AA:44:FE:C1:A0:CE:5C:B6:4C:8A
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GTS Root R1"
+CKA_LABEL UTF8 "UCA Global G2 Root"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\341\311\120\346\357\042\370\114\126\105\162\213\222\040\140\327
-\325\247\243\350
+\050\371\170\026\031\172\377\030\045\030\252\104\376\301\240\316
+\134\266\114\212
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\202\032\357\324\322\112\362\237\342\075\227\006\024\160\162\205
+\200\376\360\304\112\360\134\142\062\237\034\272\170\251\120\370
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\061
+\060\075\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
+\163\164\061\033\060\031\006\003\125\004\003\014\022\125\103\101
+\040\107\154\157\142\141\154\040\107\062\040\122\157\157\164
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\156\107\251\305\113\107\014\015\354\063\320\211\271\034
-\364\341
+\002\020\135\337\261\332\132\243\355\135\276\132\145\040\145\003
+\220\357
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "GTS Root R2"
+# Certificate "UCA Extended Validation Root"
 #
-# Issuer: CN=GTS Root R2,O=Google Trust Services LLC,C=US
-# Serial Number:6e:47:a9:c6:5a:b3:e7:20:c5:30:9a:3f:68:52:f2:6f
-# Subject: CN=GTS Root R2,O=Google Trust Services LLC,C=US
-# Not Valid Before: Wed Jun 22 00:00:00 2016
-# Not Valid After : Sun Jun 22 00:00:00 2036
-# Fingerprint (SHA-256): C4:5D:7B:B0:8E:6D:67:E6:2E:42:35:11:0B:56:4E:5F:78:FD:92:EF:05:8C:84:0A:EA:4E:64:55:D7:58:5C:60
-# Fingerprint (SHA1): D2:73:96:2A:2A:5E:39:9F:73:3F:E1:C7:1E:64:3F:03:38:34:FC:4D
+# Issuer: CN=UCA Extended Validation Root,O=UniTrust,C=CN
+# Serial Number:4f:d2:2b:8f:f5:64:c8:33:9e:4f:34:58:66:23:70:60
+# Subject: CN=UCA Extended Validation Root,O=UniTrust,C=CN
+# Not Valid Before: Fri Mar 13 00:00:00 2015
+# Not Valid After : Fri Dec 31 00:00:00 2038
+# Fingerprint (SHA-256): D4:3A:F9:B3:54:73:75:5C:96:84:FC:06:D7:D8:CB:70:EE:5C:28:E7:73:FB:29:4E:B4:1E:E7:17:22:92:4D:24
+# Fingerprint (SHA1): A3:A1:B0:6F:24:61:23:4A:E3:36:A5:C2:37:FC:A6:FF:DD:F0:D7:3A
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GTS Root R2"
+CKA_LABEL UTF8 "UCA Extended Validation Root"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\062
+\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
+\163\164\061\045\060\043\006\003\125\004\003\014\034\125\103\101
+\040\105\170\164\145\156\144\145\144\040\126\141\154\151\144\141
+\164\151\157\156\040\122\157\157\164
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\062
+\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
+\163\164\061\045\060\043\006\003\125\004\003\014\034\125\103\101
+\040\105\170\164\145\156\144\145\144\040\126\141\154\151\144\141
+\164\151\157\156\040\122\157\157\164
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\156\107\251\306\132\263\347\040\305\060\232\077\150\122
-\362\157
+\002\020\117\322\053\217\365\144\310\063\236\117\064\130\146\043
+\160\140
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\132\060\202\003\102\240\003\002\001\002\002\020\156
-\107\251\306\132\263\347\040\305\060\232\077\150\122\362\157\060
-\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\107
-\061\013\060\011\006\003\125\004\006\023\002\125\123\061\042\060
-\040\006\003\125\004\012\023\031\107\157\157\147\154\145\040\124
-\162\165\163\164\040\123\145\162\166\151\143\145\163\040\114\114
-\103\061\024\060\022\006\003\125\004\003\023\013\107\124\123\040
-\122\157\157\164\040\122\062\060\036\027\015\061\066\060\066\062
-\062\060\060\060\060\060\060\132\027\015\063\066\060\066\062\062
+\060\202\005\132\060\202\003\102\240\003\002\001\002\002\020\117
+\322\053\217\365\144\310\063\236\117\064\130\146\043\160\140\060
+\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\107
+\061\013\060\011\006\003\125\004\006\023\002\103\116\061\021\060
+\017\006\003\125\004\012\014\010\125\156\151\124\162\165\163\164
+\061\045\060\043\006\003\125\004\003\014\034\125\103\101\040\105
+\170\164\145\156\144\145\144\040\126\141\154\151\144\141\164\151
+\157\156\040\122\157\157\164\060\036\027\015\061\065\060\063\061
+\063\060\060\060\060\060\060\132\027\015\063\070\061\062\063\061
 \060\060\060\060\060\060\132\060\107\061\013\060\011\006\003\125
-\004\006\023\002\125\123\061\042\060\040\006\003\125\004\012\023
-\031\107\157\157\147\154\145\040\124\162\165\163\164\040\123\145
-\162\166\151\143\145\163\040\114\114\103\061\024\060\022\006\003
-\125\004\003\023\013\107\124\123\040\122\157\157\164\040\122\062
+\004\006\023\002\103\116\061\021\060\017\006\003\125\004\012\014
+\010\125\156\151\124\162\165\163\164\061\045\060\043\006\003\125
+\004\003\014\034\125\103\101\040\105\170\164\145\156\144\145\144
+\040\126\141\154\151\144\141\164\151\157\156\040\122\157\157\164
 \060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
 \001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
-\000\316\336\375\246\373\354\354\024\064\074\007\006\132\154\131
-\367\031\065\335\367\301\235\125\252\323\315\073\244\223\162\357
-\012\372\155\235\366\360\205\200\133\241\110\122\237\071\305\267
-\356\050\254\357\313\166\150\024\271\337\255\001\154\231\037\304
-\042\035\237\376\162\167\340\054\133\257\344\004\277\117\162\240
-\032\064\230\350\071\150\354\225\045\173\166\241\346\151\271\205
-\031\275\211\214\376\255\355\066\352\163\274\377\203\342\313\175
-\301\322\316\112\263\215\005\236\213\111\223\337\301\133\320\156
-\136\360\056\060\056\202\374\372\274\264\027\012\110\345\210\233
-\305\233\153\336\260\312\264\003\360\332\364\220\270\145\144\367
-\134\114\255\350\176\146\136\231\327\270\302\076\310\320\023\235
-\255\356\344\105\173\211\125\367\212\037\142\122\204\022\263\302
-\100\227\343\212\037\107\221\246\164\132\322\370\261\143\050\020
-\270\263\011\270\126\167\100\242\046\230\171\306\376\337\045\356
-\076\345\240\177\324\141\017\121\113\074\077\214\332\341\160\164
-\330\302\150\241\371\301\014\351\241\342\177\273\125\074\166\006
-\356\152\116\314\222\210\060\115\232\275\117\013\110\232\204\265
-\230\243\325\373\163\301\127\141\335\050\126\165\023\256\207\216
-\347\014\121\011\020\165\210\114\274\215\371\173\074\324\042\110
-\037\052\334\353\153\273\104\261\313\063\161\062\106\257\255\112
-\361\214\350\164\072\254\347\032\042\163\200\322\060\367\045\102
-\307\042\073\073\022\255\226\056\306\303\166\007\252\040\267\065
-\111\127\351\222\111\350\166\026\162\061\147\053\226\176\212\243
-\307\224\126\042\277\152\113\176\001\041\262\043\062\337\344\232
-\104\155\131\133\135\365\000\240\034\233\306\170\227\215\220\377
-\233\310\252\264\257\021\121\071\136\331\373\147\255\325\133\021
-\235\062\232\033\275\325\272\133\245\311\313\045\151\123\125\047
-\134\340\312\066\313\210\141\373\036\267\320\313\356\026\373\323
-\246\114\336\222\245\324\342\337\365\006\124\336\056\235\113\264
-\223\060\252\201\316\335\032\334\121\163\015\117\160\351\345\266
-\026\041\031\171\262\346\211\013\165\144\312\325\253\274\011\301
-\030\241\377\324\124\241\205\074\375\024\044\003\262\207\323\244
-\267\002\003\001\000\001\243\102\060\100\060\016\006\003\125\035
-\017\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035
-\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125
-\035\016\004\026\004\024\273\377\312\216\043\237\117\231\312\333
-\342\150\246\245\025\047\027\036\331\016\060\015\006\011\052\206
-\110\206\367\015\001\001\014\005\000\003\202\002\001\000\266\151
-\360\246\167\376\236\356\013\201\255\341\300\251\307\371\065\035
-\100\202\253\346\004\264\337\313\367\035\017\203\360\176\023\115
-\215\214\356\343\063\042\303\071\374\100\337\156\101\113\102\123
-\276\026\210\361\322\070\136\304\150\231\034\230\122\223\214\347
-\150\355\033\152\163\172\005\100\115\177\145\073\326\130\361\316
-\203\107\140\343\377\227\251\234\140\167\030\125\265\176\010\223
-\317\320\366\074\147\003\025\141\011\371\201\171\365\354\123\244
-\237\311\217\001\213\163\304\167\166\334\203\242\365\014\111\032
-\250\166\336\222\233\144\370\263\054\305\047\323\007\300\010\200
-\244\230\222\343\001\226\002\252\002\356\217\073\305\321\155\012
-\063\060\163\170\271\117\124\026\277\013\007\241\244\134\346\313
-\311\134\204\217\017\340\025\167\054\176\046\176\332\304\113\333
-\247\026\167\007\260\315\165\350\162\102\326\225\204\235\206\203
-\362\344\220\315\011\107\324\213\003\160\332\132\306\003\102\364
-\355\067\242\360\033\120\124\113\016\330\204\336\031\050\231\201
-\107\256\011\033\077\110\321\303\157\342\260\140\027\365\356\043
-\002\245\332\000\133\155\220\253\356\242\351\033\073\351\307\104
-\047\105\216\153\237\365\244\204\274\167\371\153\227\254\076\121
-\105\242\021\246\314\205\356\012\150\362\076\120\070\172\044\142
-\036\027\040\067\155\152\115\267\011\233\311\374\244\130\365\266
-\373\234\116\030\273\225\002\347\241\255\233\007\356\066\153\044
-\322\071\206\301\223\203\120\322\201\106\250\137\142\127\054\273
-\154\144\210\010\156\357\023\124\137\335\055\304\147\143\323\317
-\211\067\277\235\040\364\373\172\203\233\240\036\201\000\120\302
-\344\014\042\131\122\020\355\103\126\207\000\370\024\122\247\035
-\213\223\214\242\115\106\177\047\306\161\233\044\336\344\332\206
-\213\015\176\153\040\301\300\236\341\145\330\152\243\246\350\205
-\213\072\007\010\034\272\365\217\125\232\030\165\176\345\354\201
-\146\321\041\163\241\065\104\013\200\075\133\234\136\157\052\027
-\226\321\203\043\210\146\155\346\206\342\160\062\057\122\042\347
-\310\347\177\304\054\140\135\057\303\257\236\105\005\303\204\002
-\267\375\054\010\122\117\202\335\243\360\324\206\011\002
+\000\251\011\007\050\023\002\260\231\340\144\252\036\103\026\172
+\163\261\221\240\165\076\250\372\343\070\000\172\354\211\152\040
+\017\213\305\260\233\063\003\132\206\306\130\206\325\301\205\273
+\117\306\234\100\115\312\276\356\151\226\270\255\201\060\232\174
+\222\005\353\005\053\232\110\320\270\166\076\226\310\040\273\322
+\260\361\217\330\254\105\106\377\252\147\140\264\167\176\152\037
+\074\032\122\172\004\075\007\074\205\015\204\320\037\166\012\367
+\152\024\337\162\343\064\174\127\116\126\001\076\171\361\252\051
+\073\154\372\370\217\155\115\310\065\337\256\353\334\044\356\171
+\105\247\205\266\005\210\336\210\135\045\174\227\144\147\011\331
+\277\132\025\005\206\363\011\036\354\130\062\063\021\363\167\144
+\260\166\037\344\020\065\027\033\362\016\261\154\244\052\243\163
+\374\011\037\036\062\031\123\021\347\331\263\054\056\166\056\241
+\243\336\176\152\210\011\350\362\007\212\370\262\315\020\347\342
+\163\100\223\273\010\321\077\341\374\013\224\263\045\357\174\246
+\327\321\257\237\377\226\232\365\221\173\230\013\167\324\176\350
+\007\322\142\265\225\071\343\363\361\155\017\016\145\204\212\143
+\124\305\200\266\340\236\113\175\107\046\247\001\010\135\321\210
+\236\327\303\062\104\372\202\112\012\150\124\177\070\123\003\314
+\244\000\063\144\121\131\013\243\202\221\172\136\354\026\302\363
+\052\346\142\332\052\333\131\142\020\045\112\052\201\013\107\007
+\103\006\160\207\322\372\223\021\051\172\110\115\353\224\307\160
+\115\257\147\325\121\261\200\040\001\001\264\172\010\246\220\177
+\116\340\357\007\101\207\257\152\245\136\213\373\317\120\262\232
+\124\257\303\211\272\130\055\365\060\230\261\066\162\071\176\111
+\004\375\051\247\114\171\344\005\127\333\224\271\026\123\215\106
+\263\035\225\141\127\126\177\257\360\026\133\141\130\157\066\120
+\021\013\330\254\053\225\026\032\016\037\010\315\066\064\145\020
+\142\146\325\200\137\024\040\137\055\014\240\170\012\150\326\054
+\327\351\157\053\322\112\005\223\374\236\157\153\147\377\210\361
+\116\245\151\112\122\067\005\352\306\026\215\322\304\231\321\202
+\053\073\272\065\165\367\121\121\130\363\310\007\335\344\264\003
+\177\002\003\001\000\001\243\102\060\100\060\035\006\003\125\035
+\016\004\026\004\024\331\164\072\344\060\075\015\367\022\334\176
+\132\005\237\036\064\232\367\341\024\060\017\006\003\125\035\023
+\001\001\377\004\005\060\003\001\001\377\060\016\006\003\125\035
+\017\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206
+\110\206\367\015\001\001\013\005\000\003\202\002\001\000\066\215
+\227\314\102\025\144\051\067\233\046\054\326\373\256\025\151\054
+\153\032\032\367\137\266\371\007\114\131\352\363\311\310\271\256
+\314\272\056\172\334\300\365\260\055\300\073\257\237\160\005\021
+\152\237\045\117\001\051\160\343\345\014\341\352\132\174\334\111
+\273\301\036\052\201\365\026\113\162\221\310\242\061\271\252\332
+\374\235\037\363\135\100\002\023\374\116\034\006\312\263\024\220
+\124\027\031\022\032\361\037\327\014\151\132\366\161\170\364\224
+\175\221\013\216\354\220\124\216\274\157\241\114\253\374\164\144
+\375\161\232\370\101\007\241\315\221\344\074\232\340\233\062\071
+\163\253\052\325\151\310\170\221\046\061\175\342\307\060\361\374
+\024\170\167\022\016\023\364\335\026\224\277\113\147\173\160\123
+\205\312\260\273\363\070\115\054\220\071\300\015\302\135\153\351
+\342\345\325\210\215\326\054\277\253\033\276\265\050\207\022\027
+\164\156\374\175\374\217\320\207\046\260\033\373\271\154\253\342
+\236\075\025\301\073\056\147\002\130\221\237\357\370\102\037\054
+\267\150\365\165\255\317\265\366\377\021\175\302\360\044\245\255
+\323\372\240\074\251\372\135\334\245\240\357\104\244\276\326\350
+\345\344\023\226\027\173\006\076\062\355\307\267\102\274\166\243
+\330\145\070\053\070\065\121\041\016\016\157\056\064\023\100\341
+\053\147\014\155\112\101\060\030\043\132\062\125\231\311\027\340
+\074\336\366\354\171\255\053\130\031\242\255\054\042\032\225\216
+\276\226\220\135\102\127\304\371\024\003\065\053\034\055\121\127
+\010\247\072\336\077\344\310\264\003\163\302\301\046\200\273\013
+\102\037\255\015\257\046\162\332\314\276\263\243\203\130\015\202
+\305\037\106\121\343\234\030\314\215\233\215\354\111\353\165\120
+\325\214\050\131\312\164\064\332\214\013\041\253\036\352\033\345
+\307\375\025\076\300\027\252\373\043\156\046\106\313\372\371\261
+\162\153\151\317\042\204\013\142\017\254\331\031\000\224\242\166
+\074\324\055\232\355\004\236\055\006\142\020\067\122\034\205\162
+\033\047\345\314\306\061\354\067\354\143\131\233\013\035\166\314
+\176\062\232\210\225\010\066\122\273\336\166\137\166\111\111\255
+\177\275\145\040\262\311\301\053\166\030\166\237\126\261
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "GTS Root R2"
-# Issuer: CN=GTS Root R2,O=Google Trust Services LLC,C=US
-# Serial Number:6e:47:a9:c6:5a:b3:e7:20:c5:30:9a:3f:68:52:f2:6f
-# Subject: CN=GTS Root R2,O=Google Trust Services LLC,C=US
-# Not Valid Before: Wed Jun 22 00:00:00 2016
-# Not Valid After : Sun Jun 22 00:00:00 2036
-# Fingerprint (SHA-256): C4:5D:7B:B0:8E:6D:67:E6:2E:42:35:11:0B:56:4E:5F:78:FD:92:EF:05:8C:84:0A:EA:4E:64:55:D7:58:5C:60
-# Fingerprint (SHA1): D2:73:96:2A:2A:5E:39:9F:73:3F:E1:C7:1E:64:3F:03:38:34:FC:4D
+# Trust for "UCA Extended Validation Root"
+# Issuer: CN=UCA Extended Validation Root,O=UniTrust,C=CN
+# Serial Number:4f:d2:2b:8f:f5:64:c8:33:9e:4f:34:58:66:23:70:60
+# Subject: CN=UCA Extended Validation Root,O=UniTrust,C=CN
+# Not Valid Before: Fri Mar 13 00:00:00 2015
+# Not Valid After : Fri Dec 31 00:00:00 2038
+# Fingerprint (SHA-256): D4:3A:F9:B3:54:73:75:5C:96:84:FC:06:D7:D8:CB:70:EE:5C:28:E7:73:FB:29:4E:B4:1E:E7:17:22:92:4D:24
+# Fingerprint (SHA1): A3:A1:B0:6F:24:61:23:4A:E3:36:A5:C2:37:FC:A6:FF:DD:F0:D7:3A
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GTS Root R2"
+CKA_LABEL UTF8 "UCA Extended Validation Root"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\322\163\226\052\052\136\071\237\163\077\341\307\036\144\077\003
-\070\064\374\115
+\243\241\260\157\044\141\043\112\343\066\245\302\067\374\246\377
+\335\360\327\072
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\104\355\232\016\244\011\073\000\362\256\114\243\306\141\260\213
+\241\363\137\103\306\064\233\332\277\214\176\005\123\255\226\342
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\062
+\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
+\163\164\061\045\060\043\006\003\125\004\003\014\034\125\103\101
+\040\105\170\164\145\156\144\145\144\040\126\141\154\151\144\141
+\164\151\157\156\040\122\157\157\164
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\156\107\251\306\132\263\347\040\305\060\232\077\150\122
-\362\157
+\002\020\117\322\053\217\365\144\310\063\236\117\064\130\146\043
+\160\140
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
@@ -18171,723 +17027,573 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "GTS Root R3"
+# Certificate "Certigna Root CA"
 #
-# Issuer: CN=GTS Root R3,O=Google Trust Services LLC,C=US
-# Serial Number:6e:47:a9:c7:6c:a9:73:24:40:89:0f:03:55:dd:8d:1d
-# Subject: CN=GTS Root R3,O=Google Trust Services LLC,C=US
-# Not Valid Before: Wed Jun 22 00:00:00 2016
-# Not Valid After : Sun Jun 22 00:00:00 2036
-# Fingerprint (SHA-256): 15:D5:B8:77:46:19:EA:7D:54:CE:1C:A6:D0:B0:C4:03:E0:37:A9:17:F1:31:E8:A0:4E:1E:6B:7A:71:BA:BC:E5
-# Fingerprint (SHA1): 30:D4:24:6F:07:FF:DB:91:89:8A:0B:E9:49:66:11:EB:8C:5E:46:E5
+# Issuer: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR
+# Serial Number:00:ca:e9:1b:89:f1:55:03:0d:a3:e6:41:6d:c4:e3:a6:e1
+# Subject: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR
+# Not Valid Before: Tue Oct 01 08:32:27 2013
+# Not Valid After : Sat Oct 01 08:32:27 2033
+# Fingerprint (SHA-256): D4:8D:3D:23:EE:DB:50:A4:59:E5:51:97:60:1C:27:77:4B:9D:7B:18:C9:4D:5A:05:95:11:A1:02:50:B9:31:68
+# Fingerprint (SHA1): 2D:0D:52:14:FF:9E:AD:99:24:01:74:20:47:6E:6C:85:27:27:F5:43
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GTS Root R3"
+CKA_LABEL UTF8 "Certigna Root CA"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\063
+\060\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061
+\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157
+\164\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060
+\060\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063
+\066\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164
+\151\147\156\141\040\122\157\157\164\040\103\101
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\063
+\060\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061
+\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157
+\164\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060
+\060\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063
+\066\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164
+\151\147\156\141\040\122\157\157\164\040\103\101
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\156\107\251\307\154\251\163\044\100\211\017\003\125\335
-\215\035
+\002\021\000\312\351\033\211\361\125\003\015\243\346\101\155\304
+\343\246\341
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\014\060\202\001\221\240\003\002\001\002\002\020\156
-\107\251\307\154\251\163\044\100\211\017\003\125\335\215\035\060
-\012\006\010\052\206\110\316\075\004\003\003\060\107\061\013\060
-\011\006\003\125\004\006\023\002\125\123\061\042\060\040\006\003
-\125\004\012\023\031\107\157\157\147\154\145\040\124\162\165\163
-\164\040\123\145\162\166\151\143\145\163\040\114\114\103\061\024
-\060\022\006\003\125\004\003\023\013\107\124\123\040\122\157\157
-\164\040\122\063\060\036\027\015\061\066\060\066\062\062\060\060
-\060\060\060\060\132\027\015\063\066\060\066\062\062\060\060\060
-\060\060\060\132\060\107\061\013\060\011\006\003\125\004\006\023
-\002\125\123\061\042\060\040\006\003\125\004\012\023\031\107\157
-\157\147\154\145\040\124\162\165\163\164\040\123\145\162\166\151
-\143\145\163\040\114\114\103\061\024\060\022\006\003\125\004\003
-\023\013\107\124\123\040\122\157\157\164\040\122\063\060\166\060
-\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000
-\042\003\142\000\004\037\117\063\207\063\051\212\241\204\336\313
-\307\041\130\101\211\352\126\235\053\113\205\306\035\114\047\274
-\177\046\121\162\157\342\237\326\243\312\314\105\024\106\213\255
-\357\176\206\214\354\261\176\057\377\251\161\235\030\204\105\004
-\101\125\156\053\352\046\177\273\220\001\343\113\031\272\344\124
-\226\105\011\261\325\154\221\104\255\204\023\216\232\214\015\200
-\014\062\366\340\047\243\102\060\100\060\016\006\003\125\035\017
-\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023
-\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035
-\016\004\026\004\024\301\361\046\272\240\055\256\205\201\317\323
-\361\052\022\275\270\012\147\375\274\060\012\006\010\052\206\110
-\316\075\004\003\003\003\151\000\060\146\002\061\000\200\133\244
-\174\043\300\225\245\054\334\276\211\157\043\271\243\335\145\000
-\122\136\221\254\310\235\162\164\202\123\013\175\251\100\275\150
-\140\305\341\270\124\073\301\066\027\045\330\301\275\002\061\000
-\236\065\222\164\205\045\121\365\044\354\144\122\044\120\245\037
-\333\350\313\311\166\354\354\202\156\365\205\030\123\350\270\343
-\232\051\252\226\323\203\043\311\244\173\141\263\314\002\350\135
+\060\202\006\133\060\202\004\103\240\003\002\001\002\002\021\000
+\312\351\033\211\361\125\003\015\243\346\101\155\304\343\246\341
+\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060
+\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061\022
+\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157\164
+\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060\060
+\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063\066
+\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164\151
+\147\156\141\040\122\157\157\164\040\103\101\060\036\027\015\061
+\063\061\060\060\061\060\070\063\062\062\067\132\027\015\063\063
+\061\060\060\061\060\070\063\062\062\067\132\060\132\061\013\060
+\011\006\003\125\004\006\023\002\106\122\061\022\060\020\006\003
+\125\004\012\014\011\104\150\151\155\171\157\164\151\163\061\034
+\060\032\006\003\125\004\013\014\023\060\060\060\062\040\064\070
+\061\064\066\063\060\070\061\060\060\060\063\066\061\031\060\027
+\006\003\125\004\003\014\020\103\145\162\164\151\147\156\141\040
+\122\157\157\164\040\103\101\060\202\002\042\060\015\006\011\052
+\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060
+\202\002\012\002\202\002\001\000\315\030\071\145\032\131\261\352
+\144\026\016\214\224\044\225\174\203\323\305\071\046\334\014\357
+\026\127\215\327\330\254\243\102\177\202\312\355\315\133\333\016
+\267\055\355\105\010\027\262\331\263\313\326\027\122\162\050\333
+\216\116\236\212\266\013\371\236\204\232\115\166\336\042\051\134
+\322\263\322\006\076\060\071\251\164\243\222\126\034\241\157\114
+\012\040\155\237\043\172\264\306\332\054\344\035\054\334\263\050
+\320\023\362\114\116\002\111\241\124\100\236\346\345\005\240\055
+\204\310\377\230\154\320\353\212\032\204\010\036\267\150\043\356
+\043\325\160\316\155\121\151\020\356\241\172\302\321\042\061\302
+\202\205\322\362\125\166\120\174\045\172\311\204\134\013\254\335
+\102\116\053\347\202\242\044\211\313\220\262\320\356\043\272\146
+\114\273\142\244\371\123\132\144\173\174\230\372\243\110\236\017
+\225\256\247\030\364\152\354\056\003\105\257\360\164\370\052\315
+\172\135\321\276\104\046\062\051\361\361\365\154\314\176\002\041
+\013\237\157\244\077\276\235\123\342\317\175\251\054\174\130\032
+\227\341\075\067\067\030\146\050\322\100\305\121\212\214\303\055
+\316\123\210\044\130\144\060\026\305\252\340\326\012\246\100\337
+\170\366\365\004\174\151\023\204\274\321\321\247\006\317\001\367
+\150\300\250\127\273\072\141\255\004\214\223\343\255\374\360\333
+\104\155\131\334\111\131\256\254\232\231\066\060\101\173\166\063
+\042\207\243\302\222\206\156\371\160\356\256\207\207\225\033\304
+\172\275\061\363\324\322\345\231\377\276\110\354\165\365\170\026
+\035\246\160\301\177\074\033\241\222\373\317\310\074\326\305\223
+\012\217\365\125\072\166\225\316\131\230\212\011\225\167\062\232
+\203\272\054\004\072\227\275\324\057\276\327\154\233\242\312\175
+\155\046\311\125\325\317\303\171\122\010\011\231\007\044\055\144
+\045\153\246\041\151\233\152\335\164\115\153\227\172\101\275\253
+\027\371\220\027\110\217\066\371\055\325\305\333\356\252\205\105
+\101\372\315\072\105\261\150\346\066\114\233\220\127\354\043\271
+\207\010\302\304\011\361\227\206\052\050\115\342\164\300\332\304
+\214\333\337\342\241\027\131\316\044\131\164\061\332\177\375\060
+\155\331\334\341\152\341\374\137\002\003\001\000\001\243\202\001
+\032\060\202\001\026\060\017\006\003\125\035\023\001\001\377\004
+\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001\377
+\004\004\003\002\001\006\060\035\006\003\125\035\016\004\026\004
+\024\030\207\126\340\156\167\356\044\065\074\116\163\232\037\326
+\341\342\171\176\053\060\037\006\003\125\035\043\004\030\060\026
+\200\024\030\207\126\340\156\167\356\044\065\074\116\163\232\037
+\326\341\342\171\176\053\060\104\006\003\125\035\040\004\075\060
+\073\060\071\006\004\125\035\040\000\060\061\060\057\006\010\053
+\006\001\005\005\007\002\001\026\043\150\164\164\160\163\072\057
+\057\167\167\167\167\056\143\145\162\164\151\147\156\141\056\146
+\162\057\141\165\164\157\162\151\164\145\163\057\060\155\006\003
+\125\035\037\004\146\060\144\060\057\240\055\240\053\206\051\150
+\164\164\160\072\057\057\143\162\154\056\143\145\162\164\151\147
+\156\141\056\146\162\057\143\145\162\164\151\147\156\141\162\157
+\157\164\143\141\056\143\162\154\060\061\240\057\240\055\206\053
+\150\164\164\160\072\057\057\143\162\154\056\144\150\151\155\171
+\157\164\151\163\056\143\157\155\057\143\145\162\164\151\147\156
+\141\162\157\157\164\143\141\056\143\162\154\060\015\006\011\052
+\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\224
+\270\236\117\360\343\225\010\042\347\315\150\101\367\034\125\325
+\174\000\342\055\072\211\135\150\070\057\121\042\013\112\215\313
+\351\273\135\076\273\134\075\261\050\376\344\123\125\023\317\241
+\220\033\002\035\137\146\106\011\063\050\341\015\044\227\160\323
+\020\037\352\144\127\226\273\135\332\347\304\214\117\114\144\106
+\035\134\207\343\131\336\102\321\233\250\176\246\211\335\217\034
+\311\060\202\355\073\234\315\300\351\031\340\152\330\002\165\067
+\253\367\064\050\050\221\362\004\012\117\065\343\140\046\001\372
+\320\021\214\371\021\152\356\257\075\303\120\323\217\137\063\171
+\074\206\250\163\105\220\214\040\266\162\163\027\043\276\007\145
+\345\170\222\015\272\001\300\353\214\034\146\277\254\206\167\001
+\224\015\234\346\351\071\215\037\246\121\214\231\014\071\167\341
+\264\233\372\034\147\127\157\152\152\216\251\053\114\127\171\172
+\127\042\317\315\137\143\106\215\134\131\072\206\370\062\107\142
+\243\147\015\030\221\334\373\246\153\365\110\141\163\043\131\216
+\002\247\274\104\352\364\111\235\361\124\130\371\140\257\332\030
+\244\057\050\105\334\172\240\210\206\135\363\073\347\377\051\065
+\200\374\144\103\224\346\343\034\157\276\255\016\052\143\231\053
+\311\176\205\366\161\350\006\003\225\376\336\217\110\034\132\324
+\222\350\053\356\347\061\333\272\004\152\207\230\347\305\137\357
+\175\247\042\367\001\330\115\371\211\320\016\232\005\131\244\236
+\230\331\157\053\312\160\276\144\302\125\243\364\351\257\303\222
+\051\334\210\026\044\231\074\215\046\230\266\133\267\314\316\267
+\067\007\375\046\331\230\205\044\377\131\043\003\232\355\235\235
+\250\344\136\070\316\327\122\015\157\322\077\155\261\005\153\111
+\316\212\221\106\163\364\366\057\360\250\163\167\016\145\254\241
+\215\146\122\151\176\113\150\014\307\036\067\047\203\245\214\307
+\002\344\024\315\111\001\260\163\263\375\306\220\072\157\322\154
+\355\073\356\354\221\276\242\103\135\213\000\112\146\045\104\160
+\336\100\017\370\174\025\367\242\316\074\327\136\023\214\201\027
+\030\027\321\275\361\167\020\072\324\145\071\301\047\254\127\054
+\045\124\377\242\332\117\212\141\071\136\256\075\112\214\275
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "GTS Root R3"
-# Issuer: CN=GTS Root R3,O=Google Trust Services LLC,C=US
-# Serial Number:6e:47:a9:c7:6c:a9:73:24:40:89:0f:03:55:dd:8d:1d
-# Subject: CN=GTS Root R3,O=Google Trust Services LLC,C=US
-# Not Valid Before: Wed Jun 22 00:00:00 2016
-# Not Valid After : Sun Jun 22 00:00:00 2036
-# Fingerprint (SHA-256): 15:D5:B8:77:46:19:EA:7D:54:CE:1C:A6:D0:B0:C4:03:E0:37:A9:17:F1:31:E8:A0:4E:1E:6B:7A:71:BA:BC:E5
-# Fingerprint (SHA1): 30:D4:24:6F:07:FF:DB:91:89:8A:0B:E9:49:66:11:EB:8C:5E:46:E5
+# Trust for "Certigna Root CA"
+# Issuer: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR
+# Serial Number:00:ca:e9:1b:89:f1:55:03:0d:a3:e6:41:6d:c4:e3:a6:e1
+# Subject: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR
+# Not Valid Before: Tue Oct 01 08:32:27 2013
+# Not Valid After : Sat Oct 01 08:32:27 2033
+# Fingerprint (SHA-256): D4:8D:3D:23:EE:DB:50:A4:59:E5:51:97:60:1C:27:77:4B:9D:7B:18:C9:4D:5A:05:95:11:A1:02:50:B9:31:68
+# Fingerprint (SHA1): 2D:0D:52:14:FF:9E:AD:99:24:01:74:20:47:6E:6C:85:27:27:F5:43
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GTS Root R3"
+CKA_LABEL UTF8 "Certigna Root CA"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\060\324\044\157\007\377\333\221\211\212\013\351\111\146\021\353
-\214\136\106\345
+\055\015\122\024\377\236\255\231\044\001\164\040\107\156\154\205
+\047\047\365\103
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\032\171\133\153\004\122\234\135\307\164\063\033\045\232\371\045
+\016\134\060\142\047\353\133\274\327\256\142\272\351\325\337\167
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\063
+\060\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061
+\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157
+\164\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060
+\060\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063
+\066\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164
+\151\147\156\141\040\122\157\157\164\040\103\101
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\156\107\251\307\154\251\163\044\100\211\017\003\125\335
-\215\035
+\002\021\000\312\351\033\211\361\125\003\015\243\346\101\155\304
+\343\246\341
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "GTS Root R4"
+# Certificate "emSign Root CA - G1"
 #
-# Issuer: CN=GTS Root R4,O=Google Trust Services LLC,C=US
-# Serial Number:6e:47:a9:c8:8b:94:b6:e8:bb:3b:2a:d8:a2:b2:c1:99
-# Subject: CN=GTS Root R4,O=Google Trust Services LLC,C=US
-# Not Valid Before: Wed Jun 22 00:00:00 2016
-# Not Valid After : Sun Jun 22 00:00:00 2036
-# Fingerprint (SHA-256): 71:CC:A5:39:1F:9E:79:4B:04:80:25:30:B3:63:E1:21:DA:8A:30:43:BB:26:66:2F:EA:4D:CA:7F:C9:51:A4:BD
-# Fingerprint (SHA1): 2A:1D:60:27:D9:4A:B1:0A:1C:4D:91:5C:CD:33:A0:CB:3E:2D:54:CB
+# Issuer: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Serial Number:31:f5:e4:62:0c:6c:58:ed:d6:d8
+# Subject: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Not Valid Before: Sun Feb 18 18:30:00 2018
+# Not Valid After : Wed Feb 18 18:30:00 2043
+# Fingerprint (SHA-256): 40:F6:AF:03:46:A9:9A:A1:CD:1D:55:5A:4E:9C:CE:62:C7:F9:63:46:03:EE:40:66:15:83:3D:C8:C8:D0:03:67
+# Fingerprint (SHA1): 8A:C7:AD:8F:73:AC:4E:C1:B5:75:4D:A5:40:F4:FC:CF:7C:B5:8E:8C
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GTS Root R4"
+CKA_LABEL UTF8 "emSign Root CA - G1"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\064
+\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116\061
+\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
+\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
+\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
+\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032\006
+\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157
+\164\040\103\101\040\055\040\107\061
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\064
+\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116\061
+\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
+\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
+\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
+\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032\006
+\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157
+\164\040\103\101\040\055\040\107\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\156\107\251\310\213\224\266\350\273\073\052\330\242\262
-\301\231
+\002\012\061\365\344\142\014\154\130\355\326\330
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\012\060\202\001\221\240\003\002\001\002\002\020\156
-\107\251\310\213\224\266\350\273\073\052\330\242\262\301\231\060
-\012\006\010\052\206\110\316\075\004\003\003\060\107\061\013\060
-\011\006\003\125\004\006\023\002\125\123\061\042\060\040\006\003
-\125\004\012\023\031\107\157\157\147\154\145\040\124\162\165\163
-\164\040\123\145\162\166\151\143\145\163\040\114\114\103\061\024
-\060\022\006\003\125\004\003\023\013\107\124\123\040\122\157\157
-\164\040\122\064\060\036\027\015\061\066\060\066\062\062\060\060
-\060\060\060\060\132\027\015\063\066\060\066\062\062\060\060\060
-\060\060\060\132\060\107\061\013\060\011\006\003\125\004\006\023
-\002\125\123\061\042\060\040\006\003\125\004\012\023\031\107\157
-\157\147\154\145\040\124\162\165\163\164\040\123\145\162\166\151
-\143\145\163\040\114\114\103\061\024\060\022\006\003\125\004\003
-\023\013\107\124\123\040\122\157\157\164\040\122\064\060\166\060
-\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000
-\042\003\142\000\004\363\164\163\247\150\213\140\256\103\270\065
-\305\201\060\173\113\111\235\373\301\141\316\346\336\106\275\153
-\325\141\030\065\256\100\335\163\367\211\221\060\132\353\074\356
-\205\174\242\100\166\073\251\306\270\107\330\052\347\222\221\152
-\163\351\261\162\071\237\051\237\242\230\323\137\136\130\206\145
-\017\241\204\145\006\321\334\213\311\307\163\310\214\152\057\345
-\304\253\321\035\212\243\102\060\100\060\016\006\003\125\035\017
-\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023
-\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035
-\016\004\026\004\024\200\114\326\353\164\377\111\066\243\325\330
-\374\265\076\305\152\360\224\035\214\060\012\006\010\052\206\110
-\316\075\004\003\003\003\147\000\060\144\002\060\152\120\122\164
-\010\304\160\334\236\120\164\041\350\215\172\041\303\117\226\156
-\025\321\042\065\141\055\372\010\067\356\031\155\255\333\262\314
-\175\007\064\365\140\031\054\265\064\331\157\040\002\060\003\161
-\261\272\243\140\013\206\355\232\010\152\225\150\237\342\263\341
-\223\144\174\136\223\246\337\171\055\215\205\343\224\317\043\135
-\161\314\362\260\115\326\376\231\310\224\251\165\242\343
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for "GTS Root R4"
-# Issuer: CN=GTS Root R4,O=Google Trust Services LLC,C=US
-# Serial Number:6e:47:a9:c8:8b:94:b6:e8:bb:3b:2a:d8:a2:b2:c1:99
-# Subject: CN=GTS Root R4,O=Google Trust Services LLC,C=US
-# Not Valid Before: Wed Jun 22 00:00:00 2016
-# Not Valid After : Sun Jun 22 00:00:00 2036
-# Fingerprint (SHA-256): 71:CC:A5:39:1F:9E:79:4B:04:80:25:30:B3:63:E1:21:DA:8A:30:43:BB:26:66:2F:EA:4D:CA:7F:C9:51:A4:BD
-# Fingerprint (SHA1): 2A:1D:60:27:D9:4A:B1:0A:1C:4D:91:5C:CD:33:A0:CB:3E:2D:54:CB
+\060\202\003\224\060\202\002\174\240\003\002\001\002\002\012\061
+\365\344\142\014\154\130\355\326\330\060\015\006\011\052\206\110
+\206\367\015\001\001\013\005\000\060\147\061\013\060\011\006\003
+\125\004\006\023\002\111\116\061\023\060\021\006\003\125\004\013
+\023\012\145\155\123\151\147\156\040\120\113\111\061\045\060\043
+\006\003\125\004\012\023\034\145\115\165\144\150\162\141\040\124
+\145\143\150\156\157\154\157\147\151\145\163\040\114\151\155\151
+\164\145\144\061\034\060\032\006\003\125\004\003\023\023\145\155
+\123\151\147\156\040\122\157\157\164\040\103\101\040\055\040\107
+\061\060\036\027\015\061\070\060\062\061\070\061\070\063\060\060
+\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060\060
+\132\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116
+\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147
+\156\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034
+\145\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157
+\147\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032
+\006\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157
+\157\164\040\103\101\040\055\040\107\061\060\202\001\042\060\015
+\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001
+\017\000\060\202\001\012\002\202\001\001\000\223\113\273\351\146
+\212\356\235\133\325\064\223\320\033\036\303\347\236\270\144\063
+\177\143\170\150\264\315\056\161\165\327\233\040\306\115\051\274
+\266\150\140\212\367\041\232\126\065\132\363\166\275\330\315\232
+\377\223\126\113\245\131\006\241\223\064\051\335\026\064\165\116
+\362\201\264\307\226\116\255\031\025\122\112\376\074\160\165\160
+\315\257\053\253\025\232\063\074\252\263\213\252\315\103\375\365
+\352\160\377\355\317\021\073\224\316\116\062\026\323\043\100\052
+\167\263\257\074\001\054\154\355\231\054\213\331\116\151\230\262
+\367\217\101\260\062\170\141\326\015\137\303\372\242\100\222\035
+\134\027\346\160\076\065\347\242\267\302\142\342\253\244\070\114
+\265\071\065\157\352\003\151\372\072\124\150\205\155\326\362\057
+\103\125\036\221\015\016\330\325\152\244\226\321\023\074\054\170
+\120\350\072\222\322\027\126\345\065\032\100\034\076\215\054\355
+\071\337\102\340\203\101\164\337\243\315\302\206\140\110\150\343
+\151\013\124\000\213\344\166\151\041\015\171\116\064\010\136\024
+\302\314\261\267\255\327\174\160\212\307\205\002\003\001\000\001
+\243\102\060\100\060\035\006\003\125\035\016\004\026\004\024\373
+\357\015\206\236\260\343\335\251\271\361\041\027\177\076\374\360
+\167\053\032\060\016\006\003\125\035\017\001\001\377\004\004\003
+\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060
+\003\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001
+\013\005\000\003\202\001\001\000\131\377\362\214\365\207\175\161
+\075\243\237\033\133\321\332\370\323\234\153\066\275\233\251\141
+\353\336\026\054\164\075\236\346\165\332\327\272\247\274\102\027
+\347\075\221\353\345\175\335\076\234\361\317\222\254\154\110\314
+\302\042\077\151\073\305\266\025\057\243\065\306\150\052\034\127
+\257\071\357\215\320\065\303\030\014\173\000\126\034\315\213\031
+\164\336\276\017\022\340\320\252\241\077\002\064\261\160\316\235
+\030\326\010\003\011\106\356\140\340\176\266\304\111\004\121\175
+\160\140\274\252\262\377\171\162\172\246\035\075\137\052\370\312
+\342\375\071\267\107\271\353\176\337\004\043\257\372\234\006\007
+\351\373\143\223\200\100\265\306\154\012\061\050\316\014\237\317
+\263\043\065\200\101\215\154\304\067\173\201\057\200\241\100\102
+\205\351\331\070\215\350\241\123\315\001\277\151\350\132\006\362
+\105\013\220\372\256\341\277\235\362\256\127\074\245\256\262\126
+\364\213\145\100\351\375\061\201\054\364\071\011\330\356\153\247
+\264\246\035\025\245\230\367\001\201\330\205\175\363\121\134\161
+\210\336\272\314\037\200\176\112
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "emSign Root CA - G1"
+# Issuer: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Serial Number:31:f5:e4:62:0c:6c:58:ed:d6:d8
+# Subject: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Not Valid Before: Sun Feb 18 18:30:00 2018
+# Not Valid After : Wed Feb 18 18:30:00 2043
+# Fingerprint (SHA-256): 40:F6:AF:03:46:A9:9A:A1:CD:1D:55:5A:4E:9C:CE:62:C7:F9:63:46:03:EE:40:66:15:83:3D:C8:C8:D0:03:67
+# Fingerprint (SHA1): 8A:C7:AD:8F:73:AC:4E:C1:B5:75:4D:A5:40:F4:FC:CF:7C:B5:8E:8C
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GTS Root R4"
+CKA_LABEL UTF8 "emSign Root CA - G1"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\052\035\140\047\331\112\261\012\034\115\221\134\315\063\240\313
-\076\055\124\313
+\212\307\255\217\163\254\116\301\265\165\115\245\100\364\374\317
+\174\265\216\214
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\135\266\152\304\140\027\044\152\032\231\250\113\356\136\264\046
+\234\102\204\127\335\313\013\247\056\225\255\266\363\332\274\254
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
-\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
-\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
-\123\040\122\157\157\164\040\122\064
+\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116\061
+\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
+\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
+\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
+\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032\006
+\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157
+\164\040\103\101\040\055\040\107\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\156\107\251\310\213\224\266\350\273\073\052\330\242\262
-\301\231
+\002\012\061\365\344\142\014\154\130\355\326\330
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "UCA Global G2 Root"
+# Certificate "emSign ECC Root CA - G3"
 #
-# Issuer: CN=UCA Global G2 Root,O=UniTrust,C=CN
-# Serial Number:5d:df:b1:da:5a:a3:ed:5d:be:5a:65:20:65:03:90:ef
-# Subject: CN=UCA Global G2 Root,O=UniTrust,C=CN
-# Not Valid Before: Fri Mar 11 00:00:00 2016
-# Not Valid After : Mon Dec 31 00:00:00 2040
-# Fingerprint (SHA-256): 9B:EA:11:C9:76:FE:01:47:64:C1:BE:56:A6:F9:14:B5:A5:60:31:7A:BD:99:88:39:33:82:E5:16:1A:A0:49:3C
-# Fingerprint (SHA1): 28:F9:78:16:19:7A:FF:18:25:18:AA:44:FE:C1:A0:CE:5C:B6:4C:8A
+# Issuer: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Serial Number:3c:f6:07:a9:68:70:0e:da:8b:84
+# Subject: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Not Valid Before: Sun Feb 18 18:30:00 2018
+# Not Valid After : Wed Feb 18 18:30:00 2043
+# Fingerprint (SHA-256): 86:A1:EC:BA:08:9C:4A:8D:3B:BE:27:34:C6:12:BA:34:1D:81:3E:04:3C:F9:E8:A8:62:CD:5C:57:A3:6B:BE:6B
+# Fingerprint (SHA1): 30:43:FA:4F:F2:57:DC:A0:C3:80:EE:2E:58:EA:78:B2:3F:E6:BB:C1
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "UCA Global G2 Root"
+CKA_LABEL UTF8 "emSign ECC Root CA - G3"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\075\061\013\060\011\006\003\125\004\006\023\002\103\116\061
-\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
-\163\164\061\033\060\031\006\003\125\004\003\014\022\125\103\101
-\040\107\154\157\142\141\154\040\107\062\040\122\157\157\164
+\060\153\061\013\060\011\006\003\125\004\006\023\002\111\116\061
+\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
+\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
+\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
+\151\145\163\040\114\151\155\151\164\145\144\061\040\060\036\006
+\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103
+\040\122\157\157\164\040\103\101\040\055\040\107\063
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\075\061\013\060\011\006\003\125\004\006\023\002\103\116\061
-\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
-\163\164\061\033\060\031\006\003\125\004\003\014\022\125\103\101
-\040\107\154\157\142\141\154\040\107\062\040\122\157\157\164
+\060\153\061\013\060\011\006\003\125\004\006\023\002\111\116\061
+\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
+\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
+\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
+\151\145\163\040\114\151\155\151\164\145\144\061\040\060\036\006
+\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103
+\040\122\157\157\164\040\103\101\040\055\040\107\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\135\337\261\332\132\243\355\135\276\132\145\040\145\003
-\220\357
+\002\012\074\366\007\251\150\160\016\332\213\204
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\106\060\202\003\056\240\003\002\001\002\002\020\135
-\337\261\332\132\243\355\135\276\132\145\040\145\003\220\357\060
-\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\075
-\061\013\060\011\006\003\125\004\006\023\002\103\116\061\021\060
-\017\006\003\125\004\012\014\010\125\156\151\124\162\165\163\164
-\061\033\060\031\006\003\125\004\003\014\022\125\103\101\040\107
-\154\157\142\141\154\040\107\062\040\122\157\157\164\060\036\027
-\015\061\066\060\063\061\061\060\060\060\060\060\060\132\027\015
-\064\060\061\062\063\061\060\060\060\060\060\060\132\060\075\061
-\013\060\011\006\003\125\004\006\023\002\103\116\061\021\060\017
-\006\003\125\004\012\014\010\125\156\151\124\162\165\163\164\061
-\033\060\031\006\003\125\004\003\014\022\125\103\101\040\107\154
-\157\142\141\154\040\107\062\040\122\157\157\164\060\202\002\042
-\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003
-\202\002\017\000\060\202\002\012\002\202\002\001\000\305\346\053
-\157\174\357\046\005\047\243\201\044\332\157\313\001\371\231\232
-\251\062\302\042\207\141\101\221\073\313\303\150\033\006\305\114
-\251\053\301\147\027\042\035\053\355\371\051\211\223\242\170\275
-\222\153\240\243\015\242\176\312\223\263\246\321\214\065\325\165
-\371\027\366\317\105\305\345\172\354\167\223\240\217\043\256\016
-\032\003\177\276\324\320\355\056\173\253\106\043\133\377\054\346
-\124\172\224\300\052\025\360\311\215\260\172\073\044\341\327\150
-\342\061\074\006\063\106\266\124\021\246\245\057\042\124\052\130
-\015\001\002\361\372\025\121\147\154\300\372\327\266\033\177\321
-\126\210\057\032\072\215\073\273\202\021\340\107\000\320\122\207
-\253\373\206\176\017\044\153\100\235\064\147\274\215\307\055\206
-\157\171\076\216\251\074\027\113\177\260\231\343\260\161\140\334
-\013\365\144\303\316\103\274\155\161\271\322\336\047\133\212\350
-\330\306\256\341\131\175\317\050\055\065\270\225\126\032\361\262
-\130\113\267\022\067\310\174\263\355\113\200\341\215\372\062\043
-\266\157\267\110\225\010\261\104\116\205\214\072\002\124\040\057
-\337\277\127\117\073\072\220\041\327\301\046\065\124\040\354\307
-\077\107\354\357\132\277\113\172\301\255\073\027\120\134\142\330
-\017\113\112\334\053\372\156\274\163\222\315\354\307\120\350\101
-\226\327\251\176\155\330\351\035\217\212\265\271\130\222\272\112
-\222\053\014\126\375\200\353\010\360\136\051\156\033\034\014\257
-\217\223\211\255\333\275\243\236\041\312\211\031\354\337\265\303
-\032\353\026\376\170\066\114\326\156\320\076\027\034\220\027\153
-\046\272\373\172\057\277\021\034\030\016\055\163\003\217\240\345
-\065\240\132\342\114\165\035\161\341\071\070\123\170\100\314\203
-\223\327\012\236\235\133\217\212\344\345\340\110\344\110\262\107
-\315\116\052\165\052\173\362\042\366\311\276\011\221\226\127\172
-\210\210\254\356\160\254\371\334\051\343\014\034\073\022\116\104
-\326\247\116\260\046\310\363\331\032\227\221\150\352\357\215\106
-\006\322\126\105\130\232\074\014\017\203\270\005\045\303\071\317
-\073\244\064\211\267\171\022\057\107\305\347\251\227\151\374\246
-\167\147\265\337\173\361\172\145\025\344\141\126\145\002\003\001
-\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001\377
-\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377
-\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026
-\004\024\201\304\214\314\365\344\060\377\245\014\010\137\214\025
-\147\041\164\001\337\337\060\015\006\011\052\206\110\206\367\015
-\001\001\013\005\000\003\202\002\001\000\023\145\042\365\216\053
-\255\104\344\313\377\271\150\346\303\200\110\075\004\173\372\043
-\057\172\355\066\332\262\316\155\366\346\236\345\137\130\217\313
-\067\062\241\310\145\266\256\070\075\065\033\076\274\073\266\004
-\320\274\371\111\365\233\367\205\305\066\266\313\274\370\310\071
-\325\344\137\007\275\025\124\227\164\312\312\355\117\272\272\144
-\166\237\201\270\204\105\111\114\215\157\242\353\261\314\321\303
-\224\332\104\302\346\342\352\030\350\242\037\047\005\272\327\345
-\326\251\315\335\357\166\230\215\000\016\315\033\372\003\267\216
-\200\130\016\047\077\122\373\224\242\312\136\145\311\326\204\332
-\271\065\161\363\046\300\117\167\346\201\047\322\167\073\232\024
-\157\171\364\366\320\341\323\224\272\320\127\121\275\047\005\015
-\301\375\310\022\060\356\157\215\021\053\010\235\324\324\277\200
-\105\024\232\210\104\332\060\352\264\247\343\356\357\133\202\325
-\076\326\255\170\222\333\134\074\363\330\255\372\270\153\177\304
-\066\050\266\002\025\212\124\054\234\260\027\163\216\320\067\243
-\024\074\230\225\000\014\051\005\133\236\111\111\261\137\307\343
-\313\317\047\145\216\065\027\267\127\310\060\331\101\133\271\024
-\266\350\302\017\224\061\247\224\230\314\152\353\265\341\047\365
-\020\250\001\350\216\022\142\350\210\314\265\177\106\227\300\233
-\020\146\070\032\066\106\137\042\150\075\337\311\306\023\047\253
-\123\006\254\242\074\206\006\145\157\261\176\261\051\104\232\243
-\272\111\151\050\151\217\327\345\137\255\004\206\144\157\032\240
-\014\305\010\142\316\200\243\320\363\354\150\336\276\063\307\027
-\133\177\200\304\114\114\261\246\204\212\303\073\270\011\315\024
-\201\272\030\343\124\127\066\376\333\057\174\107\241\072\063\310
-\371\130\073\104\117\261\312\002\211\004\226\050\150\305\113\270
-\046\211\273\326\063\057\120\325\376\232\211\272\030\062\222\124
-\306\133\340\235\371\136\345\015\042\233\366\332\342\310\041\262
-\142\041\252\206\100\262\056\144\323\137\310\343\176\021\147\105
-\037\005\376\343\242\357\263\250\263\363\175\217\370\014\037\042
-\037\055\160\264\270\001\064\166\060\000\345\043\170\247\126\327
-\120\037\212\373\006\365\302\031\360\320
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for "UCA Global G2 Root"
-# Issuer: CN=UCA Global G2 Root,O=UniTrust,C=CN
-# Serial Number:5d:df:b1:da:5a:a3:ed:5d:be:5a:65:20:65:03:90:ef
-# Subject: CN=UCA Global G2 Root,O=UniTrust,C=CN
-# Not Valid Before: Fri Mar 11 00:00:00 2016
-# Not Valid After : Mon Dec 31 00:00:00 2040
-# Fingerprint (SHA-256): 9B:EA:11:C9:76:FE:01:47:64:C1:BE:56:A6:F9:14:B5:A5:60:31:7A:BD:99:88:39:33:82:E5:16:1A:A0:49:3C
-# Fingerprint (SHA1): 28:F9:78:16:19:7A:FF:18:25:18:AA:44:FE:C1:A0:CE:5C:B6:4C:8A
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "UCA Global G2 Root"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\050\371\170\026\031\172\377\030\045\030\252\104\376\301\240\316
-\134\266\114\212
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\200\376\360\304\112\360\134\142\062\237\034\272\170\251\120\370
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\075\061\013\060\011\006\003\125\004\006\023\002\103\116\061
-\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
-\163\164\061\033\060\031\006\003\125\004\003\014\022\125\103\101
-\040\107\154\157\142\141\154\040\107\062\040\122\157\157\164
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\135\337\261\332\132\243\355\135\276\132\145\040\145\003
-\220\357
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
-#
-# Certificate "UCA Extended Validation Root"
-#
-# Issuer: CN=UCA Extended Validation Root,O=UniTrust,C=CN
-# Serial Number:4f:d2:2b:8f:f5:64:c8:33:9e:4f:34:58:66:23:70:60
-# Subject: CN=UCA Extended Validation Root,O=UniTrust,C=CN
-# Not Valid Before: Fri Mar 13 00:00:00 2015
-# Not Valid After : Fri Dec 31 00:00:00 2038
-# Fingerprint (SHA-256): D4:3A:F9:B3:54:73:75:5C:96:84:FC:06:D7:D8:CB:70:EE:5C:28:E7:73:FB:29:4E:B4:1E:E7:17:22:92:4D:24
-# Fingerprint (SHA1): A3:A1:B0:6F:24:61:23:4A:E3:36:A5:C2:37:FC:A6:FF:DD:F0:D7:3A
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "UCA Extended Validation Root"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061
-\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
-\163\164\061\045\060\043\006\003\125\004\003\014\034\125\103\101
-\040\105\170\164\145\156\144\145\144\040\126\141\154\151\144\141
-\164\151\157\156\040\122\157\157\164
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061
-\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
-\163\164\061\045\060\043\006\003\125\004\003\014\034\125\103\101
-\040\105\170\164\145\156\144\145\144\040\126\141\154\151\144\141
-\164\151\157\156\040\122\157\157\164
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\117\322\053\217\365\144\310\063\236\117\064\130\146\043
-\160\140
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\005\132\060\202\003\102\240\003\002\001\002\002\020\117
-\322\053\217\365\144\310\063\236\117\064\130\146\043\160\140\060
-\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\107
-\061\013\060\011\006\003\125\004\006\023\002\103\116\061\021\060
-\017\006\003\125\004\012\014\010\125\156\151\124\162\165\163\164
-\061\045\060\043\006\003\125\004\003\014\034\125\103\101\040\105
-\170\164\145\156\144\145\144\040\126\141\154\151\144\141\164\151
-\157\156\040\122\157\157\164\060\036\027\015\061\065\060\063\061
-\063\060\060\060\060\060\060\132\027\015\063\070\061\062\063\061
-\060\060\060\060\060\060\132\060\107\061\013\060\011\006\003\125
-\004\006\023\002\103\116\061\021\060\017\006\003\125\004\012\014
-\010\125\156\151\124\162\165\163\164\061\045\060\043\006\003\125
-\004\003\014\034\125\103\101\040\105\170\164\145\156\144\145\144
-\040\126\141\154\151\144\141\164\151\157\156\040\122\157\157\164
-\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
-\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
-\000\251\011\007\050\023\002\260\231\340\144\252\036\103\026\172
-\163\261\221\240\165\076\250\372\343\070\000\172\354\211\152\040
-\017\213\305\260\233\063\003\132\206\306\130\206\325\301\205\273
-\117\306\234\100\115\312\276\356\151\226\270\255\201\060\232\174
-\222\005\353\005\053\232\110\320\270\166\076\226\310\040\273\322
-\260\361\217\330\254\105\106\377\252\147\140\264\167\176\152\037
-\074\032\122\172\004\075\007\074\205\015\204\320\037\166\012\367
-\152\024\337\162\343\064\174\127\116\126\001\076\171\361\252\051
-\073\154\372\370\217\155\115\310\065\337\256\353\334\044\356\171
-\105\247\205\266\005\210\336\210\135\045\174\227\144\147\011\331
-\277\132\025\005\206\363\011\036\354\130\062\063\021\363\167\144
-\260\166\037\344\020\065\027\033\362\016\261\154\244\052\243\163
-\374\011\037\036\062\031\123\021\347\331\263\054\056\166\056\241
-\243\336\176\152\210\011\350\362\007\212\370\262\315\020\347\342
-\163\100\223\273\010\321\077\341\374\013\224\263\045\357\174\246
-\327\321\257\237\377\226\232\365\221\173\230\013\167\324\176\350
-\007\322\142\265\225\071\343\363\361\155\017\016\145\204\212\143
-\124\305\200\266\340\236\113\175\107\046\247\001\010\135\321\210
-\236\327\303\062\104\372\202\112\012\150\124\177\070\123\003\314
-\244\000\063\144\121\131\013\243\202\221\172\136\354\026\302\363
-\052\346\142\332\052\333\131\142\020\045\112\052\201\013\107\007
-\103\006\160\207\322\372\223\021\051\172\110\115\353\224\307\160
-\115\257\147\325\121\261\200\040\001\001\264\172\010\246\220\177
-\116\340\357\007\101\207\257\152\245\136\213\373\317\120\262\232
-\124\257\303\211\272\130\055\365\060\230\261\066\162\071\176\111
-\004\375\051\247\114\171\344\005\127\333\224\271\026\123\215\106
-\263\035\225\141\127\126\177\257\360\026\133\141\130\157\066\120
-\021\013\330\254\053\225\026\032\016\037\010\315\066\064\145\020
-\142\146\325\200\137\024\040\137\055\014\240\170\012\150\326\054
-\327\351\157\053\322\112\005\223\374\236\157\153\147\377\210\361
-\116\245\151\112\122\067\005\352\306\026\215\322\304\231\321\202
-\053\073\272\065\165\367\121\121\130\363\310\007\335\344\264\003
-\177\002\003\001\000\001\243\102\060\100\060\035\006\003\125\035
-\016\004\026\004\024\331\164\072\344\060\075\015\367\022\334\176
-\132\005\237\036\064\232\367\341\024\060\017\006\003\125\035\023
-\001\001\377\004\005\060\003\001\001\377\060\016\006\003\125\035
-\017\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206
-\110\206\367\015\001\001\013\005\000\003\202\002\001\000\066\215
-\227\314\102\025\144\051\067\233\046\054\326\373\256\025\151\054
-\153\032\032\367\137\266\371\007\114\131\352\363\311\310\271\256
-\314\272\056\172\334\300\365\260\055\300\073\257\237\160\005\021
-\152\237\045\117\001\051\160\343\345\014\341\352\132\174\334\111
-\273\301\036\052\201\365\026\113\162\221\310\242\061\271\252\332
-\374\235\037\363\135\100\002\023\374\116\034\006\312\263\024\220
-\124\027\031\022\032\361\037\327\014\151\132\366\161\170\364\224
-\175\221\013\216\354\220\124\216\274\157\241\114\253\374\164\144
-\375\161\232\370\101\007\241\315\221\344\074\232\340\233\062\071
-\163\253\052\325\151\310\170\221\046\061\175\342\307\060\361\374
-\024\170\167\022\016\023\364\335\026\224\277\113\147\173\160\123
-\205\312\260\273\363\070\115\054\220\071\300\015\302\135\153\351
-\342\345\325\210\215\326\054\277\253\033\276\265\050\207\022\027
-\164\156\374\175\374\217\320\207\046\260\033\373\271\154\253\342
-\236\075\025\301\073\056\147\002\130\221\237\357\370\102\037\054
-\267\150\365\165\255\317\265\366\377\021\175\302\360\044\245\255
-\323\372\240\074\251\372\135\334\245\240\357\104\244\276\326\350
-\345\344\023\226\027\173\006\076\062\355\307\267\102\274\166\243
-\330\145\070\053\070\065\121\041\016\016\157\056\064\023\100\341
-\053\147\014\155\112\101\060\030\043\132\062\125\231\311\027\340
-\074\336\366\354\171\255\053\130\031\242\255\054\042\032\225\216
-\276\226\220\135\102\127\304\371\024\003\065\053\034\055\121\127
-\010\247\072\336\077\344\310\264\003\163\302\301\046\200\273\013
-\102\037\255\015\257\046\162\332\314\276\263\243\203\130\015\202
-\305\037\106\121\343\234\030\314\215\233\215\354\111\353\165\120
-\325\214\050\131\312\164\064\332\214\013\041\253\036\352\033\345
-\307\375\025\076\300\027\252\373\043\156\046\106\313\372\371\261
-\162\153\151\317\042\204\013\142\017\254\331\031\000\224\242\166
-\074\324\055\232\355\004\236\055\006\142\020\067\122\034\205\162
-\033\047\345\314\306\061\354\067\354\143\131\233\013\035\166\314
-\176\062\232\210\225\010\066\122\273\336\166\137\166\111\111\255
-\177\275\145\040\262\311\301\053\166\030\166\237\126\261
+\060\202\002\116\060\202\001\323\240\003\002\001\002\002\012\074
+\366\007\251\150\160\016\332\213\204\060\012\006\010\052\206\110
+\316\075\004\003\003\060\153\061\013\060\011\006\003\125\004\006
+\023\002\111\116\061\023\060\021\006\003\125\004\013\023\012\145
+\155\123\151\147\156\040\120\113\111\061\045\060\043\006\003\125
+\004\012\023\034\145\115\165\144\150\162\141\040\124\145\143\150
+\156\157\154\157\147\151\145\163\040\114\151\155\151\164\145\144
+\061\040\060\036\006\003\125\004\003\023\027\145\155\123\151\147
+\156\040\105\103\103\040\122\157\157\164\040\103\101\040\055\040
+\107\063\060\036\027\015\061\070\060\062\061\070\061\070\063\060
+\060\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060
+\060\132\060\153\061\013\060\011\006\003\125\004\006\023\002\111
+\116\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151
+\147\156\040\120\113\111\061\045\060\043\006\003\125\004\012\023
+\034\145\115\165\144\150\162\141\040\124\145\143\150\156\157\154
+\157\147\151\145\163\040\114\151\155\151\164\145\144\061\040\060
+\036\006\003\125\004\003\023\027\145\155\123\151\147\156\040\105
+\103\103\040\122\157\157\164\040\103\101\040\055\040\107\063\060
+\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201
+\004\000\042\003\142\000\004\043\245\014\270\055\022\365\050\363
+\261\262\335\342\002\022\200\236\071\137\111\115\237\311\045\064
+\131\164\354\273\006\034\347\300\162\257\350\256\057\341\101\124
+\207\024\250\112\262\350\174\202\346\133\152\265\334\263\165\316
+\213\006\320\206\043\277\106\325\216\017\077\004\364\327\034\222
+\176\366\245\143\302\365\137\216\056\117\241\030\031\002\053\062
+\012\202\144\175\026\223\321\243\102\060\100\060\035\006\003\125
+\035\016\004\026\004\024\174\135\002\204\023\324\314\212\233\201
+\316\027\034\056\051\036\234\110\143\102\060\016\006\003\125\035
+\017\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035
+\023\001\001\377\004\005\060\003\001\001\377\060\012\006\010\052
+\206\110\316\075\004\003\003\003\151\000\060\146\002\061\000\276
+\363\141\317\002\020\035\144\225\007\270\030\156\210\205\005\057
+\203\010\027\220\312\037\212\114\350\015\033\172\261\255\325\201
+\011\107\357\073\254\010\004\174\134\231\261\355\107\007\322\002
+\061\000\235\272\125\374\251\112\350\355\355\346\166\001\102\173
+\310\370\140\331\215\121\213\125\073\373\214\173\353\145\011\303
+\370\226\315\107\250\202\362\026\125\167\044\176\022\020\225\004
+\054\243
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "UCA Extended Validation Root"
-# Issuer: CN=UCA Extended Validation Root,O=UniTrust,C=CN
-# Serial Number:4f:d2:2b:8f:f5:64:c8:33:9e:4f:34:58:66:23:70:60
-# Subject: CN=UCA Extended Validation Root,O=UniTrust,C=CN
-# Not Valid Before: Fri Mar 13 00:00:00 2015
-# Not Valid After : Fri Dec 31 00:00:00 2038
-# Fingerprint (SHA-256): D4:3A:F9:B3:54:73:75:5C:96:84:FC:06:D7:D8:CB:70:EE:5C:28:E7:73:FB:29:4E:B4:1E:E7:17:22:92:4D:24
-# Fingerprint (SHA1): A3:A1:B0:6F:24:61:23:4A:E3:36:A5:C2:37:FC:A6:FF:DD:F0:D7:3A
+# Trust for "emSign ECC Root CA - G3"
+# Issuer: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Serial Number:3c:f6:07:a9:68:70:0e:da:8b:84
+# Subject: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Not Valid Before: Sun Feb 18 18:30:00 2018
+# Not Valid After : Wed Feb 18 18:30:00 2043
+# Fingerprint (SHA-256): 86:A1:EC:BA:08:9C:4A:8D:3B:BE:27:34:C6:12:BA:34:1D:81:3E:04:3C:F9:E8:A8:62:CD:5C:57:A3:6B:BE:6B
+# Fingerprint (SHA1): 30:43:FA:4F:F2:57:DC:A0:C3:80:EE:2E:58:EA:78:B2:3F:E6:BB:C1
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "UCA Extended Validation Root"
+CKA_LABEL UTF8 "emSign ECC Root CA - G3"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\243\241\260\157\044\141\043\112\343\066\245\302\067\374\246\377
-\335\360\327\072
+\060\103\372\117\362\127\334\240\303\200\356\056\130\352\170\262
+\077\346\273\301
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\241\363\137\103\306\064\233\332\277\214\176\005\123\255\226\342
+\316\013\162\321\237\210\216\320\120\003\350\343\270\213\147\100
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061
-\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165
-\163\164\061\045\060\043\006\003\125\004\003\014\034\125\103\101
-\040\105\170\164\145\156\144\145\144\040\126\141\154\151\144\141
-\164\151\157\156\040\122\157\157\164
+\060\153\061\013\060\011\006\003\125\004\006\023\002\111\116\061
+\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
+\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
+\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
+\151\145\163\040\114\151\155\151\164\145\144\061\040\060\036\006
+\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103
+\040\122\157\157\164\040\103\101\040\055\040\107\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\117\322\053\217\365\144\310\063\236\117\064\130\146\043
-\160\140
+\002\012\074\366\007\251\150\160\016\332\213\204
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Certigna Root CA"
+# Certificate "emSign Root CA - C1"
 #
-# Issuer: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR
-# Serial Number:00:ca:e9:1b:89:f1:55:03:0d:a3:e6:41:6d:c4:e3:a6:e1
-# Subject: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR
-# Not Valid Before: Tue Oct 01 08:32:27 2013
-# Not Valid After : Sat Oct 01 08:32:27 2033
-# Fingerprint (SHA-256): D4:8D:3D:23:EE:DB:50:A4:59:E5:51:97:60:1C:27:77:4B:9D:7B:18:C9:4D:5A:05:95:11:A1:02:50:B9:31:68
-# Fingerprint (SHA1): 2D:0D:52:14:FF:9E:AD:99:24:01:74:20:47:6E:6C:85:27:27:F5:43
+# Issuer: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US
+# Serial Number:00:ae:cf:00:ba:c4:cf:32:f8:43:b2
+# Subject: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US
+# Not Valid Before: Sun Feb 18 18:30:00 2018
+# Not Valid After : Wed Feb 18 18:30:00 2043
+# Fingerprint (SHA-256): 12:56:09:AA:30:1D:A0:A2:49:B9:7A:82:39:CB:6A:34:21:6F:44:DC:AC:9F:39:54:B1:42:92:F2:E8:C8:60:8F
+# Fingerprint (SHA1): E7:2E:F1:DF:FC:B2:09:28:CF:5D:D4:D5:67:37:B1:51:CB:86:4F:01
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Certigna Root CA"
+CKA_LABEL UTF8 "emSign Root CA - C1"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061
-\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157
-\164\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060
-\060\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063
-\066\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164
-\151\147\156\141\040\122\157\157\164\040\103\101
+\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
+\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
+\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006\003
+\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157\164
+\040\103\101\040\055\040\103\061
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061
-\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157
-\164\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060
-\060\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063
-\066\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164
-\151\147\156\141\040\122\157\157\164\040\103\101
+\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
+\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
+\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006\003
+\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157\164
+\040\103\101\040\055\040\103\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\021\000\312\351\033\211\361\125\003\015\243\346\101\155\304
-\343\246\341
+\002\013\000\256\317\000\272\304\317\062\370\103\262
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\006\133\060\202\004\103\240\003\002\001\002\002\021\000
-\312\351\033\211\361\125\003\015\243\346\101\155\304\343\246\341
-\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060
-\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061\022
-\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157\164
-\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060\060
-\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063\066
-\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164\151
-\147\156\141\040\122\157\157\164\040\103\101\060\036\027\015\061
-\063\061\060\060\061\060\070\063\062\062\067\132\027\015\063\063
-\061\060\060\061\060\070\063\062\062\067\132\060\132\061\013\060
-\011\006\003\125\004\006\023\002\106\122\061\022\060\020\006\003
-\125\004\012\014\011\104\150\151\155\171\157\164\151\163\061\034
-\060\032\006\003\125\004\013\014\023\060\060\060\062\040\064\070
-\061\064\066\063\060\070\061\060\060\060\063\066\061\031\060\027
-\006\003\125\004\003\014\020\103\145\162\164\151\147\156\141\040
-\122\157\157\164\040\103\101\060\202\002\042\060\015\006\011\052
-\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060
-\202\002\012\002\202\002\001\000\315\030\071\145\032\131\261\352
-\144\026\016\214\224\044\225\174\203\323\305\071\046\334\014\357
-\026\127\215\327\330\254\243\102\177\202\312\355\315\133\333\016
-\267\055\355\105\010\027\262\331\263\313\326\027\122\162\050\333
-\216\116\236\212\266\013\371\236\204\232\115\166\336\042\051\134
-\322\263\322\006\076\060\071\251\164\243\222\126\034\241\157\114
-\012\040\155\237\043\172\264\306\332\054\344\035\054\334\263\050
-\320\023\362\114\116\002\111\241\124\100\236\346\345\005\240\055
-\204\310\377\230\154\320\353\212\032\204\010\036\267\150\043\356
-\043\325\160\316\155\121\151\020\356\241\172\302\321\042\061\302
-\202\205\322\362\125\166\120\174\045\172\311\204\134\013\254\335
-\102\116\053\347\202\242\044\211\313\220\262\320\356\043\272\146
-\114\273\142\244\371\123\132\144\173\174\230\372\243\110\236\017
-\225\256\247\030\364\152\354\056\003\105\257\360\164\370\052\315
-\172\135\321\276\104\046\062\051\361\361\365\154\314\176\002\041
-\013\237\157\244\077\276\235\123\342\317\175\251\054\174\130\032
-\227\341\075\067\067\030\146\050\322\100\305\121\212\214\303\055
-\316\123\210\044\130\144\060\026\305\252\340\326\012\246\100\337
-\170\366\365\004\174\151\023\204\274\321\321\247\006\317\001\367
-\150\300\250\127\273\072\141\255\004\214\223\343\255\374\360\333
-\104\155\131\334\111\131\256\254\232\231\066\060\101\173\166\063
-\042\207\243\302\222\206\156\371\160\356\256\207\207\225\033\304
-\172\275\061\363\324\322\345\231\377\276\110\354\165\365\170\026
-\035\246\160\301\177\074\033\241\222\373\317\310\074\326\305\223
-\012\217\365\125\072\166\225\316\131\230\212\011\225\167\062\232
-\203\272\054\004\072\227\275\324\057\276\327\154\233\242\312\175
-\155\046\311\125\325\317\303\171\122\010\011\231\007\044\055\144
-\045\153\246\041\151\233\152\335\164\115\153\227\172\101\275\253
-\027\371\220\027\110\217\066\371\055\325\305\333\356\252\205\105
-\101\372\315\072\105\261\150\346\066\114\233\220\127\354\043\271
-\207\010\302\304\011\361\227\206\052\050\115\342\164\300\332\304
-\214\333\337\342\241\027\131\316\044\131\164\061\332\177\375\060
-\155\331\334\341\152\341\374\137\002\003\001\000\001\243\202\001
-\032\060\202\001\026\060\017\006\003\125\035\023\001\001\377\004
-\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001\377
-\004\004\003\002\001\006\060\035\006\003\125\035\016\004\026\004
-\024\030\207\126\340\156\167\356\044\065\074\116\163\232\037\326
-\341\342\171\176\053\060\037\006\003\125\035\043\004\030\060\026
-\200\024\030\207\126\340\156\167\356\044\065\074\116\163\232\037
-\326\341\342\171\176\053\060\104\006\003\125\035\040\004\075\060
-\073\060\071\006\004\125\035\040\000\060\061\060\057\006\010\053
-\006\001\005\005\007\002\001\026\043\150\164\164\160\163\072\057
-\057\167\167\167\167\056\143\145\162\164\151\147\156\141\056\146
-\162\057\141\165\164\157\162\151\164\145\163\057\060\155\006\003
-\125\035\037\004\146\060\144\060\057\240\055\240\053\206\051\150
-\164\164\160\072\057\057\143\162\154\056\143\145\162\164\151\147
-\156\141\056\146\162\057\143\145\162\164\151\147\156\141\162\157
-\157\164\143\141\056\143\162\154\060\061\240\057\240\055\206\053
-\150\164\164\160\072\057\057\143\162\154\056\144\150\151\155\171
-\157\164\151\163\056\143\157\155\057\143\145\162\164\151\147\156
-\141\162\157\157\164\143\141\056\143\162\154\060\015\006\011\052
-\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\224
-\270\236\117\360\343\225\010\042\347\315\150\101\367\034\125\325
-\174\000\342\055\072\211\135\150\070\057\121\042\013\112\215\313
-\351\273\135\076\273\134\075\261\050\376\344\123\125\023\317\241
-\220\033\002\035\137\146\106\011\063\050\341\015\044\227\160\323
-\020\037\352\144\127\226\273\135\332\347\304\214\117\114\144\106
-\035\134\207\343\131\336\102\321\233\250\176\246\211\335\217\034
-\311\060\202\355\073\234\315\300\351\031\340\152\330\002\165\067
-\253\367\064\050\050\221\362\004\012\117\065\343\140\046\001\372
-\320\021\214\371\021\152\356\257\075\303\120\323\217\137\063\171
-\074\206\250\163\105\220\214\040\266\162\163\027\043\276\007\145
-\345\170\222\015\272\001\300\353\214\034\146\277\254\206\167\001
-\224\015\234\346\351\071\215\037\246\121\214\231\014\071\167\341
-\264\233\372\034\147\127\157\152\152\216\251\053\114\127\171\172
-\127\042\317\315\137\143\106\215\134\131\072\206\370\062\107\142
-\243\147\015\030\221\334\373\246\153\365\110\141\163\043\131\216
-\002\247\274\104\352\364\111\235\361\124\130\371\140\257\332\030
-\244\057\050\105\334\172\240\210\206\135\363\073\347\377\051\065
-\200\374\144\103\224\346\343\034\157\276\255\016\052\143\231\053
-\311\176\205\366\161\350\006\003\225\376\336\217\110\034\132\324
-\222\350\053\356\347\061\333\272\004\152\207\230\347\305\137\357
-\175\247\042\367\001\330\115\371\211\320\016\232\005\131\244\236
-\230\331\157\053\312\160\276\144\302\125\243\364\351\257\303\222
-\051\334\210\026\044\231\074\215\046\230\266\133\267\314\316\267
-\067\007\375\046\331\230\205\044\377\131\043\003\232\355\235\235
-\250\344\136\070\316\327\122\015\157\322\077\155\261\005\153\111
-\316\212\221\106\163\364\366\057\360\250\163\167\016\145\254\241
-\215\146\122\151\176\113\150\014\307\036\067\047\203\245\214\307
-\002\344\024\315\111\001\260\163\263\375\306\220\072\157\322\154
-\355\073\356\354\221\276\242\103\135\213\000\112\146\045\104\160
-\336\100\017\370\174\025\367\242\316\074\327\136\023\214\201\027
-\030\027\321\275\361\167\020\072\324\145\071\301\047\254\127\054
-\045\124\377\242\332\117\212\141\071\136\256\075\112\214\275
+\060\202\003\163\060\202\002\133\240\003\002\001\002\002\013\000
+\256\317\000\272\304\317\062\370\103\262\060\015\006\011\052\206
+\110\206\367\015\001\001\013\005\000\060\126\061\013\060\011\006
+\003\125\004\006\023\002\125\123\061\023\060\021\006\003\125\004
+\013\023\012\145\155\123\151\147\156\040\120\113\111\061\024\060
+\022\006\003\125\004\012\023\013\145\115\165\144\150\162\141\040
+\111\156\143\061\034\060\032\006\003\125\004\003\023\023\145\155
+\123\151\147\156\040\122\157\157\164\040\103\101\040\055\040\103
+\061\060\036\027\015\061\070\060\062\061\070\061\070\063\060\060
+\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060\060
+\132\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147
+\156\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013
+\145\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006
+\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157
+\164\040\103\101\040\055\040\103\061\060\202\001\042\060\015\006
+\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017
+\000\060\202\001\012\002\202\001\001\000\317\353\251\271\361\231
+\005\314\330\050\041\112\363\163\064\121\204\126\020\365\240\117
+\054\022\343\372\023\232\047\320\317\371\171\032\164\137\035\171
+\071\374\133\370\160\216\340\222\122\367\344\045\371\124\203\331
+\035\323\310\132\205\077\136\307\266\007\356\076\300\316\232\257
+\254\126\102\052\071\045\160\326\277\265\173\066\255\254\366\163
+\334\315\327\035\212\203\245\373\053\220\025\067\153\034\046\107
+\334\073\051\126\223\152\263\301\152\072\235\075\365\301\227\070
+\130\005\213\034\021\343\344\264\270\135\205\035\203\376\170\137
+\013\105\150\030\110\245\106\163\064\073\376\017\310\166\273\307
+\030\363\005\321\206\363\205\355\347\271\331\062\255\125\210\316
+\246\266\221\260\117\254\176\025\043\226\366\077\360\040\064\026
+\336\012\306\304\004\105\171\177\247\375\276\322\251\245\257\234
+\305\043\052\367\074\041\154\275\257\217\116\305\072\262\363\064
+\022\374\337\200\032\111\244\324\251\225\367\236\211\136\242\211
+\254\224\313\250\150\233\257\212\145\047\315\211\356\335\214\265
+\153\051\160\103\240\151\013\344\271\017\002\003\001\000\001\243
+\102\060\100\060\035\006\003\125\035\016\004\026\004\024\376\241
+\340\160\036\052\003\071\122\132\102\276\134\221\205\172\030\252
+\115\265\060\016\006\003\125\035\017\001\001\377\004\004\003\002
+\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003
+\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001\013
+\005\000\003\202\001\001\000\302\112\126\372\025\041\173\050\242
+\351\345\035\373\370\055\304\071\226\101\114\073\047\054\304\154
+\030\025\200\306\254\257\107\131\057\046\013\343\066\260\357\073
+\376\103\227\111\062\231\022\025\133\337\021\051\377\253\123\370
+\273\301\170\017\254\234\123\257\127\275\150\214\075\151\063\360
+\243\240\043\143\073\144\147\042\104\255\325\161\313\126\052\170
+\222\243\117\022\061\066\066\342\336\376\000\304\243\140\017\047
+\255\240\260\212\265\066\172\122\241\275\047\364\040\047\142\350
+\115\224\044\023\344\012\004\351\074\253\056\310\103\011\112\306
+\141\004\345\111\064\176\323\304\310\365\017\300\252\351\272\124
+\136\363\143\053\117\117\120\324\376\271\173\231\214\075\300\056
+\274\002\053\323\304\100\344\212\007\061\036\233\316\046\231\023
+\373\021\352\232\042\014\021\031\307\136\033\201\120\060\310\226
+\022\156\347\313\101\177\221\073\242\107\267\124\200\033\334\000
+\314\232\220\352\303\303\120\006\142\014\060\300\025\110\247\250
+\131\174\341\256\042\242\342\012\172\017\372\142\253\122\114\341
+\361\337\312\276\203\015\102
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "Certigna Root CA"
-# Issuer: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR
-# Serial Number:00:ca:e9:1b:89:f1:55:03:0d:a3:e6:41:6d:c4:e3:a6:e1
-# Subject: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR
-# Not Valid Before: Tue Oct 01 08:32:27 2013
-# Not Valid After : Sat Oct 01 08:32:27 2033
-# Fingerprint (SHA-256): D4:8D:3D:23:EE:DB:50:A4:59:E5:51:97:60:1C:27:77:4B:9D:7B:18:C9:4D:5A:05:95:11:A1:02:50:B9:31:68
-# Fingerprint (SHA1): 2D:0D:52:14:FF:9E:AD:99:24:01:74:20:47:6E:6C:85:27:27:F5:43
+# Trust for "emSign Root CA - C1"
+# Issuer: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US
+# Serial Number:00:ae:cf:00:ba:c4:cf:32:f8:43:b2
+# Subject: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US
+# Not Valid Before: Sun Feb 18 18:30:00 2018
+# Not Valid After : Wed Feb 18 18:30:00 2043
+# Fingerprint (SHA-256): 12:56:09:AA:30:1D:A0:A2:49:B9:7A:82:39:CB:6A:34:21:6F:44:DC:AC:9F:39:54:B1:42:92:F2:E8:C8:60:8F
+# Fingerprint (SHA1): E7:2E:F1:DF:FC:B2:09:28:CF:5D:D4:D5:67:37:B1:51:CB:86:4F:01
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Certigna Root CA"
+CKA_LABEL UTF8 "emSign Root CA - C1"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\055\015\122\024\377\236\255\231\044\001\164\040\107\156\154\205
-\047\047\365\103
+\347\056\361\337\374\262\011\050\317\135\324\325\147\067\261\121
+\313\206\117\001
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\016\134\060\142\047\353\133\274\327\256\142\272\351\325\337\167
+\330\343\135\001\041\372\170\132\260\337\272\322\356\052\137\150
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061
-\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157
-\164\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060
-\060\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063
-\066\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164
-\151\147\156\141\040\122\157\157\164\040\103\101
+\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
+\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
+\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006\003
+\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157\164
+\040\103\101\040\055\040\103\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\021\000\312\351\033\211\361\125\003\015\243\346\101\155\304
-\343\246\341
+\002\013\000\256\317\000\272\304\317\062\370\103\262
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
@@ -18895,138 +17601,112 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "emSign Root CA - G1"
+# Certificate "emSign ECC Root CA - C3"
 #
-# Issuer: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
-# Serial Number:31:f5:e4:62:0c:6c:58:ed:d6:d8
-# Subject: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Issuer: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US
+# Serial Number:7b:71:b6:82:56:b8:12:7c:9c:a8
+# Subject: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US
 # Not Valid Before: Sun Feb 18 18:30:00 2018
 # Not Valid After : Wed Feb 18 18:30:00 2043
-# Fingerprint (SHA-256): 40:F6:AF:03:46:A9:9A:A1:CD:1D:55:5A:4E:9C:CE:62:C7:F9:63:46:03:EE:40:66:15:83:3D:C8:C8:D0:03:67
-# Fingerprint (SHA1): 8A:C7:AD:8F:73:AC:4E:C1:B5:75:4D:A5:40:F4:FC:CF:7C:B5:8E:8C
+# Fingerprint (SHA-256): BC:4D:80:9B:15:18:9D:78:DB:3E:1D:8C:F4:F9:72:6A:79:5D:A1:64:3C:A5:F1:35:8E:1D:DB:0E:DC:0D:7E:B3
+# Fingerprint (SHA1): B6:AF:43:C2:9B:81:53:7D:F6:EF:6B:C3:1F:1F:60:15:0C:EE:48:66
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "emSign Root CA - G1"
+CKA_LABEL UTF8 "emSign ECC Root CA - C3"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116\061
+\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123\061
 \023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
-\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
-\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032\006
-\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157
-\164\040\103\101\040\055\040\107\061
+\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
+\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006\003
+\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103\040
+\122\157\157\164\040\103\101\040\055\040\103\063
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116\061
+\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123\061
 \023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
-\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
-\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032\006
-\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157
-\164\040\103\101\040\055\040\107\061
+\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
+\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006\003
+\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103\040
+\122\157\157\164\040\103\101\040\055\040\103\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\012\061\365\344\142\014\154\130\355\326\330
+\002\012\173\161\266\202\126\270\022\174\234\250
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\003\224\060\202\002\174\240\003\002\001\002\002\012\061
-\365\344\142\014\154\130\355\326\330\060\015\006\011\052\206\110
-\206\367\015\001\001\013\005\000\060\147\061\013\060\011\006\003
-\125\004\006\023\002\111\116\061\023\060\021\006\003\125\004\013
-\023\012\145\155\123\151\147\156\040\120\113\111\061\045\060\043
-\006\003\125\004\012\023\034\145\115\165\144\150\162\141\040\124
-\145\143\150\156\157\154\157\147\151\145\163\040\114\151\155\151
-\164\145\144\061\034\060\032\006\003\125\004\003\023\023\145\155
-\123\151\147\156\040\122\157\157\164\040\103\101\040\055\040\107
-\061\060\036\027\015\061\070\060\062\061\070\061\070\063\060\060
+\060\202\002\053\060\202\001\261\240\003\002\001\002\002\012\173
+\161\266\202\126\270\022\174\234\250\060\012\006\010\052\206\110
+\316\075\004\003\003\060\132\061\013\060\011\006\003\125\004\006
+\023\002\125\123\061\023\060\021\006\003\125\004\013\023\012\145
+\155\123\151\147\156\040\120\113\111\061\024\060\022\006\003\125
+\004\012\023\013\145\115\165\144\150\162\141\040\111\156\143\061
+\040\060\036\006\003\125\004\003\023\027\145\155\123\151\147\156
+\040\105\103\103\040\122\157\157\164\040\103\101\040\055\040\103
+\063\060\036\027\015\061\070\060\062\061\070\061\070\063\060\060
 \060\132\027\015\064\063\060\062\061\070\061\070\063\060\060\060
-\132\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116
+\132\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123
 \061\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147
-\156\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034
-\145\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157
-\147\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032
-\006\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157
-\157\164\040\103\101\040\055\040\107\061\060\202\001\042\060\015
-\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001
-\017\000\060\202\001\012\002\202\001\001\000\223\113\273\351\146
-\212\356\235\133\325\064\223\320\033\036\303\347\236\270\144\063
-\177\143\170\150\264\315\056\161\165\327\233\040\306\115\051\274
-\266\150\140\212\367\041\232\126\065\132\363\166\275\330\315\232
-\377\223\126\113\245\131\006\241\223\064\051\335\026\064\165\116
-\362\201\264\307\226\116\255\031\025\122\112\376\074\160\165\160
-\315\257\053\253\025\232\063\074\252\263\213\252\315\103\375\365
-\352\160\377\355\317\021\073\224\316\116\062\026\323\043\100\052
-\167\263\257\074\001\054\154\355\231\054\213\331\116\151\230\262
-\367\217\101\260\062\170\141\326\015\137\303\372\242\100\222\035
-\134\027\346\160\076\065\347\242\267\302\142\342\253\244\070\114
-\265\071\065\157\352\003\151\372\072\124\150\205\155\326\362\057
-\103\125\036\221\015\016\330\325\152\244\226\321\023\074\054\170
-\120\350\072\222\322\027\126\345\065\032\100\034\076\215\054\355
-\071\337\102\340\203\101\164\337\243\315\302\206\140\110\150\343
-\151\013\124\000\213\344\166\151\041\015\171\116\064\010\136\024
-\302\314\261\267\255\327\174\160\212\307\205\002\003\001\000\001
-\243\102\060\100\060\035\006\003\125\035\016\004\026\004\024\373
-\357\015\206\236\260\343\335\251\271\361\041\027\177\076\374\360
-\167\053\032\060\016\006\003\125\035\017\001\001\377\004\004\003
-\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060
-\003\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001
-\013\005\000\003\202\001\001\000\131\377\362\214\365\207\175\161
-\075\243\237\033\133\321\332\370\323\234\153\066\275\233\251\141
-\353\336\026\054\164\075\236\346\165\332\327\272\247\274\102\027
-\347\075\221\353\345\175\335\076\234\361\317\222\254\154\110\314
-\302\042\077\151\073\305\266\025\057\243\065\306\150\052\034\127
-\257\071\357\215\320\065\303\030\014\173\000\126\034\315\213\031
-\164\336\276\017\022\340\320\252\241\077\002\064\261\160\316\235
-\030\326\010\003\011\106\356\140\340\176\266\304\111\004\121\175
-\160\140\274\252\262\377\171\162\172\246\035\075\137\052\370\312
-\342\375\071\267\107\271\353\176\337\004\043\257\372\234\006\007
-\351\373\143\223\200\100\265\306\154\012\061\050\316\014\237\317
-\263\043\065\200\101\215\154\304\067\173\201\057\200\241\100\102
-\205\351\331\070\215\350\241\123\315\001\277\151\350\132\006\362
-\105\013\220\372\256\341\277\235\362\256\127\074\245\256\262\126
-\364\213\145\100\351\375\061\201\054\364\071\011\330\356\153\247
-\264\246\035\025\245\230\367\001\201\330\205\175\363\121\134\161
-\210\336\272\314\037\200\176\112
+\156\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013
+\145\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006
+\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103
+\040\122\157\157\164\040\103\101\040\055\040\103\063\060\166\060
+\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000
+\042\003\142\000\004\375\245\141\256\173\046\020\035\351\267\042
+\060\256\006\364\201\263\261\102\161\225\071\274\323\122\343\257
+\257\371\362\227\065\222\066\106\016\207\225\215\271\071\132\351
+\273\337\320\376\310\007\101\074\273\125\157\203\243\152\373\142
+\260\201\211\002\160\175\110\305\112\343\351\042\124\042\115\223
+\273\102\014\257\167\234\043\246\175\327\141\021\316\145\307\370
+\177\376\365\362\251\243\102\060\100\060\035\006\003\125\035\016
+\004\026\004\024\373\132\110\320\200\040\100\362\250\351\000\007
+\151\031\167\247\346\303\364\317\060\016\006\003\125\035\017\001
+\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023\001
+\001\377\004\005\060\003\001\001\377\060\012\006\010\052\206\110
+\316\075\004\003\003\003\150\000\060\145\002\061\000\264\330\057
+\002\211\375\266\114\142\272\103\116\023\204\162\265\256\335\034
+\336\326\265\334\126\217\130\100\132\055\336\040\114\042\203\312
+\223\250\176\356\022\100\307\326\207\117\370\337\205\002\060\034
+\024\144\344\174\226\203\021\234\260\321\132\141\113\246\017\111
+\323\000\374\241\374\344\245\377\177\255\327\060\320\307\167\177
+\276\201\007\125\060\120\040\024\365\127\070\012\250\061\121
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "emSign Root CA - G1"
-# Issuer: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
-# Serial Number:31:f5:e4:62:0c:6c:58:ed:d6:d8
-# Subject: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
+# Trust for "emSign ECC Root CA - C3"
+# Issuer: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US
+# Serial Number:7b:71:b6:82:56:b8:12:7c:9c:a8
+# Subject: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US
 # Not Valid Before: Sun Feb 18 18:30:00 2018
 # Not Valid After : Wed Feb 18 18:30:00 2043
-# Fingerprint (SHA-256): 40:F6:AF:03:46:A9:9A:A1:CD:1D:55:5A:4E:9C:CE:62:C7:F9:63:46:03:EE:40:66:15:83:3D:C8:C8:D0:03:67
-# Fingerprint (SHA1): 8A:C7:AD:8F:73:AC:4E:C1:B5:75:4D:A5:40:F4:FC:CF:7C:B5:8E:8C
+# Fingerprint (SHA-256): BC:4D:80:9B:15:18:9D:78:DB:3E:1D:8C:F4:F9:72:6A:79:5D:A1:64:3C:A5:F1:35:8E:1D:DB:0E:DC:0D:7E:B3
+# Fingerprint (SHA1): B6:AF:43:C2:9B:81:53:7D:F6:EF:6B:C3:1F:1F:60:15:0C:EE:48:66
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "emSign Root CA - G1"
+CKA_LABEL UTF8 "emSign ECC Root CA - C3"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\212\307\255\217\163\254\116\301\265\165\115\245\100\364\374\317
-\174\265\216\214
+\266\257\103\302\233\201\123\175\366\357\153\303\037\037\140\025
+\014\356\110\146
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\234\102\204\127\335\313\013\247\056\225\255\266\363\332\274\254
+\076\123\263\243\201\356\327\020\370\323\260\035\027\222\365\325
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116\061
+\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123\061
 \023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
-\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
-\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032\006
-\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157
-\164\040\103\101\040\055\040\107\061
+\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
+\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006\003
+\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103\040
+\122\157\157\164\040\103\101\040\055\040\103\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\012\061\365\344\142\014\154\130\355\326\330
+\002\012\173\161\266\202\126\270\022\174\234\250
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
@@ -19034,365 +17714,379 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "emSign ECC Root CA - G3"
+# Certificate "Hongkong Post Root CA 3"
 #
-# Issuer: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
-# Serial Number:3c:f6:07:a9:68:70:0e:da:8b:84
-# Subject: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
-# Not Valid Before: Sun Feb 18 18:30:00 2018
-# Not Valid After : Wed Feb 18 18:30:00 2043
-# Fingerprint (SHA-256): 86:A1:EC:BA:08:9C:4A:8D:3B:BE:27:34:C6:12:BA:34:1D:81:3E:04:3C:F9:E8:A8:62:CD:5C:57:A3:6B:BE:6B
-# Fingerprint (SHA1): 30:43:FA:4F:F2:57:DC:A0:C3:80:EE:2E:58:EA:78:B2:3F:E6:BB:C1
+# Issuer: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK
+# Serial Number:08:16:5f:8a:4c:a5:ec:00:c9:93:40:df:c4:c6:ae:23:b8:1c:5a:a4
+# Subject: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK
+# Not Valid Before: Sat Jun 03 02:29:46 2017
+# Not Valid After : Tue Jun 03 02:29:46 2042
+# Fingerprint (SHA-256): 5A:2F:C0:3F:0C:83:B0:90:BB:FA:40:60:4B:09:88:44:6C:76:36:18:3D:F9:84:6E:17:10:1A:44:7F:B8:EF:D6
+# Fingerprint (SHA1): 58:A2:D0:EC:20:52:81:5B:C1:F3:F8:64:02:24:4E:C2:8E:02:4B:02
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "emSign ECC Root CA - G3"
+CKA_LABEL UTF8 "Hongkong Post Root CA 3"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\153\061\013\060\011\006\003\125\004\006\023\002\111\116\061
-\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
-\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
-\151\145\163\040\114\151\155\151\164\145\144\061\040\060\036\006
-\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103
-\040\122\157\157\164\040\103\101\040\055\040\107\063
+\060\157\061\013\060\011\006\003\125\004\006\023\002\110\113\061
+\022\060\020\006\003\125\004\010\023\011\110\157\156\147\040\113
+\157\156\147\061\022\060\020\006\003\125\004\007\023\011\110\157
+\156\147\040\113\157\156\147\061\026\060\024\006\003\125\004\012
+\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164\061
+\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153\157
+\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101\040
+\063
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\153\061\013\060\011\006\003\125\004\006\023\002\111\116\061
-\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
-\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
-\151\145\163\040\114\151\155\151\164\145\144\061\040\060\036\006
-\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103
-\040\122\157\157\164\040\103\101\040\055\040\107\063
+\060\157\061\013\060\011\006\003\125\004\006\023\002\110\113\061
+\022\060\020\006\003\125\004\010\023\011\110\157\156\147\040\113
+\157\156\147\061\022\060\020\006\003\125\004\007\023\011\110\157
+\156\147\040\113\157\156\147\061\026\060\024\006\003\125\004\012
+\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164\061
+\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153\157
+\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101\040
+\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\012\074\366\007\251\150\160\016\332\213\204
+\002\024\010\026\137\212\114\245\354\000\311\223\100\337\304\306
+\256\043\270\034\132\244
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\116\060\202\001\323\240\003\002\001\002\002\012\074
-\366\007\251\150\160\016\332\213\204\060\012\006\010\052\206\110
-\316\075\004\003\003\060\153\061\013\060\011\006\003\125\004\006
-\023\002\111\116\061\023\060\021\006\003\125\004\013\023\012\145
-\155\123\151\147\156\040\120\113\111\061\045\060\043\006\003\125
-\004\012\023\034\145\115\165\144\150\162\141\040\124\145\143\150
-\156\157\154\157\147\151\145\163\040\114\151\155\151\164\145\144
-\061\040\060\036\006\003\125\004\003\023\027\145\155\123\151\147
-\156\040\105\103\103\040\122\157\157\164\040\103\101\040\055\040
-\107\063\060\036\027\015\061\070\060\062\061\070\061\070\063\060
-\060\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060
-\060\132\060\153\061\013\060\011\006\003\125\004\006\023\002\111
-\116\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151
-\147\156\040\120\113\111\061\045\060\043\006\003\125\004\012\023
-\034\145\115\165\144\150\162\141\040\124\145\143\150\156\157\154
-\157\147\151\145\163\040\114\151\155\151\164\145\144\061\040\060
-\036\006\003\125\004\003\023\027\145\155\123\151\147\156\040\105
-\103\103\040\122\157\157\164\040\103\101\040\055\040\107\063\060
-\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201
-\004\000\042\003\142\000\004\043\245\014\270\055\022\365\050\363
-\261\262\335\342\002\022\200\236\071\137\111\115\237\311\045\064
-\131\164\354\273\006\034\347\300\162\257\350\256\057\341\101\124
-\207\024\250\112\262\350\174\202\346\133\152\265\334\263\165\316
-\213\006\320\206\043\277\106\325\216\017\077\004\364\327\034\222
-\176\366\245\143\302\365\137\216\056\117\241\030\031\002\053\062
-\012\202\144\175\026\223\321\243\102\060\100\060\035\006\003\125
-\035\016\004\026\004\024\174\135\002\204\023\324\314\212\233\201
-\316\027\034\056\051\036\234\110\143\102\060\016\006\003\125\035
-\017\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035
-\023\001\001\377\004\005\060\003\001\001\377\060\012\006\010\052
-\206\110\316\075\004\003\003\003\151\000\060\146\002\061\000\276
-\363\141\317\002\020\035\144\225\007\270\030\156\210\205\005\057
-\203\010\027\220\312\037\212\114\350\015\033\172\261\255\325\201
-\011\107\357\073\254\010\004\174\134\231\261\355\107\007\322\002
-\061\000\235\272\125\374\251\112\350\355\355\346\166\001\102\173
-\310\370\140\331\215\121\213\125\073\373\214\173\353\145\011\303
-\370\226\315\107\250\202\362\026\125\167\044\176\022\020\225\004
-\054\243
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for "emSign ECC Root CA - G3"
-# Issuer: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
-# Serial Number:3c:f6:07:a9:68:70:0e:da:8b:84
-# Subject: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN
-# Not Valid Before: Sun Feb 18 18:30:00 2018
-# Not Valid After : Wed Feb 18 18:30:00 2043
-# Fingerprint (SHA-256): 86:A1:EC:BA:08:9C:4A:8D:3B:BE:27:34:C6:12:BA:34:1D:81:3E:04:3C:F9:E8:A8:62:CD:5C:57:A3:6B:BE:6B
-# Fingerprint (SHA1): 30:43:FA:4F:F2:57:DC:A0:C3:80:EE:2E:58:EA:78:B2:3F:E6:BB:C1
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "emSign ECC Root CA - G3"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\060\103\372\117\362\127\334\240\303\200\356\056\130\352\170\262
-\077\346\273\301
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\316\013\162\321\237\210\216\320\120\003\350\343\270\213\147\100
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\153\061\013\060\011\006\003\125\004\006\023\002\111\116\061
-\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145
-\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147
-\151\145\163\040\114\151\155\151\164\145\144\061\040\060\036\006
-\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103
-\040\122\157\157\164\040\103\101\040\055\040\107\063
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\012\074\366\007\251\150\160\016\332\213\204
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
-#
-# Certificate "emSign Root CA - C1"
-#
-# Issuer: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US
-# Serial Number:00:ae:cf:00:ba:c4:cf:32:f8:43:b2
-# Subject: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US
-# Not Valid Before: Sun Feb 18 18:30:00 2018
-# Not Valid After : Wed Feb 18 18:30:00 2043
-# Fingerprint (SHA-256): 12:56:09:AA:30:1D:A0:A2:49:B9:7A:82:39:CB:6A:34:21:6F:44:DC:AC:9F:39:54:B1:42:92:F2:E8:C8:60:8F
-# Fingerprint (SHA1): E7:2E:F1:DF:FC:B2:09:28:CF:5D:D4:D5:67:37:B1:51:CB:86:4F:01
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "emSign Root CA - C1"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
-\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006\003
-\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157\164
-\040\103\101\040\055\040\103\061
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
-\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006\003
-\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157\164
-\040\103\101\040\055\040\103\061
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\013\000\256\317\000\272\304\317\062\370\103\262
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\003\163\060\202\002\133\240\003\002\001\002\002\013\000
-\256\317\000\272\304\317\062\370\103\262\060\015\006\011\052\206
-\110\206\367\015\001\001\013\005\000\060\126\061\013\060\011\006
-\003\125\004\006\023\002\125\123\061\023\060\021\006\003\125\004
-\013\023\012\145\155\123\151\147\156\040\120\113\111\061\024\060
-\022\006\003\125\004\012\023\013\145\115\165\144\150\162\141\040
-\111\156\143\061\034\060\032\006\003\125\004\003\023\023\145\155
-\123\151\147\156\040\122\157\157\164\040\103\101\040\055\040\103
-\061\060\036\027\015\061\070\060\062\061\070\061\070\063\060\060
-\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060\060
-\132\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147
-\156\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013
-\145\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006
-\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157
-\164\040\103\101\040\055\040\103\061\060\202\001\042\060\015\006
-\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017
-\000\060\202\001\012\002\202\001\001\000\317\353\251\271\361\231
-\005\314\330\050\041\112\363\163\064\121\204\126\020\365\240\117
-\054\022\343\372\023\232\047\320\317\371\171\032\164\137\035\171
-\071\374\133\370\160\216\340\222\122\367\344\045\371\124\203\331
-\035\323\310\132\205\077\136\307\266\007\356\076\300\316\232\257
-\254\126\102\052\071\045\160\326\277\265\173\066\255\254\366\163
-\334\315\327\035\212\203\245\373\053\220\025\067\153\034\046\107
-\334\073\051\126\223\152\263\301\152\072\235\075\365\301\227\070
-\130\005\213\034\021\343\344\264\270\135\205\035\203\376\170\137
-\013\105\150\030\110\245\106\163\064\073\376\017\310\166\273\307
-\030\363\005\321\206\363\205\355\347\271\331\062\255\125\210\316
-\246\266\221\260\117\254\176\025\043\226\366\077\360\040\064\026
-\336\012\306\304\004\105\171\177\247\375\276\322\251\245\257\234
-\305\043\052\367\074\041\154\275\257\217\116\305\072\262\363\064
-\022\374\337\200\032\111\244\324\251\225\367\236\211\136\242\211
-\254\224\313\250\150\233\257\212\145\047\315\211\356\335\214\265
-\153\051\160\103\240\151\013\344\271\017\002\003\001\000\001\243
-\102\060\100\060\035\006\003\125\035\016\004\026\004\024\376\241
-\340\160\036\052\003\071\122\132\102\276\134\221\205\172\030\252
-\115\265\060\016\006\003\125\035\017\001\001\377\004\004\003\002
-\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003
-\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001\013
-\005\000\003\202\001\001\000\302\112\126\372\025\041\173\050\242
-\351\345\035\373\370\055\304\071\226\101\114\073\047\054\304\154
-\030\025\200\306\254\257\107\131\057\046\013\343\066\260\357\073
-\376\103\227\111\062\231\022\025\133\337\021\051\377\253\123\370
-\273\301\170\017\254\234\123\257\127\275\150\214\075\151\063\360
-\243\240\043\143\073\144\147\042\104\255\325\161\313\126\052\170
-\222\243\117\022\061\066\066\342\336\376\000\304\243\140\017\047
-\255\240\260\212\265\066\172\122\241\275\047\364\040\047\142\350
-\115\224\044\023\344\012\004\351\074\253\056\310\103\011\112\306
-\141\004\345\111\064\176\323\304\310\365\017\300\252\351\272\124
-\136\363\143\053\117\117\120\324\376\271\173\231\214\075\300\056
-\274\002\053\323\304\100\344\212\007\061\036\233\316\046\231\023
-\373\021\352\232\042\014\021\031\307\136\033\201\120\060\310\226
-\022\156\347\313\101\177\221\073\242\107\267\124\200\033\334\000
-\314\232\220\352\303\303\120\006\142\014\060\300\025\110\247\250
-\131\174\341\256\042\242\342\012\172\017\372\142\253\122\114\341
-\361\337\312\276\203\015\102
+\060\202\005\317\060\202\003\267\240\003\002\001\002\002\024\010
+\026\137\212\114\245\354\000\311\223\100\337\304\306\256\043\270
+\034\132\244\060\015\006\011\052\206\110\206\367\015\001\001\013
+\005\000\060\157\061\013\060\011\006\003\125\004\006\023\002\110
+\113\061\022\060\020\006\003\125\004\010\023\011\110\157\156\147
+\040\113\157\156\147\061\022\060\020\006\003\125\004\007\023\011
+\110\157\156\147\040\113\157\156\147\061\026\060\024\006\003\125
+\004\012\023\015\110\157\156\147\153\157\156\147\040\120\157\163
+\164\061\040\060\036\006\003\125\004\003\023\027\110\157\156\147
+\153\157\156\147\040\120\157\163\164\040\122\157\157\164\040\103
+\101\040\063\060\036\027\015\061\067\060\066\060\063\060\062\062
+\071\064\066\132\027\015\064\062\060\066\060\063\060\062\062\071
+\064\066\132\060\157\061\013\060\011\006\003\125\004\006\023\002
+\110\113\061\022\060\020\006\003\125\004\010\023\011\110\157\156
+\147\040\113\157\156\147\061\022\060\020\006\003\125\004\007\023
+\011\110\157\156\147\040\113\157\156\147\061\026\060\024\006\003
+\125\004\012\023\015\110\157\156\147\153\157\156\147\040\120\157
+\163\164\061\040\060\036\006\003\125\004\003\023\027\110\157\156
+\147\153\157\156\147\040\120\157\163\164\040\122\157\157\164\040
+\103\101\040\063\060\202\002\042\060\015\006\011\052\206\110\206
+\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012
+\002\202\002\001\000\263\210\327\352\316\017\040\116\276\346\326
+\003\155\356\131\374\302\127\337\051\150\241\203\016\076\150\307
+\150\130\234\034\140\113\211\103\014\271\324\025\262\356\301\116
+\165\351\265\247\357\345\351\065\231\344\314\034\347\113\137\215
+\063\060\040\063\123\331\246\273\325\076\023\216\351\037\207\111
+\255\120\055\120\312\030\276\001\130\242\023\160\226\273\211\210
+\126\200\134\370\275\054\074\341\114\127\210\273\323\271\225\357
+\313\307\366\332\061\164\050\246\346\124\211\365\101\061\312\345
+\046\032\315\202\340\160\332\073\051\273\325\003\365\231\272\125
+\365\144\321\140\016\263\211\111\270\212\057\005\322\204\105\050
+\174\217\150\120\022\170\374\013\265\123\313\302\230\034\204\243
+\236\260\276\043\244\332\334\310\053\036\332\156\105\036\211\230
+\332\371\000\056\006\351\014\073\160\325\120\045\210\231\313\315
+\163\140\367\325\377\065\147\305\241\274\136\253\315\112\270\105
+\353\310\150\036\015\015\024\106\022\343\322\144\142\212\102\230
+\274\264\306\010\010\370\375\250\114\144\234\166\001\275\057\251
+\154\063\017\330\077\050\270\074\151\001\102\206\176\151\301\311
+\006\312\345\172\106\145\351\302\326\120\101\056\077\267\344\355
+\154\327\277\046\001\021\242\026\051\112\153\064\006\220\354\023
+\322\266\373\152\166\322\074\355\360\326\055\335\341\025\354\243
+\233\057\054\311\076\053\344\151\073\377\162\045\261\066\206\133
+\307\177\153\213\125\033\112\305\040\141\075\256\313\120\341\010
+\072\276\260\217\143\101\123\060\010\131\074\230\035\167\272\143
+\221\172\312\020\120\140\277\360\327\274\225\207\217\227\305\376
+\227\152\001\224\243\174\133\205\035\052\071\072\320\124\241\321
+\071\161\235\375\041\371\265\173\360\342\340\002\217\156\226\044
+\045\054\240\036\054\250\304\211\247\357\355\231\006\057\266\012
+\114\117\333\242\314\067\032\257\107\205\055\212\137\304\064\064
+\114\000\375\030\223\147\023\321\067\346\110\264\213\006\305\127
+\173\031\206\012\171\313\000\311\122\257\102\377\067\217\341\243
+\036\172\075\120\253\143\006\347\025\265\077\266\105\067\224\067
+\261\176\362\110\303\177\305\165\376\227\215\105\217\032\247\032
+\162\050\032\100\017\002\003\001\000\001\243\143\060\141\060\017
+\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060
+\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060
+\037\006\003\125\035\043\004\030\060\026\200\024\027\235\315\036
+\213\326\071\053\160\323\134\324\240\270\037\260\000\374\305\141
+\060\035\006\003\125\035\016\004\026\004\024\027\235\315\036\213
+\326\071\053\160\323\134\324\240\270\037\260\000\374\305\141\060
+\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202
+\002\001\000\126\325\173\156\346\042\001\322\102\233\030\325\016
+\327\146\043\134\343\376\240\307\222\322\351\224\255\113\242\306
+\354\022\174\164\325\110\322\131\024\231\300\353\271\321\353\364
+\110\060\133\255\247\127\163\231\251\323\345\267\321\056\131\044
+\130\334\150\056\056\142\330\152\344\160\013\055\040\120\040\244
+\062\225\321\000\230\273\323\375\367\062\362\111\256\306\172\340
+\107\276\156\316\313\243\162\072\055\151\135\313\310\350\105\071
+\324\372\102\301\021\114\167\135\222\373\152\377\130\104\345\353
+\201\236\257\240\231\255\276\251\001\146\313\070\035\074\337\103
+\037\364\115\156\264\272\027\106\374\175\375\207\201\171\152\015
+\063\017\372\057\370\024\271\200\263\135\115\252\227\341\371\344
+\030\305\370\325\070\214\046\074\375\362\050\342\356\132\111\210
+\054\337\171\075\216\236\220\074\275\101\112\072\335\133\366\232
+\264\316\077\045\060\177\062\175\242\003\224\320\334\172\241\122
+\336\156\223\215\030\046\375\125\254\275\217\233\322\317\257\347
+\206\054\313\037\011\157\243\157\251\204\324\163\277\115\241\164
+\033\116\043\140\362\314\016\252\177\244\234\114\045\250\262\146
+\073\070\377\331\224\060\366\162\204\276\150\125\020\017\306\163
+\054\026\151\223\007\376\261\105\355\273\242\125\152\260\332\265
+\112\002\045\047\205\327\267\267\206\104\026\211\154\200\053\076
+\227\251\234\325\176\125\114\306\336\105\020\034\352\351\073\237
+\003\123\356\356\172\001\002\026\170\324\350\302\276\106\166\210
+\023\077\042\273\110\022\035\122\000\264\002\176\041\032\036\234
+\045\364\363\075\136\036\322\034\371\263\055\266\367\067\134\306
+\313\041\116\260\367\231\107\030\205\301\053\272\125\256\006\352
+\320\007\262\334\253\320\202\226\165\316\322\120\376\231\347\317
+\057\237\347\166\321\141\052\373\041\273\061\320\252\237\107\244
+\262\042\312\026\072\120\127\304\133\103\147\305\145\142\003\111
+\001\353\103\331\330\370\236\255\317\261\143\016\105\364\240\132
+\054\233\055\305\246\300\255\250\107\364\047\114\070\015\056\033
+\111\073\122\364\350\210\203\053\124\050\324\362\065\122\264\062
+\203\142\151\144\014\221\234\237\227\352\164\026\375\037\021\006
+\232\233\364
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "emSign Root CA - C1"
-# Issuer: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US
-# Serial Number:00:ae:cf:00:ba:c4:cf:32:f8:43:b2
-# Subject: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US
-# Not Valid Before: Sun Feb 18 18:30:00 2018
-# Not Valid After : Wed Feb 18 18:30:00 2043
-# Fingerprint (SHA-256): 12:56:09:AA:30:1D:A0:A2:49:B9:7A:82:39:CB:6A:34:21:6F:44:DC:AC:9F:39:54:B1:42:92:F2:E8:C8:60:8F
-# Fingerprint (SHA1): E7:2E:F1:DF:FC:B2:09:28:CF:5D:D4:D5:67:37:B1:51:CB:86:4F:01
+# Trust for "Hongkong Post Root CA 3"
+# Issuer: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK
+# Serial Number:08:16:5f:8a:4c:a5:ec:00:c9:93:40:df:c4:c6:ae:23:b8:1c:5a:a4
+# Subject: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK
+# Not Valid Before: Sat Jun 03 02:29:46 2017
+# Not Valid After : Tue Jun 03 02:29:46 2042
+# Fingerprint (SHA-256): 5A:2F:C0:3F:0C:83:B0:90:BB:FA:40:60:4B:09:88:44:6C:76:36:18:3D:F9:84:6E:17:10:1A:44:7F:B8:EF:D6
+# Fingerprint (SHA1): 58:A2:D0:EC:20:52:81:5B:C1:F3:F8:64:02:24:4E:C2:8E:02:4B:02
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "emSign Root CA - C1"
+CKA_LABEL UTF8 "Hongkong Post Root CA 3"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\347\056\361\337\374\262\011\050\317\135\324\325\147\067\261\121
-\313\206\117\001
+\130\242\320\354\040\122\201\133\301\363\370\144\002\044\116\302
+\216\002\113\002
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\330\343\135\001\041\372\170\132\260\337\272\322\356\052\137\150
+\021\374\237\275\163\060\002\212\375\077\363\130\271\313\040\360
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
-\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006\003
-\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157\164
-\040\103\101\040\055\040\103\061
+\060\157\061\013\060\011\006\003\125\004\006\023\002\110\113\061
+\022\060\020\006\003\125\004\010\023\011\110\157\156\147\040\113
+\157\156\147\061\022\060\020\006\003\125\004\007\023\011\110\157
+\156\147\040\113\157\156\147\061\026\060\024\006\003\125\004\012
+\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164\061
+\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153\157
+\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101\040
+\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\013\000\256\317\000\272\304\317\062\370\103\262
+\002\024\010\026\137\212\114\245\354\000\311\223\100\337\304\306
+\256\043\270\034\132\244
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "emSign ECC Root CA - C3"
+# Certificate "Entrust Root Certification Authority - G4"
 #
-# Issuer: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US
-# Serial Number:7b:71:b6:82:56:b8:12:7c:9c:a8
-# Subject: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US
-# Not Valid Before: Sun Feb 18 18:30:00 2018
-# Not Valid After : Wed Feb 18 18:30:00 2043
-# Fingerprint (SHA-256): BC:4D:80:9B:15:18:9D:78:DB:3E:1D:8C:F4:F9:72:6A:79:5D:A1:64:3C:A5:F1:35:8E:1D:DB:0E:DC:0D:7E:B3
-# Fingerprint (SHA1): B6:AF:43:C2:9B:81:53:7D:F6:EF:6B:C3:1F:1F:60:15:0C:EE:48:66
+# Issuer: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US
+# Serial Number:00:d9:b5:43:7f:af:a9:39:0f:00:00:00:00:55:65:ad:58
+# Subject: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US
+# Not Valid Before: Wed May 27 11:11:16 2015
+# Not Valid After : Sun Dec 27 11:41:16 2037
+# Fingerprint (SHA-256): DB:35:17:D1:F6:73:2A:2D:5A:B9:7C:53:3E:C7:07:79:EE:32:70:A6:2F:B4:AC:42:38:37:24:60:E6:F0:1E:88
+# Fingerprint (SHA1): 14:88:4E:86:26:37:B0:26:AF:59:62:5C:40:77:EC:35:29:BA:96:01
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "emSign ECC Root CA - C3"
+CKA_LABEL UTF8 "Entrust Root Certification Authority - G4"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
-\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006\003
-\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103\040
-\122\157\157\164\040\103\101\040\055\040\103\063
+\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165
+\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
+\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165
+\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162
+\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051
+\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111
+\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162
+\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060
+\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040
+\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151
+\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107
+\064
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
-\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006\003
-\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103\040
-\122\157\157\164\040\103\101\040\055\040\103\063
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\012\173\161\266\202\126\270\022\174\234\250
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\002\053\060\202\001\261\240\003\002\001\002\002\012\173
-\161\266\202\126\270\022\174\234\250\060\012\006\010\052\206\110
-\316\075\004\003\003\060\132\061\013\060\011\006\003\125\004\006
-\023\002\125\123\061\023\060\021\006\003\125\004\013\023\012\145
-\155\123\151\147\156\040\120\113\111\061\024\060\022\006\003\125
-\004\012\023\013\145\115\165\144\150\162\141\040\111\156\143\061
-\040\060\036\006\003\125\004\003\023\027\145\155\123\151\147\156
-\040\105\103\103\040\122\157\157\164\040\103\101\040\055\040\103
-\063\060\036\027\015\061\070\060\062\061\070\061\070\063\060\060
-\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060\060
-\132\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147
-\156\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013
-\145\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006
-\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103
-\040\122\157\157\164\040\103\101\040\055\040\103\063\060\166\060
-\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000
-\042\003\142\000\004\375\245\141\256\173\046\020\035\351\267\042
-\060\256\006\364\201\263\261\102\161\225\071\274\323\122\343\257
-\257\371\362\227\065\222\066\106\016\207\225\215\271\071\132\351
-\273\337\320\376\310\007\101\074\273\125\157\203\243\152\373\142
-\260\201\211\002\160\175\110\305\112\343\351\042\124\042\115\223
-\273\102\014\257\167\234\043\246\175\327\141\021\316\145\307\370
-\177\376\365\362\251\243\102\060\100\060\035\006\003\125\035\016
-\004\026\004\024\373\132\110\320\200\040\100\362\250\351\000\007
-\151\031\167\247\346\303\364\317\060\016\006\003\125\035\017\001
-\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023\001
-\001\377\004\005\060\003\001\001\377\060\012\006\010\052\206\110
-\316\075\004\003\003\003\150\000\060\145\002\061\000\264\330\057
-\002\211\375\266\114\142\272\103\116\023\204\162\265\256\335\034
-\336\326\265\334\126\217\130\100\132\055\336\040\114\042\203\312
-\223\250\176\356\022\100\307\326\207\117\370\337\205\002\060\034
-\024\144\344\174\226\203\021\234\260\321\132\141\113\246\017\111
-\323\000\374\241\374\344\245\377\177\255\327\060\320\307\167\177
-\276\201\007\125\060\120\040\024\365\127\070\012\250\061\121
+\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165
+\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
+\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165
+\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162
+\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051
+\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111
+\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162
+\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060
+\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040
+\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151
+\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107
+\064
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\021\000\331\265\103\177\257\251\071\017\000\000\000\000\125
+\145\255\130
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\006\113\060\202\004\063\240\003\002\001\002\002\021\000
+\331\265\103\177\257\251\071\017\000\000\000\000\125\145\255\130
+\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060
+\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165\163
+\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004\013
+\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165\163
+\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162\155
+\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051\040
+\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111\156
+\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162\151
+\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060\060
+\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040\122
+\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107\064
+\060\036\027\015\061\065\060\065\062\067\061\061\061\061\061\066
+\132\027\015\063\067\061\062\062\067\061\061\064\061\061\066\132
+\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165
+\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
+\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165
+\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162
+\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051
+\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111
+\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162
+\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060
+\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040
+\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151
+\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107
+\064\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001
+\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002
+\001\000\261\354\054\102\356\342\321\060\377\245\222\107\342\055
+\303\272\144\227\155\312\367\015\265\131\301\263\313\250\150\031
+\330\257\204\155\060\160\135\176\363\056\322\123\231\341\376\037
+\136\331\110\257\135\023\215\333\377\143\063\115\323\000\002\274
+\304\370\321\006\010\224\171\130\212\025\336\051\263\375\375\304
+\117\350\252\342\240\073\171\315\277\153\103\062\335\331\164\020
+\271\367\364\150\324\273\320\207\325\252\113\212\052\157\052\004
+\265\262\246\307\240\172\346\110\253\322\321\131\314\326\176\043
+\346\227\154\360\102\345\334\121\113\025\101\355\111\112\311\336
+\020\227\326\166\301\357\245\265\066\024\227\065\330\170\042\065
+\122\357\103\275\333\047\333\141\126\202\064\334\313\210\140\014
+\013\132\345\054\001\306\124\257\327\252\301\020\173\322\005\132
+\270\100\236\206\247\303\220\206\002\126\122\011\172\234\322\047
+\202\123\112\145\122\152\365\074\347\250\362\234\257\213\275\323
+\016\324\324\136\156\207\236\152\075\105\035\321\135\033\364\351
+\012\254\140\231\373\211\264\377\230\054\317\174\035\351\002\252
+\004\232\036\270\334\210\156\045\263\154\146\367\074\220\363\127
+\301\263\057\365\155\362\373\312\241\370\051\235\106\213\263\152
+\366\346\147\007\276\054\147\012\052\037\132\262\076\127\304\323
+\041\041\143\145\122\221\033\261\231\216\171\176\346\353\215\000
+\331\132\252\352\163\350\244\202\002\107\226\376\133\216\124\141
+\243\353\057\113\060\260\213\043\165\162\174\041\074\310\366\361
+\164\324\034\173\243\005\125\356\273\115\073\062\276\232\167\146
+\236\254\151\220\042\007\037\141\072\226\276\345\232\117\314\005
+\074\050\131\323\301\014\124\250\131\141\275\310\162\114\350\334
+\237\207\177\275\234\110\066\136\225\243\016\271\070\044\125\374
+\165\146\353\002\343\010\064\051\112\306\343\053\057\063\240\332
+\243\206\245\022\227\375\200\053\332\024\102\343\222\275\076\362
+\135\136\147\164\056\034\210\107\051\064\137\342\062\250\234\045
+\067\214\272\230\000\227\213\111\226\036\375\045\212\254\334\332
+\330\135\164\156\146\260\377\104\337\241\030\306\276\110\057\067
+\224\170\370\225\112\077\177\023\136\135\131\375\164\206\103\143
+\163\111\002\003\001\000\001\243\102\060\100\060\017\006\003\125
+\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003
+\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003
+\125\035\016\004\026\004\024\237\070\304\126\043\303\071\350\240
+\161\154\350\124\114\344\350\072\261\277\147\060\015\006\011\052
+\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\022
+\345\102\246\173\213\017\014\344\106\245\266\140\100\207\214\045
+\176\255\270\150\056\133\306\100\166\074\003\370\311\131\364\363
+\253\142\316\020\215\264\132\144\214\150\300\260\162\103\064\322
+\033\013\366\054\123\322\312\220\113\206\146\374\252\203\042\364
+\213\032\157\046\110\254\166\167\010\277\305\230\134\364\046\211
+\236\173\303\271\144\062\001\177\323\303\335\130\155\354\261\253
+\204\125\164\167\204\004\047\122\153\206\114\316\335\271\145\377
+\326\306\136\237\232\020\231\113\165\152\376\152\351\227\040\344
+\344\166\172\306\320\044\252\220\315\040\220\272\107\144\373\177
+\007\263\123\170\265\012\142\362\163\103\316\101\053\201\152\056
+\205\026\224\123\324\153\137\162\042\253\121\055\102\325\000\234
+\231\277\336\273\224\073\127\375\232\365\206\313\126\073\133\210
+\001\345\174\050\113\003\371\111\203\174\262\177\174\343\355\216
+\241\177\140\123\216\125\235\120\064\022\017\267\227\173\154\207
+\112\104\347\365\155\354\200\067\360\130\031\156\112\150\166\360
+\037\222\344\352\265\222\323\141\121\020\013\255\247\331\137\307
+\137\334\037\243\134\214\241\176\233\267\236\323\126\157\146\136
+\007\226\040\355\013\164\373\146\116\213\021\025\351\201\111\176
+\157\260\324\120\177\042\327\137\145\002\015\246\364\205\036\330
+\256\006\113\112\247\322\061\146\302\370\316\345\010\246\244\002
+\226\104\150\127\304\325\063\317\031\057\024\304\224\034\173\244
+\331\360\237\016\261\200\342\321\236\021\144\251\210\021\072\166
+\202\345\142\302\200\330\244\203\355\223\357\174\057\220\260\062
+\114\226\025\150\110\122\324\231\010\300\044\350\034\343\263\245
+\041\016\222\300\220\037\317\040\137\312\073\070\307\267\155\072
+\363\346\104\270\016\061\153\210\216\160\353\234\027\122\250\101
+\224\056\207\266\347\246\022\305\165\337\133\300\012\156\173\244
+\344\136\206\371\066\224\337\167\303\351\015\300\071\361\171\273
+\106\216\253\103\131\047\267\040\273\043\351\126\100\041\354\061
+\075\145\252\103\362\075\337\160\104\341\272\115\046\020\073\230
+\237\363\310\216\033\070\126\041\152\121\223\323\221\312\106\332
+\211\267\075\123\203\054\010\037\213\217\123\335\377\254\037
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "emSign ECC Root CA - C3"
-# Issuer: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US
-# Serial Number:7b:71:b6:82:56:b8:12:7c:9c:a8
-# Subject: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US
-# Not Valid Before: Sun Feb 18 18:30:00 2018
-# Not Valid After : Wed Feb 18 18:30:00 2043
-# Fingerprint (SHA-256): BC:4D:80:9B:15:18:9D:78:DB:3E:1D:8C:F4:F9:72:6A:79:5D:A1:64:3C:A5:F1:35:8E:1D:DB:0E:DC:0D:7E:B3
-# Fingerprint (SHA1): B6:AF:43:C2:9B:81:53:7D:F6:EF:6B:C3:1F:1F:60:15:0C:EE:48:66
+# Trust for "Entrust Root Certification Authority - G4"
+# Issuer: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US
+# Serial Number:00:d9:b5:43:7f:af:a9:39:0f:00:00:00:00:55:65:ad:58
+# Subject: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US
+# Not Valid Before: Wed May 27 11:11:16 2015
+# Not Valid After : Sun Dec 27 11:41:16 2037
+# Fingerprint (SHA-256): DB:35:17:D1:F6:73:2A:2D:5A:B9:7C:53:3E:C7:07:79:EE:32:70:A6:2F:B4:AC:42:38:37:24:60:E6:F0:1E:88
+# Fingerprint (SHA1): 14:88:4E:86:26:37:B0:26:AF:59:62:5C:40:77:EC:35:29:BA:96:01
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "emSign ECC Root CA - C3"
+CKA_LABEL UTF8 "Entrust Root Certification Authority - G4"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\266\257\103\302\233\201\123\175\366\357\153\303\037\037\140\025
-\014\356\110\146
+\024\210\116\206\046\067\260\046\257\131\142\134\100\167\354\065
+\051\272\226\001
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\076\123\263\243\201\356\327\020\370\323\260\035\027\222\365\325
+\211\123\361\203\043\267\174\216\005\361\214\161\070\116\037\210
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156
-\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145
-\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006\003
-\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103\040
-\122\157\157\164\040\103\101\040\055\040\103\063
+\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165
+\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
+\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165
+\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162
+\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051
+\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111
+\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162
+\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060
+\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040
+\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151
+\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107
+\064
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\012\173\161\266\202\126\270\022\174\234\250
+\002\021\000\331\265\103\177\257\251\071\017\000\000\000\000\125
+\145\255\130
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
@@ -19400,179 +18094,120 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Hongkong Post Root CA 3"
+# Certificate "Microsoft ECC Root Certificate Authority 2017"
 #
-# Issuer: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK
-# Serial Number:08:16:5f:8a:4c:a5:ec:00:c9:93:40:df:c4:c6:ae:23:b8:1c:5a:a4
-# Subject: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK
-# Not Valid Before: Sat Jun 03 02:29:46 2017
-# Not Valid After : Tue Jun 03 02:29:46 2042
-# Fingerprint (SHA-256): 5A:2F:C0:3F:0C:83:B0:90:BB:FA:40:60:4B:09:88:44:6C:76:36:18:3D:F9:84:6E:17:10:1A:44:7F:B8:EF:D6
-# Fingerprint (SHA1): 58:A2:D0:EC:20:52:81:5B:C1:F3:F8:64:02:24:4E:C2:8E:02:4B:02
+# Issuer: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US
+# Serial Number:66:f2:3d:af:87:de:8b:b1:4a:ea:0c:57:31:01:c2:ec
+# Subject: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US
+# Not Valid Before: Wed Dec 18 23:06:45 2019
+# Not Valid After : Fri Jul 18 23:16:04 2042
+# Fingerprint (SHA-256): 35:8D:F3:9D:76:4A:F9:E1:B7:66:E9:C9:72:DF:35:2E:E1:5C:FA:C2:27:AF:6A:D1:D7:0E:8E:4A:6E:DC:BA:02
+# Fingerprint (SHA1): 99:9A:64:C3:7F:F4:7D:9F:AB:95:F1:47:69:89:14:60:EE:C4:C3:C5
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Hongkong Post Root CA 3"
+CKA_LABEL UTF8 "Microsoft ECC Root Certificate Authority 2017"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\157\061\013\060\011\006\003\125\004\006\023\002\110\113\061
-\022\060\020\006\003\125\004\010\023\011\110\157\156\147\040\113
-\157\156\147\061\022\060\020\006\003\125\004\007\023\011\110\157
-\156\147\040\113\157\156\147\061\026\060\024\006\003\125\004\012
-\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164\061
-\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153\157
-\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101\040
-\063
+\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
+\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
+\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
+\157\146\164\040\105\103\103\040\122\157\157\164\040\103\145\162
+\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
+\164\171\040\062\060\061\067
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\157\061\013\060\011\006\003\125\004\006\023\002\110\113\061
-\022\060\020\006\003\125\004\010\023\011\110\157\156\147\040\113
-\157\156\147\061\022\060\020\006\003\125\004\007\023\011\110\157
-\156\147\040\113\157\156\147\061\026\060\024\006\003\125\004\012
-\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164\061
-\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153\157
-\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101\040
-\063
+\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
+\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
+\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
+\157\146\164\040\105\103\103\040\122\157\157\164\040\103\145\162
+\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
+\164\171\040\062\060\061\067
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\024\010\026\137\212\114\245\354\000\311\223\100\337\304\306
-\256\043\270\034\132\244
+\002\020\146\362\075\257\207\336\213\261\112\352\014\127\061\001
+\302\354
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\317\060\202\003\267\240\003\002\001\002\002\024\010
-\026\137\212\114\245\354\000\311\223\100\337\304\306\256\043\270
-\034\132\244\060\015\006\011\052\206\110\206\367\015\001\001\013
-\005\000\060\157\061\013\060\011\006\003\125\004\006\023\002\110
-\113\061\022\060\020\006\003\125\004\010\023\011\110\157\156\147
-\040\113\157\156\147\061\022\060\020\006\003\125\004\007\023\011
-\110\157\156\147\040\113\157\156\147\061\026\060\024\006\003\125
-\004\012\023\015\110\157\156\147\153\157\156\147\040\120\157\163
-\164\061\040\060\036\006\003\125\004\003\023\027\110\157\156\147
-\153\157\156\147\040\120\157\163\164\040\122\157\157\164\040\103
-\101\040\063\060\036\027\015\061\067\060\066\060\063\060\062\062
-\071\064\066\132\027\015\064\062\060\066\060\063\060\062\062\071
-\064\066\132\060\157\061\013\060\011\006\003\125\004\006\023\002
-\110\113\061\022\060\020\006\003\125\004\010\023\011\110\157\156
-\147\040\113\157\156\147\061\022\060\020\006\003\125\004\007\023
-\011\110\157\156\147\040\113\157\156\147\061\026\060\024\006\003
-\125\004\012\023\015\110\157\156\147\153\157\156\147\040\120\157
-\163\164\061\040\060\036\006\003\125\004\003\023\027\110\157\156
-\147\153\157\156\147\040\120\157\163\164\040\122\157\157\164\040
-\103\101\040\063\060\202\002\042\060\015\006\011\052\206\110\206
-\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012
-\002\202\002\001\000\263\210\327\352\316\017\040\116\276\346\326
-\003\155\356\131\374\302\127\337\051\150\241\203\016\076\150\307
-\150\130\234\034\140\113\211\103\014\271\324\025\262\356\301\116
-\165\351\265\247\357\345\351\065\231\344\314\034\347\113\137\215
-\063\060\040\063\123\331\246\273\325\076\023\216\351\037\207\111
-\255\120\055\120\312\030\276\001\130\242\023\160\226\273\211\210
-\126\200\134\370\275\054\074\341\114\127\210\273\323\271\225\357
-\313\307\366\332\061\164\050\246\346\124\211\365\101\061\312\345
-\046\032\315\202\340\160\332\073\051\273\325\003\365\231\272\125
-\365\144\321\140\016\263\211\111\270\212\057\005\322\204\105\050
-\174\217\150\120\022\170\374\013\265\123\313\302\230\034\204\243
-\236\260\276\043\244\332\334\310\053\036\332\156\105\036\211\230
-\332\371\000\056\006\351\014\073\160\325\120\045\210\231\313\315
-\163\140\367\325\377\065\147\305\241\274\136\253\315\112\270\105
-\353\310\150\036\015\015\024\106\022\343\322\144\142\212\102\230
-\274\264\306\010\010\370\375\250\114\144\234\166\001\275\057\251
-\154\063\017\330\077\050\270\074\151\001\102\206\176\151\301\311
-\006\312\345\172\106\145\351\302\326\120\101\056\077\267\344\355
-\154\327\277\046\001\021\242\026\051\112\153\064\006\220\354\023
-\322\266\373\152\166\322\074\355\360\326\055\335\341\025\354\243
-\233\057\054\311\076\053\344\151\073\377\162\045\261\066\206\133
-\307\177\153\213\125\033\112\305\040\141\075\256\313\120\341\010
-\072\276\260\217\143\101\123\060\010\131\074\230\035\167\272\143
-\221\172\312\020\120\140\277\360\327\274\225\207\217\227\305\376
-\227\152\001\224\243\174\133\205\035\052\071\072\320\124\241\321
-\071\161\235\375\041\371\265\173\360\342\340\002\217\156\226\044
-\045\054\240\036\054\250\304\211\247\357\355\231\006\057\266\012
-\114\117\333\242\314\067\032\257\107\205\055\212\137\304\064\064
-\114\000\375\030\223\147\023\321\067\346\110\264\213\006\305\127
-\173\031\206\012\171\313\000\311\122\257\102\377\067\217\341\243
-\036\172\075\120\253\143\006\347\025\265\077\266\105\067\224\067
-\261\176\362\110\303\177\305\165\376\227\215\105\217\032\247\032
-\162\050\032\100\017\002\003\001\000\001\243\143\060\141\060\017
-\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060
-\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060
-\037\006\003\125\035\043\004\030\060\026\200\024\027\235\315\036
-\213\326\071\053\160\323\134\324\240\270\037\260\000\374\305\141
-\060\035\006\003\125\035\016\004\026\004\024\027\235\315\036\213
-\326\071\053\160\323\134\324\240\270\037\260\000\374\305\141\060
-\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202
-\002\001\000\126\325\173\156\346\042\001\322\102\233\030\325\016
-\327\146\043\134\343\376\240\307\222\322\351\224\255\113\242\306
-\354\022\174\164\325\110\322\131\024\231\300\353\271\321\353\364
-\110\060\133\255\247\127\163\231\251\323\345\267\321\056\131\044
-\130\334\150\056\056\142\330\152\344\160\013\055\040\120\040\244
-\062\225\321\000\230\273\323\375\367\062\362\111\256\306\172\340
-\107\276\156\316\313\243\162\072\055\151\135\313\310\350\105\071
-\324\372\102\301\021\114\167\135\222\373\152\377\130\104\345\353
-\201\236\257\240\231\255\276\251\001\146\313\070\035\074\337\103
-\037\364\115\156\264\272\027\106\374\175\375\207\201\171\152\015
-\063\017\372\057\370\024\271\200\263\135\115\252\227\341\371\344
-\030\305\370\325\070\214\046\074\375\362\050\342\356\132\111\210
-\054\337\171\075\216\236\220\074\275\101\112\072\335\133\366\232
-\264\316\077\045\060\177\062\175\242\003\224\320\334\172\241\122
-\336\156\223\215\030\046\375\125\254\275\217\233\322\317\257\347
-\206\054\313\037\011\157\243\157\251\204\324\163\277\115\241\164
-\033\116\043\140\362\314\016\252\177\244\234\114\045\250\262\146
-\073\070\377\331\224\060\366\162\204\276\150\125\020\017\306\163
-\054\026\151\223\007\376\261\105\355\273\242\125\152\260\332\265
-\112\002\045\047\205\327\267\267\206\104\026\211\154\200\053\076
-\227\251\234\325\176\125\114\306\336\105\020\034\352\351\073\237
-\003\123\356\356\172\001\002\026\170\324\350\302\276\106\166\210
-\023\077\042\273\110\022\035\122\000\264\002\176\041\032\036\234
-\045\364\363\075\136\036\322\034\371\263\055\266\367\067\134\306
-\313\041\116\260\367\231\107\030\205\301\053\272\125\256\006\352
-\320\007\262\334\253\320\202\226\165\316\322\120\376\231\347\317
-\057\237\347\166\321\141\052\373\041\273\061\320\252\237\107\244
-\262\042\312\026\072\120\127\304\133\103\147\305\145\142\003\111
-\001\353\103\331\330\370\236\255\317\261\143\016\105\364\240\132
-\054\233\055\305\246\300\255\250\107\364\047\114\070\015\056\033
-\111\073\122\364\350\210\203\053\124\050\324\362\065\122\264\062
-\203\142\151\144\014\221\234\237\227\352\164\026\375\037\021\006
-\232\233\364
+\060\202\002\131\060\202\001\337\240\003\002\001\002\002\020\146
+\362\075\257\207\336\213\261\112\352\014\127\061\001\302\354\060
+\012\006\010\052\206\110\316\075\004\003\003\060\145\061\013\060
+\011\006\003\125\004\006\023\002\125\123\061\036\060\034\006\003
+\125\004\012\023\025\115\151\143\162\157\163\157\146\164\040\103
+\157\162\160\157\162\141\164\151\157\156\061\066\060\064\006\003
+\125\004\003\023\055\115\151\143\162\157\163\157\146\164\040\105
+\103\103\040\122\157\157\164\040\103\145\162\164\151\146\151\143
+\141\164\145\040\101\165\164\150\157\162\151\164\171\040\062\060
+\061\067\060\036\027\015\061\071\061\062\061\070\062\063\060\066
+\064\065\132\027\015\064\062\060\067\061\070\062\063\061\066\060
+\064\132\060\145\061\013\060\011\006\003\125\004\006\023\002\125
+\123\061\036\060\034\006\003\125\004\012\023\025\115\151\143\162
+\157\163\157\146\164\040\103\157\162\160\157\162\141\164\151\157
+\156\061\066\060\064\006\003\125\004\003\023\055\115\151\143\162
+\157\163\157\146\164\040\105\103\103\040\122\157\157\164\040\103
+\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157
+\162\151\164\171\040\062\060\061\067\060\166\060\020\006\007\052
+\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142\000
+\004\324\274\075\002\102\165\101\023\043\315\200\004\206\002\121
+\057\152\250\201\142\013\145\314\366\312\235\036\157\112\146\121
+\242\003\331\235\221\372\266\026\261\214\156\336\174\315\333\171
+\246\057\316\273\316\161\057\345\245\253\050\354\143\004\146\231
+\370\372\362\223\020\005\341\201\050\102\343\306\150\364\346\033
+\204\140\112\211\257\355\171\017\073\316\361\366\104\365\001\170
+\300\243\124\060\122\060\016\006\003\125\035\017\001\001\377\004
+\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377\004
+\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004
+\024\310\313\231\162\160\122\014\370\346\276\262\004\127\051\052
+\317\102\020\355\065\060\020\006\011\053\006\001\004\001\202\067
+\025\001\004\003\002\001\000\060\012\006\010\052\206\110\316\075
+\004\003\003\003\150\000\060\145\002\060\130\362\115\352\014\371
+\137\136\356\140\051\313\072\362\333\326\062\204\031\077\174\325
+\057\302\261\314\223\256\120\273\011\062\306\306\355\176\311\066
+\224\022\344\150\205\006\242\033\320\057\002\061\000\231\351\026
+\264\016\372\126\110\324\244\060\026\221\170\333\124\214\145\001
+\212\347\120\146\302\061\267\071\272\270\032\042\007\116\374\153
+\124\026\040\377\053\265\347\114\014\115\246\117\163
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "Hongkong Post Root CA 3"
-# Issuer: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK
-# Serial Number:08:16:5f:8a:4c:a5:ec:00:c9:93:40:df:c4:c6:ae:23:b8:1c:5a:a4
-# Subject: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK
-# Not Valid Before: Sat Jun 03 02:29:46 2017
-# Not Valid After : Tue Jun 03 02:29:46 2042
-# Fingerprint (SHA-256): 5A:2F:C0:3F:0C:83:B0:90:BB:FA:40:60:4B:09:88:44:6C:76:36:18:3D:F9:84:6E:17:10:1A:44:7F:B8:EF:D6
-# Fingerprint (SHA1): 58:A2:D0:EC:20:52:81:5B:C1:F3:F8:64:02:24:4E:C2:8E:02:4B:02
+# Trust for "Microsoft ECC Root Certificate Authority 2017"
+# Issuer: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US
+# Serial Number:66:f2:3d:af:87:de:8b:b1:4a:ea:0c:57:31:01:c2:ec
+# Subject: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US
+# Not Valid Before: Wed Dec 18 23:06:45 2019
+# Not Valid After : Fri Jul 18 23:16:04 2042
+# Fingerprint (SHA-256): 35:8D:F3:9D:76:4A:F9:E1:B7:66:E9:C9:72:DF:35:2E:E1:5C:FA:C2:27:AF:6A:D1:D7:0E:8E:4A:6E:DC:BA:02
+# Fingerprint (SHA1): 99:9A:64:C3:7F:F4:7D:9F:AB:95:F1:47:69:89:14:60:EE:C4:C3:C5
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Hongkong Post Root CA 3"
+CKA_LABEL UTF8 "Microsoft ECC Root Certificate Authority 2017"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\130\242\320\354\040\122\201\133\301\363\370\144\002\044\116\302
-\216\002\113\002
+\231\232\144\303\177\364\175\237\253\225\361\107\151\211\024\140
+\356\304\303\305
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\021\374\237\275\163\060\002\212\375\077\363\130\271\313\040\360
+\335\241\003\346\112\223\020\321\277\360\031\102\313\376\355\147
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\157\061\013\060\011\006\003\125\004\006\023\002\110\113\061
-\022\060\020\006\003\125\004\010\023\011\110\157\156\147\040\113
-\157\156\147\061\022\060\020\006\003\125\004\007\023\011\110\157
-\156\147\040\113\157\156\147\061\026\060\024\006\003\125\004\012
-\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164\061
-\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153\157
-\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101\040
-\063
+\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
+\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
+\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
+\157\146\164\040\105\103\103\040\122\157\157\164\040\103\145\162
+\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
+\164\171\040\062\060\061\067
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\024\010\026\137\212\114\245\354\000\311\223\100\337\304\306
-\256\043\270\034\132\244
+\002\020\146\362\075\257\207\336\213\261\112\352\014\127\061\001
+\302\354
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
@@ -19580,654 +18215,333 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Entrust Root Certification Authority - G4"
+# Certificate "Microsoft RSA Root Certificate Authority 2017"
 #
-# Issuer: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US
-# Serial Number:00:d9:b5:43:7f:af:a9:39:0f:00:00:00:00:55:65:ad:58
-# Subject: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US
-# Not Valid Before: Wed May 27 11:11:16 2015
-# Not Valid After : Sun Dec 27 11:41:16 2037
-# Fingerprint (SHA-256): DB:35:17:D1:F6:73:2A:2D:5A:B9:7C:53:3E:C7:07:79:EE:32:70:A6:2F:B4:AC:42:38:37:24:60:E6:F0:1E:88
-# Fingerprint (SHA1): 14:88:4E:86:26:37:B0:26:AF:59:62:5C:40:77:EC:35:29:BA:96:01
+# Issuer: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US
+# Serial Number:1e:d3:97:09:5f:d8:b4:b3:47:70:1e:aa:be:7f:45:b3
+# Subject: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US
+# Not Valid Before: Wed Dec 18 22:51:22 2019
+# Not Valid After : Fri Jul 18 23:00:23 2042
+# Fingerprint (SHA-256): C7:41:F7:0F:4B:2A:8D:88:BF:2E:71:C1:41:22:EF:53:EF:10:EB:A0:CF:A5:E6:4C:FA:20:F4:18:85:30:73:E0
+# Fingerprint (SHA1): 73:A5:E6:4A:3B:FF:83:16:FF:0E:DC:CC:61:8A:90:6E:4E:AE:4D:74
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Entrust Root Certification Authority - G4"
+CKA_LABEL UTF8 "Microsoft RSA Root Certificate Authority 2017"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165
-\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
-\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165
-\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162
-\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051
-\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111
-\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162
-\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060
-\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040
-\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151
-\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107
-\064
+\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
+\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
+\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
+\157\146\164\040\122\123\101\040\122\157\157\164\040\103\145\162
+\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
+\164\171\040\062\060\061\067
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165
-\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
-\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165
-\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162
-\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051
-\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111
-\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162
-\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060
-\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040
-\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151
-\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107
-\064
+\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
+\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
+\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
+\157\146\164\040\122\123\101\040\122\157\157\164\040\103\145\162
+\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
+\164\171\040\062\060\061\067
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\021\000\331\265\103\177\257\251\071\017\000\000\000\000\125
-\145\255\130
+\002\020\036\323\227\011\137\330\264\263\107\160\036\252\276\177
+\105\263
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\006\113\060\202\004\063\240\003\002\001\002\002\021\000
-\331\265\103\177\257\251\071\017\000\000\000\000\125\145\255\130
-\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060
-\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165\163
-\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004\013
-\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165\163
-\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162\155
-\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051\040
-\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111\156
-\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162\151
-\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060\060
-\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040\122
-\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107\064
-\060\036\027\015\061\065\060\065\062\067\061\061\061\061\061\066
-\132\027\015\063\067\061\062\062\067\061\061\064\061\061\066\132
-\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165
-\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
-\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165
-\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162
-\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051
-\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111
-\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162
-\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060
-\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040
-\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151
-\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107
-\064\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001
-\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002
-\001\000\261\354\054\102\356\342\321\060\377\245\222\107\342\055
-\303\272\144\227\155\312\367\015\265\131\301\263\313\250\150\031
-\330\257\204\155\060\160\135\176\363\056\322\123\231\341\376\037
-\136\331\110\257\135\023\215\333\377\143\063\115\323\000\002\274
-\304\370\321\006\010\224\171\130\212\025\336\051\263\375\375\304
-\117\350\252\342\240\073\171\315\277\153\103\062\335\331\164\020
-\271\367\364\150\324\273\320\207\325\252\113\212\052\157\052\004
-\265\262\246\307\240\172\346\110\253\322\321\131\314\326\176\043
-\346\227\154\360\102\345\334\121\113\025\101\355\111\112\311\336
-\020\227\326\166\301\357\245\265\066\024\227\065\330\170\042\065
-\122\357\103\275\333\047\333\141\126\202\064\334\313\210\140\014
-\013\132\345\054\001\306\124\257\327\252\301\020\173\322\005\132
-\270\100\236\206\247\303\220\206\002\126\122\011\172\234\322\047
-\202\123\112\145\122\152\365\074\347\250\362\234\257\213\275\323
-\016\324\324\136\156\207\236\152\075\105\035\321\135\033\364\351
-\012\254\140\231\373\211\264\377\230\054\317\174\035\351\002\252
-\004\232\036\270\334\210\156\045\263\154\146\367\074\220\363\127
-\301\263\057\365\155\362\373\312\241\370\051\235\106\213\263\152
-\366\346\147\007\276\054\147\012\052\037\132\262\076\127\304\323
-\041\041\143\145\122\221\033\261\231\216\171\176\346\353\215\000
-\331\132\252\352\163\350\244\202\002\107\226\376\133\216\124\141
-\243\353\057\113\060\260\213\043\165\162\174\041\074\310\366\361
-\164\324\034\173\243\005\125\356\273\115\073\062\276\232\167\146
-\236\254\151\220\042\007\037\141\072\226\276\345\232\117\314\005
-\074\050\131\323\301\014\124\250\131\141\275\310\162\114\350\334
-\237\207\177\275\234\110\066\136\225\243\016\271\070\044\125\374
-\165\146\353\002\343\010\064\051\112\306\343\053\057\063\240\332
-\243\206\245\022\227\375\200\053\332\024\102\343\222\275\076\362
-\135\136\147\164\056\034\210\107\051\064\137\342\062\250\234\045
-\067\214\272\230\000\227\213\111\226\036\375\045\212\254\334\332
-\330\135\164\156\146\260\377\104\337\241\030\306\276\110\057\067
-\224\170\370\225\112\077\177\023\136\135\131\375\164\206\103\143
-\163\111\002\003\001\000\001\243\102\060\100\060\017\006\003\125
-\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003
-\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003
-\125\035\016\004\026\004\024\237\070\304\126\043\303\071\350\240
-\161\154\350\124\114\344\350\072\261\277\147\060\015\006\011\052
-\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\022
-\345\102\246\173\213\017\014\344\106\245\266\140\100\207\214\045
-\176\255\270\150\056\133\306\100\166\074\003\370\311\131\364\363
-\253\142\316\020\215\264\132\144\214\150\300\260\162\103\064\322
-\033\013\366\054\123\322\312\220\113\206\146\374\252\203\042\364
-\213\032\157\046\110\254\166\167\010\277\305\230\134\364\046\211
-\236\173\303\271\144\062\001\177\323\303\335\130\155\354\261\253
-\204\125\164\167\204\004\047\122\153\206\114\316\335\271\145\377
-\326\306\136\237\232\020\231\113\165\152\376\152\351\227\040\344
-\344\166\172\306\320\044\252\220\315\040\220\272\107\144\373\177
-\007\263\123\170\265\012\142\362\163\103\316\101\053\201\152\056
-\205\026\224\123\324\153\137\162\042\253\121\055\102\325\000\234
-\231\277\336\273\224\073\127\375\232\365\206\313\126\073\133\210
-\001\345\174\050\113\003\371\111\203\174\262\177\174\343\355\216
-\241\177\140\123\216\125\235\120\064\022\017\267\227\173\154\207
-\112\104\347\365\155\354\200\067\360\130\031\156\112\150\166\360
-\037\222\344\352\265\222\323\141\121\020\013\255\247\331\137\307
-\137\334\037\243\134\214\241\176\233\267\236\323\126\157\146\136
-\007\226\040\355\013\164\373\146\116\213\021\025\351\201\111\176
-\157\260\324\120\177\042\327\137\145\002\015\246\364\205\036\330
-\256\006\113\112\247\322\061\146\302\370\316\345\010\246\244\002
-\226\104\150\127\304\325\063\317\031\057\024\304\224\034\173\244
-\331\360\237\016\261\200\342\321\236\021\144\251\210\021\072\166
-\202\345\142\302\200\330\244\203\355\223\357\174\057\220\260\062
-\114\226\025\150\110\122\324\231\010\300\044\350\034\343\263\245
-\041\016\222\300\220\037\317\040\137\312\073\070\307\267\155\072
-\363\346\104\270\016\061\153\210\216\160\353\234\027\122\250\101
-\224\056\207\266\347\246\022\305\165\337\133\300\012\156\173\244
-\344\136\206\371\066\224\337\167\303\351\015\300\071\361\171\273
-\106\216\253\103\131\047\267\040\273\043\351\126\100\041\354\061
-\075\145\252\103\362\075\337\160\104\341\272\115\046\020\073\230
-\237\363\310\216\033\070\126\041\152\121\223\323\221\312\106\332
-\211\267\075\123\203\054\010\037\213\217\123\335\377\254\037
+\060\202\005\250\060\202\003\220\240\003\002\001\002\002\020\036
+\323\227\011\137\330\264\263\107\160\036\252\276\177\105\263\060
+\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\145
+\061\013\060\011\006\003\125\004\006\023\002\125\123\061\036\060
+\034\006\003\125\004\012\023\025\115\151\143\162\157\163\157\146
+\164\040\103\157\162\160\157\162\141\164\151\157\156\061\066\060
+\064\006\003\125\004\003\023\055\115\151\143\162\157\163\157\146
+\164\040\122\123\101\040\122\157\157\164\040\103\145\162\164\151
+\146\151\143\141\164\145\040\101\165\164\150\157\162\151\164\171
+\040\062\060\061\067\060\036\027\015\061\071\061\062\061\070\062
+\062\065\061\062\062\132\027\015\064\062\060\067\061\070\062\063
+\060\060\062\063\132\060\145\061\013\060\011\006\003\125\004\006
+\023\002\125\123\061\036\060\034\006\003\125\004\012\023\025\115
+\151\143\162\157\163\157\146\164\040\103\157\162\160\157\162\141
+\164\151\157\156\061\066\060\064\006\003\125\004\003\023\055\115
+\151\143\162\157\163\157\146\164\040\122\123\101\040\122\157\157
+\164\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165
+\164\150\157\162\151\164\171\040\062\060\061\067\060\202\002\042
+\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003
+\202\002\017\000\060\202\002\012\002\202\002\001\000\312\133\276
+\224\063\214\051\225\221\026\012\225\275\107\142\301\211\363\231
+\066\337\106\220\311\245\355\170\152\157\107\221\150\370\047\147
+\120\063\035\241\246\373\340\345\103\243\204\002\127\001\135\234
+\110\100\202\123\020\274\277\307\073\150\220\266\202\055\345\364
+\145\320\314\155\031\314\225\371\173\254\112\224\255\016\336\113
+\103\035\207\007\222\023\220\200\203\144\065\071\004\374\345\351
+\154\263\266\037\120\224\070\145\120\134\027\106\271\266\205\265
+\034\265\027\350\326\105\235\330\262\046\260\312\304\160\112\256
+\140\244\335\263\331\354\374\073\325\127\162\274\077\310\311\262
+\336\113\153\370\043\154\003\300\005\275\225\307\315\163\073\146
+\200\144\343\032\254\056\371\107\005\362\006\266\233\163\365\170
+\063\133\307\241\373\047\052\241\264\232\221\214\221\323\072\202
+\076\166\100\264\315\122\141\121\160\050\077\305\305\132\362\311
+\214\111\273\024\133\115\310\377\147\115\114\022\226\255\365\376
+\170\250\227\207\327\375\136\040\200\334\241\113\042\373\324\211
+\255\272\316\107\227\107\125\173\217\105\310\147\050\204\225\034
+\150\060\357\357\111\340\065\173\144\347\230\260\224\332\115\205
+\073\076\125\304\050\257\127\363\236\023\333\106\047\237\036\242
+\136\104\203\244\245\312\325\023\263\113\077\304\343\302\346\206
+\141\244\122\060\271\172\040\117\157\017\070\123\313\063\014\023
+\053\217\326\232\275\052\310\055\261\034\175\113\121\312\107\321
+\110\047\162\135\207\353\325\105\346\110\145\235\257\122\220\272
+\133\242\030\145\127\022\237\150\271\324\025\153\224\304\151\042
+\230\364\063\340\355\371\121\216\101\120\311\064\117\166\220\254
+\374\070\301\330\341\173\271\343\343\224\341\106\151\313\016\012
+\120\153\023\272\254\017\067\132\267\022\265\220\201\036\126\256
+\127\042\206\331\311\322\321\327\121\343\253\073\306\125\375\036
+\016\323\164\012\321\332\252\352\151\270\227\050\217\110\304\007
+\370\122\103\072\364\312\125\065\054\260\246\152\300\234\371\362
+\201\341\022\152\300\105\331\147\263\316\377\043\242\211\012\124
+\324\024\271\052\250\327\354\371\253\315\045\130\062\171\217\220
+\133\230\071\304\010\006\301\254\177\016\075\000\245\002\003\001
+\000\001\243\124\060\122\060\016\006\003\125\035\017\001\001\377
+\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377
+\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026
+\004\024\011\313\131\177\206\262\160\217\032\303\071\343\300\331
+\351\277\273\115\262\043\060\020\006\011\053\006\001\004\001\202
+\067\025\001\004\003\002\001\000\060\015\006\011\052\206\110\206
+\367\015\001\001\014\005\000\003\202\002\001\000\254\257\076\135
+\302\021\226\211\216\243\347\222\326\227\025\270\023\242\246\102
+\056\002\315\026\005\131\047\312\040\350\272\270\350\032\354\115
+\250\227\126\256\145\103\261\217\000\233\122\315\125\315\123\071
+\155\142\114\213\015\133\174\056\104\277\203\020\217\363\123\202
+\200\303\117\072\307\156\021\077\346\343\026\221\204\373\155\204
+\177\064\164\255\211\247\316\271\327\327\237\204\144\222\276\225
+\241\255\011\123\063\335\356\012\352\112\121\216\157\125\253\272
+\265\224\106\256\214\177\330\242\120\045\145\140\200\106\333\063
+\004\256\154\265\230\164\124\045\334\223\344\370\343\125\025\075
+\270\155\303\012\244\022\301\151\205\156\337\144\361\123\231\341
+\112\165\040\235\225\017\344\326\334\003\361\131\030\350\107\211
+\262\127\132\224\266\251\330\027\053\027\111\345\166\313\301\126
+\231\072\067\261\377\151\054\221\221\223\341\337\114\243\067\166
+\115\241\237\370\155\036\035\323\372\354\373\364\105\035\023\155
+\317\367\131\345\042\047\162\053\206\363\127\273\060\355\044\115
+\334\175\126\273\243\263\370\064\171\211\301\340\362\002\141\367
+\246\374\017\273\034\027\013\256\101\331\174\275\047\243\375\056
+\072\321\223\224\261\163\035\044\213\257\133\040\211\255\267\147
+\146\171\365\072\306\246\226\063\376\123\222\310\106\261\021\221
+\306\231\177\217\311\326\146\061\040\101\020\207\055\014\326\301
+\257\064\230\312\144\203\373\023\127\321\301\360\074\172\214\245
+\301\375\225\041\240\161\301\223\147\161\022\352\217\210\012\151
+\031\144\231\043\126\373\254\052\056\160\276\146\304\014\204\357
+\345\213\363\223\001\370\152\220\223\147\113\262\150\243\265\142
+\217\351\077\214\172\073\136\017\347\214\270\306\174\357\067\375
+\164\342\310\117\063\162\341\224\071\155\275\022\257\276\014\116
+\160\174\033\157\215\263\062\223\163\104\026\155\350\364\367\340
+\225\200\217\226\135\070\244\364\253\336\012\060\207\223\330\115
+\000\161\142\105\047\113\072\102\204\133\177\145\267\147\064\122
+\055\234\026\153\252\250\330\173\243\102\114\161\307\014\312\076
+\203\344\246\357\267\001\060\136\121\243\171\365\160\151\246\101
+\104\017\206\260\054\221\306\075\352\256\017\204
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "Entrust Root Certification Authority - G4"
-# Issuer: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US
-# Serial Number:00:d9:b5:43:7f:af:a9:39:0f:00:00:00:00:55:65:ad:58
-# Subject: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US
-# Not Valid Before: Wed May 27 11:11:16 2015
-# Not Valid After : Sun Dec 27 11:41:16 2037
-# Fingerprint (SHA-256): DB:35:17:D1:F6:73:2A:2D:5A:B9:7C:53:3E:C7:07:79:EE:32:70:A6:2F:B4:AC:42:38:37:24:60:E6:F0:1E:88
-# Fingerprint (SHA1): 14:88:4E:86:26:37:B0:26:AF:59:62:5C:40:77:EC:35:29:BA:96:01
+# Trust for "Microsoft RSA Root Certificate Authority 2017"
+# Issuer: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US
+# Serial Number:1e:d3:97:09:5f:d8:b4:b3:47:70:1e:aa:be:7f:45:b3
+# Subject: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US
+# Not Valid Before: Wed Dec 18 22:51:22 2019
+# Not Valid After : Fri Jul 18 23:00:23 2042
+# Fingerprint (SHA-256): C7:41:F7:0F:4B:2A:8D:88:BF:2E:71:C1:41:22:EF:53:EF:10:EB:A0:CF:A5:E6:4C:FA:20:F4:18:85:30:73:E0
+# Fingerprint (SHA1): 73:A5:E6:4A:3B:FF:83:16:FF:0E:DC:CC:61:8A:90:6E:4E:AE:4D:74
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Entrust Root Certification Authority - G4"
+CKA_LABEL UTF8 "Microsoft RSA Root Certificate Authority 2017"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\024\210\116\206\046\067\260\046\257\131\142\134\100\167\354\065
-\051\272\226\001
+\163\245\346\112\073\377\203\026\377\016\334\314\141\212\220\156
+\116\256\115\164
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\211\123\361\203\043\267\174\216\005\361\214\161\070\116\037\210
+\020\377\000\377\317\311\370\307\172\300\356\065\216\311\017\107
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165
-\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
-\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165
-\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162
-\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051
-\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111
-\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162
-\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060
-\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040
-\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151
-\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107
-\064
+\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
+\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
+\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
+\157\146\164\040\122\123\101\040\122\157\157\164\040\103\145\162
+\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
+\164\171\040\062\060\061\067
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\021\000\331\265\103\177\257\251\071\017\000\000\000\000\125
-\145\255\130
+\002\020\036\323\227\011\137\330\264\263\107\160\036\252\276\177
+\105\263
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Microsoft ECC Root Certificate Authority 2017"
+# Certificate "e-Szigno Root CA 2017"
 #
-# Issuer: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US
-# Serial Number:66:f2:3d:af:87:de:8b:b1:4a:ea:0c:57:31:01:c2:ec
-# Subject: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US
-# Not Valid Before: Wed Dec 18 23:06:45 2019
-# Not Valid After : Fri Jul 18 23:16:04 2042
-# Fingerprint (SHA-256): 35:8D:F3:9D:76:4A:F9:E1:B7:66:E9:C9:72:DF:35:2E:E1:5C:FA:C2:27:AF:6A:D1:D7:0E:8E:4A:6E:DC:BA:02
-# Fingerprint (SHA1): 99:9A:64:C3:7F:F4:7D:9F:AB:95:F1:47:69:89:14:60:EE:C4:C3:C5
+# Issuer: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU
+# Serial Number:01:54:48:ef:21:fd:97:59:0d:f5:04:0a
+# Subject: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU
+# Not Valid Before: Tue Aug 22 12:07:06 2017
+# Not Valid After : Fri Aug 22 12:07:06 2042
+# Fingerprint (SHA-256): BE:B0:0B:30:83:9B:9B:C3:2C:32:E4:44:79:05:95:06:41:F2:64:21:B1:5E:D0:89:19:8B:51:8A:E2:EA:1B:99
+# Fingerprint (SHA1): 89:D4:83:03:4F:9E:9A:48:80:5F:72:37:D4:A9:A6:EF:CB:7C:1F:D1
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Microsoft ECC Root Certificate Authority 2017"
+CKA_LABEL UTF8 "e-Szigno Root CA 2017"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
-\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
-\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
-\157\146\164\040\105\103\103\040\122\157\157\164\040\103\145\162
-\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
-\164\171\040\062\060\061\067
+\060\161\061\013\060\011\006\003\125\004\006\023\002\110\125\061
+\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145
+\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143
+\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003
+\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064
+\064\071\067\061\036\060\034\006\003\125\004\003\014\025\145\055
+\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040\062
+\060\061\067
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
-\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
-\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
-\157\146\164\040\105\103\103\040\122\157\157\164\040\103\145\162
-\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
-\164\171\040\062\060\061\067
+\060\161\061\013\060\011\006\003\125\004\006\023\002\110\125\061
+\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145
+\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143
+\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003
+\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064
+\064\071\067\061\036\060\034\006\003\125\004\003\014\025\145\055
+\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040\062
+\060\061\067
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\146\362\075\257\207\336\213\261\112\352\014\127\061\001
-\302\354
+\002\014\001\124\110\357\041\375\227\131\015\365\004\012
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\131\060\202\001\337\240\003\002\001\002\002\020\146
-\362\075\257\207\336\213\261\112\352\014\127\061\001\302\354\060
-\012\006\010\052\206\110\316\075\004\003\003\060\145\061\013\060
-\011\006\003\125\004\006\023\002\125\123\061\036\060\034\006\003
-\125\004\012\023\025\115\151\143\162\157\163\157\146\164\040\103
-\157\162\160\157\162\141\164\151\157\156\061\066\060\064\006\003
-\125\004\003\023\055\115\151\143\162\157\163\157\146\164\040\105
-\103\103\040\122\157\157\164\040\103\145\162\164\151\146\151\143
-\141\164\145\040\101\165\164\150\157\162\151\164\171\040\062\060
-\061\067\060\036\027\015\061\071\061\062\061\070\062\063\060\066
-\064\065\132\027\015\064\062\060\067\061\070\062\063\061\066\060
-\064\132\060\145\061\013\060\011\006\003\125\004\006\023\002\125
-\123\061\036\060\034\006\003\125\004\012\023\025\115\151\143\162
-\157\163\157\146\164\040\103\157\162\160\157\162\141\164\151\157
-\156\061\066\060\064\006\003\125\004\003\023\055\115\151\143\162
-\157\163\157\146\164\040\105\103\103\040\122\157\157\164\040\103
-\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157
-\162\151\164\171\040\062\060\061\067\060\166\060\020\006\007\052
-\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142\000
-\004\324\274\075\002\102\165\101\023\043\315\200\004\206\002\121
-\057\152\250\201\142\013\145\314\366\312\235\036\157\112\146\121
-\242\003\331\235\221\372\266\026\261\214\156\336\174\315\333\171
-\246\057\316\273\316\161\057\345\245\253\050\354\143\004\146\231
-\370\372\362\223\020\005\341\201\050\102\343\306\150\364\346\033
-\204\140\112\211\257\355\171\017\073\316\361\366\104\365\001\170
-\300\243\124\060\122\060\016\006\003\125\035\017\001\001\377\004
-\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377\004
-\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004
-\024\310\313\231\162\160\122\014\370\346\276\262\004\127\051\052
-\317\102\020\355\065\060\020\006\011\053\006\001\004\001\202\067
-\025\001\004\003\002\001\000\060\012\006\010\052\206\110\316\075
-\004\003\003\003\150\000\060\145\002\060\130\362\115\352\014\371
-\137\136\356\140\051\313\072\362\333\326\062\204\031\077\174\325
-\057\302\261\314\223\256\120\273\011\062\306\306\355\176\311\066
-\224\022\344\150\205\006\242\033\320\057\002\061\000\231\351\026
-\264\016\372\126\110\324\244\060\026\221\170\333\124\214\145\001
-\212\347\120\146\302\061\267\071\272\270\032\042\007\116\374\153
-\124\026\040\377\053\265\347\114\014\115\246\117\163
+\060\202\002\100\060\202\001\345\240\003\002\001\002\002\014\001
+\124\110\357\041\375\227\131\015\365\004\012\060\012\006\010\052
+\206\110\316\075\004\003\002\060\161\061\013\060\011\006\003\125
+\004\006\023\002\110\125\061\021\060\017\006\003\125\004\007\014
+\010\102\165\144\141\160\145\163\164\061\026\060\024\006\003\125
+\004\012\014\015\115\151\143\162\157\163\145\143\040\114\164\144
+\056\061\027\060\025\006\003\125\004\141\014\016\126\101\124\110
+\125\055\062\063\065\070\064\064\071\067\061\036\060\034\006\003
+\125\004\003\014\025\145\055\123\172\151\147\156\157\040\122\157
+\157\164\040\103\101\040\062\060\061\067\060\036\027\015\061\067
+\060\070\062\062\061\062\060\067\060\066\132\027\015\064\062\060
+\070\062\062\061\062\060\067\060\066\132\060\161\061\013\060\011
+\006\003\125\004\006\023\002\110\125\061\021\060\017\006\003\125
+\004\007\014\010\102\165\144\141\160\145\163\164\061\026\060\024
+\006\003\125\004\012\014\015\115\151\143\162\157\163\145\143\040
+\114\164\144\056\061\027\060\025\006\003\125\004\141\014\016\126
+\101\124\110\125\055\062\063\065\070\064\064\071\067\061\036\060
+\034\006\003\125\004\003\014\025\145\055\123\172\151\147\156\157
+\040\122\157\157\164\040\103\101\040\062\060\061\067\060\131\060
+\023\006\007\052\206\110\316\075\002\001\006\010\052\206\110\316
+\075\003\001\007\003\102\000\004\226\334\075\212\330\260\173\157
+\306\047\276\104\220\261\263\126\025\173\216\103\044\175\032\204
+\131\356\143\150\262\306\136\207\320\025\110\036\250\220\255\275
+\123\242\332\336\072\220\246\140\137\150\062\265\206\101\337\207
+\133\054\173\305\376\174\172\332\243\143\060\141\060\017\006\003
+\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006
+\003\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006
+\003\125\035\016\004\026\004\024\207\021\025\010\321\252\301\170
+\014\261\257\316\306\311\220\357\277\060\004\300\060\037\006\003
+\125\035\043\004\030\060\026\200\024\207\021\025\010\321\252\301
+\170\014\261\257\316\306\311\220\357\277\060\004\300\060\012\006
+\010\052\206\110\316\075\004\003\002\003\111\000\060\106\002\041
+\000\265\127\335\327\212\125\013\066\341\206\104\372\324\331\150
+\215\270\334\043\212\212\015\324\057\175\352\163\354\277\115\154
+\250\002\041\000\313\245\264\022\372\347\265\350\317\176\223\374
+\363\065\217\157\116\132\174\264\274\116\262\374\162\252\133\131
+\371\347\334\061
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "Microsoft ECC Root Certificate Authority 2017"
-# Issuer: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US
-# Serial Number:66:f2:3d:af:87:de:8b:b1:4a:ea:0c:57:31:01:c2:ec
-# Subject: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US
-# Not Valid Before: Wed Dec 18 23:06:45 2019
-# Not Valid After : Fri Jul 18 23:16:04 2042
-# Fingerprint (SHA-256): 35:8D:F3:9D:76:4A:F9:E1:B7:66:E9:C9:72:DF:35:2E:E1:5C:FA:C2:27:AF:6A:D1:D7:0E:8E:4A:6E:DC:BA:02
-# Fingerprint (SHA1): 99:9A:64:C3:7F:F4:7D:9F:AB:95:F1:47:69:89:14:60:EE:C4:C3:C5
+# Trust for "e-Szigno Root CA 2017"
+# Issuer: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU
+# Serial Number:01:54:48:ef:21:fd:97:59:0d:f5:04:0a
+# Subject: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU
+# Not Valid Before: Tue Aug 22 12:07:06 2017
+# Not Valid After : Fri Aug 22 12:07:06 2042
+# Fingerprint (SHA-256): BE:B0:0B:30:83:9B:9B:C3:2C:32:E4:44:79:05:95:06:41:F2:64:21:B1:5E:D0:89:19:8B:51:8A:E2:EA:1B:99
+# Fingerprint (SHA1): 89:D4:83:03:4F:9E:9A:48:80:5F:72:37:D4:A9:A6:EF:CB:7C:1F:D1
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Microsoft ECC Root Certificate Authority 2017"
+CKA_LABEL UTF8 "e-Szigno Root CA 2017"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\231\232\144\303\177\364\175\237\253\225\361\107\151\211\024\140
-\356\304\303\305
+\211\324\203\003\117\236\232\110\200\137\162\067\324\251\246\357
+\313\174\037\321
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\335\241\003\346\112\223\020\321\277\360\031\102\313\376\355\147
+\336\037\366\236\204\256\247\264\041\316\036\130\175\321\204\230
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
-\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
-\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
-\157\146\164\040\105\103\103\040\122\157\157\164\040\103\145\162
-\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
-\164\171\040\062\060\061\067
+\060\161\061\013\060\011\006\003\125\004\006\023\002\110\125\061
+\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145
+\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143
+\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003
+\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064
+\064\071\067\061\036\060\034\006\003\125\004\003\014\025\145\055
+\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040\062
+\060\061\067
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\146\362\075\257\207\336\213\261\112\352\014\127\061\001
-\302\354
+\002\014\001\124\110\357\041\375\227\131\015\365\004\012
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Microsoft RSA Root Certificate Authority 2017"
+# Certificate "certSIGN Root CA G2"
 #
-# Issuer: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US
-# Serial Number:1e:d3:97:09:5f:d8:b4:b3:47:70:1e:aa:be:7f:45:b3
-# Subject: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US
-# Not Valid Before: Wed Dec 18 22:51:22 2019
-# Not Valid After : Fri Jul 18 23:00:23 2042
-# Fingerprint (SHA-256): C7:41:F7:0F:4B:2A:8D:88:BF:2E:71:C1:41:22:EF:53:EF:10:EB:A0:CF:A5:E6:4C:FA:20:F4:18:85:30:73:E0
-# Fingerprint (SHA1): 73:A5:E6:4A:3B:FF:83:16:FF:0E:DC:CC:61:8A:90:6E:4E:AE:4D:74
+# Issuer: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO
+# Serial Number:11:00:34:b6:4e:c6:36:2d:36
+# Subject: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO
+# Not Valid Before: Mon Feb 06 09:27:35 2017
+# Not Valid After : Thu Feb 06 09:27:35 2042
+# Fingerprint (SHA-256): 65:7C:FE:2F:A7:3F:AA:38:46:25:71:F3:32:A2:36:3A:46:FC:E7:02:09:51:71:07:02:CD:FB:B6:EE:DA:33:05
+# Fingerprint (SHA1): 26:F9:93:B4:ED:3D:28:27:B0:B9:4B:A7:E9:15:1D:A3:8D:92:E5:32
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Microsoft RSA Root Certificate Authority 2017"
+CKA_LABEL UTF8 "certSIGN Root CA G2"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
-\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
-\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
-\157\146\164\040\122\123\101\040\122\157\157\164\040\103\145\162
-\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
-\164\171\040\062\060\061\067
+\060\101\061\013\060\011\006\003\125\004\006\023\002\122\117\061
+\024\060\022\006\003\125\004\012\023\013\103\105\122\124\123\111
+\107\116\040\123\101\061\034\060\032\006\003\125\004\013\023\023
+\143\145\162\164\123\111\107\116\040\122\117\117\124\040\103\101
+\040\107\062
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
-\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
-\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
-\157\146\164\040\122\123\101\040\122\157\157\164\040\103\145\162
-\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
-\164\171\040\062\060\061\067
+\060\101\061\013\060\011\006\003\125\004\006\023\002\122\117\061
+\024\060\022\006\003\125\004\012\023\013\103\105\122\124\123\111
+\107\116\040\123\101\061\034\060\032\006\003\125\004\013\023\023
+\143\145\162\164\123\111\107\116\040\122\117\117\124\040\103\101
+\040\107\062
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\036\323\227\011\137\330\264\263\107\160\036\252\276\177
-\105\263
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\005\250\060\202\003\220\240\003\002\001\002\002\020\036
-\323\227\011\137\330\264\263\107\160\036\252\276\177\105\263\060
-\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\145
-\061\013\060\011\006\003\125\004\006\023\002\125\123\061\036\060
-\034\006\003\125\004\012\023\025\115\151\143\162\157\163\157\146
-\164\040\103\157\162\160\157\162\141\164\151\157\156\061\066\060
-\064\006\003\125\004\003\023\055\115\151\143\162\157\163\157\146
-\164\040\122\123\101\040\122\157\157\164\040\103\145\162\164\151
-\146\151\143\141\164\145\040\101\165\164\150\157\162\151\164\171
-\040\062\060\061\067\060\036\027\015\061\071\061\062\061\070\062
-\062\065\061\062\062\132\027\015\064\062\060\067\061\070\062\063
-\060\060\062\063\132\060\145\061\013\060\011\006\003\125\004\006
-\023\002\125\123\061\036\060\034\006\003\125\004\012\023\025\115
-\151\143\162\157\163\157\146\164\040\103\157\162\160\157\162\141
-\164\151\157\156\061\066\060\064\006\003\125\004\003\023\055\115
-\151\143\162\157\163\157\146\164\040\122\123\101\040\122\157\157
-\164\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165
-\164\150\157\162\151\164\171\040\062\060\061\067\060\202\002\042
-\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003
-\202\002\017\000\060\202\002\012\002\202\002\001\000\312\133\276
-\224\063\214\051\225\221\026\012\225\275\107\142\301\211\363\231
-\066\337\106\220\311\245\355\170\152\157\107\221\150\370\047\147
-\120\063\035\241\246\373\340\345\103\243\204\002\127\001\135\234
-\110\100\202\123\020\274\277\307\073\150\220\266\202\055\345\364
-\145\320\314\155\031\314\225\371\173\254\112\224\255\016\336\113
-\103\035\207\007\222\023\220\200\203\144\065\071\004\374\345\351
-\154\263\266\037\120\224\070\145\120\134\027\106\271\266\205\265
-\034\265\027\350\326\105\235\330\262\046\260\312\304\160\112\256
-\140\244\335\263\331\354\374\073\325\127\162\274\077\310\311\262
-\336\113\153\370\043\154\003\300\005\275\225\307\315\163\073\146
-\200\144\343\032\254\056\371\107\005\362\006\266\233\163\365\170
-\063\133\307\241\373\047\052\241\264\232\221\214\221\323\072\202
-\076\166\100\264\315\122\141\121\160\050\077\305\305\132\362\311
-\214\111\273\024\133\115\310\377\147\115\114\022\226\255\365\376
-\170\250\227\207\327\375\136\040\200\334\241\113\042\373\324\211
-\255\272\316\107\227\107\125\173\217\105\310\147\050\204\225\034
-\150\060\357\357\111\340\065\173\144\347\230\260\224\332\115\205
-\073\076\125\304\050\257\127\363\236\023\333\106\047\237\036\242
-\136\104\203\244\245\312\325\023\263\113\077\304\343\302\346\206
-\141\244\122\060\271\172\040\117\157\017\070\123\313\063\014\023
-\053\217\326\232\275\052\310\055\261\034\175\113\121\312\107\321
-\110\047\162\135\207\353\325\105\346\110\145\235\257\122\220\272
-\133\242\030\145\127\022\237\150\271\324\025\153\224\304\151\042
-\230\364\063\340\355\371\121\216\101\120\311\064\117\166\220\254
-\374\070\301\330\341\173\271\343\343\224\341\106\151\313\016\012
-\120\153\023\272\254\017\067\132\267\022\265\220\201\036\126\256
-\127\042\206\331\311\322\321\327\121\343\253\073\306\125\375\036
-\016\323\164\012\321\332\252\352\151\270\227\050\217\110\304\007
-\370\122\103\072\364\312\125\065\054\260\246\152\300\234\371\362
-\201\341\022\152\300\105\331\147\263\316\377\043\242\211\012\124
-\324\024\271\052\250\327\354\371\253\315\045\130\062\171\217\220
-\133\230\071\304\010\006\301\254\177\016\075\000\245\002\003\001
-\000\001\243\124\060\122\060\016\006\003\125\035\017\001\001\377
-\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377
-\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026
-\004\024\011\313\131\177\206\262\160\217\032\303\071\343\300\331
-\351\277\273\115\262\043\060\020\006\011\053\006\001\004\001\202
-\067\025\001\004\003\002\001\000\060\015\006\011\052\206\110\206
-\367\015\001\001\014\005\000\003\202\002\001\000\254\257\076\135
-\302\021\226\211\216\243\347\222\326\227\025\270\023\242\246\102
-\056\002\315\026\005\131\047\312\040\350\272\270\350\032\354\115
-\250\227\126\256\145\103\261\217\000\233\122\315\125\315\123\071
-\155\142\114\213\015\133\174\056\104\277\203\020\217\363\123\202
-\200\303\117\072\307\156\021\077\346\343\026\221\204\373\155\204
-\177\064\164\255\211\247\316\271\327\327\237\204\144\222\276\225
-\241\255\011\123\063\335\356\012\352\112\121\216\157\125\253\272
-\265\224\106\256\214\177\330\242\120\045\145\140\200\106\333\063
-\004\256\154\265\230\164\124\045\334\223\344\370\343\125\025\075
-\270\155\303\012\244\022\301\151\205\156\337\144\361\123\231\341
-\112\165\040\235\225\017\344\326\334\003\361\131\030\350\107\211
-\262\127\132\224\266\251\330\027\053\027\111\345\166\313\301\126
-\231\072\067\261\377\151\054\221\221\223\341\337\114\243\067\166
-\115\241\237\370\155\036\035\323\372\354\373\364\105\035\023\155
-\317\367\131\345\042\047\162\053\206\363\127\273\060\355\044\115
-\334\175\126\273\243\263\370\064\171\211\301\340\362\002\141\367
-\246\374\017\273\034\027\013\256\101\331\174\275\047\243\375\056
-\072\321\223\224\261\163\035\044\213\257\133\040\211\255\267\147
-\146\171\365\072\306\246\226\063\376\123\222\310\106\261\021\221
-\306\231\177\217\311\326\146\061\040\101\020\207\055\014\326\301
-\257\064\230\312\144\203\373\023\127\321\301\360\074\172\214\245
-\301\375\225\041\240\161\301\223\147\161\022\352\217\210\012\151
-\031\144\231\043\126\373\254\052\056\160\276\146\304\014\204\357
-\345\213\363\223\001\370\152\220\223\147\113\262\150\243\265\142
-\217\351\077\214\172\073\136\017\347\214\270\306\174\357\067\375
-\164\342\310\117\063\162\341\224\071\155\275\022\257\276\014\116
-\160\174\033\157\215\263\062\223\163\104\026\155\350\364\367\340
-\225\200\217\226\135\070\244\364\253\336\012\060\207\223\330\115
-\000\161\142\105\047\113\072\102\204\133\177\145\267\147\064\122
-\055\234\026\153\252\250\330\173\243\102\114\161\307\014\312\076
-\203\344\246\357\267\001\060\136\121\243\171\365\160\151\246\101
-\104\017\206\260\054\221\306\075\352\256\017\204
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for "Microsoft RSA Root Certificate Authority 2017"
-# Issuer: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US
-# Serial Number:1e:d3:97:09:5f:d8:b4:b3:47:70:1e:aa:be:7f:45:b3
-# Subject: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US
-# Not Valid Before: Wed Dec 18 22:51:22 2019
-# Not Valid After : Fri Jul 18 23:00:23 2042
-# Fingerprint (SHA-256): C7:41:F7:0F:4B:2A:8D:88:BF:2E:71:C1:41:22:EF:53:EF:10:EB:A0:CF:A5:E6:4C:FA:20:F4:18:85:30:73:E0
-# Fingerprint (SHA1): 73:A5:E6:4A:3B:FF:83:16:FF:0E:DC:CC:61:8A:90:6E:4E:AE:4D:74
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Microsoft RSA Root Certificate Authority 2017"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\163\245\346\112\073\377\203\026\377\016\334\314\141\212\220\156
-\116\256\115\164
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\020\377\000\377\317\311\370\307\172\300\356\065\216\311\017\107
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061
-\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163
-\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061
-\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163
-\157\146\164\040\122\123\101\040\122\157\157\164\040\103\145\162
-\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151
-\164\171\040\062\060\061\067
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\036\323\227\011\137\330\264\263\107\160\036\252\276\177
-\105\263
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
-#
-# Certificate "e-Szigno Root CA 2017"
-#
-# Issuer: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU
-# Serial Number:01:54:48:ef:21:fd:97:59:0d:f5:04:0a
-# Subject: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU
-# Not Valid Before: Tue Aug 22 12:07:06 2017
-# Not Valid After : Fri Aug 22 12:07:06 2042
-# Fingerprint (SHA-256): BE:B0:0B:30:83:9B:9B:C3:2C:32:E4:44:79:05:95:06:41:F2:64:21:B1:5E:D0:89:19:8B:51:8A:E2:EA:1B:99
-# Fingerprint (SHA1): 89:D4:83:03:4F:9E:9A:48:80:5F:72:37:D4:A9:A6:EF:CB:7C:1F:D1
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "e-Szigno Root CA 2017"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\161\061\013\060\011\006\003\125\004\006\023\002\110\125\061
-\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145
-\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143
-\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003
-\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064
-\064\071\067\061\036\060\034\006\003\125\004\003\014\025\145\055
-\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040\062
-\060\061\067
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\161\061\013\060\011\006\003\125\004\006\023\002\110\125\061
-\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145
-\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143
-\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003
-\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064
-\064\071\067\061\036\060\034\006\003\125\004\003\014\025\145\055
-\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040\062
-\060\061\067
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\014\001\124\110\357\041\375\227\131\015\365\004\012
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\002\100\060\202\001\345\240\003\002\001\002\002\014\001
-\124\110\357\041\375\227\131\015\365\004\012\060\012\006\010\052
-\206\110\316\075\004\003\002\060\161\061\013\060\011\006\003\125
-\004\006\023\002\110\125\061\021\060\017\006\003\125\004\007\014
-\010\102\165\144\141\160\145\163\164\061\026\060\024\006\003\125
-\004\012\014\015\115\151\143\162\157\163\145\143\040\114\164\144
-\056\061\027\060\025\006\003\125\004\141\014\016\126\101\124\110
-\125\055\062\063\065\070\064\064\071\067\061\036\060\034\006\003
-\125\004\003\014\025\145\055\123\172\151\147\156\157\040\122\157
-\157\164\040\103\101\040\062\060\061\067\060\036\027\015\061\067
-\060\070\062\062\061\062\060\067\060\066\132\027\015\064\062\060
-\070\062\062\061\062\060\067\060\066\132\060\161\061\013\060\011
-\006\003\125\004\006\023\002\110\125\061\021\060\017\006\003\125
-\004\007\014\010\102\165\144\141\160\145\163\164\061\026\060\024
-\006\003\125\004\012\014\015\115\151\143\162\157\163\145\143\040
-\114\164\144\056\061\027\060\025\006\003\125\004\141\014\016\126
-\101\124\110\125\055\062\063\065\070\064\064\071\067\061\036\060
-\034\006\003\125\004\003\014\025\145\055\123\172\151\147\156\157
-\040\122\157\157\164\040\103\101\040\062\060\061\067\060\131\060
-\023\006\007\052\206\110\316\075\002\001\006\010\052\206\110\316
-\075\003\001\007\003\102\000\004\226\334\075\212\330\260\173\157
-\306\047\276\104\220\261\263\126\025\173\216\103\044\175\032\204
-\131\356\143\150\262\306\136\207\320\025\110\036\250\220\255\275
-\123\242\332\336\072\220\246\140\137\150\062\265\206\101\337\207
-\133\054\173\305\376\174\172\332\243\143\060\141\060\017\006\003
-\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006
-\003\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006
-\003\125\035\016\004\026\004\024\207\021\025\010\321\252\301\170
-\014\261\257\316\306\311\220\357\277\060\004\300\060\037\006\003
-\125\035\043\004\030\060\026\200\024\207\021\025\010\321\252\301
-\170\014\261\257\316\306\311\220\357\277\060\004\300\060\012\006
-\010\052\206\110\316\075\004\003\002\003\111\000\060\106\002\041
-\000\265\127\335\327\212\125\013\066\341\206\104\372\324\331\150
-\215\270\334\043\212\212\015\324\057\175\352\163\354\277\115\154
-\250\002\041\000\313\245\264\022\372\347\265\350\317\176\223\374
-\363\065\217\157\116\132\174\264\274\116\262\374\162\252\133\131
-\371\347\334\061
-END
-CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
-CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
-CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
-
-# Trust for "e-Szigno Root CA 2017"
-# Issuer: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU
-# Serial Number:01:54:48:ef:21:fd:97:59:0d:f5:04:0a
-# Subject: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU
-# Not Valid Before: Tue Aug 22 12:07:06 2017
-# Not Valid After : Fri Aug 22 12:07:06 2042
-# Fingerprint (SHA-256): BE:B0:0B:30:83:9B:9B:C3:2C:32:E4:44:79:05:95:06:41:F2:64:21:B1:5E:D0:89:19:8B:51:8A:E2:EA:1B:99
-# Fingerprint (SHA1): 89:D4:83:03:4F:9E:9A:48:80:5F:72:37:D4:A9:A6:EF:CB:7C:1F:D1
-CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "e-Szigno Root CA 2017"
-CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\211\324\203\003\117\236\232\110\200\137\162\067\324\251\246\357
-\313\174\037\321
-END
-CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\336\037\366\236\204\256\247\264\041\316\036\130\175\321\204\230
-END
-CKA_ISSUER MULTILINE_OCTAL
-\060\161\061\013\060\011\006\003\125\004\006\023\002\110\125\061
-\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145
-\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143
-\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003
-\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064
-\064\071\067\061\036\060\034\006\003\125\004\003\014\025\145\055
-\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040\062
-\060\061\067
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\014\001\124\110\357\041\375\227\131\015\365\004\012
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
-CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
-
-#
-# Certificate "certSIGN Root CA G2"
-#
-# Issuer: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO
-# Serial Number:11:00:34:b6:4e:c6:36:2d:36
-# Subject: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO
-# Not Valid Before: Mon Feb 06 09:27:35 2017
-# Not Valid After : Thu Feb 06 09:27:35 2042
-# Fingerprint (SHA-256): 65:7C:FE:2F:A7:3F:AA:38:46:25:71:F3:32:A2:36:3A:46:FC:E7:02:09:51:71:07:02:CD:FB:B6:EE:DA:33:05
-# Fingerprint (SHA1): 26:F9:93:B4:ED:3D:28:27:B0:B9:4B:A7:E9:15:1D:A3:8D:92:E5:32
-CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
-CKA_TOKEN CK_BBOOL CK_TRUE
-CKA_PRIVATE CK_BBOOL CK_FALSE
-CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "certSIGN Root CA G2"
-CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
-CKA_SUBJECT MULTILINE_OCTAL
-\060\101\061\013\060\011\006\003\125\004\006\023\002\122\117\061
-\024\060\022\006\003\125\004\012\023\013\103\105\122\124\123\111
-\107\116\040\123\101\061\034\060\032\006\003\125\004\013\023\023
-\143\145\162\164\123\111\107\116\040\122\117\117\124\040\103\101
-\040\107\062
-END
-CKA_ID UTF8 "0"
-CKA_ISSUER MULTILINE_OCTAL
-\060\101\061\013\060\011\006\003\125\004\006\023\002\122\117\061
-\024\060\022\006\003\125\004\012\023\013\103\105\122\124\123\111
-\107\116\040\123\101\061\034\060\032\006\003\125\004\013\023\023
-\143\145\162\164\123\111\107\116\040\122\117\117\124\040\103\101
-\040\107\062
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\011\021\000\064\266\116\306\066\055\066
+\002\011\021\000\064\266\116\306\066\055\066
 END
 CKA_VALUE MULTILINE_OCTAL
 \060\202\005\107\060\202\003\057\240\003\002\001\002\002\011\021
@@ -20320,216 +18634,2932 @@ CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "certSIGN Root CA G2"
-# Issuer: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO
-# Serial Number:11:00:34:b6:4e:c6:36:2d:36
-# Subject: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO
-# Not Valid Before: Mon Feb 06 09:27:35 2017
-# Not Valid After : Thu Feb 06 09:27:35 2042
-# Fingerprint (SHA-256): 65:7C:FE:2F:A7:3F:AA:38:46:25:71:F3:32:A2:36:3A:46:FC:E7:02:09:51:71:07:02:CD:FB:B6:EE:DA:33:05
-# Fingerprint (SHA1): 26:F9:93:B4:ED:3D:28:27:B0:B9:4B:A7:E9:15:1D:A3:8D:92:E5:32
+# Trust for "certSIGN Root CA G2"
+# Issuer: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO
+# Serial Number:11:00:34:b6:4e:c6:36:2d:36
+# Subject: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO
+# Not Valid Before: Mon Feb 06 09:27:35 2017
+# Not Valid After : Thu Feb 06 09:27:35 2042
+# Fingerprint (SHA-256): 65:7C:FE:2F:A7:3F:AA:38:46:25:71:F3:32:A2:36:3A:46:FC:E7:02:09:51:71:07:02:CD:FB:B6:EE:DA:33:05
+# Fingerprint (SHA1): 26:F9:93:B4:ED:3D:28:27:B0:B9:4B:A7:E9:15:1D:A3:8D:92:E5:32
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "certSIGN Root CA G2"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\046\371\223\264\355\075\050\047\260\271\113\247\351\025\035\243
+\215\222\345\062
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\214\361\165\212\306\031\317\224\267\367\145\040\207\303\227\307
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\101\061\013\060\011\006\003\125\004\006\023\002\122\117\061
+\024\060\022\006\003\125\004\012\023\013\103\105\122\124\123\111
+\107\116\040\123\101\061\034\060\032\006\003\125\004\013\023\023
+\143\145\162\164\123\111\107\116\040\122\117\117\124\040\103\101
+\040\107\062
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\011\021\000\064\266\116\306\066\055\066
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "Trustwave Global Certification Authority"
+#
+# Issuer: CN=Trustwave Global Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Serial Number:05:f7:0e:86:da:49:f3:46:35:2e:ba:b2
+# Subject: CN=Trustwave Global Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Not Valid Before: Wed Aug 23 19:34:12 2017
+# Not Valid After : Sat Aug 23 19:34:12 2042
+# Fingerprint (SHA-256): 97:55:20:15:F5:DD:FC:3C:87:88:C0:06:94:45:55:40:88:94:45:00:84:F1:00:86:70:86:BC:1A:2B:B5:8D:C8
+# Fingerprint (SHA1): 2F:8F:36:4F:E1:58:97:44:21:59:87:A5:2A:9A:D0:69:95:26:7F:B5
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Trustwave Global Certification Authority"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\021\060\017\006\003\125\004\010\014\010\111\154\154\151\156
+\157\151\163\061\020\060\016\006\003\125\004\007\014\007\103\150
+\151\143\141\147\157\061\041\060\037\006\003\125\004\012\014\030
+\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
+\147\163\054\040\111\156\143\056\061\061\060\057\006\003\125\004
+\003\014\050\124\162\165\163\164\167\141\166\145\040\107\154\157
+\142\141\154\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\021\060\017\006\003\125\004\010\014\010\111\154\154\151\156
+\157\151\163\061\020\060\016\006\003\125\004\007\014\007\103\150
+\151\143\141\147\157\061\041\060\037\006\003\125\004\012\014\030
+\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
+\147\163\054\040\111\156\143\056\061\061\060\057\006\003\125\004
+\003\014\050\124\162\165\163\164\167\141\166\145\040\107\154\157
+\142\141\154\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\014\005\367\016\206\332\111\363\106\065\056\272\262
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\332\060\202\003\302\240\003\002\001\002\002\014\005
+\367\016\206\332\111\363\106\065\056\272\262\060\015\006\011\052
+\206\110\206\367\015\001\001\013\005\000\060\201\210\061\013\060
+\011\006\003\125\004\006\023\002\125\123\061\021\060\017\006\003
+\125\004\010\014\010\111\154\154\151\156\157\151\163\061\020\060
+\016\006\003\125\004\007\014\007\103\150\151\143\141\147\157\061
+\041\060\037\006\003\125\004\012\014\030\124\162\165\163\164\167
+\141\166\145\040\110\157\154\144\151\156\147\163\054\040\111\156
+\143\056\061\061\060\057\006\003\125\004\003\014\050\124\162\165
+\163\164\167\141\166\145\040\107\154\157\142\141\154\040\103\145
+\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150
+\157\162\151\164\171\060\036\027\015\061\067\060\070\062\063\061
+\071\063\064\061\062\132\027\015\064\062\060\070\062\063\061\071
+\063\064\061\062\132\060\201\210\061\013\060\011\006\003\125\004
+\006\023\002\125\123\061\021\060\017\006\003\125\004\010\014\010
+\111\154\154\151\156\157\151\163\061\020\060\016\006\003\125\004
+\007\014\007\103\150\151\143\141\147\157\061\041\060\037\006\003
+\125\004\012\014\030\124\162\165\163\164\167\141\166\145\040\110
+\157\154\144\151\156\147\163\054\040\111\156\143\056\061\061\060
+\057\006\003\125\004\003\014\050\124\162\165\163\164\167\141\166
+\145\040\107\154\157\142\141\154\040\103\145\162\164\151\146\151
+\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171
+\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
+\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
+\000\271\135\121\050\113\074\067\222\321\202\316\275\035\275\315
+\335\270\253\317\012\076\341\135\345\334\252\011\271\127\002\076
+\346\143\141\337\362\017\202\143\256\243\367\254\163\321\174\347
+\263\013\257\010\000\011\131\177\315\051\052\210\223\207\027\030
+\200\355\210\262\264\266\020\037\055\326\137\125\242\023\135\321
+\306\353\006\126\211\210\376\254\062\235\375\134\303\005\307\156
+\356\206\211\272\210\003\235\162\041\206\220\256\217\003\245\334
+\237\210\050\313\243\222\111\017\354\320\017\342\155\104\117\200
+\152\262\324\347\240\012\123\001\272\216\227\221\166\156\274\374
+\325\153\066\346\100\210\326\173\057\137\005\350\054\155\021\363
+\347\262\276\222\104\114\322\227\244\376\322\162\201\103\007\234
+\351\021\076\365\213\032\131\175\037\150\130\335\004\000\054\226
+\363\103\263\176\230\031\164\331\234\163\331\030\276\101\307\064
+\171\331\364\142\302\103\271\263\047\260\042\313\371\075\122\307
+\060\107\263\311\076\270\152\342\347\350\201\160\136\102\213\117
+\046\245\376\072\302\040\156\273\370\026\216\315\014\251\264\033
+\154\166\020\341\130\171\106\076\124\316\200\250\127\011\067\051
+\033\231\023\217\014\310\326\054\034\373\005\350\010\225\075\145
+\106\334\356\315\151\342\115\217\207\050\116\064\013\076\317\024
+\331\273\335\266\120\232\255\167\324\031\326\332\032\210\310\116
+\033\047\165\330\262\010\361\256\203\060\271\021\016\315\207\360
+\204\215\025\162\174\241\357\314\362\210\141\272\364\151\273\014
+\214\013\165\127\004\270\116\052\024\056\075\017\034\036\062\246
+\142\066\356\146\342\042\270\005\100\143\020\042\363\063\035\164
+\162\212\054\365\071\051\240\323\347\033\200\204\055\305\075\343
+\115\261\375\032\157\272\145\007\073\130\354\102\105\046\373\330
+\332\045\162\304\366\000\261\042\171\275\343\174\131\142\112\234
+\005\157\075\316\346\326\107\143\231\306\044\157\162\022\310\254
+\177\220\264\013\221\160\350\267\346\026\020\161\027\316\336\006
+\117\110\101\175\065\112\243\211\362\311\113\173\101\021\155\147
+\267\010\230\114\345\021\031\256\102\200\334\373\220\005\324\370
+\120\312\276\344\255\307\302\224\327\026\235\346\027\217\257\066
+\373\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035
+\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125
+\035\016\004\026\004\024\231\340\031\147\015\142\333\166\263\332
+\075\270\133\350\375\102\322\061\016\207\060\016\006\003\125\035
+\017\001\001\377\004\004\003\002\001\006\060\015\006\011\052\206
+\110\206\367\015\001\001\013\005\000\003\202\002\001\000\230\163
+\160\342\260\323\355\071\354\114\140\331\251\022\206\027\036\226
+\320\350\124\050\073\144\055\041\246\370\235\126\023\152\110\075
+\117\307\076\051\333\155\130\203\124\075\207\175\043\005\324\344
+\034\334\350\070\145\206\305\165\247\132\333\065\005\275\167\336
+\273\051\067\100\005\007\303\224\122\237\312\144\335\361\033\053
+\334\106\012\020\002\061\375\112\150\015\007\144\220\346\036\365
+\052\241\250\273\074\135\371\243\010\013\021\014\361\077\055\020
+\224\157\376\342\064\207\203\326\317\345\033\065\155\322\003\341
+\260\015\250\240\252\106\047\202\066\247\025\266\010\246\102\124
+\127\266\231\132\342\013\171\220\327\127\022\121\065\031\210\101
+\150\045\324\067\027\204\025\373\001\162\334\225\336\122\046\040
+\230\046\342\166\365\047\157\372\000\073\112\141\331\015\313\121
+\223\052\375\026\006\226\247\043\232\043\110\376\121\275\266\304
+\260\261\124\316\336\154\101\255\026\147\176\333\375\070\315\271
+\070\116\262\301\140\313\235\027\337\130\236\172\142\262\046\217
+\164\225\233\344\133\035\322\017\335\230\034\233\131\271\043\323
+\061\240\246\377\070\335\317\040\117\351\130\126\072\147\303\321
+\366\231\231\235\272\066\266\200\057\210\107\117\206\277\104\072
+\200\344\067\034\246\272\352\227\230\021\320\204\142\107\144\036
+\252\356\100\277\064\261\234\217\116\341\362\222\117\037\216\363
+\236\227\336\363\246\171\152\211\161\117\113\047\027\110\376\354
+\364\120\017\117\111\175\314\105\343\275\172\100\305\101\334\141
+\126\047\006\151\345\162\101\201\323\266\001\211\240\057\072\162
+\171\376\072\060\277\101\354\307\142\076\221\113\307\331\061\166
+\102\371\367\074\143\354\046\214\163\014\175\032\035\352\250\174
+\207\250\302\047\174\341\063\101\017\317\317\374\000\240\042\200
+\236\112\247\157\000\260\101\105\267\042\312\150\110\305\102\242
+\256\335\035\362\340\156\116\005\130\261\300\220\026\052\244\075
+\020\100\276\217\142\143\203\251\234\202\175\055\002\351\203\060
+\174\313\047\311\375\036\146\000\260\056\323\041\057\216\063\026
+\154\230\355\020\250\007\326\314\223\317\333\321\151\034\344\312
+\311\340\266\234\351\316\161\161\336\154\077\026\244\171
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "Trustwave Global Certification Authority"
+# Issuer: CN=Trustwave Global Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Serial Number:05:f7:0e:86:da:49:f3:46:35:2e:ba:b2
+# Subject: CN=Trustwave Global Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Not Valid Before: Wed Aug 23 19:34:12 2017
+# Not Valid After : Sat Aug 23 19:34:12 2042
+# Fingerprint (SHA-256): 97:55:20:15:F5:DD:FC:3C:87:88:C0:06:94:45:55:40:88:94:45:00:84:F1:00:86:70:86:BC:1A:2B:B5:8D:C8
+# Fingerprint (SHA1): 2F:8F:36:4F:E1:58:97:44:21:59:87:A5:2A:9A:D0:69:95:26:7F:B5
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Trustwave Global Certification Authority"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\057\217\066\117\341\130\227\104\041\131\207\245\052\232\320\151
+\225\046\177\265
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\370\034\030\055\057\272\137\155\241\154\274\307\253\221\307\016
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\021\060\017\006\003\125\004\010\014\010\111\154\154\151\156
+\157\151\163\061\020\060\016\006\003\125\004\007\014\007\103\150
+\151\143\141\147\157\061\041\060\037\006\003\125\004\012\014\030
+\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
+\147\163\054\040\111\156\143\056\061\061\060\057\006\003\125\004
+\003\014\050\124\162\165\163\164\167\141\166\145\040\107\154\157
+\142\141\154\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\014\005\367\016\206\332\111\363\106\065\056\272\262
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "Trustwave Global ECC P256 Certification Authority"
+#
+# Issuer: CN=Trustwave Global ECC P256 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Serial Number:0d:6a:5f:08:3f:28:5c:3e:51:95:df:5d
+# Subject: CN=Trustwave Global ECC P256 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Not Valid Before: Wed Aug 23 19:35:10 2017
+# Not Valid After : Sat Aug 23 19:35:10 2042
+# Fingerprint (SHA-256): 94:5B:BC:82:5E:A5:54:F4:89:D1:FD:51:A7:3D:DF:2E:A6:24:AC:70:19:A0:52:05:22:5C:22:A7:8C:CF:A8:B4
+# Fingerprint (SHA1): B4:90:82:DD:45:0C:BE:8B:5B:B1:66:D3:E2:A4:08:26:CD:ED:42:CF
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Trustwave Global ECC P256 Certification Authority"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
+\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
+\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
+\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
+\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
+\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
+\142\141\154\040\105\103\103\040\120\062\065\066\040\103\145\162
+\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
+\162\151\164\171
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
+\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
+\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
+\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
+\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
+\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
+\142\141\154\040\105\103\103\040\120\062\065\066\040\103\145\162
+\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
+\162\151\164\171
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\014\015\152\137\010\077\050\134\076\121\225\337\135
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\140\060\202\002\007\240\003\002\001\002\002\014\015
+\152\137\010\077\050\134\076\121\225\337\135\060\012\006\010\052
+\206\110\316\075\004\003\002\060\201\221\061\013\060\011\006\003
+\125\004\006\023\002\125\123\061\021\060\017\006\003\125\004\010
+\023\010\111\154\154\151\156\157\151\163\061\020\060\016\006\003
+\125\004\007\023\007\103\150\151\143\141\147\157\061\041\060\037
+\006\003\125\004\012\023\030\124\162\165\163\164\167\141\166\145
+\040\110\157\154\144\151\156\147\163\054\040\111\156\143\056\061
+\072\060\070\006\003\125\004\003\023\061\124\162\165\163\164\167
+\141\166\145\040\107\154\157\142\141\154\040\105\103\103\040\120
+\062\065\066\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171\060\036\027\015\061
+\067\060\070\062\063\061\071\063\065\061\060\132\027\015\064\062
+\060\070\062\063\061\071\063\065\061\060\132\060\201\221\061\013
+\060\011\006\003\125\004\006\023\002\125\123\061\021\060\017\006
+\003\125\004\010\023\010\111\154\154\151\156\157\151\163\061\020
+\060\016\006\003\125\004\007\023\007\103\150\151\143\141\147\157
+\061\041\060\037\006\003\125\004\012\023\030\124\162\165\163\164
+\167\141\166\145\040\110\157\154\144\151\156\147\163\054\040\111
+\156\143\056\061\072\060\070\006\003\125\004\003\023\061\124\162
+\165\163\164\167\141\166\145\040\107\154\157\142\141\154\040\105
+\103\103\040\120\062\065\066\040\103\145\162\164\151\146\151\143
+\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171\060
+\131\060\023\006\007\052\206\110\316\075\002\001\006\010\052\206
+\110\316\075\003\001\007\003\102\000\004\176\373\154\346\043\343
+\163\062\010\312\140\346\123\234\272\164\215\030\260\170\220\122
+\200\335\070\300\112\035\321\250\314\223\244\227\006\070\312\015
+\025\142\306\216\001\052\145\235\252\337\064\221\056\201\301\344
+\063\222\061\304\375\011\072\246\077\255\243\103\060\101\060\017
+\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060
+\017\006\003\125\035\017\001\001\377\004\005\003\003\007\006\000
+\060\035\006\003\125\035\016\004\026\004\024\243\101\006\254\220
+\155\321\112\353\165\245\112\020\231\263\261\241\213\112\367\060
+\012\006\010\052\206\110\316\075\004\003\002\003\107\000\060\104
+\002\040\007\346\124\332\016\240\132\262\256\021\237\207\305\266
+\377\151\336\045\276\370\240\267\010\363\104\316\052\337\010\041
+\014\067\002\040\055\046\003\240\005\275\153\321\366\134\370\145
+\314\206\155\263\234\064\110\143\204\011\305\215\167\032\342\314
+\234\341\164\173
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "Trustwave Global ECC P256 Certification Authority"
+# Issuer: CN=Trustwave Global ECC P256 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Serial Number:0d:6a:5f:08:3f:28:5c:3e:51:95:df:5d
+# Subject: CN=Trustwave Global ECC P256 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Not Valid Before: Wed Aug 23 19:35:10 2017
+# Not Valid After : Sat Aug 23 19:35:10 2042
+# Fingerprint (SHA-256): 94:5B:BC:82:5E:A5:54:F4:89:D1:FD:51:A7:3D:DF:2E:A6:24:AC:70:19:A0:52:05:22:5C:22:A7:8C:CF:A8:B4
+# Fingerprint (SHA1): B4:90:82:DD:45:0C:BE:8B:5B:B1:66:D3:E2:A4:08:26:CD:ED:42:CF
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Trustwave Global ECC P256 Certification Authority"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\264\220\202\335\105\014\276\213\133\261\146\323\342\244\010\046
+\315\355\102\317
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\133\104\343\215\135\066\206\046\350\015\005\322\131\247\203\124
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
+\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
+\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
+\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
+\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
+\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
+\142\141\154\040\105\103\103\040\120\062\065\066\040\103\145\162
+\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
+\162\151\164\171
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\014\015\152\137\010\077\050\134\076\121\225\337\135
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "Trustwave Global ECC P384 Certification Authority"
+#
+# Issuer: CN=Trustwave Global ECC P384 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Serial Number:08:bd:85:97:6c:99:27:a4:80:68:47:3b
+# Subject: CN=Trustwave Global ECC P384 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Not Valid Before: Wed Aug 23 19:36:43 2017
+# Not Valid After : Sat Aug 23 19:36:43 2042
+# Fingerprint (SHA-256): 55:90:38:59:C8:C0:C3:EB:B8:75:9E:CE:4E:25:57:22:5F:F5:75:8B:BD:38:EB:D4:82:76:60:1E:1B:D5:80:97
+# Fingerprint (SHA1): E7:F3:A3:C8:CF:6F:C3:04:2E:6D:0E:67:32:C5:9E:68:95:0D:5E:D2
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Trustwave Global ECC P384 Certification Authority"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
+\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
+\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
+\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
+\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
+\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
+\142\141\154\040\105\103\103\040\120\063\070\064\040\103\145\162
+\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
+\162\151\164\171
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
+\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
+\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
+\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
+\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
+\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
+\142\141\154\040\105\103\103\040\120\063\070\064\040\103\145\162
+\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
+\162\151\164\171
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\014\010\275\205\227\154\231\047\244\200\150\107\073
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\235\060\202\002\044\240\003\002\001\002\002\014\010
+\275\205\227\154\231\047\244\200\150\107\073\060\012\006\010\052
+\206\110\316\075\004\003\003\060\201\221\061\013\060\011\006\003
+\125\004\006\023\002\125\123\061\021\060\017\006\003\125\004\010
+\023\010\111\154\154\151\156\157\151\163\061\020\060\016\006\003
+\125\004\007\023\007\103\150\151\143\141\147\157\061\041\060\037
+\006\003\125\004\012\023\030\124\162\165\163\164\167\141\166\145
+\040\110\157\154\144\151\156\147\163\054\040\111\156\143\056\061
+\072\060\070\006\003\125\004\003\023\061\124\162\165\163\164\167
+\141\166\145\040\107\154\157\142\141\154\040\105\103\103\040\120
+\063\070\064\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171\060\036\027\015\061
+\067\060\070\062\063\061\071\063\066\064\063\132\027\015\064\062
+\060\070\062\063\061\071\063\066\064\063\132\060\201\221\061\013
+\060\011\006\003\125\004\006\023\002\125\123\061\021\060\017\006
+\003\125\004\010\023\010\111\154\154\151\156\157\151\163\061\020
+\060\016\006\003\125\004\007\023\007\103\150\151\143\141\147\157
+\061\041\060\037\006\003\125\004\012\023\030\124\162\165\163\164
+\167\141\166\145\040\110\157\154\144\151\156\147\163\054\040\111
+\156\143\056\061\072\060\070\006\003\125\004\003\023\061\124\162
+\165\163\164\167\141\166\145\040\107\154\157\142\141\154\040\105
+\103\103\040\120\063\070\064\040\103\145\162\164\151\146\151\143
+\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171\060
+\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201
+\004\000\042\003\142\000\004\153\332\015\165\065\010\061\107\005
+\256\105\231\125\361\021\023\056\112\370\020\061\043\243\176\203
+\323\177\050\010\072\046\032\072\317\227\202\037\200\267\047\011
+\217\321\216\060\304\012\233\016\254\130\004\253\367\066\175\224
+\043\244\233\012\212\213\253\353\375\071\045\146\361\136\376\214
+\256\215\101\171\235\011\140\316\050\251\323\212\155\363\326\105
+\324\362\230\204\070\145\240\243\103\060\101\060\017\006\003\125
+\035\023\001\001\377\004\005\060\003\001\001\377\060\017\006\003
+\125\035\017\001\001\377\004\005\003\003\007\006\000\060\035\006
+\003\125\035\016\004\026\004\024\125\251\204\211\322\301\062\275
+\030\313\154\246\007\116\310\347\235\276\202\220\060\012\006\010
+\052\206\110\316\075\004\003\003\003\147\000\060\144\002\060\067
+\001\222\227\105\022\176\240\363\076\255\031\072\162\335\364\120
+\223\003\022\276\104\322\117\101\244\214\234\235\037\243\366\302
+\222\347\110\024\376\116\233\245\221\127\256\306\067\162\273\002
+\060\147\045\012\261\014\136\356\251\143\222\157\345\220\013\376
+\146\042\312\107\375\212\061\367\203\376\172\277\020\276\030\053
+\036\217\366\051\036\224\131\357\216\041\067\313\121\230\245\156
+\113
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "Trustwave Global ECC P384 Certification Authority"
+# Issuer: CN=Trustwave Global ECC P384 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Serial Number:08:bd:85:97:6c:99:27:a4:80:68:47:3b
+# Subject: CN=Trustwave Global ECC P384 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
+# Not Valid Before: Wed Aug 23 19:36:43 2017
+# Not Valid After : Sat Aug 23 19:36:43 2042
+# Fingerprint (SHA-256): 55:90:38:59:C8:C0:C3:EB:B8:75:9E:CE:4E:25:57:22:5F:F5:75:8B:BD:38:EB:D4:82:76:60:1E:1B:D5:80:97
+# Fingerprint (SHA1): E7:F3:A3:C8:CF:6F:C3:04:2E:6D:0E:67:32:C5:9E:68:95:0D:5E:D2
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Trustwave Global ECC P384 Certification Authority"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\347\363\243\310\317\157\303\004\056\155\016\147\062\305\236\150
+\225\015\136\322
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\352\317\140\304\073\271\025\051\100\241\227\355\170\047\223\326
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
+\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
+\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
+\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
+\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
+\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
+\142\141\154\040\105\103\103\040\120\063\070\064\040\103\145\162
+\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
+\162\151\164\171
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\014\010\275\205\227\154\231\047\244\200\150\107\073
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "NAVER Global Root Certification Authority"
+#
+# Issuer: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR
+# Serial Number:01:94:30:1e:a2:0b:dd:f5:c5:33:2a:b1:43:44:71:f8:d6:50:4d:0d
+# Subject: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR
+# Not Valid Before: Fri Aug 18 08:58:42 2017
+# Not Valid After : Tue Aug 18 23:59:59 2037
+# Fingerprint (SHA-256): 88:F4:38:DC:F8:FF:D1:FA:8F:42:91:15:FF:E5:F8:2A:E1:E0:6E:0C:70:C3:75:FA:AD:71:7B:34:A4:9E:72:65
+# Fingerprint (SHA1): 8F:6B:F2:A9:27:4A:DA:14:A0:C4:F4:8E:61:27:F9:C0:1E:78:5D:D1
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "NAVER Global Root Certification Authority"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\151\061\013\060\011\006\003\125\004\006\023\002\113\122\061
+\046\060\044\006\003\125\004\012\014\035\116\101\126\105\122\040
+\102\125\123\111\116\105\123\123\040\120\114\101\124\106\117\122
+\115\040\103\157\162\160\056\061\062\060\060\006\003\125\004\003
+\014\051\116\101\126\105\122\040\107\154\157\142\141\154\040\122
+\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\151\061\013\060\011\006\003\125\004\006\023\002\113\122\061
+\046\060\044\006\003\125\004\012\014\035\116\101\126\105\122\040
+\102\125\123\111\116\105\123\123\040\120\114\101\124\106\117\122
+\115\040\103\157\162\160\056\061\062\060\060\006\003\125\004\003
+\014\051\116\101\126\105\122\040\107\154\157\142\141\154\040\122
+\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\024\001\224\060\036\242\013\335\365\305\063\052\261\103\104
+\161\370\326\120\115\015
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\242\060\202\003\212\240\003\002\001\002\002\024\001
+\224\060\036\242\013\335\365\305\063\052\261\103\104\161\370\326
+\120\115\015\060\015\006\011\052\206\110\206\367\015\001\001\014
+\005\000\060\151\061\013\060\011\006\003\125\004\006\023\002\113
+\122\061\046\060\044\006\003\125\004\012\014\035\116\101\126\105
+\122\040\102\125\123\111\116\105\123\123\040\120\114\101\124\106
+\117\122\115\040\103\157\162\160\056\061\062\060\060\006\003\125
+\004\003\014\051\116\101\126\105\122\040\107\154\157\142\141\154
+\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164
+\151\157\156\040\101\165\164\150\157\162\151\164\171\060\036\027
+\015\061\067\060\070\061\070\060\070\065\070\064\062\132\027\015
+\063\067\060\070\061\070\062\063\065\071\065\071\132\060\151\061
+\013\060\011\006\003\125\004\006\023\002\113\122\061\046\060\044
+\006\003\125\004\012\014\035\116\101\126\105\122\040\102\125\123
+\111\116\105\123\123\040\120\114\101\124\106\117\122\115\040\103
+\157\162\160\056\061\062\060\060\006\003\125\004\003\014\051\116
+\101\126\105\122\040\107\154\157\142\141\154\040\122\157\157\164
+\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101
+\165\164\150\157\162\151\164\171\060\202\002\042\060\015\006\011
+\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000
+\060\202\002\012\002\202\002\001\000\266\324\361\223\134\265\100
+\211\012\253\015\220\133\120\143\256\220\224\164\027\105\162\326
+\173\145\132\051\113\247\126\240\113\270\057\102\165\351\331\173
+\044\132\061\145\253\027\027\321\063\072\331\021\334\100\066\207
+\337\307\152\351\046\136\131\212\167\343\350\110\234\061\026\372
+\076\221\261\312\311\243\342\237\316\041\123\243\002\066\060\313
+\122\002\345\332\062\135\303\305\346\371\356\021\307\213\311\104
+\036\204\223\030\112\264\237\345\022\144\151\320\046\205\142\001
+\266\311\002\035\276\203\121\273\134\332\370\255\025\152\231\367
+\222\124\367\064\133\351\277\352\051\201\022\324\123\221\226\263
+\221\132\335\376\220\163\050\373\060\106\265\312\010\007\307\161
+\162\311\146\323\064\227\366\214\364\030\112\341\320\075\132\105
+\266\151\247\051\373\043\316\210\330\022\234\000\110\250\246\017
+\263\073\222\215\161\016\164\305\213\310\114\371\364\233\216\270
+\074\151\355\157\073\120\057\130\355\304\260\320\034\033\152\014
+\342\274\104\252\330\315\024\135\224\170\141\277\016\156\332\052
+\274\057\014\013\161\246\263\026\077\234\346\371\314\237\123\065
+\342\003\240\240\030\277\273\361\276\364\326\214\207\015\102\367
+\006\271\361\155\355\004\224\250\376\266\323\006\306\100\141\337
+\235\235\363\124\166\316\123\072\001\246\222\101\354\004\243\217
+\015\242\325\011\312\326\313\232\361\357\103\135\300\253\245\101
+\317\134\123\160\160\311\210\246\055\324\153\141\163\120\046\206
+\141\016\137\033\302\053\342\214\325\273\235\301\003\102\272\224
+\332\137\251\260\312\314\115\012\357\107\151\003\057\042\373\361
+\050\316\277\135\120\145\250\220\155\263\164\260\010\307\254\250
+\321\353\076\234\374\135\032\203\056\053\313\265\363\104\235\072
+\247\027\141\226\242\161\323\160\226\025\115\267\114\163\356\031
+\134\305\133\076\101\376\254\165\140\073\033\143\316\000\335\332
+\010\220\142\264\345\055\356\110\247\153\027\231\124\276\207\112
+\343\251\136\004\114\353\020\155\124\326\357\361\350\362\142\026
+\313\200\153\355\075\355\365\037\060\245\256\113\311\023\355\212
+\001\001\311\270\121\130\300\146\072\261\146\113\304\325\061\002
+\142\351\164\204\014\333\115\106\055\002\003\001\000\001\243\102
+\060\100\060\035\006\003\125\035\016\004\026\004\024\322\237\210
+\337\241\315\054\275\354\365\073\001\001\223\063\047\262\353\140
+\113\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001
+\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001
+\001\377\060\015\006\011\052\206\110\206\367\015\001\001\014\005
+\000\003\202\002\001\000\062\312\200\263\235\075\124\006\335\322
+\322\056\360\244\001\041\013\147\110\312\155\216\340\310\252\015
+\252\215\041\127\217\306\076\172\312\333\121\324\122\263\324\226
+\204\245\130\140\177\345\013\216\037\365\334\012\025\201\345\073
+\266\267\042\057\011\234\023\026\261\154\014\065\010\155\253\143
+\162\355\334\276\354\307\127\346\060\040\161\326\327\020\301\023
+\125\001\214\052\103\344\101\361\317\072\172\123\222\316\242\003
+\005\015\070\337\002\273\020\056\331\073\322\233\172\300\241\246
+\370\265\061\346\364\165\311\271\123\231\165\107\042\132\024\025
+\307\170\033\266\235\351\014\370\033\166\361\205\204\336\241\332
+\022\357\244\342\020\227\172\170\336\014\121\227\250\041\100\213
+\206\275\015\360\136\116\113\066\273\073\040\037\212\102\126\341
+\013\032\277\173\320\042\103\054\104\214\373\345\052\264\154\034
+\034\272\224\340\023\176\041\346\232\302\313\305\102\144\264\036
+\224\173\010\045\310\161\314\207\105\127\205\323\237\051\142\042
+\203\121\227\000\030\227\167\152\230\222\311\174\140\154\337\154
+\175\112\344\160\114\302\236\270\035\367\320\064\307\017\314\373
+\247\377\003\276\255\160\220\332\013\335\310\155\227\137\232\177
+\011\062\101\375\315\242\314\132\155\114\362\252\111\376\146\370
+\351\330\065\353\016\050\036\356\110\057\072\320\171\011\070\174
+\246\042\202\223\225\320\003\276\276\002\240\005\335\040\042\343
+\157\035\210\064\140\306\346\012\271\011\165\013\360\007\350\151
+\226\065\307\373\043\201\216\070\071\270\105\053\103\170\242\321
+\054\024\377\015\050\162\162\225\233\136\011\333\211\104\230\252
+\241\111\273\161\122\362\277\366\377\047\241\066\257\270\266\167
+\210\335\072\244\155\233\064\220\334\024\135\060\277\267\353\027
+\344\207\267\161\320\241\327\167\025\324\102\327\362\363\061\231
+\135\233\335\026\155\077\352\006\043\370\106\242\042\355\223\366
+\335\232\346\052\207\261\230\124\361\042\367\153\105\343\342\216
+\166\035\232\215\304\006\215\066\267\024\363\235\124\151\267\216
+\074\325\244\155\223\201\267\255\366\275\144\173\302\311\150\071
+\240\222\234\315\064\206\221\220\372\144\121\235\376\376\353\245
+\365\165\336\211\367\162
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "NAVER Global Root Certification Authority"
+# Issuer: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR
+# Serial Number:01:94:30:1e:a2:0b:dd:f5:c5:33:2a:b1:43:44:71:f8:d6:50:4d:0d
+# Subject: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR
+# Not Valid Before: Fri Aug 18 08:58:42 2017
+# Not Valid After : Tue Aug 18 23:59:59 2037
+# Fingerprint (SHA-256): 88:F4:38:DC:F8:FF:D1:FA:8F:42:91:15:FF:E5:F8:2A:E1:E0:6E:0C:70:C3:75:FA:AD:71:7B:34:A4:9E:72:65
+# Fingerprint (SHA1): 8F:6B:F2:A9:27:4A:DA:14:A0:C4:F4:8E:61:27:F9:C0:1E:78:5D:D1
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "NAVER Global Root Certification Authority"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\217\153\362\251\047\112\332\024\240\304\364\216\141\047\371\300
+\036\170\135\321
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\310\176\101\366\045\073\365\011\263\027\350\106\075\277\320\233
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\151\061\013\060\011\006\003\125\004\006\023\002\113\122\061
+\046\060\044\006\003\125\004\012\014\035\116\101\126\105\122\040
+\102\125\123\111\116\105\123\123\040\120\114\101\124\106\117\122
+\115\040\103\157\162\160\056\061\062\060\060\006\003\125\004\003
+\014\051\116\101\126\105\122\040\107\154\157\142\141\154\040\122
+\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\024\001\224\060\036\242\013\335\365\305\063\052\261\103\104
+\161\370\326\120\115\015
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
+#
+# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES
+# Serial Number:62:f6:32:6c:e5:c4:e3:68:5c:1b:62:dd:9c:2e:9d:95
+# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES
+# Not Valid Before: Thu Dec 20 09:37:33 2018
+# Not Valid After : Sun Dec 20 09:37:33 2043
+# Fingerprint (SHA-256): 55:41:53:B1:3D:2C:F9:DD:B7:53:BF:BE:1A:4E:0A:E0:8D:0A:A4:18:70:58:FE:60:A2:B8:62:B2:E4:B8:7B:CB
+# Fingerprint (SHA1): 62:FF:D9:9E:C0:65:0D:03:CE:75:93:D2:ED:3F:2D:32:C9:E3:E5:4A
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\170\061\013\060\011\006\003\125\004\006\023\002\105\123\061
+\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122
+\103\115\061\016\060\014\006\003\125\004\013\014\005\103\145\162
+\145\163\061\030\060\026\006\003\125\004\141\014\017\126\101\124
+\105\123\055\121\062\070\062\066\060\060\064\112\061\054\060\052
+\006\003\125\004\003\014\043\101\103\040\122\101\111\132\040\106
+\116\115\124\055\122\103\115\040\123\105\122\126\111\104\117\122
+\105\123\040\123\105\107\125\122\117\123
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\170\061\013\060\011\006\003\125\004\006\023\002\105\123\061
+\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122
+\103\115\061\016\060\014\006\003\125\004\013\014\005\103\145\162
+\145\163\061\030\060\026\006\003\125\004\141\014\017\126\101\124
+\105\123\055\121\062\070\062\066\060\060\064\112\061\054\060\052
+\006\003\125\004\003\014\043\101\103\040\122\101\111\132\040\106
+\116\115\124\055\122\103\115\040\123\105\122\126\111\104\117\122
+\105\123\040\123\105\107\125\122\117\123
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\142\366\062\154\345\304\343\150\134\033\142\335\234\056
+\235\225
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\156\060\202\001\363\240\003\002\001\002\002\020\142
+\366\062\154\345\304\343\150\134\033\142\335\234\056\235\225\060
+\012\006\010\052\206\110\316\075\004\003\003\060\170\061\013\060
+\011\006\003\125\004\006\023\002\105\123\061\021\060\017\006\003
+\125\004\012\014\010\106\116\115\124\055\122\103\115\061\016\060
+\014\006\003\125\004\013\014\005\103\145\162\145\163\061\030\060
+\026\006\003\125\004\141\014\017\126\101\124\105\123\055\121\062
+\070\062\066\060\060\064\112\061\054\060\052\006\003\125\004\003
+\014\043\101\103\040\122\101\111\132\040\106\116\115\124\055\122
+\103\115\040\123\105\122\126\111\104\117\122\105\123\040\123\105
+\107\125\122\117\123\060\036\027\015\061\070\061\062\062\060\060
+\071\063\067\063\063\132\027\015\064\063\061\062\062\060\060\071
+\063\067\063\063\132\060\170\061\013\060\011\006\003\125\004\006
+\023\002\105\123\061\021\060\017\006\003\125\004\012\014\010\106
+\116\115\124\055\122\103\115\061\016\060\014\006\003\125\004\013
+\014\005\103\145\162\145\163\061\030\060\026\006\003\125\004\141
+\014\017\126\101\124\105\123\055\121\062\070\062\066\060\060\064
+\112\061\054\060\052\006\003\125\004\003\014\043\101\103\040\122
+\101\111\132\040\106\116\115\124\055\122\103\115\040\123\105\122
+\126\111\104\117\122\105\123\040\123\105\107\125\122\117\123\060
+\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201
+\004\000\042\003\142\000\004\366\272\127\123\310\312\253\337\066
+\112\122\041\344\227\322\203\147\236\360\145\121\320\136\207\307
+\107\261\131\362\127\107\233\000\002\223\104\027\151\333\102\307
+\261\262\072\030\016\264\135\214\263\146\135\241\064\371\066\054
+\111\333\363\106\374\263\104\151\104\023\146\375\327\305\375\257
+\066\115\316\003\115\007\161\317\257\152\005\322\242\103\132\012
+\122\157\001\003\116\216\213\243\102\060\100\060\017\006\003\125
+\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003
+\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003
+\125\035\016\004\026\004\024\001\271\057\357\277\021\206\140\362
+\117\320\101\156\253\163\037\347\322\156\111\060\012\006\010\052
+\206\110\316\075\004\003\003\003\151\000\060\146\002\061\000\256
+\112\343\053\100\303\164\021\362\225\255\026\043\336\116\014\032
+\346\135\245\044\136\153\104\173\374\070\342\117\313\234\105\027
+\021\114\024\047\046\125\071\165\112\003\314\023\220\237\222\002
+\061\000\372\112\154\140\210\163\363\356\270\230\142\251\316\053
+\302\331\212\246\160\061\035\257\260\224\114\353\117\306\343\321
+\363\142\247\074\377\223\056\007\134\111\001\147\151\022\002\162
+\277\347
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
+# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES
+# Serial Number:62:f6:32:6c:e5:c4:e3:68:5c:1b:62:dd:9c:2e:9d:95
+# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES
+# Not Valid Before: Thu Dec 20 09:37:33 2018
+# Not Valid After : Sun Dec 20 09:37:33 2043
+# Fingerprint (SHA-256): 55:41:53:B1:3D:2C:F9:DD:B7:53:BF:BE:1A:4E:0A:E0:8D:0A:A4:18:70:58:FE:60:A2:B8:62:B2:E4:B8:7B:CB
+# Fingerprint (SHA1): 62:FF:D9:9E:C0:65:0D:03:CE:75:93:D2:ED:3F:2D:32:C9:E3:E5:4A
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\142\377\331\236\300\145\015\003\316\165\223\322\355\077\055\062
+\311\343\345\112
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\031\066\234\122\003\057\322\321\273\043\314\335\036\022\125\273
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\170\061\013\060\011\006\003\125\004\006\023\002\105\123\061
+\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122
+\103\115\061\016\060\014\006\003\125\004\013\014\005\103\145\162
+\145\163\061\030\060\026\006\003\125\004\141\014\017\126\101\124
+\105\123\055\121\062\070\062\066\060\060\064\112\061\054\060\052
+\006\003\125\004\003\014\043\101\103\040\122\101\111\132\040\106
+\116\115\124\055\122\103\115\040\123\105\122\126\111\104\117\122
+\105\123\040\123\105\107\125\122\117\123
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\142\366\062\154\345\304\343\150\134\033\142\335\234\056
+\235\225
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "GlobalSign Secure Mail Root R45"
+#
+# Issuer: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE
+# Serial Number:76:53:fe:a8:4c:50:ab:9f:8d:32:b5:1d:03:8f:57:dc
+# Subject: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE
+# Not Valid Before: Wed Mar 18 00:00:00 2020
+# Not Valid After : Sat Mar 18 00:00:00 2045
+# Fingerprint (SHA-256): 31:9A:F0:A7:72:9E:6F:89:26:9C:13:1E:A6:A3:A1:6F:CD:86:38:9F:DC:AB:3C:47:A4:A6:75:C1:61:A3:F9:74
+# Fingerprint (SHA1): 76:18:D1:F3:80:24:3D:52:40:C6:11:6A:AD:57:77:09:7D:81:30:A0
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GlobalSign Secure Mail Root R45"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
+\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
+\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
+\040\122\064\065
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
+\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
+\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
+\040\122\064\065
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\166\123\376\250\114\120\253\237\215\062\265\035\003\217
+\127\334
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\160\060\202\003\130\240\003\002\001\002\002\020\166
+\123\376\250\114\120\253\237\215\062\265\035\003\217\127\334\060
+\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\122
+\061\013\060\011\006\003\125\004\006\023\002\102\105\061\031\060
+\027\006\003\125\004\012\023\020\107\154\157\142\141\154\123\151
+\147\156\040\156\166\055\163\141\061\050\060\046\006\003\125\004
+\003\023\037\107\154\157\142\141\154\123\151\147\156\040\123\145
+\143\165\162\145\040\115\141\151\154\040\122\157\157\164\040\122
+\064\065\060\036\027\015\062\060\060\063\061\070\060\060\060\060
+\060\060\132\027\015\064\065\060\063\061\070\060\060\060\060\060
+\060\132\060\122\061\013\060\011\006\003\125\004\006\023\002\102
+\105\061\031\060\027\006\003\125\004\012\023\020\107\154\157\142
+\141\154\123\151\147\156\040\156\166\055\163\141\061\050\060\046
+\006\003\125\004\003\023\037\107\154\157\142\141\154\123\151\147
+\156\040\123\145\143\165\162\145\040\115\141\151\154\040\122\157
+\157\164\040\122\064\065\060\202\002\042\060\015\006\011\052\206
+\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202
+\002\012\002\202\002\001\000\334\171\314\155\006\371\155\273\340
+\126\004\154\177\340\165\314\055\005\111\350\113\334\124\354\133
+\167\225\162\277\177\142\235\205\251\212\044\120\137\123\345\333
+\164\157\244\051\133\023\052\011\255\232\305\057\302\367\166\073
+\241\105\106\252\103\346\044\376\053\260\157\062\160\031\106\132
+\171\046\057\374\075\175\137\144\313\127\314\141\141\250\331\225
+\156\343\225\240\156\177\107\022\030\326\357\003\311\373\212\372
+\232\275\202\025\251\125\167\113\021\117\131\340\153\303\161\363
+\014\330\124\325\201\150\076\023\271\025\056\207\212\074\104\047
+\066\142\044\156\370\054\005\162\060\141\275\102\221\043\304\235
+\045\247\331\124\232\024\243\061\255\200\171\014\247\143\154\230
+\243\254\127\107\063\037\145\226\341\320\322\065\332\371\161\367
+\241\246\045\265\101\135\337\076\140\330\321\366\237\245\362\270
+\314\023\252\217\371\262\156\341\203\055\223\335\076\205\032\335
+\350\261\134\046\001\313\111\205\374\374\322\324\177\205\142\206
+\164\371\313\354\065\042\242\014\060\217\073\253\171\353\126\362
+\372\102\363\355\371\037\105\211\100\051\255\352\222\164\352\122
+\375\126\264\053\332\242\355\165\302\156\253\316\122\220\113\366
+\336\360\111\217\232\110\324\210\031\155\105\346\314\214\271\335
+\144\140\140\002\100\370\271\317\274\130\353\075\205\271\306\012
+\323\234\007\146\217\307\030\071\043\106\341\074\036\243\057\120
+\141\222\013\075\053\154\361\243\107\070\127\221\253\015\217\306
+\235\115\004\322\046\122\134\345\245\375\052\055\026\052\001\151
+\347\251\175\341\066\267\261\052\305\331\261\215\275\271\213\316
+\314\213\241\076\013\110\315\120\225\064\304\330\010\131\330\153
+\046\364\276\365\324\042\027\000\127\311\256\233\004\060\063\237
+\013\373\337\126\242\311\156\124\166\332\261\227\142\047\131\017
+\021\212\042\033\144\226\077\250\361\267\044\112\215\074\123\174
+\155\203\166\075\262\046\110\163\365\104\026\001\055\011\052\216
+\026\226\120\320\163\006\135\273\042\110\202\114\012\106\132\077
+\200\377\134\362\362\232\254\054\010\340\326\352\360\022\070\201
+\117\246\020\355\106\253\314\026\234\013\317\144\246\231\002\205
+\104\147\106\255\375\115\347\002\003\001\000\001\243\102\060\100
+\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206
+\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001
+\377\060\035\006\003\125\035\016\004\026\004\024\240\223\025\050
+\156\356\217\010\262\065\306\236\142\171\164\247\261\016\053\173
+\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003
+\202\002\001\000\105\012\370\321\134\254\142\201\320\004\327\266
+\377\127\121\211\013\014\313\336\044\145\067\373\253\236\355\146
+\364\352\014\031\151\211\270\031\261\060\126\264\331\366\367\276
+\306\256\227\313\105\366\021\214\072\060\144\114\301\237\131\300
+\106\102\010\006\107\144\027\170\340\225\007\006\326\214\242\254
+\251\331\077\323\173\126\117\374\304\207\050\337\266\053\026\043
+\300\237\037\133\343\326\104\136\042\117\043\004\214\065\026\265
+\171\007\206\134\057\227\342\366\010\144\246\334\333\250\212\343
+\244\173\167\015\321\051\223\050\040\264\123\243\113\116\137\336
+\301\366\165\043\374\037\074\170\117\160\061\170\057\242\065\124
+\161\004\254\310\304\155\303\366\221\261\376\315\356\104\156\201
+\366\100\305\076\052\001\277\253\114\261\003\077\015\021\344\017
+\322\044\343\042\210\233\237\137\107\075\121\111\340\011\067\176
+\027\041\061\166\267\147\161\110\050\113\045\327\020\350\237\141
+\131\026\305\076\062\116\037\014\316\243\314\017\344\307\021\007
+\042\057\070\010\335\133\227\353\102\154\131\232\232\356\172\320
+\235\337\305\333\011\103\056\012\252\031\075\153\350\152\060\172
+\127\346\277\263\152\071\251\217\343\361\117\145\150\266\275\237
+\050\217\241\026\132\011\120\072\062\056\035\057\104\021\102\246
+\000\346\061\230\377\055\241\017\346\244\140\126\317\171\327\262
+\116\327\260\372\156\014\127\043\307\316\037\245\261\114\155\031
+\111\236\016\177\160\217\161\077\130\050\237\165\335\141\340\072
+\267\071\266\356\227\324\065\121\373\213\111\140\310\074\146\256
+\227\356\215\046\131\127\273\170\360\172\120\060\011\260\140\252
+\237\116\334\311\076\036\072\334\142\223\063\260\072\124\164\157
+\054\061\105\321\153\021\062\152\150\166\366\075\366\152\023\136
+\044\230\347\352\035\232\317\170\202\007\140\367\115\020\323\201
+\232\105\215\236\257\233\334\200\307\103\262\225\150\244\303\016
+\350\012\107\025\277\124\063\334\001\347\325\246\036\163\330\172
+\262\277\057\255\343\125\060\236\337\016\101\274\340\021\365\241
+\014\250\042\341\343\000\243\116\160\174\222\343\004\321\172\102
+\212\165\220\131\343\233\321\114\242\144\275\163\171\233\157\362
+\263\301\366\074
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "GlobalSign Secure Mail Root R45"
+# Issuer: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE
+# Serial Number:76:53:fe:a8:4c:50:ab:9f:8d:32:b5:1d:03:8f:57:dc
+# Subject: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE
+# Not Valid Before: Wed Mar 18 00:00:00 2020
+# Not Valid After : Sat Mar 18 00:00:00 2045
+# Fingerprint (SHA-256): 31:9A:F0:A7:72:9E:6F:89:26:9C:13:1E:A6:A3:A1:6F:CD:86:38:9F:DC:AB:3C:47:A4:A6:75:C1:61:A3:F9:74
+# Fingerprint (SHA1): 76:18:D1:F3:80:24:3D:52:40:C6:11:6A:AD:57:77:09:7D:81:30:A0
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GlobalSign Secure Mail Root R45"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\166\030\321\363\200\044\075\122\100\306\021\152\255\127\167\011
+\175\201\060\240
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\223\304\173\263\016\124\107\034\103\054\213\276\160\205\142\051
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
+\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
+\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
+\040\122\064\065
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\166\123\376\250\114\120\253\237\215\062\265\035\003\217
+\127\334
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "GlobalSign Secure Mail Root E45"
+#
+# Issuer: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE
+# Serial Number:76:53:fe:aa:27:1d:95:46:5d:d6:f1:9e:e5:b8:90:0a
+# Subject: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE
+# Not Valid Before: Wed Mar 18 00:00:00 2020
+# Not Valid After : Sat Mar 18 00:00:00 2045
+# Fingerprint (SHA-256): 5C:BF:6F:B8:1F:D4:17:EA:41:28:CD:6F:81:72:A3:C9:40:20:94:F7:4A:B2:ED:3A:06:B4:40:5D:04:F3:0B:19
+# Fingerprint (SHA1): 18:2E:1F:32:4F:89:DF:BE:FE:88:89:F0:93:C2:C4:A0:2B:67:75:21
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GlobalSign Secure Mail Root E45"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
+\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
+\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
+\040\105\064\065
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
+\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
+\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
+\040\105\064\065
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\166\123\376\252\047\035\225\106\135\326\361\236\345\270
+\220\012
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\041\060\202\001\247\240\003\002\001\002\002\020\166
+\123\376\252\047\035\225\106\135\326\361\236\345\270\220\012\060
+\012\006\010\052\206\110\316\075\004\003\003\060\122\061\013\060
+\011\006\003\125\004\006\023\002\102\105\061\031\060\027\006\003
+\125\004\012\023\020\107\154\157\142\141\154\123\151\147\156\040
+\156\166\055\163\141\061\050\060\046\006\003\125\004\003\023\037
+\107\154\157\142\141\154\123\151\147\156\040\123\145\143\165\162
+\145\040\115\141\151\154\040\122\157\157\164\040\105\064\065\060
+\036\027\015\062\060\060\063\061\070\060\060\060\060\060\060\132
+\027\015\064\065\060\063\061\070\060\060\060\060\060\060\132\060
+\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061\031
+\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154\123
+\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003\125
+\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040\123
+\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164\040
+\105\064\065\060\166\060\020\006\007\052\206\110\316\075\002\001
+\006\005\053\201\004\000\042\003\142\000\004\371\171\213\201\107
+\067\211\226\077\105\111\120\177\032\046\013\223\062\176\056\300
+\300\247\010\232\303\156\217\233\076\013\042\354\067\123\267\157
+\212\260\274\047\067\113\155\251\106\073\331\037\377\245\241\104
+\273\055\163\277\236\101\007\134\123\233\121\010\072\132\273\157
+\070\307\026\221\170\302\112\023\151\035\202\337\132\057\000\210
+\226\242\056\034\164\371\235\176\146\067\212\243\102\060\100\060
+\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060
+\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377
+\060\035\006\003\125\035\016\004\026\004\024\337\023\136\213\137
+\302\100\002\375\126\267\224\114\266\036\325\246\261\024\226\060
+\012\006\010\052\206\110\316\075\004\003\003\003\150\000\060\145
+\002\060\023\260\276\327\161\040\076\344\253\234\316\066\022\175
+\137\114\037\052\265\151\105\063\137\323\055\132\262\344\210\307
+\336\012\066\102\062\171\235\246\153\272\341\371\104\052\173\212
+\303\022\002\061\000\240\146\034\116\207\235\207\311\355\231\114
+\033\012\356\055\140\303\067\307\035\315\265\162\260\331\306\357
+\274\362\377\077\360\122\335\010\347\252\144\171\303\344\151\127
+\221\057\244\313\174
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "GlobalSign Secure Mail Root E45"
+# Issuer: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE
+# Serial Number:76:53:fe:aa:27:1d:95:46:5d:d6:f1:9e:e5:b8:90:0a
+# Subject: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE
+# Not Valid Before: Wed Mar 18 00:00:00 2020
+# Not Valid After : Sat Mar 18 00:00:00 2045
+# Fingerprint (SHA-256): 5C:BF:6F:B8:1F:D4:17:EA:41:28:CD:6F:81:72:A3:C9:40:20:94:F7:4A:B2:ED:3A:06:B4:40:5D:04:F3:0B:19
+# Fingerprint (SHA1): 18:2E:1F:32:4F:89:DF:BE:FE:88:89:F0:93:C2:C4:A0:2B:67:75:21
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GlobalSign Secure Mail Root E45"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\030\056\037\062\117\211\337\276\376\210\211\360\223\302\304\240
+\053\147\165\041
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\305\374\306\056\237\364\122\055\052\250\244\272\373\147\062\377
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
+\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
+\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
+\040\105\064\065
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\166\123\376\252\047\035\225\106\135\326\361\236\345\270
+\220\012
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "GlobalSign Root R46"
+#
+# Issuer: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE
+# Serial Number:11:d2:bb:b9:d7:23:18:9e:40:5f:0a:9d:2d:d0:df:25:67:d1
+# Subject: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE
+# Not Valid Before: Wed Mar 20 00:00:00 2019
+# Not Valid After : Tue Mar 20 00:00:00 2046
+# Fingerprint (SHA-256): 4F:A3:12:6D:8D:3A:11:D1:C4:85:5A:4F:80:7C:BA:D6:CF:91:9D:3A:5A:88:B0:3B:EA:2C:63:72:D9:3C:40:C9
+# Fingerprint (SHA1): 53:A2:B0:4B:CA:6B:D6:45:E6:39:8A:8E:C4:0D:D2:BF:77:C3:A2:90
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GlobalSign Root R46"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
+\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
+\122\157\157\164\040\122\064\066
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
+\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
+\122\157\157\164\040\122\064\066
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\022\021\322\273\271\327\043\030\236\100\137\012\235\055\320
+\337\045\147\321
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\132\060\202\003\102\240\003\002\001\002\002\022\021
+\322\273\271\327\043\030\236\100\137\012\235\055\320\337\045\147
+\321\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000
+\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
+\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
+\122\157\157\164\040\122\064\066\060\036\027\015\061\071\060\063
+\062\060\060\060\060\060\060\060\132\027\015\064\066\060\063\062
+\060\060\060\060\060\060\060\132\060\106\061\013\060\011\006\003
+\125\004\006\023\002\102\105\061\031\060\027\006\003\125\004\012
+\023\020\107\154\157\142\141\154\123\151\147\156\040\156\166\055
+\163\141\061\034\060\032\006\003\125\004\003\023\023\107\154\157
+\142\141\154\123\151\147\156\040\122\157\157\164\040\122\064\066
+\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
+\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
+\000\254\254\164\062\350\263\145\345\272\355\103\046\035\246\211
+\015\105\272\051\210\262\244\035\143\335\323\301\054\011\127\211
+\071\241\125\351\147\064\167\014\156\344\125\035\122\045\322\023
+\153\136\341\035\251\267\175\211\062\137\015\236\237\054\172\143
+\140\100\037\246\260\266\170\217\231\124\226\010\130\256\344\006
+\274\142\005\002\026\277\257\250\043\003\266\224\017\274\156\154
+\302\313\325\246\273\014\351\366\301\002\373\041\336\146\335\027
+\253\164\102\357\360\164\057\045\364\352\153\125\133\220\333\235
+\337\136\207\012\100\373\255\031\153\373\367\312\140\210\336\332
+\301\217\326\256\325\177\324\074\203\356\327\026\114\203\105\063
+\153\047\320\206\320\034\055\153\363\253\175\361\205\251\365\050
+\322\255\357\363\204\113\034\207\374\023\243\072\162\242\132\021
+\053\326\047\161\047\355\201\055\155\146\201\222\207\264\033\130
+\172\314\077\012\372\106\117\115\170\134\370\053\110\343\004\204
+\313\135\366\264\152\263\145\374\102\236\121\046\043\040\313\075
+\024\371\201\355\145\026\000\117\032\144\227\146\010\317\214\173
+\343\053\300\235\371\024\362\033\361\126\152\026\277\054\205\205
+\315\170\070\232\353\102\152\002\064\030\203\027\116\224\126\370
+\266\202\265\363\226\335\075\363\276\177\040\167\076\173\031\043
+\153\054\324\162\163\103\127\175\340\370\327\151\117\027\066\004
+\371\300\220\140\067\105\336\346\014\330\164\215\256\234\242\155
+\164\135\102\276\006\365\331\144\156\002\020\254\211\260\114\073
+\007\115\100\176\044\305\212\230\202\171\216\244\247\202\040\215
+\043\372\047\161\311\337\306\101\164\240\115\366\221\026\334\106
+\214\137\051\143\061\131\161\014\330\157\302\266\062\175\373\346
+\135\123\246\176\025\374\273\165\174\135\354\370\366\027\034\354
+\307\153\031\313\363\173\360\053\007\245\331\154\171\124\166\154
+\235\034\246\156\016\351\171\014\250\043\152\243\337\033\060\061
+\237\261\124\173\376\152\313\146\252\334\145\320\242\236\112\232
+\007\041\153\201\217\333\304\131\372\336\042\300\004\234\343\252
+\133\066\223\350\075\275\172\241\235\013\166\261\013\307\235\375
+\317\230\250\006\302\370\052\243\241\203\240\267\045\162\245\002
+\343\002\003\001\000\001\243\102\060\100\060\016\006\003\125\035
+\017\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035
+\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125
+\035\016\004\026\004\024\003\134\253\163\201\207\250\314\260\246
+\325\224\342\066\226\111\377\005\231\054\060\015\006\011\052\206
+\110\206\367\015\001\001\014\005\000\003\202\002\001\000\174\170
+\354\366\002\054\273\133\176\222\053\135\071\334\276\330\035\242
+\102\063\115\371\357\244\052\073\104\151\036\254\331\105\243\116
+\074\247\330\044\121\262\124\034\223\116\304\357\173\223\205\140
+\046\352\011\110\340\365\273\307\351\150\322\273\152\061\161\314
+\171\256\021\250\360\231\375\345\037\274\057\250\314\127\353\166
+\304\041\246\107\123\125\115\150\277\005\244\356\327\046\253\142
+\332\103\067\113\342\306\265\345\262\203\031\072\307\323\333\115
+\236\010\172\363\356\317\076\142\373\254\350\140\314\321\307\241
+\134\203\105\304\105\314\363\027\153\024\311\004\002\076\322\044
+\246\171\351\036\316\242\347\301\131\025\237\035\342\113\232\076
+\237\166\010\055\153\330\272\127\024\332\203\352\376\214\125\351
+\320\116\251\314\167\061\261\104\021\172\134\261\076\323\024\105
+\025\030\142\044\023\322\313\115\316\134\203\301\066\362\020\265
+\016\210\155\270\341\126\237\211\336\226\146\071\107\144\054\156
+\115\256\142\173\277\140\164\031\270\126\254\222\254\026\062\355
+\255\150\125\376\230\272\323\064\336\364\311\141\303\016\206\366
+\113\204\140\356\015\173\265\062\130\171\221\125\054\201\103\263
+\164\037\172\252\045\236\035\327\241\213\271\315\102\056\004\244
+\146\203\115\211\065\266\154\250\066\112\171\041\170\042\320\102
+\274\321\100\061\220\241\276\004\317\312\147\355\365\360\200\323
+\140\311\203\052\042\005\320\007\073\122\277\014\236\252\053\371
+\273\346\037\217\045\272\205\215\027\036\002\376\135\120\004\127
+\317\376\055\274\357\134\300\032\253\266\237\044\306\337\163\150
+\110\220\054\024\364\077\122\032\344\322\313\024\303\141\151\317
+\342\371\030\305\272\063\237\024\243\004\135\271\161\367\265\224
+\330\366\063\301\132\301\064\213\174\233\335\223\072\347\023\242
+\160\141\237\257\217\353\330\305\165\370\063\146\324\164\147\072
+\067\167\234\347\335\244\017\166\103\146\212\103\362\237\373\014
+\102\170\143\321\342\017\157\173\324\241\075\164\227\205\267\110
+\071\101\326\040\374\320\072\263\372\350\157\304\212\272\161\067
+\276\213\227\261\170\061\117\263\347\266\003\023\316\124\235\256
+\045\131\314\177\065\137\010\367\100\105\061\170\052\172
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "GlobalSign Root R46"
+# Issuer: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE
+# Serial Number:11:d2:bb:b9:d7:23:18:9e:40:5f:0a:9d:2d:d0:df:25:67:d1
+# Subject: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE
+# Not Valid Before: Wed Mar 20 00:00:00 2019
+# Not Valid After : Tue Mar 20 00:00:00 2046
+# Fingerprint (SHA-256): 4F:A3:12:6D:8D:3A:11:D1:C4:85:5A:4F:80:7C:BA:D6:CF:91:9D:3A:5A:88:B0:3B:EA:2C:63:72:D9:3C:40:C9
+# Fingerprint (SHA1): 53:A2:B0:4B:CA:6B:D6:45:E6:39:8A:8E:C4:0D:D2:BF:77:C3:A2:90
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GlobalSign Root R46"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\123\242\260\113\312\153\326\105\346\071\212\216\304\015\322\277
+\167\303\242\220
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\304\024\060\344\372\146\103\224\052\152\033\044\137\031\320\357
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
+\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
+\122\157\157\164\040\122\064\066
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\022\021\322\273\271\327\043\030\236\100\137\012\235\055\320
+\337\045\147\321
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "GlobalSign Root E46"
+#
+# Issuer: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE
+# Serial Number:11:d2:bb:ba:33:6e:d4:bc:e6:24:68:c5:0d:84:1d:98:e8:43
+# Subject: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE
+# Not Valid Before: Wed Mar 20 00:00:00 2019
+# Not Valid After : Tue Mar 20 00:00:00 2046
+# Fingerprint (SHA-256): CB:B9:C4:4D:84:B8:04:3E:10:50:EA:31:A6:9F:51:49:55:D7:BF:D2:E2:C6:B4:93:01:01:9A:D6:1D:9F:50:58
+# Fingerprint (SHA1): 39:B4:6C:D5:FE:80:06:EB:E2:2F:4A:BB:08:33:A0:AF:DB:B9:DD:84
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GlobalSign Root E46"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
+\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
+\122\157\157\164\040\105\064\066
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
+\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
+\122\157\157\164\040\105\064\066
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\022\021\322\273\272\063\156\324\274\346\044\150\305\015\204
+\035\230\350\103
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\013\060\202\001\221\240\003\002\001\002\002\022\021
+\322\273\272\063\156\324\274\346\044\150\305\015\204\035\230\350
+\103\060\012\006\010\052\206\110\316\075\004\003\003\060\106\061
+\013\060\011\006\003\125\004\006\023\002\102\105\061\031\060\027
+\006\003\125\004\012\023\020\107\154\157\142\141\154\123\151\147
+\156\040\156\166\055\163\141\061\034\060\032\006\003\125\004\003
+\023\023\107\154\157\142\141\154\123\151\147\156\040\122\157\157
+\164\040\105\064\066\060\036\027\015\061\071\060\063\062\060\060
+\060\060\060\060\060\132\027\015\064\066\060\063\062\060\060\060
+\060\060\060\060\132\060\106\061\013\060\011\006\003\125\004\006
+\023\002\102\105\061\031\060\027\006\003\125\004\012\023\020\107
+\154\157\142\141\154\123\151\147\156\040\156\166\055\163\141\061
+\034\060\032\006\003\125\004\003\023\023\107\154\157\142\141\154
+\123\151\147\156\040\122\157\157\164\040\105\064\066\060\166\060
+\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000
+\042\003\142\000\004\234\016\261\317\267\350\236\122\167\165\064
+\372\245\106\247\255\062\031\062\264\007\251\047\312\224\273\014
+\322\012\020\307\332\211\260\227\014\160\023\011\001\216\330\352
+\107\352\276\262\200\053\315\374\050\015\333\254\274\244\206\067
+\355\160\010\000\165\352\223\013\173\056\122\234\043\150\043\006
+\103\354\222\057\123\204\333\373\107\024\007\350\137\224\147\135
+\311\172\201\074\040\243\102\060\100\060\016\006\003\125\035\017
+\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035\023
+\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035
+\016\004\026\004\024\061\012\220\217\266\306\235\322\104\113\200
+\265\242\346\037\261\022\117\033\225\060\012\006\010\052\206\110
+\316\075\004\003\003\003\150\000\060\145\002\061\000\337\124\220
+\355\233\357\213\224\002\223\027\202\231\276\263\236\054\366\013
+\221\214\237\112\024\261\366\144\274\273\150\121\023\014\003\367
+\025\213\204\140\271\213\377\122\216\347\214\274\034\002\060\074
+\371\021\324\214\116\300\301\141\302\025\114\252\253\035\013\061
+\137\073\034\342\000\227\104\061\346\376\163\226\057\332\226\323
+\376\010\007\263\064\211\274\005\237\367\036\206\356\213\160
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "GlobalSign Root E46"
+# Issuer: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE
+# Serial Number:11:d2:bb:ba:33:6e:d4:bc:e6:24:68:c5:0d:84:1d:98:e8:43
+# Subject: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE
+# Not Valid Before: Wed Mar 20 00:00:00 2019
+# Not Valid After : Tue Mar 20 00:00:00 2046
+# Fingerprint (SHA-256): CB:B9:C4:4D:84:B8:04:3E:10:50:EA:31:A6:9F:51:49:55:D7:BF:D2:E2:C6:B4:93:01:01:9A:D6:1D:9F:50:58
+# Fingerprint (SHA1): 39:B4:6C:D5:FE:80:06:EB:E2:2F:4A:BB:08:33:A0:AF:DB:B9:DD:84
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GlobalSign Root E46"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\071\264\154\325\376\200\006\353\342\057\112\273\010\063\240\257
+\333\271\335\204
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\265\270\146\355\336\010\203\343\311\342\001\064\006\254\121\157
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
+\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
+\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
+\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
+\122\157\157\164\040\105\064\066
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\022\021\322\273\272\063\156\324\274\346\044\150\305\015\204
+\035\230\350\103
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "GLOBALTRUST 2020"
+#
+# Issuer: CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT
+# Serial Number:5a:4b:bd:5a:fb:4f:8a:5b:fa:65:e5
+# Subject: CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT
+# Not Valid Before: Mon Feb 10 00:00:00 2020
+# Not Valid After : Sun Jun 10 00:00:00 2040
+# Fingerprint (SHA-256): 9A:29:6A:51:82:D1:D4:51:A2:E3:7F:43:9B:74:DA:AF:A2:67:52:33:29:F9:0F:9A:0D:20:07:C3:34:E2:3C:9A
+# Fingerprint (SHA1): D0:67:C1:13:51:01:0C:AA:D0:C7:6A:65:37:31:16:26:4F:53:71:A2
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GLOBALTRUST 2020"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\115\061\013\060\011\006\003\125\004\006\023\002\101\124\061
+\043\060\041\006\003\125\004\012\023\032\145\055\143\157\155\155
+\145\162\143\145\040\155\157\156\151\164\157\162\151\156\147\040
+\107\155\142\110\061\031\060\027\006\003\125\004\003\023\020\107
+\114\117\102\101\114\124\122\125\123\124\040\062\060\062\060
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\115\061\013\060\011\006\003\125\004\006\023\002\101\124\061
+\043\060\041\006\003\125\004\012\023\032\145\055\143\157\155\155
+\145\162\143\145\040\155\157\156\151\164\157\162\151\156\147\040
+\107\155\142\110\061\031\060\027\006\003\125\004\003\023\020\107
+\114\117\102\101\114\124\122\125\123\124\040\062\060\062\060
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\013\132\113\275\132\373\117\212\133\372\145\345
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\202\060\202\003\152\240\003\002\001\002\002\013\132
+\113\275\132\373\117\212\133\372\145\345\060\015\006\011\052\206
+\110\206\367\015\001\001\013\005\000\060\115\061\013\060\011\006
+\003\125\004\006\023\002\101\124\061\043\060\041\006\003\125\004
+\012\023\032\145\055\143\157\155\155\145\162\143\145\040\155\157
+\156\151\164\157\162\151\156\147\040\107\155\142\110\061\031\060
+\027\006\003\125\004\003\023\020\107\114\117\102\101\114\124\122
+\125\123\124\040\062\060\062\060\060\036\027\015\062\060\060\062
+\061\060\060\060\060\060\060\060\132\027\015\064\060\060\066\061
+\060\060\060\060\060\060\060\132\060\115\061\013\060\011\006\003
+\125\004\006\023\002\101\124\061\043\060\041\006\003\125\004\012
+\023\032\145\055\143\157\155\155\145\162\143\145\040\155\157\156
+\151\164\157\162\151\156\147\040\107\155\142\110\061\031\060\027
+\006\003\125\004\003\023\020\107\114\117\102\101\114\124\122\125
+\123\124\040\062\060\062\060\060\202\002\042\060\015\006\011\052
+\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060
+\202\002\012\002\202\002\001\000\256\056\126\255\033\034\357\366
+\225\217\240\167\033\053\323\143\217\204\115\105\242\017\237\133
+\105\253\131\173\121\064\371\354\213\212\170\305\335\153\257\275
+\304\337\223\105\036\277\221\070\013\256\016\026\347\101\163\370
+\333\273\321\270\121\340\313\203\073\163\070\156\167\212\017\131
+\143\046\315\247\052\316\124\373\270\342\300\174\107\316\140\174
+\077\262\163\362\300\031\266\212\222\207\065\015\220\050\242\344
+\025\004\143\076\272\257\356\174\136\314\246\213\120\262\070\367
+\101\143\312\316\377\151\217\150\016\225\066\345\314\271\214\011
+\312\113\335\061\220\226\310\314\037\375\126\226\064\333\216\034
+\352\054\276\205\056\143\335\252\251\225\323\375\051\225\023\360
+\310\230\223\331\055\026\107\220\021\203\242\072\042\242\050\127
+\242\353\376\300\214\050\240\246\175\347\052\102\073\202\200\143
+\245\143\037\031\314\174\262\146\250\302\323\155\067\157\342\176
+\006\121\331\105\204\037\022\316\044\122\144\205\013\110\200\116
+\207\261\042\042\060\252\353\256\276\340\002\340\100\350\260\102
+\200\003\121\252\264\176\252\104\327\103\141\363\242\153\026\211
+\111\244\243\244\053\212\002\304\170\364\150\212\301\344\172\066
+\261\157\033\226\033\167\111\215\324\311\006\162\217\317\123\343
+\334\027\205\040\112\334\230\047\323\221\046\053\107\036\151\007
+\257\336\242\344\344\324\153\013\263\136\174\324\044\200\107\051
+\151\073\156\350\254\375\100\353\330\355\161\161\053\362\350\130
+\035\353\101\227\042\305\037\324\071\320\047\217\207\343\030\364
+\340\251\106\015\365\164\072\202\056\320\156\054\221\243\061\134
+\073\106\352\173\004\020\126\136\200\035\365\245\145\350\202\374
+\342\007\214\142\105\365\040\336\106\160\206\241\274\223\323\036
+\164\246\154\260\054\367\003\014\210\014\313\324\162\123\206\274
+\140\106\363\230\152\302\361\277\103\371\160\040\167\312\067\101
+\171\125\122\143\215\133\022\237\305\150\304\210\235\254\362\060
+\253\267\243\061\227\147\255\217\027\017\154\307\163\355\044\224
+\153\310\203\232\320\232\067\111\004\253\261\026\310\154\111\111
+\055\253\241\320\214\222\362\101\112\171\041\045\333\143\327\266
+\234\247\176\102\151\373\072\143\002\003\001\000\001\243\143\060
+\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001
+\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002
+\001\006\060\035\006\003\125\035\016\004\026\004\024\334\056\037
+\321\141\067\171\344\253\325\325\263\022\161\150\075\152\150\234
+\042\060\037\006\003\125\035\043\004\030\060\026\200\024\334\056
+\037\321\141\067\171\344\253\325\325\263\022\161\150\075\152\150
+\234\042\060\015\006\011\052\206\110\206\367\015\001\001\013\005
+\000\003\202\002\001\000\221\360\102\002\150\100\356\303\150\300
+\124\057\337\354\142\303\303\236\212\240\061\050\252\203\216\244
+\126\226\022\020\206\126\272\227\162\322\124\060\174\255\031\325
+\035\150\157\373\024\102\330\215\016\363\265\321\245\343\002\102
+\136\334\350\106\130\007\065\002\060\340\274\164\112\301\103\052
+\377\333\032\320\260\257\154\303\375\313\263\365\177\155\003\056
+\131\126\235\055\055\065\214\262\326\103\027\054\222\012\313\135
+\350\214\017\113\160\103\320\202\377\250\314\277\244\224\300\276
+\207\275\212\343\223\173\306\217\233\026\235\047\145\274\172\305
+\102\202\154\134\007\320\251\301\210\140\104\351\230\205\026\137
+\370\217\312\001\020\316\045\303\371\140\033\240\305\227\303\323
+\054\210\061\242\275\060\354\320\320\300\022\361\301\071\343\345
+\365\370\326\112\335\064\315\373\157\301\117\343\000\213\126\342
+\222\367\050\262\102\167\162\043\147\307\077\021\025\262\304\003
+\005\276\273\021\173\012\277\250\156\347\377\130\103\317\233\147
+\240\200\007\266\035\312\255\155\352\101\021\176\055\164\223\373
+\302\274\276\121\104\305\357\150\045\047\200\343\310\240\324\022
+\354\331\245\067\035\067\174\264\221\312\332\324\261\226\201\357
+\150\134\166\020\111\257\176\245\067\200\261\034\122\275\063\201
+\114\217\371\335\145\331\024\315\212\045\130\364\342\305\203\245
+\011\220\324\154\024\143\265\100\337\353\300\374\304\130\176\015
+\024\026\207\124\047\156\126\344\160\204\270\154\062\022\176\202
+\061\103\276\327\335\174\241\255\256\326\253\040\022\357\012\303
+\020\214\111\226\065\334\013\165\136\261\117\325\117\064\016\021
+\040\007\165\103\105\351\243\021\332\254\243\231\302\266\171\047
+\342\271\357\310\342\366\065\051\172\164\372\305\177\202\005\142
+\246\012\352\150\262\171\107\006\156\362\127\250\025\063\306\367
+\170\112\075\102\173\153\176\376\367\106\352\321\353\216\357\210
+\150\133\350\301\331\161\176\375\144\357\377\147\107\210\130\045
+\057\076\206\007\275\373\250\345\202\250\254\245\323\151\103\315
+\061\210\111\204\123\222\300\261\071\033\071\203\001\060\304\362
+\251\372\320\003\275\162\067\140\126\037\066\174\275\071\221\365
+\155\015\277\173\327\222
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "GLOBALTRUST 2020"
+# Issuer: CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT
+# Serial Number:5a:4b:bd:5a:fb:4f:8a:5b:fa:65:e5
+# Subject: CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT
+# Not Valid Before: Mon Feb 10 00:00:00 2020
+# Not Valid After : Sun Jun 10 00:00:00 2040
+# Fingerprint (SHA-256): 9A:29:6A:51:82:D1:D4:51:A2:E3:7F:43:9B:74:DA:AF:A2:67:52:33:29:F9:0F:9A:0D:20:07:C3:34:E2:3C:9A
+# Fingerprint (SHA1): D0:67:C1:13:51:01:0C:AA:D0:C7:6A:65:37:31:16:26:4F:53:71:A2
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "GLOBALTRUST 2020"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\320\147\301\023\121\001\014\252\320\307\152\145\067\061\026\046
+\117\123\161\242
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\212\307\157\313\155\343\314\242\361\174\203\372\016\170\327\350
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\115\061\013\060\011\006\003\125\004\006\023\002\101\124\061
+\043\060\041\006\003\125\004\012\023\032\145\055\143\157\155\155
+\145\162\143\145\040\155\157\156\151\164\157\162\151\156\147\040
+\107\155\142\110\061\031\060\027\006\003\125\004\003\023\020\107
+\114\117\102\101\114\124\122\125\123\124\040\062\060\062\060
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\013\132\113\275\132\373\117\212\133\372\145\345
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "ANF Secure Server Root CA"
+#
+# Issuer: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510
+# Serial Number:0d:d3:e3:bc:6c:f9:6b:b1
+# Subject: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510
+# Not Valid Before: Wed Sep 04 10:00:38 2019
+# Not Valid After : Tue Aug 30 10:00:38 2039
+# Fingerprint (SHA-256): FB:8F:EC:75:91:69:B9:10:6B:1E:51:16:44:C6:18:C5:13:04:37:3F:6C:06:43:08:8D:8B:EF:FD:1B:99:75:99
+# Fingerprint (SHA1): 5B:6E:68:D0:CC:15:B6:A0:5F:1E:C1:5F:AE:02:FC:6B:2F:5D:6F:74
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "ANF Secure Server Root CA"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\201\204\061\022\060\020\006\003\125\004\005\023\011\107\066
+\063\062\070\067\065\061\060\061\013\060\011\006\003\125\004\006
+\023\002\105\123\061\047\060\045\006\003\125\004\012\023\036\101
+\116\106\040\101\165\164\157\162\151\144\141\144\040\144\145\040
+\103\145\162\164\151\146\151\143\141\143\151\157\156\061\024\060
+\022\006\003\125\004\013\023\013\101\116\106\040\103\101\040\122
+\141\151\172\061\042\060\040\006\003\125\004\003\023\031\101\116
+\106\040\123\145\143\165\162\145\040\123\145\162\166\145\162\040
+\122\157\157\164\040\103\101
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\204\061\022\060\020\006\003\125\004\005\023\011\107\066
+\063\062\070\067\065\061\060\061\013\060\011\006\003\125\004\006
+\023\002\105\123\061\047\060\045\006\003\125\004\012\023\036\101
+\116\106\040\101\165\164\157\162\151\144\141\144\040\144\145\040
+\103\145\162\164\151\146\151\143\141\143\151\157\156\061\024\060
+\022\006\003\125\004\013\023\013\101\116\106\040\103\101\040\122
+\141\151\172\061\042\060\040\006\003\125\004\003\023\031\101\116
+\106\040\123\145\143\165\162\145\040\123\145\162\166\145\162\040
+\122\157\157\164\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\010\015\323\343\274\154\371\153\261
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\357\060\202\003\327\240\003\002\001\002\002\010\015
+\323\343\274\154\371\153\261\060\015\006\011\052\206\110\206\367
+\015\001\001\013\005\000\060\201\204\061\022\060\020\006\003\125
+\004\005\023\011\107\066\063\062\070\067\065\061\060\061\013\060
+\011\006\003\125\004\006\023\002\105\123\061\047\060\045\006\003
+\125\004\012\023\036\101\116\106\040\101\165\164\157\162\151\144
+\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141\143
+\151\157\156\061\024\060\022\006\003\125\004\013\023\013\101\116
+\106\040\103\101\040\122\141\151\172\061\042\060\040\006\003\125
+\004\003\023\031\101\116\106\040\123\145\143\165\162\145\040\123
+\145\162\166\145\162\040\122\157\157\164\040\103\101\060\036\027
+\015\061\071\060\071\060\064\061\060\060\060\063\070\132\027\015
+\063\071\060\070\063\060\061\060\060\060\063\070\132\060\201\204
+\061\022\060\020\006\003\125\004\005\023\011\107\066\063\062\070
+\067\065\061\060\061\013\060\011\006\003\125\004\006\023\002\105
+\123\061\047\060\045\006\003\125\004\012\023\036\101\116\106\040
+\101\165\164\157\162\151\144\141\144\040\144\145\040\103\145\162
+\164\151\146\151\143\141\143\151\157\156\061\024\060\022\006\003
+\125\004\013\023\013\101\116\106\040\103\101\040\122\141\151\172
+\061\042\060\040\006\003\125\004\003\023\031\101\116\106\040\123
+\145\143\165\162\145\040\123\145\162\166\145\162\040\122\157\157
+\164\040\103\101\060\202\002\042\060\015\006\011\052\206\110\206
+\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012
+\002\202\002\001\000\333\353\153\053\346\144\124\225\202\220\243
+\162\244\031\001\235\234\013\201\137\163\111\272\247\254\363\004
+\116\173\226\013\354\021\340\133\246\034\316\033\322\015\203\034
+\053\270\236\035\176\105\062\140\017\007\351\167\130\176\237\152
+\310\141\116\266\046\301\114\215\377\114\357\064\262\037\145\330
+\271\170\365\255\251\161\271\357\117\130\035\245\336\164\040\227
+\241\355\150\114\336\222\027\113\274\253\377\145\232\236\373\107
+\331\127\162\363\011\241\256\166\104\023\156\234\055\104\071\274
+\371\307\073\244\130\075\101\275\264\302\111\243\310\015\322\227
+\057\007\145\122\000\247\156\310\257\150\354\364\024\226\266\127
+\037\126\303\071\237\053\155\344\363\076\366\065\144\332\014\034
+\241\204\113\057\113\113\342\054\044\235\155\223\100\353\265\043
+\216\062\312\157\105\323\250\211\173\036\317\036\372\133\103\213
+\315\315\250\017\152\312\014\136\271\236\107\217\360\331\266\012
+\013\130\145\027\063\271\043\344\167\031\175\313\112\056\222\173
+\117\057\020\167\261\215\057\150\234\142\314\340\120\370\354\221
+\247\124\114\127\011\325\166\143\305\350\145\036\356\155\152\317
+\011\235\372\174\117\255\140\010\375\126\231\017\025\054\173\251
+\200\253\214\141\217\112\007\166\102\336\075\364\335\262\044\063
+\133\270\265\243\104\311\254\177\167\074\035\043\354\202\251\246
+\342\310\006\114\002\376\254\134\231\231\013\057\020\212\246\364
+\177\325\207\164\015\131\111\105\366\360\161\134\071\051\326\277
+\112\043\213\365\137\001\143\322\207\163\050\265\113\012\365\370
+\253\202\054\176\163\045\062\035\013\143\012\027\201\000\377\266
+\166\136\347\264\261\100\312\041\273\325\200\121\345\110\122\147
+\054\322\141\211\007\015\017\316\102\167\300\104\163\234\104\120
+\240\333\020\012\055\225\034\201\257\344\034\345\024\036\361\066
+\101\001\002\057\175\163\247\336\102\314\114\351\211\015\126\367
+\237\221\324\003\306\154\311\217\333\330\034\340\100\230\135\146
+\231\230\200\156\055\377\001\305\316\313\106\037\254\002\306\103
+\346\256\242\204\074\305\116\036\075\155\311\024\114\343\056\101
+\273\312\071\277\066\074\052\031\252\101\207\116\245\316\113\062
+\171\335\220\111\177\002\003\001\000\001\243\143\060\141\060\037
+\006\003\125\035\043\004\030\060\026\200\024\234\137\320\154\143
+\243\137\223\312\223\230\010\255\214\207\245\054\134\301\067\060
+\035\006\003\125\035\016\004\026\004\024\234\137\320\154\143\243
+\137\223\312\223\230\010\255\214\207\245\054\134\301\067\060\016
+\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\017
+\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060
+\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202
+\002\001\000\116\036\271\212\306\240\230\077\156\303\151\300\152
+\134\111\122\254\313\053\135\170\070\301\325\124\204\237\223\360
+\207\031\075\054\146\211\353\015\102\374\314\360\165\205\077\213
+\364\200\135\171\345\027\147\275\065\202\342\362\074\216\175\133
+\066\313\132\200\000\051\362\316\053\054\361\217\252\155\005\223
+\154\162\307\126\353\337\120\043\050\345\105\020\075\350\147\243
+\257\016\125\017\220\011\142\357\113\131\242\366\123\361\300\065
+\344\057\301\044\275\171\057\116\040\042\073\375\032\040\260\244
+\016\054\160\355\164\077\270\023\225\006\121\310\350\207\046\312
+\244\133\152\026\041\222\335\163\140\236\020\030\336\074\201\352
+\350\030\303\174\211\362\213\120\076\275\021\342\025\003\250\066
+\175\063\001\154\110\025\327\210\220\231\004\305\314\346\007\364
+\274\364\220\355\023\342\352\213\303\217\243\063\017\301\051\114
+\023\116\332\025\126\161\163\162\202\120\366\232\063\174\242\261
+\250\032\064\164\145\134\316\321\353\253\123\340\032\200\330\352
+\072\111\344\046\060\233\345\034\212\250\251\025\062\206\231\222
+\012\020\043\126\022\340\366\316\114\342\273\276\333\215\222\163
+\001\146\057\142\076\262\162\047\105\066\355\115\126\343\227\231
+\377\072\065\076\245\124\112\122\131\113\140\333\356\376\170\021
+\177\112\334\024\171\140\266\153\144\003\333\025\203\341\242\276
+\366\043\227\120\360\011\063\066\247\161\226\045\363\271\102\175
+\333\070\077\054\130\254\350\102\341\016\330\323\073\114\056\202
+\351\203\056\153\061\331\335\107\206\117\155\227\221\056\117\342
+\050\161\065\026\321\362\163\376\045\053\007\107\044\143\047\310
+\370\366\331\153\374\022\061\126\010\300\123\102\257\234\320\063
+\176\374\006\360\061\104\003\024\361\130\352\362\152\015\251\021
+\262\203\276\305\032\277\007\352\131\334\243\210\065\357\234\166
+\062\074\115\006\042\316\025\345\335\236\330\217\332\336\322\304
+\071\345\027\201\317\070\107\353\177\210\155\131\033\337\237\102
+\024\256\176\317\250\260\146\145\332\067\257\237\252\075\352\050
+\266\336\325\061\130\026\202\133\352\273\031\165\002\163\032\312
+\110\032\041\223\220\012\216\223\204\247\175\073\043\030\222\211
+\240\215\254
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "ANF Secure Server Root CA"
+# Issuer: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510
+# Serial Number:0d:d3:e3:bc:6c:f9:6b:b1
+# Subject: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510
+# Not Valid Before: Wed Sep 04 10:00:38 2019
+# Not Valid After : Tue Aug 30 10:00:38 2039
+# Fingerprint (SHA-256): FB:8F:EC:75:91:69:B9:10:6B:1E:51:16:44:C6:18:C5:13:04:37:3F:6C:06:43:08:8D:8B:EF:FD:1B:99:75:99
+# Fingerprint (SHA1): 5B:6E:68:D0:CC:15:B6:A0:5F:1E:C1:5F:AE:02:FC:6B:2F:5D:6F:74
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "ANF Secure Server Root CA"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\133\156\150\320\314\025\266\240\137\036\301\137\256\002\374\153
+\057\135\157\164
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\046\246\104\132\331\257\116\057\262\035\266\145\260\116\350\226
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\204\061\022\060\020\006\003\125\004\005\023\011\107\066
+\063\062\070\067\065\061\060\061\013\060\011\006\003\125\004\006
+\023\002\105\123\061\047\060\045\006\003\125\004\012\023\036\101
+\116\106\040\101\165\164\157\162\151\144\141\144\040\144\145\040
+\103\145\162\164\151\146\151\143\141\143\151\157\156\061\024\060
+\022\006\003\125\004\013\023\013\101\116\106\040\103\101\040\122
+\141\151\172\061\042\060\040\006\003\125\004\003\023\031\101\116
+\106\040\123\145\143\165\162\145\040\123\145\162\166\145\162\040
+\122\157\157\164\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\010\015\323\343\274\154\371\153\261
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "Certum EC-384 CA"
+#
+# Issuer: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
+# Serial Number:78:8f:27:5c:81:12:52:20:a5:04:d0:2d:dd:ba:73:f4
+# Subject: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
+# Not Valid Before: Mon Mar 26 07:24:54 2018
+# Not Valid After : Thu Mar 26 07:24:54 2043
+# Fingerprint (SHA-256): 6B:32:80:85:62:53:18:AA:50:D1:73:C9:8D:8B:DA:09:D5:7E:27:41:3D:11:4C:F7:87:A0:F5:D0:6C:03:0C:F6
+# Fingerprint (SHA1): F3:3E:78:3C:AC:DF:F4:A2:CC:AC:67:55:69:56:D7:E5:16:3C:E1:ED
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Certum EC-384 CA"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114\061
+\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
+\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
+\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
+\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027\006
+\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103\055
+\063\070\064\040\103\101
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114\061
+\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
+\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
+\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
+\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027\006
+\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103\055
+\063\070\064\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\170\217\047\134\201\022\122\040\245\004\320\055\335\272
+\163\364
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\145\060\202\001\353\240\003\002\001\002\002\020\170
+\217\047\134\201\022\122\040\245\004\320\055\335\272\163\364\060
+\012\006\010\052\206\110\316\075\004\003\003\060\164\061\013\060
+\011\006\003\125\004\006\023\002\120\114\061\041\060\037\006\003
+\125\004\012\023\030\101\163\163\145\143\157\040\104\141\164\141
+\040\123\171\163\164\145\155\163\040\123\056\101\056\061\047\060
+\045\006\003\125\004\013\023\036\103\145\162\164\165\155\040\103
+\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164
+\150\157\162\151\164\171\061\031\060\027\006\003\125\004\003\023
+\020\103\145\162\164\165\155\040\105\103\055\063\070\064\040\103
+\101\060\036\027\015\061\070\060\063\062\066\060\067\062\064\065
+\064\132\027\015\064\063\060\063\062\066\060\067\062\064\065\064
+\132\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114
+\061\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143
+\157\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123
+\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145
+\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151
+\157\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027
+\006\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103
+\055\063\070\064\040\103\101\060\166\060\020\006\007\052\206\110
+\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\304
+\050\216\253\030\133\152\276\156\144\067\143\344\315\354\253\072
+\367\314\241\270\016\202\111\327\206\051\237\241\224\362\343\140
+\170\230\201\170\006\115\362\354\232\016\127\140\203\237\264\346
+\027\057\032\263\135\002\133\211\043\074\302\021\005\052\247\210
+\023\030\363\120\204\327\275\064\054\047\211\125\377\316\114\347
+\337\246\037\050\304\360\124\303\271\174\267\123\255\353\302\243
+\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060
+\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\215
+\006\146\164\044\166\072\363\211\367\274\326\275\107\175\057\274
+\020\137\113\060\016\006\003\125\035\017\001\001\377\004\004\003
+\002\001\006\060\012\006\010\052\206\110\316\075\004\003\003\003
+\150\000\060\145\002\060\003\125\055\246\346\030\304\174\357\311
+\120\156\301\047\017\234\207\257\156\325\033\010\030\275\222\051
+\301\357\224\221\170\322\072\034\125\211\142\345\033\011\036\272
+\144\153\361\166\264\324\002\061\000\264\102\204\231\377\253\347
+\236\373\221\227\047\135\334\260\133\060\161\316\136\070\032\152
+\331\045\347\352\367\141\222\126\370\352\332\066\302\207\145\226
+\056\162\045\057\177\337\303\023\311
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "Certum EC-384 CA"
+# Issuer: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
+# Serial Number:78:8f:27:5c:81:12:52:20:a5:04:d0:2d:dd:ba:73:f4
+# Subject: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
+# Not Valid Before: Mon Mar 26 07:24:54 2018
+# Not Valid After : Thu Mar 26 07:24:54 2043
+# Fingerprint (SHA-256): 6B:32:80:85:62:53:18:AA:50:D1:73:C9:8D:8B:DA:09:D5:7E:27:41:3D:11:4C:F7:87:A0:F5:D0:6C:03:0C:F6
+# Fingerprint (SHA1): F3:3E:78:3C:AC:DF:F4:A2:CC:AC:67:55:69:56:D7:E5:16:3C:E1:ED
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Certum EC-384 CA"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\363\076\170\074\254\337\364\242\314\254\147\125\151\126\327\345
+\026\074\341\355
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\266\145\263\226\140\227\022\241\354\116\341\075\243\306\311\361
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114\061
+\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
+\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
+\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
+\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027\006
+\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103\055
+\063\070\064\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\170\217\047\134\201\022\122\040\245\004\320\055\335\272
+\163\364
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "Certum Trusted Root CA"
+#
+# Issuer: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
+# Serial Number:1e:bf:59:50:b8:c9:80:37:4c:06:f7:eb:55:4f:b5:ed
+# Subject: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
+# Not Valid Before: Fri Mar 16 12:10:13 2018
+# Not Valid After : Mon Mar 16 12:10:13 2043
+# Fingerprint (SHA-256): FE:76:96:57:38:55:77:3E:37:A9:5E:7A:D4:D9:CC:96:C3:01:57:C1:5D:31:76:5B:A9:B1:57:04:E1:AE:78:FD
+# Fingerprint (SHA1): C8:83:44:C0:18:AE:9F:CC:F1:87:B7:8F:22:D1:C5:D7:45:84:BA:E5
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Certum Trusted Root CA"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\172\061\013\060\011\006\003\125\004\006\023\002\120\114\061
+\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
+\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
+\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
+\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171\061\037\060\035\006
+\003\125\004\003\023\026\103\145\162\164\165\155\040\124\162\165
+\163\164\145\144\040\122\157\157\164\040\103\101
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\172\061\013\060\011\006\003\125\004\006\023\002\120\114\061
+\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
+\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
+\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
+\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171\061\037\060\035\006
+\003\125\004\003\023\026\103\145\162\164\165\155\040\124\162\165
+\163\164\145\144\040\122\157\157\164\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\036\277\131\120\270\311\200\067\114\006\367\353\125\117
+\265\355
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\300\060\202\003\250\240\003\002\001\002\002\020\036
+\277\131\120\270\311\200\067\114\006\367\353\125\117\265\355\060
+\015\006\011\052\206\110\206\367\015\001\001\015\005\000\060\172
+\061\013\060\011\006\003\125\004\006\023\002\120\114\061\041\060
+\037\006\003\125\004\012\023\030\101\163\163\145\143\157\040\104
+\141\164\141\040\123\171\163\164\145\155\163\040\123\056\101\056
+\061\047\060\045\006\003\125\004\013\023\036\103\145\162\164\165
+\155\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040
+\101\165\164\150\157\162\151\164\171\061\037\060\035\006\003\125
+\004\003\023\026\103\145\162\164\165\155\040\124\162\165\163\164
+\145\144\040\122\157\157\164\040\103\101\060\036\027\015\061\070
+\060\063\061\066\061\062\061\060\061\063\132\027\015\064\063\060
+\063\061\066\061\062\061\060\061\063\132\060\172\061\013\060\011
+\006\003\125\004\006\023\002\120\114\061\041\060\037\006\003\125
+\004\012\023\030\101\163\163\145\143\157\040\104\141\164\141\040
+\123\171\163\164\145\155\163\040\123\056\101\056\061\047\060\045
+\006\003\125\004\013\023\036\103\145\162\164\165\155\040\103\145
+\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150
+\157\162\151\164\171\061\037\060\035\006\003\125\004\003\023\026
+\103\145\162\164\165\155\040\124\162\165\163\164\145\144\040\122
+\157\157\164\040\103\101\060\202\002\042\060\015\006\011\052\206
+\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202
+\002\012\002\202\002\001\000\321\055\216\273\267\066\352\155\067
+\221\237\116\223\247\005\344\051\003\045\316\034\202\367\174\231
+\237\101\006\315\355\243\272\300\333\011\054\301\174\337\051\176
+\113\145\057\223\247\324\001\153\003\050\030\243\330\235\005\301
+\052\330\105\361\221\336\337\073\320\200\002\214\317\070\017\352
+\247\134\170\021\244\301\310\205\134\045\323\323\262\347\045\317
+\021\124\227\253\065\300\036\166\034\357\000\123\237\071\334\024
+\245\054\042\045\263\162\162\374\215\263\345\076\010\036\024\052
+\067\013\210\074\312\260\364\310\302\241\256\274\301\276\051\147
+\125\342\374\255\131\134\376\275\127\054\260\220\215\302\355\067
+\266\174\231\210\265\325\003\232\075\025\015\075\072\250\250\105
+\360\225\116\045\131\035\315\230\151\273\323\314\062\311\215\357
+\201\376\255\175\211\273\272\140\023\312\145\225\147\240\363\031
+\366\003\126\324\152\323\047\342\241\255\203\360\112\022\042\167
+\034\005\163\342\031\161\102\300\354\165\106\232\220\130\340\152
+\216\053\245\106\060\004\216\031\262\027\343\276\251\272\177\126
+\361\044\003\327\262\041\050\166\016\066\060\114\171\325\101\232
+\232\250\270\065\272\014\072\362\104\033\040\210\367\305\045\327
+\075\306\343\076\103\335\207\376\304\352\365\123\076\114\145\377
+\073\112\313\170\132\153\027\137\015\307\303\117\116\232\052\242
+\355\127\115\042\342\106\232\077\017\221\064\044\175\125\343\214
+\225\067\323\032\360\011\053\054\322\311\215\264\015\000\253\147
+\051\050\330\001\365\031\004\266\035\276\166\376\162\134\304\205
+\312\322\200\101\337\005\250\243\325\204\220\117\013\363\340\077
+\233\031\322\067\211\077\362\173\122\034\214\366\341\367\074\007
+\227\214\016\242\131\201\014\262\220\075\323\343\131\106\355\017
+\251\247\336\200\153\132\252\007\266\031\313\274\127\363\227\041
+\172\014\261\053\164\076\353\332\247\147\055\114\304\230\236\066
+\011\166\146\146\374\032\077\352\110\124\034\276\060\275\200\120
+\277\174\265\316\000\366\014\141\331\347\044\003\340\343\001\201
+\016\275\330\205\064\210\275\262\066\250\173\134\010\345\104\200
+\214\157\370\057\325\041\312\035\034\320\373\304\265\207\321\072
+\116\307\166\265\065\110\265\002\003\001\000\001\243\102\060\100
+\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001
+\377\060\035\006\003\125\035\016\004\026\004\024\214\373\034\165
+\274\002\323\237\116\056\110\331\371\140\124\252\304\263\117\372
+\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006
+\060\015\006\011\052\206\110\206\367\015\001\001\015\005\000\003
+\202\002\001\000\110\242\325\000\013\056\320\077\274\034\325\265
+\124\111\036\132\153\364\344\362\340\100\067\340\314\024\173\271
+\311\372\065\265\165\027\223\152\005\151\205\234\315\117\031\170
+\133\031\201\363\143\076\303\316\133\217\365\057\136\001\166\023
+\077\054\000\271\315\226\122\071\111\155\004\116\305\351\017\206
+\015\341\372\263\137\202\022\361\072\316\146\006\044\064\053\350
+\314\312\347\151\334\207\235\302\064\327\171\321\323\167\270\252
+\131\130\376\235\046\372\070\206\076\235\212\207\144\127\345\027
+\072\342\371\215\271\343\063\170\301\220\330\270\335\267\203\121
+\344\304\314\043\325\006\174\346\121\323\315\064\061\300\366\106
+\273\013\255\374\075\020\005\052\073\112\221\045\356\214\324\204
+\207\200\052\274\011\214\252\072\023\137\350\064\171\120\301\020
+\031\371\323\050\036\324\321\121\060\051\263\256\220\147\326\037
+\012\143\261\305\251\306\102\061\143\027\224\357\151\313\057\372
+\214\024\175\304\103\030\211\331\360\062\100\346\200\342\106\137
+\345\343\301\000\131\250\371\350\040\274\211\054\016\107\064\013
+\352\127\302\123\066\374\247\324\257\061\315\376\002\345\165\372
+\271\047\011\371\363\365\073\312\175\237\251\042\313\210\311\252
+\321\107\075\066\167\250\131\144\153\047\317\357\047\301\343\044
+\265\206\367\256\176\062\115\260\171\150\321\071\350\220\130\303
+\203\274\017\054\326\227\353\316\014\341\040\307\332\267\076\303
+\077\277\057\334\064\244\373\053\041\315\147\217\113\364\343\352
+\324\077\347\117\272\271\245\223\105\034\146\037\041\372\144\136
+\157\340\166\224\062\313\165\365\156\345\366\217\307\270\244\314
+\250\226\175\144\373\044\132\112\003\154\153\070\306\350\003\103
+\232\367\127\271\263\051\151\223\070\364\003\362\273\373\202\153
+\007\040\321\122\037\232\144\002\173\230\146\333\134\115\132\017
+\320\204\225\240\074\024\103\006\312\312\333\270\101\066\332\152
+\104\147\207\257\257\343\105\021\025\151\010\262\276\026\071\227
+\044\157\022\105\321\147\135\011\250\311\025\332\372\322\246\137
+\023\141\037\277\205\254\264\255\255\005\224\010\203\036\165\027
+\323\161\073\223\120\043\131\240\355\074\221\124\235\166\000\305
+\303\270\070\333
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "Certum Trusted Root CA"
+# Issuer: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
+# Serial Number:1e:bf:59:50:b8:c9:80:37:4c:06:f7:eb:55:4f:b5:ed
+# Subject: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
+# Not Valid Before: Fri Mar 16 12:10:13 2018
+# Not Valid After : Mon Mar 16 12:10:13 2043
+# Fingerprint (SHA-256): FE:76:96:57:38:55:77:3E:37:A9:5E:7A:D4:D9:CC:96:C3:01:57:C1:5D:31:76:5B:A9:B1:57:04:E1:AE:78:FD
+# Fingerprint (SHA1): C8:83:44:C0:18:AE:9F:CC:F1:87:B7:8F:22:D1:C5:D7:45:84:BA:E5
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Certum Trusted Root CA"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\310\203\104\300\030\256\237\314\361\207\267\217\042\321\305\327
+\105\204\272\345
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\121\341\302\347\376\114\204\257\131\016\057\364\124\157\352\051
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\172\061\013\060\011\006\003\125\004\006\023\002\120\114\061
+\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
+\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
+\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
+\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
+\156\040\101\165\164\150\157\162\151\164\171\061\037\060\035\006
+\003\125\004\003\023\026\103\145\162\164\165\155\040\124\162\165
+\163\164\145\144\040\122\157\157\164\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\036\277\131\120\270\311\200\067\114\006\367\353\125\117
+\265\355
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "TunTrust Root CA"
+#
+# Issuer: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN
+# Serial Number:13:02:d5:e2:40:4c:92:46:86:16:67:5d:b4:bb:bb:b2:6b:3e:fc:13
+# Subject: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN
+# Not Valid Before: Fri Apr 26 08:57:56 2019
+# Not Valid After : Tue Apr 26 08:57:56 2044
+# Fingerprint (SHA-256): 2E:44:10:2A:B5:8C:B8:54:19:45:1C:8E:19:D9:AC:F3:66:2C:AF:BC:61:4B:6A:53:96:0A:30:F7:D0:E2:EB:41
+# Fingerprint (SHA1): CF:E9:70:84:0F:E0:73:0F:9D:F6:0C:7F:2C:4B:EE:20:46:34:9C:BB
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "TunTrust Root CA"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\141\061\013\060\011\006\003\125\004\006\023\002\124\116\061
+\067\060\065\006\003\125\004\012\014\056\101\147\145\156\143\145
+\040\116\141\164\151\157\156\141\154\145\040\144\145\040\103\145
+\162\164\151\146\151\143\141\164\151\157\156\040\105\154\145\143
+\164\162\157\156\151\161\165\145\061\031\060\027\006\003\125\004
+\003\014\020\124\165\156\124\162\165\163\164\040\122\157\157\164
+\040\103\101
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\141\061\013\060\011\006\003\125\004\006\023\002\124\116\061
+\067\060\065\006\003\125\004\012\014\056\101\147\145\156\143\145
+\040\116\141\164\151\157\156\141\154\145\040\144\145\040\103\145
+\162\164\151\146\151\143\141\164\151\157\156\040\105\154\145\143
+\164\162\157\156\151\161\165\145\061\031\060\027\006\003\125\004
+\003\014\020\124\165\156\124\162\165\163\164\040\122\157\157\164
+\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\024\023\002\325\342\100\114\222\106\206\026\147\135\264\273
+\273\262\153\076\374\023
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\263\060\202\003\233\240\003\002\001\002\002\024\023
+\002\325\342\100\114\222\106\206\026\147\135\264\273\273\262\153
+\076\374\023\060\015\006\011\052\206\110\206\367\015\001\001\013
+\005\000\060\141\061\013\060\011\006\003\125\004\006\023\002\124
+\116\061\067\060\065\006\003\125\004\012\014\056\101\147\145\156
+\143\145\040\116\141\164\151\157\156\141\154\145\040\144\145\040
+\103\145\162\164\151\146\151\143\141\164\151\157\156\040\105\154
+\145\143\164\162\157\156\151\161\165\145\061\031\060\027\006\003
+\125\004\003\014\020\124\165\156\124\162\165\163\164\040\122\157
+\157\164\040\103\101\060\036\027\015\061\071\060\064\062\066\060
+\070\065\067\065\066\132\027\015\064\064\060\064\062\066\060\070
+\065\067\065\066\132\060\141\061\013\060\011\006\003\125\004\006
+\023\002\124\116\061\067\060\065\006\003\125\004\012\014\056\101
+\147\145\156\143\145\040\116\141\164\151\157\156\141\154\145\040
+\144\145\040\103\145\162\164\151\146\151\143\141\164\151\157\156
+\040\105\154\145\143\164\162\157\156\151\161\165\145\061\031\060
+\027\006\003\125\004\003\014\020\124\165\156\124\162\165\163\164
+\040\122\157\157\164\040\103\101\060\202\002\042\060\015\006\011
+\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000
+\060\202\002\012\002\202\002\001\000\303\315\323\374\275\004\123
+\335\014\040\072\325\210\056\005\113\101\365\203\202\176\367\131
+\237\236\236\143\350\163\332\366\006\251\117\037\264\371\013\037
+\071\214\232\040\320\176\006\324\354\064\331\206\274\165\133\207
+\210\360\322\331\324\243\012\262\154\033\353\111\054\076\254\135
+\330\224\003\240\354\064\345\060\304\065\175\373\046\115\033\156
+\060\124\330\365\200\105\234\071\255\234\311\045\004\115\232\220
+\076\116\100\156\212\153\315\051\147\306\314\055\340\164\350\005
+\127\012\110\120\372\172\103\332\176\354\133\232\016\142\166\376
+\352\235\035\205\162\354\021\273\065\350\037\047\277\301\241\307
+\273\110\026\335\126\327\314\116\240\341\271\254\333\325\203\031
+\032\205\321\224\227\327\312\243\145\013\363\070\371\002\256\335
+\366\147\317\311\077\365\212\054\107\032\231\157\005\015\375\320
+\035\202\061\374\051\314\000\130\227\221\114\200\000\034\063\205
+\226\057\313\101\302\213\020\204\303\011\044\211\037\265\017\331
+\331\167\107\030\222\224\140\134\307\231\003\074\376\367\225\247
+\175\120\241\200\302\251\203\255\130\226\125\041\333\206\131\324
+\257\306\274\335\201\156\007\333\140\142\376\354\020\156\332\150
+\001\364\203\033\251\076\242\133\043\327\144\306\337\334\242\175
+\330\113\272\202\322\121\370\146\277\006\106\344\171\052\046\066
+\171\217\037\116\231\035\262\217\014\016\034\377\311\135\300\375
+\220\020\246\261\067\363\315\072\044\156\264\205\220\277\200\271
+\014\214\325\233\326\310\361\126\077\032\200\211\172\251\342\033
+\062\121\054\076\362\337\173\366\135\172\051\031\216\345\310\275
+\066\161\213\135\114\302\035\077\255\130\242\317\075\160\115\246
+\120\230\045\334\043\371\270\130\101\010\161\277\117\270\204\240
+\217\000\124\025\374\221\155\130\247\226\073\353\113\226\047\315
+\153\242\241\206\254\015\174\124\346\146\114\146\137\220\276\041
+\232\002\106\055\344\203\302\200\271\317\113\076\350\177\074\001
+\354\217\136\315\177\322\050\102\001\225\212\342\227\075\020\041
+\175\366\235\034\305\064\241\354\054\016\012\122\054\022\125\160
+\044\075\313\302\024\065\103\135\047\116\276\300\275\252\174\226
+\347\374\236\141\255\104\323\000\227\002\003\001\000\001\243\143
+\060\141\060\035\006\003\125\035\016\004\026\004\024\006\232\233
+\037\123\175\361\365\244\310\323\206\076\241\163\131\264\367\104
+\041\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001
+\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024\006
+\232\233\037\123\175\361\365\244\310\323\206\076\241\163\131\264
+\367\104\041\060\016\006\003\125\035\017\001\001\377\004\004\003
+\002\001\006\060\015\006\011\052\206\110\206\367\015\001\001\013
+\005\000\003\202\002\001\000\252\005\156\266\335\025\311\277\263
+\306\040\366\006\107\260\206\223\045\323\215\271\310\000\077\227
+\365\122\047\210\161\311\164\375\353\312\144\333\133\357\036\135
+\272\277\321\353\356\134\151\272\026\310\363\271\217\323\066\056
+\100\111\007\015\131\336\213\020\260\111\005\342\377\221\077\113
+\267\335\002\216\370\201\050\134\314\334\155\257\137\024\234\175
+\130\170\015\366\200\011\271\351\016\227\051\031\270\267\353\370
+\026\313\125\022\344\306\175\273\304\354\370\265\034\116\076\147
+\277\305\137\033\155\155\107\050\252\004\130\141\326\166\277\042
+\177\320\007\152\247\144\123\360\227\215\235\200\077\273\301\007
+\333\145\257\346\233\062\232\303\124\223\304\034\010\303\104\373
+\173\143\021\103\321\152\032\141\152\171\155\220\117\051\216\107
+\005\301\022\151\151\326\306\066\061\341\374\372\200\272\134\117
+\304\353\267\062\254\370\165\141\027\327\020\031\271\361\322\011
+\357\172\102\235\133\132\013\324\306\225\116\052\316\377\007\327
+\117\176\030\006\210\361\031\265\331\230\273\256\161\304\034\347
+\164\131\130\357\014\211\317\213\037\165\223\032\004\024\222\110
+\120\251\353\127\051\000\026\343\066\034\310\370\277\360\063\325
+\101\017\304\314\074\335\351\063\103\001\221\020\053\036\321\271
+\135\315\062\031\213\217\214\040\167\327\042\304\102\334\204\026
+\233\045\155\350\264\125\161\177\260\174\263\323\161\111\271\317
+\122\244\004\077\334\075\240\273\257\063\236\012\060\140\216\333
+\235\135\224\250\275\140\347\142\200\166\201\203\014\214\314\060
+\106\111\342\014\322\250\257\353\141\161\357\347\042\142\251\367
+\134\144\154\237\026\214\147\066\047\105\365\011\173\277\366\020
+\012\361\260\215\124\103\214\004\272\243\077\357\342\065\307\371
+\164\340\157\064\101\320\277\163\145\127\040\371\233\147\172\146
+\150\044\116\200\145\275\020\231\006\131\362\145\257\270\306\107
+\273\375\220\170\213\101\163\056\257\125\037\334\073\222\162\156
+\204\323\320\141\114\015\314\166\127\342\055\205\042\025\066\015
+\353\001\235\353\330\353\304\204\231\373\300\014\314\062\350\343
+\167\332\203\104\213\236\125\050\300\213\130\323\220\076\116\033
+\000\361\025\255\203\053\232
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "TunTrust Root CA"
+# Issuer: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN
+# Serial Number:13:02:d5:e2:40:4c:92:46:86:16:67:5d:b4:bb:bb:b2:6b:3e:fc:13
+# Subject: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN
+# Not Valid Before: Fri Apr 26 08:57:56 2019
+# Not Valid After : Tue Apr 26 08:57:56 2044
+# Fingerprint (SHA-256): 2E:44:10:2A:B5:8C:B8:54:19:45:1C:8E:19:D9:AC:F3:66:2C:AF:BC:61:4B:6A:53:96:0A:30:F7:D0:E2:EB:41
+# Fingerprint (SHA1): CF:E9:70:84:0F:E0:73:0F:9D:F6:0C:7F:2C:4B:EE:20:46:34:9C:BB
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "TunTrust Root CA"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\317\351\160\204\017\340\163\017\235\366\014\177\054\113\356\040
+\106\064\234\273
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\205\023\271\220\133\066\134\266\136\270\132\370\340\061\127\264
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\141\061\013\060\011\006\003\125\004\006\023\002\124\116\061
+\067\060\065\006\003\125\004\012\014\056\101\147\145\156\143\145
+\040\116\141\164\151\157\156\141\154\145\040\144\145\040\103\145
+\162\164\151\146\151\143\141\164\151\157\156\040\105\154\145\143
+\164\162\157\156\151\161\165\145\061\031\060\027\006\003\125\004
+\003\014\020\124\165\156\124\162\165\163\164\040\122\157\157\164
+\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\024\023\002\325\342\100\114\222\106\206\026\147\135\264\273
+\273\262\153\076\374\023
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "HARICA TLS RSA Root CA 2021"
+#
+# Issuer: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Serial Number:39:ca:93:1c:ef:43:f3:c6:8e:93:c7:f4:64:89:38:7e
+# Subject: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Not Valid Before: Fri Feb 19 10:55:38 2021
+# Not Valid After : Mon Feb 13 10:55:37 2045
+# Fingerprint (SHA-256): D9:5D:0E:8E:DA:79:52:5B:F9:BE:B1:1B:14:D2:10:0D:32:94:98:5F:0C:62:D9:FA:BD:9C:D9:99:EC:CB:7B:1D
+# Fingerprint (SHA1): 02:2D:05:82:FA:88:CE:14:0C:06:79:DE:7F:14:10:E9:45:D7:A5:6D
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "HARICA TLS RSA Root CA 2021"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
+\003\014\033\110\101\122\111\103\101\040\124\114\123\040\122\123
+\101\040\122\157\157\164\040\103\101\040\062\060\062\061
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
+\003\014\033\110\101\122\111\103\101\040\124\114\123\040\122\123
+\101\040\122\157\157\164\040\103\101\040\062\060\062\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\071\312\223\034\357\103\363\306\216\223\307\364\144\211
+\070\176
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\244\060\202\003\214\240\003\002\001\002\002\020\071
+\312\223\034\357\103\363\306\216\223\307\364\144\211\070\176\060
+\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\154
+\061\013\060\011\006\003\125\004\006\023\002\107\122\061\067\060
+\065\006\003\125\004\012\014\056\110\145\154\154\145\156\151\143
+\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122\145
+\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164\151
+\157\156\163\040\103\101\061\044\060\042\006\003\125\004\003\014
+\033\110\101\122\111\103\101\040\124\114\123\040\122\123\101\040
+\122\157\157\164\040\103\101\040\062\060\062\061\060\036\027\015
+\062\061\060\062\061\071\061\060\065\065\063\070\132\027\015\064
+\065\060\062\061\063\061\060\065\065\063\067\132\060\154\061\013
+\060\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006
+\003\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101
+\143\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145
+\141\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156
+\163\040\103\101\061\044\060\042\006\003\125\004\003\014\033\110
+\101\122\111\103\101\040\124\114\123\040\122\123\101\040\122\157
+\157\164\040\103\101\040\062\060\062\061\060\202\002\042\060\015
+\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002
+\017\000\060\202\002\012\002\202\002\001\000\213\302\347\257\145
+\233\005\147\226\311\015\044\271\320\016\144\374\316\342\044\030
+\054\204\177\167\121\313\004\021\066\270\136\355\151\161\247\236
+\344\045\011\227\147\301\107\302\317\221\026\066\142\075\070\004
+\341\121\202\377\254\322\264\151\335\056\354\021\243\105\356\153
+\153\073\114\277\214\215\244\036\235\021\271\351\070\371\172\016
+\014\230\342\043\035\321\116\143\324\347\270\101\104\373\153\257
+\153\332\037\323\305\221\210\133\244\211\222\321\201\346\214\071
+\130\240\326\151\103\251\255\230\122\130\156\333\012\373\153\317
+\150\372\343\244\136\072\105\163\230\007\352\137\002\162\336\014
+\245\263\237\256\251\035\267\035\263\374\212\131\347\156\162\145
+\255\365\060\224\043\007\363\202\026\113\065\230\234\123\273\057
+\312\344\132\331\307\215\035\374\230\231\373\054\244\202\153\360
+\052\037\216\013\137\161\134\134\256\102\173\051\211\201\313\003
+\243\231\312\210\236\013\100\011\101\063\333\346\130\172\375\256
+\231\160\300\132\017\326\023\206\161\057\166\151\374\220\335\333
+\055\156\321\362\233\365\032\153\236\157\025\214\172\360\113\050
+\240\042\070\200\044\154\066\244\073\362\060\221\363\170\023\317
+\301\077\065\253\361\035\021\043\265\103\042\236\001\222\267\030
+\002\345\021\321\202\333\025\000\314\141\067\301\052\174\232\341
+\320\272\263\120\106\356\202\254\235\061\370\373\043\342\003\000
+\110\160\243\011\046\171\025\123\140\363\070\134\255\070\352\201
+\000\143\024\271\063\136\335\013\333\240\105\007\032\063\011\370
+\115\264\247\002\246\151\364\302\131\005\210\145\205\126\256\113
+\313\340\336\074\175\055\032\310\351\373\037\243\141\112\326\052
+\023\255\167\114\032\030\233\221\017\130\330\006\124\305\227\370
+\252\077\040\212\246\205\246\167\366\246\374\034\342\356\156\224
+\063\052\203\120\204\012\345\117\206\370\120\105\170\000\201\353
+\133\150\343\046\215\314\173\134\121\364\024\054\100\276\032\140
+\035\172\162\141\035\037\143\055\210\252\316\242\105\220\010\374
+\153\276\263\120\052\132\375\250\110\030\106\326\220\100\222\220
+\012\204\136\150\061\370\353\355\015\323\035\306\175\231\030\125
+\126\047\145\056\215\105\305\044\354\316\343\002\003\001\000\001
+\243\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005
+\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024
+\012\110\043\246\140\244\222\012\063\352\223\133\305\127\352\045
+\115\275\022\356\060\016\006\003\125\035\017\001\001\377\004\004
+\003\002\001\206\060\015\006\011\052\206\110\206\367\015\001\001
+\013\005\000\003\202\002\001\000\076\220\110\252\156\142\025\045
+\146\173\014\325\214\213\211\235\327\355\116\007\357\234\320\024
+\137\136\120\275\150\226\220\244\024\021\252\150\155\011\065\071
+\100\011\332\364\011\054\064\245\173\131\204\111\051\227\164\310
+\007\036\107\155\362\316\034\120\046\343\236\075\100\123\077\367
+\177\226\166\020\305\106\245\320\040\113\120\364\065\073\030\364
+\125\152\101\033\107\006\150\074\273\011\010\142\331\137\125\102
+\252\254\123\205\254\225\126\066\126\253\344\005\214\305\250\332
+\037\243\151\275\123\017\304\377\334\312\343\176\362\114\210\206
+\107\106\032\363\000\365\200\221\242\334\103\102\224\233\040\360
+\321\315\262\353\054\123\302\123\170\112\117\004\224\101\232\217
+\047\062\301\345\111\031\277\361\362\302\213\250\012\071\061\050
+\264\175\142\066\054\115\354\037\063\266\176\167\155\176\120\360
+\237\016\327\021\217\317\030\305\343\047\376\046\357\005\235\317
+\317\067\305\320\173\332\073\260\026\204\014\072\223\326\276\027
+\333\017\076\016\031\170\011\307\251\002\162\042\113\367\067\166
+\272\165\304\205\003\132\143\325\261\165\005\302\271\275\224\255
+\214\025\231\247\223\175\366\305\363\252\164\317\004\205\224\230
+\000\364\342\371\312\044\145\277\340\142\257\310\305\372\262\311
+\236\126\110\332\171\375\226\166\025\276\243\216\126\304\263\064
+\374\276\107\364\301\264\250\374\325\060\210\150\356\313\256\311
+\143\304\166\276\254\070\030\341\136\134\317\256\072\042\121\353
+\321\213\263\363\053\063\007\124\207\372\264\262\023\173\272\123
+\004\142\001\235\361\300\117\356\341\072\324\213\040\020\372\002
+\127\346\357\301\013\267\220\106\234\031\051\214\334\157\240\112
+\151\151\224\267\044\145\240\377\254\077\316\001\373\041\056\375
+\150\370\233\362\245\317\061\070\134\025\252\346\227\000\301\337
+\132\245\247\071\252\351\204\177\074\121\250\072\331\224\133\214
+\277\117\010\161\345\333\250\134\324\322\246\376\000\243\306\026
+\307\017\350\200\316\034\050\144\164\031\010\323\102\343\316\000
+\135\177\261\334\023\260\341\005\313\321\040\252\206\164\236\071
+\347\221\375\377\133\326\367\255\246\057\003\013\155\343\127\124
+\353\166\123\030\215\021\230\272
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "HARICA TLS RSA Root CA 2021"
+# Issuer: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Serial Number:39:ca:93:1c:ef:43:f3:c6:8e:93:c7:f4:64:89:38:7e
+# Subject: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Not Valid Before: Fri Feb 19 10:55:38 2021
+# Not Valid After : Mon Feb 13 10:55:37 2045
+# Fingerprint (SHA-256): D9:5D:0E:8E:DA:79:52:5B:F9:BE:B1:1B:14:D2:10:0D:32:94:98:5F:0C:62:D9:FA:BD:9C:D9:99:EC:CB:7B:1D
+# Fingerprint (SHA1): 02:2D:05:82:FA:88:CE:14:0C:06:79:DE:7F:14:10:E9:45:D7:A5:6D
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "HARICA TLS RSA Root CA 2021"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\002\055\005\202\372\210\316\024\014\006\171\336\177\024\020\351
+\105\327\245\155
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\145\107\233\130\206\335\054\360\374\242\204\037\036\226\304\221
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
+\003\014\033\110\101\122\111\103\101\040\124\114\123\040\122\123
+\101\040\122\157\157\164\040\103\101\040\062\060\062\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\071\312\223\034\357\103\363\306\216\223\307\364\144\211
+\070\176
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "HARICA TLS ECC Root CA 2021"
+#
+# Issuer: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Serial Number:67:74:9d:8d:77:d8:3b:6a:db:22:f4:ff:59:e2:bf:ce
+# Subject: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Not Valid Before: Fri Feb 19 11:01:10 2021
+# Not Valid After : Mon Feb 13 11:01:09 2045
+# Fingerprint (SHA-256): 3F:99:CC:47:4A:CF:CE:4D:FE:D5:87:94:66:5E:47:8D:15:47:73:9F:2E:78:0F:1B:B4:CA:9B:13:30:97:D4:01
+# Fingerprint (SHA1): BC:B0:C1:9D:E9:98:92:70:19:38:57:E9:8D:A7:B4:5D:6E:EE:01:48
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "HARICA TLS ECC Root CA 2021"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
+\003\014\033\110\101\122\111\103\101\040\124\114\123\040\105\103
+\103\040\122\157\157\164\040\103\101\040\062\060\062\061
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
+\003\014\033\110\101\122\111\103\101\040\124\114\123\040\105\103
+\103\040\122\157\157\164\040\103\101\040\062\060\062\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\147\164\235\215\167\330\073\152\333\042\364\377\131\342
+\277\316
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\124\060\202\001\333\240\003\002\001\002\002\020\147
+\164\235\215\167\330\073\152\333\042\364\377\131\342\277\316\060
+\012\006\010\052\206\110\316\075\004\003\003\060\154\061\013\060
+\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006\003
+\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101\143
+\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145\141
+\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156\163
+\040\103\101\061\044\060\042\006\003\125\004\003\014\033\110\101
+\122\111\103\101\040\124\114\123\040\105\103\103\040\122\157\157
+\164\040\103\101\040\062\060\062\061\060\036\027\015\062\061\060
+\062\061\071\061\061\060\061\061\060\132\027\015\064\065\060\062
+\061\063\061\061\060\061\060\071\132\060\154\061\013\060\011\006
+\003\125\004\006\023\002\107\122\061\067\060\065\006\003\125\004
+\012\014\056\110\145\154\154\145\156\151\143\040\101\143\141\144
+\145\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143
+\150\040\111\156\163\164\151\164\165\164\151\157\156\163\040\103
+\101\061\044\060\042\006\003\125\004\003\014\033\110\101\122\111
+\103\101\040\124\114\123\040\105\103\103\040\122\157\157\164\040
+\103\101\040\062\060\062\061\060\166\060\020\006\007\052\206\110
+\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\070
+\010\376\261\240\226\322\172\254\257\111\072\320\300\340\303\073
+\050\252\361\162\155\145\000\107\210\204\374\232\046\153\252\113
+\272\154\004\012\210\136\027\362\125\207\374\060\260\064\342\064
+\130\127\032\204\123\351\060\331\251\362\226\164\303\121\037\130
+\111\061\314\230\116\140\021\207\165\323\162\224\220\117\233\020
+\045\052\250\170\055\276\220\101\130\220\025\162\247\241\267\243
+\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060
+\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\311
+\033\123\201\022\376\004\325\026\321\252\274\232\157\267\240\225
+\031\156\312\060\016\006\003\125\035\017\001\001\377\004\004\003
+\002\001\206\060\012\006\010\052\206\110\316\075\004\003\003\003
+\147\000\060\144\002\060\021\336\256\370\334\116\210\260\251\360
+\042\255\302\121\100\357\140\161\055\356\217\002\304\135\003\160
+\111\244\222\352\305\024\210\160\246\323\015\260\252\312\054\100
+\234\373\351\202\156\232\002\060\053\107\232\007\306\321\302\201
+\174\312\013\226\030\101\033\243\364\060\011\236\265\043\050\015
+\237\024\266\074\123\242\114\006\151\175\372\154\221\306\052\111
+\105\346\354\267\023\341\072\154
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "HARICA TLS ECC Root CA 2021"
+# Issuer: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Serial Number:67:74:9d:8d:77:d8:3b:6a:db:22:f4:ff:59:e2:bf:ce
+# Subject: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Not Valid Before: Fri Feb 19 11:01:10 2021
+# Not Valid After : Mon Feb 13 11:01:09 2045
+# Fingerprint (SHA-256): 3F:99:CC:47:4A:CF:CE:4D:FE:D5:87:94:66:5E:47:8D:15:47:73:9F:2E:78:0F:1B:B4:CA:9B:13:30:97:D4:01
+# Fingerprint (SHA1): BC:B0:C1:9D:E9:98:92:70:19:38:57:E9:8D:A7:B4:5D:6E:EE:01:48
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "HARICA TLS ECC Root CA 2021"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\274\260\301\235\351\230\222\160\031\070\127\351\215\247\264\135
+\156\356\001\110
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\256\367\114\345\146\065\321\267\233\214\042\223\164\323\113\260
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
+\003\014\033\110\101\122\111\103\101\040\124\114\123\040\105\103
+\103\040\122\157\157\164\040\103\101\040\062\060\062\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\147\164\235\215\167\330\073\152\333\042\364\377\131\342
+\277\316
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "HARICA Client RSA Root CA 2021"
+#
+# Issuer: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Serial Number:55:52:f8:1e:db:1b:24:2c:9e:bb:96:18:cd:02:28:3e
+# Subject: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Not Valid Before: Fri Feb 19 10:58:46 2021
+# Not Valid After : Mon Feb 13 10:58:45 2045
+# Fingerprint (SHA-256): 1B:E7:AB:E3:06:86:B1:63:48:AF:D1:C6:1B:68:66:A0:EA:7F:48:21:E6:7D:5E:8A:F9:37:CF:80:11:BC:75:0D
+# Fingerprint (SHA1): 46:C6:90:0A:77:3A:B6:BC:F4:65:AD:AC:FC:E3:F7:07:00:6E:DE:6E
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "HARICA Client RSA Root CA 2021"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
+\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
+\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062
+\061
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
+\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
+\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062
+\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\125\122\370\036\333\033\044\054\236\273\226\030\315\002
+\050\076
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\252\060\202\003\222\240\003\002\001\002\002\020\125
+\122\370\036\333\033\044\054\236\273\226\030\315\002\050\076\060
+\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\157
+\061\013\060\011\006\003\125\004\006\023\002\107\122\061\067\060
+\065\006\003\125\004\012\014\056\110\145\154\154\145\156\151\143
+\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122\145
+\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164\151
+\157\156\163\040\103\101\061\047\060\045\006\003\125\004\003\014
+\036\110\101\122\111\103\101\040\103\154\151\145\156\164\040\122
+\123\101\040\122\157\157\164\040\103\101\040\062\060\062\061\060
+\036\027\015\062\061\060\062\061\071\061\060\065\070\064\066\132
+\027\015\064\065\060\062\061\063\061\060\065\070\064\065\132\060
+\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061\067
+\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156\151
+\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122
+\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164
+\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004\003
+\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164\040
+\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062\061
+\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
+\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
+\000\201\333\127\102\220\054\164\065\364\370\270\164\031\115\253
+\011\132\167\105\201\163\142\260\065\237\370\320\267\063\000\207
+\023\266\226\253\016\124\022\060\007\274\233\267\110\327\321\031
+\203\256\216\330\251\361\251\000\204\260\214\136\236\350\014\217
+\124\151\277\366\324\010\117\046\160\376\030\101\143\032\263\062
+\213\100\370\007\253\127\061\360\306\026\166\147\232\264\335\057
+\362\321\153\305\320\222\204\221\161\156\017\056\143\351\037\123
+\244\335\122\023\314\011\203\051\201\014\305\123\165\104\261\016
+\147\123\030\320\303\037\210\113\237\224\044\264\051\274\273\350
+\116\375\157\322\025\035\111\334\215\160\362\021\032\040\121\125
+\021\272\210\157\304\367\120\171\326\252\061\342\204\075\136\062
+\310\167\052\120\161\345\013\057\351\266\352\357\253\012\063\071
+\016\375\217\245\147\103\202\216\230\151\011\011\033\100\315\070
+\147\107\352\311\354\227\161\022\336\044\365\162\074\321\367\103
+\114\046\367\220\262\211\351\105\113\125\075\061\005\172\101\342
+\225\272\103\300\027\305\266\205\075\031\215\144\160\363\133\254
+\315\237\323\051\165\207\113\225\147\152\246\370\321\335\274\220
+\206\211\103\051\251\067\133\365\135\260\046\132\123\102\166\220
+\053\317\236\126\154\053\124\317\134\232\145\337\133\213\110\140
+\070\174\373\305\013\317\166\004\143\002\063\052\175\365\203\147
+\347\372\306\103\375\053\017\324\046\057\167\244\062\301\044\352
+\144\235\277\263\070\161\061\104\362\107\270\242\146\101\241\373
+\233\173\274\307\106\152\165\277\132\242\214\350\152\104\301\270
+\226\265\300\062\010\055\173\164\065\163\262\312\306\376\257\021
+\162\030\366\347\310\302\317\245\052\352\173\326\131\350\174\240
+\262\152\100\011\151\016\245\226\333\321\000\271\361\210\156\066
+\360\210\262\235\361\122\362\303\174\277\060\211\074\012\151\371
+\042\244\145\341\233\340\164\306\261\205\227\226\054\256\224\217
+\120\246\071\022\037\276\107\362\201\170\323\165\066\236\175\132
+\040\227\342\122\256\231\237\306\174\233\146\363\376\330\317\356
+\275\227\006\035\055\205\334\076\066\123\226\173\040\272\350\310
+\341\255\226\142\076\021\174\263\000\204\236\247\114\161\253\112
+\067\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035
+\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125
+\035\016\004\026\004\024\240\326\007\075\136\044\367\173\240\104
+\056\044\122\015\031\252\053\004\221\247\060\016\006\003\125\035
+\017\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206
+\110\206\367\015\001\001\013\005\000\003\202\002\001\000\015\107
+\371\011\146\061\122\354\171\356\302\250\362\150\076\355\226\105
+\313\072\246\230\143\077\352\053\115\116\003\320\034\202\341\313
+\323\345\326\253\133\147\050\274\235\376\014\231\012\200\125\247
+\316\033\043\141\015\260\127\360\376\340\312\276\346\220\333\203
+\054\276\203\216\364\171\266\376\320\015\102\247\130\037\151\352
+\201\365\005\245\376\106\150\353\154\170\311\340\352\347\346\336
+\061\305\322\325\054\202\143\050\235\135\250\032\176\210\346\347
+\053\361\054\325\320\005\236\334\055\275\067\146\324\004\242\247
+\255\277\072\302\250\073\255\377\215\235\063\340\271\232\204\241
+\207\037\166\364\202\164\327\016\371\060\110\076\133\210\076\252
+\134\153\326\057\014\350\216\163\302\030\221\203\071\266\146\132
+\320\037\140\047\135\115\343\366\072\015\146\120\234\170\173\253
+\363\023\020\256\017\057\253\350\144\263\030\040\235\106\065\144
+\045\163\352\233\020\134\130\065\211\261\106\110\247\364\254\324
+\035\236\133\314\251\245\032\023\117\044\120\252\331\033\155\261
+\100\373\235\335\130\164\304\302\157\024\162\354\333\065\237\270
+\124\165\105\303\246\310\032\050\065\072\256\145\362\251\230\316
+\257\133\311\070\214\061\073\177\314\334\226\375\342\133\326\320
+\131\364\166\272\013\313\117\203\020\307\100\320\035\140\351\052
+\345\110\130\167\014\105\151\276\031\161\004\044\342\343\044\037
+\112\310\301\076\231\365\226\230\070\110\045\241\025\260\033\327
+\342\204\030\133\366\161\065\232\150\173\100\314\030\134\014\044
+\235\324\225\365\231\252\106\352\256\254\277\364\024\031\044\350
+\214\354\343\365\274\006\150\212\052\014\005\137\012\227\165\247
+\334\176\300\375\327\172\030\337\060\321\070\113\037\260\230\160
+\277\314\174\163\360\156\304\061\245\244\227\035\254\277\316\154
+\041\112\276\047\043\147\363\006\126\201\012\221\216\266\341\003
+\005\063\054\332\064\010\115\116\120\043\255\037\245\305\324\172
+\376\352\011\354\247\050\140\213\106\174\265\352\233\335\117\371
+\347\153\025\306\210\317\103\333\345\047\334\004\126\156\157\106
+\025\361\126\055\350\134\014\163\303\043\201\070\040\313\311\014
+\151\317\054\253\073\204\140\063\031\122\375\151\024\063
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "HARICA Client RSA Root CA 2021"
+# Issuer: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Serial Number:55:52:f8:1e:db:1b:24:2c:9e:bb:96:18:cd:02:28:3e
+# Subject: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Not Valid Before: Fri Feb 19 10:58:46 2021
+# Not Valid After : Mon Feb 13 10:58:45 2045
+# Fingerprint (SHA-256): 1B:E7:AB:E3:06:86:B1:63:48:AF:D1:C6:1B:68:66:A0:EA:7F:48:21:E6:7D:5E:8A:F9:37:CF:80:11:BC:75:0D
+# Fingerprint (SHA1): 46:C6:90:0A:77:3A:B6:BC:F4:65:AD:AC:FC:E3:F7:07:00:6E:DE:6E
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "HARICA Client RSA Root CA 2021"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\106\306\220\012\167\072\266\274\364\145\255\254\374\343\367\007
+\000\156\336\156
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\157\355\134\327\210\314\070\251\334\351\335\331\135\333\330\355
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
+\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
+\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062
+\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\125\122\370\036\333\033\044\054\236\273\226\030\315\002
+\050\076
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "HARICA Client ECC Root CA 2021"
+#
+# Issuer: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Serial Number:31:68:d9:d8:e1:62:57:1e:d2:19:44:88:e6:10:7d:f0
+# Subject: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Not Valid Before: Fri Feb 19 11:03:34 2021
+# Not Valid After : Mon Feb 13 11:03:33 2045
+# Fingerprint (SHA-256): 8D:D4:B5:37:3C:B0:DE:36:76:9C:12:33:92:80:D8:27:46:B3:AA:6C:D4:26:E7:97:A3:1B:AB:E4:27:9C:F0:0B
+# Fingerprint (SHA1): BE:64:D3:DA:14:4B:D2:6B:CD:AF:8F:DB:A6:A6:72:F8:DE:26:F9:00
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "HARICA Client ECC Root CA 2021"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
+\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
+\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062
+\061
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
+\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
+\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062
+\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\061\150\331\330\341\142\127\036\322\031\104\210\346\020
+\175\360
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\132\060\202\001\341\240\003\002\001\002\002\020\061
+\150\331\330\341\142\127\036\322\031\104\210\346\020\175\360\060
+\012\006\010\052\206\110\316\075\004\003\003\060\157\061\013\060
+\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006\003
+\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101\143
+\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145\141
+\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156\163
+\040\103\101\061\047\060\045\006\003\125\004\003\014\036\110\101
+\122\111\103\101\040\103\154\151\145\156\164\040\105\103\103\040
+\122\157\157\164\040\103\101\040\062\060\062\061\060\036\027\015
+\062\061\060\062\061\071\061\061\060\063\063\064\132\027\015\064
+\065\060\062\061\063\061\061\060\063\063\063\132\060\157\061\013
+\060\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006
+\003\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101
+\143\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145
+\141\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156
+\163\040\103\101\061\047\060\045\006\003\125\004\003\014\036\110
+\101\122\111\103\101\040\103\154\151\145\156\164\040\105\103\103
+\040\122\157\157\164\040\103\101\040\062\060\062\061\060\166\060
+\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000
+\042\003\142\000\004\007\030\255\225\226\224\320\134\017\202\367
+\052\100\372\002\311\311\075\066\246\243\004\152\301\155\225\001
+\210\140\022\124\154\134\242\053\156\023\072\210\225\014\034\046
+\206\066\112\211\031\267\030\336\073\350\250\120\037\312\337\133
+\277\111\200\025\333\343\060\341\035\132\307\052\212\001\007\376
+\155\054\064\357\050\050\227\274\301\371\127\206\225\213\065\317
+\236\132\321\150\225\243\102\060\100\060\017\006\003\125\035\023
+\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035
+\016\004\026\004\024\122\010\322\276\062\201\045\375\365\032\227
+\354\116\137\032\273\123\315\220\255\060\016\006\003\125\035\017
+\001\001\377\004\004\003\002\001\206\060\012\006\010\052\206\110
+\316\075\004\003\003\003\147\000\060\144\002\060\114\061\105\106
+\117\250\346\276\303\167\262\032\030\113\055\210\173\130\346\253
+\224\153\104\003\260\027\377\337\202\163\104\121\054\375\223\035
+\006\173\024\322\211\354\100\014\357\041\001\056\002\060\057\311
+\056\132\154\054\035\331\225\340\236\260\271\134\122\174\366\370
+\070\312\056\361\324\035\362\242\111\242\225\370\301\130\136\117
+\376\163\012\357\061\260\253\043\130\023\214\213\336\073
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "HARICA Client ECC Root CA 2021"
+# Issuer: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Serial Number:31:68:d9:d8:e1:62:57:1e:d2:19:44:88:e6:10:7d:f0
+# Subject: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
+# Not Valid Before: Fri Feb 19 11:03:34 2021
+# Not Valid After : Mon Feb 13 11:03:33 2045
+# Fingerprint (SHA-256): 8D:D4:B5:37:3C:B0:DE:36:76:9C:12:33:92:80:D8:27:46:B3:AA:6C:D4:26:E7:97:A3:1B:AB:E4:27:9C:F0:0B
+# Fingerprint (SHA1): BE:64:D3:DA:14:4B:D2:6B:CD:AF:8F:DB:A6:A6:72:F8:DE:26:F9:00
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "certSIGN Root CA G2"
+CKA_LABEL UTF8 "HARICA Client ECC Root CA 2021"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\046\371\223\264\355\075\050\047\260\271\113\247\351\025\035\243
-\215\222\345\062
+\276\144\323\332\024\113\322\153\315\257\217\333\246\246\162\370
+\336\046\371\000
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\214\361\165\212\306\031\317\224\267\367\145\040\207\303\227\307
+\255\270\120\246\251\202\172\154\075\032\252\244\322\143\244\104
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\101\061\013\060\011\006\003\125\004\006\023\002\122\117\061
-\024\060\022\006\003\125\004\012\023\013\103\105\122\124\123\111
-\107\116\040\123\101\061\034\060\032\006\003\125\004\013\023\023
-\143\145\162\164\123\111\107\116\040\122\117\117\124\040\103\101
-\040\107\062
+\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
+\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
+\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
+\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
+\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
+\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
+\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062
+\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\011\021\000\064\266\116\306\066\055\066
+\002\020\061\150\331\330\341\142\127\036\322\031\104\210\346\020
+\175\360
 END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Trustwave Global Certification Authority"
+# Certificate "Autoridad de Certificacion Firmaprofesional CIF A62634068"
 #
-# Issuer: CN=Trustwave Global Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Serial Number:05:f7:0e:86:da:49:f3:46:35:2e:ba:b2
-# Subject: CN=Trustwave Global Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Not Valid Before: Wed Aug 23 19:34:12 2017
-# Not Valid After : Sat Aug 23 19:34:12 2042
-# Fingerprint (SHA-256): 97:55:20:15:F5:DD:FC:3C:87:88:C0:06:94:45:55:40:88:94:45:00:84:F1:00:86:70:86:BC:1A:2B:B5:8D:C8
-# Fingerprint (SHA1): 2F:8F:36:4F:E1:58:97:44:21:59:87:A5:2A:9A:D0:69:95:26:7F:B5
+# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES
+# Serial Number:1b:70:e9:d2:ff:ae:6c:71
+# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES
+# Not Valid Before: Tue Sep 23 15:22:07 2014
+# Not Valid After : Mon May 05 15:22:07 2036
+# Fingerprint (SHA-256): 57:DE:05:83:EF:D2:B2:6E:03:61:DA:99:DA:9D:F4:64:8D:EF:7E:E8:44:1C:3B:72:8A:FA:9B:CD:E0:F9:B2:6A
+# Fingerprint (SHA1): 0B:BE:C2:27:22:49:CB:39:AA:DB:35:5C:53:E3:8C:AE:78:FF:B6:FE
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Trustwave Global Certification Authority"
+CKA_LABEL UTF8 "Autoridad de Certificacion Firmaprofesional CIF A62634068"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\014\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\014\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\014\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\061\060\057\006\003\125\004
-\003\014\050\124\162\165\163\164\167\141\166\145\040\107\154\157
-\142\141\154\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171
+\060\121\061\013\060\011\006\003\125\004\006\023\002\105\123\061
+\102\060\100\006\003\125\004\003\014\071\101\165\164\157\162\151
+\144\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141
+\143\151\157\156\040\106\151\162\155\141\160\162\157\146\145\163
+\151\157\156\141\154\040\103\111\106\040\101\066\062\066\063\064
+\060\066\070
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\014\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\014\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\014\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\061\060\057\006\003\125\004
-\003\014\050\124\162\165\163\164\167\141\166\145\040\107\154\157
-\142\141\154\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171
+\060\121\061\013\060\011\006\003\125\004\006\023\002\105\123\061
+\102\060\100\006\003\125\004\003\014\071\101\165\164\157\162\151
+\144\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141
+\143\151\157\156\040\106\151\162\155\141\160\162\157\146\145\163
+\151\157\156\141\154\040\103\111\106\040\101\066\062\066\063\064
+\060\066\070
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\014\005\367\016\206\332\111\363\106\065\056\272\262
+\002\010\033\160\351\322\377\256\154\161
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\332\060\202\003\302\240\003\002\001\002\002\014\005
-\367\016\206\332\111\363\106\065\056\272\262\060\015\006\011\052
-\206\110\206\367\015\001\001\013\005\000\060\201\210\061\013\060
-\011\006\003\125\004\006\023\002\125\123\061\021\060\017\006\003
-\125\004\010\014\010\111\154\154\151\156\157\151\163\061\020\060
-\016\006\003\125\004\007\014\007\103\150\151\143\141\147\157\061
-\041\060\037\006\003\125\004\012\014\030\124\162\165\163\164\167
-\141\166\145\040\110\157\154\144\151\156\147\163\054\040\111\156
-\143\056\061\061\060\057\006\003\125\004\003\014\050\124\162\165
-\163\164\167\141\166\145\040\107\154\157\142\141\154\040\103\145
-\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150
-\157\162\151\164\171\060\036\027\015\061\067\060\070\062\063\061
-\071\063\064\061\062\132\027\015\064\062\060\070\062\063\061\071
-\063\064\061\062\132\060\201\210\061\013\060\011\006\003\125\004
-\006\023\002\125\123\061\021\060\017\006\003\125\004\010\014\010
-\111\154\154\151\156\157\151\163\061\020\060\016\006\003\125\004
-\007\014\007\103\150\151\143\141\147\157\061\041\060\037\006\003
-\125\004\012\014\030\124\162\165\163\164\167\141\166\145\040\110
-\157\154\144\151\156\147\163\054\040\111\156\143\056\061\061\060
-\057\006\003\125\004\003\014\050\124\162\165\163\164\167\141\166
-\145\040\107\154\157\142\141\154\040\103\145\162\164\151\146\151
-\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171
-\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
-\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
-\000\271\135\121\050\113\074\067\222\321\202\316\275\035\275\315
-\335\270\253\317\012\076\341\135\345\334\252\011\271\127\002\076
-\346\143\141\337\362\017\202\143\256\243\367\254\163\321\174\347
-\263\013\257\010\000\011\131\177\315\051\052\210\223\207\027\030
-\200\355\210\262\264\266\020\037\055\326\137\125\242\023\135\321
-\306\353\006\126\211\210\376\254\062\235\375\134\303\005\307\156
-\356\206\211\272\210\003\235\162\041\206\220\256\217\003\245\334
-\237\210\050\313\243\222\111\017\354\320\017\342\155\104\117\200
-\152\262\324\347\240\012\123\001\272\216\227\221\166\156\274\374
-\325\153\066\346\100\210\326\173\057\137\005\350\054\155\021\363
-\347\262\276\222\104\114\322\227\244\376\322\162\201\103\007\234
-\351\021\076\365\213\032\131\175\037\150\130\335\004\000\054\226
-\363\103\263\176\230\031\164\331\234\163\331\030\276\101\307\064
-\171\331\364\142\302\103\271\263\047\260\042\313\371\075\122\307
-\060\107\263\311\076\270\152\342\347\350\201\160\136\102\213\117
-\046\245\376\072\302\040\156\273\370\026\216\315\014\251\264\033
-\154\166\020\341\130\171\106\076\124\316\200\250\127\011\067\051
-\033\231\023\217\014\310\326\054\034\373\005\350\010\225\075\145
-\106\334\356\315\151\342\115\217\207\050\116\064\013\076\317\024
-\331\273\335\266\120\232\255\167\324\031\326\332\032\210\310\116
-\033\047\165\330\262\010\361\256\203\060\271\021\016\315\207\360
-\204\215\025\162\174\241\357\314\362\210\141\272\364\151\273\014
-\214\013\165\127\004\270\116\052\024\056\075\017\034\036\062\246
-\142\066\356\146\342\042\270\005\100\143\020\042\363\063\035\164
-\162\212\054\365\071\051\240\323\347\033\200\204\055\305\075\343
-\115\261\375\032\157\272\145\007\073\130\354\102\105\046\373\330
-\332\045\162\304\366\000\261\042\171\275\343\174\131\142\112\234
-\005\157\075\316\346\326\107\143\231\306\044\157\162\022\310\254
-\177\220\264\013\221\160\350\267\346\026\020\161\027\316\336\006
-\117\110\101\175\065\112\243\211\362\311\113\173\101\021\155\147
-\267\010\230\114\345\021\031\256\102\200\334\373\220\005\324\370
-\120\312\276\344\255\307\302\224\327\026\235\346\027\217\257\066
-\373\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035
-\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125
-\035\016\004\026\004\024\231\340\031\147\015\142\333\166\263\332
-\075\270\133\350\375\102\322\061\016\207\060\016\006\003\125\035
-\017\001\001\377\004\004\003\002\001\006\060\015\006\011\052\206
-\110\206\367\015\001\001\013\005\000\003\202\002\001\000\230\163
-\160\342\260\323\355\071\354\114\140\331\251\022\206\027\036\226
-\320\350\124\050\073\144\055\041\246\370\235\126\023\152\110\075
-\117\307\076\051\333\155\130\203\124\075\207\175\043\005\324\344
-\034\334\350\070\145\206\305\165\247\132\333\065\005\275\167\336
-\273\051\067\100\005\007\303\224\122\237\312\144\335\361\033\053
-\334\106\012\020\002\061\375\112\150\015\007\144\220\346\036\365
-\052\241\250\273\074\135\371\243\010\013\021\014\361\077\055\020
-\224\157\376\342\064\207\203\326\317\345\033\065\155\322\003\341
-\260\015\250\240\252\106\047\202\066\247\025\266\010\246\102\124
-\127\266\231\132\342\013\171\220\327\127\022\121\065\031\210\101
-\150\045\324\067\027\204\025\373\001\162\334\225\336\122\046\040
-\230\046\342\166\365\047\157\372\000\073\112\141\331\015\313\121
-\223\052\375\026\006\226\247\043\232\043\110\376\121\275\266\304
-\260\261\124\316\336\154\101\255\026\147\176\333\375\070\315\271
-\070\116\262\301\140\313\235\027\337\130\236\172\142\262\046\217
-\164\225\233\344\133\035\322\017\335\230\034\233\131\271\043\323
-\061\240\246\377\070\335\317\040\117\351\130\126\072\147\303\321
-\366\231\231\235\272\066\266\200\057\210\107\117\206\277\104\072
-\200\344\067\034\246\272\352\227\230\021\320\204\142\107\144\036
-\252\356\100\277\064\261\234\217\116\341\362\222\117\037\216\363
-\236\227\336\363\246\171\152\211\161\117\113\047\027\110\376\354
-\364\120\017\117\111\175\314\105\343\275\172\100\305\101\334\141
-\126\047\006\151\345\162\101\201\323\266\001\211\240\057\072\162
-\171\376\072\060\277\101\354\307\142\076\221\113\307\331\061\166
-\102\371\367\074\143\354\046\214\163\014\175\032\035\352\250\174
-\207\250\302\047\174\341\063\101\017\317\317\374\000\240\042\200
-\236\112\247\157\000\260\101\105\267\042\312\150\110\305\102\242
-\256\335\035\362\340\156\116\005\130\261\300\220\026\052\244\075
-\020\100\276\217\142\143\203\251\234\202\175\055\002\351\203\060
-\174\313\047\311\375\036\146\000\260\056\323\041\057\216\063\026
-\154\230\355\020\250\007\326\314\223\317\333\321\151\034\344\312
-\311\340\266\234\351\316\161\161\336\154\077\026\244\171
+\060\202\006\024\060\202\003\374\240\003\002\001\002\002\010\033
+\160\351\322\377\256\154\161\060\015\006\011\052\206\110\206\367
+\015\001\001\013\005\000\060\121\061\013\060\011\006\003\125\004
+\006\023\002\105\123\061\102\060\100\006\003\125\004\003\014\071
+\101\165\164\157\162\151\144\141\144\040\144\145\040\103\145\162
+\164\151\146\151\143\141\143\151\157\156\040\106\151\162\155\141
+\160\162\157\146\145\163\151\157\156\141\154\040\103\111\106\040
+\101\066\062\066\063\064\060\066\070\060\036\027\015\061\064\060
+\071\062\063\061\065\062\062\060\067\132\027\015\063\066\060\065
+\060\065\061\065\062\062\060\067\132\060\121\061\013\060\011\006
+\003\125\004\006\023\002\105\123\061\102\060\100\006\003\125\004
+\003\014\071\101\165\164\157\162\151\144\141\144\040\144\145\040
+\103\145\162\164\151\146\151\143\141\143\151\157\156\040\106\151
+\162\155\141\160\162\157\146\145\163\151\157\156\141\154\040\103
+\111\106\040\101\066\062\066\063\064\060\066\070\060\202\002\042
+\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003
+\202\002\017\000\060\202\002\012\002\202\002\001\000\312\226\153
+\216\352\370\373\361\242\065\340\177\114\332\340\303\122\327\175
+\266\020\310\002\136\263\103\052\304\117\152\262\312\034\135\050
+\232\170\021\032\151\131\127\257\265\040\102\344\213\017\346\337
+\133\246\003\222\057\365\021\344\142\327\062\161\070\331\004\014
+\161\253\075\121\176\017\007\337\143\005\134\351\277\224\157\301
+\051\202\300\264\332\121\260\301\074\273\255\067\112\134\312\361
+\113\066\016\044\253\277\303\204\167\375\250\120\364\261\347\306
+\057\322\055\131\215\172\012\116\226\151\122\002\252\066\230\354
+\374\372\024\203\014\067\037\311\222\067\177\327\201\055\345\304
+\271\340\076\064\376\147\364\076\146\321\323\364\100\317\136\142
+\064\017\160\006\076\040\030\132\316\367\162\033\045\154\223\164
+\024\223\243\163\261\016\252\207\020\043\131\137\040\005\031\107
+\355\150\216\222\022\312\135\374\326\053\262\222\074\040\317\341
+\137\257\040\276\240\166\177\166\345\354\032\206\141\063\076\347
+\173\264\077\240\017\216\242\271\152\157\271\207\046\157\101\154
+\210\246\120\375\152\143\013\365\223\026\033\031\217\262\355\233
+\233\311\220\365\001\014\337\031\075\017\076\070\043\311\057\217
+\014\321\002\376\033\125\326\116\320\215\074\257\117\244\363\376
+\257\052\323\005\235\171\010\241\313\127\061\264\234\310\220\262
+\147\364\030\026\223\072\374\107\330\321\170\226\061\037\272\053
+\014\137\135\231\255\143\211\132\044\040\166\330\337\375\253\116
+\246\042\252\235\136\346\047\212\175\150\051\243\347\212\270\332
+\021\273\027\055\231\235\023\044\106\367\305\342\330\237\216\177
+\307\217\164\155\132\262\350\162\365\254\356\044\020\255\057\024
+\332\377\055\232\106\161\107\276\102\337\273\001\333\364\177\323
+\050\217\061\131\133\323\311\002\246\264\122\312\156\227\373\103
+\305\010\046\157\212\364\273\375\237\050\252\015\325\105\363\023
+\072\035\330\300\170\217\101\147\074\036\224\144\256\173\013\305
+\350\331\001\210\071\032\227\206\144\101\325\073\207\014\156\372
+\017\306\275\110\024\277\071\115\324\236\101\266\217\226\035\143
+\226\223\331\225\006\170\061\150\236\067\006\073\200\211\105\141
+\071\043\307\033\104\243\025\345\034\370\222\060\273\002\003\001
+\000\001\243\201\357\060\201\354\060\035\006\003\125\035\016\004
+\026\004\024\145\315\353\253\065\036\000\076\176\325\164\300\034
+\264\163\107\016\032\144\057\060\022\006\003\125\035\023\001\001
+\377\004\010\060\006\001\001\377\002\001\001\060\201\246\006\003
+\125\035\040\004\201\236\060\201\233\060\201\230\006\004\125\035
+\040\000\060\201\217\060\057\006\010\053\006\001\005\005\007\002
+\001\026\043\150\164\164\160\072\057\057\167\167\167\056\146\151
+\162\155\141\160\162\157\146\145\163\151\157\156\141\154\056\143
+\157\155\057\143\160\163\060\134\006\010\053\006\001\005\005\007
+\002\002\060\120\036\116\000\120\000\141\000\163\000\145\000\157
+\000\040\000\144\000\145\000\040\000\154\000\141\000\040\000\102
+\000\157\000\156\000\141\000\156\000\157\000\166\000\141\000\040
+\000\064\000\067\000\040\000\102\000\141\000\162\000\143\000\145
+\000\154\000\157\000\156\000\141\000\040\000\060\000\070\000\060
+\000\061\000\067\060\016\006\003\125\035\017\001\001\377\004\004
+\003\002\001\006\060\015\006\011\052\206\110\206\367\015\001\001
+\013\005\000\003\202\002\001\000\164\207\050\002\053\167\037\146
+\211\144\355\217\164\056\106\034\273\250\370\370\013\035\203\266
+\072\247\350\105\212\007\267\340\076\040\313\341\010\333\023\010
+\370\050\241\065\262\200\263\013\121\300\323\126\232\215\063\105
+\111\257\111\360\340\075\007\172\105\023\132\377\310\227\330\323
+\030\054\175\226\370\335\242\145\103\160\223\220\025\272\220\337
+\350\031\260\333\054\212\140\017\267\157\224\007\036\035\246\311
+\205\366\275\064\370\100\170\142\020\160\072\276\175\113\071\201
+\251\020\324\226\101\273\370\137\034\013\035\010\362\261\260\211
+\172\362\367\240\340\304\217\213\170\265\073\130\245\043\216\117
+\125\376\066\073\340\014\267\312\052\060\101\040\264\200\315\256
+\374\166\146\163\250\256\156\341\174\332\003\350\224\040\346\042
+\243\320\037\220\135\040\123\024\046\127\332\124\227\337\026\104
+\020\001\036\210\146\217\162\070\223\335\040\267\064\276\327\361
+\356\143\216\107\171\050\006\374\363\131\105\045\140\042\063\033
+\243\137\250\272\052\332\032\075\315\100\352\214\356\005\025\225
+\325\245\054\040\057\247\230\050\356\105\374\361\270\210\000\054
+\217\102\332\121\325\234\345\023\150\161\105\103\213\236\013\041
+\074\113\134\005\334\032\237\230\216\332\275\042\236\162\315\255
+\012\313\314\243\147\233\050\164\304\233\327\032\074\004\130\246
+\202\235\255\307\173\157\377\200\226\351\370\215\152\275\030\220
+\035\377\111\032\220\122\067\223\057\074\002\135\202\166\013\121
+\347\026\307\127\370\070\371\247\315\233\042\124\357\143\260\025
+\155\123\145\003\112\136\112\240\262\247\216\111\000\131\070\325
+\307\364\200\144\365\156\225\120\270\021\176\025\160\070\112\260
+\177\320\304\062\160\300\031\377\311\070\055\024\054\146\364\102
+\104\346\125\166\033\200\025\127\377\300\247\247\252\071\252\330
+\323\160\320\056\272\353\224\152\372\137\064\206\347\142\265\375
+\212\360\060\205\224\311\257\044\002\057\157\326\335\147\376\343
+\260\125\117\004\230\117\244\101\126\342\223\320\152\350\326\363
+\373\145\340\316\165\304\061\131\014\356\202\310\014\140\063\112
+\031\272\204\147\047\017\274\102\135\275\044\124\015\354\035\160
+\006\137\244\274\372\040\174\125
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "Trustwave Global Certification Authority"
-# Issuer: CN=Trustwave Global Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Serial Number:05:f7:0e:86:da:49:f3:46:35:2e:ba:b2
-# Subject: CN=Trustwave Global Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Not Valid Before: Wed Aug 23 19:34:12 2017
-# Not Valid After : Sat Aug 23 19:34:12 2042
-# Fingerprint (SHA-256): 97:55:20:15:F5:DD:FC:3C:87:88:C0:06:94:45:55:40:88:94:45:00:84:F1:00:86:70:86:BC:1A:2B:B5:8D:C8
-# Fingerprint (SHA1): 2F:8F:36:4F:E1:58:97:44:21:59:87:A5:2A:9A:D0:69:95:26:7F:B5
+# Trust for "Autoridad de Certificacion Firmaprofesional CIF A62634068"
+# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES
+# Serial Number:1b:70:e9:d2:ff:ae:6c:71
+# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES
+# Not Valid Before: Tue Sep 23 15:22:07 2014
+# Not Valid After : Mon May 05 15:22:07 2036
+# Fingerprint (SHA-256): 57:DE:05:83:EF:D2:B2:6E:03:61:DA:99:DA:9D:F4:64:8D:EF:7E:E8:44:1C:3B:72:8A:FA:9B:CD:E0:F9:B2:6A
+# Fingerprint (SHA1): 0B:BE:C2:27:22:49:CB:39:AA:DB:35:5C:53:E3:8C:AE:78:FF:B6:FE
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Trustwave Global Certification Authority"
+CKA_LABEL UTF8 "Autoridad de Certificacion Firmaprofesional CIF A62634068"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\057\217\066\117\341\130\227\104\041\131\207\245\052\232\320\151
-\225\046\177\265
+\013\276\302\047\042\111\313\071\252\333\065\134\123\343\214\256
+\170\377\266\376
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\370\034\030\055\057\272\137\155\241\154\274\307\253\221\307\016
+\116\156\233\124\114\312\267\372\110\344\220\261\025\113\034\243
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\014\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\014\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\014\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\061\060\057\006\003\125\004
-\003\014\050\124\162\165\163\164\167\141\166\145\040\107\154\157
-\142\141\154\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171
+\060\121\061\013\060\011\006\003\125\004\006\023\002\105\123\061
+\102\060\100\006\003\125\004\003\014\071\101\165\164\157\162\151
+\144\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141
+\143\151\157\156\040\106\151\162\155\141\160\162\157\146\145\163
+\151\157\156\141\154\040\103\111\106\040\101\066\062\066\063\064
+\060\066\070
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\014\005\367\016\206\332\111\363\106\065\056\272\262
+\002\010\033\160\351\322\377\256\154\161
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
@@ -20537,435 +21567,554 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Trustwave Global ECC P256 Certification Authority"
+# Certificate "vTrus ECC Root CA"
 #
-# Issuer: CN=Trustwave Global ECC P256 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Serial Number:0d:6a:5f:08:3f:28:5c:3e:51:95:df:5d
-# Subject: CN=Trustwave Global ECC P256 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Not Valid Before: Wed Aug 23 19:35:10 2017
-# Not Valid After : Sat Aug 23 19:35:10 2042
-# Fingerprint (SHA-256): 94:5B:BC:82:5E:A5:54:F4:89:D1:FD:51:A7:3D:DF:2E:A6:24:AC:70:19:A0:52:05:22:5C:22:A7:8C:CF:A8:B4
-# Fingerprint (SHA1): B4:90:82:DD:45:0C:BE:8B:5B:B1:66:D3:E2:A4:08:26:CD:ED:42:CF
+# Issuer: CN=vTrus ECC Root CA,O="iTrusChina Co.,Ltd.",C=CN
+# Serial Number:6e:6a:bc:59:aa:53:be:98:39:67:a2:d2:6b:a4:3b:e6:6d:1c:d6:da
+# Subject: CN=vTrus ECC Root CA,O="iTrusChina Co.,Ltd.",C=CN
+# Not Valid Before: Tue Jul 31 07:26:44 2018
+# Not Valid After : Fri Jul 31 07:26:44 2043
+# Fingerprint (SHA-256): 30:FB:BA:2C:32:23:8E:2A:98:54:7A:F9:79:31:E5:50:42:8B:9B:3F:1C:8E:EB:66:33:DC:FA:86:C5:B2:7D:D3
+# Fingerprint (SHA1): F6:9C:DB:B0:FC:F6:02:13:B6:52:32:A6:A3:91:3F:16:70:DA:C3:E1
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Trustwave Global ECC P256 Certification Authority"
+CKA_LABEL UTF8 "vTrus ECC Root CA"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
-\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
-\142\141\154\040\105\103\103\040\120\062\065\066\040\103\145\162
-\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
-\162\151\164\171
+\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103
+\150\151\156\141\040\103\157\056\054\114\164\144\056\061\032\060
+\030\006\003\125\004\003\023\021\166\124\162\165\163\040\105\103
+\103\040\122\157\157\164\040\103\101
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
-\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
-\142\141\154\040\105\103\103\040\120\062\065\066\040\103\145\162
-\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
-\162\151\164\171
+\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103
+\150\151\156\141\040\103\157\056\054\114\164\144\056\061\032\060
+\030\006\003\125\004\003\023\021\166\124\162\165\163\040\105\103
+\103\040\122\157\157\164\040\103\101
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\014\015\152\137\010\077\050\134\076\121\225\337\135
+\002\024\156\152\274\131\252\123\276\230\071\147\242\322\153\244
+\073\346\155\034\326\332
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\140\060\202\002\007\240\003\002\001\002\002\014\015
-\152\137\010\077\050\134\076\121\225\337\135\060\012\006\010\052
-\206\110\316\075\004\003\002\060\201\221\061\013\060\011\006\003
-\125\004\006\023\002\125\123\061\021\060\017\006\003\125\004\010
-\023\010\111\154\154\151\156\157\151\163\061\020\060\016\006\003
-\125\004\007\023\007\103\150\151\143\141\147\157\061\041\060\037
-\006\003\125\004\012\023\030\124\162\165\163\164\167\141\166\145
-\040\110\157\154\144\151\156\147\163\054\040\111\156\143\056\061
-\072\060\070\006\003\125\004\003\023\061\124\162\165\163\164\167
-\141\166\145\040\107\154\157\142\141\154\040\105\103\103\040\120
-\062\065\066\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171\060\036\027\015\061
-\067\060\070\062\063\061\071\063\065\061\060\132\027\015\064\062
-\060\070\062\063\061\071\063\065\061\060\132\060\201\221\061\013
-\060\011\006\003\125\004\006\023\002\125\123\061\021\060\017\006
-\003\125\004\010\023\010\111\154\154\151\156\157\151\163\061\020
-\060\016\006\003\125\004\007\023\007\103\150\151\143\141\147\157
-\061\041\060\037\006\003\125\004\012\023\030\124\162\165\163\164
-\167\141\166\145\040\110\157\154\144\151\156\147\163\054\040\111
-\156\143\056\061\072\060\070\006\003\125\004\003\023\061\124\162
-\165\163\164\167\141\166\145\040\107\154\157\142\141\154\040\105
-\103\103\040\120\062\065\066\040\103\145\162\164\151\146\151\143
-\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171\060
-\131\060\023\006\007\052\206\110\316\075\002\001\006\010\052\206
-\110\316\075\003\001\007\003\102\000\004\176\373\154\346\043\343
-\163\062\010\312\140\346\123\234\272\164\215\030\260\170\220\122
-\200\335\070\300\112\035\321\250\314\223\244\227\006\070\312\015
-\025\142\306\216\001\052\145\235\252\337\064\221\056\201\301\344
-\063\222\061\304\375\011\072\246\077\255\243\103\060\101\060\017
-\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060
-\017\006\003\125\035\017\001\001\377\004\005\003\003\007\006\000
-\060\035\006\003\125\035\016\004\026\004\024\243\101\006\254\220
-\155\321\112\353\165\245\112\020\231\263\261\241\213\112\367\060
-\012\006\010\052\206\110\316\075\004\003\002\003\107\000\060\104
-\002\040\007\346\124\332\016\240\132\262\256\021\237\207\305\266
-\377\151\336\045\276\370\240\267\010\363\104\316\052\337\010\041
-\014\067\002\040\055\046\003\240\005\275\153\321\366\134\370\145
-\314\206\155\263\234\064\110\143\204\011\305\215\167\032\342\314
-\234\341\164\173
+\060\202\002\017\060\202\001\225\240\003\002\001\002\002\024\156
+\152\274\131\252\123\276\230\071\147\242\322\153\244\073\346\155
+\034\326\332\060\012\006\010\052\206\110\316\075\004\003\003\060
+\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061\034
+\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103\150
+\151\156\141\040\103\157\056\054\114\164\144\056\061\032\060\030
+\006\003\125\004\003\023\021\166\124\162\165\163\040\105\103\103
+\040\122\157\157\164\040\103\101\060\036\027\015\061\070\060\067
+\063\061\060\067\062\066\064\064\132\027\015\064\063\060\067\063
+\061\060\067\062\066\064\064\132\060\107\061\013\060\011\006\003
+\125\004\006\023\002\103\116\061\034\060\032\006\003\125\004\012
+\023\023\151\124\162\165\163\103\150\151\156\141\040\103\157\056
+\054\114\164\144\056\061\032\060\030\006\003\125\004\003\023\021
+\166\124\162\165\163\040\105\103\103\040\122\157\157\164\040\103
+\101\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005
+\053\201\004\000\042\003\142\000\004\145\120\112\256\214\171\226
+\112\252\034\010\303\243\242\315\376\131\126\101\167\375\046\224
+\102\273\035\315\010\333\163\262\133\165\363\317\234\116\202\364
+\277\370\141\046\205\154\326\205\133\162\160\322\375\333\142\264
+\337\123\213\275\261\104\130\142\102\011\307\372\177\133\020\347
+\376\100\375\300\330\303\053\062\347\160\246\267\246\040\125\035
+\173\200\135\113\217\147\114\361\020\243\102\060\100\060\035\006
+\003\125\035\016\004\026\004\024\230\071\315\276\330\262\214\367
+\262\253\341\255\044\257\173\174\241\333\037\317\060\017\006\003
+\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006
+\003\125\035\017\001\001\377\004\004\003\002\001\006\060\012\006
+\010\052\206\110\316\075\004\003\003\003\150\000\060\145\002\060
+\127\235\335\126\361\307\343\351\270\111\120\153\233\151\303\157
+\354\303\175\045\344\127\225\023\100\233\122\323\073\363\100\031
+\274\046\307\055\006\236\265\173\066\237\365\045\324\143\153\000
+\002\061\000\351\323\306\236\126\232\052\314\241\332\077\310\146
+\053\323\130\234\040\205\372\253\221\212\160\160\021\070\140\144
+\013\142\011\221\130\000\371\115\373\064\150\332\011\255\041\006
+\030\224\316
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "Trustwave Global ECC P256 Certification Authority"
-# Issuer: CN=Trustwave Global ECC P256 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Serial Number:0d:6a:5f:08:3f:28:5c:3e:51:95:df:5d
-# Subject: CN=Trustwave Global ECC P256 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Not Valid Before: Wed Aug 23 19:35:10 2017
-# Not Valid After : Sat Aug 23 19:35:10 2042
-# Fingerprint (SHA-256): 94:5B:BC:82:5E:A5:54:F4:89:D1:FD:51:A7:3D:DF:2E:A6:24:AC:70:19:A0:52:05:22:5C:22:A7:8C:CF:A8:B4
-# Fingerprint (SHA1): B4:90:82:DD:45:0C:BE:8B:5B:B1:66:D3:E2:A4:08:26:CD:ED:42:CF
+# Trust for "vTrus ECC Root CA"
+# Issuer: CN=vTrus ECC Root CA,O="iTrusChina Co.,Ltd.",C=CN
+# Serial Number:6e:6a:bc:59:aa:53:be:98:39:67:a2:d2:6b:a4:3b:e6:6d:1c:d6:da
+# Subject: CN=vTrus ECC Root CA,O="iTrusChina Co.,Ltd.",C=CN
+# Not Valid Before: Tue Jul 31 07:26:44 2018
+# Not Valid After : Fri Jul 31 07:26:44 2043
+# Fingerprint (SHA-256): 30:FB:BA:2C:32:23:8E:2A:98:54:7A:F9:79:31:E5:50:42:8B:9B:3F:1C:8E:EB:66:33:DC:FA:86:C5:B2:7D:D3
+# Fingerprint (SHA1): F6:9C:DB:B0:FC:F6:02:13:B6:52:32:A6:A3:91:3F:16:70:DA:C3:E1
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Trustwave Global ECC P256 Certification Authority"
+CKA_LABEL UTF8 "vTrus ECC Root CA"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\264\220\202\335\105\014\276\213\133\261\146\323\342\244\010\046
-\315\355\102\317
+\366\234\333\260\374\366\002\023\266\122\062\246\243\221\077\026
+\160\332\303\341
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\133\104\343\215\135\066\206\046\350\015\005\322\131\247\203\124
+\336\113\301\365\122\214\233\103\341\076\217\125\124\027\215\205
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
-\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
-\142\141\154\040\105\103\103\040\120\062\065\066\040\103\145\162
-\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
-\162\151\164\171
+\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103
+\150\151\156\141\040\103\157\056\054\114\164\144\056\061\032\060
+\030\006\003\125\004\003\023\021\166\124\162\165\163\040\105\103
+\103\040\122\157\157\164\040\103\101
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\014\015\152\137\010\077\050\134\076\121\225\337\135
+\002\024\156\152\274\131\252\123\276\230\071\147\242\322\153\244
+\073\346\155\034\326\332
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Trustwave Global ECC P384 Certification Authority"
+# Certificate "vTrus Root CA"
 #
-# Issuer: CN=Trustwave Global ECC P384 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Serial Number:08:bd:85:97:6c:99:27:a4:80:68:47:3b
-# Subject: CN=Trustwave Global ECC P384 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Not Valid Before: Wed Aug 23 19:36:43 2017
-# Not Valid After : Sat Aug 23 19:36:43 2042
-# Fingerprint (SHA-256): 55:90:38:59:C8:C0:C3:EB:B8:75:9E:CE:4E:25:57:22:5F:F5:75:8B:BD:38:EB:D4:82:76:60:1E:1B:D5:80:97
-# Fingerprint (SHA1): E7:F3:A3:C8:CF:6F:C3:04:2E:6D:0E:67:32:C5:9E:68:95:0D:5E:D2
+# Issuer: CN=vTrus Root CA,O="iTrusChina Co.,Ltd.",C=CN
+# Serial Number:43:e3:71:13:d8:b3:59:14:5d:b7:ce:8c:fd:35:fd:6f:bc:05:8d:45
+# Subject: CN=vTrus Root CA,O="iTrusChina Co.,Ltd.",C=CN
+# Not Valid Before: Tue Jul 31 07:24:05 2018
+# Not Valid After : Fri Jul 31 07:24:05 2043
+# Fingerprint (SHA-256): 8A:71:DE:65:59:33:6F:42:6C:26:E5:38:80:D0:0D:88:A1:8D:A4:C6:A9:1F:0D:CB:61:94:E2:06:C5:C9:63:87
+# Fingerprint (SHA1): 84:1A:69:FB:F5:CD:1A:25:34:13:3D:E3:F8:FC:B8:99:D0:C9:14:B7
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Trustwave Global ECC P384 Certification Authority"
+CKA_LABEL UTF8 "vTrus Root CA"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
-\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
-\142\141\154\040\105\103\103\040\120\063\070\064\040\103\145\162
-\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
-\162\151\164\171
+\060\103\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103
+\150\151\156\141\040\103\157\056\054\114\164\144\056\061\026\060
+\024\006\003\125\004\003\023\015\166\124\162\165\163\040\122\157
+\157\164\040\103\101
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
-\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
-\142\141\154\040\105\103\103\040\120\063\070\064\040\103\145\162
-\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
-\162\151\164\171
+\060\103\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103
+\150\151\156\141\040\103\157\056\054\114\164\144\056\061\026\060
+\024\006\003\125\004\003\023\015\166\124\162\165\163\040\122\157
+\157\164\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\024\103\343\161\023\330\263\131\024\135\267\316\214\375\065
+\375\157\274\005\215\105
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\126\060\202\003\076\240\003\002\001\002\002\024\103
+\343\161\023\330\263\131\024\135\267\316\214\375\065\375\157\274
+\005\215\105\060\015\006\011\052\206\110\206\367\015\001\001\013
+\005\000\060\103\061\013\060\011\006\003\125\004\006\023\002\103
+\116\061\034\060\032\006\003\125\004\012\023\023\151\124\162\165
+\163\103\150\151\156\141\040\103\157\056\054\114\164\144\056\061
+\026\060\024\006\003\125\004\003\023\015\166\124\162\165\163\040
+\122\157\157\164\040\103\101\060\036\027\015\061\070\060\067\063
+\061\060\067\062\064\060\065\132\027\015\064\063\060\067\063\061
+\060\067\062\064\060\065\132\060\103\061\013\060\011\006\003\125
+\004\006\023\002\103\116\061\034\060\032\006\003\125\004\012\023
+\023\151\124\162\165\163\103\150\151\156\141\040\103\157\056\054
+\114\164\144\056\061\026\060\024\006\003\125\004\003\023\015\166
+\124\162\165\163\040\122\157\157\164\040\103\101\060\202\002\042
+\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003
+\202\002\017\000\060\202\002\012\002\202\002\001\000\275\125\174
+\141\323\270\035\004\142\005\240\256\154\267\160\264\101\352\113
+\003\136\020\077\220\132\034\213\073\260\146\213\154\110\246\034
+\042\272\325\100\222\356\063\262\043\131\311\216\274\130\332\213
+\236\320\031\362\057\131\306\214\143\132\272\237\243\013\260\263
+\232\134\272\021\270\022\351\014\273\317\156\154\200\207\051\024
+\003\054\215\044\232\310\144\203\265\152\254\023\054\063\361\237
+\334\054\141\074\032\077\160\125\233\255\000\122\177\317\004\271
+\376\066\372\234\300\026\256\142\376\226\114\103\176\125\024\276
+\032\263\322\155\302\257\166\146\225\153\052\260\224\167\205\136
+\004\017\142\035\143\165\367\153\347\313\133\232\160\354\076\147
+\005\360\376\007\010\200\317\050\333\005\306\024\047\057\206\175
+\360\047\336\377\346\176\063\110\347\013\036\130\321\047\053\123
+\016\127\112\145\327\373\242\200\140\374\114\274\065\123\001\152
+\227\162\202\257\361\035\160\350\234\365\357\136\302\154\307\107
+\176\132\224\205\046\115\073\272\353\114\350\260\011\302\145\302
+\235\235\011\233\116\265\227\005\254\365\006\240\367\066\005\176
+\364\220\262\153\304\264\371\144\352\351\032\012\310\015\250\355
+\047\311\324\347\263\271\253\202\042\220\047\075\052\350\174\220
+\357\274\117\375\342\012\044\247\336\145\044\244\135\352\300\166
+\060\323\167\120\370\015\004\233\224\066\001\163\312\006\130\246
+\323\073\334\372\004\106\023\125\212\311\104\107\270\121\071\032
+\056\350\064\342\171\313\131\112\012\177\274\246\357\037\003\147
+\152\131\053\045\142\223\331\123\031\146\074\047\142\051\206\115
+\244\153\356\377\324\116\272\325\264\342\216\110\132\000\031\011
+\361\005\331\316\221\261\367\353\351\071\117\366\157\004\103\232
+\125\365\076\005\024\275\277\263\131\264\330\216\063\204\243\220
+\122\252\263\002\225\140\371\014\114\150\371\356\325\027\015\370
+\161\127\265\045\344\051\356\145\135\257\321\356\074\027\013\132
+\103\305\245\206\352\044\236\342\005\007\334\064\102\022\221\326
+\071\164\256\114\101\202\333\362\246\110\321\263\233\363\063\252
+\363\246\300\305\116\365\364\235\166\143\346\002\306\042\113\301
+\225\077\120\144\054\124\345\266\360\074\051\317\127\002\003\001
+\000\001\243\102\060\100\060\035\006\003\125\035\016\004\026\004
+\024\124\142\160\143\361\165\204\103\130\216\321\026\040\261\306
+\254\032\274\366\211\060\017\006\003\125\035\023\001\001\377\004
+\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001\377
+\004\004\003\002\001\006\060\015\006\011\052\206\110\206\367\015
+\001\001\013\005\000\003\202\002\001\000\051\272\222\111\247\255
+\360\361\160\303\344\227\360\237\251\045\325\153\236\064\376\346
+\032\144\366\072\153\122\262\020\170\032\237\114\332\212\332\354
+\034\067\122\340\102\113\373\154\166\312\044\013\071\022\025\235
+\237\021\055\374\171\144\334\340\340\365\335\340\127\311\245\262
+\166\160\120\244\376\267\012\160\325\240\064\361\165\327\115\111
+\272\021\321\263\330\354\202\377\353\016\304\277\144\055\175\143
+\156\027\170\354\135\174\210\310\353\216\127\166\331\131\004\372
+\274\122\037\105\254\360\172\200\354\354\157\166\256\221\333\020
+\216\004\334\222\337\240\366\346\256\111\323\301\154\022\033\314
+\051\252\371\010\245\342\067\024\312\261\270\146\357\032\202\344
+\360\370\361\247\026\151\267\333\251\141\074\237\365\061\313\344
+\000\106\302\057\164\261\261\327\201\356\250\046\225\274\210\257
+\114\065\007\052\002\312\170\024\155\107\053\100\126\351\313\052
+\140\241\147\003\240\316\214\274\260\162\147\304\061\316\333\064
+\345\045\003\140\045\173\161\230\344\300\033\053\137\164\102\322
+\113\305\131\010\007\207\276\305\303\177\347\226\331\341\334\050
+\227\326\217\005\343\365\233\116\312\035\120\107\005\123\260\312
+\071\347\205\240\211\301\005\073\001\067\323\077\111\342\167\353
+\043\310\210\146\073\075\071\166\041\106\361\354\137\043\270\353
+\242\146\165\164\301\100\367\330\150\232\223\342\055\251\056\275
+\034\243\036\310\164\306\244\055\172\040\253\073\270\260\106\375
+\157\335\137\122\125\165\142\360\227\240\174\327\070\375\045\337
+\315\240\233\020\317\213\270\070\136\136\305\264\246\002\066\241
+\036\137\034\317\342\226\235\051\252\375\230\256\122\341\363\101
+\122\373\251\056\162\226\237\047\343\252\163\175\370\032\043\146
+\173\073\253\145\260\062\001\113\025\076\075\242\117\014\053\065
+\242\306\331\147\022\065\060\315\166\056\026\263\231\236\115\117
+\116\055\073\064\103\341\232\016\015\244\146\227\272\322\034\112
+\114\054\052\213\213\201\117\161\032\251\335\134\173\173\010\305
+\000\015\067\100\343\174\173\124\137\057\205\137\166\366\367\247
+\260\034\127\126\301\162\350\255\242\257\215\063\111\272\037\212
+\334\346\164\174\140\206\157\207\227\173
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "vTrus Root CA"
+# Issuer: CN=vTrus Root CA,O="iTrusChina Co.,Ltd.",C=CN
+# Serial Number:43:e3:71:13:d8:b3:59:14:5d:b7:ce:8c:fd:35:fd:6f:bc:05:8d:45
+# Subject: CN=vTrus Root CA,O="iTrusChina Co.,Ltd.",C=CN
+# Not Valid Before: Tue Jul 31 07:24:05 2018
+# Not Valid After : Fri Jul 31 07:24:05 2043
+# Fingerprint (SHA-256): 8A:71:DE:65:59:33:6F:42:6C:26:E5:38:80:D0:0D:88:A1:8D:A4:C6:A9:1F:0D:CB:61:94:E2:06:C5:C9:63:87
+# Fingerprint (SHA1): 84:1A:69:FB:F5:CD:1A:25:34:13:3D:E3:F8:FC:B8:99:D0:C9:14:B7
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "vTrus Root CA"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\204\032\151\373\365\315\032\045\064\023\075\343\370\374\270\231
+\320\311\024\267
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\270\311\067\337\372\153\061\204\144\305\352\021\152\033\165\374
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\103\061\013\060\011\006\003\125\004\006\023\002\103\116\061
+\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103
+\150\151\156\141\040\103\157\056\054\114\164\144\056\061\026\060
+\024\006\003\125\004\003\023\015\166\124\162\165\163\040\122\157
+\157\164\040\103\101
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\024\103\343\161\023\330\263\131\024\135\267\316\214\375\065
+\375\157\274\005\215\105
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "ISRG Root X2"
+#
+# Issuer: CN=ISRG Root X2,O=Internet Security Research Group,C=US
+# Serial Number:41:d2:9d:d1:72:ea:ee:a7:80:c1:2c:6c:e9:2f:87:52
+# Subject: CN=ISRG Root X2,O=Internet Security Research Group,C=US
+# Not Valid Before: Fri Sep 04 00:00:00 2020
+# Not Valid After : Mon Sep 17 16:00:00 2040
+# Fingerprint (SHA-256): 69:72:9B:8E:15:A8:6E:FC:17:7A:57:AF:B7:17:1D:FC:64:AD:D2:8C:2F:CA:8C:F1:50:7E:34:45:3C:CB:14:70
+# Fingerprint (SHA1): BD:B1:B9:3C:D5:97:8D:45:C6:26:14:55:F8:DB:95:C7:5A:D1:53:AF
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "ISRG Root X2"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156
+\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145
+\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003
+\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130
+\062
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156
+\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145
+\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003
+\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130
+\062
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\014\010\275\205\227\154\231\047\244\200\150\107\073
+\002\020\101\322\235\321\162\352\356\247\200\301\054\154\351\057
+\207\122
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\235\060\202\002\044\240\003\002\001\002\002\014\010
-\275\205\227\154\231\047\244\200\150\107\073\060\012\006\010\052
-\206\110\316\075\004\003\003\060\201\221\061\013\060\011\006\003
-\125\004\006\023\002\125\123\061\021\060\017\006\003\125\004\010
-\023\010\111\154\154\151\156\157\151\163\061\020\060\016\006\003
-\125\004\007\023\007\103\150\151\143\141\147\157\061\041\060\037
-\006\003\125\004\012\023\030\124\162\165\163\164\167\141\166\145
-\040\110\157\154\144\151\156\147\163\054\040\111\156\143\056\061
-\072\060\070\006\003\125\004\003\023\061\124\162\165\163\164\167
-\141\166\145\040\107\154\157\142\141\154\040\105\103\103\040\120
-\063\070\064\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171\060\036\027\015\061
-\067\060\070\062\063\061\071\063\066\064\063\132\027\015\064\062
-\060\070\062\063\061\071\063\066\064\063\132\060\201\221\061\013
-\060\011\006\003\125\004\006\023\002\125\123\061\021\060\017\006
-\003\125\004\010\023\010\111\154\154\151\156\157\151\163\061\020
-\060\016\006\003\125\004\007\023\007\103\150\151\143\141\147\157
-\061\041\060\037\006\003\125\004\012\023\030\124\162\165\163\164
-\167\141\166\145\040\110\157\154\144\151\156\147\163\054\040\111
-\156\143\056\061\072\060\070\006\003\125\004\003\023\061\124\162
-\165\163\164\167\141\166\145\040\107\154\157\142\141\154\040\105
-\103\103\040\120\063\070\064\040\103\145\162\164\151\146\151\143
-\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171\060
-\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201
-\004\000\042\003\142\000\004\153\332\015\165\065\010\061\107\005
-\256\105\231\125\361\021\023\056\112\370\020\061\043\243\176\203
-\323\177\050\010\072\046\032\072\317\227\202\037\200\267\047\011
-\217\321\216\060\304\012\233\016\254\130\004\253\367\066\175\224
-\043\244\233\012\212\213\253\353\375\071\045\146\361\136\376\214
-\256\215\101\171\235\011\140\316\050\251\323\212\155\363\326\105
-\324\362\230\204\070\145\240\243\103\060\101\060\017\006\003\125
-\035\023\001\001\377\004\005\060\003\001\001\377\060\017\006\003
-\125\035\017\001\001\377\004\005\003\003\007\006\000\060\035\006
-\003\125\035\016\004\026\004\024\125\251\204\211\322\301\062\275
-\030\313\154\246\007\116\310\347\235\276\202\220\060\012\006\010
-\052\206\110\316\075\004\003\003\003\147\000\060\144\002\060\067
-\001\222\227\105\022\176\240\363\076\255\031\072\162\335\364\120
-\223\003\022\276\104\322\117\101\244\214\234\235\037\243\366\302
-\222\347\110\024\376\116\233\245\221\127\256\306\067\162\273\002
-\060\147\045\012\261\014\136\356\251\143\222\157\345\220\013\376
-\146\042\312\107\375\212\061\367\203\376\172\277\020\276\030\053
-\036\217\366\051\036\224\131\357\216\041\067\313\121\230\245\156
-\113
+\060\202\002\033\060\202\001\241\240\003\002\001\002\002\020\101
+\322\235\321\162\352\356\247\200\301\054\154\351\057\207\122\060
+\012\006\010\052\206\110\316\075\004\003\003\060\117\061\013\060
+\011\006\003\125\004\006\023\002\125\123\061\051\060\047\006\003
+\125\004\012\023\040\111\156\164\145\162\156\145\164\040\123\145
+\143\165\162\151\164\171\040\122\145\163\145\141\162\143\150\040
+\107\162\157\165\160\061\025\060\023\006\003\125\004\003\023\014
+\111\123\122\107\040\122\157\157\164\040\130\062\060\036\027\015
+\062\060\060\071\060\064\060\060\060\060\060\060\132\027\015\064
+\060\060\071\061\067\061\066\060\060\060\060\132\060\117\061\013
+\060\011\006\003\125\004\006\023\002\125\123\061\051\060\047\006
+\003\125\004\012\023\040\111\156\164\145\162\156\145\164\040\123
+\145\143\165\162\151\164\171\040\122\145\163\145\141\162\143\150
+\040\107\162\157\165\160\061\025\060\023\006\003\125\004\003\023
+\014\111\123\122\107\040\122\157\157\164\040\130\062\060\166\060
+\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000
+\042\003\142\000\004\315\233\325\237\200\203\012\354\011\112\363
+\026\112\076\134\317\167\254\336\147\005\015\035\007\266\334\026
+\373\132\213\024\333\342\161\140\304\272\105\225\021\211\216\352
+\006\337\367\052\026\034\244\271\305\305\062\340\003\340\036\202
+\030\070\213\327\105\330\012\152\156\346\000\167\373\002\121\175
+\042\330\012\156\232\133\167\337\360\372\101\354\071\334\165\312
+\150\007\014\037\352\243\102\060\100\060\016\006\003\125\035\017
+\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023
+\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035
+\016\004\026\004\024\174\102\226\256\336\113\110\073\372\222\370
+\236\214\317\155\213\251\162\067\225\060\012\006\010\052\206\110
+\316\075\004\003\003\003\150\000\060\145\002\060\173\171\116\106
+\120\204\302\104\207\106\033\105\160\377\130\231\336\364\375\244
+\322\125\246\040\055\164\326\064\274\101\243\120\137\001\047\126
+\264\276\047\165\006\257\022\056\165\230\215\374\002\061\000\213
+\365\167\154\324\310\145\252\340\013\054\356\024\235\047\067\244
+\371\123\245\121\344\051\203\327\370\220\061\133\102\237\012\365
+\376\256\000\150\347\214\111\017\266\157\133\133\025\362\347
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "Trustwave Global ECC P384 Certification Authority"
-# Issuer: CN=Trustwave Global ECC P384 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Serial Number:08:bd:85:97:6c:99:27:a4:80:68:47:3b
-# Subject: CN=Trustwave Global ECC P384 Certification Authority,O="Trustwave Holdings, Inc.",L=Chicago,ST=Illinois,C=US
-# Not Valid Before: Wed Aug 23 19:36:43 2017
-# Not Valid After : Sat Aug 23 19:36:43 2042
-# Fingerprint (SHA-256): 55:90:38:59:C8:C0:C3:EB:B8:75:9E:CE:4E:25:57:22:5F:F5:75:8B:BD:38:EB:D4:82:76:60:1E:1B:D5:80:97
-# Fingerprint (SHA1): E7:F3:A3:C8:CF:6F:C3:04:2E:6D:0E:67:32:C5:9E:68:95:0D:5E:D2
+# Trust for "ISRG Root X2"
+# Issuer: CN=ISRG Root X2,O=Internet Security Research Group,C=US
+# Serial Number:41:d2:9d:d1:72:ea:ee:a7:80:c1:2c:6c:e9:2f:87:52
+# Subject: CN=ISRG Root X2,O=Internet Security Research Group,C=US
+# Not Valid Before: Fri Sep 04 00:00:00 2020
+# Not Valid After : Mon Sep 17 16:00:00 2040
+# Fingerprint (SHA-256): 69:72:9B:8E:15:A8:6E:FC:17:7A:57:AF:B7:17:1D:FC:64:AD:D2:8C:2F:CA:8C:F1:50:7E:34:45:3C:CB:14:70
+# Fingerprint (SHA1): BD:B1:B9:3C:D5:97:8D:45:C6:26:14:55:F8:DB:95:C7:5A:D1:53:AF
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Trustwave Global ECC P384 Certification Authority"
+CKA_LABEL UTF8 "ISRG Root X2"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\347\363\243\310\317\157\303\004\056\155\016\147\062\305\236\150
-\225\015\136\322
+\275\261\271\074\325\227\215\105\306\046\024\125\370\333\225\307
+\132\321\123\257
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\352\317\140\304\073\271\025\051\100\241\227\355\170\047\223\326
+\323\236\304\036\043\074\246\337\317\243\176\155\340\024\346\345
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\221\061\013\060\011\006\003\125\004\006\023\002\125\123
-\061\021\060\017\006\003\125\004\010\023\010\111\154\154\151\156
-\157\151\163\061\020\060\016\006\003\125\004\007\023\007\103\150
-\151\143\141\147\157\061\041\060\037\006\003\125\004\012\023\030
-\124\162\165\163\164\167\141\166\145\040\110\157\154\144\151\156
-\147\163\054\040\111\156\143\056\061\072\060\070\006\003\125\004
-\003\023\061\124\162\165\163\164\167\141\166\145\040\107\154\157
-\142\141\154\040\105\103\103\040\120\063\070\064\040\103\145\162
-\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157
-\162\151\164\171
+\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156
+\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145
+\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003
+\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130
+\062
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\014\010\275\205\227\154\231\047\244\200\150\107\073
+\002\020\101\322\235\321\162\352\356\247\200\301\054\154\351\057
+\207\122
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "NAVER Global Root Certification Authority"
+# Certificate "HiPKI Root CA - G1"
 #
-# Issuer: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR
-# Serial Number:01:94:30:1e:a2:0b:dd:f5:c5:33:2a:b1:43:44:71:f8:d6:50:4d:0d
-# Subject: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR
-# Not Valid Before: Fri Aug 18 08:58:42 2017
-# Not Valid After : Tue Aug 18 23:59:59 2037
-# Fingerprint (SHA-256): 88:F4:38:DC:F8:FF:D1:FA:8F:42:91:15:FF:E5:F8:2A:E1:E0:6E:0C:70:C3:75:FA:AD:71:7B:34:A4:9E:72:65
-# Fingerprint (SHA1): 8F:6B:F2:A9:27:4A:DA:14:A0:C4:F4:8E:61:27:F9:C0:1E:78:5D:D1
+# Issuer: CN=HiPKI Root CA - G1,O="Chunghwa Telecom Co., Ltd.",C=TW
+# Serial Number:2d:dd:ac:ce:62:97:94:a1:43:e8:b0:cd:76:6a:5e:60
+# Subject: CN=HiPKI Root CA - G1,O="Chunghwa Telecom Co., Ltd.",C=TW
+# Not Valid Before: Fri Feb 22 09:46:04 2019
+# Not Valid After : Thu Dec 31 15:59:59 2037
+# Fingerprint (SHA-256): F0:15:CE:3C:C2:39:BF:EF:06:4B:E9:F1:D2:C4:17:E1:A0:26:4A:0A:94:BE:1F:0C:8D:12:18:64:EB:69:49:CC
+# Fingerprint (SHA1): 6A:92:E4:A8:EE:1B:EC:96:45:37:E3:29:57:49:CD:96:E3:E5:D2:60
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "NAVER Global Root Certification Authority"
+CKA_LABEL UTF8 "HiPKI Root CA - G1"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\151\061\013\060\011\006\003\125\004\006\023\002\113\122\061
-\046\060\044\006\003\125\004\012\014\035\116\101\126\105\122\040
-\102\125\123\111\116\105\123\123\040\120\114\101\124\106\117\122
-\115\040\103\157\162\160\056\061\062\060\060\006\003\125\004\003
-\014\051\116\101\126\105\122\040\107\154\157\142\141\154\040\122
-\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171
+\060\117\061\013\060\011\006\003\125\004\006\023\002\124\127\061
+\043\060\041\006\003\125\004\012\014\032\103\150\165\156\147\150
+\167\141\040\124\145\154\145\143\157\155\040\103\157\056\054\040
+\114\164\144\056\061\033\060\031\006\003\125\004\003\014\022\110
+\151\120\113\111\040\122\157\157\164\040\103\101\040\055\040\107
+\061
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\151\061\013\060\011\006\003\125\004\006\023\002\113\122\061
-\046\060\044\006\003\125\004\012\014\035\116\101\126\105\122\040
-\102\125\123\111\116\105\123\123\040\120\114\101\124\106\117\122
-\115\040\103\157\162\160\056\061\062\060\060\006\003\125\004\003
-\014\051\116\101\126\105\122\040\107\154\157\142\141\154\040\122
-\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171
+\060\117\061\013\060\011\006\003\125\004\006\023\002\124\127\061
+\043\060\041\006\003\125\004\012\014\032\103\150\165\156\147\150
+\167\141\040\124\145\154\145\143\157\155\040\103\157\056\054\040
+\114\164\144\056\061\033\060\031\006\003\125\004\003\014\022\110
+\151\120\113\111\040\122\157\157\164\040\103\101\040\055\040\107
+\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\024\001\224\060\036\242\013\335\365\305\063\052\261\103\104
-\161\370\326\120\115\015
+\002\020\055\335\254\316\142\227\224\241\103\350\260\315\166\152
+\136\140
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\242\060\202\003\212\240\003\002\001\002\002\024\001
-\224\060\036\242\013\335\365\305\063\052\261\103\104\161\370\326
-\120\115\015\060\015\006\011\052\206\110\206\367\015\001\001\014
-\005\000\060\151\061\013\060\011\006\003\125\004\006\023\002\113
-\122\061\046\060\044\006\003\125\004\012\014\035\116\101\126\105
-\122\040\102\125\123\111\116\105\123\123\040\120\114\101\124\106
-\117\122\115\040\103\157\162\160\056\061\062\060\060\006\003\125
-\004\003\014\051\116\101\126\105\122\040\107\154\157\142\141\154
-\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164
-\151\157\156\040\101\165\164\150\157\162\151\164\171\060\036\027
-\015\061\067\060\070\061\070\060\070\065\070\064\062\132\027\015
-\063\067\060\070\061\070\062\063\065\071\065\071\132\060\151\061
-\013\060\011\006\003\125\004\006\023\002\113\122\061\046\060\044
-\006\003\125\004\012\014\035\116\101\126\105\122\040\102\125\123
-\111\116\105\123\123\040\120\114\101\124\106\117\122\115\040\103
-\157\162\160\056\061\062\060\060\006\003\125\004\003\014\051\116
-\101\126\105\122\040\107\154\157\142\141\154\040\122\157\157\164
-\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101
-\165\164\150\157\162\151\164\171\060\202\002\042\060\015\006\011
-\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000
-\060\202\002\012\002\202\002\001\000\266\324\361\223\134\265\100
-\211\012\253\015\220\133\120\143\256\220\224\164\027\105\162\326
-\173\145\132\051\113\247\126\240\113\270\057\102\165\351\331\173
-\044\132\061\145\253\027\027\321\063\072\331\021\334\100\066\207
-\337\307\152\351\046\136\131\212\167\343\350\110\234\061\026\372
-\076\221\261\312\311\243\342\237\316\041\123\243\002\066\060\313
-\122\002\345\332\062\135\303\305\346\371\356\021\307\213\311\104
-\036\204\223\030\112\264\237\345\022\144\151\320\046\205\142\001
-\266\311\002\035\276\203\121\273\134\332\370\255\025\152\231\367
-\222\124\367\064\133\351\277\352\051\201\022\324\123\221\226\263
-\221\132\335\376\220\163\050\373\060\106\265\312\010\007\307\161
-\162\311\146\323\064\227\366\214\364\030\112\341\320\075\132\105
-\266\151\247\051\373\043\316\210\330\022\234\000\110\250\246\017
-\263\073\222\215\161\016\164\305\213\310\114\371\364\233\216\270
-\074\151\355\157\073\120\057\130\355\304\260\320\034\033\152\014
-\342\274\104\252\330\315\024\135\224\170\141\277\016\156\332\052
-\274\057\014\013\161\246\263\026\077\234\346\371\314\237\123\065
-\342\003\240\240\030\277\273\361\276\364\326\214\207\015\102\367
-\006\271\361\155\355\004\224\250\376\266\323\006\306\100\141\337
-\235\235\363\124\166\316\123\072\001\246\222\101\354\004\243\217
-\015\242\325\011\312\326\313\232\361\357\103\135\300\253\245\101
-\317\134\123\160\160\311\210\246\055\324\153\141\163\120\046\206
-\141\016\137\033\302\053\342\214\325\273\235\301\003\102\272\224
-\332\137\251\260\312\314\115\012\357\107\151\003\057\042\373\361
-\050\316\277\135\120\145\250\220\155\263\164\260\010\307\254\250
-\321\353\076\234\374\135\032\203\056\053\313\265\363\104\235\072
-\247\027\141\226\242\161\323\160\226\025\115\267\114\163\356\031
-\134\305\133\076\101\376\254\165\140\073\033\143\316\000\335\332
-\010\220\142\264\345\055\356\110\247\153\027\231\124\276\207\112
-\343\251\136\004\114\353\020\155\124\326\357\361\350\362\142\026
-\313\200\153\355\075\355\365\037\060\245\256\113\311\023\355\212
-\001\001\311\270\121\130\300\146\072\261\146\113\304\325\061\002
-\142\351\164\204\014\333\115\106\055\002\003\001\000\001\243\102
-\060\100\060\035\006\003\125\035\016\004\026\004\024\322\237\210
-\337\241\315\054\275\354\365\073\001\001\223\063\047\262\353\140
-\113\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001
-\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001
-\001\377\060\015\006\011\052\206\110\206\367\015\001\001\014\005
-\000\003\202\002\001\000\062\312\200\263\235\075\124\006\335\322
-\322\056\360\244\001\041\013\147\110\312\155\216\340\310\252\015
-\252\215\041\127\217\306\076\172\312\333\121\324\122\263\324\226
-\204\245\130\140\177\345\013\216\037\365\334\012\025\201\345\073
-\266\267\042\057\011\234\023\026\261\154\014\065\010\155\253\143
-\162\355\334\276\354\307\127\346\060\040\161\326\327\020\301\023
-\125\001\214\052\103\344\101\361\317\072\172\123\222\316\242\003
-\005\015\070\337\002\273\020\056\331\073\322\233\172\300\241\246
-\370\265\061\346\364\165\311\271\123\231\165\107\042\132\024\025
-\307\170\033\266\235\351\014\370\033\166\361\205\204\336\241\332
-\022\357\244\342\020\227\172\170\336\014\121\227\250\041\100\213
-\206\275\015\360\136\116\113\066\273\073\040\037\212\102\126\341
-\013\032\277\173\320\042\103\054\104\214\373\345\052\264\154\034
-\034\272\224\340\023\176\041\346\232\302\313\305\102\144\264\036
-\224\173\010\045\310\161\314\207\105\127\205\323\237\051\142\042
-\203\121\227\000\030\227\167\152\230\222\311\174\140\154\337\154
-\175\112\344\160\114\302\236\270\035\367\320\064\307\017\314\373
-\247\377\003\276\255\160\220\332\013\335\310\155\227\137\232\177
-\011\062\101\375\315\242\314\132\155\114\362\252\111\376\146\370
-\351\330\065\353\016\050\036\356\110\057\072\320\171\011\070\174
-\246\042\202\223\225\320\003\276\276\002\240\005\335\040\042\343
-\157\035\210\064\140\306\346\012\271\011\165\013\360\007\350\151
-\226\065\307\373\043\201\216\070\071\270\105\053\103\170\242\321
-\054\024\377\015\050\162\162\225\233\136\011\333\211\104\230\252
-\241\111\273\161\122\362\277\366\377\047\241\066\257\270\266\167
-\210\335\072\244\155\233\064\220\334\024\135\060\277\267\353\027
-\344\207\267\161\320\241\327\167\025\324\102\327\362\363\061\231
-\135\233\335\026\155\077\352\006\043\370\106\242\042\355\223\366
-\335\232\346\052\207\261\230\124\361\042\367\153\105\343\342\216
-\166\035\232\215\304\006\215\066\267\024\363\235\124\151\267\216
-\074\325\244\155\223\201\267\255\366\275\144\173\302\311\150\071
-\240\222\234\315\064\206\221\220\372\144\121\235\376\376\353\245
-\365\165\336\211\367\162
+\060\202\005\152\060\202\003\122\240\003\002\001\002\002\020\055
+\335\254\316\142\227\224\241\103\350\260\315\166\152\136\140\060
+\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\117
+\061\013\060\011\006\003\125\004\006\023\002\124\127\061\043\060
+\041\006\003\125\004\012\014\032\103\150\165\156\147\150\167\141
+\040\124\145\154\145\143\157\155\040\103\157\056\054\040\114\164
+\144\056\061\033\060\031\006\003\125\004\003\014\022\110\151\120
+\113\111\040\122\157\157\164\040\103\101\040\055\040\107\061\060
+\036\027\015\061\071\060\062\062\062\060\071\064\066\060\064\132
+\027\015\063\067\061\062\063\061\061\065\065\071\065\071\132\060
+\117\061\013\060\011\006\003\125\004\006\023\002\124\127\061\043
+\060\041\006\003\125\004\012\014\032\103\150\165\156\147\150\167
+\141\040\124\145\154\145\143\157\155\040\103\157\056\054\040\114
+\164\144\056\061\033\060\031\006\003\125\004\003\014\022\110\151
+\120\113\111\040\122\157\157\164\040\103\101\040\055\040\107\061
+\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
+\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
+\000\364\036\177\122\163\062\014\163\344\275\023\164\243\324\060
+\250\320\256\113\330\266\337\165\107\146\364\174\347\071\004\036
+\152\160\040\322\132\107\162\147\125\364\245\350\235\325\036\041
+\241\360\147\272\314\041\150\276\104\123\277\215\371\342\334\057
+\125\310\067\077\037\244\300\234\263\344\167\134\240\106\376\167
+\372\032\240\070\352\355\232\162\336\053\275\224\127\072\272\354
+\171\347\137\175\102\144\071\172\046\066\367\044\360\325\057\272
+\225\230\021\146\255\227\065\326\165\001\200\340\257\364\204\141
+\214\015\036\137\174\207\226\136\101\257\353\207\352\370\135\361
+\056\210\005\076\114\042\273\332\037\052\335\122\106\144\071\363
+\102\316\331\236\014\263\260\167\227\144\234\300\364\243\056\037
+\225\007\260\027\337\060\333\000\030\226\114\241\201\113\335\004
+\155\123\243\075\374\007\254\324\305\067\202\353\344\225\010\031
+\050\202\322\102\072\243\330\123\354\171\211\140\110\140\310\162
+\222\120\334\003\217\203\077\262\102\127\132\333\152\351\021\227
+\335\205\050\274\060\114\253\343\302\261\105\104\107\037\340\212
+\026\007\226\322\041\017\123\300\355\251\176\324\116\354\233\011
+\354\257\102\254\060\326\277\321\020\105\340\246\026\262\245\305
+\323\117\163\224\063\161\002\241\152\243\326\063\227\117\041\143
+\036\133\217\331\301\136\105\161\167\017\201\135\137\041\232\255
+\203\314\372\136\326\215\043\137\033\075\101\257\040\165\146\132
+\112\366\237\373\253\030\367\161\300\266\035\061\354\073\040\353
+\313\342\270\365\256\222\262\367\341\204\113\362\242\362\223\232
+\042\236\323\024\157\066\124\275\037\136\131\025\271\163\250\301
+\174\157\173\142\351\026\154\107\132\145\363\016\021\233\106\331
+\375\155\334\326\234\300\264\175\245\260\335\077\126\157\241\371
+\366\344\022\110\375\006\177\022\127\266\251\043\117\133\003\303
+\340\161\052\043\267\367\260\261\073\274\230\275\326\230\250\014
+\153\366\216\022\147\246\362\262\130\344\002\011\023\074\251\273
+\020\264\322\060\105\361\354\367\000\021\337\145\370\334\053\103
+\125\277\026\227\304\017\325\054\141\204\252\162\206\376\346\072
+\176\302\077\175\356\374\057\024\076\346\205\335\120\157\267\111
+\355\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035
+\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125
+\035\016\004\026\004\024\362\167\027\372\136\250\376\366\075\161
+\325\150\272\311\106\014\070\330\257\260\060\016\006\003\125\035
+\017\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206
+\110\206\367\015\001\001\013\005\000\003\202\002\001\000\120\121
+\360\165\334\160\004\343\377\252\165\324\161\242\313\236\217\250
+\251\323\257\165\307\124\317\072\034\004\231\042\254\304\021\342
+\357\063\112\246\043\035\016\015\107\330\067\307\157\257\064\177
+\117\201\153\065\117\351\162\245\061\342\170\347\367\116\224\030
+\133\100\175\317\153\041\124\206\346\225\172\373\306\312\352\234
+\110\116\127\011\135\057\254\364\245\264\227\063\130\325\254\171
+\251\314\137\371\205\372\122\305\215\370\221\024\353\072\015\027
+\320\122\302\173\343\302\163\216\106\170\006\070\054\350\134\332
+\146\304\364\244\360\126\031\063\051\132\145\222\005\107\106\112
+\253\204\303\036\047\241\037\021\222\231\047\165\223\017\274\066
+\073\227\127\217\046\133\014\273\234\017\324\156\060\007\324\334
+\137\066\150\146\071\203\226\047\046\212\310\304\071\376\232\041
+\157\325\162\206\351\177\142\345\227\116\320\044\320\100\260\320
+\165\010\216\275\150\356\010\327\156\174\020\160\106\033\174\340
+\210\262\236\162\206\231\001\343\277\237\111\031\264\045\276\126
+\145\256\027\143\345\036\337\350\377\107\245\277\341\046\005\204
+\344\260\300\257\347\010\231\250\014\136\046\200\105\324\370\150
+\057\226\217\256\342\112\034\234\026\014\023\157\070\207\366\273
+\310\064\137\222\003\121\171\160\246\337\313\365\231\115\171\315
+\116\274\127\237\103\116\153\056\053\030\370\152\163\214\272\305
+\065\357\071\152\101\036\317\161\250\242\262\206\007\133\072\311
+\341\357\077\145\004\200\107\062\104\160\225\116\061\147\152\164
+\133\020\105\165\352\260\237\320\346\065\376\116\237\213\314\053
+\222\105\133\156\045\140\205\106\315\321\252\260\166\146\223\167
+\226\276\203\276\070\266\044\116\046\013\314\355\172\126\032\340
+\351\132\306\144\255\114\172\000\110\104\057\271\100\273\023\076
+\276\025\170\235\205\201\112\052\127\336\325\031\103\332\333\312
+\133\107\206\203\013\077\266\015\166\170\163\171\042\136\261\200
+\037\317\276\321\077\126\020\230\053\225\207\241\037\235\144\024
+\140\071\054\263\000\125\056\344\365\263\016\127\304\221\101\000
+\234\077\350\245\337\352\366\377\310\360\255\155\122\250\027\253
+\233\141\374\022\121\065\344\045\375\257\252\152\206\071
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "NAVER Global Root Certification Authority"
-# Issuer: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR
-# Serial Number:01:94:30:1e:a2:0b:dd:f5:c5:33:2a:b1:43:44:71:f8:d6:50:4d:0d
-# Subject: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR
-# Not Valid Before: Fri Aug 18 08:58:42 2017
-# Not Valid After : Tue Aug 18 23:59:59 2037
-# Fingerprint (SHA-256): 88:F4:38:DC:F8:FF:D1:FA:8F:42:91:15:FF:E5:F8:2A:E1:E0:6E:0C:70:C3:75:FA:AD:71:7B:34:A4:9E:72:65
-# Fingerprint (SHA1): 8F:6B:F2:A9:27:4A:DA:14:A0:C4:F4:8E:61:27:F9:C0:1E:78:5D:D1
+# Trust for "HiPKI Root CA - G1"
+# Issuer: CN=HiPKI Root CA - G1,O="Chunghwa Telecom Co., Ltd.",C=TW
+# Serial Number:2d:dd:ac:ce:62:97:94:a1:43:e8:b0:cd:76:6a:5e:60
+# Subject: CN=HiPKI Root CA - G1,O="Chunghwa Telecom Co., Ltd.",C=TW
+# Not Valid Before: Fri Feb 22 09:46:04 2019
+# Not Valid After : Thu Dec 31 15:59:59 2037
+# Fingerprint (SHA-256): F0:15:CE:3C:C2:39:BF:EF:06:4B:E9:F1:D2:C4:17:E1:A0:26:4A:0A:94:BE:1F:0C:8D:12:18:64:EB:69:49:CC
+# Fingerprint (SHA1): 6A:92:E4:A8:EE:1B:EC:96:45:37:E3:29:57:49:CD:96:E3:E5:D2:60
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "NAVER Global Root Certification Authority"
+CKA_LABEL UTF8 "HiPKI Root CA - G1"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\217\153\362\251\047\112\332\024\240\304\364\216\141\047\371\300
-\036\170\135\321
+\152\222\344\250\356\033\354\226\105\067\343\051\127\111\315\226
+\343\345\322\140
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\310\176\101\366\045\073\365\011\263\027\350\106\075\277\320\233
+\151\105\337\026\145\113\350\150\232\217\166\137\377\200\236\323
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\151\061\013\060\011\006\003\125\004\006\023\002\113\122\061
-\046\060\044\006\003\125\004\012\014\035\116\101\126\105\122\040
-\102\125\123\111\116\105\123\123\040\120\114\101\124\106\117\122
-\115\040\103\157\162\160\056\061\062\060\060\006\003\125\004\003
-\014\051\116\101\126\105\122\040\107\154\157\142\141\154\040\122
-\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171
+\060\117\061\013\060\011\006\003\125\004\006\023\002\124\127\061
+\043\060\041\006\003\125\004\012\014\032\103\150\165\156\147\150
+\167\141\040\124\145\154\145\143\157\155\040\103\157\056\054\040
+\114\164\144\056\061\033\060\031\006\003\125\004\003\014\022\110
+\151\120\113\111\040\122\157\157\164\040\103\101\040\055\040\107
+\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\024\001\224\060\036\242\013\335\365\305\063\052\261\103\104
-\161\370\326\120\115\015
+\002\020\055\335\254\316\142\227\224\241\103\350\260\315\166\152
+\136\140
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
@@ -20973,845 +22122,810 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
+# Certificate "GlobalSign ECC Root CA - R4"
 #
-# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES
-# Serial Number:62:f6:32:6c:e5:c4:e3:68:5c:1b:62:dd:9c:2e:9d:95
-# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES
-# Not Valid Before: Thu Dec 20 09:37:33 2018
-# Not Valid After : Sun Dec 20 09:37:33 2043
-# Fingerprint (SHA-256): 55:41:53:B1:3D:2C:F9:DD:B7:53:BF:BE:1A:4E:0A:E0:8D:0A:A4:18:70:58:FE:60:A2:B8:62:B2:E4:B8:7B:CB
-# Fingerprint (SHA1): 62:FF:D9:9E:C0:65:0D:03:CE:75:93:D2:ED:3F:2D:32:C9:E3:E5:4A
+# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4
+# Serial Number:02:03:e5:7e:f5:3f:93:fd:a5:09:21:b2:a6
+# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4
+# Not Valid Before: Tue Nov 13 00:00:00 2012
+# Not Valid After : Tue Jan 19 03:14:07 2038
+# Fingerprint (SHA-256): B0:85:D7:0B:96:4F:19:1A:73:E4:AF:0D:54:AE:7A:0E:07:AA:FD:AF:9B:71:DD:08:62:13:8A:B7:32:5A:24:A2
+# Fingerprint (SHA1): 6B:A0:B0:98:E1:71:EF:5A:AD:FE:48:15:80:77:10:F4:BD:6F:0B:28
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
+CKA_LABEL UTF8 "GlobalSign ECC Root CA - R4"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\170\061\013\060\011\006\003\125\004\006\023\002\105\123\061
-\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122
-\103\115\061\016\060\014\006\003\125\004\013\014\005\103\145\162
-\145\163\061\030\060\026\006\003\125\004\141\014\017\126\101\124
-\105\123\055\121\062\070\062\066\060\060\064\112\061\054\060\052
-\006\003\125\004\003\014\043\101\103\040\122\101\111\132\040\106
-\116\115\124\055\122\103\115\040\123\105\122\126\111\104\117\122
-\105\123\040\123\105\107\125\122\117\123
+\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157
+\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164
+\040\103\101\040\055\040\122\064\061\023\060\021\006\003\125\004
+\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060
+\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151
+\147\156
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\170\061\013\060\011\006\003\125\004\006\023\002\105\123\061
-\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122
-\103\115\061\016\060\014\006\003\125\004\013\014\005\103\145\162
-\145\163\061\030\060\026\006\003\125\004\141\014\017\126\101\124
-\105\123\055\121\062\070\062\066\060\060\064\112\061\054\060\052
-\006\003\125\004\003\014\043\101\103\040\122\101\111\132\040\106
-\116\115\124\055\122\103\115\040\123\105\122\126\111\104\117\122
-\105\123\040\123\105\107\125\122\117\123
+\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157
+\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164
+\040\103\101\040\055\040\122\064\061\023\060\021\006\003\125\004
+\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060
+\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151
+\147\156
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\142\366\062\154\345\304\343\150\134\033\142\335\234\056
-\235\225
+\002\015\002\003\345\176\365\077\223\375\245\011\041\262\246
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\156\060\202\001\363\240\003\002\001\002\002\020\142
-\366\062\154\345\304\343\150\134\033\142\335\234\056\235\225\060
-\012\006\010\052\206\110\316\075\004\003\003\060\170\061\013\060
-\011\006\003\125\004\006\023\002\105\123\061\021\060\017\006\003
-\125\004\012\014\010\106\116\115\124\055\122\103\115\061\016\060
-\014\006\003\125\004\013\014\005\103\145\162\145\163\061\030\060
-\026\006\003\125\004\141\014\017\126\101\124\105\123\055\121\062
-\070\062\066\060\060\064\112\061\054\060\052\006\003\125\004\003
-\014\043\101\103\040\122\101\111\132\040\106\116\115\124\055\122
-\103\115\040\123\105\122\126\111\104\117\122\105\123\040\123\105
-\107\125\122\117\123\060\036\027\015\061\070\061\062\062\060\060
-\071\063\067\063\063\132\027\015\064\063\061\062\062\060\060\071
-\063\067\063\063\132\060\170\061\013\060\011\006\003\125\004\006
-\023\002\105\123\061\021\060\017\006\003\125\004\012\014\010\106
-\116\115\124\055\122\103\115\061\016\060\014\006\003\125\004\013
-\014\005\103\145\162\145\163\061\030\060\026\006\003\125\004\141
-\014\017\126\101\124\105\123\055\121\062\070\062\066\060\060\064
-\112\061\054\060\052\006\003\125\004\003\014\043\101\103\040\122
-\101\111\132\040\106\116\115\124\055\122\103\115\040\123\105\122
-\126\111\104\117\122\105\123\040\123\105\107\125\122\117\123\060
-\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201
-\004\000\042\003\142\000\004\366\272\127\123\310\312\253\337\066
-\112\122\041\344\227\322\203\147\236\360\145\121\320\136\207\307
-\107\261\131\362\127\107\233\000\002\223\104\027\151\333\102\307
-\261\262\072\030\016\264\135\214\263\146\135\241\064\371\066\054
-\111\333\363\106\374\263\104\151\104\023\146\375\327\305\375\257
-\066\115\316\003\115\007\161\317\257\152\005\322\242\103\132\012
-\122\157\001\003\116\216\213\243\102\060\100\060\017\006\003\125
-\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003
-\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003
-\125\035\016\004\026\004\024\001\271\057\357\277\021\206\140\362
-\117\320\101\156\253\163\037\347\322\156\111\060\012\006\010\052
-\206\110\316\075\004\003\003\003\151\000\060\146\002\061\000\256
-\112\343\053\100\303\164\021\362\225\255\026\043\336\116\014\032
-\346\135\245\044\136\153\104\173\374\070\342\117\313\234\105\027
-\021\114\024\047\046\125\071\165\112\003\314\023\220\237\222\002
-\061\000\372\112\154\140\210\163\363\356\270\230\142\251\316\053
-\302\331\212\246\160\061\035\257\260\224\114\353\117\306\343\321
-\363\142\247\074\377\223\056\007\134\111\001\147\151\022\002\162
-\277\347
+\060\202\001\334\060\202\001\203\240\003\002\001\002\002\015\002
+\003\345\176\365\077\223\375\245\011\041\262\246\060\012\006\010
+\052\206\110\316\075\004\003\002\060\120\061\044\060\042\006\003
+\125\004\013\023\033\107\154\157\142\141\154\123\151\147\156\040
+\105\103\103\040\122\157\157\164\040\103\101\040\055\040\122\064
+\061\023\060\021\006\003\125\004\012\023\012\107\154\157\142\141
+\154\123\151\147\156\061\023\060\021\006\003\125\004\003\023\012
+\107\154\157\142\141\154\123\151\147\156\060\036\027\015\061\062
+\061\061\061\063\060\060\060\060\060\060\132\027\015\063\070\060
+\061\061\071\060\063\061\064\060\067\132\060\120\061\044\060\042
+\006\003\125\004\013\023\033\107\154\157\142\141\154\123\151\147
+\156\040\105\103\103\040\122\157\157\164\040\103\101\040\055\040
+\122\064\061\023\060\021\006\003\125\004\012\023\012\107\154\157
+\142\141\154\123\151\147\156\061\023\060\021\006\003\125\004\003
+\023\012\107\154\157\142\141\154\123\151\147\156\060\131\060\023
+\006\007\052\206\110\316\075\002\001\006\010\052\206\110\316\075
+\003\001\007\003\102\000\004\270\306\171\323\217\154\045\016\237
+\056\071\031\034\003\244\256\232\345\071\007\011\026\312\143\261
+\271\206\370\212\127\301\127\316\102\372\163\241\367\145\102\377
+\036\301\000\262\156\163\016\377\307\041\345\030\244\252\331\161
+\077\250\324\271\316\214\035\243\102\060\100\060\016\006\003\125
+\035\017\001\001\377\004\004\003\002\001\206\060\017\006\003\125
+\035\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003
+\125\035\016\004\026\004\024\124\260\173\255\105\270\342\100\177
+\373\012\156\373\276\063\311\074\243\204\325\060\012\006\010\052
+\206\110\316\075\004\003\002\003\107\000\060\104\002\040\042\117
+\164\162\271\140\257\361\346\234\240\026\005\120\137\303\136\073
+\156\141\164\357\276\001\304\276\030\110\131\141\202\062\002\040
+\046\235\124\143\100\336\067\140\120\317\310\330\355\235\202\256
+\067\230\274\243\217\114\114\251\064\053\154\357\373\225\233\046
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
-# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES
-# Serial Number:62:f6:32:6c:e5:c4:e3:68:5c:1b:62:dd:9c:2e:9d:95
-# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES
-# Not Valid Before: Thu Dec 20 09:37:33 2018
-# Not Valid After : Sun Dec 20 09:37:33 2043
-# Fingerprint (SHA-256): 55:41:53:B1:3D:2C:F9:DD:B7:53:BF:BE:1A:4E:0A:E0:8D:0A:A4:18:70:58:FE:60:A2:B8:62:B2:E4:B8:7B:CB
-# Fingerprint (SHA1): 62:FF:D9:9E:C0:65:0D:03:CE:75:93:D2:ED:3F:2D:32:C9:E3:E5:4A
+# Trust for "GlobalSign ECC Root CA - R4"
+# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4
+# Serial Number:02:03:e5:7e:f5:3f:93:fd:a5:09:21:b2:a6
+# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4
+# Not Valid Before: Tue Nov 13 00:00:00 2012
+# Not Valid After : Tue Jan 19 03:14:07 2038
+# Fingerprint (SHA-256): B0:85:D7:0B:96:4F:19:1A:73:E4:AF:0D:54:AE:7A:0E:07:AA:FD:AF:9B:71:DD:08:62:13:8A:B7:32:5A:24:A2
+# Fingerprint (SHA1): 6B:A0:B0:98:E1:71:EF:5A:AD:FE:48:15:80:77:10:F4:BD:6F:0B:28
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
+CKA_LABEL UTF8 "GlobalSign ECC Root CA - R4"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\142\377\331\236\300\145\015\003\316\165\223\322\355\077\055\062
-\311\343\345\112
+\153\240\260\230\341\161\357\132\255\376\110\025\200\167\020\364
+\275\157\013\050
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\031\066\234\122\003\057\322\321\273\043\314\335\036\022\125\273
+\046\051\370\155\341\210\277\242\145\177\252\304\315\017\177\374
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\170\061\013\060\011\006\003\125\004\006\023\002\105\123\061
-\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122
-\103\115\061\016\060\014\006\003\125\004\013\014\005\103\145\162
-\145\163\061\030\060\026\006\003\125\004\141\014\017\126\101\124
-\105\123\055\121\062\070\062\066\060\060\064\112\061\054\060\052
-\006\003\125\004\003\014\043\101\103\040\122\101\111\132\040\106
-\116\115\124\055\122\103\115\040\123\105\122\126\111\104\117\122
-\105\123\040\123\105\107\125\122\117\123
+\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157
+\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164
+\040\103\101\040\055\040\122\064\061\023\060\021\006\003\125\004
+\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060
+\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151
+\147\156
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\142\366\062\154\345\304\343\150\134\033\142\335\234\056
-\235\225
+\002\015\002\003\345\176\365\077\223\375\245\011\041\262\246
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "GlobalSign Secure Mail Root R45"
+# Certificate "GTS Root R1"
 #
-# Issuer: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE
-# Serial Number:76:53:fe:a8:4c:50:ab:9f:8d:32:b5:1d:03:8f:57:dc
-# Subject: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE
-# Not Valid Before: Wed Mar 18 00:00:00 2020
-# Not Valid After : Sat Mar 18 00:00:00 2045
-# Fingerprint (SHA-256): 31:9A:F0:A7:72:9E:6F:89:26:9C:13:1E:A6:A3:A1:6F:CD:86:38:9F:DC:AB:3C:47:A4:A6:75:C1:61:A3:F9:74
-# Fingerprint (SHA1): 76:18:D1:F3:80:24:3D:52:40:C6:11:6A:AD:57:77:09:7D:81:30:A0
+# Issuer: CN=GTS Root R1,O=Google Trust Services LLC,C=US
+# Serial Number:02:03:e5:93:6f:31:b0:13:49:88:6b:a2:17
+# Subject: CN=GTS Root R1,O=Google Trust Services LLC,C=US
+# Not Valid Before: Wed Jun 22 00:00:00 2016
+# Not Valid After : Sun Jun 22 00:00:00 2036
+# Fingerprint (SHA-256): D9:47:43:2A:BD:E7:B7:FA:90:FC:2E:6B:59:10:1B:12:80:E0:E1:C7:E4:E4:0F:A3:C6:88:7F:FF:57:A7:F4:CF
+# Fingerprint (SHA1): E5:8C:1C:C4:91:3B:38:63:4B:E9:10:6E:E3:AD:8E:6B:9D:D9:81:4A
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Secure Mail Root R45"
+CKA_LABEL UTF8 "GTS Root R1"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
-\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
-\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
-\040\122\064\065
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\061
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
-\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
-\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
-\040\122\064\065
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\166\123\376\250\114\120\253\237\215\062\265\035\003\217
-\127\334
+\002\015\002\003\345\223\157\061\260\023\111\210\153\242\027
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\160\060\202\003\130\240\003\002\001\002\002\020\166
-\123\376\250\114\120\253\237\215\062\265\035\003\217\127\334\060
-\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\122
-\061\013\060\011\006\003\125\004\006\023\002\102\105\061\031\060
-\027\006\003\125\004\012\023\020\107\154\157\142\141\154\123\151
-\147\156\040\156\166\055\163\141\061\050\060\046\006\003\125\004
-\003\023\037\107\154\157\142\141\154\123\151\147\156\040\123\145
-\143\165\162\145\040\115\141\151\154\040\122\157\157\164\040\122
-\064\065\060\036\027\015\062\060\060\063\061\070\060\060\060\060
-\060\060\132\027\015\064\065\060\063\061\070\060\060\060\060\060
-\060\132\060\122\061\013\060\011\006\003\125\004\006\023\002\102
-\105\061\031\060\027\006\003\125\004\012\023\020\107\154\157\142
-\141\154\123\151\147\156\040\156\166\055\163\141\061\050\060\046
-\006\003\125\004\003\023\037\107\154\157\142\141\154\123\151\147
-\156\040\123\145\143\165\162\145\040\115\141\151\154\040\122\157
-\157\164\040\122\064\065\060\202\002\042\060\015\006\011\052\206
-\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202
-\002\012\002\202\002\001\000\334\171\314\155\006\371\155\273\340
-\126\004\154\177\340\165\314\055\005\111\350\113\334\124\354\133
-\167\225\162\277\177\142\235\205\251\212\044\120\137\123\345\333
-\164\157\244\051\133\023\052\011\255\232\305\057\302\367\166\073
-\241\105\106\252\103\346\044\376\053\260\157\062\160\031\106\132
-\171\046\057\374\075\175\137\144\313\127\314\141\141\250\331\225
-\156\343\225\240\156\177\107\022\030\326\357\003\311\373\212\372
-\232\275\202\025\251\125\167\113\021\117\131\340\153\303\161\363
-\014\330\124\325\201\150\076\023\271\025\056\207\212\074\104\047
-\066\142\044\156\370\054\005\162\060\141\275\102\221\043\304\235
-\045\247\331\124\232\024\243\061\255\200\171\014\247\143\154\230
-\243\254\127\107\063\037\145\226\341\320\322\065\332\371\161\367
-\241\246\045\265\101\135\337\076\140\330\321\366\237\245\362\270
-\314\023\252\217\371\262\156\341\203\055\223\335\076\205\032\335
-\350\261\134\046\001\313\111\205\374\374\322\324\177\205\142\206
-\164\371\313\354\065\042\242\014\060\217\073\253\171\353\126\362
-\372\102\363\355\371\037\105\211\100\051\255\352\222\164\352\122
-\375\126\264\053\332\242\355\165\302\156\253\316\122\220\113\366
-\336\360\111\217\232\110\324\210\031\155\105\346\314\214\271\335
-\144\140\140\002\100\370\271\317\274\130\353\075\205\271\306\012
-\323\234\007\146\217\307\030\071\043\106\341\074\036\243\057\120
-\141\222\013\075\053\154\361\243\107\070\127\221\253\015\217\306
-\235\115\004\322\046\122\134\345\245\375\052\055\026\052\001\151
-\347\251\175\341\066\267\261\052\305\331\261\215\275\271\213\316
-\314\213\241\076\013\110\315\120\225\064\304\330\010\131\330\153
-\046\364\276\365\324\042\027\000\127\311\256\233\004\060\063\237
-\013\373\337\126\242\311\156\124\166\332\261\227\142\047\131\017
-\021\212\042\033\144\226\077\250\361\267\044\112\215\074\123\174
-\155\203\166\075\262\046\110\163\365\104\026\001\055\011\052\216
-\026\226\120\320\163\006\135\273\042\110\202\114\012\106\132\077
-\200\377\134\362\362\232\254\054\010\340\326\352\360\022\070\201
-\117\246\020\355\106\253\314\026\234\013\317\144\246\231\002\205
-\104\147\106\255\375\115\347\002\003\001\000\001\243\102\060\100
-\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206
-\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001
-\377\060\035\006\003\125\035\016\004\026\004\024\240\223\025\050
-\156\356\217\010\262\065\306\236\142\171\164\247\261\016\053\173
-\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003
-\202\002\001\000\105\012\370\321\134\254\142\201\320\004\327\266
-\377\127\121\211\013\014\313\336\044\145\067\373\253\236\355\146
-\364\352\014\031\151\211\270\031\261\060\126\264\331\366\367\276
-\306\256\227\313\105\366\021\214\072\060\144\114\301\237\131\300
-\106\102\010\006\107\144\027\170\340\225\007\006\326\214\242\254
-\251\331\077\323\173\126\117\374\304\207\050\337\266\053\026\043
-\300\237\037\133\343\326\104\136\042\117\043\004\214\065\026\265
-\171\007\206\134\057\227\342\366\010\144\246\334\333\250\212\343
-\244\173\167\015\321\051\223\050\040\264\123\243\113\116\137\336
-\301\366\165\043\374\037\074\170\117\160\061\170\057\242\065\124
-\161\004\254\310\304\155\303\366\221\261\376\315\356\104\156\201
-\366\100\305\076\052\001\277\253\114\261\003\077\015\021\344\017
-\322\044\343\042\210\233\237\137\107\075\121\111\340\011\067\176
-\027\041\061\166\267\147\161\110\050\113\045\327\020\350\237\141
-\131\026\305\076\062\116\037\014\316\243\314\017\344\307\021\007
-\042\057\070\010\335\133\227\353\102\154\131\232\232\356\172\320
-\235\337\305\333\011\103\056\012\252\031\075\153\350\152\060\172
-\127\346\277\263\152\071\251\217\343\361\117\145\150\266\275\237
-\050\217\241\026\132\011\120\072\062\056\035\057\104\021\102\246
-\000\346\061\230\377\055\241\017\346\244\140\126\317\171\327\262
-\116\327\260\372\156\014\127\043\307\316\037\245\261\114\155\031
-\111\236\016\177\160\217\161\077\130\050\237\165\335\141\340\072
-\267\071\266\356\227\324\065\121\373\213\111\140\310\074\146\256
-\227\356\215\046\131\127\273\170\360\172\120\060\011\260\140\252
-\237\116\334\311\076\036\072\334\142\223\063\260\072\124\164\157
-\054\061\105\321\153\021\062\152\150\166\366\075\366\152\023\136
-\044\230\347\352\035\232\317\170\202\007\140\367\115\020\323\201
-\232\105\215\236\257\233\334\200\307\103\262\225\150\244\303\016
-\350\012\107\025\277\124\063\334\001\347\325\246\036\163\330\172
-\262\277\057\255\343\125\060\236\337\016\101\274\340\021\365\241
-\014\250\042\341\343\000\243\116\160\174\222\343\004\321\172\102
-\212\165\220\131\343\233\321\114\242\144\275\163\171\233\157\362
-\263\301\366\074
+\060\202\005\127\060\202\003\077\240\003\002\001\002\002\015\002
+\003\345\223\157\061\260\023\111\210\153\242\027\060\015\006\011
+\052\206\110\206\367\015\001\001\014\005\000\060\107\061\013\060
+\011\006\003\125\004\006\023\002\125\123\061\042\060\040\006\003
+\125\004\012\023\031\107\157\157\147\154\145\040\124\162\165\163
+\164\040\123\145\162\166\151\143\145\163\040\114\114\103\061\024
+\060\022\006\003\125\004\003\023\013\107\124\123\040\122\157\157
+\164\040\122\061\060\036\027\015\061\066\060\066\062\062\060\060
+\060\060\060\060\132\027\015\063\066\060\066\062\062\060\060\060
+\060\060\060\132\060\107\061\013\060\011\006\003\125\004\006\023
+\002\125\123\061\042\060\040\006\003\125\004\012\023\031\107\157
+\157\147\154\145\040\124\162\165\163\164\040\123\145\162\166\151
+\143\145\163\040\114\114\103\061\024\060\022\006\003\125\004\003
+\023\013\107\124\123\040\122\157\157\164\040\122\061\060\202\002
+\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000
+\003\202\002\017\000\060\202\002\012\002\202\002\001\000\266\021
+\002\213\036\343\241\167\233\073\334\277\224\076\267\225\247\100
+\074\241\375\202\371\175\062\006\202\161\366\366\214\177\373\350
+\333\274\152\056\227\227\243\214\113\371\053\366\261\371\316\204
+\035\261\371\305\227\336\357\271\362\243\351\274\022\211\136\247
+\252\122\253\370\043\047\313\244\261\234\143\333\327\231\176\360
+\012\136\353\150\246\364\306\132\107\015\115\020\063\343\116\261
+\023\243\310\030\154\113\354\374\011\220\337\235\144\051\045\043
+\007\241\264\322\075\056\140\340\317\322\011\207\273\315\110\360
+\115\302\302\172\210\212\273\272\317\131\031\326\257\217\260\007
+\260\236\061\361\202\301\300\337\056\246\155\154\031\016\265\330
+\176\046\032\105\003\075\260\171\244\224\050\255\017\177\046\345
+\250\010\376\226\350\074\150\224\123\356\203\072\210\053\025\226
+\011\262\340\172\214\056\165\326\234\353\247\126\144\217\226\117
+\150\256\075\227\302\204\217\300\274\100\300\013\134\275\366\207
+\263\065\154\254\030\120\177\204\340\114\315\222\323\040\351\063
+\274\122\231\257\062\265\051\263\045\052\264\110\371\162\341\312
+\144\367\346\202\020\215\350\235\302\212\210\372\070\146\212\374
+\143\371\001\371\170\375\173\134\167\372\166\207\372\354\337\261
+\016\171\225\127\264\275\046\357\326\001\321\353\026\012\273\216
+\013\265\305\305\212\125\253\323\254\352\221\113\051\314\031\244
+\062\045\116\052\361\145\104\320\002\316\252\316\111\264\352\237
+\174\203\260\100\173\347\103\253\247\154\243\217\175\211\201\372
+\114\245\377\325\216\303\316\113\340\265\330\263\216\105\317\166
+\300\355\100\053\375\123\017\260\247\325\073\015\261\212\242\003
+\336\061\255\314\167\352\157\173\076\326\337\221\042\022\346\276
+\372\330\062\374\020\143\024\121\162\336\135\326\026\223\275\051
+\150\063\357\072\146\354\007\212\046\337\023\327\127\145\170\047
+\336\136\111\024\000\242\000\177\232\250\041\266\251\261\225\260
+\245\271\015\026\021\332\307\154\110\074\100\340\176\015\132\315
+\126\074\321\227\005\271\313\113\355\071\113\234\304\077\322\125
+\023\156\044\260\326\161\372\364\301\272\314\355\033\365\376\201
+\101\330\000\230\075\072\310\256\172\230\067\030\005\225\002\003
+\001\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001
+\377\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001
+\377\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004
+\026\004\024\344\257\053\046\161\032\053\110\047\205\057\122\146
+\054\357\360\211\023\161\076\060\015\006\011\052\206\110\206\367
+\015\001\001\014\005\000\003\202\002\001\000\237\252\102\046\333
+\013\233\276\377\036\226\222\056\076\242\145\112\152\230\272\042
+\313\175\301\072\330\202\012\006\306\366\245\336\300\116\207\146
+\171\241\371\246\130\234\252\371\265\346\140\347\340\350\261\036
+\102\101\063\013\067\075\316\211\160\025\312\265\044\250\317\153
+\265\322\100\041\230\317\042\064\317\073\305\042\204\340\305\016
+\212\174\135\210\344\065\044\316\233\076\032\124\036\156\333\262
+\207\247\374\363\372\201\125\024\142\012\131\251\042\005\061\076
+\202\326\356\333\127\064\274\063\225\323\027\033\350\047\242\213
+\173\116\046\032\172\132\144\266\321\254\067\361\375\240\363\070
+\354\162\360\021\165\235\313\064\122\215\346\166\153\027\306\337
+\206\253\047\216\111\053\165\146\201\020\041\246\352\076\364\256
+\045\377\174\025\336\316\214\045\077\312\142\160\012\367\057\011
+\146\007\310\077\034\374\360\333\105\060\337\142\210\301\265\017
+\235\303\237\112\336\131\131\107\305\207\042\066\346\202\247\355
+\012\271\342\007\240\215\173\172\112\074\161\322\342\003\241\037
+\062\007\335\033\344\102\316\014\000\105\141\200\265\013\040\131
+\051\170\275\371\125\313\143\305\074\114\364\266\377\333\152\137
+\061\153\231\236\054\301\153\120\244\327\346\030\024\275\205\077
+\147\253\106\237\240\377\102\247\072\177\134\313\135\260\160\035
+\053\064\365\324\166\011\014\353\170\114\131\005\363\063\102\303
+\141\025\020\033\167\115\316\042\214\324\205\362\105\175\267\123
+\352\357\100\132\224\012\134\040\137\116\100\135\142\042\166\337
+\377\316\141\275\214\043\170\322\067\002\340\216\336\321\021\067
+\211\366\277\355\111\007\142\256\222\354\100\032\257\024\011\331
+\320\116\262\242\367\276\356\356\330\377\334\032\055\336\270\066
+\161\342\374\171\267\224\045\321\110\163\133\241\065\347\263\231
+\147\165\301\031\072\053\107\116\323\102\216\375\061\310\026\146
+\332\322\014\074\333\263\216\311\241\015\200\017\173\026\167\024
+\277\377\333\011\224\262\223\274\040\130\025\351\333\161\103\363
+\336\020\303\000\334\250\052\225\266\302\326\077\220\153\166\333
+\154\376\214\274\362\160\065\014\334\231\031\065\334\327\310\106
+\143\325\066\161\256\127\373\267\202\155\334
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "GlobalSign Secure Mail Root R45"
-# Issuer: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE
-# Serial Number:76:53:fe:a8:4c:50:ab:9f:8d:32:b5:1d:03:8f:57:dc
-# Subject: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE
-# Not Valid Before: Wed Mar 18 00:00:00 2020
-# Not Valid After : Sat Mar 18 00:00:00 2045
-# Fingerprint (SHA-256): 31:9A:F0:A7:72:9E:6F:89:26:9C:13:1E:A6:A3:A1:6F:CD:86:38:9F:DC:AB:3C:47:A4:A6:75:C1:61:A3:F9:74
-# Fingerprint (SHA1): 76:18:D1:F3:80:24:3D:52:40:C6:11:6A:AD:57:77:09:7D:81:30:A0
+# Trust for "GTS Root R1"
+# Issuer: CN=GTS Root R1,O=Google Trust Services LLC,C=US
+# Serial Number:02:03:e5:93:6f:31:b0:13:49:88:6b:a2:17
+# Subject: CN=GTS Root R1,O=Google Trust Services LLC,C=US
+# Not Valid Before: Wed Jun 22 00:00:00 2016
+# Not Valid After : Sun Jun 22 00:00:00 2036
+# Fingerprint (SHA-256): D9:47:43:2A:BD:E7:B7:FA:90:FC:2E:6B:59:10:1B:12:80:E0:E1:C7:E4:E4:0F:A3:C6:88:7F:FF:57:A7:F4:CF
+# Fingerprint (SHA1): E5:8C:1C:C4:91:3B:38:63:4B:E9:10:6E:E3:AD:8E:6B:9D:D9:81:4A
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Secure Mail Root R45"
+CKA_LABEL UTF8 "GTS Root R1"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\166\030\321\363\200\044\075\122\100\306\021\152\255\127\167\011
-\175\201\060\240
+\345\214\034\304\221\073\070\143\113\351\020\156\343\255\216\153
+\235\331\201\112
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\223\304\173\263\016\124\107\034\103\054\213\276\160\205\142\051
+\005\376\320\277\161\250\243\166\143\332\001\340\330\122\334\100
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
-\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
-\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
-\040\122\064\065
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\166\123\376\250\114\120\253\237\215\062\265\035\003\217
-\127\334
+\002\015\002\003\345\223\157\061\260\023\111\210\153\242\027
 END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "GlobalSign Secure Mail Root E45"
+# Certificate "GTS Root R2"
 #
-# Issuer: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE
-# Serial Number:76:53:fe:aa:27:1d:95:46:5d:d6:f1:9e:e5:b8:90:0a
-# Subject: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE
-# Not Valid Before: Wed Mar 18 00:00:00 2020
-# Not Valid After : Sat Mar 18 00:00:00 2045
-# Fingerprint (SHA-256): 5C:BF:6F:B8:1F:D4:17:EA:41:28:CD:6F:81:72:A3:C9:40:20:94:F7:4A:B2:ED:3A:06:B4:40:5D:04:F3:0B:19
-# Fingerprint (SHA1): 18:2E:1F:32:4F:89:DF:BE:FE:88:89:F0:93:C2:C4:A0:2B:67:75:21
+# Issuer: CN=GTS Root R2,O=Google Trust Services LLC,C=US
+# Serial Number:02:03:e5:ae:c5:8d:04:25:1a:ab:11:25:aa
+# Subject: CN=GTS Root R2,O=Google Trust Services LLC,C=US
+# Not Valid Before: Wed Jun 22 00:00:00 2016
+# Not Valid After : Sun Jun 22 00:00:00 2036
+# Fingerprint (SHA-256): 8D:25:CD:97:22:9D:BF:70:35:6B:DA:4E:B3:CC:73:40:31:E2:4C:F0:0F:AF:CF:D3:2D:C7:6E:B5:84:1C:7E:A8
+# Fingerprint (SHA1): 9A:44:49:76:32:DB:DE:FA:D0:BC:FB:5A:7B:17:BD:9E:56:09:24:94
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Secure Mail Root E45"
+CKA_LABEL UTF8 "GTS Root R2"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
-\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
-\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
-\040\105\064\065
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\062
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
-\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
-\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
-\040\105\064\065
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\062
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\166\123\376\252\047\035\225\106\135\326\361\236\345\270
-\220\012
+\002\015\002\003\345\256\305\215\004\045\032\253\021\045\252
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\041\060\202\001\247\240\003\002\001\002\002\020\166
-\123\376\252\047\035\225\106\135\326\361\236\345\270\220\012\060
-\012\006\010\052\206\110\316\075\004\003\003\060\122\061\013\060
-\011\006\003\125\004\006\023\002\102\105\061\031\060\027\006\003
-\125\004\012\023\020\107\154\157\142\141\154\123\151\147\156\040
-\156\166\055\163\141\061\050\060\046\006\003\125\004\003\023\037
-\107\154\157\142\141\154\123\151\147\156\040\123\145\143\165\162
-\145\040\115\141\151\154\040\122\157\157\164\040\105\064\065\060
-\036\027\015\062\060\060\063\061\070\060\060\060\060\060\060\132
-\027\015\064\065\060\063\061\070\060\060\060\060\060\060\132\060
-\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061\031
-\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154\123
-\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003\125
-\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040\123
-\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164\040
-\105\064\065\060\166\060\020\006\007\052\206\110\316\075\002\001
-\006\005\053\201\004\000\042\003\142\000\004\371\171\213\201\107
-\067\211\226\077\105\111\120\177\032\046\013\223\062\176\056\300
-\300\247\010\232\303\156\217\233\076\013\042\354\067\123\267\157
-\212\260\274\047\067\113\155\251\106\073\331\037\377\245\241\104
-\273\055\163\277\236\101\007\134\123\233\121\010\072\132\273\157
-\070\307\026\221\170\302\112\023\151\035\202\337\132\057\000\210
-\226\242\056\034\164\371\235\176\146\067\212\243\102\060\100\060
-\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060
-\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377
-\060\035\006\003\125\035\016\004\026\004\024\337\023\136\213\137
-\302\100\002\375\126\267\224\114\266\036\325\246\261\024\226\060
-\012\006\010\052\206\110\316\075\004\003\003\003\150\000\060\145
-\002\060\023\260\276\327\161\040\076\344\253\234\316\066\022\175
-\137\114\037\052\265\151\105\063\137\323\055\132\262\344\210\307
-\336\012\066\102\062\171\235\246\153\272\341\371\104\052\173\212
-\303\022\002\061\000\240\146\034\116\207\235\207\311\355\231\114
-\033\012\356\055\140\303\067\307\035\315\265\162\260\331\306\357
-\274\362\377\077\360\122\335\010\347\252\144\171\303\344\151\127
-\221\057\244\313\174
+\060\202\005\127\060\202\003\077\240\003\002\001\002\002\015\002
+\003\345\256\305\215\004\045\032\253\021\045\252\060\015\006\011
+\052\206\110\206\367\015\001\001\014\005\000\060\107\061\013\060
+\011\006\003\125\004\006\023\002\125\123\061\042\060\040\006\003
+\125\004\012\023\031\107\157\157\147\154\145\040\124\162\165\163
+\164\040\123\145\162\166\151\143\145\163\040\114\114\103\061\024
+\060\022\006\003\125\004\003\023\013\107\124\123\040\122\157\157
+\164\040\122\062\060\036\027\015\061\066\060\066\062\062\060\060
+\060\060\060\060\132\027\015\063\066\060\066\062\062\060\060\060
+\060\060\060\132\060\107\061\013\060\011\006\003\125\004\006\023
+\002\125\123\061\042\060\040\006\003\125\004\012\023\031\107\157
+\157\147\154\145\040\124\162\165\163\164\040\123\145\162\166\151
+\143\145\163\040\114\114\103\061\024\060\022\006\003\125\004\003
+\023\013\107\124\123\040\122\157\157\164\040\122\062\060\202\002
+\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000
+\003\202\002\017\000\060\202\002\012\002\202\002\001\000\316\336
+\375\246\373\354\354\024\064\074\007\006\132\154\131\367\031\065
+\335\367\301\235\125\252\323\315\073\244\223\162\357\012\372\155
+\235\366\360\205\200\133\241\110\122\237\071\305\267\356\050\254
+\357\313\166\150\024\271\337\255\001\154\231\037\304\042\035\237
+\376\162\167\340\054\133\257\344\004\277\117\162\240\032\064\230
+\350\071\150\354\225\045\173\166\241\346\151\271\205\031\275\211
+\214\376\255\355\066\352\163\274\377\203\342\313\175\301\322\316
+\112\263\215\005\236\213\111\223\337\301\133\320\156\136\360\056
+\060\056\202\374\372\274\264\027\012\110\345\210\233\305\233\153
+\336\260\312\264\003\360\332\364\220\270\145\144\367\134\114\255
+\350\176\146\136\231\327\270\302\076\310\320\023\235\255\356\344
+\105\173\211\125\367\212\037\142\122\204\022\263\302\100\227\343
+\212\037\107\221\246\164\132\322\370\261\143\050\020\270\263\011
+\270\126\167\100\242\046\230\171\306\376\337\045\356\076\345\240
+\177\324\141\017\121\113\074\077\214\332\341\160\164\330\302\150
+\241\371\301\014\351\241\342\177\273\125\074\166\006\356\152\116
+\314\222\210\060\115\232\275\117\013\110\232\204\265\230\243\325
+\373\163\301\127\141\335\050\126\165\023\256\207\216\347\014\121
+\011\020\165\210\114\274\215\371\173\074\324\042\110\037\052\334
+\353\153\273\104\261\313\063\161\062\106\257\255\112\361\214\350
+\164\072\254\347\032\042\163\200\322\060\367\045\102\307\042\073
+\073\022\255\226\056\306\303\166\007\252\040\267\065\111\127\351
+\222\111\350\166\026\162\061\147\053\226\176\212\243\307\224\126
+\042\277\152\113\176\001\041\262\043\062\337\344\232\104\155\131
+\133\135\365\000\240\034\233\306\170\227\215\220\377\233\310\252
+\264\257\021\121\071\136\331\373\147\255\325\133\021\235\062\232
+\033\275\325\272\133\245\311\313\045\151\123\125\047\134\340\312
+\066\313\210\141\373\036\267\320\313\356\026\373\323\246\114\336
+\222\245\324\342\337\365\006\124\336\056\235\113\264\223\060\252
+\201\316\335\032\334\121\163\015\117\160\351\345\266\026\041\031
+\171\262\346\211\013\165\144\312\325\253\274\011\301\030\241\377
+\324\124\241\205\074\375\024\044\003\262\207\323\244\267\002\003
+\001\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001
+\377\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001
+\377\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004
+\026\004\024\273\377\312\216\043\237\117\231\312\333\342\150\246
+\245\025\047\027\036\331\016\060\015\006\011\052\206\110\206\367
+\015\001\001\014\005\000\003\202\002\001\000\037\312\316\335\307
+\276\241\237\331\047\114\013\334\027\230\021\152\210\336\075\346
+\161\126\162\262\236\032\116\234\325\053\230\044\135\233\153\173
+\260\063\202\011\275\337\045\106\352\230\236\266\033\376\203\074
+\322\142\141\301\004\355\316\340\305\311\310\023\023\125\347\250
+\143\255\214\173\001\376\167\060\341\316\150\233\005\370\022\356
+\171\061\240\101\105\065\050\012\161\244\044\117\214\334\074\202
+\007\137\146\334\175\020\376\014\141\263\005\225\356\341\256\201
+\017\250\370\307\217\115\250\043\002\046\153\035\203\122\125\316
+\265\057\000\312\200\100\340\341\164\254\140\365\207\200\235\256
+\066\144\221\135\260\150\030\352\212\141\311\167\250\227\304\311
+\307\245\374\125\113\363\360\177\271\145\075\047\150\320\314\153
+\372\123\235\341\221\032\311\135\032\226\155\062\207\355\003\040
+\310\002\316\132\276\331\352\375\262\115\304\057\033\337\137\172
+\365\370\213\306\356\061\072\045\121\125\147\215\144\062\173\351
+\236\303\202\272\052\055\351\036\264\340\110\006\242\374\147\257
+\037\042\002\163\373\040\012\257\235\124\113\241\315\377\140\107
+\260\077\135\357\033\126\275\227\041\226\055\012\321\136\235\070
+\002\107\154\271\364\366\043\045\270\240\152\232\053\167\010\372
+\304\261\050\220\046\130\010\074\342\176\252\327\075\157\272\061
+\210\012\005\353\047\265\241\111\356\240\105\124\173\346\047\145
+\231\040\041\250\243\274\373\030\226\273\122\157\014\355\203\121
+\114\351\131\342\040\140\305\302\145\222\202\214\363\020\037\016
+\212\227\276\167\202\155\077\217\035\135\274\111\047\275\314\117
+\017\341\316\166\206\004\043\305\300\214\022\133\375\333\204\240
+\044\361\110\377\144\174\320\276\134\026\321\357\231\255\300\037
+\373\313\256\274\070\042\006\046\144\332\332\227\016\077\050\025
+\104\250\117\000\312\360\232\314\317\164\152\264\076\074\353\225
+\354\265\323\132\330\201\231\351\103\030\067\353\263\273\321\130
+\142\101\363\146\322\217\252\170\225\124\040\303\132\056\164\053
+\325\321\276\030\151\300\254\325\244\317\071\272\121\204\003\145
+\351\142\300\142\376\330\115\125\226\342\320\021\372\110\064\021
+\354\236\355\005\035\344\310\326\035\206\313
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "GlobalSign Secure Mail Root E45"
-# Issuer: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE
-# Serial Number:76:53:fe:aa:27:1d:95:46:5d:d6:f1:9e:e5:b8:90:0a
-# Subject: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE
-# Not Valid Before: Wed Mar 18 00:00:00 2020
-# Not Valid After : Sat Mar 18 00:00:00 2045
-# Fingerprint (SHA-256): 5C:BF:6F:B8:1F:D4:17:EA:41:28:CD:6F:81:72:A3:C9:40:20:94:F7:4A:B2:ED:3A:06:B4:40:5D:04:F3:0B:19
-# Fingerprint (SHA1): 18:2E:1F:32:4F:89:DF:BE:FE:88:89:F0:93:C2:C4:A0:2B:67:75:21
+# Trust for "GTS Root R2"
+# Issuer: CN=GTS Root R2,O=Google Trust Services LLC,C=US
+# Serial Number:02:03:e5:ae:c5:8d:04:25:1a:ab:11:25:aa
+# Subject: CN=GTS Root R2,O=Google Trust Services LLC,C=US
+# Not Valid Before: Wed Jun 22 00:00:00 2016
+# Not Valid After : Sun Jun 22 00:00:00 2036
+# Fingerprint (SHA-256): 8D:25:CD:97:22:9D:BF:70:35:6B:DA:4E:B3:CC:73:40:31:E2:4C:F0:0F:AF:CF:D3:2D:C7:6E:B5:84:1C:7E:A8
+# Fingerprint (SHA1): 9A:44:49:76:32:DB:DE:FA:D0:BC:FB:5A:7B:17:BD:9E:56:09:24:94
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Secure Mail Root E45"
+CKA_LABEL UTF8 "GTS Root R2"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\030\056\037\062\117\211\337\276\376\210\211\360\223\302\304\240
-\053\147\165\041
+\232\104\111\166\062\333\336\372\320\274\373\132\173\027\275\236
+\126\011\044\224
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\305\374\306\056\237\364\122\055\052\250\244\272\373\147\062\377
+\036\071\300\123\346\036\051\202\013\312\122\125\066\135\127\334
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003
-\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040
-\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164
-\040\105\064\065
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\062
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\166\123\376\252\047\035\225\106\135\326\361\236\345\270
-\220\012
+\002\015\002\003\345\256\305\215\004\045\032\253\021\045\252
 END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "GlobalSign Root R46"
+# Certificate "GTS Root R3"
 #
-# Issuer: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE
-# Serial Number:11:d2:bb:b9:d7:23:18:9e:40:5f:0a:9d:2d:d0:df:25:67:d1
-# Subject: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE
-# Not Valid Before: Wed Mar 20 00:00:00 2019
-# Not Valid After : Tue Mar 20 00:00:00 2046
-# Fingerprint (SHA-256): 4F:A3:12:6D:8D:3A:11:D1:C4:85:5A:4F:80:7C:BA:D6:CF:91:9D:3A:5A:88:B0:3B:EA:2C:63:72:D9:3C:40:C9
-# Fingerprint (SHA1): 53:A2:B0:4B:CA:6B:D6:45:E6:39:8A:8E:C4:0D:D2:BF:77:C3:A2:90
+# Issuer: CN=GTS Root R3,O=Google Trust Services LLC,C=US
+# Serial Number:02:03:e5:b8:82:eb:20:f8:25:27:6d:3d:66
+# Subject: CN=GTS Root R3,O=Google Trust Services LLC,C=US
+# Not Valid Before: Wed Jun 22 00:00:00 2016
+# Not Valid After : Sun Jun 22 00:00:00 2036
+# Fingerprint (SHA-256): 34:D8:A7:3E:E2:08:D9:BC:DB:0D:95:65:20:93:4B:4E:40:E6:94:82:59:6E:8B:6F:73:C8:42:6B:01:0A:6F:48
+# Fingerprint (SHA1): ED:E5:71:80:2B:C8:92:B9:5B:83:3C:D2:32:68:3F:09:CD:A0:1E:46
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Root R46"
+CKA_LABEL UTF8 "GTS Root R3"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
-\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
-\122\157\157\164\040\122\064\066
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\063
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
-\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
-\122\157\157\164\040\122\064\066
-END
-CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\022\021\322\273\271\327\043\030\236\100\137\012\235\055\320
-\337\045\147\321
-END
-CKA_VALUE MULTILINE_OCTAL
-\060\202\005\132\060\202\003\102\240\003\002\001\002\002\022\021
-\322\273\271\327\043\030\236\100\137\012\235\055\320\337\045\147
-\321\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000
-\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
-\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
-\122\157\157\164\040\122\064\066\060\036\027\015\061\071\060\063
-\062\060\060\060\060\060\060\060\132\027\015\064\066\060\063\062
-\060\060\060\060\060\060\060\132\060\106\061\013\060\011\006\003
-\125\004\006\023\002\102\105\061\031\060\027\006\003\125\004\012
-\023\020\107\154\157\142\141\154\123\151\147\156\040\156\166\055
-\163\141\061\034\060\032\006\003\125\004\003\023\023\107\154\157
-\142\141\154\123\151\147\156\040\122\157\157\164\040\122\064\066
-\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
-\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
-\000\254\254\164\062\350\263\145\345\272\355\103\046\035\246\211
-\015\105\272\051\210\262\244\035\143\335\323\301\054\011\127\211
-\071\241\125\351\147\064\167\014\156\344\125\035\122\045\322\023
-\153\136\341\035\251\267\175\211\062\137\015\236\237\054\172\143
-\140\100\037\246\260\266\170\217\231\124\226\010\130\256\344\006
-\274\142\005\002\026\277\257\250\043\003\266\224\017\274\156\154
-\302\313\325\246\273\014\351\366\301\002\373\041\336\146\335\027
-\253\164\102\357\360\164\057\045\364\352\153\125\133\220\333\235
-\337\136\207\012\100\373\255\031\153\373\367\312\140\210\336\332
-\301\217\326\256\325\177\324\074\203\356\327\026\114\203\105\063
-\153\047\320\206\320\034\055\153\363\253\175\361\205\251\365\050
-\322\255\357\363\204\113\034\207\374\023\243\072\162\242\132\021
-\053\326\047\161\047\355\201\055\155\146\201\222\207\264\033\130
-\172\314\077\012\372\106\117\115\170\134\370\053\110\343\004\204
-\313\135\366\264\152\263\145\374\102\236\121\046\043\040\313\075
-\024\371\201\355\145\026\000\117\032\144\227\146\010\317\214\173
-\343\053\300\235\371\024\362\033\361\126\152\026\277\054\205\205
-\315\170\070\232\353\102\152\002\064\030\203\027\116\224\126\370
-\266\202\265\363\226\335\075\363\276\177\040\167\076\173\031\043
-\153\054\324\162\163\103\127\175\340\370\327\151\117\027\066\004
-\371\300\220\140\067\105\336\346\014\330\164\215\256\234\242\155
-\164\135\102\276\006\365\331\144\156\002\020\254\211\260\114\073
-\007\115\100\176\044\305\212\230\202\171\216\244\247\202\040\215
-\043\372\047\161\311\337\306\101\164\240\115\366\221\026\334\106
-\214\137\051\143\061\131\161\014\330\157\302\266\062\175\373\346
-\135\123\246\176\025\374\273\165\174\135\354\370\366\027\034\354
-\307\153\031\313\363\173\360\053\007\245\331\154\171\124\166\154
-\235\034\246\156\016\351\171\014\250\043\152\243\337\033\060\061
-\237\261\124\173\376\152\313\146\252\334\145\320\242\236\112\232
-\007\041\153\201\217\333\304\131\372\336\042\300\004\234\343\252
-\133\066\223\350\075\275\172\241\235\013\166\261\013\307\235\375
-\317\230\250\006\302\370\052\243\241\203\240\267\045\162\245\002
-\343\002\003\001\000\001\243\102\060\100\060\016\006\003\125\035
-\017\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035
-\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125
-\035\016\004\026\004\024\003\134\253\163\201\207\250\314\260\246
-\325\224\342\066\226\111\377\005\231\054\060\015\006\011\052\206
-\110\206\367\015\001\001\014\005\000\003\202\002\001\000\174\170
-\354\366\002\054\273\133\176\222\053\135\071\334\276\330\035\242
-\102\063\115\371\357\244\052\073\104\151\036\254\331\105\243\116
-\074\247\330\044\121\262\124\034\223\116\304\357\173\223\205\140
-\046\352\011\110\340\365\273\307\351\150\322\273\152\061\161\314
-\171\256\021\250\360\231\375\345\037\274\057\250\314\127\353\166
-\304\041\246\107\123\125\115\150\277\005\244\356\327\046\253\142
-\332\103\067\113\342\306\265\345\262\203\031\072\307\323\333\115
-\236\010\172\363\356\317\076\142\373\254\350\140\314\321\307\241
-\134\203\105\304\105\314\363\027\153\024\311\004\002\076\322\044
-\246\171\351\036\316\242\347\301\131\025\237\035\342\113\232\076
-\237\166\010\055\153\330\272\127\024\332\203\352\376\214\125\351
-\320\116\251\314\167\061\261\104\021\172\134\261\076\323\024\105
-\025\030\142\044\023\322\313\115\316\134\203\301\066\362\020\265
-\016\210\155\270\341\126\237\211\336\226\146\071\107\144\054\156
-\115\256\142\173\277\140\164\031\270\126\254\222\254\026\062\355
-\255\150\125\376\230\272\323\064\336\364\311\141\303\016\206\366
-\113\204\140\356\015\173\265\062\130\171\221\125\054\201\103\263
-\164\037\172\252\045\236\035\327\241\213\271\315\102\056\004\244
-\146\203\115\211\065\266\154\250\066\112\171\041\170\042\320\102
-\274\321\100\061\220\241\276\004\317\312\147\355\365\360\200\323
-\140\311\203\052\042\005\320\007\073\122\277\014\236\252\053\371
-\273\346\037\217\045\272\205\215\027\036\002\376\135\120\004\127
-\317\376\055\274\357\134\300\032\253\266\237\044\306\337\163\150
-\110\220\054\024\364\077\122\032\344\322\313\024\303\141\151\317
-\342\371\030\305\272\063\237\024\243\004\135\271\161\367\265\224
-\330\366\063\301\132\301\064\213\174\233\335\223\072\347\023\242
-\160\141\237\257\217\353\330\305\165\370\063\146\324\164\147\072
-\067\167\234\347\335\244\017\166\103\146\212\103\362\237\373\014
-\102\170\143\321\342\017\157\173\324\241\075\164\227\205\267\110
-\071\101\326\040\374\320\072\263\372\350\157\304\212\272\161\067
-\276\213\227\261\170\061\117\263\347\266\003\023\316\124\235\256
-\045\131\314\177\065\137\010\367\100\105\061\170\052\172
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\063
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\015\002\003\345\270\202\353\040\370\045\047\155\075\146
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\011\060\202\001\216\240\003\002\001\002\002\015\002
+\003\345\270\202\353\040\370\045\047\155\075\146\060\012\006\010
+\052\206\110\316\075\004\003\003\060\107\061\013\060\011\006\003
+\125\004\006\023\002\125\123\061\042\060\040\006\003\125\004\012
+\023\031\107\157\157\147\154\145\040\124\162\165\163\164\040\123
+\145\162\166\151\143\145\163\040\114\114\103\061\024\060\022\006
+\003\125\004\003\023\013\107\124\123\040\122\157\157\164\040\122
+\063\060\036\027\015\061\066\060\066\062\062\060\060\060\060\060
+\060\132\027\015\063\066\060\066\062\062\060\060\060\060\060\060
+\132\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154
+\145\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163
+\040\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107
+\124\123\040\122\157\157\164\040\122\063\060\166\060\020\006\007
+\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142
+\000\004\037\117\063\207\063\051\212\241\204\336\313\307\041\130
+\101\211\352\126\235\053\113\205\306\035\114\047\274\177\046\121
+\162\157\342\237\326\243\312\314\105\024\106\213\255\357\176\206
+\214\354\261\176\057\377\251\161\235\030\204\105\004\101\125\156
+\053\352\046\177\273\220\001\343\113\031\272\344\124\226\105\011
+\261\325\154\221\104\255\204\023\216\232\214\015\200\014\062\366
+\340\047\243\102\060\100\060\016\006\003\125\035\017\001\001\377
+\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377
+\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026
+\004\024\301\361\046\272\240\055\256\205\201\317\323\361\052\022
+\275\270\012\147\375\274\060\012\006\010\052\206\110\316\075\004
+\003\003\003\151\000\060\146\002\061\000\366\341\040\225\024\173
+\124\243\220\026\021\277\204\310\352\157\153\027\236\036\106\230
+\040\233\237\323\015\331\254\323\057\315\174\370\133\056\125\273
+\277\335\222\367\244\014\334\061\341\242\002\061\000\374\227\146
+\146\345\103\026\023\203\335\307\337\057\276\024\070\355\001\316
+\261\027\032\021\165\351\275\003\217\046\176\204\345\311\140\246
+\225\327\124\131\267\347\021\054\211\324\271\356\027
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "GlobalSign Root R46"
-# Issuer: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE
-# Serial Number:11:d2:bb:b9:d7:23:18:9e:40:5f:0a:9d:2d:d0:df:25:67:d1
-# Subject: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE
-# Not Valid Before: Wed Mar 20 00:00:00 2019
-# Not Valid After : Tue Mar 20 00:00:00 2046
-# Fingerprint (SHA-256): 4F:A3:12:6D:8D:3A:11:D1:C4:85:5A:4F:80:7C:BA:D6:CF:91:9D:3A:5A:88:B0:3B:EA:2C:63:72:D9:3C:40:C9
-# Fingerprint (SHA1): 53:A2:B0:4B:CA:6B:D6:45:E6:39:8A:8E:C4:0D:D2:BF:77:C3:A2:90
+# Trust for "GTS Root R3"
+# Issuer: CN=GTS Root R3,O=Google Trust Services LLC,C=US
+# Serial Number:02:03:e5:b8:82:eb:20:f8:25:27:6d:3d:66
+# Subject: CN=GTS Root R3,O=Google Trust Services LLC,C=US
+# Not Valid Before: Wed Jun 22 00:00:00 2016
+# Not Valid After : Sun Jun 22 00:00:00 2036
+# Fingerprint (SHA-256): 34:D8:A7:3E:E2:08:D9:BC:DB:0D:95:65:20:93:4B:4E:40:E6:94:82:59:6E:8B:6F:73:C8:42:6B:01:0A:6F:48
+# Fingerprint (SHA1): ED:E5:71:80:2B:C8:92:B9:5B:83:3C:D2:32:68:3F:09:CD:A0:1E:46
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Root R46"
+CKA_LABEL UTF8 "GTS Root R3"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\123\242\260\113\312\153\326\105\346\071\212\216\304\015\322\277
-\167\303\242\220
+\355\345\161\200\053\310\222\271\133\203\074\322\062\150\077\011
+\315\240\036\106
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\304\024\060\344\372\146\103\224\052\152\033\044\137\031\320\357
+\076\347\235\130\002\224\106\121\224\345\340\042\112\213\347\163
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
-\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
-\122\157\157\164\040\122\064\066
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\022\021\322\273\271\327\043\030\236\100\137\012\235\055\320
-\337\045\147\321
+\002\015\002\003\345\270\202\353\040\370\045\047\155\075\146
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "GlobalSign Root E46"
+# Certificate "GTS Root R4"
 #
-# Issuer: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE
-# Serial Number:11:d2:bb:ba:33:6e:d4:bc:e6:24:68:c5:0d:84:1d:98:e8:43
-# Subject: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE
-# Not Valid Before: Wed Mar 20 00:00:00 2019
-# Not Valid After : Tue Mar 20 00:00:00 2046
-# Fingerprint (SHA-256): CB:B9:C4:4D:84:B8:04:3E:10:50:EA:31:A6:9F:51:49:55:D7:BF:D2:E2:C6:B4:93:01:01:9A:D6:1D:9F:50:58
-# Fingerprint (SHA1): 39:B4:6C:D5:FE:80:06:EB:E2:2F:4A:BB:08:33:A0:AF:DB:B9:DD:84
+# Issuer: CN=GTS Root R4,O=Google Trust Services LLC,C=US
+# Serial Number:02:03:e5:c0:68:ef:63:1a:9c:72:90:50:52
+# Subject: CN=GTS Root R4,O=Google Trust Services LLC,C=US
+# Not Valid Before: Wed Jun 22 00:00:00 2016
+# Not Valid After : Sun Jun 22 00:00:00 2036
+# Fingerprint (SHA-256): 34:9D:FA:40:58:C5:E2:63:12:3B:39:8A:E7:95:57:3C:4E:13:13:C8:3F:E6:8F:93:55:6C:D5:E8:03:1B:3C:7D
+# Fingerprint (SHA1): 77:D3:03:67:B5:E0:0C:15:F6:0C:38:61:DF:7C:E1:3B:92:46:4D:47
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Root E46"
+CKA_LABEL UTF8 "GTS Root R4"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
-\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
-\122\157\157\164\040\105\064\066
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\064
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
-\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
-\122\157\157\164\040\105\064\066
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\064
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\022\021\322\273\272\063\156\324\274\346\044\150\305\015\204
-\035\230\350\103
+\002\015\002\003\345\300\150\357\143\032\234\162\220\120\122
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\013\060\202\001\221\240\003\002\001\002\002\022\021
-\322\273\272\063\156\324\274\346\044\150\305\015\204\035\230\350
-\103\060\012\006\010\052\206\110\316\075\004\003\003\060\106\061
-\013\060\011\006\003\125\004\006\023\002\102\105\061\031\060\027
-\006\003\125\004\012\023\020\107\154\157\142\141\154\123\151\147
-\156\040\156\166\055\163\141\061\034\060\032\006\003\125\004\003
-\023\023\107\154\157\142\141\154\123\151\147\156\040\122\157\157
-\164\040\105\064\066\060\036\027\015\061\071\060\063\062\060\060
-\060\060\060\060\060\132\027\015\064\066\060\063\062\060\060\060
-\060\060\060\060\132\060\106\061\013\060\011\006\003\125\004\006
-\023\002\102\105\061\031\060\027\006\003\125\004\012\023\020\107
-\154\157\142\141\154\123\151\147\156\040\156\166\055\163\141\061
-\034\060\032\006\003\125\004\003\023\023\107\154\157\142\141\154
-\123\151\147\156\040\122\157\157\164\040\105\064\066\060\166\060
-\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000
-\042\003\142\000\004\234\016\261\317\267\350\236\122\167\165\064
-\372\245\106\247\255\062\031\062\264\007\251\047\312\224\273\014
-\322\012\020\307\332\211\260\227\014\160\023\011\001\216\330\352
-\107\352\276\262\200\053\315\374\050\015\333\254\274\244\206\067
-\355\160\010\000\165\352\223\013\173\056\122\234\043\150\043\006
-\103\354\222\057\123\204\333\373\107\024\007\350\137\224\147\135
-\311\172\201\074\040\243\102\060\100\060\016\006\003\125\035\017
-\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035\023
-\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035
-\016\004\026\004\024\061\012\220\217\266\306\235\322\104\113\200
-\265\242\346\037\261\022\117\033\225\060\012\006\010\052\206\110
-\316\075\004\003\003\003\150\000\060\145\002\061\000\337\124\220
-\355\233\357\213\224\002\223\027\202\231\276\263\236\054\366\013
-\221\214\237\112\024\261\366\144\274\273\150\121\023\014\003\367
-\025\213\204\140\271\213\377\122\216\347\214\274\034\002\060\074
-\371\021\324\214\116\300\301\141\302\025\114\252\253\035\013\061
-\137\073\034\342\000\227\104\061\346\376\163\226\057\332\226\323
-\376\010\007\263\064\211\274\005\237\367\036\206\356\213\160
+\060\202\002\011\060\202\001\216\240\003\002\001\002\002\015\002
+\003\345\300\150\357\143\032\234\162\220\120\122\060\012\006\010
+\052\206\110\316\075\004\003\003\060\107\061\013\060\011\006\003
+\125\004\006\023\002\125\123\061\042\060\040\006\003\125\004\012
+\023\031\107\157\157\147\154\145\040\124\162\165\163\164\040\123
+\145\162\166\151\143\145\163\040\114\114\103\061\024\060\022\006
+\003\125\004\003\023\013\107\124\123\040\122\157\157\164\040\122
+\064\060\036\027\015\061\066\060\066\062\062\060\060\060\060\060
+\060\132\027\015\063\066\060\066\062\062\060\060\060\060\060\060
+\132\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123
+\061\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154
+\145\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163
+\040\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107
+\124\123\040\122\157\157\164\040\122\064\060\166\060\020\006\007
+\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142
+\000\004\363\164\163\247\150\213\140\256\103\270\065\305\201\060
+\173\113\111\235\373\301\141\316\346\336\106\275\153\325\141\030
+\065\256\100\335\163\367\211\221\060\132\353\074\356\205\174\242
+\100\166\073\251\306\270\107\330\052\347\222\221\152\163\351\261
+\162\071\237\051\237\242\230\323\137\136\130\206\145\017\241\204
+\145\006\321\334\213\311\307\163\310\214\152\057\345\304\253\321
+\035\212\243\102\060\100\060\016\006\003\125\035\017\001\001\377
+\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377
+\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026
+\004\024\200\114\326\353\164\377\111\066\243\325\330\374\265\076
+\305\152\360\224\035\214\060\012\006\010\052\206\110\316\075\004
+\003\003\003\151\000\060\146\002\061\000\350\100\377\203\336\003
+\364\237\256\035\172\247\056\271\257\117\366\203\035\016\055\205
+\001\035\321\331\152\354\017\302\257\307\136\126\136\134\325\034
+\130\042\050\013\367\060\266\057\261\174\002\061\000\360\141\074
+\247\364\240\202\343\041\325\204\035\163\206\234\055\257\312\064
+\233\361\237\271\043\066\342\274\140\003\235\200\263\232\126\310
+\341\342\273\024\171\312\315\041\324\224\265\111\103
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "GlobalSign Root E46"
-# Issuer: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE
-# Serial Number:11:d2:bb:ba:33:6e:d4:bc:e6:24:68:c5:0d:84:1d:98:e8:43
-# Subject: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE
-# Not Valid Before: Wed Mar 20 00:00:00 2019
-# Not Valid After : Tue Mar 20 00:00:00 2046
-# Fingerprint (SHA-256): CB:B9:C4:4D:84:B8:04:3E:10:50:EA:31:A6:9F:51:49:55:D7:BF:D2:E2:C6:B4:93:01:01:9A:D6:1D:9F:50:58
-# Fingerprint (SHA1): 39:B4:6C:D5:FE:80:06:EB:E2:2F:4A:BB:08:33:A0:AF:DB:B9:DD:84
+# Trust for "GTS Root R4"
+# Issuer: CN=GTS Root R4,O=Google Trust Services LLC,C=US
+# Serial Number:02:03:e5:c0:68:ef:63:1a:9c:72:90:50:52
+# Subject: CN=GTS Root R4,O=Google Trust Services LLC,C=US
+# Not Valid Before: Wed Jun 22 00:00:00 2016
+# Not Valid After : Sun Jun 22 00:00:00 2036
+# Fingerprint (SHA-256): 34:9D:FA:40:58:C5:E2:63:12:3B:39:8A:E7:95:57:3C:4E:13:13:C8:3F:E6:8F:93:55:6C:D5:E8:03:1B:3C:7D
+# Fingerprint (SHA1): 77:D3:03:67:B5:E0:0C:15:F6:0C:38:61:DF:7C:E1:3B:92:46:4D:47
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GlobalSign Root E46"
+CKA_LABEL UTF8 "GTS Root R4"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\071\264\154\325\376\200\006\353\342\057\112\273\010\063\240\257
-\333\271\335\204
+\167\323\003\147\265\340\014\025\366\014\070\141\337\174\341\073
+\222\106\115\107
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\265\270\146\355\336\010\203\343\311\342\001\064\006\254\121\157
+\103\226\203\167\031\115\166\263\235\145\122\344\035\042\245\350
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061
-\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154
-\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003
-\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040
-\122\157\157\164\040\105\064\066
+\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145
+\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040
+\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124
+\123\040\122\157\157\164\040\122\064
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\022\021\322\273\272\063\156\324\274\346\044\150\305\015\204
-\035\230\350\103
+\002\015\002\003\345\300\150\357\143\032\234\162\220\120\122
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "GLOBALTRUST 2020"
+# Certificate "Telia Root CA v2"
 #
-# Issuer: CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT
-# Serial Number:5a:4b:bd:5a:fb:4f:8a:5b:fa:65:e5
-# Subject: CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT
-# Not Valid Before: Mon Feb 10 00:00:00 2020
-# Not Valid After : Sun Jun 10 00:00:00 2040
-# Fingerprint (SHA-256): 9A:29:6A:51:82:D1:D4:51:A2:E3:7F:43:9B:74:DA:AF:A2:67:52:33:29:F9:0F:9A:0D:20:07:C3:34:E2:3C:9A
-# Fingerprint (SHA1): D0:67:C1:13:51:01:0C:AA:D0:C7:6A:65:37:31:16:26:4F:53:71:A2
+# Issuer: CN=Telia Root CA v2,O=Telia Finland Oyj,C=FI
+# Serial Number:01:67:5f:27:d6:fe:7a:e3:e4:ac:be:09:5b:05:9e
+# Subject: CN=Telia Root CA v2,O=Telia Finland Oyj,C=FI
+# Not Valid Before: Thu Nov 29 11:55:54 2018
+# Not Valid After : Sun Nov 29 11:55:54 2043
+# Fingerprint (SHA-256): 24:2B:69:74:2F:CB:1E:5B:2A:BF:98:89:8B:94:57:21:87:54:4E:5B:4D:99:11:78:65:73:62:1F:6A:74:B8:2C
+# Fingerprint (SHA1): B9:99:CD:D1:73:50:8A:C4:47:05:08:9C:8C:88:FB:BE:A0:2B:40:CD
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GLOBALTRUST 2020"
+CKA_LABEL UTF8 "Telia Root CA v2"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\115\061\013\060\011\006\003\125\004\006\023\002\101\124\061
-\043\060\041\006\003\125\004\012\023\032\145\055\143\157\155\155
-\145\162\143\145\040\155\157\156\151\164\157\162\151\156\147\040
-\107\155\142\110\061\031\060\027\006\003\125\004\003\023\020\107
-\114\117\102\101\114\124\122\125\123\124\040\062\060\062\060
+\060\104\061\013\060\011\006\003\125\004\006\023\002\106\111\061
+\032\060\030\006\003\125\004\012\014\021\124\145\154\151\141\040
+\106\151\156\154\141\156\144\040\117\171\152\061\031\060\027\006
+\003\125\004\003\014\020\124\145\154\151\141\040\122\157\157\164
+\040\103\101\040\166\062
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\115\061\013\060\011\006\003\125\004\006\023\002\101\124\061
-\043\060\041\006\003\125\004\012\023\032\145\055\143\157\155\155
-\145\162\143\145\040\155\157\156\151\164\157\162\151\156\147\040
-\107\155\142\110\061\031\060\027\006\003\125\004\003\023\020\107
-\114\117\102\101\114\124\122\125\123\124\040\062\060\062\060
+\060\104\061\013\060\011\006\003\125\004\006\023\002\106\111\061
+\032\060\030\006\003\125\004\012\014\021\124\145\154\151\141\040
+\106\151\156\154\141\156\144\040\117\171\152\061\031\060\027\006
+\003\125\004\003\014\020\124\145\154\151\141\040\122\157\157\164
+\040\103\101\040\166\062
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\013\132\113\275\132\373\117\212\133\372\145\345
+\002\017\001\147\137\047\326\376\172\343\344\254\276\011\133\005
+\236
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\202\060\202\003\152\240\003\002\001\002\002\013\132
-\113\275\132\373\117\212\133\372\145\345\060\015\006\011\052\206
-\110\206\367\015\001\001\013\005\000\060\115\061\013\060\011\006
-\003\125\004\006\023\002\101\124\061\043\060\041\006\003\125\004
-\012\023\032\145\055\143\157\155\155\145\162\143\145\040\155\157
-\156\151\164\157\162\151\156\147\040\107\155\142\110\061\031\060
-\027\006\003\125\004\003\023\020\107\114\117\102\101\114\124\122
-\125\123\124\040\062\060\062\060\060\036\027\015\062\060\060\062
-\061\060\060\060\060\060\060\060\132\027\015\064\060\060\066\061
-\060\060\060\060\060\060\060\132\060\115\061\013\060\011\006\003
-\125\004\006\023\002\101\124\061\043\060\041\006\003\125\004\012
-\023\032\145\055\143\157\155\155\145\162\143\145\040\155\157\156
-\151\164\157\162\151\156\147\040\107\155\142\110\061\031\060\027
-\006\003\125\004\003\023\020\107\114\117\102\101\114\124\122\125
-\123\124\040\062\060\062\060\060\202\002\042\060\015\006\011\052
-\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060
-\202\002\012\002\202\002\001\000\256\056\126\255\033\034\357\366
-\225\217\240\167\033\053\323\143\217\204\115\105\242\017\237\133
-\105\253\131\173\121\064\371\354\213\212\170\305\335\153\257\275
-\304\337\223\105\036\277\221\070\013\256\016\026\347\101\163\370
-\333\273\321\270\121\340\313\203\073\163\070\156\167\212\017\131
-\143\046\315\247\052\316\124\373\270\342\300\174\107\316\140\174
-\077\262\163\362\300\031\266\212\222\207\065\015\220\050\242\344
-\025\004\143\076\272\257\356\174\136\314\246\213\120\262\070\367
-\101\143\312\316\377\151\217\150\016\225\066\345\314\271\214\011
-\312\113\335\061\220\226\310\314\037\375\126\226\064\333\216\034
-\352\054\276\205\056\143\335\252\251\225\323\375\051\225\023\360
-\310\230\223\331\055\026\107\220\021\203\242\072\042\242\050\127
-\242\353\376\300\214\050\240\246\175\347\052\102\073\202\200\143
-\245\143\037\031\314\174\262\146\250\302\323\155\067\157\342\176
-\006\121\331\105\204\037\022\316\044\122\144\205\013\110\200\116
-\207\261\042\042\060\252\353\256\276\340\002\340\100\350\260\102
-\200\003\121\252\264\176\252\104\327\103\141\363\242\153\026\211
-\111\244\243\244\053\212\002\304\170\364\150\212\301\344\172\066
-\261\157\033\226\033\167\111\215\324\311\006\162\217\317\123\343
-\334\027\205\040\112\334\230\047\323\221\046\053\107\036\151\007
-\257\336\242\344\344\324\153\013\263\136\174\324\044\200\107\051
-\151\073\156\350\254\375\100\353\330\355\161\161\053\362\350\130
-\035\353\101\227\042\305\037\324\071\320\047\217\207\343\030\364
-\340\251\106\015\365\164\072\202\056\320\156\054\221\243\061\134
-\073\106\352\173\004\020\126\136\200\035\365\245\145\350\202\374
-\342\007\214\142\105\365\040\336\106\160\206\241\274\223\323\036
-\164\246\154\260\054\367\003\014\210\014\313\324\162\123\206\274
-\140\106\363\230\152\302\361\277\103\371\160\040\167\312\067\101
-\171\125\122\143\215\133\022\237\305\150\304\210\235\254\362\060
-\253\267\243\061\227\147\255\217\027\017\154\307\163\355\044\224
-\153\310\203\232\320\232\067\111\004\253\261\026\310\154\111\111
-\055\253\241\320\214\222\362\101\112\171\041\045\333\143\327\266
-\234\247\176\102\151\373\072\143\002\003\001\000\001\243\143\060
-\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001
-\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002
-\001\006\060\035\006\003\125\035\016\004\026\004\024\334\056\037
-\321\141\067\171\344\253\325\325\263\022\161\150\075\152\150\234
-\042\060\037\006\003\125\035\043\004\030\060\026\200\024\334\056
-\037\321\141\067\171\344\253\325\325\263\022\161\150\075\152\150
-\234\042\060\015\006\011\052\206\110\206\367\015\001\001\013\005
-\000\003\202\002\001\000\221\360\102\002\150\100\356\303\150\300
-\124\057\337\354\142\303\303\236\212\240\061\050\252\203\216\244
-\126\226\022\020\206\126\272\227\162\322\124\060\174\255\031\325
-\035\150\157\373\024\102\330\215\016\363\265\321\245\343\002\102
-\136\334\350\106\130\007\065\002\060\340\274\164\112\301\103\052
-\377\333\032\320\260\257\154\303\375\313\263\365\177\155\003\056
-\131\126\235\055\055\065\214\262\326\103\027\054\222\012\313\135
-\350\214\017\113\160\103\320\202\377\250\314\277\244\224\300\276
-\207\275\212\343\223\173\306\217\233\026\235\047\145\274\172\305
-\102\202\154\134\007\320\251\301\210\140\104\351\230\205\026\137
-\370\217\312\001\020\316\045\303\371\140\033\240\305\227\303\323
-\054\210\061\242\275\060\354\320\320\300\022\361\301\071\343\345
-\365\370\326\112\335\064\315\373\157\301\117\343\000\213\126\342
-\222\367\050\262\102\167\162\043\147\307\077\021\025\262\304\003
-\005\276\273\021\173\012\277\250\156\347\377\130\103\317\233\147
-\240\200\007\266\035\312\255\155\352\101\021\176\055\164\223\373
-\302\274\276\121\104\305\357\150\045\047\200\343\310\240\324\022
-\354\331\245\067\035\067\174\264\221\312\332\324\261\226\201\357
-\150\134\166\020\111\257\176\245\067\200\261\034\122\275\063\201
-\114\217\371\335\145\331\024\315\212\045\130\364\342\305\203\245
-\011\220\324\154\024\143\265\100\337\353\300\374\304\130\176\015
-\024\026\207\124\047\156\126\344\160\204\270\154\062\022\176\202
-\061\103\276\327\335\174\241\255\256\326\253\040\022\357\012\303
-\020\214\111\226\065\334\013\165\136\261\117\325\117\064\016\021
-\040\007\165\103\105\351\243\021\332\254\243\231\302\266\171\047
-\342\271\357\310\342\366\065\051\172\164\372\305\177\202\005\142
-\246\012\352\150\262\171\107\006\156\362\127\250\025\063\306\367
-\170\112\075\102\173\153\176\376\367\106\352\321\353\216\357\210
-\150\133\350\301\331\161\176\375\144\357\377\147\107\210\130\045
-\057\076\206\007\275\373\250\345\202\250\254\245\323\151\103\315
-\061\210\111\204\123\222\300\261\071\033\071\203\001\060\304\362
-\251\372\320\003\275\162\067\140\126\037\066\174\275\071\221\365
-\155\015\277\173\327\222
+\060\202\005\164\060\202\003\134\240\003\002\001\002\002\017\001
+\147\137\047\326\376\172\343\344\254\276\011\133\005\236\060\015
+\006\011\052\206\110\206\367\015\001\001\013\005\000\060\104\061
+\013\060\011\006\003\125\004\006\023\002\106\111\061\032\060\030
+\006\003\125\004\012\014\021\124\145\154\151\141\040\106\151\156
+\154\141\156\144\040\117\171\152\061\031\060\027\006\003\125\004
+\003\014\020\124\145\154\151\141\040\122\157\157\164\040\103\101
+\040\166\062\060\036\027\015\061\070\061\061\062\071\061\061\065
+\065\065\064\132\027\015\064\063\061\061\062\071\061\061\065\065
+\065\064\132\060\104\061\013\060\011\006\003\125\004\006\023\002
+\106\111\061\032\060\030\006\003\125\004\012\014\021\124\145\154
+\151\141\040\106\151\156\154\141\156\144\040\117\171\152\061\031
+\060\027\006\003\125\004\003\014\020\124\145\154\151\141\040\122
+\157\157\164\040\103\101\040\166\062\060\202\002\042\060\015\006
+\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017
+\000\060\202\002\012\002\202\002\001\000\262\320\077\007\274\342
+\173\320\153\231\370\342\167\151\347\316\235\244\003\274\202\155
+\241\376\201\145\037\114\047\254\216\000\272\026\173\353\060\152
+\000\300\263\164\150\176\262\257\307\325\142\263\172\077\120\312
+\214\066\104\044\143\322\066\351\014\205\366\103\166\325\114\241
+\140\162\147\342\050\063\245\313\061\270\072\042\043\064\270\175
+\275\126\042\100\235\352\364\173\003\255\150\374\262\201\117\230
+\320\164\352\215\345\175\315\143\303\243\366\336\222\302\130\031
+\340\226\273\305\304\251\075\245\164\226\376\257\371\211\252\275
+\225\027\124\330\170\104\361\014\167\025\222\340\230\102\247\244
+\326\252\040\222\315\301\240\263\226\262\072\204\102\215\175\325
+\225\344\326\333\351\142\304\130\263\171\305\214\323\065\063\203
+\237\165\241\122\047\141\070\361\131\075\216\120\340\275\171\074
+\347\154\226\376\136\331\002\145\264\216\134\320\021\064\337\135
+\277\122\247\201\000\303\177\231\105\231\025\325\027\310\012\123
+\354\143\363\231\175\314\151\022\206\302\027\360\001\236\277\204
+\274\321\122\313\033\222\146\316\244\123\345\241\277\304\333\011
+\326\346\211\126\053\310\343\174\336\343\377\211\345\065\156\050
+\350\154\013\043\121\251\045\005\353\110\370\335\261\312\372\154
+\010\121\357\267\030\154\104\312\046\341\163\306\211\006\201\345
+\212\254\260\342\051\306\271\044\263\153\104\021\364\245\103\302
+\114\103\345\160\066\214\266\063\127\172\225\056\202\240\364\134
+\020\263\141\203\366\002\005\206\056\174\055\154\334\003\106\156
+\065\223\325\172\225\057\336\040\330\133\176\224\220\004\152\272
+\131\075\004\005\165\235\067\242\016\056\075\353\301\244\122\203
+\376\320\153\324\146\216\334\306\351\022\116\035\052\127\252\020
+\274\174\136\202\175\246\246\311\362\055\271\365\027\047\255\321
+\016\211\124\053\225\372\300\255\035\230\024\170\063\102\206\012
+\251\163\265\373\164\015\267\033\060\031\304\132\016\034\047\267
+\332\030\320\377\212\310\005\272\361\252\034\242\067\267\346\110
+\244\106\054\224\352\250\166\142\107\213\020\123\007\110\127\154
+\342\222\115\266\256\005\313\334\301\112\136\217\254\075\031\116
+\302\355\140\165\053\333\301\312\102\325\002\003\001\000\001\243
+\143\060\141\060\037\006\003\125\035\043\004\030\060\026\200\024
+\162\254\344\063\171\252\105\207\366\375\254\035\236\326\307\057
+\206\330\044\071\060\035\006\003\125\035\016\004\026\004\024\162
+\254\344\063\171\252\105\207\366\375\254\035\236\326\307\057\206
+\330\044\071\060\016\006\003\125\035\017\001\001\377\004\004\003
+\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060
+\003\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001
+\013\005\000\003\202\002\001\000\240\073\131\247\011\224\076\066
+\204\322\176\057\071\245\226\227\372\021\255\374\147\363\161\011
+\362\262\211\204\147\104\257\271\357\355\226\354\234\144\333\062
+\060\157\147\232\254\176\137\262\253\001\066\176\201\372\344\204
+\136\322\254\066\340\153\142\305\175\113\016\202\155\322\166\142
+\321\376\227\370\237\060\174\030\371\264\122\167\202\035\166\333
+\323\035\251\360\301\232\000\275\155\165\330\175\347\372\307\070
+\243\234\160\350\106\171\003\257\056\164\333\165\370\156\123\014
+\003\310\231\032\211\065\031\074\323\311\124\174\250\360\054\346
+\156\007\171\157\152\341\346\352\221\202\151\012\035\303\176\131
+\242\236\153\106\025\230\133\323\257\106\035\142\310\316\200\122
+\111\021\077\311\004\022\303\023\174\077\073\212\226\333\074\240
+\036\012\264\213\124\262\044\147\015\357\202\313\276\074\175\321
+\342\177\256\026\326\126\130\271\332\040\261\203\025\241\357\212
+\115\062\157\101\057\023\122\202\224\327\032\301\170\242\121\335
+\053\160\155\267\032\371\367\260\340\147\227\126\333\174\141\123
+\011\003\050\002\100\307\263\330\375\234\160\152\306\050\303\205
+\351\342\355\032\223\240\336\113\230\242\204\076\005\167\001\226
+\075\373\264\040\017\234\162\002\172\022\057\325\243\272\121\170
+\257\052\053\104\145\116\265\375\012\350\301\315\171\207\141\053
+\336\200\127\105\277\147\361\233\221\136\245\244\354\131\110\020
+\015\070\307\260\372\303\104\155\004\365\170\120\034\222\226\133
+\332\365\270\056\272\133\317\345\360\152\235\113\057\130\163\055
+\117\055\304\034\076\364\263\077\253\025\016\073\031\101\212\244
+\301\127\022\146\161\114\372\123\343\127\353\142\225\011\236\124
+\335\321\302\074\127\074\275\070\255\230\144\267\270\003\232\123
+\126\140\135\263\330\102\033\134\113\022\212\034\353\353\175\306
+\172\151\307\047\177\244\370\213\362\344\224\146\207\113\351\224
+\007\011\022\171\212\262\353\164\004\334\316\364\104\131\340\026
+\312\305\054\130\327\074\173\317\142\206\152\120\175\065\066\146
+\247\373\067\347\050\307\330\320\255\245\151\224\217\350\301\337
+\044\370\033\007\061\207\201\330\135\366\350\050\330\112\122\200
+\254\023\356\120\024\036\230\307
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "GLOBALTRUST 2020"
-# Issuer: CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT
-# Serial Number:5a:4b:bd:5a:fb:4f:8a:5b:fa:65:e5
-# Subject: CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT
-# Not Valid Before: Mon Feb 10 00:00:00 2020
-# Not Valid After : Sun Jun 10 00:00:00 2040
-# Fingerprint (SHA-256): 9A:29:6A:51:82:D1:D4:51:A2:E3:7F:43:9B:74:DA:AF:A2:67:52:33:29:F9:0F:9A:0D:20:07:C3:34:E2:3C:9A
-# Fingerprint (SHA1): D0:67:C1:13:51:01:0C:AA:D0:C7:6A:65:37:31:16:26:4F:53:71:A2
+# Trust for "Telia Root CA v2"
+# Issuer: CN=Telia Root CA v2,O=Telia Finland Oyj,C=FI
+# Serial Number:01:67:5f:27:d6:fe:7a:e3:e4:ac:be:09:5b:05:9e
+# Subject: CN=Telia Root CA v2,O=Telia Finland Oyj,C=FI
+# Not Valid Before: Thu Nov 29 11:55:54 2018
+# Not Valid After : Sun Nov 29 11:55:54 2043
+# Fingerprint (SHA-256): 24:2B:69:74:2F:CB:1E:5B:2A:BF:98:89:8B:94:57:21:87:54:4E:5B:4D:99:11:78:65:73:62:1F:6A:74:B8:2C
+# Fingerprint (SHA1): B9:99:CD:D1:73:50:8A:C4:47:05:08:9C:8C:88:FB:BE:A0:2B:40:CD
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "GLOBALTRUST 2020"
+CKA_LABEL UTF8 "Telia Root CA v2"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\320\147\301\023\121\001\014\252\320\307\152\145\067\061\026\046
-\117\123\161\242
+\271\231\315\321\163\120\212\304\107\005\010\234\214\210\373\276
+\240\053\100\315
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\212\307\157\313\155\343\314\242\361\174\203\372\016\170\327\350
+\016\217\254\252\202\337\205\261\364\334\020\034\374\231\331\110
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\115\061\013\060\011\006\003\125\004\006\023\002\101\124\061
-\043\060\041\006\003\125\004\012\023\032\145\055\143\157\155\155
-\145\162\143\145\040\155\157\156\151\164\157\162\151\156\147\040
-\107\155\142\110\061\031\060\027\006\003\125\004\003\023\020\107
-\114\117\102\101\114\124\122\125\123\124\040\062\060\062\060
+\060\104\061\013\060\011\006\003\125\004\006\023\002\106\111\061
+\032\060\030\006\003\125\004\012\014\021\124\145\154\151\141\040
+\106\151\156\154\141\156\144\040\117\171\152\061\031\060\027\006
+\003\125\004\003\014\020\124\145\154\151\141\040\122\157\157\164
+\040\103\101\040\166\062
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\013\132\113\275\132\373\117\212\133\372\145\345
+\002\017\001\147\137\047\326\376\172\343\344\254\276\011\133\005
+\236
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
@@ -21819,182 +22933,520 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "ANF Secure Server Root CA"
+# Certificate "D-TRUST BR Root CA 1 2020"
 #
-# Issuer: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510
-# Serial Number:0d:d3:e3:bc:6c:f9:6b:b1
-# Subject: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510
-# Not Valid Before: Wed Sep 04 10:00:38 2019
-# Not Valid After : Tue Aug 30 10:00:38 2039
-# Fingerprint (SHA-256): FB:8F:EC:75:91:69:B9:10:6B:1E:51:16:44:C6:18:C5:13:04:37:3F:6C:06:43:08:8D:8B:EF:FD:1B:99:75:99
-# Fingerprint (SHA1): 5B:6E:68:D0:CC:15:B6:A0:5F:1E:C1:5F:AE:02:FC:6B:2F:5D:6F:74
+# Issuer: CN=D-TRUST BR Root CA 1 2020,O=D-Trust GmbH,C=DE
+# Serial Number:7c:c9:8f:2b:84:d7:df:ea:0f:c9:65:9a:d3:4b:4d:96
+# Subject: CN=D-TRUST BR Root CA 1 2020,O=D-Trust GmbH,C=DE
+# Not Valid Before: Tue Feb 11 09:45:00 2020
+# Not Valid After : Sun Feb 11 09:44:59 2035
+# Fingerprint (SHA-256): E5:9A:AA:81:60:09:C2:2B:FF:5B:25:BA:D3:7D:F3:06:F0:49:79:7C:1F:81:D8:5A:B0:89:E6:57:BD:8F:00:44
+# Fingerprint (SHA1): 1F:5B:98:F0:E3:B5:F7:74:3C:ED:E6:B0:36:7D:32:CD:F4:09:41:67
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "ANF Secure Server Root CA"
+CKA_LABEL UTF8 "D-TRUST BR Root CA 1 2020"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\201\204\061\022\060\020\006\003\125\004\005\023\011\107\066
-\063\062\070\067\065\061\060\061\013\060\011\006\003\125\004\006
-\023\002\105\123\061\047\060\045\006\003\125\004\012\023\036\101
-\116\106\040\101\165\164\157\162\151\144\141\144\040\144\145\040
-\103\145\162\164\151\146\151\143\141\143\151\157\156\061\024\060
-\022\006\003\125\004\013\023\013\101\116\106\040\103\101\040\122
-\141\151\172\061\042\060\040\006\003\125\004\003\023\031\101\116
-\106\040\123\145\143\165\162\145\040\123\145\162\166\145\162\040
-\122\157\157\164\040\103\101
+\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061
+\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163
+\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023
+\031\104\055\124\122\125\123\124\040\102\122\040\122\157\157\164
+\040\103\101\040\061\040\062\060\062\060
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\204\061\022\060\020\006\003\125\004\005\023\011\107\066
-\063\062\070\067\065\061\060\061\013\060\011\006\003\125\004\006
-\023\002\105\123\061\047\060\045\006\003\125\004\012\023\036\101
-\116\106\040\101\165\164\157\162\151\144\141\144\040\144\145\040
-\103\145\162\164\151\146\151\143\141\143\151\157\156\061\024\060
-\022\006\003\125\004\013\023\013\101\116\106\040\103\101\040\122
-\141\151\172\061\042\060\040\006\003\125\004\003\023\031\101\116
-\106\040\123\145\143\165\162\145\040\123\145\162\166\145\162\040
-\122\157\157\164\040\103\101
+\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061
+\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163
+\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023
+\031\104\055\124\122\125\123\124\040\102\122\040\122\157\157\164
+\040\103\101\040\061\040\062\060\062\060
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\010\015\323\343\274\154\371\153\261
+\002\020\174\311\217\053\204\327\337\352\017\311\145\232\323\113
+\115\226
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\357\060\202\003\327\240\003\002\001\002\002\010\015
-\323\343\274\154\371\153\261\060\015\006\011\052\206\110\206\367
-\015\001\001\013\005\000\060\201\204\061\022\060\020\006\003\125
-\004\005\023\011\107\066\063\062\070\067\065\061\060\061\013\060
-\011\006\003\125\004\006\023\002\105\123\061\047\060\045\006\003
-\125\004\012\023\036\101\116\106\040\101\165\164\157\162\151\144
-\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141\143
-\151\157\156\061\024\060\022\006\003\125\004\013\023\013\101\116
-\106\040\103\101\040\122\141\151\172\061\042\060\040\006\003\125
-\004\003\023\031\101\116\106\040\123\145\143\165\162\145\040\123
-\145\162\166\145\162\040\122\157\157\164\040\103\101\060\036\027
-\015\061\071\060\071\060\064\061\060\060\060\063\070\132\027\015
-\063\071\060\070\063\060\061\060\060\060\063\070\132\060\201\204
-\061\022\060\020\006\003\125\004\005\023\011\107\066\063\062\070
-\067\065\061\060\061\013\060\011\006\003\125\004\006\023\002\105
-\123\061\047\060\045\006\003\125\004\012\023\036\101\116\106\040
-\101\165\164\157\162\151\144\141\144\040\144\145\040\103\145\162
-\164\151\146\151\143\141\143\151\157\156\061\024\060\022\006\003
-\125\004\013\023\013\101\116\106\040\103\101\040\122\141\151\172
-\061\042\060\040\006\003\125\004\003\023\031\101\116\106\040\123
-\145\143\165\162\145\040\123\145\162\166\145\162\040\122\157\157
-\164\040\103\101\060\202\002\042\060\015\006\011\052\206\110\206
-\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012
-\002\202\002\001\000\333\353\153\053\346\144\124\225\202\220\243
-\162\244\031\001\235\234\013\201\137\163\111\272\247\254\363\004
-\116\173\226\013\354\021\340\133\246\034\316\033\322\015\203\034
-\053\270\236\035\176\105\062\140\017\007\351\167\130\176\237\152
-\310\141\116\266\046\301\114\215\377\114\357\064\262\037\145\330
-\271\170\365\255\251\161\271\357\117\130\035\245\336\164\040\227
-\241\355\150\114\336\222\027\113\274\253\377\145\232\236\373\107
-\331\127\162\363\011\241\256\166\104\023\156\234\055\104\071\274
-\371\307\073\244\130\075\101\275\264\302\111\243\310\015\322\227
-\057\007\145\122\000\247\156\310\257\150\354\364\024\226\266\127
-\037\126\303\071\237\053\155\344\363\076\366\065\144\332\014\034
-\241\204\113\057\113\113\342\054\044\235\155\223\100\353\265\043
-\216\062\312\157\105\323\250\211\173\036\317\036\372\133\103\213
-\315\315\250\017\152\312\014\136\271\236\107\217\360\331\266\012
-\013\130\145\027\063\271\043\344\167\031\175\313\112\056\222\173
-\117\057\020\167\261\215\057\150\234\142\314\340\120\370\354\221
-\247\124\114\127\011\325\166\143\305\350\145\036\356\155\152\317
-\011\235\372\174\117\255\140\010\375\126\231\017\025\054\173\251
-\200\253\214\141\217\112\007\166\102\336\075\364\335\262\044\063
-\133\270\265\243\104\311\254\177\167\074\035\043\354\202\251\246
-\342\310\006\114\002\376\254\134\231\231\013\057\020\212\246\364
-\177\325\207\164\015\131\111\105\366\360\161\134\071\051\326\277
-\112\043\213\365\137\001\143\322\207\163\050\265\113\012\365\370
-\253\202\054\176\163\045\062\035\013\143\012\027\201\000\377\266
-\166\136\347\264\261\100\312\041\273\325\200\121\345\110\122\147
-\054\322\141\211\007\015\017\316\102\167\300\104\163\234\104\120
-\240\333\020\012\055\225\034\201\257\344\034\345\024\036\361\066
-\101\001\002\057\175\163\247\336\102\314\114\351\211\015\126\367
-\237\221\324\003\306\154\311\217\333\330\034\340\100\230\135\146
-\231\230\200\156\055\377\001\305\316\313\106\037\254\002\306\103
-\346\256\242\204\074\305\116\036\075\155\311\024\114\343\056\101
-\273\312\071\277\066\074\052\031\252\101\207\116\245\316\113\062
-\171\335\220\111\177\002\003\001\000\001\243\143\060\141\060\037
-\006\003\125\035\043\004\030\060\026\200\024\234\137\320\154\143
-\243\137\223\312\223\230\010\255\214\207\245\054\134\301\067\060
-\035\006\003\125\035\016\004\026\004\024\234\137\320\154\143\243
-\137\223\312\223\230\010\255\214\207\245\054\134\301\067\060\016
-\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\017
-\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060
-\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202
-\002\001\000\116\036\271\212\306\240\230\077\156\303\151\300\152
-\134\111\122\254\313\053\135\170\070\301\325\124\204\237\223\360
-\207\031\075\054\146\211\353\015\102\374\314\360\165\205\077\213
-\364\200\135\171\345\027\147\275\065\202\342\362\074\216\175\133
-\066\313\132\200\000\051\362\316\053\054\361\217\252\155\005\223
-\154\162\307\126\353\337\120\043\050\345\105\020\075\350\147\243
-\257\016\125\017\220\011\142\357\113\131\242\366\123\361\300\065
-\344\057\301\044\275\171\057\116\040\042\073\375\032\040\260\244
-\016\054\160\355\164\077\270\023\225\006\121\310\350\207\046\312
-\244\133\152\026\041\222\335\163\140\236\020\030\336\074\201\352
-\350\030\303\174\211\362\213\120\076\275\021\342\025\003\250\066
-\175\063\001\154\110\025\327\210\220\231\004\305\314\346\007\364
-\274\364\220\355\023\342\352\213\303\217\243\063\017\301\051\114
-\023\116\332\025\126\161\163\162\202\120\366\232\063\174\242\261
-\250\032\064\164\145\134\316\321\353\253\123\340\032\200\330\352
-\072\111\344\046\060\233\345\034\212\250\251\025\062\206\231\222
-\012\020\043\126\022\340\366\316\114\342\273\276\333\215\222\163
-\001\146\057\142\076\262\162\047\105\066\355\115\126\343\227\231
-\377\072\065\076\245\124\112\122\131\113\140\333\356\376\170\021
-\177\112\334\024\171\140\266\153\144\003\333\025\203\341\242\276
-\366\043\227\120\360\011\063\066\247\161\226\045\363\271\102\175
-\333\070\077\054\130\254\350\102\341\016\330\323\073\114\056\202
-\351\203\056\153\061\331\335\107\206\117\155\227\221\056\117\342
-\050\161\065\026\321\362\163\376\045\053\007\107\044\143\047\310
-\370\366\331\153\374\022\061\126\010\300\123\102\257\234\320\063
-\176\374\006\360\061\104\003\024\361\130\352\362\152\015\251\021
-\262\203\276\305\032\277\007\352\131\334\243\210\065\357\234\166
-\062\074\115\006\042\316\025\345\335\236\330\217\332\336\322\304
-\071\345\027\201\317\070\107\353\177\210\155\131\033\337\237\102
-\024\256\176\317\250\260\146\145\332\067\257\237\252\075\352\050
-\266\336\325\061\130\026\202\133\352\273\031\165\002\163\032\312
-\110\032\041\223\220\012\216\223\204\247\175\073\043\030\222\211
-\240\215\254
+\060\202\002\333\060\202\002\140\240\003\002\001\002\002\020\174
+\311\217\053\204\327\337\352\017\311\145\232\323\113\115\226\060
+\012\006\010\052\206\110\316\075\004\003\003\060\110\061\013\060
+\011\006\003\125\004\006\023\002\104\105\061\025\060\023\006\003
+\125\004\012\023\014\104\055\124\162\165\163\164\040\107\155\142
+\110\061\042\060\040\006\003\125\004\003\023\031\104\055\124\122
+\125\123\124\040\102\122\040\122\157\157\164\040\103\101\040\061
+\040\062\060\062\060\060\036\027\015\062\060\060\062\061\061\060
+\071\064\065\060\060\132\027\015\063\065\060\062\061\061\060\071
+\064\064\065\071\132\060\110\061\013\060\011\006\003\125\004\006
+\023\002\104\105\061\025\060\023\006\003\125\004\012\023\014\104
+\055\124\162\165\163\164\040\107\155\142\110\061\042\060\040\006
+\003\125\004\003\023\031\104\055\124\122\125\123\124\040\102\122
+\040\122\157\157\164\040\103\101\040\061\040\062\060\062\060\060
+\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201
+\004\000\042\003\142\000\004\306\313\307\050\321\373\204\365\232
+\357\102\024\040\341\103\153\156\165\255\374\053\003\204\324\166
+\223\045\327\131\073\101\145\153\036\346\064\052\273\164\366\022
+\316\350\155\347\253\344\074\116\077\104\010\213\315\026\161\313
+\277\222\231\364\244\327\074\120\124\122\220\205\203\170\224\147
+\147\243\034\011\031\075\165\064\205\336\355\140\175\307\014\264
+\101\122\271\156\345\356\102\243\202\001\015\060\202\001\011\060
+\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377
+\060\035\006\003\125\035\016\004\026\004\024\163\221\020\253\377
+\125\263\132\174\011\045\325\262\272\010\240\153\253\037\155\060
+\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060
+\201\306\006\003\125\035\037\004\201\276\060\201\273\060\076\240
+\074\240\072\206\070\150\164\164\160\072\057\057\143\162\154\056
+\144\055\164\162\165\163\164\056\156\145\164\057\143\162\154\057
+\144\055\164\162\165\163\164\137\142\162\137\162\157\157\164\137
+\143\141\137\061\137\062\060\062\060\056\143\162\154\060\171\240
+\167\240\165\206\163\154\144\141\160\072\057\057\144\151\162\145
+\143\164\157\162\171\056\144\055\164\162\165\163\164\056\156\145
+\164\057\103\116\075\104\055\124\122\125\123\124\045\062\060\102
+\122\045\062\060\122\157\157\164\045\062\060\103\101\045\062\060
+\061\045\062\060\062\060\062\060\054\117\075\104\055\124\162\165
+\163\164\045\062\060\107\155\142\110\054\103\075\104\105\077\143
+\145\162\164\151\146\151\143\141\164\145\162\145\166\157\143\141
+\164\151\157\156\154\151\163\164\060\012\006\010\052\206\110\316
+\075\004\003\003\003\151\000\060\146\002\061\000\224\220\055\023
+\372\341\143\370\141\143\350\255\205\170\124\221\234\270\223\070
+\076\032\101\332\100\026\123\102\010\312\057\216\361\076\201\126
+\300\252\330\355\030\304\260\256\364\076\372\046\002\061\000\363
+\050\342\306\333\053\231\373\267\121\270\044\243\244\224\172\032
+\077\346\066\342\003\127\063\212\060\313\202\307\326\024\021\325
+\165\143\133\024\225\234\037\001\317\330\325\162\247\017\073
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "D-TRUST BR Root CA 1 2020"
+# Issuer: CN=D-TRUST BR Root CA 1 2020,O=D-Trust GmbH,C=DE
+# Serial Number:7c:c9:8f:2b:84:d7:df:ea:0f:c9:65:9a:d3:4b:4d:96
+# Subject: CN=D-TRUST BR Root CA 1 2020,O=D-Trust GmbH,C=DE
+# Not Valid Before: Tue Feb 11 09:45:00 2020
+# Not Valid After : Sun Feb 11 09:44:59 2035
+# Fingerprint (SHA-256): E5:9A:AA:81:60:09:C2:2B:FF:5B:25:BA:D3:7D:F3:06:F0:49:79:7C:1F:81:D8:5A:B0:89:E6:57:BD:8F:00:44
+# Fingerprint (SHA1): 1F:5B:98:F0:E3:B5:F7:74:3C:ED:E6:B0:36:7D:32:CD:F4:09:41:67
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "D-TRUST BR Root CA 1 2020"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\037\133\230\360\343\265\367\164\074\355\346\260\066\175\062\315
+\364\011\101\147
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\265\252\113\325\355\367\343\125\056\217\162\012\363\165\270\355
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061
+\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163
+\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023
+\031\104\055\124\122\125\123\124\040\102\122\040\122\157\157\164
+\040\103\101\040\061\040\062\060\062\060
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\174\311\217\053\204\327\337\352\017\311\145\232\323\113
+\115\226
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "D-TRUST EV Root CA 1 2020"
+#
+# Issuer: CN=D-TRUST EV Root CA 1 2020,O=D-Trust GmbH,C=DE
+# Serial Number:5f:02:41:d7:7a:87:7c:4c:03:a3:ac:96:8d:fb:ff:d0
+# Subject: CN=D-TRUST EV Root CA 1 2020,O=D-Trust GmbH,C=DE
+# Not Valid Before: Tue Feb 11 10:00:00 2020
+# Not Valid After : Sun Feb 11 09:59:59 2035
+# Fingerprint (SHA-256): 08:17:0D:1A:A3:64:53:90:1A:2F:95:92:45:E3:47:DB:0C:8D:37:AB:AA:BC:56:B8:1A:A1:00:DC:95:89:70:DB
+# Fingerprint (SHA1): 61:DB:8C:21:59:69:03:90:D8:7C:9C:12:86:54:CF:9D:3D:F4:DD:07
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "D-TRUST EV Root CA 1 2020"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061
+\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163
+\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023
+\031\104\055\124\122\125\123\124\040\105\126\040\122\157\157\164
+\040\103\101\040\061\040\062\060\062\060
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061
+\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163
+\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023
+\031\104\055\124\122\125\123\124\040\105\126\040\122\157\157\164
+\040\103\101\040\061\040\062\060\062\060
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\137\002\101\327\172\207\174\114\003\243\254\226\215\373
+\377\320
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\333\060\202\002\140\240\003\002\001\002\002\020\137
+\002\101\327\172\207\174\114\003\243\254\226\215\373\377\320\060
+\012\006\010\052\206\110\316\075\004\003\003\060\110\061\013\060
+\011\006\003\125\004\006\023\002\104\105\061\025\060\023\006\003
+\125\004\012\023\014\104\055\124\162\165\163\164\040\107\155\142
+\110\061\042\060\040\006\003\125\004\003\023\031\104\055\124\122
+\125\123\124\040\105\126\040\122\157\157\164\040\103\101\040\061
+\040\062\060\062\060\060\036\027\015\062\060\060\062\061\061\061
+\060\060\060\060\060\132\027\015\063\065\060\062\061\061\060\071
+\065\071\065\071\132\060\110\061\013\060\011\006\003\125\004\006
+\023\002\104\105\061\025\060\023\006\003\125\004\012\023\014\104
+\055\124\162\165\163\164\040\107\155\142\110\061\042\060\040\006
+\003\125\004\003\023\031\104\055\124\122\125\123\124\040\105\126
+\040\122\157\157\164\040\103\101\040\061\040\062\060\062\060\060
+\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201
+\004\000\042\003\142\000\004\361\013\335\206\103\040\031\337\227
+\205\350\042\112\233\317\235\230\277\264\005\046\311\313\343\246
+\322\217\305\236\170\173\061\211\251\211\255\047\074\145\020\202
+\374\337\303\235\116\360\063\043\304\322\062\365\034\260\337\063
+\027\135\305\360\261\212\371\357\271\267\024\312\051\112\302\017
+\251\177\165\145\111\052\060\147\364\144\367\326\032\167\332\303
+\302\227\141\102\173\111\255\243\202\001\015\060\202\001\011\060
+\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377
+\060\035\006\003\125\035\016\004\026\004\024\177\020\001\026\067
+\072\244\050\344\120\370\244\367\354\153\062\266\376\351\213\060
+\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060
+\201\306\006\003\125\035\037\004\201\276\060\201\273\060\076\240
+\074\240\072\206\070\150\164\164\160\072\057\057\143\162\154\056
+\144\055\164\162\165\163\164\056\156\145\164\057\143\162\154\057
+\144\055\164\162\165\163\164\137\145\166\137\162\157\157\164\137
+\143\141\137\061\137\062\060\062\060\056\143\162\154\060\171\240
+\167\240\165\206\163\154\144\141\160\072\057\057\144\151\162\145
+\143\164\157\162\171\056\144\055\164\162\165\163\164\056\156\145
+\164\057\103\116\075\104\055\124\122\125\123\124\045\062\060\105
+\126\045\062\060\122\157\157\164\045\062\060\103\101\045\062\060
+\061\045\062\060\062\060\062\060\054\117\075\104\055\124\162\165
+\163\164\045\062\060\107\155\142\110\054\103\075\104\105\077\143
+\145\162\164\151\146\151\143\141\164\145\162\145\166\157\143\141
+\164\151\157\156\154\151\163\164\060\012\006\010\052\206\110\316
+\075\004\003\003\003\151\000\060\146\002\061\000\312\074\306\052
+\165\302\136\165\142\071\066\000\140\132\213\301\223\231\314\331
+\333\101\073\073\207\231\027\073\325\314\117\312\042\367\240\200
+\313\371\264\261\033\126\365\162\322\374\031\321\002\061\000\221
+\367\060\223\077\020\106\053\161\244\320\073\104\233\300\051\002
+\005\262\101\167\121\363\171\132\236\216\024\240\116\102\322\133
+\201\363\064\152\003\347\042\070\120\133\355\031\117\103\026
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "D-TRUST EV Root CA 1 2020"
+# Issuer: CN=D-TRUST EV Root CA 1 2020,O=D-Trust GmbH,C=DE
+# Serial Number:5f:02:41:d7:7a:87:7c:4c:03:a3:ac:96:8d:fb:ff:d0
+# Subject: CN=D-TRUST EV Root CA 1 2020,O=D-Trust GmbH,C=DE
+# Not Valid Before: Tue Feb 11 10:00:00 2020
+# Not Valid After : Sun Feb 11 09:59:59 2035
+# Fingerprint (SHA-256): 08:17:0D:1A:A3:64:53:90:1A:2F:95:92:45:E3:47:DB:0C:8D:37:AB:AA:BC:56:B8:1A:A1:00:DC:95:89:70:DB
+# Fingerprint (SHA1): 61:DB:8C:21:59:69:03:90:D8:7C:9C:12:86:54:CF:9D:3D:F4:DD:07
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "D-TRUST EV Root CA 1 2020"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\141\333\214\041\131\151\003\220\330\174\234\022\206\124\317\235
+\075\364\335\007
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\214\055\235\160\237\110\231\021\006\021\373\351\313\060\300\156
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061
+\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163
+\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023
+\031\104\055\124\122\125\123\124\040\105\126\040\122\157\157\164
+\040\103\101\040\061\040\062\060\062\060
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\137\002\101\327\172\207\174\114\003\243\254\226\215\373
+\377\320
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "DigiCert TLS ECC P384 Root G5"
+#
+# Issuer: CN=DigiCert TLS ECC P384 Root G5,O="DigiCert, Inc.",C=US
+# Serial Number:09:e0:93:65:ac:f7:d9:c8:b9:3e:1c:0b:04:2a:2e:f3
+# Subject: CN=DigiCert TLS ECC P384 Root G5,O="DigiCert, Inc.",C=US
+# Not Valid Before: Fri Jan 15 00:00:00 2021
+# Not Valid After : Sun Jan 14 23:59:59 2046
+# Fingerprint (SHA-256): 01:8E:13:F0:77:25:32:CF:80:9B:D1:B1:72:81:86:72:83:FC:48:C6:E1:3B:E9:C6:98:12:85:4A:49:0C:1B:05
+# Fingerprint (SHA1): 17:F3:DE:5E:9F:0F:19:E9:8E:F6:1F:32:26:6E:20:C4:07:AE:30:EE
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "DigiCert TLS ECC P384 Root G5"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\046\060\044\006\003\125\004
+\003\023\035\104\151\147\151\103\145\162\164\040\124\114\123\040
+\105\103\103\040\120\063\070\064\040\122\157\157\164\040\107\065
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\046\060\044\006\003\125\004
+\003\023\035\104\151\147\151\103\145\162\164\040\124\114\123\040
+\105\103\103\040\120\063\070\064\040\122\157\157\164\040\107\065
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\011\340\223\145\254\367\331\310\271\076\034\013\004\052
+\056\363
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\031\060\202\001\237\240\003\002\001\002\002\020\011
+\340\223\145\254\367\331\310\271\076\034\013\004\052\056\363\060
+\012\006\010\052\206\110\316\075\004\003\003\060\116\061\013\060
+\011\006\003\125\004\006\023\002\125\123\061\027\060\025\006\003
+\125\004\012\023\016\104\151\147\151\103\145\162\164\054\040\111
+\156\143\056\061\046\060\044\006\003\125\004\003\023\035\104\151
+\147\151\103\145\162\164\040\124\114\123\040\105\103\103\040\120
+\063\070\064\040\122\157\157\164\040\107\065\060\036\027\015\062
+\061\060\061\061\065\060\060\060\060\060\060\132\027\015\064\066
+\060\061\061\064\062\063\065\071\065\071\132\060\116\061\013\060
+\011\006\003\125\004\006\023\002\125\123\061\027\060\025\006\003
+\125\004\012\023\016\104\151\147\151\103\145\162\164\054\040\111
+\156\143\056\061\046\060\044\006\003\125\004\003\023\035\104\151
+\147\151\103\145\162\164\040\124\114\123\040\105\103\103\040\120
+\063\070\064\040\122\157\157\164\040\107\065\060\166\060\020\006
+\007\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003
+\142\000\004\301\104\241\317\021\227\120\232\336\043\202\065\007
+\315\320\313\030\235\322\361\177\167\065\117\073\335\224\162\122
+\355\302\073\370\354\372\173\153\130\040\354\231\256\311\374\150
+\263\165\271\333\011\354\310\023\365\116\306\012\035\146\060\114
+\273\037\107\012\074\141\020\102\051\174\245\010\016\340\042\351
+\323\065\150\316\233\143\237\204\265\231\115\130\240\216\365\124
+\347\225\311\243\102\060\100\060\035\006\003\125\035\016\004\026
+\004\024\301\121\105\120\131\253\076\347\054\132\372\040\042\022
+\007\200\210\174\021\152\060\016\006\003\125\035\017\001\001\377
+\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377
+\004\005\060\003\001\001\377\060\012\006\010\052\206\110\316\075
+\004\003\003\003\150\000\060\145\002\061\000\211\152\215\107\347
+\354\374\156\125\003\331\147\154\046\116\203\306\375\311\373\053
+\023\274\267\172\214\264\145\322\151\151\143\023\143\073\046\120
+\056\001\241\171\006\221\235\110\277\302\276\002\060\107\303\025
+\173\261\240\221\231\111\223\250\074\174\350\106\006\213\054\362
+\061\000\224\235\142\310\211\275\031\204\024\351\245\373\001\270
+\015\166\103\214\056\123\313\174\337\014\027\226\120
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "DigiCert TLS ECC P384 Root G5"
+# Issuer: CN=DigiCert TLS ECC P384 Root G5,O="DigiCert, Inc.",C=US
+# Serial Number:09:e0:93:65:ac:f7:d9:c8:b9:3e:1c:0b:04:2a:2e:f3
+# Subject: CN=DigiCert TLS ECC P384 Root G5,O="DigiCert, Inc.",C=US
+# Not Valid Before: Fri Jan 15 00:00:00 2021
+# Not Valid After : Sun Jan 14 23:59:59 2046
+# Fingerprint (SHA-256): 01:8E:13:F0:77:25:32:CF:80:9B:D1:B1:72:81:86:72:83:FC:48:C6:E1:3B:E9:C6:98:12:85:4A:49:0C:1B:05
+# Fingerprint (SHA1): 17:F3:DE:5E:9F:0F:19:E9:8E:F6:1F:32:26:6E:20:C4:07:AE:30:EE
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "DigiCert TLS ECC P384 Root G5"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\027\363\336\136\237\017\031\351\216\366\037\062\046\156\040\304
+\007\256\060\356
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\323\161\004\152\103\034\333\246\131\341\250\243\252\305\161\355
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\046\060\044\006\003\125\004
+\003\023\035\104\151\147\151\103\145\162\164\040\124\114\123\040
+\105\103\103\040\120\063\070\064\040\122\157\157\164\040\107\065
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\011\340\223\145\254\367\331\310\271\076\034\013\004\052
+\056\363
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "DigiCert TLS RSA4096 Root G5"
+#
+# Issuer: CN=DigiCert TLS RSA4096 Root G5,O="DigiCert, Inc.",C=US
+# Serial Number:08:f9:b4:78:a8:fa:7e:da:6a:33:37:89:de:7c:cf:8a
+# Subject: CN=DigiCert TLS RSA4096 Root G5,O="DigiCert, Inc.",C=US
+# Not Valid Before: Fri Jan 15 00:00:00 2021
+# Not Valid After : Sun Jan 14 23:59:59 2046
+# Fingerprint (SHA-256): 37:1A:00:DC:05:33:B3:72:1A:7E:EB:40:E8:41:9E:70:79:9D:2B:0A:0F:2C:1D:80:69:31:65:F7:CE:C4:AD:75
+# Fingerprint (SHA1): A7:88:49:DC:5D:7C:75:8C:8C:DE:39:98:56:B3:AA:D0:B2:A5:71:35
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "DigiCert TLS RSA4096 Root G5"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\115\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\045\060\043\006\003\125\004
+\003\023\034\104\151\147\151\103\145\162\164\040\124\114\123\040
+\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\115\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\045\060\043\006\003\125\004
+\003\023\034\104\151\147\151\103\145\162\164\040\124\114\123\040
+\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\010\371\264\170\250\372\176\332\152\063\067\211\336\174
+\317\212
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\146\060\202\003\116\240\003\002\001\002\002\020\010
+\371\264\170\250\372\176\332\152\063\067\211\336\174\317\212\060
+\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\115
+\061\013\060\011\006\003\125\004\006\023\002\125\123\061\027\060
+\025\006\003\125\004\012\023\016\104\151\147\151\103\145\162\164
+\054\040\111\156\143\056\061\045\060\043\006\003\125\004\003\023
+\034\104\151\147\151\103\145\162\164\040\124\114\123\040\122\123
+\101\064\060\071\066\040\122\157\157\164\040\107\065\060\036\027
+\015\062\061\060\061\061\065\060\060\060\060\060\060\132\027\015
+\064\066\060\061\061\064\062\063\065\071\065\071\132\060\115\061
+\013\060\011\006\003\125\004\006\023\002\125\123\061\027\060\025
+\006\003\125\004\012\023\016\104\151\147\151\103\145\162\164\054
+\040\111\156\143\056\061\045\060\043\006\003\125\004\003\023\034
+\104\151\147\151\103\145\162\164\040\124\114\123\040\122\123\101
+\064\060\071\066\040\122\157\157\164\040\107\065\060\202\002\042
+\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003
+\202\002\017\000\060\202\002\012\002\202\002\001\000\263\320\364
+\311\171\021\235\375\374\146\201\347\314\325\344\274\354\201\076
+\152\065\216\056\267\347\336\257\371\007\115\317\060\235\352\011
+\013\231\275\154\127\332\030\112\270\170\254\072\071\250\246\110
+\254\056\162\345\275\353\361\032\315\347\244\003\251\077\021\264
+\330\057\211\026\373\224\001\075\273\057\370\023\005\241\170\034
+\216\050\340\105\340\203\364\131\033\225\263\256\176\003\105\345
+\276\302\102\376\356\362\074\266\205\023\230\062\235\026\250\051
+\302\013\034\070\334\237\061\167\134\277\047\243\374\047\254\267
+\053\275\164\233\027\055\362\201\332\135\260\341\043\027\076\210
+\112\022\043\320\352\317\235\336\003\027\261\102\112\240\026\114
+\244\155\223\351\077\072\356\072\174\235\130\235\364\116\217\374
+\073\043\310\155\270\342\005\332\314\353\354\303\061\364\327\247
+\051\124\200\317\104\133\114\157\060\236\363\314\335\037\224\103
+\235\115\177\160\160\015\324\072\321\067\360\154\235\233\300\024
+\223\130\357\315\101\070\165\274\023\003\225\174\177\343\134\351
+\325\015\325\342\174\020\142\252\153\360\075\166\363\077\243\350
+\260\301\375\357\252\127\115\254\206\247\030\264\051\301\054\016
+\277\144\276\051\214\330\002\055\315\134\057\362\177\357\025\364
+\014\025\254\012\260\361\323\015\117\152\115\167\227\001\240\361
+\146\267\267\316\357\316\354\354\245\165\312\254\343\341\143\367
+\270\241\004\310\274\173\077\135\055\026\042\126\355\110\111\376
+\247\057\171\060\045\233\272\153\055\077\235\073\304\027\347\035
+\056\373\362\317\246\374\343\024\054\226\230\041\214\264\221\351
+\031\140\203\362\060\053\006\163\120\325\230\073\006\351\307\212
+\014\140\214\050\370\122\233\156\341\366\115\273\006\044\233\327
+\053\046\077\375\052\057\161\365\326\044\276\177\061\236\017\155
+\350\217\117\115\243\077\377\065\352\337\111\136\101\217\206\371
+\361\167\171\113\033\264\243\136\057\373\106\002\320\146\023\136
+\136\205\117\316\330\160\210\173\316\001\265\226\227\327\315\175
+\375\202\370\302\044\301\312\001\071\117\215\242\301\024\100\037
+\234\146\325\014\011\106\326\362\320\321\110\166\126\072\103\313
+\266\012\021\071\272\214\023\154\006\265\236\317\353\002\003\001
+\000\001\243\102\060\100\060\035\006\003\125\035\016\004\026\004
+\024\121\063\034\355\066\100\257\027\323\045\315\151\150\362\257
+\116\043\076\263\101\060\016\006\003\125\035\017\001\001\377\004
+\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377\004
+\005\060\003\001\001\377\060\015\006\011\052\206\110\206\367\015
+\001\001\014\005\000\003\202\002\001\000\140\246\257\133\137\127
+\332\211\333\113\120\251\304\043\065\041\377\320\141\060\204\221
+\267\077\020\317\045\216\311\277\106\064\331\301\041\046\034\160
+\031\162\036\243\311\207\376\251\103\144\226\072\310\123\004\012
+\266\101\273\304\107\000\331\237\030\030\073\262\016\363\064\352
+\044\367\335\257\040\140\256\222\050\137\066\347\135\344\336\307
+\074\333\120\071\255\273\075\050\115\226\174\166\306\133\364\301
+\333\024\245\253\031\142\007\030\100\137\227\221\334\234\307\253
+\265\121\015\346\151\123\125\314\071\175\332\305\021\125\162\305
+\073\213\211\370\064\055\244\027\345\027\346\231\175\060\210\041
+\067\315\060\027\075\270\362\274\250\165\240\103\334\076\211\113
+\220\256\155\003\340\034\243\240\226\011\273\175\243\267\052\020
+\104\113\106\007\064\143\355\061\271\004\356\243\233\232\256\346
+\061\170\364\352\044\141\073\253\130\144\377\273\207\047\142\045
+\201\337\334\241\057\366\355\247\377\172\217\121\056\060\370\244
+\001\322\205\071\137\001\231\226\157\132\133\160\031\106\376\206
+\140\076\255\200\020\011\335\071\045\057\130\177\273\322\164\360
+\367\106\037\106\071\112\330\123\320\363\056\073\161\245\324\157
+\374\363\147\344\007\217\335\046\031\341\215\133\372\243\223\021
+\233\351\310\072\303\125\150\232\222\341\122\166\070\350\341\272
+\275\373\117\325\357\263\347\110\203\061\360\202\041\343\266\276
+\247\253\157\357\237\337\114\317\001\270\142\152\043\075\347\011
+\115\200\033\173\060\244\303\335\007\177\064\276\244\046\262\366
+\101\350\011\035\343\040\230\252\067\117\377\367\361\342\051\160
+\061\107\077\164\320\024\026\372\041\212\002\325\212\011\224\167
+\056\362\131\050\213\174\120\222\012\146\170\070\203\165\304\265
+\132\250\021\306\345\301\235\146\125\317\123\304\257\327\165\205
+\251\102\023\126\354\041\167\201\223\132\014\352\226\331\111\312
+\241\010\362\227\073\155\233\004\030\044\104\216\174\001\362\334
+\045\330\136\206\232\261\071\333\365\221\062\152\321\246\160\212
+\242\367\336\244\105\205\046\250\036\214\135\051\133\310\113\330
+\232\152\003\136\160\362\205\117\154\113\150\057\312\124\366\214
+\332\062\376\303\153\203\077\070\306\176
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "ANF Secure Server Root CA"
-# Issuer: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510
-# Serial Number:0d:d3:e3:bc:6c:f9:6b:b1
-# Subject: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510
-# Not Valid Before: Wed Sep 04 10:00:38 2019
-# Not Valid After : Tue Aug 30 10:00:38 2039
-# Fingerprint (SHA-256): FB:8F:EC:75:91:69:B9:10:6B:1E:51:16:44:C6:18:C5:13:04:37:3F:6C:06:43:08:8D:8B:EF:FD:1B:99:75:99
-# Fingerprint (SHA1): 5B:6E:68:D0:CC:15:B6:A0:5F:1E:C1:5F:AE:02:FC:6B:2F:5D:6F:74
+# Trust for "DigiCert TLS RSA4096 Root G5"
+# Issuer: CN=DigiCert TLS RSA4096 Root G5,O="DigiCert, Inc.",C=US
+# Serial Number:08:f9:b4:78:a8:fa:7e:da:6a:33:37:89:de:7c:cf:8a
+# Subject: CN=DigiCert TLS RSA4096 Root G5,O="DigiCert, Inc.",C=US
+# Not Valid Before: Fri Jan 15 00:00:00 2021
+# Not Valid After : Sun Jan 14 23:59:59 2046
+# Fingerprint (SHA-256): 37:1A:00:DC:05:33:B3:72:1A:7E:EB:40:E8:41:9E:70:79:9D:2B:0A:0F:2C:1D:80:69:31:65:F7:CE:C4:AD:75
+# Fingerprint (SHA1): A7:88:49:DC:5D:7C:75:8C:8C:DE:39:98:56:B3:AA:D0:B2:A5:71:35
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "ANF Secure Server Root CA"
+CKA_LABEL UTF8 "DigiCert TLS RSA4096 Root G5"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\133\156\150\320\314\025\266\240\137\036\301\137\256\002\374\153
-\057\135\157\164
+\247\210\111\334\135\174\165\214\214\336\071\230\126\263\252\320
+\262\245\161\065
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\046\246\104\132\331\257\116\057\262\035\266\145\260\116\350\226
+\254\376\367\064\226\251\362\263\264\022\113\344\047\101\157\341
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\201\204\061\022\060\020\006\003\125\004\005\023\011\107\066
-\063\062\070\067\065\061\060\061\013\060\011\006\003\125\004\006
-\023\002\105\123\061\047\060\045\006\003\125\004\012\023\036\101
-\116\106\040\101\165\164\157\162\151\144\141\144\040\144\145\040
-\103\145\162\164\151\146\151\143\141\143\151\157\156\061\024\060
-\022\006\003\125\004\013\023\013\101\116\106\040\103\101\040\122
-\141\151\172\061\042\060\040\006\003\125\004\003\023\031\101\116
-\106\040\123\145\143\165\162\145\040\123\145\162\166\145\162\040
-\122\157\157\164\040\103\101
+\060\115\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\045\060\043\006\003\125\004
+\003\023\034\104\151\147\151\103\145\162\164\040\124\114\123\040
+\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\010\015\323\343\274\154\371\153\261
+\002\020\010\371\264\170\250\372\176\332\152\063\067\211\336\174
+\317\212
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
@@ -22002,478 +23454,862 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Certum EC-384 CA"
+# Certificate "DigiCert SMIME ECC P384 Root G5"
 #
-# Issuer: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
-# Serial Number:78:8f:27:5c:81:12:52:20:a5:04:d0:2d:dd:ba:73:f4
-# Subject: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
-# Not Valid Before: Mon Mar 26 07:24:54 2018
-# Not Valid After : Thu Mar 26 07:24:54 2043
-# Fingerprint (SHA-256): 6B:32:80:85:62:53:18:AA:50:D1:73:C9:8D:8B:DA:09:D5:7E:27:41:3D:11:4C:F7:87:A0:F5:D0:6C:03:0C:F6
-# Fingerprint (SHA1): F3:3E:78:3C:AC:DF:F4:A2:CC:AC:67:55:69:56:D7:E5:16:3C:E1:ED
+# Issuer: CN=DigiCert SMIME ECC P384 Root G5,O="DigiCert, Inc.",C=US
+# Serial Number:05:3f:6e:a0:06:01:72:7d:ed:3f:c3:a3:b6:a3:d6:ef
+# Subject: CN=DigiCert SMIME ECC P384 Root G5,O="DigiCert, Inc.",C=US
+# Not Valid Before: Fri Jan 15 00:00:00 2021
+# Not Valid After : Sun Jan 14 23:59:59 2046
+# Fingerprint (SHA-256): E8:E8:17:65:36:A6:0C:C2:C4:E1:01:87:C3:BE:FC:A2:0E:F2:63:49:70:18:F5:66:D5:BE:A0:F9:4D:0C:11:1B
+# Fingerprint (SHA1): 1C:B8:A7:08:C9:0D:20:79:01:A0:B2:36:7F:F0:95:65:E4:53:24:FE
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Certum EC-384 CA"
+CKA_LABEL UTF8 "DigiCert SMIME ECC P384 Root G5"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114\061
-\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
-\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
-\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
-\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027\006
-\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103\055
-\063\070\064\040\103\101
+\060\120\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
+\003\023\037\104\151\147\151\103\145\162\164\040\123\115\111\115
+\105\040\105\103\103\040\120\063\070\064\040\122\157\157\164\040
+\107\065
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114\061
-\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
-\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
-\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
-\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027\006
-\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103\055
-\063\070\064\040\103\101
+\060\120\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
+\003\023\037\104\151\147\151\103\145\162\164\040\123\115\111\115
+\105\040\105\103\103\040\120\063\070\064\040\122\157\157\164\040
+\107\065
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\170\217\047\134\201\022\122\040\245\004\320\055\335\272
-\163\364
+\002\020\005\077\156\240\006\001\162\175\355\077\303\243\266\243
+\326\357
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\145\060\202\001\353\240\003\002\001\002\002\020\170
-\217\047\134\201\022\122\040\245\004\320\055\335\272\163\364\060
-\012\006\010\052\206\110\316\075\004\003\003\060\164\061\013\060
-\011\006\003\125\004\006\023\002\120\114\061\041\060\037\006\003
-\125\004\012\023\030\101\163\163\145\143\157\040\104\141\164\141
-\040\123\171\163\164\145\155\163\040\123\056\101\056\061\047\060
-\045\006\003\125\004\013\023\036\103\145\162\164\165\155\040\103
-\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164
-\150\157\162\151\164\171\061\031\060\027\006\003\125\004\003\023
-\020\103\145\162\164\165\155\040\105\103\055\063\070\064\040\103
-\101\060\036\027\015\061\070\060\063\062\066\060\067\062\064\065
-\064\132\027\015\064\063\060\063\062\066\060\067\062\064\065\064
-\132\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114
-\061\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143
-\157\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123
-\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145
-\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151
-\157\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027
-\006\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103
-\055\063\070\064\040\103\101\060\166\060\020\006\007\052\206\110
-\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\304
-\050\216\253\030\133\152\276\156\144\067\143\344\315\354\253\072
-\367\314\241\270\016\202\111\327\206\051\237\241\224\362\343\140
-\170\230\201\170\006\115\362\354\232\016\127\140\203\237\264\346
-\027\057\032\263\135\002\133\211\043\074\302\021\005\052\247\210
-\023\030\363\120\204\327\275\064\054\047\211\125\377\316\114\347
-\337\246\037\050\304\360\124\303\271\174\267\123\255\353\302\243
-\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060
-\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\215
-\006\146\164\044\166\072\363\211\367\274\326\275\107\175\057\274
-\020\137\113\060\016\006\003\125\035\017\001\001\377\004\004\003
-\002\001\006\060\012\006\010\052\206\110\316\075\004\003\003\003
-\150\000\060\145\002\060\003\125\055\246\346\030\304\174\357\311
-\120\156\301\047\017\234\207\257\156\325\033\010\030\275\222\051
-\301\357\224\221\170\322\072\034\125\211\142\345\033\011\036\272
-\144\153\361\166\264\324\002\061\000\264\102\204\231\377\253\347
-\236\373\221\227\047\135\334\260\133\060\161\316\136\070\032\152
-\331\045\347\352\367\141\222\126\370\352\332\066\302\207\145\226
-\056\162\045\057\177\337\303\023\311
+\060\202\002\034\060\202\001\243\240\003\002\001\002\002\020\005
+\077\156\240\006\001\162\175\355\077\303\243\266\243\326\357\060
+\012\006\010\052\206\110\316\075\004\003\003\060\120\061\013\060
+\011\006\003\125\004\006\023\002\125\123\061\027\060\025\006\003
+\125\004\012\023\016\104\151\147\151\103\145\162\164\054\040\111
+\156\143\056\061\050\060\046\006\003\125\004\003\023\037\104\151
+\147\151\103\145\162\164\040\123\115\111\115\105\040\105\103\103
+\040\120\063\070\064\040\122\157\157\164\040\107\065\060\036\027
+\015\062\061\060\061\061\065\060\060\060\060\060\060\132\027\015
+\064\066\060\061\061\064\062\063\065\071\065\071\132\060\120\061
+\013\060\011\006\003\125\004\006\023\002\125\123\061\027\060\025
+\006\003\125\004\012\023\016\104\151\147\151\103\145\162\164\054
+\040\111\156\143\056\061\050\060\046\006\003\125\004\003\023\037
+\104\151\147\151\103\145\162\164\040\123\115\111\115\105\040\105
+\103\103\040\120\063\070\064\040\122\157\157\164\040\107\065\060
+\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201
+\004\000\042\003\142\000\004\026\235\125\345\266\324\373\373\147
+\153\032\324\241\252\322\167\225\076\210\345\007\237\266\160\146
+\040\050\244\210\354\160\065\257\263\062\377\067\023\112\236\274
+\001\003\336\204\301\270\306\346\145\107\211\362\023\125\277\315
+\245\036\010\140\177\255\177\350\141\222\051\317\011\107\136\013
+\034\300\037\244\277\362\133\274\230\357\231\114\314\160\153\266
+\272\320\050\035\277\276\004\243\102\060\100\060\035\006\003\125
+\035\016\004\026\004\024\163\172\153\226\333\102\007\213\122\146
+\302\144\062\027\376\340\147\220\056\255\060\016\006\003\125\035
+\017\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035
+\023\001\001\377\004\005\060\003\001\001\377\060\012\006\010\052
+\206\110\316\075\004\003\003\003\147\000\060\144\002\060\067\104
+\365\062\200\343\161\353\364\155\317\174\314\221\232\303\156\161
+\330\322\043\135\222\115\202\102\155\134\141\225\366\221\365\247
+\010\366\152\227\351\234\224\055\230\160\375\063\266\011\002\060
+\007\074\057\271\130\202\136\017\243\142\250\223\147\360\040\303
+\151\277\003\054\073\120\247\073\257\101\070\311\122\110\221\326
+\016\373\274\140\060\174\144\077\022\036\105\177\121\076\364\246
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "Certum EC-384 CA"
-# Issuer: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
-# Serial Number:78:8f:27:5c:81:12:52:20:a5:04:d0:2d:dd:ba:73:f4
-# Subject: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
-# Not Valid Before: Mon Mar 26 07:24:54 2018
-# Not Valid After : Thu Mar 26 07:24:54 2043
-# Fingerprint (SHA-256): 6B:32:80:85:62:53:18:AA:50:D1:73:C9:8D:8B:DA:09:D5:7E:27:41:3D:11:4C:F7:87:A0:F5:D0:6C:03:0C:F6
-# Fingerprint (SHA1): F3:3E:78:3C:AC:DF:F4:A2:CC:AC:67:55:69:56:D7:E5:16:3C:E1:ED
+# Trust for "DigiCert SMIME ECC P384 Root G5"
+# Issuer: CN=DigiCert SMIME ECC P384 Root G5,O="DigiCert, Inc.",C=US
+# Serial Number:05:3f:6e:a0:06:01:72:7d:ed:3f:c3:a3:b6:a3:d6:ef
+# Subject: CN=DigiCert SMIME ECC P384 Root G5,O="DigiCert, Inc.",C=US
+# Not Valid Before: Fri Jan 15 00:00:00 2021
+# Not Valid After : Sun Jan 14 23:59:59 2046
+# Fingerprint (SHA-256): E8:E8:17:65:36:A6:0C:C2:C4:E1:01:87:C3:BE:FC:A2:0E:F2:63:49:70:18:F5:66:D5:BE:A0:F9:4D:0C:11:1B
+# Fingerprint (SHA1): 1C:B8:A7:08:C9:0D:20:79:01:A0:B2:36:7F:F0:95:65:E4:53:24:FE
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Certum EC-384 CA"
+CKA_LABEL UTF8 "DigiCert SMIME ECC P384 Root G5"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\363\076\170\074\254\337\364\242\314\254\147\125\151\126\327\345
-\026\074\341\355
+\034\270\247\010\311\015\040\171\001\240\262\066\177\360\225\145
+\344\123\044\376
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\266\145\263\226\140\227\022\241\354\116\341\075\243\306\311\361
+\246\376\364\122\066\104\330\356\015\267\003\013\357\164\263\003
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114\061
-\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
-\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
-\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
-\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027\006
-\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103\055
-\063\070\064\040\103\101
+\060\120\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004
+\003\023\037\104\151\147\151\103\145\162\164\040\123\115\111\115
+\105\040\105\103\103\040\120\063\070\064\040\122\157\157\164\040
+\107\065
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\170\217\047\134\201\022\122\040\245\004\320\055\335\272
-\163\364
+\002\020\005\077\156\240\006\001\162\175\355\077\303\243\266\243
+\326\357
 END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "Certum Trusted Root CA"
+# Certificate "DigiCert SMIME RSA4096 Root G5"
 #
-# Issuer: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
-# Serial Number:1e:bf:59:50:b8:c9:80:37:4c:06:f7:eb:55:4f:b5:ed
-# Subject: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
-# Not Valid Before: Fri Mar 16 12:10:13 2018
-# Not Valid After : Mon Mar 16 12:10:13 2043
-# Fingerprint (SHA-256): FE:76:96:57:38:55:77:3E:37:A9:5E:7A:D4:D9:CC:96:C3:01:57:C1:5D:31:76:5B:A9:B1:57:04:E1:AE:78:FD
-# Fingerprint (SHA1): C8:83:44:C0:18:AE:9F:CC:F1:87:B7:8F:22:D1:C5:D7:45:84:BA:E5
+# Issuer: CN=DigiCert SMIME RSA4096 Root G5,O="DigiCert, Inc.",C=US
+# Serial Number:05:f6:ba:04:23:83:46:cb:7d:5c:e6:b9:5b:ba:1c:55
+# Subject: CN=DigiCert SMIME RSA4096 Root G5,O="DigiCert, Inc.",C=US
+# Not Valid Before: Fri Jan 15 00:00:00 2021
+# Not Valid After : Sun Jan 14 23:59:59 2046
+# Fingerprint (SHA-256): 90:37:0D:3E:FA:88:BF:58:C3:01:05:BA:25:10:4A:35:84:60:A7:FA:52:DF:C2:01:1D:F2:33:A0:F4:17:91:2A
+# Fingerprint (SHA1): 5B:C5:AD:E2:9A:A7:54:DA:84:89:53:A5:FE:D7:5B:46:86:D0:57:08
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Certum Trusted Root CA"
+CKA_LABEL UTF8 "DigiCert SMIME RSA4096 Root G5"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\172\061\013\060\011\006\003\125\004\006\023\002\120\114\061
-\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
-\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
-\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
-\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171\061\037\060\035\006
-\003\125\004\003\023\026\103\145\162\164\165\155\040\124\162\165
-\163\164\145\144\040\122\157\157\164\040\103\101
+\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\047\060\045\006\003\125\004
+\003\023\036\104\151\147\151\103\145\162\164\040\123\115\111\115
+\105\040\122\123\101\064\060\071\066\040\122\157\157\164\040\107
+\065
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\172\061\013\060\011\006\003\125\004\006\023\002\120\114\061
-\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
-\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
-\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
-\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171\061\037\060\035\006
-\003\125\004\003\023\026\103\145\162\164\165\155\040\124\162\165
-\163\164\145\144\040\122\157\157\164\040\103\101
+\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\047\060\045\006\003\125\004
+\003\023\036\104\151\147\151\103\145\162\164\040\123\115\111\115
+\105\040\122\123\101\064\060\071\066\040\122\157\157\164\040\107
+\065
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\036\277\131\120\270\311\200\067\114\006\367\353\125\117
-\265\355
+\002\020\005\366\272\004\043\203\106\313\175\134\346\271\133\272
+\034\125
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\300\060\202\003\250\240\003\002\001\002\002\020\036
-\277\131\120\270\311\200\067\114\006\367\353\125\117\265\355\060
-\015\006\011\052\206\110\206\367\015\001\001\015\005\000\060\172
-\061\013\060\011\006\003\125\004\006\023\002\120\114\061\041\060
-\037\006\003\125\004\012\023\030\101\163\163\145\143\157\040\104
-\141\164\141\040\123\171\163\164\145\155\163\040\123\056\101\056
-\061\047\060\045\006\003\125\004\013\023\036\103\145\162\164\165
-\155\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040
-\101\165\164\150\157\162\151\164\171\061\037\060\035\006\003\125
-\004\003\023\026\103\145\162\164\165\155\040\124\162\165\163\164
-\145\144\040\122\157\157\164\040\103\101\060\036\027\015\061\070
-\060\063\061\066\061\062\061\060\061\063\132\027\015\064\063\060
-\063\061\066\061\062\061\060\061\063\132\060\172\061\013\060\011
-\006\003\125\004\006\023\002\120\114\061\041\060\037\006\003\125
-\004\012\023\030\101\163\163\145\143\157\040\104\141\164\141\040
-\123\171\163\164\145\155\163\040\123\056\101\056\061\047\060\045
-\006\003\125\004\013\023\036\103\145\162\164\165\155\040\103\145
-\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150
-\157\162\151\164\171\061\037\060\035\006\003\125\004\003\023\026
-\103\145\162\164\165\155\040\124\162\165\163\164\145\144\040\122
-\157\157\164\040\103\101\060\202\002\042\060\015\006\011\052\206
-\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202
-\002\012\002\202\002\001\000\321\055\216\273\267\066\352\155\067
-\221\237\116\223\247\005\344\051\003\045\316\034\202\367\174\231
-\237\101\006\315\355\243\272\300\333\011\054\301\174\337\051\176
-\113\145\057\223\247\324\001\153\003\050\030\243\330\235\005\301
-\052\330\105\361\221\336\337\073\320\200\002\214\317\070\017\352
-\247\134\170\021\244\301\310\205\134\045\323\323\262\347\045\317
-\021\124\227\253\065\300\036\166\034\357\000\123\237\071\334\024
-\245\054\042\045\263\162\162\374\215\263\345\076\010\036\024\052
-\067\013\210\074\312\260\364\310\302\241\256\274\301\276\051\147
-\125\342\374\255\131\134\376\275\127\054\260\220\215\302\355\067
-\266\174\231\210\265\325\003\232\075\025\015\075\072\250\250\105
-\360\225\116\045\131\035\315\230\151\273\323\314\062\311\215\357
-\201\376\255\175\211\273\272\140\023\312\145\225\147\240\363\031
-\366\003\126\324\152\323\047\342\241\255\203\360\112\022\042\167
-\034\005\163\342\031\161\102\300\354\165\106\232\220\130\340\152
-\216\053\245\106\060\004\216\031\262\027\343\276\251\272\177\126
-\361\044\003\327\262\041\050\166\016\066\060\114\171\325\101\232
-\232\250\270\065\272\014\072\362\104\033\040\210\367\305\045\327
-\075\306\343\076\103\335\207\376\304\352\365\123\076\114\145\377
-\073\112\313\170\132\153\027\137\015\307\303\117\116\232\052\242
-\355\127\115\042\342\106\232\077\017\221\064\044\175\125\343\214
-\225\067\323\032\360\011\053\054\322\311\215\264\015\000\253\147
-\051\050\330\001\365\031\004\266\035\276\166\376\162\134\304\205
-\312\322\200\101\337\005\250\243\325\204\220\117\013\363\340\077
-\233\031\322\067\211\077\362\173\122\034\214\366\341\367\074\007
-\227\214\016\242\131\201\014\262\220\075\323\343\131\106\355\017
-\251\247\336\200\153\132\252\007\266\031\313\274\127\363\227\041
-\172\014\261\053\164\076\353\332\247\147\055\114\304\230\236\066
-\011\166\146\146\374\032\077\352\110\124\034\276\060\275\200\120
-\277\174\265\316\000\366\014\141\331\347\044\003\340\343\001\201
-\016\275\330\205\064\210\275\262\066\250\173\134\010\345\104\200
-\214\157\370\057\325\041\312\035\034\320\373\304\265\207\321\072
-\116\307\166\265\065\110\265\002\003\001\000\001\243\102\060\100
-\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001
-\377\060\035\006\003\125\035\016\004\026\004\024\214\373\034\165
-\274\002\323\237\116\056\110\331\371\140\124\252\304\263\117\372
-\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006
-\060\015\006\011\052\206\110\206\367\015\001\001\015\005\000\003
-\202\002\001\000\110\242\325\000\013\056\320\077\274\034\325\265
-\124\111\036\132\153\364\344\362\340\100\067\340\314\024\173\271
-\311\372\065\265\165\027\223\152\005\151\205\234\315\117\031\170
-\133\031\201\363\143\076\303\316\133\217\365\057\136\001\166\023
-\077\054\000\271\315\226\122\071\111\155\004\116\305\351\017\206
-\015\341\372\263\137\202\022\361\072\316\146\006\044\064\053\350
-\314\312\347\151\334\207\235\302\064\327\171\321\323\167\270\252
-\131\130\376\235\046\372\070\206\076\235\212\207\144\127\345\027
-\072\342\371\215\271\343\063\170\301\220\330\270\335\267\203\121
-\344\304\314\043\325\006\174\346\121\323\315\064\061\300\366\106
-\273\013\255\374\075\020\005\052\073\112\221\045\356\214\324\204
-\207\200\052\274\011\214\252\072\023\137\350\064\171\120\301\020
-\031\371\323\050\036\324\321\121\060\051\263\256\220\147\326\037
-\012\143\261\305\251\306\102\061\143\027\224\357\151\313\057\372
-\214\024\175\304\103\030\211\331\360\062\100\346\200\342\106\137
-\345\343\301\000\131\250\371\350\040\274\211\054\016\107\064\013
-\352\127\302\123\066\374\247\324\257\061\315\376\002\345\165\372
-\271\047\011\371\363\365\073\312\175\237\251\042\313\210\311\252
-\321\107\075\066\167\250\131\144\153\047\317\357\047\301\343\044
-\265\206\367\256\176\062\115\260\171\150\321\071\350\220\130\303
-\203\274\017\054\326\227\353\316\014\341\040\307\332\267\076\303
-\077\277\057\334\064\244\373\053\041\315\147\217\113\364\343\352
-\324\077\347\117\272\271\245\223\105\034\146\037\041\372\144\136
-\157\340\166\224\062\313\165\365\156\345\366\217\307\270\244\314
-\250\226\175\144\373\044\132\112\003\154\153\070\306\350\003\103
-\232\367\127\271\263\051\151\223\070\364\003\362\273\373\202\153
-\007\040\321\122\037\232\144\002\173\230\146\333\134\115\132\017
-\320\204\225\240\074\024\103\006\312\312\333\270\101\066\332\152
-\104\147\207\257\257\343\105\021\025\151\010\262\276\026\071\227
-\044\157\022\105\321\147\135\011\250\311\025\332\372\322\246\137
-\023\141\037\277\205\254\264\255\255\005\224\010\203\036\165\027
-\323\161\073\223\120\043\131\240\355\074\221\124\235\166\000\305
-\303\270\070\333
+\060\202\005\152\060\202\003\122\240\003\002\001\002\002\020\005
+\366\272\004\043\203\106\313\175\134\346\271\133\272\034\125\060
+\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\117
+\061\013\060\011\006\003\125\004\006\023\002\125\123\061\027\060
+\025\006\003\125\004\012\023\016\104\151\147\151\103\145\162\164
+\054\040\111\156\143\056\061\047\060\045\006\003\125\004\003\023
+\036\104\151\147\151\103\145\162\164\040\123\115\111\115\105\040
+\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065\060
+\036\027\015\062\061\060\061\061\065\060\060\060\060\060\060\132
+\027\015\064\066\060\061\061\064\062\063\065\071\065\071\132\060
+\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061\027
+\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145\162
+\164\054\040\111\156\143\056\061\047\060\045\006\003\125\004\003
+\023\036\104\151\147\151\103\145\162\164\040\123\115\111\115\105
+\040\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065
+\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
+\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
+\000\340\152\133\331\370\371\175\354\265\173\357\137\335\134\064
+\330\332\135\321\313\145\165\253\041\174\133\000\324\202\157\105
+\205\101\212\251\022\002\162\062\360\024\365\003\165\273\143\227
+\111\017\100\231\013\032\036\126\247\322\320\341\253\335\345\004
+\033\343\037\024\022\002\210\365\240\200\011\366\047\232\120\360
+\272\343\242\340\254\152\024\221\265\153\070\020\172\242\061\341
+\221\033\267\271\360\053\133\310\167\011\166\267\121\304\066\012
+\231\123\124\104\045\267\011\065\206\027\005\126\223\075\101\267
+\002\327\142\037\212\222\021\207\352\021\155\352\010\021\334\261
+\170\110\111\222\366\264\121\200\170\043\330\376\341\126\032\072
+\220\023\126\064\211\325\342\225\213\137\336\262\314\373\077\070
+\267\205\367\352\236\277\056\241\056\057\115\175\152\021\056\066
+\240\377\021\010\004\225\125\340\033\073\147\223\251\224\125\352
+\062\355\006\072\177\302\177\343\255\023\047\321\064\101\263\060
+\303\277\264\210\370\003\202\244\337\076\253\170\167\240\131\223
+\161\347\335\353\000\004\173\314\110\071\050\340\036\243\025\151
+\310\066\262\241\013\227\337\125\326\357\221\234\244\366\026\367
+\121\012\356\003\043\221\334\004\377\340\335\070\366\042\003\000
+\302\007\161\032\022\311\327\106\052\224\033\315\326\273\033\356
+\277\276\115\120\130\260\013\315\060\166\051\365\317\345\266\152
+\057\166\260\260\151\152\320\155\145\030\065\176\223\274\162\027
+\301\125\102\315\057\302\045\273\364\375\035\241\144\042\124\135
+\342\236\162\101\204\156\161\226\352\105\007\266\136\172\112\206
+\235\163\144\167\070\003\322\017\123\245\125\040\304\115\377\150
+\157\125\251\352\335\161\344\117\331\205\243\174\116\051\002\236
+\013\011\362\032\123\314\000\246\335\321\064\366\015\301\060\261
+\234\002\144\254\065\355\245\260\051\261\322\225\063\017\322\040
+\063\275\354\043\113\362\031\371\332\230\144\344\054\061\037\056
+\341\215\034\004\225\050\115\214\130\315\113\345\163\202\206\214
+\354\250\326\171\134\373\144\273\334\014\114\050\366\027\257\342
+\150\326\026\206\230\333\374\001\334\061\272\370\234\016\371\050
+\106\112\341\375\226\006\105\171\021\150\027\145\134\213\046\207
+\133\002\003\001\000\001\243\102\060\100\060\035\006\003\125\035
+\016\004\026\004\024\321\243\324\127\035\117\125\333\165\114\134
+\102\236\143\026\316\264\306\073\037\060\016\006\003\125\035\017
+\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035\023
+\001\001\377\004\005\060\003\001\001\377\060\015\006\011\052\206
+\110\206\367\015\001\001\014\005\000\003\202\002\001\000\007\247
+\012\336\123\273\232\353\160\277\262\066\220\315\344\247\270\361
+\014\344\135\132\035\170\145\374\311\270\036\043\021\127\174\151
+\065\155\001\377\123\120\277\007\016\272\307\001\077\130\052\224
+\165\003\253\034\013\043\334\033\212\036\067\075\035\130\217\163
+\331\263\052\157\337\020\240\133\014\247\312\260\177\271\044\242
+\001\065\062\345\136\106\101\353\330\177\163\347\102\351\244\121
+\046\167\201\012\250\353\017\012\120\235\176\212\040\147\374\013
+\216\072\021\323\305\214\140\030\331\113\261\374\324\361\264\111
+\116\256\207\341\321\373\166\241\137\363\006\317\227\226\014\351
+\236\165\201\134\123\015\042\374\066\346\111\156\164\333\000\205
+\215\174\042\240\216\373\020\114\324\142\023\133\357\113\162\046
+\213\374\116\212\217\376\227\020\123\305\170\213\102\144\033\137
+\340\211\375\273\011\177\120\340\124\205\046\021\152\035\145\371
+\111\051\334\174\066\337\373\075\367\322\254\356\062\215\156\246
+\175\071\234\105\304\312\015\365\073\264\171\123\245\057\126\307
+\121\305\212\114\144\135\220\103\043\216\153\114\027\170\314\350
+\277\365\073\344\250\110\317\255\233\014\337\062\112\323\331\022
+\216\043\170\015\055\257\237\257\236\074\011\302\227\000\355\072
+\151\034\161\077\071\337\323\217\304\146\365\357\066\224\017\363
+\335\222\266\226\137\220\246\335\163\252\246\040\224\224\045\152
+\011\014\162\344\023\043\140\114\243\312\027\056\173\147\000\333
+\320\315\352\172\037\071\046\127\211\060\167\313\116\345\225\105
+\117\137\373\066\134\075\371\040\265\072\020\045\117\223\062\132
+\356\301\226\350\351\126\004\260\111\141\115\354\170\250\235\030
+\301\377\330\352\057\126\357\225\053\173\004\136\147\343\125\100
+\355\071\004\371\013\171\365\152\214\134\017\211\232\220\307\315
+\213\336\333\046\065\241\156\315\263\102\362\242\017\073\014\216
+\223\377\024\317\374\367\223\367\344\101\010\156\031\122\021\017
+\123\031\163\170\014\317\330\205\201\370\255\125\310\260\236\106
+\143\257\234\122\356\134\277\360\300\133\067\036\011\040\322\076
+\043\306\241\025\112\016\066\176\060\305\171\152\274\042\210\331
+\014\122\100\037\335\116\017\147\046\026\322\255\027\034
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "Certum Trusted Root CA"
-# Issuer: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
-# Serial Number:1e:bf:59:50:b8:c9:80:37:4c:06:f7:eb:55:4f:b5:ed
-# Subject: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL
-# Not Valid Before: Fri Mar 16 12:10:13 2018
-# Not Valid After : Mon Mar 16 12:10:13 2043
-# Fingerprint (SHA-256): FE:76:96:57:38:55:77:3E:37:A9:5E:7A:D4:D9:CC:96:C3:01:57:C1:5D:31:76:5B:A9:B1:57:04:E1:AE:78:FD
-# Fingerprint (SHA1): C8:83:44:C0:18:AE:9F:CC:F1:87:B7:8F:22:D1:C5:D7:45:84:BA:E5
+# Trust for "DigiCert SMIME RSA4096 Root G5"
+# Issuer: CN=DigiCert SMIME RSA4096 Root G5,O="DigiCert, Inc.",C=US
+# Serial Number:05:f6:ba:04:23:83:46:cb:7d:5c:e6:b9:5b:ba:1c:55
+# Subject: CN=DigiCert SMIME RSA4096 Root G5,O="DigiCert, Inc.",C=US
+# Not Valid Before: Fri Jan 15 00:00:00 2021
+# Not Valid After : Sun Jan 14 23:59:59 2046
+# Fingerprint (SHA-256): 90:37:0D:3E:FA:88:BF:58:C3:01:05:BA:25:10:4A:35:84:60:A7:FA:52:DF:C2:01:1D:F2:33:A0:F4:17:91:2A
+# Fingerprint (SHA1): 5B:C5:AD:E2:9A:A7:54:DA:84:89:53:A5:FE:D7:5B:46:86:D0:57:08
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "Certum Trusted Root CA"
+CKA_LABEL UTF8 "DigiCert SMIME RSA4096 Root G5"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\310\203\104\300\030\256\237\314\361\207\267\217\042\321\305\327
-\105\204\272\345
+\133\305\255\342\232\247\124\332\204\211\123\245\376\327\133\106
+\206\320\127\010
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\121\341\302\347\376\114\204\257\131\016\057\364\124\157\352\051
+\321\173\340\265\077\065\162\237\175\276\013\245\244\035\251\156
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\172\061\013\060\011\006\003\125\004\006\023\002\120\114\061
-\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157
-\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056
-\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162
-\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157
-\156\040\101\165\164\150\157\162\151\164\171\061\037\060\035\006
-\003\125\004\003\023\026\103\145\162\164\165\155\040\124\162\165
-\163\164\145\144\040\122\157\157\164\040\103\101
+\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145
+\162\164\054\040\111\156\143\056\061\047\060\045\006\003\125\004
+\003\023\036\104\151\147\151\103\145\162\164\040\123\115\111\115
+\105\040\122\123\101\064\060\071\066\040\122\157\157\164\040\107
+\065
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\036\277\131\120\270\311\200\067\114\006\367\353\125\117
-\265\355
+\002\020\005\366\272\004\043\203\106\313\175\134\346\271\133\272
+\034\125
 END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "TunTrust Root CA"
+# Certificate "Certainly Root R1"
 #
-# Issuer: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN
-# Serial Number:13:02:d5:e2:40:4c:92:46:86:16:67:5d:b4:bb:bb:b2:6b:3e:fc:13
-# Subject: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN
-# Not Valid Before: Fri Apr 26 08:57:56 2019
-# Not Valid After : Tue Apr 26 08:57:56 2044
-# Fingerprint (SHA-256): 2E:44:10:2A:B5:8C:B8:54:19:45:1C:8E:19:D9:AC:F3:66:2C:AF:BC:61:4B:6A:53:96:0A:30:F7:D0:E2:EB:41
-# Fingerprint (SHA1): CF:E9:70:84:0F:E0:73:0F:9D:F6:0C:7F:2C:4B:EE:20:46:34:9C:BB
+# Issuer: CN=Certainly Root R1,O=Certainly,C=US
+# Serial Number:00:8e:0f:f9:4b:90:71:68:65:33:54:f4:d4:44:39:b7:e0
+# Subject: CN=Certainly Root R1,O=Certainly,C=US
+# Not Valid Before: Thu Apr 01 00:00:00 2021
+# Not Valid After : Sun Apr 01 00:00:00 2046
+# Fingerprint (SHA-256): 77:B8:2C:D8:64:4C:43:05:F7:AC:C5:CB:15:6B:45:67:50:04:03:3D:51:C6:0C:62:02:A8:E0:C3:34:67:D3:A0
+# Fingerprint (SHA1): A0:50:EE:0F:28:71:F4:27:B2:12:6D:6F:50:96:25:BA:CC:86:42:AF
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "TunTrust Root CA"
+CKA_LABEL UTF8 "Certainly Root R1"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\141\061\013\060\011\006\003\125\004\006\023\002\124\116\061
-\067\060\065\006\003\125\004\012\014\056\101\147\145\156\143\145
-\040\116\141\164\151\157\156\141\154\145\040\144\145\040\103\145
-\162\164\151\146\151\143\141\164\151\157\156\040\105\154\145\143
-\164\162\157\156\151\161\165\145\061\031\060\027\006\003\125\004
-\003\014\020\124\165\156\124\162\165\163\164\040\122\157\157\164
-\040\103\101
+\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151
+\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145
+\162\164\141\151\156\154\171\040\122\157\157\164\040\122\061
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\141\061\013\060\011\006\003\125\004\006\023\002\124\116\061
-\067\060\065\006\003\125\004\012\014\056\101\147\145\156\143\145
-\040\116\141\164\151\157\156\141\154\145\040\144\145\040\103\145
-\162\164\151\146\151\143\141\164\151\157\156\040\105\154\145\143
-\164\162\157\156\151\161\165\145\061\031\060\027\006\003\125\004
-\003\014\020\124\165\156\124\162\165\163\164\040\122\157\157\164
-\040\103\101
+\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151
+\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145
+\162\164\141\151\156\154\171\040\122\157\157\164\040\122\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\024\023\002\325\342\100\114\222\106\206\026\147\135\264\273
-\273\262\153\076\374\023
+\002\021\000\216\017\371\113\220\161\150\145\063\124\364\324\104
+\071\267\340
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\263\060\202\003\233\240\003\002\001\002\002\024\023
-\002\325\342\100\114\222\106\206\026\147\135\264\273\273\262\153
-\076\374\023\060\015\006\011\052\206\110\206\367\015\001\001\013
-\005\000\060\141\061\013\060\011\006\003\125\004\006\023\002\124
-\116\061\067\060\065\006\003\125\004\012\014\056\101\147\145\156
-\143\145\040\116\141\164\151\157\156\141\154\145\040\144\145\040
-\103\145\162\164\151\146\151\143\141\164\151\157\156\040\105\154
-\145\143\164\162\157\156\151\161\165\145\061\031\060\027\006\003
-\125\004\003\014\020\124\165\156\124\162\165\163\164\040\122\157
-\157\164\040\103\101\060\036\027\015\061\071\060\064\062\066\060
-\070\065\067\065\066\132\027\015\064\064\060\064\062\066\060\070
-\065\067\065\066\132\060\141\061\013\060\011\006\003\125\004\006
-\023\002\124\116\061\067\060\065\006\003\125\004\012\014\056\101
-\147\145\156\143\145\040\116\141\164\151\157\156\141\154\145\040
-\144\145\040\103\145\162\164\151\146\151\143\141\164\151\157\156
-\040\105\154\145\143\164\162\157\156\151\161\165\145\061\031\060
-\027\006\003\125\004\003\014\020\124\165\156\124\162\165\163\164
-\040\122\157\157\164\040\103\101\060\202\002\042\060\015\006\011
+\060\202\005\107\060\202\003\057\240\003\002\001\002\002\021\000
+\216\017\371\113\220\161\150\145\063\124\364\324\104\071\267\340
+\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060
+\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022
+\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151\156
+\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145\162
+\164\141\151\156\154\171\040\122\157\157\164\040\122\061\060\036
+\027\015\062\061\060\064\060\061\060\060\060\060\060\060\132\027
+\015\064\066\060\064\060\061\060\060\060\060\060\060\132\060\075
+\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022\060
+\020\006\003\125\004\012\023\011\103\145\162\164\141\151\156\154
+\171\061\032\060\030\006\003\125\004\003\023\021\103\145\162\164
+\141\151\156\154\171\040\122\157\157\164\040\122\061\060\202\002
+\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000
+\003\202\002\017\000\060\202\002\012\002\202\002\001\000\320\066
+\324\037\352\335\253\344\321\266\346\373\042\300\335\023\015\152
+\173\042\023\034\227\074\150\143\146\062\234\003\265\215\244\201
+\203\332\170\060\021\317\334\262\053\276\222\277\216\344\304\023
+\276\244\150\114\332\002\150\026\164\276\262\335\004\344\153\052
+\335\067\037\140\054\333\365\367\241\174\225\267\014\160\206\056
+\361\072\357\122\367\314\323\233\371\213\276\016\337\061\267\235
+\150\134\222\246\365\345\363\012\064\265\377\173\242\344\207\241
+\306\257\027\000\357\003\221\355\251\034\116\161\075\322\213\154
+\211\364\170\206\346\152\111\240\316\265\322\260\253\233\366\364
+\324\056\343\162\371\066\306\353\025\267\045\214\072\374\045\015
+\263\042\163\041\164\310\112\226\141\222\365\057\013\030\245\364
+\255\342\356\101\275\001\171\372\226\214\215\027\002\060\264\371
+\257\170\032\214\264\066\020\020\007\005\160\320\364\061\220\212
+\121\305\206\046\171\262\021\210\136\305\360\012\124\315\111\246
+\277\002\234\322\104\247\355\343\170\357\106\136\155\161\321\171
+\160\034\106\137\121\351\311\067\334\137\176\151\173\101\337\064
+\105\340\073\204\364\241\212\012\066\236\067\314\142\122\341\211
+\015\050\371\172\043\261\015\075\075\232\375\235\201\357\054\220
+\300\173\104\116\273\111\340\016\112\126\222\274\313\265\335\171
+\027\211\221\336\141\211\164\222\250\343\062\205\276\116\205\244
+\113\131\313\053\305\170\216\161\124\320\002\067\231\214\345\111
+\352\340\124\162\244\021\006\057\013\214\301\133\276\265\241\260
+\123\156\234\270\140\221\037\131\153\371\055\364\224\012\227\265
+\354\305\166\003\124\033\145\122\272\114\222\126\121\065\240\100
+\330\051\333\256\122\166\073\055\060\100\233\212\320\102\126\264
+\267\210\001\244\207\073\123\226\315\243\026\217\363\146\252\027
+\261\307\140\340\301\103\005\014\356\233\133\140\157\006\134\207
+\133\047\371\100\021\236\234\063\301\267\345\065\127\005\177\047
+\316\027\040\214\034\374\361\373\332\061\051\111\355\365\013\204
+\247\117\301\366\116\302\050\234\372\356\340\257\007\373\063\021
+\172\041\117\013\041\020\266\100\072\253\042\072\004\234\213\233
+\204\206\162\232\322\247\245\304\264\165\221\251\053\043\002\003
+\001\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001
+\377\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001
+\377\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004
+\026\004\024\340\252\077\045\215\237\104\134\301\072\350\056\256
+\167\114\204\076\147\014\364\060\015\006\011\052\206\110\206\367
+\015\001\001\013\005\000\003\202\002\001\000\271\127\257\270\022
+\332\127\203\217\150\013\063\035\003\123\125\364\225\160\344\053
+\075\260\071\353\372\211\142\375\367\326\030\004\057\041\064\335
+\361\150\360\325\226\132\336\302\200\243\301\215\306\152\367\131
+\167\256\025\144\317\133\171\005\167\146\352\214\323\153\015\335
+\361\131\054\301\063\245\060\200\025\105\007\105\032\061\042\266
+\222\000\253\231\115\072\217\167\257\251\042\312\057\143\312\025
+\326\307\306\360\075\154\374\034\015\230\020\141\236\021\242\042
+\327\012\362\221\172\153\071\016\057\060\303\066\111\237\340\351
+\017\002\104\120\067\224\125\175\352\237\366\073\272\224\245\114
+\351\274\076\121\264\350\312\222\066\124\155\134\045\050\332\335
+\255\024\375\323\356\342\042\005\353\320\362\267\150\022\327\132
+\212\101\032\306\222\245\132\073\143\105\117\277\341\072\167\042
+\057\134\277\106\371\132\003\205\023\102\137\312\336\123\327\142
+\265\246\065\004\302\107\377\231\375\204\337\134\316\351\136\200
+\050\101\362\175\347\036\220\330\117\166\076\202\074\015\374\245
+\003\372\173\032\331\105\036\140\332\304\216\371\374\053\311\173
+\225\305\052\377\252\211\337\202\061\017\162\377\014\047\327\012
+\036\126\000\120\036\014\220\301\226\265\330\024\205\273\247\015
+\026\301\370\007\044\033\272\205\241\032\005\011\200\272\225\143
+\311\072\354\045\237\177\235\272\244\107\025\233\104\160\361\152
+\113\326\070\136\103\363\030\176\120\156\351\132\050\346\145\346
+\167\033\072\375\035\276\003\046\243\333\324\341\273\176\226\047
+\053\035\356\244\373\332\045\124\023\003\336\071\306\303\037\115
+\220\354\217\033\112\322\034\355\205\225\070\120\171\106\326\301
+\220\120\061\251\134\232\156\035\365\063\126\213\247\231\322\362
+\310\054\063\223\222\060\307\116\214\145\063\020\144\027\375\044
+\027\226\321\215\302\072\152\053\353\023\213\104\362\041\363\112
+\032\267\167\137\327\355\210\244\162\345\071\037\225\235\276\147
+\301\160\021\075\273\364\370\111\267\343\046\227\072\237\322\137
+\174\373\300\231\174\071\051\340\173\035\277\015\247\217\322\051
+\064\156\044\025\313\336\220\136\277\032\304\146\352\302\346\272
+\071\137\212\231\251\101\131\007\260\054\257
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "Certainly Root R1"
+# Issuer: CN=Certainly Root R1,O=Certainly,C=US
+# Serial Number:00:8e:0f:f9:4b:90:71:68:65:33:54:f4:d4:44:39:b7:e0
+# Subject: CN=Certainly Root R1,O=Certainly,C=US
+# Not Valid Before: Thu Apr 01 00:00:00 2021
+# Not Valid After : Sun Apr 01 00:00:00 2046
+# Fingerprint (SHA-256): 77:B8:2C:D8:64:4C:43:05:F7:AC:C5:CB:15:6B:45:67:50:04:03:3D:51:C6:0C:62:02:A8:E0:C3:34:67:D3:A0
+# Fingerprint (SHA1): A0:50:EE:0F:28:71:F4:27:B2:12:6D:6F:50:96:25:BA:CC:86:42:AF
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Certainly Root R1"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\240\120\356\017\050\161\364\047\262\022\155\157\120\226\045\272
+\314\206\102\257
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\007\160\324\076\202\207\240\372\063\066\023\364\372\063\347\022
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151
+\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145
+\162\164\141\151\156\154\171\040\122\157\157\164\040\122\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\021\000\216\017\371\113\220\161\150\145\063\124\364\324\104
+\071\267\340
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "Certainly Root E1"
+#
+# Issuer: CN=Certainly Root E1,O=Certainly,C=US
+# Serial Number:06:25:33:b1:47:03:33:27:5c:f9:8d:9a:b9:bf:cc:f8
+# Subject: CN=Certainly Root E1,O=Certainly,C=US
+# Not Valid Before: Thu Apr 01 00:00:00 2021
+# Not Valid After : Sun Apr 01 00:00:00 2046
+# Fingerprint (SHA-256): B4:58:5F:22:E4:AC:75:6A:4E:86:12:A1:36:1C:5D:9D:03:1A:93:FD:84:FE:BB:77:8F:A3:06:8B:0F:C4:2D:C2
+# Fingerprint (SHA1): F9:E1:6D:DC:01:89:CF:D5:82:45:63:3E:C5:37:7D:C2:EB:93:6F:2B
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Certainly Root E1"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151
+\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145
+\162\164\141\151\156\154\171\040\122\157\157\164\040\105\061
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151
+\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145
+\162\164\141\151\156\154\171\040\122\157\157\164\040\105\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\006\045\063\261\107\003\063\047\134\371\215\232\271\277
+\314\370
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\001\367\060\202\001\175\240\003\002\001\002\002\020\006
+\045\063\261\107\003\063\047\134\371\215\232\271\277\314\370\060
+\012\006\010\052\206\110\316\075\004\003\003\060\075\061\013\060
+\011\006\003\125\004\006\023\002\125\123\061\022\060\020\006\003
+\125\004\012\023\011\103\145\162\164\141\151\156\154\171\061\032
+\060\030\006\003\125\004\003\023\021\103\145\162\164\141\151\156
+\154\171\040\122\157\157\164\040\105\061\060\036\027\015\062\061
+\060\064\060\061\060\060\060\060\060\060\132\027\015\064\066\060
+\064\060\061\060\060\060\060\060\060\132\060\075\061\013\060\011
+\006\003\125\004\006\023\002\125\123\061\022\060\020\006\003\125
+\004\012\023\011\103\145\162\164\141\151\156\154\171\061\032\060
+\030\006\003\125\004\003\023\021\103\145\162\164\141\151\156\154
+\171\040\122\157\157\164\040\105\061\060\166\060\020\006\007\052
+\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142\000
+\004\336\157\370\177\034\337\355\371\107\207\206\261\244\300\212
+\370\202\227\200\352\217\310\112\136\052\175\210\150\247\001\142
+\024\221\044\172\134\236\243\027\175\212\206\041\064\030\120\033
+\020\336\320\067\113\046\307\031\140\200\351\064\275\140\031\066
+\100\326\051\207\011\074\221\172\366\274\023\043\335\131\116\004
+\136\317\310\002\034\030\123\301\061\330\332\040\351\104\215\344
+\166\243\102\060\100\060\016\006\003\125\035\017\001\001\377\004
+\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004
+\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004
+\024\363\050\030\313\144\165\356\051\052\353\355\256\043\130\070
+\205\353\310\042\007\060\012\006\010\052\206\110\316\075\004\003
+\003\003\150\000\060\145\002\061\000\261\216\132\040\303\262\031
+\142\115\336\260\117\337\156\322\160\212\361\237\176\152\214\346
+\272\336\203\151\312\151\263\251\005\265\226\222\027\207\302\322
+\352\320\173\316\330\101\133\174\256\002\060\106\336\352\313\135
+\232\354\062\302\145\026\260\114\060\134\060\363\332\116\163\206
+\006\330\316\211\004\110\067\067\370\335\063\121\235\160\257\173
+\125\330\001\056\175\005\144\016\206\270\221
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "Certainly Root E1"
+# Issuer: CN=Certainly Root E1,O=Certainly,C=US
+# Serial Number:06:25:33:b1:47:03:33:27:5c:f9:8d:9a:b9:bf:cc:f8
+# Subject: CN=Certainly Root E1,O=Certainly,C=US
+# Not Valid Before: Thu Apr 01 00:00:00 2021
+# Not Valid After : Sun Apr 01 00:00:00 2046
+# Fingerprint (SHA-256): B4:58:5F:22:E4:AC:75:6A:4E:86:12:A1:36:1C:5D:9D:03:1A:93:FD:84:FE:BB:77:8F:A3:06:8B:0F:C4:2D:C2
+# Fingerprint (SHA1): F9:E1:6D:DC:01:89:CF:D5:82:45:63:3E:C5:37:7D:C2:EB:93:6F:2B
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "Certainly Root E1"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\371\341\155\334\001\211\317\325\202\105\143\076\305\067\175\302
+\353\223\157\053
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\012\236\312\315\076\122\120\306\066\363\113\243\355\247\123\351
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061
+\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151
+\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145
+\162\164\141\151\156\154\171\040\122\157\157\164\040\105\061
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\020\006\045\063\261\107\003\063\047\134\371\215\232\271\277
+\314\370
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "E-Tugra Global Root CA RSA v3"
+#
+# Issuer: CN=E-Tugra Global Root CA RSA v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR
+# Serial Number:0d:4d:c5:cd:16:22:95:96:08:7e:b8:0b:7f:15:06:34:fb:79:10:34
+# Subject: CN=E-Tugra Global Root CA RSA v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR
+# Not Valid Before: Wed Mar 18 09:07:17 2020
+# Not Valid After : Sun Mar 12 09:07:17 2045
+# Fingerprint (SHA-256): EF:66:B0:B1:0A:3C:DB:9F:2E:36:48:C7:6B:D2:AF:18:EA:D2:BF:E6:F1:17:65:5E:28:C4:06:0D:A1:A3:F4:C2
+# Fingerprint (SHA1): E9:A8:5D:22:14:52:1C:5B:AA:0A:B4:BE:24:6A:23:8A:C9:BA:E2:A9
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "E-Tugra Global Root CA RSA v3"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122
+\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162
+\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165
+\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033
+\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124
+\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006
+\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154
+\157\142\141\154\040\122\157\157\164\040\103\101\040\122\123\101
+\040\166\063
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122
+\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162
+\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165
+\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033
+\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124
+\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006
+\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154
+\157\142\141\154\040\122\157\157\164\040\103\101\040\122\123\101
+\040\166\063
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\024\015\115\305\315\026\042\225\226\010\176\270\013\177\025
+\006\064\373\171\020\064
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\005\363\060\202\003\333\240\003\002\001\002\002\024\015
+\115\305\315\026\042\225\226\010\176\270\013\177\025\006\064\373
+\171\020\064\060\015\006\011\052\206\110\206\367\015\001\001\013
+\005\000\060\201\200\061\013\060\011\006\003\125\004\006\023\002
+\124\122\061\017\060\015\006\003\125\004\007\023\006\101\156\153
+\141\162\141\061\031\060\027\006\003\125\004\012\023\020\105\055
+\124\165\147\162\141\040\105\102\107\040\101\056\123\056\061\035
+\060\033\006\003\125\004\013\023\024\105\055\124\165\147\162\141
+\040\124\162\165\163\164\040\103\145\156\164\145\162\061\046\060
+\044\006\003\125\004\003\023\035\105\055\124\165\147\162\141\040
+\107\154\157\142\141\154\040\122\157\157\164\040\103\101\040\122
+\123\101\040\166\063\060\036\027\015\062\060\060\063\061\070\060
+\071\060\067\061\067\132\027\015\064\065\060\063\061\062\060\071
+\060\067\061\067\132\060\201\200\061\013\060\011\006\003\125\004
+\006\023\002\124\122\061\017\060\015\006\003\125\004\007\023\006
+\101\156\153\141\162\141\061\031\060\027\006\003\125\004\012\023
+\020\105\055\124\165\147\162\141\040\105\102\107\040\101\056\123
+\056\061\035\060\033\006\003\125\004\013\023\024\105\055\124\165
+\147\162\141\040\124\162\165\163\164\040\103\145\156\164\145\162
+\061\046\060\044\006\003\125\004\003\023\035\105\055\124\165\147
+\162\141\040\107\154\157\142\141\154\040\122\157\157\164\040\103
+\101\040\122\123\101\040\166\063\060\202\002\042\060\015\006\011
 \052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000
-\060\202\002\012\002\202\002\001\000\303\315\323\374\275\004\123
-\335\014\040\072\325\210\056\005\113\101\365\203\202\176\367\131
-\237\236\236\143\350\163\332\366\006\251\117\037\264\371\013\037
-\071\214\232\040\320\176\006\324\354\064\331\206\274\165\133\207
-\210\360\322\331\324\243\012\262\154\033\353\111\054\076\254\135
-\330\224\003\240\354\064\345\060\304\065\175\373\046\115\033\156
-\060\124\330\365\200\105\234\071\255\234\311\045\004\115\232\220
-\076\116\100\156\212\153\315\051\147\306\314\055\340\164\350\005
-\127\012\110\120\372\172\103\332\176\354\133\232\016\142\166\376
-\352\235\035\205\162\354\021\273\065\350\037\047\277\301\241\307
-\273\110\026\335\126\327\314\116\240\341\271\254\333\325\203\031
-\032\205\321\224\227\327\312\243\145\013\363\070\371\002\256\335
-\366\147\317\311\077\365\212\054\107\032\231\157\005\015\375\320
-\035\202\061\374\051\314\000\130\227\221\114\200\000\034\063\205
-\226\057\313\101\302\213\020\204\303\011\044\211\037\265\017\331
-\331\167\107\030\222\224\140\134\307\231\003\074\376\367\225\247
-\175\120\241\200\302\251\203\255\130\226\125\041\333\206\131\324
-\257\306\274\335\201\156\007\333\140\142\376\354\020\156\332\150
-\001\364\203\033\251\076\242\133\043\327\144\306\337\334\242\175
-\330\113\272\202\322\121\370\146\277\006\106\344\171\052\046\066
-\171\217\037\116\231\035\262\217\014\016\034\377\311\135\300\375
-\220\020\246\261\067\363\315\072\044\156\264\205\220\277\200\271
-\014\214\325\233\326\310\361\126\077\032\200\211\172\251\342\033
-\062\121\054\076\362\337\173\366\135\172\051\031\216\345\310\275
-\066\161\213\135\114\302\035\077\255\130\242\317\075\160\115\246
-\120\230\045\334\043\371\270\130\101\010\161\277\117\270\204\240
-\217\000\124\025\374\221\155\130\247\226\073\353\113\226\047\315
-\153\242\241\206\254\015\174\124\346\146\114\146\137\220\276\041
-\232\002\106\055\344\203\302\200\271\317\113\076\350\177\074\001
-\354\217\136\315\177\322\050\102\001\225\212\342\227\075\020\041
-\175\366\235\034\305\064\241\354\054\016\012\122\054\022\125\160
-\044\075\313\302\024\065\103\135\047\116\276\300\275\252\174\226
-\347\374\236\141\255\104\323\000\227\002\003\001\000\001\243\143
-\060\141\060\035\006\003\125\035\016\004\026\004\024\006\232\233
-\037\123\175\361\365\244\310\323\206\076\241\163\131\264\367\104
-\041\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001
-\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024\006
-\232\233\037\123\175\361\365\244\310\323\206\076\241\163\131\264
-\367\104\041\060\016\006\003\125\035\017\001\001\377\004\004\003
+\060\202\002\012\002\202\002\001\000\242\146\360\211\267\162\173
+\356\011\311\143\322\323\103\335\136\303\246\204\070\112\361\215
+\201\273\024\275\107\350\100\027\363\075\303\170\105\162\246\056
+\220\336\232\072\324\040\161\312\274\237\035\113\227\012\307\061
+\272\076\327\376\045\251\052\216\066\364\321\057\307\267\251\135
+\063\334\060\160\370\100\154\113\262\246\061\141\321\064\074\075
+\061\172\307\257\304\247\247\204\341\227\244\350\113\366\027\174
+\356\074\007\355\342\212\127\334\266\373\370\103\045\120\352\047
+\201\250\206\274\217\122\112\226\072\140\032\226\273\375\163\364
+\205\375\203\375\177\204\155\064\154\177\152\267\113\001\003\277
+\255\151\267\327\062\331\365\127\152\351\206\202\076\245\146\061
+\263\026\075\302\363\046\140\062\323\122\036\260\154\244\067\076
+\364\365\257\353\341\337\200\006\317\052\101\347\146\011\341\113
+\227\347\167\275\041\155\051\266\147\303\055\176\355\326\171\145
+\321\317\072\266\321\261\136\126\141\120\172\132\316\116\120\061
+\200\003\230\107\347\344\030\174\104\132\306\244\263\073\306\306
+\303\072\360\154\303\213\310\244\221\005\363\365\331\266\252\006
+\241\267\253\344\261\352\041\024\134\203\244\374\377\266\120\323
+\214\022\046\231\166\160\351\300\017\246\164\374\273\320\033\170
+\316\162\222\342\050\234\274\346\351\011\330\072\323\211\346\276
+\056\167\337\001\012\157\226\366\345\215\074\115\122\166\032\126
+\341\163\176\027\254\075\255\154\243\122\022\030\160\346\200\116
+\063\362\176\046\062\254\005\215\070\244\346\166\074\237\020\151
+\016\155\235\322\301\171\040\153\133\317\063\215\321\224\166\065
+\347\135\125\307\267\254\050\253\106\314\347\073\041\265\012\012
+\344\112\131\334\201\065\113\104\225\022\012\147\245\241\377\133
+\000\007\322\300\314\371\077\374\237\063\362\000\370\214\154\207
+\235\006\055\361\357\343\346\006\372\305\146\023\133\374\120\007
+\236\161\206\262\332\157\164\060\317\223\123\350\334\042\326\336
+\040\037\141\215\243\056\243\170\062\220\154\334\254\062\265\005
+\344\365\074\063\015\326\340\207\167\027\114\235\260\330\011\250
+\015\127\367\104\205\360\310\004\276\134\135\132\343\027\216\124
+\143\151\177\111\164\144\005\214\243\002\003\001\000\001\243\143
+\060\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003
+\001\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024
+\262\264\256\346\055\367\046\325\252\165\055\166\113\300\033\123
+\041\320\110\357\060\035\006\003\125\035\016\004\026\004\024\262
+\264\256\346\055\367\046\325\252\165\055\166\113\300\033\123\041
+\320\110\357\060\016\006\003\125\035\017\001\001\377\004\004\003
 \002\001\006\060\015\006\011\052\206\110\206\367\015\001\001\013
-\005\000\003\202\002\001\000\252\005\156\266\335\025\311\277\263
-\306\040\366\006\107\260\206\223\045\323\215\271\310\000\077\227
-\365\122\047\210\161\311\164\375\353\312\144\333\133\357\036\135
-\272\277\321\353\356\134\151\272\026\310\363\271\217\323\066\056
-\100\111\007\015\131\336\213\020\260\111\005\342\377\221\077\113
-\267\335\002\216\370\201\050\134\314\334\155\257\137\024\234\175
-\130\170\015\366\200\011\271\351\016\227\051\031\270\267\353\370
-\026\313\125\022\344\306\175\273\304\354\370\265\034\116\076\147
-\277\305\137\033\155\155\107\050\252\004\130\141\326\166\277\042
-\177\320\007\152\247\144\123\360\227\215\235\200\077\273\301\007
-\333\145\257\346\233\062\232\303\124\223\304\034\010\303\104\373
-\173\143\021\103\321\152\032\141\152\171\155\220\117\051\216\107
-\005\301\022\151\151\326\306\066\061\341\374\372\200\272\134\117
-\304\353\267\062\254\370\165\141\027\327\020\031\271\361\322\011
-\357\172\102\235\133\132\013\324\306\225\116\052\316\377\007\327
-\117\176\030\006\210\361\031\265\331\230\273\256\161\304\034\347
-\164\131\130\357\014\211\317\213\037\165\223\032\004\024\222\110
-\120\251\353\127\051\000\026\343\066\034\310\370\277\360\063\325
-\101\017\304\314\074\335\351\063\103\001\221\020\053\036\321\271
-\135\315\062\031\213\217\214\040\167\327\042\304\102\334\204\026
-\233\045\155\350\264\125\161\177\260\174\263\323\161\111\271\317
-\122\244\004\077\334\075\240\273\257\063\236\012\060\140\216\333
-\235\135\224\250\275\140\347\142\200\166\201\203\014\214\314\060
-\106\111\342\014\322\250\257\353\141\161\357\347\042\142\251\367
-\134\144\154\237\026\214\147\066\047\105\365\011\173\277\366\020
-\012\361\260\215\124\103\214\004\272\243\077\357\342\065\307\371
-\164\340\157\064\101\320\277\163\145\127\040\371\233\147\172\146
-\150\044\116\200\145\275\020\231\006\131\362\145\257\270\306\107
-\273\375\220\170\213\101\163\056\257\125\037\334\073\222\162\156
-\204\323\320\141\114\015\314\166\127\342\055\205\042\025\066\015
-\353\001\235\353\330\353\304\204\231\373\300\014\314\062\350\343
-\167\332\203\104\213\236\125\050\300\213\130\323\220\076\116\033
-\000\361\025\255\203\053\232
+\005\000\003\202\002\001\000\211\250\162\177\214\353\316\056\030
+\304\020\200\055\020\014\377\373\024\315\004\340\024\074\116\232
+\373\237\051\277\042\236\127\271\202\163\022\143\046\265\314\220
+\351\322\052\051\356\234\055\314\054\231\276\105\047\344\261\161
+\355\344\070\225\061\101\362\175\172\143\170\337\312\066\026\057
+\202\210\237\274\021\107\117\166\115\310\055\216\353\337\055\174
+\116\073\332\256\366\343\332\135\024\246\256\350\205\104\235\006
+\156\216\373\357\172\112\152\055\053\050\030\376\277\220\054\165
+\026\237\017\352\226\175\005\356\233\023\245\104\154\370\003\320
+\335\043\341\375\003\022\022\010\364\030\064\263\340\067\013\167
+\021\001\110\277\141\264\265\370\031\331\313\115\352\243\214\357
+\375\360\006\265\155\222\364\112\141\120\204\355\354\111\323\344
+\276\150\346\056\343\061\013\124\013\032\222\326\202\330\266\242
+\145\074\146\004\371\125\332\154\373\333\265\024\146\115\224\203
+\073\315\036\246\053\262\376\167\100\206\253\347\337\012\311\375
+\366\335\207\126\030\330\260\054\125\140\226\372\010\176\122\220
+\365\113\246\056\207\174\313\040\333\006\076\240\135\003\167\175
+\242\074\023\033\051\242\023\125\240\075\024\042\257\157\270\320
+\232\033\162\335\005\001\215\206\140\277\244\147\356\265\245\015
+\321\177\346\032\053\142\146\303\007\272\347\240\110\034\070\303
+\351\105\373\247\177\374\355\002\150\032\312\167\022\167\246\000
+\125\050\024\354\326\307\022\242\033\145\102\351\221\350\313\076
+\207\211\124\135\331\257\235\227\234\151\347\012\377\017\132\170
+\213\143\052\114\175\107\224\077\336\113\351\123\320\060\361\305
+\366\236\111\337\073\240\221\243\243\376\315\130\314\352\337\257
+\157\050\073\240\151\233\217\354\254\256\053\124\235\233\004\261
+\107\040\257\226\022\076\143\224\035\004\347\056\273\206\307\014
+\232\210\277\166\107\357\367\260\013\227\146\322\104\317\140\122
+\007\341\325\054\112\072\047\141\167\312\327\217\347\207\016\060
+\377\014\273\004\342\141\303\242\310\227\141\216\264\060\152\074
+\155\302\007\137\112\163\057\077\371\026\212\001\146\357\272\221
+\312\122\127\173\256\324\346\017\335\013\172\177\213\236\046\040
+\317\073\357\201\161\203\131
+END
+CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
+CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
+CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
+
+# Trust for "E-Tugra Global Root CA RSA v3"
+# Issuer: CN=E-Tugra Global Root CA RSA v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR
+# Serial Number:0d:4d:c5:cd:16:22:95:96:08:7e:b8:0b:7f:15:06:34:fb:79:10:34
+# Subject: CN=E-Tugra Global Root CA RSA v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR
+# Not Valid Before: Wed Mar 18 09:07:17 2020
+# Not Valid After : Sun Mar 12 09:07:17 2045
+# Fingerprint (SHA-256): EF:66:B0:B1:0A:3C:DB:9F:2E:36:48:C7:6B:D2:AF:18:EA:D2:BF:E6:F1:17:65:5E:28:C4:06:0D:A1:A3:F4:C2
+# Fingerprint (SHA1): E9:A8:5D:22:14:52:1C:5B:AA:0A:B4:BE:24:6A:23:8A:C9:BA:E2:A9
+CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "E-Tugra Global Root CA RSA v3"
+CKA_CERT_SHA1_HASH MULTILINE_OCTAL
+\351\250\135\042\024\122\034\133\252\012\264\276\044\152\043\212
+\311\272\342\251
+END
+CKA_CERT_MD5_HASH MULTILINE_OCTAL
+\042\276\020\366\302\370\003\210\163\137\063\051\107\050\107\244
+END
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122
+\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162
+\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165
+\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033
+\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124
+\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006
+\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154
+\157\142\141\154\040\122\157\157\164\040\103\101\040\122\123\101
+\040\166\063
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\024\015\115\305\315\026\042\225\226\010\176\270\013\177\025
+\006\064\373\171\020\064
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+
+#
+# Certificate "E-Tugra Global Root CA ECC v3"
+#
+# Issuer: CN=E-Tugra Global Root CA ECC v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR
+# Serial Number:26:46:19:77:31:e1:4f:6f:28:36:de:39:51:86:e6:d4:97:88:22:c1
+# Subject: CN=E-Tugra Global Root CA ECC v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR
+# Not Valid Before: Wed Mar 18 09:46:58 2020
+# Not Valid After : Sun Mar 12 09:46:58 2045
+# Fingerprint (SHA-256): 87:3F:46:85:FA:7F:56:36:25:25:2E:6D:36:BC:D7:F1:6F:C2:49:51:F2:64:E4:7E:1B:95:4F:49:08:CD:CA:13
+# Fingerprint (SHA1): 8A:2F:AF:57:53:B1:B0:E6:A1:04:EC:5B:6A:69:71:6D:F6:1C:E2:84
+CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
+CKA_TOKEN CK_BBOOL CK_TRUE
+CKA_PRIVATE CK_BBOOL CK_FALSE
+CKA_MODIFIABLE CK_BBOOL CK_FALSE
+CKA_LABEL UTF8 "E-Tugra Global Root CA ECC v3"
+CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
+CKA_SUBJECT MULTILINE_OCTAL
+\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122
+\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162
+\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165
+\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033
+\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124
+\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006
+\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154
+\157\142\141\154\040\122\157\157\164\040\103\101\040\105\103\103
+\040\166\063
+END
+CKA_ID UTF8 "0"
+CKA_ISSUER MULTILINE_OCTAL
+\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122
+\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162
+\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165
+\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033
+\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124
+\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006
+\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154
+\157\142\141\154\040\122\157\157\164\040\103\101\040\105\103\103
+\040\166\063
+END
+CKA_SERIAL_NUMBER MULTILINE_OCTAL
+\002\024\046\106\031\167\061\341\117\157\050\066\336\071\121\206
+\346\324\227\210\042\301
+END
+CKA_VALUE MULTILINE_OCTAL
+\060\202\002\245\060\202\002\052\240\003\002\001\002\002\024\046
+\106\031\167\061\341\117\157\050\066\336\071\121\206\346\324\227
+\210\042\301\060\012\006\010\052\206\110\316\075\004\003\003\060
+\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122\061
+\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162\141
+\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165\147
+\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033\006
+\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124\162
+\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006\003
+\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154\157
+\142\141\154\040\122\157\157\164\040\103\101\040\105\103\103\040
+\166\063\060\036\027\015\062\060\060\063\061\070\060\071\064\066
+\065\070\132\027\015\064\065\060\063\061\062\060\071\064\066\065
+\070\132\060\201\200\061\013\060\011\006\003\125\004\006\023\002
+\124\122\061\017\060\015\006\003\125\004\007\023\006\101\156\153
+\141\162\141\061\031\060\027\006\003\125\004\012\023\020\105\055
+\124\165\147\162\141\040\105\102\107\040\101\056\123\056\061\035
+\060\033\006\003\125\004\013\023\024\105\055\124\165\147\162\141
+\040\124\162\165\163\164\040\103\145\156\164\145\162\061\046\060
+\044\006\003\125\004\003\023\035\105\055\124\165\147\162\141\040
+\107\154\157\142\141\154\040\122\157\157\164\040\103\101\040\105
+\103\103\040\166\063\060\166\060\020\006\007\052\206\110\316\075
+\002\001\006\005\053\201\004\000\042\003\142\000\004\216\230\051
+\277\307\020\036\047\333\253\003\314\050\054\330\136\110\031\020
+\051\314\313\131\201\314\214\270\222\027\211\203\052\222\366\303
+\244\035\114\142\325\237\326\240\106\334\034\274\166\301\343\107
+\320\133\023\332\347\245\263\146\110\347\041\232\112\117\206\012
+\175\154\352\115\062\200\012\262\172\011\233\151\113\230\201\342
+\056\354\002\160\226\037\375\365\106\316\312\334\202\243\143\060
+\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001
+\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024\377
+\202\061\162\076\371\304\146\154\255\070\236\321\260\121\210\245
+\220\314\365\060\035\006\003\125\035\016\004\026\004\024\377\202
+\061\162\076\371\304\146\154\255\070\236\321\260\121\210\245\220
+\314\365\060\016\006\003\125\035\017\001\001\377\004\004\003\002
+\001\006\060\012\006\010\052\206\110\316\075\004\003\003\003\151
+\000\060\146\002\061\000\346\005\130\151\141\345\055\312\015\313
+\361\031\010\275\326\375\121\222\032\176\143\124\004\220\221\232
+\065\221\071\231\372\007\251\146\223\272\310\150\324\212\077\372
+\355\156\026\002\047\267\002\061\000\335\132\027\053\166\035\145
+\102\226\246\254\135\212\171\126\330\212\033\337\232\336\137\307
+\120\217\261\133\161\014\046\337\152\100\000\354\063\221\041\161
+\276\150\344\043\244\331\255\241\067
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "TunTrust Root CA"
-# Issuer: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN
-# Serial Number:13:02:d5:e2:40:4c:92:46:86:16:67:5d:b4:bb:bb:b2:6b:3e:fc:13
-# Subject: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN
-# Not Valid Before: Fri Apr 26 08:57:56 2019
-# Not Valid After : Tue Apr 26 08:57:56 2044
-# Fingerprint (SHA-256): 2E:44:10:2A:B5:8C:B8:54:19:45:1C:8E:19:D9:AC:F3:66:2C:AF:BC:61:4B:6A:53:96:0A:30:F7:D0:E2:EB:41
-# Fingerprint (SHA1): CF:E9:70:84:0F:E0:73:0F:9D:F6:0C:7F:2C:4B:EE:20:46:34:9C:BB
+# Trust for "E-Tugra Global Root CA ECC v3"
+# Issuer: CN=E-Tugra Global Root CA ECC v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR
+# Serial Number:26:46:19:77:31:e1:4f:6f:28:36:de:39:51:86:e6:d4:97:88:22:c1
+# Subject: CN=E-Tugra Global Root CA ECC v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR
+# Not Valid Before: Wed Mar 18 09:46:58 2020
+# Not Valid After : Sun Mar 12 09:46:58 2045
+# Fingerprint (SHA-256): 87:3F:46:85:FA:7F:56:36:25:25:2E:6D:36:BC:D7:F1:6F:C2:49:51:F2:64:E4:7E:1B:95:4F:49:08:CD:CA:13
+# Fingerprint (SHA1): 8A:2F:AF:57:53:B1:B0:E6:A1:04:EC:5B:6A:69:71:6D:F6:1C:E2:84
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "TunTrust Root CA"
+CKA_LABEL UTF8 "E-Tugra Global Root CA ECC v3"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\317\351\160\204\017\340\163\017\235\366\014\177\054\113\356\040
-\106\064\234\273
+\212\057\257\127\123\261\260\346\241\004\354\133\152\151\161\155
+\366\034\342\204
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\205\023\271\220\133\066\134\266\136\270\132\370\340\061\127\264
+\106\274\201\273\361\265\036\367\113\226\274\024\342\347\047\144
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\141\061\013\060\011\006\003\125\004\006\023\002\124\116\061
-\067\060\065\006\003\125\004\012\014\056\101\147\145\156\143\145
-\040\116\141\164\151\157\156\141\154\145\040\144\145\040\103\145
-\162\164\151\146\151\143\141\164\151\157\156\040\105\154\145\143
-\164\162\157\156\151\161\165\145\061\031\060\027\006\003\125\004
-\003\014\020\124\165\156\124\162\165\163\164\040\122\157\157\164
-\040\103\101
+\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122
+\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162
+\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165
+\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033
+\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124
+\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006
+\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154
+\157\142\141\154\040\122\157\157\164\040\103\101\040\105\103\103
+\040\166\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\024\023\002\325\342\100\114\222\106\206\026\147\135\264\273
-\273\262\153\076\374\023
+\002\024\046\106\031\167\061\341\117\157\050\066\336\071\121\206
+\346\324\227\210\042\301
 END
 CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
@@ -22481,597 +24317,582 @@ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "HARICA TLS RSA Root CA 2021"
+# Certificate "DIGITALSIGN GLOBAL ROOT RSA CA"
 #
-# Issuer: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Serial Number:39:ca:93:1c:ef:43:f3:c6:8e:93:c7:f4:64:89:38:7e
-# Subject: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Not Valid Before: Fri Feb 19 10:55:38 2021
-# Not Valid After : Mon Feb 13 10:55:37 2045
-# Fingerprint (SHA-256): D9:5D:0E:8E:DA:79:52:5B:F9:BE:B1:1B:14:D2:10:0D:32:94:98:5F:0C:62:D9:FA:BD:9C:D9:99:EC:CB:7B:1D
-# Fingerprint (SHA1): 02:2D:05:82:FA:88:CE:14:0C:06:79:DE:7F:14:10:E9:45:D7:A5:6D
+# Issuer: CN=DIGITALSIGN GLOBAL ROOT RSA CA,O=DigitalSign Certificadora Digital,C=PT
+# Serial Number:5d:59:c8:ca:ab:09:57:f5:e6:b5:da:29:94:04:6a:ff:c5:d4:95:87
+# Subject: CN=DIGITALSIGN GLOBAL ROOT RSA CA,O=DigitalSign Certificadora Digital,C=PT
+# Not Valid Before: Thu Jan 21 10:50:34 2021
+# Not Valid After : Mon Jan 15 10:50:34 2046
+# Fingerprint (SHA-256): 82:BD:5D:85:1A:CF:7F:6E:1B:A7:BF:CB:C5:30:30:D0:E7:BC:3C:21:DF:77:2D:85:8C:AB:41:D1:99:BD:F5:95
+# Fingerprint (SHA1): B9:82:07:97:AE:52:A5:68:6F:46:07:DF:FD:03:72:3D:92:86:88:2D
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "HARICA TLS RSA Root CA 2021"
+CKA_LABEL UTF8 "DIGITALSIGN GLOBAL ROOT RSA CA"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
-\003\014\033\110\101\122\111\103\101\040\124\114\123\040\122\123
-\101\040\122\157\157\164\040\103\101\040\062\060\062\061
+\060\142\061\013\060\011\006\003\125\004\006\023\002\120\124\061
+\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141
+\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144
+\157\162\141\040\104\151\147\151\164\141\154\061\047\060\045\006
+\003\125\004\003\014\036\104\111\107\111\124\101\114\123\111\107
+\116\040\107\114\117\102\101\114\040\122\117\117\124\040\122\123
+\101\040\103\101
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
-\003\014\033\110\101\122\111\103\101\040\124\114\123\040\122\123
-\101\040\122\157\157\164\040\103\101\040\062\060\062\061
+\060\142\061\013\060\011\006\003\125\004\006\023\002\120\124\061
+\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141
+\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144
+\157\162\141\040\104\151\147\151\164\141\154\061\047\060\045\006
+\003\125\004\003\014\036\104\111\107\111\124\101\114\123\111\107
+\116\040\107\114\117\102\101\114\040\122\117\117\124\040\122\123
+\101\040\103\101
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\071\312\223\034\357\103\363\306\216\223\307\364\144\211
-\070\176
+\002\024\135\131\310\312\253\011\127\365\346\265\332\051\224\004
+\152\377\305\324\225\207
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\244\060\202\003\214\240\003\002\001\002\002\020\071
-\312\223\034\357\103\363\306\216\223\307\364\144\211\070\176\060
-\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\154
-\061\013\060\011\006\003\125\004\006\023\002\107\122\061\067\060
-\065\006\003\125\004\012\014\056\110\145\154\154\145\156\151\143
-\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122\145
-\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164\151
-\157\156\163\040\103\101\061\044\060\042\006\003\125\004\003\014
-\033\110\101\122\111\103\101\040\124\114\123\040\122\123\101\040
-\122\157\157\164\040\103\101\040\062\060\062\061\060\036\027\015
-\062\061\060\062\061\071\061\060\065\065\063\070\132\027\015\064
-\065\060\062\061\063\061\060\065\065\063\067\132\060\154\061\013
-\060\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006
-\003\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101
-\143\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145
-\141\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156
-\163\040\103\101\061\044\060\042\006\003\125\004\003\014\033\110
-\101\122\111\103\101\040\124\114\123\040\122\123\101\040\122\157
-\157\164\040\103\101\040\062\060\062\061\060\202\002\042\060\015
+\060\202\005\265\060\202\003\235\240\003\002\001\002\002\024\135
+\131\310\312\253\011\127\365\346\265\332\051\224\004\152\377\305
+\324\225\207\060\015\006\011\052\206\110\206\367\015\001\001\015
+\005\000\060\142\061\013\060\011\006\003\125\004\006\023\002\120
+\124\061\052\060\050\006\003\125\004\012\014\041\104\151\147\151
+\164\141\154\123\151\147\156\040\103\145\162\164\151\146\151\143
+\141\144\157\162\141\040\104\151\147\151\164\141\154\061\047\060
+\045\006\003\125\004\003\014\036\104\111\107\111\124\101\114\123
+\111\107\116\040\107\114\117\102\101\114\040\122\117\117\124\040
+\122\123\101\040\103\101\060\036\027\015\062\061\060\061\062\061
+\061\060\065\060\063\064\132\027\015\064\066\060\061\061\065\061
+\060\065\060\063\064\132\060\142\061\013\060\011\006\003\125\004
+\006\023\002\120\124\061\052\060\050\006\003\125\004\012\014\041
+\104\151\147\151\164\141\154\123\151\147\156\040\103\145\162\164
+\151\146\151\143\141\144\157\162\141\040\104\151\147\151\164\141
+\154\061\047\060\045\006\003\125\004\003\014\036\104\111\107\111
+\124\101\114\123\111\107\116\040\107\114\117\102\101\114\040\122
+\117\117\124\040\122\123\101\040\103\101\060\202\002\042\060\015
 \006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002
-\017\000\060\202\002\012\002\202\002\001\000\213\302\347\257\145
-\233\005\147\226\311\015\044\271\320\016\144\374\316\342\044\030
-\054\204\177\167\121\313\004\021\066\270\136\355\151\161\247\236
-\344\045\011\227\147\301\107\302\317\221\026\066\142\075\070\004
-\341\121\202\377\254\322\264\151\335\056\354\021\243\105\356\153
-\153\073\114\277\214\215\244\036\235\021\271\351\070\371\172\016
-\014\230\342\043\035\321\116\143\324\347\270\101\104\373\153\257
-\153\332\037\323\305\221\210\133\244\211\222\321\201\346\214\071
-\130\240\326\151\103\251\255\230\122\130\156\333\012\373\153\317
-\150\372\343\244\136\072\105\163\230\007\352\137\002\162\336\014
-\245\263\237\256\251\035\267\035\263\374\212\131\347\156\162\145
-\255\365\060\224\043\007\363\202\026\113\065\230\234\123\273\057
-\312\344\132\331\307\215\035\374\230\231\373\054\244\202\153\360
-\052\037\216\013\137\161\134\134\256\102\173\051\211\201\313\003
-\243\231\312\210\236\013\100\011\101\063\333\346\130\172\375\256
-\231\160\300\132\017\326\023\206\161\057\166\151\374\220\335\333
-\055\156\321\362\233\365\032\153\236\157\025\214\172\360\113\050
-\240\042\070\200\044\154\066\244\073\362\060\221\363\170\023\317
-\301\077\065\253\361\035\021\043\265\103\042\236\001\222\267\030
-\002\345\021\321\202\333\025\000\314\141\067\301\052\174\232\341
-\320\272\263\120\106\356\202\254\235\061\370\373\043\342\003\000
-\110\160\243\011\046\171\025\123\140\363\070\134\255\070\352\201
-\000\143\024\271\063\136\335\013\333\240\105\007\032\063\011\370
-\115\264\247\002\246\151\364\302\131\005\210\145\205\126\256\113
-\313\340\336\074\175\055\032\310\351\373\037\243\141\112\326\052
-\023\255\167\114\032\030\233\221\017\130\330\006\124\305\227\370
-\252\077\040\212\246\205\246\167\366\246\374\034\342\356\156\224
-\063\052\203\120\204\012\345\117\206\370\120\105\170\000\201\353
-\133\150\343\046\215\314\173\134\121\364\024\054\100\276\032\140
-\035\172\162\141\035\037\143\055\210\252\316\242\105\220\010\374
-\153\276\263\120\052\132\375\250\110\030\106\326\220\100\222\220
-\012\204\136\150\061\370\353\355\015\323\035\306\175\231\030\125
-\126\047\145\056\215\105\305\044\354\316\343\002\003\001\000\001
-\243\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005
-\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024
-\012\110\043\246\140\244\222\012\063\352\223\133\305\127\352\045
-\115\275\022\356\060\016\006\003\125\035\017\001\001\377\004\004
-\003\002\001\206\060\015\006\011\052\206\110\206\367\015\001\001
-\013\005\000\003\202\002\001\000\076\220\110\252\156\142\025\045
-\146\173\014\325\214\213\211\235\327\355\116\007\357\234\320\024
-\137\136\120\275\150\226\220\244\024\021\252\150\155\011\065\071
-\100\011\332\364\011\054\064\245\173\131\204\111\051\227\164\310
-\007\036\107\155\362\316\034\120\046\343\236\075\100\123\077\367
-\177\226\166\020\305\106\245\320\040\113\120\364\065\073\030\364
-\125\152\101\033\107\006\150\074\273\011\010\142\331\137\125\102
-\252\254\123\205\254\225\126\066\126\253\344\005\214\305\250\332
-\037\243\151\275\123\017\304\377\334\312\343\176\362\114\210\206
-\107\106\032\363\000\365\200\221\242\334\103\102\224\233\040\360
-\321\315\262\353\054\123\302\123\170\112\117\004\224\101\232\217
-\047\062\301\345\111\031\277\361\362\302\213\250\012\071\061\050
-\264\175\142\066\054\115\354\037\063\266\176\167\155\176\120\360
-\237\016\327\021\217\317\030\305\343\047\376\046\357\005\235\317
-\317\067\305\320\173\332\073\260\026\204\014\072\223\326\276\027
-\333\017\076\016\031\170\011\307\251\002\162\042\113\367\067\166
-\272\165\304\205\003\132\143\325\261\165\005\302\271\275\224\255
-\214\025\231\247\223\175\366\305\363\252\164\317\004\205\224\230
-\000\364\342\371\312\044\145\277\340\142\257\310\305\372\262\311
-\236\126\110\332\171\375\226\166\025\276\243\216\126\304\263\064
-\374\276\107\364\301\264\250\374\325\060\210\150\356\313\256\311
-\143\304\166\276\254\070\030\341\136\134\317\256\072\042\121\353
-\321\213\263\363\053\063\007\124\207\372\264\262\023\173\272\123
-\004\142\001\235\361\300\117\356\341\072\324\213\040\020\372\002
-\127\346\357\301\013\267\220\106\234\031\051\214\334\157\240\112
-\151\151\224\267\044\145\240\377\254\077\316\001\373\041\056\375
-\150\370\233\362\245\317\061\070\134\025\252\346\227\000\301\337
-\132\245\247\071\252\351\204\177\074\121\250\072\331\224\133\214
-\277\117\010\161\345\333\250\134\324\322\246\376\000\243\306\026
-\307\017\350\200\316\034\050\144\164\031\010\323\102\343\316\000
-\135\177\261\334\023\260\341\005\313\321\040\252\206\164\236\071
-\347\221\375\377\133\326\367\255\246\057\003\013\155\343\127\124
-\353\166\123\030\215\021\230\272
+\017\000\060\202\002\012\002\202\002\001\000\310\207\266\070\323
+\034\360\336\022\370\203\307\304\212\342\211\270\264\042\172\170
+\370\014\146\121\150\166\067\012\325\117\302\132\010\270\026\134
+\367\162\001\011\067\204\201\052\124\153\327\222\320\154\372\250
+\247\103\022\064\353\016\333\067\017\051\376\212\061\121\102\350
+\113\234\220\250\310\054\021\323\375\240\051\176\316\336\224\366
+\202\340\130\264\116\105\045\361\042\362\075\323\017\173\124\032
+\334\062\266\326\121\116\176\101\264\127\270\054\306\271\016\056
+\312\127\361\325\310\323\130\347\245\351\102\021\256\323\040\045
+\224\151\327\217\312\242\015\303\323\237\007\150\077\025\322\147
+\056\123\375\166\202\233\013\163\251\051\015\236\021\223\024\010
+\230\354\236\124\022\112\126\242\006\025\354\153\154\056\222\140
+\056\206\015\256\202\037\121\115\343\262\007\327\020\031\127\042
+\366\251\151\104\204\363\331\075\240\006\277\314\210\176\177\365
+\316\133\245\302\052\152\164\102\352\157\246\377\371\150\261\320
+\137\275\221\322\125\157\063\127\114\036\235\344\342\213\301\205
+\145\240\340\152\234\000\000\210\222\335\130\010\026\362\160\061
+\250\034\341\336\275\116\161\351\326\276\176\265\241\132\303\115
+\367\277\233\275\224\244\375\365\252\123\223\106\311\046\001\004
+\160\304\240\161\272\316\045\146\373\221\176\125\160\356\111\012
+\115\142\177\302\120\232\162\362\030\147\235\351\105\250\064\204
+\350\370\201\366\321\132\042\036\007\117\073\263\177\335\021\245
+\163\334\276\251\031\072\151\251\155\033\062\342\211\252\245\047
+\013\132\176\164\342\017\144\071\135\176\134\271\301\027\374\307
+\215\136\311\354\044\355\322\362\077\172\204\105\067\002\276\076
+\153\131\304\346\133\026\155\300\252\236\252\265\131\056\054\160
+\125\234\314\231\226\230\044\124\321\216\332\312\264\021\264\267
+\160\103\037\157\220\013\040\240\250\166\023\145\333\333\043\132
+\165\113\241\013\061\167\012\356\175\150\141\032\023\214\352\121
+\176\134\126\243\127\114\135\241\353\023\145\277\124\024\314\363
+\356\334\327\354\074\227\362\170\126\270\337\162\134\160\374\316
+\006\335\237\322\007\061\357\347\122\221\236\315\272\327\300\030
+\104\007\061\145\111\062\151\023\112\353\217\002\003\001\000\001
+\243\143\060\141\060\017\006\003\125\035\023\001\001\377\004\005
+\060\003\001\001\377\060\037\006\003\125\035\043\004\030\060\026
+\200\024\265\066\274\074\214\032\253\054\366\131\031\055\203\024
+\332\223\045\025\326\206\060\035\006\003\125\035\016\004\026\004
+\024\265\066\274\074\214\032\253\054\366\131\031\055\203\024\332
+\223\045\025\326\206\060\016\006\003\125\035\017\001\001\377\004
+\004\003\002\001\006\060\015\006\011\052\206\110\206\367\015\001
+\001\015\005\000\003\202\002\001\000\024\373\061\045\070\061\370
+\312\010\262\043\166\070\255\370\323\131\365\314\264\127\045\341
+\104\276\176\374\026\354\256\372\046\237\117\147\026\112\126\360
+\375\355\307\031\001\064\216\220\132\055\326\200\134\354\161\322
+\201\045\202\036\000\161\337\232\321\325\035\042\273\321\245\363
+\142\017\264\353\334\044\163\376\246\126\315\232\024\305\004\065
+\026\061\242\007\353\245\000\342\266\370\137\162\375\077\141\111
+\216\336\176\115\070\327\172\036\164\067\154\121\334\276\000\004
+\270\070\024\363\040\301\355\233\247\043\375\015\102\204\035\177
+\362\163\303\320\170\143\361\237\354\327\133\351\361\276\154\240
+\113\003\236\215\151\341\024\332\210\020\201\043\123\377\332\124
+\053\013\306\271\226\225\004\030\106\363\173\250\227\330\133\150
+\244\344\070\034\016\105\345\230\323\011\256\232\136\354\263\171
+\015\071\162\362\364\224\235\016\236\140\042\346\250\366\114\205
+\315\007\202\072\150\071\315\075\137\343\070\364\266\257\073\153
+\112\237\140\121\105\242\100\002\345\252\014\343\076\321\170\324
+\242\164\234\046\272\005\232\050\160\112\076\246\013\320\035\111
+\360\272\370\256\101\020\176\244\007\022\275\250\317\051\075\127
+\273\307\361\103\107\000\076\256\160\030\132\040\173\011\313\072
+\072\160\200\345\114\140\230\301\025\301\035\112\367\310\360\233
+\341\162\255\347\135\150\130\013\004\261\214\274\237\267\373\156
+\213\133\004\125\373\353\043\125\327\170\120\332\045\313\276\047
+\066\273\044\032\171\034\121\321\376\023\273\377\170\054\334\244
+\276\057\366\305\113\123\317\247\114\231\136\160\254\131\210\004
+\256\144\004\277\173\246\172\115\323\350\167\275\241\176\120\025
+\363\357\111\060\205\115\041\127\252\333\054\165\227\255\201\001
+\207\242\261\160\235\036\006\132\003\140\261\077\246\155\202\054
+\324\024\261\201\245\350\075\210\035\264\162\054\130\067\212\216
+\070\224\270\163\335\251\340\270\366\167\242\263\174\130\336\256
+\151\072\265\213\245\032\273\362\330\164\006\234\375\142\163\040
+\041\166\261\176\160\236\031\324\353\027\142\031\070\231\315\066
+\053\107\376\061\313\337\271\344\254\010\323\330\246\353\324\236
+\176\113\144\244\125\135\053\027\311
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "HARICA TLS RSA Root CA 2021"
-# Issuer: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Serial Number:39:ca:93:1c:ef:43:f3:c6:8e:93:c7:f4:64:89:38:7e
-# Subject: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Not Valid Before: Fri Feb 19 10:55:38 2021
-# Not Valid After : Mon Feb 13 10:55:37 2045
-# Fingerprint (SHA-256): D9:5D:0E:8E:DA:79:52:5B:F9:BE:B1:1B:14:D2:10:0D:32:94:98:5F:0C:62:D9:FA:BD:9C:D9:99:EC:CB:7B:1D
-# Fingerprint (SHA1): 02:2D:05:82:FA:88:CE:14:0C:06:79:DE:7F:14:10:E9:45:D7:A5:6D
+# Trust for "DIGITALSIGN GLOBAL ROOT RSA CA"
+# Issuer: CN=DIGITALSIGN GLOBAL ROOT RSA CA,O=DigitalSign Certificadora Digital,C=PT
+# Serial Number:5d:59:c8:ca:ab:09:57:f5:e6:b5:da:29:94:04:6a:ff:c5:d4:95:87
+# Subject: CN=DIGITALSIGN GLOBAL ROOT RSA CA,O=DigitalSign Certificadora Digital,C=PT
+# Not Valid Before: Thu Jan 21 10:50:34 2021
+# Not Valid After : Mon Jan 15 10:50:34 2046
+# Fingerprint (SHA-256): 82:BD:5D:85:1A:CF:7F:6E:1B:A7:BF:CB:C5:30:30:D0:E7:BC:3C:21:DF:77:2D:85:8C:AB:41:D1:99:BD:F5:95
+# Fingerprint (SHA1): B9:82:07:97:AE:52:A5:68:6F:46:07:DF:FD:03:72:3D:92:86:88:2D
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "HARICA TLS RSA Root CA 2021"
+CKA_LABEL UTF8 "DIGITALSIGN GLOBAL ROOT RSA CA"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\002\055\005\202\372\210\316\024\014\006\171\336\177\024\020\351
-\105\327\245\155
+\271\202\007\227\256\122\245\150\157\106\007\337\375\003\162\075
+\222\206\210\055
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\145\107\233\130\206\335\054\360\374\242\204\037\036\226\304\221
+\033\032\275\032\171\306\333\264\355\263\207\314\251\323\116\170
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
-\003\014\033\110\101\122\111\103\101\040\124\114\123\040\122\123
-\101\040\122\157\157\164\040\103\101\040\062\060\062\061
+\060\142\061\013\060\011\006\003\125\004\006\023\002\120\124\061
+\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141
+\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144
+\157\162\141\040\104\151\147\151\164\141\154\061\047\060\045\006
+\003\125\004\003\014\036\104\111\107\111\124\101\114\123\111\107
+\116\040\107\114\117\102\101\114\040\122\117\117\124\040\122\123
+\101\040\103\101
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\071\312\223\034\357\103\363\306\216\223\307\364\144\211
-\070\176
+\002\024\135\131\310\312\253\011\127\365\346\265\332\051\224\004
+\152\377\305\324\225\207
 END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "HARICA TLS ECC Root CA 2021"
+# Certificate "DIGITALSIGN GLOBAL ROOT ECDSA CA"
 #
-# Issuer: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Serial Number:67:74:9d:8d:77:d8:3b:6a:db:22:f4:ff:59:e2:bf:ce
-# Subject: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Not Valid Before: Fri Feb 19 11:01:10 2021
-# Not Valid After : Mon Feb 13 11:01:09 2045
-# Fingerprint (SHA-256): 3F:99:CC:47:4A:CF:CE:4D:FE:D5:87:94:66:5E:47:8D:15:47:73:9F:2E:78:0F:1B:B4:CA:9B:13:30:97:D4:01
-# Fingerprint (SHA1): BC:B0:C1:9D:E9:98:92:70:19:38:57:E9:8D:A7:B4:5D:6E:EE:01:48
+# Issuer: CN=DIGITALSIGN GLOBAL ROOT ECDSA CA,O=DigitalSign Certificadora Digital,C=PT
+# Serial Number:36:2d:8f:72:88:a2:28:27:e4:00:ff:24:c6:2d:e4:eb:fa:9d:b6:e1
+# Subject: CN=DIGITALSIGN GLOBAL ROOT ECDSA CA,O=DigitalSign Certificadora Digital,C=PT
+# Not Valid Before: Thu Jan 21 11:07:50 2021
+# Not Valid After : Mon Jan 15 11:07:50 2046
+# Fingerprint (SHA-256): 26:1D:71:14:AE:5F:8F:F2:D8:C7:20:9A:9D:E4:28:9E:6A:FC:9D:71:70:23:D8:54:50:90:91:99:F1:85:7C:FE
+# Fingerprint (SHA1): 67:A8:08:EB:8F:88:F5:80:6C:05:45:1B:17:F3:D7:00:2F:D2:4A:8A
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "HARICA TLS ECC Root CA 2021"
+CKA_LABEL UTF8 "DIGITALSIGN GLOBAL ROOT ECDSA CA"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
-\003\014\033\110\101\122\111\103\101\040\124\114\123\040\105\103
-\103\040\122\157\157\164\040\103\101\040\062\060\062\061
+\060\144\061\013\060\011\006\003\125\004\006\023\002\120\124\061
+\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141
+\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144
+\157\162\141\040\104\151\147\151\164\141\154\061\051\060\047\006
+\003\125\004\003\014\040\104\111\107\111\124\101\114\123\111\107
+\116\040\107\114\117\102\101\114\040\122\117\117\124\040\105\103
+\104\123\101\040\103\101
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
-\003\014\033\110\101\122\111\103\101\040\124\114\123\040\105\103
-\103\040\122\157\157\164\040\103\101\040\062\060\062\061
+\060\144\061\013\060\011\006\003\125\004\006\023\002\120\124\061
+\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141
+\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144
+\157\162\141\040\104\151\147\151\164\141\154\061\051\060\047\006
+\003\125\004\003\014\040\104\111\107\111\124\101\114\123\111\107
+\116\040\107\114\117\102\101\114\040\122\117\117\124\040\105\103
+\104\123\101\040\103\101
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\147\164\235\215\167\330\073\152\333\042\364\377\131\342
-\277\316
+\002\024\066\055\217\162\210\242\050\047\344\000\377\044\306\055
+\344\353\372\235\266\341
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\124\060\202\001\333\240\003\002\001\002\002\020\147
-\164\235\215\167\330\073\152\333\042\364\377\131\342\277\316\060
-\012\006\010\052\206\110\316\075\004\003\003\060\154\061\013\060
-\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006\003
-\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101\143
-\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145\141
-\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156\163
-\040\103\101\061\044\060\042\006\003\125\004\003\014\033\110\101
-\122\111\103\101\040\124\114\123\040\105\103\103\040\122\157\157
-\164\040\103\101\040\062\060\062\061\060\036\027\015\062\061\060
-\062\061\071\061\061\060\061\061\060\132\027\015\064\065\060\062
-\061\063\061\061\060\061\060\071\132\060\154\061\013\060\011\006
-\003\125\004\006\023\002\107\122\061\067\060\065\006\003\125\004
-\012\014\056\110\145\154\154\145\156\151\143\040\101\143\141\144
-\145\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143
-\150\040\111\156\163\164\151\164\165\164\151\157\156\163\040\103
-\101\061\044\060\042\006\003\125\004\003\014\033\110\101\122\111
-\103\101\040\124\114\123\040\105\103\103\040\122\157\157\164\040
-\103\101\040\062\060\062\061\060\166\060\020\006\007\052\206\110
-\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\070
-\010\376\261\240\226\322\172\254\257\111\072\320\300\340\303\073
-\050\252\361\162\155\145\000\107\210\204\374\232\046\153\252\113
-\272\154\004\012\210\136\027\362\125\207\374\060\260\064\342\064
-\130\127\032\204\123\351\060\331\251\362\226\164\303\121\037\130
-\111\061\314\230\116\140\021\207\165\323\162\224\220\117\233\020
-\045\052\250\170\055\276\220\101\130\220\025\162\247\241\267\243
-\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060
-\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\311
-\033\123\201\022\376\004\325\026\321\252\274\232\157\267\240\225
-\031\156\312\060\016\006\003\125\035\017\001\001\377\004\004\003
-\002\001\206\060\012\006\010\052\206\110\316\075\004\003\003\003
-\147\000\060\144\002\060\021\336\256\370\334\116\210\260\251\360
-\042\255\302\121\100\357\140\161\055\356\217\002\304\135\003\160
-\111\244\222\352\305\024\210\160\246\323\015\260\252\312\054\100
-\234\373\351\202\156\232\002\060\053\107\232\007\306\321\302\201
-\174\312\013\226\030\101\033\243\364\060\011\236\265\043\050\015
-\237\024\266\074\123\242\114\006\151\175\372\154\221\306\052\111
-\105\346\354\267\023\341\072\154
+\060\202\002\152\060\202\001\360\240\003\002\001\002\002\024\066
+\055\217\162\210\242\050\047\344\000\377\044\306\055\344\353\372
+\235\266\341\060\012\006\010\052\206\110\316\075\004\003\003\060
+\144\061\013\060\011\006\003\125\004\006\023\002\120\124\061\052
+\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141\154
+\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144\157
+\162\141\040\104\151\147\151\164\141\154\061\051\060\047\006\003
+\125\004\003\014\040\104\111\107\111\124\101\114\123\111\107\116
+\040\107\114\117\102\101\114\040\122\117\117\124\040\105\103\104
+\123\101\040\103\101\060\036\027\015\062\061\060\061\062\061\061
+\061\060\067\065\060\132\027\015\064\066\060\061\061\065\061\061
+\060\067\065\060\132\060\144\061\013\060\011\006\003\125\004\006
+\023\002\120\124\061\052\060\050\006\003\125\004\012\014\041\104
+\151\147\151\164\141\154\123\151\147\156\040\103\145\162\164\151
+\146\151\143\141\144\157\162\141\040\104\151\147\151\164\141\154
+\061\051\060\047\006\003\125\004\003\014\040\104\111\107\111\124
+\101\114\123\111\107\116\040\107\114\117\102\101\114\040\122\117
+\117\124\040\105\103\104\123\101\040\103\101\060\166\060\020\006
+\007\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003
+\142\000\004\156\013\243\253\063\115\034\352\112\350\374\004\215
+\024\240\175\360\010\054\137\203\253\223\321\322\173\272\327\111
+\175\217\354\022\120\137\324\271\313\345\360\371\063\143\037\311
+\127\354\100\330\021\013\227\350\122\026\314\051\216\364\006\206
+\036\070\334\075\127\304\356\252\275\310\124\004\046\132\047\023
+\121\107\075\037\037\032\216\250\225\244\063\320\314\107\314\155
+\270\374\110\243\143\060\141\060\017\006\003\125\035\023\001\001
+\377\004\005\060\003\001\001\377\060\037\006\003\125\035\043\004
+\030\060\026\200\024\316\257\112\213\032\165\342\361\070\347\002
+\360\026\255\136\352\144\325\173\264\060\035\006\003\125\035\016
+\004\026\004\024\316\257\112\213\032\165\342\361\070\347\002\360
+\026\255\136\352\144\325\173\264\060\016\006\003\125\035\017\001
+\001\377\004\004\003\002\001\006\060\012\006\010\052\206\110\316
+\075\004\003\003\003\150\000\060\145\002\060\012\210\304\161\234
+\104\003\115\215\264\307\274\250\256\331\060\047\065\152\153\026
+\143\327\374\347\131\341\247\211\033\114\061\232\043\125\104\346
+\363\103\041\325\107\047\157\155\127\001\252\002\061\000\373\262
+\352\342\227\177\121\265\237\110\353\274\157\065\211\250\144\160
+\253\127\166\315\300\306\024\140\312\177\342\202\000\163\367\314
+\065\352\216\044\233\345\010\131\307\004\214\163\170\376
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "HARICA TLS ECC Root CA 2021"
-# Issuer: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Serial Number:67:74:9d:8d:77:d8:3b:6a:db:22:f4:ff:59:e2:bf:ce
-# Subject: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Not Valid Before: Fri Feb 19 11:01:10 2021
-# Not Valid After : Mon Feb 13 11:01:09 2045
-# Fingerprint (SHA-256): 3F:99:CC:47:4A:CF:CE:4D:FE:D5:87:94:66:5E:47:8D:15:47:73:9F:2E:78:0F:1B:B4:CA:9B:13:30:97:D4:01
-# Fingerprint (SHA1): BC:B0:C1:9D:E9:98:92:70:19:38:57:E9:8D:A7:B4:5D:6E:EE:01:48
+# Trust for "DIGITALSIGN GLOBAL ROOT ECDSA CA"
+# Issuer: CN=DIGITALSIGN GLOBAL ROOT ECDSA CA,O=DigitalSign Certificadora Digital,C=PT
+# Serial Number:36:2d:8f:72:88:a2:28:27:e4:00:ff:24:c6:2d:e4:eb:fa:9d:b6:e1
+# Subject: CN=DIGITALSIGN GLOBAL ROOT ECDSA CA,O=DigitalSign Certificadora Digital,C=PT
+# Not Valid Before: Thu Jan 21 11:07:50 2021
+# Not Valid After : Mon Jan 15 11:07:50 2046
+# Fingerprint (SHA-256): 26:1D:71:14:AE:5F:8F:F2:D8:C7:20:9A:9D:E4:28:9E:6A:FC:9D:71:70:23:D8:54:50:90:91:99:F1:85:7C:FE
+# Fingerprint (SHA1): 67:A8:08:EB:8F:88:F5:80:6C:05:45:1B:17:F3:D7:00:2F:D2:4A:8A
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "HARICA TLS ECC Root CA 2021"
+CKA_LABEL UTF8 "DIGITALSIGN GLOBAL ROOT ECDSA CA"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\274\260\301\235\351\230\222\160\031\070\127\351\215\247\264\135
-\156\356\001\110
+\147\250\010\353\217\210\365\200\154\005\105\033\027\363\327\000
+\057\322\112\212
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\256\367\114\345\146\065\321\267\233\214\042\223\164\323\113\260
+\252\055\241\316\377\041\302\210\313\132\036\214\341\311\222\217
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004
-\003\014\033\110\101\122\111\103\101\040\124\114\123\040\105\103
-\103\040\122\157\157\164\040\103\101\040\062\060\062\061
+\060\144\061\013\060\011\006\003\125\004\006\023\002\120\124\061
+\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141
+\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144
+\157\162\141\040\104\151\147\151\164\141\154\061\051\060\047\006
+\003\125\004\003\014\040\104\111\107\111\124\101\114\123\111\107
+\116\040\107\114\117\102\101\114\040\122\117\117\124\040\105\103
+\104\123\101\040\103\101
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\147\164\235\215\167\330\073\152\333\042\364\377\131\342
-\277\316
-END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
-CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+\002\024\066\055\217\162\210\242\050\047\344\000\377\044\306\055
+\344\353\372\235\266\341
+END
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "HARICA Client RSA Root CA 2021"
+# Certificate "Security Communication RootCA3"
 #
-# Issuer: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Serial Number:55:52:f8:1e:db:1b:24:2c:9e:bb:96:18:cd:02:28:3e
-# Subject: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Not Valid Before: Fri Feb 19 10:58:46 2021
-# Not Valid After : Mon Feb 13 10:58:45 2045
-# Fingerprint (SHA-256): 1B:E7:AB:E3:06:86:B1:63:48:AF:D1:C6:1B:68:66:A0:EA:7F:48:21:E6:7D:5E:8A:F9:37:CF:80:11:BC:75:0D
-# Fingerprint (SHA1): 46:C6:90:0A:77:3A:B6:BC:F4:65:AD:AC:FC:E3:F7:07:00:6E:DE:6E
+# Issuer: CN=Security Communication RootCA3,O="SECOM Trust Systems CO.,LTD.",C=JP
+# Serial Number:00:e1:7c:37:40:fd:1b:fe:67
+# Subject: CN=Security Communication RootCA3,O="SECOM Trust Systems CO.,LTD.",C=JP
+# Not Valid Before: Thu Jun 16 06:17:16 2016
+# Not Valid After : Mon Jan 18 06:17:16 2038
+# Fingerprint (SHA-256): 24:A5:5C:2A:B0:51:44:2D:06:17:76:65:41:23:9A:4A:D0:32:D7:C5:51:75:AA:34:FF:DE:2F:BC:4F:5C:52:94
+# Fingerprint (SHA1): C3:03:C8:22:74:92:E5:61:A2:9C:5F:79:91:2B:1E:44:13:91:30:3A
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "HARICA Client RSA Root CA 2021"
+CKA_LABEL UTF8 "Security Communication RootCA3"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
-\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
-\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062
-\061
+\060\135\061\013\060\011\006\003\125\004\006\023\002\112\120\061
+\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040
+\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117
+\056\054\114\124\104\056\061\047\060\045\006\003\125\004\003\023
+\036\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156
+\151\143\141\164\151\157\156\040\122\157\157\164\103\101\063
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
-\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
-\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062
-\061
+\060\135\061\013\060\011\006\003\125\004\006\023\002\112\120\061
+\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040
+\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117
+\056\054\114\124\104\056\061\047\060\045\006\003\125\004\003\023
+\036\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156
+\151\143\141\164\151\157\156\040\122\157\157\164\103\101\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\125\122\370\036\333\033\044\054\236\273\226\030\315\002
-\050\076
+\002\011\000\341\174\067\100\375\033\376\147
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\005\252\060\202\003\222\240\003\002\001\002\002\020\125
-\122\370\036\333\033\044\054\236\273\226\030\315\002\050\076\060
-\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\157
-\061\013\060\011\006\003\125\004\006\023\002\107\122\061\067\060
-\065\006\003\125\004\012\014\056\110\145\154\154\145\156\151\143
-\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122\145
-\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164\151
-\157\156\163\040\103\101\061\047\060\045\006\003\125\004\003\014
-\036\110\101\122\111\103\101\040\103\154\151\145\156\164\040\122
-\123\101\040\122\157\157\164\040\103\101\040\062\060\062\061\060
-\036\027\015\062\061\060\062\061\071\061\060\065\070\064\066\132
-\027\015\064\065\060\062\061\063\061\060\065\070\064\065\132\060
-\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061\067
-\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156\151
-\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122
-\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164
-\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004\003
-\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164\040
-\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062\061
-\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001
-\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001
-\000\201\333\127\102\220\054\164\065\364\370\270\164\031\115\253
-\011\132\167\105\201\163\142\260\065\237\370\320\267\063\000\207
-\023\266\226\253\016\124\022\060\007\274\233\267\110\327\321\031
-\203\256\216\330\251\361\251\000\204\260\214\136\236\350\014\217
-\124\151\277\366\324\010\117\046\160\376\030\101\143\032\263\062
-\213\100\370\007\253\127\061\360\306\026\166\147\232\264\335\057
-\362\321\153\305\320\222\204\221\161\156\017\056\143\351\037\123
-\244\335\122\023\314\011\203\051\201\014\305\123\165\104\261\016
-\147\123\030\320\303\037\210\113\237\224\044\264\051\274\273\350
-\116\375\157\322\025\035\111\334\215\160\362\021\032\040\121\125
-\021\272\210\157\304\367\120\171\326\252\061\342\204\075\136\062
-\310\167\052\120\161\345\013\057\351\266\352\357\253\012\063\071
-\016\375\217\245\147\103\202\216\230\151\011\011\033\100\315\070
-\147\107\352\311\354\227\161\022\336\044\365\162\074\321\367\103
-\114\046\367\220\262\211\351\105\113\125\075\061\005\172\101\342
-\225\272\103\300\027\305\266\205\075\031\215\144\160\363\133\254
-\315\237\323\051\165\207\113\225\147\152\246\370\321\335\274\220
-\206\211\103\051\251\067\133\365\135\260\046\132\123\102\166\220
-\053\317\236\126\154\053\124\317\134\232\145\337\133\213\110\140
-\070\174\373\305\013\317\166\004\143\002\063\052\175\365\203\147
-\347\372\306\103\375\053\017\324\046\057\167\244\062\301\044\352
-\144\235\277\263\070\161\061\104\362\107\270\242\146\101\241\373
-\233\173\274\307\106\152\165\277\132\242\214\350\152\104\301\270
-\226\265\300\062\010\055\173\164\065\163\262\312\306\376\257\021
-\162\030\366\347\310\302\317\245\052\352\173\326\131\350\174\240
-\262\152\100\011\151\016\245\226\333\321\000\271\361\210\156\066
-\360\210\262\235\361\122\362\303\174\277\060\211\074\012\151\371
-\042\244\145\341\233\340\164\306\261\205\227\226\054\256\224\217
-\120\246\071\022\037\276\107\362\201\170\323\165\066\236\175\132
-\040\227\342\122\256\231\237\306\174\233\146\363\376\330\317\356
-\275\227\006\035\055\205\334\076\066\123\226\173\040\272\350\310
-\341\255\226\142\076\021\174\263\000\204\236\247\114\161\253\112
-\067\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035
-\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125
-\035\016\004\026\004\024\240\326\007\075\136\044\367\173\240\104
-\056\044\122\015\031\252\053\004\221\247\060\016\006\003\125\035
-\017\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206
-\110\206\367\015\001\001\013\005\000\003\202\002\001\000\015\107
-\371\011\146\061\122\354\171\356\302\250\362\150\076\355\226\105
-\313\072\246\230\143\077\352\053\115\116\003\320\034\202\341\313
-\323\345\326\253\133\147\050\274\235\376\014\231\012\200\125\247
-\316\033\043\141\015\260\127\360\376\340\312\276\346\220\333\203
-\054\276\203\216\364\171\266\376\320\015\102\247\130\037\151\352
-\201\365\005\245\376\106\150\353\154\170\311\340\352\347\346\336
-\061\305\322\325\054\202\143\050\235\135\250\032\176\210\346\347
-\053\361\054\325\320\005\236\334\055\275\067\146\324\004\242\247
-\255\277\072\302\250\073\255\377\215\235\063\340\271\232\204\241
-\207\037\166\364\202\164\327\016\371\060\110\076\133\210\076\252
-\134\153\326\057\014\350\216\163\302\030\221\203\071\266\146\132
-\320\037\140\047\135\115\343\366\072\015\146\120\234\170\173\253
-\363\023\020\256\017\057\253\350\144\263\030\040\235\106\065\144
-\045\163\352\233\020\134\130\065\211\261\106\110\247\364\254\324
-\035\236\133\314\251\245\032\023\117\044\120\252\331\033\155\261
-\100\373\235\335\130\164\304\302\157\024\162\354\333\065\237\270
-\124\165\105\303\246\310\032\050\065\072\256\145\362\251\230\316
-\257\133\311\070\214\061\073\177\314\334\226\375\342\133\326\320
-\131\364\166\272\013\313\117\203\020\307\100\320\035\140\351\052
-\345\110\130\167\014\105\151\276\031\161\004\044\342\343\044\037
-\112\310\301\076\231\365\226\230\070\110\045\241\025\260\033\327
-\342\204\030\133\366\161\065\232\150\173\100\314\030\134\014\044
-\235\324\225\365\231\252\106\352\256\254\277\364\024\031\044\350
-\214\354\343\365\274\006\150\212\052\014\005\137\012\227\165\247
-\334\176\300\375\327\172\030\337\060\321\070\113\037\260\230\160
-\277\314\174\163\360\156\304\061\245\244\227\035\254\277\316\154
-\041\112\276\047\043\147\363\006\126\201\012\221\216\266\341\003
-\005\063\054\332\064\010\115\116\120\043\255\037\245\305\324\172
-\376\352\011\354\247\050\140\213\106\174\265\352\233\335\117\371
-\347\153\025\306\210\317\103\333\345\047\334\004\126\156\157\106
-\025\361\126\055\350\134\014\163\303\043\201\070\040\313\311\014
-\151\317\054\253\073\204\140\063\031\122\375\151\024\063
+\060\202\005\177\060\202\003\147\240\003\002\001\002\002\011\000
+\341\174\067\100\375\033\376\147\060\015\006\011\052\206\110\206
+\367\015\001\001\014\005\000\060\135\061\013\060\011\006\003\125
+\004\006\023\002\112\120\061\045\060\043\006\003\125\004\012\023
+\034\123\105\103\117\115\040\124\162\165\163\164\040\123\171\163
+\164\145\155\163\040\103\117\056\054\114\124\104\056\061\047\060
+\045\006\003\125\004\003\023\036\123\145\143\165\162\151\164\171
+\040\103\157\155\155\165\156\151\143\141\164\151\157\156\040\122
+\157\157\164\103\101\063\060\036\027\015\061\066\060\066\061\066
+\060\066\061\067\061\066\132\027\015\063\070\060\061\061\070\060
+\066\061\067\061\066\132\060\135\061\013\060\011\006\003\125\004
+\006\023\002\112\120\061\045\060\043\006\003\125\004\012\023\034
+\123\105\103\117\115\040\124\162\165\163\164\040\123\171\163\164
+\145\155\163\040\103\117\056\054\114\124\104\056\061\047\060\045
+\006\003\125\004\003\023\036\123\145\143\165\162\151\164\171\040
+\103\157\155\155\165\156\151\143\141\164\151\157\156\040\122\157
+\157\164\103\101\063\060\202\002\042\060\015\006\011\052\206\110
+\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002
+\012\002\202\002\001\000\343\311\162\111\367\060\336\011\174\251
+\100\201\130\323\264\072\335\272\141\017\223\120\156\151\074\065
+\302\356\133\163\220\033\147\114\041\354\137\065\273\071\076\053
+\012\140\357\273\155\053\206\373\161\242\310\254\344\126\224\371
+\311\257\261\162\324\040\254\164\322\270\025\255\121\376\205\164
+\241\271\020\376\005\200\371\122\223\263\100\075\165\020\254\300
+\226\267\247\176\166\274\343\033\122\031\316\021\037\013\004\064
+\365\330\365\151\074\167\363\144\364\015\252\205\336\340\011\120
+\004\027\226\204\267\310\212\274\115\162\374\034\273\317\363\006
+\115\371\237\144\367\176\246\146\206\065\161\310\021\200\114\301
+\161\100\130\036\276\240\163\366\374\076\120\341\340\057\046\075
+\176\134\043\265\171\160\336\372\340\321\245\326\014\101\161\173
+\367\352\214\034\210\307\354\213\365\321\057\125\226\106\174\132
+\073\130\073\373\272\330\055\265\045\332\172\116\317\104\256\041
+\246\236\230\312\040\156\174\273\210\205\133\373\300\020\142\273
+\362\371\047\107\357\321\211\071\103\304\337\336\341\101\277\124
+\163\040\227\055\154\332\363\324\007\243\346\271\330\157\256\374
+\214\031\056\323\147\147\053\225\333\130\134\265\152\002\363\270
+\203\136\264\153\276\101\176\127\011\165\104\120\125\315\132\021
+\141\041\012\141\302\251\210\375\023\274\055\211\057\315\141\340
+\225\276\312\265\173\341\173\064\147\013\037\266\014\307\174\036
+\031\123\312\247\261\112\025\040\126\024\160\075\053\202\054\017
+\235\025\035\107\200\107\377\170\231\016\061\257\157\076\217\355
+\206\151\036\173\030\210\024\262\302\374\202\063\056\234\113\055
+\373\160\073\161\252\053\173\046\047\363\032\302\334\373\027\270
+\241\352\313\240\264\256\323\224\176\172\320\253\303\354\070\055
+\021\056\210\277\324\077\255\022\073\102\254\217\002\156\175\314
+\321\137\141\276\241\274\072\152\110\352\046\125\042\026\135\137
+\015\377\047\063\237\030\003\164\212\133\122\040\107\153\105\115
+\042\167\214\125\047\360\257\036\214\311\203\042\124\267\232\320
+\117\331\316\374\331\056\034\226\050\261\002\323\003\275\045\122
+\034\064\146\117\043\253\364\167\202\226\035\321\127\060\010\021
+\005\375\127\321\331\307\002\003\001\000\001\243\102\060\100\060
+\035\006\003\125\035\016\004\026\004\024\144\024\174\374\130\162
+\026\246\012\051\064\025\157\052\313\274\374\257\250\253\060\016
+\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060\017
+\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060
+\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003\202
+\002\001\000\334\002\043\010\342\357\041\072\307\015\267\046\322
+\142\223\247\245\043\162\007\040\202\140\337\030\327\124\255\151
+\045\222\236\331\024\317\231\271\122\201\317\256\154\212\073\132
+\071\310\154\001\103\302\042\155\002\360\142\315\116\143\103\300
+\024\332\364\143\360\352\364\161\356\116\207\343\161\251\364\311
+\127\345\056\137\034\171\273\043\252\207\104\127\351\275\065\115
+\101\273\113\050\243\230\262\033\331\013\027\007\345\367\352\235
+\365\166\327\277\304\266\201\130\377\310\377\144\151\142\171\255
+\156\016\037\177\356\035\151\345\267\162\161\263\376\245\001\065
+\224\124\053\300\122\155\217\125\304\311\322\270\313\312\064\010
+\121\205\240\365\274\264\027\130\352\012\134\172\275\143\306\072
+\057\377\226\111\031\204\352\147\330\004\261\141\364\000\133\112
+\267\234\161\067\031\205\171\277\201\260\307\023\016\166\161\076
+\072\200\006\256\006\026\247\215\265\302\304\313\377\100\245\134
+\215\245\311\072\355\162\201\312\134\230\074\322\064\003\167\010
+\375\360\051\131\135\041\010\307\140\277\244\161\173\270\331\036
+\202\276\011\257\145\157\050\253\277\113\265\356\076\010\107\047
+\240\017\157\017\213\077\254\225\030\363\271\016\334\147\125\156
+\142\236\106\016\321\004\170\312\162\256\166\331\245\370\262\337
+\210\011\141\213\357\044\116\321\131\077\132\324\075\311\223\074
+\053\144\365\201\015\026\226\367\222\303\376\061\157\350\052\062
+\164\016\364\114\230\112\030\016\060\124\325\305\353\274\305\025
+\236\350\231\041\353\047\053\011\012\333\361\346\160\030\126\273
+\014\344\276\371\350\020\244\023\222\270\034\340\333\147\035\123
+\003\244\042\247\334\135\222\020\074\352\377\374\033\020\032\303
+\330\320\234\235\145\313\320\053\047\061\003\036\066\341\075\166
+\165\014\377\105\046\271\335\121\274\043\307\137\330\330\207\020
+\100\022\015\075\070\067\347\104\074\030\300\123\011\144\217\377
+\325\232\246\174\160\056\163\125\041\350\337\377\203\271\035\076
+\062\036\326\246\175\054\361\146\351\134\035\247\243\316\136\045
+\062\053\343\225\254\052\007\316\264\050\170\206\074\055\246\235
+\115\322\164\060\335\144\121\025\333\203\203\121\327\257\375\063
+\235\115\146
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "HARICA Client RSA Root CA 2021"
-# Issuer: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Serial Number:55:52:f8:1e:db:1b:24:2c:9e:bb:96:18:cd:02:28:3e
-# Subject: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Not Valid Before: Fri Feb 19 10:58:46 2021
-# Not Valid After : Mon Feb 13 10:58:45 2045
-# Fingerprint (SHA-256): 1B:E7:AB:E3:06:86:B1:63:48:AF:D1:C6:1B:68:66:A0:EA:7F:48:21:E6:7D:5E:8A:F9:37:CF:80:11:BC:75:0D
-# Fingerprint (SHA1): 46:C6:90:0A:77:3A:B6:BC:F4:65:AD:AC:FC:E3:F7:07:00:6E:DE:6E
+# Trust for "Security Communication RootCA3"
+# Issuer: CN=Security Communication RootCA3,O="SECOM Trust Systems CO.,LTD.",C=JP
+# Serial Number:00:e1:7c:37:40:fd:1b:fe:67
+# Subject: CN=Security Communication RootCA3,O="SECOM Trust Systems CO.,LTD.",C=JP
+# Not Valid Before: Thu Jun 16 06:17:16 2016
+# Not Valid After : Mon Jan 18 06:17:16 2038
+# Fingerprint (SHA-256): 24:A5:5C:2A:B0:51:44:2D:06:17:76:65:41:23:9A:4A:D0:32:D7:C5:51:75:AA:34:FF:DE:2F:BC:4F:5C:52:94
+# Fingerprint (SHA1): C3:03:C8:22:74:92:E5:61:A2:9C:5F:79:91:2B:1E:44:13:91:30:3A
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "HARICA Client RSA Root CA 2021"
+CKA_LABEL UTF8 "Security Communication RootCA3"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\106\306\220\012\167\072\266\274\364\145\255\254\374\343\367\007
-\000\156\336\156
+\303\003\310\042\164\222\345\141\242\234\137\171\221\053\036\104
+\023\221\060\072
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\157\355\134\327\210\314\070\251\334\351\335\331\135\333\330\355
+\034\232\026\377\236\134\340\115\212\024\001\364\065\135\051\046
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
-\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
-\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062
-\061
+\060\135\061\013\060\011\006\003\125\004\006\023\002\112\120\061
+\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040
+\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117
+\056\054\114\124\104\056\061\047\060\045\006\003\125\004\003\023
+\036\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156
+\151\143\141\164\151\157\156\040\122\157\157\164\103\101\063
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\125\122\370\036\333\033\044\054\236\273\226\030\315\002
-\050\076
+\002\011\000\341\174\067\100\375\033\376\147
 END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
 
 #
-# Certificate "HARICA Client ECC Root CA 2021"
+# Certificate "Security Communication ECC RootCA1"
 #
-# Issuer: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Serial Number:31:68:d9:d8:e1:62:57:1e:d2:19:44:88:e6:10:7d:f0
-# Subject: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Not Valid Before: Fri Feb 19 11:03:34 2021
-# Not Valid After : Mon Feb 13 11:03:33 2045
-# Fingerprint (SHA-256): 8D:D4:B5:37:3C:B0:DE:36:76:9C:12:33:92:80:D8:27:46:B3:AA:6C:D4:26:E7:97:A3:1B:AB:E4:27:9C:F0:0B
-# Fingerprint (SHA1): BE:64:D3:DA:14:4B:D2:6B:CD:AF:8F:DB:A6:A6:72:F8:DE:26:F9:00
+# Issuer: CN=Security Communication ECC RootCA1,O="SECOM Trust Systems CO.,LTD.",C=JP
+# Serial Number:00:d6:5d:9b:b3:78:81:2e:eb
+# Subject: CN=Security Communication ECC RootCA1,O="SECOM Trust Systems CO.,LTD.",C=JP
+# Not Valid Before: Thu Jun 16 05:15:28 2016
+# Not Valid After : Mon Jan 18 05:15:28 2038
+# Fingerprint (SHA-256): E7:4F:BD:A5:5B:D5:64:C4:73:A3:6B:44:1A:A7:99:C8:A6:8E:07:74:40:E8:28:8B:9F:A1:E5:0E:4B:BA:CA:11
+# Fingerprint (SHA1): B8:0E:26:A9:BF:D2:B2:3B:C0:EF:46:C9:BA:C7:BB:F6:1D:0D:41:41
 CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "HARICA Client ECC Root CA 2021"
+CKA_LABEL UTF8 "Security Communication ECC RootCA1"
 CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
 CKA_SUBJECT MULTILINE_OCTAL
-\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
-\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
-\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062
-\061
+\060\141\061\013\060\011\006\003\125\004\006\023\002\112\120\061
+\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040
+\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117
+\056\054\114\124\104\056\061\053\060\051\006\003\125\004\003\023
+\042\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156
+\151\143\141\164\151\157\156\040\105\103\103\040\122\157\157\164
+\103\101\061
 END
 CKA_ID UTF8 "0"
 CKA_ISSUER MULTILINE_OCTAL
-\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
-\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
-\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062
-\061
+\060\141\061\013\060\011\006\003\125\004\006\023\002\112\120\061
+\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040
+\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117
+\056\054\114\124\104\056\061\053\060\051\006\003\125\004\003\023
+\042\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156
+\151\143\141\164\151\157\156\040\105\103\103\040\122\157\157\164
+\103\101\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\061\150\331\330\341\142\127\036\322\031\104\210\346\020
-\175\360
+\002\011\000\326\135\233\263\170\201\056\353
 END
 CKA_VALUE MULTILINE_OCTAL
-\060\202\002\132\060\202\001\341\240\003\002\001\002\002\020\061
-\150\331\330\341\142\127\036\322\031\104\210\346\020\175\360\060
-\012\006\010\052\206\110\316\075\004\003\003\060\157\061\013\060
-\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006\003
-\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101\143
-\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145\141
-\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156\163
-\040\103\101\061\047\060\045\006\003\125\004\003\014\036\110\101
-\122\111\103\101\040\103\154\151\145\156\164\040\105\103\103\040
-\122\157\157\164\040\103\101\040\062\060\062\061\060\036\027\015
-\062\061\060\062\061\071\061\061\060\063\063\064\132\027\015\064
-\065\060\062\061\063\061\061\060\063\063\063\132\060\157\061\013
-\060\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006
-\003\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101
-\143\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145
-\141\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156
-\163\040\103\101\061\047\060\045\006\003\125\004\003\014\036\110
-\101\122\111\103\101\040\103\154\151\145\156\164\040\105\103\103
-\040\122\157\157\164\040\103\101\040\062\060\062\061\060\166\060
-\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000
-\042\003\142\000\004\007\030\255\225\226\224\320\134\017\202\367
-\052\100\372\002\311\311\075\066\246\243\004\152\301\155\225\001
-\210\140\022\124\154\134\242\053\156\023\072\210\225\014\034\046
-\206\066\112\211\031\267\030\336\073\350\250\120\037\312\337\133
-\277\111\200\025\333\343\060\341\035\132\307\052\212\001\007\376
-\155\054\064\357\050\050\227\274\301\371\127\206\225\213\065\317
-\236\132\321\150\225\243\102\060\100\060\017\006\003\125\035\023
-\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035
-\016\004\026\004\024\122\010\322\276\062\201\045\375\365\032\227
-\354\116\137\032\273\123\315\220\255\060\016\006\003\125\035\017
-\001\001\377\004\004\003\002\001\206\060\012\006\010\052\206\110
-\316\075\004\003\003\003\147\000\060\144\002\060\114\061\105\106
-\117\250\346\276\303\167\262\032\030\113\055\210\173\130\346\253
-\224\153\104\003\260\027\377\337\202\163\104\121\054\375\223\035
-\006\173\024\322\211\354\100\014\357\041\001\056\002\060\057\311
-\056\132\154\054\035\331\225\340\236\260\271\134\122\174\366\370
-\070\312\056\361\324\035\362\242\111\242\225\370\301\130\136\117
-\376\163\012\357\061\260\253\043\130\023\214\213\336\073
+\060\202\002\070\060\202\001\276\240\003\002\001\002\002\011\000
+\326\135\233\263\170\201\056\353\060\012\006\010\052\206\110\316
+\075\004\003\003\060\141\061\013\060\011\006\003\125\004\006\023
+\002\112\120\061\045\060\043\006\003\125\004\012\023\034\123\105
+\103\117\115\040\124\162\165\163\164\040\123\171\163\164\145\155
+\163\040\103\117\056\054\114\124\104\056\061\053\060\051\006\003
+\125\004\003\023\042\123\145\143\165\162\151\164\171\040\103\157
+\155\155\165\156\151\143\141\164\151\157\156\040\105\103\103\040
+\122\157\157\164\103\101\061\060\036\027\015\061\066\060\066\061
+\066\060\065\061\065\062\070\132\027\015\063\070\060\061\061\070
+\060\065\061\065\062\070\132\060\141\061\013\060\011\006\003\125
+\004\006\023\002\112\120\061\045\060\043\006\003\125\004\012\023
+\034\123\105\103\117\115\040\124\162\165\163\164\040\123\171\163
+\164\145\155\163\040\103\117\056\054\114\124\104\056\061\053\060
+\051\006\003\125\004\003\023\042\123\145\143\165\162\151\164\171
+\040\103\157\155\155\165\156\151\143\141\164\151\157\156\040\105
+\103\103\040\122\157\157\164\103\101\061\060\166\060\020\006\007
+\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142
+\000\004\244\245\157\140\003\003\303\275\061\364\323\027\234\053
+\204\165\254\345\375\075\127\156\327\143\277\346\004\211\222\216
+\201\234\343\351\107\156\312\220\022\310\023\340\247\235\367\145
+\164\037\154\020\262\350\344\351\357\155\205\062\231\104\261\136
+\375\314\166\020\330\133\275\242\306\371\326\102\344\127\166\334
+\220\302\065\251\113\210\074\022\107\155\134\377\111\117\032\112
+\120\261\243\102\060\100\060\035\006\003\125\035\016\004\026\004
+\024\206\034\347\376\055\245\112\213\010\376\050\021\372\276\243
+\146\370\140\131\057\060\016\006\003\125\035\017\001\001\377\004
+\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004
+\005\060\003\001\001\377\060\012\006\010\052\206\110\316\075\004
+\003\003\003\150\000\060\145\002\060\025\135\102\075\374\266\356
+\367\073\261\066\350\236\366\304\106\050\111\063\320\130\103\052
+\143\051\314\115\261\264\172\242\271\015\070\245\135\110\052\375
+\313\262\163\135\243\210\010\307\014\002\061\000\300\253\055\016
+\155\355\030\242\333\123\351\045\333\125\010\340\120\314\337\104
+\141\026\202\253\111\260\262\201\354\163\207\170\264\114\262\142
+\033\022\372\026\115\045\113\143\275\036\067\331
 END
 CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
 CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
 CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
 
-# Trust for "HARICA Client ECC Root CA 2021"
-# Issuer: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Serial Number:31:68:d9:d8:e1:62:57:1e:d2:19:44:88:e6:10:7d:f0
-# Subject: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR
-# Not Valid Before: Fri Feb 19 11:03:34 2021
-# Not Valid After : Mon Feb 13 11:03:33 2045
-# Fingerprint (SHA-256): 8D:D4:B5:37:3C:B0:DE:36:76:9C:12:33:92:80:D8:27:46:B3:AA:6C:D4:26:E7:97:A3:1B:AB:E4:27:9C:F0:0B
-# Fingerprint (SHA1): BE:64:D3:DA:14:4B:D2:6B:CD:AF:8F:DB:A6:A6:72:F8:DE:26:F9:00
+# Trust for "Security Communication ECC RootCA1"
+# Issuer: CN=Security Communication ECC RootCA1,O="SECOM Trust Systems CO.,LTD.",C=JP
+# Serial Number:00:d6:5d:9b:b3:78:81:2e:eb
+# Subject: CN=Security Communication ECC RootCA1,O="SECOM Trust Systems CO.,LTD.",C=JP
+# Not Valid Before: Thu Jun 16 05:15:28 2016
+# Not Valid After : Mon Jan 18 05:15:28 2038
+# Fingerprint (SHA-256): E7:4F:BD:A5:5B:D5:64:C4:73:A3:6B:44:1A:A7:99:C8:A6:8E:07:74:40:E8:28:8B:9F:A1:E5:0E:4B:BA:CA:11
+# Fingerprint (SHA1): B8:0E:26:A9:BF:D2:B2:3B:C0:EF:46:C9:BA:C7:BB:F6:1D:0D:41:41
 CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
 CKA_TOKEN CK_BBOOL CK_TRUE
 CKA_PRIVATE CK_BBOOL CK_FALSE
 CKA_MODIFIABLE CK_BBOOL CK_FALSE
-CKA_LABEL UTF8 "HARICA Client ECC Root CA 2021"
+CKA_LABEL UTF8 "Security Communication ECC RootCA1"
 CKA_CERT_SHA1_HASH MULTILINE_OCTAL
-\276\144\323\332\024\113\322\153\315\257\217\333\246\246\162\370
-\336\046\371\000
+\270\016\046\251\277\322\262\073\300\357\106\311\272\307\273\366
+\035\015\101\101
 END
 CKA_CERT_MD5_HASH MULTILINE_OCTAL
-\255\270\120\246\251\202\172\154\075\032\252\244\322\143\244\104
+\176\103\260\222\150\354\005\103\114\230\253\135\065\056\176\206
 END
 CKA_ISSUER MULTILINE_OCTAL
-\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061
-\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156
-\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040
-\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165
-\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004
-\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164
-\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062
-\061
+\060\141\061\013\060\011\006\003\125\004\006\023\002\112\120\061
+\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040
+\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117
+\056\054\114\124\104\056\061\053\060\051\006\003\125\004\003\023
+\042\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156
+\151\143\141\164\151\157\156\040\105\103\103\040\122\157\157\164
+\103\101\061
 END
 CKA_SERIAL_NUMBER MULTILINE_OCTAL
-\002\020\061\150\331\330\341\142\127\036\322\031\104\210\346\020
-\175\360
+\002\011\000\326\135\233\263\170\201\056\353
 END
-CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
+CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
 CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
 CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
diff --git a/tools/dep_updaters/README.md b/tools/dep_updaters/README.md
new file mode 100644
index 00000000000000..afae95302766e5
--- /dev/null
+++ b/tools/dep_updaters/README.md
@@ -0,0 +1,37 @@
+# Dependency update scripts
+
+This folder contains scripts used to automatically update a Node.js dependency.
+These scripts are usually run by CI (see `.github/workflows/tools.yml`) in order
+to download a new dependency version, and replace the old version with it.
+
+Since these scripts only update to the upstream code, changes might be needed in
+this repository in order to successfully update (e.g: changing API calls to
+conform to upstream changes, updating GYP build files, etc.)
+
+## libuv
+
+The `update-libuv.sh` script takes the target version to update as its only
+argument, downloads it from the [GitHub repo](https://github.com/libuv/libuv)
+and uses it to replace the contents of `deps/uv/`. The contents are replaced
+entirely except for the `*.gyp` and `*.gypi` build files, which are part of the
+Node.js build definitions and are not present in the upstream repo.
+
+For example, in order to update to version `1.44.2`, the following command can
+be run:
+
+```bash
+./tools/dep_updaters/update-libuv.sh 1.44.2
+```
+
+Once the script has run (either manually, or by CI in which case a PR will have
+been created with the changes), do the following:
+
+1. Check the [changelog](https://github.com/libuv/libuv/blob/v1.x/ChangeLog) for
+   things that might require changes in Node.js.
+2. If necessary, update `common.gypi` and `uv.gyp` with build-related changes.
+3. Check that Node.js compiles without errors and the tests pass.
+4. Create a commit for the update and in the commit message include the
+   important/relevant items from the changelog (see [`c61870c`][] for an
+   example).
+
+[`c61870c`]: https://github.com/nodejs/node/commit/c61870c376e2f5b0dbaa939972c46745e21cdbdd
diff --git a/tools/dep_updaters/update-libuv.sh b/tools/dep_updaters/update-libuv.sh
new file mode 100755
index 00000000000000..ae7fe9a76cac4e
--- /dev/null
+++ b/tools/dep_updaters/update-libuv.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+set -e
+# Shell script to update libuv in the source tree to a specific version
+
+BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd)
+DEPS_DIR="$BASE_DIR/deps"
+LIBUV_VERSION=$1
+
+if [ "$#" -le 0 ]; then
+  echo "Error: please provide an libuv version to update to"
+  echo "	e.g. $0 1.44.2"
+  exit 1
+fi
+
+echo "Making temporary workspace..."
+
+WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp')
+
+cleanup () {
+  EXIT_CODE=$?
+  [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE"
+  exit $EXIT_CODE
+}
+
+trap cleanup INT TERM EXIT
+
+cd "$WORKSPACE"
+
+echo "Fetching libuv source archive..."
+curl -sL "https://api.github.com/repos/libuv/libuv/tarball/v$LIBUV_VERSION" | tar xzf -
+mv libuv-libuv-* uv
+
+echo "Replacing existing libuv (except GYP build files)"
+mv "$DEPS_DIR/uv/"*.gyp "$DEPS_DIR/uv/"*.gypi "$WORKSPACE/uv/"
+rm -rf "$DEPS_DIR/uv"
+mv "$WORKSPACE/uv" "$DEPS_DIR/"
+
+echo "All done!"
+echo ""
+echo "Please git add uv, commit the new version:"
+echo ""
+echo "$ git add -A deps/uv"
+echo "$ git commit -m \"deps: update libuv to $LIBUV_VERSION\""
+echo ""
diff --git a/tools/doc/type-parser.mjs b/tools/doc/type-parser.mjs
index 0053b62b31f33a..64d499d182f484 100644
--- a/tools/doc/type-parser.mjs
+++ b/tools/doc/type-parser.mjs
@@ -43,6 +43,7 @@ const customTypesMap = {
     `${jsDocPrefix}Reference/Global_Objects/WebAssembly/Instance`,
 
   'Blob': 'buffer.html#class-blob',
+  'File': 'buffer.html#class-file',
 
   'BroadcastChannel':
     'worker_threads.html#class-broadcastchannel-' +
diff --git a/tools/icu/icu-generic.gyp b/tools/icu/icu-generic.gyp
index 7c22e72a52bc19..db45e6fbdff1aa 100644
--- a/tools/icu/icu-generic.gyp
+++ b/tools/icu/icu-generic.gyp
@@ -93,7 +93,6 @@
         },
         'defines': [
           'U_ATTRIBUTE_DEPRECATED=',
-          '_CRT_SECURE_NO_DEPRECATE=',
           'U_STATIC_IMPLEMENTATION=1',
         ],
       },
diff --git a/tools/license-builder.sh b/tools/license-builder.sh
index d9d10f6b68ff45..96b25d9781645a 100755
--- a/tools/license-builder.sh
+++ b/tools/license-builder.sh
@@ -36,6 +36,8 @@ licenseText="$(tail -n +3 "${rootdir}/deps/cares/LICENSE.md")"
 addlicense "c-ares" "deps/cares" "$licenseText"
 licenseText="$(cat "${rootdir}/deps/cjs-module-lexer/LICENSE")"
 addlicense "cjs-module-lexer" "deps/cjs-module-lexer" "$licenseText"
+licenseText="$(cat "${rootdir}/deps/v8/third_party/ittapi/LICENSES/BSD-3-Clause.txt")"
+addlicense "ittapi" "deps/v8/third_party/ittapi" "$licenseText"
 if [ -f "${rootdir}/deps/icu/LICENSE" ]; then
   # ICU 57 and following. Drop the BOM
   licenseText="$(sed -e '1s/^[^a-zA-Z ]*ICU/ICU/' -e :a -e 's/<[^>]*>//g;s/	/ /g;s/ +$//;/</N;//ba' "${rootdir}/deps/icu/LICENSE")"
diff --git a/tools/lint-md/list-released-versions-from-changelogs.mjs b/tools/lint-md/list-released-versions-from-changelogs.mjs
index 52eb50d673e3a7..81b7d17197e7f9 100755
--- a/tools/lint-md/list-released-versions-from-changelogs.mjs
+++ b/tools/lint-md/list-released-versions-from-changelogs.mjs
@@ -20,6 +20,8 @@ async function getVersionsFromFile(file) {
       return;
     } else if (toc && line.startsWith('<a')) {
       result.push(line.slice(line.indexOf('>') + 1, -'</a><br/>'.length));
+    } else if (toc && line.startsWith('<b><a')) {
+      result.push(line.slice(line.indexOf('>', 3) + 1, -'</a></b><br/>'.length));
     }
   }
 }
@@ -30,11 +32,11 @@ const dir = await fs.promises.opendir(dataFolder);
 for await (const dirent of dir) {
   if (dirent.isFile()) {
     filesToCheck.push(
-      getVersionsFromFile(new URL(`./${dirent.name}`, dataFolder))
+      getVersionsFromFile(new URL(dirent.name, dataFolder))
     );
   }
 }
 
 await Promise.all(filesToCheck);
 
-console.log(`::set-output name=NODE_RELEASED_VERSIONS::${result.join(',')}`);
+console.log(`NODE_RELEASED_VERSIONS=${result.join(',')}`);
diff --git a/tools/lint-md/package-lock.json b/tools/lint-md/package-lock.json
index 565c5c9ef053ee..5150c335acb23c 100644
--- a/tools/lint-md/package-lock.json
+++ b/tools/lint-md/package-lock.json
@@ -18,7 +18,7 @@
       "devDependencies": {
         "@rollup/plugin-commonjs": "^23.0.2",
         "@rollup/plugin-node-resolve": "^15.0.1",
-        "rollup": "^3.2.5",
+        "rollup": "^3.3.0",
         "rollup-plugin-cleanup": "^3.2.1"
       }
     },
@@ -2207,9 +2207,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "3.2.5",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.2.5.tgz",
-      "integrity": "sha512-/Ha7HhVVofduy+RKWOQJrxe4Qb3xyZo+chcpYiD8SoQa4AG7llhupUtyfKSSrdBM2mWJjhM8wZwmbY23NmlIYw==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.3.0.tgz",
+      "integrity": "sha512-wqOV/vUJCYEbWsXvwCkgGWvgaEnsbn4jxBQWKpN816CqsmCimDmCNJI83c6if7QVD4v/zlyRzxN7U2yDT5rfoA==",
       "dev": true,
       "bin": {
         "rollup": "dist/bin/rollup"
@@ -4178,9 +4178,9 @@
       }
     },
     "rollup": {
-      "version": "3.2.5",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.2.5.tgz",
-      "integrity": "sha512-/Ha7HhVVofduy+RKWOQJrxe4Qb3xyZo+chcpYiD8SoQa4AG7llhupUtyfKSSrdBM2mWJjhM8wZwmbY23NmlIYw==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.3.0.tgz",
+      "integrity": "sha512-wqOV/vUJCYEbWsXvwCkgGWvgaEnsbn4jxBQWKpN816CqsmCimDmCNJI83c6if7QVD4v/zlyRzxN7U2yDT5rfoA==",
       "dev": true,
       "requires": {
         "fsevents": "~2.3.2"
diff --git a/tools/lint-md/package.json b/tools/lint-md/package.json
index 9ec41cdf029725..ef6cd10cdef9ec 100644
--- a/tools/lint-md/package.json
+++ b/tools/lint-md/package.json
@@ -16,7 +16,7 @@
   "devDependencies": {
     "@rollup/plugin-commonjs": "^23.0.2",
     "@rollup/plugin-node-resolve": "^15.0.1",
-    "rollup": "^3.2.5",
+    "rollup": "^3.3.0",
     "rollup-plugin-cleanup": "^3.2.1"
   }
 }
diff --git a/tools/node_modules/eslint/lib/eslint/eslint-helpers.js b/tools/node_modules/eslint/lib/eslint/eslint-helpers.js
index 0b155ebad2310e..5c5ed299c68088 100644
--- a/tools/node_modules/eslint/lib/eslint/eslint-helpers.js
+++ b/tools/node_modules/eslint/lib/eslint/eslint-helpers.js
@@ -26,6 +26,7 @@ const isPathInside = require("is-path-inside");
 
 const doFsWalk = util.promisify(fswalk.walk);
 const Minimatch = minimatch.Minimatch;
+const MINIMATCH_OPTIONS = { dot: true };
 
 //-----------------------------------------------------------------------------
 // Types
@@ -76,7 +77,7 @@ class UnmatchedSearchPatternsError extends Error {
     constructor({ basePath, unmatchedPatterns, patterns, rawPatterns }) {
         super(`No files matching '${rawPatterns}' in '${basePath}' were found.`);
         this.basePath = basePath;
-        this.patternsToCheck = unmatchedPatterns;
+        this.unmatchedPatterns = unmatchedPatterns;
         this.patterns = patterns;
         this.rawPatterns = rawPatterns;
     }
@@ -158,7 +159,7 @@ function globMatch({ basePath, pattern }) {
         ? normalizeToPosix(path.relative(basePath, pattern))
         : pattern;
 
-    const matcher = new Minimatch(patternToUse);
+    const matcher = new Minimatch(patternToUse, MINIMATCH_OPTIONS);
 
     const fsWalkSettings = {
 
@@ -257,7 +258,7 @@ async function globSearch({
 
         relativeToPatterns.set(patternToUse, patterns[i]);
 
-        return new minimatch.Minimatch(patternToUse);
+        return new Minimatch(patternToUse, MINIMATCH_OPTIONS);
     });
 
     /*
@@ -337,49 +338,43 @@ async function globSearch({
 }
 
 /**
- * Checks to see if there are any ignored results for a given search. This
- * happens either when there are unmatched patterns during a search or if
- * a search returns no results.
+ * Throws an error for unmatched patterns. The error will only contain information about the first one.
+ * Checks to see if there are any ignored results for a given search.
  * @param {Object} options The options for this function.
  * @param {string} options.basePath The directory to search.
  * @param {Array<string>} options.patterns An array of glob patterns
  *      that were used in the original search.
  * @param {Array<string>} options.rawPatterns An array of glob patterns
  *      as the user inputted them. Used for errors.
- * @param {Array<string>} options.patternsToCheck An array of glob patterns
- *      to use for this check.
- * @returns {void}
- * @throws {NoFilesFoundError} If there is a pattern that doesn't match
- *      any files and `errorOnUnmatchedPattern` is true.
- * @throws {AllFilesIgnoredError} If there is a pattern that matches files
- *      when there are no ignores.
+ * @param {Array<string>} options.unmatchedPatterns A non-empty array of glob patterns
+ *      that were unmatched in the original search.
+ * @returns {void} Always throws an error.
+ * @throws {NoFilesFoundError} If the first unmatched pattern
+ *      doesn't match any files even when there are no ignores.
+ * @throws {AllFilesIgnoredError} If the first unmatched pattern
+ *      matches some files when there are no ignores.
  */
-async function checkForIgnoredResults({
+async function throwErrorForUnmatchedPatterns({
     basePath,
     patterns,
     rawPatterns,
-    patternsToCheck = patterns
+    unmatchedPatterns
 }) {
 
-    for (const pattern of patternsToCheck) {
+    const pattern = unmatchedPatterns[0];
+    const rawPattern = rawPatterns[patterns.indexOf(pattern)];
 
-        const patternHasMatch = await globMatch({
-            basePath,
-            pattern
-        });
+    const patternHasMatch = await globMatch({
+        basePath,
+        pattern
+    });
 
-        if (patternHasMatch) {
-            throw new AllFilesIgnoredError(
-                rawPatterns[patterns.indexOf(pattern)]
-            );
-        }
+    if (patternHasMatch) {
+        throw new AllFilesIgnoredError(rawPattern);
     }
 
     // if we get here there are truly no matches
-    throw new NoFilesFoundError(
-        rawPatterns[patterns.indexOf(patternsToCheck[0])],
-        true
-    );
+    throw new NoFilesFoundError(rawPattern, true);
 }
 
 /**
@@ -446,9 +441,9 @@ async function globMultiSearch({ searches, configs, errorOnUnmatchedPattern }) {
 
         if (errorOnUnmatchedPattern) {
 
-            await checkForIgnoredResults({
+            await throwErrorForUnmatchedPatterns({
                 ...currentSearch,
-                patternsToCheck: error.patternsToCheck
+                unmatchedPatterns: error.unmatchedPatterns
             });
 
         }
@@ -459,141 +454,6 @@ async function globMultiSearch({ searches, configs, errorOnUnmatchedPattern }) {
 
 }
 
-/**
- * Searches a directory looking for matching glob patterns. This uses
- * the config array's logic to determine if a directory or file should
- * be ignored, so it is consistent with how ignoring works throughout
- * ESLint.
- * @param {Object} options The options for this function.
- * @param {string} options.basePath The directory to search.
- * @param {Array<string>} options.patterns An array of glob patterns
- *      to match.
- * @param {FlatConfigArray} options.configs The config array to use for
- *      determining what to ignore.
- * @returns {Promise<Array<string>>} An array of matching file paths
- *      or an empty array if there are no matches.
- */
-async function globSearch({ basePath, patterns, configs }) {
-
-    if (patterns.length === 0) {
-        return [];
-    }
-
-    const matchers = patterns.map(pattern => {
-        const patternToUse = path.isAbsolute(pattern)
-            ? normalizeToPosix(path.relative(basePath, pattern))
-            : pattern;
-
-        return new minimatch.Minimatch(patternToUse);
-    });
-
-    return (await doFsWalk(basePath, {
-
-        deepFilter(entry) {
-            const relativePath = normalizeToPosix(path.relative(basePath, entry.path));
-            const matchesPattern = matchers.some(matcher => matcher.match(relativePath, true));
-
-            return matchesPattern && !configs.isDirectoryIgnored(entry.path);
-        },
-        entryFilter(entry) {
-            const relativePath = normalizeToPosix(path.relative(basePath, entry.path));
-
-            // entries may be directories or files so filter out directories
-            if (entry.dirent.isDirectory()) {
-                return false;
-            }
-
-            const matchesPattern = matchers.some(matcher => matcher.match(relativePath));
-
-            return matchesPattern && !configs.isFileIgnored(entry.path);
-        }
-    })).map(entry => entry.path);
-
-}
-
-/**
- * Performs multiple glob searches in parallel.
- * @param {Object} options The options for this function.
- * @param {Array<{patterns:Array<string>,rawPatterns:Array<string>}>} options.searches
- *      An array of glob patterns to match.
- * @param {FlatConfigArray} options.configs The config array to use for
- *      determining what to ignore.
- * @returns {Promise<Array<string>>} An array of matching file paths
- *      or an empty array if there are no matches.
- */
-async function globMultiSearch({ searches, configs }) {
-
-    const results = await Promise.all(
-        [...searches].map(
-            ([basePath, { patterns }]) => globSearch({ basePath, patterns, configs })
-        )
-    );
-
-    return [...new Set(results.flat())];
-}
-
-/**
- * Determines if a given glob pattern will return any results.
- * Used primarily to help with useful error messages.
- * @param {Object} options The options for the function.
- * @param {string} options.basePath The directory to search.
- * @param {string} options.pattern A glob pattern to match.
- * @returns {Promise<boolean>} True if there is a glob match, false if not.
- */
-function globMatch({ basePath, pattern }) {
-
-    let found = false;
-    const patternToUse = path.isAbsolute(pattern)
-        ? normalizeToPosix(path.relative(basePath, pattern))
-        : pattern;
-
-    const matcher = new Minimatch(patternToUse);
-
-    const fsWalkSettings = {
-
-        deepFilter(entry) {
-            const relativePath = normalizeToPosix(path.relative(basePath, entry.path));
-
-            return !found && matcher.match(relativePath, true);
-        },
-
-        entryFilter(entry) {
-            if (found || entry.dirent.isDirectory()) {
-                return false;
-            }
-
-            const relativePath = normalizeToPosix(path.relative(basePath, entry.path));
-
-            if (matcher.match(relativePath)) {
-                found = true;
-                return true;
-            }
-
-            return false;
-        }
-    };
-
-    return new Promise(resolve => {
-
-        // using a stream so we can exit early because we just need one match
-        const globStream = fswalk.walkStream(basePath, fsWalkSettings);
-
-        globStream.on("data", () => {
-            globStream.destroy();
-            resolve(true);
-        });
-
-        // swallow errors as they're not important here
-        globStream.on("error", () => {});
-
-        globStream.on("end", () => {
-            resolve(false);
-        });
-        globStream.read();
-    });
-
-}
-
 /**
  * Finds all files matching the options specified.
  * @param {Object} args The arguments objects.
diff --git a/tools/node_modules/eslint/lib/rules/for-direction.js b/tools/node_modules/eslint/lib/rules/for-direction.js
index 7df3d7e4802819..5507a9a1f32c39 100644
--- a/tools/node_modules/eslint/lib/rules/for-direction.js
+++ b/tools/node_modules/eslint/lib/rules/for-direction.js
@@ -15,7 +15,7 @@ module.exports = {
         type: "problem",
 
         docs: {
-            description: "Enforce \"for\" loop update clause moving the counter in the right direction.",
+            description: "Enforce \"for\" loop update clause moving the counter in the right direction",
             recommended: true,
             url: "https://eslint.org/docs/rules/for-direction"
         },
diff --git a/tools/node_modules/eslint/lib/rules/key-spacing.js b/tools/node_modules/eslint/lib/rules/key-spacing.js
index b764b7282ef831..083a7e62898bd3 100644
--- a/tools/node_modules/eslint/lib/rules/key-spacing.js
+++ b/tools/node_modules/eslint/lib/rules/key-spacing.js
@@ -334,6 +334,19 @@ module.exports = {
 
         const sourceCode = context.getSourceCode();
 
+        /**
+         * Determines if the given property is key-value property.
+         * @param {ASTNode} property Property node to check.
+         * @returns {boolean} Whether the property is a key-value property.
+         */
+        function isKeyValueProperty(property) {
+            return !(
+                (property.method ||
+                property.shorthand ||
+                property.kind !== "init" || property.type !== "Property") // Could be "ExperimentalSpreadProperty" or "SpreadElement"
+            );
+        }
+
         /**
          * Checks whether a property is a member of the property group it follows.
          * @param {ASTNode} lastMember The last Property known to be in the group.
@@ -342,9 +355,9 @@ module.exports = {
          */
         function continuesPropertyGroup(lastMember, candidate) {
             const groupEndLine = lastMember.loc.start.line,
-                candidateStartLine = candidate.loc.start.line;
+                candidateValueStartLine = (isKeyValueProperty(candidate) ? candidate.value : candidate).loc.start.line;
 
-            if (candidateStartLine - groupEndLine <= 1) {
+            if (candidateValueStartLine - groupEndLine <= 1) {
                 return true;
             }
 
@@ -358,7 +371,7 @@ module.exports = {
             if (
                 leadingComments.length &&
                 leadingComments[0].loc.start.line - groupEndLine <= 1 &&
-                candidateStartLine - last(leadingComments).loc.end.line <= 1
+                candidateValueStartLine - last(leadingComments).loc.end.line <= 1
             ) {
                 for (let i = 1; i < leadingComments.length; i++) {
                     if (leadingComments[i].loc.start.line - leadingComments[i - 1].loc.end.line > 1) {
@@ -371,19 +384,6 @@ module.exports = {
             return false;
         }
 
-        /**
-         * Determines if the given property is key-value property.
-         * @param {ASTNode} property Property node to check.
-         * @returns {boolean} Whether the property is a key-value property.
-         */
-        function isKeyValueProperty(property) {
-            return !(
-                (property.method ||
-                property.shorthand ||
-                property.kind !== "init" || property.type !== "Property") // Could be "ExperimentalSpreadProperty" or "SpreadElement"
-            );
-        }
-
         /**
          * Starting from the given a node (a property.key node here) looks forward
          * until it finds the last token before a colon punctuator and returns it.
diff --git a/tools/node_modules/eslint/lib/rules/no-implicit-coercion.js b/tools/node_modules/eslint/lib/rules/no-implicit-coercion.js
index c2367715d9da7d..d4126112597b4e 100644
--- a/tools/node_modules/eslint/lib/rules/no-implicit-coercion.js
+++ b/tools/node_modules/eslint/lib/rules/no-implicit-coercion.js
@@ -71,6 +71,24 @@ function isMultiplyByOne(node) {
     );
 }
 
+/**
+ * Checks whether the given node logically represents multiplication by a fraction of `1`.
+ * For example, `a * 1` in `a * 1 / b` is technically multiplication by `1`, but the
+ * whole expression can be logically interpreted as `a * (1 / b)` rather than `(a * 1) / b`.
+ * @param {BinaryExpression} node A BinaryExpression node to check.
+ * @param {SourceCode} sourceCode The source code object.
+ * @returns {boolean} Whether or not the node is a multiplying by a fraction of `1`.
+ */
+function isMultiplyByFractionOfOne(node, sourceCode) {
+    return node.type === "BinaryExpression" &&
+        node.operator === "*" &&
+        (node.right.type === "Literal" && node.right.value === 1) &&
+        node.parent.type === "BinaryExpression" &&
+        node.parent.operator === "/" &&
+        node.parent.left === node &&
+        !astUtils.isParenthesised(sourceCode, node);
+}
+
 /**
  * Checks whether the result of a node is numeric or not
  * @param {ASTNode} node The node to test
@@ -290,7 +308,8 @@ module.exports = {
 
                 // 1 * foo
                 operatorAllowed = options.allow.includes("*");
-                const nonNumericOperand = !operatorAllowed && options.number && isMultiplyByOne(node) && getNonNumericOperand(node);
+                const nonNumericOperand = !operatorAllowed && options.number && isMultiplyByOne(node) && !isMultiplyByFractionOfOne(node, sourceCode) &&
+                    getNonNumericOperand(node);
 
                 if (nonNumericOperand) {
                     const recommendation = `Number(${sourceCode.getText(nonNumericOperand)})`;
diff --git a/tools/node_modules/eslint/lib/rules/no-magic-numbers.js b/tools/node_modules/eslint/lib/rules/no-magic-numbers.js
index 9b08588155652f..786e595220a046 100644
--- a/tools/node_modules/eslint/lib/rules/no-magic-numbers.js
+++ b/tools/node_modules/eslint/lib/rules/no-magic-numbers.js
@@ -65,6 +65,10 @@ module.exports = {
                 ignoreDefaultValues: {
                     type: "boolean",
                     default: false
+                },
+                ignoreClassFieldInitialValues: {
+                    type: "boolean",
+                    default: false
                 }
             },
             additionalProperties: false
@@ -82,7 +86,8 @@ module.exports = {
             enforceConst = !!config.enforceConst,
             ignore = new Set((config.ignore || []).map(normalizeIgnoreValue)),
             ignoreArrayIndexes = !!config.ignoreArrayIndexes,
-            ignoreDefaultValues = !!config.ignoreDefaultValues;
+            ignoreDefaultValues = !!config.ignoreDefaultValues,
+            ignoreClassFieldInitialValues = !!config.ignoreClassFieldInitialValues;
 
         const okTypes = detectObjects ? [] : ["ObjectExpression", "Property", "AssignmentExpression"];
 
@@ -106,6 +111,17 @@ module.exports = {
             return parent.type === "AssignmentPattern" && parent.right === fullNumberNode;
         }
 
+        /**
+         * Returns whether the number is the initial value of a class field.
+         * @param {ASTNode} fullNumberNode `Literal` or `UnaryExpression` full number node
+         * @returns {boolean} true if the number is the initial value of a class field.
+         */
+        function isClassFieldInitialValue(fullNumberNode) {
+            const parent = fullNumberNode.parent;
+
+            return parent.type === "PropertyDefinition" && parent.value === fullNumberNode;
+        }
+
         /**
          * Returns whether the given node is used as a radix within parseInt() or Number.parseInt()
          * @param {ASTNode} fullNumberNode `Literal` or `UnaryExpression` full number node
@@ -194,6 +210,7 @@ module.exports = {
                 if (
                     isIgnoredValue(value) ||
                     (ignoreDefaultValues && isDefaultValue(fullNumberNode)) ||
+                    (ignoreClassFieldInitialValues && isClassFieldInitialValue(fullNumberNode)) ||
                     isParseIntRadix(fullNumberNode) ||
                     isJSXNumber(fullNumberNode) ||
                     (ignoreArrayIndexes && isArrayIndex(fullNumberNode, value))
diff --git a/tools/node_modules/eslint/lib/rules/no-obj-calls.js b/tools/node_modules/eslint/lib/rules/no-obj-calls.js
index 86355d85d36aad..d24d28589f3b5c 100644
--- a/tools/node_modules/eslint/lib/rules/no-obj-calls.js
+++ b/tools/node_modules/eslint/lib/rules/no-obj-calls.js
@@ -16,7 +16,7 @@ const getPropertyName = require("./utils/ast-utils").getStaticPropertyName;
 // Helpers
 //------------------------------------------------------------------------------
 
-const nonCallableGlobals = ["Atomics", "JSON", "Math", "Reflect"];
+const nonCallableGlobals = ["Atomics", "JSON", "Math", "Reflect", "Intl"];
 
 /**
  * Returns the name of the node to report
diff --git a/tools/node_modules/eslint/lib/rules/prefer-object-spread.js b/tools/node_modules/eslint/lib/rules/prefer-object-spread.js
index 08192001a2b8d7..7d8f7857b3c3ac 100644
--- a/tools/node_modules/eslint/lib/rules/prefer-object-spread.js
+++ b/tools/node_modules/eslint/lib/rules/prefer-object-spread.js
@@ -247,7 +247,7 @@ module.exports = {
 
         docs: {
             description:
-                "Disallow using Object.assign with an object literal as the first argument and prefer the use of object spread instead.",
+                "Disallow using Object.assign with an object literal as the first argument and prefer the use of object spread instead",
             recommended: false,
             url: "https://eslint.org/docs/rules/prefer-object-spread"
         },
diff --git a/tools/node_modules/eslint/lib/shared/runtime-info.js b/tools/node_modules/eslint/lib/shared/runtime-info.js
index 56c0898be5475c..b99ad1038f3931 100644
--- a/tools/node_modules/eslint/lib/shared/runtime-info.js
+++ b/tools/node_modules/eslint/lib/shared/runtime-info.js
@@ -97,7 +97,7 @@ function environment() {
      */
     function getNpmPackageVersion(pkg, { global = false } = {}) {
         const npmBinArgs = ["bin", "-g"];
-        const npmLsArgs = ["ls", "--depth=0", "--json", "eslint"];
+        const npmLsArgs = ["ls", "--depth=0", "--json", pkg];
 
         if (global) {
             npmLsArgs.push("-g");
diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/expressions.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/expressions.js
index 678d55b7d0cf17..f35a2891474aae 100644
--- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/expressions.js
+++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/expressions.js
@@ -196,9 +196,6 @@ function AwaitExpression(node) {
 function YieldExpression(node) {
   this.word("yield", true);
   if (node.delegate) {
-    this.ensureNoLineTerminator(() => {
-      this.printInnerComments(node);
-    });
     this.tokenChar(42);
     if (node.argument) {
       this.space();
diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/methods.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/methods.js
index 238d64bcbd20a4..f0784729eb5d95 100644
--- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/methods.js
+++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/methods.js
@@ -20,8 +20,9 @@ function _params(node) {
   this.tokenChar(40);
   this._parameters(node.params, node);
   this.tokenChar(41);
-  this._noLineTerminator = true;
-  this.print(node.returnType, node, node.type === "ArrowFunctionExpression");
+  const noLineTerminator = node.type === "ArrowFunctionExpression";
+  this.print(node.returnType, node, noLineTerminator);
+  this._noLineTerminator = noLineTerminator;
 }
 function _parameters(parameters, parent) {
   const paramLength = parameters.length;
@@ -32,10 +33,6 @@ function _parameters(parameters, parent) {
       this.space();
     }
   }
-
-  if (paramLength === 0) {
-    this.printInnerComments(parent);
-  }
 }
 function _param(parameter, parent) {
   this.printJoin(parameter.decorators, parameter);
@@ -63,23 +60,15 @@ function _methodHead(node) {
   if (kind === "method" ||
   kind === "init") {
     if (node.generator) {
-      if (node.async) {
-        this.printInnerComments(node);
-      }
-
       this.tokenChar(42);
-      this._noLineTerminator = _noLineTerminator;
     }
   }
   if (node.computed) {
     this.tokenChar(91);
-    this._noLineTerminator = _noLineTerminator;
     this.print(key, node);
     this.tokenChar(93);
-    this.printInnerComments(node);
   } else {
     this.print(key, node);
-    this._noLineTerminator = _noLineTerminator;
   }
   if (
   node.optional) {
@@ -122,10 +111,6 @@ function FunctionExpression(node) {
   this.print(node.body, node);
 }
 function ArrowFunctionExpression(node) {
-  const {
-    _noLineTerminator
-  } = this;
-
   if (node.async) {
     this.word("async", true);
     this.space();
@@ -135,8 +120,6 @@ function ArrowFunctionExpression(node) {
   if (!this.format.retainLines && node.params.length === 1 && isIdentifier(firstParam = node.params[0]) && !hasTypesOrComments(node, firstParam)) {
     this.print(firstParam, node, true);
   } else {
-    this._noLineTerminator = _noLineTerminator;
-
     this._params(node);
   }
   this._predicate(node, true);
diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/printer.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/printer.js
index 8f0563af0ff86a..ac21d2c1d6f966 100644
--- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/printer.js
+++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/printer.js
@@ -19,6 +19,7 @@ const ZERO_DECIMAL_INTEGER = /\.0+$/;
 const NON_DECIMAL_LITERAL = /^0[box]/;
 const PURE_ANNOTATION_RE = /^\s*[@#]__PURE__\s*$/;
 const HAS_NEWLINE = /[\n\r\u2028\u2029]/;
+const HAS_BlOCK_COMMENT_END = /\*\//;
 const {
   needsParens
 } = n;
@@ -435,9 +436,16 @@ class Printer {
     this.print(node, parent);
   }
   _printTrailingComments(node, parent, lineOffset) {
-    const comments = node.trailingComments;
-    if (!(comments != null && comments.length)) return;
-    this._printComments(2, comments, node, parent, lineOffset);
+    const {
+      innerComments,
+      trailingComments
+    } = node;
+    if (innerComments != null && innerComments.length) {
+      this._printComments(2, innerComments, node, parent, lineOffset);
+    }
+    if (trailingComments != null && trailingComments.length) {
+      this._printComments(2, trailingComments, node, parent, lineOffset);
+    }
   }
   _printLeadingComments(node, parent) {
     const comments = node.leadingComments;
@@ -505,7 +513,8 @@ class Printer {
   _printComment(comment, skipNewLines) {
     if (comment.ignore) return false;
     if (this._printedComments.has(comment)) return false;
-    if (this._noLineTerminator && HAS_NEWLINE.test(comment.value)) {
+    const noLineTerminator = this._noLineTerminator;
+    if (noLineTerminator && (HAS_NEWLINE.test(comment.value) || HAS_BlOCK_COMMENT_END.test(comment.value))) {
       return true;
     }
     if (!this.format.shouldPrintComment(comment.value)) return false;
@@ -536,7 +545,7 @@ class Printer {
         }
         val = val.replace(/\n(?!$)/g, `\n${" ".repeat(indentSize)}`);
       }
-    } else if (!this._noLineTerminator) {
+    } else if (!noLineTerminator) {
       val = `//${comment.value}`;
     } else {
       val = `/*${comment.value}*/`;
@@ -545,7 +554,7 @@ class Printer {
     if (this.endsWith(47)) this._space();
     this.source("start", comment.loc);
     this._append(val, isBlockComment);
-    if (!isBlockComment && !this._noLineTerminator) {
+    if (!isBlockComment && !noLineTerminator) {
       this.newline(1, true);
     }
     if (printNewLines && skipNewLines !== 3) {
@@ -561,12 +570,11 @@ class Printer {
     const nodeEndLine = hasLoc ? nodeLoc.end.line : 0;
     let lastLine = 0;
     let leadingCommentNewline = 0;
-    const {
-      _noLineTerminator
-    } = this;
+    const maybeNewline = this._noLineTerminator ? function () {} : this.newline.bind(this);
     for (let i = 0; i < len; i++) {
       const comment = comments[i];
-      if (hasLoc && comment.loc && !this._printedComments.has(comment)) {
+      const printed = this._printedComments.has(comment);
+      if (hasLoc && comment.loc && !printed) {
         const commentStartLine = comment.loc.start.line;
         const commentEndLine = comment.loc.end.line;
         if (type === 0) {
@@ -579,31 +587,32 @@ class Printer {
             offset = commentStartLine - lastLine;
           }
           lastLine = commentEndLine;
-          if (!_noLineTerminator) this.newline(offset);
+          maybeNewline(offset);
           this._printComment(comment, 1);
-          if (!_noLineTerminator && i + 1 === len) {
-            this.newline(Math.max(nodeStartLine - lastLine, leadingCommentNewline));
+          if (i + 1 === len) {
+            maybeNewline(Math.max(nodeStartLine - lastLine, leadingCommentNewline));
             lastLine = nodeStartLine;
           }
         } else if (type === 1) {
           const offset = commentStartLine - (i === 0 ? nodeStartLine : lastLine);
           lastLine = commentEndLine;
-          if (!_noLineTerminator) this.newline(offset);
+          maybeNewline(offset);
           if (this._printComment(comment, 1)) break;
-          if (!_noLineTerminator && i + 1 === len) {
-            this.newline(Math.min(1, nodeEndLine - lastLine));
+          if (i + 1 === len) {
+            maybeNewline(Math.min(1, nodeEndLine - lastLine));
             lastLine = nodeEndLine;
           }
         } else {
           const offset = commentStartLine - (i === 0 ? nodeEndLine - lineOffset : lastLine);
           lastLine = commentEndLine;
-          if (!_noLineTerminator) this.newline(offset);
+          maybeNewline(offset);
           this._printComment(comment, 1);
         }
       } else {
         hasLoc = false;
+        if (printed) continue;
         if (len === 1) {
-          const singleLine = comment.loc ? comment.loc.start.line === comment.loc.end.line : !comment.value.includes("\n");
+          const singleLine = comment.loc ? comment.loc.start.line === comment.loc.end.line : !HAS_NEWLINE.test(comment.value);
           const shouldSkipNewline = singleLine && !isStatement(node) && !isClassBody(parent) && !isTSInterfaceBody(parent);
           if (type === 0) {
             this._printComment(comment, shouldSkipNewline && node.type !== "ObjectExpression" || singleLine && isFunction(parent, {
@@ -618,8 +627,8 @@ class Printer {
           }
         } else if (type === 1 && !(node.type === "ObjectExpression" && node.properties.length > 1) && node.type !== "ClassBody" && node.type !== "TSInterfaceBody") {
 
-          const skippedDueToNewlie = this._printComment(comment, i === 0 ? 2 : i === len - 1 ? 3 : 0);
-          if (skippedDueToNewlie) break;
+          const skippedDueToNewline = this._printComment(comment, i === 0 ? 2 : i === len - 1 ? 3 : 0);
+          if (skippedDueToNewline) break;
         } else {
           this._printComment(comment, 0);
         }
diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/package.json b/tools/node_modules/eslint/node_modules/@babel/generator/package.json
index 7fd3ca39a32990..92eff1787bb6c9 100644
--- a/tools/node_modules/eslint/node_modules/@babel/generator/package.json
+++ b/tools/node_modules/eslint/node_modules/@babel/generator/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@babel/generator",
-  "version": "7.20.2",
+  "version": "7.20.4",
   "description": "Turns an AST into code.",
   "author": "The Babel Team (https://babel.dev/team)",
   "license": "MIT",
@@ -25,7 +25,7 @@
   },
   "devDependencies": {
     "@babel/helper-fixtures": "^7.19.4",
-    "@babel/parser": "^7.20.2",
+    "@babel/parser": "^7.20.3",
     "@jridgewell/trace-mapping": "^0.3.8",
     "@types/jsesc": "^2.5.0",
     "charcodes": "^0.2.0"
diff --git a/tools/node_modules/eslint/node_modules/@babel/parser/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/parser/lib/index.js
index ed02fddb0c32b8..a7eb4788ced826 100644
--- a/tools/node_modules/eslint/node_modules/@babel/parser/lib/index.js
+++ b/tools/node_modules/eslint/node_modules/@babel/parser/lib/index.js
@@ -9104,16 +9104,6 @@ var typescript = (superClass => class TypeScriptParserMixin extends superClass {
     }
   }
 
-  checkImportReflection(node) {
-    super.checkImportReflection(node);
-
-    if (node.module && node.importKind !== "value") {
-      this.raise(TSErrors.ImportReflectionHasImportType, {
-        at: node.specifiers[0].loc.start
-      });
-    }
-  }
-
   checkDuplicateExports() {}
   parseImport(node) {
     node.importKind = "value";
@@ -12513,7 +12503,7 @@ class ExpressionParser extends LValParser {
       type
     } = this.state;
     return (
-      type === 53 || type === 10 || type === 0 || tokenIsTemplate(type) ||
+      type === 53 || type === 10 || type === 0 || tokenIsTemplate(type) || type === 101 && !this.state.containsEsc ||
       type === 135 || type === 56 ||
       this.hasPlugin("v8intrinsic") && type === 54
     );
@@ -12926,13 +12916,6 @@ class StatementParser extends ExpressionParser {
     }
     return this.parseStatementContent(context, topLevel, decorators);
   }
-  parseStatementContent(context, topLevel, decorators) {
-    const starttype = this.state.type;
-    const node = this.startNode();
-
-    return this.parseStatementContent(context, topLevel, decorators);
-  }
-
   parseStatementContent(context, topLevel, decorators) {
     const starttype = this.state.type;
     const node = this.startNode();
@@ -14470,36 +14453,6 @@ class StatementParser extends ExpressionParser {
     }
   }
 
-  parseMaybeImportReflection(node) {
-    let isImportReflection = false;
-
-    if (this.isContextual(125)) {
-      const lookahead = this.lookahead();
-
-      if (tokenIsIdentifier(lookahead.type)) {
-        if (lookahead.type !== 97) {
-          isImportReflection = true;
-        } else {
-          const nextNextTokenFirstChar = this.input.charCodeAt(this.nextTokenStartSince(lookahead.end));
-
-          if (nextNextTokenFirstChar === 102) {
-            isImportReflection = true;
-          }
-        }
-      } else {
-        isImportReflection = true;
-      }
-    }
-
-    if (isImportReflection) {
-      this.expectPlugin("importReflection");
-      this.next();
-      node.module = true;
-    } else if (this.hasPlugin("importReflection")) {
-      node.module = false;
-    }
-  }
-
   parseImport(node) {
     node.specifiers = [];
     if (!this.match(131)) {
diff --git a/tools/node_modules/eslint/node_modules/@babel/parser/package.json b/tools/node_modules/eslint/node_modules/@babel/parser/package.json
index 0f4b38509b3fb5..e6a066820ff4f7 100644
--- a/tools/node_modules/eslint/node_modules/@babel/parser/package.json
+++ b/tools/node_modules/eslint/node_modules/@babel/parser/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@babel/parser",
-  "version": "7.20.2",
+  "version": "7.20.3",
   "description": "A JavaScript parser",
   "author": "The Babel Team (https://babel.dev/team)",
   "homepage": "https://babel.dev/docs/en/next/babel-parser",
diff --git a/tools/node_modules/eslint/node_modules/globals/globals.json b/tools/node_modules/eslint/node_modules/globals/globals.json
index c24ab96c4e9e36..852146428a84a6 100644
--- a/tools/node_modules/eslint/node_modules/globals/globals.json
+++ b/tools/node_modules/eslint/node_modules/globals/globals.json
@@ -419,6 +419,7 @@
 		"clearTimeout": false,
 		"clientInformation": false,
 		"ClipboardEvent": false,
+		"ClipboardItem": false,
 		"close": false,
 		"closed": false,
 		"CloseEvent": false,
diff --git a/tools/node_modules/eslint/node_modules/globals/package.json b/tools/node_modules/eslint/node_modules/globals/package.json
index f38232e920e85a..9bf09ed00775d0 100644
--- a/tools/node_modules/eslint/node_modules/globals/package.json
+++ b/tools/node_modules/eslint/node_modules/globals/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "globals",
-	"version": "13.17.0",
+	"version": "13.18.0",
 	"description": "Global identifiers from different JavaScript environments",
 	"license": "MIT",
 	"repository": "sindresorhus/globals",
diff --git a/tools/node_modules/eslint/package.json b/tools/node_modules/eslint/package.json
index 7f4be8cf48aaac..9a6b1799dcd8cb 100644
--- a/tools/node_modules/eslint/package.json
+++ b/tools/node_modules/eslint/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint",
-  "version": "8.27.0",
+  "version": "8.28.0",
   "author": "Nicholas C. Zakas <nicholas+npm@nczconsulting.com>",
   "description": "An AST-based pattern checker for JavaScript.",
   "bin": {
diff --git a/tools/update-base64.sh b/tools/update-base64.sh
index 251399a35df59e..50b8da7adb867c 100755
--- a/tools/update-base64.sh
+++ b/tools/update-base64.sh
@@ -34,6 +34,10 @@ echo "Replacing existing base64"
 rm -rf "$DEPS_DIR/base64/base64"
 mv "$WORKSPACE/base64" "$DEPS_DIR/base64/"
 
+# Build configuration is handled by `deps/base64/base64.gyp`, but since `config.h` has to be present for the build
+# to work, we create it and leave it empty.
+echo "// Intentionally empty" >> "$DEPS_DIR/base64/base64/lib/config.h"
+
 echo "All done!"
 echo ""
 echo "Please git add base64/base64, commit the new version:"
diff --git a/tools/v8_gypfiles/d8.gyp b/tools/v8_gypfiles/d8.gyp
index 1780e1ab0dbccf..61ff530e013443 100644
--- a/tools/v8_gypfiles/d8.gyp
+++ b/tools/v8_gypfiles/d8.gyp
@@ -6,6 +6,8 @@
   'variables': {
     'V8_ROOT': '../../deps/v8',
     'v8_code': 1,
+    # Enable support for Intel VTune. Supported on ia32/x64 only
+    'v8_enable_vtunejit%': 0,
     'v8_enable_i18n_support%': 1,
   },
   'includes': ['toolchain.gypi', 'features.gypi'],
@@ -51,6 +53,11 @@
         [ 'OS=="win"', {
           'sources': [ '<(V8_ROOT)/src/d8/d8-windows.cc', ]
         }],
+        ['v8_enable_vtunejit==1', {
+          'dependencies': [
+            'v8vtune.gyp:v8_vtune',
+          ],
+        }],
         ['v8_enable_i18n_support==1', {
           'dependencies': [
             '<(icu_gyp_path):icui18n',
diff --git a/tools/v8_gypfiles/features.gypi b/tools/v8_gypfiles/features.gypi
index ddeba2112f9310..2c70ce216c98a0 100644
--- a/tools/v8_gypfiles/features.gypi
+++ b/tools/v8_gypfiles/features.gypi
@@ -111,6 +111,9 @@
     # Sets -dENABLE_HUGEPAGE
     'v8_enable_hugepage%': 0,
 
+    # Sets -dENABLE_VTUNE_JIT_INTERFACE.
+    'v8_enable_vtunejit%': 0,
+
     # Currently set for node by common.gypi, avoiding default because of gyp file bug.
     # Should be turned on only for debugging.
     #'v8_enable_handle_zapping%': 0,
@@ -308,6 +311,9 @@
       ['v8_enable_hugepage==1', {
         'defines': ['ENABLE_HUGEPAGE',],
       }],
+      ['v8_enable_vtunejit==1', {
+        'defines': ['ENABLE_VTUNE_JIT_INTERFACE',],
+      }],
       ['v8_enable_pointer_compression==1', {
         'defines': [
           'V8_COMPRESS_POINTERS',
diff --git a/tools/v8_gypfiles/toolchain.gypi b/tools/v8_gypfiles/toolchain.gypi
index 7b10d0d47c0a37..c707ab79e7c172 100644
--- a/tools/v8_gypfiles/toolchain.gypi
+++ b/tools/v8_gypfiles/toolchain.gypi
@@ -678,7 +678,7 @@
             'ldflags': [ '-Wl,-bmaxdata:0x60000000/dsa' ],
           }],
           [ 'v8_target_arch=="ppc64"', {
-            'cflags': [ '-maix64', '-fdollars-in-identifiers' ],
+            'cflags': [ '-maix64', '-fdollars-in-identifiers', '-fno-extern-tls-init' ],
             'ldflags': [ '-maix64 -Wl,-bbigtoc' ],
           }],
         ],
diff --git a/tools/v8_gypfiles/v8.gyp b/tools/v8_gypfiles/v8.gyp
index fdbac3bd1af8aa..4419fba73626b8 100644
--- a/tools/v8_gypfiles/v8.gyp
+++ b/tools/v8_gypfiles/v8.gyp
@@ -325,7 +325,7 @@
              '<(V8_ROOT)/src/builtins/builtins-intl-gen.cc',
            ],
          }],
-        ['OS=="win" and _toolset=="target"', {
+        ['OS=="win"', {
           'msvs_precompiled_header': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.h',
           'msvs_precompiled_source': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.cc',
           'sources': [
@@ -683,7 +683,7 @@
       ],
       'sources': ['<@(v8_compiler_sources)'],
       'conditions': [
-        ['OS=="win" and _toolset=="target"', {
+        ['OS=="win"', {
           'msvs_precompiled_header': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.h',
           'msvs_precompiled_source': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.cc',
           'sources': [
@@ -708,7 +708,7 @@
       ],
       'sources': ['<@(v8_compiler_sources)'],
       'conditions': [
-        ['OS=="win" and _toolset=="target"', {
+        ['OS=="win"', {
           'msvs_precompiled_header': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.h',
           'msvs_precompiled_source': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.cc',
           'sources': [
@@ -908,15 +908,13 @@
             '<!@pymod_do_main(GN-scraper "<(V8_ROOT)/BUILD.gn"  "\\"v8_base_without_compiler.*?v8_current_cpu == \\"loong64\\".*?sources \\+= ")',
           ],
         }],        
-        ['OS=="win" and _toolset=="target"', {
+        ['OS=="win"', {
           'msvs_precompiled_header': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.h',
           'msvs_precompiled_source': '<(V8_ROOT)/../../tools/msvs/pch/v8_pch.cc',
           'sources': [
             '<(_msvs_precompiled_header)',
             '<(_msvs_precompiled_source)',
-          ]
-        }],
-        ['OS=="win"', {
+          ],
           # This will prevent V8's .cc files conflicting with the inspector's
           # .cpp files in the same shard.
           'msvs_settings': {
@@ -1772,7 +1770,7 @@
             }],
           ],
           'action': [
-            'python', '<(V8_ROOT)/tools/testrunner/utils/dump_build_config_gyp.py',
+            '<(python)', '<(V8_ROOT)/tools/testrunner/utils/dump_build_config_gyp.py',
             '<@(v8_dump_build_config_args)',
           ],
         },
@@ -1866,7 +1864,7 @@
             '<(SHARED_INTERMEDIATE_DIR)/debug-support.cc',
           ],
           'action': [
-            'python',
+            '<(python)',
             '<(V8_ROOT)/tools/gen-postmortem-metadata.py',
             '<@(_outputs)',
             '<@(heapobject_files)'
diff --git a/tools/v8_gypfiles/v8vtune.gyp b/tools/v8_gypfiles/v8vtune.gyp
new file mode 100644
index 00000000000000..babe3d8b5d2dad
--- /dev/null
+++ b/tools/v8_gypfiles/v8vtune.gyp
@@ -0,0 +1,39 @@
+# Copyright 2012 the V8 project authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'variables': {
+    'V8_ROOT': '../../deps/v8',
+    'v8_code': 1,
+  },
+  'includes': ['toolchain.gypi', 'features.gypi'],
+  'targets': [
+    {
+      'target_name': 'v8_vtune',
+      'type': 'static_library',
+      'sources': [
+        '<(V8_ROOT)/third_party/ittapi/src/ittnotify/ittnotify_config.h',
+        '<(V8_ROOT)/third_party/ittapi/src/ittnotify/ittnotify_types.h',
+        '<(V8_ROOT)/third_party/ittapi/src/ittnotify/jitprofiling.c',
+        '<(V8_ROOT)/third_party/ittapi/include/jitprofiling.h',
+        '<(V8_ROOT)/src/third_party/vtune/v8-vtune.h',
+        '<(V8_ROOT)/src/third_party/vtune/vtune-jit.cc',
+        '<(V8_ROOT)/src/third_party/vtune/vtune-jit.h',
+      ],
+      'include_dirs': [
+        '<(V8_ROOT)/third_party/ittapi/include',
+        '<(V8_ROOT)/third_party/ittapi/src/ittnotify',
+      ],
+
+      'direct_dependent_settings': {
+        'defines': ['ENABLE_VTUNE_JIT_INTERFACE',],
+        'conditions': [
+          ['OS != "win"', {
+            'libraries': ['-ldl',],
+          }],
+        ],
+      },
+    },
+  ],
+}
diff --git a/vcbuild.bat b/vcbuild.bat
index 0bae0ea282aa10..60c26a9880c56f 100644
--- a/vcbuild.bat
+++ b/vcbuild.bat
@@ -52,6 +52,7 @@ set i18n_arg=
 set download_arg=
 set build_release=
 set configure_flags=
+set enable_vtune_arg=
 set build_addons=
 set dll=
 set enable_static=
@@ -137,6 +138,7 @@ if /i "%1"=="without-intl"  set i18n_arg=none&goto arg-ok
 if /i "%1"=="download-all"  set download_arg="--download=all"&goto arg-ok
 if /i "%1"=="ignore-flaky"  set test_args=%test_args% --flaky-tests=dontcare&goto arg-ok
 if /i "%1"=="dll"           set dll=1&goto arg-ok
+if /i "%1"=="enable-vtune" set enable_vtune_arg=1&goto arg-ok
 if /i "%1"=="static"           set enable_static=1&goto arg-ok
 if /i "%1"=="no-NODE-OPTIONS"	set no_NODE_OPTIONS=1&goto arg-ok
 if /i "%1"=="debug-nghttp2" set debug_nghttp2=1&goto arg-ok
@@ -190,6 +192,7 @@ if defined nocorepack       set configure_flags=%configure_flags% --without-core
 if defined ltcg             set configure_flags=%configure_flags% --with-ltcg
 if defined release_urlbase  set configure_flags=%configure_flags% --release-urlbase=%release_urlbase%
 if defined download_arg     set configure_flags=%configure_flags% %download_arg%
+if defined enable_vtune_arg set configure_flags=%configure_flags% --enable-vtune-profiling
 if defined dll              set configure_flags=%configure_flags% --shared
 if defined enable_static    set configure_flags=%configure_flags% --enable-static
 if defined no_NODE_OPTIONS  set configure_flags=%configure_flags% --without-node-options
@@ -765,13 +768,14 @@ set exit_code=1
 goto exit
 
 :help
-echo vcbuild.bat [debug/release] [msi] [doc] [test/test-all/test-addons/test-doc/test-js-native-api/test-node-api/test-benchmark/test-internet/test-pummel/test-simple/test-message/test-tick-processor/test-known-issues/test-node-inspect/test-check-deopts/test-npm/test-async-hooks/test-v8/test-v8-intl/test-v8-benchmarks/test-v8-all] [ignore-flaky] [static/dll] [noprojgen] [projgen] [small-icu/full-icu/without-intl] [nobuild] [nosnapshot] [nonpm] [nocorepack] [ltcg] [licensetf] [sign] [ia32/x86/x64/arm64] [vs2019/vs2022] [download-all] [lint/lint-ci/lint-js/lint-md] [lint-md-build] [package] [build-release] [upload] [no-NODE-OPTIONS] [link-module path-to-module] [debug-http2] [debug-nghttp2] [clean] [cctest] [no-cctest] [openssl-no-asm]
+echo vcbuild.bat [debug/release] [msi] [doc] [test/test-all/test-addons/test-doc/test-js-native-api/test-node-api/test-benchmark/test-internet/test-pummel/test-simple/test-message/test-tick-processor/test-known-issues/test-node-inspect/test-check-deopts/test-npm/test-async-hooks/test-v8/test-v8-intl/test-v8-benchmarks/test-v8-all] [ignore-flaky] [static/dll] [noprojgen] [projgen] [small-icu/full-icu/without-intl] [nobuild] [nosnapshot] [nonpm] [nocorepack] [ltcg] [licensetf] [sign] [ia32/x86/x64/arm64] [vs2019/vs2022] [download-all] [enable-vtune] [lint/lint-ci/lint-js/lint-md] [lint-md-build] [package] [build-release] [upload] [no-NODE-OPTIONS] [link-module path-to-module] [debug-http2] [debug-nghttp2] [clean] [cctest] [no-cctest] [openssl-no-asm]
 echo Examples:
 echo   vcbuild.bat                          : builds release build
 echo   vcbuild.bat debug                    : builds debug build
 echo   vcbuild.bat release msi              : builds release build and MSI installer package
 echo   vcbuild.bat test                     : builds debug build and runs tests
 echo   vcbuild.bat build-release            : builds the release distribution as used by nodejs.org
+echo   vcbuild.bat enable-vtune             : builds Node.js with Intel VTune profiling support to profile JavaScript
 echo   vcbuild.bat link-module my_module.js : bundles my_module as built-in module
 echo   vcbuild.bat lint                     : runs the C++, documentation and JavaScript linter
 echo   vcbuild.bat no-cctest                : skip building cctest.exe